Bug Fixes

* Spell Fist will now double damage with Double Attack and fixed damage formula. (bugreport:7024)
* Follow up to 06986d6 to fix Fire Expansion casting the wrong Acid Demonstration skill (magic type). Thanks to @Traxis.
* Fixed Rebound not removing the Decrease Agility status icon. (bugreport:8910)
* Fixed Full Throttle SP reduction rate.
* Gates of Hell now uses weapon element and is forced neutral for the final element. (bugreport:8875)
* Fixed Auto Counter to work with Crush Strike. (bugreport:6919)
* Fixed Masquerade-Groomy renewal ASPD penalty.
* Updated Acceleration, Hovering, Self Destruction, Shapeshift, Emergency Cool, Magnetic Field, Neutral Barrier, Stealth Field, and Repair skill item requirements to only check the player's inventory rather than equipment list. (bugreport:8911)
* Fixed Magnetic Field to stop players from walking in non-PvP maps. (bugreport:8911)
* Charms will now be removed when another Charm element is used. (bugreport:8914)
* Crazy Weed now destroys Man Hole and Dimensional Door.
* Man Hole and Hells Plant are able to be casted on top of players. (bugreport:8918)
* Items are now usable while stuck in Man Hole. (bugreport:8918)
* Fixed Extremity Fist naturally regaining SP during the 5 minute cooldown. (bugreport:8920)
* Fixed an issue with Extremity Fist position updating.
* Fixed Issen's damage calculation order of magnitude. Thanks to @chriser-.
* Updated the SCS_NOCAST table.
This commit is contained in:
aleos89 2014-04-21 14:49:39 -04:00
parent d1e04fa3c1
commit f7c09d95fd
8 changed files with 187 additions and 154 deletions

View File

@ -62,6 +62,7 @@
// 0x1000- Spell that does not affect user that has NC_HOVERING active
// 0x2000- spell that can be using while riding warg
// 0x4000- spell that can't be used while in mado
// 0x8000- spell that can be used to target while under Man Hole effect
// 17 Name
// 18 Description
1,0,0,0,0,0,0,9,0,no,0,0,0,none,0,0x0, NV_BASIC,Basic Skill
@ -1043,7 +1044,7 @@
2284,1,6,1,-1,0x2,1,5,1,no,0,0,0,weapon,0,0x0, SC_FATALMENACE,Fatal Menace
2285,0,6,4,0,0x1,0,10,1,no,0,0,0,none,0,0x0, SC_REPRODUCE,Reproduce
2286,0,6,4,0,0x1,0,10,1,yes,0,0,0,none,0,0x0, SC_AUTOSHADOWSPELL,Auto Shadow Spell
2287,5,6,1,0,0x1,0,5,1,no,0,0,0,none,0,0x40, SC_SHADOWFORM,Shadow Form
2287,5,6,1,0,0x1,0,5,1,no,0,0,0,none,0,0x8040, SC_SHADOWFORM,Shadow Form
2288,7:7:7:9:9:9:9:11:11:11,8,1,-1,0,0,10,-3,yes,0,0,0,weapon,3,0x0, SC_TRIANGLESHOT,Triangle Shot
2289,0,6,4,0,0x3,2,5,1,no,0,0,0,none,0,0x0, SC_BODYPAINT,Body Painting
2290,0,6,4,0,0x1,0,5,1,yes,0,0,0,none,0,0x0, SC_INVISIBILITY,Invisibility
@ -1054,7 +1055,7 @@
2295,3,6,1,0,0x1,0,3,1,yes,0,0,0,none,0,0x20, SC_LAZINESS,Masquerade - Laziness
2296,3,6,1,0,0x1,0,3,1,yes,0,0,0,none,0,0x20, SC_UNLUCKY,Masquerade - Unlucky
2297,3,6,1,0,0x1,0,3,1,yes,0,0,0,none,0,0x20, SC_WEAKNESS,Masquerade - Weakness
2298,3,6,1,0,0x1,0,5,1,yes,0,0,0,weapon,0,0x20, SC_STRIPACCESSARY,Strip Accessory //CHECK Is weapon attack type needed?
2298,3,6,1,0,0x1,0,5,1,yes,0,0,0,weapon,0,0x8020, SC_STRIPACCESSARY,Strip Accessory //CHECK Is weapon attack type needed?
2299,7,6,2,0,0x1,0,3,1,yes,0,0,3,none,0,0x0, SC_MANHOLE,Man Hole
2300,7,6,2,0,0x1,0,3,1,yes,0,0,1,none,0,0x0, SC_DIMENSIONDOOR,Dimension Door
2301,7,6,2,0,0x1,0,3,1,yes,0,0x20000,0,none,0,0x0, SC_CHAOSPANIC,Chaos Panic
@ -1105,7 +1106,7 @@
2340,0,6,4,0,0x3,2,1,1,no,0,0,0,none,0,0x0, SR_ASSIMILATEPOWER,Assimilate Power
2341,3,6,16,0,0x1,0,1,1,yes,0,0x200,0,none,0,0x0, SR_POWERVELOCITY,Power Velocity
2342,1,6,1,-1,0x20,0,5,1,no,0,0,0,weapon,7,0x0, SR_CRESCENTELBOW_AUTOSPELL,Crescent Elbow Autospell
2343,1:2:3:3:4:4:5:5:6:7,8,1,0,0,0,10,-7,yes,0,0,0,weapon,0,0x0, SR_GATEOFHELL,Gate of Hell
2343,1:2:3:3:4:4:5:5:6:7,8,1,-1,0,0,10,-7,yes,0,0,0,weapon,0,0x0, SR_GATEOFHELL,Gate of Hell
2344,2,6,1,-1,0,0,5,1,no,0,0,0,weapon,0,0x0, SR_GENTLETOUCH_QUIET,Gentle Touch - Quiet
2345,2,6,16,0,0x1,0,5,1,no,0,0,0,none,0,0x0, SR_GENTLETOUCH_CURE,Gentle Touch - Cure
2346,0,6,4,0,0x1,0,5,1,yes,0,0,0,none,0,0x0, SR_GENTLETOUCH_ENERGYGAIN,Gentle Touch - Energy Gain

