Entities/Unit: Nuke Map::ForceRespawn from orbit, with the following implications:

Port From (https://github.com/TrinityCore/TrinityCore/commit/2532de6acb7d73957a8fca44e7fc26160f47cc47)
This commit is contained in:
hondacrx
2021-12-27 16:29:29 -05:00
parent a693bed211
commit 828fafbcc8
7 changed files with 146 additions and 157 deletions
+35 -22
View File
@@ -1607,66 +1607,79 @@ namespace Game.Entities
return false;
}
public void DeleteFromDB()
public static bool DeleteFromDB(ulong spawnId)
{
if (m_spawnId == 0)
{
Log.outError(LogFilter.Unit, "Trying to delete not saved {0}", GetGUID().ToString(), GetEntry());
return;
}
GetMap().RemoveRespawnTime(SpawnObjectType.Creature, m_spawnId);
Global.ObjectMgr.DeleteCreatureData(m_spawnId);
CreatureData data = Global.ObjectMgr.GetCreatureData(spawnId);
if (data == null)
return false;
SQLTransaction trans = new();
Global.MapMgr.DoForAllMapsWithMapId(data.spawnPoint.GetMapId(), map =>
{
// despawn all active creatures, and remove their respawns
List<Creature> toUnload = new();
foreach (var creature in map.GetCreatureBySpawnIdStore().LookupByKey(spawnId))
toUnload.Add(creature);
foreach (Creature creature in toUnload)
map.AddObjectToRemoveList(creature);
map.RemoveRespawnTime(SpawnObjectType.Creature, spawnId, false, trans);
});
// delete data from memory ...
Global.ObjectMgr.DeleteCreatureData(spawnId);
DB.Characters.CommitTransaction(trans);
// ... and the database
trans = new();
PreparedStatement stmt = DB.World.GetPreparedStatement(WorldStatements.DEL_CREATURE);
stmt.AddValue(0, m_spawnId);
stmt.AddValue(0, spawnId);
trans.Append(stmt);
stmt = DB.World.GetPreparedStatement(WorldStatements.DEL_SPAWNGROUP_MEMBER);
stmt.AddValue(0, (byte)SpawnObjectType.Creature);
stmt.AddValue(1, m_spawnId);
stmt.AddValue(1, spawnId);
trans.Append(stmt);
stmt = DB.World.GetPreparedStatement(WorldStatements.DEL_CREATURE_ADDON);
stmt.AddValue(0, m_spawnId);
stmt.AddValue(0, spawnId);
trans.Append(stmt);
stmt = DB.World.GetPreparedStatement(WorldStatements.DEL_GAME_EVENT_CREATURE);
stmt.AddValue(0, m_spawnId);
stmt.AddValue(0, spawnId);
trans.Append(stmt);
stmt = DB.World.GetPreparedStatement(WorldStatements.DEL_GAME_EVENT_MODEL_EQUIP);
stmt.AddValue(0, m_spawnId);
stmt.AddValue(0, spawnId);
trans.Append(stmt);
stmt = DB.World.GetPreparedStatement(WorldStatements.DEL_LINKED_RESPAWN);
stmt.AddValue(0, m_spawnId);
stmt.AddValue(0, spawnId);
stmt.AddValue(1, (uint)CreatureLinkedRespawnType.CreatureToCreature);
trans.Append(stmt);
stmt = DB.World.GetPreparedStatement(WorldStatements.DEL_LINKED_RESPAWN);
stmt.AddValue(0, m_spawnId);
stmt.AddValue(0, spawnId);
stmt.AddValue(1, (uint)CreatureLinkedRespawnType.CreatureToGO);
trans.Append(stmt);
stmt = DB.World.GetPreparedStatement(WorldStatements.DEL_LINKED_RESPAWN_MASTER);
stmt.AddValue(0, m_spawnId);
stmt.AddValue(0, spawnId);
stmt.AddValue(1, (uint)CreatureLinkedRespawnType.CreatureToCreature);
trans.Append(stmt);
stmt = DB.World.GetPreparedStatement(WorldStatements.DEL_LINKED_RESPAWN_MASTER);
stmt.AddValue(0, m_spawnId);
stmt.AddValue(0, spawnId);
stmt.AddValue(1, (uint)CreatureLinkedRespawnType.GOToCreature);
trans.Append(stmt);
DB.World.CommitTransaction(trans);
// then delete any active instances of the creature
var spawnMap = GetMap().GetCreatureBySpawnIdStore().LookupByKey(m_spawnId);
foreach (var creature in spawnMap.ToList())
creature.AddObjectToRemoveList();
return true;
}
public override bool IsInvisibleDueToDespawn()
+32 -10
View File
@@ -1155,46 +1155,68 @@ namespace Game.Entities
return true;
}
public void DeleteFromDB()
public static bool DeleteFromDB(ulong spawnId)
{
GetMap().RemoveRespawnTime(SpawnObjectType.GameObject, m_spawnId);
Global.ObjectMgr.DeleteGameObjectData(m_spawnId);
GameObjectData data = Global.ObjectMgr.GetGameObjectData(spawnId);
if (data == null)
return false;
SQLTransaction trans = new();
Global.MapMgr.DoForAllMapsWithMapId(data.spawnPoint.GetMapId(), map =>
{
// despawn all active objects, and remove their respawns
List<GameObject> toUnload = new();
foreach (var creature in map.GetGameObjectBySpawnIdStore().LookupByKey(spawnId))
toUnload.Add(creature);
foreach (GameObject obj in toUnload)
map.AddObjectToRemoveList(obj);
map.RemoveRespawnTime(SpawnObjectType.GameObject, spawnId, false, trans);
});
// delete data from memory
Global.ObjectMgr.DeleteGameObjectData(spawnId);
trans = new();
// ... and the database
PreparedStatement stmt = DB.World.GetPreparedStatement(WorldStatements.DEL_GAMEOBJECT);
stmt.AddValue(0, m_spawnId);
stmt.AddValue(0, spawnId);
trans.Append(stmt);
stmt = DB.World.GetPreparedStatement(WorldStatements.DEL_EVENT_GAMEOBJECT);
stmt.AddValue(0, m_spawnId);
stmt.AddValue(0, spawnId);
trans.Append(stmt);
stmt = DB.World.GetPreparedStatement(WorldStatements.DEL_LINKED_RESPAWN);
stmt.AddValue(0, m_spawnId);
stmt.AddValue(0, spawnId);
stmt.AddValue(1, (uint)CreatureLinkedRespawnType.GOToGO);
trans.Append(stmt);
stmt = DB.World.GetPreparedStatement(WorldStatements.DEL_LINKED_RESPAWN);
stmt.AddValue(0, m_spawnId);
stmt.AddValue(0, spawnId);
stmt.AddValue(1, (uint)CreatureLinkedRespawnType.GOToCreature);
trans.Append(stmt);
stmt = DB.World.GetPreparedStatement(WorldStatements.DEL_LINKED_RESPAWN_MASTER);
stmt.AddValue(0, m_spawnId);
stmt.AddValue(0, spawnId);
stmt.AddValue(1, (uint)CreatureLinkedRespawnType.GOToGO);
trans.Append(stmt);
stmt = DB.World.GetPreparedStatement(WorldStatements.DEL_LINKED_RESPAWN_MASTER);
stmt.AddValue(0, m_spawnId);
stmt.AddValue(0, spawnId);
stmt.AddValue(1, (uint)CreatureLinkedRespawnType.CreatureToGO);
trans.Append(stmt);
stmt = DB.World.GetPreparedStatement(WorldStatements.DEL_GAMEOBJECT_ADDON);
stmt.AddValue(0, m_spawnId);
stmt.AddValue(0, spawnId);
trans.Append(stmt);
DB.World.CommitTransaction(trans);
return true;
}
public override bool HasQuest(uint quest_id)