From 0fed97c1d9462691c276df1713638f59d144a2f1 Mon Sep 17 00:00:00 2001 From: aleos89 Date: Tue, 1 Apr 2014 14:26:37 -0400 Subject: [PATCH] Bug Fixes * Follow up to 6e795af expiration timer passing wrong time value. Thanks to @MrKeiKun. * Follow up to 26afd76 to force players to use skill_sit before pc_setsit to invoke pc_stop_walking and pc_stop_attack first. * Follow up to 26afd76 to revert change on Extremity Fist status icon. * Fixed some Gentle Touch - Revitalize typos. * Fixed some Gentle Touch - Energy Gain typos. (bugreport:8846) * Corrected Explosion Spirits effect for renewal. (bugreport:8842) * Rebound status from Full Throttle will now disable HP and SP regeneration. * Fixed Mainframe Restructure not giving DEF bonus. (bugreport:8840) * Added Hiding and Sight to the list of skills not usable while riding Mado using _INF3 and removed hardcoded checks. * Increased the max skill unit layout to accommodate the addition of Fire Rain. (bugreport:8775) * Fixed Unlimit to not work with Warg skills and sets DEF/MDEF to 1 per Ziu's tests. * Fixed damage and life (hits) for Wall of Thorn. * Added an extra check for Crescent Elbow to check for short range and to handle knockback with the autospell skill. --- db/pre-re/skill_db.txt | 16 ++++---- db/re/skill_db.txt | 16 ++++---- src/map/battle.c | 43 +++++++++++++------- src/map/clif.c | 4 +- src/map/pc.c | 4 +- src/map/script.c | 17 +++++--- src/map/skill.c | 91 +++++++++++++++++------------------------- src/map/skill.h | 2 +- src/map/status.c | 55 ++++++++++++++++--------- 9 files changed, 135 insertions(+), 113 deletions(-) diff --git a/db/pre-re/skill_db.txt b/db/pre-re/skill_db.txt index 465553fdb8..72344a543c 100644 --- a/db/pre-re/skill_db.txt +++ b/db/pre-re/skill_db.txt @@ -79,7 +79,7 @@ //**** // Mage 9,0,0,0,0,0,0,10,0,no,0,0,0,none,0,0x20, MG_SRECOVERY,Increase SP Recovery -10,0,6,4,3,0x3,3,1,1,yes,0,0,0,magic,0,0x20, MG_SIGHT,Sight +10,0,6,4,3,0x3,3,1,1,yes,0,0,0,magic,0,0x4020, MG_SIGHT,Sight 11,9,6,1,8,0x6,1,10,1,yes,0,0x2000,0,magic,0,0x20, MG_NAPALMBEAT,Napalm Beat 12,9,8,2,8,0x1,0,10,1,yes,0,0,0,magic,0,0x20, MG_SAFETYWALL,Safety Wall 13,9,8,1,8,0,0,10,1:1:2:2:3:3:4:4:5:5,yes,0,0x2000,0,magic,0,0x20, MG_SOULSTRIKE,Soul Strike @@ -132,7 +132,7 @@ 48,-1,8,0,-1,0,0,10,2,no,0,0,0,weapon,0,0x0, TF_DOUBLE,Double Attack 49,0,0,0,0,0,0,10,0,no,0,0,0,weapon,0,0x0, TF_MISS,Improve Dodge 50,1,6,1,0,1,0,10,1,no,0,0,0,weapon,0,0x0, TF_STEAL,Steal -51,1,6,4,0,1,0,10,1,no,0,0,0,none,0,0x64, TF_HIDING,Hiding +51,1,6,4,0,1,0,10,1,no,0,0,0,none,0,0x4064, TF_HIDING,Hiding 52,-2,6,1,5,0,0,10,1,no,0,0,0,weapon,0,0x0, TF_POISON,Envenom 53,9,6,16,5,0x1,0,1,1,no,0,0,0,weapon,0,0x0, TF_DETOXIFY,Detoxify // @@ -1019,7 +1019,7 @@ 2263,0,6,4,0,0x1,0,1,1,no,0,0,0,none,0,0x0, NC_HOVERING,Hovering 2264,0,6,4,0,0x1,0,1,1,no,0,0,0,none,7,0x0, NC_F_SIDESLIDE,Front-Side Slide 2265,0,6,4,0,0x1,0,1,1,no,0,0,0,none,7,0x0, NC_B_SIDESLIDE,Back-Side Slide -2266,0,0,0,0,0,0,4,0,no,0,0,0,none,0,0x0, NC_MAINFRAME,Mainframe Restructure // Check me. Part of the code notes translated to "The amount of fuel have". +2266,0,0,0,0,0,0,4,0,no,0,0,0,none,0,0x0, NC_MAINFRAME,Mainframe Restructure 2267,0,6,4,-1,0xCA,2:3:4,3,1,no,0,0,0,misc,5,0x0, NC_SELFDESTRUCTION,Self Destruction 2268,0,6,4,0,0x1,0,4,1,yes,0,0,0,none,0,0x0, NC_SHAPESHIFT,Shape Shift 2269,0,6,4,0,0x1,0,1,1,no,0,0,0,none,0,0x0, NC_EMERGENCYCOOL,Emergency Cool @@ -1033,7 +1033,7 @@ 2277,0,0,0,0,0,0,5,0,no,0,0,0,none,0,0x0, NC_RESEARCHFE,Research Fire/Earth 2278,5:6:7:8:9,6,1,-1,0,0,5,1,no,0,0,0,weapon,2:3:4:5:6,0x0, NC_AXEBOOMERANG,Axe Boomerang 2279,1,6,1,-1,0,0,5,1,no,0,0,0,weapon,0,0x0, NC_POWERSWING,Power Swing -2280,0,8,4,-1,0x2,2:2:3:3:3,5,-6,no,0,0,0,weapon,0,0x0, NC_AXETORNADO,Axe Tornado // Check me. Takes 20 * Skill LV amount of HP each use. +2280,0,8,4,-1,0x2,2:2:3:3:3,5,-6,no,0,0,0,weapon,0,0x0, NC_AXETORNADO,Axe Tornado 2281,2,6,2,0,0x1,0,5,1,yes,0,0,2,none,0,0x0, NC_SILVERSNIPER,FAW - Silver Sniper 2282,2,6,2,0,0x1,0,5,1,yes,0,0,2,none,0,0x0, NC_MAGICDECOY,FAW - Magic Decoy 2283,5,6,1,0,0x1,0,1,1,no,0,0,0,none,0,0x0, NC_DISJOINT,FAW Removal @@ -1094,7 +1094,7 @@ 2330,-2,6,1,-1,0x42,1:1:1:1:1:2:2:2:2:2,10,1,yes,0,0,0,weapon,0,0x0, SR_TIGERCANNON,Tiger Cannon 2331,0,6,1,0,0,0,10,0,no,0,0,0,none,0,0x0, SR_HELLGATE,Hell Gate 2332,0,6,4,-1,0x2,3,5,1,no,0,0,0,weapon,0,0x0, SR_RAMPAGEBLASTER,Rampage Blaster -2333,0,6,4,0,0x1,0,5,1,no,0,0,0,none,7,0x0, SR_CRESCENTELBOW,Crescent Elbow +2333,0,6,4,0,0x1,0,5,1,no,0,0,0,none,0,0x0, SR_CRESCENTELBOW,Crescent Elbow 2334,0,6,4,0,0x3,1:1:2:2:3,5,1,no,0,0,0,none,0,0x0, SR_CURSEDCIRCLE,Cursed Circle 2335,0,6,4,0,0x1,0,5,1,no,0,0,0,none,0,0x0, SR_LIGHTNINGWALK,Lightning Walk 2336,7:8:9:10:11,6,1,-1,0,0,5,1,no,0,0,0,weapon,2:3:4:5:6,0x0, SR_KNUCKLEARROW,Knuckle Arrow @@ -1103,7 +1103,7 @@ 2339,0,0,0,0,0,0,5,1,no,0,0,0,none,0,0x0, SR_GENTLETOUCH,Gentle Touch 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,3,0x0, SR_CRESCENTELBOW_AUTOSPELL,Crescent Elbow Autospell //CHECK Does this ignore defense? +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 //CHECK Need to fix to be enemy targeted and also combo after Fallen Empire 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 @@ -1177,8 +1177,8 @@ 2462,0,6,4,0,0x1,0,2,1,yes,0,0,0,none,0,0x0, SO_EL_ANALYSIS,Four Spirit Analysis 2463,0,0,0,0,0,0,5,0,no,0,0,0,none,0,0x0, SO_EL_SYMPATHY,Spirit Sympathy 2464,0,6,4,0,0x1,0,1,1,yes,0,0,0,none,0,0x0, SO_EL_CURE,Spirit Recovery -2465,9,6,2,3,0x1,0,3,1,yes,0,0,1,magic,0,0x0, SO_FIRE_INSIGNIA,Fire Insignia //CHECK All 4 insignia skills can be targeted and animations work -2466,9,6,2,1,0x1,0,3,1,yes,0,0,1,magic,0,0x0, SO_WATER_INSIGNIA,Water Insignia // but its effects havent been coded yet. +2465,9,6,2,3,0x1,0,3,1,yes,0,0,1,magic,0,0x0, SO_FIRE_INSIGNIA,Fire Insignia +2466,9,6,2,1,0x1,0,3,1,yes,0,0,1,magic,0,0x0, SO_WATER_INSIGNIA,Water Insignia 2467,9,6,2,4,0x1,0,3,1,yes,0,0,1,magic,0,0x0, SO_WIND_INSIGNIA,Wind Insignia 2468,9,6,2,2,0x1,0,3,1,yes,0,0,1,magic,0,0x0, SO_EARTH_INSIGNIA,Earth Insignia diff --git a/db/re/skill_db.txt b/db/re/skill_db.txt index 7037bbe849..4f3e6e43cc 100644 --- a/db/re/skill_db.txt +++ b/db/re/skill_db.txt @@ -79,7 +79,7 @@ //**** // Mage 9,0,0,0,0,0,0,10,0,no,0,0,0,none,0,0x20, MG_SRECOVERY,Increase SP Recovery -10,0,6,4,3,0x3,3,1,1,yes,0,0,0,magic,0,0x20, MG_SIGHT,Sight +10,0,6,4,3,0x3,3,1,1,yes,0,0,0,magic,0,0x4020, MG_SIGHT,Sight 11,9,6,1,8,0x6,1,10,1,yes,0,0x2000,0,magic,0,0x20, MG_NAPALMBEAT,Napalm Beat 12,9,8,2,8,0x1,0,10,1,yes,0,0,0,magic,0,0x20, MG_SAFETYWALL,Safety Wall 13,9,8,1,8,0,0,10,1:1:2:2:3:3:4:4:5:5,yes,0,0x2000,0,magic,0,0x20, MG_SOULSTRIKE,Soul Strike @@ -132,7 +132,7 @@ 48,-1,8,0,-1,0,0,10,2,no,0,0,0,weapon,0,0x0, TF_DOUBLE,Double Attack 49,0,0,0,0,0,0,10,0,no,0,0,0,weapon,0,0x0, TF_MISS,Improve Dodge 50,1,6,1,0,1,0,10,1,no,0,0,0,weapon,0,0x0, TF_STEAL,Steal -51,1,6,4,0,1,0,10,1,no,0,0,0,none,0,0x64, TF_HIDING,Hiding +51,1,6,4,0,1,0,10,1,no,0,0,0,none,0,0x4064, TF_HIDING,Hiding 52,-2,6,1,5,0,0,10,1,no,0,0,0,weapon,0,0x0, TF_POISON,Envenom 53,9,6,16,5,0x1,0,1,1,no,0,0,0,weapon,0,0x0, TF_DETOXIFY,Detoxify // @@ -1019,7 +1019,7 @@ 2263,0,6,4,0,0x1,0,1,1,no,0,0,0,none,0,0x0, NC_HOVERING,Hovering 2264,0,6,4,0,0x1,0,1,1,no,0,0,0,none,7,0x0, NC_F_SIDESLIDE,Front-Side Slide 2265,0,6,4,0,0x1,0,1,1,no,0,0,0,none,7,0x0, NC_B_SIDESLIDE,Back-Side Slide -2266,0,0,0,0,0,0,4,0,no,0,0,0,none,0,0x0, NC_MAINFRAME,Mainframe Restructure // Check me. Part of the code notes translated to "The amount of fuel have". +2266,0,0,0,0,0,0,4,0,no,0,0,0,none,0,0x0, NC_MAINFRAME,Mainframe Restructure 2267,0,6,4,-1,0xCA,2:3:4,3,1,no,0,0,0,misc,5,0x0, NC_SELFDESTRUCTION,Self Destruction 2268,0,6,4,0,0x1,0,4,1,yes,0,0,0,none,0,0x0, NC_SHAPESHIFT,Shape Shift 2269,0,6,4,0,0x1,0,1,1,no,0,0,0,none,0,0x0, NC_EMERGENCYCOOL,Emergency Cool @@ -1033,7 +1033,7 @@ 2277,0,0,0,0,0,0,5,0,no,0,0,0,none,0,0x0, NC_RESEARCHFE,Research Fire/Earth 2278,5:6:7:8:9,6,1,-1,0,0,5,1,no,0,0,0,weapon,2:3:4:5:6,0x0, NC_AXEBOOMERANG,Axe Boomerang 2279,1,6,1,-1,0,0,5,1,no,0,0,0,weapon,0,0x0, NC_POWERSWING,Power Swing -2280,0,8,4,-1,0x2,2:2:3:3:3,5,-6,no,0,0,0,weapon,0,0x0, NC_AXETORNADO,Axe Tornado // Check me. Takes 20 * Skill LV amount of HP each use. +2280,0,8,4,-1,0x2,2:2:3:3:3,5,-6,no,0,0,0,weapon,0,0x0, NC_AXETORNADO,Axe Tornado 2281,2,6,2,0,0x1,0,5,1,yes,0,0,2,none,0,0x0, NC_SILVERSNIPER,FAW - Silver Sniper 2282,2,6,2,0,0x1,0,5,1,yes,0,0,2,none,0,0x0, NC_MAGICDECOY,FAW - Magic Decoy 2283,5,6,1,0,0x1,0,1,1,no,0,0,0,none,0,0x0, NC_DISJOINT,FAW Removal @@ -1094,7 +1094,7 @@ 2330,-2,6,1,-1,0x42,1:1:1:1:1:2:2:2:2:2,10,1,yes,0,0,0,weapon,0,0x0, SR_TIGERCANNON,Tiger Cannon 2331,0,6,1,0,0,0,10,0,no,0,0,0,none,0,0x0, SR_HELLGATE,Hell Gate 2332,0,6,4,-1,0x2,3,5,1,no,0,0,0,weapon,0,0x0, SR_RAMPAGEBLASTER,Rampage Blaster -2333,0,6,4,0,0x1,0,5,1,no,0,0,0,none,7,0x0, SR_CRESCENTELBOW,Crescent Elbow +2333,0,6,4,0,0x1,0,5,1,no,0,0,0,none,0,0x0, SR_CRESCENTELBOW,Crescent Elbow 2334,0,6,4,0,0x3,1:1:2:2:3,5,1,no,0,0,0,none,0,0x0, SR_CURSEDCIRCLE,Cursed Circle 2335,0,6,4,0,0x1,0,5,1,no,0,0,0,none,0,0x0, SR_LIGHTNINGWALK,Lightning Walk 2336,7:8:9:10:11,6,1,-1,0,0,5,1,no,0,0,0,weapon,2:3:4:5:6,0x0, SR_KNUCKLEARROW,Knuckle Arrow @@ -1103,7 +1103,7 @@ 2339,0,0,0,0,0,0,5,1,no,0,0,0,none,0,0x0, SR_GENTLETOUCH,Gentle Touch 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,3,0x0, SR_CRESCENTELBOW_AUTOSPELL,Crescent Elbow Autospell //CHECK Does this ignore defense? +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 //CHECK Need to fix to be enemy targeted and also combo after Fallen Empire 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 @@ -1177,8 +1177,8 @@ 2462,0,6,4,0,0x1,0,2,1,yes,0,0,0,none,0,0x0, SO_EL_ANALYSIS,Four Spirit Analysis 2463,0,0,0,0,0,0,5,0,no,0,0,0,none,0,0x0, SO_EL_SYMPATHY,Spirit Sympathy 2464,0,6,4,0,0x1,0,1,1,yes,0,0,0,none,0,0x0, SO_EL_CURE,Spirit Recovery -2465,9,6,2,3,0x1,0,3,1,yes,0,0,1,magic,0,0x0, SO_FIRE_INSIGNIA,Fire Insignia //CHECK All 4 insignia skills can be targeted and animations work -2466,9,6,2,1,0x1,0,3,1,yes,0,0,1,magic,0,0x0, SO_WATER_INSIGNIA,Water Insignia // but its effects havent been coded yet. +2465,9,6,2,3,0x1,0,3,1,yes,0,0,1,magic,0,0x0, SO_FIRE_INSIGNIA,Fire Insignia +2466,9,6,2,1,0x1,0,3,1,yes,0,0,1,magic,0,0x0, SO_WATER_INSIGNIA,Water Insignia 2467,9,6,2,4,0x1,0,3,1,yes,0,0,1,magic,0,0x0, SO_WIND_INSIGNIA,Wind Insignia 2468,9,6,2,2,0x1,0,3,1,yes,0,0,1,magic,0,0x0, SO_EARTH_INSIGNIA,Earth Insignia diff --git a/src/map/battle.c b/src/map/battle.c index cd9566ca91..502fe73db1 100644 --- a/src/map/battle.c +++ b/src/map/battle.c @@ -1149,7 +1149,7 @@ int64 battle_calc_damage(struct block_list *src,struct block_list *bl,struct Dam TBL_HOM *hd = BL_CAST(BL_HOM,bl); // We add a sphere for when the Homunculus is being hit if (hd && (rnd()%100<50) ) hom_addspiritball(hd, 10); // According to WarpPortal, this is a flat 50% chance } - if( sd && (sce = sc->data[SC_GT_ENERGYGAIN]) && flag&BF_WEAPON && rnd()%100 < 10 + 5 * sc->data[SC_GT_ENERGYGAIN]->val1 ) { + if( sd && (sce = sc->data[SC_GT_ENERGYGAIN]) && flag&BF_WEAPON && rnd()%100 < sce->val3 ) { int spheres = 5; if( sc->data[SC_RAISINGDRAGON] ) @@ -1204,8 +1204,6 @@ int64 battle_calc_damage(struct block_list *src,struct block_list *bl,struct Dam TBL_HOM *hd = BL_CAST(BL_HOM,src); //when attacking if (hd && (rnd()%100<50) ) hom_addspiritball(hd, 10); // According to WarpPortal, this is a flat 50% chance } - if( sc->data[SC_UNLIMIT] && (flag&(BF_WEAPON|BF_LONG))==(BF_WEAPON|BF_LONG) ) - DAMAGE_ADDRATE(sc->data[SC_UNLIMIT]->val2); } //End of caster SC_ check //PK damage rates @@ -3592,6 +3590,9 @@ static int battle_calc_attack_skill_ratio(struct Damage wd, struct block_list *s skillratio = (100 * skill_lv) + (200 + status_get_int(src)); RE_LVL_DMOD(100); break; + case GN_WALLOFTHORN: + skillratio += 10 * skill_lv; + break; case GN_CRAZYWEED_ATK: skillratio += 400 + 100 * skill_lv; break; @@ -3977,11 +3978,22 @@ struct Damage battle_attack_sc_bonus(struct Damage wd, struct block_list *src, u ATK_ADD(wd.damage, wd.damage2, sc->data[SC_FLASHCOMBO]->val2); RE_ALLATK_ADD(wd, sc->data[SC_FLASHCOMBO]->val2); } - // Monster Transformation bonus - if(wd.flag&BF_LONG && sc->data[SC_MTF_RANGEATK]) { + if(wd.flag&BF_LONG && sc->data[SC_MTF_RANGEATK]) { // Monster Transformation bonus ATK_ADD(wd.damage, wd.damage2, 25); RE_ALLATK_ADD(wd, 25); } + if(sc->data[SC_UNLIMIT] && (wd.flag&(BF_LONG|BF_MAGIC)) == BF_LONG) { + switch(skill_id) { + case RA_WUGDASH: + case RA_WUGSTRIKE: + case RA_WUGBITE: + break; + default: + ATK_ADDRATE(wd.damage, wd.damage2, sc->data[SC_UNLIMIT]->val2); + RE_ALLATK_ADDRATE(wd, sc->data[SC_UNLIMIT]->val2); + break; + } + } } return wd; } @@ -4036,7 +4048,7 @@ struct Damage battle_calc_defense_reduction(struct Damage wd, struct block_list def2 = (def2*(100-i))/100; } - if( tsc && tsc->data[SC_GT_REVITALIZE] && tsc->data[SC_GT_REVITALIZE]->val4 ) + if( tsc && tsc->data[SC_GT_REVITALIZE] && tsc->data[SC_GT_REVITALIZE]->val2 ) def2 += tsc->data[SC_GT_REVITALIZE]->val4; if( tsc && tsc->data[SC_CAMOUFLAGE] ){ @@ -4380,7 +4392,7 @@ struct Damage battle_calc_weapon_final_atk_modifiers(struct Damage wd, struct bl status_change_end(target, SC_REJECTSWORD, INVALID_TIMER); } - if( tsc && tsc->data[SC_CRESCENTELBOW] && !is_boss(src) && rnd()%100 < tsc->data[SC_CRESCENTELBOW]->val2 ) { + if( tsc && tsc->data[SC_CRESCENTELBOW] && !is_boss(src) && wd.flag&BF_SHORT && rnd()%100 < tsc->data[SC_CRESCENTELBOW]->val2 ) { //ATK [{(Target HP / 100) x Skill Level} x Caster Base Level / 125] % + [Received damage x {1 + (Skill Level x 0.2)}] int64 rdamage = 0; int ratio = (int64)(status_get_hp(src) / 100) * tsc->data[SC_CRESCENTELBOW]->val1 * status_get_lv(target) / 125; @@ -5595,7 +5607,7 @@ struct Damage battle_calc_magic_attack(struct block_list *src,struct block_list } #ifndef RENEWAL - ad.damage += battle_calc_cardfix(BF_MAGIC, src, target, nk, s_ele, 0, ad.damage, 0, ad.flag); + ad.damage += battle_calc_cardfix(BF_MAGIC, src, target, nk, s_ele, 0, ad.damage, 0, ad.flag); #endif } @@ -6420,7 +6432,7 @@ enum damage_lv battle_weapon_attack(struct block_list* src, struct block_list* t if( sc->data[SC_RAISINGDRAGON] ) spheres += sc->data[SC_RAISINGDRAGON]->val1; - if( sd && rnd()%100 < 10 + 5 * sc->data[SC_GT_ENERGYGAIN]->val1) + if( sd && rnd()%100 < sc->data[SC_GT_ENERGYGAIN]->val3 ) pc_addspiritball(sd, skill_get_time2(SR_GENTLETOUCH_ENERGYGAIN, sc->data[SC_GT_ENERGYGAIN]->val1), spheres); } if( sc && sc->data[SC_CRUSHSTRIKE] ){ @@ -6430,20 +6442,21 @@ enum damage_lv battle_weapon_attack(struct block_list* src, struct block_list* t return ATK_DEF; return ATK_MISS; } - if (tsc && tsc->data[SC_MTF_MLEATKED] && rnd()%100 < 20) - clif_skill_nodamage(target, target, SM_ENDURE, 5, sc_start(src, target, SC_ENDURE, 100, 5, skill_get_time(SM_ENDURE, 5))); } + if (tsc && tsc->data[SC_MTF_MLEATKED] && rnd()%100 < 20) + clif_skill_nodamage(target, target, SM_ENDURE, 5, sc_start(src, target, SC_ENDURE, 100, 5, skill_get_time(SM_ENDURE, 5))); + if(tsc && tsc->data[SC_KAAHI] && tsc->data[SC_KAAHI]->val4 == INVALID_TIMER && tstatus->hp < tstatus->max_hp) tsc->data[SC_KAAHI]->val4 = add_timer(tick + skill_get_time2(SL_KAAHI,tsc->data[SC_KAAHI]->val1), kaahi_heal_timer, target->id, SC_KAAHI); //Activate heal. - if( tsc && tsc->data[SC_GT_ENERGYGAIN] ) { + if( tsc && tsc->data[SC_GT_ENERGYGAIN] && tsc->data[SC_GT_ENERGYGAIN]->val2 ) { int spheres = 5; - if( tsc->data[SC_RAISINGDRAGON]) - spheres += sc->data[SC_RAISINGDRAGON]->val1; + if( tsc->data[SC_RAISINGDRAGON] ) + spheres += tsc->data[SC_RAISINGDRAGON]->val1; - if( tsd && rnd()%100 < 10 + 5 * tsc->data[SC_GT_ENERGYGAIN]->val1) + if( tsd && rnd()%100 < tsc->data[SC_GT_ENERGYGAIN]->val3 ) pc_addspiritball(tsd, skill_get_time2(SR_GENTLETOUCH_ENERGYGAIN, tsc->data[SC_GT_ENERGYGAIN]->val1), spheres); } diff --git a/src/map/clif.c b/src/map/clif.c index c36ced583e..13ba684bc4 100644 --- a/src/map/clif.c +++ b/src/map/clif.c @@ -10286,8 +10286,8 @@ void clif_parse_ActionRequest_sub(struct map_session_data *sd, int action_type, break; sd->idletime = last_tick; + skill_sit(sd, 1); pc_setsit(sd); - skill_sit(sd,1); clif_sitting(&sd->bl); break; case 0x03: // standup @@ -10299,7 +10299,7 @@ void clif_parse_ActionRequest_sub(struct map_session_data *sd, int action_type, sd->idletime = last_tick; pc_setstand(sd); - skill_sit(sd,0); + skill_sit(sd, 0); clif_standing(&sd->bl); break; } diff --git a/src/map/pc.c b/src/map/pc.c index 0409569afe..831302e6e9 100755 --- a/src/map/pc.c +++ b/src/map/pc.c @@ -1347,9 +1347,9 @@ int pc_reg_received(struct map_session_data *sd) if (sd->expiration_time != 0) { // don't display if it's unlimited or an unknown value time_t exp_time = sd->expiration_time; char tmpstr[1024]; - strftime(tmpstr, sizeof(tmpstr) - 1, msg_txt(sd,501), localtime(&sd->expiration_time)); // "Your account time limit is: %d-%m-%Y %H:%M:%S." + strftime(tmpstr, sizeof(tmpstr) - 1, msg_txt(sd,501), localtime(&exp_time)); // "Your account time limit is: %d-%m-%Y %H:%M:%S." clif_wis_message(sd->fd, wisp_server_name, tmpstr, strlen(tmpstr)+1); - + pc_expire_check(sd); } diff --git a/src/map/script.c b/src/map/script.c index 91ddcc4115..82cf4d85ae 100644 --- a/src/map/script.c +++ b/src/map/script.c @@ -12951,9 +12951,17 @@ BUILDIN_FUNC(skilleffect) struct script_data *data = script_getdata(st, 2); get_val(st, data); // Convert into value in case of a variable - skill_id=( data_isstring(data) ? skill_name2id(script_getstr(st,2)) : script_getnum(st,2) ); - skill_lv=script_getnum(st,3); - sd=script_rid2sd(st); + skill_id = ( data_isstring(data) ? skill_name2id(script_getstr(st,2)) : script_getnum(st,2) ); + skill_lv = script_getnum(st,3); + sd = script_rid2sd(st); + + /* Ensure we're standing because the following packet causes the client to virtually set the char to stand, + * which leaves the server thinking it still is sitting. */ + if( pc_issit(sd) ) { + pc_setstand(sd); + skill_sit(sd, 0); + clif_standing(&sd->bl); + } clif_skill_nodamage(&sd->bl,&sd->bl,skill_id,skill_lv,1); return SCRIPT_CMD_SUCCESS; @@ -18066,9 +18074,8 @@ BUILDIN_FUNC(sit) return SCRIPT_CMD_FAILURE; if( !pc_issit(sd) ) { - unit_stop_walking(&sd->bl, 1|4); - pc_setsit(sd); skill_sit(sd, 1); + pc_setsit(sd); clif_sitting(&sd->bl); } return SCRIPT_CMD_SUCCESS; diff --git a/src/map/skill.c b/src/map/skill.c index 4326324cae..db589ddeea 100755 --- a/src/map/skill.c +++ b/src/map/skill.c @@ -609,23 +609,6 @@ bool skill_isNotOk(uint16 skill_id, struct map_session_data *sd) return true; } break; - case WS_CARTBOOST: - case BS_HAMMERFALL: - case BS_ADRENALINE: - case MC_CARTREVOLUTION: - case MC_MAMMONITE: - case WS_MELTDOWN: - case MG_SIGHT: - case TF_HIDING: - /** - * These skills cannot be used while in mado gear (credits to Xantara) - **/ - if( pc_ismadogear(sd) ) { - clif_skill_fail(sd,skill_id,USESKILL_FAIL_LEVEL,0); - return true; - } - break; - case WM_SIRCLEOFNATURE: case WM_SOUND_OF_DESTRUCTION: case SC_MANHOLE: @@ -775,7 +758,7 @@ struct s_skill_unit_layout* skill_get_unit_layout (uint16 skill_id, uint16 skill return &skill_unit_layout [firewall_unit_pos + dir]; else if (skill_id == WZ_ICEWALL) return &skill_unit_layout [icewall_unit_pos + dir]; - else if( skill_id == WL_EARTHSTRAIN ) //Warlock + else if( skill_id == WL_EARTHSTRAIN ) return &skill_unit_layout [earthstrain_unit_pos + dir]; else if( skill_id == RL_FIRE_RAIN ) return &skill_unit_layout[firerain_unit_pos + dir]; @@ -3678,8 +3661,8 @@ static int skill_timerskill(int tid, unsigned int tick, int id, intptr_t data) if( target->type == BL_PC ) { struct map_session_data *tsd = NULL; if( (tsd = ((TBL_PC*)target)) && !pc_issit(tsd) ) { + skill_sit(tsd, 1); pc_setsit(tsd); - skill_sit(tsd,1); clif_sitting(&tsd->bl); } } @@ -9256,7 +9239,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui case SR_GENTLETOUCH_CHANGE: case SR_GENTLETOUCH_REVITALIZE: clif_skill_nodamage(src,bl,skill_id,skill_lv, - sc_start2(src,bl,type,100,skill_lv,src->id,skill_get_time(skill_id,skill_lv))); + sc_start2(src,bl,type,100,skill_lv,bl->id,skill_get_time(skill_id,skill_lv))); break; case SR_FLASHCOMBO: if( sd ) @@ -11669,15 +11652,15 @@ struct skill_unit_group* skill_unitsetting (struct block_list *src, uint16 skill switch( skill_id ) { case MH_STEINWAND: + val2 = 4 + skill_lv; + val3 = 300 * skill_lv + 65 * ( status->int_ + status_get_lv(src) ) + status->max_sp; //nb hp + break; case MG_SAFETYWALL: - #ifdef RENEWAL - if(skill_id == MH_STEINWAND) - val2 = 300 * skill_lv + 65 * ( status->int_ + status_get_lv(src) ) + status->max_sp; //nb hp - else - val2 = status_get_max_hp(src) * 3; - #else +#ifdef RENEWAL + val2 = status_get_max_hp(src) * 3; +#else val2 = skill_lv+1; - #endif +#endif break; case MG_FIREWALL: if(sc && sc->data[SC_VIOLENTGALE]) @@ -11800,9 +11783,9 @@ struct skill_unit_group* skill_unitsetting (struct block_list *src, uint16 skill break; case DC_HUMMING: val1 = 2*skill_lv+status->dex/10; // Hit increase - #ifdef RENEWAL +#ifdef RENEWAL val1 *= 2; - #endif +#endif if(sd) val1 += pc_checkskill(sd,DC_DANCINGLESSON); break; @@ -12070,6 +12053,7 @@ struct skill_unit_group* skill_unitsetting (struct block_list *src, uint16 skill break; case GN_WALLOFTHORN: val1 = 2000 + 2000 * skill_lv; + val2 = 20; break; default: if (group->state.song_dance&0x1) @@ -15704,19 +15688,18 @@ static int skill_sit_count (struct block_list *bl, va_list ap) static int skill_sit_in (struct block_list *bl, va_list ap) { struct map_session_data *sd; - int type =va_arg(ap,int); + int type = va_arg(ap,int); - sd=(struct map_session_data*)bl; + sd = (struct map_session_data*)bl; if(!pc_issit(sd)) return 0; if(type&1 && pc_checkskill(sd,RG_GANGSTER) > 0) - sd->state.gangsterparadise=1; + sd->state.gangsterparadise = 1; - if(type&2 && (pc_checkskill(sd,TK_HPTIME) > 0 || pc_checkskill(sd,TK_SPTIME) > 0 )) - { - sd->state.rest=1; + if(type&2 && (pc_checkskill(sd,TK_HPTIME) > 0 || pc_checkskill(sd,TK_SPTIME) > 0 )) { + sd->state.rest = 1; status_calc_regen(bl, &sd->battle_status, &sd->regen); status_calc_regen_rate(bl, &sd->regen, &sd->sc); } @@ -15727,12 +15710,14 @@ static int skill_sit_in (struct block_list *bl, va_list ap) static int skill_sit_out (struct block_list *bl, va_list ap) { struct map_session_data *sd; - int type =va_arg(ap,int); - sd=(struct map_session_data*)bl; + int type = va_arg(ap,int); + + sd = (struct map_session_data*)bl; + if(sd->state.gangsterparadise && type&1) - sd->state.gangsterparadise=0; + sd->state.gangsterparadise = 0; if(sd->state.rest && type&2) { - sd->state.rest=0; + sd->state.rest = 0; status_calc_regen(bl, &sd->battle_status, &sd->regen); status_calc_regen_rate(bl, &sd->regen, &sd->sc); } @@ -15745,27 +15730,25 @@ int skill_sit (struct map_session_data *sd, int type) int range = 0, lv; nullpo_ret(sd); - - if((lv = pc_checkskill(sd,RG_GANGSTER)) > 0) { - flag|=1; + if((lv = pc_checkskill(sd, RG_GANGSTER)) > 0) { + flag |= 1; range = skill_get_splash(RG_GANGSTER, lv); } - if((lv = pc_checkskill(sd,TK_HPTIME)) > 0) { - flag|=2; + if((lv = pc_checkskill(sd, TK_HPTIME)) > 0) { + flag |= 2; range = skill_get_splash(TK_HPTIME, lv); - } - else if ((lv = pc_checkskill(sd,TK_SPTIME)) > 0) { - flag|=2; + } else if ((lv = pc_checkskill(sd, TK_SPTIME)) > 0) { + flag |= 2; range = skill_get_splash(TK_SPTIME, lv); } if( type ) { - clif_status_load(&sd->bl,SI_SIT,1); // TODO: Include the case of using the Insert key - pc_stop_attack(sd); // Stop players who may be attacking to not de-sync - } else { - clif_status_load(&sd->bl,SI_SIT,0); - } + pc_stop_walking(sd, 1|4); // Stop players who may be walking + pc_stop_attack(sd); // Stop players who may be attacking + clif_status_load(&sd->bl, SI_SIT, 1); + } else + clif_status_load(&sd->bl, SI_SIT, 0); if (!flag) return 0; @@ -17029,7 +17012,7 @@ static int skill_unit_timer_sub(DBKey key, DBData *data, va_list ap) case UNT_WALLOFTHORN: if( unit->val1 <= 0 ) { group->unit_id = UNT_USED_TRAPS; - group->limit = DIFF_TICK(tick, group->tick) + 1500; + group->limit = DIFF_TICK(tick, group->tick); } break; } @@ -18582,7 +18565,7 @@ void skill_init_unit_layout (void) { switch (i) { case MG_FIREWALL: case WZ_ICEWALL: - case WL_EARTHSTRAIN://Warlock + case WL_EARTHSTRAIN: case RL_FIRE_RAIN: // these will be handled later break; diff --git a/src/map/skill.h b/src/map/skill.h index 67205767fc..f3d1552ef7 100644 --- a/src/map/skill.h +++ b/src/map/skill.h @@ -179,7 +179,7 @@ struct s_skill_db { }; extern struct s_skill_db skill_db[MAX_SKILL_DB]; -#define MAX_SKILL_UNIT_LAYOUT 50 +#define MAX_SKILL_UNIT_LAYOUT 55 // RL_FIRE_RAIN increased to 51 #define MAX_SQUARE_LAYOUT 5 // 11*11 Placement of a maximum unit #define MAX_SKILL_UNIT_COUNT ((MAX_SQUARE_LAYOUT*2+1)*(MAX_SQUARE_LAYOUT*2+1)) struct s_skill_unit_layout { diff --git a/src/map/status.c b/src/map/status.c index f15dfd7737..b3e49b171a 100644 --- a/src/map/status.c +++ b/src/map/status.c @@ -334,9 +334,9 @@ void initChangeTables(void) add_sc( MO_BLADESTOP , SC_BLADESTOP_WAIT ); set_sc( MO_BLADESTOP , SC_BLADESTOP , SI_BLADESTOP , SCB_NONE ); set_sc( MO_EXPLOSIONSPIRITS , SC_EXPLOSIONSPIRITS , SI_EXPLOSIONSPIRITS , SCB_CRI|SCB_REGEN ); - set_sc( MO_EXTREMITYFIST , SC_EXTREMITYFIST , SI_EXTREMITYFIST , SCB_REGEN ); + set_sc( MO_EXTREMITYFIST , SC_EXTREMITYFIST , SI_BLANK , SCB_REGEN ); #ifdef RENEWAL - set_sc( MO_EXTREMITYFIST , SC_EXTREMITYFIST2 , SI_BLANK , SCB_NONE ); + set_sc( MO_EXTREMITYFIST , SC_EXTREMITYFIST2 , SI_EXTREMITYFIST , SCB_NONE ); #endif set_sc( SA_MAGICROD , SC_MAGICROD , SI_MAGICROD , SCB_NONE ); set_sc( SA_AUTOSPELL , SC_AUTOSPELL , SI_AUTOSPELL , SCB_NONE ); @@ -3288,10 +3288,13 @@ int status_calc_pc_(struct map_session_data* sd, bool first) if(sd->def_rate < 0) sd->def_rate = 0; if(sd->def_rate != 100) { - i = status->def * sd->def_rate/100; + i = status->def * sd->def_rate/100; status->def = cap_value(i, DEFTYPE_MIN, DEFTYPE_MAX); } + if(pc_isriding(sd) && pc_checkskill(sd, NC_MAINFRAME) > 0) + status->def += 20 + (pc_checkskill(sd, NC_MAINFRAME) * 20); + #ifndef RENEWAL if (!battle_config.weapon_defense_type && status->def > battle_config.max_def) { status->def2 += battle_config.over_def_bonus*(status->def -battle_config.max_def); @@ -3878,27 +3881,32 @@ void status_calc_regen_rate(struct block_list *bl, struct regen_data *regen, str if (!sc || !sc->count) return; - if ( - (sc->data[SC_POISON] && !sc->data[SC_SLOWPOISON]) + if ((sc->data[SC_POISON] && !sc->data[SC_SLOWPOISON]) || (sc->data[SC_DPOISON] && !sc->data[SC_SLOWPOISON]) || sc->data[SC_BERSERK] || sc->data[SC_TRICKDEAD] || sc->data[SC_BLEEDING] || sc->data[SC_MAGICMUSHROOM] || sc->data[SC_SATURDAYNIGHTFEVER] - ) // No regen - regen->flag = 0; + || sc->data[SC_REBOUND]) + regen->flag = 0; // No HP or SP regen - if ( sc->data[SC_DANCING] || sc->data[SC_OBLIVIONCURSE] || sc->data[SC_REBOUND] || sc->data[SC_VITALITYACTIVATION] || + if (sc->data[SC_DANCING] || #ifdef RENEWAL sc->data[SC_MAXIMIZEPOWER] || #endif - ( 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))) - ) - ) { - regen->flag &=~RGN_SP; // No natural SP regen - } +#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)) || +#endif + sc->data[SC_OBLIVIONCURSE] || sc->data[SC_VITALITYACTIVATION]) + regen->flag &= ~RGN_SP; // No natural SP regen + +#ifdef RENEWAL + if (bl->type == BL_PC && (((TBL_PC*)bl)->class_&MAPID_UPPERMASK) == MAPID_MONK && + sc->data[SC_EXPLOSIONSPIRITS] && (!sc->data[SC_SPIRIT] || sc->data[SC_SPIRIT]->val2 != SL_MONK)) + regen->rate.sp = regen->rate.sp / 2; // 50% SP regen while in Fury State +#endif if(sc->data[SC_TENSIONRELAX]) { regen->rate.hp += 2; @@ -3919,7 +3927,7 @@ void status_calc_regen_rate(struct block_list *bl, struct regen_data *regen, str } if(sc->data[SC_GT_REVITALIZE]) { regen->hp += cap_value(regen->hp*sc->data[SC_GT_REVITALIZE]->val3/100, 1, SHRT_MAX); - regen->state.walk= 1; + regen->state.walk = 1; } if ((sc->data[SC_FIRE_INSIGNIA] && sc->data[SC_FIRE_INSIGNIA]->val1 == 1) // If insignia lvl 1 || (sc->data[SC_WATER_INSIGNIA] && sc->data[SC_WATER_INSIGNIA]->val1 == 1) @@ -5564,6 +5572,8 @@ static defType status_calc_def(struct block_list *bl, struct status_change *sc, def -= def * sc->data[SC_ASH]->val3/100; if( sc->data[SC_OVERED_BOOST] ) def -= def * sc->data[SC_OVERED_BOOST]->val3 / 100; + if(sc->data[SC_UNLIMIT]) + return 1; return (defType)cap_value(def,DEFTYPE_MIN,DEFTYPE_MAX);; } @@ -5628,6 +5638,8 @@ static signed short status_calc_def2(struct block_list *bl, struct status_change def2 -= def2 * sc->data[SC_PARALYSIS]->val2 / 100; if(sc->data[SC_EQC]) def2 -= def2 * sc->data[SC_EQC]->val2 / 100; + if(sc->data[SC_UNLIMIT]) + return 1; #ifdef RENEWAL return (short)cap_value(def2,SHRT_MIN,SHRT_MAX); @@ -5687,6 +5699,8 @@ static defType status_calc_mdef(struct block_list *bl, struct status_change *sc, } if (sc->data[SC_ODINS_POWER]) mdef -= 20; + if(sc->data[SC_UNLIMIT]) + return 1; return (defType)cap_value(mdef,DEFTYPE_MIN,DEFTYPE_MAX); } @@ -5716,6 +5730,8 @@ static signed short status_calc_mdef2(struct block_list *bl, struct status_chang mdef2 -= mdef2 * sc->data[SC_MINDBREAKER]->val3/100; if(sc->data[SC_ANALYZE]) mdef2 -= mdef2 * ( 14 * sc->data[SC_ANALYZE]->val1 ) / 100; + if(sc->data[SC_UNLIMIT]) + return 1; #ifdef RENEWAL return (short)cap_value(mdef2,SHRT_MIN,SHRT_MAX); @@ -8497,6 +8513,7 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty case SC_TENSIONRELAX: if (sd) { + skill_sit(sd, 1); pc_setsit(sd); clif_sitting(&sd->bl); } @@ -9216,8 +9233,8 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty case SC_SITDOWN_FORCE: case SC_BANANA_BOMB_SITDOWN: if( sd && !pc_issit(sd) ) { + skill_sit(sd, 1); pc_setsit(sd); - skill_sit(sd,1); clif_sitting(bl); } break; @@ -9300,6 +9317,9 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty val3 = tick / 5000; tick_time = 5000; // [GodLesZ] tick time break; + case SC_GT_ENERGYGAIN: + val3 = 10 + 5 * val1; // Sphere gain chance. + break; case SC_GT_CHANGE: { // Take note there is no def increase as skill desc says. [malufett] struct block_list * src; @@ -11685,8 +11705,7 @@ int status_change_timer(int tid, unsigned int tick, int id, intptr_t data) 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. - pc_stop_walking(sd,1|4); - pc_stop_attack(sd); + skill_sit(sd, 1); pc_setsit(sd); clif_sitting(bl); }