View File

@ -683,20 +683,20 @@
2259,0,0,20,0,0,0,99,0,0,mado,0,0,2139,0,6146,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //NC_FLAMELAUNCHER
2260,0,0,20,0,0,0,99,0,0,mado,0,0,6146,1,6147,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //NC_COLDSLOWER
2261,0,0,40:45:50,0,0,0,99,8,1,mado,0,0,6146,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //NC_ARMSCANNON
2262,0,0,20:40:60,0,0,0,99,0,0,mado,0,0,6146,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2800 //NC_ACCELERATION
2263,0,0,25,0,0,0,99,0,0,mado,0,0,6146,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2801 //NC_HOVERING
2262,0,0,20:40:60,0,0,0,99,0,0,mado,0,0,2800,0,6146,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //NC_ACCELERATION
2263,0,0,25,0,0,0,99,0,0,mado,0,0,2801,0,6146,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //NC_HOVERING
2264,0,0,5,0,0,0,99,0,0,mado,0,0,6146,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //NC_F_SIDESLIDE
2265,0,0,5,0,0,0,99,0,0,mado,0,0,6146,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //NC_B_SIDESLIDE
2267,0,0,1,0,0,0,99,0,0,mado,0,0,6146,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2802 //NC_SELFDESTRUCTION
2268,0,0,100,0,0,0,99,0,0,mado,0,0,6360,1,6363,1,6362,1,6361,1,6146,2,0,0,0,0,0,0,0,0,0,0,2803 //NC_SHAPESHIFT
2269,0,0,20,0,0,0,99,0,0,mado,0,0,6146,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2804 //NC_EMERGENCYCOOL
2267,0,0,1,0,0,0,99,0,0,mado,0,0,2802,0,6146,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //NC_SELFDESTRUCTION
2268,0,0,100,0,0,0,99,0,0,mado,0,0,2803,0,6360,1,6363,1,6362,1,6361,1,6146,2,0,0,0,0,0,0,0,0,0 //NC_SHAPESHIFT
2269,0,0,20,0,0,0,99,0,0,mado,0,0,2804,0,6146,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //NC_EMERGENCYCOOL
2270,0,0,45,0,0,0,99,0,0,mado,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //NC_INFRAREDSCAN
2271,0,0,30,0,0,0,99,0,0,mado,0,0,6146,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //NC_ANALYZE
2272,0,0,90,0,0,0,99,0,0,mado,0,0,6146,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2805 //NC_MAGNETICFIELD
2273,0,0,90,0,0,0,99,0,0,mado,0,0,6146,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2806 //NC_NEUTRALBARRIER
2274,0,0,100:150:200,0,0,0,99,0,0,mado,0,0,6146,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2808 //NC_STEALTHFIELD
2275,0,0,25:30:35:40:45,0,0,0,99,0,0,mado,0,0,6146,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2807 //NC_REPAIR
2272,0,0,90,0,0,0,99,0,0,mado,0,0,2805,0,6146,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //NC_MAGNETICFIELD
2273,0,0,90,0,0,0,99,0,0,mado,0,0,2806,0,6146,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //NC_NEUTRALBARRIER
2274,0,0,100:150:200,0,0,0,99,0,0,mado,0,0,2808,0,6146,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //NC_STEALTHFIELD
2275,0,0,25:30:35:40:45,0,0,0,99,0,0,mado,0,0,2807,0,6146,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //NC_REPAIR
2278,0,0,20:22:24:26:28,0,0,0,6:7,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //NC_AXEBOOMERANG
2279,0,0,20:22:24:26:28,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //NC_POWERSWING

View File

