server/src/game/Level1.cpp
DiSlord c01fe58723 Implement some dummy triggers
Warior 42770, 58872 and ranks
Warlock 47230 and ranks, for 39372 use m_amount instead hardcoded value
Rogue 51669 and ranks, 51625 and ranks
Hunter:
 53290 and ranks (need handle regen amount for 57669)
 56342 and ranks (from periodic)
 53228 and ranks (only mana regen part)
Shaman:
 58877 (aura should on summoned wolf)
 51556 and ranks (need handle dummy for 52759)
 16180 and ranks, 51525 and ranks
Death Knight 50365 and 50371, 48979 and ranks, 49005, 61257, 49217

Signed-off-by: DiSlord <dislord@nomail.com>
2009-01-17 21:03:36 +03:00

2533 lines
65 KiB
C++

/*
* Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
* 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 2 of the License, or
* (at your option) 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, 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"
#include "WorldSession.h"
#include "World.h"
#include "ObjectMgr.h"
#include "Player.h"
#include "Opcodes.h"
#include "Chat.h"
#include "Log.h"
#include "MapManager.h"
#include "ObjectAccessor.h"
#include "Language.h"
#include "CellImpl.h"
#include "InstanceSaveMgr.h"
#include "Util.h"
#ifdef _DEBUG_VMAPS
#include "VMapFactory.h"
#endif
bool ChatHandler::HandleNpcSayCommand(const char* args)
{
if(!*args)
return false;
Creature* pCreature = getSelectedCreature();
if(!pCreature)
{
SendSysMessage(LANG_SELECT_CREATURE);
SetSentErrorMessage(true);
return false;
}
pCreature->Say(args, LANG_UNIVERSAL, 0);
return true;
}
bool ChatHandler::HandleNpcYellCommand(const char* args)
{
if(!*args)
return false;
Creature* pCreature = getSelectedCreature();
if(!pCreature)
{
SendSysMessage(LANG_SELECT_CREATURE);
SetSentErrorMessage(true);
return false;
}
pCreature->Yell(args, LANG_UNIVERSAL, 0);
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->TextEmote(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 = ObjectAccessor::GetCreature(*m_session->GetPlayer(), 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->Whisper(text,receiver_guid);
return true;
}
// global announce
bool ChatHandler::HandleAnnounceCommand(const char* args)
{
if(!*args)
return false;
sWorld.SendWorldText(LANG_SYSTEMMESSAGE,args);
return true;
}
//notification player at the screen
bool ChatHandler::HandleNotifyCommand(const char* args)
{
if(!*args)
return false;
std::string str = GetMangosString(LANG_GLOBAL_NOTIFY);
str += args;
WorldPacket data(SMSG_NOTIFICATION, (str.size()+1));
data << str;
sWorld.SendGlobalMessage(&data);
return true;
}
//Enable\Dissable GM Mode
bool ChatHandler::HandleGMmodeCommand(const char* args)
{
if(!*args)
{
if(m_session->GetPlayer()->isGameMaster())
m_session->SendNotification(LANG_GM_ON);
else
m_session->SendNotification(LANG_GM_OFF);
return true;
}
std::string argstr = (char*)args;
if (argstr == "on")
{
m_session->GetPlayer()->SetGameMaster(true);
m_session->SendNotification(LANG_GM_ON);
#ifdef _DEBUG_VMAPS
VMAP::IVMapManager *vMapManager = VMAP::VMapFactory::createOrGetVMapManager();
vMapManager->processCommand("stoplog");
#endif
return true;
}
if (argstr == "off")
{
m_session->GetPlayer()->SetGameMaster(false);
m_session->SendNotification(LANG_GM_OFF);
#ifdef _DEBUG_VMAPS
VMAP::IVMapManager *vMapManager = VMAP::VMapFactory::createOrGetVMapManager();
vMapManager->processCommand("startlog");
#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)
{
if(!*args)
{
if(m_session->GetPlayer()->isGMChat())
m_session->SendNotification(LANG_GM_CHAT_ON);
else
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;
}
//Enable\Dissable Invisible mode
bool ChatHandler::HandleVisibleCommand(const char* args)
{
if (!*args)
{
PSendSysMessage(LANG_YOU_ARE, m_session->GetPlayer()->isGMVisible() ? GetMangosString(LANG_VISIBLE) : GetMangosString(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;
if (*args)
{
std::string name = args;
if(normalizePlayerName(name))
obj = objmgr.GetPlayer(name.c_str());
if(!obj)
{
SendSysMessage(LANG_PLAYER_NOT_FOUND);
SetSentErrorMessage(true);
return false;
}
}
else
{
obj = getSelectedUnit();
if(!obj)
{
SendSysMessage(LANG_SELECT_CHAR_OR_CREATURE);
SetSentErrorMessage(true);
return false;
}
}
CellPair cell_val = MaNGOS::ComputeCellPair(obj->GetPositionX(), obj->GetPositionY());
Cell cell(cell_val);
uint32 zone_id = obj->GetZoneId();
uint32 area_id = obj->GetAreaId();
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 = MaNGOS::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[m_session->GetSessionDbcLocale()] : "<unknown>" ),
zone_id, (zoneEntry ? zoneEntry->area_name[m_session->GetSessionDbcLocale()] : "<unknown>" ),
area_id, (areaEntry ? areaEntry->area_name[m_session->GetSessionDbcLocale()] : "<unknown>" ),
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):",
GetName(),
(obj->GetTypeId() == TYPEID_PLAYER ? "player" : "creature"), obj->GetName(),
(obj->GetTypeId() == TYPEID_PLAYER ? "GUID" : "Entry"), (obj->GetTypeId() == TYPEID_PLAYER ? obj->GetGUIDLow(): obj->GetEntry()) );
sLog.outDebug(GetMangosString(LANG_MAP_POSITION),
obj->GetMapId(), (mapEntry ? mapEntry->name[sWorld.GetDefaultDbcLocale()] : "<unknown>" ),
zone_id, (zoneEntry ? zoneEntry->area_name[sWorld.GetDefaultDbcLocale()] : "<unknown>" ),
area_id, (areaEntry ? areaEntry->area_name[sWorld.GetDefaultDbcLocale()] : "<unknown>" ),
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 );
return true;
}
//Summon Player
bool ChatHandler::HandleNamegoCommand(const char* args)
{
if(!*args)
return false;
std::string name = args;
if(!normalizePlayerName(name))
{
SendSysMessage(LANG_PLAYER_NOT_FOUND);
SetSentErrorMessage(true);
return false;
}
Player *chr = objmgr.GetPlayer(name.c_str());
if (chr)
{
// check online security
if (HasLowerSecurity(chr, 0))
return false;
if(chr->IsBeingTeleported()==true)
{
PSendSysMessage(LANG_IS_TELEPORTED, chr->GetName());
SetSentErrorMessage(true);
return false;
}
Map* pMap = m_session->GetPlayer()->GetMap();
if(pMap->IsBattleGroundOrArena())
{
// cannot summon to bg
PSendSysMessage(LANG_CANNOT_SUMMON_TO_BG,chr->GetName());
SetSentErrorMessage(true);
return false;
}
else if(pMap->IsDungeon())
{
Map* cMap = chr->GetMap();
if( cMap->Instanceable() && cMap->GetInstanceId() != pMap->GetInstanceId() )
{
// cannot summon from instance to instance
PSendSysMessage(LANG_CANNOT_SUMMON_TO_INST,chr->GetName());
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() || !chr->GetGroup() ||
(chr->GetGroup()->GetLeaderGUID() != m_session->GetPlayer()->GetGUID()) ||
(m_session->GetPlayer()->GetGroup()->GetLeaderGUID() != m_session->GetPlayer()->GetGUID()) )
// the last check is a bit excessive, but let it be, just in case
{
PSendSysMessage(LANG_CANNOT_SUMMON_TO_INST,chr->GetName());
SetSentErrorMessage(true);
return false;
}
}
PSendSysMessage(LANG_SUMMONING, chr->GetName(),"");
if (needReportToTarget(chr))
ChatHandler(chr).PSendSysMessage(LANG_SUMMONED_BY, GetName());
// stop flight if need
if(chr->isInFlight())
{
chr->GetMotionMaster()->MovementExpired();
chr->m_taxi.ClearTaxiDestinations();
}
// save only in non-flight case
else
chr->SaveRecallPosition();
// before GM
float x,y,z;
m_session->GetPlayer()->GetClosePoint(x,y,z,chr->GetObjectSize());
chr->TeleportTo(m_session->GetPlayer()->GetMapId(),x,y,z,chr->GetOrientation());
}
else if (uint64 guid = objmgr.GetPlayerGUIDByName(name))
{
// check offline security
if (HasLowerSecurity(NULL, guid))
return false;
PSendSysMessage(LANG_SUMMONING, name.c_str(),GetMangosString(LANG_OFFLINE));
// in point where GM stay
Player::SavePositionInDB(m_session->GetPlayer()->GetMapId(),
m_session->GetPlayer()->GetPositionX(),
m_session->GetPlayer()->GetPositionY(),
m_session->GetPlayer()->GetPositionZ(),
m_session->GetPlayer()->GetOrientation(),
m_session->GetPlayer()->GetZoneId(),
guid);
}
else
{
PSendSysMessage(LANG_NO_PLAYER, args);
SetSentErrorMessage(true);
}
return true;
}
//Teleport to Player
bool ChatHandler::HandleGonameCommand(const char* args)
{
if(!*args)
return false;
Player* _player = m_session->GetPlayer();
std::string name = args;
if(!normalizePlayerName(name))
{
SendSysMessage(LANG_PLAYER_NOT_FOUND);
SetSentErrorMessage(true);
return false;
}
Player *chr = objmgr.GetPlayer(name.c_str());
if (chr)
{
// check online security
if (HasLowerSecurity(chr, 0))
return false;
Map* cMap = chr->GetMap();
if(cMap->IsBattleGroundOrArena())
{
// only allow if gm mode is on
if (!_player->isGameMaster())
{
PSendSysMessage(LANG_CANNOT_GO_TO_BG_GM,chr->GetName());
SetSentErrorMessage(true);
return false;
}
// if already in a bg, don't let port to other
else if (_player->GetBattleGroundId())
{
PSendSysMessage(LANG_CANNOT_GO_TO_BG_FROM_BG,chr->GetName());
SetSentErrorMessage(true);
return false;
}
// all's well, set bg id
// when porting out from the bg, it will be reset to 0
_player->SetBattleGroundId(chr->GetBattleGroundId());
}
else if(cMap->IsDungeon())
Map* cMap = chr->GetMap();
if(cMap->Instanceable())
{
// 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
if (_player->GetGroup())
{
// we are in group, we can go only if we are in the player group
if (_player->GetGroup() != chr->GetGroup())
{
PSendSysMessage(LANG_CANNOT_GO_TO_INST_PARTY,chr->GetName());
SetSentErrorMessage(true);
return false;
}
}
else
{
// we are not in group, let's verify our GM mode
if (!_player->isGameMaster())
{
PSendSysMessage(LANG_CANNOT_GO_TO_INST_GM,chr->GetName());
SetSentErrorMessage(true);
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(chr->GetMapId(), chr->GetDifficulty());
if(!pBind)
{
Group *group = _player->GetGroup();
InstanceGroupBind *gBind = group ? group->GetBoundInstance(chr->GetMapId(), chr->GetDifficulty()) : NULL;
if(!gBind)
{
// if no bind exists, create a solo bind
InstanceSave *save = sInstanceSaveManager.GetInstanceSave(chr->GetInstanceId());
if(save) _player->BindToInstance(save, !save->CanReset());
}
}
_player->SetDifficulty(chr->GetDifficulty());
}
PSendSysMessage(LANG_APPEARING_AT, chr->GetName());
if (_player->IsVisibleGloballyFor(chr))
ChatHandler(chr).PSendSysMessage(LANG_APPEARING_TO, _player->GetName());
// stop flight if need
if(_player->isInFlight())
{
_player->GetMotionMaster()->MovementExpired();
_player->m_taxi.ClearTaxiDestinations();
}
// save only in non-flight case
else
_player->SaveRecallPosition();
// to point to see at target with same orientation
float x,y,z;
chr->GetContactPoint(m_session->GetPlayer(),x,y,z);
_player->TeleportTo(chr->GetMapId(), x, y, z, _player->GetAngle( chr ), TELE_TO_GM_MODE);
return true;
}
if (uint64 guid = objmgr.GetPlayerGUIDByName(name))
{
// check offline security
if (HasLowerSecurity(NULL, guid))
return false;
PSendSysMessage(LANG_APPEARING_AT, name.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,guid))
{
// stop flight if need
if(_player->isInFlight())
{
_player->GetMotionMaster()->MovementExpired();
_player->m_taxi.ClearTaxiDestinations();
}
// save only in non-flight case
else
_player->SaveRecallPosition();
_player->TeleportTo(map, x, y, z,_player->GetOrientation());
return true;
}
}
PSendSysMessage(LANG_NO_PLAYER, args);
SetSentErrorMessage(true);
return false;
}
// Teleport player to last position
bool ChatHandler::HandleRecallCommand(const char* args)
{
Player* chr = NULL;
if(!*args)
{
chr = getSelectedPlayer();
if(!chr)
chr = m_session->GetPlayer();
// check online security
else if (HasLowerSecurity(chr, 0))
return false;
}
else
{
std::string name = args;
if(!normalizePlayerName(name))
{
SendSysMessage(LANG_PLAYER_NOT_FOUND);
SetSentErrorMessage(true);
return false;
}
chr = objmgr.GetPlayer(name.c_str());
if(!chr)
{
PSendSysMessage(LANG_NO_PLAYER, args);
SetSentErrorMessage(true);
return false;
}
// check online security
if (HasLowerSecurity(chr, 0))
return false;
}
if(chr->IsBeingTeleported())
{
PSendSysMessage(LANG_IS_TELEPORTED, chr->GetName());
SetSentErrorMessage(true);
return false;
}
// stop flight if need
if(chr->isInFlight())
{
chr->GetMotionMaster()->MovementExpired();
chr->m_taxi.ClearTaxiDestinations();
}
chr->TeleportTo(chr->m_recallMap, chr->m_recallX, chr->m_recallY, chr->m_recallZ, chr->m_recallO);
return true;
}
//Edit Player KnownTitles
bool ChatHandler::HandleModifyKnownTitlesCommand(const char* args)
{
if(!*args)
return false;
uint64 titles = 0;
sscanf((char*)args, I64FMTD, &titles);
Player *chr = getSelectedPlayer();
if (!chr)
{
SendSysMessage(LANG_NO_CHAR_SELECTED);
SetSentErrorMessage(true);
return false;
}
// check online security
if (HasLowerSecurity(chr, 0))
return false;
uint64 titles2 = titles;
for(int 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;
}
Player *chr = getSelectedPlayer();
if (chr == NULL)
{
SendSysMessage(LANG_NO_CHAR_SELECTED);
SetSentErrorMessage(true);
return false;
}
// check online security
if (HasLowerSecurity(chr, 0))
return false;
PSendSysMessage(LANG_YOU_CHANGE_HP, chr->GetName(), hp, hpm);
if (needReportToTarget(chr))
ChatHandler(chr).PSendSysMessage(LANG_YOURS_HP_CHANGED, GetName(), 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)
{
SendSysMessage(LANG_NO_CHAR_SELECTED);
SetSentErrorMessage(true);
return false;
}
// check online security
if (HasLowerSecurity(chr, 0))
return false;
PSendSysMessage(LANG_YOU_CHANGE_MANA, chr->GetName(), mana, manam);
if (needReportToTarget(chr))
ChatHandler(chr).PSendSysMessage(LANG_YOURS_MANA_CHANGED, GetName(), 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)
{
SendSysMessage(LANG_NO_CHAR_SELECTED);
SetSentErrorMessage(true);
return false;
}
// check online security
if (HasLowerSecurity(chr, 0))
return false;
PSendSysMessage(LANG_YOU_CHANGE_ENERGY, chr->GetName(), energy/10, energym/10);
if (needReportToTarget(chr))
ChatHandler(chr).PSendSysMessage(LANG_YOURS_ENERGY_CHANGED, GetName(), energy/10, energym/10);
chr->SetMaxPower(POWER_ENERGY,energym );
chr->SetPower(POWER_ENERGY, energy );
sLog.outDetail(GetMangosString(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)
{
SendSysMessage(LANG_NO_CHAR_SELECTED);
SetSentErrorMessage(true);
return false;
}
// check online security
if (HasLowerSecurity(chr, 0))
return false;
PSendSysMessage(LANG_YOU_CHANGE_RAGE, chr->GetName(), rage/10, ragem/10);
if (needReportToTarget(chr))
ChatHandler(chr).PSendSysMessage(LANG_YOURS_RAGE_CHANGED, GetName(), 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)
{
SendSysMessage(LANG_NO_CHAR_SELECTED);
SetSentErrorMessage(true);
return false;
}
PSendSysMessage(LANG_YOU_CHANGE_RUNIC_POWER, chr->GetName(), rune/10, runem/10);
if (needReportToTarget(chr))
ChatHandler(chr).PSendSysMessage(LANG_YOURS_RUNIC_POWER_CHANGED, GetName(), 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)
{
SendSysMessage(LANG_SELECT_CREATURE);
SetSentErrorMessage(true);
return false;
}
if(!pfactionid)
{
if(chr)
{
uint32 factionid = chr->getFaction();
uint32 flag = chr->GetUInt32Value(UNIT_FIELD_FLAGS);
uint32 npcflag = chr->GetUInt32Value(UNIT_NPC_FLAGS);
uint32 dyflag = chr->GetUInt32Value(UNIT_DYNAMIC_FLAGS);
PSendSysMessage(LANG_CURRENT_FACTION,chr->GetGUIDLow(),factionid,flag,npcflag,dyflag);
}
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)
{
if(!*args) return false;
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);
if(!pmark)
mark = 65535;
else
mark = atoi(pmark);
Player *chr = getSelectedPlayer();
if (chr == NULL)
{
SendSysMessage(LANG_NO_CHAR_SELECTED);
SetSentErrorMessage(true);
return false;
}
// check online security
if (HasLowerSecurity(chr, 0))
return false;
PSendSysMessage(LANG_YOU_CHANGE_SPELLFLATID, spellflatid, val, mark, chr->GetName());
if (needReportToTarget(chr))
ChatHandler(chr).PSendSysMessage(LANG_YOURS_SPELLFLATID_CHANGED, GetName(), 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)
{
Player* player = getSelectedPlayer();
if(!player)
{
SendSysMessage(LANG_NO_CHAR_SELECTED);
SetSentErrorMessage(true);
return false;
}
// check online security
if (HasLowerSecurity(player, 0))
return false;
player->SetFreeTalentPoints(tp);
return true;
}
return false;
}
//Enable On\OFF all taxi paths
bool ChatHandler::HandleTaxiCheatCommand(const char* args)
{
if (!*args)
{
SendSysMessage(LANG_USE_BOL);
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);
PSendSysMessage(LANG_YOU_GIVE_TAXIS, chr->GetName());
if (needReportToTarget(chr))
ChatHandler(chr).PSendSysMessage(LANG_YOURS_TAXIS_ADDED, GetName());
return true;
}
if (argstr == "off")
{
chr->SetTaxiCheater(false);
PSendSysMessage(LANG_YOU_REMOVE_TAXIS, chr->GetName());
if (needReportToTarget(chr))
ChatHandler(chr).PSendSysMessage(LANG_YOURS_TAXIS_REMOVED, GetName());
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 > 10 || ASpeed < 0.1)
{
SendSysMessage(LANG_BAD_VALUE);
SetSentErrorMessage(true);
return false;
}
Player *chr = getSelectedPlayer();
if (chr == NULL)
{
SendSysMessage(LANG_NO_CHAR_SELECTED);
SetSentErrorMessage(true);
return false;
}
// check online security
if (HasLowerSecurity(chr, 0))
return false;
if(chr->isInFlight())
{
PSendSysMessage(LANG_CHAR_IN_FLIGHT,chr->GetName());
SetSentErrorMessage(true);
return false;
}
PSendSysMessage(LANG_YOU_CHANGE_ASPEED, ASpeed, chr->GetName());
if (needReportToTarget(chr))
ChatHandler(chr).PSendSysMessage(LANG_YOURS_ASPEED_CHANGED, GetName(), ASpeed);
chr->SetSpeed(MOVE_WALK, ASpeed,true);
chr->SetSpeed(MOVE_RUN, ASpeed,true);
chr->SetSpeed(MOVE_SWIM, ASpeed,true);
//chr->SetSpeed(MOVE_TURN, ASpeed,true);
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 > 10 || Speed < 0.1)
{
SendSysMessage(LANG_BAD_VALUE);
SetSentErrorMessage(true);
return false;
}
Player *chr = getSelectedPlayer();
if (chr == NULL)
{
SendSysMessage(LANG_NO_CHAR_SELECTED);
SetSentErrorMessage(true);
return false;
}
// check online security
if (HasLowerSecurity(chr, 0))
return false;
if(chr->isInFlight())
{
PSendSysMessage(LANG_CHAR_IN_FLIGHT,chr->GetName());
SetSentErrorMessage(true);
return false;
}
PSendSysMessage(LANG_YOU_CHANGE_SPEED, Speed, chr->GetName());
if (needReportToTarget(chr))
ChatHandler(chr).PSendSysMessage(LANG_YOURS_SPEED_CHANGED, GetName(), 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 > 10.0f || Swim < 0.01f)
{
SendSysMessage(LANG_BAD_VALUE);
SetSentErrorMessage(true);
return false;
}
Player *chr = getSelectedPlayer();
if (chr == NULL)
{
SendSysMessage(LANG_NO_CHAR_SELECTED);
SetSentErrorMessage(true);
return false;
}
// check online security
if (HasLowerSecurity(chr, 0))
return false;
if(chr->isInFlight())
{
PSendSysMessage(LANG_CHAR_IN_FLIGHT,chr->GetName());
SetSentErrorMessage(true);
return false;
}
PSendSysMessage(LANG_YOU_CHANGE_SWIM_SPEED, Swim, chr->GetName());
if (needReportToTarget(chr))
ChatHandler(chr).PSendSysMessage(LANG_YOURS_SWIM_SPEED_CHANGED, GetName(), 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 > 10.0f || BSpeed < 0.1f)
{
SendSysMessage(LANG_BAD_VALUE);
SetSentErrorMessage(true);
return false;
}
Player *chr = getSelectedPlayer();
if (chr == NULL)
{
SendSysMessage(LANG_NO_CHAR_SELECTED);
SetSentErrorMessage(true);
return false;
}
// check online security
if (HasLowerSecurity(chr, 0))
return false;
if(chr->isInFlight())
{
PSendSysMessage(LANG_CHAR_IN_FLIGHT,chr->GetName());
SetSentErrorMessage(true);
return false;
}
PSendSysMessage(LANG_YOU_CHANGE_BACK_SPEED, BSpeed, chr->GetName());
if (needReportToTarget(chr))
ChatHandler(chr).PSendSysMessage(LANG_YOURS_BACK_SPEED_CHANGED, GetName(), 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 > 10.0f || FSpeed < 0.1f)
{
SendSysMessage(LANG_BAD_VALUE);
SetSentErrorMessage(true);
return false;
}
Player *chr = getSelectedPlayer();
if (chr == NULL)
{
SendSysMessage(LANG_NO_CHAR_SELECTED);
SetSentErrorMessage(true);
return false;
}
// check online security
if (HasLowerSecurity(chr, 0))
return false;
PSendSysMessage(LANG_YOU_CHANGE_FLY_SPEED, FSpeed, chr->GetName());
if (needReportToTarget(chr))
ChatHandler(chr).PSendSysMessage(LANG_YOURS_FLY_SPEED_CHANGED, GetName(), 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 > 3.0f || Scale <= 0.0f)
{
SendSysMessage(LANG_BAD_VALUE);
SetSentErrorMessage(true);
return false;
}
Player *chr = getSelectedPlayer();
if (chr == NULL)
{
SendSysMessage(LANG_NO_CHAR_SELECTED);
SetSentErrorMessage(true);
return false;
}
// check online security
if (HasLowerSecurity(chr, 0))
return false;
PSendSysMessage(LANG_YOU_CHANGE_SIZE, Scale, chr->GetName());
if (needReportToTarget(chr))
ChatHandler(chr).PSendSysMessage(LANG_YOURS_SIZE_CHANGED, GetName(), 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)
{
case 1:
mId=14340;
break;
case 2:
mId=4806;
break;
case 3:
mId=6471;
break;
case 4:
mId=12345;
break;
case 5:
mId=6472;
break;
case 6:
mId=6473;
break;
case 7:
mId=10670;
break;
case 8:
mId=10719;
break;
case 9:
mId=10671;
break;
case 10:
mId=10672;
break;
case 11:
mId=10720;
break;
case 12:
mId=14349;
break;
case 13:
mId=11641;
break;
case 14:
mId=12244;
break;
case 15:
mId=12242;
break;
case 16:
mId=14578;
break;
case 17:
mId=14579;
break;
case 18:
mId=14349;
break;
case 19:
mId=12245;
break;
case 20:
mId=14335;
break;
case 21:
mId=207;
break;
case 22:
mId=2328;
break;
case 23:
mId=2327;
break;
case 24:
mId=2326;
break;
case 25:
mId=14573;
break;
case 26:
mId=14574;
break;
case 27:
mId=14575;
break;
case 28:
mId=604;
break;
case 29:
mId=1166;
break;
case 30:
mId=2402;
break;
case 31:
mId=2410;
break;
case 32:
mId=2409;
break;
case 33:
mId=2408;
break;
case 34:
mId=2405;
break;
case 35:
mId=14337;
break;
case 36:
mId=6569;
break;
case 37:
mId=10661;
break;
case 38:
mId=10666;
break;
case 39:
mId=9473;
break;
case 40:
mId=9476;
break;
case 41:
mId=9474;
break;
case 42:
mId=14374;
break;
case 43:
mId=14376;
break;
case 44:
mId=14377;
break;
case 45:
mId=2404;
break;
case 46:
mId=2784;
break;
case 47:
mId=2787;
break;
case 48:
mId=2785;
break;
case 49:
mId=2736;
break;
case 50:
mId=2786;
break;
case 51:
mId=14347;
break;
case 52:
mId=14346;
break;
case 53:
mId=14576;
break;
case 54:
mId=9695;
break;
case 55:
mId=9991;
break;
case 56:
mId=6448;
break;
case 57:
mId=6444;
break;
case 58:
mId=6080;
break;
case 59:
mId=6447;
break;
case 60:
mId=4805;
break;
case 61:
mId=9714;
break;
case 62:
mId=6448;
break;
case 63:
mId=6442;
break;
case 64:
mId=14632;
break;
case 65:
mId=14332;
break;
case 66:
mId=14331;
break;
case 67:
mId=8469;
break;
case 68:
mId=2830;
break;
case 69:
mId=2346;
break;
default:
SendSysMessage(LANG_NO_MOUNT);
SetSentErrorMessage(true);
return false;
}
Player *chr = getSelectedPlayer();
if (chr == NULL)
{
SendSysMessage(LANG_NO_CHAR_SELECTED);
SetSentErrorMessage(true);
return false;
}
// check online security
if (HasLowerSecurity(chr, 0))
return false;
PSendSysMessage(LANG_YOU_GIVE_MOUNT, chr->GetName());
if (needReportToTarget(chr))
ChatHandler(chr).PSendSysMessage(LANG_MOUNT_GIVED, GetName());
chr->SetUInt32Value( UNIT_FIELD_FLAGS , 0x001000 );
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)
{
SendSysMessage(LANG_NO_CHAR_SELECTED);
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 = moneyuser + addmoney;
sLog.outDetail(GetMangosString(LANG_CURRENT_MONEY), moneyuser, addmoney, newmoney);
if(newmoney <= 0 )
{
PSendSysMessage(LANG_YOU_TAKE_ALL_MONEY, chr->GetName());
if (needReportToTarget(chr))
ChatHandler(chr).PSendSysMessage(LANG_YOURS_ALL_MONEY_GONE, GetName());
chr->SetMoney(0);
}
else
{
PSendSysMessage(LANG_YOU_TAKE_MONEY, abs(addmoney), chr->GetName());
if (needReportToTarget(chr))
ChatHandler(chr).PSendSysMessage(LANG_YOURS_MONEY_TAKEN, GetName(), abs(addmoney));
chr->SetMoney( newmoney );
}
}
else
{
PSendSysMessage(LANG_YOU_GIVE_MONEY, addmoney, chr->GetName());
if (needReportToTarget(chr))
ChatHandler(chr).PSendSysMessage(LANG_YOURS_MONEY_GIVEN, GetName(), addmoney);
chr->ModifyMoney( addmoney );
}
sLog.outDetail(GetMangosString(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)
{
SendSysMessage(LANG_NO_CHAR_SELECTED);
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);
SetSentErrorMessage(true);
return false;
}
if (bit < 1 || bit > 32)
{
SendSysMessage(LANG_BAD_VALUE);
SetSentErrorMessage(true);
return false;
}
if ( unit->HasFlag( field, (1<<(bit-1)) ) )
{
unit->RemoveFlag( field, (1<<(bit-1)) );
PSendSysMessage(LANG_REMOVE_BIT, bit, field);
}
else
{
unit->SetFlag( field, (1<<(bit-1)) );
PSendSysMessage(LANG_SET_BIT, bit, field);
}
return true;
}
bool ChatHandler::HandleModifyHonorCommand (const char* args)
{
if (!*args)
return false;
Player *target = getSelectedPlayer();
if(!target)
{
SendSysMessage(LANG_PLAYER_NOT_FOUND);
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, target->GetName(), 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;
}
// stop flight if need
if(_player->isInFlight())
{
_player->GetMotionMaster()->MovementExpired();
_player->m_taxi.ClearTaxiDestinations();
}
// 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;
uint32 counter = 0; // Counter for figure out that we found smth.
// converting string that we try to find to lower case
wstrToLower (wnamepart);
// Search in AreaTable.dbc
for (uint32 areaflag = 0; areaflag < sAreaStore.GetNumRows (); ++areaflag)
{
AreaTableEntry const *areaEntry = sAreaStore.LookupEntry (areaflag);
if (areaEntry)
{
int loc = m_session ? m_session->GetSessionDbcLocale () : sWorld.GetDefaultDbcLocale();
std::string name = areaEntry->area_name[loc];
if (name.empty())
continue;
if (!Utf8FitTo (name, wnamepart))
{
loc = 0;
for(; loc < MAX_LOCALE; ++loc)
{
if (m_session && loc==m_session->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
std::ostringstream ss;
if (m_session)
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());
++counter;
}
}
}
if (counter == 0) // if counter == 0 then we found nth
SendSysMessage (LANG_COMMAND_NOAREAFOUND);
return true;
}
//Find tele in game_tele order by name
bool ChatHandler::HandleLookupTeleCommand(const char * args)
{
if(!*args)
{
SendSysMessage(LANG_COMMAND_TELE_PARAMETER);
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)
{
if(!*args)
{
PSendSysMessage(LANG_COMMAND_WHISPERACCEPTING, m_session->GetPlayer()->isAcceptWhispers() ? GetMangosString(LANG_ON) : GetMangosString(LANG_OFF));
return true;
}
std::string argstr = (char*)args;
// whisper on
if (argstr == "on")
{
m_session->GetPlayer()->SetAcceptWhispers(true);
SendSysMessage(LANG_COMMAND_WHISPERON);
return true;
}
// whisper off
if (argstr == "off")
{
m_session->GetPlayer()->SetAcceptWhispers(false);
SendSysMessage(LANG_COMMAND_WHISPEROFF);
return true;
}
SendSysMessage(LANG_USE_BOL);
SetSentErrorMessage(true);
return false;
}
//Play sound
bool ChatHandler::HandlePlaySoundCommand(const char* args)
{
// USAGE: .debug playsound #soundid
// #soundid - ID decimal number from SoundEntries.dbc (1st column)
// this file have about 5000 sounds.
// In this realization only caller can hear this sound.
if( *args )
{
uint32 dwSoundId = atoi((char*)args);
if( !sSoundEntriesStore.LookupEntry(dwSoundId) )
{
PSendSysMessage(LANG_SOUND_NOT_EXIST, dwSoundId);
SetSentErrorMessage(true);
return false;
}
WorldPacket data(SMSG_PLAY_OBJECT_SOUND,4+8);
data << uint32(dwSoundId) << m_session->GetPlayer()->GetGUID();
m_session->SendPacket(&data);
PSendSysMessage(LANG_YOU_HEAR_SOUND, dwSoundId);
return true;
}
return false;
}
//Save all players in the world
bool ChatHandler::HandleSaveAllCommand(const char* /*args*/)
{
ObjectAccessor::Instance().SaveAllPlayers();
SendSysMessage(LANG_PLAYERS_SAVED);
return true;
}
//Send mail by command
bool ChatHandler::HandleSendMailCommand(const char* args)
{
if(!*args)
return false;
// format: name "subject text" "mail text"
char* pName = strtok((char*)args, " ");
if(!pName)
return false;
char* tail1 = strtok(NULL, "");
if(!tail1)
return false;
char* msgSubject;
if(*tail1=='"')
msgSubject = strtok(tail1+1, "\"");
else
{
char* space = strtok(tail1, "\"");
if(!space)
return false;
msgSubject = strtok(NULL, "\"");
}
if (!msgSubject)
return false;
char* tail2 = strtok(NULL, "");
if(!tail2)
return false;
char* msgText;
if(*tail2=='"')
msgText = strtok(tail2+1, "\"");
else
{
char* space = strtok(tail2, "\"");
if(!space)
return false;
msgText = strtok(NULL, "\"");
}
if (!msgText)
return false;
// pName, msgSubject, msgText isn't NUL after prev. check
std::string name = pName;
std::string subject = msgSubject;
std::string text = msgText;
if(!normalizePlayerName(name))
{
SendSysMessage(LANG_PLAYER_NOT_FOUND);
SetSentErrorMessage(true);
return false;
}
uint64 receiver_guid = objmgr.GetPlayerGUIDByName(name);
if(!receiver_guid)
{
SendSysMessage(LANG_PLAYER_NOT_FOUND);
SetSentErrorMessage(true);
return false;
}
// 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;
Player *receiver = objmgr.GetPlayer(receiver_guid);
WorldSession::SendMailTo(receiver,messagetype, stationery, sender_guidlo, GUID_LOPART(receiver_guid), subject, itemTextId, NULL, 0, 0, MAIL_CHECK_MASK_NONE);
PSendSysMessage(LANG_MAIL_SENT, name.c_str());
return true;
}
// teleport player to given game_tele.entry
bool ChatHandler::HandleNameTeleCommand(const char * args)
{
if(!*args)
return false;
char* pName = strtok((char*)args, " ");
if(!pName)
return false;
std::string name = pName;
if(!normalizePlayerName(name))
{
SendSysMessage(LANG_PLAYER_NOT_FOUND);
SetSentErrorMessage(true);
return false;
}
char* tail = strtok(NULL, "");
if(!tail)
return false;
// id, or string, or [name] Shift-click form |color|Htele:id|h[name]|h|r
GameTele const* tele = extractGameTeleFromLink(tail);
if(!tele)
{
SendSysMessage(LANG_COMMAND_TELE_NOTFOUND);
SetSentErrorMessage(true);
return false;
}
Player *chr = objmgr.GetPlayer(name.c_str());
if (chr)
{
// check online security
if (HasLowerSecurity(chr, 0))
return false;
if(chr->IsBeingTeleported()==true)
{
PSendSysMessage(LANG_IS_TELEPORTED, chr->GetName());
SetSentErrorMessage(true);
return false;
}
PSendSysMessage(LANG_TELEPORTING_TO, chr->GetName(),"", tele->name.c_str());
if (needReportToTarget(chr))
ChatHandler(chr).PSendSysMessage(LANG_TELEPORTED_TO_BY, GetName());
// stop flight if need
if(chr->isInFlight())
{
chr->GetMotionMaster()->MovementExpired();
chr->m_taxi.ClearTaxiDestinations();
}
// save only in non-flight case
else
chr->SaveRecallPosition();
chr->TeleportTo(tele->mapId,tele->position_x,tele->position_y,tele->position_z,tele->orientation);
}
else if (uint64 guid = objmgr.GetPlayerGUIDByName(name.c_str()))
{
// check offline security
if (HasLowerSecurity(NULL, guid))
return false;
PSendSysMessage(LANG_TELEPORTING_TO, name.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),guid);
}
else
PSendSysMessage(LANG_NO_PLAYER, name.c_str());
return true;
}
//Teleport group to given game_tele.entry
bool ChatHandler::HandleGroupTeleCommand(const char * args)
{
if(!*args)
return false;
Player *player = getSelectedPlayer();
if (!player)
{
SendSysMessage(LANG_NO_CHAR_SELECTED);
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)
{
SendSysMessage(LANG_COMMAND_TELE_NOTFOUND);
SetSentErrorMessage(true);
return false;
}
Group *grp = player->GetGroup();
if(!grp)
{
PSendSysMessage(LANG_NOT_IN_GROUP,player->GetName());
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;
if(pl->IsBeingTeleported())
{
PSendSysMessage(LANG_IS_TELEPORTED, pl->GetName());
continue;
}
PSendSysMessage(LANG_TELEPORTING_TO, pl->GetName(),"", tele->name.c_str());
if (needReportToTarget(pl))
ChatHandler(pl).PSendSysMessage(LANG_TELEPORTED_TO_BY, GetName());
// stop flight if need
if(pl->isInFlight())
{
pl->GetMotionMaster()->MovementExpired();
pl->m_taxi.ClearTaxiDestinations();
}
// 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)
{
if(!*args)
return false;
std::string name = args;
if(!normalizePlayerName(name))
{
SendSysMessage(LANG_PLAYER_NOT_FOUND);
SetSentErrorMessage(true);
return false;
}
Player *player = objmgr.GetPlayer(name.c_str());
if (!player)
{
PSendSysMessage(LANG_NO_PLAYER, args);
SetSentErrorMessage(true);
return false;
}
// check online security
if (HasLowerSecurity(player, 0))
return false;
Group *grp = player->GetGroup();
if(!grp)
{
PSendSysMessage(LANG_NOT_IN_GROUP,player->GetName());
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()) ||
(m_session->GetPlayer()->GetGroup()->GetLeaderGUID() != m_session->GetPlayer()->GetGUID()) ) )
// the last check is a bit excessive, but let it be, just in case
{
SendSysMessage(LANG_CANNOT_SUMMON_TO_INST);
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;
if(pl->IsBeingTeleported()==true)
{
PSendSysMessage(LANG_IS_TELEPORTED, pl->GetName());
SetSentErrorMessage(true);
return false;
}
if (to_instance)
{
Map* plMap = pl->GetMap();
if ( plMap->Instanceable() && plMap->GetInstanceId() != gmMap->GetInstanceId() )
{
// cannot summon from instance to instance
PSendSysMessage(LANG_CANNOT_SUMMON_TO_INST,pl->GetName());
SetSentErrorMessage(true);
return false;
}
}
PSendSysMessage(LANG_SUMMONING, pl->GetName(),"");
if (needReportToTarget(pl))
ChatHandler(pl).PSendSysMessage(LANG_SUMMONED_BY, GetName());
// stop flight if need
if(pl->isInFlight())
{
pl->GetMotionMaster()->MovementExpired();
pl->m_taxi.ClearTaxiDestinations();
}
// 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;
}
//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())
{
_player->GetMotionMaster()->MovementExpired();
_player->m_taxi.ClearTaxiDestinations();
}
// save only in non-flight case
else
_player->SaveRecallPosition();
Map const *map = MapManager::Instance().GetBaseMap(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);
uint32 mapid;
if (pmapid)
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())
{
_player->GetMotionMaster()->MovementExpired();
_player->m_taxi.ClearTaxiDestinations();
}
// 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);
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().GetBaseMap(zoneEntry->mapid);
if(map->Instanceable())
{
PSendSysMessage(LANG_INVALID_ZONE_MAP,areaEntry->ID,areaEntry->area_name[m_session->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())
{
_player->GetMotionMaster()->MovementExpired();
_player->m_taxi.ClearTaxiDestinations();
}
// 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())
{
_player->GetMotionMaster()->MovementExpired();
_player->m_taxi.ClearTaxiDestinations();
}
// save only in non-flight case
else
_player->SaveRecallPosition();
Map const *map = MapManager::Instance().GetBaseMap(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::HandleDrunkCommand(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;
}