Changeset 24 for src/map/skill.c
- Timestamp:
- 07/07/08 22:48:26 (17 years ago)
- Files:
-
- 1 modified
Legend:
- Unmodified
- Added
- Removed
-
src/map/skill.c
r23 r24 42 42 #define GD_SKILLRANGEMIN 900 43 43 #define GD_SKILLRANGEMAX GD_SKILLRANGEMIN+MAX_GUILDSKILL 44 #define HM_SKILLRANGEMIN 1 00044 #define HM_SKILLRANGEMIN 1100 //I know for a fact this will cause authok problems where it is, but perhaps it's changed now. 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)); … … 610 610 case CR_GRANDCROSS: 611 611 case NPC_GRANDDARKNESS: 612 if(tstatus->race == RC_UNDEAD || tstatus->race == RC_DEMON) 612 //Chance to cause blind status vs demon and undead element, but not against players 613 if(!dstsd && (battle_check_undead(tstatus->race,tstatus->def_ele) || tstatus->race == RC_DEMON)) 613 614 sc_start(bl,SC_BLIND,100,skilllv,skill_get_time2(skillid,skilllv)); 614 615 break; … … 662 663 case NPC_PETRIFYATTACK: 663 664 sc_start4(bl,status_skill2sc(skillid),50+10*skilllv, 664 skilllv,0,0,skill_get_time(skillid,skilllv), 665 skilllv,0,0,skill_get_time(skillid,skilllv), 665 666 skill_get_time2(skillid,skilllv)); 666 667 break; … … 680 681 sc_start(bl,SC_BLEEDING,(20*skilllv),skilllv,skill_get_time2(skillid,skilllv)); 681 682 break; 682 case NPC_MENTALBREAKER: 683 case NPC_MENTALBREAKER: 683 684 { //Based on observations by Tharis, Mental Breaker should do SP damage 684 685 //equal to Matk*skLevel. … … 785 786 if (tsc->data[SC_ADRENALINE2]) 786 787 status_change_end(bl, SC_ADRENALINE2, -1); 787 } 788 } 788 789 break; 789 790 case TK_TURNKICK: … … 821 822 sc_start(bl,SC_CRITICALWOUND,100,skilllv,skill_get_time2(skillid,skilllv)); 822 823 break; 824 //This has weird Structure compared to the other stuff here. 823 825 case NC_GHOULTOUCH: //Necro Ghoul Touch [Brain] 824 if (battle_check_living(tstatus->race, tstatus->def_ele)) //Check if target is a living creature before proceed825 sc_start(bl,SC_POISON,10000,skilllv,skill_get_time2(skillid,skilllv));826 break;826 if (battle_check_living(tstatus->race, tstatus->def_ele)) //Check if target is a living creature before proceed 827 sc_start(bl,SC_POISON,10000,skilllv,skill_get_time2(skillid,skilllv)); 828 break; 827 829 case NC_PWSUFFER: //Necro Power Word: Suffer [Brain] 828 830 case WL_PWAGONY: //Warlock Power Word: Agony [Brain] 829 if (battle_check_living(tstatus->race, tstatus->def_ele)) //Check if target is a living creature before proceed830 sc_start(bl,skillid==NC_PWSUFFER?SC_SUFFER:SC_AGONY,1000,skilllv,skill_get_time2(skillid,skilllv));831 break;831 if (battle_check_living(tstatus->race, tstatus->def_ele)) //Check if target is a living creature before proceed 832 sc_start(bl,skillid==NC_PWSUFFER?SC_SUFFER:SC_AGONY,1000,skilllv,skill_get_time2(skillid,skilllv)); 833 break; 832 834 case WL_SEARING: //Warlock Searing Pain [Brain] 833 //The DoT is only initiated if target isnt burning already.834 if(!tsc->data[SC_SEARING] && !tsc->data[SC_IMMOLATE])835 sc_start(bl,SC_SEARING,10000,skilllv,skill_get_time2(skillid,skilllv));836 break;835 //The DoT is only initiated if target isnt burning already. 836 if(!tsc->data[SC_SEARING] && !tsc->data[SC_IMMOLATE]) 837 sc_start(bl,SC_SEARING,10000,skilllv,skill_get_time2(skillid,skilllv)); 838 break; 837 839 case WL_IMMOLATE: //Warlock Immolate [Brain] 838 //The DoT is only initiated if target isnt in immolate, but must be in searing pain status839 if(tsc->data[SC_SEARING] && !tsc->data[SC_IMMOLATE])840 sc_start(bl,SC_IMMOLATE,10000,skilllv,skill_get_time2(skillid,skilllv));841 break;840 //The DoT is only initiated if target isnt in immolate, but must be in searing pain status 841 if(tsc->data[SC_SEARING] && !tsc->data[SC_IMMOLATE]) 842 sc_start(bl,SC_IMMOLATE,10000,skilllv,skill_get_time2(skillid,skilllv)); 843 break; 842 844 case WL_SHADOWBURN: //Warlock Shadow Burn [Brain] 843 sc_start(bl,SC_STUN,10000,skilllv,skill_get_time(skillid,skilllv)); 844 break; 845 //Mercenary Skills [Brainstorm] 846 /* case MS_BASH: 847 sc_start(bl,SC_STUN,5*(skilllv-5),skilllv,skill_get_time(skillid,skilllv)); 848 break; 849 case MER_CRASH: 850 sc_start(bl,SC_STUN,6*skilllv,skilllv,skill_get_time(skillid,skilllv)); 851 break;*/ 845 sc_start(bl,SC_STUN,10000,skilllv,skill_get_time(skillid,skilllv)); 846 break; 847 852 848 } 853 849 … … 961 957 if(sd && sd->classchange && attack_type&BF_WEAPON && 962 958 dstmd && !(tstatus->mode&MD_BOSS) && 963 (rand()%10000 < sd->classchange)) 959 (rand()%10000 < sd->classchange)) 964 960 { 965 961 struct mob_db *mob; … … 970 966 class_ = rand() % MAX_MOB_DB; 971 967 } while (!mobdb_checkid(class_)); 972 968 973 969 rate = rand() % 1000000; 974 970 mob = mob_db(class_); … … 984 980 985 981 /* Splitted off from skill_additional_effect, which is never called when the 986 * attack skill kills the enemy. Place in this function counter status effects 987 * when using skills (eg: Asura's sp regen penalty, or counter-status effects 982 * attack skill kills the enemy. Place in this function counter status effects 983 * when using skills (eg: Asura's sp regen penalty, or counter-status effects 988 984 * from cards) that will take effect on the source, not the target. [Skotlex] 989 * Note: Currently this function only applies to Extremity Fist and BF_WEAPON 985 * Note: Currently this function only applies to Extremity Fist and BF_WEAPON 990 986 * type of skills, so not every instance of skill_additional_effect needs a call 991 987 * to this one. … … 997 993 struct map_session_data *dstsd=NULL; 998 994 struct status_change *tsc; 999 995 1000 996 nullpo_retr(0, src); 1001 997 nullpo_retr(0, bl); … … 1015 1011 if(tsc && tsc->data[SC_KAAHI] && tsc->data[SC_KAAHI]->val4 == -1) 1016 1012 tsc->data[SC_KAAHI]->val4 = add_timer( 1017 tick+skill_get_time2(SL_KAAHI,tsc->data[SC_KAAHI]->val1), 1013 tick+skill_get_time2(SL_KAAHI,tsc->data[SC_KAAHI]->val1), 1018 1014 kaahi_heal_timer, bl->id, SC_KAAHI); //Activate heal. 1019 1015 break; … … 1047 1043 status_heal(src, 0, status_get_lv(bl)*(95+15*rate)/100, 2); 1048 1044 } 1049 1045 //was hard to pinpoint this place. 1050 1046 // Warlock Soul Steal [Brain] 1051 if(sd && skillid && attack_type&BF_MAGIC && status_isdead(bl) 1052 && !(skill_get_inf(skillid)&(INF_GROUND_SKILL|INF_SELF_SKILL))1053 && (rate=pc_checkskill(sd,WL_SOULSTEAL))>0){// Wont work with area/ground spells (hellfire)1054 if (pc_issit(sd)) pc_setstand(sd);1055 clif_skill_nodamage(src,bl,WL_SOULSTEAL,rate,1);1056 clif_specialeffect(src, 253, AREA); // Absorb Mana effect on caster1057 status_heal(src, 0, status_get_lv(bl)*(90+10*rate)/100, 2);1058 if(rand()%100 < rate) skill_additem(src,src,15020,1); //Chance to "steal" the target soul1047 if(sd && skillid && attack_type&BF_MAGIC && status_isdead(bl) 1048 && !(skill_get_inf(skillid)&(INF_GROUND_SKILL|INF_SELF_SKILL)) 1049 && (rate=pc_checkskill(sd,WL_SOULSTEAL))>0){// Wont work with area/ground spells (hellfire) 1050 if (pc_issit(sd)) pc_setstand(sd); 1051 clif_skill_nodamage(src,bl,WL_SOULSTEAL,rate,1); 1052 clif_specialeffect(src, 253, AREA); // Absorb Mana effect on caster 1053 status_heal(src, 0, status_get_lv(bl)*(90+10*rate)/100, 2); 1054 if(rand()%100 < rate) skill_additem(src,src,15020,1); //Chance to "steal" the target soul 1059 1055 } 1060 1056 … … 1069 1065 rate+=dstsd->addeff2[i].arrow_rate; 1070 1066 if (!rate) continue; 1071 1067 1072 1068 if ((dstsd->addeff2[i].flag&(ATF_LONG|ATF_SHORT)) != (ATF_LONG|ATF_SHORT)) 1073 1069 { //Trigger has range consideration. … … 1078 1074 type = dstsd->addeff2[i].id; 1079 1075 time = skill_get_time2(status_sc2skill(type),7); 1080 1076 1081 1077 if (dstsd->addeff2[i].flag&ATF_TARGET) 1082 1078 status_change_start(src,type,rate,7,0,0,0,time,0); 1083 1079 1084 1080 if (dstsd->addeff2[i].flag&ATF_SELF && !status_isdead(bl)) 1085 1081 status_change_start(bl,type,rate,7,0,0,0,time,0); … … 1089 1085 // Trigger counter-spells to retaliate against damage causing skills. 1090 1086 if(dstsd && !status_isdead(bl) && src != bl && dstsd->autospell2[0].id && 1091 !(skillid && skill_get_nk(skillid)&NK_NO_DAMAGE)) 1087 !(skillid && skill_get_nk(skillid)&NK_NO_DAMAGE)) 1092 1088 { 1093 1089 struct block_list *tbl; … … 1109 1105 if (attack_type&BF_LONG) 1110 1106 rate>>=1; 1111 1107 1112 1108 if (skillnotok(skillid, dstsd)) 1113 1109 continue; … … 1118 1114 else 1119 1115 tbl = src; 1120 1116 1121 1117 switch (skill_get_casttype(skillid)) { 1122 1118 case CAST_GROUND: … … 1142 1138 //Auto-script when attacked 1143 1139 if(dstsd && !status_isdead(bl) && src != bl && dstsd->autoscript2[0].script && 1144 !(skillid && skill_get_nk(skillid)&NK_NO_DAMAGE)) 1140 !(skillid && skill_get_nk(skillid)&NK_NO_DAMAGE)) 1145 1141 { 1146 1142 int i; … … 1166 1162 (BCT_ENEMY/BCT_PARTY/BCT_SELF) are the valid values. 1167 1163 --------------------------------------------------------------------------*/ 1168 int skill_break_equip (struct block_list *bl, unsigned short where, int rate, int flag) 1164 int skill_break_equip (struct block_list *bl, unsigned short where, int rate, int flag) 1169 1165 { 1170 1166 const int where_list[4] = {EQP_WEAPON, EQP_ARMOR, EQP_SHIELD, EQP_HELM}; … … 1268 1264 for (i = 0; i < ARRAYLENGTH(pos); i++) { 1269 1265 if (where&pos[i] && sc->data[sc_def[i]]) 1270 where&=~pos[i]; 1266 where&=~pos[i]; 1271 1267 } 1272 1268 if (!where) return 0; … … 1298 1294 if (count == 0) 1299 1295 return 0; //Actual knockback distance is 0. 1300 1296 1301 1297 switch (target->type) 1302 1298 { … … 1333 1329 1334 1330 if (!su) 1335 unit_stop_walking(target,0); 1331 unit_stop_walking(target,0); 1336 1332 1337 1333 dx = nx - target->x; … … 1350 1346 map_foreachinmovearea(clif_insight, target, AREA_SIZE, -dx, -dy, target->type == BL_PC ? BL_ALL : BL_PC, target); 1351 1347 1352 if(!(flag&0x1)) 1348 if(!(flag&0x1)) 1353 1349 clif_blown(target); 1354 1350 … … 1398 1394 * flag&0xFFF is passed to the underlying battle_calc_attack for processing 1399 1395 * (usually holds number of targets, or just 1 for simple splash attacks) 1400 * flag&0x1000 is used to tag that this is a splash-attack (so the damage 1396 * flag&0x1000 is used to tag that this is a splash-attack (so the damage 1401 1397 * packet shouldn't display a skill animation) 1402 1398 * flag&0x2000 is used to signal that the skilllv should be passed as -1 to the … … 1499 1495 } 1500 1496 } 1501 1497 1502 1498 if(sc && sc->data[SC_MAGICROD] && src == dsrc) { 1503 1499 int sp = skill_get_sp(skillid,skilllv); … … 1513 1509 1514 1510 damage = dmg.damage + dmg.damage2; 1515 1511 1516 1512 if( (skillid == AL_INCAGI || skillid == AL_BLESSING) && tsd->sc.data[SC_CHANGEUNDEAD] ) 1517 1513 damage = 1; … … 1524 1520 type=(skillid==0)?5:skill_get_hit(skillid); 1525 1521 1526 if(damage < dmg.div_ 1522 if(damage < dmg.div_ 1527 1523 //Only skills that knockback even when they miss. [Skotlex] 1528 1524 && skillid != CH_PALMSTRIKE) … … 1653 1649 break; 1654 1650 } 1655 1651 1656 1652 map_freeblock_lock(); 1657 1653 … … 1686 1682 } 1687 1683 } 1688 if (skillid != WZ_SIGHTRASHER && 1689 skillid != WZ_SIGHTBLASTER && 1684 if (skillid != WZ_SIGHTRASHER && 1685 skillid != WZ_SIGHTBLASTER && 1690 1686 skillid != AC_SHOWER && 1691 1687 skillid != SM_MAGNUM && … … 1709 1705 if (!status_isdead(bl)) 1710 1706 skill_additional_effect(src,bl,skillid,skilllv,attack_type,tick); 1711 //Counter status effects [Skotlex] 1707 //Counter status effects [Skotlex] 1712 1708 skill_counter_additional_effect(dsrc,bl,skillid,skilllv,attack_type,tick); 1713 1709 } … … 1727 1723 skill_blown(dsrc,bl,dmg.blewcount,direction,0); 1728 1724 } 1729 1725 1730 1726 //Delayed damage must be dealt after the knockback (it needs to know actual position of target) 1731 1727 if (dmg.amotion) … … 1759 1755 1760 1756 if (!(flag&2) && 1761 ( 1757 ( 1762 1758 skillid == MG_COLDBOLT || skillid == MG_FIREBOLT || skillid == MG_LIGHTNINGBOLT 1763 1759 ) && … … 1933 1929 struct map_session_data *sd; 1934 1930 int gid, id, strvit, agidex; 1935 1931 1936 1932 sd = (struct map_session_data *)bl; 1937 1933 … … 1973 1969 int i,j,hp,sp,hp_rate,sp_rate,state,mhp ; 1974 1970 int itemid[10],amount[ARRAYLENGTH(itemid)],index[ARRAYLENGTH(itemid)]; 1975 1971 1976 1972 nullpo_retr(0, hd); 1977 1973 sd = hd->master; … … 2108 2104 target = src; //Required since it has to warp. 2109 2105 if(target == NULL) 2110 break; 2106 break; 2111 2107 if(target->prev == NULL) 2112 2108 break; … … 2151 2147 } 2152 2148 break; 2153 2154 case NC_PWSUFFER: //Necro Power Word: Suffer [Brain] 2155 if (!status_isdead(target) && status_get_sc(target)->data[SC_SUFFER]){ 2156 skill_attack(BF_MAGIC,src,src,target,skl->skill_id,skl->skill_lv,tick,skl->flag|SD_ANIMATION|SD_LEVEL); 2157 clif_specialeffect(target, 180, AREA); //Shadow Hit Effect on target 2158 if (skl->type>1 && !status_isdead(target)) 2159 skill_addtimerskill(src,tick+3000,target->id,0,0,skl->skill_id,skl->skill_lv,skl->type-1,skl->flag|SD_ANIMATION); 2160 } 2161 break; 2162 case WL_SEARING: //Warlock Searing Pain [Brain] 2163 if (!status_isdead(target) && status_get_sc(target)->data[SC_SEARING]){ 2164 skill_attack(BF_MAGIC,src,target,target,skl->skill_id,skl->skill_lv,tick,skl->flag|SD_ANIMATION|SD_LEVEL); 2165 clif_specialeffect(target, 49, AREA); //Fire Hit Effect on target 2166 if (skl->type>1 && !status_isdead(target)) 2167 skill_addtimerskill(src,tick+3000,target->id,0,0,skl->skill_id,skl->skill_lv,skl->type-1,skl->flag|SD_ANIMATION); 2168 } 2169 break; 2170 case WL_IMMOLATE: //Warlock Immolate [Brain] 2171 if (!status_isdead(target) && status_get_sc(target)->data[SC_IMMOLATE]){ 2172 skill_attack(BF_MAGIC,src,target,target,skl->skill_id,skl->skill_lv,tick,skl->flag|SD_ANIMATION|SD_LEVEL); 2173 clif_specialeffect(target, 97, AREA); //Firepillar Hit Effect on target 2174 if (skl->type>1 && !status_isdead(target)) 2175 skill_addtimerskill(src,tick+3000,target->id,0,0,skl->skill_id,skl->skill_lv,skl->type-1,skl->flag|SD_ANIMATION); 2176 } 2177 break; 2178 case WL_PWAGONY: //Warlock Power Word: Agony [Brain] 2179 if (!status_isdead(target) && status_get_sc(target)->data[SC_AGONY]){ 2180 skill_attack(BF_MAGIC,src,target,target,skl->skill_id,skl->skill_lv,tick,skl->flag|SD_ANIMATION|SD_LEVEL); 2181 clif_specialeffect(target, 587, AREA); //Big Purple Flame Effect on target 2182 if (skl->type>1 && !status_isdead(target)) 2183 skill_addtimerskill(src,tick+3000,target->id,0,0,skl->skill_id,skl->skill_lv,skl->type-1,skl->flag|SD_ANIMATION); 2184 } 2185 break; 2186 2149 //Could be confusing to find the right place. 2150 case NC_PWSUFFER: //Necro Power Word: Suffer [Brain] 2151 if (!status_isdead(target) && status_get_sc(target)->data[SC_SUFFER]){ 2152 skill_attack(BF_MAGIC,src,src,target,skl->skill_id,skl->skill_lv,tick,skl->flag|SD_ANIMATION|SD_LEVEL); 2153 clif_specialeffect(target, 180, AREA); //Shadow Hit Effect on target 2154 if (skl->type>1 && !status_isdead(target)) 2155 skill_addtimerskill(src,tick+3000,target->id,0,0,skl->skill_id,skl->skill_lv,skl->type-1,skl->flag|SD_ANIMATION); 2156 } 2157 break; 2158 case WL_SEARING: //Warlock Searing Pain [Brain] 2159 if (!status_isdead(target) && status_get_sc(target)->data[SC_SEARING]){ 2160 skill_attack(BF_MAGIC,src,target,target,skl->skill_id,skl->skill_lv,tick,skl->flag|SD_ANIMATION|SD_LEVEL); 2161 clif_specialeffect(target, 49, AREA); //Fire Hit Effect on target 2162 if (skl->type>1 && !status_isdead(target)) 2163 skill_addtimerskill(src,tick+3000,target->id,0,0,skl->skill_id,skl->skill_lv,skl->type-1,skl->flag|SD_ANIMATION); 2164 } 2165 break; 2166 case WL_IMMOLATE: //Warlock Immolate [Brain] 2167 if (!status_isdead(target) && status_get_sc(target)->data[SC_IMMOLATE]){ 2168 skill_attack(BF_MAGIC,src,target,target,skl->skill_id,skl->skill_lv,tick,skl->flag|SD_ANIMATION|SD_LEVEL); 2169 clif_specialeffect(target, 97, AREA); //Firepillar Hit Effect on target 2170 if (skl->type>1 && !status_isdead(target)) 2171 skill_addtimerskill(src,tick+3000,target->id,0,0,skl->skill_id,skl->skill_lv,skl->type-1,skl->flag|SD_ANIMATION); 2172 } 2173 break; 2174 case WL_PWAGONY: //Warlock Power Word: Agony [Brain] 2175 if (!status_isdead(target) && status_get_sc(target)->data[SC_AGONY]){ 2176 skill_attack(BF_MAGIC,src,target,target,skl->skill_id,skl->skill_lv,tick,skl->flag|SD_ANIMATION|SD_LEVEL); 2177 clif_specialeffect(target, 587, AREA); //Big Purple Flame Effect on target 2178 if (skl->type>1 && !status_isdead(target)) 2179 skill_addtimerskill(src,tick+3000,target->id,0,0,skl->skill_id,skl->skill_lv,skl->type-1,skl->flag|SD_ANIMATION); 2180 } 2181 break; 2187 2182 default: 2188 2183 skill_attack(skl->type,src,src,target,skl->skill_id,skl->skill_lv,tick,skl->flag); … … 2220 2215 ud = unit_bl2ud(src); 2221 2216 nullpo_retr(1, ud); 2222 2217 2223 2218 ARR_FIND( 0, MAX_SKILLTIMERSKILL, i, ud->skilltimerskill[i] == 0 ); 2224 2219 if( i == MAX_SKILLTIMERSKILL ) return 1; 2225 2220 2226 2221 ud->skilltimerskill[i] = ers_alloc(skill_timer_ers, struct skill_timerskill); 2227 2222 ud->skilltimerskill[i]->timer = add_timer(tick, skill_timerskill, src->id, i); … … 2248 2243 ud = unit_bl2ud(src); 2249 2244 nullpo_retr(0, ud); 2250 2245 2251 2246 for(i=0;i<MAX_SKILLTIMERSKILL;i++) { 2252 2247 if(ud->skilltimerskill[i]) { … … 2285 2280 2286 2281 nullpo_retr(1, src); 2287 nullpo_retr(1, bl); 2282 nullpo_retr(1, bl); 2288 2283 2289 2284 if (src->m != bl->m) … … 2292 2287 if (bl->prev == NULL) 2293 2288 return 1; 2294 2289 2295 2290 sd = BL_CAST(BL_PC, src); 2296 2291 tsd = BL_CAST(BL_PC, bl); … … 2308 2303 } 2309 2304 2310 sc = status_get_sc(src); 2305 sc = status_get_sc(src); 2311 2306 if (sc && !sc->count) 2312 2307 sc = NULL; //Unneeded … … 2397 2392 case NPC_BLEEDING: 2398 2393 case NPC_CRITICALWOUND: 2399 /*Mercenary Skills [Brainstorm]2400 case MS_BASH:2401 case MA_DOUBLE:2402 case MA_CHARGEARROW:2403 case ML_PIERCE:2404 case ML_SPIRALPIERCE:2405 case MER_CRASH:2406 2394 skill_attack(BF_WEAPON,src,src,bl,skillid,skilllv,tick,flag); 2407 break;*/ 2395 break; 2396 2397 //... something doesn't fit about this. Seriously. 2408 2398 case NC_GHOULTOUCH: //Necro Ghoul Touch [Brain] 2409 skill_attack(BF_WEAPON,src,src,bl,skillid,skilllv,tick,flag);2410 clif_specialeffect(bl, 124, AREA); //Venom Dust Effect on target2411 break;2412 case NC_DEATHHAND: 2413 skill_attack(BF_WEAPON,src,src,bl,skillid,skilllv,tick,flag|SD_LEVEL);//Hide skill yell2414 clif_specialeffect(bl, 65, AREA); //Power absorb Effect on target2415 if (battle_check_living(tstatus->race, tstatus->def_ele)){ //Check if target is a living creature before proceed2416 int chance = (10+(skilllv*2)+(status_get_luk(src)-status_get_luk(bl))/5);2417 //10% chance + 2% per skilllv + (caster luk - target luk)/5 %2418 if (rand()%100 < chance) {2419 clif_skill_nodamage(src,bl,skillid,-1,flag|SD_LEVEL);//Hide skill yell2420 status_percent_damage(src, bl, 100, 0, true); //Instant kill our target2421 } else clif_skill_fail(sd,skillid,0,0);2422 }2423 break;2399 skill_attack(BF_WEAPON,src,src,bl,skillid,skilllv,tick,flag); 2400 clif_specialeffect(bl, 124, AREA); //Venom Dust Effect on target 2401 break; 2402 case NC_DEATHHAND: //Necro Death Hand [Brain] 2403 skill_attack(BF_WEAPON,src,src,bl,skillid,skilllv,tick,flag|SD_LEVEL);//Hide skill yell 2404 clif_specialeffect(bl, 65, AREA); //Power absorb Effect on target 2405 if (battle_check_living(tstatus->race, tstatus->def_ele)){ //Check if target is a living creature before proceed 2406 int chance = (10+(skilllv*2)+(status_get_luk(src)-status_get_luk(bl))/5); 2407 //10% chance + 2% per skilllv + (caster luk - target luk)/5 % 2408 if (rand()%100 < chance) { 2409 clif_skill_nodamage(src,bl,skillid,-1,flag|SD_LEVEL);//Hide skill yell 2410 status_percent_damage(src, bl, 100, 0, true); //Instant kill our target 2411 } else clif_skill_fail(sd,skillid,0,0); 2412 } 2413 break; 2424 2414 2425 2415 … … 2455 2445 map_foreachinrange(skill_attack_area, src, 2456 2446 skill_get_splash(skillid, skilllv), splash_target(src), 2457 BF_WEAPON, src, src, skillid, skilllv, tick, flag, BCT_ENEMY); 2447 BF_WEAPON, src, src, skillid, skilllv, tick, flag, BCT_ENEMY); 2458 2448 break; 2459 2449 … … 2597 2587 //Splash attack skills. 2598 2588 case AS_GRIMTOOTH: 2599 case MC_CARTREVOLUTION: 2589 case MC_CARTREVOLUTION: 2600 2590 case NPC_SPLASHATTACK: 2601 2591 flag |= SD_PREAMBLE; // a fake packet will be sent for the first target to be hit … … 2603 2593 case SM_MAGNUM: 2604 2594 case HT_BLITZBEAT: 2605 case AC_SHOWER: 2595 case AC_SHOWER: 2606 2596 case MG_NAPALMBEAT: 2607 2597 case MG_FIREBALL: … … 2660 2650 if (skill_area_temp[1] != bl->id) 2661 2651 skill_attack(skill_get_type(skillid), src, src, bl, skillid, skilllv, tick, flag|SD_ANIMATION); 2662 else 2652 else 2663 2653 skill_attack(skill_get_type(skillid), src, src, bl, skillid, skilllv, tick, flag); 2664 2654 break; … … 2725 2715 skill_castend_nodamage_id); 2726 2716 } 2727 break; 2717 break; 2728 2718 case CH_PALMSTRIKE: // Palm Strike takes effect 1sec after casting. [Skotlex] 2729 2719 // clif_skill_nodamage(src,bl,skillid,skilllv,0); //Can't make this one display the correct attack animation delay :/ 2730 2720 clif_damage(src,bl,tick,status_get_amotion(src),0,-1,1,4,0); //Display an absorbed damage attack. 2731 2721 skill_addtimerskill(src, tick + 1000, bl->id, 0, 0, skillid, skilllv, BF_WEAPON, flag); 2732 break; 2722 break; 2733 2723 2734 2724 case PR_TURNUNDEAD: … … 2758 2748 skill_attack(BF_MAGIC,src,src,bl,skillid,skilllv,tick,flag); 2759 2749 break; 2750 //another thing in a weird place. 2760 2751 case AD_DARKHEAL: // Adept Dark Heal [Brain] 2761 clif_specialeffect(bl, 656, AREA); //Blinking Green Sprite Effect on target2762 skill_attack(BF_MAGIC,src,src,bl,skillid,skilllv,tick,flag); //Exception because we must add the effect manually =/2763 break;2752 clif_specialeffect(bl, 656, AREA); //Blinking Green Sprite Effect on target 2753 skill_attack(BF_MAGIC,src,src,bl,skillid,skilllv,tick,flag); //Exception because we must add the effect manually =/ 2754 break; 2764 2755 case NC_PWSUFFER: //Necro Power Word: Suffer [Brain] 2765 if(battle_check_living(tstatus->race,tstatus->def_ele)){ 2766 skill_attack(BF_MAGIC,src,src,bl,skillid,skilllv,tick,flag); 2756 if(battle_check_living(tstatus->race,tstatus->def_ele)){ 2757 skill_attack(BF_MAGIC,src,src,bl,skillid,skilllv,tick,flag); 2758 clif_specialeffect(bl, 180, AREA); //Shadow hit Effect on target 2759 clif_specialeffect(src, 454, AREA); //Black Cast Effect on caster 2760 //If target is on suffering status already, just cause damage, no extra DoT 2761 if(!status_get_sc(bl)->data[SC_SUFFER]) 2762 skill_addtimerskill(src,tick+3000,bl->id,0,0,skillid,skilllv,skilllv,flag); 2763 } 2764 else clif_skill_fail(sd,skillid,0,0); 2765 break; 2766 case NC_DRAINLIFE: // Necromancer Drain Life [Brain] 2767 { 2768 int heal = skill_attack(BF_MAGIC, src, src, bl, skillid, skilllv, tick, flag)/2; 2769 if (heal > 0 && (battle_check_living(tstatus->race,tstatus->def_ele))){ 2770 clif_skill_nodamage(NULL, src, AL_HEAL, heal, 1); 2771 status_heal(src, heal, 0, 0); 2772 } 2773 } 2767 2774 clif_specialeffect(bl, 180, AREA); //Shadow hit Effect on target 2768 2775 clif_specialeffect(src, 454, AREA); //Black Cast Effect on caster 2769 //If target is on suffering status already, just cause damage, no extra DoT 2770 if(!status_get_sc(bl)->data[SC_SUFFER]) 2771 skill_addtimerskill(src,tick+3000,bl->id,0,0,skillid,skilllv,skilllv,flag); 2772 } 2773 else clif_skill_fail(sd,skillid,0,0); 2774 break; 2775 case NC_DRAINLIFE: // Necromancer Drain Life [Brain] 2776 { 2777 int heal = skill_attack(BF_MAGIC, src, src, bl, skillid, skilllv, tick, flag)/2; 2778 if (heal > 0 && (battle_check_living(tstatus->race,tstatus->def_ele))){ 2779 clif_skill_nodamage(NULL, src, AL_HEAL, heal, 1); 2780 status_heal(src, heal, 0, 0); 2781 } 2782 } 2783 clif_specialeffect(bl, 180, AREA); //Shadow hit Effect on target 2784 clif_specialeffect(src, 454, AREA); //Black Cast Effect on caster 2785 break; 2776 break; 2786 2777 case WL_SHADOWBOLT: // Warlock Shadowbolt [Brain] 2787 clif_specialeffect(bl, 180, AREA); //Shadow hit Effect on target2788 clif_specialeffect(src, 454, AREA); //Black Cast Effect on caster2789 skill_attack(BF_MAGIC,src,src,bl,skillid,skilllv,tick,flag); //Again, the effect...cursed effects...2790 break;2778 clif_specialeffect(bl, 180, AREA); //Shadow hit Effect on target 2779 clif_specialeffect(src, 454, AREA); //Black Cast Effect on caster 2780 skill_attack(BF_MAGIC,src,src,bl,skillid,skilllv,tick,flag); //Again, the effect...cursed effects... 2781 break; 2791 2782 case WL_SHADOWBURN: // Warlock Shadow Burn [Brain] 2792 clif_specialeffect(bl, 180, AREA); //Shadow hit Effect on target2793 clif_specialeffect(bl, 32, AREA); //Flame Engulf Effect on target2794 clif_specialeffect(src, 454, AREA); //Black Cast Effect on caster2795 skill_attack(BF_MAGIC,src,src,bl,skillid,skilllv,tick,flag);2796 break;2783 clif_specialeffect(bl, 180, AREA); //Shadow hit Effect on target 2784 clif_specialeffect(bl, 32, AREA); //Flame Engulf Effect on target 2785 clif_specialeffect(src, 454, AREA); //Black Cast Effect on caster 2786 skill_attack(BF_MAGIC,src,src,bl,skillid,skilllv,tick,flag); 2787 break; 2797 2788 case WL_SEARING: // Warlock Searing Pain [Brain] 2798 clif_specialeffect(bl, 406, AREA); //Fire on Head Effect on target 2799 clif_specialeffect(src, 55, AREA); //Red Cast Effect on caster 2800 skill_attack(BF_MAGIC,src,src,bl,skillid,skilllv,tick,flag); 2801 //if target is on searing status already, just cause damage, no extra DoT 2802 if(!status_get_sc(bl)->data[SC_SEARING]) 2803 skill_addtimerskill(src,tick+3000,bl->id,0,0,skillid,skilllv,4,flag); 2804 break; 2805 case WL_CONFLAGRATE: // Warlock Conflagrate [Brain] 2806 if(status_get_sc(bl)->data[SC_IMMOLATE]) { // Can only be casted if target is immolating status 2807 clif_specialeffect(bl, 183, AREA); //Explosion Effect on target 2789 clif_specialeffect(bl, 406, AREA); //Fire on Head Effect on target 2808 2790 clif_specialeffect(src, 55, AREA); //Red Cast Effect on caster 2809 2791 skill_attack(BF_MAGIC,src,src,bl,skillid,skilllv,tick,flag); 2810 status_change_end(bl,SC_IMMOLATE,-1); //End Immolating status 2811 } else clif_skill_fail(sd,skillid,0,0); 2812 break; 2792 //if target is on searing status already, just cause damage, no extra DoT 2793 if(!status_get_sc(bl)->data[SC_SEARING]) 2794 skill_addtimerskill(src,tick+3000,bl->id,0,0,skillid,skilllv,4,flag); 2795 break; 2796 case WL_CONFLAGRATE: // Warlock Conflagrate [Brain] 2797 if(status_get_sc(bl)->data[SC_IMMOLATE]) { // Can only be casted if target is immolating status 2798 clif_specialeffect(bl, 183, AREA); //Explosion Effect on target 2799 clif_specialeffect(src, 55, AREA); //Red Cast Effect on caster 2800 skill_attack(BF_MAGIC,src,src,bl,skillid,skilllv,tick,flag); 2801 status_change_end(bl,SC_IMMOLATE,-1); //End Immolating status 2802 } else clif_skill_fail(sd,skillid,0,0); 2803 break; 2813 2804 case WL_IMMOLATE: // Warlock Immolate [Brain] 2814 clif_specialeffect(bl, 635, AREA); //Dragon Fire Effect on target2815 clif_specialeffect(src, 55, AREA); //Red Cast Effect on caster2816 skill_attack(BF_MAGIC,src,src,bl,skillid,skilllv,tick,flag);2817 //If Target is on searing pain status, will change immolating status instead2818 if(!status_get_sc(bl)->data[SC_IMMOLATE])2819 skill_addtimerskill(src,tick+3000,bl->id,0,0,skillid,skilllv,5,flag);2820 break;2805 clif_specialeffect(bl, 635, AREA); //Dragon Fire Effect on target 2806 clif_specialeffect(src, 55, AREA); //Red Cast Effect on caster 2807 skill_attack(BF_MAGIC,src,src,bl,skillid,skilllv,tick,flag); 2808 //If Target is on searing pain status, will change immolating status instead 2809 if(!status_get_sc(bl)->data[SC_IMMOLATE]) 2810 skill_addtimerskill(src,tick+3000,bl->id,0,0,skillid,skilllv,5,flag); 2811 break; 2821 2812 case WL_CURSEDOOM: // Warlock Curse of Doom [Brain] 2822 clif_specialeffect(bl, 183, AREA); //Explosion Effect on target2823 skill_attack(BF_MAGIC,src,bl,bl,skillid,skilllv,tick,flag|SD_ANIMATION);2824 break;2813 clif_specialeffect(bl, 183, AREA); //Explosion Effect on target 2814 skill_attack(BF_MAGIC,src,bl,bl,skillid,skilllv,tick,flag|SD_ANIMATION); 2815 break; 2825 2816 case WL_PWAGONY: // Warlock Power Word: Agony [Brain] 2826 if(battle_check_living(tstatus->race,tstatus->def_ele)){ 2827 skill_attack(BF_MAGIC,src,src,bl,skillid,skilllv,tick,flag); 2828 clif_specialeffect(bl, 587, AREA); //Big Purple Flame Effect on target 2829 clif_specialeffect(src, 454, AREA); //Black Cast Effect on caster 2830 //If target is on Agonizing status already, just cause damage, no extra DoT 2831 if(!status_get_sc(bl)->data[SC_AGONY]) 2832 skill_addtimerskill(src,tick+3000,bl->id,0,0,skillid,skilllv,skilllv,flag); 2833 } 2834 else clif_skill_fail(sd,skillid,0,0); 2835 break; 2836 2817 if(battle_check_living(tstatus->race,tstatus->def_ele)){ 2818 skill_attack(BF_MAGIC,src,src,bl,skillid,skilllv,tick,flag); 2819 clif_specialeffect(bl, 587, AREA); //Big Purple Flame Effect on target 2820 clif_specialeffect(src, 454, AREA); //Black Cast Effect on caster 2821 //If target is on Agonizing status already, just cause damage, no extra DoT 2822 if(!status_get_sc(bl)->data[SC_AGONY]) 2823 skill_addtimerskill(src,tick+3000,bl->id,0,0,skillid,skilllv,skilllv,flag); 2824 } 2825 else clif_skill_fail(sd,skillid,0,0); 2826 break; 2837 2827 2838 2828 case NPC_MAGICALATTACK: … … 2872 2862 count++; // natural water cell 2873 2863 else 2874 if( (unit = map_find_skill_unit_oncell(src,x,y,SA_DELUGE,NULL)) != NULL 2864 if( (unit = map_find_skill_unit_oncell(src,x,y,SA_DELUGE,NULL)) != NULL 2875 2865 || (unit = map_find_skill_unit_oncell(src,x,y,NJ_SUITON,NULL)) != NULL ) 2876 2866 { … … 2937 2927 skill_attack(BF_MAGIC,src,src,src,skillid,skilllv,tick,flag); 2938 2928 status_percent_damage(src, src, 0, 100, false); 2939 } 2929 } 2940 2930 if (sd) skill_blockpc_start (sd, skillid, (skilllv < 5 ? 10000: 15000)); 2941 2931 break; … … 2998 2988 } 2999 2989 3000 map_freeblock_unlock(); 2990 map_freeblock_unlock(); 3001 2991 3002 2992 if (sd && !(flag&1) && sd->state.arrow_atk) //Consume arrow on last invocation to this skill. … … 3006 2996 3007 2997 /*========================================== 3008 * 2998 * 3009 2999 *------------------------------------------*/ 3010 3000 int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, int skillid, int skilllv, unsigned int tick, int flag) … … 3020 3010 int i; 3021 3011 enum sc_type type; 3022 3012 3023 3013 if(skillid > 0 && skilllv <= 0) return 0; // celest 3024 3014 … … 3041 3031 return 1; 3042 3032 3033 // Added DEATHPACT [Brain] 3034 //if(src!=bl && status_isdead(bl) && skillid != ALL_RESURRECTION && skillid != PR_REDEMPTIO) 3043 3035 if(src!=bl && status_isdead(bl) && skillid != ALL_RESURRECTION && skillid != PR_REDEMPTIO && skillid != NC_DEATHPACT) 3044 3036 return 1; … … 3046 3038 tstatus = status_get_status_data(bl); 3047 3039 sstatus = status_get_status_data(src); 3048 3040 3049 3041 //Check for undead skills that convert a no-damage skill into a damage one. [Skotlex] 3050 3042 switch (skillid) { … … 3067 3059 } 3068 3060 break; 3069 case AD_DARKHEAL: // Adept Dark Heal [Brain] 3070 // Only player casted spells can be offensive (copyed from AL_HEAL code above) 3071 if (sd && (battle_check_living(tstatus->race,tstatus->def_ele)) //Check if target is a living creature 3072 && !pc_checkskill(dstsd,NC_PHYLACTERY) //Or he doesnt have Phylactery (non-perma undead) 3073 && !status_get_sc(bl)->data[SC_OVERWHELMING]) { //Or Overwhelming Evil is off (most cases) 3074 if (battle_check_target(src, bl, BCT_ENEMY) < 1) { 3075 //Offensive heal does not works on non-enemies. 3076 clif_skill_fail(sd,skillid,0,0); 3077 return 0; 3078 } 3079 return skill_castend_damage_id(src, bl, skillid, skilllv, tick, flag); 3080 } 3081 break; 3061 //right place? 3062 case AD_DARKHEAL: // Adept Dark Heal [Brain] 3063 // Only player casted spells can be offensive (copyed from AL_HEAL code above) 3064 if (sd && (battle_check_living(tstatus->race,tstatus->def_ele)) //Check if target is a living creature 3065 && !pc_checkskill(dstsd,NC_PHYLACTERY) //Or he doesnt have Phylactery (non-perma undead) 3066 && !status_get_sc(bl)->data[SC_OVERWHELMING]) { //Or Overwhelming Evil is off (most cases) 3067 if (battle_check_target(src, bl, BCT_ENEMY) < 1) { 3068 //Offensive heal does not works on non-enemies. 3069 clif_skill_fail(sd,skillid,0,0); 3070 return 0; 3071 } 3072 return skill_castend_damage_id(src, bl, skillid, skilllv, tick, flag); 3073 } 3074 break; 3082 3075 3083 3076 case NPC_SMOKING: //Since it is a self skill, this one ends here rather than in damage_id. [Skotlex] … … 3107 3100 int heal = skill_calc_heal(src, bl, skilllv); 3108 3101 int heal_get_jobexp; 3109 3102 3110 3103 if (status_isimmune(bl) || (dstmd && dstmd->class_ == MOBID_EMPERIUM)) 3111 3104 heal=0; 3112 // Profane Soul reduces the healed recieved by 3% per skilllv [Brain] 3113 if(dstsd) { 3114 heal = heal * (100 - pc_checkskill(dstsd,AD_PROFANE)*3)/100; 3115 //Wont heal even if he got elemental armors [Brain] 3116 if(pc_checkskill(dstsd,NC_PHYLACTERY)) heal = skilllv; 3117 } 3105 //To not allow heal for joo 3106 // Profane Soul reduces the healed recieved by 3% per skilllv [Brain] 3107 if(dstsd) { 3108 heal = heal * (100 - pc_checkskill(dstsd,AD_PROFANE)*3)/100; 3109 //Wont heal even if he got elemental armors [Brain] 3110 if(pc_checkskill(dstsd,NC_PHYLACTERY)) heal = skilllv; 3111 } 3118 3112 if (sd) { 3119 3113 if ((i = pc_skillheal_bonus(sd, skillid))) … … 3151 3145 } 3152 3146 break; 3153 3154 3147 case AD_DARKHEAL: // Adept Dark Heal [Brain] 3155 { 3156 int heal = skill_calc_heal(src, bl, skilllv); 3157 if (status_isimmune(bl) || (dstmd && dstmd->class_ == MOBID_EMPERIUM)) 3158 heal=0; 3159 if(battle_check_undead(tstatus->race,tstatus->def_ele) || tstatus->race==RC_UNDEAD // Check if our target is undead or demon 3160 || tstatus->race==RC_DEMON || pc_checkskill(dstsd,NC_PHYLACTERY)//Or has a phylactery 3161 || status_get_sc(bl)->data[SC_OVERWHELMING]) { //Or is on OverWhelm status, checking again... 3162 clif_skill_nodamage(src, bl, skillid, heal, 1); 3163 clif_skill_nodamage(NULL, bl, AL_HEAL, heal, 1); //Subtle way to show heal numbers AND effect =D 3164 status_heal(bl, heal, 0, 0); 3165 } else { 3166 clif_skill_nodamage(src, bl, skillid, 0, 1); 3167 clif_skill_nodamage(NULL, bl, AL_HEAL, 0, 1); 3168 } 3169 clif_specialeffect(bl, 656, AREA); //Blinking Green Sprite Effect on target 3170 } 3171 break; 3172 3148 { 3149 int heal = skill_calc_heal(src, bl, skilllv); 3150 if (status_isimmune(bl) || (dstmd && dstmd->class_ == MOBID_EMPERIUM)) 3151 heal=0; 3152 if(battle_check_undead(tstatus->race,tstatus->def_ele) || tstatus->race==RC_UNDEAD // Check if our target is undead or demon 3153 || tstatus->race==RC_DEMON || pc_checkskill(dstsd,NC_PHYLACTERY)//Or has a phylactery 3154 || status_get_sc(bl)->data[SC_OVERWHELMING]) { //Or is on OverWhelm status, checking again... 3155 clif_skill_nodamage(src, bl, skillid, heal, 1); 3156 clif_skill_nodamage(NULL, bl, AL_HEAL, heal, 1); //Subtle way to show heal numbers AND effect =D 3157 status_heal(bl, heal, 0, 0); 3158 } else { 3159 clif_skill_nodamage(src, bl, skillid, 0, 1); 3160 clif_skill_nodamage(NULL, bl, AL_HEAL, 0, 1); 3161 } 3162 clif_specialeffect(bl, 656, AREA); //Blinking Green Sprite Effect on target 3163 } 3164 break; 3173 3165 3174 3166 case PR_REDEMPTIO: … … 3202 3194 } else //Invalid target, skip resurrection. 3203 3195 break; 3204 3196 3205 3197 case ALL_RESURRECTION: 3206 case NC_DEATHPACT: // Necro Death Pact [Brain] 3198 case NC_DEATHPACT: // Necro Death Pact [Brain] (Seems fine) 3207 3199 if(sd && map_flag_gvg(bl->m)) 3208 3200 { //No reviving in WoE grounds! … … 3212 3204 if (!status_isdead(bl)) 3213 3205 break; 3214 { 3206 { 3215 3207 int per = 0, sper = 0; 3216 3208 if (map[bl->m].flag.pvp && dstsd && dstsd->pvp_point < 0) … … 3223 3215 case 4: per=80; break; 3224 3216 case 5: per=100; break; //Added a 5th level because NC_DEATHPACT got 5 lvs [Brain] 3225 } 3226 if(dstsd && dstsd->special_state.restart_full_recover) 3217 //above seems ok 3218 } 3219 if(dstsd && dstsd->special_state.restart_full_recover) 3227 3220 per = sper = 100; 3228 3221 if (status_revive(bl, per, sper)) 3229 3222 { 3230 3223 clif_skill_nodamage(src,bl,ALL_RESURRECTION,skilllv,1); //Both Redemptio and Res show this skill-animation. 3231 if(skillid==NC_DEATHPACT) { // Necro Death Pact [Brain] 3232 clif_skill_nodamage(src, bl, skillid, skilllv, 3233 sc_start(bl,type,100,skilllv,skill_get_time(skillid,skilllv))); 3234 break; 3235 } 3236 3237 if(sd && dstsd && battle_config.resurrection_exp > 0) 3224 //Seriously, how is this right? It just doesnt look right but i may be ignoring something. 3225 if(skillid==NC_DEATHPACT) { // Necro Death Pact [Brain] 3226 clif_skill_nodamage(src, bl, skillid, skilllv, 3227 sc_start(bl,type,100,skilllv,skill_get_time(skillid,skilllv))); 3228 break; 3229 } 3230 3231 if(sd && dstsd && battle_config.resurrection_exp > 0) 3238 3232 { 3239 3233 int exp = 0,jexp = 0; … … 3253 3247 } 3254 3248 break; 3255 3249 //Huge lump of code here. 3256 3250 case AD_PWBLIND: // Adept Power Word: Blind [Brain] 3257 if(!tsc->data[type]) { 3258 clif_skill_nodamage(src, bl, skillid, skilllv,1); 3259 if(sc_start(bl, type,(30 + skilllv * 10 + (status_get_lv(src) - sstatus->int_)/5), 3260 skilllv, skill_get_time(skillid,skilllv))) 3261 { 3262 if(dstmd) mob_unlocktarget(dstmd,tick); //Removes current target 3263 clif_specialeffect(bl, 379, AREA); //379.Soul Drain (2nd Part) 3264 break; 3265 } 3266 } else clif_skill_fail(sd,skillid,0,0); 3267 break; 3268 3251 if(!tsc->data[type]) { 3252 clif_skill_nodamage(src, bl, skillid, skilllv,1); 3253 if(sc_start(bl, type,(30 + skilllv * 10 + (status_get_lv(src) - sstatus->int_)/5), 3254 skilllv, skill_get_time(skillid,skilllv))) 3255 { 3256 if(dstmd) mob_unlocktarget(dstmd,tick); //Removes current target 3257 clif_specialeffect(bl, 379, AREA); //379.Soul Drain (2nd Part) 3258 break; 3259 } 3260 } else clif_skill_fail(sd,skillid,0,0); 3261 break; 3269 3262 case AD_PWFEAR: // Adept Power Word: Fear [Brain] 3270 if(!tsc->data[type]) {3271 clif_skill_nodamage(src, bl, skillid, skilllv,1);3272 if(dstsd)3273 type = SC_CONFUSION; //Players cant be affected by SC_FEAR3274 if(sc_start(bl, type, (30 + skilllv * 10), skilllv, skill_get_time(skillid,skilllv)))3275 {3276 clif_specialeffect(bl, 372, AREA); //372.Death3277 unit_escape(bl, bl, 30);3278 }3279 } else clif_skill_fail(sd,skillid,0,0);3280 break;3263 if(!tsc->data[type]) { 3264 clif_skill_nodamage(src, bl, skillid, skilllv,1); 3265 if(dstsd) 3266 type = SC_CONFUSION; //Players cant be affected by SC_FEAR 3267 if(sc_start(bl, type, (30 + skilllv * 10), skilllv, skill_get_time(skillid,skilllv))) 3268 { 3269 clif_specialeffect(bl, 372, AREA); //372.Death 3270 unit_escape(bl, bl, 30); 3271 } 3272 } else clif_skill_fail(sd,skillid,0,0); 3273 break; 3281 3274 case WL_HOWLOFPAIN: // Warlock Howl of Pain [Brain] 3282 //These must be here first or else the code wont execute them. 3283 clif_specialeffect(src, 670, AREA); // Monster skill SCREAM effect on caster (no sound) 3284 clif_soundeffectall(bl, "wraith_die.wav", 0, AREA); //Wraith Laugh Sound 3285 if (flag & 1) { 3286 //Check if target is a living creature AND a valid enemy 3287 if (battle_check_target(src, bl, BCT_ENEMY) && battle_check_living(tstatus->race,tstatus->def_ele)) 3288 { 3289 if(sc_start(bl,type,10+skilllv*10,skilllv,skill_get_time(skillid,skilllv))) 3290 { 3291 if(dstmd) //PROVOKE Effect on mobs 3292 mob_target(dstmd,src,skill_get_range2(src,skillid,skilllv)); 3293 // Breaks Frozen and Sleep status 3294 if(tsc && tsc->count){ 3295 if(tsc->data[SC_FREEZE]) 3296 status_change_end(bl,SC_FREEZE,-1); 3297 if(tsc->data[SC_SLEEP]) 3298 status_change_end(bl,SC_SLEEP,-1); 3299 } 3300 clif_emotion(bl,6); //anger emote on target 3301 break; 3302 } else { //What will happen if the status fail: 3275 //These must be here first or else the code wont execute them. 3276 clif_specialeffect(src, 670, AREA); // Monster skill SCREAM effect on caster (no sound) 3277 clif_soundeffectall(bl, "wraith_die.wav", 0, AREA); //Wraith Laugh Sound 3278 if (flag & 1) { 3279 //Check if target is a living creature AND a valid enemy 3280 if (battle_check_target(src, bl, BCT_ENEMY) && battle_check_living(tstatus->race,tstatus->def_ele)) 3303 3281 { 3304 if (sd) //If is a player 3305 clif_skill_fail(sd,skillid,0,0); 3306 map_freeblock_unlock(); //Else is a mob 3307 return 0; 3308 } 3309 unit_skillcastcancel(bl, 2); //In any case, will cancel casting 3310 } 3311 } 3312 } else { 3313 map_foreachinrange(skill_area_sub, src, 3314 skill_get_splash(skillid, skilllv), BL_CHAR, 3315 src, skillid, skilllv, tick, flag|BCT_ENEMY|1, 3316 skill_castend_nodamage_id); 3317 clif_skill_nodamage(src, bl, skillid, skilllv, 1); 3318 map_freeblock_unlock(); 3319 return 1; 3320 } 3321 break; 3282 if(sc_start(bl,type,10+skilllv*10,skilllv,skill_get_time(skillid,skilllv))) 3283 { 3284 if(dstmd) //PROVOKE Effect on mobs 3285 mob_target(dstmd,src,skill_get_range2(src,skillid,skilllv)); 3286 // Breaks Frozen and Sleep status 3287 if(tsc && tsc->count){ 3288 if(tsc->data[SC_FREEZE]) 3289 status_change_end(bl,SC_FREEZE,-1); 3290 if(tsc->data[SC_SLEEP]) 3291 status_change_end(bl,SC_SLEEP,-1); 3292 } 3293 clif_emotion(bl,6); //anger emote on target 3294 break; 3295 } else { //What will happen if the status fail: 3296 { 3297 if (sd) //If is a player 3298 clif_skill_fail(sd,skillid,0,0); 3299 map_freeblock_unlock(); //Else is a mob 3300 return 0; 3301 } 3302 unit_skillcastcancel(bl, 2); //In any case, will cancel casting 3303 } 3304 } 3305 } else { 3306 map_foreachinrange(skill_area_sub, src, 3307 skill_get_splash(skillid, skilllv), BL_CHAR, 3308 src, skillid, skilllv, tick, flag|BCT_ENEMY|1, 3309 skill_castend_nodamage_id); 3310 clif_skill_nodamage(src, bl, skillid, skilllv, 1); 3311 map_freeblock_unlock(); 3312 return 1; 3313 } 3314 break; 3322 3315 case WL_HOWLOFTERROR: // Warlock Howl of Terror [Brain] 3323 if (flag & 1) {3324 int rate;3325 //Check if target is a living creature AND a valid enemy3326 if (battle_check_target(src, bl, BCT_ENEMY)3327 && battle_check_living(tstatus->race,tstatus->def_ele)) {3328 rate = 10 + skilllv*5 + pc_checkskill(sd,AD_PWFEAR)*3;3329 if(dstsd) {3330 rate -= 10; // 10% less chance on players3331 type = SC_CONFUSION; //Players cant be affected by SC_FEAR3332 }3333 if(sc_start(bl,type,rate,skilllv,skill_get_time(skillid,skilllv)))3334 clif_specialeffect(bl, 372, AREA); //Same as PW: Fear3335 }3336 } else {3337 map_foreachinrange(skill_area_sub, src,3338 skill_get_splash(skillid, skilllv), BL_CHAR,3339 src, skillid, skilllv, tick, flag|BCT_ENEMY|1,3340 skill_castend_nodamage_id);3341 clif_skill_nodamage(src, bl, skillid, skilllv, 1);3342 }3343 clif_specialeffect(src, 668, AREA); // Monster skill SCREAM effect on caster (with sound)3344 break;3345 3316 if (flag & 1) { 3317 int rate; 3318 //Check if target is a living creature AND a valid enemy 3319 if (battle_check_target(src, bl, BCT_ENEMY) 3320 && battle_check_living(tstatus->race,tstatus->def_ele)) { 3321 rate = 10 + skilllv*5 + pc_checkskill(sd,AD_PWFEAR)*3; 3322 if(dstsd) { 3323 rate -= 10; // 10% less chance on players 3324 type = SC_CONFUSION; //Players cant be affected by SC_FEAR 3325 } 3326 if(sc_start(bl,type,rate,skilllv,skill_get_time(skillid,skilllv))) 3327 clif_specialeffect(bl, 372, AREA); //Same as PW: Fear 3328 } 3329 } else { 3330 map_foreachinrange(skill_area_sub, src, 3331 skill_get_splash(skillid, skilllv), BL_CHAR, 3332 src, skillid, skilllv, tick, flag|BCT_ENEMY|1, 3333 skill_castend_nodamage_id); 3334 clif_skill_nodamage(src, bl, skillid, skilllv, 1); 3335 } 3336 clif_specialeffect(src, 668, AREA); // Monster skill SCREAM effect on caster (with sound) 3337 break; 3338 // Would be easy to screw up in that. 3346 3339 3347 3340 case AL_DECAGI: … … 3361 3354 } 3362 3355 break; 3363 3356 //another huge lump 3364 3357 case NC_DARKMOON: //Necro Dark Moon [Brain] 3365 if (flag&1) {3366 //Check my enemies3367 if (battle_check_target(src, bl, BCT_ENEMY) &&3368 battle_check_living(tstatus->race,tstatus->def_ele))3369 {3370 if(sc_start(bl,SC_BLIND,50,skilllv,skill_get_time(skillid,skilllv)))3371 clif_specialeffect(bl, 580, AREA); //Box of Rain effect on target3372 }3373 else { //Now my Party members3374 if (sd == NULL || sd->status.party_id == 0 || (flag & 1)) {3375 clif_skill_nodamage(bl,bl,skillid,skilllv,3376 sc_start(bl,type,100,skilllv,skill_get_time(skillid,skilllv)));3377 clif_specialeffect(bl, 521, AREA); //Red Flashing Aura Sprite effect on target3378 } else if (sd) {3379 party_foreachsamemap(skill_area_sub, sd,skill_get_splash(skillid, skilllv),3380 src,skillid,skilllv,tick, flag|BCT_ALL|1,skill_castend_nodamage_id);3381 }3382 }3383 } else {3384 map_foreachinrange(skill_area_sub, src, skill_get_splash(skillid, skilllv), BL_CHAR,3385 src, skillid, skilllv, tick, flag|BCT_ALL|1, skill_castend_nodamage_id);3386 clif_skill_nodamage(src, bl, skillid, skilllv, 1);3387 }3388 clif_specialeffect(src, 407, AREA); //Soul Change Effect on caster3389 clif_soundeffectall(bl, "se_wolf1.wav", 0, AREA); //Wolf Howl Sound3390 break;3358 if (flag&1) { 3359 //Check my enemies 3360 if (battle_check_target(src, bl, BCT_ENEMY) && 3361 battle_check_living(tstatus->race,tstatus->def_ele)) 3362 { 3363 if(sc_start(bl,SC_BLIND,50,skilllv,skill_get_time(skillid,skilllv))) 3364 clif_specialeffect(bl, 580, AREA); //Box of Rain effect on target 3365 } 3366 else { //Now my Party members 3367 if (sd == NULL || sd->status.party_id == 0 || (flag & 1)) { 3368 clif_skill_nodamage(bl,bl,skillid,skilllv, 3369 sc_start(bl,type,100,skilllv,skill_get_time(skillid,skilllv))); 3370 clif_specialeffect(bl, 521, AREA); //Red Flashing Aura Sprite effect on target 3371 } else if (sd) { 3372 party_foreachsamemap(skill_area_sub, sd,skill_get_splash(skillid, skilllv), 3373 src,skillid,skilllv,tick, flag|BCT_ALL|1,skill_castend_nodamage_id); 3374 } 3375 } 3376 } else { 3377 map_foreachinrange(skill_area_sub, src, skill_get_splash(skillid, skilllv), BL_CHAR, 3378 src, skillid, skilllv, tick, flag|BCT_ALL|1, skill_castend_nodamage_id); 3379 clif_skill_nodamage(src, bl, skillid, skilllv, 1); 3380 } 3381 clif_specialeffect(src, 407, AREA); //Soul Change Effect on caster 3382 clif_soundeffectall(bl, "se_wolf1.wav", 0, AREA); //Wolf Howl Sound 3383 break; 3391 3384 case NC_REQUIEM: //Necro Requiem [Brain] 3392 if (flag&1) { 3393 //Check my enemies 3394 if (battle_check_target(src, bl, BCT_ENEMY) && 3395 battle_check_living(tstatus->race,tstatus->def_ele)) 3396 { 3397 if(sc_start(bl,type,100,skilllv,skill_get_time(skillid,skilllv))) 3398 clif_specialeffect(bl, 578, AREA); //Box of Curse effect on target 3399 } 3400 else { //Now my Party members 3401 if (sd == NULL || sd->status.party_id == 0 || (flag & 1)) { 3402 clif_skill_nodamage(bl,bl,skillid,skilllv, 3403 sc_start(bl,type,100,skilllv,skill_get_time(skillid,skilllv))); 3404 clif_specialeffect(bl, 572, AREA); //Warmth Soul effect on target 3405 } else if (sd) { 3406 party_foreachsamemap(skill_area_sub, sd,skill_get_splash(skillid, skilllv), 3407 src,skillid,skilllv,tick, flag|BCT_ALL|1,skill_castend_nodamage_id); 3408 } 3409 } 3410 } else { 3411 map_foreachinrange(skill_area_sub, src, skill_get_splash(skillid, skilllv), BL_CHAR, 3412 src, skillid, skilllv, tick, flag|BCT_ALL|1, skill_castend_nodamage_id); 3413 clif_skill_nodamage(src, bl, skillid, skilllv, 1); 3414 } 3415 int rnds = rand()%3; 3416 switch(rnds) { 3417 case 1: 3418 clif_soundeffectall(bl, "chant1.wav", 0, AREA); //Chanting Sound 3419 break; 3420 case 2: 3421 clif_soundeffectall(bl, "chant2.wav", 0, AREA); //Chanting Sound 3422 break; 3423 case 3: 3424 clif_soundeffectall(bl, "chant3.wav", 0, AREA); //Chanting Sound 3425 break; 3426 } 3427 break; 3428 3385 if (flag&1) { 3386 //Check my enemies 3387 if (battle_check_target(src, bl, BCT_ENEMY) && 3388 battle_check_living(tstatus->race,tstatus->def_ele)) 3389 { 3390 if(sc_start(bl,type,100,skilllv,skill_get_time(skillid,skilllv))) 3391 clif_specialeffect(bl, 578, AREA); //Box of Curse effect on target 3392 } 3393 else { //Now my Party members 3394 if (sd == NULL || sd->status.party_id == 0 || (flag & 1)) { 3395 clif_skill_nodamage(bl,bl,skillid,skilllv, 3396 sc_start(bl,type,100,skilllv,skill_get_time(skillid,skilllv))); 3397 clif_specialeffect(bl, 572, AREA); //Warmth Soul effect on target 3398 } else if (sd) { 3399 party_foreachsamemap(skill_area_sub, sd,skill_get_splash(skillid, skilllv), 3400 src,skillid,skilllv,tick, flag|BCT_ALL|1,skill_castend_nodamage_id); 3401 } 3402 } 3403 } else { 3404 map_foreachinrange(skill_area_sub, src, skill_get_splash(skillid, skilllv), BL_CHAR, 3405 src, skillid, skilllv, tick, flag|BCT_ALL|1, skill_castend_nodamage_id); 3406 clif_skill_nodamage(src, bl, skillid, skilllv, 1); 3407 } 3408 int rnds = rand()%3; 3409 switch(rnds) { 3410 case 1: 3411 clif_soundeffectall(bl, "chant1.wav", 0, AREA); //Chanting Sound 3412 break; 3413 case 2: 3414 clif_soundeffectall(bl, "chant2.wav", 0, AREA); //Chanting Sound 3415 break; 3416 case 3: 3417 clif_soundeffectall(bl, "chant3.wav", 0, AREA); //Chanting Sound 3418 break; 3419 } 3420 break; 3429 3421 3430 3422 case PR_LEXDIVINA: … … 3432 3424 status_change_end(bl,type, -1); 3433 3425 clif_skill_nodamage (src, bl, skillid, skilllv, 1); 3434 } else 3435 clif_skill_nodamage (src, bl, skillid, skilllv, 3426 } else 3427 clif_skill_nodamage (src, bl, skillid, skilllv, 3436 3428 sc_start(bl,type,100,skilllv,skill_get_time(skillid,skilllv))); 3437 3429 break; … … 3449 3441 abra_skilllv = min(skilllv, skill_get_max(abra_skillid)); 3450 3442 clif_skill_nodamage (src, bl, skillid, skilllv, 1); 3451 3443 3452 3444 if( sd ) 3453 3445 {// player-casted … … 3463 3455 int target_id = 0; 3464 3456 if (!ud) break; 3465 if (inf&INF_SELF_SKILL || inf&INF_SUPPORT_SKILL) { 3457 if (inf&INF_SELF_SKILL || inf&INF_SUPPORT_SKILL) { 3466 3458 if (src->type == BL_PET) 3467 3459 bl = (struct block_list*)((TBL_PET*)src)->msd; 3468 3460 if (!bl) bl = src; 3469 unit_skilluse_id(src, bl->id, abra_skillid, abra_skilllv); 3461 unit_skilluse_id(src, bl->id, abra_skillid, abra_skilllv); 3470 3462 } else { //Assume offensive skills 3471 3463 if (ud->target) … … 3480 3472 bl = map_id2bl(target_id); 3481 3473 if (!bl) bl = src; 3482 unit_skilluse_pos(src, bl->x, bl->y, abra_skillid, abra_skilllv); 3474 unit_skilluse_pos(src, bl->x, bl->y, abra_skillid, abra_skilllv); 3483 3475 } else 3484 3476 unit_skilluse_id(src, target_id, abra_skillid, abra_skilllv); … … 3554 3546 case CR_PROVIDENCE: 3555 3547 if(sd && dstsd){ //Check they are not another crusader [Skotlex] 3556 if ((dstsd->class_&MAPID_UPPERMASK) == MAPID_CRUSADER) { 3548 if ((dstsd->class_&MAPID_UPPERMASK) == MAPID_CRUSADER) { 3557 3549 clif_skill_fail(sd,skillid,0,0); 3558 3550 map_freeblock_unlock(); … … 3563 3555 sc_start(bl,type,100,skilllv,skill_get_time(skillid,skilllv))); 3564 3556 break; 3565 3557 3566 3558 case CG_MARIONETTE: 3567 3559 { … … 3661 3653 3662 3654 sc_start(bl,SC_SEVENWIND,100,skilllv,skill_get_time(skillid,skilllv)); 3663 3655 3664 3656 break; 3665 3657 … … 3692 3684 case LK_BERSERK: 3693 3685 case KN_AUTOCOUNTER: 3694 case KN_TWOHANDQUICKEN: 3686 case KN_TWOHANDQUICKEN: 3695 3687 case KN_ONEHAND: 3696 3688 case CR_SPEARQUICKEN: … … 3703 3695 case MO_BLADESTOP: 3704 3696 case LK_AURABLADE: 3705 case LK_PARRYING: 3697 case LK_PARRYING: 3706 3698 case LK_CONCENTRATION: 3707 3699 case WS_CARTBOOST: … … 3729 3721 case NPC_DEFENDER: 3730 3722 case NPC_MAGICMIRROR: 3731 case ALL_ATFIELD: 3723 case ALL_ATFIELD: //AT Field [Brain] ( still dont think this belongs.) 3732 3724 clif_skill_nodamage(src,bl,skillid,skilllv, 3733 3725 sc_start(bl,type,100,skilllv,skill_get_time(skillid,skilllv))); 3734 3726 break; 3727 //ANOTHER large lump but it really doesnt feel like it fits here. 3735 3728 case AD_LUST: // Adept Blood Lust [Brain] 3736 clif_specialeffect(src, 220, AREA); //Berserk Pot effect3737 clif_specialeffect(src, 455, AREA); //Red Lightnings3738 clif_skill_nodamage(src,bl,skillid,skilllv,3739 sc_start(bl,type,100,skilllv,skill_get_time(skillid,skilllv)));3740 break;3729 clif_specialeffect(src, 220, AREA); //Berserk Pot effect 3730 clif_specialeffect(src, 455, AREA); //Red Lightnings 3731 clif_skill_nodamage(src,bl,skillid,skilllv, 3732 sc_start(bl,type,100,skilllv,skill_get_time(skillid,skilllv))); 3733 break; 3741 3734 case NC_DECREPIFY: //Necro Decrepify [Brain] 3742 if(battle_check_living(tstatus->race,tstatus->def_ele)){3743 clif_specialeffect(bl, 403, AREA); //Mind Breaker Effect on target3744 clif_specialeffect(src, 454, AREA); //Black Cast Effect on caster3745 clif_skill_nodamage(src,bl,skillid,skilllv,3746 sc_start(bl,type,100,skilllv,skill_get_time(skillid,skilllv)));3747 }3748 else clif_skill_fail(sd,skillid,0,0);3749 break;3735 if(battle_check_living(tstatus->race,tstatus->def_ele)){ 3736 clif_specialeffect(bl, 403, AREA); //Mind Breaker Effect on target 3737 clif_specialeffect(src, 454, AREA); //Black Cast Effect on caster 3738 clif_skill_nodamage(src,bl,skillid,skilllv, 3739 sc_start(bl,type,100,skilllv,skill_get_time(skillid,skilllv))); 3740 } 3741 else clif_skill_fail(sd,skillid,0,0); 3742 break; 3750 3743 case WL_CURSEWEAKNESS: // Warlock Curse of Weakness [Brain] 3751 clif_specialeffect(bl, 656, AREA); //Blinking Green Sprite effect on target 3752 clif_specialeffect(src, 59, AREA); //Purple Cast Effect on caster 3753 clif_skill_nodamage(src,bl,skillid,skilllv, 3754 sc_start(bl,type,100,skilllv,skill_get_time(skillid,skilllv))); 3755 break; 3756 case WL_CURSEEXHAUST: // Warlock Curse of Exhaustion [Brain] 3757 clif_specialeffect(bl, 135, AREA); //Ice Breaking effect on target 3758 clif_specialeffect(src, 59, AREA); //Purple Cast Effect on caster 3759 clif_skill_nodamage(src,bl,skillid,skilllv, 3760 sc_start(bl,type,100,skilllv,skill_get_time(skillid,skilllv))); 3761 break; 3762 case WL_CURSETONGUES: // Warlock Curse of Tongues [Brain] 3763 clif_specialeffect(bl, 72, AREA); //Spinning Lights effect on target 3764 clif_specialeffect(src, 59, AREA); //Purple Cast Effect on caster 3765 clif_skill_nodamage(src,bl,skillid,skilllv, 3766 sc_start(bl,type,100,skilllv,skill_get_time(skillid,skilllv))); 3767 break; 3768 case WL_CURSEDOOM: // Warlock Curse of Doom (temp) [Brain] 3769 if(!tsc->data[type]) { 3770 clif_specialeffect(bl, 196, AREA); //Small Curse Reaper effect on target 3744 clif_specialeffect(bl, 656, AREA); //Blinking Green Sprite effect on target 3771 3745 clif_specialeffect(src, 59, AREA); //Purple Cast Effect on caster 3772 3746 clif_skill_nodamage(src,bl,skillid,skilllv, 3773 sc_start4(bl,type,100, 3774 skilllv,skillid,src->id,skill_get_time(skillid,skilllv),1000)); 3775 } else clif_skill_fail(sd,skillid,0,0); 3776 break; 3747 sc_start(bl,type,100,skilllv,skill_get_time(skillid,skilllv))); 3748 break; 3749 case WL_CURSEEXHAUST: // Warlock Curse of Exhaustion [Brain] 3750 clif_specialeffect(bl, 135, AREA); //Ice Breaking effect on target 3751 clif_specialeffect(src, 59, AREA); //Purple Cast Effect on caster 3752 clif_skill_nodamage(src,bl,skillid,skilllv, 3753 sc_start(bl,type,100,skilllv,skill_get_time(skillid,skilllv))); 3754 break; 3755 case WL_CURSETONGUES: // Warlock Curse of Tongues [Brain] 3756 clif_specialeffect(bl, 72, AREA); //Spinning Lights effect on target 3757 clif_specialeffect(src, 59, AREA); //Purple Cast Effect on caster 3758 clif_skill_nodamage(src,bl,skillid,skilllv, 3759 sc_start(bl,type,100,skilllv,skill_get_time(skillid,skilllv))); 3760 break; 3761 case WL_CURSEDOOM: // Warlock Curse of Doom (temp) [Brain] 3762 if(!tsc->data[type]) { 3763 clif_specialeffect(bl, 196, AREA); //Small Curse Reaper effect on target 3764 clif_specialeffect(src, 59, AREA); //Purple Cast Effect on caster 3765 clif_skill_nodamage(src,bl,skillid,skilllv, 3766 sc_start4(bl,type,100, 3767 skilllv,skillid,src->id,skill_get_time(skillid,skilllv),1000)); 3768 } else clif_skill_fail(sd,skillid,0,0); 3769 break; 3777 3770 case WL_OVERWHELMING: // Warlock Overwhelming Evil [Brain] 3778 clif_specialeffect(src, 348, AREA); //1000 Blades Trespassing effect on caster 3779 clif_skill_nodamage(src,bl,skillid,skilllv, 3780 sc_start(bl,type,100,skilllv,skill_get_time(skillid,skilllv))); 3781 break; 3771 clif_specialeffect(src, 348, AREA); //1000 Blades Trespassing effect on caster 3772 clif_skill_nodamage(src,bl,skillid,skilllv, 3773 sc_start(bl,type,100,skilllv,skill_get_time(skillid,skilllv))); 3774 break; 3775 3782 3776 case MG_SIGHT: 3783 3777 case AL_RUWACH: … … 3894 3888 if (!i) 3895 3889 { 3896 if (sd) 3890 if (sd) 3897 3891 clif_skill_fail(sd,skillid,0,0); 3898 3892 map_freeblock_unlock(); … … 3980 3974 skill_additional_effect(src,bl,skillid,skilllv,BF_MISC,tick); //Use Misc rather than weapon to signal passive pushback 3981 3975 } 3982 break; 3976 break; 3983 3977 3984 3978 case MO_ABSORBSPIRITS: … … 3996 3990 clif_skill_nodamage(src,bl,skillid,skilllv,i?1:0); 3997 3991 break; 3998 3992 //this feels more like it fits. 3999 3993 case WL_DRAINSOUL: // Warlock Drain Soul [Brain] 4000 i = 0; 4001 if (dstsd && (sd == dstsd || map_flag_vs(src->m))) 4002 { //check if target is a player and we are in versus map 4003 i = tstatus->max_sp * skilllv/100;//i = SkillLv% of player Max SP 4004 if(dstsd->spiritball && (dstsd->class_&MAPID_BASEMASK)!=MAPID_GUNSLINGER) { 4005 i += dstsd->spiritball * 5;//will drain Monk Spirits and regain 5 SP per Spirit 4006 pc_delspiritball(dstsd,dstsd->spiritball,0); 4007 } 4008 } else if (dstmd && !(tstatus->mode&MD_BOSS) && battle_check_living(tstatus->race,tstatus->def_ele)) 4009 { // check if target is a monster and not a Boss 4010 i = dstmd->level/5 * skilllv;//i = mob level/5 * Skill Lvl 4011 mob_target(dstmd,src,0);//This will turn the mob agressive against the caster 4012 } 4013 if(i < skilllv) i = skilllv; //Minimum 1 sp per skill lvl 4014 if (i) { 4015 clif_specialeffect(src, 253, AREA); //Absorb Mana effect on caster 4016 clif_specialeffect(bl, 52, AREA); //Lightning Hit effect on target 4017 status_heal(src, 0, i, 3); //caster drains sp 4018 status_zap(bl, 0, i*skilllv); //target lost sp equal to 1*SkillLv the amount drained 4019 } 4020 clif_skill_nodamage(src,bl,skillid,skilllv,i?1:0); 4021 break; 4022 3994 i = 0; 3995 if (dstsd && (sd == dstsd || map_flag_vs(src->m))) 3996 { //check if target is a player and we are in versus map 3997 i = tstatus->max_sp * skilllv/100;//i = SkillLv% of player Max SP 3998 if(dstsd->spiritball && (dstsd->class_&MAPID_BASEMASK)!=MAPID_GUNSLINGER) { 3999 i += dstsd->spiritball * 5;//will drain Monk Spirits and regain 5 SP per Spirit 4000 pc_delspiritball(dstsd,dstsd->spiritball,0); 4001 } 4002 } else if (dstmd && !(tstatus->mode&MD_BOSS) && battle_check_living(tstatus->race,tstatus->def_ele)) 4003 { // check if target is a monster and not a Boss 4004 i = dstmd->level/5 * skilllv;//i = mob level/5 * Skill Lvl 4005 mob_target(dstmd,src,0);//This will turn the mob agressive against the caster 4006 } 4007 if(i < skilllv) i = skilllv; //Minimum 1 sp per skill lvl 4008 if (i) { 4009 clif_specialeffect(src, 253, AREA); //Absorb Mana effect on caster 4010 clif_specialeffect(bl, 52, AREA); //Lightning Hit effect on target 4011 status_heal(src, 0, i, 3); //caster drains sp 4012 status_zap(bl, 0, i*skilllv); //target lost sp equal to 1*SkillLv the amount drained 4013 } 4014 clif_skill_nodamage(src,bl,skillid,skilllv,i?1:0); 4015 break; 4023 4016 4024 4017 case AC_MAKINGARROW: … … 4113 4106 } 4114 4107 break; 4115 4108 4116 4109 case WZ_SIGHTRASHER: 4117 4110 //Passive side of the attack. … … 4221 4214 case SM_AUTOBERSERK: // Celest 4222 4215 if (tsce) 4223 i = status_change_end(bl, type, -1); 4216 i = status_change_end(bl, type, -1); 4224 4217 else 4225 4218 i = sc_start(bl,type,100,skilllv,60000); … … 4235 4228 break; 4236 4229 case TK_RUN: 4237 if (tsce) 4230 if (tsce) 4238 4231 clif_skill_nodamage(src,bl,skillid,skilllv, 4239 4232 status_change_end(bl, type, -1)); … … 4331 4324 if (dstmd) 4332 4325 mob_target(dstmd,src,skill_get_range2(src,skillid,skilllv)); 4333 4326 4334 4327 if (tsc->data[SC_STONE]) { 4335 4328 status_change_end(bl,SC_STONE,-1); … … 4482 4475 } 4483 4476 break; 4484 4477 4485 4478 case TF_PICKSTONE: 4486 4479 if(sd) { … … 4539 4532 //Note that Full Strip autospell doesn't use a duration 4540 4533 if (!clif_skill_nodamage(src,bl,skillid,skilllv, 4541 skill_strip_equip(bl, location, i, skilllv, 4534 skill_strip_equip(bl, location, i, skilllv, 4542 4535 sd&&skillid==ST_FULLSTRIP&&!pc_checkskill(sd, skillid)?0:skill_get_time(skillid,skilllv))) 4543 4536 && sd) … … 4695 4688 continue; 4696 4689 switch (i) { 4697 case SC_WEIGHT50: case SC_WEIGHT90: case SC_HALLUCINATION: 4690 case SC_WEIGHT50: case SC_WEIGHT90: case SC_HALLUCINATION: 4698 4691 case SC_STRIPWEAPON: case SC_STRIPSHIELD: case SC_STRIPARMOR: 4699 4692 case SC_STRIPHELM: case SC_CP_WEAPON: case SC_CP_SHIELD: … … 4745 4738 y = src->y + diry[dir]*skilllv*2; 4746 4739 } 4747 4740 4748 4741 clif_skill_nodamage(src,bl,TK_HIGHJUMP,skilllv,1); 4749 4742 if(!map_count_oncell(src->m,x,y,BL_PC|BL_NPC|BL_MOB) && map_getcell(src->m,x,y,CELL_CHKREACH)) { … … 4789 4782 } else if (!dstsd || map_flag_vs(bl->m)) //HP damage only on pvp-maps when against players. 4790 4783 hp = tstatus->max_hp/50; //Recover 2% HP [Skotlex] 4791 4784 4792 4785 clif_skill_nodamage(src,bl,skillid,skilllv,1); 4793 4786 unit_skillcastcancel(bl,0); … … 4799 4792 else 4800 4793 hp = 0; 4801 4794 4802 4795 if (sp) //Recover some of the SP used 4803 4796 sp = sp*(25*(skilllv-1))/100; … … 4875 4868 case NPC_CHANGETELEKINESIS: 4876 4869 clif_skill_nodamage(src,bl,skillid,skilllv, 4877 sc_start2(bl, type, 100, skilllv, skill_get_ele(skillid,skilllv), 4870 sc_start2(bl, type, 100, skilllv, skill_get_ele(skillid,skilllv), 4878 4871 skill_get_time(skillid, skilllv))); 4879 4872 break; … … 4883 4876 if(tstatus->def_ele==ELE_UNDEAD || tstatus->def_ele==ELE_DARK) break; 4884 4877 clif_skill_nodamage(src,bl,skillid,skilllv, 4885 sc_start2(bl, type, 100, skilllv, skill_get_ele(skillid,skilllv), 4878 sc_start2(bl, type, 100, skilllv, skill_get_ele(skillid,skilllv), 4886 4879 skill_get_time(skillid, skilllv))); 4887 4880 break; … … 4900 4893 sc_start(bl,type,100,skilllv,skill_time)) 4901 4894 && ud) { //Disable attacking/acting/moving for skill's duration. 4902 ud->attackabletime = 4895 ud->attackabletime = 4903 4896 ud->canact_tick = 4904 4897 ud->canmove_tick = tick + skill_time; … … 4944 4937 } 4945 4938 break; 4946 4939 4947 4940 case NPC_SPEEDUP: 4948 4941 { … … 5017 5010 sc_start(bl,type,100,100,skill_get_time(skillid, skilllv))); 5018 5011 break; 5019 5012 5020 5013 case NPC_AGIUP: 5021 5014 sc_start(bl,SC_SPEEDUP1,100,skilllv,skill_get_time(skillid, skilllv)); … … 5029 5022 sc_start4(bl,type,100,skilllv,0,0,6,skill_get_time(skillid,skilllv))); 5030 5023 break; 5031 5024 5032 5025 case NPC_SIEGEMODE: 5033 5026 // not sure what it does … … 5179 5172 return 1; 5180 5173 } 5181 5174 5182 5175 if (tsce) 5183 5176 { //HelloKitty2 (?) explained that this silently fails when target is … … 5190 5183 if (!clif_skill_nodamage(src,bl,skillid,skilllv, 5191 5184 sc_start(bl,type,55+5*skilllv,skilllv,skill_get_time(skillid,skilllv)))) 5192 { 5185 { 5193 5186 if (sd) clif_skill_fail(sd,skillid,0,0); 5194 5187 map_freeblock_unlock(); … … 5371 5364 break; 5372 5365 default: 5373 break; 5374 } 5366 break; 5367 } 5375 5368 } while ((--count) > 0); 5376 5369 clif_skill_nodamage(src,bl,skillid,skilllv,1); … … 5432 5425 clif_skill_nodamage(src,bl,skillid,skilllv, 5433 5426 sc_start(bl,type,100,skilllv,skill_get_time(skillid,skilllv))); 5434 5427 5435 5428 if (skillid == SL_SKE) 5436 5429 sc_start(src,SC_SMA,100,skilllv,skill_get_time(SL_SMA,skilllv)); 5437 5430 5438 5431 break; 5439 5432 5440 5433 // New guild skills [Celest] 5441 5434 case GD_BATTLEORDER: … … 5515 5508 clif_feel_info(sd, skilllv-1, 1); 5516 5509 } 5517 break; 5510 break; 5518 5511 5519 5512 case SG_HATE: … … 5595 5588 static const int per[5][2]={{20,50},{50,60},{25,75},{60,64},{34,67}}; 5596 5589 int rnd = rand()%100; 5597 i = (skilllv-1)%5; 5590 i = (skilllv-1)%5; 5598 5591 if(rnd<per[i][0]) //Self 5599 5592 bl = src; … … 5662 5655 mobskill_event(dstmd, src, tick, MSC_SKILLUSED|(skillid<<16)); 5663 5656 } 5664 5657 5665 5658 if (sd && !(flag&1) && sd->state.arrow_atk) //Consume arrow on last invocation to this skill. 5666 5659 battle_consume_ammo(sd, skillid, skilllv); … … 5694 5687 } 5695 5688 5696 if(ud->skillid != SA_CASTCANCEL ) { 5689 if(ud->skillid != SA_CASTCANCEL ) 5690 {// otherwise handled in unit_skillcastcancel() 5697 5691 if( ud->skilltimer != tid ) { 5698 5692 ShowError("skill_castend_id: Timer mismatch %d!=%d!\n", ud->skilltimer, tid); … … 5700 5694 return 0; 5701 5695 } 5702 if( sd && ud->skilltimer != -1 && pc_checkskill(sd,SA_FREECAST)) 5703 status_freecast_switch(sd); 5704 ud->skilltimer=-1; 5696 5697 if( sd && ud->skilltimer != -1 && pc_checkskill(sd,SA_FREECAST) > 0 ) 5698 {// restore original walk speed 5699 ud->skilltimer = -1; 5700 status_calc_bl(&sd->bl, SCB_SPEED); 5701 } 5702 5703 ud->skilltimer = -1; 5705 5704 } 5706 5705 … … 5765 5764 if(inf2 & (INF2_PARTY_ONLY|INF2_GUILD_ONLY) && src != target) 5766 5765 { 5767 inf |= 5766 inf |= 5768 5767 (inf2&INF2_PARTY_ONLY?BCT_PARTY:0)| 5769 5768 (inf2&INF2_GUILD_ONLY?BCT_GUILD:0); … … 5807 5806 if(sd && !skill_check_condition(sd,ud->skillid, ud->skilllv,1)) 5808 5807 break; 5809 5808 5810 5809 if(hd && !skill_check_condition_hom(hd,ud->skillid, ud->skilllv,1)) //[orn] 5811 5810 break; … … 5816 5815 if (ud->walktimer != -1 && ud->skillid != TK_RUN) 5817 5816 unit_stop_walking(src,1); 5818 5817 5819 5818 ud->canact_tick = tick + skill_delayfix(src, ud->skillid, ud->skilllv); 5820 5819 5821 5820 if (skill_get_state(ud->skillid) != ST_MOVE_ENABLE) 5822 5821 unit_set_walkdelay(src, tick, battle_config.default_walk_delay+skill_get_walkdelay(ud->skillid, ud->skilllv), 1); 5823 5822 5824 5823 if(battle_config.skill_log && battle_config.skill_log&src->type) 5825 5824 ShowInfo("Type %d, ID %d skill castend id [id =%d, lv=%d, target ID %d]\n", … … 5876 5875 if (dy > 0) dy++; 5877 5876 else if(dy < 0) dy--; 5878 5877 5879 5878 if (unit_movepos(src, src->x+dx, src->y+dy, 1, 1)) 5880 5879 { //Display movement + animation. … … 5897 5896 5898 5897 /*========================================== 5899 * 5898 * 5900 5899 *------------------------------------------*/ 5901 5900 int skill_castend_pos(int tid, unsigned int tick, int id, intptr data) … … 5918 5917 return 0; 5919 5918 } 5920 5919 5921 5920 if( ud->skilltimer != tid ) 5922 5921 { … … 5926 5925 } 5927 5926 5928 if(sd && ud->skilltimer != -1 && pc_checkskill(sd,SA_FREECAST)) 5929 status_freecast_switch(sd); 5930 5927 if( sd && ud->skilltimer != -1 && pc_checkskill(sd,SA_FREECAST) > 0 ) 5928 {// restore original walk speed 5929 ud->skilltimer=-1; 5930 status_calc_bl(&sd->bl, SCB_SPEED); 5931 } 5931 5932 ud->skilltimer=-1; 5933 5932 5934 do { 5933 5935 if(status_isdead(src)) … … 5937 5939 skill_get_unit_flag(ud->skillid)&UF_NOREITERATION && 5938 5940 skill_check_unit_range(src,ud->skillx,ud->skilly,ud->skillid,ud->skilllv) 5939 ) 5941 ) 5940 5942 { 5941 5943 if (sd) clif_skill_fail(sd,ud->skillid,0,0); … … 5976 5978 } 5977 5979 } 5978 5980 5979 5981 if(sd && !skill_check_condition(sd,ud->skillid, ud->skilllv, 1)) 5980 5982 break; … … 6062 6064 skill_area_temp[1] = src->id; 6063 6065 i = skill_get_splash(skillid, skilllv); 6064 map_foreachinarea(skill_area_sub, 6066 map_foreachinarea(skill_area_sub, 6065 6067 src->m, x-i, y-i, x+i, y+i, BL_PC, 6066 6068 src, skillid, skilllv, tick, flag|BCT_ALL|1, … … 6089 6091 src->m, x-i, y-i, x+i,y+i,BL_SKILL); 6090 6092 break; 6091 6093 //the code changed alot and jumped around. 6092 6094 case WL_HELLFIRE: // Warlock Hellfire [Brain] 6093 //clif_specialeffect(sd, 92, AREA); //Meteor Effect on caster, cant set on ground 6094 clif_skill_poseffect(src,WZ_METEOR,skilllv,x,y,tick); //Meteor Effect 6095 clif_skill_nodamage(src, src, skillid, 0, 1); //Lalala, just to show the skill yell correctly 6096 clif_specialeffect(src, 55, AREA); //Red Cast Effect on caster 6097 // Continue reading because skill_unitsetting is bellow 6098 6099 6095 //clif_specialeffect(sd, 92, AREA); //Meteor Effect on caster, cant set on ground 6096 clif_skill_poseffect(src,WZ_METEOR,skilllv,x,y,tick); //Meteor Effect 6097 clif_skill_nodamage(src, src, skillid, 0, 1); //Lalala, just to show the skill yell correctly 6098 clif_specialeffect(src, 55, AREA); //Red Cast Effect on caster 6099 // Continue reading because skill_unitsetting is bellow 6100 6100 case MG_SAFETYWALL: 6101 case MG_FIREWALL: 6101 case MG_FIREWALL: 6102 6102 case MG_THUNDERSTORM: 6103 6103 case AL_PNEUMA: … … 6256 6256 md->deletetimer = add_timer (gettick() + skill_get_time(skillid,skilllv), mob_timer_delete, md->bl.id, 0); 6257 6257 mob_spawn (md); //Now it is ready for spawning. 6258 // @showsummon command implementation [Brainstorm] 6259 if(sd->state.showsummon){ 6260 char output[256]; 6261 sprintf(output, 6262 "[Summon] HP : %d | STR : %d DEX : %d VIT : %d INT : %d AGI : %d LUK : %d", 6263 md->status.max_hp,md->status.str,md->status.dex,md->status.vit,md->status.int_,md->status.agi,md->status.luk); 6264 clif_disp_onlyself(sd,output,strlen(output)); 6265 sprintf(output, 6266 "[%s] ATK : %d~%d | DEF: %d+%d MDEF: %d+%d | HIT: %d FLEE: %d", 6267 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); 6268 clif_disp_onlyself(sd,output,strlen(output)); 6269 } 6270 6271 } 6272 } 6273 break; 6274 6258 //Does this really belong here? 6259 // @showsummon command implementation [Brainstorm] 6260 if(sd->state.showsummon){ 6261 char output[256]; 6262 sprintf(output, 6263 "[Summon] HP : %d | STR : %d DEX : %d VIT : %d INT : %d AGI : %d LUK : %d", 6264 md->status.max_hp,md->status.str,md->status.dex,md->status.vit,md->status.int_,md->status.agi,md->status.luk); 6265 clif_disp_onlyself(sd,output,strlen(output)); 6266 sprintf(output, 6267 "[%s] ATK : %d~%d | DEF: %d+%d MDEF: %d+%d | HIT: %d FLEE: %d", 6268 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); 6269 clif_disp_onlyself(sd,output,strlen(output)); 6270 } 6271 6272 } 6273 } 6274 break; 6275 6276 //HUGE lump of code! 6277 //Some of the code repeats itself, Unless it just recites it for other classes it may be a problem 6275 6278 case AD_FAMILIAR: // Adept Summon Familiar [Brain] 6276 if( sd ) 6277 { 6278 int id; 6279 int mob_class; 6280 struct mob_data* md; 6281 mob_class = pc_readglobalreg(sd, "ADEPT_FAMILIAR"); 6282 if( mob_class == 0 ) 6279 if( sd ) 6283 6280 { 6284 mob_class = mob_get_random_id(4, 0x1, 0); 6285 pc_setglobalreg(sd, "ADEPT_FAMILIAR", mob_class); 6286 } 6287 id = mob_once_spawn(sd,src->m,src->x,src->y,"--en--",mob_class,1,""); 6288 md = (struct mob_data *)map_id2bl(id); 6289 if( md != NULL ) 6290 { 6291 md->master_id = sd->bl.id; 6292 md->special_state.ai = 1; 6293 md->status.mode = md->status.mode|MD_AGGRESSIVE; 6294 status_calc_mob(md,0); //Recalc their stats based on passive bonus 6295 md->status.hp = md->status.max_hp; //Must be here or the code wont update it 6296 // @showsummon command implementation [Brainstorm] 6297 if(sd->state.showsummon){ 6298 char output[256]; 6299 sprintf(output, 6300 "[Summon] HP : %d | STR : %d DEX : %d VIT : %d INT : %d AGI : %d LUK : %d", 6301 md->status.max_hp,md->status.str,md->status.dex,md->status.vit,md->status.int_,md->status.agi,md->status.luk); 6302 clif_disp_onlyself(sd,output,strlen(output)); 6303 sprintf(output, 6304 "[%s] ATK : %d~%d | DEF: %d+%d MDEF: %d+%d | HIT: %d FLEE: %d", 6305 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); 6306 clif_disp_onlyself(sd,output,strlen(output)); 6307 } 6308 md->deletetimer = add_timer(gettick() + skill_get_time(skillid,skilllv), mob_timer_delete, id, 0); 6309 } 6310 } 6311 break; 6281 int id; 6282 int mob_class; 6283 struct mob_data* md; 6284 6285 mob_class = pc_readglobalreg(sd, "ADEPT_FAMILIAR"); 6286 if( mob_class == 0 ) 6287 { 6288 mob_class = mob_get_random_id(4, 0x1, 0); 6289 pc_setglobalreg(sd, "ADEPT_FAMILIAR", mob_class); 6290 } 6291 id = mob_once_spawn(sd,src->m,src->x,src->y,"--en--",mob_class,1,""); 6292 md = (struct mob_data *)map_id2bl(id); 6293 if( md != NULL ) 6294 { 6295 md->master_id = sd->bl.id; 6296 md->special_state.ai = 1; 6297 md->status.mode = md->status.mode|MD_AGGRESSIVE; 6298 status_calc_mob(md,0); //Recalc their stats based on passive bonus 6299 md->status.hp = md->status.max_hp; //Must be here or the code wont update it 6300 // @showsummon command implementation [Brainstorm] 6301 if(sd->state.showsummon){ 6302 char output[256]; 6303 sprintf(output, 6304 "[Summon] HP : %d | STR : %d DEX : %d VIT : %d INT : %d AGI : %d LUK : %d", 6305 md->status.max_hp,md->status.str,md->status.dex,md->status.vit,md->status.int_,md->status.agi,md->status.luk); 6306 clif_disp_onlyself(sd,output,strlen(output)); 6307 sprintf(output, 6308 "[%s] ATK : %d~%d | DEF: %d+%d MDEF: %d+%d | HIT: %d FLEE: %d", 6309 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); 6310 clif_disp_onlyself(sd,output,strlen(output)); 6311 } 6312 md->deletetimer = add_timer(gettick() + skill_get_time(skillid,skilllv), mob_timer_delete, id, 0); 6313 } 6314 } 6315 break; 6312 6316 case NC_SKELETON: // Raise Skeleton [Brain] 6313 6317 case NC_ARCHER: // Raise Archer Skeleton … … 6317 6321 case NC_SHADOW: // Raise Shadow 6318 6322 case NC_WRAITH: // Raise Wraith 6319 if( sd ) 6320 { 6321 static const int mob_skeleton[5]={ 3201, 3202, 3203, 3204, 3205 }; // Skeleton, Orc Skeleton, Soldier Skeleton, Pirate Skeleton, Skeleton General 6322 static const int mob_archer[5]={ 3206, 3207, 3208, 3209, 3210 }; // Archer Skeleton, Firelock Soldier 6323 static const int mob_zombie[5]={ 3211, 3212, 3213, 3214, 3215 }; // Zombie, Ghoul, Zombie Master 6324 static const int mob_mummy[5]={ 3216, 3217, 3218, 3219, 3220 }; // Mummy, Ancient Mummy 6325 static const int mob_ghost[5]={ 3221, 3222, 3223, 3224, 3225 }; // Whisper, Nightmare, Nightmare Terror 6326 static const int mob_shadow[5]={ 3226, 3227, 3228, 3229, 3230 }; // Injustice, Raydric, Dullahan 6327 static const int mob_wraith[5]={ 3231, 3232, 3233, 3234, 3235 }; // Wraith, Wraith Dead 6328 int id; 6329 int mob_class; 6330 struct mob_data *md; 6331 6332 switch( skillid ) 6323 if( sd ) 6333 6324 { 6334 case NC_SKELETON: mob_class = mob_skeleton[skilllv-1]; break; 6335 case NC_ARCHER: mob_class = mob_archer[skilllv-1]; break; 6336 case NC_ZOMBIE: mob_class = mob_zombie[skilllv-1]; break; 6337 case NC_MUMMY: mob_class = mob_mummy[skilllv-1]; break; 6338 case NC_GHOST: mob_class = mob_ghost[skilllv-1]; break; 6339 case NC_SHADOW: mob_class = mob_shadow[skilllv-1]; break; 6340 case NC_WRAITH: mob_class = mob_wraith[skilllv-1]; break; 6341 default: 6342 mob_class = 1002; // poring 6343 ShowDebug("skill_castend_pos2: undefined skill #%d used to raise mobs, defaulting to poring\n"); 6344 break; 6345 } 6346 id = mob_once_spawn(sd,src->m,src->x,src->y,"--ja--",mob_class,1,""); 6347 if((md=(struct mob_data *)map_id2bl(id))) 6348 { 6349 md->master_id=sd->bl.id; 6350 md->special_state.ai=1; 6351 md->status.mode=md->db->status.mode|MD_AGGRESSIVE; 6352 status_calc_mob(md,0); //Recalc their stats based on passive bonus 6353 md->status.hp = md->status.max_hp; //Must be here or the code wont update it 6354 // @showsummon command implementation [Brainstorm] 6355 if(sd->state.showsummon){ 6356 char output[256]; 6357 sprintf(output, 6358 "[Summon] HP : %d | STR : %d DEX : %d VIT : %d INT : %d AGI : %d LUK : %d", 6359 md->status.max_hp,md->status.str,md->status.dex,md->status.vit,md->status.int_,md->status.agi,md->status.luk); 6360 clif_disp_onlyself(sd,output,strlen(output)); 6361 sprintf(output, 6362 "[%s] ATK : %d~%d | DEF: %d+%d MDEF: %d+%d | HIT: %d FLEE: %d", 6363 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); 6364 clif_disp_onlyself(sd,output,strlen(output)); 6365 } 6366 md->deletetimer = add_timer(gettick() + skill_get_time(skillid,skilllv), mob_timer_delete, id, 0); 6367 } 6368 } 6369 break; 6370 6325 static const int mob_skeleton[5]={ 3201, 3202, 3203, 3204, 3205 }; // Skeleton, Orc Skeleton, Soldier Skeleton, Pirate Skeleton, Skeleton General 6326 static const int mob_archer[5]={ 3206, 3207, 3208, 3209, 3210 }; // Archer Skeleton, Firelock Soldier 6327 static const int mob_zombie[5]={ 3211, 3212, 3213, 3214, 3215 }; // Zombie, Ghoul, Zombie Master 6328 static const int mob_mummy[5]={ 3216, 3217, 3218, 3219, 3220 }; // Mummy, Ancient Mummy 6329 static const int mob_ghost[5]={ 3221, 3222, 3223, 3224, 3225 }; // Whisper, Nightmare, Nightmare Terror 6330 static const int mob_shadow[5]={ 3226, 3227, 3228, 3229, 3230 }; // Injustice, Raydric, Dullahan 6331 static const int mob_wraith[5]={ 3231, 3232, 3233, 3234, 3235 }; // Wraith, Wraith Dead 6332 int id; 6333 int mob_class; 6334 struct mob_data *md; 6335 6336 switch( skillid ) 6337 { 6338 case NC_SKELETON: mob_class = mob_skeleton[skilllv-1]; break; 6339 case NC_ARCHER: mob_class = mob_archer[skilllv-1]; break; 6340 case NC_ZOMBIE: mob_class = mob_zombie[skilllv-1]; break; 6341 case NC_MUMMY: mob_class = mob_mummy[skilllv-1]; break; 6342 case NC_GHOST: mob_class = mob_ghost[skilllv-1]; break; 6343 case NC_SHADOW: mob_class = mob_shadow[skilllv-1]; break; 6344 case NC_WRAITH: mob_class = mob_wraith[skilllv-1]; break; 6345 default: 6346 mob_class = 1002; // poring 6347 ShowDebug("skill_castend_pos2: undefined skill #%d used to raise mobs, defaulting to poring\n"); 6348 break; 6349 } 6350 id = mob_once_spawn(sd,src->m,src->x,src->y,"--ja--",mob_class,1,""); 6351 if((md=(struct mob_data *)map_id2bl(id))) 6352 { 6353 md->master_id=sd->bl.id; 6354 md->special_state.ai=1; 6355 md->status.mode=md->db->status.mode|MD_AGGRESSIVE; 6356 status_calc_mob(md,0); //Recalc their stats based on passive bonus 6357 md->status.hp = md->status.max_hp; //Must be here or the code wont update it 6358 //I bet this should NOT be here -- Critical 6359 if(sd->state.showsummon){ 6360 char output[256]; 6361 sprintf(output, 6362 "[Summon] HP : %d | STR : %d DEX : %d VIT : %d INT : %d AGI : %d LUK : %d", 6363 md->status.max_hp,md->status.str,md->status.dex,md->status.vit,md->status.int_,md->status.agi,md->status.luk); 6364 clif_disp_onlyself(sd,output,strlen(output)); 6365 sprintf(output, 6366 "[%s] ATK : %d~%d | DEF: %d+%d MDEF: %d+%d | HIT: %d FLEE: %d", 6367 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); 6368 clif_disp_onlyself(sd,output,strlen(output)); 6369 } 6370 md->deletetimer = add_timer(gettick() + skill_get_time(skillid,skilllv), mob_timer_delete, id, 0); 6371 } 6372 } 6373 break; 6371 6374 6372 6375 … … 6395 6398 potion_hp = potion_hp * (100+i)/100; 6396 6399 potion_sp = potion_sp * (100+i)/100; 6397 6400 6398 6401 if(potion_hp > 0 || potion_sp > 0) { 6399 6402 i = skill_get_splash(skillid, skilllv); … … 6417 6420 potion_hp = potion_hp * (100+i)/100; 6418 6421 potion_sp = potion_sp * (100+i)/100; 6419 6422 6420 6423 if(potion_hp > 0 || potion_sp > 0) { 6421 6424 i = skill_get_splash(skillid, skilllv); … … 6439 6442 } 6440 6443 break; 6441 6444 6442 6445 case HW_GRAVITATION: 6443 6446 if ((sg = skill_unitsetting(src,skillid,skilllv,x,y,0))) … … 6521 6524 if (sd && !(flag&1) && sd->state.arrow_atk) //Consume arrow if a ground skill was not invoked. [Skotlex] 6522 6525 battle_consume_ammo(sd, skillid, skilllv); 6523 6526 6524 6527 return 0; 6525 6528 } 6526 6529 6527 6530 /*========================================== 6528 * 6531 * 6529 6532 *------------------------------------------*/ 6530 6533 int skill_castend_map (struct map_session_data *sd, short skill_num, const char *map) … … 6534 6537 //Simplify skill_failed code. 6535 6538 #define skill_failed(sd) { sd->menuskill_id = sd->menuskill_val = 0; } 6536 if(skill_num != sd->menuskill_id) 6539 if(skill_num != sd->menuskill_id) 6537 6540 return 0; 6538 6541 … … 6569 6572 return 0; 6570 6573 } 6571 6574 6572 6575 switch(skill_num) 6573 6576 { … … 6610 6613 } 6611 6614 } 6612 6615 6613 6616 //When it's an item-used warp-portal, the skill-lv used is lost.. assume max level. 6614 6617 lv = sd->skillitem==skill_num?skill_get_max(skill_num):pc_checkskill(sd,skill_num); 6615 6618 wx = sd->menuskill_val>>16; 6616 6619 wy = sd->menuskill_val&0xffff; 6617 6620 6618 6621 if( lv <= 0 ) return 0; 6619 6622 if( lv > 4 ) lv = 4; // crash prevention … … 6634 6637 return 0; 6635 6638 } 6636 6639 6637 6640 // This makes Warp Portal fail if the cell is not empty 6638 6641 //if(skill_check_unit_range2(&sd->bl,wx,wy,skill_num,lv) > 0) { … … 6693 6696 return 0; //Nothing to remove, this unit is not overlapped. 6694 6697 6695 if (unit->val1 != unit->group->skill_id) 6698 if (unit->val1 != unit->group->skill_id) 6696 6699 { //Reset state 6697 6700 unit->val1 = unit->group->skill_id; 6698 6701 unit->val2 &= ~UF_ENSEMBLE; 6699 6702 } 6700 6703 6701 6704 return map_foreachincell(skill_dance_overlap_sub, unit->bl.m,unit->bl.x,unit->bl.y,BL_SKILL, unit,flag); 6702 6705 } … … 6782 6785 switch(skillid) 6783 6786 { 6787 //seems good. 6784 6788 case WL_HELLFIRE: // Warlock Hellfire [Brain] 6785 if(map_flag_vs(src->m)) target = BCT_ALL;6786 break;6789 if(map_flag_vs(src->m)) target = BCT_ALL; 6790 break; 6787 6791 case MG_SAFETYWALL: 6788 6792 val2=skilllv+1; … … 6860 6864 { //Use the previous limit (minus the elapsed time) [Skotlex] 6861 6865 limit = old_sg->limit - DIFF_TICK(gettick(), old_sg->tick); 6862 if (limit < 0) //This can happen... 6866 if (limit < 0) //This can happen... 6863 6867 limit = skill_get_time(skillid,skilllv); 6864 6868 } … … 7107 7111 return NULL; 7108 7112 } 7109 7113 7110 7114 7111 7115 if (skillid == NJ_TATAMIGAESHI) //Store number of tiles. … … 7116 7120 7117 7121 /*========================================== 7118 * 7122 * 7119 7123 *------------------------------------------*/ 7120 7124 static int skill_unit_onplace (struct skill_unit *src, struct block_list *bl, unsigned int tick) … … 7129 7133 nullpo_retr(0, src); 7130 7134 nullpo_retr(0, bl); 7131 7135 7132 7136 if(bl->prev==NULL || !src->alive || status_isdead(bl)) 7133 7137 return 0; … … 7139 7143 && !skill_get_inf2(sg->skill_id) == INF2_TRAP) //Traps work on top of land protector, magical or not [Brain] 7140 7144 return 0; //AoE skills are ineffective. [Skotlex] 7141 7145 7142 7146 sc = status_get_sc(bl); 7143 7147 7144 7148 if (sc && sc->option&OPTION_HIDE && sg->skill_id != WZ_HEAVENDRIVE) 7145 7149 return 0; //Hidden characters are immune to AoE skills except Heaven's Drive. [Skotlex] 7146 7150 7147 7151 type = status_skill2sc(sg->skill_id); 7148 7152 sce = (sc && type != -1)?sc->data[type]:NULL; … … 7240 7244 } 7241 7245 break; 7242 7246 7243 7247 case UNT_FOGWALL: 7244 7248 if (!sce) … … 7261 7265 // src->limit = DIFF_TICK(tick+700,sg->tick); 7262 7266 // break; 7263 7267 7264 7268 case UNT_MOONLIT: 7265 7269 //Knockback out of area if affected char isn't in Moonlit effect … … 7275 7279 7276 7280 /*========================================== 7277 * 7281 * 7278 7282 *------------------------------------------*/ 7279 7283 int skill_unit_onplace_timer (struct skill_unit *src, struct block_list *bl, unsigned int tick) … … 7302 7306 tsc = status_get_sc(bl); 7303 7307 tstatus = status_get_status_data(bl); 7304 if (sg->state.magic_power) //For magic power. 7308 if (sg->state.magic_power) //For magic power. 7305 7309 { 7306 7310 sc = status_get_sc(ss); … … 7331 7335 return 0; 7332 7336 ts->tick = tick+sg->interval; 7333 7337 7334 7338 if ((skillid==CR_GRANDCROSS || skillid==NPC_GRANDDARKNESS) && !battle_config.gx_allhit) 7335 7339 ts->tick += sg->interval*(map_count_oncell(bl->m,bl->x,bl->y,BL_CHAR)-1); … … 7382 7386 if (status_isimmune(bl)) 7383 7387 heal = 0; /* é»éè²ã«ãŒãïŒããŒã«éïŒïŒ */ 7384 // Profane Soul reduces the healed recieved by 3% per skilllv [Brain] 7385 if(tsd) {7386 heal = heal * (100 - pc_checkskill(tsd,AD_PROFANE)*3)/100;7387 //Wont heal even if he got elemental armors [Brain]7388 if(pc_checkskill(tsd,NC_PHYLACTERY)) heal = sg->skill_lv;7389 }7390 7388 //Okay? 7389 // Profane Soul reduces the healed recieved by 3% per skilllv [Brain] 7390 if(tsd) { 7391 heal = heal * (100 - pc_checkskill(tsd,AD_PROFANE)*3)/100; 7392 //Wont heal even if he got elemental armors [Brain] 7393 if(pc_checkskill(tsd,NC_PHYLACTERY)) heal = sg->skill_lv; 7394 } 7391 7395 clif_skill_nodamage(&src->bl, bl, AL_HEAL, heal, 1); 7392 7396 status_heal(bl, heal, 0, 0); … … 7399 7403 7400 7404 case UNT_EVILLAND: 7401 if (tstatus->race!=RC_UNDEAD && tstatus->race!=RC_DEMON) 7405 //Will heal demon and undead element monsters, but not players. 7406 if (bl->type != BL_PC && !battle_check_undead(tstatus->race, tstatus->def_ele) && tstatus->race!=RC_DEMON) 7402 7407 { //Damage enemies 7403 7408 if(battle_check_target(&src->bl,bl,BCT_ENEMY)>0) … … 7423 7428 7424 7429 case UNT_ATTACK_SKILLS: 7425 switch (sg->skill_id) 7430 switch (sg->skill_id) 7426 7431 { 7427 7432 case SG_SUN_WARM: //SG skills [Komurka] … … 7461 7466 break; 7462 7467 default: 7463 skill_attack(skill_get_type(sg->skill_id),ss,&src->bl,bl,sg->skill_id,sg->skill_lv,tick,0); 7468 skill_attack(skill_get_type(sg->skill_id),ss,&src->bl,bl,sg->skill_id,sg->skill_lv,tick,0); 7464 7469 } 7465 7470 break; … … 7485 7490 if (status_change_start(bl,type,10000,sg->skill_lv,sg->group_id,0,0,sec, 8)) 7486 7491 { 7487 struct TimerData* td = tsc->data[type]?get_timer(tsc->data[type]->timer):NULL; 7492 struct TimerData* td = tsc->data[type]?get_timer(tsc->data[type]->timer):NULL; 7488 7493 if (td) sec = DIFF_TICK(td->tick, tick); 7489 7494 map_moveblock(bl, src->bl.x, src->bl.y, tick); … … 7556 7561 clif_skill_nodamage(&src->bl, bl, AL_HEAL, heal, 1); 7557 7562 status_heal(bl, heal, 0, 0); 7558 break; 7563 break; 7559 7564 } 7560 7565 … … 7731 7736 status_change_end(bl,type,-1); 7732 7737 break; 7733 7738 7734 7739 case UNT_SPIDERWEB: 7735 7740 { … … 7759 7764 if (sc && !sc->count) 7760 7765 sc = NULL; 7761 7766 7762 7767 type = status_skill2sc(skill_id); 7763 7768 sce = (sc && type != -1)?sc->data[type]:NULL; … … 7776 7781 case BD_ETERNALCHAOS: 7777 7782 case BD_DRUMBATTLEFIELD: 7778 case BD_RINGNIBELUNGEN: 7783 case BD_RINGNIBELUNGEN: 7779 7784 case BD_ROKISWEIL: 7780 7785 case BD_INTOABYSS: … … 7785 7790 //FIXME: This code is not perfect, it doesn't checks for the real ensemble's owner, 7786 7791 //it only checks if you are doing the same ensemble. So if there's two chars doing an ensemble 7787 //which overlaps, by stepping outside of the other parther's ensemble will cause you to cancel 7792 //which overlaps, by stepping outside of the other parther's ensemble will cause you to cancel 7788 7793 //your own. Let's pray that scenario is pretty unlikely and noone will complain too much about it. 7789 7794 skill_stop_dancing(bl); … … 7800 7805 status_change_end(bl, type, -1); 7801 7806 break; 7802 7807 7803 7808 case BA_POEMBRAGI: 7804 7809 case BA_WHISTLE: … … 7807 7812 case DC_HUMMING: 7808 7813 case DC_DONTFORGETME: 7809 case DC_FORTUNEKISS: 7814 case DC_FORTUNEKISS: 7810 7815 case DC_SERVICEFORYOU: 7811 7816 if (sce) … … 7857 7862 7858 7863 nullpo_retr(0, group); 7859 7864 7860 7865 dissonance = skill_dance_switch(unit, 0); 7861 7866 … … 7942 7947 if ((skillid != PR_BENEDICTIO && *c >=1) || *c >=2) 7943 7948 return 0; //Partner found for ensembles, or the two companions for Benedictio. [Skotlex] 7944 7949 7945 7950 if (bl == src) 7946 7951 return 0; … … 7951 7956 if (tsd->sc.data[SC_SILENCE] || tsd->sc.opt1) 7952 7957 return 0; 7953 7958 7954 7959 switch(skillid) 7955 7960 { … … 8036 8041 8037 8042 /*========================================== 8038 * 8043 * 8039 8044 *------------------------------------------*/ 8040 8045 static int skill_check_condition_mob_master_sub (struct block_list *bl, va_list ap) … … 8059 8064 8060 8065 /*========================================== 8061 * Determines if a given skill should be made to consume ammo 8066 * Determines if a given skill should be made to consume ammo 8062 8067 * when used by the player. [Skotlex] 8063 8068 *------------------------------------------*/ … … 8098 8103 sd->skillitem = sd->skillitemlv = 0; 8099 8104 //Need to do arrow state check. 8100 sd->state.arrow_atk = skill_get_ammotype(skill)?1:0; 8105 sd->state.arrow_atk = skill_get_ammotype(skill)?1:0; 8101 8106 //Need to do Spiritball check. 8102 8107 sd->spiritball_old = sd->spiritball; … … 8108 8113 if (!sc->count) 8109 8114 sc = NULL; 8110 8115 8111 8116 if(pc_is90overweight(sd)) { 8112 8117 clif_skill_fail(sd,skill,9,0); … … 8132 8137 if (sd->menuskill_id == AM_PHARMACY && 8133 8138 (skill == AM_PHARMACY || skill == AC_MAKINGARROW || skill == BS_REPAIRWEAPON || 8134 skill == AM_TWILIGHT1 || skill == AM_TWILIGHT2 || skill == AM_TWILIGHT3 8139 skill == AM_TWILIGHT1 || skill == AM_TWILIGHT2 || skill == AM_TWILIGHT3 8135 8140 )) { 8136 8141 sd->skillitem = sd->skillitemlv = 0; … … 8356 8361 } 8357 8362 break; 8358 8363 8359 8364 case TK_READYCOUNTER: 8360 8365 case TK_READYDOWN: … … 8384 8389 status_change_end(&sd->bl, SC_COMBO, -1); 8385 8390 sd->skillid_old = sd->skilllv_old = 0; 8386 return 0; //Can't repeat previous combo skill. 8391 return 0; //Can't repeat previous combo skill. 8387 8392 } 8388 8393 break; 8389 } else 8394 } else 8390 8395 if(sc->data[SC_COMBO]->val1 == skill) 8391 8396 break; //Combo ready. … … 8446 8451 } 8447 8452 break; 8453 //Weird to me. 8448 8454 case AD_FAMILIAR: //Adept Familiar [Flavio] 8449 {8450 short familiar[1] ={ pc_readglobalreg(sd, "ADEPT_FAMILIAR") };8451 int maxcount = skill_get_maxcount(skill,lv);8452 int count = 0;8453 count = mob_countslave_class(&sd->bl, 1, familiar );8454 if( count >= maxcount )8455 8455 { 8456 clif_skill_fail(sd,skill,0,0); 8457 return 0; 8458 } 8459 } 8460 break; 8456 short familiar[1] ={ pc_readglobalreg(sd, "ADEPT_FAMILIAR") }; 8457 int maxcount = skill_get_maxcount(skill,lv); 8458 int count = 0; 8459 count = mob_countslave_class(&sd->bl, 1, familiar ); 8460 if( count >= maxcount ) 8461 { 8462 clif_skill_fail(sd,skill,0,0); 8463 return 0; 8464 } 8465 } 8466 break; 8461 8467 case NC_SKELETON: // Raise Skeleton [Brain] 8462 8468 case NC_ARCHER: // Raise Archer Skeleton … … 8466 8472 case NC_SHADOW: // Raise Shadow 8467 8473 case NC_WRAITH: // Raise Wraith 8468 {// corrigido o limite de spawns [Flavio] 8469 short summon1[5]={ 3201, 3202, 3203, 3204, 3205 }; // Skeleton, Orc Skeleton, Soldier Skeleton, Pirate Skeleton, Skeleton General 8470 short summon2[5]={ 3206, 3207, 3208, 3209, 3210 }; // Archer Skeleton, Firelock Soldier 8471 short summon3[5]={ 3211, 3212, 3213, 3214, 3215 }; // Zombie, Ghoul, Zombie Master 8472 short summon4[5]={ 3216, 3217, 3218, 3219, 3220 }; // Mummy, Ancient Mummy 8473 short summon5[5]={ 3221, 3222, 3223, 3224, 3225 }; // Whisper, Nightmare, Nightmare Terror 8474 short summon6[5]={ 3226, 3227, 3228, 3229, 3230 }; // Injustice, Raydric, Dullahan 8475 short summon7[5]={ 3231, 3232, 3233, 3234, 3235 }; // Wraith, Wraith Dead 8476 int maxcount = skill_get_maxcount(skill,lv); 8477 int count = 0; 8478 switch( skill ) 8479 { 8480 case NC_SKELETON: count = mob_countslave_class(&sd->bl, 5, summon1); break; 8481 case NC_ARCHER: count = mob_countslave_class(&sd->bl, 5, summon2); break; 8482 case NC_ZOMBIE: count = mob_countslave_class(&sd->bl, 5, summon3); break; 8483 case NC_MUMMY: count = mob_countslave_class(&sd->bl, 5, summon4); break; 8484 case NC_GHOST: count = mob_countslave_class(&sd->bl, 5, summon5); break; 8485 case NC_SHADOW: count = mob_countslave_class(&sd->bl, 5, summon6); break; 8486 case NC_WRAITH: count = mob_countslave_class(&sd->bl, 5, summon7); break; 8487 } 8488 if( count >= maxcount ) 8489 { 8490 clif_skill_fail(sd,skill,0,0); 8491 return 0; 8492 } 8493 } 8494 break; 8495 8474 {// corrigido o limite de spawns [Flavio] 8475 short summon1[5]={ 3201, 3202, 3203, 3204, 3205 }; // Skeleton, Orc Skeleton, Soldier Skeleton, Pirate Skeleton, Skeleton General 8476 short summon2[5]={ 3206, 3207, 3208, 3209, 3210 }; // Archer Skeleton, Firelock Soldier 8477 short summon3[5]={ 3211, 3212, 3213, 3214, 3215 }; // Zombie, Ghoul, Zombie Master 8478 short summon4[5]={ 3216, 3217, 3218, 3219, 3220 }; // Mummy, Ancient Mummy 8479 short summon5[5]={ 3221, 3222, 3223, 3224, 3225 }; // Whisper, Nightmare, Nightmare Terror 8480 short summon6[5]={ 3226, 3227, 3228, 3229, 3230 }; // Injustice, Raydric, Dullahan 8481 short summon7[5]={ 3231, 3232, 3233, 3234, 3235 }; // Wraith, Wraith Dead 8482 int maxcount = skill_get_maxcount(skill,lv); 8483 int count = 0; 8484 switch( skill ) 8485 { 8486 case NC_SKELETON: count = mob_countslave_class(&sd->bl, 5, summon1); break; 8487 case NC_ARCHER: count = mob_countslave_class(&sd->bl, 5, summon2); break; 8488 case NC_ZOMBIE: count = mob_countslave_class(&sd->bl, 5, summon3); break; 8489 case NC_MUMMY: count = mob_countslave_class(&sd->bl, 5, summon4); break; 8490 case NC_GHOST: count = mob_countslave_class(&sd->bl, 5, summon5); break; 8491 case NC_SHADOW: count = mob_countslave_class(&sd->bl, 5, summon6); break; 8492 case NC_WRAITH: count = mob_countslave_class(&sd->bl, 5, summon7); break; 8493 } 8494 if( count >= maxcount ) 8495 { 8496 clif_skill_fail(sd,skill,0,0); 8497 return 0; 8498 } 8499 } 8500 break; 8496 8501 case WZ_FIREPILLAR: // celest 8497 8502 if (lv <= 5) // no gems required at level 1-5 … … 8502 8507 if(!(sc && sc->data[SC_SMA])) 8503 8508 return 0; 8504 break; 8509 break; 8505 8510 8506 8511 case HT_POWER: … … 8554 8559 clif_skill_fail(sd,skill,0,0); 8555 8560 return 0; 8556 } 8561 } 8557 8562 } 8558 8563 } … … 8606 8611 //Only invoke on skill begin cast (instant cast skill). [Kevin] 8607 8612 if(sp>0 && !type) 8608 { 8613 { 8609 8614 if (status->sp < (unsigned int)sp) 8610 8615 clif_skill_fail(sd,skill,1,0); … … 8632 8637 } 8633 8638 break; 8634 8639 8635 8640 case NJ_ISSEN: 8636 8641 if (status->hp < 2) { … … 8644 8649 } 8645 8650 break; 8646 8651 8647 8652 case NJ_ZENYNAGE: 8648 8653 if(sd->status.zeny < zeny) { … … 8686 8691 return 0; 8687 8692 } 8688 8693 8689 8694 if(weapon && !pc_check_weapontype(sd,weapon)) { 8690 8695 clif_skill_fail(sd,skill,6,0); … … 8782 8787 if (sc && sc->data[SC_COMBO] && sc->data[SC_COMBO]->val1 == skill) 8783 8788 sd->ud.canmove_tick = gettick(); //When using a combo, cancel the can't move delay to enable the skill. [Skotlex] 8784 8789 8785 8790 if (!unit_can_move(&sd->bl)) { 8786 8791 clif_skill_fail(sd,skill,0,0); … … 8873 8878 int skill_castfix (struct block_list *bl, int skill_id, int skill_lv) 8874 8879 { 8875 int time = skill_get_cast(skill_id, skill_lv); 8880 int time = skill_get_cast(skill_id, skill_lv); 8876 8881 struct map_session_data *sd; 8877 8882 8878 8883 nullpo_retr(0, bl); 8879 8884 sd = BL_CAST(BL_PC, bl); 8880 8885 8881 8886 // calculate base cast time (reduced by dex) 8882 8887 if (!(skill_get_castnodex(skill_id, skill_lv)&1)) { … … 8926 8931 status_change_end(bl, SC_SUFFRAGIUM, -1); 8927 8932 } 8928 if (sc->data[SC_DECREPIFY]) // Necro Decrepify [Brain] 8929 if (sc->data[SC_DECREPIFY]->val2>=3)8930 time += time * 25/100; //+25% cast time8931 if (sc->data[SC_CURSETONGUES]) { //Warlock Curse of Tongues [Brain]8932 time += time * sc->data[SC_CURSETONGUES]->val2 / 100;8933 status_change_end(bl, SC_CURSETONGUES, -1);8934 }8935 8933 //Curse skills... 8934 if (sc->data[SC_DECREPIFY]) // Necro Decrepify [Brain] 8935 if(sc->data[SC_DECREPIFY]->val2>=3) 8936 time += time * 25/100; //+25% cast time 8937 if (sc->data[SC_CURSETONGUES]) { //Warlock Curse of Tongues [Brain] 8938 time += time * sc->data[SC_CURSETONGUES]->val2 / 100; 8939 status_change_end(bl, SC_CURSETONGUES, -1); 8940 } 8936 8941 if (sc->data[SC_MEMORIZE]) { 8937 8942 time>>=1; … … 8952 8957 int delaynodex = skill_get_delaynodex(skill_id, skill_lv); 8953 8958 int time = skill_get_delay(skill_id, skill_lv); 8954 8959 8955 8960 nullpo_retr(0, bl); 8956 8961 … … 8959 8964 8960 8965 if (bl->type&battle_config.no_skill_delay) 8961 return battle_config.min_skill_delay_limit; 8966 return battle_config.min_skill_delay_limit; 8962 8967 8963 8968 if (time < 0) … … 8976 8981 default: 8977 8982 if (battle_config.delay_dependon_dex && !(delaynodex&1)) 8978 { // if skill delay is allowed to be reduced by dex 8983 { // if skill delay is allowed to be reduced by dex 8979 8984 int scale = battle_config.castrate_dex_scale - status_get_dex(bl); 8980 8985 if (scale > 0) … … 8984 8989 } 8985 8990 if (battle_config.delay_dependon_agi && !(delaynodex&1)) 8986 { // if skill delay is allowed to be reduced by agi 8991 { // if skill delay is allowed to be reduced by agi 8987 8992 int scale = battle_config.castrate_dex_scale - status_get_agi(bl); 8988 8993 if (scale > 0) … … 9028 9033 9029 9034 /*========================================= 9030 * 9035 * 9031 9036 *-----------------------------------------*/ 9032 9037 void skill_brandishspear_first (struct square *tc, int dir, int x, int y) … … 9552 9557 return count; 9553 9558 } 9554 9559 9555 9560 /*========================================== 9556 9561 * Returns the first element field found [Skotlex] … … 9706 9711 9707 9712 /*========================================== 9708 * 9713 * 9709 9714 *------------------------------------------*/ 9710 9715 int skill_chastle_mob_changetarget(struct block_list *bl,va_list ap) … … 9739 9744 unit = (struct skill_unit *)src; 9740 9745 tick = va_arg(ap,int); 9741 9746 9742 9747 nullpo_retr(0, sg = unit->group); 9743 9748 nullpo_retr(0, ss = map_id2bl(sg->src_id)); … … 9749 9754 case UNT_SHOCKWAVE: 9750 9755 case UNT_SANDMAN: 9751 case UNT_FLASHER: 9756 case UNT_FLASHER: 9752 9757 skill_additional_effect(ss,bl,sg->skill_id,sg->skill_lv,BF_MISC,tick); 9753 9758 break; … … 9795 9800 if (type != scs[i] && sc->data[scs[i]]) 9796 9801 status_change_end(bl, scs[i], -1); 9797 9802 9798 9803 return 0; 9799 9804 } … … 9813 9818 wall = false; 9814 9819 } 9815 9820 9816 9821 if( sce ) 9817 9822 { … … 9856 9861 if(!sc->count || !(sce=sc->data[SC_DANCING])) 9857 9862 return; 9858 9863 9859 9864 group = (struct skill_unit_group *)sce->val2; 9860 9865 sce->val2 = 0; 9861 9866 9862 9867 if (sce->val4) 9863 9868 { … … 9993 9998 nullpo_retr(NULL, src); 9994 9999 nullpo_retr(NULL, ud); 9995 10000 9996 10001 // find a free spot to store the new unit group 9997 10002 ARR_FIND( 0, MAX_SKILLUNITGROUP, i, ud->skillunit[i] == NULL ); … … 10053 10058 10054 10059 if (!src) src=map_id2bl(group->src_id); 10055 ud = unit_bl2ud(src); 10060 ud = unit_bl2ud(src); 10056 10061 if(!src || !ud) { 10057 10062 ShowError("skill_delunitgroup: Group's source not found! (src_id: %d skill_id: %d)\n", group->src_id, group->skill_id); 10058 return 0; 10063 return 0; 10059 10064 } 10060 10065 if (skill_get_unit_flag(group->skill_id)&(UF_DANCE|UF_SONG|UF_ENSEMBLE)) … … 10152 10157 if (group->interval==-1) 10153 10158 return NULL; 10154 10159 10155 10160 ud = unit_bl2ud(bl); 10156 10161 if (!ud) return NULL; … … 10394 10399 int skill_id; 10395 10400 int i; 10396 10401 10397 10402 nullpo_retr(0, group); 10398 10403 10399 10404 if( !unit->alive || target->prev == NULL ) 10400 10405 return 0; … … 10475 10480 //cells do not get deleted within them. [Skotlex] 10476 10481 if( dissonance ) skill_dance_switch(unit, 1); 10477 10482 10478 10483 if( flag&4 ) 10479 10484 skill_unit_onleft(skill_id,target,tick); … … 10502 10507 memset(skill_unit_temp, 0, sizeof(skill_unit_temp)); 10503 10508 } 10504 10509 10505 10510 map_foreachincell(skill_unit_move_sub,bl->m,bl->x,bl->y,BL_SKILL,bl,tick,flag); 10506 10511 … … 10680 10685 if (qty < 1) 10681 10686 qty = 1; 10682 10687 10683 10688 if (!skill_id) //A skill can be specified for some override cases. 10684 10689 skill_id = skill_produce_db[idx].req_skill; 10685 10690 10686 10691 slot[0]=slot1; 10687 10692 slot[1]=slot2; … … 10761 10766 case AM_TWILIGHT2: 10762 10767 case AM_TWILIGHT3: 10763 make_per = pc_checkskill(sd,AM_LEARNINGPOTION)* 10010768 make_per = pc_checkskill(sd,AM_LEARNINGPOTION)*50 10764 10769 + pc_checkskill(sd,AM_PHARMACY)*300 + sd->status.job_level*20 10765 + status->int_*5 + status->dex*10+status->luk*10; 10770 + (status->int_/2)*10 + status->dex*10+status->luk*10; 10771 if(merc_is_hom_active(sd->hd)) {//Player got a homun 10772 int skill; 10773 if((skill=merc_hom_checkskill(sd->hd,HVAN_INSTRUCT)) > 0) //His homun is a vanil with instruction change 10774 make_per += skill*100; //+1% bonus per level 10775 } 10766 10776 switch(nameid){ 10767 10777 case 501: // Red Potion 10768 10778 case 503: // Yellow Potion 10769 10779 case 504: // White Potion 10770 case 605: // Anodyne 10771 case 606: // Aloevera 10772 make_per += 2000; 10780 make_per += (1+rand()%100)*10 + 2000; 10773 10781 break; 10774 case 505: // Blue Potion 10775 make_per -= 500; 10776 break; 10777 case 545: // Condensed Red Potion 10778 case 546: // Condensed Yellow Potion 10779 case 547: // Condensed White Potion 10780 make_per -= 1000; 10781 break; 10782 case 970: // Alcohol 10783 make_per += 1000; 10784 break; 10785 case 7139: // Glistening Coat 10786 make_per -= 1000; 10782 case 970: // Alcohol 10783 make_per += (1+rand()%100)*10 + 1000; 10787 10784 break; 10788 10785 case 7135: // Bottle Grenade … … 10790 10787 case 7137: // Plant Bottle 10791 10788 case 7138: // Marine Sphere Bottle 10789 make_per += (1+rand()%100)*10; 10790 break; 10791 case 546: // Condensed Yellow Potion 10792 make_per -= (1+rand()%50)*10; 10793 break; 10794 case 547: // Condensed White Potion 10795 case 7139: // Glistening Coat 10796 make_per -= (1+rand()%100)*10; 10797 break; 10798 //Common items, recieve no bonus or penalty, listed just because they are commonly produced 10799 case 505: // Blue Potion 10800 case 545: // Condensed Red Potion 10801 case 605: // Anodyne 10802 case 606: // Aloevera 10792 10803 default: 10793 10804 break; … … 10827 10838 // - Baby Class Penalty = 80% (from adult's chance) ----// 10828 10839 if (sd->class_&JOBL_BABY) //if it's a Baby Class 10829 make_per = (make_per * 80) / 100; //Lupus10840 make_per = (make_per * 70) / 100; //Baby penalty is 30% 10830 10841 10831 10842 if(make_per < 1) make_per = 1; 10832 10843 10833 10844 10834 10845 if(rand()%10000 < make_per || qty > 1){ //Success, or crafting multiple items. 10835 10846 struct item tmp_item; … … 10902 10913 skill_id != AM_TWILIGHT2 && 10903 10914 skill_id != AM_TWILIGHT3) 10904 continue; 10915 continue; 10905 10916 //Add fame as needed. 10906 10917 switch(++sd->potion_success_counter) { … … 10955 10966 } 10956 10967 } 10957 //Failure 10968 //Failure 10958 10969 // if(log_config.produce) 10959 10970 // log_produce(sd,nameid,slot1,slot2,slot3,0); … … 11041 11052 return 0; 11042 11053 if (sd) sd->blockskill[data] = 0; 11043 11054 11044 11055 return 1; 11045 11056 } … … 11068 11079 return 0; 11069 11080 if (hd) hd->blockskill[data] = 0; 11070 11081 11071 11082 return 1; 11072 11083 } … … 11075 11086 { 11076 11087 nullpo_retr (-1, hd); 11077 11088 11078 11089 skillid = skill_get_index(skillid); 11079 11090 if (skillid == 0) … … 11135 11146 if ((val[j]-val[j-step]) != diff) 11136 11147 break; 11137 11148 11138 11149 if (j>=step) //No match, try next step. 11139 11150 continue; 11140 11151 11141 11152 for(; i < MAX_SKILL_LEVEL; i++) 11142 11153 { //Apply linear increase … … 11335 11346 memcpy(skill_unit_layout[pos].dy,dy,sizeof(dy)); 11336 11347 } else { 11337 int dx[] = { 1, 1 ,0, 0,-1}; 11338 int dy[] = { 1, 0, 0,-1,-1}; 11348 int dx[] = { 1, 1 ,0, 0,-1}; 11349 int dy[] = { 1, 0, 0,-1,-1}; 11339 11350 memcpy(skill_unit_layout[pos].dx,dx,sizeof(dx)); 11340 11351 memcpy(skill_unit_layout[pos].dy,dy,sizeof(dy)); … … 11366 11377 memcpy(skill_unit_layout[pos].dy,dy,sizeof(dy)); 11367 11378 } else { 11368 int dx[] = { 2, 1 ,0,-1,-2}; 11369 int dy[] = { 2, 1, 0,-1,-2}; 11379 int dx[] = { 2, 1 ,0,-1,-2}; 11380 int dy[] = { 2, 1, 0,-1,-2}; 11370 11381 memcpy(skill_unit_layout[pos].dx,dx,sizeof(dx)); 11371 11382 memcpy(skill_unit_layout[pos].dy,dy,sizeof(dy)); … … 11396 11407 * skill_nocast_db.txt 11397 11408 * skill_unit_db.txt 11398 * produce_db.txt 11409 * produce_db.txt 11399 11410 * create_arrow_db.txt 11400 11411 * abra_db.txt … … 11465 11476 skill_split_atoi(split[5],skill_db[i].sp_rate); 11466 11477 skill_split_atoi(split[6],skill_db[i].zeny); 11467 11478 11468 11479 //FIXME: document this 11469 11480 p = split[7]; … … 11483 11494 p++; 11484 11495 } 11485 11496 11486 11497 //FIXME: document this 11487 11498 p = split[8]; … … 11517 11528 else if( strcmpi(split[10],"water")==0 ) skill_db[i].state = ST_WATER; 11518 11529 else skill_db[i].state = ST_NONE; 11519 11530 11520 11531 skill_split_atoi(split[11],skill_db[i].spiritball); 11521 11532 for( j = 0; j < 10; j++ ) { … … 11533 11544 if( !i ) // invalid skill id 11534 11545 return false; 11535 11546 11536 11547 skill_split_atoi(split[1],skill_db[i].cast); 11537 11548 skill_split_atoi(split[2],skill_db[i].delay); … … 11549 11560 if( !i ) // invalid skill id 11550 11561 return false; 11551 11562 11552 11563 skill_split_atoi(split[1],skill_db[i].castnodex); 11553 11564 if( split[2] ) // optional column … … 11575 11586 if( !i ) // invalid skill id 11576 11587 return false; 11577 11588 11578 11589 skill_db[i].unit_id[0] = strtol(split[1],NULL,16); 11579 11590 skill_db[i].unit_id[1] = strtol(split[2],NULL,16); … … 11621 11632 skill_produce_db[current].req_skill = atoi(split[2]); 11622 11633 skill_produce_db[current].req_skill_lv = atoi(split[3]); 11623 11634 11624 11635 for( x = 4, y = 0; x+1 < columns && split[x] && split[x+1] && y < MAX_PRODUCE_RESOURCE; x += 2, y++ ) 11625 11636 { … … 11640 11651 11641 11652 skill_arrow_db[current].nameid = i; 11642 11653 11643 11654 for( x = 1, y = 0; x+1 < columns && split[x] && split[x+1] && y < MAX_ARROW_RESOURCE; x += 2, y++ ) 11644 11655 { … … 11679 11690 memset(skill_arrow_db,0,sizeof(skill_arrow_db)); 11680 11691 memset(skill_abra_db,0,sizeof(skill_abra_db)); 11681 11692 11682 11693 // load skill databases 11683 11694 safestrncpy(skill_db[0].name, "UNKNOWN_SKILL", sizeof(skill_db[0].name)); … … 11707 11718 skilldb_name2id = strdb_alloc(DB_OPT_DUP_KEY, 0); 11708 11719 skill_readdb(); 11709 11720 11710 11721 skill_unit_ers = ers_new(sizeof(struct skill_unit_group)); 11711 11722 skill_timer_ers = ers_new(sizeof(struct skill_timerskill)); 11712 11723 11713 11724 add_timer_func_list(skill_unit_timer,"skill_unit_timer"); 11714 11725 add_timer_func_list(skill_castend_id,"skill_castend_id"); … … 11716 11727 add_timer_func_list(skill_timerskill,"skill_timerskill"); 11717 11728 add_timer_func_list(skill_blockpc_end, "skill_blockpc_end"); 11718 11729 11719 11730 add_timer_interval(gettick()+SKILLUNITTIMER_INTERVAL,skill_unit_timer,0,0,SKILLUNITTIMER_INTERVAL); 11720 11731 … … 11729 11740 return 0; 11730 11741 } 11731 11742 //Why is this after the cleanup code? 11732 11743 int skill_additem(struct block_list* src, struct block_list *bl, int itemid, int amount)// ITEM GIVER [Brain] 11733 11744 { … … 11735 11746 11736 11747 nullpo_retr(1, src); 11737 nullpo_retr(1, bl); 11748 nullpo_retr(1, bl); 11738 11749 11739 11750 if (src->m != bl->m) 11740 return 1;11751 return 1; 11741 11752 if (bl->prev == NULL) 11742 return 1;11753 return 1; 11743 11754 if (src->type == BL_PC) 11744 sd = (struct map_session_data *)src;11755 sd = (struct map_session_data *)src; 11745 11756 if (bl->type == BL_PC) 11746 tsd = (struct map_session_data *)bl;11757 tsd = (struct map_session_data *)bl; 11747 11758 if (status_isdead(bl)) 11748 return 1;11759 return 1; 11749 11760 11750 11761 int eflag; 11751 11762 struct item item_tmp; 11752 11763 struct block_list tbl; 11753 11764 11754 11765 memset(&item_tmp,0,sizeof(item_tmp)); 11755 11766 memset(&tbl,0,sizeof(tbl)); … … 11762 11773 eflag = pc_additem(sd,&item_tmp,amount); 11763 11774 if(eflag) { 11764 clif_additem(sd,0,0,eflag);11765 map_addflooritem(&item_tmp,amount,sd->bl.m,sd->bl.x,sd->bl.y,0,0,0,0);11775 clif_additem(sd,0,0,eflag); 11776 map_addflooritem(&item_tmp,amount,sd->bl.m,sd->bl.x,sd->bl.y,0,0,0,0); 11766 11777 } 11767 11778 return 0;