mirror of
https://github.com/araxiaonline/TrinityCore.git
synced 2026-06-18 22:19:54 -04:00
f3e86d3e68
Happy new year Conflicts: src/server/bnetserver/Authentication/AuthCodes.h src/server/bnetserver/Authentication/BattlenetPacketCrypt.cpp src/server/bnetserver/Authentication/BattlenetPacketCrypt.h src/server/bnetserver/Packets/AchievementPackets.h src/server/bnetserver/Packets/AuthenticationPackets.cpp src/server/bnetserver/Packets/AuthenticationPackets.h src/server/bnetserver/Packets/BitStream.cpp src/server/bnetserver/Packets/BitStream.h src/server/bnetserver/Packets/CachePackets.cpp src/server/bnetserver/Packets/CachePackets.h src/server/bnetserver/Packets/ChatPackets.h src/server/bnetserver/Packets/ConnectionPackets.cpp src/server/bnetserver/Packets/ConnectionPackets.h src/server/bnetserver/Packets/FriendsPackets.cpp src/server/bnetserver/Packets/FriendsPackets.h src/server/bnetserver/Packets/PacketManager.cpp src/server/bnetserver/Packets/PacketManager.h src/server/bnetserver/Packets/Packets.h src/server/bnetserver/Packets/PacketsBase.cpp src/server/bnetserver/Packets/PacketsBase.h src/server/bnetserver/Packets/PresencePackets.cpp src/server/bnetserver/Packets/PresencePackets.h src/server/bnetserver/Packets/ProfilePackets.h src/server/bnetserver/Packets/SupportPackets.h src/server/bnetserver/Packets/WoWRealmPackets.cpp src/server/bnetserver/Packets/WoWRealmPackets.h src/server/bnetserver/Realms/RealmList.cpp src/server/bnetserver/Realms/WorldListener.cpp src/server/bnetserver/Realms/WorldListener.h src/server/bnetserver/Server/ComponentManager.cpp src/server/bnetserver/Server/ComponentManager.h src/server/bnetserver/Server/ModuleManager.cpp src/server/bnetserver/Server/ModuleManager.h src/server/bnetserver/Server/Session.cpp src/server/bnetserver/Server/Session.h src/server/bnetserver/Server/SessionManager.cpp src/server/bnetserver/Server/SessionManager.h src/server/game/Accounts/BattlenetAccountMgr.cpp src/server/game/Accounts/BattlenetAccountMgr.h src/server/game/Battlegrounds/Zones/BattlegroundBFG.cpp src/server/game/Battlegrounds/Zones/BattlegroundBFG.h src/server/game/Battlegrounds/Zones/BattlegroundTP.cpp src/server/game/Battlegrounds/Zones/BattlegroundTP.h src/server/game/Entities/AreaTrigger/AreaTrigger.cpp src/server/game/Entities/AreaTrigger/AreaTrigger.h src/server/game/Entities/Item/ItemTemplate.cpp src/server/game/Guilds/GuildFinderMgr.cpp src/server/game/Guilds/GuildFinderMgr.h src/server/game/Handlers/GuildFinderHandler.cpp src/server/game/Handlers/VoidStorageHandler.cpp src/server/game/Movement/MovementStructures.cpp src/server/game/Movement/MovementStructures.h src/server/game/Movement/PathGenerator.cpp src/server/game/Server/BattlenetServerManager.cpp src/server/game/Server/BattlenetServerManager.h src/server/game/Server/Packet.cpp src/server/game/Server/Packet.h src/server/game/Server/Packets/AchievementPackets.cpp src/server/game/Server/Packets/AchievementPackets.h src/server/game/Server/Packets/AuctionHousePackets.cpp src/server/game/Server/Packets/AuctionHousePackets.h src/server/game/Server/Packets/AuthenticationPackets.cpp src/server/game/Server/Packets/AuthenticationPackets.h src/server/game/Server/Packets/BattlegroundPackets.cpp src/server/game/Server/Packets/BattlegroundPackets.h src/server/game/Server/Packets/ChannelPackets.cpp src/server/game/Server/Packets/ChannelPackets.h src/server/game/Server/Packets/CharacterPackets.cpp src/server/game/Server/Packets/CharacterPackets.h src/server/game/Server/Packets/ChatPackets.cpp src/server/game/Server/Packets/ChatPackets.h src/server/game/Server/Packets/ClientConfigPackets.cpp src/server/game/Server/Packets/ClientConfigPackets.h src/server/game/Server/Packets/CombatLogPackets.cpp src/server/game/Server/Packets/CombatLogPackets.h src/server/game/Server/Packets/CombatPackets.cpp src/server/game/Server/Packets/CombatPackets.h src/server/game/Server/Packets/EquipmentSetPackets.cpp src/server/game/Server/Packets/EquipmentSetPackets.h src/server/game/Server/Packets/GameObjectPackets.cpp src/server/game/Server/Packets/GameObjectPackets.h src/server/game/Server/Packets/GuildPackets.cpp src/server/game/Server/Packets/GuildPackets.h src/server/game/Server/Packets/ItemPackets.cpp src/server/game/Server/Packets/ItemPackets.h src/server/game/Server/Packets/LootPackets.h src/server/game/Server/Packets/MiscPackets.cpp src/server/game/Server/Packets/MiscPackets.h src/server/game/Server/Packets/MovementPackets.cpp src/server/game/Server/Packets/MovementPackets.h src/server/game/Server/Packets/NPCPackets.cpp src/server/game/Server/Packets/NPCPackets.h src/server/game/Server/Packets/QueryPackets.cpp src/server/game/Server/Packets/QueryPackets.h src/server/game/Server/Packets/QuestPackets.cpp src/server/game/Server/Packets/QuestPackets.h src/server/game/Server/Packets/ReputationPackets.cpp src/server/game/Server/Packets/ReputationPackets.h src/server/game/Server/Packets/SpellPackets.cpp src/server/game/Server/Packets/SpellPackets.h src/server/game/Server/Packets/SystemPackets.cpp src/server/game/Server/Packets/SystemPackets.h src/server/game/Server/Packets/TalentPackets.cpp src/server/game/Server/Packets/TalentPackets.h src/server/game/Server/Packets/TradePackets.h src/server/game/Server/Packets/WorldStatePackets.cpp src/server/game/Server/Packets/WorldStatePackets.h src/server/game/Server/WorldSocket.cpp src/server/ipc/CMakeLists.txt src/server/ipc/Commands.cpp src/server/ipc/Commands.h src/server/ipc/ZMQTask.cpp src/server/ipc/ZMQTask.h src/server/ipc/ZmqContext.cpp src/server/ipc/ZmqContext.h src/server/ipc/ZmqListener.cpp src/server/ipc/ZmqListener.h src/server/ipc/ZmqMux.cpp src/server/ipc/ZmqMux.h src/server/ipc/ZmqWorker.cpp src/server/ipc/ZmqWorker.h src/server/scripts/Commands/cs_battlenet_account.cpp src/server/scripts/Commands/cs_mmaps.cpp src/server/scripts/EasternKingdoms/BaradinHold/boss_alizabal.cpp src/server/scripts/EasternKingdoms/BaradinHold/boss_occuthar.cpp src/server/scripts/EasternKingdoms/BaradinHold/boss_pit_lord_argaloth.cpp src/server/scripts/EasternKingdoms/BaradinHold/instance_baradin_hold.cpp src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockCaverns/blackrock_caverns.cpp src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockCaverns/blackrock_caverns.h src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockCaverns/boss_ascendant_lord_obsidius.cpp src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockCaverns/boss_beauty.cpp src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockCaverns/boss_corla.cpp src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockCaverns/boss_karsh_steelbender.cpp src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockCaverns/boss_romogg_bonecrusher.cpp src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockCaverns/instance_blackrock_caverns.cpp src/server/scripts/EasternKingdoms/Deadmines/deadmines.cpp src/server/scripts/EasternKingdoms/ZulAman/boss_akilzon.cpp src/server/scripts/EasternKingdoms/ZulAman/boss_daakara.cpp src/server/scripts/EasternKingdoms/ZulAman/boss_halazzi.cpp src/server/scripts/EasternKingdoms/ZulAman/boss_hexlord.cpp src/server/scripts/EasternKingdoms/ZulAman/boss_janalai.cpp src/server/scripts/EasternKingdoms/ZulAman/boss_nalorakk.cpp src/server/scripts/EasternKingdoms/ZulAman/instance_zulaman.cpp src/server/scripts/EasternKingdoms/ZulAman/zulaman.cpp src/server/scripts/EasternKingdoms/ZulAman/zulaman.h src/server/scripts/EasternKingdoms/ZulGurub/boss_gahzranka.cpp src/server/scripts/EasternKingdoms/ZulGurub/boss_jindo_the_godbreaker.cpp src/server/scripts/EasternKingdoms/ZulGurub/boss_kilnara.cpp src/server/scripts/EasternKingdoms/ZulGurub/zulgurub.h src/server/scripts/EasternKingdoms/zone_burning_steppes.cpp src/server/scripts/EasternKingdoms/zone_ironforge.cpp src/server/scripts/EasternKingdoms/zone_stormwind_city.cpp src/server/scripts/EasternKingdoms/zone_tirisfal_glades.cpp src/server/scripts/Kalimdor/Firelands/boss_alysrazor.cpp src/server/scripts/Kalimdor/Firelands/firelands.h src/server/scripts/Kalimdor/Firelands/instance_firelands.cpp src/server/scripts/Kalimdor/HallsOfOrigination/boss_anraphet.cpp src/server/scripts/Kalimdor/HallsOfOrigination/boss_earthrager_ptah.cpp src/server/scripts/Kalimdor/HallsOfOrigination/boss_temple_guardian_anhuur.cpp src/server/scripts/Kalimdor/HallsOfOrigination/halls_of_origination.h src/server/scripts/Kalimdor/HallsOfOrigination/instance_halls_of_origination.cpp src/server/scripts/Kalimdor/zone_azshara.cpp src/server/scripts/Kalimdor/zone_darkshore.cpp src/server/scripts/Kalimdor/zone_felwood.cpp src/server/scripts/Kalimdor/zone_moonglade.cpp src/server/scripts/Kalimdor/zone_orgrimmar.cpp src/server/scripts/Kalimdor/zone_stonetalon_mountains.cpp src/server/scripts/Maelstrom/Stonecore/boss_corborus.cpp src/server/scripts/Maelstrom/Stonecore/boss_high_priestess_azil.cpp src/server/scripts/Maelstrom/Stonecore/boss_ozruk.cpp src/server/scripts/Maelstrom/Stonecore/boss_slabhide.cpp src/server/scripts/Maelstrom/Stonecore/instance_stonecore.cpp src/server/scripts/Maelstrom/Stonecore/stonecore.cpp src/server/scripts/Maelstrom/Stonecore/stonecore.h src/server/shared/Cryptography/Authentication/AuthCrypt.h src/server/shared/Cryptography/Authentication/PacketCrypt.cpp src/server/shared/Cryptography/Authentication/WorldPacketCrypt.cpp src/server/shared/Cryptography/HmacHash.cpp src/server/shared/Cryptography/SHA256.cpp src/server/shared/Cryptography/SHA256.h src/server/shared/Database/Implementation/HotfixDatabase.cpp src/server/shared/Database/Implementation/HotfixDatabase.h src/server/shared/Realm/Realm.cpp src/server/shared/Realm/Realm.h src/tools/connection_patcher/CMakeLists.txt src/tools/connection_patcher/Constants/BinaryTypes.hpp src/tools/connection_patcher/Helper.cpp src/tools/connection_patcher/Helper.hpp src/tools/connection_patcher/Patcher.cpp src/tools/connection_patcher/Patcher.hpp src/tools/connection_patcher/Patches/Common.hpp src/tools/connection_patcher/Patches/Mac.hpp src/tools/connection_patcher/Patches/Windows.hpp src/tools/connection_patcher/Patterns/Common.hpp src/tools/connection_patcher/Patterns/Mac.hpp src/tools/connection_patcher/Patterns/Windows.hpp src/tools/connection_patcher/Program.cpp src/tools/map_extractor/loadlib/DBFilesClientList.h
692 lines
25 KiB
C++
692 lines
25 KiB
C++
/*
|
|
* Copyright (C) 2008-2015 TrinityCore <http://www.trinitycore.org/>
|
|
*
|
|
* 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, see <http://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
/* ScriptData
|
|
Name: gobject_commandscript
|
|
%Complete: 100
|
|
Comment: All gobject related commands
|
|
Category: commandscripts
|
|
EndScriptData */
|
|
|
|
#include "ScriptMgr.h"
|
|
#include "GameEventMgr.h"
|
|
#include "ObjectMgr.h"
|
|
#include "PoolMgr.h"
|
|
#include "MapManager.h"
|
|
#include "Chat.h"
|
|
#include "Language.h"
|
|
#include "Player.h"
|
|
#include "Opcodes.h"
|
|
|
|
class gobject_commandscript : public CommandScript
|
|
{
|
|
public:
|
|
gobject_commandscript() : CommandScript("gobject_commandscript") { }
|
|
|
|
ChatCommand* GetCommands() const override
|
|
{
|
|
static ChatCommand gobjectAddCommandTable[] =
|
|
{
|
|
{ "temp", rbac::RBAC_PERM_COMMAND_GOBJECT_ADD_TEMP, false, &HandleGameObjectAddTempCommand, "", NULL },
|
|
{ "", rbac::RBAC_PERM_COMMAND_GOBJECT_ADD, false, &HandleGameObjectAddCommand, "", NULL },
|
|
{ NULL, 0, false, NULL, "", NULL }
|
|
};
|
|
static ChatCommand gobjectSetCommandTable[] =
|
|
{
|
|
{ "phase", rbac::RBAC_PERM_COMMAND_GOBJECT_SET_PHASE, false, &HandleGameObjectSetPhaseCommand, "", NULL },
|
|
{ "state", rbac::RBAC_PERM_COMMAND_GOBJECT_SET_STATE, false, &HandleGameObjectSetStateCommand, "", NULL },
|
|
{ NULL, 0, false, NULL, "", NULL }
|
|
};
|
|
static ChatCommand gobjectCommandTable[] =
|
|
{
|
|
{ "activate", rbac::RBAC_PERM_COMMAND_GOBJECT_ACTIVATE, false, &HandleGameObjectActivateCommand, "", NULL },
|
|
{ "delete", rbac::RBAC_PERM_COMMAND_GOBJECT_DELETE, false, &HandleGameObjectDeleteCommand, "", NULL },
|
|
{ "info", rbac::RBAC_PERM_COMMAND_GOBJECT_INFO, false, &HandleGameObjectInfoCommand, "", NULL },
|
|
{ "move", rbac::RBAC_PERM_COMMAND_GOBJECT_MOVE, false, &HandleGameObjectMoveCommand, "", NULL },
|
|
{ "near", rbac::RBAC_PERM_COMMAND_GOBJECT_NEAR, false, &HandleGameObjectNearCommand, "", NULL },
|
|
{ "target", rbac::RBAC_PERM_COMMAND_GOBJECT_TARGET, false, &HandleGameObjectTargetCommand, "", NULL },
|
|
{ "turn", rbac::RBAC_PERM_COMMAND_GOBJECT_TURN, false, &HandleGameObjectTurnCommand, "", NULL },
|
|
{ "add", rbac::RBAC_PERM_COMMAND_GOBJECT_ADD, false, NULL, "", gobjectAddCommandTable },
|
|
{ "set", rbac::RBAC_PERM_COMMAND_GOBJECT_SET, false, NULL, "", gobjectSetCommandTable },
|
|
{ NULL, 0, false, NULL, "", NULL }
|
|
};
|
|
static ChatCommand commandTable[] =
|
|
{
|
|
{ "gobject", rbac::RBAC_PERM_COMMAND_GOBJECT, false, NULL, "", gobjectCommandTable },
|
|
{ NULL, 0, false, NULL, "", NULL }
|
|
};
|
|
return commandTable;
|
|
}
|
|
|
|
static bool HandleGameObjectActivateCommand(ChatHandler* handler, char const* args)
|
|
{
|
|
if (!*args)
|
|
return false;
|
|
|
|
char* id = handler->extractKeyFromLink((char*)args, "Hgameobject");
|
|
if (!id)
|
|
return false;
|
|
|
|
uint32 guidLow = atoi(id);
|
|
if (!guidLow)
|
|
return false;
|
|
|
|
GameObject* object = NULL;
|
|
|
|
// by DB guid
|
|
if (GameObjectData const* goData = sObjectMgr->GetGOData(guidLow))
|
|
object = handler->GetObjectGlobalyWithGuidOrNearWithDbGuid(guidLow, goData->id);
|
|
|
|
if (!object)
|
|
{
|
|
handler->PSendSysMessage(LANG_COMMAND_OBJNOTFOUND, guidLow);
|
|
handler->SetSentErrorMessage(true);
|
|
return false;
|
|
}
|
|
|
|
// Activate
|
|
object->SetLootState(GO_READY);
|
|
object->UseDoorOrButton(10000, false, handler->GetSession()->GetPlayer());
|
|
|
|
handler->PSendSysMessage("Object activated!");
|
|
|
|
return true;
|
|
}
|
|
|
|
//spawn go
|
|
static bool HandleGameObjectAddCommand(ChatHandler* handler, char const* args)
|
|
{
|
|
if (!*args)
|
|
return false;
|
|
|
|
// number or [name] Shift-click form |color|Hgameobject_entry:go_id|h[name]|h|r
|
|
char* id = handler->extractKeyFromLink((char*)args, "Hgameobject_entry");
|
|
if (!id)
|
|
return false;
|
|
|
|
uint32 objectId = atoul(id);
|
|
if (!objectId)
|
|
return false;
|
|
|
|
char* spawntimeSecs = strtok(NULL, " ");
|
|
|
|
const GameObjectTemplate* objectInfo = sObjectMgr->GetGameObjectTemplate(objectId);
|
|
|
|
if (!objectInfo)
|
|
{
|
|
handler->PSendSysMessage(LANG_GAMEOBJECT_NOT_EXIST, objectId);
|
|
handler->SetSentErrorMessage(true);
|
|
return false;
|
|
}
|
|
|
|
if (objectInfo->displayId && !sGameObjectDisplayInfoStore.LookupEntry(objectInfo->displayId))
|
|
{
|
|
// report to DB errors log as in loading case
|
|
TC_LOG_ERROR("sql.sql", "Gameobject (Entry %u GoType: %u) have invalid displayId (%u), not spawned.", objectId, objectInfo->type, objectInfo->displayId);
|
|
handler->PSendSysMessage(LANG_GAMEOBJECT_HAVE_INVALID_DATA, objectId);
|
|
handler->SetSentErrorMessage(true);
|
|
return false;
|
|
}
|
|
|
|
Player* player = handler->GetSession()->GetPlayer();
|
|
float x = float(player->GetPositionX());
|
|
float y = float(player->GetPositionY());
|
|
float z = float(player->GetPositionZ());
|
|
float o = float(player->GetOrientation());
|
|
Map* map = player->GetMap();
|
|
|
|
GameObject* object = new GameObject;
|
|
uint32 guidLow = sObjectMgr->GenerateLowGuid(HIGHGUID_GAMEOBJECT);
|
|
|
|
if (!object->Create(guidLow, objectInfo->entry, map, player->GetPhaseMaskForSpawn(), x, y, z, o, 0.0f, 0.0f, 0.0f, 0.0f, 0, GO_STATE_READY))
|
|
{
|
|
delete object;
|
|
return false;
|
|
}
|
|
|
|
if (spawntimeSecs)
|
|
{
|
|
uint32 value = atoi((char*)spawntimeSecs);
|
|
object->SetRespawnTime(value);
|
|
}
|
|
|
|
// fill the gameobject data and save to the db
|
|
object->SaveToDB(map->GetId(), (1 << map->GetSpawnMode()), player->GetPhaseMaskForSpawn());
|
|
// delete the old object and do a clean load from DB with a fresh new GameObject instance.
|
|
// this is required to avoid weird behavior and memory leaks
|
|
delete object;
|
|
|
|
object = new GameObject();
|
|
// this will generate a new guid if the object is in an instance
|
|
if (!object->LoadGameObjectFromDB(guidLow, map))
|
|
{
|
|
delete object;
|
|
return false;
|
|
}
|
|
|
|
/// @todo is it really necessary to add both the real and DB table guid here ?
|
|
sObjectMgr->AddGameobjectToGrid(guidLow, sObjectMgr->GetGOData(guidLow));
|
|
|
|
handler->PSendSysMessage(LANG_GAMEOBJECT_ADD, objectId, objectInfo->name.c_str(), guidLow, x, y, z);
|
|
return true;
|
|
}
|
|
|
|
// add go, temp only
|
|
static bool HandleGameObjectAddTempCommand(ChatHandler* handler, char const* args)
|
|
{
|
|
if (!*args)
|
|
return false;
|
|
|
|
char* id = strtok((char*)args, " ");
|
|
if (!id)
|
|
return false;
|
|
|
|
Player* player = handler->GetSession()->GetPlayer();
|
|
|
|
char* spawntime = strtok(NULL, " ");
|
|
uint32 spawntm = 300;
|
|
|
|
if (spawntime)
|
|
spawntm = atoi((char*)spawntime);
|
|
|
|
float x = player->GetPositionX();
|
|
float y = player->GetPositionY();
|
|
float z = player->GetPositionZ();
|
|
float ang = player->GetOrientation();
|
|
|
|
float rot2 = std::sin(ang/2);
|
|
float rot3 = std::cos(ang/2);
|
|
|
|
uint32 objectId = atoi(id);
|
|
|
|
if (!sObjectMgr->GetGameObjectTemplate(objectId))
|
|
{
|
|
handler->PSendSysMessage(LANG_GAMEOBJECT_NOT_EXIST, objectId);
|
|
handler->SetSentErrorMessage(true);
|
|
return false;
|
|
}
|
|
|
|
player->SummonGameObject(objectId, x, y, z, ang, 0, 0, rot2, rot3, spawntm);
|
|
|
|
return true;
|
|
}
|
|
|
|
static bool HandleGameObjectTargetCommand(ChatHandler* handler, char const* args)
|
|
{
|
|
Player* player = handler->GetSession()->GetPlayer();
|
|
QueryResult result;
|
|
GameEventMgr::ActiveEvents const& activeEventsList = sGameEventMgr->GetActiveEventList();
|
|
|
|
if (*args)
|
|
{
|
|
// number or [name] Shift-click form |color|Hgameobject_entry:go_id|h[name]|h|r
|
|
char* id = handler->extractKeyFromLink((char*)args, "Hgameobject_entry");
|
|
if (!id)
|
|
return false;
|
|
|
|
uint32 objectId = atoul(id);
|
|
|
|
if (objectId)
|
|
result = WorldDatabase.PQuery("SELECT guid, id, position_x, position_y, position_z, orientation, map, phaseMask, (POW(position_x - '%f', 2) + POW(position_y - '%f', 2) + POW(position_z - '%f', 2)) AS order_ FROM gameobject WHERE map = '%i' AND id = '%u' ORDER BY order_ ASC LIMIT 1",
|
|
player->GetPositionX(), player->GetPositionY(), player->GetPositionZ(), player->GetMapId(), objectId);
|
|
else
|
|
{
|
|
std::string name = id;
|
|
WorldDatabase.EscapeString(name);
|
|
result = WorldDatabase.PQuery(
|
|
"SELECT guid, id, position_x, position_y, position_z, orientation, map, phaseMask, (POW(position_x - %f, 2) + POW(position_y - %f, 2) + POW(position_z - %f, 2)) AS order_ "
|
|
"FROM gameobject, gameobject_template WHERE gameobject_template.entry = gameobject.id AND map = %i AND name " _LIKE_" " _CONCAT3_("'%%'", "'%s'", "'%%'")" ORDER BY order_ ASC LIMIT 1",
|
|
player->GetPositionX(), player->GetPositionY(), player->GetPositionZ(), player->GetMapId(), name.c_str());
|
|
}
|
|
}
|
|
else
|
|
{
|
|
std::ostringstream eventFilter;
|
|
eventFilter << " AND (eventEntry IS NULL ";
|
|
bool initString = true;
|
|
|
|
for (GameEventMgr::ActiveEvents::const_iterator itr = activeEventsList.begin(); itr != activeEventsList.end(); ++itr)
|
|
{
|
|
if (initString)
|
|
{
|
|
eventFilter << "OR eventEntry IN (" << *itr;
|
|
initString = false;
|
|
}
|
|
else
|
|
eventFilter << ',' << *itr;
|
|
}
|
|
|
|
if (!initString)
|
|
eventFilter << "))";
|
|
else
|
|
eventFilter << ')';
|
|
|
|
result = WorldDatabase.PQuery("SELECT gameobject.guid, id, position_x, position_y, position_z, orientation, map, phaseMask, "
|
|
"(POW(position_x - %f, 2) + POW(position_y - %f, 2) + POW(position_z - %f, 2)) AS order_ FROM gameobject "
|
|
"LEFT OUTER JOIN game_event_gameobject on gameobject.guid = game_event_gameobject.guid WHERE map = '%i' %s ORDER BY order_ ASC LIMIT 10",
|
|
handler->GetSession()->GetPlayer()->GetPositionX(), handler->GetSession()->GetPlayer()->GetPositionY(), handler->GetSession()->GetPlayer()->GetPositionZ(),
|
|
handler->GetSession()->GetPlayer()->GetMapId(), eventFilter.str().c_str());
|
|
}
|
|
|
|
if (!result)
|
|
{
|
|
handler->SendSysMessage(LANG_COMMAND_TARGETOBJNOTFOUND);
|
|
return true;
|
|
}
|
|
|
|
bool found = false;
|
|
float x, y, z, o;
|
|
uint32 guidLow, id, phase;
|
|
uint16 mapId;
|
|
uint32 poolId;
|
|
|
|
do
|
|
{
|
|
Field* fields = result->Fetch();
|
|
guidLow = fields[0].GetUInt32();
|
|
id = fields[1].GetUInt32();
|
|
x = fields[2].GetFloat();
|
|
y = fields[3].GetFloat();
|
|
z = fields[4].GetFloat();
|
|
o = fields[5].GetFloat();
|
|
mapId = fields[6].GetUInt16();
|
|
phase = fields[7].GetUInt32();
|
|
poolId = sPoolMgr->IsPartOfAPool<GameObject>(guidLow);
|
|
if (!poolId || sPoolMgr->IsSpawnedObject<GameObject>(guidLow))
|
|
found = true;
|
|
} while (result->NextRow() && !found);
|
|
|
|
if (!found)
|
|
{
|
|
handler->PSendSysMessage(LANG_GAMEOBJECT_NOT_EXIST, id);
|
|
return false;
|
|
}
|
|
|
|
GameObjectTemplate const* objectInfo = sObjectMgr->GetGameObjectTemplate(id);
|
|
|
|
if (!objectInfo)
|
|
{
|
|
handler->PSendSysMessage(LANG_GAMEOBJECT_NOT_EXIST, id);
|
|
return false;
|
|
}
|
|
|
|
GameObject* target = handler->GetSession()->GetPlayer()->GetMap()->GetGameObject(ObjectGuid(HIGHGUID_GAMEOBJECT, id, guidLow));
|
|
|
|
handler->PSendSysMessage(LANG_GAMEOBJECT_DETAIL, guidLow, objectInfo->name.c_str(), guidLow, id, x, y, z, mapId, o, phase);
|
|
|
|
if (target)
|
|
{
|
|
int32 curRespawnDelay = int32(target->GetRespawnTimeEx() - time(NULL));
|
|
if (curRespawnDelay < 0)
|
|
curRespawnDelay = 0;
|
|
|
|
std::string curRespawnDelayStr = secsToTimeString(curRespawnDelay, true);
|
|
std::string defRespawnDelayStr = secsToTimeString(target->GetRespawnDelay(), true);
|
|
|
|
handler->PSendSysMessage(LANG_COMMAND_RAWPAWNTIMES, defRespawnDelayStr.c_str(), curRespawnDelayStr.c_str());
|
|
}
|
|
return true;
|
|
}
|
|
|
|
//delete object by selection or guid
|
|
static bool HandleGameObjectDeleteCommand(ChatHandler* handler, char const* args)
|
|
{
|
|
// number or [name] Shift-click form |color|Hgameobject:go_guid|h[name]|h|r
|
|
char* id = handler->extractKeyFromLink((char*)args, "Hgameobject");
|
|
if (!id)
|
|
return false;
|
|
|
|
uint32 guidLow = atoi(id);
|
|
if (!guidLow)
|
|
return false;
|
|
|
|
GameObject* object = NULL;
|
|
|
|
// by DB guid
|
|
if (GameObjectData const* gameObjectData = sObjectMgr->GetGOData(guidLow))
|
|
object = handler->GetObjectGlobalyWithGuidOrNearWithDbGuid(guidLow, gameObjectData->id);
|
|
|
|
if (!object)
|
|
{
|
|
handler->PSendSysMessage(LANG_COMMAND_OBJNOTFOUND, guidLow);
|
|
handler->SetSentErrorMessage(true);
|
|
return false;
|
|
}
|
|
|
|
ObjectGuid ownerGuid = object->GetOwnerGUID();
|
|
if (ownerGuid)
|
|
{
|
|
Unit* owner = ObjectAccessor::GetUnit(*handler->GetSession()->GetPlayer(), ownerGuid);
|
|
if (!owner || !ownerGuid.IsPlayer())
|
|
{
|
|
handler->PSendSysMessage(LANG_COMMAND_DELOBJREFERCREATURE, ownerGuid.GetCounter(), object->GetGUIDLow());
|
|
handler->SetSentErrorMessage(true);
|
|
return false;
|
|
}
|
|
|
|
owner->RemoveGameObject(object, false);
|
|
}
|
|
|
|
object->SetRespawnTime(0); // not save respawn time
|
|
object->Delete();
|
|
object->DeleteFromDB();
|
|
|
|
handler->PSendSysMessage(LANG_COMMAND_DELOBJMESSAGE, object->GetGUIDLow());
|
|
|
|
return true;
|
|
}
|
|
|
|
//turn selected object
|
|
static bool HandleGameObjectTurnCommand(ChatHandler* handler, char const* args)
|
|
{
|
|
// number or [name] Shift-click form |color|Hgameobject:go_id|h[name]|h|r
|
|
char* id = handler->extractKeyFromLink((char*)args, "Hgameobject");
|
|
if (!id)
|
|
return false;
|
|
|
|
uint32 guidLow = atoi(id);
|
|
if (!guidLow)
|
|
return false;
|
|
|
|
GameObject* object = NULL;
|
|
|
|
// by DB guid
|
|
if (GameObjectData const* gameObjectData = sObjectMgr->GetGOData(guidLow))
|
|
object = handler->GetObjectGlobalyWithGuidOrNearWithDbGuid(guidLow, gameObjectData->id);
|
|
|
|
if (!object)
|
|
{
|
|
handler->PSendSysMessage(LANG_COMMAND_OBJNOTFOUND, guidLow);
|
|
handler->SetSentErrorMessage(true);
|
|
return false;
|
|
}
|
|
|
|
char* orientation = strtok(NULL, " ");
|
|
float o;
|
|
|
|
if (orientation)
|
|
o = (float)atof(orientation);
|
|
else
|
|
{
|
|
Player* player = handler->GetSession()->GetPlayer();
|
|
o = player->GetOrientation();
|
|
}
|
|
|
|
object->Relocate(object->GetPositionX(), object->GetPositionY(), object->GetPositionZ(), o);
|
|
object->UpdateRotationFields();
|
|
object->DestroyForNearbyPlayers();
|
|
object->UpdateObjectVisibility();
|
|
|
|
object->SaveToDB();
|
|
object->Refresh();
|
|
|
|
handler->PSendSysMessage(LANG_COMMAND_TURNOBJMESSAGE, object->GetGUIDLow(), object->GetGOInfo()->name.c_str(), object->GetGUIDLow(), o);
|
|
|
|
return true;
|
|
}
|
|
|
|
//move selected object
|
|
static bool HandleGameObjectMoveCommand(ChatHandler* handler, char const* args)
|
|
{
|
|
// number or [name] Shift-click form |color|Hgameobject:go_guid|h[name]|h|r
|
|
char* id = handler->extractKeyFromLink((char*)args, "Hgameobject");
|
|
if (!id)
|
|
return false;
|
|
|
|
uint32 guidLow = atoi(id);
|
|
if (!guidLow)
|
|
return false;
|
|
|
|
GameObject* object = NULL;
|
|
|
|
// by DB guid
|
|
if (GameObjectData const* gameObjectData = sObjectMgr->GetGOData(guidLow))
|
|
object = handler->GetObjectGlobalyWithGuidOrNearWithDbGuid(guidLow, gameObjectData->id);
|
|
|
|
if (!object)
|
|
{
|
|
handler->PSendSysMessage(LANG_COMMAND_OBJNOTFOUND, guidLow);
|
|
handler->SetSentErrorMessage(true);
|
|
return false;
|
|
}
|
|
|
|
char* toX = strtok(NULL, " ");
|
|
char* toY = strtok(NULL, " ");
|
|
char* toZ = strtok(NULL, " ");
|
|
|
|
if (!toX)
|
|
{
|
|
Player* player = handler->GetSession()->GetPlayer();
|
|
object->Relocate(player->GetPositionX(), player->GetPositionY(), player->GetPositionZ(), object->GetOrientation());
|
|
object->DestroyForNearbyPlayers();
|
|
object->UpdateObjectVisibility();
|
|
}
|
|
else
|
|
{
|
|
if (!toY || !toZ)
|
|
return false;
|
|
|
|
float x = (float)atof(toX);
|
|
float y = (float)atof(toY);
|
|
float z = (float)atof(toZ);
|
|
|
|
if (!MapManager::IsValidMapCoord(object->GetMapId(), x, y, z))
|
|
{
|
|
handler->PSendSysMessage(LANG_INVALID_TARGET_COORD, x, y, object->GetMapId());
|
|
handler->SetSentErrorMessage(true);
|
|
return false;
|
|
}
|
|
|
|
object->Relocate(x, y, z, object->GetOrientation());
|
|
object->DestroyForNearbyPlayers();
|
|
object->UpdateObjectVisibility();
|
|
}
|
|
|
|
object->SaveToDB();
|
|
object->Refresh();
|
|
|
|
handler->PSendSysMessage(LANG_COMMAND_MOVEOBJMESSAGE, object->GetGUIDLow(), object->GetGOInfo()->name.c_str(), object->GetGUIDLow());
|
|
|
|
return true;
|
|
}
|
|
|
|
//set phasemask for selected object
|
|
static bool HandleGameObjectSetPhaseCommand(ChatHandler* handler, char const* args)
|
|
{
|
|
// number or [name] Shift-click form |color|Hgameobject:go_id|h[name]|h|r
|
|
char* id = handler->extractKeyFromLink((char*)args, "Hgameobject");
|
|
if (!id)
|
|
return false;
|
|
|
|
uint32 guidLow = atoi(id);
|
|
if (!guidLow)
|
|
return false;
|
|
|
|
GameObject* object = NULL;
|
|
|
|
// by DB guid
|
|
if (GameObjectData const* gameObjectData = sObjectMgr->GetGOData(guidLow))
|
|
object = handler->GetObjectGlobalyWithGuidOrNearWithDbGuid(guidLow, gameObjectData->id);
|
|
|
|
if (!object)
|
|
{
|
|
handler->PSendSysMessage(LANG_COMMAND_OBJNOTFOUND, guidLow);
|
|
handler->SetSentErrorMessage(true);
|
|
return false;
|
|
}
|
|
|
|
char* phase = strtok (NULL, " ");
|
|
uint32 phaseMask = phase ? atoi(phase) : 0;
|
|
if (phaseMask == 0)
|
|
{
|
|
handler->SendSysMessage(LANG_BAD_VALUE);
|
|
handler->SetSentErrorMessage(true);
|
|
return false;
|
|
}
|
|
|
|
object->SetPhaseMask(phaseMask, true);
|
|
object->SaveToDB();
|
|
return true;
|
|
}
|
|
|
|
static bool HandleGameObjectNearCommand(ChatHandler* handler, char const* args)
|
|
{
|
|
float distance = (!*args) ? 10.0f : (float)(atof(args));
|
|
uint32 count = 0;
|
|
|
|
Player* player = handler->GetSession()->GetPlayer();
|
|
|
|
PreparedStatement* stmt = WorldDatabase.GetPreparedStatement(WORLD_SEL_GAMEOBJECT_NEAREST);
|
|
stmt->setFloat(0, player->GetPositionX());
|
|
stmt->setFloat(1, player->GetPositionY());
|
|
stmt->setFloat(2, player->GetPositionZ());
|
|
stmt->setUInt32(3, player->GetMapId());
|
|
stmt->setFloat(4, player->GetPositionX());
|
|
stmt->setFloat(5, player->GetPositionY());
|
|
stmt->setFloat(6, player->GetPositionZ());
|
|
stmt->setFloat(7, distance * distance);
|
|
PreparedQueryResult result = WorldDatabase.Query(stmt);
|
|
|
|
if (result)
|
|
{
|
|
do
|
|
{
|
|
Field* fields = result->Fetch();
|
|
uint32 guid = fields[0].GetUInt32();
|
|
uint32 entry = fields[1].GetUInt32();
|
|
float x = fields[2].GetFloat();
|
|
float y = fields[3].GetFloat();
|
|
float z = fields[4].GetFloat();
|
|
uint16 mapId = fields[5].GetUInt16();
|
|
|
|
GameObjectTemplate const* gameObjectInfo = sObjectMgr->GetGameObjectTemplate(entry);
|
|
|
|
if (!gameObjectInfo)
|
|
continue;
|
|
|
|
handler->PSendSysMessage(LANG_GO_LIST_CHAT, guid, entry, guid, gameObjectInfo->name.c_str(), x, y, z, mapId);
|
|
|
|
++count;
|
|
} while (result->NextRow());
|
|
}
|
|
|
|
handler->PSendSysMessage(LANG_COMMAND_NEAROBJMESSAGE, distance, count);
|
|
return true;
|
|
}
|
|
|
|
//show info of gameobject
|
|
static bool HandleGameObjectInfoCommand(ChatHandler* handler, char const* args)
|
|
{
|
|
uint32 entry = 0;
|
|
uint32 type = 0;
|
|
uint32 displayId = 0;
|
|
std::string name;
|
|
uint32 lootId = 0;
|
|
|
|
if (!*args)
|
|
{
|
|
if (WorldObject* object = handler->getSelectedObject())
|
|
entry = object->GetEntry();
|
|
else
|
|
entry = atoi((char*)args);
|
|
} else
|
|
entry = atoi((char*)args);
|
|
|
|
GameObjectTemplate const* gameObjectInfo = sObjectMgr->GetGameObjectTemplate(entry);
|
|
|
|
if (!gameObjectInfo)
|
|
return false;
|
|
|
|
type = gameObjectInfo->type;
|
|
displayId = gameObjectInfo->displayId;
|
|
name = gameObjectInfo->name;
|
|
if (type == GAMEOBJECT_TYPE_CHEST)
|
|
lootId = gameObjectInfo->chest.lootId;
|
|
else if (type == GAMEOBJECT_TYPE_FISHINGHOLE)
|
|
lootId = gameObjectInfo->fishinghole.lootId;
|
|
|
|
handler->PSendSysMessage(LANG_GOINFO_ENTRY, entry);
|
|
handler->PSendSysMessage(LANG_GOINFO_TYPE, type);
|
|
handler->PSendSysMessage(LANG_GOINFO_LOOTID, lootId);
|
|
handler->PSendSysMessage(LANG_GOINFO_DISPLAYID, displayId);
|
|
handler->PSendSysMessage(LANG_GOINFO_NAME, name.c_str());
|
|
|
|
return true;
|
|
}
|
|
|
|
static bool HandleGameObjectSetStateCommand(ChatHandler* handler, char const* args)
|
|
{
|
|
// number or [name] Shift-click form |color|Hgameobject:go_id|h[name]|h|r
|
|
char* id = handler->extractKeyFromLink((char*)args, "Hgameobject");
|
|
if (!id)
|
|
return false;
|
|
|
|
uint32 guidLow = atoi(id);
|
|
if (!guidLow)
|
|
return false;
|
|
|
|
GameObject* object = NULL;
|
|
|
|
if (GameObjectData const* gameObjectData = sObjectMgr->GetGOData(guidLow))
|
|
object = handler->GetObjectGlobalyWithGuidOrNearWithDbGuid(guidLow, gameObjectData->id);
|
|
|
|
if (!object)
|
|
{
|
|
handler->PSendSysMessage(LANG_COMMAND_OBJNOTFOUND, guidLow);
|
|
handler->SetSentErrorMessage(true);
|
|
return false;
|
|
}
|
|
|
|
char* type = strtok(NULL, " ");
|
|
if (!type)
|
|
return false;
|
|
|
|
int32 objectType = atoi(type);
|
|
if (objectType < 0)
|
|
{
|
|
if (objectType == -1)
|
|
object->SendObjectDeSpawnAnim(object->GetGUID());
|
|
else if (objectType == -2)
|
|
return false;
|
|
return true;
|
|
}
|
|
|
|
char* state = strtok(NULL, " ");
|
|
if (!state)
|
|
return false;
|
|
|
|
int32 objectState = atoi(state);
|
|
|
|
if (objectType < 4)
|
|
object->SetByteValue(GAMEOBJECT_BYTES_1, objectType, objectState);
|
|
else if (objectType == 4)
|
|
{
|
|
WorldPacket data(SMSG_GAMEOBJECT_CUSTOM_ANIM, 8+4);
|
|
data << object->GetGUID();
|
|
data << (uint32)(objectState);
|
|
object->SendMessageToSet(&data, true);
|
|
}
|
|
handler->PSendSysMessage("Set gobject type %d state %d", objectType, objectState);
|
|
return true;
|
|
}
|
|
};
|
|
|
|
void AddSC_gobject_commandscript()
|
|
{
|
|
new gobject_commandscript();
|
|
}
|