diff --git a/db/pre-re/item_db.txt b/db/pre-re/item_db.txt index e447ea1ada..92f9423487 100644 --- a/db/pre-re/item_db.txt +++ b/db/pre-re/item_db.txt @@ -1109,7 +1109,7 @@ 2138,Bradium_Shield,Bradium Shield,4,20,,1800,,5,,1,0x00CFFF80,2,2,32,,65,1,3,{ bonus2 bSkillAtk,"CR_SHIELDBOOMERANG",60; bonus bAgi,-1; bonus bMaxHP,500; },{},{} 2139,Flame_Thrower,Flame Thrower,4,20000,,2000,,60,,0,0x00000400,63,2,32,,99,0,1,{},{},{} // GM Shield -2199,Ahura_Mazda,Ahura Mazdah,4,1,,10,,100,,0,0xFFFFFFFF,7,2,32,,1,1,0,{ bonus bAllStats,50; bonus bMdef,99; bonus bShortWeaponDamageReturn,100; bonus2 bSubRace,RC_DemiHuman,95; bonus2 bSubRace,RC_Player,95; skill "CR_FULLPROTECTION",5; Skill "WZ_ESTIMATION",1; Skill "ST_FULLSTRIP",5; Skill "HW_MAGICPOWER",10; bonus bMaxHPRate,200; bonus bNoGemStone; bonus bSpeedRate,25; },{ sc_start4 SC_ENDURE,60000,10,0,0,1; },{ sc_end SC_ENDURE; } +2199,Ahura_Mazda,Ahura Mazdah,4,1,,10,,100,,0,0xFFFFFFFF,7,2,32,,1,1,0,{ bonus bAllStats,50; bonus bMdef,99; bonus bShortWeaponDamageReturn,100; bonus2 bSubRace,RC_DemiHuman,95; bonus2 bSubRace,RC_Player,95; skill "CR_FULLPROTECTION",5; Skill "WZ_ESTIMATION",1; Skill "ST_FULLSTRIP",5; Skill "HW_MAGICPOWER",10; bonus bMaxHPRate,200; bonus bNoGemStone; bonus bSpeedRate,25; bonus bNoWalkDelay; },{},{} // Headgears //=================================================================== 2201,Sunglasses,Sunglasses,4,5000,,100,,0,,0,0xFFFFFFFF,7,2,512,,0,0,12,{ bonus2 bResEff,Eff_Blind,500; },{},{} @@ -1761,7 +1761,7 @@ 4120,Petit__Card,Sky Petite Card,6,20,,10,,,,,,,,32,,,,,{ bonus2 bSubRace,RC_Dragon,30; },{},{} 4121,Phreeoni_Card,Phreeoni Card,6,20,,10,,,,,,,,2,,,,,{ bonus bHit,100; },{},{} 4122,Deviruchi_Card,Deviruchi Card,6,20,,10,,,,,,,,769,,,,,{ bonus bStr,1; bonus2 bResEff,Eff_Blind,10000; },{},{} -4123,Eddga_Card,Eddga Card,6,20,,10,,,,,,,,64,,,,,{ bonus bMaxHPrate,-25; },{ sc_start4 SC_ENDURE,60000,10,0,0,1; },{ sc_end SC_ENDURE; } +4123,Eddga_Card,Eddga Card,6,20,,10,,,,,,,,64,,,,,{ bonus bMaxHPrate,-25; bonus bNoWalkDelay; },{},{} 4124,Medusa_Card,Medusa Card,6,20,,10,,,,,,,,32,,,,,{ bonus2 bSubRace,RC_Demon,15; bonus2 bResEff,Eff_Stone,10000; },{},{} 4125,Deviace_Card,Deviace Card,6,20,,10,,,,,,,,2,,,,,{ bonus2 bAddRace,RC_DemiHuman,7; bonus2 bAddRace,RC_Player,7; bonus2 bAddRace,RC_Brute,7; bonus2 bAddRace,RC_Plant,7; bonus2 bAddRace,RC_Insect,7; },{},{} 4126,Minorous_Card,Minorous Card,6,20,,10,,,,,,,,2,,,,,{ bonus2 bAddSize,Size_Large,15; bonus bBaseAtk,5; },{},{} diff --git a/db/re/item_combo_db.txt b/db/re/item_combo_db.txt index c8370f7d37..3916c80337 100644 --- a/db/re/item_combo_db.txt +++ b/db/re/item_combo_db.txt @@ -775,7 +775,7 @@ 24168:24169:24177,{ bonus bMatk,5; if(getequiprefinerycnt(EQI_SHADOW_WEAPON)+getequiprefinerycnt(EQI_SHADOW_ACC_R)+getequiprefinerycnt(EQI_SHADOW_ACC_L)>=25) bonus bIgnoreMDefRace,RC_Formless; } 24168:24169:24178,{ bonus bMatk,5; if(getequiprefinerycnt(EQI_SHADOW_WEAPON)+getequiprefinerycnt(EQI_SHADOW_ACC_R)+getequiprefinerycnt(EQI_SHADOW_ACC_L)>=25) bonus bIgnoreMDefRace,RC_Undead; } 24168:24169:24179,{ bonus bMatk,5; if(getequiprefinerycnt(EQI_SHADOW_WEAPON)+getequiprefinerycnt(EQI_SHADOW_ACC_R)+getequiprefinerycnt(EQI_SHADOW_ACC_L)>=25) bonus bIgnoreMDefRace,RC_Plant; } -24180:24181:24182:24183:24184:24185,{ .@r = getequiprefinerycnt(EQI_SHADOW_ARMOR)+getequiprefinerycnt(EQI_SHADOW_WEAPON)+getequiprefinerycnt(EQI_SHADOW_SHIELD)+getequiprefinerycnt(EQI_SHADOW_SHOES)+getequiprefinerycnt(EQI_SHADOW_ACC_R)+getequiprefinerycnt(EQI_SHADOW_ACC_L); bonus bAllStats,1; if(.@r>=45) { bonus bMaxHPrate,(.@r-60); sc_start4 SC_ENDURE,1,10,0,0,1;} } +24180:24181:24182:24183:24184:24185,{ .@r = getequiprefinerycnt(EQI_SHADOW_ARMOR)+getequiprefinerycnt(EQI_SHADOW_WEAPON)+getequiprefinerycnt(EQI_SHADOW_SHIELD)+getequiprefinerycnt(EQI_SHADOW_SHOES)+getequiprefinerycnt(EQI_SHADOW_ACC_R)+getequiprefinerycnt(EQI_SHADOW_ACC_L); bonus bAllStats,1; if(.@r>=45) { bonus bMaxHPrate,(.@r-60); bonus bNoWalkDelay; } } 24186:24198,{ bonus2 bSubEle,Ele_Neutral,2; } 24187:24199,{ bonus2 bSubEle,Ele_Dark,2; } 24188:24200,{ bonus2 bSubEle,Ele_Water,2; } diff --git a/db/re/item_db.txt b/db/re/item_db.txt index b19df0c5ca..5999bd1780 100644 --- a/db/re/item_db.txt +++ b/db/re/item_db.txt @@ -1404,7 +1404,7 @@ 2196,White_Gold_Shield,White Gold Shield,4,0,,1800,,140,,1,0xFFFFFFFF,63,2,32,,,1,4,{ autobonus2 "{ bonus bMagicDamageReturn,20; }",100,2000,BF_MAGIC; /* Confirm: Success rate? */ },{},{} 2198,Lapine_Shield,Lapine Shield,4,0,,1000,,25,,1,0xFFFFFFFF,63,2,32,,100,1,3,{ bonus bMdef,10; if (getrefine() > 7) { bonus bMatk,20; } },{},{} // GM Shield -2199,Ahura_Mazda,Ahura Mazdah,4,1,,10,,10000,,0,0xFFFFFFFF,63,2,32,,1,1,1,{ bonus bAllStats,50; bonus bMdef,99; bonus bShortWeaponDamageReturn,100; bonus2 bSubRace,RC_DemiHuman,95; bonus2 bSubRace,RC_Player,95; skill "CR_FULLPROTECTION",5; skill "WZ_ESTIMATION",1; skill "ST_FULLSTRIP",5; skill "HW_MAGICPOWER",10; skill "ECL_SNOWFLIP",1; skill "ECL_PEONYMAMY",1; skill "ECL_SADAGUI",1; skill "ECL_SEQUOIADUST",1; bonus bMaxHPrate,200; bonus bNoKnockback; bonus bDelayRate,-20; bonus bSpeedRate,25; bonus bIntravision; },{ sc_start4 SC_ENDURE,60000,10,0,0,1; },{ sc_end SC_ENDURE; } +2199,Ahura_Mazda,Ahura Mazdah,4,1,,10,,10000,,0,0xFFFFFFFF,63,2,32,,1,1,1,{ bonus bAllStats,50; bonus bMdef,99; bonus bShortWeaponDamageReturn,100; bonus2 bSubRace,RC_DemiHuman,95; bonus2 bSubRace,RC_Player,95; skill "CR_FULLPROTECTION",5; skill "WZ_ESTIMATION",1; skill "ST_FULLSTRIP",5; skill "HW_MAGICPOWER",10; skill "ECL_SNOWFLIP",1; skill "ECL_PEONYMAMY",1; skill "ECL_SADAGUI",1; skill "ECL_SEQUOIADUST",1; bonus bMaxHPrate,200; bonus bNoKnockback; bonus bDelayRate,-20; bonus bSpeedRate,25; bonus bIntravision; bonus bNoWalkDelay; },{},{} //=================================================================== // Headgears //=================================================================== @@ -2313,7 +2313,7 @@ 4120,Petit__Card,Sky Petite Card,6,20,,10,,,,,,,,32,,,,,{ bonus2 bSubRace,RC_Dragon,30; },{},{} 4121,Phreeoni_Card,Phreeoni Card,6,20,,10,,,,,,,,2,,,,,{ bonus bHit,100; },{},{} 4122,Deviruchi_Card,Deviruchi Card,6,20,,10,,,,,,,,769,,,,,{ bonus bStr,1; bonus2 bResEff,Eff_Blind,10000; },{},{} -4123,Eddga_Card,Eddga Card,6,20,,10,,,,,,,,64,,,,,{ bonus bMaxHPrate,-25; },{ sc_start4 SC_ENDURE,60000,10,0,0,1; },{ sc_end SC_ENDURE; } +4123,Eddga_Card,Eddga Card,6,20,,10,,,,,,,,64,,,,,{ bonus bMaxHPrate,-25; bonus bNoWalkDelay; },{},{} 4124,Medusa_Card,Medusa Card,6,20,,10,,,,,,,,32,,,,,{ bonus2 bSubRace,RC_Demon,15; bonus2 bResEff,Eff_Stone,10000; },{},{} 4125,Deviace_Card,Deviace Card,6,20,,10,,,,,,,,2,,,,,{ bonus2 bAddRace,RC_DemiHuman,7; bonus2 bAddRace,RC_Player,7; bonus2 bAddRace,RC_Brute,7; bonus2 bAddRace,RC_Plant,7; bonus2 bAddRace,RC_Insect,7; },{},{} 4126,Minorous_Card,Minorous Card,6,20,,10,,,,,,,,2,,,,,{ bonus2 bAddSize,Size_Large,15; bonus bBaseAtk,5; },{},{} @@ -2694,7 +2694,7 @@ 4501,Sealed_B_Magaleta_Card,Sealed High Priest Card,6,20,,10,,,,,,,,16,,,,,{ bonus5 bAutoSpellWhenHit,"HP_ASSUMPTIO",1,((getrefine()>14)?35:25),BF_WEAPON|BF_MAGIC,0; },{},{} 4502,Sealed_B_Harword_Card,Sealed MasterSmith Card,6,20,,10,,,,,,,,2,,,,,{ .@r = getrefine(); bonus bBreakWeaponRate,(.@r>14?800:500); bonus bBreakArmorRate,(.@r>14?600:500); },{},{} 4503,Sealed_Apocalips_H_Card,Sealed Vesper Card,6,20,,10,,,,,,,,769,,,,,{ bonus bDex,2; bonus2 bIgnoreMdefClassRate,Class_Boss,((getrefine()>14)?25:15); },{},{} -4504,Sealed_Eddga_Card,Sealed Eddga Card,6,20,,10,,,,,,,,64,,,,,{ bonus bMaxHPrate,((getrefine()>14)?-35:-50); },{ sc_start4 SC_ENDURE,60000,10,0,0,1; },{ sc_end SC_ENDURE; } +4504,Sealed_Eddga_Card,Sealed Eddga Card,6,20,,10,,,,,,,,64,,,,,{ bonus bMaxHPrate,((getrefine()>14)?-35:-50); bonus bNoWalkDelay; },{},{} 4505,Scaraba_Card,Scaraba Card,6,20,,10,,,,,,,,136,,,,,{ bonus bMatk,20; bonus bMaxSPrate,-1; },{},{} 4506,Dolomedes_Card,Dolomedes Card,6,20,,10,,,,,,,,769,,,,,{ bonus bDex,2; if(BaseClass==Job_Archer){ bonus bDex,getrefine()/3; } },{},{} 4507,Q_Scaraba_Card,Queen Scaraba Card,6,20,,10,,,,,,,,2,,,,,{ bonus2 bAddRace2,RC2_SCARABA,30; bonus2 bAddMonsterDropItem,12806,30; },{},{} @@ -8557,7 +8557,7 @@ 14583,WOB_Schwaltz,Green Butterfly Wing,2,0,,10,,,,,0xFFFFFFFF,63,2,,,,,,{ callfunc "F_CashCity",2; },{},{} 14584,WOB_Rachel,Red Butterfly Wing,2,0,,10,,,,,0xFFFFFFFF,63,2,,,,,,{ callfunc "F_CashCity",3; },{},{} 14585,WOB_Local,Blue Butterfly Wing,2,0,,10,,,,,0xFFFFFFFF,63,2,,,,,,{ callfunc "F_CashCity",4; },{},{} -14586,Spark_Candy,Jumping Candy,2,0,,10,,,,,0xFFFFFFFF,63,2,,,,,,{ specialeffect2 EF_HASTEUP; bonus_script "{ bonus2 bHPLossRate,100,10000; bonus bBaseAtk,20; bonus bAspdRate,25; /*EFFECTEndure 9999 100*/ }",60,0,0,EFST_STEAMPACK; itemskill "SM_ENDURE",10; },{},{} +14586,Spark_Candy,Jumping Candy,2,0,,10,,,,,0xFFFFFFFF,63,2,,,,,,{ specialeffect2 EF_HASTEUP; bonus_script "{ bonus2 bHPLossRate,100,10000; bonus bBaseAtk,20; bonus bAspdRate,25; bonus bNoWalkDelay; }",60,0,0,EFST_STEAMPACK; },{},{} 14587,Repair_Scroll_,Equipment Repair Spell Book,11,0,,10,,,,,0xFFFFFFFF,63,2,,,,,,{ itemskill "BS_REPAIRWEAPON",1; },{},{} 14588,Pty_Blessing_Scroll,Party Blessing 10 Scroll,11,10,,10,,,,,0xFFFFFFFF,63,2,,,,,,{ itemskill "CASH_BLESSING",10; },{},{} 14589,Pty_Inc_Agi_Scroll,Party Increase Agi 10 Scroll,11,10,,10,,,,,0xFFFFFFFF,63,2,,,,,,{ itemskill "CASH_INCAGI",10; },{},{} diff --git a/doc/item_bonus.txt b/doc/item_bonus.txt index 307183cc93..95d18854e3 100644 --- a/doc/item_bonus.txt +++ b/doc/item_bonus.txt @@ -453,3 +453,4 @@ bonus bRestartFullRecover; When reviving, HP and SP are fully healed bonus bClassChange,n; Gives a n/100% chance to change the attacked monster's class with normal attack bonus bAddStealRate,n; Increases success rate of Steal skill by n/100% bonus bNoMadoFuel; Nullify Magic Gear Fuel requirement for skills. +bonus bNoWalkDelay; Give infinite Endure. diff --git a/src/map/map.cpp b/src/map/map.cpp index e96209aeb1..18d7a37d7b 100644 --- a/src/map/map.cpp +++ b/src/map/map.cpp @@ -2086,8 +2086,6 @@ int map_quit(struct map_session_data *sd) { status_change_end(&sd->bl, SC_SOULCOLD, INVALID_TIMER); status_change_end(&sd->bl, SC_HAWKEYES, INVALID_TIMER); status_change_end(&sd->bl, SC_CHASEWALK2, INVALID_TIMER); - if(sd->sc.data[SC_ENDURE] && sd->sc.data[SC_ENDURE]->val4) - status_change_end(&sd->bl, SC_ENDURE, INVALID_TIMER); //No need to save infinite endure. if(sd->sc.data[SC_PROVOKE] && sd->sc.data[SC_PROVOKE]->timer == INVALID_TIMER) status_change_end(&sd->bl, SC_PROVOKE, INVALID_TIMER); //Infinite provoke ends on logout status_change_end(&sd->bl, SC_WEIGHT50, INVALID_TIMER); diff --git a/src/map/map.hpp b/src/map/map.hpp index 166e35b674..2d9b8db1c6 100644 --- a/src/map/map.hpp +++ b/src/map/map.hpp @@ -485,7 +485,7 @@ enum _sp { SP_HP_VANISH_RACE_RATE, SP_SP_VANISH_RACE_RATE, SP_ABSORB_DMG_MAXHP, SP_SUB_SKILL, SP_SUBDEF_ELE, // 2074-2078 SP_STATE_NORECOVER_RACE, SP_CRITICAL_RANGEATK, SP_MAGIC_ADDRACE2, SP_IGNORE_MDEF_RACE2_RATE, // 2079-2082 SP_WEAPON_ATK_RATE, SP_WEAPON_MATK_RATE, SP_DROP_ADDRACE, SP_DROP_ADDCLASS, SP_NO_MADO_FUEL, // 2083-2087 - SP_IGNORE_DEF_CLASS_RATE, SP_REGEN_PERCENT_HP, SP_REGEN_PERCENT_SP, SP_SKILL_DELAY //2088-2092 + SP_IGNORE_DEF_CLASS_RATE, SP_REGEN_PERCENT_HP, SP_REGEN_PERCENT_SP, SP_SKILL_DELAY, SP_NO_WALK_DELAY //2088-2093 }; enum _look { diff --git a/src/map/pc.cpp b/src/map/pc.cpp index 85937801a7..fbe15e7967 100755 --- a/src/map/pc.cpp +++ b/src/map/pc.cpp @@ -2471,7 +2471,6 @@ TIMER_FUNC(pc_endautobonus){ static void pc_bonus_addele(struct map_session_data* sd, unsigned char ele, short rate, short flag) { struct weapon_data *wd = (sd->state.lr_flag ? &sd->left_weapon : &sd->right_weapon); - struct s_addele2 entry; if (wd->addele2.size() == MAX_PC_BONUS) { ShowWarning("pc_bonus_addele: Reached max (%d) number of add element damage bonuses per character!\n", MAX_PC_BONUS); @@ -2497,6 +2496,8 @@ static void pc_bonus_addele(struct map_session_data* sd, unsigned char ele, shor } } + struct s_addele2 entry = {}; + entry.ele = ele; entry.rate = rate; entry.flag = flag; @@ -3194,6 +3195,10 @@ void pc_bonus(struct map_session_data *sd,int type,int val) if (sd->state.lr_flag != 2) sd->special_state.no_mado_fuel = 1; break; + case SP_NO_WALK_DELAY: + if (sd->state.lr_flag != 2) + sd->special_state.no_walk_delay = 1; + break; default: if (running_npc_stat_calc_event) { ShowWarning("pc_bonus: unknown bonus type %d %d in OnPCStatCalcEvent!\n", type, val); @@ -8137,6 +8142,8 @@ int pc_readparam(struct map_session_data* sd,int type) case SP_NO_GEMSTONE: val = sd->special_state.no_gemstone?1:0; break; case SP_INTRAVISION: val = sd->special_state.intravision?1:0; break; case SP_NO_KNOCKBACK: val = sd->special_state.no_knockback?1:0; break; + case SP_NO_MADO_FUEL: val = sd->special_state.no_mado_fuel?1:0; break; + case SP_NO_WALK_DELAY: val = sd->special_state.no_walk_delay?1:0; break; case SP_SPLASH_RANGE: val = sd->bonus.splash_range; break; case SP_SPLASH_ADD_RANGE:val = sd->bonus.splash_add_range; break; case SP_SHORT_WEAPON_DAMAGE_RETURN: val = sd->bonus.short_weapon_damage_return; break; diff --git a/src/map/pc.hpp b/src/map/pc.hpp index aa5b271b2f..f5bde866c9 100644 --- a/src/map/pc.hpp +++ b/src/map/pc.hpp @@ -301,6 +301,7 @@ struct map_session_data { unsigned int no_knockback : 1; unsigned int bonus_coma : 1; unsigned int no_mado_fuel : 1; // Disable Magic_Gear_Fuel consumption [Secret] + unsigned int no_walk_delay : 1; } special_state; uint32 login_id1, login_id2; unsigned short class_; //This is the internal job ID used by the map server to simplify comparisons/queries/etc. [Skotlex] diff --git a/src/map/script_constants.hpp b/src/map/script_constants.hpp index d44bee3e5a..94cf6774bd 100644 --- a/src/map/script_constants.hpp +++ b/src/map/script_constants.hpp @@ -732,6 +732,7 @@ export_constant2("bRegenPercentHP", SP_REGEN_PERCENT_HP); export_constant2("bRegenPercentSP", SP_REGEN_PERCENT_SP); export_constant2("bSkillDelay",SP_SKILL_DELAY); + export_constant2("bNoWalkDelay",SP_NO_WALK_DELAY); /* equip indices */ export_constant(EQI_COMPOUND_ON); diff --git a/src/map/status.cpp b/src/map/status.cpp index b217907045..e530408eff 100644 --- a/src/map/status.cpp +++ b/src/map/status.cpp @@ -3486,6 +3486,9 @@ int status_calc_pc_sub(struct map_session_data* sd, enum e_status_calc_opt opt) if (sd->special_state.intravision && !sd->sc.data[SC_INTRAVISION]) // Clear intravision as long as nothing else is using it clif_status_load(&sd->bl, EFST_CLAIRVOYANCE, 0); + if (sd->special_state.no_walk_delay) + clif_status_load(&sd->bl, EFST_ENDURE, 0); + memset(&sd->special_state,0,sizeof(sd->special_state)); if (pc_isvip(sd)) // Magic Stone requirement avoidance for VIP. @@ -3905,6 +3908,16 @@ int status_calc_pc_sub(struct map_session_data* sd, enum e_status_calc_opt opt) i = base_status->luk + sd->status.luk + sd->param_bonus[5] + sd->param_equip[5]; base_status->luk = cap_value(i,0,USHRT_MAX); + if (sd->special_state.no_walk_delay) { + if (sc->data[SC_ENDURE]) { + if (sc->data[SC_ENDURE]->val4) + sc->data[SC_ENDURE]->val4 = 0; + status_change_end(&sd->bl, SC_ENDURE, INVALID_TIMER); + } + clif_status_load(&sd->bl, EFST_ENDURE, 1); + base_status->mdef++; + } + // ------ ATTACK CALCULATION ------ // Base batk value is set in status_calc_misc @@ -6663,7 +6676,7 @@ static defType status_calc_mdef(struct block_list *bl, struct status_change *sc, if(sc->data[SC_EARTH_INSIGNIA] && sc->data[SC_EARTH_INSIGNIA]->val1 == 3) mdef += 50; - if(sc->data[SC_ENDURE]) // It has been confirmed that Eddga card grants 1 MDEF, not 0, not 10, but 1. + if(sc->data[SC_ENDURE] && !sc->data[SC_ENDURE]->val3) // It has been confirmed that Eddga card grants 1 MDEF, not 0, not 10, but 1. mdef += (sc->data[SC_ENDURE]->val4 == 0) ? sc->data[SC_ENDURE]->val1 : 1; if(sc->data[SC_STONEHARDSKIN]) mdef += sc->data[SC_STONEHARDSKIN]->val1; @@ -7236,9 +7249,11 @@ static unsigned short status_calc_dmotion(struct block_list *bl, struct status_c return cap_value(dmotion,0,USHRT_MAX); /// It has been confirmed on official servers that MvP mobs have no dmotion even without endure - if( sc->data[SC_ENDURE] || ( bl->type == BL_MOB && status_get_class_(bl) == CLASS_BOSS ) ) + if( bl->type == BL_MOB && status_get_class_(bl) == CLASS_BOSS ) return 0; - if( sc->data[SC_RUN] || sc->data[SC_WUGDASH] ) + if (bl->type == BL_PC && ((TBL_PC *)bl)->special_state.no_walk_delay) + return 0; + if( sc->data[SC_ENDURE] || sc->data[SC_RUN] || sc->data[SC_WUGDASH] ) return 0; return (unsigned short)cap_value(dmotion,0,USHRT_MAX); @@ -9350,6 +9365,10 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty //These status changes always overwrite themselves even when a lower level is cast status_change_end(bl, type, INVALID_TIMER); break; + case SC_ENDURE: + if (sd && sd->special_state.no_walk_delay) + return 1; + break; } // Check for overlapping fails @@ -9546,7 +9565,6 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty else if( bl->type == BL_MER && ((TBL_MER*)bl)->devotion_flag && (tsd = ((TBL_MER*)bl)->master) ) status_change_start(src,&tsd->bl, type, 10000, val1, val2, val3, val4, tick, SCSTART_NOAVOID|SCSTART_NOICON); } - // val4 signals infinite endure (if val4 == 2 it is infinite endure from Berserk) if( val4 ) tick = INFINITE_TICK; break; @@ -9936,8 +9954,8 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty case SC_BERSERK: if( val3 == SC__BLOODYLUST ) sc_start(src,bl,(sc_type)val3,100,val1,tick); - if (!val3 && !(sc->data[SC_ENDURE] && sc->data[SC_ENDURE]->val4)) - sc_start4(src,bl, SC_ENDURE, 100,10,0,0,2, tick); + else + sc_start4(src,bl, SC_ENDURE, 100,10,0,0,1, tick); // HP healing is performing after the calc_status call. // Val2 holds HP penalty if (!val4) val4 = skill_get_time2(status_sc2skill(type),val1); @@ -11378,6 +11396,11 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty break; } + if (current_equip_combo_pos && tick == INFINITE_TICK) { + ShowWarning("sc_start: Item combo contains an INFINITE_TICK duration. Skipping bonus.\n"); + return 0; + } + /* [Ind] */ if (StatusDisplayType[type]&bl->type) { int dval1 = 0, dval2 = 0, dval3 = 0; @@ -12326,7 +12349,8 @@ int status_change_end_(struct block_list* bl, enum sc_type type, int tid, const break; case SC_CONCENTRATION: - status_change_end(bl, SC_ENDURE, INVALID_TIMER); + if (sc->data[SC_ENDURE] && !sc->data[SC_ENDURE]->val4) + status_change_end(bl, SC_ENDURE, INVALID_TIMER); break; case SC_BERSERK: if(status->hp > 200 && sc && sc->data[SC__BLOODYLUST]) { @@ -12334,7 +12358,7 @@ int status_change_end_(struct block_list* bl, enum sc_type type, int tid, const status_change_end(bl, SC__BLOODYLUST, INVALID_TIMER); } else if (status->hp > 100 && sce->val2) // If val2 is removed, no HP penalty (dispelled?) [Skotlex] status_set_hp(bl, 100, 0); - if(sc->data[SC_ENDURE] && sc->data[SC_ENDURE]->val4 == 2) { + if(sc->data[SC_ENDURE] && sc->data[SC_ENDURE]->val4) { sc->data[SC_ENDURE]->val4 = 0; status_change_end(bl, SC_ENDURE, INVALID_TIMER); }