Merge b441041c321ae46b47f78d6c05eae9dcf014762c into 5bef92d5eaca3e2ecc317f9d599312bc23eb71aa

This commit is contained in:
SAS2000 2025-11-09 16:21:05 -06:00 committed by GitHub
commit 81417dd382
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
5 changed files with 205 additions and 286 deletions

View File

@ -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';

View File

@ -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);

View File

@ -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,

View File

@ -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,

View File

@ -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<uint32>();
float x = fields[1].Get<float>();
float y = fields[2].Get<float>();
float z = fields[3].Get<float>();
float o = fields[4].Get<float>();
uint32 wpguid = fields[5].Get<uint32>();
Player* chr = handler->GetSession()->GetPlayer();
Map* map = chr->GetMap();
// Try to create new creature
Creature* wpCreature = new Creature;
if (!wpCreature->Create(map->GenerateLowGuid<HighGuid::Unit>(), 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<ObjectGuid::LowType> 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<uint32>();
Creature* creature = handler->GetSession()->GetPlayer()->GetMap()->GetCreature(ObjectGuid::Create<HighGuid::Unit>(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<uint32>();
float x = fields[1].Get<float>();
float y = fields[2].Get<float>();
float z = fields[3].Get<float>();
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<HighGuid::Unit>(), 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>();
float y = fields[1].Get<float>();
float z = fields[2].Get<float>();
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<HighGuid::Unit>(), 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>();
float y = fields[1].Get<float>();
float z = fields[2].Get<float>();
float o = fields[3].Get<float>();
uint32 id = VISUAL_WAYPOINT;
Player* chr = handler->GetSession()->GetPlayer();
Map* map = chr->GetMap();
Creature* creature = new Creature;
if (!creature->Create(map->GenerateLowGuid<HighGuid::Unit>(), 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<uint32>();
Creature* creature = handler->GetSession()->GetPlayer()->GetMap()->GetCreature(ObjectGuid::Create<HighGuid::Unit>(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<uint32>();
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);