Fix(Core/Gameobjects): non-consumable goobers no longer despawn on use (#2750)

Taken from 50c5d30d13 & 2b1e8d135b


Co-authored-by: Wyrserth <wyrserth@protonmail.com>
This commit is contained in:
Kitzunu
2020-03-21 22:29:52 +01:00
committed by GitHub
parent 3cf3f69e13
commit 0521a314b5

View File

@@ -702,13 +702,21 @@ 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 && GetGOInfo()->chest.chestRestockTime == 0))) // ToDo: chests with data2 (chestRestockTime) > 0 and data3 (consumable) = 0 should not despawn on loot
{
SetLootState(GO_READY);
UpdateObjectVisibility();
return;
}
else
{
SetRespawnTime(0);
Delete();
return;
}
SetLootState(GO_READY);