From f7c09d95fdf0825f2c10fab8b516681797fa4f44 Mon Sep 17 00:00:00 2001 From: aleos89 Date: Mon, 21 Apr 2014 14:49:39 -0400 Subject: [PATCH] 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. --- db/pre-re/skill_db.txt | 7 +- db/pre-re/skill_require_db.txt | 18 ++-- db/re/skill_db.txt | 7 +- db/re/skill_require_db.txt | 18 ++-- src/map/battle.c | 24 ++++- src/map/skill.c | 105 +++++++++++---------- src/map/skill.h | 1 + src/map/status.c | 161 +++++++++++++++++---------------- 8 files changed, 187 insertions(+), 154 deletions(-) diff --git a/db/pre-re/skill_db.txt b/db/pre-re/skill_db.txt index e5a48a173a..d66fb4a4eb 100644 --- a/db/pre-re/skill_db.txt +++ b/db/pre-re/skill_db.txt @@ -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 diff --git a/db/pre-re/skill_require_db.txt b/db/pre-re/skill_require_db.txt index a8cafc7577..fdf15e030d 100644 --- a/db/pre-re/skill_require_db.txt +++ b/db/pre-re/skill_require_db.txt @@ -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 diff --git a/db/re/skill_db.txt b/db/re/skill_db.txt index 49d80a101e..c12dac6014 100644 --- a/db/re/skill_db.txt +++ b/db/re/skill_db.txt @@ -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 diff --git a/db/re/skill_require_db.txt b/db/re/skill_require_db.txt index f1acbb65f0..20a3634fb4 100644 --- a/db/re/skill_require_db.txt +++ b/db/re/skill_require_db.txt @@ -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 diff --git a/src/map/battle.c b/src/map/battle.c index ac3683edf1..ca4d32c72b 100644 --- a/src/map/battle.c +++ b/src/map/battle.c @@ -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,7 +6496,9 @@ 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; - }else + if (wd.div_ > 1) + wd.damage *= 2; // Double the damage for multiple hits. + } else status_change_end(src,SC_SPELLFIST,INVALID_TIMER); } if( sc->data[SC_GIANTGROWTH] && (wd.flag&BF_SHORT) && rnd()%100 < sc->data[SC_GIANTGROWTH]->val2 ) diff --git a/src/map/skill.c b/src/map/skill.c index 8a36b0d34d..a71d7f630b 100755 --- a/src/map/skill.c +++ b/src/map/skill.c @@ -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; @@ -2036,7 +2036,7 @@ int skill_counter_additional_effect (struct block_list* src, struct block_list * } } - switch(skill_id){ + switch(skill_id) { case MO_EXTREMITYFIST: sc_start(src,src,SC_EXTREMITYFIST,100,skill_lv,skill_get_time2(skill_id,skill_lv)); 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,7 +5032,8 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint break; case NC_MAGNETICFIELD: - sc_start2(src,bl,SC_MAGNETICFIELD,100,skill_lv,src->id,skill_get_time(skill_id,skill_lv)); + 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: if( flag&1 ) @@ -7754,12 +7759,12 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui } sp1 = sstatus->sp; sp2 = tstatus->sp; - #ifdef RENEWAL +#ifdef RENEWAL sp1 = sp1 / 2; sp2 = sp2 / 2; if( tsc && tsc->data[SC_EXTREMITYFIST2] ) sp1 = tstatus->sp; - #endif +#endif status_set_sp(src, sp2, 3); status_set_sp(bl, sp1, 3); clif_skill_nodamage(src,bl,skill_id,skill_lv,1); @@ -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,15 +12601,24 @@ 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 || 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); + 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 @@ -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: diff --git a/src/map/skill.h b/src/map/skill.h index 909b88a59d..ef40188765 100644 --- a/src/map/skill.h +++ b/src/map/skill.h @@ -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 }; diff --git a/src/map/status.c b/src/map/status.c index 46e56c2f12..8a6cae98aa 100644 --- a/src/map/status.c +++ b/src/map/status.c @@ -1115,72 +1115,75 @@ void initChangeTables(void) StatusDisplayType[SC_DECORATION_OF_MUSIC] = true; /* StatusChangeState (SCS_) NOMOVE */ - StatusChangeStateTable[SC_ANKLE] |= SCS_NOMOVE; - StatusChangeStateTable[SC_AUTOCOUNTER] |= SCS_NOMOVE; - StatusChangeStateTable[SC_TRICKDEAD] |= SCS_NOMOVE; - StatusChangeStateTable[SC_BLADESTOP] |= SCS_NOMOVE; - StatusChangeStateTable[SC_BLADESTOP_WAIT] |= SCS_NOMOVE; - StatusChangeStateTable[SC_GOSPEL] |= SCS_NOMOVE|SCS_NOMOVECOND; - StatusChangeStateTable[SC_BASILICA] |= SCS_NOMOVE|SCS_NOMOVECOND; - StatusChangeStateTable[SC_STOP] |= SCS_NOMOVE; - StatusChangeStateTable[SC_CLOSECONFINE] |= SCS_NOMOVE; - StatusChangeStateTable[SC_CLOSECONFINE2] |= SCS_NOMOVE; - StatusChangeStateTable[SC_TINDER_BREAKER] |= SCS_NOMOVE; - StatusChangeStateTable[SC_TINDER_BREAKER2] |= SCS_NOMOVE; - StatusChangeStateTable[SC_MADNESSCANCEL] |= SCS_NOMOVE; - StatusChangeStateTable[SC_GRAVITATION] |= SCS_NOMOVE|SCS_NOMOVECOND; - StatusChangeStateTable[SC_WHITEIMPRISON] |= SCS_NOMOVE; - StatusChangeStateTable[SC_ELECTRICSHOCKER] |= SCS_NOMOVE; - StatusChangeStateTable[SC_BITE] |= SCS_NOMOVE; - StatusChangeStateTable[SC_THORNSTRAP] |= SCS_NOMOVE; - StatusChangeStateTable[SC_MAGNETICFIELD] |= SCS_NOMOVE; - StatusChangeStateTable[SC__MANHOLE] |= SCS_NOMOVE; + StatusChangeStateTable[SC_ANKLE] |= SCS_NOMOVE; + StatusChangeStateTable[SC_AUTOCOUNTER] |= SCS_NOMOVE; + StatusChangeStateTable[SC_TRICKDEAD] |= SCS_NOMOVE; + StatusChangeStateTable[SC_BLADESTOP] |= SCS_NOMOVE; + StatusChangeStateTable[SC_BLADESTOP_WAIT] |= SCS_NOMOVE; + StatusChangeStateTable[SC_GOSPEL] |= SCS_NOMOVE|SCS_NOMOVECOND; + StatusChangeStateTable[SC_BASILICA] |= SCS_NOMOVE|SCS_NOMOVECOND; + StatusChangeStateTable[SC_STOP] |= SCS_NOMOVE; + StatusChangeStateTable[SC_CLOSECONFINE] |= SCS_NOMOVE; + StatusChangeStateTable[SC_CLOSECONFINE2] |= SCS_NOMOVE; + StatusChangeStateTable[SC_TINDER_BREAKER] |= SCS_NOMOVE; + StatusChangeStateTable[SC_TINDER_BREAKER2] |= SCS_NOMOVE; + StatusChangeStateTable[SC_MADNESSCANCEL] |= SCS_NOMOVE; + StatusChangeStateTable[SC_GRAVITATION] |= SCS_NOMOVE|SCS_NOMOVECOND; + StatusChangeStateTable[SC_WHITEIMPRISON] |= SCS_NOMOVE; + StatusChangeStateTable[SC_ELECTRICSHOCKER] |= SCS_NOMOVE; + StatusChangeStateTable[SC_BITE] |= SCS_NOMOVE; + StatusChangeStateTable[SC_THORNSTRAP] |= 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; - StatusChangeStateTable[SC_CRYSTALIZE] |= SCS_NOMOVE|SCS_NOMOVECOND; - StatusChangeStateTable[SC_NETHERWORLD] |= SCS_NOMOVE; - StatusChangeStateTable[SC_CAMOUFLAGE] |= SCS_NOMOVE|SCS_NOMOVECOND; - StatusChangeStateTable[SC_MEIKYOUSISUI] |= SCS_NOMOVE; - StatusChangeStateTable[SC_KAGEHUMI] |= SCS_NOMOVE; - StatusChangeStateTable[SC_KYOUGAKU] |= SCS_NOMOVE; - StatusChangeStateTable[SC_PARALYSIS] |= SCS_NOMOVE; + StatusChangeStateTable[SC_CRYSTALIZE] |= SCS_NOMOVE|SCS_NOMOVECOND; + StatusChangeStateTable[SC_NETHERWORLD] |= SCS_NOMOVE; + StatusChangeStateTable[SC_CAMOUFLAGE] |= SCS_NOMOVE|SCS_NOMOVECOND; + StatusChangeStateTable[SC_MEIKYOUSISUI] |= SCS_NOMOVE; + StatusChangeStateTable[SC_KAGEHUMI] |= SCS_NOMOVE; + StatusChangeStateTable[SC_KYOUGAKU] |= SCS_NOMOVE; + StatusChangeStateTable[SC_PARALYSIS] |= SCS_NOMOVE; /* StatusChangeState (SCS_) NOPICKUPITEMS */ - StatusChangeStateTable[SC_HIDING] |= SCS_NOPICKITEM; - StatusChangeStateTable[SC_CLOAKING] |= SCS_NOPICKITEM; - StatusChangeStateTable[SC_TRICKDEAD] |= SCS_NOPICKITEM; - StatusChangeStateTable[SC_BLADESTOP] |= SCS_NOPICKITEM; - StatusChangeStateTable[SC_CLOAKINGEXCEED] |= SCS_NOPICKITEM; - StatusChangeStateTable[SC__FEINTBOMB] |= SCS_NOPICKITEM; - StatusChangeStateTable[SC_NOCHAT] |= SCS_NOPICKITEM|SCS_NOPICKITEMCOND; + StatusChangeStateTable[SC_HIDING] |= SCS_NOPICKITEM; + StatusChangeStateTable[SC_CLOAKING] |= SCS_NOPICKITEM; + StatusChangeStateTable[SC_TRICKDEAD] |= SCS_NOPICKITEM; + StatusChangeStateTable[SC_BLADESTOP] |= SCS_NOPICKITEM; + StatusChangeStateTable[SC_CLOAKINGEXCEED] |= SCS_NOPICKITEM; + StatusChangeStateTable[SC__FEINTBOMB] |= SCS_NOPICKITEM; + StatusChangeStateTable[SC_NOCHAT] |= SCS_NOPICKITEM|SCS_NOPICKITEMCOND; /* StatusChangeState (SCS_) NODROPITEMS */ - StatusChangeStateTable[SC_AUTOCOUNTER] |= SCS_NODROPITEM; - StatusChangeStateTable[SC_BLADESTOP] |= SCS_NODROPITEM; - StatusChangeStateTable[SC_NOCHAT] |= SCS_NODROPITEM|SCS_NODROPITEMCOND; + StatusChangeStateTable[SC_AUTOCOUNTER] |= SCS_NODROPITEM; + StatusChangeStateTable[SC_BLADESTOP] |= SCS_NODROPITEM; + StatusChangeStateTable[SC_NOCHAT] |= SCS_NODROPITEM|SCS_NODROPITEMCOND; /* StatusChangeState (SCS_) NOCAST (skills) */ - StatusChangeStateTable[SC_SILENCE] |= SCS_NOCAST; - StatusChangeStateTable[SC_STEELBODY] |= SCS_NOCAST; - StatusChangeStateTable[SC_BERSERK] |= SCS_NOCAST; - StatusChangeStateTable[SC__BLOODYLUST] |= SCS_NOCAST; - StatusChangeStateTable[SC_OBLIVIONCURSE] |= SCS_NOCAST; - StatusChangeStateTable[SC_WHITEIMPRISON] |= SCS_NOCAST; - StatusChangeStateTable[SC__INVISIBILITY] |= SCS_NOCAST; - StatusChangeStateTable[SC_CRYSTALIZE] |= SCS_NOCAST|SCS_NOCASTCOND; - StatusChangeStateTable[SC__IGNORANCE] |= SCS_NOCAST; - StatusChangeStateTable[SC_DEEPSLEEP] |= SCS_NOCAST; + 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; - StatusChangeStateTable[SC_KINGS_GRACE] |= SCS_NOCAST; + StatusChangeStateTable[SC_KINGS_GRACE] |= SCS_NOCAST; StatusChangeStateTable[SC_HEAT_BARREL_AFTER] |= SCS_NOCAST; /* StatusChangeState (SCS_) NOCHAT (skills) */ - StatusChangeStateTable[SC_BERSERK] |= SCS_NOCHAT; + StatusChangeStateTable[SC_BERSERK] |= SCS_NOCHAT; StatusChangeStateTable[SC_SATURDAYNIGHTFEVER] |= SCS_NOCHAT; - StatusChangeStateTable[SC_DEEPSLEEP] |= SCS_NOCHAT; - StatusChangeStateTable[SC_NOCHAT] |= SCS_NOCHAT|SCS_NOCHATCOND; - + 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;