aboutsummaryrefslogtreecommitdiff
path: root/src/game/Level2.cpp
diff options
context:
space:
mode:
authormaximius <none@none>2009-10-17 15:51:44 -0700
committermaximius <none@none>2009-10-17 15:51:44 -0700
commite585187b248f48b3c6e9247b49fa07c6565d65e5 (patch)
tree637c5b7ddacf41040bef4ea4f75a97da64c6a9bc /src/game/Level2.cpp
parent26b5e033ffde3d161382fc9addbfa99738379641 (diff)
*Backed out changeset 3be01fb200a5
--HG-- branch : trunk
Diffstat (limited to 'src/game/Level2.cpp')
-rw-r--r--src/game/Level2.cpp796
1 files changed, 795 insertions, 1 deletions
diff --git a/src/game/Level2.cpp b/src/game/Level2.cpp
index f390eea6a16..b6cf14402c6 100644
--- a/src/game/Level2.cpp
+++ b/src/game/Level2.cpp
@@ -17,6 +17,7 @@
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
+
#include "Common.h"
#include "Database/DatabaseEnv.h"
#include "ObjectMgr.h"
@@ -39,8 +40,10 @@
#include <fstream>
#include <map>
#include "GlobalEvents.h"
+
#include "TargetedMovementGenerator.h" // for HandleNpcUnFollowCommand
#include "CreatureGroups.h"
+
//mute player for some times
bool ChatHandler::HandleMuteCommand(const char* args)
{
@@ -49,36 +52,50 @@ bool ChatHandler::HandleMuteCommand(const char* args)
extractOptFirstArg((char*)args,&nameStr,&delayStr);
if(!delayStr)
return false;
+
char *mutereason = strtok(NULL, "\r");
std::string mutereasonstr = "No reason";
if(mutereason != NULL)
mutereasonstr = mutereason;
+
Player* target;
uint64 target_guid;
std::string target_name;
if(!extractPlayerTarget(nameStr,&target,&target_guid,&target_name))
return false;
+
uint32 account_id = target ? target->GetSession()->GetAccountId() : objmgr.GetPlayerAccountIdByGUID(target_guid);
+
// find only player from same account if any
if(!target)
{
if(WorldSession* session = sWorld.FindSession(account_id))
target = session->GetPlayer();
}
+
uint32 notspeaktime = (uint32) atoi(delayStr);
+
// must have strong lesser security level
if(HasLowerSecurity (target,target_guid,true))
return false;
+
time_t mutetime = time(NULL) + notspeaktime*60;
+
if (target)
target->GetSession()->m_muteTime = mutetime;
+
loginDatabase.PExecute("UPDATE account SET mutetime = " UI64FMTD " WHERE id = '%u'",uint64(mutetime), account_id );
+
if(target)
ChatHandler(target).PSendSysMessage(LANG_YOUR_CHAT_DISABLED, notspeaktime, mutereasonstr.c_str());
+
std::string nameLink = playerLink(target_name);
+
PSendSysMessage(LANG_YOU_DISABLE_CHAT, nameLink.c_str(), notspeaktime, mutereasonstr.c_str());
+
return true;
}
+
//unmute player
bool ChatHandler::HandleUnmuteCommand(const char* args)
{
@@ -87,16 +104,20 @@ bool ChatHandler::HandleUnmuteCommand(const char* args)
std::string target_name;
if(!extractPlayerTarget((char*)args,&target,&target_guid,&target_name))
return false;
+
uint32 account_id = target ? target->GetSession()->GetAccountId() : objmgr.GetPlayerAccountIdByGUID(target_guid);
+
// find only player from same account if any
if(!target)
{
if(WorldSession* session = sWorld.FindSession(account_id))
target = session->GetPlayer();
}
+
// must have strong lesser security level
if(HasLowerSecurity (target,target_guid,true))
return false;
+
if (target)
{
if(target->CanSpeak())
@@ -105,37 +126,50 @@ bool ChatHandler::HandleUnmuteCommand(const char* args)
SetSentErrorMessage(true);
return false;
}
+
target->GetSession()->m_muteTime = 0;
}
+
loginDatabase.PExecute("UPDATE account SET mutetime = '0' WHERE id = '%u'", account_id );
+
if(target)
ChatHandler(target).PSendSysMessage(LANG_YOUR_CHAT_ENABLED);
+
std::string nameLink = playerLink(target_name);
+
PSendSysMessage(LANG_YOU_ENABLE_CHAT, nameLink.c_str());
return true;
}
+
bool ChatHandler::HandleGoTicketCommand(const char * args)
{
if(!*args)
return false;
+
char *cstrticket_id = strtok((char*)args, " ");
+
if(!cstrticket_id)
return false;
+
uint64 ticket_id = atoi(cstrticket_id);
if(!ticket_id)
return false;
+
GM_Ticket *ticket = objmgr.GetGMTicket(ticket_id);
if(!ticket)
{
SendSysMessage(LANG_COMMAND_TICKETNOTEXIST);
return true;
}
+
float x, y, z;
int mapid;
+
x = ticket->pos_x;
y = ticket->pos_y;
z = ticket->pos_z;
mapid = ticket->map;
+
Player* _player = m_session->GetPlayer();
if(_player->isInFlight())
{
@@ -144,20 +178,27 @@ bool ChatHandler::HandleGoTicketCommand(const char * args)
}
else
_player->SaveRecallPosition();
+
_player->TeleportTo(mapid, x, y, z, 1, 0);
return true;
}
+
bool ChatHandler::HandleGoTriggerCommand(const char* args)
{
Player* _player = m_session->GetPlayer();
+
if (!*args)
return false;
+
char *atId = strtok((char*)args, " ");
if (!atId)
return false;
+
int32 i_atId = atoi(atId);
+
if(!i_atId)
return false;
+
AreaTriggerEntry const* at = sAreaTriggerStore.LookupEntry(i_atId);
if (!at)
{
@@ -165,12 +206,14 @@ bool ChatHandler::HandleGoTriggerCommand(const char* args)
SetSentErrorMessage(true);
return false;
}
+
if(!MapManager::IsValidMapCoord(at->mapid,at->x,at->y,at->z))
{
PSendSysMessage(LANG_INVALID_TARGET_COORD,at->x,at->y,at->mapid);
SetSentErrorMessage(true);
return false;
}
+
// stop flight if need
if(_player->isInFlight())
{
@@ -180,20 +223,27 @@ bool ChatHandler::HandleGoTriggerCommand(const char* args)
// save only in non-flight case
else
_player->SaveRecallPosition();
+
_player->TeleportTo(at->mapid, at->x, at->y, at->z, _player->GetOrientation());
return true;
}
+
bool ChatHandler::HandleGoGraveyardCommand(const char* args)
{
Player* _player = m_session->GetPlayer();
+
if (!*args)
return false;
+
char *gyId = strtok((char*)args, " ");
if (!gyId)
return false;
+
int32 i_gyId = atoi(gyId);
+
if(!i_gyId)
return false;
+
WorldSafeLocsEntry const* gy = sWorldSafeLocsStore.LookupEntry(i_gyId);
if (!gy)
{
@@ -201,12 +251,14 @@ bool ChatHandler::HandleGoGraveyardCommand(const char* args)
SetSentErrorMessage(true);
return false;
}
+
if(!MapManager::IsValidMapCoord(gy->map_id,gy->x,gy->y,gy->z))
{
PSendSysMessage(LANG_INVALID_TARGET_COORD,gy->x,gy->y,gy->map_id);
SetSentErrorMessage(true);
return false;
}
+
// stop flight if need
if(_player->isInFlight())
{
@@ -216,9 +268,11 @@ bool ChatHandler::HandleGoGraveyardCommand(const char* args)
// save only in non-flight case
else
_player->SaveRecallPosition();
+
_player->TeleportTo(gy->map_id, gy->x, gy->y, gy->z, _player->GetOrientation());
return true;
}
+
/** \brief Teleport the GM to the specified creature
*
* .gocreature <GUID> --> TP using creature.guid
@@ -235,15 +289,19 @@ bool ChatHandler::HandleGoCreatureCommand(const char* args)
if(!*args)
return false;
Player* _player = m_session->GetPlayer();
+
// "id" or number or [name] Shift-click form |color|Hcreature_entry:creature_id|h[name]|h|r
char* pParam1 = extractKeyFromLink((char*)args,"Hcreature");
if (!pParam1)
return false;
+
std::ostringstream whereClause;
+
// User wants to teleport to the NPC's template entry
if( strcmp(pParam1, "id") == 0 )
{
//sLog.outError("DEBUG: ID found");
+
// Get the "creature_template.entry"
// number or [name] Shift-click form |color|Hcreature_entry:creature_id|h[name]|h|r
char* tail = strtok(NULL,"");
@@ -252,16 +310,20 @@ bool ChatHandler::HandleGoCreatureCommand(const char* args)
char* cId = extractKeyFromLink(tail,"Hcreature_entry");
if(!cId)
return false;
+
int32 tEntry = atoi(cId);
//sLog.outError("DEBUG: ID value: %d", tEntry);
if(!tEntry)
return false;
+
whereClause << "WHERE id = '" << tEntry << "'";
}
else
{
//sLog.outError("DEBUG: ID *not found*");
+
int32 guid = atoi(pParam1);
+
// Number is invalid - maybe the user specified the mob's name
if(!guid)
{
@@ -275,6 +337,7 @@ bool ChatHandler::HandleGoCreatureCommand(const char* args)
}
}
//sLog.outError("DEBUG: %s", whereClause.c_str());
+
QueryResult *result = WorldDatabase.PQuery("SELECT position_x,position_y,position_z,orientation,map FROM creature %s", whereClause.str().c_str() );
if (!result)
{
@@ -286,19 +349,23 @@ bool ChatHandler::HandleGoCreatureCommand(const char* args)
{
SendSysMessage(LANG_COMMAND_GOCREATMULTIPLE);
}
+
Field *fields = result->Fetch();
float x = fields[0].GetFloat();
float y = fields[1].GetFloat();
float z = fields[2].GetFloat();
float ort = fields[3].GetFloat();
int mapid = fields[4].GetUInt16();
+
delete result;
+
if(!MapManager::IsValidMapCoord(mapid,x,y,z,ort))
{
PSendSysMessage(LANG_INVALID_TARGET_COORD,x,y,mapid);
SetSentErrorMessage(true);
return false;
}
+
// stop flight if need
if(_player->isInFlight())
{
@@ -308,24 +375,31 @@ bool ChatHandler::HandleGoCreatureCommand(const char* args)
// save only in non-flight case
else
_player->SaveRecallPosition();
+
_player->TeleportTo(mapid, x, y, z, ort);
return true;
}
+
//teleport to gameobject
bool ChatHandler::HandleGoObjectCommand(const char* args)
{
if(!*args)
return false;
+
Player* _player = m_session->GetPlayer();
+
// number or [name] Shift-click form |color|Hgameobject:go_guid|h[name]|h|r
char* cId = extractKeyFromLink((char*)args,"Hgameobject");
if(!cId)
return false;
+
int32 guid = atoi(cId);
if(!guid)
return false;
+
float x, y, z, ort;
int mapid;
+
// by DB guid
if (GameObjectData const* go_data = objmgr.GetGOData(guid))
{
@@ -341,12 +415,14 @@ bool ChatHandler::HandleGoObjectCommand(const char* args)
SetSentErrorMessage(true);
return false;
}
+
if(!MapManager::IsValidMapCoord(mapid,x,y,z,ort))
{
PSendSysMessage(LANG_INVALID_TARGET_COORD,x,y,mapid);
SetSentErrorMessage(true);
return false;
}
+
// stop flight if need
if(_player->isInFlight())
{
@@ -356,9 +432,11 @@ bool ChatHandler::HandleGoObjectCommand(const char* args)
// save only in non-flight case
else
_player->SaveRecallPosition();
+
_player->TeleportTo(mapid, x, y, z, ort);
return true;
}
+
bool ChatHandler::HandleGameObjectTargetCommand(const char* args)
{
Player* pl = m_session->GetPlayer();
@@ -370,7 +448,9 @@ bool ChatHandler::HandleGameObjectTargetCommand(const char* args)
char* cId = extractKeyFromLink((char*)args,"Hgameobject_entry");
if(!cId)
return false;
+
uint32 id = atol(cId);
+
if(id)
result = WorldDatabase.PQuery("SELECT guid, id, position_x, position_y, position_z, orientation, map, (POW(position_x - '%f', 2) + POW(position_y - '%f', 2) + POW(position_z - '%f', 2)) AS order_ FROM gameobject WHERE map = '%i' AND id = '%u' ORDER BY order_ ASC LIMIT 1",
pl->GetPositionX(), pl->GetPositionY(), pl->GetPositionZ(), pl->GetMapId(),id);
@@ -389,6 +469,7 @@ bool ChatHandler::HandleGameObjectTargetCommand(const char* args)
std::ostringstream eventFilter;
eventFilter << " AND (event IS NULL ";
bool initString = true;
+
for (GameEventMgr::ActiveEvents::const_iterator itr = activeEventsList.begin(); itr != activeEventsList.end(); ++itr)
{
if (initString)
@@ -399,24 +480,29 @@ bool ChatHandler::HandleGameObjectTargetCommand(const char* args)
else
eventFilter << "," << *itr;
}
+
if (!initString)
eventFilter << "))";
else
eventFilter << ")";
+
result = WorldDatabase.PQuery("SELECT gameobject.guid, id, position_x, position_y, position_z, orientation, map, "
"(POW(position_x - %f, 2) + POW(position_y - %f, 2) + POW(position_z - %f, 2)) AS order_ FROM gameobject "
"LEFT OUTER JOIN game_event_gameobject on gameobject.guid=game_event_gameobject.guid WHERE map = '%i' %s ORDER BY order_ ASC LIMIT 10",
m_session->GetPlayer()->GetPositionX(), m_session->GetPlayer()->GetPositionY(), m_session->GetPlayer()->GetPositionZ(), m_session->GetPlayer()->GetMapId(),eventFilter.str().c_str());
}
+
if (!result)
{
SendSysMessage(LANG_COMMAND_TARGETOBJNOTFOUND);
return true;
}
+
bool found = false;
float x, y, z, o;
uint32 lowguid, id;
uint16 mapid, pool_id;
+
do
{
Field *fields = result->Fetch();
@@ -431,31 +517,41 @@ bool ChatHandler::HandleGameObjectTargetCommand(const char* args)
if (!pool_id || (pool_id && poolhandler.IsSpawnedObject(pool_id, lowguid, TYPEID_GAMEOBJECT)))
found = true;
} while( result->NextRow() && (!found) );
+
delete result;
+
if (!found)
{
PSendSysMessage(LANG_GAMEOBJECT_NOT_EXIST,id);
return false;
}
+
GameObjectInfo const* goI = objmgr.GetGameObjectInfo(id);
+
if (!goI)
{
PSendSysMessage(LANG_GAMEOBJECT_NOT_EXIST,id);
return false;
}
+
GameObject* target = m_session->GetPlayer()->GetMap()->GetGameObject(MAKE_NEW_GUID(lowguid,id,HIGHGUID_GAMEOBJECT));
+
PSendSysMessage(LANG_GAMEOBJECT_DETAIL, lowguid, goI->name, lowguid, id, x, y, z, mapid, o);
+
if(target)
{
int32 curRespawnDelay = target->GetRespawnTimeEx()-time(NULL);
if(curRespawnDelay < 0)
curRespawnDelay = 0;
+
std::string curRespawnDelayStr = secsToTimeString(curRespawnDelay,true);
std::string defRespawnDelayStr = secsToTimeString(target->GetRespawnDelay(),true);
+
PSendSysMessage(LANG_COMMAND_RAWPAWNTIMES, defRespawnDelayStr.c_str(),curRespawnDelayStr.c_str());
}
return true;
}
+
//delete object by selection or guid
bool ChatHandler::HandleGameObjectDeleteCommand(const char* args)
{
@@ -463,19 +559,24 @@ bool ChatHandler::HandleGameObjectDeleteCommand(const char* args)
char* cId = extractKeyFromLink((char*)args,"Hgameobject");
if(!cId)
return false;
+
uint32 lowguid = atoi(cId);
if(!lowguid)
return false;
+
GameObject* obj = NULL;
+
// by DB guid
if (GameObjectData const* go_data = objmgr.GetGOData(lowguid))
obj = GetObjectGlobalyWithGuidOrNearWithDbGuid(lowguid,go_data->id);
+
if(!obj)
{
PSendSysMessage(LANG_COMMAND_OBJNOTFOUND, lowguid);
SetSentErrorMessage(true);
return false;
}
+
uint64 owner_guid = obj->GetOwnerGUID();
if(owner_guid)
{
@@ -486,14 +587,19 @@ bool ChatHandler::HandleGameObjectDeleteCommand(const char* args)
SetSentErrorMessage(true);
return false;
}
+
owner->RemoveGameObject(obj,false);
}
+
obj->SetRespawnTime(0); // not save respawn time
obj->Delete();
obj->DeleteFromDB();
+
PSendSysMessage(LANG_COMMAND_DELOBJMESSAGE, obj->GetGUIDLow());
+
return true;
}
+
//turn selected object
bool ChatHandler::HandleGameObjectTurnCommand(const char* args)
{
@@ -501,21 +607,27 @@ bool ChatHandler::HandleGameObjectTurnCommand(const char* args)
char* cId = extractKeyFromLink((char*)args,"Hgameobject");
if(!cId)
return false;
+
uint32 lowguid = atoi(cId);
if(!lowguid)
return false;
+
GameObject* obj = NULL;
+
// by DB guid
if (GameObjectData const* go_data = objmgr.GetGOData(lowguid))
obj = GetObjectGlobalyWithGuidOrNearWithDbGuid(lowguid,go_data->id);
+
if(!obj)
{
PSendSysMessage(LANG_COMMAND_OBJNOTFOUND, lowguid);
SetSentErrorMessage(true);
return false;
}
+
char* po = strtok(NULL, " ");
float o;
+
if (po)
{
o = (float)atof(po);
@@ -525,15 +637,20 @@ bool ChatHandler::HandleGameObjectTurnCommand(const char* args)
Player *chr = m_session->GetPlayer();
o = chr->GetOrientation();
}
+
obj->Relocate(obj->GetPositionX(), obj->GetPositionY(), obj->GetPositionZ(), o);
obj->UpdateRotationFields();
obj->DestroyForNearbyPlayers();
ObjectAccessor::UpdateObjectVisibility(obj);
+
obj->SaveToDB();
obj->Refresh();
+
PSendSysMessage(LANG_COMMAND_TURNOBJMESSAGE, obj->GetGUIDLow(), obj->GetGOInfo()->name, obj->GetGUIDLow(), o);
+
return true;
}
+
//move selected object
bool ChatHandler::HandleGameObjectMoveCommand(const char* args)
{
@@ -541,22 +658,28 @@ bool ChatHandler::HandleGameObjectMoveCommand(const char* args)
char* cId = extractKeyFromLink((char*)args,"Hgameobject");
if(!cId)
return false;
+
uint32 lowguid = atoi(cId);
if(!lowguid)
return false;
+
GameObject* obj = NULL;
+
// by DB guid
if (GameObjectData const* go_data = objmgr.GetGOData(lowguid))
obj = GetObjectGlobalyWithGuidOrNearWithDbGuid(lowguid,go_data->id);
+
if(!obj)
{
PSendSysMessage(LANG_COMMAND_OBJNOTFOUND, lowguid);
SetSentErrorMessage(true);
return false;
}
+
char* px = strtok(NULL, " ");
char* py = strtok(NULL, " ");
char* pz = strtok(NULL, " ");
+
if (!px)
{
Player *chr = m_session->GetPlayer();
@@ -568,44 +691,57 @@ bool ChatHandler::HandleGameObjectMoveCommand(const char* args)
{
if(!py || !pz)
return false;
+
float x = (float)atof(px);
float y = (float)atof(py);
float z = (float)atof(pz);
+
if(!MapManager::IsValidMapCoord(obj->GetMapId(),x,y,z))
{
PSendSysMessage(LANG_INVALID_TARGET_COORD,x,y,obj->GetMapId());
SetSentErrorMessage(true);
return false;
}
+
obj->Relocate(x, y, z, obj->GetOrientation());
obj->DestroyForNearbyPlayers();
ObjectAccessor::UpdateObjectVisibility(obj);
}
+
obj->SaveToDB();
obj->Refresh();
+
PSendSysMessage(LANG_COMMAND_MOVEOBJMESSAGE, obj->GetGUIDLow(), obj->GetGOInfo()->name, obj->GetGUIDLow());
+
return true;
}
+
//spawn go
bool ChatHandler::HandleGameObjectAddCommand(const char* args)
{
if (!*args)
return false;
+
// number or [name] Shift-click form |color|Hgameobject_entry:go_id|h[name]|h|r
char* cId = extractKeyFromLink((char*)args,"Hgameobject_entry");
if(!cId)
return false;
+
uint32 id = atol(cId);
if(!id)
return false;
+
char* spawntimeSecs = strtok(NULL, " ");
+
const GameObjectInfo *gInfo = objmgr.GetGameObjectInfo(id);
+
if (!gInfo)
{
PSendSysMessage(LANG_GAMEOBJECT_NOT_EXIST,id);
SetSentErrorMessage(true);
return false;
}
+
if (gInfo->displayId && !sGameObjectDisplayInfoStore.LookupEntry(gInfo->displayId))
{
// report to DB errors log as in loading case
@@ -614,40 +750,51 @@ bool ChatHandler::HandleGameObjectAddCommand(const char* args)
SetSentErrorMessage(true);
return false;
}
+
Player *chr = m_session->GetPlayer();
float x = float(chr->GetPositionX());
float y = float(chr->GetPositionY());
float z = float(chr->GetPositionZ());
float o = float(chr->GetOrientation());
Map *map = chr->GetMap();
+
GameObject* pGameObj = new GameObject;
uint32 db_lowGUID = objmgr.GenerateLowGuid(HIGHGUID_GAMEOBJECT);
+
if(!pGameObj->Create(db_lowGUID, gInfo->id, map, chr->GetPhaseMaskForSpawn(), x, y, z, o, 0.0f, 0.0f, 0.0f, 0.0f, 0, GO_STATE_READY))
{
delete pGameObj;
return false;
}
+
if( spawntimeSecs )
{
uint32 value = atoi((char*)spawntimeSecs);
pGameObj->SetRespawnTime(value);
//sLog.outDebug("*** spawntimeSecs: %d", value);
}
+
// fill the gameobject data and save to the db
pGameObj->SaveToDB(map->GetId(), (1 << map->GetSpawnMode()),chr->GetPhaseMaskForSpawn());
+
// this will generate a new guid if the object is in an instance
if(!pGameObj->LoadFromDB(db_lowGUID, map))
{
delete pGameObj;
return false;
}
+
sLog.outDebug(GetMangosString(LANG_GAMEOBJECT_CURRENT), gInfo->name, db_lowGUID, x, y, z, o);
+
map->Add(pGameObj);
+
// TODO: is it really necessary to add both the real and DB table guid here ?
objmgr.AddGameobjectToGrid(db_lowGUID, objmgr.GetGOData(db_lowGUID));
+
PSendSysMessage(LANG_GAMEOBJECT_ADD,id,gInfo->name,db_lowGUID,x,y,z);
return true;
}
+
//set pahsemask for selected object
bool ChatHandler::HandleGameObjectPhaseCommand(const char* args)
{
@@ -655,19 +802,24 @@ bool ChatHandler::HandleGameObjectPhaseCommand(const char* args)
char* cId = extractKeyFromLink((char*)args,"Hgameobject");
if(!cId)
return false;
+
uint32 lowguid = atoi(cId);
if(!lowguid)
return false;
+
GameObject* obj = NULL;
+
// by DB guid
if (GameObjectData const* go_data = objmgr.GetGOData(lowguid))
obj = GetObjectGlobalyWithGuidOrNearWithDbGuid(lowguid,go_data->id);
+
if(!obj)
{
PSendSysMessage(LANG_COMMAND_OBJNOTFOUND, lowguid);
SetSentErrorMessage(true);
return false;
}
+
char* phaseStr = strtok (NULL, " ");
uint32 phasemask = phaseStr? atoi(phaseStr) : 0;
if ( phasemask == 0 )
@@ -676,20 +828,24 @@ bool ChatHandler::HandleGameObjectPhaseCommand(const char* args)
SetSentErrorMessage(true);
return false;
}
+
obj->SetPhaseMask(phasemask,true);
obj->SaveToDB();
return true;
}
+
bool ChatHandler::HandleGameObjectNearCommand(const char* args)
{
float distance = (!*args) ? 10 : atol(args);
uint32 count = 0;
+
Player* pl = m_session->GetPlayer();
QueryResult *result = WorldDatabase.PQuery("SELECT guid, id, position_x, position_y, position_z, map, "
"(POW(position_x - '%f', 2) + POW(position_y - '%f', 2) + POW(position_z - '%f', 2)) AS order_ "
"FROM gameobject WHERE map='%u' AND (POW(position_x - '%f', 2) + POW(position_y - '%f', 2) + POW(position_z - '%f', 2)) <= '%f' ORDER BY order_",
pl->GetPositionX(), pl->GetPositionY(), pl->GetPositionZ(),
pl->GetMapId(),pl->GetPositionX(), pl->GetPositionY(), pl->GetPositionZ(),distance*distance);
+
if (result)
{
do
@@ -701,51 +857,68 @@ bool ChatHandler::HandleGameObjectNearCommand(const char* args)
float y = fields[3].GetFloat();
float z = fields[4].GetFloat();
int mapid = fields[5].GetUInt16();
+
GameObjectInfo const * gInfo = objmgr.GetGameObjectInfo(entry);
+
if(!gInfo)
continue;
+
PSendSysMessage(LANG_GO_LIST_CHAT, guid, guid, gInfo->name, x, y, z, mapid);
+
++count;
} while (result->NextRow());
+
delete result;
}
+
PSendSysMessage(LANG_COMMAND_NEAROBJMESSAGE,distance,count);
return true;
}
+
bool ChatHandler::HandleGUIDCommand(const char* /*args*/)
{
uint64 guid = m_session->GetPlayer()->GetSelection();
+
if (guid == 0)
{
SendSysMessage(LANG_NO_SELECTION);
SetSentErrorMessage(true);
return false;
}
+
PSendSysMessage(LANG_OBJECT_GUID, GUID_LOPART(guid), GUID_HIPART(guid));
return true;
}
+
bool ChatHandler::HandleModifyRepCommand(const char * args)
{
if (!*args) return false;
+
Player* target = NULL;
target = getSelectedPlayer();
+
if(!target)
{
SendSysMessage(LANG_PLAYER_NOT_FOUND);
SetSentErrorMessage(true);
return false;
}
+
// check online security
if (HasLowerSecurity(target, 0))
return false;
+
char* factionTxt = extractKeyFromLink((char*)args,"Hfaction");
if(!factionTxt)
return false;
+
uint32 factionId = atoi(factionTxt);
+
int32 amount = 0;
char *rankTxt = strtok(NULL, " ");
if (!factionTxt || !rankTxt)
return false;
+
amount = atoi(rankTxt);
if ((amount == 0) && (rankTxt[0] != '-') && !isdigit(rankTxt[0]))
{
@@ -754,6 +927,7 @@ bool ChatHandler::HandleModifyRepCommand(const char * args)
if(!Utf8toWStr(rankStr,wrankStr))
return false;
wstrToLower( wrankStr );
+
int r = 0;
amount = -42000;
for (; r < MAX_REPUTATION_RANK; ++r)
@@ -761,10 +935,13 @@ bool ChatHandler::HandleModifyRepCommand(const char * args)
std::string rank = GetTrinityString(ReputationRankStrIndex[r]);
if(rank.empty())
continue;
+
std::wstring wrank;
if(!Utf8toWStr(rank,wrank))
continue;
+
wstrToLower(wrank);
+
if(wrank.substr(0,wrankStr.size())==wrankStr)
{
char *deltaTxt = strtok(NULL, " ");
@@ -790,24 +967,29 @@ bool ChatHandler::HandleModifyRepCommand(const char * args)
return false;
}
}
+
FactionEntry const *factionEntry = sFactionStore.LookupEntry(factionId);
+
if (!factionEntry)
{
PSendSysMessage(LANG_COMMAND_FACTION_UNKNOWN, factionId);
SetSentErrorMessage(true);
return false;
}
+
if (factionEntry->reputationListID < 0)
{
PSendSysMessage(LANG_COMMAND_FACTION_NOREP_ERROR, factionEntry->name[GetSessionDbcLocale()], factionId);
SetSentErrorMessage(true);
return false;
}
+
target->GetReputationMgr().SetReputation(factionEntry,amount);
PSendSysMessage(LANG_COMMAND_MODIFY_REP, factionEntry->name[GetSessionDbcLocale()], factionId,
GetNameLink(target).c_str(), target->GetReputationMgr().GetReputation(factionEntry));
return true;
}
+
//-----------------------Npc Commands-----------------------
//add spawn of creature
bool ChatHandler::HandleNpcAddCommand(const char* args)
@@ -817,36 +999,46 @@ bool ChatHandler::HandleNpcAddCommand(const char* args)
char* charID = extractKeyFromLink((char*)args,"Hcreature_entry");
if(!charID)
return false;
+
char* team = strtok(NULL, " ");
int32 teamval = 0;
if (team) { teamval = atoi(team); }
if (teamval < 0) { teamval = 0; }
+
uint32 id = atoi(charID);
+
Player *chr = m_session->GetPlayer();
float x = chr->GetPositionX();
float y = chr->GetPositionY();
float z = chr->GetPositionZ();
float o = chr->GetOrientation();
Map *map = chr->GetMap();
+
Creature* pCreature = new Creature;
if (!pCreature->Create(objmgr.GenerateLowGuid(HIGHGUID_UNIT), map, chr->GetPhaseMaskForSpawn(), id, 0, (uint32)teamval, x, y, z, o))
{
delete pCreature;
return false;
}
+
pCreature->SaveToDB(map->GetId(), (1 << map->GetSpawnMode()), chr->GetPhaseMaskForSpawn());
+
uint32 db_guid = pCreature->GetDBTableGUIDLow();
+
// To call _LoadGoods(); _LoadQuests(); CreateTrainerSpells();
pCreature->LoadFromDB(db_guid, map);
+
map->Add(pCreature);
objmgr.AddCreatureToGrid(db_guid, objmgr.GetCreatureData(db_guid));
return true;
}
+
//add item in vendorlist
bool ChatHandler::HandleNpcAddVendorItemCommand(const char* args)
{
if (!*args)
return false;
+
char* pitem = extractKeyFromLink((char*)args,"Hitem");
if (!pitem)
{
@@ -854,34 +1046,46 @@ bool ChatHandler::HandleNpcAddVendorItemCommand(const char* args)
SetSentErrorMessage(true);
return false;
}
+
uint32 itemId = atol(pitem);
+
char* fmaxcount = strtok(NULL, " "); //add maxcount, default: 0
uint32 maxcount = 0;
if (fmaxcount)
maxcount = atol(fmaxcount);
+
char* fincrtime = strtok(NULL, " "); //add incrtime, default: 0
uint32 incrtime = 0;
if (fincrtime)
incrtime = atol(fincrtime);
+
char* fextendedcost = strtok(NULL, " "); //add ExtendedCost, default: 0
uint32 extendedcost = fextendedcost ? atol(fextendedcost) : 0;
+
Creature* vendor = getSelectedCreature();
+
uint32 vendor_entry = vendor ? vendor->GetEntry() : 0;
+
if(!objmgr.IsVendorItemValid(vendor_entry,itemId,maxcount,incrtime,extendedcost,m_session->GetPlayer()))
{
SetSentErrorMessage(true);
return false;
}
+
objmgr.AddVendorItem(vendor_entry,itemId,maxcount,incrtime,extendedcost);
+
ItemPrototype const* pProto = objmgr.GetItemPrototype(itemId);
+
PSendSysMessage(LANG_ITEM_ADDED_TO_LIST,itemId,pProto->Name1,maxcount,incrtime,extendedcost);
return true;
}
+
//del item from vendor list
bool ChatHandler::HandleNpcDelVendorItemCommand(const char* args)
{
if (!*args)
return false;
+
Creature* vendor = getSelectedCreature();
if (!vendor || !vendor->isVendor())
{
@@ -889,6 +1093,7 @@ bool ChatHandler::HandleNpcDelVendorItemCommand(const char* args)
SetSentErrorMessage(true);
return false;
}
+
char* pitem = extractKeyFromLink((char*)args,"Hitem");
if (!pitem)
{
@@ -897,29 +1102,38 @@ bool ChatHandler::HandleNpcDelVendorItemCommand(const char* args)
return false;
}
uint32 itemId = atol(pitem);
+
if(!objmgr.RemoveVendorItem(vendor->GetEntry(),itemId))
{
PSendSysMessage(LANG_ITEM_NOT_IN_LIST,itemId);
SetSentErrorMessage(true);
return false;
}
+
ItemPrototype const* pProto = objmgr.GetItemPrototype(itemId);
+
PSendSysMessage(LANG_ITEM_DELETED_FROM_LIST,itemId,pProto->Name1);
return true;
}
+
//add move for creature
bool ChatHandler::HandleNpcAddMoveCommand(const char* args)
{
if(!*args)
return false;
+
char* guid_str = strtok((char*)args, " ");
char* wait_str = strtok((char*)NULL, " ");
+
uint32 lowguid = atoi((char*)guid_str);
+
Creature* pCreature = NULL;
+
/* FIXME: impossible without entry
if(lowguid)
pCreature = ObjectAccessor::GetCreature(*m_session->GetPlayer(),MAKE_GUID(lowguid,HIGHGUID_UNIT));
*/
+
// attempt check creature existence by DB data
if(!pCreature)
{
@@ -936,11 +1150,16 @@ bool ChatHandler::HandleNpcAddMoveCommand(const char* args)
// obtain real GUID for DB operations
lowguid = pCreature->GetDBTableGUIDLow();
}
+
int wait = wait_str ? atoi(wait_str) : 0;
+
if(wait < 0)
wait = 0;
+
Player* player = m_session->GetPlayer();
+
//WaypointMgr.AddLastNode(lowguid, player->GetPositionX(), player->GetPositionY(), player->GetPositionZ(), player->GetOrientation(), wait, 0);
+
// update movement type
WorldDatabase.PExecuteLog("UPDATE creature SET MovementType = '%u' WHERE guid = '%u'", WAYPOINT_MOTION_TYPE,lowguid);
if(pCreature && pCreature->GetWaypointPath())
@@ -954,14 +1173,18 @@ bool ChatHandler::HandleNpcAddMoveCommand(const char* args)
}
pCreature->SaveToDB();
}
+
SendSysMessage(LANG_WAYPOINT_ADDED);
+
return true;
}
+
//change level of creature or pet
bool ChatHandler::HandleNpcChangeLevelCommand(const char* args)
{
if (!*args)
return false;
+
uint8 lvl = (uint8) atoi((char*)args);
if ( lvl < 1 || lvl > sWorld.getConfig(CONFIG_MAX_PLAYER_LEVEL) + 3)
{
@@ -969,6 +1192,7 @@ bool ChatHandler::HandleNpcChangeLevelCommand(const char* args)
SetSentErrorMessage(true);
return false;
}
+
Creature* pCreature = getSelectedCreature();
if(!pCreature)
{
@@ -976,6 +1200,7 @@ bool ChatHandler::HandleNpcChangeLevelCommand(const char* args)
SetSentErrorMessage(true);
return false;
}
+
if(pCreature->isPet())
{
if(((Pet*)pCreature)->getPetType()==HUNTER_PET)
@@ -992,72 +1217,95 @@ bool ChatHandler::HandleNpcChangeLevelCommand(const char* args)
pCreature->SetLevel( lvl);
pCreature->SaveToDB();
}
+
return true;
}
+
//set npcflag of creature
bool ChatHandler::HandleNpcFlagCommand(const char* args)
{
if (!*args)
return false;
+
uint32 npcFlags = (uint32) atoi((char*)args);
+
Creature* pCreature = getSelectedCreature();
+
if(!pCreature)
{
SendSysMessage(LANG_SELECT_CREATURE);
SetSentErrorMessage(true);
return false;
}
+
pCreature->SetUInt32Value(UNIT_NPC_FLAGS, npcFlags);
+
WorldDatabase.PExecuteLog("UPDATE creature_template SET npcflag = '%u' WHERE entry = '%u'", npcFlags, pCreature->GetEntry());
+
SendSysMessage(LANG_VALUE_SAVED_REJOIN);
+
return true;
}
+
bool ChatHandler::HandleNpcDeleteCommand(const char* args)
{
Creature* unit = NULL;
+
if(*args)
{
// number or [name] Shift-click form |color|Hcreature:creature_guid|h[name]|h|r
char* cId = extractKeyFromLink((char*)args,"Hcreature");
if(!cId)
return false;
+
uint32 lowguid = atoi(cId);
if(!lowguid)
return false;
+
if (CreatureData const* cr_data = objmgr.GetCreatureData(lowguid))
unit = m_session->GetPlayer()->GetMap()->GetCreature(MAKE_NEW_GUID(lowguid, cr_data->id, HIGHGUID_UNIT));
}
else
unit = getSelectedCreature();
+
if(!unit || unit->isPet() || unit->isTotem())
{
SendSysMessage(LANG_SELECT_CREATURE);
SetSentErrorMessage(true);
return false;
}
+
// Delete the creature
unit->CombatStop();
unit->DeleteFromDB();
unit->AddObjectToRemoveList();
+
SendSysMessage(LANG_COMMAND_DELCREATMESSAGE);
+
return true;
}
+
//move selected creature
bool ChatHandler::HandleNpcMoveCommand(const char* args)
{
uint32 lowguid = 0;
+
Creature* pCreature = getSelectedCreature();
+
if(!pCreature)
{
// number or [name] Shift-click form |color|Hcreature:creature_guid|h[name]|h|r
char* cId = extractKeyFromLink((char*)args,"Hcreature");
if(!cId)
return false;
+
lowguid = atoi(cId);
+
/* FIXME: impossibel without entry
if(lowguid)
pCreature = ObjectAccessor::GetCreature(*m_session->GetPlayer(),MAKE_GUID(lowguid,HIGHGUID_UNIT));
*/
+
// Attempting creature load from DB data
if(!pCreature)
{
@@ -1068,7 +1316,9 @@ bool ChatHandler::HandleNpcMoveCommand(const char* args)
SetSentErrorMessage(true);
return false;
}
+
uint32 map_id = data->mapid;
+
if(m_session->GetPlayer()->GetMapId()!=map_id)
{
PSendSysMessage(LANG_COMMAND_CREATUREATSAMEMAP, lowguid);
@@ -1085,10 +1335,12 @@ bool ChatHandler::HandleNpcMoveCommand(const char* args)
{
lowguid = pCreature->GetDBTableGUIDLow();
}
+
float x = m_session->GetPlayer()->GetPositionX();
float y = m_session->GetPlayer()->GetPositionY();
float z = m_session->GetPlayer()->GetPositionZ();
float o = m_session->GetPlayer()->GetOrientation();
+
if (pCreature)
{
if(CreatureData const* data = objmgr.GetCreatureData(pCreature->GetDBTableGUIDLow()))
@@ -1106,10 +1358,12 @@ bool ChatHandler::HandleNpcMoveCommand(const char* args)
pCreature->Respawn();
}
}
+
WorldDatabase.PExecuteLog("UPDATE creature SET position_x = '%f', position_y = '%f', position_z = '%f', orientation = '%f' WHERE guid = '%u'", x, y, z, o, lowguid);
PSendSysMessage(LANG_COMMAND_CREATUREMOVED);
return true;
}
+
/**HandleNpcSetMoveTypeCommand
* Set the movement type for an NPC.<br/>
* <br/>
@@ -1126,6 +1380,7 @@ bool ChatHandler::HandleNpcSetMoveTypeCommand(const char* args)
{
if(!*args)
return false;
+
// 3 arguments:
// GUID (optional - you can also select the creature)
// stay|random|way (determines the kind of movement)
@@ -1136,14 +1391,19 @@ bool ChatHandler::HandleNpcSetMoveTypeCommand(const char* args)
char* guid_str = strtok((char*)args, " ");
char* type_str = strtok((char*)NULL, " ");
char* dontdel_str = strtok((char*)NULL, " ");
+
bool doNotDelete = false;
+
if(!guid_str)
return false;
+
uint32 lowguid = 0;
Creature* pCreature = NULL;
+
if( dontdel_str )
{
//sLog.outError("DEBUG: All 3 params are set");
+
// All 3 params are set
// GUID
// type
@@ -1168,6 +1428,7 @@ bool ChatHandler::HandleNpcSetMoveTypeCommand(const char* args)
}
}
}
+
if(!type_str) // case .setmovetype $move_type (with selected creature)
{
type_str = guid_str;
@@ -1179,10 +1440,12 @@ bool ChatHandler::HandleNpcSetMoveTypeCommand(const char* args)
else // case .setmovetype #creature_guid $move_type (with selected creature)
{
lowguid = atoi((char*)guid_str);
+
/* impossible without entry
if(lowguid)
pCreature = ObjectAccessor::GetCreature(*m_session->GetPlayer(),MAKE_GUID(lowguid,HIGHGUID_UNIT));
*/
+
// attempt check creature existence by DB data
if(!pCreature)
{
@@ -1199,10 +1462,14 @@ bool ChatHandler::HandleNpcSetMoveTypeCommand(const char* args)
lowguid = pCreature->GetDBTableGUIDLow();
}
}
+
// now lowguid is low guid really existed creature
// and pCreature point (maybe) to this creature or NULL
+
MovementGeneratorType move_type;
+
std::string type = type_str;
+
if(type == "stay")
move_type = IDLE_MOTION_TYPE;
else if(type == "random")
@@ -1211,14 +1478,17 @@ bool ChatHandler::HandleNpcSetMoveTypeCommand(const char* args)
move_type = WAYPOINT_MOTION_TYPE;
else
return false;
+
// update movement type
//if(doNotDelete == false)
// WaypointMgr.DeletePath(lowguid);
+
if(pCreature)
{
// update movement type
if(doNotDelete == false)
pCreature->LoadPath(0);
+
pCreature->SetDefaultMovementType(move_type);
pCreature->GetMotionMaster()->Initialize();
if(pCreature->isAlive()) // dead creature will reset movement generator at respawn
@@ -1236,24 +1506,32 @@ bool ChatHandler::HandleNpcSetMoveTypeCommand(const char* args)
{
PSendSysMessage(LANG_MOVE_TYPE_SET_NODEL,type_str);
}
+
return true;
}
+
//set model of creature
bool ChatHandler::HandleNpcSetModelCommand(const char* args)
{
if (!*args)
return false;
+
uint32 displayId = (uint32) atoi((char*)args);
+
Creature *pCreature = getSelectedCreature();
+
if(!pCreature || pCreature->isPet())
{
SendSysMessage(LANG_SELECT_CREATURE);
SetSentErrorMessage(true);
return false;
}
+
pCreature->SetDisplayId(displayId);
pCreature->SetNativeDisplayId(displayId);
+
pCreature->SaveToDB();
+
return true;
}
//set faction of creature
@@ -1261,30 +1539,39 @@ bool ChatHandler::HandleNpcFactionIdCommand(const char* args)
{
if (!*args)
return false;
+
uint32 factionId = (uint32) atoi((char*)args);
+
if (!sFactionTemplateStore.LookupEntry(factionId))
{
PSendSysMessage(LANG_WRONG_FACTION, factionId);
SetSentErrorMessage(true);
return false;
}
+
Creature* pCreature = getSelectedCreature();
+
if(!pCreature)
{
SendSysMessage(LANG_SELECT_CREATURE);
SetSentErrorMessage(true);
return false;
}
+
pCreature->setFaction(factionId);
+
// faction is set in creature_template - not inside creature
+
// update in memory
if(CreatureInfo const *cinfo = pCreature->GetCreatureInfo())
{
const_cast<CreatureInfo*>(cinfo)->faction_A = factionId;
const_cast<CreatureInfo*>(cinfo)->faction_H = factionId;
}
+
// and DB
WorldDatabase.PExecuteLog("UPDATE creature_template SET faction_A = '%u', faction_H = '%u' WHERE entry = '%u'", factionId, factionId, pCreature->GetEntry());
+
return true;
}
//set spawn dist of creature
@@ -1292,21 +1579,26 @@ bool ChatHandler::HandleNpcSpawnDistCommand(const char* args)
{
if(!*args)
return false;
+
float option = atof((char*)args);
if (option < 0.0f)
{
SendSysMessage(LANG_BAD_VALUE);
return false;
}
+
MovementGeneratorType mtype = IDLE_MOTION_TYPE;
if (option >0.0f)
mtype = RANDOM_MOTION_TYPE;
+
Creature *pCreature = getSelectedCreature();
uint32 u_guidlow = 0;
+
if (pCreature)
u_guidlow = pCreature->GetDBTableGUIDLow();
else
return false;
+
pCreature->SetRespawnRadius((float)option);
pCreature->SetDefaultMovementType(mtype);
pCreature->GetMotionMaster()->Initialize();
@@ -1315,6 +1607,7 @@ bool ChatHandler::HandleNpcSpawnDistCommand(const char* args)
pCreature->setDeathState(JUST_DIED);
pCreature->Respawn();
}
+
WorldDatabase.PExecuteLog("UPDATE creature SET spawndist=%f, MovementType=%i WHERE guid=%u",option,mtype,u_guidlow);
PSendSysMessage(LANG_COMMAND_SPAWNDIST,option);
return true;
@@ -1324,25 +1617,33 @@ bool ChatHandler::HandleNpcSpawnTimeCommand(const char* args)
{
if(!*args)
return false;
+
char* stime = strtok((char*)args, " ");
+
if (!stime)
return false;
+
int i_stime = atoi((char*)stime);
+
if (i_stime < 0)
{
SendSysMessage(LANG_BAD_VALUE);
SetSentErrorMessage(true);
return false;
}
+
Creature *pCreature = getSelectedCreature();
uint32 u_guidlow = 0;
+
if (pCreature)
u_guidlow = pCreature->GetDBTableGUIDLow();
else
return false;
+
WorldDatabase.PExecuteLog("UPDATE creature SET spawntimesecs=%i WHERE guid=%u",i_stime,u_guidlow);
pCreature->SetRespawnDelay((uint32)i_stime);
PSendSysMessage(LANG_COMMAND_SPAWNTIME,i_stime);
+
return true;
}
//npc follow handling
@@ -1350,14 +1651,17 @@ bool ChatHandler::HandleNpcFollowCommand(const char* /*args*/)
{
Player *player = m_session->GetPlayer();
Creature *creature = getSelectedCreature();
+
if(!creature)
{
PSendSysMessage(LANG_SELECT_CREATURE);
SetSentErrorMessage(true);
return false;
}
+
// Follow player - Using pet's default dist and angle
creature->GetMotionMaster()->MoveFollow(player, PET_FOLLOW_DIST, creature->GetFollowAngle());
+
PSendSysMessage(LANG_CREATURE_FOLLOW_YOU_NOW, creature->GetName());
return true;
}
@@ -1366,12 +1670,14 @@ bool ChatHandler::HandleNpcUnFollowCommand(const char* /*args*/)
{
Player *player = m_session->GetPlayer();
Creature *creature = getSelectedCreature();
+
if(!creature)
{
PSendSysMessage(LANG_SELECT_CREATURE);
SetSentErrorMessage(true);
return false;
}
+
if (/*creature->GetMotionMaster()->empty() ||*/
creature->GetMotionMaster()->GetCurrentMovementGeneratorType ()!=TARGETED_MOTION_TYPE)
{
@@ -1379,16 +1685,20 @@ bool ChatHandler::HandleNpcUnFollowCommand(const char* /*args*/)
SetSentErrorMessage(true);
return false;
}
+
TargetedMovementGenerator<Creature> const* mgen
= static_cast<TargetedMovementGenerator<Creature> const*>((creature->GetMotionMaster()->top()));
+
if(mgen->GetTarget()!=player)
{
PSendSysMessage(LANG_CREATURE_NOT_FOLLOW_YOU);
SetSentErrorMessage(true);
return false;
}
+
// reset movement
creature->GetMotionMaster()->MovementExpired(true);
+
PSendSysMessage(LANG_CREATURE_NOT_FOLLOW_YOU_NOW, creature->GetName());
return true;
}
@@ -1402,20 +1712,25 @@ bool ChatHandler::HandleNpcTameCommand(const char* /*args*/)
SetSentErrorMessage (true);
return false;
}
+
Player *player = m_session->GetPlayer ();
+
if(player->GetPetGUID ())
{
SendSysMessage (LANG_YOU_ALREADY_HAVE_PET);
SetSentErrorMessage (true);
return false;
}
+
CreatureInfo const* cInfo = creatureTarget->GetCreatureInfo();
+
if (!cInfo->isTameable (player->CanTameExoticPets()))
{
PSendSysMessage (LANG_CREATURE_NON_TAMEABLE,cInfo->Entry);
SetSentErrorMessage (true);
return false;
}
+
// Everything looks OK, create new pet
Pet* pet = player->CreateTamedPetFrom (creatureTarget);
if (!pet)
@@ -1424,24 +1739,33 @@ bool ChatHandler::HandleNpcTameCommand(const char* /*args*/)
SetSentErrorMessage (true);
return false;
}
+
// place pet before player
float x,y,z;
player->GetClosePoint (x,y,z,creatureTarget->GetObjectSize (),CONTACT_DISTANCE);
pet->Relocate (x,y,z,M_PI-player->GetOrientation ());
+
// set pet to defensive mode by default (some classes can't control controlled pets in fact).
pet->SetReactState(REACT_DEFENSIVE);
+
// calculate proper level
uint32 level = (creatureTarget->getLevel() < (player->getLevel() - 5)) ? (player->getLevel() - 5) : creatureTarget->getLevel();
+
// prepare visual effect for levelup
pet->SetUInt32Value(UNIT_FIELD_LEVEL, level - 1);
+
// add to world
pet->GetMap()->Add((Creature*)pet);
+
// visual effect for levelup
pet->SetUInt32Value(UNIT_FIELD_LEVEL, level);
+
// caster have pet now
player->SetMinion(pet, true);
+
pet->SavePetToDB(PET_SAVE_AS_CURRENT);
player->PetSpellInitialize();
+
return true;
}
//npc phasemask handling
@@ -1450,6 +1774,7 @@ bool ChatHandler::HandleNpcSetPhaseCommand(const char* args)
{
if (!*args)
return false;
+
uint32 phasemask = (uint32) atoi((char*)args);
if ( phasemask == 0 )
{
@@ -1457,6 +1782,7 @@ bool ChatHandler::HandleNpcSetPhaseCommand(const char* args)
SetSentErrorMessage(true);
return false;
}
+
Creature* pCreature = getSelectedCreature();
if(!pCreature)
{
@@ -1464,9 +1790,12 @@ bool ChatHandler::HandleNpcSetPhaseCommand(const char* args)
SetSentErrorMessage(true);
return false;
}
+
pCreature->SetPhaseMask(phasemask,true);
+
if(!pCreature->isPet())
pCreature->SaveToDB();
+
return true;
}
//npc deathstate handling
@@ -1474,6 +1803,7 @@ bool ChatHandler::HandleNpcSetDeathStateCommand(const char* args)
{
if (!*args)
return false;
+
Creature* pCreature = getSelectedCreature();
if(!pCreature || pCreature->isPet())
{
@@ -1481,6 +1811,7 @@ bool ChatHandler::HandleNpcSetDeathStateCommand(const char* args)
SetSentErrorMessage(true);
return false;
}
+
if (strncmp(args, "on", 3) == 0)
pCreature->SetDeadByDefault(true);
else if (strncmp(args, "off", 4) == 0)
@@ -1491,21 +1822,27 @@ bool ChatHandler::HandleNpcSetDeathStateCommand(const char* args)
SetSentErrorMessage(true);
return false;
}
+
pCreature->SaveToDB();
pCreature->Respawn();
+
return true;
}
+
//TODO: NpcCommands that need to be fixed :
+
bool ChatHandler::HandleNpcNameCommand(const char* /*args*/)
{
/* Temp. disabled
if(!*args)
return false;
+
if(strlen((char*)args)>75)
{
PSendSysMessage(LANG_TOO_LONG_NAME, strlen((char*)args)-75);
return true;
}
+
for (uint8 i = 0; i < strlen(args); ++i)
{
if(!isalpha(args[i]) && args[i]!=' ')
@@ -1514,6 +1851,7 @@ bool ChatHandler::HandleNpcNameCommand(const char* /*args*/)
return false;
}
}
+
uint64 guid;
guid = m_session->GetPlayer()->GetSelection();
if (guid == 0)
@@ -1521,29 +1859,39 @@ bool ChatHandler::HandleNpcNameCommand(const char* /*args*/)
SendSysMessage(LANG_NO_SELECTION);
return true;
}
+
Creature* pCreature = ObjectAccessor::GetCreature(*m_session->GetPlayer(), guid);
+
if(!pCreature)
{
SendSysMessage(LANG_SELECT_CREATURE);
return true;
}
+
pCreature->SetName(args);
uint32 idname = objmgr.AddCreatureTemplate(pCreature->GetName());
pCreature->SetUInt32Value(OBJECT_FIELD_ENTRY, idname);
+
pCreature->SaveToDB();
*/
+
return true;
}
+
bool ChatHandler::HandleNpcSubNameCommand(const char* /*args*/)
{
/* Temp. disabled
+
if(!*args)
args = "";
+
if(strlen((char*)args)>75)
{
+
PSendSysMessage(LANG_TOO_LONG_SUBNAME, strlen((char*)args)-75);
return true;
}
+
for (uint8 i = 0; i < strlen(args); i++)
{
if(!isalpha(args[i]) && args[i]!=' ')
@@ -1559,43 +1907,58 @@ bool ChatHandler::HandleNpcSubNameCommand(const char* /*args*/)
SendSysMessage(LANG_NO_SELECTION);
return true;
}
+
Creature* pCreature = ObjectAccessor::GetCreature(*m_session->GetPlayer(), guid);
+
if(!pCreature)
{
SendSysMessage(LANG_SELECT_CREATURE);
return true;
}
+
uint32 idname = objmgr.AddCreatureSubName(pCreature->GetName(),args,pCreature->GetUInt32Value(UNIT_FIELD_DISPLAYID));
pCreature->SetUInt32Value(OBJECT_FIELD_ENTRY, idname);
+
pCreature->SaveToDB();
*/
return true;
}
+
//move item to other slot
bool ChatHandler::HandleItemMoveCommand(const char* args)
{
if(!*args)
return false;
uint8 srcslot, dstslot;
+
char* pParam1 = strtok((char*)args, " ");
if (!pParam1)
return false;
+
char* pParam2 = strtok(NULL, " ");
if (!pParam2)
return false;
+
srcslot = (uint8)atoi(pParam1);
dstslot = (uint8)atoi(pParam2);
+
if(srcslot==dstslot)
return true;
+
if(!m_session->GetPlayer()->IsValidPos(INVENTORY_SLOT_BAG_0,srcslot))
return false;
+
if(!m_session->GetPlayer()->IsValidPos(INVENTORY_SLOT_BAG_0,dstslot))
return false;
+
uint16 src = ((INVENTORY_SLOT_BAG_0 << 8) | srcslot);
uint16 dst = ((INVENTORY_SLOT_BAG_0 << 8) | dstslot);
+
m_session->GetPlayer()->SwapItem( src, dst );
+
return true;
}
+
//demorph player or unit
bool ChatHandler::HandleDeMorphCommand(const char* /*args*/)
{
@@ -1603,27 +1966,37 @@ bool ChatHandler::HandleDeMorphCommand(const char* /*args*/)
if(!target)
target = m_session->GetPlayer();
+
// check online security
else if (target->GetTypeId() == TYPEID_PLAYER && HasLowerSecurity((Player*)target, 0))
return false;
+
target->DeMorph();
+
return true;
}
+
//morph creature or player
bool ChatHandler::HandleModifyMorphCommand(const char* args)
{
if (!*args)
return false;
+
uint16 display_id = (uint16)atoi((char*)args);
+
Unit *target = getSelectedUnit();
if(!target)
target = m_session->GetPlayer();
+
// check online security
else if (target->GetTypeId() == TYPEID_PLAYER && HasLowerSecurity((Player*)target, 0))
return false;
+
target->SetDisplayId(display_id);
+
return true;
}
+
//kick player
bool ChatHandler::HandleKickPlayerCommand(const char *args)
{
@@ -1635,6 +2008,7 @@ bool ChatHandler::HandleKickPlayerCommand(const char *args)
reason = kickReason;
if(m_session)
kicker = m_session->GetPlayer()->GetName();
+
if(!kickName)
{
Player* player = getSelectedPlayer();
@@ -1644,15 +2018,18 @@ bool ChatHandler::HandleKickPlayerCommand(const char *args)
SetSentErrorMessage(true);
return false;
}
+
if(player==m_session->GetPlayer())
{
SendSysMessage(LANG_COMMAND_KICKSELF);
SetSentErrorMessage(true);
return false;
}
+
// check online security
if (HasLowerSecurity(player, 0))
return false;
+
if(sWorld.getConfig(CONFIG_SHOW_KICK_IN_WORLD) == 1)
{
sWorld.SendWorldText(LANG_COMMAND_KICKMESSAGE, player->GetName(), kicker.c_str(), reason.c_str());
@@ -1661,6 +2038,7 @@ bool ChatHandler::HandleKickPlayerCommand(const char *args)
{
PSendSysMessage(LANG_COMMAND_KICKMESSAGE, player->GetName(), kicker.c_str(), reason.c_str());
}
+
player->GetSession()->KickPlayer();
}
else
@@ -1672,12 +2050,14 @@ bool ChatHandler::HandleKickPlayerCommand(const char *args)
SetSentErrorMessage(true);
return false;
}
+
if(m_session && name==m_session->GetPlayer()->GetName())
{
SendSysMessage(LANG_COMMAND_KICKSELF);
SetSentErrorMessage(true);
return false;
}
+
Player* player = objmgr.GetPlayer(kickName);
if(!player)
{
@@ -1685,13 +2065,16 @@ bool ChatHandler::HandleKickPlayerCommand(const char *args)
SetSentErrorMessage(true);
return false;
}
+
if(HasLowerSecurity(player, 0))
{
SendSysMessage(LANG_YOURS_SECURITY_IS_LOW); //maybe replacement string for this later on
SetSentErrorMessage(true);
return false;
}
+
std::string nameLink = playerLink(name);
+
if(sWorld.KickPlayer(name))
{
if(sWorld.getConfig(CONFIG_SHOW_KICK_IN_WORLD) == 1)
@@ -1712,35 +2095,45 @@ bool ChatHandler::HandleKickPlayerCommand(const char *args)
Player* target;
if(!extractPlayerTarget((char*)args,&target))
return false;
+
if (m_session && target==m_session->GetPlayer())
{
SendSysMessage(LANG_COMMAND_KICKSELF);
SetSentErrorMessage(true);
return false;
}
+
// check online security
if (HasLowerSecurity(target, 0))
return false;
+
// send before target pointer invalidate
PSendSysMessage(LANG_COMMAND_KICKMESSAGE,GetNameLink(target).c_str());
target->GetSession()->KickPlayer();
return true;
}
+
//set temporary phase mask for player
bool ChatHandler::HandleModifyPhaseCommand(const char* args)
{
if (!*args)
return false;
+
uint32 phasemask = (uint32)atoi((char*)args);
+
Unit *target = getSelectedUnit();
if(!target)
target = m_session->GetPlayer();
+
// check online security
else if (target->GetTypeId() == TYPEID_PLAYER && HasLowerSecurity((Player*)target, 0))
return false;
+
target->SetPhaseMask(phasemask,true);
+
return true;
}
+
//show info of player
bool ChatHandler::HandlePInfoCommand(const char* args)
{
@@ -1749,6 +2142,7 @@ bool ChatHandler::HandlePInfoCommand(const char* args)
std::string target_name;
if(!extractPlayerTarget((char*)args,&target,&target_guid,&target_name))
return false;
+
uint32 accId = 0;
uint32 money = 0;
uint32 total_player_time = 0;
@@ -1756,12 +2150,14 @@ bool ChatHandler::HandlePInfoCommand(const char* args)
uint32 latency = 0;
uint8 race;
uint8 Class;
+
// get additional information from Player object
if(target)
{
// check online security
if (HasLowerSecurity(target, 0))
return false;
+
accId = target->GetSession()->GetAccountId();
money = target->GetMoney();
total_player_time = target->GetTotalPlayedTime();
@@ -1776,10 +2172,12 @@ bool ChatHandler::HandlePInfoCommand(const char* args)
// check offline security
if (HasLowerSecurity(NULL, target_guid))
return false;
+
// 0 1 2 3 4 5
QueryResult *result = CharacterDatabase.PQuery("SELECT totaltime, level, money, account, race, class FROM characters WHERE guid = '%u'", GUID_LOPART(target_guid));
if (!result)
return false;
+
Field *fields = result->Fetch();
total_player_time = fields[0].GetUInt32();
level = fields[1].GetUInt32();
@@ -1789,11 +2187,13 @@ bool ChatHandler::HandlePInfoCommand(const char* args)
Class = fields[5].GetUInt8();
delete result;
}
+
std::string username = GetTrinityString(LANG_ERROR);
std::string email = GetTrinityString(LANG_ERROR);
std::string last_ip = GetTrinityString(LANG_ERROR);
uint32 security = 0;
std::string last_login = GetTrinityString(LANG_ERROR);
+
QueryResult* result = loginDatabase.PQuery("SELECT username,gmlevel,email,last_ip,last_login FROM account WHERE id = '%u'",accId);
if(result)
{
@@ -1801,8 +2201,10 @@ bool ChatHandler::HandlePInfoCommand(const char* args)
username = fields[0].GetCppString();
security = fields[1].GetUInt32();
email = fields[2].GetCppString();
+
if(email.empty())
email = "-";
+
if(!m_session || m_session->GetSecurity() >= security)
{
last_ip = fields[3].GetCppString();
@@ -1813,10 +2215,14 @@ bool ChatHandler::HandlePInfoCommand(const char* args)
last_ip = "-";
last_login = "-";
}
+
delete result;
}
+
std::string nameLink = playerLink(target_name);
+
PSendSysMessage(LANG_PINFO_ACCOUNT, (target?"":GetTrinityString(LANG_OFFLINE)), nameLink.c_str(), GUID_LOPART(target_guid), username.c_str(), accId, email.c_str(), security, last_ip.c_str(), last_login.c_str(), latency);
+
std::string race_s, Class_s;
switch(race)
{
@@ -1844,14 +2250,18 @@ bool ChatHandler::HandlePInfoCommand(const char* args)
case CLASS_WARLOCK: Class_s = "Warlock"; break;
case CLASS_DRUID: Class_s = "Druid"; break;
}
+
std::string timeStr = secsToTimeString(total_player_time,true,true);
uint32 gold = money /GOLD;
uint32 silv = (money % GOLD) / SILVER;
uint32 copp = (money % GOLD) % SILVER;
PSendSysMessage(LANG_PINFO_LEVEL, race_s.c_str(), Class_s.c_str(), timeStr.c_str(), level, gold, silv, copp);
+
return true;
}
+
/////WAYPOINT COMMANDS
+
/**
* Add a waypoint to a creature.
*
@@ -1876,13 +2286,17 @@ bool ChatHandler::HandlePInfoCommand(const char* args)
bool ChatHandler::HandleWpAddCommand(const char* args)
{
sLog.outDebug("DEBUG: HandleWpAddCommand");
+
// optional
char* path_number = NULL;
uint32 pathid = 0;
+
if(*args)
path_number = strtok((char*)args, " ");
+
uint32 point = 0;
Creature* target = getSelectedCreature();
+
if (!path_number)
{
if(target)
@@ -1898,62 +2312,81 @@ bool ChatHandler::HandleWpAddCommand(const char* args)
}
else
pathid = atoi(path_number);
+
// path_id -> ID of the Path
// point -> number of the waypoint (if not 0)
+
if(!pathid)
{
sLog.outDebug("DEBUG: HandleWpAddCommand - Current creature haven't loaded path.");
PSendSysMessage("%s%s|r", "|cffff33ff", "Current creature haven't loaded path.");
return true;
}
+
sLog.outDebug("DEBUG: HandleWpAddCommand - point == 0");
+
QueryResult *result = WorldDatabase.PQuery( "SELECT MAX(point) FROM waypoint_data WHERE id = '%u'",pathid);
+
if( result )
{
point = (*result)[0].GetUInt32();
delete result;
}
+
Player* player = m_session->GetPlayer();
Map *map = player->GetMap();
+
WorldDatabase.PExecuteLog("INSERT INTO waypoint_data (id, point, position_x, position_y, position_z) VALUES ('%u','%u','%f', '%f', '%f')",
pathid, point+1, player->GetPositionX(), player->GetPositionY(), player->GetPositionZ());
+
PSendSysMessage("%s%s%u%s%u%s|r", "|cff00ff00", "PathID: |r|cff00ffff", pathid, "|r|cff00ff00: Waypoint |r|cff00ffff", point,"|r|cff00ff00 created. ");
return true;
} // HandleWpAddCommand
+
bool ChatHandler::HandleWpLoadPathCommand(const char *args)
{
if(!*args)
return false;
+
// optional
char* path_number = NULL;
+
if(*args)
path_number = strtok((char*)args, " ");
+
uint32 pathid = 0;
uint32 guidlow = 0;
Creature* target = getSelectedCreature();
+
// Did player provide a path_id?
if (!path_number)
sLog.outDebug("DEBUG: HandleWpLoadPathCommand - No path number provided");
+
if(!target)
{
SendSysMessage(LANG_SELECT_CREATURE);
SetSentErrorMessage(true);
return false;
}
+
if(target->GetEntry() == 1)
{
PSendSysMessage("%s%s|r", "|cffff33ff", "You want to load path to a waypoint? Aren't you?");
SetSentErrorMessage(true);
return false;
}
+
pathid = atoi(path_number);
+
if(!pathid)
{
PSendSysMessage("%s%s|r", "|cffff33ff", "No vallid path number provided.");
return true;
}
+
guidlow = target->GetDBTableGUIDLow();
QueryResult *result = WorldDatabase.PQuery( "SELECT guid FROM creature_addon WHERE guid = '%u'",guidlow);
+
if( result )
{
WorldDatabase.PExecute("UPDATE creature_addon SET path_id = '%u' WHERE guid = '%u'", pathid, guidlow);
@@ -1961,33 +2394,43 @@ bool ChatHandler::HandleWpLoadPathCommand(const char *args)
}
else
WorldDatabase.PExecute("INSERT INTO creature_addon(guid,path_id) VALUES ('%u','%u')", guidlow, pathid);
+
WorldDatabase.PExecute("UPDATE creature SET MovementType = '%u' WHERE guid = '%u'", WAYPOINT_MOTION_TYPE, guidlow);
+
target->LoadPath(pathid);
target->SetDefaultMovementType(WAYPOINT_MOTION_TYPE);
target->GetMotionMaster()->Initialize();
target->MonsterSay("Path loaded.",0,0);
+
return true;
}
+
bool ChatHandler::HandleReloadAllPaths(const char* args)
{
if(!*args)
return false;
+
uint32 id = atoi(args);
+
if(!id)
return false;
+
PSendSysMessage("%s%s|r|cff00ffff%u|r", "|cff00ff00", "Loading Path: ", id);
WaypointMgr.UpdatePath(id);
return true;
}
+
bool ChatHandler::HandleWpUnLoadPathCommand(const char *args)
{
uint32 guidlow = 0;
Creature* target = getSelectedCreature();
+
if(!target)
{
PSendSysMessage("%s%s|r", "|cff33ffff", "You must select target.");
return true;
}
+
if(target->GetCreatureAddon())
{
if(target->GetCreatureAddon()->path_id != 0)
@@ -2006,23 +2449,30 @@ bool ChatHandler::HandleWpUnLoadPathCommand(const char *args)
}
return true;
}
+
bool ChatHandler::HandleWpEventCommand(const char* args)
{
if(!*args)
return false;
+
char* show_str = strtok((char*)args, " ");
std::string show = show_str;
+
// Check
if( (show != "add") && (show != "mod") && (show != "del") && (show != "listid")) return false;
+
char* arg_id = strtok(NULL, " ");
uint32 id = 0;
+
if(show == "add")
{
if(arg_id)
id = atoi(arg_id);
+
if(id)
{
QueryResult *result = WorldDatabase.PQuery( "SELECT id FROM waypoint_scripts WHERE guid = %u", id);
+
if( !result )
{
WorldDatabase.PExecute("INSERT INTO waypoint_scripts(guid)VALUES(%u)", id);
@@ -2041,8 +2491,10 @@ bool ChatHandler::HandleWpEventCommand(const char* args)
WorldDatabase.PExecute("INSERT INTO waypoint_scripts(guid)VALUES(%u)", id+1);
PSendSysMessage("%s%s%u|r", "|cff00ff00","Wp Event: New waypoint event added: |r|cff00ffff", id+1);
}
+
return true;
}
+
if(show == "listid")
{
if(!arg_id)
@@ -2050,17 +2502,23 @@ bool ChatHandler::HandleWpEventCommand(const char* args)
PSendSysMessage("%s%s|r", "|cff33ffff","Wp Event: You must provide waypoint script id.");
return true;
}
+
id = atoi(arg_id);
+
uint32 a2, a3, a4, a5, a6;
float a8, a9, a10, a11;
char const* a7;
+
QueryResult *result = WorldDatabase.PQuery( "SELECT guid, delay, command, datalong, datalong2, dataint, x, y, z, o FROM waypoint_scripts WHERE id = %u", id);
+
if( !result )
{
PSendSysMessage("%s%s%u|r", "|cff33ffff", "Wp Event: No waypoint scripts found on id: ", id);
return true;
}
+
Field *fields;
+
do
{
fields = result->Fetch();
@@ -2074,15 +2532,20 @@ bool ChatHandler::HandleWpEventCommand(const char* args)
a9 = fields[7].GetFloat();
a10 = fields[8].GetFloat();
a11 = fields[9].GetFloat();
+
PSendSysMessage("|cffff33ffid:|r|cff00ffff %u|r|cff00ff00, guid: |r|cff00ffff%u|r|cff00ff00, delay: |r|cff00ffff%u|r|cff00ff00, command: |r|cff00ffff%u|r|cff00ff00, datalong: |r|cff00ffff%u|r|cff00ff00, datalong2: |r|cff00ffff%u|r|cff00ff00, datatext: |r|cff00ffff%s|r|cff00ff00, posx: |r|cff00ffff%f|r|cff00ff00, posy: |r|cff00ffff%f|r|cff00ff00, posz: |r|cff00ffff%f|r|cff00ff00, orientation: |r|cff00ffff%f|r", id, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11);
}
while(result->NextRow());
+
delete result;
}
+
if(show == "del")
{
id = atoi(arg_id);
+
QueryResult *result = WorldDatabase.PQuery( "SELECT guid FROM waypoint_scripts WHERE guid = %u", id);
+
if( result )
{
WorldDatabase.PExecuteLog("DELETE FROM waypoint_scripts WHERE guid = %u", id);
@@ -2091,8 +2554,10 @@ bool ChatHandler::HandleWpEventCommand(const char* args)
}
else
PSendSysMessage("|cffff33ffWp Event: ERROR: you have selected a non existing script: %u|r", id);
+
return true;
}
+
if(show == "mod")
{
if(!arg_id)
@@ -2100,19 +2565,25 @@ bool ChatHandler::HandleWpEventCommand(const char* args)
SendSysMessage("|cffff33ffERROR: Waypoint script guid not present.|r");
return true;
}
+
id = atoi(arg_id);
+
if(!id)
{
SendSysMessage("|cffff33ffERROR: No vallid waypoint script id not present.|r");
return true;
}
+
char* arg_2 = strtok(NULL," ");
+
if(!arg_2)
{
SendSysMessage("|cffff33ffERROR: No argument present.|r");
return true;
}
+
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"))
@@ -2120,15 +2591,19 @@ bool ChatHandler::HandleWpEventCommand(const char* args)
SendSysMessage("|cffff33ffERROR: No valid argument present.|r");
return true;
}
+
char* arg_3;
std::string arg_str_2 = arg_2;
arg_3 = strtok(NULL," ");
+
if(!arg_3)
{
SendSysMessage("|cffff33ffERROR: No additional argument present.|r");
return true;
}
+
float coord;
+
if(arg_str_2 == "setid")
{
uint32 newid = atoi(arg_3);
@@ -2139,12 +2614,15 @@ bool ChatHandler::HandleWpEventCommand(const char* args)
else
{
QueryResult *result = WorldDatabase.PQuery("SELECT id FROM waypoint_scripts WHERE guid='%u'",id);
+
if(!result)
{
SendSysMessage("|cffff33ffERROR: You have selected an non existing waypoint script guid.|r");
return true;
}
+
delete result;
+
if(arg_str_2 == "posx")
{
coord = atof(arg_3);
@@ -2196,17 +2674,21 @@ bool ChatHandler::HandleWpEventCommand(const char* args)
}
return true;
}
+
bool ChatHandler::HandleWpModifyCommand(const char* args)
{
sLog.outDebug("DEBUG: HandleWpModifyCommand");
+
if(!*args)
return false;
+
// first arg: add del text emote spell waittime move
char* show_str = strtok((char*)args, " ");
if (!show_str)
{
return false;
}
+
std::string show = show_str;
// Check
// Remember: "show" must also be the name of a column!
@@ -2216,8 +2698,10 @@ bool ChatHandler::HandleWpModifyCommand(const char* args)
{
return false;
}
+
// Next arg is: <PATHID> <WPNUM> <ARGUMENT>
char* arg_str = NULL;
+
// Did user provide a GUID
// or did the user select a creature?
// -> variable lowguid is filled with the GUID of the NPC
@@ -2225,15 +2709,18 @@ bool ChatHandler::HandleWpModifyCommand(const char* args)
uint32 point = 0;
uint32 wpGuid = 0;
Creature* target = getSelectedCreature();
+
if(!target || target->GetEntry() != VISUAL_WAYPOINT)
{
SendSysMessage("|cffff33ffERROR: You must select a waypoint.|r");
return false;
}
+
sLog.outDebug("DEBUG: HandleWpModifyCommand - User did select an NPC");
// The visual waypoint
Creature* wpCreature = NULL;
wpGuid = target->GetGUIDLow();
+
// Did the user select a visual spawnpoint?
if(wpGuid)
wpCreature = m_session->GetPlayer()->GetMap()->GetCreature(MAKE_NEW_GUID(wpGuid, VISUAL_WAYPOINT, HIGHGUID_UNIT));
@@ -2249,9 +2736,11 @@ bool ChatHandler::HandleWpModifyCommand(const char* args)
{
QueryResult *result =
WorldDatabase.PQuery( "SELECT id, point FROM waypoint_data WHERE wpguid = %u", wpGuid);
+
if(!result)
{
sLog.outDebug("DEBUG: HandleWpModifyCommand - No waypoint found - used 'wpguid'");
+
PSendSysMessage(LANG_WAYPOINT_NOTFOUNDSEARCH, target->GetGUIDLow());
// Select waypoint number from database
// Since we compare float values, we have to deal with
@@ -2269,6 +2758,7 @@ bool ChatHandler::HandleWpModifyCommand(const char* args)
}
}
sLog.outDebug("DEBUG: HandleWpModifyCommand - After getting wpGuid");
+
do
{
Field *fields = result->Fetch();
@@ -2276,6 +2766,7 @@ bool ChatHandler::HandleWpModifyCommand(const char* args)
point = fields[1].GetUInt32();
}
while( result->NextRow() );
+
// Cleanup memory
sLog.outDebug("DEBUG: HandleWpModifyCommand - Cleanup memory");
delete result;
@@ -2283,18 +2774,23 @@ bool ChatHandler::HandleWpModifyCommand(const char* args)
// Text is enclosed in "<>", all other arguments not
arg_str = strtok((char*)NULL, " ");
}
+
sLog.outDebug("DEBUG: HandleWpModifyCommand - Parameters parsed - now execute the command");
+
// Check for argument
if(show != "del" && show != "move" && arg_str == NULL)
{
PSendSysMessage(LANG_WAYPOINT_ARGUMENTREQ, show_str);
return false;
}
+
if(show == "del" && target)
{
PSendSysMessage("|cff00ff00DEBUG: wp modify del, PathID: |r|cff00ffff%u|r", pathid);
+
// wpCreature
Creature* wpCreature = NULL;
+
if( wpGuid != 0 )
{
wpCreature = m_session->GetPlayer()->GetMap()->GetCreature(MAKE_NEW_GUID(wpGuid, VISUAL_WAYPOINT, HIGHGUID_UNIT));
@@ -2302,16 +2798,20 @@ bool ChatHandler::HandleWpModifyCommand(const char* args)
wpCreature->DeleteFromDB();
wpCreature->AddObjectToRemoveList();
}
+
WorldDatabase.PExecuteLog("DELETE FROM waypoint_data WHERE id='%u' AND point='%u'",
pathid, point);
WorldDatabase.PExecuteLog("UPDATE waypoint_data SET point=point-1 WHERE id='%u' AND point>'%u'",
pathid, point);
+
PSendSysMessage(LANG_WAYPOINT_REMOVED);
return true;
} // del
+
if(show == "move" && target)
{
PSendSysMessage("|cff00ff00DEBUG: wp move, PathID: |r|cff00ffff%u|r", pathid);
+
Player *chr = m_session->GetPlayer();
Map *map = chr->GetMap();
{
@@ -2334,20 +2834,25 @@ bool ChatHandler::HandleWpModifyCommand(const char* args)
delete wpCreature2;
return false;
}
+
wpCreature2->SaveToDB(map->GetId(), (1 << map->GetSpawnMode()), chr->GetPhaseMaskForSpawn());
// To call _LoadGoods(); _LoadQuests(); CreateTrainerSpells();
wpCreature2->LoadFromDB(wpCreature2->GetDBTableGUIDLow(), map);
map->Add(wpCreature2);
//MapManager::Instance().GetMap(npcCreature->GetMapId())->Add(wpCreature2);
}
+
WorldDatabase.PExecuteLog("UPDATE waypoint_data SET position_x = '%f',position_y = '%f',position_z = '%f' where id = '%u' AND point='%u'",
chr->GetPositionX(), chr->GetPositionY(), chr->GetPositionZ(), pathid, point );
+
PSendSysMessage(LANG_WAYPOINT_CHANGED);
}
return true;
} // move
+
const char *text = arg_str;
+
if( text == 0 )
{
// show_str check for present in list of correct values, no sql injection possible
@@ -2362,36 +2867,46 @@ bool ChatHandler::HandleWpModifyCommand(const char* args)
WorldDatabase.PExecuteLog("UPDATE waypoint_data SET %s='%s' WHERE id='%u' AND point='%u'",
show_str, text2.c_str(), pathid, point);
}
+
PSendSysMessage(LANG_WAYPOINT_CHANGED_NO, show_str);
return true;
}
+
bool ChatHandler::HandleWpShowCommand(const char* args)
{
sLog.outDebug("DEBUG: HandleWpShowCommand");
+
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*)NULL, " ");
sLog.outDebug("DEBUG: HandleWpShowCommand: show_str: %s guid_str: %s", show_str, guid_str);
+
uint32 pathid = 0;
Creature* target = getSelectedCreature();
+
// Did player provide a PathID?
+
if (!guid_str)
{
sLog.outDebug("DEBUG: HandleWpShowCommand: !guid_str");
// No PathID provided
// -> Player must have selected a creature
+
if(!target)
{
SendSysMessage(LANG_SELECT_CREATURE);
SetSentErrorMessage(true);
return false;
}
+
pathid = target->GetWaypointPath();
}
else
@@ -2402,13 +2917,19 @@ bool ChatHandler::HandleWpShowCommand(const char* args)
// -> Creature selection is ignored <-
if(target)
SendSysMessage(LANG_WAYPOINT_CREATSELECTED);
+
pathid = atoi((char*)guid_str);
}
+
sLog.outDebug("DEBUG: HandleWpShowCommand: danach");
+
std::string show = show_str;
uint32 Maxpoint;
+
sLog.outDebug("DEBUG: HandleWpShowCommand: PathID: %u", pathid);
+
//PSendSysMessage("wpshow - show: %s", show);
+
// Show info for the selected waypoint
if(show == "info")
{
@@ -2419,12 +2940,15 @@ bool ChatHandler::HandleWpShowCommand(const char* args)
SetSentErrorMessage(true);
return false;
}
+
QueryResult *result = WorldDatabase.PQuery( "SELECT id, point, delay, move_flag, action, action_chance FROM waypoint_data WHERE wpguid = %u", target->GetGUIDLow());
+
if(!result)
{
SendSysMessage(LANG_WAYPOINT_NOTFOUNDDBPROBLEM);
return true;
}
+
SendSysMessage("|cff00ffffDEBUG: wp show info:|r");
do
{
@@ -2435,6 +2959,7 @@ bool ChatHandler::HandleWpShowCommand(const char* args)
uint32 flag = fields[3].GetUInt32();
uint32 ev_id = fields[4].GetUInt32();
uint32 ev_chance = fields[5].GetUInt32();
+
PSendSysMessage("|cff00ff00Show info: for current point: |r|cff00ffff%u|r|cff00ff00, Path ID: |r|cff00ffff%u|r", point, pathid);
PSendSysMessage("|cff00ff00Show info: delay: |r|cff00ffff%u|r", delay);
PSendSysMessage("|cff00ff00Show info: Move flag: |r|cff00ffff%u|r", flag);
@@ -2442,22 +2967,28 @@ bool ChatHandler::HandleWpShowCommand(const char* args)
PSendSysMessage("|cff00ff00Show info: Event chance: |r|cff00ffff%u|r", ev_chance);
}
while( result->NextRow() );
+
// Cleanup memory
delete result;
return true;
}
+
if(show == "on")
{
QueryResult *result = WorldDatabase.PQuery( "SELECT point, position_x,position_y,position_z FROM waypoint_data WHERE id = '%u'", pathid);
+
if(!result)
{
SendSysMessage("|cffff33ffPath no found.|r");
SetSentErrorMessage(true);
return false;
}
+
PSendSysMessage("|cff00ff00DEBUG: wp on, PathID: |cff00ffff%u|r", pathid);
+
// Delete all visuals for this NPC
QueryResult *result2 = WorldDatabase.PQuery( "SELECT wpguid FROM waypoint_data WHERE id = '%u' and wpguid <> 0", pathid);
+
if(result2)
{
bool hasError = false;
@@ -2466,6 +2997,7 @@ bool ChatHandler::HandleWpShowCommand(const char* args)
Field *fields = result2->Fetch();
uint32 wpguid = fields[0].GetUInt32();
Creature* pCreature = m_session->GetPlayer()->GetMap()->GetCreature(MAKE_NEW_GUID(wpguid,VISUAL_WAYPOINT,HIGHGUID_UNIT));
+
if(!pCreature)
{
PSendSysMessage(LANG_WAYPOINT_NOTREMOVED, wpguid);
@@ -2478,9 +3010,12 @@ bool ChatHandler::HandleWpShowCommand(const char* args)
pCreature->DeleteFromDB();
pCreature->AddObjectToRemoveList();
}
+
}
while( result2->NextRow() );
+
delete result2;
+
if( hasError )
{
PSendSysMessage(LANG_WAYPOINT_TOOFAR1);
@@ -2488,6 +3023,7 @@ bool ChatHandler::HandleWpShowCommand(const char* args)
PSendSysMessage(LANG_WAYPOINT_TOOFAR3);
}
}
+
do
{
Field *fields = result->Fetch();
@@ -2495,10 +3031,13 @@ bool ChatHandler::HandleWpShowCommand(const char* args)
float x = fields[1].GetFloat();
float y = fields[2].GetFloat();
float z = fields[3].GetFloat();
+
uint32 id = VISUAL_WAYPOINT;
+
Player *chr = m_session->GetPlayer();
Map *map = chr->GetMap();
float o = chr->GetOrientation();
+
Creature* wpCreature = new Creature;
if (!wpCreature->Create(objmgr.GenerateLowGuid(HIGHGUID_UNIT), map, chr->GetPhaseMaskForSpawn(), id, 0, 0, x, y, z, o))
{
@@ -2507,13 +3046,16 @@ bool ChatHandler::HandleWpShowCommand(const char* args)
delete result;
return false;
}
+
sLog.outDebug("DEBUG: UPDATE waypoint_data SET wpguid = '%u");
// set "wpguid" column to the visual waypoint
WorldDatabase.PExecuteLog("UPDATE waypoint_data SET wpguid = '%u' WHERE id = '%u' and point = '%u'", wpCreature->GetGUIDLow(), pathid, point);
+
wpCreature->SaveToDB(map->GetId(), (1 << map->GetSpawnMode()), chr->GetPhaseMaskForSpawn());
// To call _LoadGoods(); _LoadQuests(); CreateTrainerSpells();
wpCreature->LoadFromDB(wpCreature->GetDBTableGUIDLow(),map);
map->Add(wpCreature);
+
if(target)
{
wpCreature->SetDisplayId(target->GetDisplayId());
@@ -2521,14 +3063,17 @@ bool ChatHandler::HandleWpShowCommand(const char* args)
}
}
while( result->NextRow() );
+
SendSysMessage("|cff00ff00Showing the current creature's path.|r");
// Cleanup memory
delete result;
return true;
}
+
if(show == "first")
{
PSendSysMessage("|cff00ff00DEBUG: wp first, GUID: %u|r", pathid);
+
QueryResult *result = WorldDatabase.PQuery( "SELECT position_x,position_y,position_z FROM waypoint_data WHERE point='1' AND id = '%u'",pathid);
if(!result)
{
@@ -2536,14 +3081,17 @@ bool ChatHandler::HandleWpShowCommand(const char* args)
SetSentErrorMessage(true);
return false;
}
+
Field *fields = result->Fetch();
float x = fields[0].GetFloat();
float y = fields[1].GetFloat();
float z = fields[2].GetFloat();
uint32 id = VISUAL_WAYPOINT;
+
Player *chr = m_session->GetPlayer();
float o = chr->GetOrientation();
Map *map = chr->GetMap();
+
Creature* pCreature = new Creature;
if (!pCreature->Create(objmgr.GenerateLowGuid(HIGHGUID_UNIT),map, chr->GetPhaseMaskForSpawn(), id, 0, 0, x, y, z, o))
{
@@ -2552,29 +3100,36 @@ bool ChatHandler::HandleWpShowCommand(const char* args)
delete result;
return false;
}
+
pCreature->SaveToDB(map->GetId(), (1 << map->GetSpawnMode()), chr->GetPhaseMaskForSpawn());
pCreature->LoadFromDB(pCreature->GetDBTableGUIDLow(), map);
map->Add(pCreature);
+
if(target)
{
pCreature->SetDisplayId(target->GetDisplayId());
pCreature->SetFloatValue(OBJECT_FIELD_SCALE_X, 0.5);
}
+
// Cleanup memory
delete result;
return true;
}
+
if(show == "last")
{
PSendSysMessage("|cff00ff00DEBUG: wp last, PathID: |r|cff00ffff%u|r", pathid);
+
QueryResult *result = WorldDatabase.PQuery( "SELECT MAX(point) FROM waypoint_data WHERE id = '%u'",pathid);
if( result )
{
Maxpoint = (*result)[0].GetUInt32();
+
delete result;
}
else
Maxpoint = 0;
+
result = WorldDatabase.PQuery( "SELECT position_x,position_y,position_z FROM waypoint_data WHERE point ='%u' AND id = '%u'",Maxpoint, pathid);
if(!result)
{
@@ -2587,9 +3142,11 @@ bool ChatHandler::HandleWpShowCommand(const char* args)
float y = fields[1].GetFloat();
float z = fields[2].GetFloat();
uint32 id = VISUAL_WAYPOINT;
+
Player *chr = m_session->GetPlayer();
float o = chr->GetOrientation();
Map *map = chr->GetMap();
+
Creature* pCreature = new Creature;
if (!pCreature->Create(objmgr.GenerateLowGuid(HIGHGUID_UNIT), map, chr->GetPhaseMaskForSpawn(), id, 0, 0, x, y, z, o))
{
@@ -2598,18 +3155,22 @@ bool ChatHandler::HandleWpShowCommand(const char* args)
delete result;
return false;
}
+
pCreature->SaveToDB(map->GetId(), (1 << map->GetSpawnMode()), chr->GetPhaseMaskForSpawn());
pCreature->LoadFromDB(pCreature->GetDBTableGUIDLow(), map);
map->Add(pCreature);
+
if(target)
{
pCreature->SetDisplayId(target->GetDisplayId());
pCreature->SetFloatValue(OBJECT_FIELD_SCALE_X, 0.5);
}
+
// Cleanup memory
delete result;
return true;
}
+
if(show == "off")
{
QueryResult *result = WorldDatabase.PQuery("SELECT guid FROM creature WHERE id = '%u'", 1);
@@ -2642,21 +3203,26 @@ bool ChatHandler::HandleWpShowCommand(const char* args)
// set "wpguid" column to "empty" - no visual waypoint spawned
WorldDatabase.PExecuteLog("UPDATE waypoint_data SET wpguid = '0'");
//WorldDatabase.PExecuteLog("UPDATE creature_movement SET wpguid = '0' WHERE wpguid <> '0'");
+
if( hasError )
{
PSendSysMessage(LANG_WAYPOINT_TOOFAR1);
PSendSysMessage(LANG_WAYPOINT_TOOFAR2);
PSendSysMessage(LANG_WAYPOINT_TOOFAR3);
}
+
SendSysMessage(LANG_WAYPOINT_VP_ALLREMOVED);
// Cleanup memory
delete result;
return true;
}
+
PSendSysMessage("|cffff33ffDEBUG: wpshow - no valid command found|r");
return true;
}
+
//////////// WAYPOINT COMMANDS //
+
//rename characters
bool ChatHandler::HandleCharacterRenameCommand(const char* args)
{
@@ -2665,11 +3231,13 @@ bool ChatHandler::HandleCharacterRenameCommand(const char* args)
std::string target_name;
if(!extractPlayerTarget((char*)args,&target,&target_guid,&target_name))
return false;
+
if(target)
{
// check online security
if (HasLowerSecurity(target, 0))
return false;
+
PSendSysMessage(LANG_RENAME_PLAYER, GetNameLink(target).c_str());
target->SetAtLoginFlag(AT_LOGIN_RENAME);
}
@@ -2678,12 +3246,16 @@ bool ChatHandler::HandleCharacterRenameCommand(const char* args)
// check offline security
if (HasLowerSecurity(NULL, target_guid))
return false;
+
std::string oldNameLink = playerLink(target_name);
+
PSendSysMessage(LANG_RENAME_PLAYER_GUID, oldNameLink.c_str(), GUID_LOPART(target_guid));
CharacterDatabase.PExecute("UPDATE characters SET at_login = at_login | '1' WHERE guid = '%u'", GUID_LOPART(target_guid));
}
+
return true;
}
+
// customize characters
bool ChatHandler::HandleCharacterCustomizeCommand(const char* args)
{
@@ -2692,6 +3264,7 @@ bool ChatHandler::HandleCharacterCustomizeCommand(const char* args)
std::string target_name;
if(!extractPlayerTarget((char*)args,&target,&target_guid,&target_name))
return false;
+
if(target)
{
PSendSysMessage(LANG_CUSTOMIZE_PLAYER, GetNameLink(target).c_str());
@@ -2701,17 +3274,22 @@ bool ChatHandler::HandleCharacterCustomizeCommand(const char* args)
else
{
std::string oldNameLink = playerLink(target_name);
+
PSendSysMessage(LANG_CUSTOMIZE_PLAYER_GUID, oldNameLink.c_str(), GUID_LOPART(target_guid));
CharacterDatabase.PExecute("UPDATE characters SET at_login = at_login | '8' WHERE guid = '%u'", GUID_LOPART(target_guid));
}
+
return true;
}
+
bool ChatHandler::HandleCharacterReputationCommand(const char* args)
{
Player* target;
if(!extractPlayerTarget((char*)args,&target))
return false;
+
LocaleConstant loc = GetSessionDbcLocale();
+
FactionStateList const& targetFSL = target->GetReputationMgr().GetStateList();
for(FactionStateList::const_iterator itr = targetFSL.begin(); itr != targetFSL.end(); ++itr)
{
@@ -2724,7 +3302,9 @@ bool ChatHandler::HandleCharacterReputationCommand(const char* args)
ss << itr->second.ID << " - |cffffffff|Hfaction:" << itr->second.ID << "|h[" << factionName << " " << localeNames[loc] << "]|h|r";
else
ss << itr->second.ID << " - " << factionName << " " << localeNames[loc];
+
ss << " " << rankName << " (" << target->GetReputationMgr().GetReputation(factionEntry) << ")";
+
if(itr->second.Flags & FACTION_FLAG_VISIBLE)
ss << GetMangosString(LANG_FACTION_VISIBLE);
if(itr->second.Flags & FACTION_FLAG_AT_WAR)
@@ -2737,23 +3317,29 @@ bool ChatHandler::HandleCharacterReputationCommand(const char* args)
ss << GetMangosString(LANG_FACTION_INVISIBLE_FORCED);
if(itr->second.Flags & FACTION_FLAG_INACTIVE)
ss << GetMangosString(LANG_FACTION_INACTIVE);
+
SendSysMessage(ss.str().c_str());
}
return true;
}
+
//change standstate
bool ChatHandler::HandleModifyStandStateCommand(const char* args)
{
if (!*args)
return false;
+
uint32 anim_id = atoi((char*)args);
m_session->GetPlayer( )->SetUInt32Value( UNIT_NPC_EMOTESTATE , anim_id );
+
return true;
}
+
bool ChatHandler::HandleHonorAddCommand(const char* args)
{
if (!*args)
return false;
+
Player *target = getSelectedPlayer();
if(!target)
{
@@ -2761,13 +3347,16 @@ bool ChatHandler::HandleHonorAddCommand(const char* args)
SetSentErrorMessage(true);
return false;
}
+
// check online security
if (HasLowerSecurity(target, 0))
return false;
+
uint32 amount = (uint32)atoi(args);
target->RewardHonor(NULL, 1, amount);
return true;
}
+
bool ChatHandler::HandleHonorAddKillCommand(const char* /*args*/)
{
Unit *target = getSelectedUnit();
@@ -2777,12 +3366,15 @@ bool ChatHandler::HandleHonorAddKillCommand(const char* /*args*/)
SetSentErrorMessage(true);
return false;
}
+
// check online security
if (target->GetTypeId() == TYPEID_PLAYER && HasLowerSecurity((Player*)target, 0))
return false;
+
m_session->GetPlayer()->RewardHonor(target, 1);
return true;
}
+
bool ChatHandler::HandleHonorUpdateCommand(const char* /*args*/)
{
Player *target = getSelectedPlayer();
@@ -2792,82 +3384,111 @@ bool ChatHandler::HandleHonorUpdateCommand(const char* /*args*/)
SetSentErrorMessage(true);
return false;
}
+
// check online security
if (HasLowerSecurity(target, 0))
return false;
+
target->UpdateHonorFields();
return true;
}
+
bool ChatHandler::HandleLookupEventCommand(const char* args)
{
if(!*args)
return false;
+
std::string namepart = args;
std::wstring wnamepart;
+
// converting string that we try to find to lower case
if(!Utf8toWStr(namepart,wnamepart))
return false;
+
wstrToLower(wnamepart);
+
bool found = false;
+
GameEventMgr::GameEventDataMap const& events = gameeventmgr.GetEventMap();
GameEventMgr::ActiveEvents const& activeEvents = gameeventmgr.GetActiveEventList();
+
for(uint32 id = 0; id < events.size(); ++id )
{
GameEventData const& eventData = events[id];
+
std::string descr = eventData.description;
if(descr.empty())
continue;
+
if (Utf8FitTo(descr, wnamepart))
{
char const* active = activeEvents.find(id) != activeEvents.end() ? GetTrinityString(LANG_ACTIVE) : "";
+
if(m_session)
PSendSysMessage(LANG_EVENT_ENTRY_LIST_CHAT,id,id,eventData.description.c_str(),active );
else
PSendSysMessage(LANG_EVENT_ENTRY_LIST_CONSOLE,id,eventData.description.c_str(),active );
+
if(!found)
found = true;
}
}
+
if (!found)
SendSysMessage(LANG_NOEVENTFOUND);
+
return true;
}
+
bool ChatHandler::HandleEventActiveListCommand(const char* args)
{
uint32 counter = 0;
+
GameEventMgr::GameEventDataMap const& events = gameeventmgr.GetEventMap();
GameEventMgr::ActiveEvents const& activeEvents = gameeventmgr.GetActiveEventList();
+
char const* active = GetTrinityString(LANG_ACTIVE);
+
for(GameEventMgr::ActiveEvents::const_iterator itr = activeEvents.begin(); itr != activeEvents.end(); ++itr )
{
uint32 event_id = *itr;
GameEventData const& eventData = events[event_id];
+
if(m_session)
PSendSysMessage(LANG_EVENT_ENTRY_LIST_CHAT,event_id,event_id,eventData.description.c_str(),active );
else
PSendSysMessage(LANG_EVENT_ENTRY_LIST_CONSOLE,event_id,eventData.description.c_str(),active );
+
++counter;
}
+
if (counter==0)
SendSysMessage(LANG_NOEVENTFOUND);
+
return true;
}
+
bool ChatHandler::HandleEventInfoCommand(const char* args)
{
if(!*args)
return false;
+
// id or [name] Shift-click form |color|Hgameevent:id|h[name]|h|r
char* cId = extractKeyFromLink((char*)args,"Hgameevent");
if(!cId)
return false;
+
uint32 event_id = atoi(cId);
+
GameEventMgr::GameEventDataMap const& events = gameeventmgr.GetEventMap();
+
if(event_id >=events.size())
{
SendSysMessage(LANG_EVENT_NOT_EXIST);
SetSentErrorMessage(true);
return false;
}
+
GameEventData const& eventData = events[event_id];
if(!eventData.isValid())
{
@@ -2875,37 +3496,48 @@ bool ChatHandler::HandleEventInfoCommand(const char* args)
SetSentErrorMessage(true);
return false;
}
+
GameEventMgr::ActiveEvents const& activeEvents = gameeventmgr.GetActiveEventList();
bool active = activeEvents.find(event_id) != activeEvents.end();
char const* activeStr = active ? GetTrinityString(LANG_ACTIVE) : "";
+
std::string startTimeStr = TimeToTimestampStr(eventData.start);
std::string endTimeStr = TimeToTimestampStr(eventData.end);
+
uint32 delay = gameeventmgr.NextCheck(event_id);
time_t nextTime = time(NULL)+delay;
std::string nextStr = nextTime >= eventData.start && nextTime < eventData.end ? TimeToTimestampStr(time(NULL)+delay) : "-";
+
std::string occurenceStr = secsToTimeString(eventData.occurence * MINUTE);
std::string lengthStr = secsToTimeString(eventData.length * MINUTE);
+
PSendSysMessage(LANG_EVENT_INFO,event_id,eventData.description.c_str(),activeStr,
startTimeStr.c_str(),endTimeStr.c_str(),occurenceStr.c_str(),lengthStr.c_str(),
nextStr.c_str());
return true;
}
+
bool ChatHandler::HandleEventStartCommand(const char* args)
{
if(!*args)
return false;
+
// id or [name] Shift-click form |color|Hgameevent:id|h[name]|h|r
char* cId = extractKeyFromLink((char*)args,"Hgameevent");
if(!cId)
return false;
+
int32 event_id = atoi(cId);
+
GameEventMgr::GameEventDataMap const& events = gameeventmgr.GetEventMap();
+
if(event_id < 1 || event_id >=events.size())
{
SendSysMessage(LANG_EVENT_NOT_EXIST);
SetSentErrorMessage(true);
return false;
}
+
GameEventData const& eventData = events[event_id];
if(!eventData.isValid())
{
@@ -2913,6 +3545,7 @@ bool ChatHandler::HandleEventStartCommand(const char* args)
SetSentErrorMessage(true);
return false;
}
+
GameEventMgr::ActiveEvents const& activeEvents = gameeventmgr.GetActiveEventList();
if(activeEvents.find(event_id) != activeEvents.end())
{
@@ -2920,25 +3553,32 @@ bool ChatHandler::HandleEventStartCommand(const char* args)
SetSentErrorMessage(true);
return false;
}
+
gameeventmgr.StartEvent(event_id,true);
return true;
}
+
bool ChatHandler::HandleEventStopCommand(const char* args)
{
if(!*args)
return false;
+
// id or [name] Shift-click form |color|Hgameevent:id|h[name]|h|r
char* cId = extractKeyFromLink((char*)args,"Hgameevent");
if(!cId)
return false;
+
int32 event_id = atoi(cId);
+
GameEventMgr::GameEventDataMap const& events = gameeventmgr.GetEventMap();
+
if(event_id < 1 || event_id >=events.size())
{
SendSysMessage(LANG_EVENT_NOT_EXIST);
SetSentErrorMessage(true);
return false;
}
+
GameEventData const& eventData = events[event_id];
if(!eventData.isValid())
{
@@ -2946,104 +3586,134 @@ bool ChatHandler::HandleEventStopCommand(const char* args)
SetSentErrorMessage(true);
return false;
}
+
GameEventMgr::ActiveEvents const& activeEvents = gameeventmgr.GetActiveEventList();
+
if(activeEvents.find(event_id) == activeEvents.end())
{
PSendSysMessage(LANG_EVENT_NOT_ACTIVE,event_id);
SetSentErrorMessage(true);
return false;
}
+
gameeventmgr.StopEvent(event_id,true);
return true;
}
+
bool ChatHandler::HandleCombatStopCommand(const char* args)
{
Player* target;
if(!extractPlayerTarget((char*)args,&target))
return false;
+
// check online security
if (HasLowerSecurity(target, 0))
return false;
+
target->CombatStop();
target->getHostilRefManager().deleteReferences();
return true;
}
+
void ChatHandler::HandleLearnSkillRecipesHelper(Player* player,uint32 skill_id)
{
uint32 classmask = player->getClassMask();
+
for (uint32 j = 0; j < sSkillLineAbilityStore.GetNumRows(); ++j)
{
SkillLineAbilityEntry const *skillLine = sSkillLineAbilityStore.LookupEntry(j);
if (!skillLine)
continue;
+
// wrong skill
if( skillLine->skillId != skill_id)
continue;
+
// not high rank
if(skillLine->forward_spellid )
continue;
+
// skip racial skills
if (skillLine->racemask != 0)
continue;
+
// skip wrong class skills
if( skillLine->classmask && (skillLine->classmask & classmask) == 0)
continue;
+
SpellEntry const* spellInfo = sSpellStore.LookupEntry(skillLine->spellId);
if(!spellInfo || !SpellMgr::IsSpellValid(spellInfo,player,false))
continue;
+
player->learnSpell(skillLine->spellId,false);
}
}
+
bool ChatHandler::HandleLearnAllCraftsCommand(const char* /*args*/)
-{
+{
+
for (uint32 i = 0; i < sSkillLineStore.GetNumRows(); ++i)
{
SkillLineEntry const *skillInfo = sSkillLineStore.LookupEntry(i);
if( !skillInfo )
continue;
+
if ((skillInfo->categoryId == SKILL_CATEGORY_PROFESSION || skillInfo->categoryId == SKILL_CATEGORY_SECONDARY) &&
skillInfo->canLink) // only prof. with recipes have
{
HandleLearnSkillRecipesHelper(m_session->GetPlayer(),skillInfo->id);
}
}
+
SendSysMessage(LANG_COMMAND_LEARN_ALL_CRAFT);
return true;
}
+
bool ChatHandler::HandleLearnAllRecipesCommand(const char* args)
{
// Learns all recipes of specified profession and sets skill to max
// Example: .learn all_recipes enchanting
+
Player* target = getSelectedPlayer();
if( !target )
{
SendSysMessage(LANG_PLAYER_NOT_FOUND);
return false;
}
+
if (!*args)
return false;
+
std::wstring wnamepart;
+
if(!Utf8toWStr(args,wnamepart))
return false;
+
uint32 counter = 0; // Counter for figure out that we found smth.
+
// converting string that we try to find to lower case
wstrToLower( wnamepart );
+
std::string name;
+
SkillLineEntry const *targetSkillInfo = NULL;
for (uint32 i = 1; i < sSkillLineStore.GetNumRows(); ++i)
{
SkillLineEntry const *skillInfo = sSkillLineStore.LookupEntry(i);
if (!skillInfo)
continue;
+
if ((skillInfo->categoryId != SKILL_CATEGORY_PROFESSION &&
skillInfo->categoryId != SKILL_CATEGORY_SECONDARY) ||
!skillInfo->canLink) // only prof with recipes have set
continue;
+
int loc = GetSessionDbcLocale();
name = skillInfo->name[loc];
if(name.empty())
continue;
+
if (!Utf8FitTo(name, wnamepart))
{
loc = 0;
@@ -3051,62 +3721,87 @@ bool ChatHandler::HandleLearnAllRecipesCommand(const char* args)
{
if(loc==GetSessionDbcLocale())
continue;
+
name = skillInfo->name[loc];
if(name.empty())
continue;
+
if (Utf8FitTo(name, wnamepart))
break;
}
}
+
if(loc < MAX_LOCALE)
{
targetSkillInfo = skillInfo;
break;
}
}
+
if(!targetSkillInfo)
return false;
+
HandleLearnSkillRecipesHelper(target,targetSkillInfo->id);
+
uint16 maxLevel = target->GetPureMaxSkillValue(targetSkillInfo->id);
target->SetSkill(targetSkillInfo->id, maxLevel, maxLevel);
PSendSysMessage(LANG_COMMAND_LEARN_ALL_RECIPES, name.c_str());
return true;
}
+
bool ChatHandler::HandleLookupPlayerIpCommand(const char* args)
{
+
if (!*args)
return false;
+
std::string ip = strtok ((char*)args, " ");
char* limit_str = strtok (NULL, " ");
int32 limit = limit_str ? atoi (limit_str) : -1;
+
loginDatabase.escape_string (ip);
+
QueryResult* result = loginDatabase.PQuery ("SELECT id,username FROM account WHERE last_ip = '%s'", ip.c_str ());
+
return LookupPlayerSearchCommand (result,limit);
}
+
bool ChatHandler::HandleLookupPlayerAccountCommand(const char* args)
{
if (!*args)
return false;
+
std::string account = strtok ((char*)args, " ");
char* limit_str = strtok (NULL, " ");
int32 limit = limit_str ? atoi (limit_str) : -1;
+
if (!AccountMgr::normalizeString (account))
return false;
+
loginDatabase.escape_string (account);
+
QueryResult* result = loginDatabase.PQuery ("SELECT id,username FROM account WHERE username = '%s'", account.c_str ());
+
return LookupPlayerSearchCommand (result,limit);
}
+
bool ChatHandler::HandleLookupPlayerEmailCommand(const char* args)
{
+
if (!*args)
return false;
+
std::string email = strtok ((char*)args, " ");
char* limit_str = strtok (NULL, " ");
int32 limit = limit_str ? atoi (limit_str) : -1;
+
loginDatabase.escape_string (email);
+
QueryResult* result = loginDatabase.PQuery ("SELECT id,username FROM account WHERE email = '%s'", email.c_str ());
+
return LookupPlayerSearchCommand (result,limit);
}
+
bool ChatHandler::LookupPlayerSearchCommand(QueryResult* result, int32 limit)
{
if(!result)
@@ -3115,73 +3810,93 @@ bool ChatHandler::LookupPlayerSearchCommand(QueryResult* result, int32 limit)
SetSentErrorMessage(true);
return false;
}
+
int i =0;
do
{
Field* fields = result->Fetch();
uint32 acc_id = fields[0].GetUInt32();
std::string acc_name = fields[1].GetCppString();
+
QueryResult* chars = CharacterDatabase.PQuery("SELECT guid,name FROM characters WHERE account = '%u'", acc_id);
if(chars)
{
PSendSysMessage(LANG_LOOKUP_PLAYER_ACCOUNT,acc_name.c_str(),acc_id);
+
uint64 guid = 0;
std::string name;
+
do
{
Field* charfields = chars->Fetch();
guid = charfields[0].GetUInt64();
name = charfields[1].GetCppString();
+
PSendSysMessage(LANG_LOOKUP_PLAYER_CHARACTER,name.c_str(),guid);
++i;
+
} while( chars->NextRow() && ( limit == -1 || i < limit ) );
+
delete chars;
}
} while(result->NextRow());
+
delete result;
+
if(i==0) // empty accounts only
{
PSendSysMessage(LANG_NO_PLAYERS_FOUND);
SetSentErrorMessage(true);
return false;
}
+
return true;
}
+
/// Triggering corpses expire check in world
bool ChatHandler::HandleServerCorpsesCommand(const char* /*args*/)
{
CorpsesErase();
return true;
}
+
bool ChatHandler::HandleRepairitemsCommand(const char* args)
{
Player* target;
if(!extractPlayerTarget((char*)args,&target))
return false;
+
// check online security
if (HasLowerSecurity(target, 0))
return false;
+
// Repair items
target->DurabilityRepairAll(false, 0, false);
+
PSendSysMessage(LANG_YOU_REPAIR_ITEMS, GetNameLink(target).c_str());
if(needReportToTarget(target))
ChatHandler(target).PSendSysMessage(LANG_YOUR_ITEMS_REPAIRED, GetNameLink().c_str());
return true;
}
+
bool ChatHandler::HandleWaterwalkCommand(const char* args)
{
if(!*args)
return false;
+
Player *player = getSelectedPlayer();
+
if(!player)
{
PSendSysMessage(LANG_NO_CHAR_SELECTED);
SetSentErrorMessage(true);
return false;
}
+
// check online security
if (HasLowerSecurity(player, 0))
return false;
+
if (strncmp(args, "on", 3) == 0)
player->SetMovement(MOVE_WATER_WALK); // ON
else if (strncmp(args, "off", 4) == 0)
@@ -3191,21 +3906,25 @@ bool ChatHandler::HandleWaterwalkCommand(const char* args)
SendSysMessage(LANG_USE_BOL);
return false;
}
+
PSendSysMessage(LANG_YOU_SET_WATERWALK, args, GetNameLink(player).c_str());
if(needReportToTarget(player))
ChatHandler(player).PSendSysMessage(LANG_YOUR_WATERWALK_SET, args, GetNameLink().c_str());
return true;
}
+
bool ChatHandler::HandleCreatePetCommand(const char* args)
{
Player *player = m_session->GetPlayer();
Creature *creatureTarget = getSelectedCreature();
+
if(!creatureTarget || creatureTarget->isPet() || creatureTarget->GetTypeId() == TYPEID_PLAYER)
{
PSendSysMessage(LANG_SELECT_CREATURE);
SetSentErrorMessage(true);
return false;
}
+
CreatureInfo const* cInfo = objmgr.GetCreatureTemplate(creatureTarget->GetEntry());
// Creatures with family 0 crashes the server
if(cInfo->family == 0)
@@ -3214,27 +3933,34 @@ bool ChatHandler::HandleCreatePetCommand(const char* args)
SetSentErrorMessage(true);
return false;
}
+
if(player->GetPetGUID())
{
PSendSysMessage("You already have a pet");
SetSentErrorMessage(true);
return false;
}
+
// Everything looks OK, create new pet
Pet* pet = new Pet(player, HUNTER_PET);
+
if(!pet)
return false;
+
if(!pet->CreateBaseAtCreature(creatureTarget))
{
delete pet;
PSendSysMessage("Error 1");
return false;
}
+
creatureTarget->setDeathState(JUST_DIED);
creatureTarget->RemoveCorpse();
creatureTarget->SetHealth(0); // just for nice GM-mode view
+
pet->SetUInt64Value(UNIT_FIELD_CREATEDBY, player->GetGUID());
pet->SetUInt32Value(UNIT_FIELD_FACTIONTEMPLATE, player->getFaction());
+
if(!pet->InitStatsForLevel(creatureTarget->getLevel()))
{
sLog.outError("ERROR: InitStatsForLevel() in EffectTameCreature failed! Pet deleted.");
@@ -3242,35 +3968,47 @@ bool ChatHandler::HandleCreatePetCommand(const char* args)
delete pet;
return false;
}
+
// prepare visual effect for levelup
pet->SetUInt32Value(UNIT_FIELD_LEVEL,creatureTarget->getLevel()-1);
+
pet->GetCharmInfo()->SetPetNumber(objmgr.GeneratePetNumber(), true);
// this enables pet details window (Shift+P)
pet->InitPetCreateSpells();
pet->SetHealth(pet->GetMaxHealth());
+
pet->GetMap()->Add((Creature*)pet);
+
// visual effect for levelup
pet->SetUInt32Value(UNIT_FIELD_LEVEL,creatureTarget->getLevel());
+
player->SetMinion(pet, true);
pet->SavePetToDB(PET_SAVE_AS_CURRENT);
player->PetSpellInitialize();
+
return true;
}
+
bool ChatHandler::HandlePetLearnCommand(const char* args)
{
if(!*args)
return false;
+
Player *plr = m_session->GetPlayer();
Pet *pet = plr->GetPet();
+
if(!pet)
{
PSendSysMessage("You have no pet");
SetSentErrorMessage(true);
return false;
}
+
uint32 spellId = extractSpellIdFromLink((char*)args);
+
if(!spellId || !sSpellStore.LookupEntry(spellId))
return false;
+
// Check if pet already has it
if(pet->HasSpell(spellId))
{
@@ -3278,6 +4016,7 @@ bool ChatHandler::HandlePetLearnCommand(const char* args)
SetSentErrorMessage(true);
return false;
}
+
// Check if spell is valid
SpellEntry const* spellInfo = sSpellStore.LookupEntry(spellId);
if(!spellInfo || !SpellMgr::IsSpellValid(spellInfo))
@@ -3286,72 +4025,96 @@ bool ChatHandler::HandlePetLearnCommand(const char* args)
SetSentErrorMessage(true);
return false;
}
+
pet->learnSpell(spellId);
+
PSendSysMessage("Pet has learned spell %u", spellId);
return true;
}
+
bool ChatHandler::HandlePetUnlearnCommand(const char *args)
{
if(!*args)
return false;
+
Player *plr = m_session->GetPlayer();
Pet *pet = plr->GetPet();
+
if(!pet)
{
PSendSysMessage("You have no pet");
SetSentErrorMessage(true);
return false;
}
+
uint32 spellId = extractSpellIdFromLink((char*)args);
+
if(pet->HasSpell(spellId))
pet->removeSpell(spellId, false);
else
PSendSysMessage("Pet doesn't have that spell");
+
return true;
}
+
bool ChatHandler::HandlePetTpCommand(const char *args)
{
if(!*args)
return false;
+
Player *plr = m_session->GetPlayer();
Pet *pet = plr->GetPet();
+
if(!pet)
{
PSendSysMessage("You have no pet");
SetSentErrorMessage(true);
return false;
}
+
uint32 tp = atol(args);
+
//pet->SetTP(tp);
+
PSendSysMessage("Pet's tp changed to %u", tp);
return true;
}
+
bool ChatHandler::HandleActivateObjectCommand(const char *args)
{
if(!*args)
return false;
+
char* cId = extractKeyFromLink((char*)args,"Hgameobject");
if(!cId)
return false;
+
uint32 lowguid = atoi(cId);
if(!lowguid)
return false;
+
GameObject* obj = NULL;
+
// by DB guid
if (GameObjectData const* go_data = objmgr.GetGOData(lowguid))
obj = GetObjectGlobalyWithGuidOrNearWithDbGuid(lowguid,go_data->id);
+
if(!obj)
{
PSendSysMessage(LANG_COMMAND_OBJNOTFOUND, lowguid);
SetSentErrorMessage(true);
return false;
}
+
// Activate
obj->SetLootState(GO_READY);
obj->UseDoorOrButton(10000);
+
PSendSysMessage("Object activated!");
+
return true;
}
+
// add creature, temp only
bool ChatHandler::HandleTempAddSpwCommand(const char* args)
{
@@ -3360,13 +4123,18 @@ bool ChatHandler::HandleTempAddSpwCommand(const char* args)
char* charID = strtok((char*)args, " ");
if (!charID)
return false;
+
Player *chr = m_session->GetPlayer();
+
uint32 id = atoi(charID);
if(!id)
return false;
+
chr->SummonCreature(id, *chr, TEMPSUMMON_CORPSE_DESPAWN, 120);
+
return true;
}
+
// add go, temp only
bool ChatHandler::HandleTempGameObjectCommand(const char* args)
{
@@ -3375,79 +4143,105 @@ bool ChatHandler::HandleTempGameObjectCommand(const char* args)
char* charID = strtok((char*)args, " ");
if (!charID)
return false;
+
Player *chr = m_session->GetPlayer();
+
char* spawntime = strtok(NULL, " ");
uint32 spawntm = 300;
+
if( spawntime )
spawntm = atoi((char*)spawntime);
+
float x = chr->GetPositionX();
float y = chr->GetPositionY();
float z = chr->GetPositionZ();
float ang = chr->GetOrientation();
+
float rot2 = sin(ang/2);
float rot3 = cos(ang/2);
+
uint32 id = atoi(charID);
+
chr->SummonGameObject(id,x,y,z,ang,0,0,rot2,rot3,spawntm);
+
return true;
}
+
bool ChatHandler::HandleNpcAddFormationCommand(const char* args)
{
if (!*args)
return false;
+
uint32 leaderGUID = (uint32) atoi((char*)args);
Creature *pCreature = getSelectedCreature();
+
if(!pCreature || !pCreature->GetDBTableGUIDLow())
{
SendSysMessage(LANG_SELECT_CREATURE);
SetSentErrorMessage(true);
return false;
}
+
uint32 lowguid = pCreature->GetDBTableGUIDLow();
if(pCreature->GetFormation())
{
PSendSysMessage("Selected creature is already member of group %u", pCreature->GetFormation()->GetId());
return false;
}
+
if (!lowguid)
return false;
+
Player *chr = m_session->GetPlayer();
FormationInfo *group_member;
+
group_member = new FormationInfo;
group_member->follow_angle = (pCreature->GetAngle(chr) - chr->GetOrientation()) * 180 / M_PI;
group_member->follow_dist = sqrtf(pow(chr->GetPositionX() - pCreature->GetPositionX(),int(2))+pow(chr->GetPositionY()-pCreature->GetPositionY(),int(2)));
group_member->leaderGUID = leaderGUID;
group_member->groupAI = 0;
+
CreatureGroupMap[lowguid] = group_member;
pCreature->SearchFormation();
+
WorldDatabase.PExecuteLog("INSERT INTO creature_formations (leaderGUID, memberGUID, dist, angle, groupAI) VALUES ('%u','%u','%f', '%f', '%u')",
leaderGUID, lowguid, group_member->follow_dist, group_member->follow_angle, group_member->groupAI);
+
PSendSysMessage("Creature %u added to formation with leader %u", lowguid, leaderGUID);
+
return true;
}
+
bool ChatHandler::HandleNpcSetLinkCommand(const char* args)
{
if (!*args)
return false;
+
uint32 linkguid = (uint32) atoi((char*)args);
+
Creature* pCreature = getSelectedCreature();
+
if(!pCreature)
{
SendSysMessage(LANG_SELECT_CREATURE);
SetSentErrorMessage(true);
return false;
}
+
if(!pCreature->GetDBTableGUIDLow())
{
PSendSysMessage("Selected creature isn't in creature table", pCreature->GetGUIDLow());
SetSentErrorMessage(true);
return false;
}
+
if(!objmgr.SetCreatureLinkedRespawn(pCreature->GetDBTableGUIDLow(), linkguid))
{
PSendSysMessage("Selected creature can't link with guid '%u'", linkguid);
SetSentErrorMessage(true);
return false;
}
+
PSendSysMessage("LinkGUID '%u' added to creature with DBTableGUID: '%u'", linkguid, pCreature->GetDBTableGUIDLow());
return true;
}