[svn] * Send ShutdownMsg to console using outstring_log.

* Prevent Client Crashes when MOVEMENTFLAG_ONTRANSPORT and MOVEMENTFLAG_SPLINE2 is set on creatures.
* Implement four new SEC_ADMINISTRATOR commands:
    - Group (.group [leader]/[disband]/[remove]) commands.
    - GameObject State (.gobject state <guid> <state>) command.

--HG--
branch : trunk
This commit is contained in:
Seline
2008-10-12 18:26:26 -05:00
parent fdcf5cc406
commit 63af34886b
7 changed files with 145 additions and 3 deletions
+54
View File
@@ -214,6 +214,14 @@ ChatCommand * ChatHandler::getCommandTable()
{ NULL, 0, NULL, "", NULL }
};
static ChatCommand groupCommandTable[] =
{
{ "leader", SEC_ADMINISTRATOR, &ChatHandler::HandleGroupLeaderCommand, "", NULL },
{ "disband", SEC_ADMINISTRATOR, &ChatHandler::HandleGroupDisbandCommand, "", NULL },
{ "remove", SEC_ADMINISTRATOR, &ChatHandler::HandleGroupRemoveCommand, "", NULL },
{ NULL, 0, NULL, "", NULL }
};
static ChatCommand lookupPlayerCommandTable[] =
{
{ "ip", SEC_GAMEMASTER, &ChatHandler::HandleLookupPlayerIpCommand, "", NULL },
@@ -340,6 +348,7 @@ ChatCommand * ChatHandler::getCommandTable()
{ "turn", SEC_GAMEMASTER, &ChatHandler::HandleTurnObjectCommand, "", NULL },
{ "move", SEC_GAMEMASTER, &ChatHandler::HandleMoveObjectCommand, "", NULL },
{ "near", SEC_ADMINISTRATOR, &ChatHandler::HandleNearObjectCommand, "", NULL },
{ "state", SEC_ADMINISTRATOR, &ChatHandler::HandleObjectStateCommand, "", NULL },
{ NULL, 0, NULL, "", NULL }
};
@@ -388,6 +397,7 @@ ChatCommand * ChatHandler::getCommandTable()
{ "list", SEC_ADMINISTRATOR, NULL, "", listCommandTable },
{ "lookup", SEC_ADMINISTRATOR, NULL, "", lookupCommandTable },
{ "pdump", SEC_ADMINISTRATOR, NULL, "", pdumpCommandTable },
{ "group", SEC_ADMINISTRATOR, NULL, "", groupCommandTable },
{ "guild", SEC_ADMINISTRATOR, NULL, "", guildCommandTable },
{ "cast", SEC_ADMINISTRATOR, NULL, "", castCommandTable },
{ "reset", SEC_ADMINISTRATOR, NULL, "", resetCommandTable },
@@ -1084,3 +1094,47 @@ GameTele const* ChatHandler::extractGameTeleFromLink(char* text)
return objmgr.GetGameTele(cId);
}
bool ChatHandler::GetPlayerGroupAndGUIDByName(const char* cname, Player* &plr, Group* &group, uint64 &guid, bool offline)
{
plr = NULL;
guid = 0;
if(cname)
{
std::string name = cname;
if(!name.empty())
{
if(!normalizePlayerName(name))
{
PSendSysMessage(LANG_PLAYER_NOT_FOUND);
SetSentErrorMessage(true);
return false;
}
plr = objmgr.GetPlayer(name.c_str());
if(offline)
guid = objmgr.GetPlayerGUIDByName(name.c_str());
}
}
if(plr)
{
group = plr->GetGroup();
if(!guid || !offline)
guid = plr->GetGUID();
}
else
{
if(getSelectedPlayer())
plr = getSelectedPlayer();
else
plr = m_session->GetPlayer();
if(!guid || !offline)
guid = plr->GetGUID();
group = plr->GetGroup();
}
return true;
}
+6
View File
@@ -239,6 +239,7 @@ class ChatHandler
bool HandleMoveCreatureCommand(const char* args);
bool HandleMoveObjectCommand(const char* args);
bool HandleTurnObjectCommand(const char* args);
bool HandleObjectStateCommand(const char* args);
bool HandlePInfoCommand(const char* args);
bool HandlePLimitCommand(const char* args);
bool HandleMuteCommand(const char* args);
@@ -314,6 +315,10 @@ class ChatHandler
bool HandleAddItemCommand(const char* args);
bool HandleAddItemSetCommand(const char* args);
bool HandleGroupLeaderCommand(const char* args);
bool HandleGroupDisbandCommand(const char* args);
bool HandleGroupRemoveCommand(const char* args);
bool HandleGuildCreateCommand(const char* args);
bool HandleGuildInviteCommand(const char* args);
bool HandleGuildUninviteCommand(const char* args);
@@ -393,6 +398,7 @@ class ChatHandler
char* extractKeyFromLink(char* text, char const* const* linkTypes, int* found_idx, char** something1 = NULL);
uint32 extractSpellIdFromLink(char* text);
GameTele const* extractGameTeleFromLink(char* text);
bool GetPlayerGroupAndGUIDByName(const char* cname, Player* &plr, Group* &group, uint64 &guid, bool offline = false);
GameObject* GetObjectGlobalyWithGuidOrNearWithDbGuid(uint32 lowguid,uint32 entry);
+1 -1
View File
@@ -122,7 +122,7 @@ bool ChatHandler::HandleNameAnnounceCommand(const char* args)
WorldPacket data;
if(!*args)
return false;
char str[1024];
//char str[1024];
//sprintf(str, GetMangosString(LANG_ANNOUNCE_COLOR), m_session->GetPlayer()->GetName(), args);
sWorld.SendWorldText(LANG_ANNOUNCE_COLOR, m_session->GetPlayer()->GetName(), args);
return true;
+80
View File
@@ -2175,6 +2175,44 @@ bool ChatHandler::HandleNearObjectCommand(const char* args)
return true;
}
bool ChatHandler::HandleObjectStateCommand(const char* args)
{
// number or [name] Shift-click form |color|Hgameobject:go_id|h[name]|h|r
char* cId = extractKeyFromLink((char*)args, "Hgameobject");
if(!cId)
return false;
uint32 lowguid = atoi(cId);
if(!lowguid)
return false;
GameObject* gobj = NULL;
if(GameObjectData const* goData = objmgr.GetGOData(lowguid))
gobj = GetObjectGlobalyWithGuidOrNearWithDbGuid(lowguid, goData->id);
if(!gobj)
{
PSendSysMessage(LANG_COMMAND_OBJNOTFOUND, lowguid);
SetSentErrorMessage(true);
return false;
}
char* cstate = strtok(NULL, " ");
if(!cstate)
return false;
int32 state = atoi(cstate);
if(state < 0)
gobj->SendObjectDeSpawnAnim(gobj->GetGUID());
else
gobj->SetGoState(state);
return true;
return true;
}
bool ChatHandler::HandleListCreatureCommand(const char* args)
{
if(!*args)
@@ -5472,3 +5510,45 @@ bool ChatHandler::HandleFlushArenaPointsCommand(const char * /*args*/)
sBattleGroundMgr.DistributeArenaPoints();
return true;
}
bool ChatHandler::HandleGroupLeaderCommand(const char* args)
{
Player* plr = NULL;
Group* group = NULL;
uint64 guid = 0;
char* cname = strtok((char*)args, " ");
if(GetPlayerGroupAndGUIDByName(cname, plr, group, guid))
if(group && group->GetLeaderGUID() != guid)
group->ChangeLeader(guid);
return true;
}
bool ChatHandler::HandleGroupDisbandCommand(const char* args)
{
Player* plr = NULL;
Group* group = NULL;
uint64 guid = 0;
char* cname = strtok((char*)args, " ");
if(GetPlayerGroupAndGUIDByName(cname, plr, group, guid))
if(group)
group->Disband();
return true;
}
bool ChatHandler::HandleGroupRemoveCommand(const char* args)
{
Player* plr = NULL;
Group* group = NULL;
uint64 guid = 0;
char* cname = strtok((char*)args, " ");
if(GetPlayerGroupAndGUIDByName(cname, plr, group, guid, true))
if(group)
group->RemoveMember(guid, 0);
return true;
}
+2
View File
@@ -264,6 +264,8 @@ void Object::_BuildMovementUpdate(ByteBuffer * data, uint8 flags, uint32 flags2
case TYPEID_UNIT:
{
flags2 = ((Unit*)this)->GetUnitMovementFlags();
flags2 &= ~MOVEMENTFLAG_ONTRANSPORT;
flags2 &= ~MOVEMENTFLAG_SPLINE2;
}
break;
case TYPEID_PLAYER:
+1 -1
View File
@@ -2426,7 +2426,7 @@ void World::ShutdownMsg(bool show, Player* player)
uint32 msgid = (m_ShutdownMask & SHUTDOWN_MASK_RESTART) ? SERVER_MSG_RESTART_TIME : SERVER_MSG_SHUTDOWN_TIME;
SendServerMessage(msgid,str.c_str(),player);
DEBUG_LOG("Server is %s in %s",(m_ShutdownMask & SHUTDOWN_MASK_RESTART ? "restart" : "shuttingdown"),str.c_str());
outstring_log("Server will %s in %s", (m_ShutdownMask & SHUTDOWN_MASK_RESTART ? "restart" : "shutdown"), str.c_str());
}
}