diff --git a/zone/client_process.cpp b/zone/client_process.cpp index 197562889..b6889b6ae 100644 --- a/zone/client_process.cpp +++ b/zone/client_process.cpp @@ -1928,10 +1928,14 @@ void Client::DoEnduranceRegen() } void Client::DoEnduranceUpkeep() { + + if (!HasEndurUpkeep()) + return; + int upkeep_sum = 0; - - int cost_redux = spellbonuses.EnduranceReduction + itembonuses.EnduranceReduction; - + int cost_redux = spellbonuses.EnduranceReduction + itembonuses.EnduranceReduction + aabonuses.EnduranceReduction; + + bool has_effect = false; uint32 buffs_i; uint32 buff_count = GetMaxTotalSlots(); for (buffs_i = 0; buffs_i < buff_count; buffs_i++) { @@ -1957,6 +1961,9 @@ void Client::DoEnduranceUpkeep() { SetEndurance(GetEndurance() - upkeep_sum); TryTriggerOnValueAmount(false, false, true); } + + if (!has_effect) + SetEndurUpkeep(false); } void Client::CalcRestState() { diff --git a/zone/merc.cpp b/zone/merc.cpp index 8e73b3358..6583cd629 100644 --- a/zone/merc.cpp +++ b/zone/merc.cpp @@ -1160,10 +1160,14 @@ void Merc::SetEndurance(int32 newEnd) } void Merc::DoEnduranceUpkeep() { - int upkeep_sum = 0; + if (!HasEndurUpkeep()) + return; + + int upkeep_sum = 0; int cost_redux = spellbonuses.EnduranceReduction + itembonuses.EnduranceReduction; + bool has_effect = false; uint32 buffs_i; uint32 buff_count = GetMaxTotalSlots(); for (buffs_i = 0; buffs_i < buff_count; buffs_i++) { @@ -1187,6 +1191,9 @@ void Merc::DoEnduranceUpkeep() { if(upkeep_sum != 0) SetEndurance(GetEndurance() - upkeep_sum); + + if (!has_effect) + SetEndurUpkeep(false); } void Merc::CalcRestState() { diff --git a/zone/mob.cpp b/zone/mob.cpp index d0f973a5a..0b028dd75 100644 --- a/zone/mob.cpp +++ b/zone/mob.cpp @@ -391,6 +391,7 @@ Mob::Mob(const char* in_name, for (int i = 0; i < HIGHEST_RESIST+2; i++) { Vulnerability_Mod[i] = 0; } emoteid = 0; + endur_upkeep = false; } Mob::~Mob() diff --git a/zone/mob.h b/zone/mob.h index 6e11c8cfb..94b8ed930 100644 --- a/zone/mob.h +++ b/zone/mob.h @@ -290,6 +290,8 @@ public: inline float GetTargetRingX() const { return targetring_x; } inline float GetTargetRingY() const { return targetring_y; } inline float GetTargetRingZ() const { return targetring_z; } + inline bool HasEndurUpkeep() const { return endur_upkeep; } + inline void SetEndurUpkeep(bool val) { endur_upkeep = val; } //Basic Stats/Inventory virtual void SetLevel(uint8 in_level, bool command = false) { level = in_level; } @@ -1130,6 +1132,7 @@ protected: int16 SpellPowerDistanceMod; bool last_los_check; bool pseudo_rooted; + bool endur_upkeep; // Bind wound Timer bindwound_timer; diff --git a/zone/spell_effects.cpp b/zone/spell_effects.cpp index 924af5555..447d34efd 100644 --- a/zone/spell_effects.cpp +++ b/zone/spell_effects.cpp @@ -130,6 +130,9 @@ bool Mob::SpellEffect(Mob* caster, uint16 spell_id, float partial) buffs[buffslot].magic_rune = 0; buffs[buffslot].numhits = 0; + if (spells[spell_id].EndurUpkeep > 0) + SetEndurUpkeep(true); + if(IsClient() && CastToClient()->GetClientVersionBit() & BIT_UnderfootAndLater) { EQApplicationPacket *outapp = MakeBuffsPacket(false);