- Timestamp:
- 07/02/08 12:20:18 (17 years ago)
- Location:
- src/map
- Files:
-
- 14 modified
Legend:
- Unmodified
- Added
- Removed
-
src/map/atcommand.c
r5 r19 1213 1213 if (sd->disguise) 1214 1214 status_set_viewdata(&sd->bl, sd->disguise); 1215 else 1216 clif_specialeffect(&sd->bl, 587, 1); // [Temperis] 1217 clif_specialeffect(&sd->bl, 589, 1); // [Temperis] 1218 status_set_viewdata(&sd->bl, sd->status.class_); 1219 clif_displaymessage(fd, msg_txt(10)); // Invisible: Off 1215 else 1216 status_set_viewdata(&sd->bl, sd->status.class_); 1217 clif_displaymessage(fd, msg_txt(10)); // Invisible: Off 1220 1218 } else { 1221 clif_specialeffect(&sd->bl, 587, 1); // [Temperis] 1222 clif_specialeffect(&sd->bl, 589, 1); // [Temperis] 1223 sd->sc.option |= OPTION_INVISIBLE; 1224 sd->vd.class_ = INVISIBLE_CLASS; 1225 clif_displaymessage(fd, msg_txt(11)); // Invisible: On 1219 sd->sc.option |= OPTION_INVISIBLE; 1220 sd->vd.class_ = INVISIBLE_CLASS; 1221 clif_displaymessage(fd, msg_txt(11)); // Invisible: On 1226 1222 } 1227 1223 clif_changeoption(&sd->bl); … … 1267 1263 { "supernovice", 23 }, 1268 1264 { "gunslinger", 24 }, 1269 { "gunner", 24 },1270 { "ninja", 25 },1271 //Begin custom Job (blackmagic)1272 1265 { "adept", 30 },//New job classes [Brainstorm] 1273 1266 { "necromancer", 31 }, 1274 1267 { "necro", 31 }, 1275 1268 { "warlock", 32 }, 1276 //End Custom Job 1269 { "gunner", 24 }, 1270 { "ninja", 25 }, 1277 1271 { "high novice", 4001 }, 1278 1272 { "swordsman high", 4002 }, … … 4378 4372 if (map[m_id].flag.guildlock) 4379 4373 strcat(atcmd_output, "GuildLock | "); 4380 if (map[m_id].flag.hostile)4381 strcat(atcmd_output, "Hostile | ");4382 4374 clif_displaymessage(fd, atcmd_output); 4383 4375 … … 7822 7814 return 0; 7823 7815 } 7824 //Begin Custom Jobs (black magic)7825 7816 //@showsummon [Brainstorm] 7826 7817 int atcommand_showsummon(const int fd, struct map_session_data* sd, const char* command, const char* message) … … 7833 7824 7834 7825 sd->state.showsummon = 1; 7835 clif_displaymessage(fd, "Summon Stats is now shown."); 7836 return 0; 7837 } 7838 //End Custom Jobs 7826 clif_displaymessage(fd, "Summon Stats are now shown."); 7827 return 0; 7828 } 7829 7830 7839 7831 /*========================================== 7840 7832 * Barricade Build … … 8304 8296 } 8305 8297 8306 /*==========================================8307 * @alliance by SketchyPhoenix8308 *------------------------------------------*/8309 int atcommand_god(const int fd, struct map_session_data* sd, const char* command, const char* message)8310 {8311 nullpo_retr(-1, sd);8312 8313 if(sd->state.demon) {8314 clif_displaymessage(fd, "You're tainted, you cannot change your ways.");8315 return 0;8316 }8317 8318 sd->state.god = !sd->state.god;8319 8320 if(sd->state.god)8321 clif_displaymessage(fd, "You have joined the holy union.");8322 else {8323 clif_displaymessage(fd, "You have become tainted.");8324 map_foreachinrange(atcommand_stopattack,&sd->bl, AREA_SIZE, BL_CHAR, sd->bl.id);8325 }8326 return 0;8327 }8328 8329 /*==========================================8330 * @horde by SketchyPhoenix8331 *------------------------------------------*/8332 int atcommand_demon(const int fd, struct map_session_data* sd, const char* command, const char* message)8333 {8334 nullpo_retr(-1, sd);8335 8336 if(sd->state.god) {8337 clif_displaymessage(fd, "You are of the light, darkness cannot consume you.");8338 return 0;8339 }8340 sd->state.demon = !sd->state.demon;8341 8342 if(sd->state.demon)8343 clif_displaymessage(fd, "Your sould is consumed by the darkness, you've gained demonic power.");8344 else {8345 clif_displaymessage(fd, "You have repented, the darkness has left your soul.");8346 map_foreachinrange(atcommand_stopattack,&sd->bl, AREA_SIZE, BL_CHAR, sd->bl.id);8347 }8348 return 0;8349 }8350 8298 /*========================================== 8351 8299 * atcommand_info[] structure definition … … 8643 8591 { "barricade", 60, atcommand_barricade }, 8644 8592 { "killbarricade", 60, atcommand_barricade_destroy }, 8645 //Bwgin Custom Jobs (blackmagic)8646 8593 //Vanaheim Commands 8647 8594 { "showsummon", 0, atcommand_showsummon}, //Brainstorm 8648 //End Custom Jobs8649 { "god", 60, atcommand_god },8650 { "demon", 60, atcommand_demon },8651 8595 }; 8652 8596 -
src/map/battle.c
r5 r19 73 73 return 1; 74 74 } 75 return 0; 75 return 0; 76 76 } 77 77 … … 123 123 return 1; 124 124 } 125 return 0; 125 return 0; 126 126 } 127 127 … … 138 138 } 139 139 140 // _ E?[WÌx140 // _??[WÌx 141 141 struct delay_damage { 142 142 struct block_list *src; … … 205 205 amotion = 1000; //Aegis places a damage-delay cap of 1 sec to non player attacks. [Skotlex] 206 206 add_timer(tick+amotion, battle_delay_damage_sub, src->id, (int)dat); 207 207 208 208 return 0; 209 209 } … … 211 211 int battle_attr_ratio(int atk_elem,int def_type, int def_lv) 212 212 { 213 213 214 214 if (atk_elem < 0 || atk_elem >= ELE_MAX) 215 215 return 100; … … 222 222 223 223 /*========================================== 224 * Does attribute fix modifiers. 224 * Does attribute fix modifiers. 225 225 * Added passing of the chars so that the status changes can affect it. [Skotlex] 226 226 * Note: Passing src/target == NULL is perfectly valid, it skips SC_ checks. … … 230 230 struct status_change *sc=NULL, *tsc=NULL; 231 231 int ratio; 232 232 233 233 if (src) sc = status_get_sc(src); 234 234 if (target) tsc = status_get_sc(target); 235 235 236 236 if (atk_elem < 0 || atk_elem >= ELE_MAX) 237 237 atk_elem = rand()%ELE_MAX; … … 265 265 266 266 /*========================================== 267 * _ E?[W?Å?IvZ267 * _??[W?Å?IvZ 268 268 *------------------------------------------*/ 269 269 int battle_calc_damage(struct block_list *src,struct block_list *bl,int damage,int div_,int skill_num,int skill_lv,int flag) … … 277 277 if (!damage) 278 278 return 0; 279 279 280 280 if( mob_ksprotected(src, bl) ) 281 281 return 0; … … 295 295 if(!damage) return 0; 296 296 } 297 297 298 298 if (skill_num == PA_PRESSURE) 299 299 return damage; //This skill bypass everything else. … … 344 344 return 0; 345 345 } 346 346 347 347 if(sc->data[SC_DODGE] && !sc->opt1 && 348 348 (flag&BF_LONG || sc->data[SC_SPURT]) … … 373 373 } 374 374 375 //Begin Custom Jobs (blackmagic)376 377 375 //Display red flashing aura effect of Adept Blood Lust [Brain] 378 376 if(sc->data[SC_LUST] && damage > 0){ … … 398 396 return 0; 399 397 } 400 //End Custom Jobs 398 401 399 402 400 if (((sce=sc->data[SC_UTSUSEMI]) || sc->data[SC_BUNSINJYUTSU]) 403 && 401 && 404 402 flag&BF_WEAPON && !(skill_get_nk(skill_num)&NK_NO_CARDFIX_ATK)) 405 403 { … … 503 501 } 504 502 //SC effects from caster side. Currently none. 505 /* 503 /* 506 504 sc = status_get_sc(src); 507 505 if (sc && sc->count) { 508 506 } 509 */ 507 */ 510 508 if (battle_config.pk_mode && sd && bl->type == BL_PC && damage) 511 509 { … … 555 553 if (!damage) //No reductions to make. 556 554 return 0; 557 555 558 556 class_ = status_get_class(bl); 559 557 560 558 if (bl->type == BL_MOB) 561 559 md=(struct mob_data *)bl; 562 560 563 561 if(md && md->guardian_data) { 564 562 if(class_ == MOBID_EMPERIUM && flag&BF_SKILL) … … 630 628 631 629 /*========================================== 632 * ?Cû_ E?[W630 * ?Cû_??[W 633 631 *------------------------------------------*/ 634 632 int battle_addmastery(struct map_session_data *sd,struct block_list *target,int dmg,int type) … … 651 649 damage += sd->status.str; 652 650 } 653 //Begin Custom Jobs (blackmagic) 651 654 652 //Warlock Touch of Corruption (Mage-Monster Killer passive skill) [Brainstorm] 655 653 if((skill = pc_checkskill(sd,WL_CORRUPTION)) > 0 && target->type==BL_MOB ) 656 654 damage += (skill * (status->int_/10)); 657 //end custom job658 655 659 656 if(type == 0) … … 740 737 { //Mobs/Pets 741 738 if(flag&4) 742 { 739 { 743 740 atkmin = status->matk_min; 744 741 atkmax = status->matk_max; … … 756 753 { //Normal attacks 757 754 atkmin = status->dex; 758 755 759 756 if (sd->equip_index[type] >= 0 && sd->inventory_data[sd->equip_index[type]]) 760 757 atkmin = atkmin*(80 + sd->inventory_data[sd->equip_index[type]]->wlv*20)/100; … … 762 759 if (atkmin > atkmax) 763 760 atkmin = atkmax; 764 761 765 762 if(flag&2 && !(flag&16)) 766 763 { //Bows … … 771 768 } 772 769 } 773 770 774 771 if (sc && sc->data[SC_MAXIMIZEPOWER]) 775 772 atkmin = atkmax; 776 773 777 774 //Weapon Damage calculation 778 775 if (!(flag&1)) 779 776 damage = (atkmax>atkmin? rand()%(atkmax-atkmin):0)+atkmin; 780 else 777 else 781 778 damage = atkmax; 782 779 783 780 if (sd) 784 781 { … … 793 790 sd->right_weapon.atkmods[t_size])/100; 794 791 } 795 792 796 793 //Finally, add baseatk 797 794 if(flag&4) … … 799 796 else 800 797 damage += status->batk; 801 798 802 799 //rodatazone says that Overrefine bonuses are part of baseatk 803 800 //Here we also apply the weapon_atk_rate bonus so it is correctly applied on left/right hands. … … 826 823 if (!battle_config.arrow_decrement) 827 824 return; 828 825 829 826 if (skill) 830 827 { … … 894 891 unsigned idef2 : 1; //Ignore defense (left weapon) 895 892 unsigned pdef : 2; //Pierces defense (Investigate/Ice Pick) 896 unsigned pdef2 : 2; //1: Use def+def2/100, 2: Use def+def2/50 893 unsigned pdef2 : 2; //1: Use def+def2/100, 2: Use def+def2/50 897 894 unsigned infdef : 1; //Infinite defense (plants) 898 895 unsigned arrow : 1; //Attack is arrow-based … … 900 897 unsigned lh : 1; //Attack considers left hand (wd.damage2) 901 898 unsigned weapon : 1; //It's a weapon attack (consider VVS, and all that) 902 } flag; 899 } flag; 903 900 904 901 memset(&wd,0,sizeof(wd)); … … 947 944 ) 948 945 flag.arrow = 1; 949 946 950 947 if(skill_num){ 951 948 wd.flag |= battle_range_type(src, target, skill_num, skill_lv); … … 978 975 wd.type = 0x08; 979 976 break; 980 977 981 978 case GS_GROUNDDRIFT: 982 979 case KN_SPEARSTAB: … … 997 994 } else //Range for normal attacks. 998 995 wd.flag |= flag.arrow?BF_LONG:BF_SHORT; 999 996 1000 997 if (!skill_num && tstatus->flee2 && rand()%1000 < tstatus->flee2) 1001 998 { //Check for Lucky Dodge … … 1049 1046 //Therefore, we use the old value 3 on cases when an sd gets attacked by a mob 1050 1047 cri -= tstatus->luk*(!sd&&tsd?3:2); 1051 1048 1052 1049 if(tsc) 1053 1050 { … … 1117 1114 if(battle_config.agi_penalty_type && 1118 1115 battle_config.agi_penalty_target&target->type) 1119 { 1116 { 1120 1117 unsigned char attacker_count; //256 max targets should be a sane max 1121 1118 attacker_count = unit_counttargeted(target,battle_config.agi_penalty_count_lv); … … 1175 1172 hitrate += hitrate * ( 2 * skill ) / 100; 1176 1173 1177 hitrate = cap_value(hitrate, battle_config.min_hitrate, battle_config.max_hitrate); 1174 hitrate = cap_value(hitrate, battle_config.min_hitrate, battle_config.max_hitrate); 1178 1175 1179 1176 if(rand()%100 >= hitrate) … … 1326 1323 ) 1327 1324 skillratio += sd->random_attack_increase_add; 1328 1325 1329 1326 ATK_RATE(skillratio); 1330 1327 } else { //Skills 1331 1328 switch( skill_num ) 1332 1329 { 1333 //Begin Custom Job (blackmagic)1334 1330 case NC_DEATHHAND: // Necro Death Hand [Brain] 1335 skillratio += -25+25*skill_lv; 1336 break; 1337 //End Black Magic Custom Jobs 1331 skillratio += -25+25*skill_lv; 1332 break; 1338 1333 case SM_BASH: 1339 1334 skillratio += 30*skill_lv; 1340 1335 break; 1341 1336 case SM_MAGNUM: 1342 skillratio += 20*skill_lv; 1337 skillratio += 20*skill_lv; 1343 1338 break; 1344 1339 case MC_MAMMONITE: … … 1597 1592 int k = (wflag-1)/3; //+100% every 3 cells of distance 1598 1593 if( k > 2 ) k = 2; // ...but hard-limited to 300%. 1599 skillratio += 100 * k; 1594 skillratio += 100 * k; 1600 1595 } 1601 1596 break; … … 1612 1607 skillratio += 100 *(skill_lv-1); 1613 1608 break; 1614 //Begin Custom Jobs (blackmagic) 1615 //Mercenary Skills [Brainstorm] 1616 case MS_BASH: 1617 skillratio += 30*skill_lv; 1618 break; 1619 case MER_CRASH: 1620 skillratio += 10*skill_lv; 1621 break; 1622 //end custom jobs 1609 /*Mercenary Skills [Brainstorm] 1610 case MS_BASH: 1611 skillratio += 30*skill_lv; 1612 break; 1613 case MER_CRASH: 1614 skillratio += 10*skill_lv; 1615 break;*/ 1623 1616 } 1624 1617 … … 1682 1675 break; 1683 1676 } 1684 1677 1685 1678 if(sd) 1686 1679 { … … 1754 1747 if(def2 < 1) def2 = 1; 1755 1748 } 1756 //Vitality reduction from rodatazone: http://rodatazone.simgaming.net/mechanics/substats.php#def 1749 //Vitality reduction from rodatazone: http://rodatazone.simgaming.net/mechanics/substats.php#def 1757 1750 if (tsd) //Sd vit-eq 1758 1751 { //[VIT*0.5] + rnd([VIT*0.3], max([VIT*0.3],[VIT^2/150]-1)) 1759 1752 vit_def = def2*(def2-15)/150; 1760 1753 vit_def = def2/2 + (vit_def>0?rand()%vit_def:0); 1761 1754 1762 1755 if((sstatus->race==RC_UNDEAD || sstatus->race==RC_DEMON) && 1763 1756 src->type == BL_MOB && (skill=pc_checkskill(tsd,AL_DP)) > 0) … … 1768 1761 vit_def = def2 + (vit_def>0?rand()%vit_def:0); 1769 1762 } 1770 1763 1771 1764 if (battle_config.weapon_defense_type) { 1772 1765 vit_def += def1*battle_config.weapon_defense_type; … … 1791 1784 if (sc && skill_num != LK_SPIRALPIERCE) 1792 1785 { //SC skill damages 1793 if(sc->data[SC_AURABLADE]) 1786 if(sc->data[SC_AURABLADE]) 1794 1787 ATK_ADD(20*sc->data[SC_AURABLADE]->val1); 1795 1788 } … … 1828 1821 else 1829 1822 ARR_FIND(0, 3, i, t_class == sd->hate_mob[i]); 1830 if (i < 3 && (skill=pc_checkskill(sd,sg_info[i].anger_id))) 1823 if (i < 3 && (skill=pc_checkskill(sd,sg_info[i].anger_id))) 1831 1824 { 1832 1825 skillratio = sd->status.base_level + sstatus->dex + sstatus->luk; … … 1843 1836 } //Here ends flag.hit section, the rest of the function applies to both hitting and missing attacks 1844 1837 else if(wd.div_ < 0) //Since the attack missed... 1845 wd.div_ *= -1; 1838 wd.div_ *= -1; 1846 1839 1847 1840 if(skill_num == CR_GRANDCROSS || skill_num == NPC_GRANDDARKNESS) 1848 1841 return wd; //Enough, rest is not needed. 1849 1842 1850 if(sd && (skill=pc_checkskill(sd,BS_WEAPONRESEARCH)) > 0) 1843 if(sd && (skill=pc_checkskill(sd,BS_WEAPONRESEARCH)) > 0) 1851 1844 ATK_ADD(skill*2); 1852 1845 … … 1890 1883 { 1891 1884 int cardfix = 1000, cardfix_ = 1000; 1892 int t_race2 = status_get_race2(target); 1885 int t_race2 = status_get_race2(target); 1893 1886 if(sd->state.arrow_atk) 1894 1887 { … … 1950 1943 ATK_RATE2(cardfix/10, cardfix_/10); //What happens if you use right-to-left and there's no right weapon, only left? 1951 1944 } 1952 1945 1953 1946 if (skill_num == CR_SHIELDBOOMERANG || skill_num == PA_SHIELDCHAIN) { //Refine bonus applies after cards and elements. 1954 1947 short index= sd->equip_index[EQI_HAND_L]; … … 2004 1997 if (flag.lh && (flag.hit || wd.damage2>0)) 2005 1998 wd.damage2 = 1; 2006 if (!(battle_config.skill_min_damage&1)) 1999 if (!(battle_config.skill_min_damage&1)) 2007 2000 //Do not return if you are supposed to deal greater damage to plants than 1. [Skotlex] 2008 2001 return wd; … … 2034 2027 if (sd) 2035 2028 { 2036 if (!flag.rh && flag.lh) 2029 if (!flag.rh && flag.lh) 2037 2030 { //Move lh damage to the rh 2038 2031 wd.damage = wd.damage2; … … 2125 2118 breakrate[1] += sc->data[SC_MELTDOWN]->val3; 2126 2119 } 2127 } 2120 } 2128 2121 if (breakrate[0]) 2129 2122 skill_break_equip(target, EQP_WEAPON, breakrate[0], BCT_ENEMY); … … 2196 2189 else if (s_ele == -2) //Use status element 2197 2190 s_ele = status_get_attack_sc_element(src,status_get_sc(src)); 2198 2191 2199 2192 //Set miscellaneous data that needs be filled 2200 2193 if(sd) { … … 2206 2199 ad.flag |= battle_range_type(src, target, skill_num, skill_lv); 2207 2200 flag.infdef=(tstatus->mode&MD_PLANT?1:0); 2208 2201 2209 2202 switch(skill_num) 2210 2203 { … … 2234 2227 case AL_HEAL: 2235 2228 case PR_BENEDICTIO: 2236 //Begin Custom Job (blackmagic)2237 2229 case AD_DARKHEAL: // Adept Dark Heal 2238 //end custom job2239 2230 ad.damage = skill_calc_heal(src, target, skill_lv)/2; 2240 2231 break; … … 2355 2346 skillratio += 100 +100*skill_lv +100*(skill_lv/2); 2356 2347 break; 2357 //Begin Custom Job (blackmagic) 2358 case NC_DRAINLIFE: // Necro Drain Life [Brain] 2359 skillratio += 25*skill_lv; 2360 break; 2361 case WL_HELLFIRE: // Warlock Hellfire [Brain] 2362 skillratio += 25*skill_lv; 2363 break; 2364 case WL_SHADOWBURN: // Warlock Shadow Burn [Brain] 2365 skillratio += 20*skill_lv; 2366 break; 2367 case WL_CURSEDOOM: // Warlock Curse of Doom [Brain] 2368 skillratio += 400 + 300*skill_lv; //max 20*matk dmg after 60 seconds 2369 break; 2370 case WL_SEARING: // Warlock Searing Pain [Brain] 2371 if(status_get_sc(target)->data[SC_SEARING]) 2372 skillratio = 10*pc_checkskill(sd,WL_SEARING);//10% * skilllv 2373 break; //Else 100% Matk 2374 case WL_IMMOLATE: // Warlock Immolate [Brain] 2375 if(status_get_sc(target)->data[SC_IMMOLATE]) 2376 skillratio += 10*pc_checkskill(sd,WL_SEARING);//100% +10 * searing lv 2377 else skillratio += -20 + 20*skill_lv;// Else 80% + 20% * skill lv 2378 break; 2379 case WL_CONFLAGRATE: // Warlock Conflagrate [Brain] 2380 skillratio += 100 + 60*skill_lv + //damage bonus from other fire skills 2381 10*pc_checkskill(sd,WL_SEARING) + 10*pc_checkskill(sd,WL_IMMOLATE); 2382 break; 2383 //End Custom Job 2384 } 2348 case NC_DRAINLIFE: // Necro Drain Life [Brain] 2349 skillratio += 25*skill_lv; 2350 break; 2351 case WL_HELLFIRE: // Warlock Hellfire [Brain] 2352 skillratio += 25*skill_lv; 2353 break; 2354 case WL_SHADOWBURN: // Warlock Shadow Burn [Brain] 2355 skillratio += 20*skill_lv; 2356 break; 2357 case WL_CURSEDOOM: // Warlock Curse of Doom [Brain] 2358 skillratio += 400 + 300*skill_lv; //max 20*matk dmg after 60 seconds 2359 break; 2360 case WL_SEARING: // Warlock Searing Pain [Brain] 2361 if(status_get_sc(target)->data[SC_SEARING]) 2362 skillratio = 10*pc_checkskill(sd,WL_SEARING);//10% * skilllv 2363 break; //Else 100% Matk 2364 case WL_IMMOLATE: // Warlock Immolate [Brain] 2365 if(status_get_sc(target)->data[SC_IMMOLATE]) 2366 skillratio += 10*pc_checkskill(sd,WL_SEARING);//100% +10 * searing lv 2367 else skillratio += -20 + 20*skill_lv;// Else 80% + 20% * skill lv 2368 break; 2369 case WL_CONFLAGRATE: // Warlock Conflagrate [Brain] 2370 skillratio += 100 + 60*skill_lv + //damage bonus from other fire skills 2371 10*pc_checkskill(sd,WL_SEARING) + 10*pc_checkskill(sd,WL_IMMOLATE); 2372 break; 2373 } 2385 2374 2386 2375 MATK_RATE(skillratio); 2387 2376 2388 2377 //Constant/misc additions from skills 2389 2378 if (skill_num == WZ_FIREPILLAR) … … 2437 2426 } 2438 2427 } 2439 2428 2440 2429 if (skill_num == NPC_EARTHQUAKE) 2441 2430 { //Adds atk2 to the damage, should be influenced by number of hits and skill-ratio, but not mdef reductions. [Skotlex] … … 2452 2441 if (!(nk&NK_NO_ELEFIX)) 2453 2442 ad.damage=battle_attr_fix(src, target, ad.damage, s_ele, tstatus->def_ele, tstatus->ele_lv); 2454 //Begin Custom Job (blackmagic) 2443 2444 2455 2445 if(skill_num == WL_SHADOWBURN) { // Warlock Shadow Burn [Brain] 2456 2446 // This is where we calculate the secondary damage 2457 2447 if(ad.damage<1) ad.damage=1; 2458 2448 struct Damage md = battle_calc_misc_attack(src,target,skill_num,skill_lv, mflag); 2459 if(md.damage<1) md.damage=1; 2460 ad.damage += md.damage; 2461 } 2462 //End Custom Job 2449 if(md.damage<1) md.damage=1; //Changed MD = WD 2450 ad.damage += md.damage; // Same as above 2451 } 2452 2463 2453 if (sd && !(nk&NK_NO_CARDFIX_ATK)) { 2464 2454 short t_class = status_get_class(target); … … 2515 2505 2516 2506 damage_div_fix(ad.damage, ad.div_); 2517 2507 2518 2508 if (flag.infdef && ad.damage) 2519 2509 ad.damage = ad.damage>0?1:-1; 2520 2510 2521 2511 ad.damage=battle_calc_damage(src,target,ad.damage,ad.div_,skill_num,skill_lv,ad.flag); 2522 2512 if (map_flag_gvg2(target->m)) … … 2526 2516 2527 2517 /*========================================== 2528 * »ÌŒ_ E?[WvZ2518 * »ÌŒ_??[WvZ 2529 2519 *------------------------------------------*/ 2530 2520 struct Damage battle_calc_misc_attack(struct block_list *src,struct block_list *target,int skill_num,int skill_lv,int mflag) … … 2555 2545 2556 2546 nk = skill_get_nk(skill_num); 2557 2547 2558 2548 sd = BL_CAST(BL_PC, src); 2559 2549 tsd = BL_CAST(BL_PC, target); 2560 2550 2561 2551 if(sd) { 2562 2552 sd->state.arrow_atk = 0; … … 2589 2579 if(mflag > 1) //Autocasted Blitz. 2590 2580 nk|=NK_SPLASHSPLIT; 2591 2581 2592 2582 if (skill_num == SN_FALCONASSAULT) 2593 2583 { 2594 2584 //Div fix of Blitzbeat 2595 2585 skill = skill_get_num(HT_BLITZBEAT, 5); 2596 damage_div_fix(md.damage, skill); 2586 damage_div_fix(md.damage, skill); 2597 2587 2598 2588 //Falcon Assault Modifier … … 2660 2650 case NPC_EVILLAND: 2661 2651 md.damage = (skill_lv>6)?666:skill_lv*100; 2662 //Begin Custom Job (blackmagic)2652 //break; 2663 2653 case WL_SHADOWBURN: // Warlock ShadowBurn dark element damage [Brain] 2664 s_ele = ELE_DARK; 2665 md.damage = ((300 + 20*skill_lv)/100)*((sstatus->int_*(rand()%300+500))/100); //Fixed between min and max matk for now 2666 //End Custom Job 2654 s_ele = ELE_DARK; 2655 md.damage = ((300 + 20*skill_lv)/100)*((sstatus->int_*(rand()%300+500))/100); //Fixed between min and max matk for now 2667 2656 break; 2668 2657 } … … 2676 2665 2677 2666 damage_div_fix(md.damage, md.div_); 2678 2667 2679 2668 if (!(nk&NK_IGNORE_FLEE)) 2680 2669 { … … 2688 2677 hitrate=80; //Default hitrate 2689 2678 2690 if(battle_config.agi_penalty_type && 2679 if(battle_config.agi_penalty_type && 2691 2680 battle_config.agi_penalty_target&target->type) 2692 { 2681 { 2693 2682 unsigned char attacker_count; //256 max targets should be a sane max 2694 2683 attacker_count = unit_counttargeted(target,battle_config.agi_penalty_count_lv); … … 2759 2748 } 2760 2749 /*========================================== 2761 * _ E?[WvZê?E?p2750 * _??[WvZê??p 2762 2751 *------------------------------------------*/ 2763 2752 struct Damage battle_calc_attack(int attack_type,struct block_list *bl,struct block_list *target,int skill_num,int skill_lv,int count) … … 2825 2814 if (*damage <= 0) continue; 2826 2815 //First and Third iterations: race, other two boss/nonboss state 2827 if (i == 0 || i == 2) 2816 if (i == 0 || i == 2) 2828 2817 type = race; 2829 2818 else 2830 2819 type = boss?RC_BOSS:RC_NONBOSS; 2831 2820 2832 2821 hp = wd->hp_drain[type].value; 2833 2822 if (wd->hp_drain[type].rate) … … 2852 2841 if (sd->sp_vanish_rate && rand()%1000 < sd->sp_vanish_rate) 2853 2842 status_percent_damage(&sd->bl, tbl, 0, (unsigned char)sd->sp_vanish_per, false); 2854 //begin custom job (blackmagic 2855 // Adept Blood Pact drains 5% damage per hit [FlavioJS/Brain] 2843 // Adept Blood Pact drains 5% damage per hit [FlavioJS/Brain] 2856 2844 if( pc_checkskill(sd, AD_BLOODPACT) > 0 ) 2857 2845 thp += battle_calc_drain(rdamage,1000,5); … … 2867 2855 rhp += corrupt_sp;//If SP damage was caused, increase HP damage too 2868 2856 } 2869 //end custom job2870 2857 if (!thp && !tsp) return; 2871 2858 2872 2859 status_heal(&sd->bl, thp, tsp, battle_config.show_hp_sp_drain?3:1); 2873 2860 2874 2861 if (rhp || rsp) 2875 2862 status_zap(tbl, rhp, rsp); … … 2877 2864 2878 2865 /*========================================== 2879 * Ê? EU?E?ÜÆß2866 * Ê?í?U??ÜÆß 2880 2867 *------------------------------------------*/ 2881 2868 enum damage_lv battle_weapon_attack(struct block_list* src, struct block_list* target, unsigned int tick, int flag) … … 2907 2894 if (tsc && !tsc->count) 2908 2895 tsc = NULL; 2909 2896 2910 2897 if (sd) 2911 2898 { … … 3070 3057 3071 3058 if (tsc) { 3072 if (tsc->data[SC_POISONREACT] && 3059 if (tsc->data[SC_POISONREACT] && 3073 3060 (rand()%100 < tsc->data[SC_POISONREACT]->val3 3074 3061 || sstatus->def_ele == ELE_POISON) && … … 3092 3079 } 3093 3080 3094 //Begin custom Job (blackmagic)3095 3081 int battle_check_living(int race,int element)// Living creature check [Brain] 3096 3082 { … … 3105 3091 } 3106 3092 } 3107 //end custom job3108 3093 3109 3094 int battle_check_undead(int race,int element) … … 3234 3219 break; 3235 3220 //All else not specified is an invalid target. 3236 default: 3221 default: 3237 3222 return 0; 3238 3223 } … … 3253 3238 strip_enemy = 0; 3254 3239 } 3255 // Sketchy - begin3256 if (sd->state.god && t_bl != s_bl && s_bl->type == BL_PC && ((TBL_PC*)s_bl)->state.demon && map[m].flag.hostile) {3257 state |= BCT_ENEMY;3258 strip_enemy = 0;3259 }3260 3261 if (sd->state.demon && t_bl != s_bl && s_bl->type == BL_PC && ((TBL_PC*)s_bl)->state.god && map[m].flag.hostile) {3262 state |= BCT_ENEMY;3263 strip_enemy = 0;3264 }3265 // Sketchy -end3266 3240 break; 3267 3241 } … … 3362 3336 break; 3363 3337 } 3364 3365 if ((flag&BCT_ALL) == BCT_ALL) { //All actually stands for all attackable chars 3338 3339 if ((flag&BCT_ALL) == BCT_ALL) { //All actually stands for all attackable chars 3366 3340 if (target->type&BL_CHAR) 3367 3341 return 1; … … 3371 3345 if (flag == BCT_NOONE) //Why would someone use this? no clue. 3372 3346 return -1; 3373 3347 3374 3348 if (t_bl == s_bl) 3375 3349 { //No need for further testing. … … 3379 3353 return (flag&state)?1:-1; 3380 3354 } 3381 3355 3382 3356 if (map_flag_vs(m)) { //Check rivalry settings. 3383 3357 if (flag&(BCT_PARTY|BCT_ENEMY)) { … … 3429 3403 } 3430 3404 } 3431 3405 3432 3406 if (!state) //If not an enemy, nor a guild, nor party, nor yourself, it's neutral. 3433 3407 state = BCT_NEUTRAL; … … 3759 3733 { "require_glory_guild", &battle_config.require_glory_guild, 0, 0, 1, }, 3760 3734 { "idle_no_share", &battle_config.idle_no_share, 0, 0, INT_MAX, }, 3761 { "party_even_share_bonus", &battle_config.party_even_share_bonus, 0, 0, INT_MAX, }, 3735 { "party_even_share_bonus", &battle_config.party_even_share_bonus, 0, 0, INT_MAX, }, 3762 3736 { "delay_battle_damage", &battle_config.delay_battle_damage, 1, 0, 1, }, 3763 3737 { "hide_woe_damage", &battle_config.hide_woe_damage, 0, 0, 1, }, … … 3832 3806 { "auction_feeperhour", &battle_config.auction_feeperhour, 12000, 0, INT_MAX, }, 3833 3807 { "auction_maximumprice", &battle_config.auction_maximumprice, 500000000, 0, MAX_ZENY, }, 3834 //Begin Custom Job (blackmagic)3835 3808 //Vanaheim battle settings [Brainstorm] 3836 3809 { "necro_retaliation", &battle_config.necro_retaliation, 1, 0, 1, }, 3837 { "disp_summon_stats", &battle_config.disp_summon_stats, 3838 //End Custom Job 3810 { "disp_summon_stats", &battle_config.disp_summon_stats, 0, 0, 1, }, 3811 3839 3812 { "gm_viewequip_min_lv", &battle_config.gm_viewequip_min_lv, 0, 0, 99, }, 3840 3813 }; … … 3881 3854 battle_config.monster_max_aspd = 2000 - battle_config.monster_max_aspd*10; 3882 3855 battle_config.max_aspd = 2000 - battle_config.max_aspd*10; 3883 battle_config.max_walk_speed = 100*DEFAULT_WALK_SPEED/battle_config.max_walk_speed; 3856 battle_config.max_walk_speed = 100*DEFAULT_WALK_SPEED/battle_config.max_walk_speed; 3884 3857 battle_config.max_cart_weight *= 10; 3885 3858 3886 3859 if(battle_config.max_def > 100 && !battle_config.weapon_defense_type) // added by [Skotlex] 3887 3860 battle_config.max_def = 100; … … 3889 3862 if(battle_config.min_hitrate > battle_config.max_hitrate) 3890 3863 battle_config.min_hitrate = battle_config.max_hitrate; 3891 3864 3892 3865 if(battle_config.pet_max_atk1 > battle_config.pet_max_atk2) //Skotlex 3893 3866 battle_config.pet_max_atk1 = battle_config.pet_max_atk2; 3894 3867 3895 3868 if (battle_config.day_duration && battle_config.day_duration < 60000) // added by [Yor] 3896 3869 battle_config.day_duration = 60000; 3897 3870 if (battle_config.night_duration && battle_config.night_duration < 60000) // added by [Yor] 3898 3871 battle_config.night_duration = 60000; 3899 3872 3900 3873 #ifndef CELL_NOSTACK 3901 3874 if (battle_config.cell_stack_limit != 1) -
src/map/battle.h
r5 r19 88 88 89 89 int battle_check_undead(int race,int element); 90 //Begin Custom Job (blackmagic)91 90 int battle_check_living(int race,int element); //Living Creature Check [Brain] 92 //End Custom Job (blackmagic)93 91 int battle_check_target(struct block_list *src, struct block_list *target,int flag); 94 92 bool battle_check_range(struct block_list *src,struct block_list *bl,int range); … … 455 453 int auction_feeperhour; 456 454 int auction_maximumprice; 457 //Begin custom Job (blackmagic)458 455 //Vanaheim battle settings [Brainstorm] 459 456 int necro_retaliation; //Battle flag to force monsters to attack adept/necro/warlock summons [Brain] 460 457 int disp_summon_stats; //Battle Flag to show summoned monster stats [Brain] 461 //end custom job462 458 int gm_viewequip_min_lv; 463 459 } battle_config; -
src/map/itemdb.c
r5 r19 242 242 if (jobmask & 1<<JOB_NINJA) 243 243 bclass[0] |= 1<<MAPID_NINJA; 244 // Begin custom job (blackmagic)244 //Custom Classes 245 245 if (jobmask & 1<<26) // Adept [Brain] 246 246 bclass[0] |= 1<<MAPID_ADEPT; … … 249 249 if (jobmask & 1<<28) // Warlock [Brain] 250 250 bclass[2] |= 1<<MAPID_ADEPT; 251 //end custom job252 251 } 253 252 -
src/map/map.h
r5 r19 77 77 MAPID_XMAS, 78 78 MAPID_SUMMER, 79 //Begin custom Jobs (blackmagic)80 79 MAPID_ADEPT = 0x0E, // Adept [Brain] 81 //end82 80 //2_1 classes 83 81 MAPID_SUPER_NOVICE = JOBL_2_1|0x0, … … 89 87 MAPID_ASSASSIN, 90 88 MAPID_STAR_GLADIATOR, 91 //Begin Custom Jobs (blackmagic)92 89 MAPID_NECROMANCER = JOBL_2_1|0x0E, // Necromancer [Brain] 93 //end94 90 //2_2 classes 95 91 MAPID_CRUSADER = JOBL_2_2|0x1, … … 100 96 MAPID_ROGUE, 101 97 MAPID_SOUL_LINKER, 102 //begin custom job (blackmagic)103 98 MAPID_WARLOCK = JOBL_2_2|0x0E, // Warlock [Flavio] 104 //end105 99 //1-1, advanced 106 100 MAPID_NOVICE_HIGH = JOBL_UPPER|0x0, … … 463 457 unsigned partylock :1; 464 458 unsigned guildlock :1; 465 unsigned hostile : 1; //Sketchy466 459 } flag; 467 460 struct point save; -
src/map/mob.c
r5 r19 548 548 barricade->amount = 0; 549 549 barricade->killable = killable; 550 barricade->shootable = shootable; 551 barricade->walkable = walkable; 550 551 // A protection just in case setting a walkable - non shootable 552 if( (barricade->walkable = walkable) == true ) 553 barricade->shootable = true; 554 else 555 barricade->shootable = shootable; 552 556 553 557 for( i = 0; i < count; i++ ) … … 570 574 } 571 575 572 if( !barricade->walkable ) map_setcell(m, x1, y1, CELL_WALKABLE, false); 573 map_setcell(m, x1, y1, CELL_SHOOTABLE, barricade->shootable); 576 if( !barricade->walkable ) 577 { 578 map_setcell(m, x1, y1, CELL_WALKABLE, false); 579 map_setcell(m, x1, y1, CELL_SHOOTABLE, barricade->shootable); 580 } 574 581 575 582 clif_changemapcell(0, m, x1, y1, map_getcell(barricade->m, x1, y1, CELL_GETTYPE), ALL_SAMEMAP); … … 626 633 mob_barricade_nextxy(barricade->x, barricade->y, barricade->dir, i, &x1, &y1); 627 634 628 if( !barricade->walkable ) map_setcell(barricade->m, x1, y1, CELL_WALKABLE, true); 629 map_setcell(barricade->m, x1, y1, CELL_SHOOTABLE, !barricade->shootable); 635 if( !barricade->shootable ) 636 map_setcell(barricade->m, x1, y1, CELL_SHOOTABLE, true); 637 if( !barricade->walkable ) 638 map_setcell(barricade->m, x1, y1, CELL_WALKABLE, true); 639 630 640 clif_changemapcell(0, barricade->m, x1, y1, map_getcell(barricade->m, x1, y1, CELL_GETTYPE), ALL_SAMEMAP); 631 641 } … … 688 698 mob_barricade_nextxy(barricade->x, barricade->y, barricade->dir, i, &x1, &y1); 689 699 690 if( !barricade->walkable ) map_setcell(barricade->m, x1, y1, CELL_WALKABLE, true); 691 map_setcell(barricade->m, x1, y1, CELL_SHOOTABLE, !barricade->shootable); 700 if( !barricade->shootable ) 701 map_setcell(barricade->m, x1, y1, CELL_SHOOTABLE, true); 702 if( !barricade->walkable ) 703 map_setcell(barricade->m, x1, y1, CELL_WALKABLE, true); 704 692 705 clif_changemapcell(0, barricade->m, x1, y1, map_getcell(barricade->m, x1, y1, CELL_GETTYPE), ALL_SAMEMAP); 693 706 } … … 2015 2028 /*if (md2->master_id && battle_config.retaliate_to_master) 2016 2029 md->attacked_id = md2->master_id;*/ 2017 //UNCOMMENT IF ERROR OCCURS WITH CUSTOM JOBS V 2018 //if (md2->master_id && battle_config.retaliate_to_master) 2019 //BEGIN Custom Jobs (blackmagic) 2020 { 2030 if (md2->master_id && battle_config.retaliate_to_master) 2031 { 2021 2032 //necro_retaliation config (same as above, but only works for adept/necro/warlock summons) [Brainstorm] 2022 2033 if(!battle_config.necro_retaliation && (md2->class_ >= 3100 && md2->class_ <= 3235)) … … 2024 2035 else md->attacked_id = md2->master_id; //All normal summons 2025 2036 } 2026 //end 2037 2027 2038 else 2028 2039 md->attacked_id = src->id; … … 2825 2836 } 2826 2837 2827 //Begin Custom Jobs (blackmagic)2828 2838 /// Count slaves with a certain master and class. by FlavioJS [Brain] 2829 2839 static int mob_countslave_class_sub(struct block_list* bl, va_list ap) … … 2860 2870 } 2861 2871 2862 //End2863 2872 2864 2873 /*========================================== … … 4023 4032 "mob_poring.txt", 4024 4033 "mob_boss.txt", 4025 "mob_pouch.txt" 4026 //Begin custom Jobs (blackmagic 4027 "mob_familiar.txt" // familiar By FlavioJS [Brain] 4034 "mob_pouch.txt", 4035 "mob_familiar.txt" 4028 4036 }; 4029 //end4030 4037 4031 4038 memset(&summon, 0, sizeof(summon)); -
src/map/mob.h
r5 r19 270 270 int mob_countslave(struct block_list *bl); 271 271 int mob_convertslave(struct mob_data *md); 272 273 //Begin custom Job (blackmagic)274 272 int mob_countslave_class(struct block_list* bl, int count, short* classes); // By FlavioJS [Brain] 275 //end 273 274 276 275 int mob_is_clone(int class_); 277 276 -
src/map/pc.c
r13 r19 1 // Copyright (c) Athena Dev Teams - Licensed under GNU GPL 1 // Copyright (c) Athena Dev Teams - Licensed under GNU GPL =D 2 2 // For more information, see LICENCE in the main folder 3 3 … … 133 133 } 134 134 135 void pc_setinvincibletimer(struct map_session_data* sd, int val) 135 void pc_setinvincibletimer(struct map_session_data* sd, int val) 136 136 { 137 137 nullpo_retv(sd); … … 258 258 case MAPID_TAEKWON: // Taekwon 259 259 clif_fame_taekwon(sd,count); 260 break; 260 break; 261 261 } 262 262 chrif_updatefamelist(sd); … … 267 267 { 268 268 int i; 269 269 270 270 switch(job){ 271 271 case MAPID_BLACKSMITH: // Blacksmith … … 330 330 sd->status.clothes_color=0; 331 331 332 //Only copy the Cart/Peco/Falcon options, the rest are handled via 332 //Only copy the Cart/Peco/Falcon options, the rest are handled via 333 333 //status change load/saving. [Skotlex] 334 334 sd->status.option = sd->sc.option&(OPTION_CART|OPTION_FALCON|OPTION_RIDING); 335 335 336 336 if (sd->sc.data[SC_JAILED]) 337 337 { //When Jailed, do not move last point. … … 403 403 if (!itemdb_isequip2(sd->inventory_data[n])) 404 404 return 0; //Not equippable by players. 405 405 406 406 ep = sd->inventory_data[n]->equip; 407 407 if(sd->inventory_data[n]->look == W_DAGGER || … … 518 518 if (itemdb_isspecial(item->card[0])) 519 519 return 1; 520 520 521 521 ARR_FIND( 0, s, i, item->card[i] && (data = itemdb_exists(item->card[i])) != NULL && data->flag.no_equip&flag ); 522 522 return( i < s ) ? 0 : 1; … … 535 535 if( i == EQI_HEAD_MID && sd->equip_index[EQI_HEAD_LOW] == index ) continue; 536 536 if( i == EQI_HEAD_TOP && (sd->equip_index[EQI_HEAD_MID] == index || sd->equip_index[EQI_HEAD_LOW] == index) ) continue; 537 537 538 538 if( !sd->inventory_data[index] ) continue; 539 539 … … 568 568 // Parents need to have their ring equipped 569 569 if( !pc_isequipped(p1_sd, WEDDING_RING_M) && !pc_isequipped(p1_sd, WEDDING_RING_F) ) 570 return false; 570 return false; 571 571 572 572 if( !pc_isequipped(p2_sd, WEDDING_RING_M) && !pc_isequipped(p2_sd, WEDDING_RING_F) ) … … 603 603 int job, joblevel; 604 604 unsigned int jobexp; 605 605 606 606 if( !pc_can_Adopt(p1_sd, p2_sd, b_sd) ) 607 607 return false; … … 632 632 pc_skill(p1_sd, WE_CALLBABY, 1, 0); 633 633 pc_skill(p2_sd, WE_CALLBABY, 1, 0); 634 634 635 635 return true; 636 636 } … … 660 660 return 0; 661 661 if(map_flag_gvg(sd->bl.m) && ((item->flag.no_equip&2) || !pc_isAllowedCardOn(sd,item->slot,n,2))) 662 return 0; 662 return 0; 663 663 if(map[sd->bl.m].flag.restricted) 664 664 { … … 669 669 670 670 if (sd->sc.count) { 671 671 672 672 if(item->equip & EQP_ARMS && item->type == IT_WEAPON && sd->sc.data[SC_STRIPWEAPON]) // Also works with left-hand weapons [DracoRPG] 673 673 return 0; … … 698 698 if (!(1<<(sd->class_&MAPID_BASEMASK)&item->class_base[(sd->class_&JOBL_2_1)?1:((sd->class_&JOBL_2_2)?2:0)])) 699 699 return 0; 700 700 701 701 //Not equipable by upper class. [Skotlex] 702 702 if(!(1<<((sd->class_&JOBL_UPPER)?1:((sd->class_&JOBL_BABY)?2:0))&item->class_upper)) … … 730 730 sd->class_ = MAPID_NOVICE; 731 731 } else 732 sd->class_ = i; 732 sd->class_ = i; 733 733 //Initializations to null/0 unneeded since map_session_data was filled with 0 upon allocation. 734 734 if(!sd->status.hp) pc_setdead(sd); … … 739 739 sd->npc_timer_id = -1; 740 740 sd->pvp_timer = -1; 741 741 742 742 sd->canuseitem_tick = tick; 743 743 sd->cantalk_tick = tick; … … 754 754 if (battle_config.disp_zeny) 755 755 sd->state.showzeny = 1; 756 <<<<<<< .mine 757 //Vanaheim settings [Brainstorm] 758 if (battle_config.disp_summon_stats) // Battle Flag to Show Summoned Monster Stats [Brain] 759 sd->state.showsummon = 1; 760 761 ======= 756 762 //Custom Job (blackmagick) 757 763 //Vanaheim settings [Brainstorm] … … 759 765 sd->state.showsummon = 1; 760 766 767 >>>>>>> .r18 761 768 if (!(battle_config.display_skill_fail&2)) 762 769 sd->state.showdelay = 1; 763 770 764 771 // ACe`FbN 765 772 pc_setinventorydata(sd); 766 773 pc_checkitem(sd); 767 774 768 775 status_change_init(&sd->bl); 769 776 if ((battle_config.atc_gmonly == 0 || pc_isGM(sd)) && (pc_isGM(sd) >= get_atcommand_level(atcommand_hide))) … … 820 827 sd->packet_ver, CONVIP(ip)); 821 828 } 822 829 823 830 // Send friends list 824 831 clif_friendslist_send(sd); … … 867 874 } 868 875 869 //Attempts to set a mob. 876 //Attempts to set a mob. 870 877 int pc_set_hate_mob(struct map_session_data *sd, int pos, struct block_list *bl) 871 878 { … … 899 906 { 900 907 int i,j; 901 908 902 909 sd->change_level = pc_readglobalreg(sd,"jobchange_level"); 903 910 sd->die_counter = pc_readglobalreg(sd,"PC_DIE_COUNTER"); … … 933 940 if (i < sd->status.skill[sd->cloneskill_id].lv) 934 941 sd->status.skill[sd->cloneskill_id].lv = i; 935 sd->status.skill[sd->cloneskill_id].flag = 13; //cloneskill flag 942 sd->status.skill[sd->cloneskill_id].flag = 13; //cloneskill flag 936 943 } 937 944 } … … 946 953 if (sd->status.guild_id) 947 954 guild_member_joined(sd); 948 955 949 956 // pet 950 957 if (sd->status.pet_id > 0) … … 1017 1024 } 1018 1025 c = pc_class2idx(c); 1019 for(i=0;i<MAX_SKILL;i++){ 1026 for(i=0;i<MAX_SKILL;i++){ 1020 1027 if (sd->status.skill[i].flag != 13) //Don't touch plagiarized skills 1021 1028 sd->status.skill[i].id=0; //First clear skills. 1022 1029 } 1023 1030 1024 for(i=0;i<MAX_SKILL;i++){ 1025 if (sd->status.skill[i].flag && sd->status.skill[i].flag != 13){ //Restore original level of skills after deleting earned skills. 1031 for(i=0;i<MAX_SKILL;i++){ 1032 if (sd->status.skill[i].flag && sd->status.skill[i].flag != 13){ //Restore original level of skills after deleting earned skills. 1026 1033 sd->status.skill[i].lv=(sd->status.skill[i].flag==1)?0:sd->status.skill[i].flag-2; 1027 1034 sd->status.skill[i].flag=0; … … 1112 1119 sd->status.skill[id].flag=1; //So it is not saved, and tagged as a "bonus" skill. 1113 1120 } else 1114 sd->status.skill[id].flag=sd->status.skill[id].lv+2; 1121 sd->status.skill[id].flag=sd->status.skill[id].lv+2; 1115 1122 sd->status.skill[id].lv= skill_tree_get_max(id, sd->status.class_); 1116 1123 } … … 1128 1135 if(battle_config.skillfree) 1129 1136 return; //Function serves no purpose if this is set 1130 1137 1131 1138 i = pc_calc_skilltree_normalize_job(sd); 1132 1139 c = pc_mapid2jobid(i, sd->status.sex); … … 1143 1150 if(sd->status.skill[id].id) //Already learned 1144 1151 continue; 1145 1152 1146 1153 for(j=0;j<5;j++) { 1147 1154 if((k=skill_tree[c][i].need[j].id)) … … 1164 1171 if (sd->status.job_level < skill_tree[c][i].joblv) 1165 1172 continue; 1166 1173 1167 1174 j = skill_get_inf2(id); 1168 1175 if(!sd->status.skill[id].lv && ( … … 1203 1210 int skill_point; 1204 1211 int c = sd->class_; 1205 1212 1206 1213 if (!battle_config.skillup_limit) 1207 1214 return c; 1208 1215 1209 1216 skill_point = pc_calc_skillpoint(sd); 1210 1217 if(pc_checkskill(sd, NV_BASIC) < 9) //Consider Novice Tree when you don't have NV_BASIC maxed. … … 1612 1619 break; 1613 1620 val += (int)status->max_hp; 1614 //Negative bonuses will underflow, this will be handled in status_calc_pc through casting 1621 //Negative bonuses will underflow, this will be handled in status_calc_pc through casting 1615 1622 //If this is called outside of status_calc_pc, you'd better pray they do not underflow and end with UINT_MAX max_hp. 1616 1623 status->max_hp = (unsigned int)val; 1617 1624 break; 1618 1625 case SP_MAXSP: 1619 if(sd->state.lr_flag == 2) 1626 if(sd->state.lr_flag == 2) 1620 1627 break; 1621 1628 val += (int)status->max_sp; … … 2675 2682 if(idx_card < 0 || idx_card >= MAX_INVENTORY || !sd->inventory_data[idx_card]) 2676 2683 return 0; //Invalid card index. 2677 2684 2678 2685 if(idx_equip < 0 || idx_equip >= MAX_INVENTORY || !sd->inventory_data[idx_equip]) 2679 2686 return 0; //Invalid item index. 2680 2687 2681 2688 nameid=sd->status.inventory[idx_equip].nameid; 2682 2689 cardid=sd->status.inventory[idx_card].nameid; … … 2903 2910 if(amount > MAX_AMOUNT) 2904 2911 return 5; 2905 2912 2906 2913 data = itemdb_search(item_data->nameid); 2907 2914 w = data->weight*amount; … … 2998 3005 return 0; //Can't drop items in nodrop mapflag maps. 2999 3006 } 3000 3007 3001 3008 if (!pc_candrop(sd,&sd->status.inventory[n])) { 3002 3009 clif_displaymessage (sd->fd, msg_txt(263)); 3003 3010 return 0; 3004 3011 } 3005 3012 3006 3013 //Logs items, dropped by (P)layers [Lupus] 3007 3014 if(log_config.enable_logs&0x8) … … 3011 3018 if (!map_addflooritem(&sd->status.inventory[n], amount, sd->bl.m, sd->bl.x, sd->bl.y, 0, 0, 0, 2)) 3012 3019 return 0; 3013 3020 3014 3021 pc_delitem(sd, n, amount, 0); 3015 3022 return 1; … … 3034 3041 if (sd->status.party_id) 3035 3042 p = party_search(sd->status.party_id); 3036 3043 3037 3044 if(fitem->first_get_charid > 0 && fitem->first_get_charid != sd->status.char_id) 3038 3045 { … … 3124 3131 if ((nameid == 605 || nameid == 606) && pc_issit(sd)) 3125 3132 return 0; 3126 3133 3127 3134 //added item_noequip.txt items check by Maya&[Lupus] 3128 3135 if ( … … 3146 3153 )) 3147 3154 return 0; 3148 3155 3149 3156 //Not usable by upper class. [Skotlex] 3150 3157 if(!( … … 3330 3337 if (idx < 0 || idx >= MAX_INVENTORY) //Invalid index check [Skotlex] 3331 3338 return 1; 3332 3339 3333 3340 item_data = &sd->status.inventory[idx]; 3334 3341 … … 3370 3377 if (idx < 0 || idx >= MAX_CART) //Invalid index check [Skotlex] 3371 3378 return 1; 3372 3379 3373 3380 item_data=&sd->status.cart[idx]; 3374 3381 … … 3422 3429 if(md->state.steal_flag == UCHAR_MAX || md->sc.opt1) //already stolen from / status change check 3423 3430 return 0; 3424 3431 3425 3432 sd_status= status_get_status_data(&sd->bl); 3426 3433 md_status= status_get_status_data(bl); … … 3439 3446 rate = (sd_status->dex - md_status->dex)/2 + lv*6 + 4; 3440 3447 rate += sd->add_steal_rate; 3441 3448 3442 3449 if( rate < 1 ) 3443 3450 return 0; … … 3465 3472 return 0; 3466 3473 } 3467 3474 3468 3475 if(battle_config.show_steal_in_same_party) 3469 3476 party_foreachsamemap(pc_show_steal,sd,AREA_SIZE,sd,tmp_item.nameid); … … 3474 3481 log_pick_pc(sd, "P", itemid, 1, NULL); 3475 3482 } 3476 3483 3477 3484 //A Rare Steal Global Announce by Lupus 3478 3485 if(md->db->dropitem[i].p<=battle_config.rare_drop_announce) { … … 3605 3612 //Tag player for rewarping after map-loading is done. [Skotlex] 3606 3613 sd->state.rewarp = 1; 3607 3614 3608 3615 sd->mapindex = mapindex; 3609 3616 sd->bl.m = m; … … 3763 3770 if(!sd->sc.count) 3764 3771 return 0; 3765 3772 3766 3773 for (i = 0; i < ARRAYLENGTH(scw_list); i++) 3767 3774 { // Skills requiring specific weapon types … … 3770 3777 status_change_end(&sd->bl,scw_list[i],-1); 3771 3778 } 3772 3779 3773 3780 if(sd->sc.data[SC_SPURT] && sd->status.weapon) 3774 3781 // Spurt requires bare hands (feet, in fact xD) 3775 3782 status_change_end(&sd->bl,SC_SPURT,-1); 3776 3783 3777 3784 if(sd->status.shield <= 0) { // Skills requiring a shield 3778 3785 for (i = 0; i < ARRAYLENGTH(scs_list); i++) … … 3862 3869 class_ |= MAPID_THIEF; 3863 3870 break; 3864 3871 3865 3872 case JOB_STAR_GLADIATOR: 3866 3873 case JOB_STAR_GLADIATOR2: 3867 3874 class_ |= JOBL_2_1; 3868 3875 class_ |= MAPID_TAEKWON; 3869 break; 3876 break; 3870 3877 case JOB_SOUL_LINKER: 3871 3878 class_ |= JOBL_2_2; … … 3891 3898 class_ = MAPID_SUMMER; 3892 3899 break; 3900 <<<<<<< .mine 3901 //Possible to be in the wrong spot? 3902 case JOB_NECROMANCER: // Necromancer [Brain] 3903 class_ |= JOBL_2_1; 3904 class_ |= MAPID_ADEPT; 3905 ======= 3893 3906 //Custom Jobs (blackmagic) 3894 3907 + case JOB_NECROMANCER: // Necromancer [Brain] … … 3900 3913 case JOB_ADEPT: // Adept [Brain] 3901 3914 class_ |= MAPID_ADEPT; 3902 break; 3903 //Custom Job End 3915 >>>>>>> .r18 3916 break; 3917 case JOB_WARLOCK: // Warlock [Brain] 3918 class_ |= JOBL_2_2; 3919 case JOB_ADEPT: // Adept [Brain] 3920 class_ |= MAPID_ADEPT; 3921 break; 3904 3922 default: 3905 3923 return -1; … … 3925 3943 case MAPID_XMAS: return JOB_XMAS; 3926 3944 case MAPID_SUMMER: return JOB_SUMMER; 3927 //Custom Jobs (blackmagic)3928 3945 case MAPID_ADEPT: return JOB_ADEPT; // Adept [Brain] 3929 //Custom Job End3930 3931 3946 //2_1 classes 3932 3947 case MAPID_SUPER_NOVICE: return JOB_SUPER_NOVICE; … … 3938 3953 case MAPID_ASSASSIN: return JOB_ASSASSIN; 3939 3954 case MAPID_STAR_GLADIATOR: return JOB_STAR_GLADIATOR; 3940 //Custom Jobs (blackmagic)3941 3955 case MAPID_NECROMANCER: return JOB_NECROMANCER; // Necromancer [Brain] 3942 //Custom Job End3943 3944 3956 //2_2 classes 3945 3957 case MAPID_CRUSADER: return JOB_CRUSADER; … … 3950 3962 case MAPID_ROGUE: return JOB_ROGUE; 3951 3963 case MAPID_SOUL_LINKER: return JOB_SOUL_LINKER; 3952 //Custom Jobs (blackmagic)3953 3964 case MAPID_WARLOCK: return JOB_WARLOCK; // Warlock [Brain] 3954 //Custom Job End3955 3956 3965 //1-1: advanced 3957 3966 case MAPID_NOVICE_HIGH: return JOB_NOVICE_HIGH; … … 4018 4027 case JOB_THIEF: 4019 4028 return msg_txt(550 - JOB_NOVICE+class_); 4020 4029 4021 4030 case JOB_KNIGHT: 4022 4031 case JOB_PRIEST: … … 4026 4035 case JOB_ASSASSIN: 4027 4036 return msg_txt(557 - JOB_KNIGHT+class_); 4028 4037 4029 4038 case JOB_KNIGHT2: 4030 4039 return msg_txt(557); 4031 4040 4032 4041 case JOB_CRUSADER: 4033 4042 case JOB_MONK: … … 4038 4047 case JOB_DANCER: 4039 4048 return msg_txt(563 - JOB_CRUSADER+class_); 4040 4049 4041 4050 case JOB_CRUSADER2: 4042 4051 return msg_txt(563); 4043 4052 4044 4053 case JOB_WEDDING: 4045 4054 case JOB_SUPER_NOVICE: … … 4067 4076 case JOB_ASSASSIN_CROSS: 4068 4077 return msg_txt(582 - JOB_LORD_KNIGHT+class_); 4069 4078 4070 4079 case JOB_LORD_KNIGHT2: 4071 4080 return msg_txt(582); 4072 4081 4073 4082 case JOB_PALADIN: 4074 4083 case JOB_CHAMPION: … … 4079 4088 case JOB_GYPSY: 4080 4089 return msg_txt(588 - JOB_PALADIN + class_); 4081 4090 4082 4091 case JOB_PALADIN2: 4083 4092 return msg_txt(588); … … 4091 4100 case JOB_BABY_THIEF: 4092 4101 return msg_txt(595 - JOB_BABY + class_); 4093 4102 4094 4103 case JOB_BABY_KNIGHT: 4095 4104 case JOB_BABY_PRIEST: … … 4099 4108 case JOB_BABY_ASSASSIN: 4100 4109 return msg_txt(602 - JOB_BABY_KNIGHT + class_); 4101 4110 4102 4111 case JOB_BABY_KNIGHT2: 4103 4112 return msg_txt(602); 4104 4113 4105 4114 case JOB_BABY_CRUSADER: 4106 4115 case JOB_BABY_MONK: … … 4111 4120 case JOB_BABY_DANCER: 4112 4121 return msg_txt(608 - JOB_BABY_CRUSADER +class_); 4113 4122 4114 4123 case JOB_BABY_CRUSADER2: 4115 4124 return msg_txt(608); 4116 4125 4117 4126 case JOB_SUPER_BABY: 4118 4127 return msg_txt(615); 4119 4128 4120 4129 case JOB_TAEKWON: 4121 4130 return msg_txt(616); … … 4125 4134 case JOB_SOUL_LINKER: 4126 4135 return msg_txt(618); 4127 4136 4128 4137 case JOB_GUNSLINGER: 4129 4138 return msg_txt(619); 4130 4139 case JOB_NINJA: 4131 4140 return msg_txt(620); 4141 <<<<<<< .mine 4142 case JOB_ADEPT: // Adept [Brain] 4143 return msg_txt(1000); 4144 case JOB_NECROMANCER: // Necromancer [Brain] 4145 return msg_txt(1001); 4146 case JOB_WARLOCK: // Warlock [Flavio] 4147 ======= 4132 4148 //Custom Jobs (blackmagic) 4133 4149 case JOB_ADEPT: // Adept [Brain] … … 4136 4152 return msg_txt(1001); 4137 4153 case JOB_WARLOCK: // Warlock [Flavio] 4154 >>>>>>> .r18 4138 4155 return msg_txt(1002); 4139 //Custom Job End 4140 4156 4141 4157 default: 4142 4158 return msg_txt(650); … … 4232 4248 if (sd->status.status_point > USHRT_MAX - next) 4233 4249 sd->status.status_point = USHRT_MAX; 4234 else 4250 else 4235 4251 sd->status.status_point += next; 4236 4252 … … 4239 4255 if (battle_config.pet_lv_rate && sd->pd) //<Skotlex> update pet's level 4240 4256 status_calc_pet(sd->pd,0); 4241 4257 4242 4258 clif_updatestatus(sd,SP_STATUSPOINT); 4243 4259 clif_updatestatus(sd,SP_BASELEVEL); … … 4309 4325 4310 4326 if (sd->expaddrace[status->race]) 4311 bonus += sd->expaddrace[status->race]; 4327 bonus += sd->expaddrace[status->race]; 4312 4328 bonus += sd->expaddrace[status->mode&MD_BOSS?RC_BOSS:RC_NONBOSS]; 4313 4314 if (battle_config.pk_mode && 4329 4330 if (battle_config.pk_mode && 4315 4331 (int)(status_get_lv(src) - sd->status.base_level) >= 20) 4316 bonus += 15; // pk_mode additional exp if monster >20 levels [Valaris] 4332 bonus += 15; // pk_mode additional exp if monster >20 levels [Valaris] 4317 4333 4318 4334 if (sd->sc.data[SC_EXPBOOST]) … … 4321 4337 if (!bonus) 4322 4338 return; 4323 4339 4324 4340 *base_exp += (unsigned int) cap_value((double)*base_exp * bonus/100., 1, UINT_MAX); 4325 4341 *job_exp += (unsigned int) cap_value((double)*job_exp * bonus/100., 1, UINT_MAX); … … 4350 4366 nextb = pc_nextbaseexp(sd); 4351 4367 nextj = pc_nextjobexp(sd); 4352 4368 4353 4369 if(sd->state.showexp || battle_config.max_exp_gain_rate){ 4354 4370 if (nextb > 0) … … 4372 4388 } 4373 4389 } 4374 4390 4375 4391 //Cap exp to the level up requirement of the previous level when you are at max level, otherwise cap at UINT_MAX (this is required for some S. Novice bonuses). [Skotlex] 4376 4392 if (base_exp) { … … 4538 4554 4539 4555 max = pc_maxparameter(sd); 4540 4556 4541 4557 switch(type){ 4542 4558 case SP_STR: sd->status.str = cap_value(sd->status.str + val, 1, max); break; … … 4638 4654 } 4639 4655 status_calc_pc(sd,0); 4640 //Required because if you could level up all skills previously, 4656 //Required because if you could level up all skills previously, 4641 4657 //the update will not be sent as only the lv variable changes. 4642 4658 clif_skillinfoblock(sd); … … 4735 4751 { 4736 4752 nullpo_retr(0, sd); 4737 4753 4738 4754 if (battle_config.use_statpoint_table) 4739 4755 { // New statpoint table used here - Dexity … … 4748 4764 if (sd->class_&JOBL_UPPER) 4749 4765 stat+=52; // extra 52+48=100 stat points 4750 4766 4751 4767 if (stat > USHRT_MAX) 4752 4768 sd->status.status_point = USHRT_MAX; … … 4788 4804 clif_updatestatus(sd,SP_UDEX); 4789 4805 clif_updatestatus(sd,SP_ULUK); // End Addition 4790 4806 4791 4807 clif_updatestatus(sd,SP_STATUSPOINT); 4792 4808 status_calc_pc(sd,0); … … 4823 4839 merc_hom_vaporize(sd, 0); 4824 4840 } 4825 4841 4826 4842 for (i = 1; i < MAX_SKILL; i++) { 4827 4843 lv= sd->status.skill[i].lv; … … 4852 4868 } 4853 4869 } 4854 4870 4855 4871 if (flag&2 || !skill_point) return skill_point; 4856 4872 … … 4958 4974 if(!src || src == &sd->bl) 4959 4975 return; 4960 4976 4961 4977 if(sd->status.pet_id > 0 && sd->pd && battle_config.pet_damage_support) 4962 4978 pet_target_check(sd,src,1); … … 4970 4986 int i=0,j=0,k=0; 4971 4987 unsigned int tick = gettick(); 4972 4988 4973 4989 if(sd->vender_id) 4974 4990 vending_closevending(sd); … … 5065 5081 // karma going down = more 'good' / more honourable. 5066 5082 // The Karma System way... 5067 5083 5068 5084 if (sd->status.karma > ssd->status.karma) { // If player killed was more evil 5069 5085 sd->status.karma--; … … 5072 5088 else if (sd->status.karma < ssd->status.karma) // If player killed was more good 5073 5089 ssd->status.karma++; 5074 5090 5075 5091 5076 5092 // or the PK System way... 5077 5093 5078 5094 if (sd->status.karma > 0) // player killed is dishonourable? 5079 5095 ssd->status.karma--; // honour points earned 5080 5096 sd->status.karma++; // honour points lost 5081 5097 5082 5098 // To-do: Receive exp on certain occasions 5083 5099 #endif … … 5326 5342 stat += (sd->status.base_level + i + 14) / 5 ; 5327 5343 if (sd->status.status_point > USHRT_MAX - stat) 5328 5344 5329 5345 sd->status.status_point = USHRT_MAX; 5330 5346 else … … 5528 5544 status_percent_damage(NULL, &sd->bl, hp, 0, hp==-100); 5529 5545 } 5530 5546 5531 5547 if(sp) { 5532 5548 if(sp > 0) … … 5560 5576 switch (upper) { 5561 5577 case 1: 5562 b_class|= JOBL_UPPER; 5578 b_class|= JOBL_UPPER; 5563 5579 break; 5564 5580 case 2: … … 5567 5583 } 5568 5584 //This will automatically adjust bard/dancer classes to the correct gender 5569 //That is, if you try to jobchange into dancer, it will turn you to bard. 5585 //That is, if you try to jobchange into dancer, it will turn you to bard. 5570 5586 job = pc_mapid2jobid(b_class, sd->status.sex); 5571 5587 if (job == -1) 5572 5588 return 1; 5573 5589 5574 5590 if ((unsigned short)b_class == sd->class_) 5575 5591 return 1; //Nothing to change. … … 5599 5615 } 5600 5616 } 5601 5617 5602 5618 sd->status.class_ = job; 5603 5619 fame_flag = pc_famerank(sd->status.char_id,sd->class_&MAPID_UPPERMASK); … … 5615 5631 } 5616 5632 5617 //Change look, if disguised, you need to undisguise 5633 //Change look, if disguised, you need to undisguise 5618 5634 //to correctly calculate new job sprite without 5619 5635 if (sd->disguise) … … 5643 5659 if(merc_is_hom_active(sd->hd) && !pc_checkskill(sd, AM_CALLHOMUN)) 5644 5660 merc_hom_vaporize(sd, 0); 5645 5661 5646 5662 if(sd->status.manner < 0) 5647 5663 clif_changestatus(&sd->bl,SP_MANNER,sd->status.manner); … … 5802 5818 else if (!(type&OPTION_FLYING) && p_type&OPTION_FLYING) 5803 5819 new_look = -1; 5804 5820 5805 5821 if (type&OPTION_WEDDING && !(p_type&OPTION_WEDDING)) 5806 5822 new_look = JOB_WEDDING; … … 6036 6052 struct global_reg *sd_reg; 6037 6053 int i,max; 6038 6054 6039 6055 nullpo_retr(0, sd); 6040 6056 switch (type) { … … 6113 6129 return 1; 6114 6130 } 6115 6131 6116 6132 // delete reg 6117 6133 if (val == 0) { … … 6185 6201 return 0; 6186 6202 } 6187 6203 6188 6204 // delete reg 6189 6205 if (!val || strcmp(val,"")==0) … … 6379 6395 if(pos == EQP_ACC) { //Accesories should only go in one of the two, 6380 6396 pos = req_pos&EQP_ACC; 6381 if (pos == EQP_ACC) //User specified both slots.. 6397 if (pos == EQP_ACC) //User specified both slots.. 6382 6398 pos = sd->equip_index[EQI_ACC_R] >= 0 ? EQP_ACC_L : EQP_ACC_R; 6383 6399 } … … 6564 6580 clif_unequipitemack(sd,n,sd->status.inventory[n].equip,1); 6565 6581 6566 if((sd->status.inventory[n].equip & EQP_ARMS) && 6582 if((sd->status.inventory[n].equip & EQP_ARMS) && 6567 6583 sd->weapontype1 == 0 && sd->weapontype2 == 0 && (!sd->sc.data[SC_SEVENWIND] || sd->sc.data[SC_ASPERSIO])) //Check for seven wind (but not level seven!) 6568 6584 skill_enchant_elemental_end(&sd->bl,-1); … … 6620 6636 if (sd->vender_id) //Avoid reorganizing items when we are vending, as that leads to exploits (pointed out by End of Exam) 6621 6637 return 0; 6622 6638 6623 6639 // ió«lß 6624 6640 for(i=j=0;i<MAX_INVENTORY;i++){ … … 6865 6881 hp = sd->battle_status.hp-1; //Script drains cannot kill you. 6866 6882 } 6867 6883 6868 6884 if (sd->sp_loss.value) { 6869 6885 sd->sp_loss.tick += diff_tick; … … 6894 6910 } 6895 6911 } 6896 6912 6897 6913 if (sd->sp_regen.value) { 6898 6914 sd->sp_regen.tick += diff_tick; … … 7000 7016 if (data == 0 && battle_config.day_duration <= 0) // if we want a day 7001 7017 return 0; 7002 7018 7003 7019 if (!night_flag) 7004 7020 return 0; //Already day. 7005 7021 7006 7022 night_flag = 0; // 0=day, 1=night [Yor] 7007 7023 map_foreachpc(pc_daynight_timer_sub); … … 7021 7037 if (data == 0 && battle_config.night_duration <= 0) // if we want a night 7022 7038 return 0; 7023 7039 7024 7040 if (night_flag) 7025 7041 return 0; //Already nigth. … … 7050 7066 time_t timer; 7051 7067 struct tm *t; 7052 7068 7053 7069 time(&timer); 7054 7070 t = localtime(&timer); 7055 7056 pc_setglobalreg(sd, "PC_LAST_DUEL_TIME", t->tm_mday*24*60 + t->tm_hour*60 + t->tm_min); 7071 7072 pc_setglobalreg(sd, "PC_LAST_DUEL_TIME", t->tm_mday*24*60 + t->tm_hour*60 + t->tm_min); 7057 7073 return; 7058 7074 } … … 7063 7079 time_t timer; 7064 7080 struct tm *t; 7065 7081 7066 7082 time(&timer); 7067 7083 t = localtime(&timer); 7068 7084 7069 7085 diff = t->tm_mday*24*60 + t->tm_hour*60 + t->tm_min - pc_readglobalreg(sd, "PC_LAST_DUEL_TIME"); 7070 7086 7071 7087 return !(diff >= 0 && diff < battle_config.duel_time_interval); 7072 7088 } … … 7078 7094 7079 7095 if (sd->duel_group != ssd->duel_group) return 0; 7080 7096 7081 7097 sprintf(output, " %d. %s", ++(*p), sd->status.name); 7082 7098 clif_disp_onlyself(ssd, output, strlen(output)); … … 7110 7126 int i=1; 7111 7127 char output[256]; 7112 7128 7113 7129 while(duel_list[i].members_count > 0 && i < MAX_DUEL) i++; 7114 7130 if(i == MAX_DUEL) return 0; 7115 7131 7116 7132 duel_count++; 7117 7133 sd->duel_group = i; … … 7119 7135 duel_list[i].invites_count = 0; 7120 7136 duel_list[i].max_players_limit = maxpl; 7121 7137 7122 7138 strcpy(output, msg_txt(372)); // " -- Duel has been created (@invite/@leave) --" 7123 7139 clif_disp_onlyself(sd, output, strlen(output)); 7124 7140 7125 7141 clif_set0199(sd, 1); 7126 7142 //clif_misceffect2(&sd->bl, 159); … … 7138 7154 target_sd->duel_invite = did; 7139 7155 duel_list[did].invites_count++; 7140 7156 7141 7157 // "Blue -- Player %s invites you to PVP duel (@accept/@reject) --" 7142 7158 sprintf(output, msg_txt(374), sd->status.name); … … 7156 7172 { 7157 7173 char output[256]; 7158 7174 7159 7175 // " <- Player %s has left duel --" 7160 7176 sprintf(output, msg_txt(375), sd->status.name); 7161 7177 clif_disp_message(&sd->bl, output, strlen(output), DUEL_WOS); 7162 7178 7163 7179 duel_list[did].members_count--; 7164 7180 7165 7181 if(duel_list[did].members_count == 0) { 7166 map_foreachpc(duel_leave_sub, did); 7182 map_foreachpc(duel_leave_sub, did); 7167 7183 duel_count--; 7168 7184 } 7169 7185 7170 7186 sd->duel_group = 0; 7171 7187 duel_savetime(sd); … … 7177 7193 { 7178 7194 char output[256]; 7179 7195 7180 7196 duel_list[did].members_count++; 7181 7197 sd->duel_group = sd->duel_invite; 7182 7198 duel_list[did].invites_count--; 7183 7199 sd->duel_invite = 0; 7184 7200 7185 7201 // " -> Player %s has accepted duel --" 7186 7202 sprintf(output, msg_txt(376), sd->status.name); … … 7195 7211 { 7196 7212 char output[256]; 7197 7213 7198 7214 // " -- Player %s has rejected duel --" 7199 7215 sprintf(output, msg_txt(377), sd->status.name); 7200 7216 clif_disp_message(&sd->bl, output, strlen(output), DUEL_WOS); 7201 7217 7202 7218 duel_list[did].invites_count--; 7203 7219 sd->duel_invite = 0; … … 7297 7313 if (pc_split_str(line,split,4) < 4) 7298 7314 continue; 7299 7315 7300 7316 job_count = pc_split_atoi(split[1],jobs,':',CLASS_COUNT); 7301 7317 if (job_count < 1) … … 7316 7332 maxlv = MAX_LEVEL; 7317 7333 } 7318 7334 7319 7335 job = jobs[0] = pc_class2idx(job_id); 7320 7336 //We send one less and then one more because the last entry in the exp array should hold 0. … … 7477 7493 if (i > MAX_LEVEL) 7478 7494 break; 7479 statp[i]=j; 7495 statp[i]=j; 7480 7496 i++; 7481 7497 } … … 7486 7502 for (; i <= MAX_LEVEL; i++) { 7487 7503 j += (i+15)/5; 7488 statp[i] = j; 7504 statp[i] = j; 7489 7505 } 7490 7506 … … 7518 7534 else 7519 7535 ShowWarning("In function pc_read_motd() -> File '"CL_WHITE"%s"CL_RESET"' not found.\n", motd_txt); 7520 7536 7521 7537 return 0; 7522 7538 } -
src/map/pc.h
r13 r19 1 // Copyright (c) Athena Dev Teams - Licensed under GNU GPL 1 // Copyright (c) Athena Dev Teams - Licensed under GNU GPL =D 2 2 // For more information, see LICENCE in the main folder 3 3 … … 114 114 unsigned short autolootid; // [Zephyrus] 115 115 unsigned noks : 3; // [Zeph Kill Steal Protection] 116 <<<<<<< .mine 117 unsigned showsummon : 1; //Show summoned monster stats [Brainstorm] 118 ======= 116 119 //Custom Jobs (blackmagic) 117 120 … … 122 125 unsigned god :1; //[Sketchy] 123 126 unsigned demon :1; //[Sketchy] 127 >>>>>>> .r17 124 128 bool changemap; 125 129 struct guild *gmaster_flag; -
src/map/skill.c
r13 r19 42 42 #define GD_SKILLRANGEMIN 900 43 43 #define GD_SKILLRANGEMAX GD_SKILLRANGEMIN+MAX_GUILDSKILL 44 #define HM_SKILLRANGEMIN 1100 //Custom Jobs (blackmagic)//Custom Job End44 #define HM_SKILLRANGEMIN 1100 45 45 #define HM_SKILLRANGEMAX HM_SKILLRANGEMIN+MAX_HOMUNSKILL 46 46 … … 283 283 struct status_change* sc; 284 284 sc = status_get_sc(bl); 285 285 286 286 // Never copy NPC/Wedding Skills 287 287 if (skill_get_inf2(skillid)&(INF2_NPC_SKILL|INF2_WEDDING_SKILL)) … … 300 300 if ((skillid == AL_INCAGI || skillid == AL_BLESSING)) 301 301 return 0; 302 302 303 303 return 1; 304 304 } … … 306 306 // [MouseJstr] - skill ok to cast? and when? 307 307 int skillnotok (int skillid, struct map_session_data *sd) 308 { 308 { 309 309 int i,m; 310 310 nullpo_retr (1, sd); 311 311 m = sd->bl.m; 312 312 i = skill_get_index(skillid); 313 313 314 314 if (i == 0) 315 315 return 1; // invalid skill id 316 316 317 317 if (battle_config.gm_skilluncond && pc_isGM(sd) >= battle_config.gm_skilluncond) 318 318 return 0; // GMs can do any damn thing they want … … 354 354 return 1; 355 355 } 356 break; 356 break; 357 357 case MC_VENDING: 358 358 case MC_IDENTIFY: … … 387 387 if (i == 0) 388 388 return 1; // invalid skill id 389 389 390 390 if (hd->blockskill[i] > 0) 391 391 return 1; … … 396 396 397 397 struct s_skill_unit_layout* skill_get_unit_layout (int skillid, int skilllv, struct block_list* src, int x, int y) 398 { 398 { 399 399 int pos = skill_get_unit_layout_type(skillid,skilllv); 400 400 int dir; … … 420 420 421 421 /*========================================== 422 * 422 * 423 423 *------------------------------------------*/ 424 424 int skill_additional_effect (struct block_list* src, struct block_list *bl, int skillid, int skilllv, int attack_type, unsigned int tick) … … 450 450 if (!tsc) //skill additional effect is about adding effects to the target... 451 451 //So if the target can't be inflicted with statuses, this is pointless. 452 return 0; 452 return 0; 453 453 454 454 switch(skillid) … … 482 482 (2000 - 4*sstatus->agi - 2*sstatus->dex))) 483 483 ; //Stance triggered 484 else if(sc->data[SC_READYTURN] && 484 else if(sc->data[SC_READYTURN] && 485 485 sc_start(src,SC_COMBO, 15, TK_TURNKICK, 486 486 (2000 - 4*sstatus->agi - 2*sstatus->dex))) … … 492 492 rate += rate*sc->data[SC_SKILLRATE_UP]->val2/100; 493 493 status_change_end(src,SC_SKILLRATE_UP,-1); 494 } 494 } 495 495 sc_start4(src,SC_COMBO, rate, TK_COUNTER, bl->id,0,0, 496 496 (2000 - 4*sstatus->agi - 2*sstatus->dex)); … … 662 662 case NPC_PETRIFYATTACK: 663 663 sc_start4(bl,status_skill2sc(skillid),50+10*skilllv, 664 skilllv,0,0,skill_get_time(skillid,skilllv), 664 skilllv,0,0,skill_get_time(skillid,skilllv), 665 665 skill_get_time2(skillid,skilllv)); 666 666 break; … … 680 680 sc_start(bl,SC_BLEEDING,(20*skilllv),skilllv,skill_get_time2(skillid,skilllv)); 681 681 break; 682 case NPC_MENTALBREAKER: 682 case NPC_MENTALBREAKER: 683 683 { //Based on observations by Tharis, Mental Breaker should do SP damage 684 684 //equal to Matk*skLevel. … … 785 785 if (tsc->data[SC_ADRENALINE2]) 786 786 status_change_end(bl, SC_ADRENALINE2, -1); 787 } 787 } 788 788 break; 789 789 case TK_TURNKICK: … … 821 821 sc_start(bl,SC_CRITICALWOUND,100,skilllv,skill_get_time2(skillid,skilllv)); 822 822 break; 823 <<<<<<< .mine 824 case NC_GHOULTOUCH: //Necro Ghoul Touch [Brain] 825 if (battle_check_living(tstatus->race, tstatus->def_ele)) //Check if target is a living creature before proceed 826 sc_start(bl,SC_POISON,10000,skilllv,skill_get_time2(skillid,skilllv)); 827 break; 828 case NC_PWSUFFER: //Necro Power Word: Suffer [Brain] 829 case WL_PWAGONY: //Warlock Power Word: Agony [Brain] 830 if (battle_check_living(tstatus->race, tstatus->def_ele)) //Check if target is a living creature before proceed 831 sc_start(bl,skillid==NC_PWSUFFER?SC_SUFFER:SC_AGONY,1000,skilllv,skill_get_time2(skillid,skilllv)); 832 break; 833 case WL_SEARING: //Warlock Searing Pain [Brain] 834 //The DoT is only initiated if target isnt burning already. 835 if(!tsc->data[SC_SEARING] && !tsc->data[SC_IMMOLATE]) 836 sc_start(bl,SC_SEARING,10000,skilllv,skill_get_time2(skillid,skilllv)); 837 break; 838 case WL_IMMOLATE: //Warlock Immolate [Brain] 839 //The DoT is only initiated if target isnt in immolate, but must be in searing pain status 840 if(tsc->data[SC_SEARING] && !tsc->data[SC_IMMOLATE]) 841 sc_start(bl,SC_IMMOLATE,10000,skilllv,skill_get_time2(skillid,skilllv)); 842 break; 843 case WL_SHADOWBURN: //Warlock Shadow Burn [Brain] 844 sc_start(bl,SC_STUN,10000,skilllv,skill_get_time(skillid,skilllv)); 845 break; 846 //Mercenary Skills [Brainstorm] 847 /* case MS_BASH: 848 sc_start(bl,SC_STUN,5*(skilllv-5),skilllv,skill_get_time(skillid,skilllv)); 849 break; 850 case MER_CRASH: 851 sc_start(bl,SC_STUN,6*skilllv,skilllv,skill_get_time(skillid,skilllv)); 852 break;*/ 853 ======= 823 854 //Custom Jobs (blackmagic) 824 855 case NC_GHOULTOUCH: //Necro Ghoul Touch [Brain] … … 845 876 break; 846 877 //Custom Job End 878 >>>>>>> .r18 847 879 } 848 880 … … 956 988 if(sd && sd->classchange && attack_type&BF_WEAPON && 957 989 dstmd && !(tstatus->mode&MD_BOSS) && 958 (rand()%10000 < sd->classchange)) 990 (rand()%10000 < sd->classchange)) 959 991 { 960 992 struct mob_db *mob; … … 965 997 class_ = rand() % MAX_MOB_DB; 966 998 } while (!mobdb_checkid(class_)); 967 999 968 1000 rate = rand() % 1000000; 969 1001 mob = mob_db(class_); … … 979 1011 980 1012 /* Splitted off from skill_additional_effect, which is never called when the 981 * attack skill kills the enemy. Place in this function counter status effects 982 * when using skills (eg: Asura's sp regen penalty, or counter-status effects 1013 * attack skill kills the enemy. Place in this function counter status effects 1014 * when using skills (eg: Asura's sp regen penalty, or counter-status effects 983 1015 * from cards) that will take effect on the source, not the target. [Skotlex] 984 * Note: Currently this function only applies to Extremity Fist and BF_WEAPON 1016 * Note: Currently this function only applies to Extremity Fist and BF_WEAPON 985 1017 * type of skills, so not every instance of skill_additional_effect needs a call 986 1018 * to this one. … … 992 1024 struct map_session_data *dstsd=NULL; 993 1025 struct status_change *tsc; 994 1026 995 1027 nullpo_retr(0, src); 996 1028 nullpo_retr(0, bl); … … 1010 1042 if(tsc && tsc->data[SC_KAAHI] && tsc->data[SC_KAAHI]->val4 == -1) 1011 1043 tsc->data[SC_KAAHI]->val4 = add_timer( 1012 tick+skill_get_time2(SL_KAAHI,tsc->data[SC_KAAHI]->val1), 1044 tick+skill_get_time2(SL_KAAHI,tsc->data[SC_KAAHI]->val1), 1013 1045 kaahi_heal_timer, bl->id, SC_KAAHI); //Activate heal. 1014 1046 break; … … 1042 1074 status_heal(src, 0, status_get_lv(bl)*(95+15*rate)/100, 2); 1043 1075 } 1076 <<<<<<< .mine 1077 1078 // Warlock Soul Steal [Brain] 1079 if(sd && skillid && attack_type&BF_MAGIC && status_isdead(bl) 1080 && !(skill_get_inf(skillid)&(INF_GROUND_SKILL|INF_SELF_SKILL)) 1081 && (rate=pc_checkskill(sd,WL_SOULSTEAL))>0){// Wont work with area/ground spells (hellfire) 1082 if (pc_issit(sd)) pc_setstand(sd); 1083 clif_skill_nodamage(src,bl,WL_SOULSTEAL,rate,1); 1084 clif_specialeffect(src, 253, AREA); // Absorb Mana effect on caster 1085 status_heal(src, 0, status_get_lv(bl)*(90+10*rate)/100, 2); 1086 if(rand()%100 < rate) skill_additem(src,src,15020,1); //Chance to "steal" the target soul 1087 ======= 1044 1088 //Custom Jobs (blackmagic) 1045 1089 // Warlock Soul Steal [Brain] … … 1052 1096 status_heal(src, 0, status_get_lv(bl)*(90+10*rate)/100, 2); 1053 1097 if(rand()%100 < rate) skill_additem(src,src,15020,1); //Chance to "steal" the target soul 1054 } 1055 //Custom Job End 1098 >>>>>>> .r18 1099 } 1100 1056 1101 if(dstsd && attack_type&BF_WEAPON) 1057 1102 { //Counter effects. … … 1064 1109 rate+=dstsd->addeff2[i].arrow_rate; 1065 1110 if (!rate) continue; 1066 1111 1067 1112 if ((dstsd->addeff2[i].flag&(ATF_LONG|ATF_SHORT)) != (ATF_LONG|ATF_SHORT)) 1068 1113 { //Trigger has range consideration. … … 1073 1118 type = dstsd->addeff2[i].id; 1074 1119 time = skill_get_time2(status_sc2skill(type),7); 1075 1120 1076 1121 if (dstsd->addeff2[i].flag&ATF_TARGET) 1077 1122 status_change_start(src,type,rate,7,0,0,0,time,0); 1078 1123 1079 1124 if (dstsd->addeff2[i].flag&ATF_SELF && !status_isdead(bl)) 1080 1125 status_change_start(bl,type,rate,7,0,0,0,time,0); … … 1084 1129 // Trigger counter-spells to retaliate against damage causing skills. 1085 1130 if(dstsd && !status_isdead(bl) && src != bl && dstsd->autospell2[0].id && 1086 !(skillid && skill_get_nk(skillid)&NK_NO_DAMAGE)) 1131 !(skillid && skill_get_nk(skillid)&NK_NO_DAMAGE)) 1087 1132 { 1088 1133 struct block_list *tbl; … … 1104 1149 if (attack_type&BF_LONG) 1105 1150 rate>>=1; 1106 1151 1107 1152 if (skillnotok(skillid, dstsd)) 1108 1153 continue; … … 1113 1158 else 1114 1159 tbl = src; 1115 1160 1116 1161 switch (skill_get_casttype(skillid)) { 1117 1162 case CAST_GROUND: … … 1137 1182 //Auto-script when attacked 1138 1183 if(dstsd && !status_isdead(bl) && src != bl && dstsd->autoscript2[0].script && 1139 !(skillid && skill_get_nk(skillid)&NK_NO_DAMAGE)) 1184 !(skillid && skill_get_nk(skillid)&NK_NO_DAMAGE)) 1140 1185 { 1141 1186 int i; … … 1161 1206 (BCT_ENEMY/BCT_PARTY/BCT_SELF) are the valid values. 1162 1207 --------------------------------------------------------------------------*/ 1163 int skill_break_equip (struct block_list *bl, unsigned short where, int rate, int flag) 1208 int skill_break_equip (struct block_list *bl, unsigned short where, int rate, int flag) 1164 1209 { 1165 1210 const int where_list[4] = {EQP_WEAPON, EQP_ARMOR, EQP_SHIELD, EQP_HELM}; … … 1263 1308 for (i = 0; i < ARRAYLENGTH(pos); i++) { 1264 1309 if (where&pos[i] && sc->data[sc_def[i]]) 1265 where&=~pos[i]; 1310 where&=~pos[i]; 1266 1311 } 1267 1312 if (!where) return 0; … … 1293 1338 if (count == 0) 1294 1339 return 0; //Actual knockback distance is 0. 1295 1340 1296 1341 switch (target->type) 1297 1342 { … … 1328 1373 1329 1374 if (!su) 1330 unit_stop_walking(target,0); 1375 unit_stop_walking(target,0); 1331 1376 1332 1377 dx = nx - target->x; … … 1345 1390 map_foreachinmovearea(clif_insight, target, AREA_SIZE, -dx, -dy, target->type == BL_PC ? BL_ALL : BL_PC, target); 1346 1391 1347 if(!(flag&0x1)) 1392 if(!(flag&0x1)) 1348 1393 clif_blown(target); 1349 1394 … … 1393 1438 * flag&0xFFF is passed to the underlying battle_calc_attack for processing 1394 1439 * (usually holds number of targets, or just 1 for simple splash attacks) 1395 * flag&0x1000 is used to tag that this is a splash-attack (so the damage 1440 * flag&0x1000 is used to tag that this is a splash-attack (so the damage 1396 1441 * packet shouldn't display a skill animation) 1397 1442 * flag&0x2000 is used to signal that the skilllv should be passed as -1 to the … … 1494 1539 } 1495 1540 } 1496 1541 1497 1542 if(sc && sc->data[SC_MAGICROD] && src == dsrc) { 1498 1543 int sp = skill_get_sp(skillid,skilllv); … … 1508 1553 1509 1554 damage = dmg.damage + dmg.damage2; 1510 1511 if (skillid == AL_INCAGI || skillid == AL_BLESSING) 1512 if (tsd->sc.data[SC_CHANGEUNDEAD]) 1513 damage = 1; 1555 1556 if( (skillid == AL_INCAGI || skillid == AL_BLESSING) && tsd->sc.data[SC_CHANGEUNDEAD] ) 1557 damage = 1; 1514 1558 1515 1559 if (damage > 0 && dmg.flag&BF_WEAPON && src != bl && src == dsrc && … … 1520 1564 type=(skillid==0)?5:skill_get_hit(skillid); 1521 1565 1522 if(damage < dmg.div_ 1566 if(damage < dmg.div_ 1523 1567 //Only skills that knockback even when they miss. [Skotlex] 1524 1568 && skillid != CH_PALMSTRIKE) … … 1649 1693 break; 1650 1694 } 1651 1695 1652 1696 map_freeblock_lock(); 1653 1697 … … 1682 1726 } 1683 1727 } 1684 if (skillid != WZ_SIGHTRASHER && 1685 skillid != WZ_SIGHTBLASTER && 1728 if (skillid != WZ_SIGHTRASHER && 1729 skillid != WZ_SIGHTBLASTER && 1686 1730 skillid != AC_SHOWER && 1687 1731 skillid != SM_MAGNUM && … … 1705 1749 if (!status_isdead(bl)) 1706 1750 skill_additional_effect(src,bl,skillid,skilllv,attack_type,tick); 1707 //Counter status effects [Skotlex] 1751 //Counter status effects [Skotlex] 1708 1752 skill_counter_additional_effect(dsrc,bl,skillid,skilllv,attack_type,tick); 1709 1753 } … … 1723 1767 skill_blown(dsrc,bl,dmg.blewcount,direction,0); 1724 1768 } 1725 1769 1726 1770 //Delayed damage must be dealt after the knockback (it needs to know actual position of target) 1727 1771 if (dmg.amotion) … … 1755 1799 1756 1800 if (!(flag&2) && 1757 ( 1801 ( 1758 1802 skillid == MG_COLDBOLT || skillid == MG_FIREBOLT || skillid == MG_LIGHTNINGBOLT 1759 1803 ) && … … 1800 1844 if(battle_check_target(src,bl,flag) > 0) 1801 1845 { 1802 if (flag&(SD_SPLASH|SD_PREAMBLE)) { 1803 if (flag&SD_PREAMBLE && !skill_area_temp[2]) 1804 clif_skill_damage(src,bl,tick, status_get_amotion(src), 0, -30000, 1, skill_id, skill_lv, 6); 1846 // several splash skills need this initial dummy packet to display correctly 1847 if (flag&SD_PREAMBLE && skill_area_temp[2] == 0) 1848 clif_skill_damage(src,bl,tick, status_get_amotion(src), 0, -30000, 1, skill_id, skill_lv, 6); 1849 1850 if (flag&(SD_SPLASH|SD_PREAMBLE)) 1805 1851 skill_area_temp[2]++; 1806 } 1852 1807 1853 return func(src,bl,skill_id,skill_lv,tick,flag); 1808 1854 } … … 1927 1973 struct map_session_data *sd; 1928 1974 int gid, id, strvit, agidex; 1929 1975 1930 1976 sd = (struct map_session_data *)bl; 1931 1977 … … 1967 2013 int i,j,hp,sp,hp_rate,sp_rate,state,mhp ; 1968 2014 int itemid[10],amount[ARRAYLENGTH(itemid)],index[ARRAYLENGTH(itemid)]; 1969 2015 1970 2016 nullpo_retr(0, hd); 1971 2017 sd = hd->master; … … 2102 2148 target = src; //Required since it has to warp. 2103 2149 if(target == NULL) 2104 break; 2150 break; 2105 2151 if(target->prev == NULL) 2106 2152 break; … … 2145 2191 } 2146 2192 break; 2193 <<<<<<< .mine 2194 2195 case NC_PWSUFFER: //Necro Power Word: Suffer [Brain] 2196 if (!status_isdead(target) && status_get_sc(target)->data[SC_SUFFER]){ 2197 skill_attack(BF_MAGIC,src,src,target,skl->skill_id,skl->skill_lv,tick,skl->flag|SD_ANIMATION|SD_LEVEL); 2198 clif_specialeffect(target, 180, AREA); //Shadow Hit Effect on target 2199 if (skl->type>1 && !status_isdead(target)) 2200 skill_addtimerskill(src,tick+3000,target->id,0,0,skl->skill_id,skl->skill_lv,skl->type-1,skl->flag|SD_ANIMATION); 2201 } 2202 break; 2203 case WL_SEARING: //Warlock Searing Pain [Brain] 2204 if (!status_isdead(target) && status_get_sc(target)->data[SC_SEARING]){ 2205 skill_attack(BF_MAGIC,src,target,target,skl->skill_id,skl->skill_lv,tick,skl->flag|SD_ANIMATION|SD_LEVEL); 2206 clif_specialeffect(target, 49, AREA); //Fire Hit Effect on target 2207 if (skl->type>1 && !status_isdead(target)) 2208 skill_addtimerskill(src,tick+3000,target->id,0,0,skl->skill_id,skl->skill_lv,skl->type-1,skl->flag|SD_ANIMATION); 2209 } 2210 break; 2211 case WL_IMMOLATE: //Warlock Immolate [Brain] 2212 if (!status_isdead(target) && status_get_sc(target)->data[SC_IMMOLATE]){ 2213 skill_attack(BF_MAGIC,src,target,target,skl->skill_id,skl->skill_lv,tick,skl->flag|SD_ANIMATION|SD_LEVEL); 2214 clif_specialeffect(target, 97, AREA); //Firepillar Hit Effect on target 2215 if (skl->type>1 && !status_isdead(target)) 2216 skill_addtimerskill(src,tick+3000,target->id,0,0,skl->skill_id,skl->skill_lv,skl->type-1,skl->flag|SD_ANIMATION); 2217 } 2218 break; 2219 case WL_PWAGONY: //Warlock Power Word: Agony [Brain] 2220 if (!status_isdead(target) && status_get_sc(target)->data[SC_AGONY]){ 2221 skill_attack(BF_MAGIC,src,target,target,skl->skill_id,skl->skill_lv,tick,skl->flag|SD_ANIMATION|SD_LEVEL); 2222 clif_specialeffect(target, 587, AREA); //Big Purple Flame Effect on target 2223 if (skl->type>1 && !status_isdead(target)) 2224 skill_addtimerskill(src,tick+3000,target->id,0,0,skl->skill_id,skl->skill_lv,skl->type-1,skl->flag|SD_ANIMATION); 2225 } 2226 break; 2227 2228 ======= 2147 2229 //Custom Jobs (blackmagic) 2148 2230 … … 2181 2263 2182 2264 //Custom Job End 2265 >>>>>>> .r18 2183 2266 default: 2184 2267 skill_attack(skl->type,src,src,target,skl->skill_id,skl->skill_lv,tick,skl->flag); … … 2216 2299 ud = unit_bl2ud(src); 2217 2300 nullpo_retr(1, ud); 2218 2301 2219 2302 ARR_FIND( 0, MAX_SKILLTIMERSKILL, i, ud->skilltimerskill[i] == 0 ); 2220 2303 if( i == MAX_SKILLTIMERSKILL ) return 1; 2221 2304 2222 2305 ud->skilltimerskill[i] = ers_alloc(skill_timer_ers, struct skill_timerskill); 2223 2306 ud->skilltimerskill[i]->timer = add_timer(tick, skill_timerskill, src->id, i); … … 2244 2327 ud = unit_bl2ud(src); 2245 2328 nullpo_retr(0, ud); 2246 2329 2247 2330 for(i=0;i<MAX_SKILLTIMERSKILL;i++) { 2248 2331 if(ud->skilltimerskill[i]) { … … 2281 2364 2282 2365 nullpo_retr(1, src); 2283 nullpo_retr(1, bl); 2366 nullpo_retr(1, bl); 2284 2367 2285 2368 if (src->m != bl->m) … … 2288 2371 if (bl->prev == NULL) 2289 2372 return 1; 2290 2373 2291 2374 sd = BL_CAST(BL_PC, src); 2292 2375 tsd = BL_CAST(BL_PC, bl); … … 2304 2387 } 2305 2388 2306 sc = status_get_sc(src); 2389 sc = status_get_sc(src); 2307 2390 if (sc && !sc->count) 2308 2391 sc = NULL; //Unneeded … … 2393 2476 case NPC_BLEEDING: 2394 2477 case NPC_CRITICALWOUND: 2478 /*Mercenary Skills [Brainstorm] 2479 case MS_BASH: 2480 case MA_DOUBLE: 2481 case MA_CHARGEARROW: 2482 case ML_PIERCE: 2483 case ML_SPIRALPIERCE: 2484 case MER_CRASH: 2395 2485 skill_attack(BF_WEAPON,src,src,bl,skillid,skilllv,tick,flag); 2486 <<<<<<< .mine 2487 break;*/ 2488 case NC_GHOULTOUCH: //Necro Ghoul Touch [Brain] 2489 skill_attack(BF_WEAPON,src,src,bl,skillid,skilllv,tick,flag); 2490 clif_specialeffect(bl, 124, AREA); //Venom Dust Effect on target 2491 break; 2492 case NC_DEATHHAND: //Necro Death Hand [Brain] 2493 skill_attack(BF_WEAPON,src,src,bl,skillid,skilllv,tick,flag|SD_LEVEL);//Hide skill yell 2494 clif_specialeffect(bl, 65, AREA); //Power absorb Effect on target 2495 if (battle_check_living(tstatus->race, tstatus->def_ele)){ //Check if target is a living creature before proceed 2496 int chance = (10+(skilllv*2)+(status_get_luk(src)-status_get_luk(bl))/5); 2497 //10% chance + 2% per skilllv + (caster luk - target luk)/5 % 2498 if (rand()%100 < chance) { 2499 clif_skill_nodamage(src,bl,skillid,-1,flag|SD_LEVEL);//Hide skill yell 2500 status_percent_damage(src, bl, 100, 0, true); //Instant kill our target 2501 } else clif_skill_fail(sd,skillid,0,0); 2502 } 2503 break; 2504 ======= 2396 2505 break; 2397 2506 //Custom Jobs (blackmagic) … … 2414 2523 break; 2415 2524 //Custom Job End 2525 >>>>>>> .r18 2526 2416 2527 2417 2528 case LK_JOINTBEAT: // decide the ailment first (affects attack damage and effect) … … 2446 2557 map_foreachinrange(skill_attack_area, src, 2447 2558 skill_get_splash(skillid, skilllv), splash_target(src), 2448 BF_WEAPON, src, src, skillid, skilllv, tick, flag, BCT_ENEMY); 2559 BF_WEAPON, src, src, skillid, skilllv, tick, flag, BCT_ENEMY); 2449 2560 break; 2450 2561 … … 2588 2699 //Splash attack skills. 2589 2700 case AS_GRIMTOOTH: 2590 case MC_CARTREVOLUTION: 2701 case MC_CARTREVOLUTION: 2591 2702 case NPC_SPLASHATTACK: 2592 2703 flag |= SD_PREAMBLE; // a fake packet will be sent for the first target to be hit … … 2594 2705 case SM_MAGNUM: 2595 2706 case HT_BLITZBEAT: 2596 case AC_SHOWER: 2707 case AC_SHOWER: 2597 2708 case MG_NAPALMBEAT: 2598 2709 case MG_FIREBALL: … … 2651 2762 if (skill_area_temp[1] != bl->id) 2652 2763 skill_attack(skill_get_type(skillid), src, src, bl, skillid, skilllv, tick, flag|SD_ANIMATION); 2653 else 2764 else 2654 2765 skill_attack(skill_get_type(skillid), src, src, bl, skillid, skilllv, tick, flag); 2655 2766 break; … … 2716 2827 skill_castend_nodamage_id); 2717 2828 } 2718 break; 2829 break; 2719 2830 case CH_PALMSTRIKE: // Palm Strike takes effect 1sec after casting. [Skotlex] 2720 2831 // clif_skill_nodamage(src,bl,skillid,skilllv,0); //Can't make this one display the correct attack animation delay :/ 2721 2832 clif_damage(src,bl,tick,status_get_amotion(src),0,-1,1,4,0); //Display an absorbed damage attack. 2722 2833 skill_addtimerskill(src, tick + 1000, bl->id, 0, 0, skillid, skilllv, BF_WEAPON, flag); 2723 break; 2834 break; 2724 2835 2725 2836 case PR_TURNUNDEAD: … … 2749 2860 skill_attack(BF_MAGIC,src,src,bl,skillid,skilllv,tick,flag); 2750 2861 break; 2862 <<<<<<< .mine 2863 case AD_DARKHEAL: // Adept Dark Heal [Brain] 2864 clif_specialeffect(bl, 656, AREA); //Blinking Green Sprite Effect on target 2865 skill_attack(BF_MAGIC,src,src,bl,skillid,skilllv,tick,flag); //Exception because we must add the effect manually =/ 2866 break; 2867 case NC_PWSUFFER: //Necro Power Word: Suffer [Brain] 2868 if(battle_check_living(tstatus->race,tstatus->def_ele)){ 2869 skill_attack(BF_MAGIC,src,src,bl,skillid,skilllv,tick,flag); 2870 clif_specialeffect(bl, 180, AREA); //Shadow hit Effect on target 2871 clif_specialeffect(src, 454, AREA); //Black Cast Effect on caster 2872 //If target is on suffering status already, just cause damage, no extra DoT 2873 if(!status_get_sc(bl)->data[SC_SUFFER]) 2874 skill_addtimerskill(src,tick+3000,bl->id,0,0,skillid,skilllv,skilllv,flag); 2875 } 2876 else clif_skill_fail(sd,skillid,0,0); 2877 break; 2878 case NC_DRAINLIFE: // Necromancer Drain Life [Brain] 2879 { 2880 int heal = skill_attack(BF_MAGIC, src, src, bl, skillid, skilllv, tick, flag)/2; 2881 if (heal > 0 && (battle_check_living(tstatus->race,tstatus->def_ele))){ 2882 clif_skill_nodamage(NULL, src, AL_HEAL, heal, 1); 2883 status_heal(src, heal, 0, 0); 2884 } 2885 } 2886 clif_specialeffect(bl, 180, AREA); //Shadow hit Effect on target 2887 clif_specialeffect(src, 454, AREA); //Black Cast Effect on caster 2888 break; 2889 case WL_SHADOWBOLT: // Warlock Shadowbolt [Brain] 2890 clif_specialeffect(bl, 180, AREA); //Shadow hit Effect on target 2891 clif_specialeffect(src, 454, AREA); //Black Cast Effect on caster 2892 skill_attack(BF_MAGIC,src,src,bl,skillid,skilllv,tick,flag); //Again, the effect...cursed effects... 2893 break; 2894 case WL_SHADOWBURN: // Warlock Shadow Burn [Brain] 2895 clif_specialeffect(bl, 180, AREA); //Shadow hit Effect on target 2896 clif_specialeffect(bl, 32, AREA); //Flame Engulf Effect on target 2897 clif_specialeffect(src, 454, AREA); //Black Cast Effect on caster 2898 skill_attack(BF_MAGIC,src,src,bl,skillid,skilllv,tick,flag); 2899 break; 2900 case WL_SEARING: // Warlock Searing Pain [Brain] 2901 clif_specialeffect(bl, 406, AREA); //Fire on Head Effect on target 2902 clif_specialeffect(src, 55, AREA); //Red Cast Effect on caster 2903 skill_attack(BF_MAGIC,src,src,bl,skillid,skilllv,tick,flag); 2904 //if target is on searing status already, just cause damage, no extra DoT 2905 if(!status_get_sc(bl)->data[SC_SEARING]) 2906 skill_addtimerskill(src,tick+3000,bl->id,0,0,skillid,skilllv,4,flag); 2907 break; 2908 case WL_CONFLAGRATE: // Warlock Conflagrate [Brain] 2909 if(status_get_sc(bl)->data[SC_IMMOLATE]) { // Can only be casted if target is immolating status 2910 clif_specialeffect(bl, 183, AREA); //Explosion Effect on target 2911 clif_specialeffect(src, 55, AREA); //Red Cast Effect on caster 2912 skill_attack(BF_MAGIC,src,src,bl,skillid,skilllv,tick,flag); 2913 status_change_end(bl,SC_IMMOLATE,-1); //End Immolating status 2914 } else clif_skill_fail(sd,skillid,0,0); 2915 break; 2916 case WL_IMMOLATE: // Warlock Immolate [Brain] 2917 clif_specialeffect(bl, 635, AREA); //Dragon Fire Effect on target 2918 clif_specialeffect(src, 55, AREA); //Red Cast Effect on caster 2919 skill_attack(BF_MAGIC,src,src,bl,skillid,skilllv,tick,flag); 2920 //If Target is on searing pain status, will change immolating status instead 2921 if(!status_get_sc(bl)->data[SC_IMMOLATE]) 2922 skill_addtimerskill(src,tick+3000,bl->id,0,0,skillid,skilllv,5,flag); 2923 break; 2924 case WL_CURSEDOOM: // Warlock Curse of Doom [Brain] 2925 clif_specialeffect(bl, 183, AREA); //Explosion Effect on target 2926 skill_attack(BF_MAGIC,src,bl,bl,skillid,skilllv,tick,flag|SD_ANIMATION); 2927 break; 2928 case WL_PWAGONY: // Warlock Power Word: Agony [Brain] 2929 if(battle_check_living(tstatus->race,tstatus->def_ele)){ 2930 skill_attack(BF_MAGIC,src,src,bl,skillid,skilllv,tick,flag); 2931 clif_specialeffect(bl, 587, AREA); //Big Purple Flame Effect on target 2932 clif_specialeffect(src, 454, AREA); //Black Cast Effect on caster 2933 //If target is on Agonizing status already, just cause damage, no extra DoT 2934 if(!status_get_sc(bl)->data[SC_AGONY]) 2935 skill_addtimerskill(src,tick+3000,bl->id,0,0,skillid,skilllv,skilllv,flag); 2936 } 2937 else clif_skill_fail(sd,skillid,0,0); 2938 break; 2939 ======= 2751 2940 //Custom Jobs (blackmagic) 2752 2941 >>>>>>> .r18 2942 2943 <<<<<<< .mine 2944 ======= 2753 2945 2754 2946 case AD_DARKHEAL: // Adept Dark Heal [Brain] … … 2830 3022 2831 3023 //Custom Job End 3024 >>>>>>> .r18 2832 3025 2833 3026 case NPC_MAGICALATTACK: … … 2867 3060 count++; // natural water cell 2868 3061 else 2869 if( (unit = map_find_skill_unit_oncell(src,x,y,SA_DELUGE,NULL)) != NULL 3062 if( (unit = map_find_skill_unit_oncell(src,x,y,SA_DELUGE,NULL)) != NULL 2870 3063 || (unit = map_find_skill_unit_oncell(src,x,y,NJ_SUITON,NULL)) != NULL ) 2871 3064 { … … 2932 3125 skill_attack(BF_MAGIC,src,src,src,skillid,skilllv,tick,flag); 2933 3126 status_percent_damage(src, src, 0, 100, false); 2934 } 3127 } 2935 3128 if (sd) skill_blockpc_start (sd, skillid, (skilllv < 5 ? 10000: 15000)); 2936 3129 break; … … 2993 3186 } 2994 3187 2995 map_freeblock_unlock(); 3188 map_freeblock_unlock(); 2996 3189 2997 3190 if (sd && !(flag&1) && sd->state.arrow_atk) //Consume arrow on last invocation to this skill. … … 3001 3194 3002 3195 /*========================================== 3003 * 3196 * 3004 3197 *------------------------------------------*/ 3005 3198 int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, int skillid, int skilllv, unsigned int tick, int flag) … … 3015 3208 int i; 3016 3209 enum sc_type type; 3017 3210 3018 3211 if(skillid > 0 && skilllv <= 0) return 0; // celest 3019 3212 … … 3035 3228 if(status_isdead(src)) 3036 3229 return 1; 3230 <<<<<<< .mine 3231 3232 ======= 3037 3233 //Custom Jobs (blackmagic) 3038 3234 /*if(src!=bl && status_isdead(bl) && skillid != ALL_RESURRECTION && skillid != PR_REDEMPTIO)*/ 3039 3235 // Added DEATHPACT [Brain] 3040 3236 //if(src!=bl && status_isdead(bl) && skillid != ALL_RESURRECTION && skillid != PR_REDEMPTIO) 3237 >>>>>>> .r18 3041 3238 if(src!=bl && status_isdead(bl) && skillid != ALL_RESURRECTION && skillid != PR_REDEMPTIO && skillid != NC_DEATHPACT) 3042 3239 return 1; 3043 //Custom Job End 3240 3044 3241 tstatus = status_get_status_data(bl); 3045 3242 sstatus = status_get_status_data(src); 3046 3243 3047 3244 //Check for undead skills that convert a no-damage skill into a damage one. [Skotlex] 3048 3245 switch (skillid) { … … 3065 3262 } 3066 3263 break; 3264 <<<<<<< .mine 3265 case AD_DARKHEAL: // Adept Dark Heal [Brain] 3266 // Only player casted spells can be offensive (copyed from AL_HEAL code above) 3267 if (sd && (battle_check_living(tstatus->race,tstatus->def_ele)) //Check if target is a living creature 3268 && !pc_checkskill(dstsd,NC_PHYLACTERY) //Or he doesnt have Phylactery (non-perma undead) 3269 && !status_get_sc(bl)->data[SC_OVERWHELMING]) { //Or Overwhelming Evil is off (most cases) 3270 if (battle_check_target(src, bl, BCT_ENEMY) < 1) { 3271 //Offensive heal does not works on non-enemies. 3272 clif_skill_fail(sd,skillid,0,0); 3273 return 0; 3274 } 3275 return skill_castend_damage_id(src, bl, skillid, skilllv, tick, flag); 3276 } 3277 break; 3278 3279 ======= 3067 3280 //Custom Jobs (blackmagic) 3068 3281 … … 3082 3295 3083 3296 //Custom Job End 3297 >>>>>>> .r18 3084 3298 case NPC_SMOKING: //Since it is a self skill, this one ends here rather than in damage_id. [Skotlex] 3085 3299 return skill_castend_damage_id (src, bl, skillid, skilllv, tick, flag); … … 3108 3322 int heal = skill_calc_heal(src, bl, skilllv); 3109 3323 int heal_get_jobexp; 3110 3324 3111 3325 if (status_isimmune(bl) || (dstmd && dstmd->class_ == MOBID_EMPERIUM)) 3112 3326 heal=0; 3327 <<<<<<< .mine 3328 // Profane Soul reduces the healed recieved by 3% per skilllv [Brain] 3329 if(dstsd) { 3330 heal = heal * (100 - pc_checkskill(dstsd,AD_PROFANE)*3)/100; 3331 //Wont heal even if he got elemental armors [Brain] 3332 if(pc_checkskill(dstsd,NC_PHYLACTERY)) heal = skilllv; 3333 } 3334 ======= 3113 3335 //Custom Jobs (blackmagic) 3114 3336 // Profane Soul reduces the healed recieved by 3% per skilllv [Brain] … … 3119 3341 } 3120 3342 //Custom Job End 3343 >>>>>>> .r18 3121 3344 if (sd) { 3122 3345 if ((i = pc_skillheal_bonus(sd, skillid))) … … 3154 3377 } 3155 3378 break; 3379 <<<<<<< .mine 3380 3381 case AD_DARKHEAL: // Adept Dark Heal [Brain] 3382 { 3383 int heal = skill_calc_heal(src, bl, skilllv); 3384 if (status_isimmune(bl) || (dstmd && dstmd->class_ == MOBID_EMPERIUM)) 3385 heal=0; 3386 if(battle_check_undead(tstatus->race,tstatus->def_ele) || tstatus->race==RC_UNDEAD // Check if our target is undead or demon 3387 || tstatus->race==RC_DEMON || pc_checkskill(dstsd,NC_PHYLACTERY)//Or has a phylactery 3388 || status_get_sc(bl)->data[SC_OVERWHELMING]) { //Or is on OverWhelm status, checking again... 3389 clif_skill_nodamage(src, bl, skillid, heal, 1); 3390 clif_skill_nodamage(NULL, bl, AL_HEAL, heal, 1); //Subtle way to show heal numbers AND effect =D 3391 status_heal(bl, heal, 0, 0); 3392 } else { 3393 clif_skill_nodamage(src, bl, skillid, 0, 1); 3394 clif_skill_nodamage(NULL, bl, AL_HEAL, 0, 1); 3395 } 3396 clif_specialeffect(bl, 656, AREA); //Blinking Green Sprite Effect on target 3397 } 3398 break; 3399 3400 3401 ======= 3156 3402 //Custom Jobs (blackmagic) 3157 3403 … … 3175 3421 break; 3176 3422 //Custom Job End 3423 >>>>>>> .r18 3177 3424 case PR_REDEMPTIO: 3178 3425 if (sd && !(flag&1)) { … … 3205 3452 } else //Invalid target, skip resurrection. 3206 3453 break; 3207 3454 3208 3455 case ALL_RESURRECTION: 3209 //Custom Jobs (blackmagic)3210 3456 case NC_DEATHPACT: // Necro Death Pact [Brain] 3211 //Custom Job End3212 3457 if(sd && map_flag_gvg(bl->m)) 3213 3458 { //No reviving in WoE grounds! … … 3217 3462 if (!status_isdead(bl)) 3218 3463 break; 3219 { 3464 { 3220 3465 int per = 0, sper = 0; 3221 3466 if (map[bl->m].flag.pvp && dstsd && dstsd->pvp_point < 0) … … 3227 3472 case 3: per=50; break; 3228 3473 case 4: per=80; break; 3229 //Custom Jobs (blackmagic)3230 3474 case 5: per=100; break; //Added a 5th level because NC_DEATHPACT got 5 lvs [Brain] 3231 //Custom Job End 3232 } 3233 if(dstsd && dstsd->special_state.restart_full_recover) 3475 } 3476 if(dstsd && dstsd->special_state.restart_full_recover) 3234 3477 per = sper = 100; 3235 3478 if (status_revive(bl, per, sper)) 3236 3479 { 3237 3480 clif_skill_nodamage(src,bl,ALL_RESURRECTION,skilllv,1); //Both Redemptio and Res show this skill-animation. 3481 <<<<<<< .mine 3482 if(skillid==NC_DEATHPACT) { // Necro Death Pact [Brain] 3483 clif_skill_nodamage(src, bl, skillid, skilllv, 3484 sc_start(bl,type,100,skilllv,skill_get_time(skillid,skilllv))); 3485 break; 3486 } 3487 3488 if(sd && dstsd && battle_config.resurrection_exp > 0) 3489 ======= 3238 3490 //Custom Jobs (blackmagic) 3239 3491 if(skillid==NC_DEATHPACT) { // Necro Death Pact [Brain] … … 3244 3496 //Custom Job End 3245 3497 if(sd && dstsd && battle_config.resurrection_exp > 0) 3498 >>>>>>> .r18 3246 3499 { 3247 3500 int exp = 0,jexp = 0; … … 3261 3514 } 3262 3515 break; 3516 <<<<<<< .mine 3517 ======= 3263 3518 //Custom Jobs (blackmagic) 3264 3519 … … 3352 3607 clif_specialeffect(src, 668, AREA); // Monster skill SCREAM effect on caster (with sound) 3353 3608 break; 3354 3355 //Custom Job End 3609 >>>>>>> .r18 3610 3611 case AD_PWBLIND: // Adept Power Word: Blind [Brain] 3612 if(!tsc->data[type]) { 3613 clif_skill_nodamage(src, bl, skillid, skilllv,1); 3614 if(sc_start(bl, type,(30 + skilllv * 10 + (status_get_lv(src) - sstatus->int_)/5), 3615 skilllv, skill_get_time(skillid,skilllv))) 3616 { 3617 if(dstmd) mob_unlocktarget(dstmd,tick); //Removes current target 3618 clif_specialeffect(bl, 379, AREA); //379.Soul Drain (2nd Part) 3619 break; 3620 } 3621 } else clif_skill_fail(sd,skillid,0,0); 3622 break; 3623 3624 case AD_PWFEAR: // Adept Power Word: Fear [Brain] 3625 if(!tsc->data[type]) { 3626 clif_skill_nodamage(src, bl, skillid, skilllv,1); 3627 if(dstsd) 3628 type = SC_CONFUSION; //Players cant be affected by SC_FEAR 3629 if(sc_start(bl, type, (30 + skilllv * 10), skilllv, skill_get_time(skillid,skilllv))) 3630 { 3631 clif_specialeffect(bl, 372, AREA); //372.Death 3632 unit_escape(bl, bl, 30); 3633 } 3634 } else clif_skill_fail(sd,skillid,0,0); 3635 break; 3636 case WL_HOWLOFPAIN: // Warlock Howl of Pain [Brain] 3637 //These must be here first or else the code wont execute them. 3638 clif_specialeffect(src, 670, AREA); // Monster skill SCREAM effect on caster (no sound) 3639 clif_soundeffectall(bl, "wraith_die.wav", 0, AREA); //Wraith Laugh Sound 3640 if (flag & 1) { 3641 //Check if target is a living creature AND a valid enemy 3642 if (battle_check_target(src, bl, BCT_ENEMY) && battle_check_living(tstatus->race,tstatus->def_ele)) 3643 { 3644 if(sc_start(bl,type,10+skilllv*10,skilllv,skill_get_time(skillid,skilllv))) 3645 { 3646 if(dstmd) //PROVOKE Effect on mobs 3647 mob_target(dstmd,src,skill_get_range2(src,skillid,skilllv)); 3648 // Breaks Frozen and Sleep status 3649 if(tsc && tsc->count){ 3650 if(tsc->data[SC_FREEZE]) 3651 status_change_end(bl,SC_FREEZE,-1); 3652 if(tsc->data[SC_SLEEP]) 3653 status_change_end(bl,SC_SLEEP,-1); 3654 } 3655 clif_emotion(bl,6); //anger emote on target 3656 break; 3657 } else { //What will happen if the status fail: 3658 { 3659 if (sd) //If is a player 3660 clif_skill_fail(sd,skillid,0,0); 3661 map_freeblock_unlock(); //Else is a mob 3662 return 0; 3663 } 3664 unit_skillcastcancel(bl, 2); //In any case, will cancel casting 3665 } 3666 } 3667 } else { 3668 map_foreachinrange(skill_area_sub, src, 3669 skill_get_splash(skillid, skilllv), BL_CHAR, 3670 src, skillid, skilllv, tick, flag|BCT_ENEMY|1, 3671 skill_castend_nodamage_id); 3672 clif_skill_nodamage(src, bl, skillid, skilllv, 1); 3673 map_freeblock_unlock(); 3674 return 1; 3675 } 3676 break; 3677 case WL_HOWLOFTERROR: // Warlock Howl of Terror [Brain] 3678 if (flag & 1) { 3679 int rate; 3680 //Check if target is a living creature AND a valid enemy 3681 if (battle_check_target(src, bl, BCT_ENEMY) 3682 && battle_check_living(tstatus->race,tstatus->def_ele)) { 3683 rate = 10 + skilllv*5 + pc_checkskill(sd,AD_PWFEAR)*3; 3684 if(dstsd) { 3685 rate -= 10; // 10% less chance on players 3686 type = SC_CONFUSION; //Players cant be affected by SC_FEAR 3687 } 3688 if(sc_start(bl,type,rate,skilllv,skill_get_time(skillid,skilllv))) 3689 clif_specialeffect(bl, 372, AREA); //Same as PW: Fear 3690 } 3691 } else { 3692 map_foreachinrange(skill_area_sub, src, 3693 skill_get_splash(skillid, skilllv), BL_CHAR, 3694 src, skillid, skilllv, tick, flag|BCT_ENEMY|1, 3695 skill_castend_nodamage_id); 3696 clif_skill_nodamage(src, bl, skillid, skilllv, 1); 3697 } 3698 clif_specialeffect(src, 668, AREA); // Monster skill SCREAM effect on caster (with sound) 3699 break; 3700 3356 3701 3357 3702 case AL_DECAGI: … … 3371 3716 } 3372 3717 break; 3718 <<<<<<< .mine 3719 3720 ======= 3373 3721 //Custom Jobs (blackmagic) 3374 3722 case NC_DARKMOON: //Necro Dark Moon [Brain] … … 3436 3784 } 3437 3785 break; 3438 //Custom Job End 3786 >>>>>>> .r18 3787 case NC_DARKMOON: //Necro Dark Moon [Brain] 3788 if (flag&1) { 3789 //Check my enemies 3790 if (battle_check_target(src, bl, BCT_ENEMY) && 3791 battle_check_living(tstatus->race,tstatus->def_ele)) 3792 { 3793 if(sc_start(bl,SC_BLIND,50,skilllv,skill_get_time(skillid,skilllv))) 3794 clif_specialeffect(bl, 580, AREA); //Box of Rain effect on target 3795 } 3796 else { //Now my Party members 3797 if (sd == NULL || sd->status.party_id == 0 || (flag & 1)) { 3798 clif_skill_nodamage(bl,bl,skillid,skilllv, 3799 sc_start(bl,type,100,skilllv,skill_get_time(skillid,skilllv))); 3800 clif_specialeffect(bl, 521, AREA); //Red Flashing Aura Sprite effect on target 3801 } else if (sd) { 3802 party_foreachsamemap(skill_area_sub, sd,skill_get_splash(skillid, skilllv), 3803 src,skillid,skilllv,tick, flag|BCT_ALL|1,skill_castend_nodamage_id); 3804 } 3805 } 3806 } else { 3807 map_foreachinrange(skill_area_sub, src, skill_get_splash(skillid, skilllv), BL_CHAR, 3808 src, skillid, skilllv, tick, flag|BCT_ALL|1, skill_castend_nodamage_id); 3809 clif_skill_nodamage(src, bl, skillid, skilllv, 1); 3810 } 3811 clif_specialeffect(src, 407, AREA); //Soul Change Effect on caster 3812 clif_soundeffectall(bl, "se_wolf1.wav", 0, AREA); //Wolf Howl Sound 3813 break; 3814 case NC_REQUIEM: //Necro Requiem [Brain] 3815 if (flag&1) { 3816 //Check my enemies 3817 if (battle_check_target(src, bl, BCT_ENEMY) && 3818 battle_check_living(tstatus->race,tstatus->def_ele)) 3819 { 3820 if(sc_start(bl,type,100,skilllv,skill_get_time(skillid,skilllv))) 3821 clif_specialeffect(bl, 578, AREA); //Box of Curse effect on target 3822 } 3823 else { //Now my Party members 3824 if (sd == NULL || sd->status.party_id == 0 || (flag & 1)) { 3825 clif_skill_nodamage(bl,bl,skillid,skilllv, 3826 sc_start(bl,type,100,skilllv,skill_get_time(skillid,skilllv))); 3827 clif_specialeffect(bl, 572, AREA); //Warmth Soul effect on target 3828 } else if (sd) { 3829 party_foreachsamemap(skill_area_sub, sd,skill_get_splash(skillid, skilllv), 3830 src,skillid,skilllv,tick, flag|BCT_ALL|1,skill_castend_nodamage_id); 3831 } 3832 } 3833 } else { 3834 map_foreachinrange(skill_area_sub, src, skill_get_splash(skillid, skilllv), BL_CHAR, 3835 src, skillid, skilllv, tick, flag|BCT_ALL|1, skill_castend_nodamage_id); 3836 clif_skill_nodamage(src, bl, skillid, skilllv, 1); 3837 } 3838 int rnds = rand()%3; 3839 switch(rnds) { 3840 case 1: 3841 clif_soundeffectall(bl, "chant1.wav", 0, AREA); //Chanting Sound 3842 break; 3843 case 2: 3844 clif_soundeffectall(bl, "chant2.wav", 0, AREA); //Chanting Sound 3845 break; 3846 case 3: 3847 clif_soundeffectall(bl, "chant3.wav", 0, AREA); //Chanting Sound 3848 break; 3849 } 3850 break; 3851 3439 3852 3440 3853 case PR_LEXDIVINA: … … 3442 3855 status_change_end(bl,type, -1); 3443 3856 clif_skill_nodamage (src, bl, skillid, skilllv, 1); 3444 } else 3445 clif_skill_nodamage (src, bl, skillid, skilllv, 3857 } else 3858 clif_skill_nodamage (src, bl, skillid, skilllv, 3446 3859 sc_start(bl,type,100,skilllv,skill_get_time(skillid,skilllv))); 3447 3860 break; … … 3459 3872 abra_skilllv = min(skilllv, skill_get_max(abra_skillid)); 3460 3873 clif_skill_nodamage (src, bl, skillid, skilllv, 1); 3461 3874 3462 3875 if( sd ) 3463 3876 {// player-casted … … 3473 3886 int target_id = 0; 3474 3887 if (!ud) break; 3475 if (inf&INF_SELF_SKILL || inf&INF_SUPPORT_SKILL) { 3888 if (inf&INF_SELF_SKILL || inf&INF_SUPPORT_SKILL) { 3476 3889 if (src->type == BL_PET) 3477 3890 bl = (struct block_list*)((TBL_PET*)src)->msd; 3478 3891 if (!bl) bl = src; 3479 unit_skilluse_id(src, bl->id, abra_skillid, abra_skilllv); 3892 unit_skilluse_id(src, bl->id, abra_skillid, abra_skilllv); 3480 3893 } else { //Assume offensive skills 3481 3894 if (ud->target) … … 3490 3903 bl = map_id2bl(target_id); 3491 3904 if (!bl) bl = src; 3492 unit_skilluse_pos(src, bl->x, bl->y, abra_skillid, abra_skilllv); 3905 unit_skilluse_pos(src, bl->x, bl->y, abra_skillid, abra_skilllv); 3493 3906 } else 3494 3907 unit_skilluse_id(src, target_id, abra_skillid, abra_skilllv); … … 3564 3977 case CR_PROVIDENCE: 3565 3978 if(sd && dstsd){ //Check they are not another crusader [Skotlex] 3566 if ((dstsd->class_&MAPID_UPPERMASK) == MAPID_CRUSADER) { 3979 if ((dstsd->class_&MAPID_UPPERMASK) == MAPID_CRUSADER) { 3567 3980 clif_skill_fail(sd,skillid,0,0); 3568 3981 map_freeblock_unlock(); … … 3573 3986 sc_start(bl,type,100,skilllv,skill_get_time(skillid,skilllv))); 3574 3987 break; 3575 3988 3576 3989 case CG_MARIONETTE: 3577 3990 { … … 3671 4084 3672 4085 sc_start(bl,SC_SEVENWIND,100,skilllv,skill_get_time(skillid,skilllv)); 3673 4086 3674 4087 break; 3675 4088 … … 3702 4115 case LK_BERSERK: 3703 4116 case KN_AUTOCOUNTER: 3704 case KN_TWOHANDQUICKEN: 4117 case KN_TWOHANDQUICKEN: 3705 4118 case KN_ONEHAND: 3706 4119 case CR_SPEARQUICKEN: … … 3713 4126 case MO_BLADESTOP: 3714 4127 case LK_AURABLADE: 3715 case LK_PARRYING: 4128 case LK_PARRYING: 3716 4129 case LK_CONCENTRATION: 3717 4130 case WS_CARTBOOST: … … 3739 4152 case NPC_DEFENDER: 3740 4153 case NPC_MAGICMIRROR: 3741 //Custom Jobs (blackmagic) 3742 case ALL_ATFIELD: //AT Field [Brain] 3743 //Custom Job End 4154 case ALL_ATFIELD: 3744 4155 clif_skill_nodamage(src,bl,skillid,skilllv, 3745 4156 sc_start(bl,type,100,skilllv,skill_get_time(skillid,skilllv))); 3746 4157 break; 4158 <<<<<<< .mine 4159 case AD_LUST: // Adept Blood Lust [Brain] 4160 clif_specialeffect(src, 220, AREA); //Berserk Pot effect 4161 clif_specialeffect(src, 455, AREA); //Red Lightnings 4162 clif_skill_nodamage(src,bl,skillid,skilllv, 4163 sc_start(bl,type,100,skilllv,skill_get_time(skillid,skilllv))); 4164 break; 4165 case NC_DECREPIFY: //Necro Decrepify [Brain] 4166 if(battle_check_living(tstatus->race,tstatus->def_ele)){ 4167 clif_specialeffect(bl, 403, AREA); //Mind Breaker Effect on target 4168 clif_specialeffect(src, 454, AREA); //Black Cast Effect on caster 4169 clif_skill_nodamage(src,bl,skillid,skilllv, 4170 sc_start(bl,type,100,skilllv,skill_get_time(skillid,skilllv))); 4171 } 4172 else clif_skill_fail(sd,skillid,0,0); 4173 break; 4174 case WL_CURSEWEAKNESS: // Warlock Curse of Weakness [Brain] 4175 clif_specialeffect(bl, 656, AREA); //Blinking Green Sprite effect on target 4176 clif_specialeffect(src, 59, AREA); //Purple Cast Effect on caster 4177 clif_skill_nodamage(src,bl,skillid,skilllv, 4178 sc_start(bl,type,100,skilllv,skill_get_time(skillid,skilllv))); 4179 break; 4180 case WL_CURSEEXHAUST: // Warlock Curse of Exhaustion [Brain] 4181 clif_specialeffect(bl, 135, AREA); //Ice Breaking effect on target 4182 clif_specialeffect(src, 59, AREA); //Purple Cast Effect on caster 4183 clif_skill_nodamage(src,bl,skillid,skilllv, 4184 sc_start(bl,type,100,skilllv,skill_get_time(skillid,skilllv))); 4185 break; 4186 case WL_CURSETONGUES: // Warlock Curse of Tongues [Brain] 4187 clif_specialeffect(bl, 72, AREA); //Spinning Lights effect on target 4188 clif_specialeffect(src, 59, AREA); //Purple Cast Effect on caster 4189 clif_skill_nodamage(src,bl,skillid,skilllv, 4190 sc_start(bl,type,100,skilllv,skill_get_time(skillid,skilllv))); 4191 break; 4192 case WL_CURSEDOOM: // Warlock Curse of Doom (temp) [Brain] 4193 if(!tsc->data[type]) { 4194 clif_specialeffect(bl, 196, AREA); //Small Curse Reaper effect on target 4195 clif_specialeffect(src, 59, AREA); //Purple Cast Effect on caster 4196 clif_skill_nodamage(src,bl,skillid,skilllv, 4197 sc_start4(bl,type,100, 4198 skilllv,skillid,src->id,skill_get_time(skillid,skilllv),1000)); 4199 } else clif_skill_fail(sd,skillid,0,0); 4200 break; 4201 case WL_OVERWHELMING: // Warlock Overwhelming Evil [Brain] 4202 clif_specialeffect(src, 348, AREA); //1000 Blades Trespassing effect on caster 4203 clif_skill_nodamage(src,bl,skillid,skilllv, 4204 sc_start(bl,type,100,skilllv,skill_get_time(skillid,skilllv))); 4205 break; 4206 ======= 3747 4207 //Custom Jobs (blackmagic) 3748 4208 … … 3796 4256 3797 4257 //Custom Job End 4258 >>>>>>> .r18 3798 4259 case MG_SIGHT: 3799 4260 case AL_RUWACH: … … 3910 4371 if (!i) 3911 4372 { 3912 if (sd) 4373 if (sd) 3913 4374 clif_skill_fail(sd,skillid,0,0); 3914 4375 map_freeblock_unlock(); … … 3996 4457 skill_additional_effect(src,bl,skillid,skilllv,BF_MISC,tick); //Use Misc rather than weapon to signal passive pushback 3997 4458 } 3998 break; 4459 break; 3999 4460 4000 4461 case MO_ABSORBSPIRITS: … … 4012 4473 clif_skill_nodamage(src,bl,skillid,skilllv,i?1:0); 4013 4474 break; 4475 <<<<<<< .mine 4476 ======= 4014 4477 //Custom Jobs (blackmagic) 4015 4478 … … 4038 4501 break; 4039 4502 //Custom Job End 4503 >>>>>>> .r18 4504 4505 case WL_DRAINSOUL: // Warlock Drain Soul [Brain] 4506 i = 0; 4507 if (dstsd && (sd == dstsd || map_flag_vs(src->m))) 4508 { //check if target is a player and we are in versus map 4509 i = tstatus->max_sp * skilllv/100;//i = SkillLv% of player Max SP 4510 if(dstsd->spiritball && (dstsd->class_&MAPID_BASEMASK)!=MAPID_GUNSLINGER) { 4511 i += dstsd->spiritball * 5;//will drain Monk Spirits and regain 5 SP per Spirit 4512 pc_delspiritball(dstsd,dstsd->spiritball,0); 4513 } 4514 } else if (dstmd && !(tstatus->mode&MD_BOSS) && battle_check_living(tstatus->race,tstatus->def_ele)) 4515 { // check if target is a monster and not a Boss 4516 i = dstmd->level/5 * skilllv;//i = mob level/5 * Skill Lvl 4517 mob_target(dstmd,src,0);//This will turn the mob agressive against the caster 4518 } 4519 if(i < skilllv) i = skilllv; //Minimum 1 sp per skill lvl 4520 if (i) { 4521 clif_specialeffect(src, 253, AREA); //Absorb Mana effect on caster 4522 clif_specialeffect(bl, 52, AREA); //Lightning Hit effect on target 4523 status_heal(src, 0, i, 3); //caster drains sp 4524 status_zap(bl, 0, i*skilllv); //target lost sp equal to 1*SkillLv the amount drained 4525 } 4526 clif_skill_nodamage(src,bl,skillid,skilllv,i?1:0); 4527 break; 4528 4040 4529 4041 4530 case AC_MAKINGARROW: … … 4130 4619 } 4131 4620 break; 4132 4621 4133 4622 case WZ_SIGHTRASHER: 4134 4623 //Passive side of the attack. … … 4238 4727 case SM_AUTOBERSERK: // Celest 4239 4728 if (tsce) 4240 i = status_change_end(bl, type, -1); 4729 i = status_change_end(bl, type, -1); 4241 4730 else 4242 4731 i = sc_start(bl,type,100,skilllv,60000); … … 4252 4741 break; 4253 4742 case TK_RUN: 4254 if (tsce) 4743 if (tsce) 4255 4744 clif_skill_nodamage(src,bl,skillid,skilllv, 4256 4745 status_change_end(bl, type, -1)); … … 4348 4837 if (dstmd) 4349 4838 mob_target(dstmd,src,skill_get_range2(src,skillid,skilllv)); 4350 4839 4351 4840 if (tsc->data[SC_STONE]) { 4352 4841 status_change_end(bl,SC_STONE,-1); … … 4499 4988 } 4500 4989 break; 4501 4990 4502 4991 case TF_PICKSTONE: 4503 4992 if(sd) { … … 4556 5045 //Note that Full Strip autospell doesn't use a duration 4557 5046 if (!clif_skill_nodamage(src,bl,skillid,skilllv, 4558 skill_strip_equip(bl, location, i, skilllv, 5047 skill_strip_equip(bl, location, i, skilllv, 4559 5048 sd&&skillid==ST_FULLSTRIP&&!pc_checkskill(sd, skillid)?0:skill_get_time(skillid,skilllv))) 4560 5049 && sd) … … 4712 5201 continue; 4713 5202 switch (i) { 4714 case SC_WEIGHT50: case SC_WEIGHT90: case SC_HALLUCINATION: 5203 case SC_WEIGHT50: case SC_WEIGHT90: case SC_HALLUCINATION: 4715 5204 case SC_STRIPWEAPON: case SC_STRIPSHIELD: case SC_STRIPARMOR: 4716 5205 case SC_STRIPHELM: case SC_CP_WEAPON: case SC_CP_SHIELD: … … 4762 5251 y = src->y + diry[dir]*skilllv*2; 4763 5252 } 4764 5253 4765 5254 clif_skill_nodamage(src,bl,TK_HIGHJUMP,skilllv,1); 4766 5255 if(!map_count_oncell(src->m,x,y,BL_PC|BL_NPC|BL_MOB) && map_getcell(src->m,x,y,CELL_CHKREACH)) { … … 4806 5295 } else if (!dstsd || map_flag_vs(bl->m)) //HP damage only on pvp-maps when against players. 4807 5296 hp = tstatus->max_hp/50; //Recover 2% HP [Skotlex] 4808 5297 4809 5298 clif_skill_nodamage(src,bl,skillid,skilllv,1); 4810 5299 unit_skillcastcancel(bl,0); … … 4816 5305 else 4817 5306 hp = 0; 4818 5307 4819 5308 if (sp) //Recover some of the SP used 4820 5309 sp = sp*(25*(skilllv-1))/100; … … 4892 5381 case NPC_CHANGETELEKINESIS: 4893 5382 clif_skill_nodamage(src,bl,skillid,skilllv, 4894 sc_start2(bl, type, 100, skilllv, skill_get_ele(skillid,skilllv), 5383 sc_start2(bl, type, 100, skilllv, skill_get_ele(skillid,skilllv), 4895 5384 skill_get_time(skillid, skilllv))); 4896 5385 break; … … 4900 5389 if(tstatus->def_ele==ELE_UNDEAD || tstatus->def_ele==ELE_DARK) break; 4901 5390 clif_skill_nodamage(src,bl,skillid,skilllv, 4902 sc_start2(bl, type, 100, skilllv, skill_get_ele(skillid,skilllv), 5391 sc_start2(bl, type, 100, skilllv, skill_get_ele(skillid,skilllv), 4903 5392 skill_get_time(skillid, skilllv))); 4904 5393 break; … … 4917 5406 sc_start(bl,type,100,skilllv,skill_time)) 4918 5407 && ud) { //Disable attacking/acting/moving for skill's duration. 4919 ud->attackabletime = 5408 ud->attackabletime = 4920 5409 ud->canact_tick = 4921 5410 ud->canmove_tick = tick + skill_time; … … 4961 5450 } 4962 5451 break; 4963 5452 4964 5453 case NPC_SPEEDUP: 4965 5454 { … … 5034 5523 sc_start(bl,type,100,100,skill_get_time(skillid, skilllv))); 5035 5524 break; 5036 5525 5037 5526 case NPC_AGIUP: 5038 5527 sc_start(bl,SC_SPEEDUP1,100,skilllv,skill_get_time(skillid, skilllv)); … … 5046 5535 sc_start4(bl,type,100,skilllv,0,0,6,skill_get_time(skillid,skilllv))); 5047 5536 break; 5048 5537 5049 5538 case NPC_SIEGEMODE: 5050 5539 // not sure what it does … … 5196 5685 return 1; 5197 5686 } 5198 5687 5199 5688 if (tsce) 5200 5689 { //HelloKitty2 (?) explained that this silently fails when target is … … 5207 5696 if (!clif_skill_nodamage(src,bl,skillid,skilllv, 5208 5697 sc_start(bl,type,55+5*skilllv,skilllv,skill_get_time(skillid,skilllv)))) 5209 { 5698 { 5210 5699 if (sd) clif_skill_fail(sd,skillid,0,0); 5211 5700 map_freeblock_unlock(); … … 5388 5877 break; 5389 5878 default: 5390 break; 5391 } 5879 break; 5880 } 5392 5881 } while ((--count) > 0); 5393 5882 clif_skill_nodamage(src,bl,skillid,skilllv,1); … … 5449 5938 clif_skill_nodamage(src,bl,skillid,skilllv, 5450 5939 sc_start(bl,type,100,skilllv,skill_get_time(skillid,skilllv))); 5451 5940 5452 5941 if (skillid == SL_SKE) 5453 5942 sc_start(src,SC_SMA,100,skilllv,skill_get_time(SL_SMA,skilllv)); 5454 5943 5455 5944 break; 5456 5945 5457 5946 // New guild skills [Celest] 5458 5947 case GD_BATTLEORDER: … … 5532 6021 clif_feel_info(sd, skilllv-1, 1); 5533 6022 } 5534 break; 6023 break; 5535 6024 5536 6025 case SG_HATE: … … 5612 6101 static const int per[5][2]={{20,50},{50,60},{25,75},{60,64},{34,67}}; 5613 6102 int rnd = rand()%100; 5614 i = (skilllv-1)%5; 6103 i = (skilllv-1)%5; 5615 6104 if(rnd<per[i][0]) //Self 5616 6105 bl = src; … … 5679 6168 mobskill_event(dstmd, src, tick, MSC_SKILLUSED|(skillid<<16)); 5680 6169 } 5681 6170 5682 6171 if (sd && !(flag&1) && sd->state.arrow_atk) //Consume arrow on last invocation to this skill. 5683 6172 battle_consume_ammo(sd, skillid, skilllv); … … 5782 6271 if(inf2 & (INF2_PARTY_ONLY|INF2_GUILD_ONLY) && src != target) 5783 6272 { 5784 inf |= 6273 inf |= 5785 6274 (inf2&INF2_PARTY_ONLY?BCT_PARTY:0)| 5786 6275 (inf2&INF2_GUILD_ONLY?BCT_GUILD:0); … … 5824 6313 if(sd && !skill_check_condition(sd,ud->skillid, ud->skilllv,1)) 5825 6314 break; 5826 6315 5827 6316 if(hd && !skill_check_condition_hom(hd,ud->skillid, ud->skilllv,1)) //[orn] 5828 6317 break; … … 5833 6322 if (ud->walktimer != -1 && ud->skillid != TK_RUN) 5834 6323 unit_stop_walking(src,1); 5835 6324 5836 6325 ud->canact_tick = tick + skill_delayfix(src, ud->skillid, ud->skilllv); 5837 6326 5838 6327 if (skill_get_state(ud->skillid) != ST_MOVE_ENABLE) 5839 6328 unit_set_walkdelay(src, tick, battle_config.default_walk_delay+skill_get_walkdelay(ud->skillid, ud->skilllv), 1); 5840 6329 5841 6330 if(battle_config.skill_log && battle_config.skill_log&src->type) 5842 6331 ShowInfo("Type %d, ID %d skill castend id [id =%d, lv=%d, target ID %d]\n", … … 5893 6382 if (dy > 0) dy++; 5894 6383 else if(dy < 0) dy--; 5895 6384 5896 6385 if (unit_movepos(src, src->x+dx, src->y+dy, 1, 1)) 5897 6386 { //Display movement + animation. … … 5914 6403 5915 6404 /*========================================== 5916 * 6405 * 5917 6406 *------------------------------------------*/ 5918 6407 int skill_castend_pos(int tid, unsigned int tick, int id, intptr data) … … 5935 6424 return 0; 5936 6425 } 5937 6426 5938 6427 if( ud->skilltimer != tid ) 5939 6428 { … … 5954 6443 skill_get_unit_flag(ud->skillid)&UF_NOREITERATION && 5955 6444 skill_check_unit_range(src,ud->skillx,ud->skilly,ud->skillid,ud->skilllv) 5956 ) 6445 ) 5957 6446 { 5958 6447 if (sd) clif_skill_fail(sd,ud->skillid,0,0); … … 5993 6482 } 5994 6483 } 5995 6484 5996 6485 if(sd && !skill_check_condition(sd,ud->skillid, ud->skilllv, 1)) 5997 6486 break; … … 6079 6568 skill_area_temp[1] = src->id; 6080 6569 i = skill_get_splash(skillid, skilllv); 6081 map_foreachinarea(skill_area_sub, 6570 map_foreachinarea(skill_area_sub, 6082 6571 src->m, x-i, y-i, x+i, y+i, BL_PC, 6083 6572 src, skillid, skilllv, tick, flag|BCT_ALL|1, … … 6106 6595 src->m, x-i, y-i, x+i,y+i,BL_SKILL); 6107 6596 break; 6597 <<<<<<< .mine 6598 ======= 6108 6599 //Custom Jobs (blackmagic) 6109 6600 case WL_HELLFIRE: // Warlock Hellfire [Brain] … … 6114 6605 // Continue reading because skill_unitsetting is bellow 6115 6606 //Custom Job End 6607 >>>>>>> .r18 6608 6609 case WL_HELLFIRE: // Warlock Hellfire [Brain] 6610 //clif_specialeffect(sd, 92, AREA); //Meteor Effect on caster, cant set on ground 6611 clif_skill_poseffect(src,WZ_METEOR,skilllv,x,y,tick); //Meteor Effect 6612 clif_skill_nodamage(src, src, skillid, 0, 1); //Lalala, just to show the skill yell correctly 6613 clif_specialeffect(src, 55, AREA); //Red Cast Effect on caster 6614 // Continue reading because skill_unitsetting is bellow 6615 6116 6616 6117 6617 case MG_SAFETYWALL: 6118 case MG_FIREWALL: 6618 case MG_FIREWALL: 6119 6619 case MG_THUNDERSTORM: 6120 6620 case AL_PNEUMA: … … 6273 6773 md->deletetimer = add_timer (gettick() + skill_get_time(skillid,skilllv), mob_timer_delete, md->bl.id, 0); 6274 6774 mob_spawn (md); //Now it is ready for spawning. 6775 <<<<<<< .mine 6776 // @showsummon command implementation [Brainstorm] 6777 if(sd->state.showsummon){ 6778 char output[256]; 6779 sprintf(output, 6780 "[Summon] HP : %d | STR : %d DEX : %d VIT : %d INT : %d AGI : %d LUK : %d", 6781 md->status.max_hp,md->status.str,md->status.dex,md->status.vit,md->status.int_,md->status.agi,md->status.luk); 6782 clif_disp_onlyself(sd,output,strlen(output)); 6783 sprintf(output, 6784 "[%s] ATK : %d~%d | DEF: %d+%d MDEF: %d+%d | HIT: %d FLEE: %d", 6785 md->name,md->status.rhw.atk,md->status.rhw.atk2,md->status.def,md->status.def2,md->status.mdef,md->status.mdef2,md->status.hit,md->status.flee); 6786 clif_disp_onlyself(sd,output,strlen(output)); 6787 } 6788 6789 ======= 6275 6790 //Custom Jobs (blackmagic) 6276 6791 // @showsummon command implementation [Brainstorm] … … 6287 6802 } 6288 6803 //Custom Job End 6289 } 6290 } 6291 break; 6292 6804 >>>>>>> .r18 6805 } 6806 } 6807 break; 6808 6809 <<<<<<< .mine 6810 case AD_FAMILIAR: // Adept Summon Familiar [Brain] 6811 if( sd ) 6812 { 6813 int id; 6814 int mob_class; 6815 struct mob_data* md; 6816 mob_class = pc_readglobalreg(sd, "ADEPT_FAMILIAR"); 6817 if( mob_class == 0 ) 6818 { 6819 mob_class = mob_get_random_id(4, 0x1, 0); 6820 pc_setglobalreg(sd, "ADEPT_FAMILIAR", mob_class); 6821 } 6822 id = mob_once_spawn(sd,src->m,src->x,src->y,"--en--",mob_class,1,""); 6823 md = (struct mob_data *)map_id2bl(id); 6824 if( md != NULL ) 6825 { 6826 md->master_id = sd->bl.id; 6827 md->special_state.ai = 1; 6828 md->status.mode = md->status.mode|MD_AGGRESSIVE; 6829 status_calc_mob(md,0); //Recalc their stats based on passive bonus 6830 md->status.hp = md->status.max_hp; //Must be here or the code wont update it 6831 // @showsummon command implementation [Brainstorm] 6832 if(sd->state.showsummon){ 6833 char output[256]; 6834 sprintf(output, 6835 "[Summon] HP : %d | STR : %d DEX : %d VIT : %d INT : %d AGI : %d LUK : %d", 6836 md->status.max_hp,md->status.str,md->status.dex,md->status.vit,md->status.int_,md->status.agi,md->status.luk); 6837 clif_disp_onlyself(sd,output,strlen(output)); 6838 sprintf(output, 6839 "[%s] ATK : %d~%d | DEF: %d+%d MDEF: %d+%d | HIT: %d FLEE: %d", 6840 md->name,md->status.rhw.atk,md->status.rhw.atk2,md->status.def,md->status.def2,md->status.mdef,md->status.mdef2,md->status.hit,md->status.flee); 6841 clif_disp_onlyself(sd,output,strlen(output)); 6842 } 6843 md->deletetimer = add_timer(gettick() + skill_get_time(skillid,skilllv), mob_timer_delete, id, 0); 6844 } 6845 } 6846 break; 6847 case NC_SKELETON: // Raise Skeleton [Brain] 6848 case NC_ARCHER: // Raise Archer Skeleton 6849 case NC_ZOMBIE: // Raise Zombie 6850 case NC_MUMMY: // Raise Mummy 6851 case NC_GHOST: // Raise Ghost 6852 case NC_SHADOW: // Raise Shadow 6853 case NC_WRAITH: // Raise Wraith 6854 if( sd ) 6855 { 6856 static const int mob_skeleton[5]={ 3201, 3202, 3203, 3204, 3205 }; // Skeleton, Orc Skeleton, Soldier Skeleton, Pirate Skeleton, Skeleton General 6857 static const int mob_archer[5]={ 3206, 3207, 3208, 3209, 3210 }; // Archer Skeleton, Firelock Soldier 6858 static const int mob_zombie[5]={ 3211, 3212, 3213, 3214, 3215 }; // Zombie, Ghoul, Zombie Master 6859 static const int mob_mummy[5]={ 3216, 3217, 3218, 3219, 3220 }; // Mummy, Ancient Mummy 6860 static const int mob_ghost[5]={ 3221, 3222, 3223, 3224, 3225 }; // Whisper, Nightmare, Nightmare Terror 6861 static const int mob_shadow[5]={ 3226, 3227, 3228, 3229, 3230 }; // Injustice, Raydric, Dullahan 6862 static const int mob_wraith[5]={ 3231, 3232, 3233, 3234, 3235 }; // Wraith, Wraith Dead 6863 int id; 6864 int mob_class; 6865 struct mob_data *md; 6866 ======= 6293 6867 //Custom Jobs (blackmagic) 6294 6868 case AD_FAMILIAR: // Adept Summon Familiar [Brain] … … 6349 6923 int mob_class; 6350 6924 struct mob_data *md; 6351 6925 >>>>>>> .r18 6926 6927 <<<<<<< .mine 6928 switch( skillid ) 6929 { 6930 case NC_SKELETON: mob_class = mob_skeleton[skilllv-1]; break; 6931 case NC_ARCHER: mob_class = mob_archer[skilllv-1]; break; 6932 case NC_ZOMBIE: mob_class = mob_zombie[skilllv-1]; break; 6933 case NC_MUMMY: mob_class = mob_mummy[skilllv-1]; break; 6934 case NC_GHOST: mob_class = mob_ghost[skilllv-1]; break; 6935 case NC_SHADOW: mob_class = mob_shadow[skilllv-1]; break; 6936 case NC_WRAITH: mob_class = mob_wraith[skilllv-1]; break; 6937 default: 6938 mob_class = 1002; // poring 6939 ShowDebug("skill_castend_pos2: undefined skill #%d used to raise mobs, defaulting to poring\n"); 6940 break; 6941 } 6942 id = mob_once_spawn(sd,src->m,src->x,src->y,"--ja--",mob_class,1,""); 6943 if((md=(struct mob_data *)map_id2bl(id))) 6944 { 6945 md->master_id=sd->bl.id; 6946 md->special_state.ai=1; 6947 md->status.mode=md->db->status.mode|MD_AGGRESSIVE; 6948 status_calc_mob(md,0); //Recalc their stats based on passive bonus 6949 md->status.hp = md->status.max_hp; //Must be here or the code wont update it 6950 // @showsummon command implementation [Brainstorm] 6951 if(sd->state.showsummon){ 6952 char output[256]; 6953 sprintf(output, 6954 "[Summon] HP : %d | STR : %d DEX : %d VIT : %d INT : %d AGI : %d LUK : %d", 6955 md->status.max_hp,md->status.str,md->status.dex,md->status.vit,md->status.int_,md->status.agi,md->status.luk); 6956 clif_disp_onlyself(sd,output,strlen(output)); 6957 sprintf(output, 6958 "[%s] ATK : %d~%d | DEF: %d+%d MDEF: %d+%d | HIT: %d FLEE: %d", 6959 md->name,md->status.rhw.atk,md->status.rhw.atk2,md->status.def,md->status.def2,md->status.mdef,md->status.mdef2,md->status.hit,md->status.flee); 6960 clif_disp_onlyself(sd,output,strlen(output)); 6961 } 6962 md->deletetimer = add_timer(gettick() + skill_get_time(skillid,skilllv), mob_timer_delete, id, 0); 6963 } 6964 } 6965 break; 6966 ======= 6352 6967 switch( skillid ) 6353 6968 { … … 6391 7006 6392 7007 //Custom Job End 7008 >>>>>>> .r18 7009 7010 6393 7011 6394 7012 // Slim Pitcher [Celest] … … 6416 7034 potion_hp = potion_hp * (100+i)/100; 6417 7035 potion_sp = potion_sp * (100+i)/100; 6418 7036 6419 7037 if(potion_hp > 0 || potion_sp > 0) { 6420 7038 i = skill_get_splash(skillid, skilllv); … … 6438 7056 potion_hp = potion_hp * (100+i)/100; 6439 7057 potion_sp = potion_sp * (100+i)/100; 6440 7058 6441 7059 if(potion_hp > 0 || potion_sp > 0) { 6442 7060 i = skill_get_splash(skillid, skilllv); … … 6460 7078 } 6461 7079 break; 6462 7080 6463 7081 case HW_GRAVITATION: 6464 7082 if ((sg = skill_unitsetting(src,skillid,skilllv,x,y,0))) … … 6542 7160 if (sd && !(flag&1) && sd->state.arrow_atk) //Consume arrow if a ground skill was not invoked. [Skotlex] 6543 7161 battle_consume_ammo(sd, skillid, skilllv); 6544 7162 6545 7163 return 0; 6546 7164 } 6547 7165 6548 7166 /*========================================== 6549 * 7167 * 6550 7168 *------------------------------------------*/ 6551 7169 int skill_castend_map (struct map_session_data *sd, short skill_num, const char *map) … … 6555 7173 //Simplify skill_failed code. 6556 7174 #define skill_failed(sd) { sd->menuskill_id = sd->menuskill_val = 0; } 6557 if(skill_num != sd->menuskill_id) 7175 if(skill_num != sd->menuskill_id) 6558 7176 return 0; 6559 7177 … … 6590 7208 return 0; 6591 7209 } 6592 7210 6593 7211 switch(skill_num) 6594 7212 { … … 6631 7249 } 6632 7250 } 6633 7251 6634 7252 //When it's an item-used warp-portal, the skill-lv used is lost.. assume max level. 6635 7253 lv = sd->skillitem==skill_num?skill_get_max(skill_num):pc_checkskill(sd,skill_num); 6636 7254 wx = sd->menuskill_val>>16; 6637 7255 wy = sd->menuskill_val&0xffff; 6638 7256 6639 7257 if( lv <= 0 ) return 0; 6640 7258 if( lv > 4 ) lv = 4; // crash prevention … … 6655 7273 return 0; 6656 7274 } 6657 7275 6658 7276 // This makes Warp Portal fail if the cell is not empty 6659 7277 //if(skill_check_unit_range2(&sd->bl,wx,wy,skill_num,lv) > 0) { … … 6714 7332 return 0; //Nothing to remove, this unit is not overlapped. 6715 7333 6716 if (unit->val1 != unit->group->skill_id) 7334 if (unit->val1 != unit->group->skill_id) 6717 7335 { //Reset state 6718 7336 unit->val1 = unit->group->skill_id; 6719 7337 unit->val2 &= ~UF_ENSEMBLE; 6720 7338 } 6721 7339 6722 7340 return map_foreachincell(skill_dance_overlap_sub, unit->bl.m,unit->bl.x,unit->bl.y,BL_SKILL, unit,flag); 6723 7341 } … … 6803 7421 switch(skillid) 6804 7422 { 7423 <<<<<<< .mine 7424 case WL_HELLFIRE: // Warlock Hellfire [Brain] 7425 if(map_flag_vs(src->m)) target = BCT_ALL; 7426 break; 7427 ======= 6805 7428 //Custom Jobs (blackmagic) 6806 7429 case WL_HELLFIRE: // Warlock Hellfire [Brain] … … 6808 7431 break; 6809 7432 //Custom Job End 7433 >>>>>>> .r18 6810 7434 case MG_SAFETYWALL: 6811 7435 val2=skilllv+1; … … 6883 7507 { //Use the previous limit (minus the elapsed time) [Skotlex] 6884 7508 limit = old_sg->limit - DIFF_TICK(gettick(), old_sg->tick); 6885 if (limit < 0) //This can happen... 7509 if (limit < 0) //This can happen... 6886 7510 limit = skill_get_time(skillid,skilllv); 6887 7511 } … … 7130 7754 return NULL; 7131 7755 } 7132 7756 7133 7757 7134 7758 if (skillid == NJ_TATAMIGAESHI) //Store number of tiles. … … 7139 7763 7140 7764 /*========================================== 7141 * 7765 * 7142 7766 *------------------------------------------*/ 7143 7767 static int skill_unit_onplace (struct skill_unit *src, struct block_list *bl, unsigned int tick) … … 7152 7776 nullpo_retr(0, src); 7153 7777 nullpo_retr(0, bl); 7154 7778 7155 7779 if(bl->prev==NULL || !src->alive || status_isdead(bl)) 7156 7780 return 0; … … 7162 7786 && !skill_get_inf2(sg->skill_id) == INF2_TRAP) //Traps work on top of land protector, magical or not [Brain] 7163 7787 return 0; //AoE skills are ineffective. [Skotlex] 7164 7788 7165 7789 sc = status_get_sc(bl); 7166 7790 7167 7791 if (sc && sc->option&OPTION_HIDE && sg->skill_id != WZ_HEAVENDRIVE) 7168 7792 return 0; //Hidden characters are immune to AoE skills except Heaven's Drive. [Skotlex] 7169 7793 7170 7794 type = status_skill2sc(sg->skill_id); 7171 7795 sce = (sc && type != -1)?sc->data[type]:NULL; … … 7263 7887 } 7264 7888 break; 7265 7889 7266 7890 case UNT_FOGWALL: 7267 7891 if (!sce) … … 7284 7908 // src->limit = DIFF_TICK(tick+700,sg->tick); 7285 7909 // break; 7286 7910 7287 7911 case UNT_MOONLIT: 7288 7912 //Knockback out of area if affected char isn't in Moonlit effect … … 7298 7922 7299 7923 /*========================================== 7300 * 7924 * 7301 7925 *------------------------------------------*/ 7302 7926 int skill_unit_onplace_timer (struct skill_unit *src, struct block_list *bl, unsigned int tick) … … 7325 7949 tsc = status_get_sc(bl); 7326 7950 tstatus = status_get_status_data(bl); 7327 if (sg->state.magic_power) //For magic power. 7951 if (sg->state.magic_power) //For magic power. 7328 7952 { 7329 7953 sc = status_get_sc(ss); … … 7354 7978 return 0; 7355 7979 ts->tick = tick+sg->interval; 7356 7980 7357 7981 if ((skillid==CR_GRANDCROSS || skillid==NPC_GRANDDARKNESS) && !battle_config.gx_allhit) 7358 7982 ts->tick += sg->interval*(map_count_oncell(bl->m,bl->x,bl->y,BL_CHAR)-1); … … 7404 8028 } 7405 8029 if (status_isimmune(bl)) 8030 <<<<<<< .mine 8031 heal = 0; /* é»éè²ã«ãŒãïŒããŒã«éïŒïŒ */ 8032 // Profane Soul reduces the healed recieved by 3% per skilllv [Brain] 8033 if(tsd) { 8034 heal = heal * (100 - pc_checkskill(tsd,AD_PROFANE)*3)/100; 8035 //Wont heal even if he got elemental armors [Brain] 8036 if(pc_checkskill(tsd,NC_PHYLACTERY)) heal = sg->skill_lv; 8037 } 8038 8039 ======= 7406 8040 heal = 0; /* é»Eßè²ã«ãŒãïŒããŒã«éïŒïŒE*/ 7407 8041 //Custom Jobs (blackmagic) … … 7413 8047 } 7414 8048 //Custom Job End 8049 >>>>>>> .r18 7415 8050 clif_skill_nodamage(&src->bl, bl, AL_HEAL, heal, 1); 7416 8051 status_heal(bl, heal, 0, 0); … … 7447 8082 7448 8083 case UNT_ATTACK_SKILLS: 7449 switch (sg->skill_id) 8084 switch (sg->skill_id) 7450 8085 { 7451 8086 case SG_SUN_WARM: //SG skills [Komurka] … … 7485 8120 break; 7486 8121 default: 7487 skill_attack(skill_get_type(sg->skill_id),ss,&src->bl,bl,sg->skill_id,sg->skill_lv,tick,0); 8122 skill_attack(skill_get_type(sg->skill_id),ss,&src->bl,bl,sg->skill_id,sg->skill_lv,tick,0); 7488 8123 } 7489 8124 break; … … 7509 8144 if (status_change_start(bl,type,10000,sg->skill_lv,sg->group_id,0,0,sec, 8)) 7510 8145 { 7511 struct TimerData* td = tsc->data[type]?get_timer(tsc->data[type]->timer):NULL; 8146 struct TimerData* td = tsc->data[type]?get_timer(tsc->data[type]->timer):NULL; 7512 8147 if (td) sec = DIFF_TICK(td->tick, tick); 7513 8148 map_moveblock(bl, src->bl.x, src->bl.y, tick); … … 7580 8215 clif_skill_nodamage(&src->bl, bl, AL_HEAL, heal, 1); 7581 8216 status_heal(bl, heal, 0, 0); 7582 break; 8217 break; 7583 8218 } 7584 8219 … … 7755 8390 status_change_end(bl,type,-1); 7756 8391 break; 7757 8392 7758 8393 case UNT_SPIDERWEB: 7759 8394 { … … 7783 8418 if (sc && !sc->count) 7784 8419 sc = NULL; 7785 8420 7786 8421 type = status_skill2sc(skill_id); 7787 8422 sce = (sc && type != -1)?sc->data[type]:NULL; … … 7800 8435 case BD_ETERNALCHAOS: 7801 8436 case BD_DRUMBATTLEFIELD: 7802 case BD_RINGNIBELUNGEN: 8437 case BD_RINGNIBELUNGEN: 7803 8438 case BD_ROKISWEIL: 7804 8439 case BD_INTOABYSS: … … 7809 8444 //FIXME: This code is not perfect, it doesn't checks for the real ensemble's owner, 7810 8445 //it only checks if you are doing the same ensemble. So if there's two chars doing an ensemble 7811 //which overlaps, by stepping outside of the other parther's ensemble will cause you to cancel 8446 //which overlaps, by stepping outside of the other parther's ensemble will cause you to cancel 7812 8447 //your own. Let's pray that scenario is pretty unlikely and noone will complain too much about it. 7813 8448 skill_stop_dancing(bl); … … 7824 8459 status_change_end(bl, type, -1); 7825 8460 break; 7826 8461 7827 8462 case BA_POEMBRAGI: 7828 8463 case BA_WHISTLE: … … 7831 8466 case DC_HUMMING: 7832 8467 case DC_DONTFORGETME: 7833 case DC_FORTUNEKISS: 8468 case DC_FORTUNEKISS: 7834 8469 case DC_SERVICEFORYOU: 7835 8470 if (sce) … … 7881 8516 7882 8517 nullpo_retr(0, group); 7883 8518 7884 8519 dissonance = skill_dance_switch(unit, 0); 7885 8520 … … 7966 8601 if ((skillid != PR_BENEDICTIO && *c >=1) || *c >=2) 7967 8602 return 0; //Partner found for ensembles, or the two companions for Benedictio. [Skotlex] 7968 8603 7969 8604 if (bl == src) 7970 8605 return 0; … … 7975 8610 if (tsd->sc.data[SC_SILENCE] || tsd->sc.opt1) 7976 8611 return 0; 7977 8612 7978 8613 switch(skillid) 7979 8614 { … … 8060 8695 8061 8696 /*========================================== 8062 * 8697 * 8063 8698 *------------------------------------------*/ 8064 8699 static int skill_check_condition_mob_master_sub (struct block_list *bl, va_list ap) … … 8083 8718 8084 8719 /*========================================== 8085 * Determines if a given skill should be made to consume ammo 8720 * Determines if a given skill should be made to consume ammo 8086 8721 * when used by the player. [Skotlex] 8087 8722 *------------------------------------------*/ … … 8122 8757 sd->skillitem = sd->skillitemlv = 0; 8123 8758 //Need to do arrow state check. 8124 sd->state.arrow_atk = skill_get_ammotype(skill)?1:0; 8759 sd->state.arrow_atk = skill_get_ammotype(skill)?1:0; 8125 8760 //Need to do Spiritball check. 8126 8761 sd->spiritball_old = sd->spiritball; … … 8132 8767 if (!sc->count) 8133 8768 sc = NULL; 8134 8769 8135 8770 if(pc_is90overweight(sd)) { 8136 8771 clif_skill_fail(sd,skill,9,0); … … 8156 8791 if (sd->menuskill_id == AM_PHARMACY && 8157 8792 (skill == AM_PHARMACY || skill == AC_MAKINGARROW || skill == BS_REPAIRWEAPON || 8158 skill == AM_TWILIGHT1 || skill == AM_TWILIGHT2 || skill == AM_TWILIGHT3 8793 skill == AM_TWILIGHT1 || skill == AM_TWILIGHT2 || skill == AM_TWILIGHT3 8159 8794 )) { 8160 8795 sd->skillitem = sd->skillitemlv = 0; … … 8314 8949 } 8315 8950 break; 8316 case MO_FINGEROFFENSIVE: //æ EŒŸ8951 case MO_FINGEROFFENSIVE: //æåŒŸ 8317 8952 case GS_FLING: 8318 8953 if (sd->spiritball > 0 && sd->spiritball < spiritball) { … … 8380 9015 } 8381 9016 break; 8382 9017 8383 9018 case TK_READYCOUNTER: 8384 9019 case TK_READYDOWN: … … 8408 9043 status_change_end(&sd->bl, SC_COMBO, -1); 8409 9044 sd->skillid_old = sd->skilllv_old = 0; 8410 return 0; //Can't repeat previous combo skill. 9045 return 0; //Can't repeat previous combo skill. 8411 9046 } 8412 9047 break; 8413 } else 9048 } else 8414 9049 if(sc->data[SC_COMBO]->val1 == skill) 8415 9050 break; //Combo ready. … … 8470 9105 } 8471 9106 break; 9107 <<<<<<< .mine 9108 case AD_FAMILIAR: //Adept Familiar [Flavio] 9109 { 9110 short familiar[1] ={ pc_readglobalreg(sd, "ADEPT_FAMILIAR") }; 9111 int maxcount = skill_get_maxcount(skill,lv); 9112 int count = 0; 9113 count = mob_countslave_class(&sd->bl, 1, familiar ); 9114 if( count >= maxcount ) 9115 { 9116 clif_skill_fail(sd,skill,0,0); 9117 return 0; 9118 } 9119 } 9120 break; 9121 case NC_SKELETON: // Raise Skeleton [Brain] 9122 case NC_ARCHER: // Raise Archer Skeleton 9123 case NC_ZOMBIE: // Raise Zombie 9124 case NC_MUMMY: // Raise Mummy 9125 case NC_GHOST: // Raise Ghost 9126 case NC_SHADOW: // Raise Shadow 9127 case NC_WRAITH: // Raise Wraith 9128 {// corrigido o limite de spawns [Flavio] 9129 short summon1[5]={ 3201, 3202, 3203, 3204, 3205 }; // Skeleton, Orc Skeleton, Soldier Skeleton, Pirate Skeleton, Skeleton General 9130 short summon2[5]={ 3206, 3207, 3208, 3209, 3210 }; // Archer Skeleton, Firelock Soldier 9131 short summon3[5]={ 3211, 3212, 3213, 3214, 3215 }; // Zombie, Ghoul, Zombie Master 9132 short summon4[5]={ 3216, 3217, 3218, 3219, 3220 }; // Mummy, Ancient Mummy 9133 short summon5[5]={ 3221, 3222, 3223, 3224, 3225 }; // Whisper, Nightmare, Nightmare Terror 9134 short summon6[5]={ 3226, 3227, 3228, 3229, 3230 }; // Injustice, Raydric, Dullahan 9135 short summon7[5]={ 3231, 3232, 3233, 3234, 3235 }; // Wraith, Wraith Dead 9136 int maxcount = skill_get_maxcount(skill,lv); 9137 int count = 0; 9138 switch( skill ) 9139 { 9140 case NC_SKELETON: count = mob_countslave_class(&sd->bl, 5, summon1); break; 9141 case NC_ARCHER: count = mob_countslave_class(&sd->bl, 5, summon2); break; 9142 case NC_ZOMBIE: count = mob_countslave_class(&sd->bl, 5, summon3); break; 9143 case NC_MUMMY: count = mob_countslave_class(&sd->bl, 5, summon4); break; 9144 case NC_GHOST: count = mob_countslave_class(&sd->bl, 5, summon5); break; 9145 case NC_SHADOW: count = mob_countslave_class(&sd->bl, 5, summon6); break; 9146 case NC_WRAITH: count = mob_countslave_class(&sd->bl, 5, summon7); break; 9147 } 9148 if( count >= maxcount ) 9149 { 9150 clif_skill_fail(sd,skill,0,0); 9151 return 0; 9152 } 9153 } 9154 break; 9155 9156 ======= 8472 9157 //Custom Jobs (blackmagic) 8473 9158 case AD_FAMILIAR: //Adept Familiar [Flavio] … … 8519 9204 break; 8520 9205 //Custom Job End 9206 >>>>>>> .r18 8521 9207 case WZ_FIREPILLAR: // celest 8522 9208 if (lv <= 5) // no gems required at level 1-5 … … 8527 9213 if(!(sc && sc->data[SC_SMA])) 8528 9214 return 0; 8529 break; 9215 break; 8530 9216 8531 9217 case HT_POWER: … … 8579 9265 clif_skill_fail(sd,skill,0,0); 8580 9266 return 0; 8581 } 9267 } 8582 9268 } 8583 9269 } … … 8631 9317 //Only invoke on skill begin cast (instant cast skill). [Kevin] 8632 9318 if(sp>0 && !type) 8633 { 9319 { 8634 9320 if (status->sp < (unsigned int)sp) 8635 9321 clif_skill_fail(sd,skill,1,0); … … 8657 9343 } 8658 9344 break; 8659 9345 8660 9346 case NJ_ISSEN: 8661 9347 if (status->hp < 2) { … … 8669 9355 } 8670 9356 break; 8671 9357 8672 9358 case NJ_ZENYNAGE: 8673 9359 if(sd->status.zeny < zeny) { … … 8699 9385 8700 9386 if(!(type&2)){ 8701 if( hp>0 && status->hp <= (unsigned int)hp) { /* HPãã§ã E¯ */8702 clif_skill_fail(sd,skill,2,0); /* HPäžè¶³ E倱æéç¥ */9387 if( hp>0 && status->hp <= (unsigned int)hp) { /* HPãã§ã㯠*/ 9388 clif_skill_fail(sd,skill,2,0); /* HPäžè¶³ïŒå€±æéç¥ */ 8703 9389 return 0; 8704 9390 } 8705 if( sp>0 && status->sp < (unsigned int)sp) { /* SPãã§ã E¯ */8706 clif_skill_fail(sd,skill,1,0); /* SPäžè¶³ E倱æéç¥ */9391 if( sp>0 && status->sp < (unsigned int)sp) { /* SPãã§ã㯠*/ 9392 clif_skill_fail(sd,skill,1,0); /* SPäžè¶³ïŒå€±æéç¥ */ 8707 9393 return 0; 8708 9394 } … … 8711 9397 return 0; 8712 9398 } 8713 9399 8714 9400 if(weapon && !pc_check_weapontype(sd,weapon)) { 8715 9401 clif_skill_fail(sd,skill,6,0); … … 8807 9493 if (sc && sc->data[SC_COMBO] && sc->data[SC_COMBO]->val1 == skill) 8808 9494 sd->ud.canmove_tick = gettick(); //When using a combo, cancel the can't move delay to enable the skill. [Skotlex] 8809 9495 8810 9496 if (!unit_can_move(&sd->bl)) { 8811 9497 clif_skill_fail(sd,skill,0,0); … … 8898 9584 int skill_castfix (struct block_list *bl, int skill_id, int skill_lv) 8899 9585 { 8900 int time = skill_get_cast(skill_id, skill_lv); 9586 int time = skill_get_cast(skill_id, skill_lv); 8901 9587 struct map_session_data *sd; 8902 9588 8903 9589 nullpo_retr(0, bl); 8904 9590 sd = BL_CAST(BL_PC, bl); 8905 9591 8906 9592 // calculate base cast time (reduced by dex) 8907 9593 if (!(skill_get_castnodex(skill_id, skill_lv)&1)) { … … 8951 9637 status_change_end(bl, SC_SUFFRAGIUM, -1); 8952 9638 } 9639 <<<<<<< .mine 9640 if (sc->data[SC_DECREPIFY]) // Necro Decrepify [Brain] 9641 if(sc->data[SC_DECREPIFY]->val2>=3) 9642 time += time * 25/100; //+25% cast time 9643 if (sc->data[SC_CURSETONGUES]) { //Warlock Curse of Tongues [Brain] 9644 time += time * sc->data[SC_CURSETONGUES]->val2 / 100; 9645 status_change_end(bl, SC_CURSETONGUES, -1); 9646 } 9647 9648 ======= 8953 9649 //Custom Jobs (blackmagic) 8954 9650 … … 8962 9658 8963 9659 //Custom Job End 9660 >>>>>>> .r18 8964 9661 if (sc->data[SC_MEMORIZE]) { 8965 9662 time>>=1; … … 8980 9677 int delaynodex = skill_get_delaynodex(skill_id, skill_lv); 8981 9678 int time = skill_get_delay(skill_id, skill_lv); 8982 9679 8983 9680 nullpo_retr(0, bl); 8984 9681 … … 8987 9684 8988 9685 if (bl->type&battle_config.no_skill_delay) 8989 return battle_config.min_skill_delay_limit; 9686 return battle_config.min_skill_delay_limit; 8990 9687 8991 9688 if (time < 0) … … 9004 9701 default: 9005 9702 if (battle_config.delay_dependon_dex && !(delaynodex&1)) 9006 { // if skill delay is allowed to be reduced by dex 9703 { // if skill delay is allowed to be reduced by dex 9007 9704 int scale = battle_config.castrate_dex_scale - status_get_dex(bl); 9008 9705 if (scale > 0) … … 9012 9709 } 9013 9710 if (battle_config.delay_dependon_agi && !(delaynodex&1)) 9014 { // if skill delay is allowed to be reduced by agi 9711 { // if skill delay is allowed to be reduced by agi 9015 9712 int scale = battle_config.castrate_dex_scale - status_get_agi(bl); 9016 9713 if (scale > 0) … … 9056 9753 9057 9754 /*========================================= 9058 * 9755 * 9059 9756 *-----------------------------------------*/ 9060 9757 void skill_brandishspear_first (struct square *tc, int dir, int x, int y) … … 9580 10277 return count; 9581 10278 } 9582 10279 9583 10280 /*========================================== 9584 10281 * Returns the first element field found [Skotlex] … … 9734 10431 9735 10432 /*========================================== 9736 * 10433 * 9737 10434 *------------------------------------------*/ 9738 10435 int skill_chastle_mob_changetarget(struct block_list *bl,va_list ap) … … 9767 10464 unit = (struct skill_unit *)src; 9768 10465 tick = va_arg(ap,int); 9769 10466 9770 10467 nullpo_retr(0, sg = unit->group); 9771 10468 nullpo_retr(0, ss = map_id2bl(sg->src_id)); … … 9777 10474 case UNT_SHOCKWAVE: 9778 10475 case UNT_SANDMAN: 9779 case UNT_FLASHER: 10476 case UNT_FLASHER: 9780 10477 skill_additional_effect(ss,bl,sg->skill_id,sg->skill_lv,BF_MISC,tick); 9781 10478 break; … … 9823 10520 if (type != scs[i] && sc->data[scs[i]]) 9824 10521 status_change_end(bl, scs[i], -1); 9825 10522 9826 10523 return 0; 9827 10524 } … … 9841 10538 wall = false; 9842 10539 } 9843 10540 9844 10541 if( sce ) 9845 10542 { … … 9884 10581 if(!sc->count || !(sce=sc->data[SC_DANCING])) 9885 10582 return; 9886 10583 9887 10584 group = (struct skill_unit_group *)sce->val2; 9888 10585 sce->val2 = 0; 9889 10586 9890 10587 if (sce->val4) 9891 10588 { … … 10021 10718 nullpo_retr(NULL, src); 10022 10719 nullpo_retr(NULL, ud); 10023 10720 10024 10721 // find a free spot to store the new unit group 10025 10722 ARR_FIND( 0, MAX_SKILLUNITGROUP, i, ud->skillunit[i] == NULL ); … … 10081 10778 10082 10779 if (!src) src=map_id2bl(group->src_id); 10083 ud = unit_bl2ud(src); 10780 ud = unit_bl2ud(src); 10084 10781 if(!src || !ud) { 10085 10782 ShowError("skill_delunitgroup: Group's source not found! (src_id: %d skill_id: %d)\n", group->src_id, group->skill_id); 10086 return 0; 10783 return 0; 10087 10784 } 10088 10785 if (skill_get_unit_flag(group->skill_id)&(UF_DANCE|UF_SONG|UF_ENSEMBLE)) … … 10180 10877 if (group->interval==-1) 10181 10878 return NULL; 10182 10879 10183 10880 ud = unit_bl2ud(bl); 10184 10881 if (!ud) return NULL; … … 10422 11119 int skill_id; 10423 11120 int i; 10424 11121 10425 11122 nullpo_retr(0, group); 10426 11123 10427 11124 if( !unit->alive || target->prev == NULL ) 10428 11125 return 0; … … 10503 11200 //cells do not get deleted within them. [Skotlex] 10504 11201 if( dissonance ) skill_dance_switch(unit, 1); 10505 11202 10506 11203 if( flag&4 ) 10507 11204 skill_unit_onleft(skill_id,target,tick); … … 10530 11227 memset(skill_unit_temp, 0, sizeof(skill_unit_temp)); 10531 11228 } 10532 11229 10533 11230 map_foreachincell(skill_unit_move_sub,bl->m,bl->x,bl->y,BL_SKILL,bl,tick,flag); 10534 11231 … … 10708 11405 if (qty < 1) 10709 11406 qty = 1; 10710 11407 10711 11408 if (!skill_id) //A skill can be specified for some override cases. 10712 11409 skill_id = skill_produce_db[idx].req_skill; 10713 11410 10714 11411 slot[0]=slot1; 10715 11412 slot[1]=slot2; … … 10859 11556 if(make_per < 1) make_per = 1; 10860 11557 10861 11558 10862 11559 if(rand()%10000 < make_per || qty > 1){ //Success, or crafting multiple items. 10863 11560 struct item tmp_item; … … 10930 11627 skill_id != AM_TWILIGHT2 && 10931 11628 skill_id != AM_TWILIGHT3) 10932 continue; 11629 continue; 10933 11630 //Add fame as needed. 10934 11631 switch(++sd->potion_success_counter) { … … 10983 11680 } 10984 11681 } 10985 //Failure 11682 //Failure 10986 11683 // if(log_config.produce) 10987 11684 // log_produce(sd,nameid,slot1,slot2,slot3,0); … … 11069 11766 return 0; 11070 11767 if (sd) sd->blockskill[data] = 0; 11071 11768 11072 11769 return 1; 11073 11770 } … … 11096 11793 return 0; 11097 11794 if (hd) hd->blockskill[data] = 0; 11098 11795 11099 11796 return 1; 11100 11797 } … … 11103 11800 { 11104 11801 nullpo_retr (-1, hd); 11105 11802 11106 11803 skillid = skill_get_index(skillid); 11107 11804 if (skillid == 0) … … 11163 11860 if ((val[j]-val[j-step]) != diff) 11164 11861 break; 11165 11862 11166 11863 if (j>=step) //No match, try next step. 11167 11864 continue; 11168 11865 11169 11866 for(; i < MAX_SKILL_LEVEL; i++) 11170 11867 { //Apply linear increase … … 11363 12060 memcpy(skill_unit_layout[pos].dy,dy,sizeof(dy)); 11364 12061 } else { 11365 int dx[] = { 1, 1 ,0, 0,-1}; 11366 int dy[] = { 1, 0, 0,-1,-1}; 12062 int dx[] = { 1, 1 ,0, 0,-1}; 12063 int dy[] = { 1, 0, 0,-1,-1}; 11367 12064 memcpy(skill_unit_layout[pos].dx,dx,sizeof(dx)); 11368 12065 memcpy(skill_unit_layout[pos].dy,dy,sizeof(dy)); … … 11394 12091 memcpy(skill_unit_layout[pos].dy,dy,sizeof(dy)); 11395 12092 } else { 11396 int dx[] = { 2, 1 ,0,-1,-2}; 11397 int dy[] = { 2, 1, 0,-1,-2}; 12093 int dx[] = { 2, 1 ,0,-1,-2}; 12094 int dy[] = { 2, 1, 0,-1,-2}; 11398 12095 memcpy(skill_unit_layout[pos].dx,dx,sizeof(dx)); 11399 12096 memcpy(skill_unit_layout[pos].dy,dy,sizeof(dy)); … … 11424 12121 * skill_nocast_db.txt 11425 12122 * skill_unit_db.txt 11426 * produce_db.txt 12123 * produce_db.txt 11427 12124 * create_arrow_db.txt 11428 12125 * abra_db.txt … … 11493 12190 skill_split_atoi(split[5],skill_db[i].sp_rate); 11494 12191 skill_split_atoi(split[6],skill_db[i].zeny); 11495 12192 11496 12193 //FIXME: document this 11497 12194 p = split[7]; … … 11511 12208 p++; 11512 12209 } 11513 12210 11514 12211 //FIXME: document this 11515 12212 p = split[8]; … … 11545 12242 else if( strcmpi(split[10],"water")==0 ) skill_db[i].state = ST_WATER; 11546 12243 else skill_db[i].state = ST_NONE; 11547 12244 11548 12245 skill_split_atoi(split[11],skill_db[i].spiritball); 11549 12246 for( j = 0; j < 10; j++ ) { … … 11561 12258 if( !i ) // invalid skill id 11562 12259 return false; 11563 12260 11564 12261 skill_split_atoi(split[1],skill_db[i].cast); 11565 12262 skill_split_atoi(split[2],skill_db[i].delay); … … 11577 12274 if( !i ) // invalid skill id 11578 12275 return false; 11579 12276 11580 12277 skill_split_atoi(split[1],skill_db[i].castnodex); 11581 12278 if( split[2] ) // optional column … … 11603 12300 if( !i ) // invalid skill id 11604 12301 return false; 11605 12302 11606 12303 skill_db[i].unit_id[0] = strtol(split[1],NULL,16); 11607 12304 skill_db[i].unit_id[1] = strtol(split[2],NULL,16); … … 11649 12346 skill_produce_db[current].req_skill = atoi(split[2]); 11650 12347 skill_produce_db[current].req_skill_lv = atoi(split[3]); 11651 12348 11652 12349 for( x = 4, y = 0; x+1 < columns && split[x] && split[x+1] && y < MAX_PRODUCE_RESOURCE; x += 2, y++ ) 11653 12350 { … … 11668 12365 11669 12366 skill_arrow_db[current].nameid = i; 11670 12367 11671 12368 for( x = 1, y = 0; x+1 < columns && split[x] && split[x+1] && y < MAX_ARROW_RESOURCE; x += 2, y++ ) 11672 12369 { … … 11707 12404 memset(skill_arrow_db,0,sizeof(skill_arrow_db)); 11708 12405 memset(skill_abra_db,0,sizeof(skill_abra_db)); 11709 12406 11710 12407 // load skill databases 11711 12408 safestrncpy(skill_db[0].name, "UNKNOWN_SKILL", sizeof(skill_db[0].name)); … … 11735 12432 skilldb_name2id = strdb_alloc(DB_OPT_DUP_KEY, 0); 11736 12433 skill_readdb(); 11737 12434 11738 12435 skill_unit_ers = ers_new(sizeof(struct skill_unit_group)); 11739 12436 skill_timer_ers = ers_new(sizeof(struct skill_timerskill)); 11740 12437 11741 12438 add_timer_func_list(skill_unit_timer,"skill_unit_timer"); 11742 12439 add_timer_func_list(skill_castend_id,"skill_castend_id"); … … 11744 12441 add_timer_func_list(skill_timerskill,"skill_timerskill"); 11745 12442 add_timer_func_list(skill_blockpc_end, "skill_blockpc_end"); 11746 12443 11747 12444 add_timer_interval(gettick()+SKILLUNITTIMER_INTERVAL,skill_unit_timer,0,0,SKILLUNITTIMER_INTERVAL); 11748 12445 … … 11757 12454 return 0; 11758 12455 } 12456 <<<<<<< .mine 12457 12458 int skill_additem(struct block_list* src, struct block_list *bl, int itemid, int amount)// ITEM GIVER [Brain] 12459 { 12460 struct map_session_data *sd = NULL, *tsd = NULL; 12461 12462 nullpo_retr(1, src); 12463 nullpo_retr(1, bl); 12464 12465 if (src->m != bl->m) 12466 return 1; 12467 if (bl->prev == NULL) 12468 return 1; 12469 if (src->type == BL_PC) 12470 sd = (struct map_session_data *)src; 12471 if (bl->type == BL_PC) 12472 tsd = (struct map_session_data *)bl; 12473 if (status_isdead(bl)) 12474 return 1; 12475 12476 int eflag; 12477 struct item item_tmp; 12478 struct block_list tbl; 12479 12480 memset(&item_tmp,0,sizeof(item_tmp)); 12481 memset(&tbl,0,sizeof(tbl)); 12482 12483 item_tmp.nameid = itemid; 12484 item_tmp.identify = 1; 12485 tbl.id = 0; 12486 12487 clif_takeitem(&sd->bl,&tbl); 12488 eflag = pc_additem(sd,&item_tmp,amount); 12489 if(eflag) { 12490 clif_additem(sd,0,0,eflag); 12491 map_addflooritem(&item_tmp,amount,sd->bl.m,sd->bl.x,sd->bl.y,0,0,0,0); 12492 } 12493 return 0; 12494 } 12495 ======= 11759 12496 //Custom Jobs (blackmagic) 11760 12497 int skill_additem(struct block_list* src, struct block_list *bl, int itemid, int amount)// ITEM GIVER [Brain] … … 11795 12532 return 0; 11796 12533 } 11797 //Custom Job End 12534 //Custom Job End>>>>>>> .r18 -
src/map/skill.h
r13 r19 321 321 int skill_arrow_create( struct map_session_data *sd,int nameid); 322 322 323 //Custom Jobs (blackmagic)324 323 int skill_additem(struct block_list* src, struct block_list *bl, int itemid, int amount); // Item giver func [Brain] 325 //Custom Job End 324 326 325 327 326 // mobXLÌœß … … 960 959 961 960 ALL_INCCARRY = 681, 962 961 AD_PWBLIND = 700, // Custom Skills [Brainstorm] 962 AD_PWFEAR, 963 AD_DARKHEAL, 964 AD_BLOODPACT, 965 AD_LUST, 966 AD_FERVOR, 967 AD_PROFANE, 968 AD_DARKFAITH, 969 AD_FAMILIAR, 970 AD_SUMMONS, 971 972 <<<<<<< .mine 973 NC_PHYLACTERY, //710 974 NC_UNDEAD, 975 NC_DEATHHAND, 976 NC_GHOULTOUCH, 977 NC_SKELETON, 978 NC_ZOMBIE, 979 NC_ARCHER, 980 NC_MUMMY, 981 NC_GHOST, 982 NC_SHADOW, 983 NC_WRAITH, 984 NC_REQUIEM, 985 NC_DARKMOON, 986 NC_PWSUFFER, 987 NC_DECREPIFY, 988 NC_DRAINLIFE, 989 NC_DEATHPACT, 990 ======= 963 991 //Custom Jobs (blackmagic) 964 992 AD_PWBLIND = 700, // Custom Skills [Brainstorm] … … 1014 1042 1015 1043 //Custom Job End 1044 >>>>>>> .r18 1045 1046 ALL_ATFIELD, //GM SKILL 1047 1048 WL_CURSETONGUES, //732 1049 WL_CURSEDOOM, 1050 WL_CURSEEXHAUST, 1051 WL_CURSEWEAKNESS, 1052 WL_SEARING, 1053 WL_HELLFIRE, 1054 WL_CONFLAGRATE, 1055 WL_IMMOLATE, 1056 WL_SHADOWBOLT, 1057 WL_SHADOWBURN, 1058 WL_HOWLOFPAIN, 1059 WL_DEMONOLOGY, 1060 WL_HOWLOFTERROR, 1061 WL_PWAGONY, 1062 WL_OVERWHELMING, 1063 WL_SOULSTEAL, 1064 WL_DRAINSOUL, 1065 WL_CORRUPTION, //749 1016 1066 1017 1067 -
src/map/status.c
r13 r19 130 130 set_sc( NPC_SILENCEATTACK , SC_SILENCE , SI_BLANK , SCB_NONE ); 131 131 set_sc( DC_WINKCHARM , SC_CONFUSION , SI_BLANK , SCB_NONE ); 132 //Custom Jobs (blackmagic) 133 set_sc( AD_PWFEAR , SC_FEAR , SI_HALLUCINATION , SCB_SPEED ); //Fear Status by [Brainstorm] 134 //Custom Job End 132 set_sc( AD_PWFEAR , SC_FEAR , SI_HALLUCINATION , SCB_SPEED ); //Fear Status by [Brainstorm] 135 133 set_sc( NPC_BLINDATTACK , SC_BLIND , SI_BLANK , SCB_HIT|SCB_FLEE ); 136 134 set_sc( LK_HEADCRUSH , SC_BLEEDING , SI_BLEEDING , SCB_REGEN ); … … 410 408 set_sc( GD_BATTLEORDER , SC_BATTLEORDERS , SI_BLANK , SCB_STR|SCB_INT|SCB_DEX ); 411 409 set_sc( GD_REGENERATION , SC_REGENERATION , SI_BLANK , SCB_REGEN ); 410 <<<<<<< .mine 411 ======= 412 412 //Custom Jobs (blackmagic) 413 413 // Custom Jobs Skills [Brain] … … 438 438 set_sc( ALL_ATFIELD , SC_ATFIELD , SI_UTSUSEMI ,SCB_NONE); 439 439 //Custom Job End 440 >>>>>>> .r18 441 442 // Custom Jobs Skills [Brain] 443 add_sc( AD_PWBLIND , SC_BLIND); 444 add_sc( AD_PWFEAR , SC_FEAR); 445 set_sc( AD_LUST , SC_LUST , SI_JOINTBEAT , SCB_ASPD|SCB_BATK|SCB_WATK|SCB_REGEN); 446 447 set_sc( NC_DECREPIFY , SC_DECREPIFY , SI_BLEEDING , SCB_SPEED|SCB_BATK|SCB_WATK|SCB_DEF2|SCB_MDEF2); 448 set_sc( NC_DARKMOON , SC_DARKMOON , SI_MOON_COMFORT , SCB_FLEE|SCB_HIT); 449 add_sc( NC_DARKMOON , SC_BLIND); 450 set_sc( NC_REQUIEM , SC_REQUIEM , SI_KAIZEL , SCB_BATK|SCB_WATK); 451 add_sc( NC_GHOULTOUCH , SC_POISON); 452 set_sc( NC_PWSUFFER , SC_SUFFER , SI_BLANK , SCB_DEF|SCB_DEF2); 453 set_sc( NC_DEATHPACT , SC_DEATHPACT , SI_BIOMOBTRICKDEAD , SCB_DEF_ELE|SCB_REGEN); 454 455 set_sc( WL_SEARING , SC_SEARING , SI_BLANK , SCB_NONE); 456 set_sc( WL_IMMOLATE , SC_IMMOLATE , SI_BLANK , SCB_NONE); 457 add_sc( WL_SHADOWBURN , SC_STUN); 458 set_sc( WL_PWAGONY , SC_AGONY , SI_BLANK , SCB_MDEF|SCB_MDEF2); 459 set_sc( WL_CURSETONGUES , SC_CURSETONGUES , SI_SLOWCAST , SCB_NONE); 460 set_sc( WL_CURSEDOOM , SC_DOOM , SI_BLANK , SCB_NONE); 461 set_sc( WL_CURSEWEAKNESS , SC_CURSEWEAKNESS , SI_STRIPWEAPON , SCB_BATK|SCB_WATK); 462 set_sc( WL_CURSEEXHAUST , SC_CURSEEXHAUST , SI_CRITICALWOUND , SCB_DEF|SCB_MDEF); 463 add_sc( WL_HOWLOFTERROR , SC_FEAR); 464 set_sc( WL_HOWLOFPAIN , SC_PROVOKE , SI_PROVOKE , SCB_DEF|SCB_DEF2|SCB_BATK|SCB_WATK); 465 set_sc( WL_OVERWHELMING , SC_OVERWHELMING , SI_ENERGYCOAT , SCB_DEF|SCB_MDEF|SCB_MATK|SCB_REGEN|SCB_DEF_ELE); 466 467 set_sc( ALL_ATFIELD , SC_ATFIELD , SI_UTSUSEMI ,SCB_NONE); 468 440 469 441 470 // Storing the target job rather than simply SC_SPIRIT simplifies code later on. … … 677 706 status_change_end(target,SC_WINKCHARM,-1); 678 707 status_change_end(target,SC_CONFUSION,-1); 708 //error... definately... 709 if (sc->data[SC_FEAR]) //Fear Status by [Brainstorm] 710 status_change_end(target, SC_FEAR, -1); 679 711 status_change_end(target,SC_TRICKDEAD,-1); 680 712 status_change_end(target,SC_HIDING,-1); 681 713 status_change_end(target,SC_CLOAKING,-1); 682 714 status_change_end(target,SC_CHASEWALK,-1); 683 status_change_end(target,SC_FEAR, -1);//Custom Jobs (blackmagic)684 715 if ((sce=sc->data[SC_ENDURE]) && !sce->val4) { 685 716 //Endure count is only reduced by non-players on non-gvg maps. … … 1373 1404 flag|=16; 1374 1405 1406 <<<<<<< .mine 1407 if (md->master_id && md->special_state.ai) 1408 flag|=32; //Adept/Necro/Warlock Summon Stats Bonus [Brainstorm] 1409 ======= 1375 1410 //Custom Jobs (blackmagic) 1376 1411 if (md->master_id && md->special_state.ai) 1377 1412 flag|=32; //Adept/Necro/Warlock Summon Stats Bonus [Brainstorm] 1378 1413 //Custom Job End 1414 >>>>>>> .r18 1415 1379 1416 1380 1417 if (!flag) … … 1494 1531 status->aspd_rate -= 100*md->guardian_data->guardup_lv; 1495 1532 } 1533 <<<<<<< .mine 1534 //Summon Bonus from Skills [Brainstorm] 1535 if(flag&32) 1536 { 1537 mbl = map_id2bl(md->master_id); 1538 if(mbl) 1539 { 1540 struct unit_data *ud = unit_bl2ud(mbl); 1541 //Remove special AI when this is used by regular mobs. 1542 if (mbl->type == BL_MOB && !((TBL_MOB*)mbl)->special_state.ai) 1543 md->special_state.ai = 0; 1544 1545 int master_lv = status_get_lv(mbl); 1546 int skill_mastery = pc_checkskill((TBL_PC*)mbl,AD_SUMMONS); 1547 int undead_mastery = pc_checkskill((TBL_PC*)mbl,NC_UNDEAD); 1548 1549 if (ud->skillid == AD_FAMILIAR) 1550 { 1551 status->max_hp += (skill_mastery*10) + (master_lv*10); 1552 status->str += (master_lv) + (skill_mastery); 1553 status->dex += (master_lv) + (skill_mastery); 1554 status->agi += (master_lv) + (skill_mastery); 1555 status->int_ += (master_lv) + (skill_mastery); 1556 status->vit += (master_lv) + (skill_mastery); 1557 status->luk += (master_lv) + (skill_mastery); 1558 status->rhw.atk += (skill_mastery*3) 1559 + (status->str+((status->str/10)*(status->str/10))+(status->dex/5)+(status->luk/10)); 1560 status->rhw.atk2 += (skill_mastery*3) 1561 + (status->str+((status->str/10)*(status->str/10))+(status->dex/5)+(status->luk/10)); 1562 status->speed -= skill_mastery; 1563 status->def += (master_lv)/10 + (skill_mastery); 1564 status->mdef += (master_lv)/10 + (skill_mastery); 1565 //These are not automatically recalculated 1566 status->hit += (master_lv*2) + (skill_mastery); 1567 status->flee += (master_lv*2) + (skill_mastery); 1568 status->def2 += (master_lv) + (skill_mastery); 1569 status->mdef2 += (master_lv) + (skill_mastery); 1570 } 1571 else if(status->race==RC_UNDEAD) 1572 { 1573 status->max_hp += (undead_mastery*10) + (master_lv*2); 1574 status->str += (undead_mastery*3) + (skill_mastery); 1575 status->dex += (undead_mastery*3) + (skill_mastery); 1576 status->agi += (undead_mastery*3) + (skill_mastery); 1577 status->int_ += (undead_mastery*3) + (skill_mastery); 1578 status->vit += (undead_mastery*3) + (skill_mastery); 1579 status->luk += (undead_mastery*3) + (skill_mastery); 1580 status->rhw.atk += (undead_mastery*3) + (skill_mastery*3) 1581 + (status->str+((status->str/10)*(status->str/10))+(status->dex/5)+(status->luk/10)); 1582 status->rhw.atk2 += (undead_mastery*3) + (skill_mastery*3) 1583 + (status->str+((status->str/10)*(status->str/10))+(status->dex/5)+(status->luk/10)); 1584 status->speed -= undead_mastery; 1585 status->def += undead_mastery; 1586 status->mdef += undead_mastery; 1587 //These are not automatically recalculated 1588 status->hit += (undead_mastery*3) + (skill_mastery); 1589 status->flee += (undead_mastery*3) + (skill_mastery); 1590 status->def2 += (undead_mastery*3) + (skill_mastery); 1591 status->mdef2 += (undead_mastery*3) + (skill_mastery); 1592 } 1593 ======= 1496 1594 1497 1595 //Custom Jobs (blackmagic) … … 1557 1655 } 1558 1656 else ShowError("status_calc_mob: Monster summoned without a master at %s\n", map[md->bl.m].name); 1559 } 1560 //Custom Job End 1657 >>>>>>> .r18 1658 } 1659 else ShowError("status_calc_mob: Monster summoned without a master at %s\n", map[md->bl.m].name); 1660 } 1661 1561 1662 1562 1663 //Initial battle status … … 1807 1908 status->aspd_rate = 1000; 1808 1909 status->ele_lv = 1; 1910 <<<<<<< .mine 1911 status->race = RC_DEMIHUMAN;// This define players default race to DEMIHUMAN [Brain] 1912 if(pc_checkskill(sd,NC_PHYLACTERY)>0) status->def_ele = ELE_UNDEAD; //Phylactery turns you UNDEAD 1 instead of NEUTRAL 1913 ======= 1809 1914 //Custom Jobs (blackmagic) 1810 1915 status->race = RC_DEMIHUMAN;// This define players default race to DEMIHUMAN [Brain] 1811 1916 if(pc_checkskill(sd,NC_PHYLACTERY)>0) status->def_ele = ELE_UNDEAD; //Phylactery turns you UNDEAD 1 instead of NEUTRAL 1812 1917 //Custom Job End 1813 1918 >>>>>>> .r18 1814 1919 1815 1920 //zero up structures... … … 2101 2206 if((skill=pc_checkskill(sd,AC_OWL))>0) 2102 2207 status->dex += skill; 2103 2208 if((skill=pc_checkskill(sd,WL_DEMONOLOGY))>0) //Warlock Demonology [Brain] 2209 status->str += skill/2; //+1 str per 2 skill points 2210 2211 <<<<<<< .mine 2212 ======= 2104 2213 //Custom Jobs (blackmagic) 2105 2214 … … 2107 2216 status->str += skill/2; //+1 str per 2 skill points 2108 2217 //Custom Job End 2218 >>>>>>> .r18 2109 2219 2110 2220 // Bonuses from cards and equipment as well as base stat, remember to avoid overflows. … … 2144 2254 if((skill=pc_checkskill(sd,CR_TRUST))>0) 2145 2255 status->max_hp += skill*200; 2146 2256 if((skill=pc_checkskill(sd,AD_PROFANE))>0) // Adept Profane Soul [Brain] 2257 status->max_hp += status->max_hp * (skill*3)/100; 2258 2259 <<<<<<< .mine 2260 ======= 2147 2261 //Custom Jobs (blackmagic) 2148 2262 if((skill=pc_checkskill(sd,AD_PROFANE))>0) // Adept Profane Soul [Brain] 2149 2263 status->max_hp += status->max_hp * (skill*3)/100; 2150 2264 //Custom Job End 2265 >>>>>>> .r18 2151 2266 2152 2267 // Apply relative modifiers from equipment … … 2178 2293 if((skill=pc_checkskill(sd,HW_SOULDRAIN))>0) 2179 2294 status->max_sp += status->max_sp * 2*skill/100; 2180 2295 if((skill=pc_checkskill(sd,AD_PROFANE))>0) // Adept Profane Soul [Brain] 2296 status->max_sp += sd->status.max_sp * (skill*3)/100; 2297 2298 <<<<<<< .mine 2299 ======= 2181 2300 //Custom Jobs (blackmagic) 2182 2301 if((skill=pc_checkskill(sd,AD_PROFANE))>0) // Adept Profane Soul [Brain] 2183 2302 status->max_sp += sd->status.max_sp * (skill*3)/100; 2184 2303 //Custom Job End 2304 >>>>>>> .r18 2185 2305 2186 2306 // Apply relative modifiers from equipment … … 2276 2396 } 2277 2397 } 2278 2398 if((skill=pc_checkskill(sd,AD_FERVOR))>0) // Adept Unholy Fevor [Brain] 2399 status->hit += skill*2; 2400 2401 <<<<<<< .mine 2402 ======= 2279 2403 //Custom Jobs (blackmagic) 2280 2404 if((skill=pc_checkskill(sd,AD_FERVOR))>0) // Adept Unholy Fevor [Brain] … … 2282 2406 //Custom Job End 2283 2407 2408 >>>>>>> .r18 2284 2409 // ----- FLEE CALCULATION ----- 2285 2410 … … 2289 2414 if((skill=pc_checkskill(sd,MO_DODGE))>0) 2290 2415 status->flee += (skill*3)>>1; 2291 2416 if((skill=pc_checkskill(sd,AD_FERVOR))>0) // Adept Unholy Fevor [Brain] 2417 status->flee += skill*2; 2418 2419 <<<<<<< .mine 2420 ======= 2292 2421 //Custom Jobs (blackmagic) 2293 2422 if((skill=pc_checkskill(sd,AD_FERVOR))>0) // Adept Unholy Fevor [Brain] … … 2295 2424 //Custom Job End 2296 2425 2426 >>>>>>> .r18 2297 2427 // ----- EQUIPMENT-DEF CALCULATION ----- 2298 2428 … … 2304 2434 status->def = cap_value(i, CHAR_MIN, CHAR_MAX); 2305 2435 } 2436 <<<<<<< .mine 2437 2438 ======= 2306 2439 //Custom Jobs (blackmagic) 2307 2440 // Absolute modifiers from passive skills … … 2309 2442 status->mdef += 1*skill; 2310 2443 //Custom Job End 2444 >>>>>>> .r18 2311 2445 if (!battle_config.weapon_defense_type && status->def > battle_config.max_def) 2312 2446 { … … 2324 2458 status->mdef = cap_value(i, CHAR_MIN, CHAR_MAX); 2325 2459 } 2460 // Absolute modifiers from passive skills 2461 if((skill=pc_checkskill(sd,AD_DARKFAITH))>0) // Adept Dark Faith [Brain] 2462 status->mdef += 1*skill; 2463 2326 2464 2327 2465 if (!battle_config.magic_defense_type && status->mdef > battle_config.max_def) … … 2431 2569 } 2432 2570 2571 <<<<<<< .mine 2572 if((skill=pc_checkskill(sd,AD_DARKFAITH))>0) // Adept Dark Faith [Brain] 2573 sd->subele[ELE_DARK] += skill*5; 2574 if((skill=pc_checkskill(sd,WL_DEMONOLOGY))>0 ){ //Warlock Demonology [Brain] 2575 skill = skill*5; 2576 sd->right_weapon.addrace[RC_DEMON]+=skill; 2577 sd->magic_addrace[RC_DEMON]+=skill; 2578 sd->subrace[RC_DEMON]+=skill; 2579 ======= 2433 2580 2434 2581 //Custom Jobs (blackmagic) … … 2440 2587 sd->magic_addrace[RC_DEMON]+=skill; 2441 2588 sd->subrace[RC_DEMON]+=skill; 2442 } 2589 >>>>>>> .r18 2590 } 2591 <<<<<<< .mine 2592 if((pc_checkskill(sd,NC_PHYLACTERY))>0){ // Necro Phylactery [Brain] 2593 sd->subele[ELE_NEUTRAL] += 10; //And increases neutral resistance by 10% 2594 } 2595 ======= 2443 2596 if((pc_checkskill(sd,NC_PHYLACTERY))>0){ // Necro Phylactery [Brain] 2444 2597 sd->subele[ELE_NEUTRAL] += 10; //And increases neutral resistance by 10% 2445 2598 } 2446 2599 //Custom Job End 2600 >>>>>>> .r18 2601 2447 2602 2448 2603 if(sc->count){ … … 2468 2623 sd->subrace[RC_DEMON] += sc->data[SC_PROVIDENCE]->val2; 2469 2624 } 2470 2625 if(sd->sc.data[SC_DEATHPACT]) //Necro Death Pact [Brain] 2626 sd->subele[ELE_NEUTRAL] += sd->sc.data[SC_DEATHPACT]->val2; 2627 2628 <<<<<<< .mine 2629 ======= 2471 2630 //Custom Jobs (blackmagic) 2472 2631 if(sd->sc.data[SC_DEATHPACT]) //Necro Death Pact [Brain] … … 2474 2633 //Custom Job End 2475 2634 2635 >>>>>>> .r18 2476 2636 if(sc->data[SC_ARMOR_ELEMENT]) 2477 2637 { //This status change should grant card-type elemental resist. … … 2629 2789 status->rhw.atk2 = status->str + hom->level; 2630 2790 2791 /*Passive bonus from Wolf Mastery (will only take effect when first created or level up) [Brainstorm] 2792 if((skill=pc_checkskill(hd->master,QHT_WOLFMASTERY)) > 0) 2793 { 2794 status->rhw.atk += skill * 3; 2795 status->rhw.atk2 += skill * 3; 2796 status->str += skill; 2797 status->agi += skill; 2798 status->vit += skill; 2799 status->dex += skill; 2800 status->int_ += skill; 2801 status->luk += skill; 2802 }*/ 2803 2804 2631 2805 status->aspd_rate = 1000; 2632 2806 … … 2795 2969 || sc->data[SC_TRICKDEAD] 2796 2970 || sc->data[SC_BLEEDING] 2971 <<<<<<< .mine 2972 || sc->data[SC_LUST] // Adept Blood Lust, stops hp regen [Brain] 2973 ======= 2797 2974 //Custom Jobs (blackmagic) 2798 2975 || sc->data[SC_LUST] // Adept Blood Lust, stops hp regen [Brain] 2976 >>>>>>> .r18 2799 2977 || sc->data[SC_DEATHPACT] // Necro Death Pact 2800 //Custom Job End 2978 2801 2979 ) //No regen 2802 2980 regen->flag = 0; … … 2807 2985 || (sc->data[SC_EXPLOSIONSPIRITS] 2808 2986 && (!sc->data[SC_SPIRIT] || sc->data[SC_SPIRIT]->val2 != SL_MONK)) 2809 //Custom Jobs (blackmagic)2810 2987 || sc->data[SC_OVERWHELMING] // Warlock Overwhelming Evil, stops sp regen [Brain] 2811 //Custom Job End 2988 2812 2989 ) //No natural SP regen 2813 2990 regen->flag &=~RGN_SP; … … 3578 3755 if(sc->data[SC_MADNESSCANCEL]) 3579 3756 batk += 100; 3757 <<<<<<< .mine 3758 if(sc->data[SC_LUST]) // Adept Blood Lust [Brain] 3759 batk += batk * sc->data[SC_LUST]->val2/100; 3760 if(sc->data[SC_CURSEWEAKNESS]) // Warlock Curse of Weakness [Brain] 3761 batk -= batk * sc->data[SC_CURSEWEAKNESS]->val2/100; 3762 if(sc->data[SC_DECREPIFY]) // Necromancer Decrepify [Brain] 3763 if(sc->data[SC_DECREPIFY]->val2>=2) 3764 batk -= batk * 25/100; 3765 3766 ======= 3580 3767 //Custom Jobs (blackmagic) 3581 3768 if(sc->data[SC_LUST]) // Adept Blood Lust [Brain] … … 3588 3775 3589 3776 //Custom Job End 3777 >>>>>>> .r18 3590 3778 return (unsigned short)cap_value(batk,0,USHRT_MAX); 3591 3779 } … … 3630 3818 if(sc->data[SC_STRIPWEAPON]) 3631 3819 watk -= watk * sc->data[SC_STRIPWEAPON]->val2/100; 3820 <<<<<<< .mine 3821 if(sc->data[SC_LUST]) // Adept Blood Lust [Brain] 3822 watk += watk * sc->data[SC_LUST]->val2/100; 3823 if(sc->data[SC_REQUIEM]){ //Necro Requiem [Brain] 3824 if(sc->data[SC_REQUIEM]->val2) 3825 watk += sc->data[SC_REQUIEM]->val2*10; 3826 if(sc->data[SC_REQUIEM]->val3) 3827 watk -= sc->data[SC_REQUIEM]->val3*10; 3828 } 3829 if(sc->data[SC_CURSEWEAKNESS]) // Warlock Curse of Weakness [Brain] 3830 watk -= watk * sc->data[SC_CURSEWEAKNESS]->val2/100; 3831 if(sc->data[SC_DECREPIFY]) // Necromancer Decrepify [Brain] 3832 if(sc->data[SC_DECREPIFY]->val2>=2) 3833 watk -= watk * 25/100; 3834 ======= 3632 3835 //Custom Jobs (blackmagic) 3633 3836 if(sc->data[SC_LUST]) // Adept Blood Lust [Brain] … … 3645 3848 watk -= watk * 25/100; 3646 3849 //Custom Job End 3850 >>>>>>> .r18 3851 3647 3852 3648 3853 return (unsigned short)cap_value(watk,0,USHRT_MAX); … … 3664 3869 if(sc->data[SC_INCMATKRATE]) 3665 3870 matk += matk * sc->data[SC_INCMATKRATE]->val1/100; 3871 <<<<<<< .mine 3872 if(sc->data[SC_OVERWHELMING]) // Warlock Overwhelming Evil [Brain] 3873 matk += matk * sc->data[SC_OVERWHELMING]->val2/100; 3874 ======= 3666 3875 //Custom Jobs (blackmagic) 3667 3876 if(sc->data[SC_OVERWHELMING]) // Warlock Overwhelming Evil [Brain] 3668 3877 matk += matk * sc->data[SC_OVERWHELMING]->val2/100; 3669 3878 //Custom Job End 3879 >>>>>>> .r18 3880 3670 3881 3671 3882 return (unsigned short)cap_value(matk,0,USHRT_MAX); … … 3715 3926 if(sc->data[SC_INCREASING]) 3716 3927 hit += 20; // RockmanEXE; changed based on updated [Reddozen] 3928 <<<<<<< .mine 3929 if(sc->data[SC_DARKMOON]){ //Necro Dark Moon [Brain] 3930 if(sc->data[SC_DARKMOON]->val2) 3931 hit += sc->data[SC_DARKMOON]->val2; 3932 if(sc->data[SC_DARKMOON]->val3) 3933 hit -= sc->data[SC_DARKMOON]->val3; 3934 ======= 3717 3935 //Custom Jobs (blackmagic) 3718 3936 if(sc->data[SC_DARKMOON]){ //Necro Dark Moon [Brain] … … 3721 3939 if(sc->data[SC_DARKMOON]->val3) 3722 3940 hit -= sc->data[SC_DARKMOON]->val3; 3723 } 3724 //Custom Job End 3941 >>>>>>> .r18 3942 } 3943 3725 3944 3726 3945 return (short)cap_value(hit,1,SHRT_MAX); … … 3763 3982 if(sc->data[SC_SPEED]) 3764 3983 flee += 10 + sc->data[SC_SPEED]->val1 * 10 ; 3984 <<<<<<< .mine 3985 if(sc->data[SC_DARKMOON]){ //Necro Dark Moon [Brain] 3986 if(sc->data[SC_DARKMOON]->val2) 3987 flee += sc->data[SC_DARKMOON]->val2; 3988 if(sc->data[SC_DARKMOON]->val3) 3989 flee -= sc->data[SC_DARKMOON]->val3; 3990 ======= 3765 3991 //Custom Jobs (blackmagic) 3766 3992 if(sc->data[SC_DARKMOON]){ //Necro Dark Moon [Brain] … … 3769 3995 if(sc->data[SC_DARKMOON]->val3) 3770 3996 flee -= sc->data[SC_DARKMOON]->val3; 3771 } 3772 //Custom Job End 3997 >>>>>>> .r18 3998 } 3999 3773 4000 3774 4001 return (short)cap_value(flee,1,SHRT_MAX); … … 3829 4056 if (sc->data[SC_FLING]) 3830 4057 def -= def * (sc->data[SC_FLING]->val2)/100; 4058 <<<<<<< .mine 4059 if(sc->data[SC_SUFFER]) // Necro Power Word: Suffer [Brain] 4060 def <<=1; // -25% def 4061 if (sc->data[SC_CURSEEXHAUST]) // Warlock Curse of Exhaustion [Brain] 4062 def -= sc->data[SC_CURSEEXHAUST]->val2; 4063 if (sc->data[SC_OVERWHELMING]) // Warlock Overwhelming Evil [Brain] 4064 def += sc->data[SC_OVERWHELMING]->val1; 4065 ======= 3831 4066 //Custom Jobs (blackmagic) 3832 4067 if(sc->data[SC_SUFFER]) // Necro Power Word: Suffer [Brain] … … 3837 4072 def += sc->data[SC_OVERWHELMING]->val1; 3838 4073 //Custom Job End 4074 >>>>>>> .r18 4075 3839 4076 3840 4077 return (signed char)cap_value(def,CHAR_MIN,CHAR_MAX); … … 3871 4108 if(sc->data[SC_FLING]) 3872 4109 def2 -= def2 * (sc->data[SC_FLING]->val3)/100; 3873 4110 if(sc->data[SC_SUFFER]) // Necro Power Word: Suffer [Brain] 4111 def2 -= def2 * 25/100; // -25% def 4112 if(sc->data[SC_DECREPIFY]) // Necromancer Decrepify [Brain] 4113 if(sc->data[SC_DECREPIFY]->val2>=4) 4114 def2 -= def2 * 25/100; 4115 4116 <<<<<<< .mine 4117 ======= 3874 4118 //Custom Jobs (blackmagic) 3875 4119 if(sc->data[SC_SUFFER]) // Necro Power Word: Suffer [Brain] … … 3879 4123 def2 -= def2 * 25/100; 3880 4124 //Custom Job End 4125 >>>>>>> .r18 3881 4126 3882 4127 return (short)cap_value(def2,1,SHRT_MAX); … … 3906 4151 if(sc->data[SC_CONCENTRATION]) 3907 4152 mdef += 1; //Skill info says it adds a fixed 1 Mdef point. 4153 <<<<<<< .mine 4154 if(sc->data[SC_AGONY]) // Warlock Power Word: Agony [Brain] 4155 mdef -= 25*mdef/100; // -25% mdef 4156 if (sc->data[SC_CURSEEXHAUST]) // Warlock Curse of Exhaustion [Brain] 4157 mdef -= sc->data[SC_CURSEEXHAUST]->val2; 4158 if (sc->data[SC_OVERWHELMING]) // Warlock Overwhelming Evil [Brain] 4159 mdef += sc->data[SC_OVERWHELMING]->val1; 4160 ======= 3908 4161 //Custom Jobs (blackmagic) 3909 4162 if(sc->data[SC_AGONY]) // Warlock Power Word: Agony [Brain] … … 3914 4167 mdef += sc->data[SC_OVERWHELMING]->val1; 3915 4168 //Custom Job End 4169 >>>>>>> .r18 4170 3916 4171 3917 4172 return (signed char)cap_value(mdef,CHAR_MIN,CHAR_MAX); … … 3927 4182 if(sc->data[SC_MINDBREAKER]) 3928 4183 mdef2 -= mdef2 * sc->data[SC_MINDBREAKER]->val3/100; 4184 <<<<<<< .mine 4185 if(sc->data[SC_AGONY]) // Warlock Power Word: Agony [Brain] 4186 mdef2 -= mdef2 * 25/100; // -25% mdef 4187 if(sc->data[SC_DECREPIFY]) // Necromancer Decrepify [Brain] 4188 if(sc->data[SC_DECREPIFY]->val2>=5) 4189 mdef2 -= mdef2 * 25/100; 4190 ======= 3929 4191 //Custom Jobs (blackmagic) 3930 4192 if(sc->data[SC_AGONY]) // Warlock Power Word: Agony [Brain] … … 3934 4196 mdef2 -= mdef2 * 25/100; 3935 4197 //Custom Job End 4198 >>>>>>> .r18 4199 3936 4200 3937 4201 return (short)cap_value(mdef2,1,SHRT_MAX); … … 3987 4251 else if(sc->data[SC_WINDWALK]) 3988 4252 new_speed -= new_speed * sc->data[SC_WINDWALK]->val3/100; 4253 <<<<<<< .mine 4254 else if(sc->data[SC_FEAR]) //Fear Status by [Brainstorm] 4255 new_speed -= new_speed * 25/100; 4256 4257 ======= 3989 4258 //Custom Jobs (blackmagic) 3990 4259 else if(sc->data[SC_FEAR]) //Fear Status by [Brainstorm] 3991 4260 new_speed -= new_speed * 25/100; 3992 4261 //Custom Job End 4262 >>>>>>> .r18 3993 4263 } 3994 4264 … … 4034 4304 if(sc->data[SC_SLOWDOWN]) 4035 4305 speed = speed * 100/75; 4306 <<<<<<< .mine 4307 if(sc->data[SC_DECREPIFY]) // Necromancer Decrepify [Brain] 4308 speed = speed * 100/75; //-25% walkspeed 4309 4310 ======= 4036 4311 //Custom Jobs (blackmagic) 4037 4312 if(sc->data[SC_DECREPIFY]) // Necromancer Decrepify [Brain] 4038 4313 speed = speed * 100/75; //-25% walkspeed 4039 4314 //Custom Job End 4315 >>>>>>> .r18 4040 4316 4041 4317 return (short)cap_value(speed,10,USHRT_MAX); … … 4108 4384 else if(sc->data[SC_MADNESSCANCEL]) 4109 4385 aspd_rate -= 200; 4386 <<<<<<< .mine 4387 else if(sc->data[SC_LUST]) // Adept Blood Lust [Brain] 4388 aspd_rate -= sc->data[SC_LUST]->val2*10; 4389 4390 ======= 4110 4391 //Custom Jobs (blackmagic) 4111 4392 else if(sc->data[SC_LUST]) // Adept Blood Lust [Brain] 4112 4393 aspd_rate -= sc->data[SC_LUST]->val2*10; 4113 4394 //Custom Job End 4395 >>>>>>> .r18 4114 4396 } 4115 4397 … … 4205 4487 if(sc->data[SC_ELEMENTALCHANGE]) 4206 4488 return sc->data[SC_ELEMENTALCHANGE]->val2; 4489 <<<<<<< .mine 4490 if( sc->data[SC_DEATHPACT]) // Necro Death Pact [Brain] 4491 return ELE_UNDEAD; 4492 if( sc->data[SC_OVERWHELMING]) // Warlock Overwhelming Evil [Brain] 4493 return ELE_DARK; 4494 4495 ======= 4207 4496 //Custom Jobs (blackmagic) 4208 4497 if( sc->data[SC_DEATHPACT]) // Necro Death Pact [Brain] … … 4211 4500 return ELE_DARK; 4212 4501 //Custom Job End 4502 >>>>>>> .r18 4213 4503 return (unsigned char)cap_value(element,0,UCHAR_MAX); 4214 4504 } … … 4229 4519 if(sc->data[SC_ELEMENTALCHANGE]) 4230 4520 return sc->data[SC_ELEMENTALCHANGE]->val1; 4521 <<<<<<< .mine 4522 if( sc->data[SC_DEATHPACT]) // Necro Death Pact [Brain] 4523 return 1; 4524 if( sc->data[SC_OVERWHELMING]) // Warlock Overwhelming Evil [Brain] 4525 return 1; 4526 ======= 4231 4527 //Custom Jobs (blackmagic) 4232 4528 if( sc->data[SC_DEATHPACT]) // Necro Death Pact [Brain] … … 4235 4531 return 1; 4236 4532 //Custom Job End 4533 >>>>>>> .r18 4534 4237 4535 4238 4536 return (unsigned char)cap_value(lv,1,4); … … 4972 5270 case SC_CARTBOOST: 4973 5271 case SC_ASSNCROS: 4974 //Custom Jobs (blackmagic)4975 5272 case SC_LUST: // Adept Blood Lust [Brain] 4976 //Custom Job End 5273 4977 5274 if (sc->data[SC_QUAGMIRE]) 4978 5275 return 0; … … 5092 5389 case SC_RICHMANKIM: 5093 5390 case SC_ROKISWEIL: 5391 //New status [Brainstorm] 5392 case SC_FEAR: 5393 case SC_DECREPIFY: 5394 case SC_DARKMOON: 5395 case SC_REQUIEM: 5396 case SC_CURSETONGUES: 5397 case SC_CURSEWEAKNESS: 5398 case SC_CURSEEXHAUST: 5399 5094 5400 case SC_FOGWALL: 5401 <<<<<<< .mine 5402 ======= 5095 5403 //Custom Jobs (blackmagic) 5096 5404 //New status [Brainstorm] … … 5103 5411 case SC_CURSEEXHAUST: 5104 5412 //Custom Job End 5413 >>>>>>> .r18 5105 5414 return 0; 5106 5415 } … … 5118 5427 if (sc->data[SC_STONE] && sc->opt1 == OPT1_STONE) 5119 5428 status_change_end(bl,SC_STONE,-1); 5429 <<<<<<< .mine 5430 // Warlock Curses are canceled by blessing [Brain] 5431 if (sc->data[SC_CURSEWEAKNESS]) 5432 status_change_end(bl,SC_CURSEWEAKNESS,-1); 5433 if (sc->data[SC_CURSETONGUES]) 5434 status_change_end(bl,SC_CURSETONGUES,-1); 5435 if (sc->data[SC_CURSEEXHAUST]) 5436 status_change_end(bl,SC_CURSEEXHAUST,-1); 5437 if (sc->data[SC_DOOM]) // This skill would be way funnier if we could igore this concept, no? 5438 status_change_end(bl,SC_DOOM,-1);//But then people would abuse on WoEs 5439 5440 ======= 5120 5441 //Custom Jobs (blackmagic) 5121 5442 // Warlock Curses are canceled by blessing [Brain] … … 5129 5450 status_change_end(bl,SC_DOOM,-1);//But then people would abuse on WoEs 5130 5451 //Custom Job End 5131 } 5132 break; 5452 >>>>>>> .r18 5453 } 5454 break; 5455 <<<<<<< .mine 5456 case SC_CURSEWEAKNESS: // Warlock Curse of Weakness removes Impositio Manus [Brain] 5457 if (sc->data[SC_IMPOSITIO]) 5458 status_change_end(bl,SC_IMPOSITIO,-1); 5459 if (sc->data[SC_BLESSING]) //The opposite is also valid, curses cancel blessing [Brain] 5460 status_change_end(bl,SC_BLESSING,-1); 5461 break; 5462 case SC_CURSETONGUES: // Warlock Curse of Tongues removes Suffragium [Brain] 5463 if (sc->data[SC_SUFFRAGIUM]) 5464 status_change_end(bl,SC_SUFFRAGIUM,-1); 5465 if (sc->data[SC_BLESSING]) 5466 status_change_end(bl,SC_BLESSING,-1); 5467 break; 5468 case SC_CURSEEXHAUST: // Warlock Curse of Exhaustion removes angelus [Brain] 5469 if (sc->data[SC_ANGELUS]) 5470 status_change_end(bl,SC_ANGELUS,-1); 5471 case SC_DOOM: 5472 if (sc->data[SC_BLESSING]) 5473 status_change_end(bl,SC_BLESSING,-1); 5474 break; 5475 case SC_IMPOSITIO: // Impositio Manus removes Curse of Weakness [Brain] 5476 if (sc->data[SC_CURSEWEAKNESS]) 5477 status_change_end(bl,SC_CURSEWEAKNESS,-1); 5478 break; 5479 case SC_SUFFRAGIUM: // Suffragium removes Curse of Tongues [Brain] 5480 if (sc->data[SC_CURSETONGUES]) 5481 status_change_end(bl,SC_CURSETONGUES,-1); 5482 break; 5483 case SC_ANGELUS: // Angelus removes Curse of Exhaustion [Brain] 5484 if (sc->data[SC_CURSEEXHAUST]) 5485 status_change_end(bl,SC_CURSEEXHAUST,-1); 5486 break; 5487 5488 ======= 5133 5489 //Custom Jobs (blackmagic) 5134 5490 case SC_CURSEWEAKNESS: // Warlock Curse of Weakness removes Impositio Manus [Brain] … … 5164 5520 break; 5165 5521 //Custom Job End 5522 >>>>>>> .r18 5166 5523 case SC_INCREASEAGI: 5167 5524 status_change_end(bl,SC_DECREASEAGI,-1); … … 5182 5539 status_change_end(bl,SC_TWOHANDQUICKEN,-1); 5183 5540 status_change_end(bl,SC_ONEHAND,-1); 5541 <<<<<<< .mine 5542 if(sc->data[SC_LUST]) // Adept Blood Lust [Brain] 5543 ======= 5184 5544 //Custom Jobs (blackmagic) 5185 5545 if(sc->data[SC_LUST]) // Adept Blood Lust [Brain] 5546 >>>>>>> .r18 5186 5547 status_change_end(bl,SC_LUST,-1); 5187 //Custom Job End 5548 5188 5549 break; 5189 5550 case SC_ONEHAND: … … 5244 5605 status_change_end(bl,SC_MADNESSCANCEL,-1); 5245 5606 break; 5607 <<<<<<< .mine 5608 case SC_FREEZE: //Frozen status ends immolating AND searing status [Brain] 5609 if(sc->data[SC_IMMOLATE]) 5610 status_change_end(bl,SC_IMMOLATE,-1); 5611 case SC_IMMOLATE: // Warlock Immolate [Brain] 5612 if(sc->data[SC_SEARING]) //Immolating status ends searing status 5613 status_change_end(bl,SC_SEARING,-1); 5614 break; 5615 5616 ======= 5246 5617 //Custom Jobs (blackmagic) 5247 5618 case SC_FREEZE: //Frozen status ends immolating AND searing status [Brain] … … 5253 5624 break; 5254 5625 //Custom Job End 5626 >>>>>>> .r18 5255 5627 case SC_MADNESSCANCEL: 5256 5628 status_change_end(bl,SC_ADJUSTMENT,-1); … … 5284 5656 case SC_SILENCE: 5285 5657 case SC_CONFUSION: 5286 //Custom Jobs (blackmagic)5287 5658 case SC_FEAR: //Fear Status by [Brainstorm] 5288 //Custom Job End5289 5659 case SC_BLIND: 5290 5660 case SC_BLEEDING: … … 5596 5966 clif_emotion(bl,1); 5597 5967 break; 5968 <<<<<<< .mine 5969 case SC_FEAR: //Fear Status by [Brainstorm] 5970 clif_emotion(bl,16); // e_wah 5971 if(sd) tick /= 2; 5972 break; 5973 5974 ======= 5598 5975 //Custom Jobs (blackmagic) 5599 5976 case SC_FEAR: //Fear Status by [Brainstorm] … … 5602 5979 break; 5603 5980 //Custom Job End 5981 >>>>>>> .r18 5604 5982 case SC_BLEEDING: 5605 5983 val4 = tick/10000; … … 5979 6357 break; 5980 6358 6359 <<<<<<< .mine 6360 case SC_ATFIELD: // AT-Field [Brainstorm] 6361 val2 = 100; // 100% Block chance 6362 val3 = 100; // Dodge 100 attacks total. 6363 val4 = tick/1000; 6364 tick = 1000; 6365 break; 6366 ======= 5981 6367 //Custom Jobs (blackmagic) 5982 6368 case SC_ATFIELD: // AT-Field [Brainstorm] … … 5987 6373 break; 5988 6374 //Custom Job End 6375 >>>>>>> .r18 6376 5989 6377 5990 6378 case SC_COMBO: … … 6035 6423 val2 = 0; //0 -> Half stat. 6036 6424 break; 6425 <<<<<<< .mine 6426 case SC_REQUIEM: //Necro Requiem and Dark Moon [Brain] 6427 case SC_DARKMOON: 6428 if (undead_flag || status->race==RC_UNDEAD || status->race==RC_DEMON) 6429 val2 = val1; //Demon and Undead get buffed 6430 else if(status->race==RC_FORMLESS || status->def_ele==ELE_GHOST || bl->type == BL_PC) 6431 { 6432 val1 = 0; //No status change for Formless and Ghosts, and non-undead players 6433 tick = 0; //Cancel status to not show requiem icon without a reason 6434 } 6435 else 6436 val3 = val1; //Everything else (living) get negative status (requiem only) 6437 ======= 6037 6438 //Custom Jobs (blackmagic) 6038 6439 case SC_REQUIEM: //Necro Requiem and Dark Moon [Brain] … … 6050 6451 case SC_DECREPIFY: //Necro Decrepify [Brain] 6051 6452 val2 = val1; 6052 break; 6053 //Custom Job End 6453 >>>>>>> .r18 6454 break; 6455 case SC_DECREPIFY: //Necro Decrepify [Brain] 6456 val2 = val1; 6457 break; 6458 6054 6459 case SC_TRICKDEAD: 6055 6460 if (vd) vd->dead_sit = 1; … … 6092 6497 val2 = 5*val1; //watk increase 6093 6498 break; 6499 <<<<<<< .mine 6500 case SC_CURSEWEAKNESS: // Warlock Curse of Weakness [Brain] 6501 val2 = 5*val1; //batk/watk decrease 6502 break; 6503 case SC_CURSEEXHAUST: // Warlock Curse of Exhaustion [Brain] 6504 val2 = 2*val1; //def/mdef decrease 6505 break; 6506 case SC_CURSETONGUES: // Warlock Curse of Tongues [Brain] 6507 val2 = 10*val1; //casttime increase 6508 break; 6509 6510 ======= 6094 6511 //Custom Jobs (blackmagic) 6095 6512 case SC_CURSEWEAKNESS: // Warlock Curse of Weakness [Brain] … … 6103 6520 break; 6104 6521 //Custom Job End 6522 >>>>>>> .r18 6105 6523 case SC_MELTDOWN: 6106 6524 val2 = 100*val1; //Chance to break weapon … … 6158 6576 val3 = 5+5*val1; //bAtk/wAtk rate change 6159 6577 break; 6578 <<<<<<< .mine 6579 case SC_LUST: // Adept Blood Lust [Brain] 6580 val2 = 5+3*val1; //Aspd/bAtk/wAtk change 6581 val3 = tick>0?tick:1000; //Interval at which HP is drained. 6582 break; 6583 case SC_DEATHPACT: // Necro Death Pact [Brain] 6584 val2 = 5*val1; //Neutral property resistance 6585 val3 = tick>0?tick:10000; //Interval at which HP is drained. 6586 break; 6587 case SC_OVERWHELMING: // Warlock Overwhelming Evil [Brain] 6588 val2 = 2*val1; //matk bonus 6589 val3 = tick>0?tick:1000; //Interval at which SP is drained. 6590 break; 6591 6592 ======= 6160 6593 //Custom Jobs (blackmagic) 6161 6594 case SC_LUST: // Adept Blood Lust [Brain] … … 6172 6605 break; 6173 6606 //Custom Job End 6607 >>>>>>> .r18 6174 6608 case SC_MINDBREAKER: 6175 6609 val2 = 20*val1; //matk increase. … … 6355 6789 unit_skillcastcancel(bl, 0); 6356 6790 break; 6791 <<<<<<< .mine 6792 6793 case SC_FEAR: //Fear Status by [Brainstorm] 6794 unit_stop_attack(bl); 6795 break; 6796 6797 6798 ======= 6357 6799 //Custom Jobs (blackmagic) 6358 6800 case SC_FEAR: //Fear Status by [Brainstorm] … … 6360 6802 break; 6361 6803 //Custom Job End 6804 >>>>>>> .r18 6362 6805 } 6363 6806 … … 6794 7237 clif_status_change(bl,SI_MOONLIT,0); 6795 7238 6796 status_change_end(bl,SC_LONGING,-1); 7239 status_change_end(bl,SC_LONGING,-1); 6797 7240 break; 6798 7241 case SC_NOCHAT: … … 6805 7248 } 6806 7249 break; 7250 <<<<<<< .mine 7251 case SC_SPLASHER: 7252 case SC_DOOM: // Warlock Curse of Doom [Brain] 7253 7254 ======= 6807 7255 //Custom Jobs (blackmagic) 6808 7256 case SC_SPLASHER: 6809 7257 case SC_DOOM: // Warlock Curse of Doom [Brain] 6810 7258 //Custom Job End 7259 >>>>>>> .r18 6811 7260 { 6812 7261 struct block_list *src=map_id2bl(sce->val3); … … 7176 7625 sc_timer_next(sce->val2+tick, status_change_timer, bl->id, data); 7177 7626 return 0; 7627 <<<<<<< .mine 7628 ======= 7178 7629 //Custom Jobs (blackmagic) 7179 7630 case SC_LUST: // Adept Blood Lust [Brain] … … 7193 7644 return 0; 7194 7645 //Custom Job End 7646 >>>>>>> .r18 7647 7648 case SC_LUST: // Adept Blood Lust [Brain] 7649 if(!status_charge(bl, status->max_hp/100, 0)) 7650 break; //Not enough HP to continue. 7651 sc_timer_next(sce->val3+tick, status_change_timer, bl->id, data); 7652 return 0; 7653 case SC_DEATHPACT: // Necro Death Pact [Brain] 7654 // Drains 1 HP every second (status wont kill, but dying will cancel it) 7655 status_charge(bl, 1, 0); 7656 sc_timer_next(sce->val3+tick, status_change_timer, bl->id, data); 7657 return 0; 7658 case SC_OVERWHELMING: // Warlock Overwhelming Evil [Brain] 7659 if(!status_charge(bl, 0, status->max_sp/100)) 7660 break; //Not enough SP to continue. 7661 sc_timer_next(sce->val3+tick, status_change_timer, bl->id, data); 7662 return 0; 7663 7195 7664 7196 7665 case SC_CHASEWALK: … … 7427 7896 } 7428 7897 break; 7898 <<<<<<< .mine 7899 case SC_DOOM: // Warlock Curse of Doom [Brain] 7900 if((sce->val4 -= 500) > 0) { 7901 sc_timer_next(500 + tick, status_change_timer, bl->id, data); 7902 return 0; 7903 } 7904 break; 7905 ======= 7429 7906 //Custom Jobs (blackmagic) 7430 7907 case SC_DOOM: // Warlock Curse of Doom [Brain] … … 7435 7912 break; 7436 7913 //Custom Job End 7914 >>>>>>> .r18 7437 7915 7438 7916 case SC_MARIONETTE: … … 7602 8080 case SC_WATKFOOD: 7603 8081 case SC_MATKFOOD: 7604 //Custom Jobs (blackmagic)7605 8082 case SC_DOOM: // Warlock Curse of Doom [Brain] 7606 //Custom Job End 8083 7607 8084 continue; 7608 8085 -
src/map/status.h
r13 r19 294 294 SC_SEVENWIND, 295 295 SC_DEF_RATE, 296 SC_DECREPIFY, // New status [brain] 297 SC_LUST, 298 SC_DARKMOON, 299 SC_REQUIEM, 300 SC_DEATHPACT, 301 SC_ATFIELD, 302 SC_SUFFER, 303 SC_SEARING, 304 SC_IMMOLATE, 305 SC_AGONY, 306 SC_CURSETONGUES, 307 SC_DOOM, 308 SC_CURSEWEAKNESS, 309 SC_CURSEEXHAUST, 310 SC_OVERWHELMING, 311 SC_FEAR, 296 312 SC_SPREGEN, 297 313 SC_WALKSPEED, 314 <<<<<<< .mine 315 ======= 298 316 //Custom Jobs (blackmagic) 299 317 SC_DECREPIFY, // New status [brain] … … 314 332 SC_FEAR, 315 333 //Custom Job End 334 >>>>>>> .r18 316 335 SC_MAX, //Automatically updated max, used in for's to check we are within bounds. 317 336 } sc_type; -
src/map/unit.c
r13 r19 379 379 unit_escape(bl, tbl, 15); 380 380 //Custom Job End 381 382 if (sc && sc->data[SC_FEAR]) //Flee from my target [Brainstorm] 383 unit_escape(bl, tbl, 15); 384 381 385 382 386 if(ud->walktimer != -1) {