aboutsummaryrefslogtreecommitdiff
path: root/src/server/game
diff options
context:
space:
mode:
authorTreeston <treeston.mmoc@gmail.com>2017-08-02 22:05:40 +0200
committerTreeston <treeston.mmoc@gmail.com>2017-08-02 22:05:40 +0200
commit759357049cdbe9a2f97bbab6e61299cd65ba1bec (patch)
tree46e1547a07ca64206b9548ad0f22dcef3bef33c2 /src/server/game
parentc70b328eda8331a32b3fc7cc08af5e8b004d0705 (diff)
Scripts/Commands: Fix some quirkiness and potential crashes with live DB modification commands (npc move and npc delete), which are horrible and should be deleted anyway.
Fixes #20104.
Diffstat (limited to 'src/server/game')
-rw-r--r--src/server/game/Entities/Creature/Creature.cpp9
1 files changed, 9 insertions, 0 deletions
diff --git a/src/server/game/Entities/Creature/Creature.cpp b/src/server/game/Entities/Creature/Creature.cpp
index bcca31ed94e..e500d575ab0 100644
--- a/src/server/game/Entities/Creature/Creature.cpp
+++ b/src/server/game/Entities/Creature/Creature.cpp
@@ -1612,9 +1612,13 @@ void Creature::DeleteFromDB()
return;
}
+ // remove any scheduled respawns
GetMap()->RemoveRespawnTime(SPAWN_TYPE_CREATURE, m_spawnId);
+
+ // delete data from memory
sObjectMgr->DeleteCreatureData(m_spawnId);
+ // delete data and all its associations from DB
SQLTransaction trans = WorldDatabase.BeginTransaction();
PreparedStatement* stmt = WorldDatabase.GetPreparedStatement(WORLD_DEL_CREATURE);
@@ -1639,6 +1643,11 @@ void Creature::DeleteFromDB()
trans->Append(stmt);
WorldDatabase.CommitTransaction(trans);
+
+ // then delete any active instances of the creature
+ auto const& range = GetMap()->GetCreatureBySpawnIdStore().equal_range(m_spawnId);
+ for (auto it = range.first; it != range.second; ++it)
+ it->second->AddObjectToRemoveList();
}
bool Creature::IsInvisibleDueToDespawn() const