aboutsummaryrefslogtreecommitdiff
path: root/src/server/scripts
diff options
context:
space:
mode:
authorTreeston <treeston.mmoc@gmail.com>2019-07-08 11:33:09 +0200
committerShauren <shauren.trinity@gmail.com>2021-12-14 22:42:22 +0100
commit2532de6acb7d73957a8fca44e7fc26160f47cc47 (patch)
tree7e5377ad36d395a52e2d91d45396760c3c60916f /src/server/scripts
parent8be3d33eae02e327ba6ae7c7cee87f9def9c7207 (diff)
Entities/Unit: Nuke Map::ForceRespawn from orbit, with the following implications:
- .npc respawn no longer causes stupid things to happen (Fixes #23014) - ::DeleteFromDB methods on Creature and GameObject rewritten to be as sensible as such a colossally stupid method can ever be. They're static now. - .npc delete and .gobj delete ported to new argument handling, and rewritten as per above. They can no longer crash the server when used in instances, too. Yay for that. - Adjusted various dusty cobwebbed hacks around the core (why does waypoint visualization use permanent spawns *shudder*) to still work too. (cherry picked from commit 84b7b2e08ea55575cbe62d795383d4a5341ffd4d)
Diffstat (limited to 'src/server/scripts')
-rw-r--r--src/server/scripts/Commands/cs_gobject.cpp62
-rw-r--r--src/server/scripts/Commands/cs_misc.cpp2
-rw-r--r--src/server/scripts/Commands/cs_npc.cpp57
-rw-r--r--src/server/scripts/Commands/cs_wp.cpp67
4 files changed, 78 insertions, 110 deletions
diff --git a/src/server/scripts/Commands/cs_gobject.cpp b/src/server/scripts/Commands/cs_gobject.cpp
index 324d6ede64c..0647eb8e3c9 100644
--- a/src/server/scripts/Commands/cs_gobject.cpp
+++ b/src/server/scripts/Commands/cs_gobject.cpp
@@ -49,6 +49,7 @@ EndScriptData */
bool HandleNpcSpawnGroup(ChatHandler* handler, char const* args);
bool HandleNpcDespawnGroup(ChatHandler* handler, char const* args);
+using namespace Trinity::ChatCommands;
class gobject_commandscript : public CommandScript
{
public:
@@ -340,49 +341,36 @@ public:
}
//delete object by selection or guid
- static bool HandleGameObjectDeleteCommand(ChatHandler* handler, char const* args)
+ static bool HandleGameObjectDeleteCommand(ChatHandler* handler, Variant<Hyperlink<gameobject>, ObjectGuid::LowType> spawnId)
{
- // number or [name] Shift-click form |color|Hgameobject:go_guid|h[name]|h|r
- char* id = handler->extractKeyFromLink((char*)args, "Hgameobject");
- if (!id)
- return false;
-
- ObjectGuid::LowType guidLow = atoull(id);
- if (!guidLow)
- return false;
-
- Player const* const player = handler->GetSession()->GetPlayer();
- // force respawn to make sure we find something
- player->GetMap()->ForceRespawn(SPAWN_TYPE_GAMEOBJECT, guidLow);
- GameObject* object = handler->GetObjectFromPlayerMapByDbGuid(guidLow);
- if (!object)
+ if (GameObject* object = handler->GetObjectFromPlayerMapByDbGuid(spawnId))
{
- handler->PSendSysMessage(LANG_COMMAND_OBJNOTFOUND, std::to_string(guidLow).c_str());
- handler->SetSentErrorMessage(true);
- return false;
- }
-
- ObjectGuid ownerGuid = object->GetOwnerGUID();
- if (!ownerGuid.IsEmpty())
- {
- Unit* owner = ObjectAccessor::GetUnit(*player, ownerGuid);
- if (!owner || !ownerGuid.IsPlayer())
+ Player const* const player = handler->GetSession()->GetPlayer();
+ ObjectGuid ownerGuid = object->GetOwnerGUID();
+ if (!ownerGuid.IsEmpty())
{
- handler->PSendSysMessage(LANG_COMMAND_DELOBJREFERCREATURE, ownerGuid.ToString().c_str(), object->GetGUID().ToString().c_str());
- handler->SetSentErrorMessage(true);
- return false;
+ Unit* owner = ObjectAccessor::GetUnit(*player, ownerGuid);
+ if (!owner || !ownerGuid.IsPlayer())
+ {
+ handler->PSendSysMessage(LANG_COMMAND_DELOBJREFERCREATURE, ownerGuid.GetCounter(), spawnId);
+ handler->SetSentErrorMessage(true);
+ return false;
+ }
+ owner->RemoveGameObject(object, false);
}
-
- owner->RemoveGameObject(object, false);
}
- object->SetRespawnTime(0); // not save respawn time
- object->Delete();
- object->DeleteFromDB();
-
- handler->PSendSysMessage(LANG_COMMAND_DELOBJMESSAGE, std::to_string(guidLow).c_str());
-
- return true;
+ if (GameObject::DeleteFromDB(spawnId))
+ {
+ handler->PSendSysMessage(LANG_COMMAND_DELOBJMESSAGE, std::to_string(spawnId));
+ return true;
+ }
+ else
+ {
+ handler->PSendSysMessage(LANG_COMMAND_OBJNOTFOUND, std::to_string(spawnId));
+ handler->SetSentErrorMessage(true);
+ return false;
+ }
}
//turn selected object
diff --git a/src/server/scripts/Commands/cs_misc.cpp b/src/server/scripts/Commands/cs_misc.cpp
index b487a319a22..793b4f02838 100644
--- a/src/server/scripts/Commands/cs_misc.cpp
+++ b/src/server/scripts/Commands/cs_misc.cpp
@@ -1983,7 +1983,7 @@ public:
uint32 const gridId = Trinity::ComputeGridCoord(player->GetPositionX(), player->GetPositionY()).GetId();
for (RespawnInfo* info : data)
if (info->gridId == gridId)
- player->GetMap()->ForceRespawn(info->type, info->spawnId);
+ player->GetMap()->RemoveRespawnTime(info, true);
}
return true;
diff --git a/src/server/scripts/Commands/cs_npc.cpp b/src/server/scripts/Commands/cs_npc.cpp
index 64330b8aa64..6530652fe71 100644
--- a/src/server/scripts/Commands/cs_npc.cpp
+++ b/src/server/scripts/Commands/cs_npc.cpp
@@ -128,6 +128,7 @@ bool HandleNpcDespawnGroup(ChatHandler* handler, char const* args)
return true;
}
+using namespace Trinity::ChatCommands;
class npc_commandscript : public CommandScript
{
public:
@@ -429,48 +430,40 @@ public:
return true;
}
- static bool HandleNpcDeleteCommand(ChatHandler* handler, char const* args)
+ static bool HandleNpcDeleteCommand(ChatHandler* handler, Optional<Variant<Hyperlink<creature>, ObjectGuid::LowType>> spawnIdArg)
{
- Creature* creature = nullptr;
-
- if (*args)
+ ObjectGuid::LowType spawnId;
+ if (spawnIdArg)
+ spawnId = *spawnIdArg;
+ else
{
- // number or [name] Shift-click form |color|Hcreature:creature_guid|h[name]|h|r
- char* cId = handler->extractKeyFromLink((char*)args, "Hcreature");
- if (!cId)
- return false;
-
- ObjectGuid::LowType lowguid = atoull(cId);
- if (!lowguid)
+ Creature* creature = handler->getSelectedCreature();
+ if (!creature || creature->IsPet() || creature->IsTotem())
+ {
+ handler->SendSysMessage(LANG_SELECT_CREATURE);
+ handler->SetSentErrorMessage(true);
return false;
- // force respawn to make sure we find something
- handler->GetSession()->GetPlayer()->GetMap()->ForceRespawn(SPAWN_TYPE_CREATURE, lowguid);
- // then try to find it
- creature = handler->GetCreatureFromPlayerMapByDbGuid(lowguid);
+ }
+ if (TempSummon* summon = creature->ToTempSummon())
+ {
+ summon->UnSummon();
+ handler->SendSysMessage(LANG_COMMAND_DELCREATMESSAGE);
+ return true;
+ }
+ spawnId = creature->GetSpawnId();
}
- else
- creature = handler->getSelectedCreature();
- if (!creature || creature->IsPet() || creature->IsTotem())
+ if (Creature::DeleteFromDB(spawnId))
{
- handler->SendSysMessage(LANG_SELECT_CREATURE);
- handler->SetSentErrorMessage(true);
- return false;
+ handler->SendSysMessage(LANG_COMMAND_DELCREATMESSAGE);
+ return true;
}
-
- if (TempSummon* summon = creature->ToTempSummon())
- summon->UnSummon();
else
{
- // Delete the creature
- creature->CombatStop();
- creature->DeleteFromDB();
- creature->AddObjectToRemoveList();
+ handler->PSendSysMessage(LANG_COMMAND_CREATGUIDNOTFOUND, std::to_string(spawnId));
+ handler->SetSentErrorMessage(true);
+ return false;
}
-
- handler->SendSysMessage(LANG_COMMAND_DELCREATMESSAGE);
-
- return true;
}
//del item from vendor list
diff --git a/src/server/scripts/Commands/cs_wp.cpp b/src/server/scripts/Commands/cs_wp.cpp
index ad3ccf37669..949061302e6 100644
--- a/src/server/scripts/Commands/cs_wp.cpp
+++ b/src/server/scripts/Commands/cs_wp.cpp
@@ -637,21 +637,27 @@ public:
{
handler->PSendSysMessage("|cff00ff00DEBUG: wp modify del, PathID: |r|cff00ffff%u|r", pathid);
- target->DeleteFromDB();
- target->AddObjectToRemoveList();
-
- stmt = WorldDatabase.GetPreparedStatement(WORLD_DEL_WAYPOINT_DATA);
- stmt->setUInt32(0, pathid);
- stmt->setUInt32(1, point);
- WorldDatabase.Execute(stmt);
+ if (Creature::DeleteFromDB(target->GetSpawnId()))
+ {
+ stmt = WorldDatabase.GetPreparedStatement(WORLD_DEL_WAYPOINT_DATA);
+ stmt->setUInt32(0, pathid);
+ stmt->setUInt32(1, point);
+ WorldDatabase.Execute(stmt);
- stmt = WorldDatabase.GetPreparedStatement(WORLD_UPD_WAYPOINT_DATA_POINT);
- stmt->setUInt32(0, pathid);
- stmt->setUInt32(1, point);
- WorldDatabase.Execute(stmt);
+ stmt = WorldDatabase.GetPreparedStatement(WORLD_UPD_WAYPOINT_DATA_POINT);
+ stmt->setUInt32(0, pathid);
+ stmt->setUInt32(1, point);
+ WorldDatabase.Execute(stmt);
- handler->PSendSysMessage(LANG_WAYPOINT_REMOVED);
- return true;
+ handler->SendSysMessage(LANG_WAYPOINT_REMOVED);
+ return true;
+ }
+ else
+ {
+ handler->SendSysMessage(LANG_WAYPOINT_NOTREMOVED);
+ handler->SetSentErrorMessage(true);
+ return false;
+ }
} // del
if (show == "move")
@@ -663,8 +669,12 @@ public:
// What to do:
// Move the visual spawnpoint
// Respawn the owner of the waypoints
- target->DeleteFromDB();
- target->AddObjectToRemoveList();
+ if (!Creature::DeleteFromDB(target->GetSpawnId()))
+ {
+ handler->PSendSysMessage(LANG_WAYPOINT_VP_NOTCREATED, VISUAL_WAYPOINT);
+ handler->SetSentErrorMessage(true);
+ return false;
+ }
// re-create
Creature* wpCreature = Creature::CreateCreature(VISUAL_WAYPOINT, map, chr->GetPosition());
@@ -842,22 +852,10 @@ public:
{
Field* fields = result2->Fetch();
ObjectGuid::LowType wpguid = fields[0].GetUInt64();
- Creature* creature = handler->GetCreatureFromPlayerMapByDbGuid(wpguid);
-
- if (!creature)
+ if (!Creature::DeleteFromDB(wpguid))
{
handler->PSendSysMessage(LANG_WAYPOINT_NOTREMOVED, std::to_string(wpguid).c_str());
hasError = true;
-
- stmt = WorldDatabase.GetPreparedStatement(WORLD_DEL_CREATURE);
- stmt->setUInt64(0, wpguid);
- WorldDatabase.Execute(stmt);
- }
- else
- {
- creature->CombatStop();
- creature->DeleteFromDB();
- creature->AddObjectToRemoveList();
}
}
@@ -1061,21 +1059,10 @@ public:
Field* fields = result->Fetch();
ObjectGuid::LowType lowguid = fields[0].GetUInt64();
- Creature* creature = handler->GetCreatureFromPlayerMapByDbGuid(lowguid);
- if (!creature)
+ if (!Creature::DeleteFromDB(lowguid))
{
handler->PSendSysMessage(LANG_WAYPOINT_NOTREMOVED, std::to_string(lowguid).c_str());
hasError = true;
-
- stmt = WorldDatabase.GetPreparedStatement(WORLD_DEL_CREATURE);
- stmt->setUInt64(0, lowguid);
- WorldDatabase.Execute(stmt);
- }
- else
- {
- creature->CombatStop();
- creature->DeleteFromDB();
- creature->AddObjectToRemoveList();
}
}
while (result->NextRow());