aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWyrserth <wyrserth@protonmail.com>2019-06-26 18:28:08 +0200
committerGitHub <noreply@github.com>2019-06-26 18:28:08 +0200
commit2b1e8d135bd3f3a3ddf7f29471cf6116da223175 (patch)
treeab1a460c4e873c629f615e35b7dacbe5960d044c
parentefc999227d87398b25e04a3fba881c27de8135f3 (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.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 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);