diff options
author | ccrs <ccrs@users.noreply.github.com> | 2017-08-21 20:28:18 +0200 |
---|---|---|
committer | Shauren <shauren.trinity@gmail.com> | 2020-08-23 15:56:21 +0200 |
commit | 9a5e2b80b39d3c0a466aec1ab3a6dbccf938f570 (patch) | |
tree | 91c99943a46367f1610618edae353f75cc2b5945 /src | |
parent | 04c974dbc3eb31aeba309f05e21b281fa6a14e6f (diff) |
Core/Creature: regenerate health
There are three possible scenarios regarding regenerating health
- db lock and curhealth set to > 0
- db lock and curhealth set to 0
- dynamic lock (set in scripts and such) overriding db lock
(cherry picked from commit 91c0d49c188977c3d797f5749b1204612ce50195)
Diffstat (limited to 'src')
11 files changed, 31 insertions, 31 deletions
diff --git a/src/server/game/AI/SmartScripts/SmartScript.cpp b/src/server/game/AI/SmartScripts/SmartScript.cpp index 44414d5b5ad..94ebacb2ab2 100644 --- a/src/server/game/AI/SmartScripts/SmartScript.cpp +++ b/src/server/game/AI/SmartScripts/SmartScript.cpp @@ -1953,7 +1953,7 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u { for (WorldObject* target : targets) if (IsCreature(target)) - target->ToCreature()->setRegeneratingHealth(e.action.setHealthRegen.regenHealth != 0); + target->ToCreature()->SetRegenerateHealth(e.action.setHealthRegen.regenHealth != 0); break; } case SMART_ACTION_SET_ROOT: diff --git a/src/server/game/Entities/Creature/Creature.cpp b/src/server/game/Entities/Creature/Creature.cpp index 06e93dd3160..22b7fe930ce 100644 --- a/src/server/game/Entities/Creature/Creature.cpp +++ b/src/server/game/Entities/Creature/Creature.cpp @@ -281,14 +281,12 @@ bool ForcedDespawnDelayEvent::Execute(uint64 /*e_time*/, uint32 /*p_time*/) return true; } -Creature::Creature(bool isWorldObject): Unit(isWorldObject), MapObject(), -m_groupLootTimer(0), m_PlayerDamageReq(0), -_pickpocketLootRestore(0), m_corpseRemoveTime(0), m_respawnTime(0), -m_respawnDelay(300), m_corpseDelay(60), m_respawnradius(0.0f), m_boundaryCheckTime(2500), m_combatPulseTime(0), m_combatPulseDelay(0), m_reactState(REACT_AGGRESSIVE), -m_defaultMovementType(IDLE_MOTION_TYPE), m_spawnId(UI64LIT(0)), m_equipmentId(0), m_originalEquipmentId(0), m_AlreadyCallAssistance(false), -m_AlreadySearchedAssistance(false), m_regenHealth(true), m_cannotReachTarget(false), m_cannotReachTimer(0), m_AI_locked(false), m_meleeDamageSchoolMask(SPELL_SCHOOL_MASK_NORMAL), -m_originalEntry(0), m_homePosition(), m_transportHomePosition(), m_creatureInfo(nullptr), m_creatureData(nullptr), m_waypointID(0), m_path_id(0), m_formation(nullptr), m_triggerJustAppeared(true), m_respawnCompatibilityMode(false), m_focusSpell(nullptr), m_focusDelay(0), m_shouldReacquireTarget(false), m_suppressedOrientation(0.0f), -_lastDamagedTime(0) +Creature::Creature(bool isWorldObject): Unit(isWorldObject), MapObject(), m_groupLootTimer(0), m_PlayerDamageReq(0), _pickpocketLootRestore(0), + m_corpseRemoveTime(0), m_respawnTime(0), m_respawnDelay(300), m_corpseDelay(60), m_respawnradius(0.0f), m_boundaryCheckTime(2500), m_combatPulseTime(0), m_combatPulseDelay(0), m_reactState(REACT_AGGRESSIVE), + m_defaultMovementType(IDLE_MOTION_TYPE), m_spawnId(UI64LIT(0)), m_equipmentId(0), m_originalEquipmentId(0), m_AlreadyCallAssistance(false), m_AlreadySearchedAssistance(false), m_cannotReachTarget(false), m_cannotReachTimer(0), + m_AI_locked(false), m_meleeDamageSchoolMask(SPELL_SCHOOL_MASK_NORMAL), m_originalEntry(0), m_homePosition(), m_transportHomePosition(), m_creatureInfo(nullptr), m_creatureData(nullptr), m_waypointID(0), m_path_id(0), + m_formation(nullptr), m_triggerJustAppeared(true), m_respawnCompatibilityMode(false), m_focusSpell(nullptr), m_focusDelay(0), m_shouldReacquireTarget(false), m_suppressedOrientation(0.0f), _lastDamagedTime(0), + _regenerateHealth(true), _regenerateHealthLock(false) { m_regenTimer = CREATURE_REGEN_INTERVAL; @@ -583,7 +581,7 @@ bool Creature::UpdateEntry(uint32 entry, CreatureData const* data /*= nullptr*/, CreatureTemplate const* cInfo = GetCreatureTemplate(); - m_regenHealth = cInfo->RegenHealth; + _regenerateHealth = cInfo->RegenHealth; // creatures always have melee weapon ready if any unless specified otherwise if (!GetCreatureAddon()) @@ -856,7 +854,7 @@ void Creature::Update(uint32 diff) if (m_regenTimer == 0) { - bool bInCombat = IsInCombat() && (!GetVictim() || // if IsInCombat() is true and this has no victim + bool bInCombat = IsInCombat() && (!GetVictim() || // if IsInCombat() is true and this has no victim !EnsureVictim()->GetCharmerOrOwnerPlayerOrPlayerItself() || // or the victim/owner/charmer is not a player !EnsureVictim()->GetCharmerOrOwnerPlayerOrPlayerItself()->IsGameMaster()); // or the victim/owner/charmer is not a GameMaster @@ -940,7 +938,7 @@ void Creature::Regenerate(Powers power) void Creature::RegenerateHealth() { - if (!isRegeneratingHealth()) + if (!CanRegenerateHealth()) return; uint32 curValue = GetHealth(); @@ -1752,8 +1750,11 @@ void Creature::LoadEquipment(int8 id, bool force /*= true*/) void Creature::SetSpawnHealth() { + if (_regenerateHealthLock) + return; + uint32 curhealth; - if (m_creatureData && !m_regenHealth) + if (m_creatureData && !_regenerateHealth) { curhealth = m_creatureData->curhealth; if (curhealth) diff --git a/src/server/game/Entities/Creature/Creature.h b/src/server/game/Entities/Creature/Creature.h index 1efa1efa566..5798ea814e0 100644 --- a/src/server/game/Entities/Creature/Creature.h +++ b/src/server/game/Entities/Creature/Creature.h @@ -271,8 +271,8 @@ class TC_GAME_API Creature : public Unit, public GridObject<Creature>, public Ma bool hasQuest(uint32 quest_id) const override; bool hasInvolvedQuest(uint32 quest_id) const override; - bool isRegeneratingHealth() { return m_regenHealth; } - void setRegeneratingHealth(bool regenHealth) { m_regenHealth = regenHealth; } + bool CanRegenerateHealth() { return !_regenerateHealthLock && _regenerateHealth; } + void SetRegenerateHealth(bool value) { _regenerateHealthLock = !value; } virtual uint8 GetPetAutoSpellSize() const { return MAX_SPELL_CHARM; } virtual uint32 GetPetAutoSpellOnPos(uint8 pos) const; float GetPetChaseDistance() const; @@ -381,7 +381,6 @@ class TC_GAME_API Creature : public Unit, public GridObject<Creature>, public Ma bool m_AlreadyCallAssistance; bool m_AlreadySearchedAssistance; - bool m_regenHealth; bool m_cannotReachTarget; uint32 m_cannotReachTimer; bool m_AI_locked; @@ -424,6 +423,10 @@ class TC_GAME_API Creature : public Unit, public GridObject<Creature>, public Ma time_t _lastDamagedTime; // Part of Evade mechanics CreatureTextRepeatGroup m_textRepeat; + + // Regenerate health + bool _regenerateHealth; // Set on creation + bool _regenerateHealthLock; // Dynamically set }; class TC_GAME_API AssistDelayEvent : public BasicEvent diff --git a/src/server/game/Movement/MovementGenerators/HomeMovementGenerator.cpp b/src/server/game/Movement/MovementGenerators/HomeMovementGenerator.cpp index 2392d8e609c..041961ce91c 100644 --- a/src/server/game/Movement/MovementGenerators/HomeMovementGenerator.cpp +++ b/src/server/game/Movement/MovementGenerators/HomeMovementGenerator.cpp @@ -82,11 +82,7 @@ void HomeMovementGenerator<Creature>::DoFinalize(Creature* owner) owner->SetWalk(true); owner->LoadCreaturesAddon(); owner->AI()->JustReachedHome(); - if (owner->isRegeneratingHealth()) - { - owner->SetFullHealth(); - owner->SetPower(POWER_MANA, owner->GetMaxPower(POWER_MANA)); - } + owner->SetSpawnHealth(); } } diff --git a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kalecgos.cpp b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kalecgos.cpp index db30bde2134..837863205d2 100644 --- a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kalecgos.cpp +++ b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kalecgos.cpp @@ -310,7 +310,7 @@ struct boss_kalecgos : public BossAI case EVENT_OUTRO_START: events.Reset(); events.SetPhase(PHASE_OUTRO); - me->setRegeneratingHealth(false); + me->SetRegenerateHealth(false); me->SetReactState(REACT_PASSIVE); me->InterruptNonMeleeSpells(true); me->RemoveAllAttackers(); diff --git a/src/server/scripts/EasternKingdoms/zone_dun_morogh_area_coldridge_valley.cpp b/src/server/scripts/EasternKingdoms/zone_dun_morogh_area_coldridge_valley.cpp index d25cb2f9fed..ed287bbe846 100644 --- a/src/server/scripts/EasternKingdoms/zone_dun_morogh_area_coldridge_valley.cpp +++ b/src/server/scripts/EasternKingdoms/zone_dun_morogh_area_coldridge_valley.cpp @@ -445,7 +445,7 @@ public: { if (Creature* target = GetHitCreature()) { - target->setRegeneratingHealth(false); + target->SetRegenerateHealth(false); target->SetHealth(target->CountPctFromMaxHealth(10)); } } diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_icecrown_gunship_battle.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_icecrown_gunship_battle.cpp index dbd4cb47909..a071eb87f2b 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_icecrown_gunship_battle.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_icecrown_gunship_battle.cpp @@ -551,7 +551,7 @@ struct gunship_npc_AI : public ScriptedAI Instance(creature->GetInstanceScript()), Slot(nullptr), Index(uint32(-1)) { BurningPitchId = Instance->GetData(DATA_TEAM_IN_INSTANCE) == HORDE ? SPELL_BURNING_PITCH_A : SPELL_BURNING_PITCH_H; - me->setRegeneratingHealth(false); + me->SetRegenerateHealth(false); } void SetData(uint32 type, uint32 data) override @@ -677,7 +677,7 @@ class npc_gunship : public CreatureScript _teamInInstance(creature->GetInstanceScript()->GetData(DATA_TEAM_IN_INSTANCE)), _summonedFirstMage(false), _died(false) { - me->setRegeneratingHealth(false); + me->SetRegenerateHealth(false); } void DamageTaken(Unit* /*source*/, uint32& damage) override @@ -852,7 +852,7 @@ class npc_high_overlord_saurfang_igb : public CreatureScript { _controller.ResetSlots(HORDE); _controller.SetTransport(creature->GetTransport()); - me->setRegeneratingHealth(false); + me->SetRegenerateHealth(false); me->m_CombatDistance = 70.0f; _firstMageCooldown = time(nullptr) + 60; _axethrowersYellCooldown = time_t(0); @@ -1121,7 +1121,7 @@ class npc_muradin_bronzebeard_igb : public CreatureScript { _controller.ResetSlots(ALLIANCE); _controller.SetTransport(creature->GetTransport()); - me->setRegeneratingHealth(false); + me->SetRegenerateHealth(false); me->m_CombatDistance = 70.0f; _firstMageCooldown = time(nullptr) + 60; _riflemanYellCooldown = time_t(0); diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_razorscale.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_razorscale.cpp index 3853594ca05..ec543fc1768 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_razorscale.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_razorscale.cpp @@ -872,7 +872,7 @@ struct npc_expedition_defender : public ScriptedAI { npc_expedition_defender(Creature* creature) : ScriptedAI(creature), _myPositionNumber(0), _instance(creature->GetInstanceScript()) { - me->setRegeneratingHealth(false); + me->SetRegenerateHealth(false); } void Reset() override diff --git a/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_skadi.cpp b/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_skadi.cpp index 6de234a6593..4e35b0b4fc5 100644 --- a/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_skadi.cpp +++ b/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_skadi.cpp @@ -344,7 +344,7 @@ public: void Reset() override { me->SetReactState(REACT_PASSIVE); - me->setRegeneratingHealth(false); + me->SetRegenerateHealth(false); me->SetSpeedRate(MOVE_RUN, 2.5f); } diff --git a/src/server/scripts/Northrend/zone_icecrown.cpp b/src/server/scripts/Northrend/zone_icecrown.cpp index bf4caf3128f..55884eab019 100644 --- a/src/server/scripts/Northrend/zone_icecrown.cpp +++ b/src/server/scripts/Northrend/zone_icecrown.cpp @@ -432,7 +432,7 @@ public: void Reset() override { - me->setRegeneratingHealth(false); + me->SetRegenerateHealth(false); DoCast(SPELL_THREAT_PULSE); Talk(BANNER_SAY); events.ScheduleEvent(EVENT_SPAWN, 3000); diff --git a/src/server/scripts/Outland/CoilfangReservoir/TheSlavePens/boss_ahune.cpp b/src/server/scripts/Outland/CoilfangReservoir/TheSlavePens/boss_ahune.cpp index aa5a5a9a170..b668c1a7989 100644 --- a/src/server/scripts/Outland/CoilfangReservoir/TheSlavePens/boss_ahune.cpp +++ b/src/server/scripts/Outland/CoilfangReservoir/TheSlavePens/boss_ahune.cpp @@ -309,7 +309,7 @@ public: void Initialize() { me->SetReactState(REACT_PASSIVE); - me->setRegeneratingHealth(false); + me->SetRegenerateHealth(false); DoCast(me, SPELL_FROZEN_CORE_GETS_HIT); DoCast(me, SPELL_ICE_SPEAR_AURA); } |