/* * Ascent MMORPG Server * Copyright (C) 2005-2007 Ascent Team * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * */ ///////////////////////////////////////////////// // GM Chat Commands // #include "StdAfx.h" bool ChatHandler::HandleAnnounceCommand(const char* args, WorldSession *m_session) { if(!*args) return false; char pAnnounce[1024]; string input2; input2 = "|cffff6060<"; //if (m_session->GetPermissionCount()) input2+="GM"; if(m_session->CanUseCommand('z')) input2+="Admin"; else if(m_session->GetPermissionCount()) input2+="GM"; input2+=">|r|c1f40af20"; input2+=m_session->GetPlayer()->GetName(); input2+="|r|cffffffff broadcasts: |r"; snprintf((char*)pAnnounce, 1024, "%s%s", input2.c_str(), args); // Adds BROADCAST: sWorld.SendWorldText(pAnnounce); // send message sGMLog.writefromsession(m_session, "used announce command, [%s]", args); //sWorld.SendForcedIRCMessage(pAnnounce); return true; } bool ChatHandler::HandleWAnnounceCommand(const char* args, WorldSession *m_session) { if(!*args) return false; char pAnnounce[1024]; string input2; input2 = "|cffff6060<"; if(m_session->CanUseCommand('z')) input2+="Admin"; else if(m_session->GetPermissionCount()) input2+="GM"; input2+=">|r|c1f40af20"; input2+=m_session->GetPlayer()->GetName(); input2+=":|r "; snprintf((char*)pAnnounce, 1024, "%s%s", input2.c_str(), args); sWorld.SendWorldWideScreenText(pAnnounce); // send message sGMLog.writefromsession(m_session, "used wannounce command [%s]", args); //sWorld.SendForcedIRCMessage(pAnnounce); return true; } bool ChatHandler::HandleGMOnCommand(const char* args, WorldSession *m_session) { /*uint32 newbytes = m_session->GetPlayer( )->GetUInt32Value(PLAYER_BYTES_2) | 0x8; m_session->GetPlayer( )->SetUInt32Value( PLAYER_BYTES_2, newbytes); GreenSystemMessage(m_session, "GM Flag Set.");*/ GreenSystemMessage(m_session, "Setting GM Flag on yourself..."); if(m_session->GetPlayer()->bGMTagOn) RedSystemMessage(m_session, "GM Flag is already set on. Use !gmoff to disable it."); else { m_session->GetPlayer()->bGMTagOn = true; m_session->GetPlayer()->SetFlag(PLAYER_FLAGS, PLAYER_FLAG_GM); // BlueSystemMessage(m_session, "GM Flag Set. It will appear above your name and in chat messages until you use !gmoff."); } return true; } bool ChatHandler::HandleGMOffCommand(const char* args, WorldSession *m_session) { //uint32 newbytes = m_session->GetPlayer( )->GetUInt32Value(PLAYER_BYTES_2) & ~(0x8); //m_session->GetPlayer( )->SetUInt32Value( PLAYER_BYTES_2, newbytes); //GreenSystemMessage(m_session, "GM Flag Unset."); GreenSystemMessage(m_session, "Unsetting GM Flag on yourself..."); if(!m_session->GetPlayer()->bGMTagOn) RedSystemMessage(m_session, "GM Flag not set. Use !gmon to enable it."); else { m_session->GetPlayer()->bGMTagOn = false; m_session->GetPlayer()->RemoveFlag(PLAYER_FLAGS, PLAYER_FLAG_GM); // BlueSystemMessage(m_session, "GM Flag Removed. Will no longer show in chat messages or above your name."); } return true; } bool ChatHandler::HandleGPSCommand(const char* args, WorldSession *m_session) { Object *obj; uint64 guid = m_session->GetPlayer()->GetSelection(); if (guid != 0) { if(!(obj = m_session->GetPlayer()->GetMapMgr()->GetUnit(guid))) { SystemMessage(m_session, "You should select a character or a creature."); return true; } } else obj = (Object*)m_session->GetPlayer(); AreaTable * at = sAreaStore.LookupEntry(obj->GetMapMgr()->GetAreaID(obj->GetPositionX(), obj->GetPositionY())); if(!at) return true; char buf[256]; snprintf((char*)buf, 256, "|cff00ff00Current Position: |cffffffffMap: |cff00ff00%d |cffffffffZone: |cff00ff00%u |cffffffffX: |cff00ff00%f |cffffffffY: |cff00ff00%f |cffffffffZ: |cff00ff00%f |cffffffffOrientation: |cff00ff00%f|r", (unsigned int)obj->GetMapId(), at->ZoneId, obj->GetPositionX(), obj->GetPositionY(), obj->GetPositionZ(), obj->GetOrientation()); SystemMessage(m_session, buf); return true; } bool ChatHandler::HandleKickCommand(const char* args, WorldSession *m_session) { if(!*args) return false; char *pname = strtok((char*)args, " "); if(!pname) { RedSystemMessage(m_session, "No name specified."); return true; } Player *chr = objmgr.GetPlayer((const char*)pname, false); if (chr) { char *reason = strtok(NULL, "\n"); std::string kickreason = "No reason"; if(reason) kickreason = reason; BlueSystemMessage(m_session, "Attempting to kick %s from the server for \"%s\".", chr->GetName(), kickreason.c_str()); sGMLog.writefromsession(m_session, "Kicked player %s from the server for %s", chr->GetName(), kickreason.c_str()); if(!m_session->CanUseCommand('z') && chr->GetSession()->CanUseCommand('z')) { RedSystemMessage(m_session, "You cannot kick %s, as they are a higher level gm than you.", chr->GetName()); return true; } /*if(m_session->GetSecurity() < chr->GetSession()->GetSecurity()) { SystemMessage(m_session, "You cannot kick %s, as he is a higher GM level than you.", chr->GetName()); return true; }*/ // we might have to re-work this char msg[200]; snprintf(msg, 200, "%sGM: %s was kicked from the server by %s. Reason: %s", MSG_COLOR_RED, chr->GetName(), m_session->GetPlayer()->GetName(), kickreason.c_str()); sWorld.SendWorldText(msg, NULL); //sWorld.SendIRCMessage(msg); SystemMessageToPlr(chr, "You are being kicked from the server by %s. Reason: %s", m_session->GetPlayer()->GetName(), kickreason.c_str()); chr->Kick(6000); return true; } else { RedSystemMessage(m_session, "Player is not online at the moment."); return true; } return true; } bool ChatHandler::HandleSetRankCommand(const char *args, WorldSession *m_session) { if(strlen(args) < 1) { char buf[256]; snprintf((char*)buf, 256, ".setrank - Sets player PVP rank."); SystemMessage(m_session, buf); return true; } int8 rank = atoi(args); Player *chr = getSelectedChar(m_session); if (chr == NULL) return true; chr->SetPVPRank(rank); return true; } bool ChatHandler::HandleGetRankCommand(const char *args, WorldSession *m_session) { Player *chr = getSelectedChar(m_session); if (chr == NULL) return true; GreenSystemMessage(m_session, "%s's PVP Rank is |r%d", chr->GetName(), chr->GetPVPRank()); return true; } bool ChatHandler::HandleAddInvItemCommand(const char *args, WorldSession *m_session) { if(strlen(args) < 1) { return false; } int itemid = atoi(strtok((char*)args, " ")); uint32 count = 1; char *cCount = strtok(NULL, "\n"); if(cCount) count = atoi(cCount); if(!count) count = 1; Player *chr = getSelectedChar(m_session); if (chr == NULL) return true; ItemPrototype* it = ItemPrototypeStorage.LookupEntry(itemid); if(it) { sGMLog.writefromsession(m_session, "used add item command, item id %u [%s] to %s", it->ItemId, it->Name1, chr->GetName()); Item *item; item = objmgr.CreateItem( itemid, chr); item->SetUInt32Value(ITEM_FIELD_STACK_COUNT, ((count > it->MaxCount) ? it->MaxCount : count)); if ( it->MaxCount == 1 && cCount ) { // let's think of count as a randomprop item->SetUInt32Value(ITEM_FIELD_RANDOM_PROPERTIES_ID, count); item->ApplyRandomProperties(); } if(!chr->GetItemInterface()->AddItemToFreeSlot(item)) { m_session->SendNotification("No free slots were found in your inventory!"); delete item; return true; } char messagetext[128]; snprintf(messagetext, 128, "Adding item %d (%s) to %s's inventory.",(unsigned int)it->ItemId,it->Name1, chr->GetName()); SystemMessage(m_session, messagetext); snprintf(messagetext, 128, "%s added item %d (%s) to your inventory.", m_session->GetPlayer()->GetName(), (unsigned int)itemid, it->Name1); SystemMessageToPlr(chr, messagetext); return true; } else { RedSystemMessage(m_session, "Item %d is not a valid item!",itemid); return true; } } bool ChatHandler::HandleSummonCommand(const char* args, WorldSession *m_session) { if(!*args) return false; Player *chr = objmgr.GetPlayer(args, false); if (chr) { // send message to user char buf[256]; char buf0[256]; if(chr->IsBeingTeleported()==true) { snprintf((char*)buf,256, "%s is already being teleported.", chr->GetName()); SystemMessage(m_session, buf); return true; } snprintf((char*)buf,256, "You are summoning %s.", chr->GetName()); SystemMessage(m_session, buf); if(!m_session->GetPlayer()->m_isGmInvisible) { // send message to player snprintf((char*)buf0,256, "You are being summoned by %s.", m_session->GetPlayer()->GetName()); SystemMessageToPlr(chr, buf0); } Player * plr = m_session->GetPlayer(); if(plr->GetMapMgr()==chr->GetMapMgr()) chr->_Relocate(plr->GetMapId(),plr->GetPosition(),false,false); else { sEventMgr.AddEvent(chr,&Player::EventPortToGM,plr,0,1,1,0); } } else { std::string name = args; PlayerInfo * pinfo = objmgr.GetPlayerInfoByName(name); if(!pinfo) { char buf[256]; snprintf((char*)buf,256,"Player (%s) does not exist.", args); SystemMessage(m_session, buf); } else { Player * pPlayer = m_session->GetPlayer(); CharacterDatabase.Execute("UPDATE characters SET mapId = %u, positionX = %u, positionY = %u, positionZ = %u, zoneId = %u WHERE guid = %u;", pPlayer->GetMapId(), pPlayer->GetPositionX(), pPlayer->GetPositionY(), pPlayer->GetPositionZ(), pPlayer->GetZoneId(), pPlayer->GetGUIDLow()); char buf[256]; snprintf((char*)buf,256,"(Offline) %s has been summoned.", args); SystemMessage(m_session, buf); } } return true; } bool ChatHandler::HandleAppearCommand(const char* args, WorldSession *m_session) { if(!*args) return false; Player *chr = objmgr.GetPlayer(args, false); if (chr) { char buf[256]; if(chr->IsBeingTeleported()==true) { snprintf((char*)buf,256, "%s is already being teleported.", chr->GetName()); SystemMessage(m_session, buf); return true; } snprintf((char*)buf,256, "Appearing at %s's location.", chr->GetName()); // -- europa SystemMessage(m_session, buf); if(!m_session->GetPlayer()->m_isGmInvisible) { char buf0[256]; snprintf((char*)buf0,256, "%s is appearing to your location.", m_session->GetPlayer()->GetName()); SystemMessageToPlr(chr, buf0); } m_session->GetPlayer()->SafeTeleport(chr->GetMapId(), chr->GetInstanceID(), chr->GetPosition()); } else { char buf[256]; snprintf((char*)buf,256, "Player (%s) does not exist or is not logged in.", args); SystemMessage(m_session, buf); } return true; } bool ChatHandler::HandleTaxiCheatCommand(const char* args, WorldSession *m_session) { if (!*args) return false; int flag = atoi((char*)args); Player *chr = getSelectedChar(m_session); if (chr == NULL) return true; char buf[256]; // send message to user if (flag != 0) { snprintf((char*)buf,256, "%s has all taxi nodes now.", chr->GetName()); } else { snprintf((char*)buf,256, "%s has no more taxi nodes now.", chr->GetName()); } GreenSystemMessage(m_session, buf); // send message to player if (flag != 0) { snprintf((char*)buf,256, "%s has given you all taxi nodes.", m_session->GetPlayer()->GetName()); } else { snprintf((char*)buf,256, "%s has deleted all your taxi nodes.", m_session->GetPlayer()->GetName()); } SystemMessage(m_session, buf); for (uint8 i=0; i<8; i++) { if (flag != 0) { m_session->GetPlayer()->SetTaximask(i, 0xFFFFFFFF); } else { m_session->GetPlayer()->SetTaximask(i, 0); } } return true; } bool ChatHandler::HandleModifySpeedCommand(const char* args, WorldSession *m_session) { WorldPacket data; if (!*args) return false; float Speed = (float)atof((char*)args); if (Speed > 255 || Speed < 1) { RedSystemMessage(m_session, "Incorrect value. Range is 1..255"); return true; } Player *chr = getSelectedChar(m_session); if (chr == NULL) return true; char buf[256]; // send message to user BlueSystemMessage(m_session, "You set the speed to %2.2f of %s.", Speed, chr->GetName()); // send message to player snprintf((char*)buf,256, "%s set your speed to %2.2f.", m_session->GetPlayer()->GetName(), Speed); SystemMessage(m_session, buf); chr->SetPlayerSpeed(RUN, Speed); chr->SetPlayerSpeed(SWIM, Speed); chr->SetPlayerSpeed(RUNBACK, Speed); chr->SetPlayerSpeed(FLY, Speed); return true; } bool ChatHandler::HandleLearnSkillCommand(const char *args, WorldSession *m_session) { uint32 skill, min, max; min = max = 1; char *pSkill = strtok((char*)args, " "); if(!pSkill) return false; else skill = atol(pSkill); BlueSystemMessage(m_session, "Adding skill line %d", skill); char *pMin = strtok(NULL, " "); if(pMin) { min = atol(pMin); char *pMax = strtok(NULL, "\n"); if(pMax) max = atol(pMax); } else { return false; } Player *plr = getSelectedChar(m_session, true); if(!plr) return false; if(plr->GetTypeId() != TYPEID_PLAYER) return false; sGMLog.writefromsession(m_session, "used add skill of %u %u %u on %s", skill, min, max, plr->GetName()); plr->_AddSkillLine(skill, min, max); return true; } bool ChatHandler::HandleModifySkillCommand(const char *args, WorldSession *m_session) { uint32 skill, min, max; min = max = 1; char *pSkill = strtok((char*)args, " "); if(!pSkill) return false; else skill = atol(pSkill); char *pMin = strtok(NULL, " "); uint32 cnt = 0; if(!pMin) cnt = 1; else cnt = atol(pMin); skill = atol(pSkill); BlueSystemMessage(m_session, "Modifying skill line %d. Advancing %d times.", skill, cnt); Player *plr = getSelectedChar(m_session, true); if(!plr) plr = m_session->GetPlayer(); if(!plr) return false; sGMLog.writefromsession(m_session, "used modify skill of %u %u on %s", skill, cnt,plr->GetName()); if(!plr->_HasSkillLine(skill)) { SystemMessage(m_session, "Does not have skill line, adding."); plr->_AddSkillLine(skill, 1, 300); } else { plr->_AdvanceSkillLine(skill,cnt); } return true; } bool ChatHandler::HandleRemoveSkillCommand(const char *args, WorldSession *m_session) { uint32 skill = 0; char *pSkill = strtok((char*)args, " "); if(!pSkill) return false; else skill = atol(pSkill); BlueSystemMessage(m_session, "Removing skill line %d", skill); Player *plr = getSelectedChar(m_session, true); if(!plr) return true; sGMLog.writefromsession(m_session, "used remove skill of %u on %s", skill, plr->GetName()); plr->_RemoveSkillLine(skill); SystemMessageToPlr(plr, "%s removed skill line %d from you. ", m_session->GetPlayer()->GetName(), skill); return true; } bool ChatHandler::HandleEmoteCommand(const char* args, WorldSession *m_session) { uint32 emote = atoi((char*)args); Unit* target = this->getSelectedCreature(m_session); if(!target) return false; if(target) target->SetUInt32Value(UNIT_NPC_EMOTESTATE,emote); return true; } bool ChatHandler::HandleModifyGoldCommand(const char* args, WorldSession *m_session) { WorldPacket data; if (!*args) return false; int32 gold = atoi((char*)args); Player *chr = getSelectedChar(m_session, true); if(!chr) return true; sGMLog.writefromsession(m_session, "used modify gold on %s, gold: %u", chr->GetName(), gold); BlueSystemMessage(m_session, "Adding %d gold to %s's backpack...", gold, chr->GetName()); int32 currentgold = chr->GetUInt32Value(PLAYER_FIELD_COINAGE); int32 newgold = currentgold + gold; if(newgold < 0) { GreenSystemMessageToPlr(chr, "%s took the all gold from your backpack.", m_session->GetPlayer()->GetName()); newgold = 0; } else { if(newgold > currentgold) GreenSystemMessageToPlr(chr, "%s added %d gold from your backpack.", m_session->GetPlayer()->GetName(), myabs(gold)); else GreenSystemMessageToPlr(chr, "%s took %d gold to your backpack.", m_session->GetPlayer()->GetName(), myabs(gold)); } chr->SetUInt32Value(PLAYER_FIELD_COINAGE, newgold); return true; } bool ChatHandler::HandleGenerateNameCommand(const char *args, WorldSession *m_session) { SystemMessage(m_session, "Generating 7 names:"); for(int i=0;i<7;i++) SystemMessage(m_session, "%s", sWorld.GenerateName(0).c_str()); GreenSystemMessage(m_session, "Done."); return true; } bool ChatHandler::HandleTriggerCommand(const char* args, WorldSession* m_session) { int32 instance_id; uint32 trigger_id; int valcount = sscanf(args, "%u %d", (unsigned int*)&trigger_id, (int*)&instance_id); if(!valcount) return false; if(valcount == 1) instance_id = 0; AreaTrigger *pTrigger = AreaTriggerStorage.LookupEntry(trigger_id); if(trigger_id == 0 || pTrigger == NULL) { RedSystemMessage(m_session, "Could not find trigger %s", (args == NULL ? "NULL" : args)); return true; } m_session->GetPlayer()->SafeTeleport(pTrigger->Mapid, instance_id, LocationVector(pTrigger->x, pTrigger->y, pTrigger->z, pTrigger->o)); BlueSystemMessage(m_session, "Teleported to trigger %u on [%u][%.2f][%.2f][%.2f]", pTrigger->AreaTriggerID, pTrigger->Mapid, pTrigger->x, pTrigger->y, pTrigger->z); return true; } bool ChatHandler::HandleUnlearnCommand(const char* args, WorldSession * m_session) { Player * plr = getSelectedChar(m_session, true); if(plr == 0) return true; uint32 SpellId = atol(args); if(SpellId == 0) { RedSystemMessage(m_session, "You must specify a spell id."); return true; } if(plr->HasSpell(SpellId)) { GreenSystemMessageToPlr(plr, "Removed spell %u.", SpellId); plr->removeSpell(SpellId, false, false, 0); } else { RedSystemMessage(m_session, "That player does not have spell %u learnt.", SpellId); } return true; } bool ChatHandler::HandleNpcSpawnLinkCommand(const char* args, WorldSession *m_session) { uint32 id; char sql[512]; Creature* target = m_session->GetPlayer()->GetMapMgr()->GetCreature(m_session->GetPlayer()->GetSelection()); if (!target) return false; int valcount = sscanf(args, "%u", (unsigned int*)&id); if(valcount) { snprintf(sql, 512, "UPDATE creature_spawns SET respawnlink = '%u' WHERE id = '%u'", (unsigned int)id, (unsigned int)target->GetSQL_id()); WorldDatabase.Execute( sql ); BlueSystemMessage(m_session, "Spawn linking for this npc has been updated: %u", id); } else { RedSystemMessage(m_session, "Sql entry invalid %u", id); } return true; } bool ChatHandler::HandleGoStateLinkCommand(const char* args, WorldSession *m_session) { /*uint32 id; char sql[512]; GameObject *GObj = NULL; GObj = m_session->GetPlayer()->m_GM_SelectedGO; if( !GObj ) return false; int valcount = sscanf(args, "%u", &id); if(id) { snprintf(sql, 512, "UPDATE creature_spawns SET respawnlink = '%u' WHERE id = '%u'", id, GObj->GetSQL_id()); sDatabase.Execute( sql ); } else { RedSystemMessage(m_session, "Sql entry invalid %u", id); }*/ return true; } bool ChatHandler::HandleSilentPlayerCommand(const char* args, WorldSession *m_session) { Player * plr = getSelectedChar(m_session, true); if(plr == 0) return true; uint32 time = atol(args); if(!time) time = 5*60*1000 + now(); else time = time*60*1000 + now(); plr->Set_Mute_on_player(time); return true; }