aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/server/game/Entities/GameObject/GameObject.cpp27
1 files changed, 13 insertions, 14 deletions
diff --git a/src/server/game/Entities/GameObject/GameObject.cpp b/src/server/game/Entities/GameObject/GameObject.cpp
index e37da862727..4ed6f10538e 100644
--- a/src/server/game/Entities/GameObject/GameObject.cpp
+++ b/src/server/game/Entities/GameObject/GameObject.cpp
@@ -892,23 +892,22 @@ void GameObject::Update(uint32 diff)
loot.clear();
- //! If this is summoned by a spell with ie. SPELL_EFFECT_SUMMON_OBJECT_WILD, with or without owner, we check respawn criteria based on speSendObjectDeSpawnAnim(GetGUID());ll
- //! The GetOwnerGUID() check is mostly for compatibility with hacky scripts - 99% of the time summoning should be done trough spells.
- if (GetSpellId() || !GetOwnerGUID().IsEmpty())
+ // Do not delete gameobjects that are not consumed on loot, while still allowing them to despawn when they expire if summoned
+ bool isSummonedAndExpired = (GetOwner() || GetSpellId()) && m_respawnTime == 0;
+ bool isPermanentSpawn = m_respawnDelayTime == 0;
+ if (!GetGOInfo()->IsDespawnAtAction() &&
+ ((GetGoType() == GAMEOBJECT_TYPE_GOOBER && (!isSummonedAndExpired || isPermanentSpawn)) ||
+ (GetGoType() == GAMEOBJECT_TYPE_CHEST && !isSummonedAndExpired))) // ToDo: chests with data2 (chestRestockTime) > 0 and data3 (consumable) = 0 should not despawn on loot
{
- //Don't delete spell spawned chests, which are not consumed on loot
- if (m_respawnTime > 0 && GetGoType() == GAMEOBJECT_TYPE_CHEST && !GetGOInfo()->IsDespawnAtAction())
- {
- UpdateObjectVisibility();
- SetLootState(GO_READY);
- }
- else
- {
- SetRespawnTime(0);
- Delete();
- }
+ SetLootState(GO_READY);
+ UpdateObjectVisibility();
return;
}
+ else
+ {
+ SetRespawnTime(0);
+ Delete();
+ }
SetLootState(GO_NOT_READY);