@ -62,6 +62,7 @@
// 0x1000- Spell that does not affect user that has NC_HOVERING active
// 0x2000- spell that can be using while riding warg
// 0x4000- spell that can't be used while in mado
// 0x8000- spell that can be used to target while under Man Hole effect
// 17 Name
// 18 Description
1,0,0,0,0,0,0,9,0,no,0,0,0,none,0,0x0, NV_BASIC,Basic Skill
@ -1043,7 +1044,7 @@
2284,1,6,1,-1,0x2,1,5,1,no,0,0,0,weapon,0,0x0, SC_FATALMENACE,Fatal Menace
2285,0,6,4,0,0x1,0,10,1,no,0,0,0,none,0,0x0, SC_REPRODUCE,Reproduce
2286,0,6,4,0,0x1,0,10,1,yes,0,0,0,none,0,0x0, SC_AUTOSHADOWSPELL,Auto Shadow Spell
2287,5,6,1,0,0x1,0,5,1,no,0,0,0,none,0,0x40, SC_SHADOWFORM,Shadow Form
2287,5,6,1,0,0x1,0,5,1,no,0,0,0,none,0,0x8040, SC_SHADOWFORM,Shadow Form
2288,7:7:7:9:9:9:9:11:11:11,8,1,-1,0,0,10,-3,yes,0,0,0,weapon,3,0x0, SC_TRIANGLESHOT,Triangle Shot
2289,0,6,4,0,0x3,2,5,1,no,0,0,0,none,0,0x0, SC_BODYPAINT,Body Painting
2290,0,6,4,0,0x1,0,5,1,yes,0,0,0,none,0,0x0, SC_INVISIBILITY,Invisibility
@ -1054,7 +1055,7 @@
2295,3,6,1,0,0x1,0,3,1,yes,0,0,0,none,0,0x20, SC_LAZINESS,Masquerade - Laziness
2296,3,6,1,0,0x1,0,3,1,yes,0,0,0,none,0,0x20, SC_UNLUCKY,Masquerade - Unlucky
2297,3,6,1,0,0x1,0,3,1,yes,0,0,0,none,0,0x20, SC_WEAKNESS,Masquerade - Weakness
2298,3,6,1,0,0x1,0,5,1,yes,0,0,0,weapon,0,0x20, SC_STRIPACCESSARY,Strip Accessory //CHECK Is weapon attack type needed?
2298,3,6,1,0,0x1,0,5,1,yes,0,0,0,weapon,0,0x8020, SC_STRIPACCESSARY,Strip Accessory //CHECK Is weapon attack type needed?
2299,7,6,2,0,0x1,0,3,1,yes,0,0,3,none,0,0x0, SC_MANHOLE,Man Hole
2300,7,6,2,0,0x1,0,3,1,yes,0,0,1,none,0,0x0, SC_DIMENSIONDOOR,Dimension Door
2301,7,6,2,0,0x1,0,3,1,yes,0,0x20000,0,none,0,0x0, SC_CHAOSPANIC,Chaos Panic
@ -1105,7 +1106,7 @@
2340,0,6,4,0,0x3,2,1,1,no,0,0,0,none,0,0x0, SR_ASSIMILATEPOWER,Assimilate Power
2341,3,6,16,0,0x1,0,1,1,yes,0,0x200,0,none,0,0x0, SR_POWERVELOCITY,Power Velocity
2342,1,6,1,-1,0x20,0,5,1,no,0,0,0,weapon,7,0x0, SR_CRESCENTELBOW_AUTOSPELL,Crescent Elbow Autospell
2343,1:2:3:3:4:4:5:5:6:7,8,1,0,0,0,10,-7,yes,0,0,0,weapon,0,0x0, SR_GATEOFHELL,Gate of Hell
2343,1:2:3:3:4:4:5:5:6:7,8,1,-1,0,0,10,-7,yes,0,0,0,weapon,0,0x0, SR_GATEOFHELL,Gate of Hell
2344,2,6,1,-1,0,0,5,1,no,0,0,0,weapon,0,0x0, SR_GENTLETOUCH_QUIET,Gentle Touch - Quiet
2345,2,6,16,0,0x1,0,5,1,no,0,0,0,none,0,0x0, SR_GENTLETOUCH_CURE,Gentle Touch - Cure
2346,0,6,4,0,0x1,0,5,1,yes,0,0,0,none,0,0x0, SR_GENTLETOUCH_ENERGYGAIN,Gentle Touch - Energy Gain

View File

@ -683,20 +683,20 @@
2259,0,0,20,0,0,0,99,0,0,mado,0,0,2139,0,6146,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //NC_FLAMELAUNCHER
2260,0,0,20,0,0,0,99,0,0,mado,0,0,6146,1,6147,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //NC_COLDSLOWER
2261,0,0,40:45:50,0,0,0,99,8,1,mado,0,0,6146,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //NC_ARMSCANNON
2262,0,0,20:40:60,0,0,0,99,0,0,mado,0,0,6146,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2800 //NC_ACCELERATION
2263,0,0,25,0,0,0,99,0,0,mado,0,0,6146,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2801 //NC_HOVERING
2262,0,0,20:40:60,0,0,0,99,0,0,mado,0,0,2800,0,6146,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //NC_ACCELERATION
2263,0,0,25,0,0,0,99,0,0,mado,0,0,2801,0,6146,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //NC_HOVERING
2264,0,0,5,0,0,0,99,0,0,mado,0,0,6146,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //NC_F_SIDESLIDE
2265,0,0,5,0,0,0,99,0,0,mado,0,0,6146,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //NC_B_SIDESLIDE
2267,0,0,1,0,0,0,99,0,0,mado,0,0,6146,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2802 //NC_SELFDESTRUCTION
2268,0,0,100,0,0,0,99,0,0,mado,0,0,6360,1,6363,1,6362,1,6361,1,6146,2,0,0,0,0,0,0,0,0,0,0,2803 //NC_SHAPESHIFT
2269,0,0,20,0,0,0,99,0,0,mado,0,0,6146,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2804 //NC_EMERGENCYCOOL
2267,0,0,1,0,0,0,99,0,0,mado,0,0,2802,0,6146,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //NC_SELFDESTRUCTION
2268,0,0,100,0,0,0,99,0,0,mado,0,0,2803,0,6360,1,6363,1,6362,1,6361,1,6146,2,0,0,0,0,0,0,0,0,0 //NC_SHAPESHIFT
2269,0,0,20,0,0,0,99,0,0,mado,0,0,2804,0,6146,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //NC_EMERGENCYCOOL
2270,0,0,45,0,0,0,99,0,0,mado,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //NC_INFRAREDSCAN
2271,0,0,30,0,0,0,99,0,0,mado,0,0,6146,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //NC_ANALYZE
2272,0,0,90,0,0,0,99,0,0,mado,0,0,6146,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2805 //NC_MAGNETICFIELD
2273,0,0,90,0,0,0,99,0,0,mado,0,0,6146,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2806 //NC_NEUTRALBARRIER
2274,0,0,100:150:200,0,0,0,99,0,0,mado,0,0,6146,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2808 //NC_STEALTHFIELD
2275,0,0,25:30:35:40:45,0,0,0,99,0,0,mado,0,0,6146,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2807 //NC_REPAIR
2272,0,0,90,0,0,0,99,0,0,mado,0,0,2805,0,6146,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //NC_MAGNETICFIELD
2273,0,0,90,0,0,0,99,0,0,mado,0,0,2806,0,6146,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //NC_NEUTRALBARRIER
2274,0,0,100:150:200,0,0,0,99,0,0,mado,0,0,2808,0,6146,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //NC_STEALTHFIELD
2275,0,0,25:30:35:40:45,0,0,0,99,0,0,mado,0,0,2807,0,6146,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //NC_REPAIR
2278,0,0,20:22:24:26:28,0,0,0,6:7,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //NC_AXEBOOMERANG
2279,0,0,20:22:24:26:28,0,0,0,99,0,0,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //NC_POWERSWING

