diff --git a/data/sql/updates/db_world/2025_10_12_07.sql b/data/sql/updates/db_world/2025_10_12_07.sql new file mode 100644 index 0000000000..3c9589b08f --- /dev/null +++ b/data/sql/updates/db_world/2025_10_12_07.sql @@ -0,0 +1,5 @@ +-- DB update 2025_10_12_06 -> 2025_10_12_07 +-- add wp show first/last to command help +UPDATE `command` SET +`help`='Syntax: .wp show $option\nOptions:\non $pathid (or selected creature with loaded path) - Show path\nfirst $pathid (or selected creature with loaded path) - Show first waypoint\nlast $pathid (or selected creature with loaded path) - Show last waypoint\noff - Hide path (all waypoints in current map)\ninfo $selected_waypoint - Show info for selected waypoint.' +WHERE `name` = 'wp show'; diff --git a/src/server/database/Database/Implementation/WorldDatabase.cpp b/src/server/database/Database/Implementation/WorldDatabase.cpp index f216c95838..ede44d3c04 100644 --- a/src/server/database/Database/Implementation/WorldDatabase.cpp +++ b/src/server/database/Database/Implementation/WorldDatabase.cpp @@ -53,12 +53,12 @@ void WorldDatabaseConnection::DoPrepareStatements() PrepareStatement(WORLD_SEL_WAYPOINT_DATA_MAX_ID, "SELECT MAX(id) FROM waypoint_data", CONNECTION_SYNCH); PrepareStatement(WORLD_SEL_WAYPOINT_DATA_MAX_POINT, "SELECT MAX(point) FROM waypoint_data WHERE id = ?", CONNECTION_SYNCH); PrepareStatement(WORLD_SEL_WAYPOINT_DATA_BY_ID, "SELECT point, position_x, position_y, position_z, orientation, move_type, delay, action, action_chance FROM waypoint_data WHERE id = ? ORDER BY point", CONNECTION_SYNCH); - PrepareStatement(WORLD_SEL_WAYPOINT_DATA_POS_BY_ID, "SELECT point, position_x, position_y, position_z FROM waypoint_data WHERE id = ?", CONNECTION_SYNCH); - PrepareStatement(WORLD_SEL_WAYPOINT_DATA_POS_FIRST_BY_ID, "SELECT position_x, position_y, position_z FROM waypoint_data WHERE point = 1 AND id = ?", CONNECTION_SYNCH); - PrepareStatement(WORLD_SEL_WAYPOINT_DATA_POS_LAST_BY_ID, "SELECT position_x, position_y, position_z, orientation FROM waypoint_data WHERE id = ? ORDER BY point DESC LIMIT 1", CONNECTION_SYNCH); + PrepareStatement(WORLD_SEL_WAYPOINT_DATA_POS_BY_ID, "SELECT point, position_x, position_y, position_z, orientation, wpguid FROM waypoint_data WHERE id = ?", CONNECTION_SYNCH); + PrepareStatement(WORLD_SEL_WAYPOINT_DATA_POS_FIRST_BY_ID, "SELECT point, position_x, position_y, position_z, orientation, wpguid FROM waypoint_data WHERE id = ? ORDER BY point ASC LIMIT 1", CONNECTION_SYNCH); + PrepareStatement(WORLD_SEL_WAYPOINT_DATA_POS_LAST_BY_ID, "SELECT point, position_x, position_y, position_z, orientation, wpguid FROM waypoint_data WHERE id = ? ORDER BY point DESC LIMIT 1", CONNECTION_SYNCH); PrepareStatement(WORLD_SEL_WAYPOINT_DATA_BY_WPGUID, "SELECT id, point FROM waypoint_data WHERE wpguid = ?", CONNECTION_SYNCH); PrepareStatement(WORLD_SEL_WAYPOINT_DATA_ALL_BY_WPGUID, "SELECT id, point, delay, move_type, action, action_chance FROM waypoint_data WHERE wpguid = ?", CONNECTION_SYNCH); - PrepareStatement(WORLD_UPD_WAYPOINT_DATA_ALL_WPGUID, "UPDATE waypoint_data SET wpguid = 0", CONNECTION_ASYNC); + PrepareStatement(WORLD_UPD_WAYPOINT_DATA_BY_WPGUID, "UPDATE waypoint_data SET wpguid = 0 WHERE wpguid = ?", CONNECTION_ASYNC); PrepareStatement(WORLD_SEL_WAYPOINT_DATA_BY_POS, "SELECT id, point FROM waypoint_data WHERE (abs(position_x - ?) <= ?) and (abs(position_y - ?) <= ?) and (abs(position_z - ?) <= ?)", CONNECTION_SYNCH); PrepareStatement(WORLD_SEL_WAYPOINT_DATA_WPGUID_BY_ID, "SELECT wpguid FROM waypoint_data WHERE id = ? and wpguid <> 0", CONNECTION_SYNCH); PrepareStatement(WORLD_SEL_WAYPOINT_DATA_ACTION, "SELECT DISTINCT action FROM waypoint_data", CONNECTION_SYNCH); diff --git a/src/server/database/Database/Implementation/WorldDatabase.h b/src/server/database/Database/Implementation/WorldDatabase.h index 016791ccd5..46a32a03c9 100644 --- a/src/server/database/Database/Implementation/WorldDatabase.h +++ b/src/server/database/Database/Implementation/WorldDatabase.h @@ -55,7 +55,7 @@ enum WorldDatabaseStatements : uint32 WORLD_UPD_WAYPOINT_DATA_POINT, WORLD_UPD_WAYPOINT_DATA_POSITION, WORLD_UPD_WAYPOINT_DATA_WPGUID, - WORLD_UPD_WAYPOINT_DATA_ALL_WPGUID, + WORLD_UPD_WAYPOINT_DATA_BY_WPGUID, WORLD_SEL_WAYPOINT_DATA_MAX_ID, WORLD_SEL_WAYPOINT_DATA_BY_ID, WORLD_SEL_WAYPOINT_DATA_POS_BY_ID, diff --git a/src/server/game/Miscellaneous/Language.h b/src/server/game/Miscellaneous/Language.h index 5061f873ce..4005d52cef 100644 --- a/src/server/game/Miscellaneous/Language.h +++ b/src/server/game/Miscellaneous/Language.h @@ -264,18 +264,18 @@ enum AcoreStrings LANG_RESETALL_TALENTS = 219, LANG_WAYPOINT_NOTFOUND = 220, - LANG_WAYPOINT_NOTFOUNDLAST = 221, + LANG_WAYPOINT_NOTFOUNDLAST = 221, // Not used LANG_WAYPOINT_NOTFOUNDSEARCH = 222, LANG_WAYPOINT_NOTFOUNDDBPROBLEM = 223, LANG_WAYPOINT_CREATSELECTED = 224, - LANG_WAYPOINT_CREATNOTFOUND = 225, + LANG_WAYPOINT_CREATNOTFOUND = 225, // Not used LANG_WAYPOINT_VP_SELECT = 226, LANG_WAYPOINT_VP_NOTFOUND = 227, LANG_WAYPOINT_VP_NOTCREATED = 228, LANG_WAYPOINT_VP_ALLREMOVED = 229, - LANG_WAYPOINT_NOTCREATED = 230, - LANG_WAYPOINT_NOGUID = 231, - LANG_WAYPOINT_NOWAYPOINTGIVEN = 232, + LANG_WAYPOINT_NOTCREATED = 230, // Not used + LANG_WAYPOINT_NOGUID = 231, // Not used + LANG_WAYPOINT_NOWAYPOINTGIVEN = 232, // Not used LANG_WAYPOINT_ARGUMENTREQ = 233, LANG_WAYPOINT_ADDED = 234, LANG_WAYPOINT_ADDED_NO = 235, @@ -287,8 +287,8 @@ enum AcoreStrings LANG_WAYPOINT_REMOVED = 241, LANG_WAYPOINT_NOTREMOVED = 242, LANG_WAYPOINT_TOOFAR1 = 243, - LANG_WAYPOINT_TOOFAR2 = 244, - LANG_WAYPOINT_TOOFAR3 = 245, + LANG_WAYPOINT_TOOFAR2 = 244, // Not used + LANG_WAYPOINT_TOOFAR3 = 245, // Not used LANG_WAYPOINT_INFO_TITLE = 246, LANG_WAYPOINT_INFO_WAITTIME = 247, LANG_WAYPOINT_INFO_MODEL = 248, diff --git a/src/server/scripts/Commands/cs_wp.cpp b/src/server/scripts/Commands/cs_wp.cpp index d0d4c1cf1c..953a986330 100644 --- a/src/server/scripts/Commands/cs_wp.cpp +++ b/src/server/scripts/Commands/cs_wp.cpp @@ -26,10 +26,14 @@ using namespace Acore::ChatCommands; +namespace { + constexpr uint32 wpEntry = VISUAL_WAYPOINT; +} + class wp_commandscript : public CommandScript { public: - wp_commandscript() : CommandScript("wp_commandscript") { } + wp_commandscript() : CommandScript("wp_commandscript") {} ChatCommandTable GetCommands() const override { @@ -49,6 +53,122 @@ public: }; return commandTable; } + + static bool AddWaypointsByPreparedStatement(ChatHandler* handler, WorldDatabaseConnection::Statements index, uint32 pathid, Creature* target = nullptr) + { + ASSERT(handler); + WorldDatabasePreparedStatement* stmt = WorldDatabase.GetPreparedStatement(index); + stmt->SetData(0, pathid); + PreparedQueryResult result = WorldDatabase.Query(stmt); + + if (!result) + { + handler->SendErrorMessage(LANG_WAYPOINT_NOTFOUND, pathid); + return false; + } + + do + { + Field* fields = result->Fetch(); + uint32 point = fields[0].Get(); + float x = fields[1].Get(); + float y = fields[2].Get(); + float z = fields[3].Get(); + float o = fields[4].Get(); + uint32 wpguid = fields[5].Get(); + + Player* chr = handler->GetSession()->GetPlayer(); + Map* map = chr->GetMap(); + + // Try to create new creature + Creature* wpCreature = new Creature; + if (!wpCreature->Create(map->GenerateLowGuid(), map, chr->GetPhaseMaskForSpawn(), wpEntry, 0, x, y, z, o)) + { + handler->PSendSysMessage(LANG_WAYPOINT_VP_NOTCREATED, wpEntry); + delete wpCreature; + return false; + } + + // Remove old waypoint for the same path_id and point if exists + if (wpguid != 0) + RemoveWaypointById(handler, wpguid); + + // Save new waypoint to db + wpCreature->SaveToDB(map->GetId(), (1 << map->GetSpawnMode()), chr->GetPhaseMaskForSpawn()); + + // Set "wpguid" column to the new visual waypoint + WorldDatabasePreparedStatement* stmt = WorldDatabase.GetPreparedStatement(WORLD_UPD_WAYPOINT_DATA_WPGUID); + stmt->SetData(0, wpCreature->GetSpawnId()); + stmt->SetData(1, pathid); + stmt->SetData(2, point); + + WorldDatabase.Execute(stmt); + + // To call _LoadGoods(); _LoadQuests(); CreateTrainerSpells(); + if (!wpCreature->LoadCreatureFromDB(wpCreature->GetSpawnId(), map, true, true)) + { + handler->PSendSysMessage(LANG_WAYPOINT_VP_NOTCREATED, wpEntry); + delete wpCreature; + return false; + } + + if (target) + { + wpCreature->SetDisplayId(target->GetDisplayId()); + wpCreature->SetObjectScale(0.5f); + wpCreature->SetLevel(point > STRONG_MAX_LEVEL ? STRONG_MAX_LEVEL : point); + } + } while (result->NextRow()); + + return true; + } + + /** + * Remove an existing waypoint by dbGuid. + * + * @param guid: The dbGuid of the waypoint + * @param deleteFromWaypointData: true if the caller wants to delete the wpGuid from the waypoint_data table + * should be false if we immediately recreate the waypoint and set a new value + * + * @return true - command did succeed, false - something went wrong + * + */ + static bool RemoveWaypointById(ChatHandler* handler, const ObjectGuid::LowType guid, bool deleteFromWaypointData = false) + { + ASSERT(handler); + const auto creatureRange = handler->GetSession()->GetPlayer()->GetMap()->GetCreatureBySpawnIdStore().equal_range(guid); + if (creatureRange.first != creatureRange.second) + { + std::for_each( + creatureRange.first, + creatureRange.second, + [&](auto& guidCreaturePair) { + if (deleteFromWaypointData) + { + // Set "wpguid" column to "empty" + WorldDatabasePreparedStatement* stmt = WorldDatabase.GetPreparedStatement(WORLD_UPD_WAYPOINT_DATA_BY_WPGUID); + stmt->SetData(0, guid); + WorldDatabase.Execute(stmt); + } + + // Remove creature + Creature* creature = guidCreaturePair.second; + creature->CombatStop(); + creature->DeleteFromDB(); + creature->AddObjectToRemoveList(); + } + ); + + return true; + } + else + { + handler->PSendSysMessage(LANG_WAYPOINT_NOTREMOVED, guid); + + return false; + } + } + /** * Add a waypoint to a creature. * @@ -427,11 +547,11 @@ public: return true; } - std::string arg_string = arg_2; + std::string arg_string = arg_2; if ((arg_string != "setid") && (arg_string != "delay") && (arg_string != "command") - && (arg_string != "datalong") && (arg_string != "datalong2") && (arg_string != "dataint") && (arg_string != "posx") - && (arg_string != "posy") && (arg_string != "posz") && (arg_string != "orientation")) + && (arg_string != "datalong") && (arg_string != "datalong2") && (arg_string != "dataint") && (arg_string != "posx") + && (arg_string != "posy") && (arg_string != "posz") && (arg_string != "orientation")) { handler->SendSysMessage("|cffff33ffERROR: No valid argument present.|r"); return true; @@ -556,8 +676,8 @@ public: // Check // Remember: "show" must also be the name of a column! if ((show != "delay") && (show != "action") && (show != "action_chance") - && (show != "move_type") && (show != "del") && (show != "move") && (show != "wpadd") - ) + && (show != "move_type") && (show != "del") && (show != "move") && (show != "wpadd") + ) { return false; } @@ -736,62 +856,59 @@ public: return true; } - static bool HandleWpShowCommand(ChatHandler* handler, const char* args) + static bool HandleWpShowCommand(ChatHandler* handler, std::string show, Optional guid) { - if (!*args) - return false; - - // first arg: on, off, first, last - char* show_str = strtok((char*)args, " "); - if (!show_str) - return false; - - // second arg: GUID (optional, if a creature is selected) - char* guid_str = strtok((char*)nullptr, " "); - uint32 pathid = 0; Creature* target = handler->getSelectedCreature(); - // Did player provide a PathID? - - if (!guid_str) - { - // No PathID provided - // -> Player must have selected a creature - - if (!target) - { - handler->SendErrorMessage(LANG_SELECT_CREATURE); - return false; - } - - pathid = target->GetWaypointPath(); - } - else - { - // PathID provided - // Warn if player also selected a creature - // -> Creature selection is ignored <- - if (target) - handler->SendSysMessage(LANG_WAYPOINT_CREATSELECTED); - - pathid = atoi((char*)guid_str); - } - - std::string show = show_str; - - //handler->PSendSysMessage("wpshow - show: {}", show); - - // Show info for the selected waypoint + // Checks for early return if (show == "info") { - // Check if the user did specify a visual waypoint - if (!target || target->GetEntry() != VISUAL_WAYPOINT) + // Check if the user is targeting a visual waypoint + if (!target || target->GetEntry() != wpEntry) { handler->SendErrorMessage(LANG_WAYPOINT_VP_SELECT); return false; } + } + // If command equals "off" we do not need a guid or target, just delete all WPs in the current map + else if (show != "off") + { + // Did player provide a PathID? + if (guid) + { + // PathID provided + // Warn if player also selected a creature + // -> Creature selection is ignored <- + if (target) + handler->SendSysMessage(LANG_WAYPOINT_CREATSELECTED); + pathid = *guid; + } + else + { + // No PathID provided + // -> Player must have selected a creature + if (!target) + { + handler->SendErrorMessage(LANG_SELECT_CREATURE); + return false; + } + + pathid = target->GetWaypointPath(); + + // If target hasn't got a path -> we should return an error + if (pathid == 0) + { + handler->SendErrorMessage(LANG_WAYPOINT_NOTFOUND, target->GetEntry()); + return false; + } + } + } + + // Show info for the selected waypoint + if (show == "info") + { WorldDatabasePreparedStatement* stmt = WorldDatabase.GetPreparedStatement(WORLD_SEL_WAYPOINT_DATA_ALL_BY_WPGUID); stmt->SetData(0, target->GetSpawnId()); @@ -825,218 +942,35 @@ public: return true; } + // Show all waypoints in #pathid if (show == "on") { - WorldDatabasePreparedStatement* stmt = WorldDatabase.GetPreparedStatement(WORLD_SEL_WAYPOINT_DATA_POS_BY_ID); + handler->PSendSysMessage("|cff00ff00DEBUG: wp on, PathID: |r|cff00ffff{}|r", pathid); - stmt->SetData(0, pathid); - - PreparedQueryResult result = WorldDatabase.Query(stmt); - - if (!result) - { - handler->SendErrorMessage("|cffff33ffPath no found.|r"); - return false; - } - - handler->PSendSysMessage("|cff00ff00DEBUG: wp on, PathID: |cff00ffff{}|r", pathid); - - // Delete all visuals for this NPC - stmt = WorldDatabase.GetPreparedStatement(WORLD_SEL_WAYPOINT_DATA_WPGUID_BY_ID); - - stmt->SetData(0, pathid); - - PreparedQueryResult result2 = WorldDatabase.Query(stmt); - - if (result2) - { - bool hasError = false; - do - { - Field* fields = result2->Fetch(); - uint32 wpguid = fields[0].Get(); - Creature* creature = handler->GetSession()->GetPlayer()->GetMap()->GetCreature(ObjectGuid::Create(VISUAL_WAYPOINT, wpguid)); - - if (!creature) - { - handler->PSendSysMessage(LANG_WAYPOINT_NOTREMOVED, wpguid); - hasError = true; - - WorldDatabasePreparedStatement* stmt = WorldDatabase.GetPreparedStatement(WORLD_DEL_CREATURE); - stmt->SetData(0, wpguid); - - WorldDatabase.Execute(stmt); - } - else - { - creature->CombatStop(); - creature->DeleteFromDB(); - creature->AddObjectToRemoveList(); - } - } while (result2->NextRow()); - - if (hasError) - { - handler->PSendSysMessage(LANG_WAYPOINT_TOOFAR1); - handler->PSendSysMessage(LANG_WAYPOINT_TOOFAR2); - handler->PSendSysMessage(LANG_WAYPOINT_TOOFAR3); - } - } - - do - { - Field* fields = result->Fetch(); - uint32 point = fields[0].Get(); - float x = fields[1].Get(); - float y = fields[2].Get(); - float z = fields[3].Get(); - - uint32 id = VISUAL_WAYPOINT; - - Player* chr = handler->GetSession()->GetPlayer(); - Map* map = chr->GetMap(); - float o = chr->GetOrientation(); - - Creature* wpCreature = new Creature; - if (!wpCreature->Create(map->GenerateLowGuid(), map, chr->GetPhaseMaskForSpawn(), id, 0, x, y, z, o)) - { - handler->PSendSysMessage(LANG_WAYPOINT_VP_NOTCREATED, id); - delete wpCreature; - return false; - } - - wpCreature->SaveToDB(map->GetId(), (1 << map->GetSpawnMode()), chr->GetPhaseMaskForSpawn()); - - // Set "wpguid" column to the visual waypoint - WorldDatabasePreparedStatement* stmt = WorldDatabase.GetPreparedStatement(WORLD_UPD_WAYPOINT_DATA_WPGUID); - stmt->SetData(0, wpCreature->GetSpawnId()); - stmt->SetData(1, pathid); - stmt->SetData(2, point); - - WorldDatabase.Execute(stmt); - - // To call _LoadGoods(); _LoadQuests(); CreateTrainerSpells(); - if (!wpCreature->LoadCreatureFromDB(wpCreature->GetSpawnId(), map, true, true)) - { - handler->PSendSysMessage(LANG_WAYPOINT_VP_NOTCREATED, id); - delete wpCreature; - return false; - } - - if (target) - { - wpCreature->SetDisplayId(target->GetDisplayId()); - wpCreature->SetObjectScale(0.5f); - wpCreature->SetLevel(point > STRONG_MAX_LEVEL ? STRONG_MAX_LEVEL : point); - } - } while (result->NextRow()); - - handler->SendSysMessage("|cff00ff00Showing the current creature's path.|r"); - return true; + return AddWaypointsByPreparedStatement(handler, WORLD_SEL_WAYPOINT_DATA_POS_BY_ID, pathid, target); } + // Show first waypoint in #pathid if (show == "first") { - handler->PSendSysMessage("|cff00ff00DEBUG: wp first, GUID: {}|r", pathid); + handler->PSendSysMessage("|cff00ff00DEBUG: wp first, PathID: |r|cff00ffff{}|r", pathid); - WorldDatabasePreparedStatement* stmt = WorldDatabase.GetPreparedStatement(WORLD_SEL_WAYPOINT_DATA_POS_FIRST_BY_ID); - stmt->SetData(0, pathid); - - PreparedQueryResult result = WorldDatabase.Query(stmt); - if (!result) - { - handler->SendErrorMessage(LANG_WAYPOINT_NOTFOUND, pathid); - return false; - } - - Field* fields = result->Fetch(); - float x = fields[0].Get(); - float y = fields[1].Get(); - float z = fields[2].Get(); - uint32 id = VISUAL_WAYPOINT; - - Player* chr = handler->GetSession()->GetPlayer(); - float o = chr->GetOrientation(); - Map* map = chr->GetMap(); - - Creature* creature = new Creature; - if (!creature->Create(map->GenerateLowGuid(), map, chr->GetPhaseMaskForSpawn(), id, 0, x, y, z, o)) - { - handler->PSendSysMessage(LANG_WAYPOINT_VP_NOTCREATED, id); - delete creature; - return false; - } - - creature->SaveToDB(map->GetId(), (1 << map->GetSpawnMode()), chr->GetPhaseMaskForSpawn()); - if (!creature->LoadCreatureFromDB(creature->GetSpawnId(), map, true, true)) - { - handler->PSendSysMessage(LANG_WAYPOINT_VP_NOTCREATED, id); - delete creature; - return false; - } - - if (target) - { - creature->SetDisplayId(target->GetDisplayId()); - creature->SetObjectScale(0.5f); - } - - return true; + return AddWaypointsByPreparedStatement(handler, WORLD_SEL_WAYPOINT_DATA_POS_FIRST_BY_ID, pathid, target); } + // Show last waypoint in #pathid if (show == "last") { handler->PSendSysMessage("|cff00ff00DEBUG: wp last, PathID: |r|cff00ffff{}|r", pathid); - WorldDatabasePreparedStatement* stmt = WorldDatabase.GetPreparedStatement(WORLD_SEL_WAYPOINT_DATA_POS_LAST_BY_ID); - stmt->SetData(0, pathid); - - PreparedQueryResult result = WorldDatabase.Query(stmt); - if (!result) - { - handler->SendErrorMessage(LANG_WAYPOINT_NOTFOUNDLAST, pathid); - return false; - } - - Field* fields = result->Fetch(); - float x = fields[0].Get(); - float y = fields[1].Get(); - float z = fields[2].Get(); - float o = fields[3].Get(); - uint32 id = VISUAL_WAYPOINT; - - Player* chr = handler->GetSession()->GetPlayer(); - Map* map = chr->GetMap(); - - Creature* creature = new Creature; - if (!creature->Create(map->GenerateLowGuid(), map, chr->GetPhaseMaskForSpawn(), id, 0, x, y, z, o)) - { - handler->PSendSysMessage(LANG_WAYPOINT_NOTCREATED, id); - delete creature; - return false; - } - - creature->SaveToDB(map->GetId(), (1 << map->GetSpawnMode()), chr->GetPhaseMaskForSpawn()); - if (!creature->LoadCreatureFromDB(creature->GetSpawnId(), map, true, true)) - { - handler->PSendSysMessage(LANG_WAYPOINT_NOTCREATED, id); - delete creature; - return false; - } - - if (target) - { - creature->SetDisplayId(target->GetDisplayId()); - creature->SetObjectScale(0.5f); - } - - return true; + return AddWaypointsByPreparedStatement(handler, WORLD_SEL_WAYPOINT_DATA_POS_LAST_BY_ID, pathid, target); } + // Delete all waypoints if (show == "off") { WorldDatabasePreparedStatement* stmt = WorldDatabase.GetPreparedStatement(WORLD_SEL_CREATURE_BY_ID); - stmt->SetArguments(1, 1, 1); + stmt->SetArguments(wpEntry, wpEntry, wpEntry); PreparedQueryResult result = WorldDatabase.Query(stmt); if (!result) @@ -1045,42 +979,22 @@ public: return false; } - bool hasError = false; - - do + if (result) { - Field* fields = result->Fetch(); - ObjectGuid::LowType guid = fields[0].Get(); - Creature* creature = handler->GetSession()->GetPlayer()->GetMap()->GetCreature(ObjectGuid::Create(VISUAL_WAYPOINT, guid)); - if (!creature) + bool hasError = false; + + do { - handler->PSendSysMessage(LANG_WAYPOINT_NOTREMOVED, guid); - hasError = true; + Field* fields = result->Fetch(); + ObjectGuid::LowType guid = fields[0].Get(); + hasError |= !RemoveWaypointById(handler, guid, true); - WorldDatabasePreparedStatement* stmt = WorldDatabase.GetPreparedStatement(WORLD_DEL_CREATURE); + } while (result->NextRow()); - stmt->SetData(0, guid); - - WorldDatabase.Execute(stmt); - } - else + if (hasError) { - creature->CombatStop(); - creature->DeleteFromDB(); - creature->AddObjectToRemoveList(); + handler->PSendSysMessage(LANG_WAYPOINT_TOOFAR1); } - } while (result->NextRow()); - - // set "wpguid" column to "empty" - no visual waypoint spawned - stmt = WorldDatabase.GetPreparedStatement(WORLD_UPD_WAYPOINT_DATA_ALL_WPGUID); - - WorldDatabase.Execute(stmt); - - if (hasError) - { - handler->PSendSysMessage(LANG_WAYPOINT_TOOFAR1); - handler->PSendSysMessage(LANG_WAYPOINT_TOOFAR2); - handler->PSendSysMessage(LANG_WAYPOINT_TOOFAR3); } handler->SendSysMessage(LANG_WAYPOINT_VP_ALLREMOVED);