diff options
author | xinef1 <w.szyszko2@gmail.com> | 2017-03-02 00:19:28 +0100 |
---|---|---|
committer | Shauren <shauren.trinity@gmail.com> | 2019-08-17 20:04:14 +0200 |
commit | 98180ecdc179386270e93b80c0db8344b659557f (patch) | |
tree | cc00d9d29b29d37e1997e537efc05c7bfa07a6c0 /src/server/game | |
parent | 6cd254d83b51d25551536122ea0217df447b2cf3 (diff) |
Core/GameObject: regenerate GO loot if respawn time passed since last loot generation time and not all items were taken (#19101)
(cherrypicked from 7011aabb56f061fc889ec42ce32b7605ceb35b53)
Diffstat (limited to 'src/server/game')
-rw-r--r-- | src/server/game/Entities/GameObject/GameObject.cpp | 1 | ||||
-rw-r--r-- | src/server/game/Entities/GameObject/GameObject.h | 3 | ||||
-rw-r--r-- | src/server/game/Entities/Player/Player.cpp | 6 |
3 files changed, 10 insertions, 0 deletions
diff --git a/src/server/game/Entities/GameObject/GameObject.cpp b/src/server/game/Entities/GameObject/GameObject.cpp index 1d294a1528c..7b38072a9e5 100644 --- a/src/server/game/Entities/GameObject/GameObject.cpp +++ b/src/server/game/Entities/GameObject/GameObject.cpp @@ -127,6 +127,7 @@ GameObject::GameObject() : WorldObject(false), MapObject(), m_spawnId = UI64LIT(0); m_groupLootTimer = 0; + m_lootGenerationTime = 0; ResetLootMode(); // restore default loot mode m_stationaryPosition.Relocate(0.0f, 0.0f, 0.0f, 0.0f); diff --git a/src/server/game/Entities/GameObject/GameObject.h b/src/server/game/Entities/GameObject/GameObject.h index a22b637f07f..13b1ede4bba 100644 --- a/src/server/game/Entities/GameObject/GameObject.h +++ b/src/server/game/Entities/GameObject/GameObject.h @@ -209,6 +209,8 @@ class TC_GAME_API GameObject : public WorldObject, public GridObject<GameObject> void AddLootMode(uint16 lootMode) { m_LootMode |= lootMode; } void RemoveLootMode(uint16 lootMode) { m_LootMode &= ~lootMode; } void ResetLootMode() { m_LootMode = LOOT_MODE_DEFAULT; } + void SetLootGenerationTime() { m_lootGenerationTime = time(nullptr); } + uint32 GetLootGenerationTime() const { return m_lootGenerationTime; } void AddToSkillupList(ObjectGuid const& PlayerGuidLow) { m_SkillupList.insert(PlayerGuidLow); } bool IsInSkillupList(ObjectGuid const& playerGuid) const @@ -347,6 +349,7 @@ class TC_GAME_API GameObject : public WorldObject, public GridObject<GameObject> ObjectGuid m_lootRecipient; ObjectGuid m_lootRecipientGroup; uint16 m_LootMode; // bitmask, default LOOT_MODE_DEFAULT, determines what loot will be lootable + uint32 m_lootGenerationTime; ObjectGuid m_linkedTrap; diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 21a36c1cdf4..89c6ea7d2ce 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -8363,6 +8363,11 @@ void Player::SendLoot(ObjectGuid guid, LootType loot_type, bool aeLooting/* = fa loot = &go->loot; + // loot was generated and respawntime has passed since then, allow to recreate loot + // to avoid bugs, this rule covers spawned gameobjects only + if (go->isSpawnedByDefault() && go->getLootState() == GO_ACTIVATED && !go->loot.isLooted() && go->GetLootGenerationTime() + go->GetRespawnDelay() < time(nullptr)) + go->SetLootState(GO_READY); + if (go->getLootState() == GO_READY) { uint32 lootid = go->GetGOInfo()->GetLootId(); @@ -8385,6 +8390,7 @@ void Player::SendLoot(ObjectGuid guid, LootType loot_type, bool aeLooting/* = fa group->UpdateLooterGuid(go, true); loot->FillLoot(lootid, LootTemplates_Gameobject, this, !groupRules, false, go->GetLootMode()); + go->SetLootGenerationTime(); // get next RR player (for next loot) if (groupRules && !go->loot.empty()) |