diff options
author | Wyrserth <wyrserth@protonmail.com> | 2019-06-26 18:28:08 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-06-26 18:28:08 +0200 |
commit | 2b1e8d135bd3f3a3ddf7f29471cf6116da223175 (patch) | |
tree | ab1a460c4e873c629f615e35b7dacbe5960d044c | |
parent | efc999227d87398b25e04a3fba881c27de8135f3 (diff) |
Core/GameObject: don't allow non-consumable goobers to despawn on use (#23469)
Closes #15730.
-rw-r--r-- | src/server/game/Entities/GameObject/GameObject.cpp | 27 |
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 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); |