Changeset 19 for src/map/skill.c
- Timestamp:
- 07/02/08 12:20:18 (17 years ago)
- Files:
-
- 1 modified
Legend:
- Unmodified
- Added
- Removed
-
src/map/skill.c
r13 r19 42 42 #define GD_SKILLRANGEMIN 900 43 43 #define GD_SKILLRANGEMAX GD_SKILLRANGEMIN+MAX_GUILDSKILL 44 #define HM_SKILLRANGEMIN 1100 //Custom Jobs (blackmagic)//Custom Job End44 #define HM_SKILLRANGEMIN 1100 45 45 #define HM_SKILLRANGEMAX HM_SKILLRANGEMIN+MAX_HOMUNSKILL 46 46 … … 283 283 struct status_change* sc; 284 284 sc = status_get_sc(bl); 285 285 286 286 // Never copy NPC/Wedding Skills 287 287 if (skill_get_inf2(skillid)&(INF2_NPC_SKILL|INF2_WEDDING_SKILL)) … … 300 300 if ((skillid == AL_INCAGI || skillid == AL_BLESSING)) 301 301 return 0; 302 302 303 303 return 1; 304 304 } … … 306 306 // [MouseJstr] - skill ok to cast? and when? 307 307 int skillnotok (int skillid, struct map_session_data *sd) 308 { 308 { 309 309 int i,m; 310 310 nullpo_retr (1, sd); 311 311 m = sd->bl.m; 312 312 i = skill_get_index(skillid); 313 313 314 314 if (i == 0) 315 315 return 1; // invalid skill id 316 316 317 317 if (battle_config.gm_skilluncond && pc_isGM(sd) >= battle_config.gm_skilluncond) 318 318 return 0; // GMs can do any damn thing they want … … 354 354 return 1; 355 355 } 356 break; 356 break; 357 357 case MC_VENDING: 358 358 case MC_IDENTIFY: … … 387 387 if (i == 0) 388 388 return 1; // invalid skill id 389 389 390 390 if (hd->blockskill[i] > 0) 391 391 return 1; … … 396 396 397 397 struct s_skill_unit_layout* skill_get_unit_layout (int skillid, int skilllv, struct block_list* src, int x, int y) 398 { 398 { 399 399 int pos = skill_get_unit_layout_type(skillid,skilllv); 400 400 int dir; … … 420 420 421 421 /*========================================== 422 * 422 * 423 423 *------------------------------------------*/ 424 424 int skill_additional_effect (struct block_list* src, struct block_list *bl, int skillid, int skilllv, int attack_type, unsigned int tick) … … 450 450 if (!tsc) //skill additional effect is about adding effects to the target... 451 451 //So if the target can't be inflicted with statuses, this is pointless. 452 return 0; 452 return 0; 453 453 454 454 switch(skillid) … … 482 482 (2000 - 4*sstatus->agi - 2*sstatus->dex))) 483 483 ; //Stance triggered 484 else if(sc->data[SC_READYTURN] && 484 else if(sc->data[SC_READYTURN] && 485 485 sc_start(src,SC_COMBO, 15, TK_TURNKICK, 486 486 (2000 - 4*sstatus->agi - 2*sstatus->dex))) … … 492 492 rate += rate*sc->data[SC_SKILLRATE_UP]->val2/100; 493 493 status_change_end(src,SC_SKILLRATE_UP,-1); 494 } 494 } 495 495 sc_start4(src,SC_COMBO, rate, TK_COUNTER, bl->id,0,0, 496 496 (2000 - 4*sstatus->agi - 2*sstatus->dex)); … … 662 662 case NPC_PETRIFYATTACK: 663 663 sc_start4(bl,status_skill2sc(skillid),50+10*skilllv, 664 skilllv,0,0,skill_get_time(skillid,skilllv), 664 skilllv,0,0,skill_get_time(skillid,skilllv), 665 665 skill_get_time2(skillid,skilllv)); 666 666 break; … … 680 680 sc_start(bl,SC_BLEEDING,(20*skilllv),skilllv,skill_get_time2(skillid,skilllv)); 681 681 break; 682 case NPC_MENTALBREAKER: 682 case NPC_MENTALBREAKER: 683 683 { //Based on observations by Tharis, Mental Breaker should do SP damage 684 684 //equal to Matk*skLevel. … … 785 785 if (tsc->data[SC_ADRENALINE2]) 786 786 status_change_end(bl, SC_ADRENALINE2, -1); 787 } 787 } 788 788 break; 789 789 case TK_TURNKICK: … … 821 821 sc_start(bl,SC_CRITICALWOUND,100,skilllv,skill_get_time2(skillid,skilllv)); 822 822 break; 823 <<<<<<< .mine 824 case NC_GHOULTOUCH: //Necro Ghoul Touch [Brain] 825 if (battle_check_living(tstatus->race, tstatus->def_ele)) //Check if target is a living creature before proceed 826 sc_start(bl,SC_POISON,10000,skilllv,skill_get_time2(skillid,skilllv)); 827 break; 828 case NC_PWSUFFER: //Necro Power Word: Suffer [Brain] 829 case WL_PWAGONY: //Warlock Power Word: Agony [Brain] 830 if (battle_check_living(tstatus->race, tstatus->def_ele)) //Check if target is a living creature before proceed 831 sc_start(bl,skillid==NC_PWSUFFER?SC_SUFFER:SC_AGONY,1000,skilllv,skill_get_time2(skillid,skilllv)); 832 break; 833 case WL_SEARING: //Warlock Searing Pain [Brain] 834 //The DoT is only initiated if target isnt burning already. 835 if(!tsc->data[SC_SEARING] && !tsc->data[SC_IMMOLATE]) 836 sc_start(bl,SC_SEARING,10000,skilllv,skill_get_time2(skillid,skilllv)); 837 break; 838 case WL_IMMOLATE: //Warlock Immolate [Brain] 839 //The DoT is only initiated if target isnt in immolate, but must be in searing pain status 840 if(tsc->data[SC_SEARING] && !tsc->data[SC_IMMOLATE]) 841 sc_start(bl,SC_IMMOLATE,10000,skilllv,skill_get_time2(skillid,skilllv)); 842 break; 843 case WL_SHADOWBURN: //Warlock Shadow Burn [Brain] 844 sc_start(bl,SC_STUN,10000,skilllv,skill_get_time(skillid,skilllv)); 845 break; 846 //Mercenary Skills [Brainstorm] 847 /* case MS_BASH: 848 sc_start(bl,SC_STUN,5*(skilllv-5),skilllv,skill_get_time(skillid,skilllv)); 849 break; 850 case MER_CRASH: 851 sc_start(bl,SC_STUN,6*skilllv,skilllv,skill_get_time(skillid,skilllv)); 852 break;*/ 853 ======= 823 854 //Custom Jobs (blackmagic) 824 855 case NC_GHOULTOUCH: //Necro Ghoul Touch [Brain] … … 845 876 break; 846 877 //Custom Job End 878 >>>>>>> .r18 847 879 } 848 880 … … 956 988 if(sd && sd->classchange && attack_type&BF_WEAPON && 957 989 dstmd && !(tstatus->mode&MD_BOSS) && 958 (rand()%10000 < sd->classchange)) 990 (rand()%10000 < sd->classchange)) 959 991 { 960 992 struct mob_db *mob; … … 965 997 class_ = rand() % MAX_MOB_DB; 966 998 } while (!mobdb_checkid(class_)); 967 999 968 1000 rate = rand() % 1000000; 969 1001 mob = mob_db(class_); … … 979 1011 980 1012 /* Splitted off from skill_additional_effect, which is never called when the 981 * attack skill kills the enemy. Place in this function counter status effects 982 * when using skills (eg: Asura's sp regen penalty, or counter-status effects 1013 * attack skill kills the enemy. Place in this function counter status effects 1014 * when using skills (eg: Asura's sp regen penalty, or counter-status effects 983 1015 * from cards) that will take effect on the source, not the target. [Skotlex] 984 * Note: Currently this function only applies to Extremity Fist and BF_WEAPON 1016 * Note: Currently this function only applies to Extremity Fist and BF_WEAPON 985 1017 * type of skills, so not every instance of skill_additional_effect needs a call 986 1018 * to this one. … … 992 1024 struct map_session_data *dstsd=NULL; 993 1025 struct status_change *tsc; 994 1026 995 1027 nullpo_retr(0, src); 996 1028 nullpo_retr(0, bl); … … 1010 1042 if(tsc && tsc->data[SC_KAAHI] && tsc->data[SC_KAAHI]->val4 == -1) 1011 1043 tsc->data[SC_KAAHI]->val4 = add_timer( 1012 tick+skill_get_time2(SL_KAAHI,tsc->data[SC_KAAHI]->val1), 1044 tick+skill_get_time2(SL_KAAHI,tsc->data[SC_KAAHI]->val1), 1013 1045 kaahi_heal_timer, bl->id, SC_KAAHI); //Activate heal. 1014 1046 break; … … 1042 1074 status_heal(src, 0, status_get_lv(bl)*(95+15*rate)/100, 2); 1043 1075 } 1076 <<<<<<< .mine 1077 1078 // Warlock Soul Steal [Brain] 1079 if(sd && skillid && attack_type&BF_MAGIC && status_isdead(bl) 1080 && !(skill_get_inf(skillid)&(INF_GROUND_SKILL|INF_SELF_SKILL)) 1081 && (rate=pc_checkskill(sd,WL_SOULSTEAL))>0){// Wont work with area/ground spells (hellfire) 1082 if (pc_issit(sd)) pc_setstand(sd); 1083 clif_skill_nodamage(src,bl,WL_SOULSTEAL,rate,1); 1084 clif_specialeffect(src, 253, AREA); // Absorb Mana effect on caster 1085 status_heal(src, 0, status_get_lv(bl)*(90+10*rate)/100, 2); 1086 if(rand()%100 < rate) skill_additem(src,src,15020,1); //Chance to "steal" the target soul 1087 ======= 1044 1088 //Custom Jobs (blackmagic) 1045 1089 // Warlock Soul Steal [Brain] … … 1052 1096 status_heal(src, 0, status_get_lv(bl)*(90+10*rate)/100, 2); 1053 1097 if(rand()%100 < rate) skill_additem(src,src,15020,1); //Chance to "steal" the target soul 1054 } 1055 //Custom Job End 1098 >>>>>>> .r18 1099 } 1100 1056 1101 if(dstsd && attack_type&BF_WEAPON) 1057 1102 { //Counter effects. … … 1064 1109 rate+=dstsd->addeff2[i].arrow_rate; 1065 1110 if (!rate) continue; 1066 1111 1067 1112 if ((dstsd->addeff2[i].flag&(ATF_LONG|ATF_SHORT)) != (ATF_LONG|ATF_SHORT)) 1068 1113 { //Trigger has range consideration. … … 1073 1118 type = dstsd->addeff2[i].id; 1074 1119 time = skill_get_time2(status_sc2skill(type),7); 1075 1120 1076 1121 if (dstsd->addeff2[i].flag&ATF_TARGET) 1077 1122 status_change_start(src,type,rate,7,0,0,0,time,0); 1078 1123 1079 1124 if (dstsd->addeff2[i].flag&ATF_SELF && !status_isdead(bl)) 1080 1125 status_change_start(bl,type,rate,7,0,0,0,time,0); … … 1084 1129 // Trigger counter-spells to retaliate against damage causing skills. 1085 1130 if(dstsd && !status_isdead(bl) && src != bl && dstsd->autospell2[0].id && 1086 !(skillid && skill_get_nk(skillid)&NK_NO_DAMAGE)) 1131 !(skillid && skill_get_nk(skillid)&NK_NO_DAMAGE)) 1087 1132 { 1088 1133 struct block_list *tbl; … … 1104 1149 if (attack_type&BF_LONG) 1105 1150 rate>>=1; 1106 1151 1107 1152 if (skillnotok(skillid, dstsd)) 1108 1153 continue; … … 1113 1158 else 1114 1159 tbl = src; 1115 1160 1116 1161 switch (skill_get_casttype(skillid)) { 1117 1162 case CAST_GROUND: … … 1137 1182 //Auto-script when attacked 1138 1183 if(dstsd && !status_isdead(bl) && src != bl && dstsd->autoscript2[0].script && 1139 !(skillid && skill_get_nk(skillid)&NK_NO_DAMAGE)) 1184 !(skillid && skill_get_nk(skillid)&NK_NO_DAMAGE)) 1140 1185 { 1141 1186 int i; … … 1161 1206 (BCT_ENEMY/BCT_PARTY/BCT_SELF) are the valid values. 1162 1207 --------------------------------------------------------------------------*/ 1163 int skill_break_equip (struct block_list *bl, unsigned short where, int rate, int flag) 1208 int skill_break_equip (struct block_list *bl, unsigned short where, int rate, int flag) 1164 1209 { 1165 1210 const int where_list[4] = {EQP_WEAPON, EQP_ARMOR, EQP_SHIELD, EQP_HELM}; … … 1263 1308 for (i = 0; i < ARRAYLENGTH(pos); i++) { 1264 1309 if (where&pos[i] && sc->data[sc_def[i]]) 1265 where&=~pos[i]; 1310 where&=~pos[i]; 1266 1311 } 1267 1312 if (!where) return 0; … … 1293 1338 if (count == 0) 1294 1339 return 0; //Actual knockback distance is 0. 1295 1340 1296 1341 switch (target->type) 1297 1342 { … … 1328 1373 1329 1374 if (!su) 1330 unit_stop_walking(target,0); 1375 unit_stop_walking(target,0); 1331 1376 1332 1377 dx = nx - target->x; … … 1345 1390 map_foreachinmovearea(clif_insight, target, AREA_SIZE, -dx, -dy, target->type == BL_PC ? BL_ALL : BL_PC, target); 1346 1391 1347 if(!(flag&0x1)) 1392 if(!(flag&0x1)) 1348 1393 clif_blown(target); 1349 1394 … … 1393 1438 * flag&0xFFF is passed to the underlying battle_calc_attack for processing 1394 1439 * (usually holds number of targets, or just 1 for simple splash attacks) 1395 * flag&0x1000 is used to tag that this is a splash-attack (so the damage 1440 * flag&0x1000 is used to tag that this is a splash-attack (so the damage 1396 1441 * packet shouldn't display a skill animation) 1397 1442 * flag&0x2000 is used to signal that the skilllv should be passed as -1 to the … … 1494 1539 } 1495 1540 } 1496 1541 1497 1542 if(sc && sc->data[SC_MAGICROD] && src == dsrc) { 1498 1543 int sp = skill_get_sp(skillid,skilllv); … … 1508 1553 1509 1554 damage = dmg.damage + dmg.damage2; 1510 1511 if (skillid == AL_INCAGI || skillid == AL_BLESSING) 1512 if (tsd->sc.data[SC_CHANGEUNDEAD]) 1513 damage = 1; 1555 1556 if( (skillid == AL_INCAGI || skillid == AL_BLESSING) && tsd->sc.data[SC_CHANGEUNDEAD] ) 1557 damage = 1; 1514 1558 1515 1559 if (damage > 0 && dmg.flag&BF_WEAPON && src != bl && src == dsrc && … … 1520 1564 type=(skillid==0)?5:skill_get_hit(skillid); 1521 1565 1522 if(damage < dmg.div_ 1566 if(damage < dmg.div_ 1523 1567 //Only skills that knockback even when they miss. [Skotlex] 1524 1568 && skillid != CH_PALMSTRIKE) … … 1649 1693 break; 1650 1694 } 1651 1695 1652 1696 map_freeblock_lock(); 1653 1697 … … 1682 1726 } 1683 1727 } 1684 if (skillid != WZ_SIGHTRASHER && 1685 skillid != WZ_SIGHTBLASTER && 1728 if (skillid != WZ_SIGHTRASHER && 1729 skillid != WZ_SIGHTBLASTER && 1686 1730 skillid != AC_SHOWER && 1687 1731 skillid != SM_MAGNUM && … … 1705 1749 if (!status_isdead(bl)) 1706 1750 skill_additional_effect(src,bl,skillid,skilllv,attack_type,tick); 1707 //Counter status effects [Skotlex] 1751 //Counter status effects [Skotlex] 1708 1752 skill_counter_additional_effect(dsrc,bl,skillid,skilllv,attack_type,tick); 1709 1753 } … … 1723 1767 skill_blown(dsrc,bl,dmg.blewcount,direction,0); 1724 1768 } 1725 1769 1726 1770 //Delayed damage must be dealt after the knockback (it needs to know actual position of target) 1727 1771 if (dmg.amotion) … … 1755 1799 1756 1800 if (!(flag&2) && 1757 ( 1801 ( 1758 1802 skillid == MG_COLDBOLT || skillid == MG_FIREBOLT || skillid == MG_LIGHTNINGBOLT 1759 1803 ) && … … 1800 1844 if(battle_check_target(src,bl,flag) > 0) 1801 1845 { 1802 if (flag&(SD_SPLASH|SD_PREAMBLE)) { 1803 if (flag&SD_PREAMBLE && !skill_area_temp[2]) 1804 clif_skill_damage(src,bl,tick, status_get_amotion(src), 0, -30000, 1, skill_id, skill_lv, 6); 1846 // several splash skills need this initial dummy packet to display correctly 1847 if (flag&SD_PREAMBLE && skill_area_temp[2] == 0) 1848 clif_skill_damage(src,bl,tick, status_get_amotion(src), 0, -30000, 1, skill_id, skill_lv, 6); 1849 1850 if (flag&(SD_SPLASH|SD_PREAMBLE)) 1805 1851 skill_area_temp[2]++; 1806 } 1852 1807 1853 return func(src,bl,skill_id,skill_lv,tick,flag); 1808 1854 } … … 1927 1973 struct map_session_data *sd; 1928 1974 int gid, id, strvit, agidex; 1929 1975 1930 1976 sd = (struct map_session_data *)bl; 1931 1977 … … 1967 2013 int i,j,hp,sp,hp_rate,sp_rate,state,mhp ; 1968 2014 int itemid[10],amount[ARRAYLENGTH(itemid)],index[ARRAYLENGTH(itemid)]; 1969 2015 1970 2016 nullpo_retr(0, hd); 1971 2017 sd = hd->master; … … 2102 2148 target = src; //Required since it has to warp. 2103 2149 if(target == NULL) 2104 break; 2150 break; 2105 2151 if(target->prev == NULL) 2106 2152 break; … … 2145 2191 } 2146 2192 break; 2193 <<<<<<< .mine 2194 2195 case NC_PWSUFFER: //Necro Power Word: Suffer [Brain] 2196 if (!status_isdead(target) && status_get_sc(target)->data[SC_SUFFER]){ 2197 skill_attack(BF_MAGIC,src,src,target,skl->skill_id,skl->skill_lv,tick,skl->flag|SD_ANIMATION|SD_LEVEL); 2198 clif_specialeffect(target, 180, AREA); //Shadow Hit Effect on target 2199 if (skl->type>1 && !status_isdead(target)) 2200 skill_addtimerskill(src,tick+3000,target->id,0,0,skl->skill_id,skl->skill_lv,skl->type-1,skl->flag|SD_ANIMATION); 2201 } 2202 break; 2203 case WL_SEARING: //Warlock Searing Pain [Brain] 2204 if (!status_isdead(target) && status_get_sc(target)->data[SC_SEARING]){ 2205 skill_attack(BF_MAGIC,src,target,target,skl->skill_id,skl->skill_lv,tick,skl->flag|SD_ANIMATION|SD_LEVEL); 2206 clif_specialeffect(target, 49, AREA); //Fire Hit Effect on target 2207 if (skl->type>1 && !status_isdead(target)) 2208 skill_addtimerskill(src,tick+3000,target->id,0,0,skl->skill_id,skl->skill_lv,skl->type-1,skl->flag|SD_ANIMATION); 2209 } 2210 break; 2211 case WL_IMMOLATE: //Warlock Immolate [Brain] 2212 if (!status_isdead(target) && status_get_sc(target)->data[SC_IMMOLATE]){ 2213 skill_attack(BF_MAGIC,src,target,target,skl->skill_id,skl->skill_lv,tick,skl->flag|SD_ANIMATION|SD_LEVEL); 2214 clif_specialeffect(target, 97, AREA); //Firepillar Hit Effect on target 2215 if (skl->type>1 && !status_isdead(target)) 2216 skill_addtimerskill(src,tick+3000,target->id,0,0,skl->skill_id,skl->skill_lv,skl->type-1,skl->flag|SD_ANIMATION); 2217 } 2218 break; 2219 case WL_PWAGONY: //Warlock Power Word: Agony [Brain] 2220 if (!status_isdead(target) && status_get_sc(target)->data[SC_AGONY]){ 2221 skill_attack(BF_MAGIC,src,target,target,skl->skill_id,skl->skill_lv,tick,skl->flag|SD_ANIMATION|SD_LEVEL); 2222 clif_specialeffect(target, 587, AREA); //Big Purple Flame Effect on target 2223 if (skl->type>1 && !status_isdead(target)) 2224 skill_addtimerskill(src,tick+3000,target->id,0,0,skl->skill_id,skl->skill_lv,skl->type-1,skl->flag|SD_ANIMATION); 2225 } 2226 break; 2227 2228 ======= 2147 2229 //Custom Jobs (blackmagic) 2148 2230 … … 2181 2263 2182 2264 //Custom Job End 2265 >>>>>>> .r18 2183 2266 default: 2184 2267 skill_attack(skl->type,src,src,target,skl->skill_id,skl->skill_lv,tick,skl->flag); … … 2216 2299 ud = unit_bl2ud(src); 2217 2300 nullpo_retr(1, ud); 2218 2301 2219 2302 ARR_FIND( 0, MAX_SKILLTIMERSKILL, i, ud->skilltimerskill[i] == 0 ); 2220 2303 if( i == MAX_SKILLTIMERSKILL ) return 1; 2221 2304 2222 2305 ud->skilltimerskill[i] = ers_alloc(skill_timer_ers, struct skill_timerskill); 2223 2306 ud->skilltimerskill[i]->timer = add_timer(tick, skill_timerskill, src->id, i); … … 2244 2327 ud = unit_bl2ud(src); 2245 2328 nullpo_retr(0, ud); 2246 2329 2247 2330 for(i=0;i<MAX_SKILLTIMERSKILL;i++) { 2248 2331 if(ud->skilltimerskill[i]) { … … 2281 2364 2282 2365 nullpo_retr(1, src); 2283 nullpo_retr(1, bl); 2366 nullpo_retr(1, bl); 2284 2367 2285 2368 if (src->m != bl->m) … … 2288 2371 if (bl->prev == NULL) 2289 2372 return 1; 2290 2373 2291 2374 sd = BL_CAST(BL_PC, src); 2292 2375 tsd = BL_CAST(BL_PC, bl); … … 2304 2387 } 2305 2388 2306 sc = status_get_sc(src); 2389 sc = status_get_sc(src); 2307 2390 if (sc && !sc->count) 2308 2391 sc = NULL; //Unneeded … … 2393 2476 case NPC_BLEEDING: 2394 2477 case NPC_CRITICALWOUND: 2478 /*Mercenary Skills [Brainstorm] 2479 case MS_BASH: 2480 case MA_DOUBLE: 2481 case MA_CHARGEARROW: 2482 case ML_PIERCE: 2483 case ML_SPIRALPIERCE: 2484 case MER_CRASH: 2395 2485 skill_attack(BF_WEAPON,src,src,bl,skillid,skilllv,tick,flag); 2486 <<<<<<< .mine 2487 break;*/ 2488 case NC_GHOULTOUCH: //Necro Ghoul Touch [Brain] 2489 skill_attack(BF_WEAPON,src,src,bl,skillid,skilllv,tick,flag); 2490 clif_specialeffect(bl, 124, AREA); //Venom Dust Effect on target 2491 break; 2492 case NC_DEATHHAND: //Necro Death Hand [Brain] 2493 skill_attack(BF_WEAPON,src,src,bl,skillid,skilllv,tick,flag|SD_LEVEL);//Hide skill yell 2494 clif_specialeffect(bl, 65, AREA); //Power absorb Effect on target 2495 if (battle_check_living(tstatus->race, tstatus->def_ele)){ //Check if target is a living creature before proceed 2496 int chance = (10+(skilllv*2)+(status_get_luk(src)-status_get_luk(bl))/5); 2497 //10% chance + 2% per skilllv + (caster luk - target luk)/5 % 2498 if (rand()%100 < chance) { 2499 clif_skill_nodamage(src,bl,skillid,-1,flag|SD_LEVEL);//Hide skill yell 2500 status_percent_damage(src, bl, 100, 0, true); //Instant kill our target 2501 } else clif_skill_fail(sd,skillid,0,0); 2502 } 2503 break; 2504 ======= 2396 2505 break; 2397 2506 //Custom Jobs (blackmagic) … … 2414 2523 break; 2415 2524 //Custom Job End 2525 >>>>>>> .r18 2526 2416 2527 2417 2528 case LK_JOINTBEAT: // decide the ailment first (affects attack damage and effect) … … 2446 2557 map_foreachinrange(skill_attack_area, src, 2447 2558 skill_get_splash(skillid, skilllv), splash_target(src), 2448 BF_WEAPON, src, src, skillid, skilllv, tick, flag, BCT_ENEMY); 2559 BF_WEAPON, src, src, skillid, skilllv, tick, flag, BCT_ENEMY); 2449 2560 break; 2450 2561 … … 2588 2699 //Splash attack skills. 2589 2700 case AS_GRIMTOOTH: 2590 case MC_CARTREVOLUTION: 2701 case MC_CARTREVOLUTION: 2591 2702 case NPC_SPLASHATTACK: 2592 2703 flag |= SD_PREAMBLE; // a fake packet will be sent for the first target to be hit … … 2594 2705 case SM_MAGNUM: 2595 2706 case HT_BLITZBEAT: 2596 case AC_SHOWER: 2707 case AC_SHOWER: 2597 2708 case MG_NAPALMBEAT: 2598 2709 case MG_FIREBALL: … … 2651 2762 if (skill_area_temp[1] != bl->id) 2652 2763 skill_attack(skill_get_type(skillid), src, src, bl, skillid, skilllv, tick, flag|SD_ANIMATION); 2653 else 2764 else 2654 2765 skill_attack(skill_get_type(skillid), src, src, bl, skillid, skilllv, tick, flag); 2655 2766 break; … … 2716 2827 skill_castend_nodamage_id); 2717 2828 } 2718 break; 2829 break; 2719 2830 case CH_PALMSTRIKE: // Palm Strike takes effect 1sec after casting. [Skotlex] 2720 2831 // clif_skill_nodamage(src,bl,skillid,skilllv,0); //Can't make this one display the correct attack animation delay :/ 2721 2832 clif_damage(src,bl,tick,status_get_amotion(src),0,-1,1,4,0); //Display an absorbed damage attack. 2722 2833 skill_addtimerskill(src, tick + 1000, bl->id, 0, 0, skillid, skilllv, BF_WEAPON, flag); 2723 break; 2834 break; 2724 2835 2725 2836 case PR_TURNUNDEAD: … … 2749 2860 skill_attack(BF_MAGIC,src,src,bl,skillid,skilllv,tick,flag); 2750 2861 break; 2862 <<<<<<< .mine 2863 case AD_DARKHEAL: // Adept Dark Heal [Brain] 2864 clif_specialeffect(bl, 656, AREA); //Blinking Green Sprite Effect on target 2865 skill_attack(BF_MAGIC,src,src,bl,skillid,skilllv,tick,flag); //Exception because we must add the effect manually =/ 2866 break; 2867 case NC_PWSUFFER: //Necro Power Word: Suffer [Brain] 2868 if(battle_check_living(tstatus->race,tstatus->def_ele)){ 2869 skill_attack(BF_MAGIC,src,src,bl,skillid,skilllv,tick,flag); 2870 clif_specialeffect(bl, 180, AREA); //Shadow hit Effect on target 2871 clif_specialeffect(src, 454, AREA); //Black Cast Effect on caster 2872 //If target is on suffering status already, just cause damage, no extra DoT 2873 if(!status_get_sc(bl)->data[SC_SUFFER]) 2874 skill_addtimerskill(src,tick+3000,bl->id,0,0,skillid,skilllv,skilllv,flag); 2875 } 2876 else clif_skill_fail(sd,skillid,0,0); 2877 break; 2878 case NC_DRAINLIFE: // Necromancer Drain Life [Brain] 2879 { 2880 int heal = skill_attack(BF_MAGIC, src, src, bl, skillid, skilllv, tick, flag)/2; 2881 if (heal > 0 && (battle_check_living(tstatus->race,tstatus->def_ele))){ 2882 clif_skill_nodamage(NULL, src, AL_HEAL, heal, 1); 2883 status_heal(src, heal, 0, 0); 2884 } 2885 } 2886 clif_specialeffect(bl, 180, AREA); //Shadow hit Effect on target 2887 clif_specialeffect(src, 454, AREA); //Black Cast Effect on caster 2888 break; 2889 case WL_SHADOWBOLT: // Warlock Shadowbolt [Brain] 2890 clif_specialeffect(bl, 180, AREA); //Shadow hit Effect on target 2891 clif_specialeffect(src, 454, AREA); //Black Cast Effect on caster 2892 skill_attack(BF_MAGIC,src,src,bl,skillid,skilllv,tick,flag); //Again, the effect...cursed effects... 2893 break; 2894 case WL_SHADOWBURN: // Warlock Shadow Burn [Brain] 2895 clif_specialeffect(bl, 180, AREA); //Shadow hit Effect on target 2896 clif_specialeffect(bl, 32, AREA); //Flame Engulf Effect on target 2897 clif_specialeffect(src, 454, AREA); //Black Cast Effect on caster 2898 skill_attack(BF_MAGIC,src,src,bl,skillid,skilllv,tick,flag); 2899 break; 2900 case WL_SEARING: // Warlock Searing Pain [Brain] 2901 clif_specialeffect(bl, 406, AREA); //Fire on Head Effect on target 2902 clif_specialeffect(src, 55, AREA); //Red Cast Effect on caster 2903 skill_attack(BF_MAGIC,src,src,bl,skillid,skilllv,tick,flag); 2904 //if target is on searing status already, just cause damage, no extra DoT 2905 if(!status_get_sc(bl)->data[SC_SEARING]) 2906 skill_addtimerskill(src,tick+3000,bl->id,0,0,skillid,skilllv,4,flag); 2907 break; 2908 case WL_CONFLAGRATE: // Warlock Conflagrate [Brain] 2909 if(status_get_sc(bl)->data[SC_IMMOLATE]) { // Can only be casted if target is immolating status 2910 clif_specialeffect(bl, 183, AREA); //Explosion Effect on target 2911 clif_specialeffect(src, 55, AREA); //Red Cast Effect on caster 2912 skill_attack(BF_MAGIC,src,src,bl,skillid,skilllv,tick,flag); 2913 status_change_end(bl,SC_IMMOLATE,-1); //End Immolating status 2914 } else clif_skill_fail(sd,skillid,0,0); 2915 break; 2916 case WL_IMMOLATE: // Warlock Immolate [Brain] 2917 clif_specialeffect(bl, 635, AREA); //Dragon Fire Effect on target 2918 clif_specialeffect(src, 55, AREA); //Red Cast Effect on caster 2919 skill_attack(BF_MAGIC,src,src,bl,skillid,skilllv,tick,flag); 2920 //If Target is on searing pain status, will change immolating status instead 2921 if(!status_get_sc(bl)->data[SC_IMMOLATE]) 2922 skill_addtimerskill(src,tick+3000,bl->id,0,0,skillid,skilllv,5,flag); 2923 break; 2924 case WL_CURSEDOOM: // Warlock Curse of Doom [Brain] 2925 clif_specialeffect(bl, 183, AREA); //Explosion Effect on target 2926 skill_attack(BF_MAGIC,src,bl,bl,skillid,skilllv,tick,flag|SD_ANIMATION); 2927 break; 2928 case WL_PWAGONY: // Warlock Power Word: Agony [Brain] 2929 if(battle_check_living(tstatus->race,tstatus->def_ele)){ 2930 skill_attack(BF_MAGIC,src,src,bl,skillid,skilllv,tick,flag); 2931 clif_specialeffect(bl, 587, AREA); //Big Purple Flame Effect on target 2932 clif_specialeffect(src, 454, AREA); //Black Cast Effect on caster 2933 //If target is on Agonizing status already, just cause damage, no extra DoT 2934 if(!status_get_sc(bl)->data[SC_AGONY]) 2935 skill_addtimerskill(src,tick+3000,bl->id,0,0,skillid,skilllv,skilllv,flag); 2936 } 2937 else clif_skill_fail(sd,skillid,0,0); 2938 break; 2939 ======= 2751 2940 //Custom Jobs (blackmagic) 2752 2941 >>>>>>> .r18 2942 2943 <<<<<<< .mine 2944 ======= 2753 2945 2754 2946 case AD_DARKHEAL: // Adept Dark Heal [Brain] … … 2830 3022 2831 3023 //Custom Job End 3024 >>>>>>> .r18 2832 3025 2833 3026 case NPC_MAGICALATTACK: … … 2867 3060 count++; // natural water cell 2868 3061 else 2869 if( (unit = map_find_skill_unit_oncell(src,x,y,SA_DELUGE,NULL)) != NULL 3062 if( (unit = map_find_skill_unit_oncell(src,x,y,SA_DELUGE,NULL)) != NULL 2870 3063 || (unit = map_find_skill_unit_oncell(src,x,y,NJ_SUITON,NULL)) != NULL ) 2871 3064 { … … 2932 3125 skill_attack(BF_MAGIC,src,src,src,skillid,skilllv,tick,flag); 2933 3126 status_percent_damage(src, src, 0, 100, false); 2934 } 3127 } 2935 3128 if (sd) skill_blockpc_start (sd, skillid, (skilllv < 5 ? 10000: 15000)); 2936 3129 break; … … 2993 3186 } 2994 3187 2995 map_freeblock_unlock(); 3188 map_freeblock_unlock(); 2996 3189 2997 3190 if (sd && !(flag&1) && sd->state.arrow_atk) //Consume arrow on last invocation to this skill. … … 3001 3194 3002 3195 /*========================================== 3003 * 3196 * 3004 3197 *------------------------------------------*/ 3005 3198 int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, int skillid, int skilllv, unsigned int tick, int flag) … … 3015 3208 int i; 3016 3209 enum sc_type type; 3017 3210 3018 3211 if(skillid > 0 && skilllv <= 0) return 0; // celest 3019 3212 … … 3035 3228 if(status_isdead(src)) 3036 3229 return 1; 3230 <<<<<<< .mine 3231 3232 ======= 3037 3233 //Custom Jobs (blackmagic) 3038 3234 /*if(src!=bl && status_isdead(bl) && skillid != ALL_RESURRECTION && skillid != PR_REDEMPTIO)*/ 3039 3235 // Added DEATHPACT [Brain] 3040 3236 //if(src!=bl && status_isdead(bl) && skillid != ALL_RESURRECTION && skillid != PR_REDEMPTIO) 3237 >>>>>>> .r18 3041 3238 if(src!=bl && status_isdead(bl) && skillid != ALL_RESURRECTION && skillid != PR_REDEMPTIO && skillid != NC_DEATHPACT) 3042 3239 return 1; 3043 //Custom Job End 3240 3044 3241 tstatus = status_get_status_data(bl); 3045 3242 sstatus = status_get_status_data(src); 3046 3243 3047 3244 //Check for undead skills that convert a no-damage skill into a damage one. [Skotlex] 3048 3245 switch (skillid) { … … 3065 3262 } 3066 3263 break; 3264 <<<<<<< .mine 3265 case AD_DARKHEAL: // Adept Dark Heal [Brain] 3266 // Only player casted spells can be offensive (copyed from AL_HEAL code above) 3267 if (sd && (battle_check_living(tstatus->race,tstatus->def_ele)) //Check if target is a living creature 3268 && !pc_checkskill(dstsd,NC_PHYLACTERY) //Or he doesnt have Phylactery (non-perma undead) 3269 && !status_get_sc(bl)->data[SC_OVERWHELMING]) { //Or Overwhelming Evil is off (most cases) 3270 if (battle_check_target(src, bl, BCT_ENEMY) < 1) { 3271 //Offensive heal does not works on non-enemies. 3272 clif_skill_fail(sd,skillid,0,0); 3273 return 0; 3274 } 3275 return skill_castend_damage_id(src, bl, skillid, skilllv, tick, flag); 3276 } 3277 break; 3278 3279 ======= 3067 3280 //Custom Jobs (blackmagic) 3068 3281 … … 3082 3295 3083 3296 //Custom Job End 3297 >>>>>>> .r18 3084 3298 case NPC_SMOKING: //Since it is a self skill, this one ends here rather than in damage_id. [Skotlex] 3085 3299 return skill_castend_damage_id (src, bl, skillid, skilllv, tick, flag); … … 3108 3322 int heal = skill_calc_heal(src, bl, skilllv); 3109 3323 int heal_get_jobexp; 3110 3324 3111 3325 if (status_isimmune(bl) || (dstmd && dstmd->class_ == MOBID_EMPERIUM)) 3112 3326 heal=0; 3327 <<<<<<< .mine 3328 // Profane Soul reduces the healed recieved by 3% per skilllv [Brain] 3329 if(dstsd) { 3330 heal = heal * (100 - pc_checkskill(dstsd,AD_PROFANE)*3)/100; 3331 //Wont heal even if he got elemental armors [Brain] 3332 if(pc_checkskill(dstsd,NC_PHYLACTERY)) heal = skilllv; 3333 } 3334 ======= 3113 3335 //Custom Jobs (blackmagic) 3114 3336 // Profane Soul reduces the healed recieved by 3% per skilllv [Brain] … … 3119 3341 } 3120 3342 //Custom Job End 3343 >>>>>>> .r18 3121 3344 if (sd) { 3122 3345 if ((i = pc_skillheal_bonus(sd, skillid))) … … 3154 3377 } 3155 3378 break; 3379 <<<<<<< .mine 3380 3381 case AD_DARKHEAL: // Adept Dark Heal [Brain] 3382 { 3383 int heal = skill_calc_heal(src, bl, skilllv); 3384 if (status_isimmune(bl) || (dstmd && dstmd->class_ == MOBID_EMPERIUM)) 3385 heal=0; 3386 if(battle_check_undead(tstatus->race,tstatus->def_ele) || tstatus->race==RC_UNDEAD // Check if our target is undead or demon 3387 || tstatus->race==RC_DEMON || pc_checkskill(dstsd,NC_PHYLACTERY)//Or has a phylactery 3388 || status_get_sc(bl)->data[SC_OVERWHELMING]) { //Or is on OverWhelm status, checking again... 3389 clif_skill_nodamage(src, bl, skillid, heal, 1); 3390 clif_skill_nodamage(NULL, bl, AL_HEAL, heal, 1); //Subtle way to show heal numbers AND effect =D 3391 status_heal(bl, heal, 0, 0); 3392 } else { 3393 clif_skill_nodamage(src, bl, skillid, 0, 1); 3394 clif_skill_nodamage(NULL, bl, AL_HEAL, 0, 1); 3395 } 3396 clif_specialeffect(bl, 656, AREA); //Blinking Green Sprite Effect on target 3397 } 3398 break; 3399 3400 3401 ======= 3156 3402 //Custom Jobs (blackmagic) 3157 3403 … … 3175 3421 break; 3176 3422 //Custom Job End 3423 >>>>>>> .r18 3177 3424 case PR_REDEMPTIO: 3178 3425 if (sd && !(flag&1)) { … … 3205 3452 } else //Invalid target, skip resurrection. 3206 3453 break; 3207 3454 3208 3455 case ALL_RESURRECTION: 3209 //Custom Jobs (blackmagic)3210 3456 case NC_DEATHPACT: // Necro Death Pact [Brain] 3211 //Custom Job End3212 3457 if(sd && map_flag_gvg(bl->m)) 3213 3458 { //No reviving in WoE grounds! … … 3217 3462 if (!status_isdead(bl)) 3218 3463 break; 3219 { 3464 { 3220 3465 int per = 0, sper = 0; 3221 3466 if (map[bl->m].flag.pvp && dstsd && dstsd->pvp_point < 0) … … 3227 3472 case 3: per=50; break; 3228 3473 case 4: per=80; break; 3229 //Custom Jobs (blackmagic)3230 3474 case 5: per=100; break; //Added a 5th level because NC_DEATHPACT got 5 lvs [Brain] 3231 //Custom Job End 3232 } 3233 if(dstsd && dstsd->special_state.restart_full_recover) 3475 } 3476 if(dstsd && dstsd->special_state.restart_full_recover) 3234 3477 per = sper = 100; 3235 3478 if (status_revive(bl, per, sper)) 3236 3479 { 3237 3480 clif_skill_nodamage(src,bl,ALL_RESURRECTION,skilllv,1); //Both Redemptio and Res show this skill-animation. 3481 <<<<<<< .mine 3482 if(skillid==NC_DEATHPACT) { // Necro Death Pact [Brain] 3483 clif_skill_nodamage(src, bl, skillid, skilllv, 3484 sc_start(bl,type,100,skilllv,skill_get_time(skillid,skilllv))); 3485 break; 3486 } 3487 3488 if(sd && dstsd && battle_config.resurrection_exp > 0) 3489 ======= 3238 3490 //Custom Jobs (blackmagic) 3239 3491 if(skillid==NC_DEATHPACT) { // Necro Death Pact [Brain] … … 3244 3496 //Custom Job End 3245 3497 if(sd && dstsd && battle_config.resurrection_exp > 0) 3498 >>>>>>> .r18 3246 3499 { 3247 3500 int exp = 0,jexp = 0; … … 3261 3514 } 3262 3515 break; 3516 <<<<<<< .mine 3517 ======= 3263 3518 //Custom Jobs (blackmagic) 3264 3519 … … 3352 3607 clif_specialeffect(src, 668, AREA); // Monster skill SCREAM effect on caster (with sound) 3353 3608 break; 3354 3355 //Custom Job End 3609 >>>>>>> .r18 3610 3611 case AD_PWBLIND: // Adept Power Word: Blind [Brain] 3612 if(!tsc->data[type]) { 3613 clif_skill_nodamage(src, bl, skillid, skilllv,1); 3614 if(sc_start(bl, type,(30 + skilllv * 10 + (status_get_lv(src) - sstatus->int_)/5), 3615 skilllv, skill_get_time(skillid,skilllv))) 3616 { 3617 if(dstmd) mob_unlocktarget(dstmd,tick); //Removes current target 3618 clif_specialeffect(bl, 379, AREA); //379.Soul Drain (2nd Part) 3619 break; 3620 } 3621 } else clif_skill_fail(sd,skillid,0,0); 3622 break; 3623 3624 case AD_PWFEAR: // Adept Power Word: Fear [Brain] 3625 if(!tsc->data[type]) { 3626 clif_skill_nodamage(src, bl, skillid, skilllv,1); 3627 if(dstsd) 3628 type = SC_CONFUSION; //Players cant be affected by SC_FEAR 3629 if(sc_start(bl, type, (30 + skilllv * 10), skilllv, skill_get_time(skillid,skilllv))) 3630 { 3631 clif_specialeffect(bl, 372, AREA); //372.Death 3632 unit_escape(bl, bl, 30); 3633 } 3634 } else clif_skill_fail(sd,skillid,0,0); 3635 break; 3636 case WL_HOWLOFPAIN: // Warlock Howl of Pain [Brain] 3637 //These must be here first or else the code wont execute them. 3638 clif_specialeffect(src, 670, AREA); // Monster skill SCREAM effect on caster (no sound) 3639 clif_soundeffectall(bl, "wraith_die.wav", 0, AREA); //Wraith Laugh Sound 3640 if (flag & 1) { 3641 //Check if target is a living creature AND a valid enemy 3642 if (battle_check_target(src, bl, BCT_ENEMY) && battle_check_living(tstatus->race,tstatus->def_ele)) 3643 { 3644 if(sc_start(bl,type,10+skilllv*10,skilllv,skill_get_time(skillid,skilllv))) 3645 { 3646 if(dstmd) //PROVOKE Effect on mobs 3647 mob_target(dstmd,src,skill_get_range2(src,skillid,skilllv)); 3648 // Breaks Frozen and Sleep status 3649 if(tsc && tsc->count){ 3650 if(tsc->data[SC_FREEZE]) 3651 status_change_end(bl,SC_FREEZE,-1); 3652 if(tsc->data[SC_SLEEP]) 3653 status_change_end(bl,SC_SLEEP,-1); 3654 } 3655 clif_emotion(bl,6); //anger emote on target 3656 break; 3657 } else { //What will happen if the status fail: 3658 { 3659 if (sd) //If is a player 3660 clif_skill_fail(sd,skillid,0,0); 3661 map_freeblock_unlock(); //Else is a mob 3662 return 0; 3663 } 3664 unit_skillcastcancel(bl, 2); //In any case, will cancel casting 3665 } 3666 } 3667 } else { 3668 map_foreachinrange(skill_area_sub, src, 3669 skill_get_splash(skillid, skilllv), BL_CHAR, 3670 src, skillid, skilllv, tick, flag|BCT_ENEMY|1, 3671 skill_castend_nodamage_id); 3672 clif_skill_nodamage(src, bl, skillid, skilllv, 1); 3673 map_freeblock_unlock(); 3674 return 1; 3675 } 3676 break; 3677 case WL_HOWLOFTERROR: // Warlock Howl of Terror [Brain] 3678 if (flag & 1) { 3679 int rate; 3680 //Check if target is a living creature AND a valid enemy 3681 if (battle_check_target(src, bl, BCT_ENEMY) 3682 && battle_check_living(tstatus->race,tstatus->def_ele)) { 3683 rate = 10 + skilllv*5 + pc_checkskill(sd,AD_PWFEAR)*3; 3684 if(dstsd) { 3685 rate -= 10; // 10% less chance on players 3686 type = SC_CONFUSION; //Players cant be affected by SC_FEAR 3687 } 3688 if(sc_start(bl,type,rate,skilllv,skill_get_time(skillid,skilllv))) 3689 clif_specialeffect(bl, 372, AREA); //Same as PW: Fear 3690 } 3691 } else { 3692 map_foreachinrange(skill_area_sub, src, 3693 skill_get_splash(skillid, skilllv), BL_CHAR, 3694 src, skillid, skilllv, tick, flag|BCT_ENEMY|1, 3695 skill_castend_nodamage_id); 3696 clif_skill_nodamage(src, bl, skillid, skilllv, 1); 3697 } 3698 clif_specialeffect(src, 668, AREA); // Monster skill SCREAM effect on caster (with sound) 3699 break; 3700 3356 3701 3357 3702 case AL_DECAGI: … … 3371 3716 } 3372 3717 break; 3718 <<<<<<< .mine 3719 3720 ======= 3373 3721 //Custom Jobs (blackmagic) 3374 3722 case NC_DARKMOON: //Necro Dark Moon [Brain] … … 3436 3784 } 3437 3785 break; 3438 //Custom Job End 3786 >>>>>>> .r18 3787 case NC_DARKMOON: //Necro Dark Moon [Brain] 3788 if (flag&1) { 3789 //Check my enemies 3790 if (battle_check_target(src, bl, BCT_ENEMY) && 3791 battle_check_living(tstatus->race,tstatus->def_ele)) 3792 { 3793 if(sc_start(bl,SC_BLIND,50,skilllv,skill_get_time(skillid,skilllv))) 3794 clif_specialeffect(bl, 580, AREA); //Box of Rain effect on target 3795 } 3796 else { //Now my Party members 3797 if (sd == NULL || sd->status.party_id == 0 || (flag & 1)) { 3798 clif_skill_nodamage(bl,bl,skillid,skilllv, 3799 sc_start(bl,type,100,skilllv,skill_get_time(skillid,skilllv))); 3800 clif_specialeffect(bl, 521, AREA); //Red Flashing Aura Sprite effect on target 3801 } else if (sd) { 3802 party_foreachsamemap(skill_area_sub, sd,skill_get_splash(skillid, skilllv), 3803 src,skillid,skilllv,tick, flag|BCT_ALL|1,skill_castend_nodamage_id); 3804 } 3805 } 3806 } else { 3807 map_foreachinrange(skill_area_sub, src, skill_get_splash(skillid, skilllv), BL_CHAR, 3808 src, skillid, skilllv, tick, flag|BCT_ALL|1, skill_castend_nodamage_id); 3809 clif_skill_nodamage(src, bl, skillid, skilllv, 1); 3810 } 3811 clif_specialeffect(src, 407, AREA); //Soul Change Effect on caster 3812 clif_soundeffectall(bl, "se_wolf1.wav", 0, AREA); //Wolf Howl Sound 3813 break; 3814 case NC_REQUIEM: //Necro Requiem [Brain] 3815 if (flag&1) { 3816 //Check my enemies 3817 if (battle_check_target(src, bl, BCT_ENEMY) && 3818 battle_check_living(tstatus->race,tstatus->def_ele)) 3819 { 3820 if(sc_start(bl,type,100,skilllv,skill_get_time(skillid,skilllv))) 3821 clif_specialeffect(bl, 578, AREA); //Box of Curse effect on target 3822 } 3823 else { //Now my Party members 3824 if (sd == NULL || sd->status.party_id == 0 || (flag & 1)) { 3825 clif_skill_nodamage(bl,bl,skillid,skilllv, 3826 sc_start(bl,type,100,skilllv,skill_get_time(skillid,skilllv))); 3827 clif_specialeffect(bl, 572, AREA); //Warmth Soul effect on target 3828 } else if (sd) { 3829 party_foreachsamemap(skill_area_sub, sd,skill_get_splash(skillid, skilllv), 3830 src,skillid,skilllv,tick, flag|BCT_ALL|1,skill_castend_nodamage_id); 3831 } 3832 } 3833 } else { 3834 map_foreachinrange(skill_area_sub, src, skill_get_splash(skillid, skilllv), BL_CHAR, 3835 src, skillid, skilllv, tick, flag|BCT_ALL|1, skill_castend_nodamage_id); 3836 clif_skill_nodamage(src, bl, skillid, skilllv, 1); 3837 } 3838 int rnds = rand()%3; 3839 switch(rnds) { 3840 case 1: 3841 clif_soundeffectall(bl, "chant1.wav", 0, AREA); //Chanting Sound 3842 break; 3843 case 2: 3844 clif_soundeffectall(bl, "chant2.wav", 0, AREA); //Chanting Sound 3845 break; 3846 case 3: 3847 clif_soundeffectall(bl, "chant3.wav", 0, AREA); //Chanting Sound 3848 break; 3849 } 3850 break; 3851 3439 3852 3440 3853 case PR_LEXDIVINA: … … 3442 3855 status_change_end(bl,type, -1); 3443 3856 clif_skill_nodamage (src, bl, skillid, skilllv, 1); 3444 } else 3445 clif_skill_nodamage (src, bl, skillid, skilllv, 3857 } else 3858 clif_skill_nodamage (src, bl, skillid, skilllv, 3446 3859 sc_start(bl,type,100,skilllv,skill_get_time(skillid,skilllv))); 3447 3860 break; … … 3459 3872 abra_skilllv = min(skilllv, skill_get_max(abra_skillid)); 3460 3873 clif_skill_nodamage (src, bl, skillid, skilllv, 1); 3461 3874 3462 3875 if( sd ) 3463 3876 {// player-casted … … 3473 3886 int target_id = 0; 3474 3887 if (!ud) break; 3475 if (inf&INF_SELF_SKILL || inf&INF_SUPPORT_SKILL) { 3888 if (inf&INF_SELF_SKILL || inf&INF_SUPPORT_SKILL) { 3476 3889 if (src->type == BL_PET) 3477 3890 bl = (struct block_list*)((TBL_PET*)src)->msd; 3478 3891 if (!bl) bl = src; 3479 unit_skilluse_id(src, bl->id, abra_skillid, abra_skilllv); 3892 unit_skilluse_id(src, bl->id, abra_skillid, abra_skilllv); 3480 3893 } else { //Assume offensive skills 3481 3894 if (ud->target) … … 3490 3903 bl = map_id2bl(target_id); 3491 3904 if (!bl) bl = src; 3492 unit_skilluse_pos(src, bl->x, bl->y, abra_skillid, abra_skilllv); 3905 unit_skilluse_pos(src, bl->x, bl->y, abra_skillid, abra_skilllv); 3493 3906 } else 3494 3907 unit_skilluse_id(src, target_id, abra_skillid, abra_skilllv); … … 3564 3977 case CR_PROVIDENCE: 3565 3978 if(sd && dstsd){ //Check they are not another crusader [Skotlex] 3566 if ((dstsd->class_&MAPID_UPPERMASK) == MAPID_CRUSADER) { 3979 if ((dstsd->class_&MAPID_UPPERMASK) == MAPID_CRUSADER) { 3567 3980 clif_skill_fail(sd,skillid,0,0); 3568 3981 map_freeblock_unlock(); … … 3573 3986 sc_start(bl,type,100,skilllv,skill_get_time(skillid,skilllv))); 3574 3987 break; 3575 3988 3576 3989 case CG_MARIONETTE: 3577 3990 { … … 3671 4084 3672 4085 sc_start(bl,SC_SEVENWIND,100,skilllv,skill_get_time(skillid,skilllv)); 3673 4086 3674 4087 break; 3675 4088 … … 3702 4115 case LK_BERSERK: 3703 4116 case KN_AUTOCOUNTER: 3704 case KN_TWOHANDQUICKEN: 4117 case KN_TWOHANDQUICKEN: 3705 4118 case KN_ONEHAND: 3706 4119 case CR_SPEARQUICKEN: … … 3713 4126 case MO_BLADESTOP: 3714 4127 case LK_AURABLADE: 3715 case LK_PARRYING: 4128 case LK_PARRYING: 3716 4129 case LK_CONCENTRATION: 3717 4130 case WS_CARTBOOST: … … 3739 4152 case NPC_DEFENDER: 3740 4153 case NPC_MAGICMIRROR: 3741 //Custom Jobs (blackmagic) 3742 case ALL_ATFIELD: //AT Field [Brain] 3743 //Custom Job End 4154 case ALL_ATFIELD: 3744 4155 clif_skill_nodamage(src,bl,skillid,skilllv, 3745 4156 sc_start(bl,type,100,skilllv,skill_get_time(skillid,skilllv))); 3746 4157 break; 4158 <<<<<<< .mine 4159 case AD_LUST: // Adept Blood Lust [Brain] 4160 clif_specialeffect(src, 220, AREA); //Berserk Pot effect 4161 clif_specialeffect(src, 455, AREA); //Red Lightnings 4162 clif_skill_nodamage(src,bl,skillid,skilllv, 4163 sc_start(bl,type,100,skilllv,skill_get_time(skillid,skilllv))); 4164 break; 4165 case NC_DECREPIFY: //Necro Decrepify [Brain] 4166 if(battle_check_living(tstatus->race,tstatus->def_ele)){ 4167 clif_specialeffect(bl, 403, AREA); //Mind Breaker Effect on target 4168 clif_specialeffect(src, 454, AREA); //Black Cast Effect on caster 4169 clif_skill_nodamage(src,bl,skillid,skilllv, 4170 sc_start(bl,type,100,skilllv,skill_get_time(skillid,skilllv))); 4171 } 4172 else clif_skill_fail(sd,skillid,0,0); 4173 break; 4174 case WL_CURSEWEAKNESS: // Warlock Curse of Weakness [Brain] 4175 clif_specialeffect(bl, 656, AREA); //Blinking Green Sprite effect on target 4176 clif_specialeffect(src, 59, AREA); //Purple Cast Effect on caster 4177 clif_skill_nodamage(src,bl,skillid,skilllv, 4178 sc_start(bl,type,100,skilllv,skill_get_time(skillid,skilllv))); 4179 break; 4180 case WL_CURSEEXHAUST: // Warlock Curse of Exhaustion [Brain] 4181 clif_specialeffect(bl, 135, AREA); //Ice Breaking effect on target 4182 clif_specialeffect(src, 59, AREA); //Purple Cast Effect on caster 4183 clif_skill_nodamage(src,bl,skillid,skilllv, 4184 sc_start(bl,type,100,skilllv,skill_get_time(skillid,skilllv))); 4185 break; 4186 case WL_CURSETONGUES: // Warlock Curse of Tongues [Brain] 4187 clif_specialeffect(bl, 72, AREA); //Spinning Lights effect on target 4188 clif_specialeffect(src, 59, AREA); //Purple Cast Effect on caster 4189 clif_skill_nodamage(src,bl,skillid,skilllv, 4190 sc_start(bl,type,100,skilllv,skill_get_time(skillid,skilllv))); 4191 break; 4192 case WL_CURSEDOOM: // Warlock Curse of Doom (temp) [Brain] 4193 if(!tsc->data[type]) { 4194 clif_specialeffect(bl, 196, AREA); //Small Curse Reaper effect on target 4195 clif_specialeffect(src, 59, AREA); //Purple Cast Effect on caster 4196 clif_skill_nodamage(src,bl,skillid,skilllv, 4197 sc_start4(bl,type,100, 4198 skilllv,skillid,src->id,skill_get_time(skillid,skilllv),1000)); 4199 } else clif_skill_fail(sd,skillid,0,0); 4200 break; 4201 case WL_OVERWHELMING: // Warlock Overwhelming Evil [Brain] 4202 clif_specialeffect(src, 348, AREA); //1000 Blades Trespassing effect on caster 4203 clif_skill_nodamage(src,bl,skillid,skilllv, 4204 sc_start(bl,type,100,skilllv,skill_get_time(skillid,skilllv))); 4205 break; 4206 ======= 3747 4207 //Custom Jobs (blackmagic) 3748 4208 … … 3796 4256 3797 4257 //Custom Job End 4258 >>>>>>> .r18 3798 4259 case MG_SIGHT: 3799 4260 case AL_RUWACH: … … 3910 4371 if (!i) 3911 4372 { 3912 if (sd) 4373 if (sd) 3913 4374 clif_skill_fail(sd,skillid,0,0); 3914 4375 map_freeblock_unlock(); … … 3996 4457 skill_additional_effect(src,bl,skillid,skilllv,BF_MISC,tick); //Use Misc rather than weapon to signal passive pushback 3997 4458 } 3998 break; 4459 break; 3999 4460 4000 4461 case MO_ABSORBSPIRITS: … … 4012 4473 clif_skill_nodamage(src,bl,skillid,skilllv,i?1:0); 4013 4474 break; 4475 <<<<<<< .mine 4476 ======= 4014 4477 //Custom Jobs (blackmagic) 4015 4478 … … 4038 4501 break; 4039 4502 //Custom Job End 4503 >>>>>>> .r18 4504 4505 case WL_DRAINSOUL: // Warlock Drain Soul [Brain] 4506 i = 0; 4507 if (dstsd && (sd == dstsd || map_flag_vs(src->m))) 4508 { //check if target is a player and we are in versus map 4509 i = tstatus->max_sp * skilllv/100;//i = SkillLv% of player Max SP 4510 if(dstsd->spiritball && (dstsd->class_&MAPID_BASEMASK)!=MAPID_GUNSLINGER) { 4511 i += dstsd->spiritball * 5;//will drain Monk Spirits and regain 5 SP per Spirit 4512 pc_delspiritball(dstsd,dstsd->spiritball,0); 4513 } 4514 } else if (dstmd && !(tstatus->mode&MD_BOSS) && battle_check_living(tstatus->race,tstatus->def_ele)) 4515 { // check if target is a monster and not a Boss 4516 i = dstmd->level/5 * skilllv;//i = mob level/5 * Skill Lvl 4517 mob_target(dstmd,src,0);//This will turn the mob agressive against the caster 4518 } 4519 if(i < skilllv) i = skilllv; //Minimum 1 sp per skill lvl 4520 if (i) { 4521 clif_specialeffect(src, 253, AREA); //Absorb Mana effect on caster 4522 clif_specialeffect(bl, 52, AREA); //Lightning Hit effect on target 4523 status_heal(src, 0, i, 3); //caster drains sp 4524 status_zap(bl, 0, i*skilllv); //target lost sp equal to 1*SkillLv the amount drained 4525 } 4526 clif_skill_nodamage(src,bl,skillid,skilllv,i?1:0); 4527 break; 4528 4040 4529 4041 4530 case AC_MAKINGARROW: … … 4130 4619 } 4131 4620 break; 4132 4621 4133 4622 case WZ_SIGHTRASHER: 4134 4623 //Passive side of the attack. … … 4238 4727 case SM_AUTOBERSERK: // Celest 4239 4728 if (tsce) 4240 i = status_change_end(bl, type, -1); 4729 i = status_change_end(bl, type, -1); 4241 4730 else 4242 4731 i = sc_start(bl,type,100,skilllv,60000); … … 4252 4741 break; 4253 4742 case TK_RUN: 4254 if (tsce) 4743 if (tsce) 4255 4744 clif_skill_nodamage(src,bl,skillid,skilllv, 4256 4745 status_change_end(bl, type, -1)); … … 4348 4837 if (dstmd) 4349 4838 mob_target(dstmd,src,skill_get_range2(src,skillid,skilllv)); 4350 4839 4351 4840 if (tsc->data[SC_STONE]) { 4352 4841 status_change_end(bl,SC_STONE,-1); … … 4499 4988 } 4500 4989 break; 4501 4990 4502 4991 case TF_PICKSTONE: 4503 4992 if(sd) { … … 4556 5045 //Note that Full Strip autospell doesn't use a duration 4557 5046 if (!clif_skill_nodamage(src,bl,skillid,skilllv, 4558 skill_strip_equip(bl, location, i, skilllv, 5047 skill_strip_equip(bl, location, i, skilllv, 4559 5048 sd&&skillid==ST_FULLSTRIP&&!pc_checkskill(sd, skillid)?0:skill_get_time(skillid,skilllv))) 4560 5049 && sd) … … 4712 5201 continue; 4713 5202 switch (i) { 4714 case SC_WEIGHT50: case SC_WEIGHT90: case SC_HALLUCINATION: 5203 case SC_WEIGHT50: case SC_WEIGHT90: case SC_HALLUCINATION: 4715 5204 case SC_STRIPWEAPON: case SC_STRIPSHIELD: case SC_STRIPARMOR: 4716 5205 case SC_STRIPHELM: case SC_CP_WEAPON: case SC_CP_SHIELD: … … 4762 5251 y = src->y + diry[dir]*skilllv*2; 4763 5252 } 4764 5253 4765 5254 clif_skill_nodamage(src,bl,TK_HIGHJUMP,skilllv,1); 4766 5255 if(!map_count_oncell(src->m,x,y,BL_PC|BL_NPC|BL_MOB) && map_getcell(src->m,x,y,CELL_CHKREACH)) { … … 4806 5295 } else if (!dstsd || map_flag_vs(bl->m)) //HP damage only on pvp-maps when against players. 4807 5296 hp = tstatus->max_hp/50; //Recover 2% HP [Skotlex] 4808 5297 4809 5298 clif_skill_nodamage(src,bl,skillid,skilllv,1); 4810 5299 unit_skillcastcancel(bl,0); … … 4816 5305 else 4817 5306 hp = 0; 4818 5307 4819 5308 if (sp) //Recover some of the SP used 4820 5309 sp = sp*(25*(skilllv-1))/100; … … 4892 5381 case NPC_CHANGETELEKINESIS: 4893 5382 clif_skill_nodamage(src,bl,skillid,skilllv, 4894 sc_start2(bl, type, 100, skilllv, skill_get_ele(skillid,skilllv), 5383 sc_start2(bl, type, 100, skilllv, skill_get_ele(skillid,skilllv), 4895 5384 skill_get_time(skillid, skilllv))); 4896 5385 break; … … 4900 5389 if(tstatus->def_ele==ELE_UNDEAD || tstatus->def_ele==ELE_DARK) break; 4901 5390 clif_skill_nodamage(src,bl,skillid,skilllv, 4902 sc_start2(bl, type, 100, skilllv, skill_get_ele(skillid,skilllv), 5391 sc_start2(bl, type, 100, skilllv, skill_get_ele(skillid,skilllv), 4903 5392 skill_get_time(skillid, skilllv))); 4904 5393 break; … … 4917 5406 sc_start(bl,type,100,skilllv,skill_time)) 4918 5407 && ud) { //Disable attacking/acting/moving for skill's duration. 4919 ud->attackabletime = 5408 ud->attackabletime = 4920 5409 ud->canact_tick = 4921 5410 ud->canmove_tick = tick + skill_time; … … 4961 5450 } 4962 5451 break; 4963 5452 4964 5453 case NPC_SPEEDUP: 4965 5454 { … … 5034 5523 sc_start(bl,type,100,100,skill_get_time(skillid, skilllv))); 5035 5524 break; 5036 5525 5037 5526 case NPC_AGIUP: 5038 5527 sc_start(bl,SC_SPEEDUP1,100,skilllv,skill_get_time(skillid, skilllv)); … … 5046 5535 sc_start4(bl,type,100,skilllv,0,0,6,skill_get_time(skillid,skilllv))); 5047 5536 break; 5048 5537 5049 5538 case NPC_SIEGEMODE: 5050 5539 // not sure what it does … … 5196 5685 return 1; 5197 5686 } 5198 5687 5199 5688 if (tsce) 5200 5689 { //HelloKitty2 (?) explained that this silently fails when target is … … 5207 5696 if (!clif_skill_nodamage(src,bl,skillid,skilllv, 5208 5697 sc_start(bl,type,55+5*skilllv,skilllv,skill_get_time(skillid,skilllv)))) 5209 { 5698 { 5210 5699 if (sd) clif_skill_fail(sd,skillid,0,0); 5211 5700 map_freeblock_unlock(); … … 5388 5877 break; 5389 5878 default: 5390 break; 5391 } 5879 break; 5880 } 5392 5881 } while ((--count) > 0); 5393 5882 clif_skill_nodamage(src,bl,skillid,skilllv,1); … … 5449 5938 clif_skill_nodamage(src,bl,skillid,skilllv, 5450 5939 sc_start(bl,type,100,skilllv,skill_get_time(skillid,skilllv))); 5451 5940 5452 5941 if (skillid == SL_SKE) 5453 5942 sc_start(src,SC_SMA,100,skilllv,skill_get_time(SL_SMA,skilllv)); 5454 5943 5455 5944 break; 5456 5945 5457 5946 // New guild skills [Celest] 5458 5947 case GD_BATTLEORDER: … … 5532 6021 clif_feel_info(sd, skilllv-1, 1); 5533 6022 } 5534 break; 6023 break; 5535 6024 5536 6025 case SG_HATE: … … 5612 6101 static const int per[5][2]={{20,50},{50,60},{25,75},{60,64},{34,67}}; 5613 6102 int rnd = rand()%100; 5614 i = (skilllv-1)%5; 6103 i = (skilllv-1)%5; 5615 6104 if(rnd<per[i][0]) //Self 5616 6105 bl = src; … … 5679 6168 mobskill_event(dstmd, src, tick, MSC_SKILLUSED|(skillid<<16)); 5680 6169 } 5681 6170 5682 6171 if (sd && !(flag&1) && sd->state.arrow_atk) //Consume arrow on last invocation to this skill. 5683 6172 battle_consume_ammo(sd, skillid, skilllv); … … 5782 6271 if(inf2 & (INF2_PARTY_ONLY|INF2_GUILD_ONLY) && src != target) 5783 6272 { 5784 inf |= 6273 inf |= 5785 6274 (inf2&INF2_PARTY_ONLY?BCT_PARTY:0)| 5786 6275 (inf2&INF2_GUILD_ONLY?BCT_GUILD:0); … … 5824 6313 if(sd && !skill_check_condition(sd,ud->skillid, ud->skilllv,1)) 5825 6314 break; 5826 6315 5827 6316 if(hd && !skill_check_condition_hom(hd,ud->skillid, ud->skilllv,1)) //[orn] 5828 6317 break; … … 5833 6322 if (ud->walktimer != -1 && ud->skillid != TK_RUN) 5834 6323 unit_stop_walking(src,1); 5835 6324 5836 6325 ud->canact_tick = tick + skill_delayfix(src, ud->skillid, ud->skilllv); 5837 6326 5838 6327 if (skill_get_state(ud->skillid) != ST_MOVE_ENABLE) 5839 6328 unit_set_walkdelay(src, tick, battle_config.default_walk_delay+skill_get_walkdelay(ud->skillid, ud->skilllv), 1); 5840 6329 5841 6330 if(battle_config.skill_log && battle_config.skill_log&src->type) 5842 6331 ShowInfo("Type %d, ID %d skill castend id [id =%d, lv=%d, target ID %d]\n", … … 5893 6382 if (dy > 0) dy++; 5894 6383 else if(dy < 0) dy--; 5895 6384 5896 6385 if (unit_movepos(src, src->x+dx, src->y+dy, 1, 1)) 5897 6386 { //Display movement + animation. … … 5914 6403 5915 6404 /*========================================== 5916 * 6405 * 5917 6406 *------------------------------------------*/ 5918 6407 int skill_castend_pos(int tid, unsigned int tick, int id, intptr data) … … 5935 6424 return 0; 5936 6425 } 5937 6426 5938 6427 if( ud->skilltimer != tid ) 5939 6428 { … … 5954 6443 skill_get_unit_flag(ud->skillid)&UF_NOREITERATION && 5955 6444 skill_check_unit_range(src,ud->skillx,ud->skilly,ud->skillid,ud->skilllv) 5956 ) 6445 ) 5957 6446 { 5958 6447 if (sd) clif_skill_fail(sd,ud->skillid,0,0); … … 5993 6482 } 5994 6483 } 5995 6484 5996 6485 if(sd && !skill_check_condition(sd,ud->skillid, ud->skilllv, 1)) 5997 6486 break; … … 6079 6568 skill_area_temp[1] = src->id; 6080 6569 i = skill_get_splash(skillid, skilllv); 6081 map_foreachinarea(skill_area_sub, 6570 map_foreachinarea(skill_area_sub, 6082 6571 src->m, x-i, y-i, x+i, y+i, BL_PC, 6083 6572 src, skillid, skilllv, tick, flag|BCT_ALL|1, … … 6106 6595 src->m, x-i, y-i, x+i,y+i,BL_SKILL); 6107 6596 break; 6597 <<<<<<< .mine 6598 ======= 6108 6599 //Custom Jobs (blackmagic) 6109 6600 case WL_HELLFIRE: // Warlock Hellfire [Brain] … … 6114 6605 // Continue reading because skill_unitsetting is bellow 6115 6606 //Custom Job End 6607 >>>>>>> .r18 6608 6609 case WL_HELLFIRE: // Warlock Hellfire [Brain] 6610 //clif_specialeffect(sd, 92, AREA); //Meteor Effect on caster, cant set on ground 6611 clif_skill_poseffect(src,WZ_METEOR,skilllv,x,y,tick); //Meteor Effect 6612 clif_skill_nodamage(src, src, skillid, 0, 1); //Lalala, just to show the skill yell correctly 6613 clif_specialeffect(src, 55, AREA); //Red Cast Effect on caster 6614 // Continue reading because skill_unitsetting is bellow 6615 6116 6616 6117 6617 case MG_SAFETYWALL: 6118 case MG_FIREWALL: 6618 case MG_FIREWALL: 6119 6619 case MG_THUNDERSTORM: 6120 6620 case AL_PNEUMA: … … 6273 6773 md->deletetimer = add_timer (gettick() + skill_get_time(skillid,skilllv), mob_timer_delete, md->bl.id, 0); 6274 6774 mob_spawn (md); //Now it is ready for spawning. 6775 <<<<<<< .mine 6776 // @showsummon command implementation [Brainstorm] 6777 if(sd->state.showsummon){ 6778 char output[256]; 6779 sprintf(output, 6780 "[Summon] HP : %d | STR : %d DEX : %d VIT : %d INT : %d AGI : %d LUK : %d", 6781 md->status.max_hp,md->status.str,md->status.dex,md->status.vit,md->status.int_,md->status.agi,md->status.luk); 6782 clif_disp_onlyself(sd,output,strlen(output)); 6783 sprintf(output, 6784 "[%s] ATK : %d~%d | DEF: %d+%d MDEF: %d+%d | HIT: %d FLEE: %d", 6785 md->name,md->status.rhw.atk,md->status.rhw.atk2,md->status.def,md->status.def2,md->status.mdef,md->status.mdef2,md->status.hit,md->status.flee); 6786 clif_disp_onlyself(sd,output,strlen(output)); 6787 } 6788 6789 ======= 6275 6790 //Custom Jobs (blackmagic) 6276 6791 // @showsummon command implementation [Brainstorm] … … 6287 6802 } 6288 6803 //Custom Job End 6289 } 6290 } 6291 break; 6292 6804 >>>>>>> .r18 6805 } 6806 } 6807 break; 6808 6809 <<<<<<< .mine 6810 case AD_FAMILIAR: // Adept Summon Familiar [Brain] 6811 if( sd ) 6812 { 6813 int id; 6814 int mob_class; 6815 struct mob_data* md; 6816 mob_class = pc_readglobalreg(sd, "ADEPT_FAMILIAR"); 6817 if( mob_class == 0 ) 6818 { 6819 mob_class = mob_get_random_id(4, 0x1, 0); 6820 pc_setglobalreg(sd, "ADEPT_FAMILIAR", mob_class); 6821 } 6822 id = mob_once_spawn(sd,src->m,src->x,src->y,"--en--",mob_class,1,""); 6823 md = (struct mob_data *)map_id2bl(id); 6824 if( md != NULL ) 6825 { 6826 md->master_id = sd->bl.id; 6827 md->special_state.ai = 1; 6828 md->status.mode = md->status.mode|MD_AGGRESSIVE; 6829 status_calc_mob(md,0); //Recalc their stats based on passive bonus 6830 md->status.hp = md->status.max_hp; //Must be here or the code wont update it 6831 // @showsummon command implementation [Brainstorm] 6832 if(sd->state.showsummon){ 6833 char output[256]; 6834 sprintf(output, 6835 "[Summon] HP : %d | STR : %d DEX : %d VIT : %d INT : %d AGI : %d LUK : %d", 6836 md->status.max_hp,md->status.str,md->status.dex,md->status.vit,md->status.int_,md->status.agi,md->status.luk); 6837 clif_disp_onlyself(sd,output,strlen(output)); 6838 sprintf(output, 6839 "[%s] ATK : %d~%d | DEF: %d+%d MDEF: %d+%d | HIT: %d FLEE: %d", 6840 md->name,md->status.rhw.atk,md->status.rhw.atk2,md->status.def,md->status.def2,md->status.mdef,md->status.mdef2,md->status.hit,md->status.flee); 6841 clif_disp_onlyself(sd,output,strlen(output)); 6842 } 6843 md->deletetimer = add_timer(gettick() + skill_get_time(skillid,skilllv), mob_timer_delete, id, 0); 6844 } 6845 } 6846 break; 6847 case NC_SKELETON: // Raise Skeleton [Brain] 6848 case NC_ARCHER: // Raise Archer Skeleton 6849 case NC_ZOMBIE: // Raise Zombie 6850 case NC_MUMMY: // Raise Mummy 6851 case NC_GHOST: // Raise Ghost 6852 case NC_SHADOW: // Raise Shadow 6853 case NC_WRAITH: // Raise Wraith 6854 if( sd ) 6855 { 6856 static const int mob_skeleton[5]={ 3201, 3202, 3203, 3204, 3205 }; // Skeleton, Orc Skeleton, Soldier Skeleton, Pirate Skeleton, Skeleton General 6857 static const int mob_archer[5]={ 3206, 3207, 3208, 3209, 3210 }; // Archer Skeleton, Firelock Soldier 6858 static const int mob_zombie[5]={ 3211, 3212, 3213, 3214, 3215 }; // Zombie, Ghoul, Zombie Master 6859 static const int mob_mummy[5]={ 3216, 3217, 3218, 3219, 3220 }; // Mummy, Ancient Mummy 6860 static const int mob_ghost[5]={ 3221, 3222, 3223, 3224, 3225 }; // Whisper, Nightmare, Nightmare Terror 6861 static const int mob_shadow[5]={ 3226, 3227, 3228, 3229, 3230 }; // Injustice, Raydric, Dullahan 6862 static const int mob_wraith[5]={ 3231, 3232, 3233, 3234, 3235 }; // Wraith, Wraith Dead 6863 int id; 6864 int mob_class; 6865 struct mob_data *md; 6866 ======= 6293 6867 //Custom Jobs (blackmagic) 6294 6868 case AD_FAMILIAR: // Adept Summon Familiar [Brain] … … 6349 6923 int mob_class; 6350 6924 struct mob_data *md; 6351 6925 >>>>>>> .r18 6926 6927 <<<<<<< .mine 6928 switch( skillid ) 6929 { 6930 case NC_SKELETON: mob_class = mob_skeleton[skilllv-1]; break; 6931 case NC_ARCHER: mob_class = mob_archer[skilllv-1]; break; 6932 case NC_ZOMBIE: mob_class = mob_zombie[skilllv-1]; break; 6933 case NC_MUMMY: mob_class = mob_mummy[skilllv-1]; break; 6934 case NC_GHOST: mob_class = mob_ghost[skilllv-1]; break; 6935 case NC_SHADOW: mob_class = mob_shadow[skilllv-1]; break; 6936 case NC_WRAITH: mob_class = mob_wraith[skilllv-1]; break; 6937 default: 6938 mob_class = 1002; // poring 6939 ShowDebug("skill_castend_pos2: undefined skill #%d used to raise mobs, defaulting to poring\n"); 6940 break; 6941 } 6942 id = mob_once_spawn(sd,src->m,src->x,src->y,"--ja--",mob_class,1,""); 6943 if((md=(struct mob_data *)map_id2bl(id))) 6944 { 6945 md->master_id=sd->bl.id; 6946 md->special_state.ai=1; 6947 md->status.mode=md->db->status.mode|MD_AGGRESSIVE; 6948 status_calc_mob(md,0); //Recalc their stats based on passive bonus 6949 md->status.hp = md->status.max_hp; //Must be here or the code wont update it 6950 // @showsummon command implementation [Brainstorm] 6951 if(sd->state.showsummon){ 6952 char output[256]; 6953 sprintf(output, 6954 "[Summon] HP : %d | STR : %d DEX : %d VIT : %d INT : %d AGI : %d LUK : %d", 6955 md->status.max_hp,md->status.str,md->status.dex,md->status.vit,md->status.int_,md->status.agi,md->status.luk); 6956 clif_disp_onlyself(sd,output,strlen(output)); 6957 sprintf(output, 6958 "[%s] ATK : %d~%d | DEF: %d+%d MDEF: %d+%d | HIT: %d FLEE: %d", 6959 md->name,md->status.rhw.atk,md->status.rhw.atk2,md->status.def,md->status.def2,md->status.mdef,md->status.mdef2,md->status.hit,md->status.flee); 6960 clif_disp_onlyself(sd,output,strlen(output)); 6961 } 6962 md->deletetimer = add_timer(gettick() + skill_get_time(skillid,skilllv), mob_timer_delete, id, 0); 6963 } 6964 } 6965 break; 6966 ======= 6352 6967 switch( skillid ) 6353 6968 { … … 6391 7006 6392 7007 //Custom Job End 7008 >>>>>>> .r18 7009 7010 6393 7011 6394 7012 // Slim Pitcher [Celest] … … 6416 7034 potion_hp = potion_hp * (100+i)/100; 6417 7035 potion_sp = potion_sp * (100+i)/100; 6418 7036 6419 7037 if(potion_hp > 0 || potion_sp > 0) { 6420 7038 i = skill_get_splash(skillid, skilllv); … … 6438 7056 potion_hp = potion_hp * (100+i)/100; 6439 7057 potion_sp = potion_sp * (100+i)/100; 6440 7058 6441 7059 if(potion_hp > 0 || potion_sp > 0) { 6442 7060 i = skill_get_splash(skillid, skilllv); … … 6460 7078 } 6461 7079 break; 6462 7080 6463 7081 case HW_GRAVITATION: 6464 7082 if ((sg = skill_unitsetting(src,skillid,skilllv,x,y,0))) … … 6542 7160 if (sd && !(flag&1) && sd->state.arrow_atk) //Consume arrow if a ground skill was not invoked. [Skotlex] 6543 7161 battle_consume_ammo(sd, skillid, skilllv); 6544 7162 6545 7163 return 0; 6546 7164 } 6547 7165 6548 7166 /*========================================== 6549 * 7167 * 6550 7168 *------------------------------------------*/ 6551 7169 int skill_castend_map (struct map_session_data *sd, short skill_num, const char *map) … … 6555 7173 //Simplify skill_failed code. 6556 7174 #define skill_failed(sd) { sd->menuskill_id = sd->menuskill_val = 0; } 6557 if(skill_num != sd->menuskill_id) 7175 if(skill_num != sd->menuskill_id) 6558 7176 return 0; 6559 7177 … … 6590 7208 return 0; 6591 7209 } 6592 7210 6593 7211 switch(skill_num) 6594 7212 { … … 6631 7249 } 6632 7250 } 6633 7251 6634 7252 //When it's an item-used warp-portal, the skill-lv used is lost.. assume max level. 6635 7253 lv = sd->skillitem==skill_num?skill_get_max(skill_num):pc_checkskill(sd,skill_num); 6636 7254 wx = sd->menuskill_val>>16; 6637 7255 wy = sd->menuskill_val&0xffff; 6638 7256 6639 7257 if( lv <= 0 ) return 0; 6640 7258 if( lv > 4 ) lv = 4; // crash prevention … … 6655 7273 return 0; 6656 7274 } 6657 7275 6658 7276 // This makes Warp Portal fail if the cell is not empty 6659 7277 //if(skill_check_unit_range2(&sd->bl,wx,wy,skill_num,lv) > 0) { … … 6714 7332 return 0; //Nothing to remove, this unit is not overlapped. 6715 7333 6716 if (unit->val1 != unit->group->skill_id) 7334 if (unit->val1 != unit->group->skill_id) 6717 7335 { //Reset state 6718 7336 unit->val1 = unit->group->skill_id; 6719 7337 unit->val2 &= ~UF_ENSEMBLE; 6720 7338 } 6721 7339 6722 7340 return map_foreachincell(skill_dance_overlap_sub, unit->bl.m,unit->bl.x,unit->bl.y,BL_SKILL, unit,flag); 6723 7341 } … … 6803 7421 switch(skillid) 6804 7422 { 7423 <<<<<<< .mine 7424 case WL_HELLFIRE: // Warlock Hellfire [Brain] 7425 if(map_flag_vs(src->m)) target = BCT_ALL; 7426 break; 7427 ======= 6805 7428 //Custom Jobs (blackmagic) 6806 7429 case WL_HELLFIRE: // Warlock Hellfire [Brain] … … 6808 7431 break; 6809 7432 //Custom Job End 7433 >>>>>>> .r18 6810 7434 case MG_SAFETYWALL: 6811 7435 val2=skilllv+1; … … 6883 7507 { //Use the previous limit (minus the elapsed time) [Skotlex] 6884 7508 limit = old_sg->limit - DIFF_TICK(gettick(), old_sg->tick); 6885 if (limit < 0) //This can happen... 7509 if (limit < 0) //This can happen... 6886 7510 limit = skill_get_time(skillid,skilllv); 6887 7511 } … … 7130 7754 return NULL; 7131 7755 } 7132 7756 7133 7757 7134 7758 if (skillid == NJ_TATAMIGAESHI) //Store number of tiles. … … 7139 7763 7140 7764 /*========================================== 7141 * 7765 * 7142 7766 *------------------------------------------*/ 7143 7767 static int skill_unit_onplace (struct skill_unit *src, struct block_list *bl, unsigned int tick) … … 7152 7776 nullpo_retr(0, src); 7153 7777 nullpo_retr(0, bl); 7154 7778 7155 7779 if(bl->prev==NULL || !src->alive || status_isdead(bl)) 7156 7780 return 0; … … 7162 7786 && !skill_get_inf2(sg->skill_id) == INF2_TRAP) //Traps work on top of land protector, magical or not [Brain] 7163 7787 return 0; //AoE skills are ineffective. [Skotlex] 7164 7788 7165 7789 sc = status_get_sc(bl); 7166 7790 7167 7791 if (sc && sc->option&OPTION_HIDE && sg->skill_id != WZ_HEAVENDRIVE) 7168 7792 return 0; //Hidden characters are immune to AoE skills except Heaven's Drive. [Skotlex] 7169 7793 7170 7794 type = status_skill2sc(sg->skill_id); 7171 7795 sce = (sc && type != -1)?sc->data[type]:NULL; … … 7263 7887 } 7264 7888 break; 7265 7889 7266 7890 case UNT_FOGWALL: 7267 7891 if (!sce) … … 7284 7908 // src->limit = DIFF_TICK(tick+700,sg->tick); 7285 7909 // break; 7286 7910 7287 7911 case UNT_MOONLIT: 7288 7912 //Knockback out of area if affected char isn't in Moonlit effect … … 7298 7922 7299 7923 /*========================================== 7300 * 7924 * 7301 7925 *------------------------------------------*/ 7302 7926 int skill_unit_onplace_timer (struct skill_unit *src, struct block_list *bl, unsigned int tick) … … 7325 7949 tsc = status_get_sc(bl); 7326 7950 tstatus = status_get_status_data(bl); 7327 if (sg->state.magic_power) //For magic power. 7951 if (sg->state.magic_power) //For magic power. 7328 7952 { 7329 7953 sc = status_get_sc(ss); … … 7354 7978 return 0; 7355 7979 ts->tick = tick+sg->interval; 7356 7980 7357 7981 if ((skillid==CR_GRANDCROSS || skillid==NPC_GRANDDARKNESS) && !battle_config.gx_allhit) 7358 7982 ts->tick += sg->interval*(map_count_oncell(bl->m,bl->x,bl->y,BL_CHAR)-1); … … 7404 8028 } 7405 8029 if (status_isimmune(bl)) 8030 <<<<<<< .mine 8031 heal = 0; /* é»éè²ã«ãŒãïŒããŒã«éïŒïŒ */ 8032 // Profane Soul reduces the healed recieved by 3% per skilllv [Brain] 8033 if(tsd) { 8034 heal = heal * (100 - pc_checkskill(tsd,AD_PROFANE)*3)/100; 8035 //Wont heal even if he got elemental armors [Brain] 8036 if(pc_checkskill(tsd,NC_PHYLACTERY)) heal = sg->skill_lv; 8037 } 8038 8039 ======= 7406 8040 heal = 0; /* é»Eßè²ã«ãŒãïŒããŒã«éïŒïŒE*/ 7407 8041 //Custom Jobs (blackmagic) … … 7413 8047 } 7414 8048 //Custom Job End 8049 >>>>>>> .r18 7415 8050 clif_skill_nodamage(&src->bl, bl, AL_HEAL, heal, 1); 7416 8051 status_heal(bl, heal, 0, 0); … … 7447 8082 7448 8083 case UNT_ATTACK_SKILLS: 7449 switch (sg->skill_id) 8084 switch (sg->skill_id) 7450 8085 { 7451 8086 case SG_SUN_WARM: //SG skills [Komurka] … … 7485 8120 break; 7486 8121 default: 7487 skill_attack(skill_get_type(sg->skill_id),ss,&src->bl,bl,sg->skill_id,sg->skill_lv,tick,0); 8122 skill_attack(skill_get_type(sg->skill_id),ss,&src->bl,bl,sg->skill_id,sg->skill_lv,tick,0); 7488 8123 } 7489 8124 break; … … 7509 8144 if (status_change_start(bl,type,10000,sg->skill_lv,sg->group_id,0,0,sec, 8)) 7510 8145 { 7511 struct TimerData* td = tsc->data[type]?get_timer(tsc->data[type]->timer):NULL; 8146 struct TimerData* td = tsc->data[type]?get_timer(tsc->data[type]->timer):NULL; 7512 8147 if (td) sec = DIFF_TICK(td->tick, tick); 7513 8148 map_moveblock(bl, src->bl.x, src->bl.y, tick); … … 7580 8215 clif_skill_nodamage(&src->bl, bl, AL_HEAL, heal, 1); 7581 8216 status_heal(bl, heal, 0, 0); 7582 break; 8217 break; 7583 8218 } 7584 8219 … … 7755 8390 status_change_end(bl,type,-1); 7756 8391 break; 7757 8392 7758 8393 case UNT_SPIDERWEB: 7759 8394 { … … 7783 8418 if (sc && !sc->count) 7784 8419 sc = NULL; 7785 8420 7786 8421 type = status_skill2sc(skill_id); 7787 8422 sce = (sc && type != -1)?sc->data[type]:NULL; … … 7800 8435 case BD_ETERNALCHAOS: 7801 8436 case BD_DRUMBATTLEFIELD: 7802 case BD_RINGNIBELUNGEN: 8437 case BD_RINGNIBELUNGEN: 7803 8438 case BD_ROKISWEIL: 7804 8439 case BD_INTOABYSS: … … 7809 8444 //FIXME: This code is not perfect, it doesn't checks for the real ensemble's owner, 7810 8445 //it only checks if you are doing the same ensemble. So if there's two chars doing an ensemble 7811 //which overlaps, by stepping outside of the other parther's ensemble will cause you to cancel 8446 //which overlaps, by stepping outside of the other parther's ensemble will cause you to cancel 7812 8447 //your own. Let's pray that scenario is pretty unlikely and noone will complain too much about it. 7813 8448 skill_stop_dancing(bl); … … 7824 8459 status_change_end(bl, type, -1); 7825 8460 break; 7826 8461 7827 8462 case BA_POEMBRAGI: 7828 8463 case BA_WHISTLE: … … 7831 8466 case DC_HUMMING: 7832 8467 case DC_DONTFORGETME: 7833 case DC_FORTUNEKISS: 8468 case DC_FORTUNEKISS: 7834 8469 case DC_SERVICEFORYOU: 7835 8470 if (sce) … … 7881 8516 7882 8517 nullpo_retr(0, group); 7883 8518 7884 8519 dissonance = skill_dance_switch(unit, 0); 7885 8520 … … 7966 8601 if ((skillid != PR_BENEDICTIO && *c >=1) || *c >=2) 7967 8602 return 0; //Partner found for ensembles, or the two companions for Benedictio. [Skotlex] 7968 8603 7969 8604 if (bl == src) 7970 8605 return 0; … … 7975 8610 if (tsd->sc.data[SC_SILENCE] || tsd->sc.opt1) 7976 8611 return 0; 7977 8612 7978 8613 switch(skillid) 7979 8614 { … … 8060 8695 8061 8696 /*========================================== 8062 * 8697 * 8063 8698 *------------------------------------------*/ 8064 8699 static int skill_check_condition_mob_master_sub (struct block_list *bl, va_list ap) … … 8083 8718 8084 8719 /*========================================== 8085 * Determines if a given skill should be made to consume ammo 8720 * Determines if a given skill should be made to consume ammo 8086 8721 * when used by the player. [Skotlex] 8087 8722 *------------------------------------------*/ … … 8122 8757 sd->skillitem = sd->skillitemlv = 0; 8123 8758 //Need to do arrow state check. 8124 sd->state.arrow_atk = skill_get_ammotype(skill)?1:0; 8759 sd->state.arrow_atk = skill_get_ammotype(skill)?1:0; 8125 8760 //Need to do Spiritball check. 8126 8761 sd->spiritball_old = sd->spiritball; … … 8132 8767 if (!sc->count) 8133 8768 sc = NULL; 8134 8769 8135 8770 if(pc_is90overweight(sd)) { 8136 8771 clif_skill_fail(sd,skill,9,0); … … 8156 8791 if (sd->menuskill_id == AM_PHARMACY && 8157 8792 (skill == AM_PHARMACY || skill == AC_MAKINGARROW || skill == BS_REPAIRWEAPON || 8158 skill == AM_TWILIGHT1 || skill == AM_TWILIGHT2 || skill == AM_TWILIGHT3 8793 skill == AM_TWILIGHT1 || skill == AM_TWILIGHT2 || skill == AM_TWILIGHT3 8159 8794 )) { 8160 8795 sd->skillitem = sd->skillitemlv = 0; … … 8314 8949 } 8315 8950 break; 8316 case MO_FINGEROFFENSIVE: //æ EŒŸ8951 case MO_FINGEROFFENSIVE: //æåŒŸ 8317 8952 case GS_FLING: 8318 8953 if (sd->spiritball > 0 && sd->spiritball < spiritball) { … … 8380 9015 } 8381 9016 break; 8382 9017 8383 9018 case TK_READYCOUNTER: 8384 9019 case TK_READYDOWN: … … 8408 9043 status_change_end(&sd->bl, SC_COMBO, -1); 8409 9044 sd->skillid_old = sd->skilllv_old = 0; 8410 return 0; //Can't repeat previous combo skill. 9045 return 0; //Can't repeat previous combo skill. 8411 9046 } 8412 9047 break; 8413 } else 9048 } else 8414 9049 if(sc->data[SC_COMBO]->val1 == skill) 8415 9050 break; //Combo ready. … … 8470 9105 } 8471 9106 break; 9107 <<<<<<< .mine 9108 case AD_FAMILIAR: //Adept Familiar [Flavio] 9109 { 9110 short familiar[1] ={ pc_readglobalreg(sd, "ADEPT_FAMILIAR") }; 9111 int maxcount = skill_get_maxcount(skill,lv); 9112 int count = 0; 9113 count = mob_countslave_class(&sd->bl, 1, familiar ); 9114 if( count >= maxcount ) 9115 { 9116 clif_skill_fail(sd,skill,0,0); 9117 return 0; 9118 } 9119 } 9120 break; 9121 case NC_SKELETON: // Raise Skeleton [Brain] 9122 case NC_ARCHER: // Raise Archer Skeleton 9123 case NC_ZOMBIE: // Raise Zombie 9124 case NC_MUMMY: // Raise Mummy 9125 case NC_GHOST: // Raise Ghost 9126 case NC_SHADOW: // Raise Shadow 9127 case NC_WRAITH: // Raise Wraith 9128 {// corrigido o limite de spawns [Flavio] 9129 short summon1[5]={ 3201, 3202, 3203, 3204, 3205 }; // Skeleton, Orc Skeleton, Soldier Skeleton, Pirate Skeleton, Skeleton General 9130 short summon2[5]={ 3206, 3207, 3208, 3209, 3210 }; // Archer Skeleton, Firelock Soldier 9131 short summon3[5]={ 3211, 3212, 3213, 3214, 3215 }; // Zombie, Ghoul, Zombie Master 9132 short summon4[5]={ 3216, 3217, 3218, 3219, 3220 }; // Mummy, Ancient Mummy 9133 short summon5[5]={ 3221, 3222, 3223, 3224, 3225 }; // Whisper, Nightmare, Nightmare Terror 9134 short summon6[5]={ 3226, 3227, 3228, 3229, 3230 }; // Injustice, Raydric, Dullahan 9135 short summon7[5]={ 3231, 3232, 3233, 3234, 3235 }; // Wraith, Wraith Dead 9136 int maxcount = skill_get_maxcount(skill,lv); 9137 int count = 0; 9138 switch( skill ) 9139 { 9140 case NC_SKELETON: count = mob_countslave_class(&sd->bl, 5, summon1); break; 9141 case NC_ARCHER: count = mob_countslave_class(&sd->bl, 5, summon2); break; 9142 case NC_ZOMBIE: count = mob_countslave_class(&sd->bl, 5, summon3); break; 9143 case NC_MUMMY: count = mob_countslave_class(&sd->bl, 5, summon4); break; 9144 case NC_GHOST: count = mob_countslave_class(&sd->bl, 5, summon5); break; 9145 case NC_SHADOW: count = mob_countslave_class(&sd->bl, 5, summon6); break; 9146 case NC_WRAITH: count = mob_countslave_class(&sd->bl, 5, summon7); break; 9147 } 9148 if( count >= maxcount ) 9149 { 9150 clif_skill_fail(sd,skill,0,0); 9151 return 0; 9152 } 9153 } 9154 break; 9155 9156 ======= 8472 9157 //Custom Jobs (blackmagic) 8473 9158 case AD_FAMILIAR: //Adept Familiar [Flavio] … … 8519 9204 break; 8520 9205 //Custom Job End 9206 >>>>>>> .r18 8521 9207 case WZ_FIREPILLAR: // celest 8522 9208 if (lv <= 5) // no gems required at level 1-5 … … 8527 9213 if(!(sc && sc->data[SC_SMA])) 8528 9214 return 0; 8529 break; 9215 break; 8530 9216 8531 9217 case HT_POWER: … … 8579 9265 clif_skill_fail(sd,skill,0,0); 8580 9266 return 0; 8581 } 9267 } 8582 9268 } 8583 9269 } … … 8631 9317 //Only invoke on skill begin cast (instant cast skill). [Kevin] 8632 9318 if(sp>0 && !type) 8633 { 9319 { 8634 9320 if (status->sp < (unsigned int)sp) 8635 9321 clif_skill_fail(sd,skill,1,0); … … 8657 9343 } 8658 9344 break; 8659 9345 8660 9346 case NJ_ISSEN: 8661 9347 if (status->hp < 2) { … … 8669 9355 } 8670 9356 break; 8671 9357 8672 9358 case NJ_ZENYNAGE: 8673 9359 if(sd->status.zeny < zeny) { … … 8699 9385 8700 9386 if(!(type&2)){ 8701 if( hp>0 && status->hp <= (unsigned int)hp) { /* HPãã§ã E¯ */8702 clif_skill_fail(sd,skill,2,0); /* HPäžè¶³ E倱æéç¥ */9387 if( hp>0 && status->hp <= (unsigned int)hp) { /* HPãã§ã㯠*/ 9388 clif_skill_fail(sd,skill,2,0); /* HPäžè¶³ïŒå€±æéç¥ */ 8703 9389 return 0; 8704 9390 } 8705 if( sp>0 && status->sp < (unsigned int)sp) { /* SPãã§ã E¯ */8706 clif_skill_fail(sd,skill,1,0); /* SPäžè¶³ E倱æéç¥ */9391 if( sp>0 && status->sp < (unsigned int)sp) { /* SPãã§ã㯠*/ 9392 clif_skill_fail(sd,skill,1,0); /* SPäžè¶³ïŒå€±æéç¥ */ 8707 9393 return 0; 8708 9394 } … … 8711 9397 return 0; 8712 9398 } 8713 9399 8714 9400 if(weapon && !pc_check_weapontype(sd,weapon)) { 8715 9401 clif_skill_fail(sd,skill,6,0); … … 8807 9493 if (sc && sc->data[SC_COMBO] && sc->data[SC_COMBO]->val1 == skill) 8808 9494 sd->ud.canmove_tick = gettick(); //When using a combo, cancel the can't move delay to enable the skill. [Skotlex] 8809 9495 8810 9496 if (!unit_can_move(&sd->bl)) { 8811 9497 clif_skill_fail(sd,skill,0,0); … … 8898 9584 int skill_castfix (struct block_list *bl, int skill_id, int skill_lv) 8899 9585 { 8900 int time = skill_get_cast(skill_id, skill_lv); 9586 int time = skill_get_cast(skill_id, skill_lv); 8901 9587 struct map_session_data *sd; 8902 9588 8903 9589 nullpo_retr(0, bl); 8904 9590 sd = BL_CAST(BL_PC, bl); 8905 9591 8906 9592 // calculate base cast time (reduced by dex) 8907 9593 if (!(skill_get_castnodex(skill_id, skill_lv)&1)) { … … 8951 9637 status_change_end(bl, SC_SUFFRAGIUM, -1); 8952 9638 } 9639 <<<<<<< .mine 9640 if (sc->data[SC_DECREPIFY]) // Necro Decrepify [Brain] 9641 if(sc->data[SC_DECREPIFY]->val2>=3) 9642 time += time * 25/100; //+25% cast time 9643 if (sc->data[SC_CURSETONGUES]) { //Warlock Curse of Tongues [Brain] 9644 time += time * sc->data[SC_CURSETONGUES]->val2 / 100; 9645 status_change_end(bl, SC_CURSETONGUES, -1); 9646 } 9647 9648 ======= 8953 9649 //Custom Jobs (blackmagic) 8954 9650 … … 8962 9658 8963 9659 //Custom Job End 9660 >>>>>>> .r18 8964 9661 if (sc->data[SC_MEMORIZE]) { 8965 9662 time>>=1; … … 8980 9677 int delaynodex = skill_get_delaynodex(skill_id, skill_lv); 8981 9678 int time = skill_get_delay(skill_id, skill_lv); 8982 9679 8983 9680 nullpo_retr(0, bl); 8984 9681 … … 8987 9684 8988 9685 if (bl->type&battle_config.no_skill_delay) 8989 return battle_config.min_skill_delay_limit; 9686 return battle_config.min_skill_delay_limit; 8990 9687 8991 9688 if (time < 0) … … 9004 9701 default: 9005 9702 if (battle_config.delay_dependon_dex && !(delaynodex&1)) 9006 { // if skill delay is allowed to be reduced by dex 9703 { // if skill delay is allowed to be reduced by dex 9007 9704 int scale = battle_config.castrate_dex_scale - status_get_dex(bl); 9008 9705 if (scale > 0) … … 9012 9709 } 9013 9710 if (battle_config.delay_dependon_agi && !(delaynodex&1)) 9014 { // if skill delay is allowed to be reduced by agi 9711 { // if skill delay is allowed to be reduced by agi 9015 9712 int scale = battle_config.castrate_dex_scale - status_get_agi(bl); 9016 9713 if (scale > 0) … … 9056 9753 9057 9754 /*========================================= 9058 * 9755 * 9059 9756 *-----------------------------------------*/ 9060 9757 void skill_brandishspear_first (struct square *tc, int dir, int x, int y) … … 9580 10277 return count; 9581 10278 } 9582 10279 9583 10280 /*========================================== 9584 10281 * Returns the first element field found [Skotlex] … … 9734 10431 9735 10432 /*========================================== 9736 * 10433 * 9737 10434 *------------------------------------------*/ 9738 10435 int skill_chastle_mob_changetarget(struct block_list *bl,va_list ap) … … 9767 10464 unit = (struct skill_unit *)src; 9768 10465 tick = va_arg(ap,int); 9769 10466 9770 10467 nullpo_retr(0, sg = unit->group); 9771 10468 nullpo_retr(0, ss = map_id2bl(sg->src_id)); … … 9777 10474 case UNT_SHOCKWAVE: 9778 10475 case UNT_SANDMAN: 9779 case UNT_FLASHER: 10476 case UNT_FLASHER: 9780 10477 skill_additional_effect(ss,bl,sg->skill_id,sg->skill_lv,BF_MISC,tick); 9781 10478 break; … … 9823 10520 if (type != scs[i] && sc->data[scs[i]]) 9824 10521 status_change_end(bl, scs[i], -1); 9825 10522 9826 10523 return 0; 9827 10524 } … … 9841 10538 wall = false; 9842 10539 } 9843 10540 9844 10541 if( sce ) 9845 10542 { … … 9884 10581 if(!sc->count || !(sce=sc->data[SC_DANCING])) 9885 10582 return; 9886 10583 9887 10584 group = (struct skill_unit_group *)sce->val2; 9888 10585 sce->val2 = 0; 9889 10586 9890 10587 if (sce->val4) 9891 10588 { … … 10021 10718 nullpo_retr(NULL, src); 10022 10719 nullpo_retr(NULL, ud); 10023 10720 10024 10721 // find a free spot to store the new unit group 10025 10722 ARR_FIND( 0, MAX_SKILLUNITGROUP, i, ud->skillunit[i] == NULL ); … … 10081 10778 10082 10779 if (!src) src=map_id2bl(group->src_id); 10083 ud = unit_bl2ud(src); 10780 ud = unit_bl2ud(src); 10084 10781 if(!src || !ud) { 10085 10782 ShowError("skill_delunitgroup: Group's source not found! (src_id: %d skill_id: %d)\n", group->src_id, group->skill_id); 10086 return 0; 10783 return 0; 10087 10784 } 10088 10785 if (skill_get_unit_flag(group->skill_id)&(UF_DANCE|UF_SONG|UF_ENSEMBLE)) … … 10180 10877 if (group->interval==-1) 10181 10878 return NULL; 10182 10879 10183 10880 ud = unit_bl2ud(bl); 10184 10881 if (!ud) return NULL; … … 10422 11119 int skill_id; 10423 11120 int i; 10424 11121 10425 11122 nullpo_retr(0, group); 10426 11123 10427 11124 if( !unit->alive || target->prev == NULL ) 10428 11125 return 0; … … 10503 11200 //cells do not get deleted within them. [Skotlex] 10504 11201 if( dissonance ) skill_dance_switch(unit, 1); 10505 11202 10506 11203 if( flag&4 ) 10507 11204 skill_unit_onleft(skill_id,target,tick); … … 10530 11227 memset(skill_unit_temp, 0, sizeof(skill_unit_temp)); 10531 11228 } 10532 11229 10533 11230 map_foreachincell(skill_unit_move_sub,bl->m,bl->x,bl->y,BL_SKILL,bl,tick,flag); 10534 11231 … … 10708 11405 if (qty < 1) 10709 11406 qty = 1; 10710 11407 10711 11408 if (!skill_id) //A skill can be specified for some override cases. 10712 11409 skill_id = skill_produce_db[idx].req_skill; 10713 11410 10714 11411 slot[0]=slot1; 10715 11412 slot[1]=slot2; … … 10859 11556 if(make_per < 1) make_per = 1; 10860 11557 10861 11558 10862 11559 if(rand()%10000 < make_per || qty > 1){ //Success, or crafting multiple items. 10863 11560 struct item tmp_item; … … 10930 11627 skill_id != AM_TWILIGHT2 && 10931 11628 skill_id != AM_TWILIGHT3) 10932 continue; 11629 continue; 10933 11630 //Add fame as needed. 10934 11631 switch(++sd->potion_success_counter) { … … 10983 11680 } 10984 11681 } 10985 //Failure 11682 //Failure 10986 11683 // if(log_config.produce) 10987 11684 // log_produce(sd,nameid,slot1,slot2,slot3,0); … … 11069 11766 return 0; 11070 11767 if (sd) sd->blockskill[data] = 0; 11071 11768 11072 11769 return 1; 11073 11770 } … … 11096 11793 return 0; 11097 11794 if (hd) hd->blockskill[data] = 0; 11098 11795 11099 11796 return 1; 11100 11797 } … … 11103 11800 { 11104 11801 nullpo_retr (-1, hd); 11105 11802 11106 11803 skillid = skill_get_index(skillid); 11107 11804 if (skillid == 0) … … 11163 11860 if ((val[j]-val[j-step]) != diff) 11164 11861 break; 11165 11862 11166 11863 if (j>=step) //No match, try next step. 11167 11864 continue; 11168 11865 11169 11866 for(; i < MAX_SKILL_LEVEL; i++) 11170 11867 { //Apply linear increase … … 11363 12060 memcpy(skill_unit_layout[pos].dy,dy,sizeof(dy)); 11364 12061 } else { 11365 int dx[] = { 1, 1 ,0, 0,-1}; 11366 int dy[] = { 1, 0, 0,-1,-1}; 12062 int dx[] = { 1, 1 ,0, 0,-1}; 12063 int dy[] = { 1, 0, 0,-1,-1}; 11367 12064 memcpy(skill_unit_layout[pos].dx,dx,sizeof(dx)); 11368 12065 memcpy(skill_unit_layout[pos].dy,dy,sizeof(dy)); … … 11394 12091 memcpy(skill_unit_layout[pos].dy,dy,sizeof(dy)); 11395 12092 } else { 11396 int dx[] = { 2, 1 ,0,-1,-2}; 11397 int dy[] = { 2, 1, 0,-1,-2}; 12093 int dx[] = { 2, 1 ,0,-1,-2}; 12094 int dy[] = { 2, 1, 0,-1,-2}; 11398 12095 memcpy(skill_unit_layout[pos].dx,dx,sizeof(dx)); 11399 12096 memcpy(skill_unit_layout[pos].dy,dy,sizeof(dy)); … … 11424 12121 * skill_nocast_db.txt 11425 12122 * skill_unit_db.txt 11426 * produce_db.txt 12123 * produce_db.txt 11427 12124 * create_arrow_db.txt 11428 12125 * abra_db.txt … … 11493 12190 skill_split_atoi(split[5],skill_db[i].sp_rate); 11494 12191 skill_split_atoi(split[6],skill_db[i].zeny); 11495 12192 11496 12193 //FIXME: document this 11497 12194 p = split[7]; … … 11511 12208 p++; 11512 12209 } 11513 12210 11514 12211 //FIXME: document this 11515 12212 p = split[8]; … … 11545 12242 else if( strcmpi(split[10],"water")==0 ) skill_db[i].state = ST_WATER; 11546 12243 else skill_db[i].state = ST_NONE; 11547 12244 11548 12245 skill_split_atoi(split[11],skill_db[i].spiritball); 11549 12246 for( j = 0; j < 10; j++ ) { … … 11561 12258 if( !i ) // invalid skill id 11562 12259 return false; 11563 12260 11564 12261 skill_split_atoi(split[1],skill_db[i].cast); 11565 12262 skill_split_atoi(split[2],skill_db[i].delay); … … 11577 12274 if( !i ) // invalid skill id 11578 12275 return false; 11579 12276 11580 12277 skill_split_atoi(split[1],skill_db[i].castnodex); 11581 12278 if( split[2] ) // optional column … … 11603 12300 if( !i ) // invalid skill id 11604 12301 return false; 11605 12302 11606 12303 skill_db[i].unit_id[0] = strtol(split[1],NULL,16); 11607 12304 skill_db[i].unit_id[1] = strtol(split[2],NULL,16); … … 11649 12346 skill_produce_db[current].req_skill = atoi(split[2]); 11650 12347 skill_produce_db[current].req_skill_lv = atoi(split[3]); 11651 12348 11652 12349 for( x = 4, y = 0; x+1 < columns && split[x] && split[x+1] && y < MAX_PRODUCE_RESOURCE; x += 2, y++ ) 11653 12350 { … … 11668 12365 11669 12366 skill_arrow_db[current].nameid = i; 11670 12367 11671 12368 for( x = 1, y = 0; x+1 < columns && split[x] && split[x+1] && y < MAX_ARROW_RESOURCE; x += 2, y++ ) 11672 12369 { … … 11707 12404 memset(skill_arrow_db,0,sizeof(skill_arrow_db)); 11708 12405 memset(skill_abra_db,0,sizeof(skill_abra_db)); 11709 12406 11710 12407 // load skill databases 11711 12408 safestrncpy(skill_db[0].name, "UNKNOWN_SKILL", sizeof(skill_db[0].name)); … … 11735 12432 skilldb_name2id = strdb_alloc(DB_OPT_DUP_KEY, 0); 11736 12433 skill_readdb(); 11737 12434 11738 12435 skill_unit_ers = ers_new(sizeof(struct skill_unit_group)); 11739 12436 skill_timer_ers = ers_new(sizeof(struct skill_timerskill)); 11740 12437 11741 12438 add_timer_func_list(skill_unit_timer,"skill_unit_timer"); 11742 12439 add_timer_func_list(skill_castend_id,"skill_castend_id"); … … 11744 12441 add_timer_func_list(skill_timerskill,"skill_timerskill"); 11745 12442 add_timer_func_list(skill_blockpc_end, "skill_blockpc_end"); 11746 12443 11747 12444 add_timer_interval(gettick()+SKILLUNITTIMER_INTERVAL,skill_unit_timer,0,0,SKILLUNITTIMER_INTERVAL); 11748 12445 … … 11757 12454 return 0; 11758 12455 } 12456 <<<<<<< .mine 12457 12458 int skill_additem(struct block_list* src, struct block_list *bl, int itemid, int amount)// ITEM GIVER [Brain] 12459 { 12460 struct map_session_data *sd = NULL, *tsd = NULL; 12461 12462 nullpo_retr(1, src); 12463 nullpo_retr(1, bl); 12464 12465 if (src->m != bl->m) 12466 return 1; 12467 if (bl->prev == NULL) 12468 return 1; 12469 if (src->type == BL_PC) 12470 sd = (struct map_session_data *)src; 12471 if (bl->type == BL_PC) 12472 tsd = (struct map_session_data *)bl; 12473 if (status_isdead(bl)) 12474 return 1; 12475 12476 int eflag; 12477 struct item item_tmp; 12478 struct block_list tbl; 12479 12480 memset(&item_tmp,0,sizeof(item_tmp)); 12481 memset(&tbl,0,sizeof(tbl)); 12482 12483 item_tmp.nameid = itemid; 12484 item_tmp.identify = 1; 12485 tbl.id = 0; 12486 12487 clif_takeitem(&sd->bl,&tbl); 12488 eflag = pc_additem(sd,&item_tmp,amount); 12489 if(eflag) { 12490 clif_additem(sd,0,0,eflag); 12491 map_addflooritem(&item_tmp,amount,sd->bl.m,sd->bl.x,sd->bl.y,0,0,0,0); 12492 } 12493 return 0; 12494 } 12495 ======= 11759 12496 //Custom Jobs (blackmagic) 11760 12497 int skill_additem(struct block_list* src, struct block_list *bl, int itemid, int amount)// ITEM GIVER [Brain] … … 11795 12532 return 0; 11796 12533 } 11797 //Custom Job End 12534 //Custom Job End>>>>>>> .r18