View File

@ -2367,6 +2367,7 @@ static struct Damage battle_calc_element_damage(struct Damage wd, struct block_l
switch( skill_id ) {
case MC_CARTREVOLUTION: //Cart Revolution apply the element fix once more with neutral element
case SR_GATEOFHELL:
case KO_BAKURETSU:
wd.damage = battle_attr_fix(src, target, wd.damage, ELE_NEUTRAL, tstatus->def_ele, tstatus->ele_lv);
break;
@ -2612,7 +2613,7 @@ struct Damage battle_calc_skill_base_damage(struct Damage wd, struct block_list
}
#else
case NJ_ISSEN:
wd.damage = (40 * sstatus->str) + (8 * skill_lv / 100 * sstatus->hp);
wd.damage = (40 * sstatus->str) + ((sstatus->hp * (8 * skill_lv)) / 100);
wd.damage2 = 0;
break;
case LK_SPIRALPIERCE:
@ -2925,6 +2926,18 @@ static int battle_calc_attack_skill_ratio(struct Damage wd, struct block_list *s
case MER_CRASH:
skillratio += 10*skill_lv;
break;
case KN_AUTOCOUNTER:
if(sc && sc->data[SC_CRUSHSTRIKE]) {
if(sd) {
// ATK [{Weapon Level * (Weapon Upgrade Level + 6) * 100} + (Weapon ATK) + (Weapon Weight)]%
short index = sd->equip_index[EQI_HAND_R];
if(index >= 0 && sd->inventory_data[index] && sd->inventory_data[index]->type == IT_WEAPON)
skillratio = sd->inventory_data[index]->weight / 10 + sstatus->rhw.atk +
100 * sd->inventory_data[index]->wlv * (sd->status.inventory[index].refine + 6);
}
}
break;
case KN_SPEARSTAB:
skillratio += 15*skill_lv;
break;
@ -4820,6 +4833,7 @@ static struct Damage battle_calc_weapon_attack(struct block_list *src, struct bl
case MO_INVESTIGATE:
case CR_ACIDDEMONSTRATION:
case GN_FIRE_EXPANSION_ACID:
case SR_GATEOFHELL:
case KO_BAKURETSU:
// Forced to neutral element
wd.damage = battle_attr_fix(src, target, wd.damage, ELE_NEUTRAL, tstatus->def_ele, tstatus->ele_lv);
@ -5116,7 +5130,7 @@ struct Damage battle_calc_magic_attack(struct block_list *src,struct block_list
case MG_COLDBOLT:
case MG_LIGHTNINGBOLT:
if ( sc && sc->data[SC_SPELLFIST] && mflag&BF_SHORT ) {
skillratio += (sc->data[SC_SPELLFIST]->val4 * 100) + (sc->data[SC_SPELLFIST]->val2 * 50) - 100;// val4 = used bolt level, val2 = used spellfist level. [Rytech]
skillratio += (sc->data[SC_SPELLFIST]->val4 * 100) + (sc->data[SC_SPELLFIST]->val1 * 50) - 100;// val4 = used bolt level, val2 = used spellfist level. [Rytech]
ad.div_ = 1;// ad mods, to make it work similar to regular hits [Xazax]
ad.flag = BF_WEAPON|BF_SHORT;
ad.type = 0;
@ -6380,6 +6394,8 @@ enum damage_lv battle_weapon_attack(struct block_list* src, struct block_list* t
clif_damage(src, target, tick, sstatus->amotion, 1, 0, 1, 0, 0); //Display MISS.
status_change_end(target, SC_AUTOCOUNTER, INVALID_TIMER);
skill_attack(BF_WEAPON,target,target,src,KN_AUTOCOUNTER,skill_lv,tick,0);
if (tsc->data[SC_CRUSHSTRIKE])
status_change_end(target, SC_CRUSHSTRIKE, INVALID_TIMER);
return ATK_BLOCK;
}
}
@ -6480,6 +6496,8 @@ enum damage_lv battle_weapon_attack(struct block_list* src, struct block_list* t
if( --(sc->data[SC_SPELLFIST]->val1) >= 0 ){
struct Damage ad = battle_calc_attack(BF_MAGIC,src,target,sc->data[SC_SPELLFIST]->val3,sc->data[SC_SPELLFIST]->val4,flag|BF_SHORT);
wd.damage = ad.damage;
if (wd.div_ > 1)
wd.damage *= 2; // Double the damage for multiple hits.
} else
status_change_end(src,SC_SPELLFIST,INVALID_TIMER);
}

View File

@ -611,7 +611,6 @@ bool skill_isNotOk(uint16 skill_id, struct map_session_data *sd)
break;
case WM_SIRCLEOFNATURE:
case WM_SOUND_OF_DESTRUCTION:
case SC_MANHOLE:
case WM_LULLABY_DEEPSLEEP:
case WM_SATURDAY_NIGHT_FEVER:
if( !map_flag_vs(m) ) {
@ -1218,6 +1217,7 @@ int skill_additional_effect (struct block_list* src, struct block_list *bl, uint
break;
case CR_ACIDDEMONSTRATION:
case GN_FIRE_EXPANSION_ACID:
skill_break_equip(src,bl, EQP_WEAPON|EQP_ARMOR, 100*skill_lv, BCT_ENEMY);
break;
@ -3336,6 +3336,10 @@ static int skill_check_unit_range2 (struct block_list *bl, int x, int y, uint16
case WZ_ICEWALL:
range = 2;
break;
case SC_MANHOLE:
case GN_HELLS_PLANT:
range = 0;
break;
default:
{
int layout_type = skill_get_unit_layout_type(skill_id,skill_lv);
@ -5028,6 +5032,7 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint
break;
case NC_MAGNETICFIELD:
if( !map[src->m].flag.pvp ) // Doesn't affect enemies on PvP maps
sc_start2(src,bl,SC_MAGNETICFIELD,100,skill_lv,src->id,skill_get_time(skill_id,skill_lv));
break;
case SC_FATALMENACE:
@ -9809,8 +9814,11 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
case KO_KAZEHU_SEIRAN:
case KO_DOHU_KOUKAI:
if(sd) {
int ttype = skill_get_ele(skill_id, skill_lv);
int i, ttype = skill_get_ele(skill_id, skill_lv);
clif_skill_nodamage(src, bl, skill_id, skill_lv, 1);
ARR_FIND(1, 6, i, sd->talisman[i] > 0 && ttype != i);
if( i < 6 )
pc_del_talisman(sd, sd->talisman[i], i); // Replace talisman
pc_add_talisman(sd, skill_get_time(skill_id, skill_lv), 10, ttype);
}
break;
@ -10427,22 +10435,29 @@ int skill_castend_id(int tid, unsigned int tick, int id, intptr_t data)
sc_start(src,src, SC_EXTREMITYFIST2, 100, ud->skill_lv, skill_get_time(ud->skill_id, ud->skill_lv));
#endif
}
if (target && target->m == src->m)
{ //Move character to target anyway.
int dir, x, y;
dir = map_calc_dir(src,target->x,target->y);
if( dir > 0 && dir < 4) x = -2;
else if( dir > 4 ) x = 2;
else x = 0;
if( dir > 2 && dir < 6 ) y = -2;
else if( dir == 7 || dir < 2 ) y = 2;
else y = 0;
if (unit_movepos(src, src->x+x, src->y+y, 1, 1))
{ //Display movement + animation.
clif_slide(src,src->x,src->y);
clif_skill_damage(src,target,tick,sd->battle_status.amotion,0,0,1,ud->skill_id, ud->skill_lv, 5);
if( target && target->m == src->m ) { //Move character to target anyway.
short x, y;
short dir = map_calc_dir(src,target->x,target->y);
//Move 3 cells (From Caster)
if( dir > 0 && dir < 4 )
x = -3;
else if( dir > 4 )
x = 3;
else
x = 0;
if( dir > 2 && dir < 6 )
y = -3;
else if( dir == 7 || dir < 2 )
y = 3;
else
y = 0;
if( unit_movepos(src,src->x + x,src->y + y,1,1) ) { //Display movement + animation.
clif_slide(src,src->x + x,src->y + y);
clif_fixpos(src);
clif_spiritball(src);
}
clif_skill_fail(sd,ud->skill_id,USESKILL_FAIL_LEVEL,0);
clif_skill_damage(src,target,tick,sd->battle_status.amotion,0,0,1,ud->skill_id,ud->skill_lv,5);
}
}
@ -11308,7 +11323,7 @@ int skill_castend_pos2(struct block_list* src, int x, int y, uint16 skill_id, ui
map_foreachinarea(skill_area_sub, src->m,
ud->skillunit[i]->unit->bl.x - 2, ud->skillunit[i]->unit->bl.y - 2,
ud->skillunit[i]->unit->bl.x + 2, ud->skillunit[i]->unit->bl.y + 2, BL_CHAR,
src, CR_ACIDDEMONSTRATION, acid_lv, tick, flag|BCT_ENEMY|SD_LEVEL|1, skill_castend_damage_id);
src, GN_FIRE_EXPANSION_ACID, acid_lv, tick, flag|BCT_ENEMY|SD_LEVEL|1, skill_castend_damage_id);
skill_delunit(ud->skillunit[i]->unit);
}
break;
@ -11441,25 +11456,6 @@ int skill_castend_map (struct map_session_data *sd, uint16 skill_id, const char
skill_failed(sd);
return 0;
}
//TODO move that list into a new SCS ? SCS_NOCAST ??
if(sd->sc.count && (
sd->sc.data[SC_SILENCE] ||
sd->sc.data[SC_ROKISWEIL] ||
sd->sc.data[SC_AUTOCOUNTER] ||
sd->sc.data[SC_STEELBODY] ||
(sd->sc.data[SC_DANCING] && skill_id < RK_ENCHANTBLADE && !pc_checkskill(sd, WM_LESSON)) ||
sd->sc.data[SC_BERSERK] ||
sd->sc.data[SC_BASILICA] ||
sd->sc.data[SC_MARIONETTE] ||
sd->sc.data[SC_WHITEIMPRISON] ||
(sd->sc.data[SC_STASIS] && skill_block_check(&sd->bl, SC_STASIS, skill_id)) ||
(sd->sc.data[SC_KAGEHUMI] && skill_block_check(&sd->bl, SC_KAGEHUMI, skill_id)) ||
sd->sc.data[SC_OBLIVIONCURSE] ||
sd->sc.data[SC__MANHOLE]
)) {
skill_failed(sd);
return 0;
}
pc_stop_attack(sd);
pc_stop_walking(sd,0);
@ -12605,16 +12601,25 @@ int skill_unit_onplace_timer (struct skill_unit *src, struct block_list *bl, uns
case UNT_ANKLESNARE:
case UNT_MANHOLE:
if (sg->unit_id == UNT_ANKLESNARE && sg->val3 == SC_ESCAPE && map_flag_vs(ss->m) && bl->id == sg->src_id)
break;
if( sg->val2 == 0 && tsc && (sg->unit_id == UNT_ANKLESNARE || bl->id != sg->src_id) ) {
int sec = skill_get_time2(sg->skill_id,sg->skill_lv);
if( status_change_start(ss, bl,type,10000,sg->skill_lv,sg->group_id,0,0,sec, 8) ) {
const struct TimerData* td = tsc->data[type]?get_timer(tsc->data[type]->timer):NULL;
int range = skill_get_unit_range(skill_id, sg->skill_lv);
int knockback_immune = (tsd ? !tsd->special_state.no_knockback : !(tstatus->mode&(MD_KNOCKBACK_IMMUNE|MD_BOSS)));
if( td )
sec = DIFF_TICK(td->tick, tick);
if ((sg->unit_id == UNT_MANHOLE && distance_xy(src->bl.x,src->bl.y,bl->x,bl->y) <= range &&
src->bl.x != bl->x && src->bl.y != bl->y) || knockback_immune) {
if( sg->unit_id == UNT_MANHOLE || battle_config.skill_trap_type || !map_flag_gvg(src->bl.m) ) {
unit_movepos(bl, src->bl.x, src->bl.y, 0, 0);
clif_fixpos(bl);
}
}
sg->val2 = bl->id;
} else
sec = 3000; //Couldn't trap it?
@ -12671,6 +12676,8 @@ int skill_unit_onplace_timer (struct skill_unit *src, struct block_list *bl, uns
case UNT_FLASHER:
case UNT_FREEZINGTRAP:
case UNT_FIREPILLAR_ACTIVE:
if (tsc && tsc->data[SC__MANHOLE])
break;
if( sg->unit_id == UNT_FIRINGTRAP || sg->unit_id == UNT_ICEBOUNDTRAP || sg->unit_id == UNT_CLAYMORETRAP )
map_foreachinrange(skill_trap_splash,&src->bl, skill_get_splash(sg->skill_id, sg->skill_lv), sg->bl_flag|BL_SKILL|~BCT_SELF, &src->bl,tick);
else
@ -14277,8 +14284,8 @@ bool skill_check_condition_castbegin(struct map_session_data* sd, uint16 skill_i
{
int ttype = skill_get_ele(skill_id, skill_lv);
ARR_FIND(1, 5, i, sd->talisman[i] > 0 && i != ttype);
if( (i < 5 && i != ttype) || sd->talisman[ttype] >= 10 ) {
clif_skill_fail(sd, skill_id, USESKILL_FAIL_LEVEL, 0);
if( sd->talisman[ttype] >= 10 ) {
clif_skill_fail(sd, skill_id, USESKILL_FAIL_SUMMON, 0);
return false;
}
}
@ -14287,7 +14294,7 @@ bool skill_check_condition_castbegin(struct map_session_data* sd, uint16 skill_i
case KO_ZENKAI:
ARR_FIND(1, 6, i, sd->talisman[i] > 0);
if( i > 4 ) {
clif_skill_fail(sd,skill_id,USESKILL_FAIL_LEVEL,0);
clif_skill_fail(sd, skill_id, USESKILL_FAIL_SUMMON, 0);
return false;
}
break;
@ -16180,9 +16187,11 @@ static int skill_cell_overlap(struct block_list *bl, va_list ap)
}
break;
case GN_CRAZYWEED_ATK:
switch(unit->group->unit_id){ //TODO: look for other ground skills that are affected.
switch(unit->group->unit_id) {
case UNT_WALLOFTHORN:
case UNT_THORNS_TRAP:
case UNT_MANHOLE:
case UNT_DIMENSIONDOOR:
case UNT_BLOODYLUST:
case UNT_CHAOSPANIC:
case UNT_MAELSTROM:

View File

@ -89,6 +89,7 @@ enum e_skill_inf3 {
INF3_NO_EFF_HOVERING = 0x1000, // Spell that does not affect user that has SC_HOVERING active
INF3_USABLE_WARG = 0x2000, // spell that can be use while riding warg
INF3_DIS_MADO = 0x4000, // spell that can't be used while in mado
INF3_USABLE_MANHOLE = 0x8000, // spell that can be used to target while under Man Hole effect
//... add other spell list option here
};

View File

@ -1133,7 +1133,7 @@ void initChangeTables(void)
StatusChangeStateTable[SC_ELECTRICSHOCKER] |= SCS_NOMOVE;
StatusChangeStateTable[SC_BITE] |= SCS_NOMOVE;
StatusChangeStateTable[SC_THORNSTRAP] |= SCS_NOMOVE;
StatusChangeStateTable[SC_MAGNETICFIELD] |= SCS_NOMOVE;
StatusChangeStateTable[SC_MAGNETICFIELD] |= SCS_NOMOVE|SCS_NOMOVECOND;
StatusChangeStateTable[SC__MANHOLE] |= SCS_NOMOVE;
StatusChangeStateTable[SC_CURSEDCIRCLE_ATKER] |= SCS_NOMOVE;
StatusChangeStateTable[SC_CURSEDCIRCLE_TARGET] |= SCS_NOMOVE;
@ -1162,13 +1162,17 @@ void initChangeTables(void)
/* StatusChangeState (SCS_) NOCAST (skills) */
StatusChangeStateTable[SC_SILENCE] |= SCS_NOCAST;
StatusChangeStateTable[SC_STEELBODY] |= SCS_NOCAST;
StatusChangeStateTable[SC_BASILICA] |= SCS_NOCAST;
StatusChangeStateTable[SC_BERSERK] |= SCS_NOCAST;
StatusChangeStateTable[SC__BLOODYLUST] |= SCS_NOCAST;
StatusChangeStateTable[SC_DEATHBOUND] |= SCS_NOCAST;
StatusChangeStateTable[SC_OBLIVIONCURSE] |= SCS_NOCAST;
StatusChangeStateTable[SC_WHITEIMPRISON] |= SCS_NOCAST;
StatusChangeStateTable[SC__SHADOWFORM] |= SCS_NOCAST;
StatusChangeStateTable[SC__INVISIBILITY] |= SCS_NOCAST;
StatusChangeStateTable[SC_CRYSTALIZE] |= SCS_NOCAST|SCS_NOCASTCOND;
StatusChangeStateTable[SC__IGNORANCE] |= SCS_NOCAST;
StatusChangeStateTable[SC__MANHOLE] |= SCS_NOCAST;
StatusChangeStateTable[SC_DEEPSLEEP] |= SCS_NOCAST;
StatusChangeStateTable[SC_SATURDAYNIGHTFEVER] |= SCS_NOCAST;
StatusChangeStateTable[SC_CURSEDCIRCLE_TARGET] |= SCS_NOCAST;
@ -1180,7 +1184,6 @@ void initChangeTables(void)
StatusChangeStateTable[SC_SATURDAYNIGHTFEVER] |= SCS_NOCHAT;
StatusChangeStateTable[SC_DEEPSLEEP] |= SCS_NOCHAT;
StatusChangeStateTable[SC_NOCHAT] |= SCS_NOCHAT|SCS_NOCHATCOND;
}
static void initDummyData(void)
@ -1850,19 +1853,9 @@ int status_check_skilluse(struct block_list *src, struct block_list *target, uin
(sc->data[SC_NOCHAT] && sc->data[SC_NOCHAT]->val1&MANNER_NOSKILL)
)
return 0;
if( sc->data[SC__MANHOLE] || ((tsc = status_get_sc(target)) && tsc->data[SC__MANHOLE]) ) {
switch(skill_id) { // !TODO: make this a flag in skill_db?
// Skills that can be used even under Man Hole effects.
case SC_SHADOWFORM:
case SC_STRIPACCESSARY:
break;
default:
return 0;
}
}
}
if (sc->data[SC_ALL_RIDING])
return 0; //You can't use skills while in the new mounts (The client doesn't let you, this is to make cheat-safe)
}
if (sc) {
@ -1874,8 +1867,6 @@ int status_check_skilluse(struct block_list *src, struct block_list *target, uin
if (sc->option&OPTION_CHASEWALK && skill_id != ST_CHASEWALK)
return 0;
}
if (sc->data[SC_ALL_RIDING])
return 0; //You can't use skills while in the new mounts (The client doesn't let you, this is to make cheat-safe)
}
if (target == NULL || target == src) // No further checking needed.
@ -1897,6 +1888,9 @@ int status_check_skilluse(struct block_list *src, struct block_list *target, uin
return 0;
if(skill_id == PR_LEXAETERNA && (tsc->data[SC_FREEZE] || (tsc->data[SC_STONE] && tsc->opt1 == OPT1_STONE)))
return 0;
if (tsc->data[SC__MANHOLE])
if (!(skill_get_inf3(skill_id)&INF3_USABLE_MANHOLE))
return 0;
}
// If targetting, cloak+hide protect you, otherwise only hiding does.
@ -3941,6 +3935,9 @@ void status_calc_regen_rate(struct block_list *bl, struct regen_data *regen, str
#ifndef RENEWAL
(bl->type == BL_PC && (((TBL_PC*)bl)->class_&MAPID_UPPERMASK) == MAPID_MONK &&
(sc->data[SC_EXTREMITYFIST] || sc->data[SC_EXPLOSIONSPIRITS]) && (!sc->data[SC_SPIRIT] || sc->data[SC_SPIRIT]->val2 != SL_MONK)) ||
#else
(bl->type == BL_PC && (((TBL_PC*)bl)->class_&MAPID_UPPERMASK) == MAPID_MONK &&
sc->data[SC_EXTREMITYFIST] && (!sc->data[SC_SPIRIT] || sc->data[SC_SPIRIT]->val2 != SL_MONK)) ||
#endif
sc->data[SC_OBLIVIONCURSE] || sc->data[SC_VITALITYACTIVATION])
regen->flag &= ~RGN_SP; // No natural SP regen
@ -4001,18 +3998,18 @@ void status_calc_state( struct block_list *bl, struct status_change *sc, enum sc
// Can't move
if( flag&SCS_NOMOVE ) {
if( !(flag&SCS_NOMOVECOND) ) {
if( !(flag&SCS_NOMOVECOND) )
sc->cant.move += ( start ? 1 : -1 );
sc->cant.move = max(sc->cant.move,0); // safecheck
} else if(
else if(
(sc->data[SC_GOSPEL] && sc->data[SC_GOSPEL]->val4 == BCT_SELF) // cannot move while gospel is in effect
|| (sc->data[SC_BASILICA] && sc->data[SC_BASILICA]->val4 == bl->id) // Basilica caster cannot move
|| (sc->data[SC_GRAVITATION] && sc->data[SC_GRAVITATION]->val3 == BCT_SELF)
|| (sc->data[SC_CRYSTALIZE] && bl->type != BL_MOB)
|| (sc->data[SC_CAMOUFLAGE] && sc->data[SC_CAMOUFLAGE]->val1 < 3)
) {
|| (sc->data[SC_MAGNETICFIELD] && sc->data[SC_MAGNETICFIELD]->val2 != bl->id)
)
sc->cant.move += ( start ? 1 : -1 );
}
sc->cant.move = max(sc->cant.move,0); // safecheck
}
// Can't use skills
@ -6043,6 +6040,8 @@ static short status_calc_aspd(struct block_list *bl, struct status_change *sc, s
skills2 -= 5 * sc->data[SC__BODYPAINT]->val1;
if( sc->data[SC__INVISIBILITY] )
skills2 -= sc->data[SC__INVISIBILITY]->val2;
if( sc->data[SC__GROOMY] )
skills2 -= sc->data[SC__GROOMY]->val2;
if( sc->data[SC_SWINGDANCE] )
skills2 += sc->data[SC_SWINGDANCE]->val2;
if( sc->data[SC_DANCEWITHWUG] )
@ -9643,7 +9642,7 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty
val4 = 50;
break;
case SC_FULL_THROTTLE:
val2 = 7 - val1;
val2 = ( val1 == 1 ? 6 : 5 - val1 );
tick_time = 1000;
val4 = tick / tick_time;
tick = -1;
@ -9868,6 +9867,7 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty
case SC_MEIKYOUSISUI:
case SC_KYOUGAKU:
case SC_PARALYSIS:
case SC_MAGNETICFIELD:
unit_stop_walking(bl,1);
break;
case SC_ANKLE:
@ -10802,6 +10802,9 @@ int status_change_end_(struct block_list* bl, enum sc_type type, int tid, const
sc_start(bl, bl, SC_REBOUND, 100, sce->val1, sec);
}
break;
case SC_REBOUND:
clif_status_load(bl, SI_DECREASEAGI, 0);
break;
case SC_ITEMSCRIPT: // Removes Buff Icons
if (sd && sce->val2 != SI_BLANK)
clif_status_load(bl, (enum si_type)sce->val2, 0);
@ -11856,7 +11859,7 @@ int status_change_timer(int tid, unsigned int tick, int id, intptr_t data)
}
break;
case SC_STOMACHACHE:
if( --(sce->val4) > 0 ) {
if( --(sce->val4) >= 0 ) {
status_charge(bl,0,sce->val2); // Reduce 8 every 10 seconds.
if( sd && !pc_issit(sd) ) { // Force to sit every 10 seconds.
skill_sit(sd, 1);
@ -11875,7 +11878,7 @@ int status_change_timer(int tid, unsigned int tick, int id, intptr_t data)
sc_timer_next(600000 + tick, status_change_timer, bl->id, data);
return 0;
case SC_MEIKYOUSISUI:
if( --(sce->val4) > 0 ) {
if( --(sce->val4) >= 0 ) {
status_heal(bl, status->max_hp * (sce->val1+1) / 100, status->max_sp * sce->val1 / 100, 0);
sc_timer_next(1000 + tick, status_change_timer, bl->id, data);
return 0;
@ -11883,7 +11886,7 @@ int status_change_timer(int tid, unsigned int tick, int id, intptr_t data)
break;
case SC_IZAYOI:
case SC_KAGEMUSYA:
if( --(sce->val2) > 0 ) {
if( --(sce->val2) >= 0 ) {
if(!status_charge(bl, 0, 1)) break;
sc_timer_next(1000+tick, status_change_timer, bl->id, data);
return 0;
@ -11907,28 +11910,28 @@ int status_change_timer(int tid, unsigned int tick, int id, intptr_t data)
}
break;
case SC_FULL_THROTTLE:
if( --(sce->val4) > 0 ) {
if( --(sce->val4) >= 0 ) {
status_percent_damage(bl, bl, 0, sce->val2, false);
sc_timer_next(1000 + tick, status_change_timer, bl->id, data);
return 0;
}
break;
case SC_KINGS_GRACE:
if( --(sce->val4) > 0 ) {
if( --(sce->val4) >= 0 ) {
status_percent_heal(bl, sce->val2, 0);
sc_timer_next(1000 + tick, status_change_timer, bl->id, data);
return 0;
}
break;
case SC_FRIGG_SONG:
if( --(sce->val4) > 0 ) {
if( --(sce->val4) >= 0 ) {
status_heal(bl, sce->val3, 0, 0);
sc_timer_next(10000 + tick, status_change_timer, bl->id, data);
return 0;
}
break;
case SC_C_MARKER:
if( --(sce->val3) > 0 ) {
if( --(sce->val3) >= 0 ) {
TBL_PC *tsd = map_id2sd(sce->val2);
if (!tsd || tsd->bl.m != bl->m) //End the SC if caster isn't in same map
break;