summaryrefslogtreecommitdiff
path: root/src/scripts/Commands/cs_gobject.cpp
diff options
context:
space:
mode:
authorYehonal <yehonal.azeroth@gmail.com>2016-08-12 00:46:43 +0200
committerYehonal <yehonal.azeroth@gmail.com>2016-08-12 02:38:26 +0200
commitb0c8eceb08b9a7688893991e5ba4a3350617e6ed (patch)
tree39a52f0bea8e1ed803dc4298fdeb8b6bd808b67d /src/scripts/Commands/cs_gobject.cpp
parenta73ad5cd6eefd619e9371d9b26c7e6317cacd7f7 (diff)
Refactoring part 2 [W.I.P]
Diffstat (limited to 'src/scripts/Commands/cs_gobject.cpp')
-rw-r--r--src/scripts/Commands/cs_gobject.cpp720
1 files changed, 720 insertions, 0 deletions
diff --git a/src/scripts/Commands/cs_gobject.cpp b/src/scripts/Commands/cs_gobject.cpp
new file mode 100644
index 0000000000..23c170c8e9
--- /dev/null
+++ b/src/scripts/Commands/cs_gobject.cpp
@@ -0,0 +1,720 @@
+/*
+ * Copyright (C)
+ *
+ * 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"
+#include "Transport.h"
+#include "GameObject.h"
+
+class gobject_commandscript : public CommandScript
+{
+public:
+ gobject_commandscript() : CommandScript("gobject_commandscript") { }
+
+ ChatCommand* GetCommands() const
+ {
+ static ChatCommand gobjectAddCommandTable[] =
+ {
+ { "temp", SEC_GAMEMASTER, false, &HandleGameObjectAddTempCommand, "", NULL },
+ { "", SEC_GAMEMASTER, false, &HandleGameObjectAddCommand, "", NULL },
+ { NULL, 0, false, NULL, "", NULL }
+ };
+ static ChatCommand gobjectSetCommandTable[] =
+ {
+ { "phase", SEC_GAMEMASTER, false, &HandleGameObjectSetPhaseCommand, "", NULL },
+ { "state", SEC_GAMEMASTER, false, &HandleGameObjectSetStateCommand, "", NULL },
+ { NULL, 0, false, NULL, "", NULL }
+ };
+ static ChatCommand gobjectCommandTable[] =
+ {
+ { "activate", SEC_GAMEMASTER, false, &HandleGameObjectActivateCommand, "", NULL },
+ { "delete", SEC_GAMEMASTER, false, &HandleGameObjectDeleteCommand, "", NULL },
+ { "info", SEC_GAMEMASTER, false, &HandleGameObjectInfoCommand, "", NULL },
+ { "move", SEC_GAMEMASTER, false, &HandleGameObjectMoveCommand, "", NULL },
+ { "near", SEC_GAMEMASTER, false, &HandleGameObjectNearCommand, "", NULL },
+ { "target", SEC_GAMEMASTER, false, &HandleGameObjectTargetCommand, "", NULL },
+ { "turn", SEC_GAMEMASTER, false, &HandleGameObjectTurnCommand, "", NULL },
+ { "add", SEC_GAMEMASTER, false, NULL, "", gobjectAddCommandTable },
+ { "set", SEC_GAMEMASTER, false, NULL, "", gobjectSetCommandTable },
+ { NULL, 0, false, NULL, "", NULL }
+ };
+ static ChatCommand commandTable[] =
+ {
+ { "gobject", SEC_GAMEMASTER, 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 = atol(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
+ sLog->outErrorDb("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 = sObjectMgr->IsGameObjectStaticTransport(objectInfo->entry) ? new StaticTransport() : new GameObject();
+ uint32 guidLow = sObjectMgr->GenerateLowGuid(HIGHGUID_GAMEOBJECT);
+
+ if (!object->Create(guidLow, objectInfo->entry, map, player->GetPhaseMaskForSpawn(), x, y, z, o, G3D::Quat(), 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 = sObjectMgr->IsGameObjectStaticTransport(objectInfo->entry) ? new StaticTransport() : 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 = sin(ang/2);
+ float rot3 = cos(ang/2);
+
+ uint32 objectId = atoi(id);
+
+ 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 = atol(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(MAKE_NEW_GUID(guidLow, id, HIGHGUID_GAMEOBJECT));
+
+ 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;
+ }
+
+ uint64 ownerGuid = object->GetOwnerGUID();
+ if (ownerGuid)
+ {
+ Unit* owner = ObjectAccessor::GetUnit(*handler->GetSession()->GetPlayer(), ownerGuid);
+ if (!owner || !IS_PLAYER_GUID(ownerGuid))
+ {
+ handler->PSendSysMessage(LANG_COMMAND_DELOBJREFERCREATURE, GUID_LOPART(ownerGuid), 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 oz = 0.f, oy = 0.f, ox = 0.f;
+
+ if (orientation)
+ {
+ oz = float(atof(orientation));
+ orientation = strtok(NULL, " ");
+ if (orientation)
+ {
+ oy = float(atof(orientation));
+ orientation = strtok(NULL, " ");
+ if (orientation)
+ ox = float(atof(orientation));
+ }
+ }
+ else
+ {
+ Player* player = handler->GetSession()->GetPlayer();
+ oz = player->GetOrientation();
+ }
+
+ object->SetWorldRotationAngles(oz, oy, ox);
+ object->DestroyForNearbyPlayers();
+ object->UpdateObjectVisibility();
+
+ object->SaveToDB();
+ object->Refresh();
+
+ handler->PSendSysMessage(LANG_COMMAND_TURNOBJMESSAGE, object->GetGUIDLow(), object->GetGOInfo()->name.c_str(), object->GetGUIDLow(), oz, oy, ox);
+
+ 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->GetMap()->GameObjectRelocation(object, 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->GetMap()->GameObjectRelocation(object, 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;
+ GameObject* gameObject = NULL;
+
+ if (!*args)
+ {
+ if (WorldObject* object = handler->getSelectedObject())
+ {
+ entry = object->GetEntry();
+ if (object->GetTypeId() == TYPEID_GAMEOBJECT)
+ gameObject = object->ToGameObject();
+ }
+ }
+ 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);
+ if (gameObject)
+ {
+ handler->PSendSysMessage("LootMode: %u", gameObject->GetLootMode());
+ handler->PSendSysMessage("LootState: %u", gameObject->getLootState());
+ handler->PSendSysMessage("GOState: %u", gameObject->GetGoState());
+ handler->PSendSysMessage("PhaseMask: %u", gameObject->GetPhaseMask());
+ handler->PSendSysMessage("IsLootEmpty: %u", gameObject->loot.empty());
+ handler->PSendSysMessage("IsLootLooted: %u", gameObject->loot.isLooted());
+ }
+
+ 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;
+
+ int32 guidLow = atoi(id);
+ if (!guidLow)
+ return false;
+
+ GameObject* object = NULL;
+
+ if (guidLow > 0)
+ {
+ if (GameObjectData const* gameObjectData = sObjectMgr->GetGOData(guidLow))
+ object = handler->GetObjectGlobalyWithGuidOrNearWithDbGuid(guidLow, gameObjectData->id);
+ }
+ else
+ object = handler->GetSession()->GetPlayer()->FindNearestGameObject(-guidLow, 30.0f);
+
+ if (!object)
+ {
+
+ handler->PSendSysMessage(LANG_COMMAND_OBJNOTFOUND, abs(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);
+ }
+ else if (objectType == 5)
+ object->SetUInt32Value(GAMEOBJECT_FLAGS, (uint32)(objectState));
+ else if (objectType == 6)
+ object->SetGoArtKit((uint32)(objectState));
+
+ handler->PSendSysMessage("Set gobject type %d state %d", objectType, objectState);
+ return true;
+ }
+};
+
+void AddSC_gobject_commandscript()
+{
+ new gobject_commandscript();
+}