From 2b1e8d135bd3f3a3ddf7f29471cf6116da223175 Mon Sep 17 00:00:00 2001 From: Wyrserth Date: Wed, 26 Jun 2019 18:28:08 +0200 Subject: Core/GameObject: don't allow non-consumable goobers to despawn on use (#23469) Closes #15730. --- src/server/game/Entities/GameObject/GameObject.cpp | 27 +++++++++++----------- 1 file changed, 13 insertions(+), 14 deletions(-) (limited to 'src') diff --git a/src/server/game/Entities/GameObject/GameObject.cpp b/src/server/game/Entities/GameObject/GameObject.cpp index a0b64f7ba09..6ae18712ca6 100644 --- a/src/server/game/Entities/GameObject/GameObject.cpp +++ b/src/server/game/Entities/GameObject/GameObject.cpp @@ -767,23 +767,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 spell - //! The GetOwnerGUID() check is mostly for compatibility with hacky scripts - 99% of the time summoning should be done trough spells. - if (GetSpellId() || GetOwnerGUID()) + // 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); -- cgit v1.2.3