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
+21 -25
View File
@@ -69,39 +69,35 @@ namespace Game.Chat
if (string.IsNullOrEmpty(id)) if (string.IsNullOrEmpty(id))
return false; return false;
if (!ulong.TryParse(id, out ulong guidLow) || guidLow == 0) if (!ulong.TryParse(id, out ulong spawnId) || spawnId == 0)
return false; return false;
Player player = handler.GetSession().GetPlayer(); GameObject obj = handler.GetObjectFromPlayerMapByDbGuid(spawnId);
// force respawn to make sure we find something if (obj != null)
player.GetMap().ForceRespawn(SpawnObjectType.GameObject, guidLow);
GameObject obj = handler.GetObjectFromPlayerMapByDbGuid(guidLow);
if (!obj)
{ {
handler.SendSysMessage(CypherStrings.CommandObjnotfound, guidLow); Player player = handler.GetSession().GetPlayer();
return false; ObjectGuid ownerGuid = obj.GetOwnerGUID();
} if (!ownerGuid.IsEmpty())
ObjectGuid ownerGuid = obj.GetOwnerGUID();
if (!ownerGuid.IsEmpty())
{
Unit owner = Global.ObjAccessor.GetUnit(player, ownerGuid);
if (!owner || !ownerGuid.IsPlayer())
{ {
handler.SendSysMessage(CypherStrings.CommandDelobjrefercreature, ownerGuid.ToString(), obj.GetGUID().ToString()); Unit owner = Global.ObjAccessor.GetUnit(player, ownerGuid);
return false; if (!owner || !ownerGuid.IsPlayer())
} {
handler.SendSysMessage(CypherStrings.CommandDelobjrefercreature, ownerGuid.ToString(), obj.GetGUID().ToString());
return false;
}
owner.RemoveGameObject(obj, false); owner.RemoveGameObject(obj, false);
}
} }
obj.SetRespawnTime(0); // not save respawn time if (GameObject.DeleteFromDB(spawnId))
obj.Delete(); {
obj.DeleteFromDB(); handler.SendSysMessage(CypherStrings.CommandDelobjmessage, spawnId);
return true;
}
handler.SendSysMessage(CypherStrings.CommandDelobjmessage, obj.GetGUID().ToString()); handler.SendSysMessage(CypherStrings.CommandObjnotfound, obj.GetGUID().ToString());
return false;
return true;
} }
[Command("despawngroup", RBACPermissions.CommandGobjectDespawngroup)] [Command("despawngroup", RBACPermissions.CommandGobjectDespawngroup)]
+23 -21
View File
@@ -869,7 +869,7 @@ namespace Game.Chat
[Command("", RBACPermissions.CommandNpcDelete)] [Command("", RBACPermissions.CommandNpcDelete)]
static bool HandleNpcDeleteCommand(StringArguments args, CommandHandler handler) static bool HandleNpcDeleteCommand(StringArguments args, CommandHandler handler)
{ {
Creature creature; ulong spawnId;
if (!args.Empty()) if (!args.Empty())
{ {
@@ -881,34 +881,36 @@ namespace Game.Chat
if (!ulong.TryParse(cId, out ulong guidLow) || guidLow == 0) if (!ulong.TryParse(cId, out ulong guidLow) || guidLow == 0)
return false; return false;
// force respawn to make sure we find something spawnId = guidLow;
handler.GetSession().GetPlayer().GetMap().ForceRespawn(SpawnObjectType.Creature, guidLow);
// then try to find it
creature = handler.GetCreatureFromPlayerMapByDbGuid(guidLow);
} }
else else
creature = handler.GetSelectedCreature();
if (!creature || creature.IsPet() || creature.IsTotem())
{ {
handler.SendSysMessage(CypherStrings.SelectCreature); Creature creature = handler.GetSelectedCreature();
return false;
if (!creature || creature.IsPet() || creature.IsTotem())
{
handler.SendSysMessage(CypherStrings.SelectCreature);
return false;
}
TempSummon summon = creature.ToTempSummon();
if (summon != null)
{
summon.UnSummon();
handler.SendSysMessage(CypherStrings.CommandDelcreatmessage);
return true;
}
spawnId = creature.GetSpawnId();
} }
TempSummon summon = creature.ToTempSummon(); if (Creature.DeleteFromDB(spawnId))
if (summon != null)
summon.UnSummon();
else
{ {
// Delete the creature handler.SendSysMessage(CypherStrings.CommandDelcreatmessage);
creature.CombatStop(); return true;
creature.DeleteFromDB();
creature.AddObjectToRemoveList();
} }
handler.SendSysMessage(CypherStrings.CommandDelcreatmessage); handler.SendSysMessage(CypherStrings.CommandCreatguidnotfound, spawnId);
return false;
return true;
} }
[Command("item", RBACPermissions.CommandNpcDeleteItem)] [Command("item", RBACPermissions.CommandNpcDeleteItem)]
+25 -38
View File
@@ -512,21 +512,27 @@ namespace Game.Chat.Commands
{ {
handler.SendSysMessage("|cff00ff00DEBUG: wp modify del, PathID: |r|cff00ffff{0}|r", pathid); handler.SendSysMessage("|cff00ff00DEBUG: wp modify del, PathID: |r|cff00ffff{0}|r", pathid);
target.DeleteFromDB(); if (Creature.DeleteFromDB(target.GetSpawnId()))
target.AddObjectToRemoveList(); {
stmt = DB.World.GetPreparedStatement(WorldStatements.DEL_WAYPOINT_DATA); stmt = DB.World.GetPreparedStatement(WorldStatements.DEL_WAYPOINT_DATA);
stmt.AddValue(0, pathid); stmt.AddValue(0, pathid);
stmt.AddValue(1, point); stmt.AddValue(1, point);
DB.World.Execute(stmt); DB.World.Execute(stmt);
stmt = DB.World.GetPreparedStatement(WorldStatements.UPD_WAYPOINT_DATA_POINT); stmt = DB.World.GetPreparedStatement(WorldStatements.UPD_WAYPOINT_DATA_POINT);
stmt.AddValue(0, pathid); stmt.AddValue(0, pathid);
stmt.AddValue(1, point); stmt.AddValue(1, point);
DB.World.Execute(stmt); DB.World.Execute(stmt);
handler.SendSysMessage(CypherStrings.WaypointRemoved); handler.SendSysMessage(CypherStrings.WaypointRemoved);
return true; return true;
}
else
{
handler.SendSysMessage(CypherStrings.WaypointNotremoved);
return false;
}
} // del } // del
if (show == "move") if (show == "move")
@@ -538,8 +544,11 @@ namespace Game.Chat.Commands
// What to do: // What to do:
// Move the visual spawnpoint // Move the visual spawnpoint
// Respawn the owner of the waypoints // Respawn the owner of the waypoints
target.DeleteFromDB(); if (!Creature.DeleteFromDB(target.GetSpawnId()))
target.AddObjectToRemoveList(); {
handler.SendSysMessage(CypherStrings.WaypointVpNotcreated, 1);
return false;
}
// re-create // re-create
Creature creature = Creature.CreateCreature(1, map, chr.GetPosition()); Creature creature = Creature.CreateCreature(1, map, chr.GetPosition());
@@ -721,21 +730,10 @@ namespace Game.Chat.Commands
{ {
ulong wpguid = result2.Read<ulong>(0); ulong wpguid = result2.Read<ulong>(0);
Creature creature = handler.GetCreatureFromPlayerMapByDbGuid(wpguid); if (!Creature.DeleteFromDB(wpguid))
if (!creature)
{ {
handler.SendSysMessage(CypherStrings.WaypointNotremoved, wpguid); handler.SendSysMessage(CypherStrings.WaypointNotremoved, wpguid);
hasError = true; hasError = true;
stmt = DB.World.GetPreparedStatement(WorldStatements.DEL_CREATURE);
stmt.AddValue(0, wpguid);
DB.World.Execute(stmt);
}
else
{
creature.CombatStop();
creature.DeleteFromDB();
creature.AddObjectToRemoveList();
} }
} }
@@ -931,21 +929,10 @@ namespace Game.Chat.Commands
{ {
ulong lowguid = result.Read<ulong>(0); ulong lowguid = result.Read<ulong>(0);
Creature creature = handler.GetCreatureFromPlayerMapByDbGuid(lowguid); if (!Creature.DeleteFromDB(lowguid))
if (!creature)
{ {
handler.SendSysMessage(CypherStrings.WaypointNotremoved, lowguid); handler.SendSysMessage(CypherStrings.WaypointNotremoved, lowguid);
hasError = true; hasError = true;
stmt = DB.World.GetPreparedStatement(WorldStatements.DEL_CREATURE);
stmt.AddValue(0, lowguid);
DB.World.Execute(stmt);
}
else
{
creature.CombatStop();
creature.DeleteFromDB();
creature.AddObjectToRemoveList();
} }
} }
while (result.NextRow()); while (result.NextRow());
+35 -22
View File
@@ -1607,66 +1607,79 @@ namespace Game.Entities
return false; return false;
} }
public void DeleteFromDB() public static bool DeleteFromDB(ulong spawnId)
{ {
if (m_spawnId == 0) CreatureData data = Global.ObjectMgr.GetCreatureData(spawnId);
{ if (data == null)
Log.outError(LogFilter.Unit, "Trying to delete not saved {0}", GetGUID().ToString(), GetEntry()); return false;
return;
}
GetMap().RemoveRespawnTime(SpawnObjectType.Creature, m_spawnId);
Global.ObjectMgr.DeleteCreatureData(m_spawnId);
SQLTransaction trans = new(); 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); PreparedStatement stmt = DB.World.GetPreparedStatement(WorldStatements.DEL_CREATURE);
stmt.AddValue(0, m_spawnId); stmt.AddValue(0, spawnId);
trans.Append(stmt); trans.Append(stmt);
stmt = DB.World.GetPreparedStatement(WorldStatements.DEL_SPAWNGROUP_MEMBER); stmt = DB.World.GetPreparedStatement(WorldStatements.DEL_SPAWNGROUP_MEMBER);
stmt.AddValue(0, (byte)SpawnObjectType.Creature); stmt.AddValue(0, (byte)SpawnObjectType.Creature);
stmt.AddValue(1, m_spawnId); stmt.AddValue(1, spawnId);
trans.Append(stmt); trans.Append(stmt);
stmt = DB.World.GetPreparedStatement(WorldStatements.DEL_CREATURE_ADDON); stmt = DB.World.GetPreparedStatement(WorldStatements.DEL_CREATURE_ADDON);
stmt.AddValue(0, m_spawnId); stmt.AddValue(0, spawnId);
trans.Append(stmt); trans.Append(stmt);
stmt = DB.World.GetPreparedStatement(WorldStatements.DEL_GAME_EVENT_CREATURE); stmt = DB.World.GetPreparedStatement(WorldStatements.DEL_GAME_EVENT_CREATURE);
stmt.AddValue(0, m_spawnId); stmt.AddValue(0, spawnId);
trans.Append(stmt); trans.Append(stmt);
stmt = DB.World.GetPreparedStatement(WorldStatements.DEL_GAME_EVENT_MODEL_EQUIP); stmt = DB.World.GetPreparedStatement(WorldStatements.DEL_GAME_EVENT_MODEL_EQUIP);
stmt.AddValue(0, m_spawnId); stmt.AddValue(0, spawnId);
trans.Append(stmt); trans.Append(stmt);
stmt = DB.World.GetPreparedStatement(WorldStatements.DEL_LINKED_RESPAWN); stmt = DB.World.GetPreparedStatement(WorldStatements.DEL_LINKED_RESPAWN);
stmt.AddValue(0, m_spawnId); stmt.AddValue(0, spawnId);
stmt.AddValue(1, (uint)CreatureLinkedRespawnType.CreatureToCreature); stmt.AddValue(1, (uint)CreatureLinkedRespawnType.CreatureToCreature);
trans.Append(stmt); trans.Append(stmt);
stmt = DB.World.GetPreparedStatement(WorldStatements.DEL_LINKED_RESPAWN); stmt = DB.World.GetPreparedStatement(WorldStatements.DEL_LINKED_RESPAWN);
stmt.AddValue(0, m_spawnId); stmt.AddValue(0, spawnId);
stmt.AddValue(1, (uint)CreatureLinkedRespawnType.CreatureToGO); stmt.AddValue(1, (uint)CreatureLinkedRespawnType.CreatureToGO);
trans.Append(stmt); trans.Append(stmt);
stmt = DB.World.GetPreparedStatement(WorldStatements.DEL_LINKED_RESPAWN_MASTER); stmt = DB.World.GetPreparedStatement(WorldStatements.DEL_LINKED_RESPAWN_MASTER);
stmt.AddValue(0, m_spawnId); stmt.AddValue(0, spawnId);
stmt.AddValue(1, (uint)CreatureLinkedRespawnType.CreatureToCreature); stmt.AddValue(1, (uint)CreatureLinkedRespawnType.CreatureToCreature);
trans.Append(stmt); trans.Append(stmt);
stmt = DB.World.GetPreparedStatement(WorldStatements.DEL_LINKED_RESPAWN_MASTER); stmt = DB.World.GetPreparedStatement(WorldStatements.DEL_LINKED_RESPAWN_MASTER);
stmt.AddValue(0, m_spawnId); stmt.AddValue(0, spawnId);
stmt.AddValue(1, (uint)CreatureLinkedRespawnType.GOToCreature); stmt.AddValue(1, (uint)CreatureLinkedRespawnType.GOToCreature);
trans.Append(stmt); trans.Append(stmt);
DB.World.CommitTransaction(trans); DB.World.CommitTransaction(trans);
// then delete any active instances of the creature return true;
var spawnMap = GetMap().GetCreatureBySpawnIdStore().LookupByKey(m_spawnId);
foreach (var creature in spawnMap.ToList())
creature.AddObjectToRemoveList();
} }
public override bool IsInvisibleDueToDespawn() public override bool IsInvisibleDueToDespawn()
+32 -10
View File
@@ -1155,46 +1155,68 @@ namespace Game.Entities
return true; return true;
} }
public void DeleteFromDB() public static bool DeleteFromDB(ulong spawnId)
{ {
GetMap().RemoveRespawnTime(SpawnObjectType.GameObject, m_spawnId); GameObjectData data = Global.ObjectMgr.GetGameObjectData(spawnId);
Global.ObjectMgr.DeleteGameObjectData(m_spawnId); if (data == null)
return false;
SQLTransaction trans = new(); 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); PreparedStatement stmt = DB.World.GetPreparedStatement(WorldStatements.DEL_GAMEOBJECT);
stmt.AddValue(0, m_spawnId); stmt.AddValue(0, spawnId);
trans.Append(stmt); trans.Append(stmt);
stmt = DB.World.GetPreparedStatement(WorldStatements.DEL_EVENT_GAMEOBJECT); stmt = DB.World.GetPreparedStatement(WorldStatements.DEL_EVENT_GAMEOBJECT);
stmt.AddValue(0, m_spawnId); stmt.AddValue(0, spawnId);
trans.Append(stmt); trans.Append(stmt);
stmt = DB.World.GetPreparedStatement(WorldStatements.DEL_LINKED_RESPAWN); stmt = DB.World.GetPreparedStatement(WorldStatements.DEL_LINKED_RESPAWN);
stmt.AddValue(0, m_spawnId); stmt.AddValue(0, spawnId);
stmt.AddValue(1, (uint)CreatureLinkedRespawnType.GOToGO); stmt.AddValue(1, (uint)CreatureLinkedRespawnType.GOToGO);
trans.Append(stmt); trans.Append(stmt);
stmt = DB.World.GetPreparedStatement(WorldStatements.DEL_LINKED_RESPAWN); stmt = DB.World.GetPreparedStatement(WorldStatements.DEL_LINKED_RESPAWN);
stmt.AddValue(0, m_spawnId); stmt.AddValue(0, spawnId);
stmt.AddValue(1, (uint)CreatureLinkedRespawnType.GOToCreature); stmt.AddValue(1, (uint)CreatureLinkedRespawnType.GOToCreature);
trans.Append(stmt); trans.Append(stmt);
stmt = DB.World.GetPreparedStatement(WorldStatements.DEL_LINKED_RESPAWN_MASTER); stmt = DB.World.GetPreparedStatement(WorldStatements.DEL_LINKED_RESPAWN_MASTER);
stmt.AddValue(0, m_spawnId); stmt.AddValue(0, spawnId);
stmt.AddValue(1, (uint)CreatureLinkedRespawnType.GOToGO); stmt.AddValue(1, (uint)CreatureLinkedRespawnType.GOToGO);
trans.Append(stmt); trans.Append(stmt);
stmt = DB.World.GetPreparedStatement(WorldStatements.DEL_LINKED_RESPAWN_MASTER); stmt = DB.World.GetPreparedStatement(WorldStatements.DEL_LINKED_RESPAWN_MASTER);
stmt.AddValue(0, m_spawnId); stmt.AddValue(0, spawnId);
stmt.AddValue(1, (uint)CreatureLinkedRespawnType.CreatureToGO); stmt.AddValue(1, (uint)CreatureLinkedRespawnType.CreatureToGO);
trans.Append(stmt); trans.Append(stmt);
stmt = DB.World.GetPreparedStatement(WorldStatements.DEL_GAMEOBJECT_ADDON); stmt = DB.World.GetPreparedStatement(WorldStatements.DEL_GAMEOBJECT_ADDON);
stmt.AddValue(0, m_spawnId); stmt.AddValue(0, spawnId);
trans.Append(stmt); trans.Append(stmt);
DB.World.CommitTransaction(trans); DB.World.CommitTransaction(trans);
return true;
} }
public override bool HasQuest(uint quest_id) public override bool HasQuest(uint quest_id)
+4 -11
View File
@@ -2443,9 +2443,9 @@ namespace Game.Maps
} }
} }
void Respawn(RespawnInfo info, bool force = false, SQLTransaction dbTrans = null) void Respawn(RespawnInfo info, SQLTransaction dbTrans = null)
{ {
if (!force && !CheckRespawn(info)) if (!CheckRespawn(info))
{ {
if (info.respawnTime != 0) if (info.respawnTime != 0)
SaveRespawnTime(info.type, info.spawnId, info.entry, info.respawnTime, info.zoneId, info.gridId, true, true, dbTrans); SaveRespawnTime(info.type, info.spawnId, info.entry, info.respawnTime, info.zoneId, info.gridId, true, true, dbTrans);
@@ -2463,11 +2463,11 @@ namespace Game.Maps
DoRespawn(type, spawnId, gridId); DoRespawn(type, spawnId, gridId);
} }
void Respawn(List<RespawnInfo> respawnData, bool force, SQLTransaction dbTrans) void Respawn(List<RespawnInfo> respawnData, SQLTransaction dbTrans)
{ {
SQLTransaction trans = dbTrans != null ? dbTrans : new SQLTransaction(); SQLTransaction trans = dbTrans != null ? dbTrans : new SQLTransaction();
foreach (RespawnInfo info in respawnData) foreach (RespawnInfo info in respawnData)
Respawn(info, force, trans); Respawn(info, trans);
if (dbTrans == null) if (dbTrans == null)
DB.Characters.CommitTransaction(trans); DB.Characters.CommitTransaction(trans);
@@ -2545,13 +2545,6 @@ namespace Game.Maps
_respawnTimes.Remove(info); _respawnTimes.Remove(info);
} }
public void ForceRespawn(SpawnObjectType type, ulong spawnId)
{
RespawnInfo info = GetRespawnInfo(type, spawnId);
if (info != null)
Respawn(info, true);
}
public void RemoveRespawnTime(RespawnInfo info, bool doRespawn = false, SQLTransaction dbTrans = null) public void RemoveRespawnTime(RespawnInfo info, bool doRespawn = false, SQLTransaction dbTrans = null)
{ {
PreparedStatement stmt; PreparedStatement stmt;
+6 -30
View File
@@ -434,48 +434,24 @@ namespace Game.PvP
} }
ulong spawnId = m_Creatures[type]; ulong spawnId = m_Creatures[type];
var bounds = PvP.GetMap().GetCreatureBySpawnIdStore().LookupByKey(spawnId);
foreach (var creature in bounds)
{
// Don't save respawn time
creature.SetRespawnTime(0);
creature.DespawnOrUnsummon();
creature.AddObjectToRemoveList();
}
Log.outDebug(LogFilter.Outdoorpvp, "deleting opvp creature type {0}", type); Log.outDebug(LogFilter.Outdoorpvp, "deleting opvp creature type {0}", type);
// delete respawn time for this creature
PreparedStatement stmt = DB.Characters.GetPreparedStatement(CharStatements.DEL_CREATURE_RESPAWN);
stmt.AddValue(0, spawnId);
stmt.AddValue(1, PvP.GetMap().GetId());
stmt.AddValue(2, 0); // instance id, always 0 for world maps
DB.Characters.Execute(stmt);
Global.ObjectMgr.DeleteCreatureData(spawnId);
m_CreatureTypes.Remove(spawnId); m_CreatureTypes.Remove(spawnId);
m_Creatures.Remove(type); m_Creatures.Remove(type);
return true;
return Creature.DeleteFromDB(spawnId);
} }
public bool DelObject(uint type) public bool DelObject(uint type)
{ {
if (!m_Objects.ContainsKey(type)) ulong spawnId = m_Objects[type];
if (spawnId == 0)
return false; return false;
ulong spawnId = m_Objects[type];
var bounds = PvP.GetMap().GetGameObjectBySpawnIdStore().LookupByKey(spawnId);
foreach (var gameobject in bounds)
{
// Don't save respawn time
gameobject.SetRespawnTime(0);
gameobject.Delete();
}
Global.ObjectMgr.DeleteGameObjectData(spawnId);
m_ObjectTypes.Remove(spawnId); m_ObjectTypes.Remove(spawnId);
m_Objects.Remove(type); m_Objects.Remove(type);
return true;
return GameObject.DeleteFromDB(spawnId);
} }
bool DelCapturePoint() bool DelCapturePoint()