diff options
author | ccrs <ccrs@users.noreply.github.com> | 2017-08-21 20:28:18 +0200 |
---|---|---|
committer | ccrs <ccrs@users.noreply.github.com> | 2017-08-21 20:28:18 +0200 |
commit | 91c0d49c188977c3d797f5749b1204612ce50195 (patch) | |
tree | e9b0eeb53a55666a9be0a057c41599ead00363f6 /src | |
parent | 5f8ee9a01eee5f80d1186b3ff932fe30505eea49 (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
Diffstat (limited to 'src')
10 files changed, 30 insertions, 30 deletions
diff --git a/src/server/game/AI/SmartScripts/SmartScript.cpp b/src/server/game/AI/SmartScripts/SmartScript.cpp index 7f002ed6671..da129242cc2 100644 --- a/src/server/game/AI/SmartScripts/SmartScript.cpp +++ b/src/server/game/AI/SmartScripts/SmartScript.cpp @@ -1900,7 +1900,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 9a2c210b92e..b430a7b161a 100644 --- a/src/server/game/Entities/Creature/Creature.cpp +++ b/src/server/game/Entities/Creature/Creature.cpp @@ -233,14 +233,12 @@ bool ForcedDespawnDelayEvent::Execute(uint64 /*e_time*/, uint32 /*p_time*/) return true; } -Creature::Creature(bool isWorldObject): Unit(isWorldObject), MapObject(), -m_groupLootTimer(0), lootingGroupLowGUID(0), m_PlayerDamageReq(0), -m_lootRecipient(), m_lootRecipientGroup(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(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), lootingGroupLowGUID(0), m_PlayerDamageReq(0), m_lootRecipient(), m_lootRecipientGroup(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(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; m_valuesCount = UNIT_END; @@ -533,7 +531,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()) @@ -801,7 +799,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 @@ -889,7 +887,7 @@ void Creature::Regenerate(Powers power) void Creature::RegenerateHealth() { - if (!isRegeneratingHealth()) + if (!CanRegenerateHealth()) return; uint32 curValue = GetHealth(); @@ -1599,8 +1597,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 2f8da928057..a76bfbfb280 100644 --- a/src/server/game/Entities/Creature/Creature.h +++ b/src/server/game/Entities/Creature/Creature.h @@ -266,8 +266,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; @@ -382,7 +382,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; @@ -425,6 +424,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 498cdf04876..133de699e84 100644 --- a/src/server/game/Movement/MovementGenerators/HomeMovementGenerator.cpp +++ b/src/server/game/Movement/MovementGenerators/HomeMovementGenerator.cpp @@ -83,11 +83,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 065448261b7..909d80674a5 100644 --- a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kalecgos.cpp +++ b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kalecgos.cpp @@ -311,7 +311,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/Northrend/IcecrownCitadel/boss_icecrown_gunship_battle.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_icecrown_gunship_battle.cpp index 41b836922e1..e344a3181fc 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_icecrown_gunship_battle.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_icecrown_gunship_battle.cpp @@ -550,7 +550,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 @@ -676,7 +676,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 @@ -857,7 +857,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); @@ -1126,7 +1126,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 00ae6f609ed..41985059aae 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_razorscale.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_razorscale.cpp @@ -873,7 +873,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 4fda1d7abf6..3ead66593a6 100644 --- a/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_skadi.cpp +++ b/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_skadi.cpp @@ -342,7 +342,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 b7f60c8e9d2..ab3b83857d8 100644 --- a/src/server/scripts/Northrend/zone_icecrown.cpp +++ b/src/server/scripts/Northrend/zone_icecrown.cpp @@ -433,7 +433,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 c5bb049d443..b7d7c10f6c7 100644 --- a/src/server/scripts/Outland/CoilfangReservoir/TheSlavePens/boss_ahune.cpp +++ b/src/server/scripts/Outland/CoilfangReservoir/TheSlavePens/boss_ahune.cpp @@ -308,7 +308,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); } |