diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/server/game/Entities/Creature/Creature.cpp | 61 | ||||
-rw-r--r-- | src/server/game/Entities/Creature/Creature.h | 1 | ||||
-rw-r--r-- | src/server/game/Movement/MovementGenerators/HomeMovementGenerator.cpp | 1 |
3 files changed, 38 insertions, 25 deletions
diff --git a/src/server/game/Entities/Creature/Creature.cpp b/src/server/game/Entities/Creature/Creature.cpp index 6334b4ea339..b1225d1be5d 100644 --- a/src/server/game/Entities/Creature/Creature.cpp +++ b/src/server/game/Entities/Creature/Creature.cpp @@ -1384,6 +1384,7 @@ bool Creature::LoadCreatureFromDB(ObjectGuid::LowType spawnId, Map* map, bool ad } m_spawnId = spawnId; + m_creatureData = data; if (!Create(map->GenerateLowGuid<HighGuid::Creature>(), map, data->phaseMask, data->id, data->posX, data->posY, data->posZ, data->orientation, data)) return false; @@ -1407,32 +1408,11 @@ bool Creature::LoadCreatureFromDB(ObjectGuid::LowType spawnId, Map* map, bool ad } } - uint32 curhealth; - - if (!m_regenHealth) - { - curhealth = data->curhealth; - if (curhealth) - { - curhealth = uint32(curhealth*_GetHealthMod(GetCreatureTemplate()->rank)); - if (curhealth < 1) - curhealth = 1; - } - SetPower(POWER_MANA, data->curmana); - } - else - { - curhealth = GetMaxHealth(); - SetPower(POWER_MANA, GetMaxPower(POWER_MANA)); - } - - SetHealth(m_deathState == ALIVE ? curhealth : 0); + SetSpawnHealth(); // checked at creature_template loading m_defaultMovementType = MovementGeneratorType(data->movementType); - m_creatureData = data; - loot.SetGUID(ObjectGuid::Create<HighGuid::LootObject>(data->mapid, data->id, GetMap()->GenerateLowGuid<HighGuid::LootObject>())); if (addToMap && !GetMap()->AddToMap(this)) @@ -1469,6 +1449,35 @@ void Creature::LoadEquipment(int8 id, bool force /*= true*/) SetVirtualItem(i, einfo->ItemEntry[i]); } +void Creature::SetSpawnHealth() +{ + uint32 curhealth; + + if (!m_regenHealth) + { + if (m_creatureData) + { + curhealth = m_creatureData->curhealth; + if (curhealth) + { + curhealth = uint32(curhealth*_GetHealthMod(GetCreatureTemplate()->rank)); + if (curhealth < 1) + curhealth = 1; + } + SetPower(POWER_MANA, m_creatureData->curmana); + } + else + curhealth = GetHealth(); + } + else + { + curhealth = GetMaxHealth(); + SetPower(POWER_MANA, GetMaxPower(POWER_MANA)); + } + + SetHealth((m_deathState == ALIVE || m_deathState == JUST_RESPAWNED) ? curhealth : 0); +} + bool Creature::hasQuest(uint32 quest_id) const { QuestRelationBounds qr = sObjectMgr->GetCreatureQuestRelationBounds(GetEntry()); @@ -1680,9 +1689,11 @@ void Creature::setDeathState(DeathState s) } else if (s == JUST_RESPAWNED) { - //if (IsPet()) - // setActive(true); - SetFullHealth(); + if (IsPet()) + SetFullHealth(); + else + SetSpawnHealth(); + SetLootRecipient(nullptr); ResetPlayerDamageReq(); diff --git a/src/server/game/Entities/Creature/Creature.h b/src/server/game/Entities/Creature/Creature.h index 1b394aa897d..57d5c3447f5 100644 --- a/src/server/game/Entities/Creature/Creature.h +++ b/src/server/game/Entities/Creature/Creature.h @@ -712,6 +712,7 @@ class TC_GAME_API Creature : public Unit, public GridObject<Creature>, public Ma bool LoadCreaturesAddon(); void SelectLevel(); void LoadEquipment(int8 id = 1, bool force = false); + void SetSpawnHealth(); ObjectGuid::LowType GetSpawnId() const { return m_spawnId; } diff --git a/src/server/game/Movement/MovementGenerators/HomeMovementGenerator.cpp b/src/server/game/Movement/MovementGenerators/HomeMovementGenerator.cpp index 5503c27d360..002e247dc14 100644 --- a/src/server/game/Movement/MovementGenerators/HomeMovementGenerator.cpp +++ b/src/server/game/Movement/MovementGenerators/HomeMovementGenerator.cpp @@ -34,6 +34,7 @@ void HomeMovementGenerator<Creature>::DoFinalize(Creature* owner) owner->ClearUnitState(UNIT_STATE_EVADE); owner->SetWalk(true); owner->LoadCreaturesAddon(); + owner->SetSpawnHealth(); owner->AI()->JustReachedHome(); } } |