diff options
Diffstat (limited to 'src/game/Level1.cpp')
-rw-r--r-- | src/game/Level1.cpp | 495 |
1 files changed, 495 insertions, 0 deletions
diff --git a/src/game/Level1.cpp b/src/game/Level1.cpp index 1108e9e1240..160d65cd5cf 100644 --- a/src/game/Level1.cpp +++ b/src/game/Level1.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 "WorldPacket.h" @@ -33,14 +34,17 @@ #include "CellImpl.h" #include "InstanceSaveMgr.h" #include "Util.h" + #ifdef _DEBUG_VMAPS #include "VMapFactory.h" #endif + //-----------------------Npc Commands----------------------- bool ChatHandler::HandleNpcSayCommand(const char* args) { if(!*args) return false; + Creature* pCreature = getSelectedCreature(); if(!pCreature) { @@ -48,7 +52,9 @@ bool ChatHandler::HandleNpcSayCommand(const char* args) SetSentErrorMessage(true); return false; } + pCreature->MonsterSay(args, LANG_UNIVERSAL, 0); + // make some emotes char lastchar = args[strlen(args) - 1]; switch(lastchar) @@ -57,12 +63,15 @@ bool ChatHandler::HandleNpcSayCommand(const char* args) case '!': pCreature->HandleEmoteCommand(EMOTE_ONESHOT_EXCLAMATION); break; default: pCreature->HandleEmoteCommand(EMOTE_ONESHOT_TALK); break; } + return true; } + bool ChatHandler::HandleNpcYellCommand(const char* args) { if(!*args) return false; + Creature* pCreature = getSelectedCreature(); if(!pCreature) { @@ -70,103 +79,136 @@ bool ChatHandler::HandleNpcYellCommand(const char* args) SetSentErrorMessage(true); return false; } + pCreature->MonsterYell(args, LANG_UNIVERSAL, 0); + // make an emote pCreature->HandleEmoteCommand(EMOTE_ONESHOT_SHOUT); + return true; } + //show text emote by creature in chat bool ChatHandler::HandleNpcTextEmoteCommand(const char* args) { if(!*args) return false; + Creature* pCreature = getSelectedCreature(); + if(!pCreature) { SendSysMessage(LANG_SELECT_CREATURE); SetSentErrorMessage(true); return false; } + pCreature->MonsterTextEmote(args, 0); + return true; } + // make npc whisper to player bool ChatHandler::HandleNpcWhisperCommand(const char* args) { if(!*args) return false; + char* receiver_str = strtok((char*)args, " "); char* text = strtok(NULL, ""); + uint64 guid = m_session->GetPlayer()->GetSelection(); Creature* pCreature = m_session->GetPlayer()->GetMap()->GetCreature(guid); + if(!pCreature || !receiver_str || !text) { return false; } + uint64 receiver_guid= atol(receiver_str); + // check online security if (HasLowerSecurity(objmgr.GetPlayer(receiver_guid), 0)) return false; + pCreature->MonsterWhisper(text,receiver_guid); + return true; } //---------------------------------------------------------- + bool ChatHandler::HandleNameAnnounceCommand(const char* args) { WorldPacket data; if(!*args) return false; + sWorld.SendWorldText(LANG_ANNOUNCE_COLOR, m_session->GetPlayer()->GetName(), args); return true; } + bool ChatHandler::HandleGMNameAnnounceCommand(const char* args) { WorldPacket data; if(!*args) return false; + sWorld.SendGMText(LANG_GM_ANNOUNCE_COLOR, m_session->GetPlayer()->GetName(), args); return true; } + // global announce bool ChatHandler::HandleAnnounceCommand(const char* args) { if(!*args) return false; + sWorld.SendWorldText(LANG_SYSTEMMESSAGE,args); return true; } + // announce to logged in GMs bool ChatHandler::HandleGMAnnounceCommand(const char* args) { if(!*args) return false; + sWorld.SendGMText(LANG_GM_BROADCAST,args); return true; } + //notification player at the screen bool ChatHandler::HandleNotifyCommand(const char* args) { if(!*args) return false; + std::string str = GetTrinityString(LANG_GLOBAL_NOTIFY); str += args; + WorldPacket data(SMSG_NOTIFICATION, (str.size()+1)); data << str; sWorld.SendGlobalMessage(&data); + return true; } + //notification GM at the screen bool ChatHandler::HandleGMNotifyCommand(const char* args) { if(!*args) return false; + std::string str = GetTrinityString(LANG_GM_NOTIFY); str += args; + WorldPacket data(SMSG_NOTIFICATION, (str.size()+1)); data << str; sWorld.SendGlobalGMMessage(&data); + return true; } + //Enable\Dissable GM Mode bool ChatHandler::HandleGMCommand(const char* args) { @@ -178,7 +220,9 @@ bool ChatHandler::HandleGMCommand(const char* args) m_session->SendNotification(LANG_GM_OFF); return true; } + std::string argstr = (char*)args; + if (argstr == "on") { m_session->GetPlayer()->SetGameMaster(true); @@ -189,6 +233,7 @@ bool ChatHandler::HandleGMCommand(const char* args) #endif return true; } + if (argstr == "off") { m_session->GetPlayer()->SetGameMaster(false); @@ -199,10 +244,12 @@ bool ChatHandler::HandleGMCommand(const char* args) #endif return true; } + SendSysMessage(LANG_USE_BOL); SetSentErrorMessage(true); return false; } + // Enables or disables hiding of the staff badge bool ChatHandler::HandleGMChatCommand(const char* args) { @@ -214,23 +261,28 @@ bool ChatHandler::HandleGMChatCommand(const char* args) m_session->SendNotification(LANG_GM_CHAT_OFF); return true; } + std::string argstr = (char*)args; + if (argstr == "on") { m_session->GetPlayer()->SetGMChat(true); m_session->SendNotification(LANG_GM_CHAT_ON); return true; } + if (argstr == "off") { m_session->GetPlayer()->SetGMChat(false); m_session->SendNotification(LANG_GM_CHAT_OFF); return true; } + SendSysMessage(LANG_USE_BOL); SetSentErrorMessage(true); return false; } + std::string ChatHandler::PGetParseString(int32 entry, ...) { const char *format = GetTrinityString(entry); @@ -241,6 +293,7 @@ std::string ChatHandler::PGetParseString(int32 entry, ...) va_end(ap); return (std::string)str; } + bool ChatHandler::HandleGMTicketListCommand(const char* args) { SendSysMessage(LANG_COMMAND_TICKETSHOWLIST); @@ -263,6 +316,7 @@ bool ChatHandler::HandleGMTicketListCommand(const char* args) return true; } + bool ChatHandler::HandleGMTicketListOnlineCommand(const char* args) { SendSysMessage(LANG_COMMAND_TICKETSHOWONLINELIST); @@ -270,6 +324,7 @@ bool ChatHandler::HandleGMTicketListOnlineCommand(const char* args) { if((*itr)->closed != 0 || !objmgr.GetPlayer((*itr)->playerGuid)) continue; + std::string gmname; std::stringstream ss; ss << PGetParseString(LANG_COMMAND_TICKETLISTGUID, (*itr)->guid); @@ -284,6 +339,7 @@ bool ChatHandler::HandleGMTicketListOnlineCommand(const char* args) } return true; } + bool ChatHandler::HandleGMTicketListClosedCommand(const char* args) { SendSysMessage(LANG_COMMAND_TICKETSHOWCLOSEDLIST); @@ -291,6 +347,7 @@ bool ChatHandler::HandleGMTicketListClosedCommand(const char* args) { if((*itr)->closed == 0) continue; + std::string gmname; std::stringstream ss; ss << PGetParseString(LANG_COMMAND_TICKETLISTGUID, (*itr)->guid); @@ -305,10 +362,12 @@ bool ChatHandler::HandleGMTicketListClosedCommand(const char* args) } return true; } + bool ChatHandler::HandleGMTicketGetByIdCommand(const char* args) { if(!*args) return false; + uint64 tguid = atoi(args); GM_Ticket *ticket = objmgr.GetGMTicket(tguid); if(!ticket || ticket->closed != 0) @@ -316,6 +375,7 @@ bool ChatHandler::HandleGMTicketGetByIdCommand(const char* args) SendSysMessage(LANG_COMMAND_TICKETNOTEXIST); return true; } + std::string gmname; std::stringstream ss; ss << PGetParseString(LANG_COMMAND_TICKETLISTGUID, ticket->guid); @@ -334,24 +394,29 @@ bool ChatHandler::HandleGMTicketGetByIdCommand(const char* args) SendSysMessage(ss.str().c_str()); return true; } + bool ChatHandler::HandleGMTicketGetByNameCommand(const char* args) { if(!*args) return false; + std::string name = (char*)args; normalizePlayerName(name); + Player *plr = objmgr.GetPlayer(name.c_str()); if(!plr) { SendSysMessage(LANG_NO_PLAYERS_FOUND); return true; } + GM_Ticket *ticket = objmgr.GetGMTicketByPlayer(plr->GetGUID()); if(!ticket) { SendSysMessage(LANG_COMMAND_TICKETNOTEXIST); return true; } + std::string gmname; std::stringstream ss; ss << PGetParseString(LANG_COMMAND_TICKETLISTGUID, ticket->guid); @@ -370,10 +435,12 @@ bool ChatHandler::HandleGMTicketGetByNameCommand(const char* args) SendSysMessage(ss.str().c_str()); return true; } + bool ChatHandler::HandleGMTicketCloseByIdCommand(const char* args) { if(!*args) return false; + uint64 tguid = atoi(args); GM_Ticket *ticket = objmgr.GetGMTicket(tguid); if(!ticket || ticket->closed != 0) @@ -393,29 +460,38 @@ bool ChatHandler::HandleGMTicketCloseByIdCommand(const char* args) SendGlobalGMSysMessage(ss.str().c_str()); Player *plr = objmgr.GetPlayer(ticket->playerGuid); objmgr.RemoveGMTicket(ticket, m_session->GetPlayer()->GetGUID()); + if(!plr || !plr->IsInWorld()) return true; + // send abandon ticket WorldPacket data(SMSG_GMTICKET_DELETETICKET, 4); data << uint32(9); plr->GetSession()->SendPacket( &data ); return true; } + bool ChatHandler::HandleGMTicketAssignToCommand(const char* args) { if(!*args) return false; + char* tguid = strtok((char*)args, " "); uint64 ticketGuid = atoi(tguid); char* targetgm = strtok( NULL, " "); + if(!targetgm) return false; + std::string targm = targetgm; + if(!normalizePlayerName(targm)) return true; + Player *cplr = m_session->GetPlayer(); std::string gmname; GM_Ticket *ticket = objmgr.GetGMTicket(ticketGuid); + if(!ticket || ticket->closed != 0) { SendSysMessage(LANG_COMMAND_TICKETNOTEXIST); @@ -440,6 +516,7 @@ bool ChatHandler::HandleGMTicketAssignToCommand(const char* args) PSendSysMessage(LANG_COMMAND_TICKETALREADYASSIGNED, ticket->guid, gmname.c_str()); return true; } + ticket->assignedToGM = tarGUID; objmgr.AddOrUpdateGMTicket(*ticket); std::stringstream ss; @@ -449,13 +526,16 @@ bool ChatHandler::HandleGMTicketAssignToCommand(const char* args) SendGlobalGMSysMessage(ss.str().c_str()); return true; } + bool ChatHandler::HandleGMTicketUnAssignCommand(const char* args) { if(!*args) return false; + uint64 ticketGuid = atoi(args); Player *cplr = m_session->GetPlayer(); GM_Ticket *ticket = objmgr.GetGMTicket(ticketGuid); + if(!ticket|| ticket->closed != 0) { SendSysMessage(LANG_COMMAND_TICKETNOTEXIST); @@ -466,6 +546,7 @@ bool ChatHandler::HandleGMTicketUnAssignCommand(const char* args) PSendSysMessage(LANG_COMMAND_TICKETNOTASSIGNED, ticket->guid); return true; } + std::string gmname; objmgr.GetPlayerNameByGUID(ticket->assignedToGM, gmname); Player *plr = objmgr.GetPlayer(ticket->assignedToGM); @@ -474,6 +555,7 @@ bool ChatHandler::HandleGMTicketUnAssignCommand(const char* args) SendSysMessage(LANG_COMMAND_TICKETUNASSIGNSECURITY); return true; } + std::stringstream ss; ss << PGetParseString(LANG_COMMAND_TICKETLISTGUID, ticket->guid); ss << PGetParseString(LANG_COMMAND_TICKETLISTNAME, ticket->name.c_str()); @@ -484,17 +566,22 @@ bool ChatHandler::HandleGMTicketUnAssignCommand(const char* args) objmgr.AddOrUpdateGMTicket(*ticket); return true; } + bool ChatHandler::HandleGMTicketCommentCommand(const char* args) { if(!*args) return false; + char* tguid = strtok((char*)args, " "); uint64 ticketGuid = atoi(tguid); char* comment = strtok( NULL, "\n"); + if(!comment) return false; + Player *cplr = m_session->GetPlayer(); GM_Ticket *ticket = objmgr.GetGMTicket(ticketGuid); + if(!ticket || ticket->closed != 0) { PSendSysMessage(LANG_COMMAND_TICKETNOTEXIST); @@ -505,6 +592,7 @@ bool ChatHandler::HandleGMTicketCommentCommand(const char* args) PSendSysMessage(LANG_COMMAND_TICKETALREADYASSIGNED, ticket->guid); return true; } + std::string gmname; objmgr.GetPlayerNameByGUID(ticket->assignedToGM, gmname); ticket->comment = comment; @@ -520,12 +608,14 @@ bool ChatHandler::HandleGMTicketCommentCommand(const char* args) SendGlobalGMSysMessage(ss.str().c_str()); return true; } + bool ChatHandler::HandleGMTicketDeleteByIdCommand(const char* args) { if(!*args) return false; uint64 ticketGuid = atoi(args); GM_Ticket *ticket = objmgr.GetGMTicket(ticketGuid); + if(!ticket) { SendSysMessage(LANG_COMMAND_TICKETNOTEXIST); @@ -536,6 +626,7 @@ bool ChatHandler::HandleGMTicketDeleteByIdCommand(const char* args) SendSysMessage(LANG_COMMAND_TICKETCLOSEFIRST); return true; } + std::stringstream ss; ss << PGetParseString(LANG_COMMAND_TICKETLISTGUID, ticket->guid); ss << PGetParseString(LANG_COMMAND_TICKETLISTNAME, ticket->name.c_str()); @@ -550,14 +641,17 @@ bool ChatHandler::HandleGMTicketDeleteByIdCommand(const char* args) data << uint32(9); plr->GetSession()->SendPacket( &data ); } + ticket = NULL; return true; } + bool ChatHandler::HandleGMTicketReloadCommand(const char*) { objmgr.LoadGMTickets(); return true; } + //Enable\Dissable Invisible mode bool ChatHandler::HandleGMVisibleCommand(const char* args) { @@ -566,24 +660,30 @@ bool ChatHandler::HandleGMVisibleCommand(const char* args) PSendSysMessage(LANG_YOU_ARE, m_session->GetPlayer()->isGMVisible() ? GetTrinityString(LANG_VISIBLE) : GetTrinityString(LANG_INVISIBLE)); return true; } + std::string argstr = (char*)args; + if (argstr == "on") { m_session->GetPlayer()->SetGMVisible(true); m_session->SendNotification(LANG_INVISIBLE_VISIBLE); return true; } + if (argstr == "off") { m_session->SendNotification(LANG_INVISIBLE_INVISIBLE); m_session->GetPlayer()->SetGMVisible(false); return true; } + SendSysMessage(LANG_USE_BOL); SetSentErrorMessage(true); return false; } + + bool ChatHandler::HandleGPSCommand(const char* args) { WorldObject *obj = NULL; @@ -592,6 +692,7 @@ bool ChatHandler::HandleGPSCommand(const char* args) uint64 guid = extractGuidFromLink((char*)args); if(guid) obj = (WorldObject*)ObjectAccessor::GetObjectByTypeMask(*m_session->GetPlayer(),guid,TYPEMASK_UNIT|TYPEMASK_GAMEOBJECT); + if(!obj) { SendSysMessage(LANG_PLAYER_NOT_FOUND); @@ -602,6 +703,7 @@ bool ChatHandler::HandleGPSCommand(const char* args) else { obj = getSelectedUnit(); + if(!obj) { SendSysMessage(LANG_SELECT_CHAR_OR_CREATURE); @@ -611,22 +713,31 @@ bool ChatHandler::HandleGPSCommand(const char* args) } CellPair cell_val = Trinity::ComputeCellPair(obj->GetPositionX(), obj->GetPositionY()); Cell cell(cell_val); + uint32 zone_id, area_id; obj->GetZoneAndAreaId(zone_id,area_id); + MapEntry const* mapEntry = sMapStore.LookupEntry(obj->GetMapId()); AreaTableEntry const* zoneEntry = GetAreaEntryByAreaID(zone_id); AreaTableEntry const* areaEntry = GetAreaEntryByAreaID(area_id); + float zone_x = obj->GetPositionX(); float zone_y = obj->GetPositionY(); + Map2ZoneCoordinates(zone_x,zone_y,zone_id); + Map const *map = obj->GetMap(); float ground_z = map->GetHeight(obj->GetPositionX(), obj->GetPositionY(), MAX_HEIGHT); float floor_z = map->GetHeight(obj->GetPositionX(), obj->GetPositionY(), obj->GetPositionZ()); + GridPair p = Trinity::ComputeGridPair(obj->GetPositionX(), obj->GetPositionY()); + int gx=63-p.x_coord; int gy=63-p.y_coord; + uint32 have_map = Map::ExistMap(obj->GetMapId(),gx,gy) ? 1 : 0; uint32 have_vmap = Map::ExistVMap(obj->GetMapId(),gx,gy) ? 1 : 0; + PSendSysMessage(LANG_MAP_POSITION, obj->GetMapId(), (mapEntry ? mapEntry->name[GetSessionDbcLocale()] : "<unknown>" ), zone_id, (zoneEntry ? zoneEntry->area_name[GetSessionDbcLocale()] : "<unknown>" ), @@ -635,6 +746,7 @@ bool ChatHandler::HandleGPSCommand(const char* args) obj->GetPositionX(), obj->GetPositionY(), obj->GetPositionZ(), obj->GetOrientation(), cell.GridX(), cell.GridY(), cell.CellX(), cell.CellY(), obj->GetInstanceId(), zone_x, zone_y, ground_z, floor_z, have_map, have_vmap ); + sLog.outDebug("Player %s GPS call for %s '%s' (%s: %u):", m_session ? GetNameLink().c_str() : GetMangosString(LANG_CONSOLE_COMMAND), (obj->GetTypeId() == TYPEID_PLAYER ? "player" : "creature"), obj->GetName(), @@ -647,6 +759,7 @@ bool ChatHandler::HandleGPSCommand(const char* args) obj->GetPositionX(), obj->GetPositionY(), obj->GetPositionZ(), obj->GetOrientation(), cell.GridX(), cell.GridY(), cell.CellX(), cell.CellY(), obj->GetInstanceId(), zone_x, zone_y, ground_z, floor_z, have_map, have_vmap ); + LiquidData liquid_status; ZLiquidStatus res = map->getLiquidStatus(obj->GetPositionX(), obj->GetPositionY(), obj->GetPositionZ(), MAP_ALL_LIQUIDS, &liquid_status); if (res) @@ -655,6 +768,7 @@ bool ChatHandler::HandleGPSCommand(const char* args) } return true; } + //Summon Player bool ChatHandler::HandleNamegoCommand(const char* args) { @@ -663,6 +777,7 @@ bool ChatHandler::HandleNamegoCommand(const char* args) std::string target_name; if (!extractPlayerTarget((char*)args,&target,&target_guid,&target_name)) return false; + Player* _player = m_session->GetPlayer(); if (target == _player || target_guid == _player->GetGUID()) { @@ -670,19 +785,23 @@ bool ChatHandler::HandleNamegoCommand(const char* args) SetSentErrorMessage(true); return false; } + if (target) { std::string nameLink = playerLink(target_name); // check online security if (HasLowerSecurity(target, 0)) return false; + if (target->IsBeingTeleported()) { PSendSysMessage(LANG_IS_TELEPORTED, nameLink.c_str()); SetSentErrorMessage(true); return false; } + Map* pMap = m_session->GetPlayer()->GetMap(); + if (pMap->IsBattleGroundOrArena()) { // only allow if gm mode is on @@ -717,6 +836,7 @@ bool ChatHandler::HandleNamegoCommand(const char* args) //SetSentErrorMessage(true); //return false; } + // we are in instance, and can summon only player in our group with us as lead if (!m_session->GetPlayer()->GetGroup() || !target->GetGroup() || (target->GetGroup()->GetLeaderGUID() != m_session->GetPlayer()->GetGUID()) || @@ -728,9 +848,11 @@ bool ChatHandler::HandleNamegoCommand(const char* args) return false; } } + PSendSysMessage(LANG_SUMMONING, nameLink.c_str(),""); if (needReportToTarget(target)) ChatHandler(target).PSendSysMessage(LANG_SUMMONED_BY, playerLink(_player->GetName()).c_str()); + // stop flight if need if (target->isInFlight()) { @@ -740,6 +862,7 @@ bool ChatHandler::HandleNamegoCommand(const char* args) // save only in non-flight case else target->SaveRecallPosition(); + // before GM float x,y,z; m_session->GetPlayer()->GetClosePoint(x,y,z,target->GetObjectSize()); @@ -751,8 +874,11 @@ bool ChatHandler::HandleNamegoCommand(const char* args) // check offline security if (HasLowerSecurity(NULL, target_guid)) return false; + std::string nameLink = playerLink(target_name); + PSendSysMessage(LANG_SUMMONING, nameLink.c_str(),GetTrinityString(LANG_OFFLINE)); + // in point where GM stay Player::SavePositionInDB(m_session->GetPlayer()->GetMapId(), m_session->GetPlayer()->GetPositionX(), @@ -762,8 +888,10 @@ bool ChatHandler::HandleNamegoCommand(const char* args) m_session->GetPlayer()->GetZoneId(), target_guid); } + return true; } + //Teleport to Player bool ChatHandler::HandleGonameCommand(const char* args) { @@ -772,6 +900,7 @@ bool ChatHandler::HandleGonameCommand(const char* args) std::string target_name; if (!extractPlayerTarget((char*)args,&target,&target_guid,&target_name)) return false; + Player* _player = m_session->GetPlayer(); if (target == _player || target_guid == _player->GetGUID()) { @@ -780,12 +909,15 @@ bool ChatHandler::HandleGonameCommand(const char* args) return false; } + if (target) { // check online security if (HasLowerSecurity(target, 0)) return false; + std::string chrNameLink = playerLink(target_name); + Map* cMap = target->GetMap(); if (cMap->IsBattleGroundOrArena()) { @@ -813,6 +945,7 @@ bool ChatHandler::HandleGonameCommand(const char* args) else if(cMap->IsDungeon()) { Map* pMap = _player->GetMap(); + // we have to go to instance, and can go to player only if: // 1) we are in his group (either as leader or as member) // 2) we are not bound to any group and have GM mode on @@ -836,6 +969,7 @@ bool ChatHandler::HandleGonameCommand(const char* args) return false; } } + // if the player or the player's group is bound to another instance // the player will not be bound to another one InstancePlayerBind *pBind = _player->GetBoundInstance(target->GetMapId(), target->GetDifficulty()); @@ -849,11 +983,14 @@ bool ChatHandler::HandleGonameCommand(const char* args) if (InstanceSave *save = sInstanceSaveManager.GetInstanceSave(target->GetInstanceId())) _player->BindToInstance(save, !save->CanReset()); } + _player->SetDifficulty(target->GetDifficulty()); } + PSendSysMessage(LANG_APPEARING_AT, chrNameLink.c_str()); if (needReportToTarget(target)) ChatHandler(target).PSendSysMessage(LANG_APPEARING_TO, GetNameLink().c_str()); + // stop flight if need if (_player->isInFlight()) { @@ -863,9 +1000,11 @@ bool ChatHandler::HandleGonameCommand(const char* args) // save only in non-flight case else _player->SaveRecallPosition(); + // to point to see at target with same orientation float x,y,z; target->GetContactPoint(_player,x,y,z); + _player->TeleportTo(target->GetMapId(), x, y, z, _player->GetAngle(target), TELE_TO_GM_MODE); _player->SetPhaseMask(target->GetPhaseMask(), true); } @@ -874,14 +1013,18 @@ bool ChatHandler::HandleGonameCommand(const char* args) // check offline security if (HasLowerSecurity(NULL, target_guid)) return false; + std::string nameLink = playerLink(target_name); + PSendSysMessage(LANG_APPEARING_AT, nameLink.c_str()); + // to point where player stay (if loaded) float x,y,z,o; uint32 map; bool in_flight; if (!Player::LoadPositionFromDB(map,x,y,z,o,in_flight,target_guid)) return false; + // stop flight if need if (_player->isInFlight()) { @@ -891,41 +1034,52 @@ bool ChatHandler::HandleGonameCommand(const char* args) // save only in non-flight case else _player->SaveRecallPosition(); + _player->TeleportTo(map, x, y, z,_player->GetOrientation()); } + return true; } + // Teleport player to last position bool ChatHandler::HandleRecallCommand(const char* args) { Player* target; if(!extractPlayerTarget((char*)args,&target)) return false; + // check online security if (HasLowerSecurity(target, 0)) return false; + if (target->IsBeingTeleported()) { PSendSysMessage(LANG_IS_TELEPORTED, GetNameLink(target).c_str()); SetSentErrorMessage(true); return false; } + // stop flight if need if(target->isInFlight()) { target->GetMotionMaster()->MovementExpired(); target->CleanupAfterTaxiFlight(); } + target->TeleportTo(target->m_recallMap, target->m_recallX, target->m_recallY, target->m_recallZ, target->m_recallO); return true; } + //Edit Player KnownTitles bool ChatHandler::HandleModifyKnownTitlesCommand(const char* args) { if(!*args) return false; + uint64 titles = 0; + sscanf((char*)args, UI64FMTD, &titles); + Player *chr = getSelectedPlayer(); if (!chr) { @@ -933,39 +1087,52 @@ bool ChatHandler::HandleModifyKnownTitlesCommand(const char* args) SetSentErrorMessage(true); return false; } + // check online security if (HasLowerSecurity(chr, 0)) return false; + uint64 titles2 = titles; + for(uint32 i = 1; i < sCharTitlesStore.GetNumRows(); ++i) if(CharTitlesEntry const* tEntry = sCharTitlesStore.LookupEntry(i)) titles2 &= ~(uint64(1) << tEntry->bit_index); + titles &= ~titles2; // remove not existed titles + chr->SetUInt64Value(PLAYER__FIELD_KNOWN_TITLES, titles); SendSysMessage(LANG_DONE); + return true; } + //Edit Player HP bool ChatHandler::HandleModifyHPCommand(const char* args) { if(!*args) return false; + // char* pHp = strtok((char*)args, " "); // if (!pHp) // return false; + // char* pHpMax = strtok(NULL, " "); // if (!pHpMax) // return false; + // int32 hpm = atoi(pHpMax); // int32 hp = atoi(pHp); + int32 hp = atoi((char*)args); int32 hpm = atoi((char*)args); + if (hp <= 0 || hpm <= 0 || hpm < hp) { SendSysMessage(LANG_BAD_VALUE); SetSentErrorMessage(true); return false; } + Unit *chr = getSelectedUnit(); if (chr == NULL) { @@ -973,37 +1140,47 @@ bool ChatHandler::HandleModifyHPCommand(const char* args) SetSentErrorMessage(true); return false; } + // check online security if (chr->GetTypeId() == TYPEID_PLAYER && HasLowerSecurity((Player*)chr, 0)) return false; + PSendSysMessage(LANG_YOU_CHANGE_HP, GetNameLink((Player*)chr).c_str(), hp, hpm); if (chr->GetTypeId() == TYPEID_PLAYER && needReportToTarget((Player*)chr)) ChatHandler((Player*)chr).PSendSysMessage(LANG_YOURS_HP_CHANGED, GetNameLink().c_str(), hp, hpm); + chr->SetMaxHealth( hpm ); chr->SetHealth( hp ); + return true; } + //Edit Player Mana bool ChatHandler::HandleModifyManaCommand(const char* args) { if(!*args) return false; + // char* pmana = strtok((char*)args, " "); // if (!pmana) // return false; + // char* pmanaMax = strtok(NULL, " "); // if (!pmanaMax) // return false; + // int32 manam = atoi(pmanaMax); // int32 mana = atoi(pmana); int32 mana = atoi((char*)args); int32 manam = atoi((char*)args); + if (mana <= 0 || manam <= 0 || manam < mana) { SendSysMessage(LANG_BAD_VALUE); SetSentErrorMessage(true); return false; } + Player *chr = getSelectedPlayer(); if (chr == NULL) { @@ -1011,37 +1188,48 @@ bool ChatHandler::HandleModifyManaCommand(const char* args) SetSentErrorMessage(true); return false; } + // check online security if (HasLowerSecurity(chr, 0)) return false; + PSendSysMessage(LANG_YOU_CHANGE_MANA, GetNameLink(chr).c_str(), mana, manam); if (needReportToTarget(chr)) ChatHandler(chr).PSendSysMessage(LANG_YOURS_MANA_CHANGED, GetNameLink().c_str(), mana, manam); + chr->SetMaxPower(POWER_MANA,manam ); chr->SetPower(POWER_MANA, mana ); + return true; } + //Edit Player Energy bool ChatHandler::HandleModifyEnergyCommand(const char* args) { if(!*args) return false; + // char* pmana = strtok((char*)args, " "); // if (!pmana) // return false; + // char* pmanaMax = strtok(NULL, " "); // if (!pmanaMax) // return false; + // int32 manam = atoi(pmanaMax); // int32 mana = atoi(pmana); + int32 energy = atoi((char*)args)*10; int32 energym = atoi((char*)args)*10; + if (energy <= 0 || energym <= 0 || energym < energy) { SendSysMessage(LANG_BAD_VALUE); SetSentErrorMessage(true); return false; } + Player *chr = getSelectedPlayer(); if (!chr) { @@ -1049,38 +1237,50 @@ bool ChatHandler::HandleModifyEnergyCommand(const char* args) SetSentErrorMessage(true); return false; } + // check online security if (HasLowerSecurity(chr, 0)) return false; + PSendSysMessage(LANG_YOU_CHANGE_ENERGY, GetNameLink(chr).c_str(), energy/10, energym/10); if (needReportToTarget(chr)) ChatHandler(chr).PSendSysMessage(LANG_YOURS_ENERGY_CHANGED, GetNameLink().c_str(), energy/10, energym/10); + chr->SetMaxPower(POWER_ENERGY,energym ); chr->SetPower(POWER_ENERGY, energy ); + sLog.outDetail(GetTrinityString(LANG_CURRENT_ENERGY),chr->GetMaxPower(POWER_ENERGY)); + return true; } + //Edit Player Rage bool ChatHandler::HandleModifyRageCommand(const char* args) { if(!*args) return false; + // char* pmana = strtok((char*)args, " "); // if (!pmana) // return false; + // char* pmanaMax = strtok(NULL, " "); // if (!pmanaMax) // return false; + // int32 manam = atoi(pmanaMax); // int32 mana = atoi(pmana); + int32 rage = atoi((char*)args)*10; int32 ragem = atoi((char*)args)*10; + if (rage <= 0 || ragem <= 0 || ragem < rage) { SendSysMessage(LANG_BAD_VALUE); SetSentErrorMessage(true); return false; } + Player *chr = getSelectedPlayer(); if (chr == NULL) { @@ -1088,29 +1288,37 @@ bool ChatHandler::HandleModifyRageCommand(const char* args) SetSentErrorMessage(true); return false; } + // check online security if (HasLowerSecurity(chr, 0)) return false; + PSendSysMessage(LANG_YOU_CHANGE_RAGE, GetNameLink(chr).c_str(), rage/10, ragem/10); if (needReportToTarget(chr)) ChatHandler(chr).PSendSysMessage(LANG_YOURS_RAGE_CHANGED, GetNameLink().c_str(), rage/10, ragem/10); + chr->SetMaxPower(POWER_RAGE,ragem ); chr->SetPower(POWER_RAGE, rage ); + return true; } + // Edit Player Runic Power bool ChatHandler::HandleModifyRunicPowerCommand(const char* args) { if(!*args) return false; + int32 rune = atoi((char*)args)*10; int32 runem = atoi((char*)args)*10; + if (rune <= 0 || runem <= 0 || runem < rune) { SendSysMessage(LANG_BAD_VALUE); SetSentErrorMessage(true); return false; } + Player *chr = getSelectedPlayer(); if (chr == NULL) { @@ -1118,19 +1326,25 @@ bool ChatHandler::HandleModifyRunicPowerCommand(const char* args) SetSentErrorMessage(true); return false; } + PSendSysMessage(LANG_YOU_CHANGE_RUNIC_POWER, GetNameLink(chr).c_str(), rune/10, runem/10); if (needReportToTarget(chr)) ChatHandler(chr).PSendSysMessage(LANG_YOURS_RUNIC_POWER_CHANGED, GetNameLink().c_str(), rune/10, runem/10); + chr->SetMaxPower(POWER_RUNIC_POWER,runem ); chr->SetPower(POWER_RUNIC_POWER, rune ); + return true; } + //Edit Player Faction bool ChatHandler::HandleModifyFactionCommand(const char* args) { if(!*args) return false; + char* pfactionid = extractKeyFromLink((char*)args,"Hfaction"); + Creature* chr = getSelectedCreature(); if(!chr) { @@ -1138,6 +1352,7 @@ bool ChatHandler::HandleModifyFactionCommand(const char* args) SetSentErrorMessage(true); return false; } + if(!pfactionid) { if(chr) @@ -1150,44 +1365,56 @@ bool ChatHandler::HandleModifyFactionCommand(const char* args) } return true; } + if( !chr ) { SendSysMessage(LANG_NO_CHAR_SELECTED); SetSentErrorMessage(true); return false; } + uint32 factionid = atoi(pfactionid); uint32 flag; + char *pflag = strtok(NULL, " "); if (!pflag) flag = chr->GetUInt32Value(UNIT_FIELD_FLAGS); else flag = atoi(pflag); + char* pnpcflag = strtok(NULL, " "); + uint32 npcflag; if(!pnpcflag) npcflag = chr->GetUInt32Value(UNIT_NPC_FLAGS); else npcflag = atoi(pnpcflag); + char* pdyflag = strtok(NULL, " "); + uint32 dyflag; if(!pdyflag) dyflag = chr->GetUInt32Value(UNIT_DYNAMIC_FLAGS); else dyflag = atoi(pdyflag); + if(!sFactionTemplateStore.LookupEntry(factionid)) { PSendSysMessage(LANG_WRONG_FACTION, factionid); SetSentErrorMessage(true); return false; } + PSendSysMessage(LANG_YOU_CHANGE_FACTION, chr->GetGUIDLow(),factionid,flag,npcflag,dyflag); + chr->setFaction(factionid); chr->SetUInt32Value(UNIT_FIELD_FLAGS,flag); chr->SetUInt32Value(UNIT_NPC_FLAGS,npcflag); chr->SetUInt32Value(UNIT_DYNAMIC_FLAGS,dyflag); + return true; } + //Edit Player Spell bool ChatHandler::HandleModifySpellCommand(const char* args) { @@ -1195,14 +1422,19 @@ bool ChatHandler::HandleModifySpellCommand(const char* args) char* pspellflatid = strtok((char*)args, " "); if (!pspellflatid) return false; + char* pop = strtok(NULL, " "); if (!pop) return false; + char* pval = strtok(NULL, " "); if (!pval) return false; + uint16 mark; + char* pmark = strtok(NULL, " "); + uint8 spellflatid = atoi(pspellflatid); uint8 op = atoi(pop); uint16 val = atoi(pval); @@ -1210,6 +1442,7 @@ bool ChatHandler::HandleModifySpellCommand(const char* args) mark = 65535; else mark = atoi(pmark); + Player *chr = getSelectedPlayer(); if (chr == NULL) { @@ -1217,28 +1450,35 @@ bool ChatHandler::HandleModifySpellCommand(const char* args) SetSentErrorMessage(true); return false; } + // check online security if (HasLowerSecurity(chr, 0)) return false; + PSendSysMessage(LANG_YOU_CHANGE_SPELLFLATID, spellflatid, val, mark, GetNameLink(chr).c_str()); if (needReportToTarget(chr)) ChatHandler(chr).PSendSysMessage(LANG_YOURS_SPELLFLATID_CHANGED, GetNameLink().c_str(), spellflatid, val, mark); + WorldPacket data(SMSG_SET_FLAT_SPELL_MODIFIER, (1+1+2+2)); data << uint8(spellflatid); data << uint8(op); data << uint16(val); data << uint16(mark); chr->GetSession()->SendPacket(&data); + return true; } + //Edit Player TP bool ChatHandler::HandleModifyTalentCommand (const char* args) { if (!*args) return false; + int tp = atoi((char*)args); if (tp < 0) return false; + Unit* target = getSelectedUnit(); if(!target) { @@ -1246,6 +1486,7 @@ bool ChatHandler::HandleModifyTalentCommand (const char* args) SetSentErrorMessage(true); return false; } + if(target->GetTypeId()==TYPEID_PLAYER) { // check online security @@ -1268,10 +1509,12 @@ bool ChatHandler::HandleModifyTalentCommand (const char* args) return true; } } + SendSysMessage(LANG_NO_CHAR_SELECTED); SetSentErrorMessage(true); return false; } + //Enable On\OFF all taxi paths bool ChatHandler::HandleTaxiCheatCommand(const char* args) { @@ -1281,15 +1524,19 @@ bool ChatHandler::HandleTaxiCheatCommand(const char* args) SetSentErrorMessage(true); return false; } + std::string argstr = (char*)args; + Player *chr = getSelectedPlayer(); if (!chr) { chr=m_session->GetPlayer(); } + // check online security else if (HasLowerSecurity(chr, 0)) return false; + if (argstr == "on") { chr->SetTaxiCheater(true); @@ -1298,30 +1545,37 @@ bool ChatHandler::HandleTaxiCheatCommand(const char* args) ChatHandler(chr).PSendSysMessage(LANG_YOURS_TAXIS_ADDED, GetNameLink().c_str()); return true; } + if (argstr == "off") { chr->SetTaxiCheater(false); PSendSysMessage(LANG_YOU_REMOVE_TAXIS, GetNameLink(chr).c_str()); if (needReportToTarget(chr)) ChatHandler(chr).PSendSysMessage(LANG_YOURS_TAXIS_REMOVED, GetNameLink().c_str()); + return true; } + SendSysMessage(LANG_USE_BOL); SetSentErrorMessage(true); return false; } + //Edit Player Aspeed bool ChatHandler::HandleModifyASpeedCommand(const char* args) { if (!*args) return false; + float ASpeed = (float)atof((char*)args); + if (ASpeed > 50.0f || ASpeed < 0.1f) { SendSysMessage(LANG_BAD_VALUE); SetSentErrorMessage(true); return false; } + Player *chr = getSelectedPlayer(); if (chr == NULL) { @@ -1329,19 +1583,24 @@ bool ChatHandler::HandleModifyASpeedCommand(const char* args) SetSentErrorMessage(true); return false; } + // check online security if (HasLowerSecurity(chr, 0)) return false; + std::string chrNameLink = GetNameLink(chr); + if(chr->isInFlight()) { PSendSysMessage(LANG_CHAR_IN_FLIGHT,chrNameLink.c_str()); SetSentErrorMessage(true); return false; } + PSendSysMessage(LANG_YOU_CHANGE_ASPEED, ASpeed, chrNameLink.c_str()); if (needReportToTarget(chr)) ChatHandler(chr).PSendSysMessage(LANG_YOURS_ASPEED_CHANGED, GetNameLink().c_str(), ASpeed); + chr->SetSpeed(MOVE_WALK, ASpeed,true); chr->SetSpeed(MOVE_RUN, ASpeed,true); chr->SetSpeed(MOVE_SWIM, ASpeed,true); @@ -1349,18 +1608,22 @@ bool ChatHandler::HandleModifyASpeedCommand(const char* args) chr->SetSpeed(MOVE_FLIGHT, ASpeed,true); return true; } + //Edit Player Speed bool ChatHandler::HandleModifySpeedCommand(const char* args) { if (!*args) return false; + float Speed = (float)atof((char*)args); + if (Speed > 50.0f || Speed < 0.1f) { SendSysMessage(LANG_BAD_VALUE); SetSentErrorMessage(true); return false; } + Player *chr = getSelectedPlayer(); if (chr == NULL) { @@ -1368,34 +1631,44 @@ bool ChatHandler::HandleModifySpeedCommand(const char* args) SetSentErrorMessage(true); return false; } + // check online security if (HasLowerSecurity(chr, 0)) return false; + std::string chrNameLink = GetNameLink(chr); + if(chr->isInFlight()) { PSendSysMessage(LANG_CHAR_IN_FLIGHT,chrNameLink.c_str()); SetSentErrorMessage(true); return false; } + PSendSysMessage(LANG_YOU_CHANGE_SPEED, Speed, chrNameLink.c_str()); if (needReportToTarget(chr)) ChatHandler(chr).PSendSysMessage(LANG_YOURS_SPEED_CHANGED, GetNameLink().c_str(), Speed); + chr->SetSpeed(MOVE_RUN,Speed,true); + return true; } + //Edit Player Swim Speed bool ChatHandler::HandleModifySwimCommand(const char* args) { if (!*args) return false; + float Swim = (float)atof((char*)args); + if (Swim > 50.0f || Swim < 0.1f) { SendSysMessage(LANG_BAD_VALUE); SetSentErrorMessage(true); return false; } + Player *chr = getSelectedPlayer(); if (chr == NULL) { @@ -1403,34 +1676,44 @@ bool ChatHandler::HandleModifySwimCommand(const char* args) SetSentErrorMessage(true); return false; } + // check online security if (HasLowerSecurity(chr, 0)) return false; + std::string chrNameLink = GetNameLink(chr); + if(chr->isInFlight()) { PSendSysMessage(LANG_CHAR_IN_FLIGHT,chrNameLink.c_str()); SetSentErrorMessage(true); return false; } + PSendSysMessage(LANG_YOU_CHANGE_SWIM_SPEED, Swim, chrNameLink.c_str()); if (needReportToTarget(chr)) ChatHandler(chr).PSendSysMessage(LANG_YOURS_SWIM_SPEED_CHANGED, GetNameLink().c_str(), Swim); + chr->SetSpeed(MOVE_SWIM,Swim,true); + return true; } + //Edit Player Walk Speed bool ChatHandler::HandleModifyBWalkCommand(const char* args) { if (!*args) return false; + float BSpeed = (float)atof((char*)args); + if (BSpeed > 50.0f || BSpeed < 0.1f) { SendSysMessage(LANG_BAD_VALUE); SetSentErrorMessage(true); return false; } + Player *chr = getSelectedPlayer(); if (chr == NULL) { @@ -1438,34 +1721,44 @@ bool ChatHandler::HandleModifyBWalkCommand(const char* args) SetSentErrorMessage(true); return false; } + // check online security if (HasLowerSecurity(chr, 0)) return false; + std::string chrNameLink = GetNameLink(chr); + if(chr->isInFlight()) { PSendSysMessage(LANG_CHAR_IN_FLIGHT,chrNameLink.c_str()); SetSentErrorMessage(true); return false; } + PSendSysMessage(LANG_YOU_CHANGE_BACK_SPEED, BSpeed, chrNameLink.c_str()); if (needReportToTarget(chr)) ChatHandler(chr).PSendSysMessage(LANG_YOURS_BACK_SPEED_CHANGED, GetNameLink().c_str(), BSpeed); + chr->SetSpeed(MOVE_RUN_BACK,BSpeed,true); + return true; } + //Edit Player Fly bool ChatHandler::HandleModifyFlyCommand(const char* args) { if (!*args) return false; + float FSpeed = (float)atof((char*)args); + if (FSpeed > 50.0f || FSpeed < 0.1f) { SendSysMessage(LANG_BAD_VALUE); SetSentErrorMessage(true); return false; } + Player *chr = getSelectedPlayer(); if (chr == NULL) { @@ -1473,20 +1766,26 @@ bool ChatHandler::HandleModifyFlyCommand(const char* args) SetSentErrorMessage(true); return false; } + // check online security if (HasLowerSecurity(chr, 0)) return false; + PSendSysMessage(LANG_YOU_CHANGE_FLY_SPEED, FSpeed, GetNameLink(chr).c_str()); if (needReportToTarget(chr)) ChatHandler(chr).PSendSysMessage(LANG_YOURS_FLY_SPEED_CHANGED, GetNameLink().c_str(), FSpeed); + chr->SetSpeed(MOVE_FLIGHT,FSpeed,true); + return true; } + //Edit Player Scale bool ChatHandler::HandleModifyScaleCommand(const char* args) { if (!*args) return false; + float Scale = (float)atof((char*)args); if (Scale > 10.0f || Scale <= 0.1f) { @@ -1494,6 +1793,7 @@ bool ChatHandler::HandleModifyScaleCommand(const char* args) SetSentErrorMessage(true); return false; } + Player *chr = getSelectedPlayer(); if (chr == NULL) { @@ -1501,23 +1801,30 @@ bool ChatHandler::HandleModifyScaleCommand(const char* args) SetSentErrorMessage(true); return false; } + // check online security if (HasLowerSecurity(chr, 0)) return false; + PSendSysMessage(LANG_YOU_CHANGE_SIZE, Scale, GetNameLink(chr).c_str()); if (needReportToTarget(chr)) ChatHandler(chr).PSendSysMessage(LANG_YOURS_SIZE_CHANGED, GetNameLink().c_str(), Scale); + chr->SetFloatValue(OBJECT_FIELD_SCALE_X, Scale); + return true; } + //Enable Player mount bool ChatHandler::HandleModifyMountCommand(const char* args) { if(!*args) return false; + uint16 mId = 1147; float speed = (float)15; uint32 num = 0; + num = atoi((char*)args); switch(num) { @@ -1733,6 +2040,7 @@ bool ChatHandler::HandleModifyMountCommand(const char* args) SetSentErrorMessage(true); return false; } + Player *chr = getSelectedPlayer(); if (chr == NULL) { @@ -1740,32 +2048,40 @@ bool ChatHandler::HandleModifyMountCommand(const char* args) SetSentErrorMessage(true); return false; } + // check online security if (HasLowerSecurity(chr, 0)) return false; + PSendSysMessage(LANG_YOU_GIVE_MOUNT, GetNameLink(chr).c_str()); if (needReportToTarget(chr)) ChatHandler(chr).PSendSysMessage(LANG_MOUNT_GIVED, GetNameLink().c_str()); + chr->SetUInt32Value(UNIT_FIELD_FLAGS, UNIT_FLAG_PVP); chr->Mount(mId); + WorldPacket data( SMSG_FORCE_RUN_SPEED_CHANGE, (8+4+1+4) ); data.append(chr->GetPackGUID()); data << (uint32)0; data << (uint8)0; //new 2.1.0 data << float(speed); chr->SendMessageToSet( &data, true ); + data.Initialize( SMSG_FORCE_SWIM_SPEED_CHANGE, (8+4+4) ); data.append(chr->GetPackGUID()); data << (uint32)0; data << float(speed); chr->SendMessageToSet( &data, true ); + return true; } + //Edit Player money bool ChatHandler::HandleModifyMoneyCommand(const char* args) { if (!*args) return false; + Player *chr = getSelectedPlayer(); if (chr == NULL) { @@ -1773,26 +2089,33 @@ bool ChatHandler::HandleModifyMoneyCommand(const char* args) SetSentErrorMessage(true); return false; } + // check online security if (HasLowerSecurity(chr, 0)) return false; + int32 addmoney = atoi((char*)args); + uint32 moneyuser = chr->GetMoney(); + if (addmoney < 0) { int32 newmoney = int32(moneyuser) + addmoney; + sLog.outDetail(GetTrinityString(LANG_CURRENT_MONEY), moneyuser, addmoney, newmoney); if (newmoney <= 0 ) { PSendSysMessage(LANG_YOU_TAKE_ALL_MONEY, GetNameLink(chr).c_str()); if (needReportToTarget(chr)) ChatHandler(chr).PSendSysMessage(LANG_YOURS_ALL_MONEY_GONE, GetNameLink().c_str()); + chr->SetMoney(0); } else { if (newmoney > MAX_MONEY_AMOUNT) newmoney = MAX_MONEY_AMOUNT; + PSendSysMessage(LANG_YOU_TAKE_MONEY, abs(addmoney), GetNameLink(chr).c_str()); if (needReportToTarget(chr)) ChatHandler(chr).PSendSysMessage(LANG_YOURS_MONEY_TAKEN, GetNameLink().c_str(), abs(addmoney)); @@ -1804,19 +2127,24 @@ bool ChatHandler::HandleModifyMoneyCommand(const char* args) PSendSysMessage(LANG_YOU_GIVE_MONEY, addmoney, GetNameLink(chr).c_str()); if (needReportToTarget(chr)) ChatHandler(chr).PSendSysMessage(LANG_YOURS_MONEY_GIVEN, GetNameLink().c_str(), addmoney); + if (addmoney >=MAX_MONEY_AMOUNT) chr->SetMoney(MAX_MONEY_AMOUNT); else chr->ModifyMoney( addmoney ); } + sLog.outDetail(GetTrinityString(LANG_NEW_MONEY), moneyuser, addmoney, chr->GetMoney() ); + return true; } + //Edit Unit field bool ChatHandler::HandleModifyBitCommand(const char* args) { if( !*args ) return false; + Unit *unit = getSelectedUnit(); if (!unit) { @@ -1824,17 +2152,22 @@ bool ChatHandler::HandleModifyBitCommand(const char* args) SetSentErrorMessage(true); return false; } + // check online security if (unit->GetTypeId() == TYPEID_PLAYER && HasLowerSecurity((Player *)unit, 0)) return false; + char* pField = strtok((char*)args, " "); if (!pField) return false; + char* pBit = strtok(NULL, " "); if (!pBit) return false; + uint16 field = atoi(pField); uint32 bit = atoi(pBit); + if (field < OBJECT_END || field >= unit->GetValuesCount()) { SendSysMessage(LANG_BAD_VALUE); @@ -1847,6 +2180,7 @@ bool ChatHandler::HandleModifyBitCommand(const char* args) SetSentErrorMessage(true); return false; } + if ( unit->HasFlag( field, (1<<(bit-1)) ) ) { unit->RemoveFlag( field, (1<<(bit-1)) ); @@ -1859,10 +2193,12 @@ bool ChatHandler::HandleModifyBitCommand(const char* args) } return true; } + bool ChatHandler::HandleModifyHonorCommand (const char* args) { if (!*args) return false; + Player *target = getSelectedPlayer(); if(!target) { @@ -1870,27 +2206,37 @@ bool ChatHandler::HandleModifyHonorCommand (const char* args) SetSentErrorMessage(true); return false; } + // check online security if (HasLowerSecurity(target, 0)) return false; + int32 amount = (uint32)atoi(args); + target->ModifyHonorPoints(amount); + PSendSysMessage(LANG_COMMAND_MODIFY_HONOR, GetNameLink(target).c_str(), target->GetHonorPoints()); + return true; } + bool ChatHandler::HandleTeleCommand(const char * args) { if(!*args) return false; + Player* _player = m_session->GetPlayer(); + // id, or string, or [name] Shift-click form |color|Htele:id|h[name]|h|r GameTele const* tele = extractGameTeleFromLink((char*)args); + if (!tele) { SendSysMessage(LANG_COMMAND_TELE_NOTFOUND); SetSentErrorMessage(true); return false; } + MapEntry const * me = sMapStore.LookupEntry(tele->mapId); if(!me || me->IsBattleGroundOrArena()) { @@ -1898,6 +2244,7 @@ bool ChatHandler::HandleTeleCommand(const char * args) SetSentErrorMessage(true); return false; } + // stop flight if need if(_player->isInFlight()) { @@ -1907,20 +2254,27 @@ bool ChatHandler::HandleTeleCommand(const char * args) // save only in non-flight case else _player->SaveRecallPosition(); + _player->TeleportTo(tele->mapId, tele->position_x, tele->position_y, tele->position_z, tele->orientation); return true; } + bool ChatHandler::HandleLookupAreaCommand(const char* args) { if (!*args) return false; + std::string namepart = args; std::wstring wnamepart; + if (!Utf8toWStr (namepart,wnamepart)) return false; + bool found = false; + // converting string that we try to find to lower case wstrToLower (wnamepart); + // Search in AreaTable.dbc for (uint32 areaflag = 0; areaflag < sAreaStore.GetNumRows (); ++areaflag) { @@ -1931,6 +2285,7 @@ bool ChatHandler::HandleLookupAreaCommand(const char* args) std::string name = areaEntry->area_name[loc]; if (name.empty()) continue; + if (!Utf8FitTo (name, wnamepart)) { loc = 0; @@ -1938,13 +2293,16 @@ bool ChatHandler::HandleLookupAreaCommand(const char* args) { if (loc==GetSessionDbcLocale ()) continue; + name = areaEntry->area_name[loc]; if (name.empty ()) continue; + if (Utf8FitTo (name, wnamepart)) break; } } + if (loc < MAX_LOCALE) { // send area in "id - [name]" format @@ -1953,16 +2311,21 @@ bool ChatHandler::HandleLookupAreaCommand(const char* args) ss << areaEntry->ID << " - |cffffffff|Harea:" << areaEntry->ID << "|h[" << name << " " << localeNames[loc]<< "]|h|r"; else ss << areaEntry->ID << " - " << name << " " << localeNames[loc]; + SendSysMessage (ss.str ().c_str()); + if(!found) found = true; } } } + if (!found) SendSysMessage (LANG_COMMAND_NOAREAFOUND); + return true; } + //Find tele in game_tele order by name bool ChatHandler::HandleLookupTeleCommand(const char * args) { @@ -1972,33 +2335,44 @@ bool ChatHandler::HandleLookupTeleCommand(const char * args) SetSentErrorMessage(true); return false; } + char const* str = strtok((char*)args, " "); if(!str) return false; + std::string namepart = str; std::wstring wnamepart; + if(!Utf8toWStr(namepart,wnamepart)) return false; + // converting string that we try to find to lower case wstrToLower( wnamepart ); + std::ostringstream reply; + GameTeleMap const & teleMap = objmgr.GetGameTeleMap(); for(GameTeleMap::const_iterator itr = teleMap.begin(); itr != teleMap.end(); ++itr) { GameTele const* tele = &itr->second; + if(tele->wnameLow.find(wnamepart) == std::wstring::npos) continue; + if (m_session) reply << " |cffffffff|Htele:" << itr->first << "|h[" << tele->name << "]|h|r\n"; else reply << " " << itr->first << " " << tele->name << "\n"; } + if(reply.str().empty()) SendSysMessage(LANG_COMMAND_TELE_NOLOCATION); else PSendSysMessage(LANG_COMMAND_TELE_LOCATION,reply.str().c_str()); + return true; } + //Enable\Dissable accept whispers (for GM) bool ChatHandler::HandleWhispersCommand(const char* args) { @@ -2007,6 +2381,7 @@ bool ChatHandler::HandleWhispersCommand(const char* args) PSendSysMessage(LANG_COMMAND_WHISPERACCEPTING, m_session->GetPlayer()->isAcceptWhispers() ? GetTrinityString(LANG_ON) : GetTrinityString(LANG_OFF)); return true; } + std::string argstr = (char*)args; // whisper on if (argstr == "on") @@ -2015,6 +2390,7 @@ bool ChatHandler::HandleWhispersCommand(const char* args) SendSysMessage(LANG_COMMAND_WHISPERON); return true; } + // whisper off if (argstr == "off") { @@ -2022,10 +2398,12 @@ bool ChatHandler::HandleWhispersCommand(const char* args) SendSysMessage(LANG_COMMAND_WHISPEROFF); return true; } + SendSysMessage(LANG_USE_BOL); SetSentErrorMessage(true); return false; } + //Save all players in the world bool ChatHandler::HandleSaveAllCommand(const char* /*args*/) { @@ -2033,6 +2411,7 @@ bool ChatHandler::HandleSaveAllCommand(const char* /*args*/) SendSysMessage(LANG_PLAYERS_SAVED); return true; } + //Send mail by command bool ChatHandler::HandleSendMailCommand(const char* args) { @@ -2042,31 +2421,41 @@ bool ChatHandler::HandleSendMailCommand(const char* args) std::string target_name; if(!extractPlayerTarget((char*)args,&target,&target_guid,&target_name)) return false; + char* tail1 = strtok(NULL, ""); if(!tail1) return false; + char* msgSubject = extractQuotedArg(tail1); if (!msgSubject) return false; + char* tail2 = strtok(NULL, ""); if(!tail2) return false; + char* msgText = extractQuotedArg(tail2); if (!msgText) return false; + // msgSubject, msgText isn't NUL after prev. check std::string subject = msgSubject; std::string text = msgText; + // from console show not existed sender uint32 sender_guidlo = m_session ? m_session->GetPlayer()->GetGUIDLow() : 0; + uint32 messagetype = MAIL_NORMAL; uint32 stationery = MAIL_STATIONERY_GM; uint32 itemTextId = !text.empty() ? objmgr.CreateItemText( text ) : 0; + WorldSession::SendMailTo(target,messagetype, stationery, sender_guidlo, GUID_LOPART(target_guid), subject, itemTextId, NULL, 0, 0, MAIL_CHECK_MASK_NONE); + std::string nameLink = playerLink(target_name); PSendSysMessage(LANG_MAIL_SENT, nameLink.c_str()); return true; } + // teleport player to given game_tele.entry bool ChatHandler::HandleTeleNameCommand(const char * args) { @@ -2075,11 +2464,13 @@ bool ChatHandler::HandleTeleNameCommand(const char * args) extractOptFirstArg((char*)args,&nameStr,&teleStr); if(!teleStr) return false; + Player* target; uint64 target_guid; std::string target_name; if(!extractPlayerTarget(nameStr,&target,&target_guid,&target_name)) return false; + // id, or string, or [name] Shift-click form |color|Htele:id|h[name]|h|r GameTele const* tele = extractGameTeleFromLink(teleStr); if(!tele) @@ -2088,6 +2479,7 @@ bool ChatHandler::HandleTeleNameCommand(const char * args) SetSentErrorMessage(true); return false; } + /* MapEntry const * me = sMapStore.LookupEntry(tele->mapId); if(!me || me->IsBattleGroundOrArena()) { @@ -2095,22 +2487,28 @@ bool ChatHandler::HandleTeleNameCommand(const char * args) SetSentErrorMessage(true); return false; } + Player *chr = objmgr.GetPlayer(name.c_str());*/ + if (target) { // check online security if (HasLowerSecurity(target, 0)) return false; + std::string chrNameLink = playerLink(target_name); + if(target->IsBeingTeleported()==true) { PSendSysMessage(LANG_IS_TELEPORTED, chrNameLink.c_str()); SetSentErrorMessage(true); return false; } + PSendSysMessage(LANG_TELEPORTING_TO, chrNameLink.c_str(),"", tele->name.c_str()); if (needReportToTarget(target)) ChatHandler(target).PSendSysMessage(LANG_TELEPORTED_TO_BY, GetNameLink().c_str()); + // stop flight if need if(target->isInFlight()) { @@ -2120,6 +2518,7 @@ bool ChatHandler::HandleTeleNameCommand(const char * args) // save only in non-flight case else target->SaveRecallPosition(); + target->TeleportTo(tele->mapId,tele->position_x,tele->position_y,tele->position_z,tele->orientation); } else @@ -2127,18 +2526,23 @@ bool ChatHandler::HandleTeleNameCommand(const char * args) // check offline security if (HasLowerSecurity(NULL, target_guid)) return false; + std::string nameLink = playerLink(target_name); + PSendSysMessage(LANG_TELEPORTING_TO, nameLink.c_str(), GetMangosString(LANG_OFFLINE), tele->name.c_str()); Player::SavePositionInDB(tele->mapId,tele->position_x,tele->position_y,tele->position_z,tele->orientation, MapManager::Instance().GetZoneId(tele->mapId,tele->position_x,tele->position_y,tele->position_z),target_guid); } + return true; } + //Teleport group to given game_tele.entry bool ChatHandler::HandleTeleGroupCommand(const char * args) { if(!*args) return false; + Player *player = getSelectedPlayer(); if (!player) { @@ -2146,9 +2550,11 @@ bool ChatHandler::HandleTeleGroupCommand(const char * args) SetSentErrorMessage(true); return false; } + // check online security if (HasLowerSecurity(player, 0)) return false; + // id, or string, or [name] Shift-click form |color|Htele:id|h[name]|h|r GameTele const* tele = extractGameTeleFromLink((char*)args); if(!tele) @@ -2157,6 +2563,7 @@ bool ChatHandler::HandleTeleGroupCommand(const char * args) SetSentErrorMessage(true); return false; } + MapEntry const * me = sMapStore.LookupEntry(tele->mapId); if(!me || me->IsBattleGroundOrArena()) { @@ -2164,7 +2571,9 @@ bool ChatHandler::HandleTeleGroupCommand(const char * args) SetSentErrorMessage(true); return false; } + std::string nameLink = GetNameLink(player); + Group *grp = player->GetGroup(); if(!grp) { @@ -2172,23 +2581,30 @@ bool ChatHandler::HandleTeleGroupCommand(const char * args) SetSentErrorMessage(true); return false; } + for(GroupReference *itr = grp->GetFirstMember(); itr != NULL; itr = itr->next()) { Player *pl = itr->getSource(); + if(!pl || !pl->GetSession() ) continue; + // check online security if (HasLowerSecurity(pl, 0)) return false; + std::string plNameLink = GetNameLink(pl); + if(pl->IsBeingTeleported()) { PSendSysMessage(LANG_IS_TELEPORTED, plNameLink.c_str()); continue; } + PSendSysMessage(LANG_TELEPORTING_TO, plNameLink.c_str(),"", tele->name.c_str()); if (needReportToTarget(pl)) ChatHandler(pl).PSendSysMessage(LANG_TELEPORTED_TO_BY, nameLink.c_str()); + // stop flight if need if(pl->isInFlight()) { @@ -2198,29 +2614,38 @@ bool ChatHandler::HandleTeleGroupCommand(const char * args) // save only in non-flight case else pl->SaveRecallPosition(); + pl->TeleportTo(tele->mapId, tele->position_x, tele->position_y, tele->position_z, tele->orientation); } + return true; } + //Summon group of player bool ChatHandler::HandleGroupgoCommand(const char* args) { Player* target; if(!extractPlayerTarget((char*)args,&target)) return false; + // check online security if (HasLowerSecurity(target, 0)) return false; + Group *grp = target->GetGroup(); + std::string nameLink = GetNameLink(target); + if(!grp) { PSendSysMessage(LANG_NOT_IN_GROUP,nameLink.c_str()); SetSentErrorMessage(true); return false; } + Map* gmMap = m_session->GetPlayer()->GetMap(); bool to_instance = gmMap->Instanceable(); + // we are in instance, and can summon only player in our group with us as lead if ( to_instance && ( !m_session->GetPlayer()->GetGroup() || (grp->GetLeaderGUID() != m_session->GetPlayer()->GetGUID()) || @@ -2231,24 +2656,31 @@ bool ChatHandler::HandleGroupgoCommand(const char* args) SetSentErrorMessage(true); return false; } + for(GroupReference *itr = grp->GetFirstMember(); itr != NULL; itr = itr->next()) { Player *pl = itr->getSource(); + if(!pl || pl==m_session->GetPlayer() || !pl->GetSession() ) continue; + // check online security if (HasLowerSecurity(pl, 0)) return false; + std::string plNameLink = GetNameLink(pl); + if(pl->IsBeingTeleported()==true) { PSendSysMessage(LANG_IS_TELEPORTED, plNameLink.c_str()); SetSentErrorMessage(true); return false; } + if (to_instance) { Map* plMap = pl->GetMap(); + if ( plMap->Instanceable() && plMap->GetInstanceId() != gmMap->GetInstanceId() ) { // cannot summon from instance to instance @@ -2257,9 +2689,11 @@ bool ChatHandler::HandleGroupgoCommand(const char* args) return false; } } + PSendSysMessage(LANG_SUMMONING, plNameLink.c_str(),""); if (needReportToTarget(pl)) ChatHandler(pl).PSendSysMessage(LANG_SUMMONED_BY, GetNameLink().c_str()); + // stop flight if need if(pl->isInFlight()) { @@ -2269,24 +2703,31 @@ bool ChatHandler::HandleGroupgoCommand(const char* args) // save only in non-flight case else pl->SaveRecallPosition(); + // before GM float x,y,z; m_session->GetPlayer()->GetClosePoint(x,y,z,pl->GetObjectSize()); pl->TeleportTo(m_session->GetPlayer()->GetMapId(),x,y,z,pl->GetOrientation()); } + return true; } + bool ChatHandler::HandleGoTaxinodeCommand(const char* args) { Player* _player = m_session->GetPlayer(); + if (!*args) return false; + char* cNodeId = extractKeyFromLink((char*)args,"Htaxinode"); if (!cNodeId) return false; + int32 i_nodeId = atoi(cNodeId); if (!i_nodeId) return false; + TaxiNodesEntry const* node = sTaxiNodesStore.LookupEntry(i_nodeId); if (!node) { @@ -2294,6 +2735,7 @@ bool ChatHandler::HandleGoTaxinodeCommand(const char* args) SetSentErrorMessage(true); return false; } + if ((node->x == 0.0f && node->y == 0.0f && node->z == 0.0f) || !MapManager::IsValidMapCoord(node->map_id,node->x,node->y,node->z)) { @@ -2301,6 +2743,7 @@ bool ChatHandler::HandleGoTaxinodeCommand(const char* args) SetSentErrorMessage(true); return false; } + // stop flight if need if (_player->isInFlight()) { @@ -2310,32 +2753,40 @@ bool ChatHandler::HandleGoTaxinodeCommand(const char* args) // save only in non-flight case else _player->SaveRecallPosition(); + _player->TeleportTo(node->map_id, node->x, node->y, node->z, _player->GetOrientation()); return true; } + //teleport at coordinates bool ChatHandler::HandleGoXYCommand(const char* args) { if(!*args) return false; + Player* _player = m_session->GetPlayer(); + char* px = strtok((char*)args, " "); char* py = strtok(NULL, " "); char* pmapid = strtok(NULL, " "); + if (!px || !py) return false; + float x = (float)atof(px); float y = (float)atof(py); uint32 mapid; if (pmapid) mapid = (uint32)atoi(pmapid); else mapid = _player->GetMapId(); + if(!MapManager::IsValidMapCoord(mapid,x,y)) { PSendSysMessage(LANG_INVALID_TARGET_COORD,x,y,mapid); SetSentErrorMessage(true); return false; } + // stop flight if need if(_player->isInFlight()) { @@ -2345,23 +2796,31 @@ bool ChatHandler::HandleGoXYCommand(const char* args) // save only in non-flight case else _player->SaveRecallPosition(); + Map const *map = MapManager::Instance().CreateBaseMap(mapid); float z = std::max(map->GetHeight(x, y, MAX_HEIGHT), map->GetWaterLevel(x, y)); + _player->TeleportTo(mapid, x, y, z, _player->GetOrientation()); + return true; } + //teleport at coordinates, including Z bool ChatHandler::HandleGoXYZCommand(const char* args) { if(!*args) return false; + Player* _player = m_session->GetPlayer(); + char* px = strtok((char*)args, " "); char* py = strtok(NULL, " "); char* pz = strtok(NULL, " "); char* pmapid = strtok(NULL, " "); + if (!px || !py || !pz) return false; + float x = (float)atof(px); float y = (float)atof(py); float z = (float)atof(pz); @@ -2370,12 +2829,14 @@ bool ChatHandler::HandleGoXYZCommand(const char* args) mapid = (uint32)atoi(pmapid); else mapid = _player->GetMapId(); + if(!MapManager::IsValidMapCoord(mapid,x,y,z)) { PSendSysMessage(LANG_INVALID_TARGET_COORD,x,y,mapid); SetSentErrorMessage(true); return false; } + // stop flight if need if(_player->isInFlight()) { @@ -2385,50 +2846,68 @@ bool ChatHandler::HandleGoXYZCommand(const char* args) // save only in non-flight case else _player->SaveRecallPosition(); + _player->TeleportTo(mapid, x, y, z, _player->GetOrientation()); + return true; } + //teleport at coordinates bool ChatHandler::HandleGoZoneXYCommand(const char* args) { if(!*args) return false; + Player* _player = m_session->GetPlayer(); + char* px = strtok((char*)args, " "); char* py = strtok(NULL, " "); char* tail = strtok(NULL,""); + char* cAreaId = extractKeyFromLink(tail,"Harea"); // string or [name] Shift-click form |color|Harea:area_id|h[name]|h|r + if (!px || !py) return false; + float x = (float)atof(px); float y = (float)atof(py); + // prevent accept wrong numeric args if ((x==0.0f && *px!='0') || (y==0.0f && *py!='0')) return false; + uint32 areaid = cAreaId ? (uint32)atoi(cAreaId) : _player->GetZoneId(); + AreaTableEntry const* areaEntry = GetAreaEntryByAreaID(areaid); + if( x<0 || x>100 || y<0 || y>100 || !areaEntry ) { PSendSysMessage(LANG_INVALID_ZONE_COORD,x,y,areaid); SetSentErrorMessage(true); return false; } + // update to parent zone if exist (client map show only zones without parents) AreaTableEntry const* zoneEntry = areaEntry->zone ? GetAreaEntryByAreaID(areaEntry->zone) : areaEntry; + Map const *map = MapManager::Instance().CreateBaseMap(zoneEntry->mapid); + if(map->Instanceable()) { PSendSysMessage(LANG_INVALID_ZONE_MAP,areaEntry->ID,areaEntry->area_name[GetSessionDbcLocale()],map->GetId(),map->GetMapName()); SetSentErrorMessage(true); return false; } + Zone2MapCoordinates(x,y,zoneEntry->ID); + if(!MapManager::IsValidMapCoord(zoneEntry->mapid,x,y)) { PSendSysMessage(LANG_INVALID_TARGET_COORD,x,y,zoneEntry->mapid); SetSentErrorMessage(true); return false; } + // stop flight if need if(_player->isInFlight()) { @@ -2438,35 +2917,44 @@ bool ChatHandler::HandleGoZoneXYCommand(const char* args) // save only in non-flight case else _player->SaveRecallPosition(); + float z = std::max(map->GetHeight(x, y, MAX_HEIGHT), map->GetWaterLevel(x, y)); _player->TeleportTo(zoneEntry->mapid, x, y, z, _player->GetOrientation()); + return true; } + //teleport to grid bool ChatHandler::HandleGoGridCommand(const char* args) { if(!*args) return false; Player* _player = m_session->GetPlayer(); + char* px = strtok((char*)args, " "); char* py = strtok(NULL, " "); char* pmapid = strtok(NULL, " "); + if (!px || !py) return false; + float grid_x = (float)atof(px); float grid_y = (float)atof(py); uint32 mapid; if (pmapid) mapid = (uint32)atoi(pmapid); else mapid = _player->GetMapId(); + // center of grid float x = (grid_x-CENTER_GRID_ID+0.5f)*SIZE_OF_GRIDS; float y = (grid_y-CENTER_GRID_ID+0.5f)*SIZE_OF_GRIDS; + if(!MapManager::IsValidMapCoord(mapid,x,y)) { PSendSysMessage(LANG_INVALID_TARGET_COORD,x,y,mapid); SetSentErrorMessage(true); return false; } + // stop flight if need if(_player->isInFlight()) { @@ -2476,19 +2964,26 @@ bool ChatHandler::HandleGoGridCommand(const char* args) // save only in non-flight case else _player->SaveRecallPosition(); + Map const *map = MapManager::Instance().CreateBaseMap(mapid); float z = std::max(map->GetHeight(x, y, MAX_HEIGHT), map->GetWaterLevel(x, y)); _player->TeleportTo(mapid, x, y, z, _player->GetOrientation()); + return true; } + bool ChatHandler::HandleModifyDrunkCommand(const char* args) { if(!*args) return false; + uint32 drunklevel = (uint32)atoi(args); if(drunklevel > 100) drunklevel = 100; + uint16 drunkMod = drunklevel * 0xFFFF / 100; + m_session->GetPlayer()->SetDrunkValue(drunkMod); + return true; } |