AzerothCore 3.3.5a
OpenSource WoW Emulator
Loading...
Searching...
No Matches
gobject_commandscript Class Reference
Inheritance diagram for gobject_commandscript:
CommandScript ScriptObject

Public Member Functions

 gobject_commandscript ()
 
ChatCommandTable GetCommands () const override
 
- Public Member Functions inherited from ScriptObject
virtual bool IsDatabaseBound () const
 
virtual bool isAfterLoadScript () const
 
virtual void checkValidity ()
 
const std::string & GetName () const
 
uint16 GetTotalAvailableHooks ()
 

Static Public Member Functions

static bool HandleGameObjectActivateCommand (ChatHandler *handler, GameObjectSpawnId guidLow)
 
static bool HandleGameObjectAddCommand (ChatHandler *handler, GameObjectEntry objectId, Optional< int32 > spawnTimeSecs)
 
static bool HandleGameObjectLoadCommand (ChatHandler *handler, GameObjectSpawnId spawnId)
 
static bool HandleGameObjectAddTempCommand (ChatHandler *handler, GameObjectEntry objectId, Optional< uint64 > spawntime)
 
static bool HandleGameObjectTargetCommand (ChatHandler *handler, Optional< Variant< GameObjectEntry, std::string_view > > objectId)
 
static bool HandleGameObjectDeleteCommand (ChatHandler *handler, GameObjectSpawnId spawnId)
 
static bool HandleGameObjectTurnCommand (ChatHandler *handler, GameObjectSpawnId guidLow, Optional< float > oz, Optional< float > oy, Optional< float > ox)
 
static bool HandleGameObjectMoveCommand (ChatHandler *handler, GameObjectSpawnId guidLow, Optional< std::array< float, 3 > > xyz)
 
static bool HandleGameObjectSetPhaseCommand (ChatHandler *handler, GameObjectSpawnId guidLow, uint32 phaseMask)
 
static bool HandleGameObjectNearCommand (ChatHandler *handler, Optional< float > dist)
 
static bool HandleGameObjectInfoCommand (ChatHandler *handler, Optional< EXACT_SEQUENCE("guid")> isGuid, Variant< Hyperlink< gameobject_entry >, Hyperlink< gameobject >, uint32 > data)
 
static bool HandleGameObjectSetStateCommand (ChatHandler *handler, GameObjectSpawnId guidLow, int32 objectType, Optional< uint32 > objectState)
 
static bool HandleGameObjectRespawn (ChatHandler *handler, GameObjectSpawnId guidLow)
 

Additional Inherited Members

- Protected Member Functions inherited from CommandScript
 CommandScript (const char *name)
 
- Protected Member Functions inherited from ScriptObject
 ScriptObject (const char *name, uint16 totalAvailableHooks=0)
 
virtual ~ScriptObject ()=default
 

Detailed Description

Constructor & Destructor Documentation

◆ gobject_commandscript()

gobject_commandscript::gobject_commandscript ( )
inline
42: CommandScript("gobject_commandscript") { }
Definition CommandScript.h:25

Member Function Documentation

◆ GetCommands()

ChatCommandTable gobject_commandscript::GetCommands ( ) const
inlineoverridevirtual

Implements CommandScript.

45 {
46 static ChatCommandTable gobjectCommandTable =
47 {
48 { "activate", HandleGameObjectActivateCommand, SEC_GAMEMASTER, Console::No },
49 { "delete", HandleGameObjectDeleteCommand, SEC_ADMINISTRATOR, Console::No },
50 { "info", HandleGameObjectInfoCommand, SEC_MODERATOR, Console::No },
51 { "move", HandleGameObjectMoveCommand, SEC_ADMINISTRATOR, Console::No },
52 { "near", HandleGameObjectNearCommand, SEC_MODERATOR, Console::No },
53 { "target", HandleGameObjectTargetCommand, SEC_MODERATOR, Console::No },
54 { "turn", HandleGameObjectTurnCommand, SEC_ADMINISTRATOR, Console::No },
55 { "add temp", HandleGameObjectAddTempCommand, SEC_GAMEMASTER, Console::No },
56 { "add", HandleGameObjectAddCommand, SEC_ADMINISTRATOR, Console::No },
57 { "load", HandleGameObjectLoadCommand, SEC_ADMINISTRATOR, Console::Yes },
58 { "set phase", HandleGameObjectSetPhaseCommand, SEC_ADMINISTRATOR, Console::No },
59 { "set state", HandleGameObjectSetStateCommand, SEC_ADMINISTRATOR, Console::No },
60 { "respawn", HandleGameObjectRespawn, SEC_GAMEMASTER, Console::No }
61 };
62 static ChatCommandTable commandTable =
63 {
64 { "gobject", gobjectCommandTable }
65 };
66 return commandTable;
67 }
@ SEC_ADMINISTRATOR
Definition Common.h:60
@ SEC_GAMEMASTER
Definition Common.h:59
@ SEC_MODERATOR
Definition Common.h:58
static bool HandleGameObjectDeleteCommand(ChatHandler *handler, GameObjectSpawnId spawnId)
Definition cs_gobject.cpp:350
static bool HandleGameObjectTargetCommand(ChatHandler *handler, Optional< Variant< GameObjectEntry, std::string_view > > objectId)
Definition cs_gobject.cpp:236
static bool HandleGameObjectNearCommand(ChatHandler *handler, Optional< float > dist)
Definition cs_gobject.cpp:498
static bool HandleGameObjectLoadCommand(ChatHandler *handler, GameObjectSpawnId spawnId)
Definition cs_gobject.cpp:153
static bool HandleGameObjectInfoCommand(ChatHandler *handler, Optional< EXACT_SEQUENCE("guid")> isGuid, Variant< Hyperlink< gameobject_entry >, Hyperlink< gameobject >, uint32 > data)
Definition cs_gobject.cpp:581
static bool HandleGameObjectAddCommand(ChatHandler *handler, GameObjectEntry objectId, Optional< int32 > spawnTimeSecs)
Definition cs_gobject.cpp:90
static bool HandleGameObjectActivateCommand(ChatHandler *handler, GameObjectSpawnId guidLow)
Definition cs_gobject.cpp:69
static bool HandleGameObjectAddTempCommand(ChatHandler *handler, GameObjectEntry objectId, Optional< uint64 > spawntime)
Definition cs_gobject.cpp:212
static bool HandleGameObjectMoveCommand(ChatHandler *handler, GameObjectSpawnId guidLow, Optional< std::array< float, 3 > > xyz)
Definition cs_gobject.cpp:420
static bool HandleGameObjectTurnCommand(ChatHandler *handler, GameObjectSpawnId guidLow, Optional< float > oz, Optional< float > oy, Optional< float > ox)
Definition cs_gobject.cpp:382
static bool HandleGameObjectRespawn(ChatHandler *handler, GameObjectSpawnId guidLow)
Definition cs_gobject.cpp:678
static bool HandleGameObjectSetStateCommand(ChatHandler *handler, GameObjectSpawnId guidLow, int32 objectType, Optional< uint32 > objectState)
Definition cs_gobject.cpp:644
static bool HandleGameObjectSetPhaseCommand(ChatHandler *handler, GameObjectSpawnId guidLow, uint32 phaseMask)
Definition cs_gobject.cpp:475
std::vector< ChatCommandBuilder > ChatCommandTable
Definition ChatCommand.h:46

References HandleGameObjectActivateCommand(), HandleGameObjectAddCommand(), HandleGameObjectAddTempCommand(), HandleGameObjectDeleteCommand(), HandleGameObjectInfoCommand(), HandleGameObjectLoadCommand(), HandleGameObjectMoveCommand(), HandleGameObjectNearCommand(), HandleGameObjectRespawn(), HandleGameObjectSetPhaseCommand(), HandleGameObjectSetStateCommand(), HandleGameObjectTargetCommand(), HandleGameObjectTurnCommand(), SEC_ADMINISTRATOR, SEC_GAMEMASTER, and SEC_MODERATOR.

◆ HandleGameObjectActivateCommand()

static bool gobject_commandscript::HandleGameObjectActivateCommand ( ChatHandler handler,
GameObjectSpawnId  guidLow 
)
inlinestatic
70 {
71 GameObject* object = handler->GetObjectFromPlayerMapByDbGuid(guidLow);
72 if (!object)
73 {
75 return false;
76 }
77
78 uint32_t const autoCloseTime = object->GetGOInfo()->GetAutoCloseTime() ? 10000u : 0u;
79
80 // Activate
81 object->SetLootState(GO_READY);
82 object->UseDoorOrButton(autoCloseTime, false, handler->GetSession()->GetPlayer());
83
84 handler->PSendSysMessage("Object activated!");
85
86 return true;
87 }
std::uint32_t uint32
Definition Define.h:107
@ GO_READY
Definition GameObject.h:111
@ LANG_COMMAND_OBJNOTFOUND
Definition Language.h:323
void PSendSysMessage(std::string_view str, bool escapeCharacters=false)
Definition Chat.cpp:211
WorldSession * GetSession()
Definition Chat.h:242
void SendErrorMessage(uint32 entry)
Definition Chat.cpp:216
GameObject * GetObjectFromPlayerMapByDbGuid(ObjectGuid::LowType lowguid)
Definition Chat.cpp:597
Definition GameObject.h:120
Player * GetPlayer() const
Definition WorldSession.h:444

References ChatHandler::GetObjectFromPlayerMapByDbGuid(), WorldSession::GetPlayer(), ChatHandler::GetSession(), GO_READY, LANG_COMMAND_OBJNOTFOUND, ChatHandler::PSendSysMessage(), and ChatHandler::SendErrorMessage().

Referenced by GetCommands().

◆ HandleGameObjectAddCommand()

static bool gobject_commandscript::HandleGameObjectAddCommand ( ChatHandler handler,
GameObjectEntry  objectId,
Optional< int32 spawnTimeSecs 
)
inlinestatic
Todo:
is it really necessary to add both the real and DB table guid here ?
91 {
92 if (!objectId)
93 return false;
94
95 GameObjectTemplate const* objectInfo = sObjectMgr->GetGameObjectTemplate(objectId);
96 if (!objectInfo)
97 {
99 return false;
100 }
101
102 if (objectInfo->displayId && !sGameObjectDisplayInfoStore.LookupEntry(objectInfo->displayId))
103 {
104 // report to DB errors log as in loading case
105 LOG_ERROR("sql.sql", "Gameobject (Entry {} GoType: {}) have invalid displayId ({}), not spawned.", *objectId, objectInfo->type, objectInfo->displayId);
107 return false;
108 }
109
110 Player* player = handler->GetSession()->GetPlayer();
111 float x = float(player->GetPositionX());
112 float y = float(player->GetPositionY());
113 float z = float(player->GetPositionZ());
114 float o = float(player->GetOrientation());
115 Map* map = player->GetMap();
116
117 GameObject* object = sObjectMgr->IsGameObjectStaticTransport(objectInfo->entry) ? new StaticTransport() : new GameObject();
119
120 G3D::Quat rotation = G3D::Quat::fromAxisAngleRotation(G3D::Vector3::unitZ(), o);
121 if (!object->Create(guidLow, objectInfo->entry, map, player->GetPhaseMaskForSpawn(), x, y, z, o, rotation, 0, GO_STATE_READY))
122 {
123 delete object;
124 return false;
125 }
126
127 if (spawnTimeSecs)
128 object->SetRespawnTime(*spawnTimeSecs);
129
130 // fill the gameobject data and save to the db
131 object->SaveToDB(map->GetId(), (1 << map->GetSpawnMode()), player->GetPhaseMaskForSpawn());
132 guidLow = object->GetSpawnId();
133
134 // delete the old object and do a clean load from DB with a fresh new GameObject instance.
135 // this is required to avoid weird behavior and memory leaks
136 delete object;
137
138 object = sObjectMgr->IsGameObjectStaticTransport(objectInfo->entry) ? new StaticTransport() : new GameObject();
139 // this will generate a new guid if the object is in an instance
140 if (!object->LoadGameObjectFromDB(guidLow, map, true))
141 {
142 delete object;
143 return false;
144 }
145
147 sObjectMgr->AddGameobjectToGrid(guidLow, sObjectMgr->GetGameObjectData(guidLow));
148
149 handler->PSendSysMessage(LANG_GAMEOBJECT_ADD, uint32(objectId), objectInfo->name, guidLow, player->GetPositionX(), player->GetPositionY(), player->GetPositionZ());
150 return true;
151 }
DBCStorage< GameObjectDisplayInfoEntry > sGameObjectDisplayInfoStore(GameObjectDisplayInfofmt)
@ GO_STATE_READY
Definition GameObjectData.h:709
@ LANG_GAMEOBJECT_HAVE_INVALID_DATA
Definition Language.h:395
@ LANG_GAMEOBJECT_NOT_EXIST
Definition Language.h:572
@ LANG_GAMEOBJECT_ADD
Definition Language.h:576
#define LOG_ERROR(filterType__,...)
Definition Log.h:158
#define sObjectMgr
Definition ObjectMgr.h:1712
virtual bool Create(ObjectGuid::LowType guidlow, uint32 name_id, Map *map, uint32 phaseMask, float x, float y, float z, float ang, G3D::Quat const &rotation, uint32 animprogress, GOState go_state, uint32 artKit=0)
Definition GameObject.cpp:270
void SetRespawnTime(int32 respawn)
Definition GameObject.cpp:1279
virtual bool LoadGameObjectFromDB(ObjectGuid::LowType guid, Map *map, bool addToMap=true)
Definition GameObject.cpp:1099
Definition Map.h:164
uint8 GetSpawnMode() const
Definition Map.h:267
ObjectGuid::LowType GenerateLowGuid()
Definition Map.h:480
uint32 GetId() const
Definition Map.h:230
uint32 LowType
Definition ObjectGuid.h:122
Definition Player.h:1084
uint32 GetPhaseMaskForSpawn() const
Definition Player.cpp:13794
Definition Transport.h:115
Map * GetMap() const
Definition Object.h:625
Definition GameObjectData.h:32
uint32 type
Definition GameObjectData.h:34
uint32 entry
Definition GameObjectData.h:33
std::string name
Definition GameObjectData.h:36
uint32 displayId
Definition GameObjectData.h:35
float GetPositionZ() const
Definition Position.h:123
float GetOrientation() const
Definition Position.h:124
float GetPositionX() const
Definition Position.h:121
float GetPositionY() const
Definition Position.h:122

References GameObject::Create(), GameObjectTemplate::displayId, GameObjectTemplate::entry, GameObject, Map::GenerateLowGuid(), Map::GetId(), WorldObject::GetMap(), Position::GetOrientation(), Player::GetPhaseMaskForSpawn(), WorldSession::GetPlayer(), Position::GetPositionX(), Position::GetPositionY(), Position::GetPositionZ(), ChatHandler::GetSession(), Map::GetSpawnMode(), GO_STATE_READY, LANG_GAMEOBJECT_ADD, LANG_GAMEOBJECT_HAVE_INVALID_DATA, LANG_GAMEOBJECT_NOT_EXIST, GameObject::LoadGameObjectFromDB(), LOG_ERROR, GameObjectTemplate::name, ChatHandler::PSendSysMessage(), ChatHandler::SendErrorMessage(), GameObject::SetRespawnTime(), sGameObjectDisplayInfoStore, sObjectMgr, and GameObjectTemplate::type.

Referenced by GetCommands().

◆ HandleGameObjectAddTempCommand()

static bool gobject_commandscript::HandleGameObjectAddTempCommand ( ChatHandler handler,
GameObjectEntry  objectId,
Optional< uint64 spawntime 
)
inlinestatic
213 {
214 Player* player = handler->GetSession()->GetPlayer();
215 uint64 spawntm(spawntime.value_or(300));
216
217 if (!sObjectMgr->GetGameObjectTemplate(objectId))
218 {
220 return false;
221 }
222
223 float x = player->GetPositionX();
224 float y = player->GetPositionY();
225 float z = player->GetPositionZ();
226 float ang = player->GetOrientation();
227
228 float rot2 = std::sin(ang / 2);
229 float rot3 = cos(ang / 2);
230
231 player->SummonGameObject(objectId, x, y, z, ang, 0, 0, rot2, rot3, spawntm);
232
233 return true;
234 }
std::uint64_t uint64
Definition Define.h:106
GameObject * SummonGameObject(uint32 entry, float x, float y, float z, float ang, float rotation0, float rotation1, float rotation2, float rotation3, uint32 respawnTime, bool checkTransport=true, GOSummonType summonType=GO_SUMMON_TIMED_OR_CORPSE_DESPAWN)
Definition Object.cpp:2408

References Position::GetOrientation(), WorldSession::GetPlayer(), Position::GetPositionX(), Position::GetPositionY(), Position::GetPositionZ(), ChatHandler::GetSession(), LANG_GAMEOBJECT_NOT_EXIST, ChatHandler::SendErrorMessage(), sObjectMgr, and WorldObject::SummonGameObject().

Referenced by GetCommands().

◆ HandleGameObjectDeleteCommand()

static bool gobject_commandscript::HandleGameObjectDeleteCommand ( ChatHandler handler,
GameObjectSpawnId  spawnId 
)
inlinestatic
351 {
352 GameObject* object = handler->GetObjectFromPlayerMapByDbGuid(spawnId);
353 if (!object)
354 {
356 return false;
357 }
358
359 ObjectGuid ownerGuid = object->GetOwnerGUID();
360 if (ownerGuid)
361 {
362 Unit* owner = ObjectAccessor::GetUnit(*handler->GetSession()->GetPlayer(), ownerGuid);
363 if (!owner || !ownerGuid.IsPlayer())
364 {
366 return false;
367 }
368
369 owner->RemoveGameObject(object, false);
370 }
371
372 object->SetRespawnTime(0); // not save respawn time
373 object->Delete();
374 object->DeleteFromDB();
375
377
378 return true;
379 }
@ LANG_COMMAND_DELOBJMESSAGE
Definition Language.h:325
@ LANG_COMMAND_DELOBJREFERCREATURE
Definition Language.h:324
ObjectGuid::LowType GetSpawnId() const
Definition GameObject.h:144
Definition ObjectGuid.h:118
bool IsPlayer() const
Definition ObjectGuid.h:168
std::string ToString() const
Definition ObjectGuid.cpp:47
Definition Unit.h:664
void RemoveGameObject(GameObject *gameObj, bool del)
Definition Unit.cpp:6566
Unit * GetUnit(WorldObject const &, ObjectGuid const &guid)
Definition ObjectAccessor.cpp:199

References ChatHandler::GetObjectFromPlayerMapByDbGuid(), WorldSession::GetPlayer(), ChatHandler::GetSession(), GameObject::GetSpawnId(), ObjectAccessor::GetUnit(), ObjectGuid::IsPlayer(), LANG_COMMAND_DELOBJMESSAGE, LANG_COMMAND_DELOBJREFERCREATURE, LANG_COMMAND_OBJNOTFOUND, ChatHandler::PSendSysMessage(), Unit::RemoveGameObject(), ChatHandler::SendErrorMessage(), and ObjectGuid::ToString().

Referenced by GetCommands().

◆ HandleGameObjectInfoCommand()

static bool gobject_commandscript::HandleGameObjectInfoCommand ( ChatHandler handler,
Optional< EXACT_SEQUENCE("guid")>  isGuid,
Variant< Hyperlink< gameobject_entry >, Hyperlink< gameobject >, uint32 data 
)
inlinestatic
582 {
583 uint32 entry = 0;
584 uint32 type = 0;
585 uint32 displayId = 0;
586 std::string name;
587 uint32 lootId = 0;
588 GameObject* gameObject = nullptr;
589
590 ObjectGuid::LowType spawnId = 0;
591 if (isGuid || data.holds_alternative<Hyperlink<gameobject>>())
592 {
593 spawnId = *data;
594 GameObjectData const* spawnData = sObjectMgr->GetGameObjectData(spawnId);
595 if (!spawnData)
596 {
598 return false;
599 }
600 entry = spawnData->id;
601 gameObject = handler->GetObjectFromPlayerMapByDbGuid(spawnId);
602 }
603 else
604 {
605 entry = *data;
606 }
607
608 GameObjectTemplate const* gameObjectInfo = sObjectMgr->GetGameObjectTemplate(entry);
609 if (!gameObjectInfo)
610 {
612 return false;
613 }
614
615 type = gameObjectInfo->type;
616 displayId = gameObjectInfo->displayId;
617 name = gameObjectInfo->name;
618 if (type == GAMEOBJECT_TYPE_CHEST)
619 lootId = gameObjectInfo->chest.lootId;
620 else if (type == GAMEOBJECT_TYPE_FISHINGHOLE)
621 lootId = gameObjectInfo->fishinghole.lootId;
622
623 handler->PSendSysMessage(LANG_GOINFO_ENTRY, entry);
624 if (gameObject)
625 handler->PSendSysMessage("GUID: {}", gameObject->GetGUID().ToString());
626 handler->PSendSysMessage(LANG_GOINFO_TYPE, type);
627 handler->PSendSysMessage(LANG_GOINFO_LOOTID, lootId);
628 handler->PSendSysMessage(LANG_GOINFO_DISPLAYID, displayId);
629 if (gameObject)
630 {
631 handler->PSendSysMessage("LootMode: {}", gameObject->GetLootMode());
632 handler->PSendSysMessage("LootState: {}", gameObject->getLootState());
633 handler->PSendSysMessage("GOState: {}", gameObject->GetGoState());
634 handler->PSendSysMessage("PhaseMask: {}", gameObject->GetPhaseMask());
635 handler->PSendSysMessage("IsLootEmpty: {}", gameObject->loot.empty());
636 handler->PSendSysMessage("IsLootLooted: {}", gameObject->loot.isLooted());
637 }
638
639 handler->PSendSysMessage(LANG_GOINFO_NAME, name);
640
641 return true;
642 }
@ LANG_GOINFO_NAME
Definition Language.h:1086
@ LANG_GOINFO_DISPLAYID
Definition Language.h:1085
@ LANG_GOINFO_ENTRY
Definition Language.h:1083
@ LANG_GOINFO_LOOTID
Definition Language.h:1087
@ LANG_GOINFO_TYPE
Definition Language.h:1084
@ GAMEOBJECT_TYPE_CHEST
Definition SharedDefines.h:1569
@ GAMEOBJECT_TYPE_FISHINGHOLE
Definition SharedDefines.h:1591
Loot loot
Definition GameObject.h:246
GOState GetGoState() const
Definition GameObject.h:204
LootState getLootState() const
Definition GameObject.h:223
uint16 GetLootMode() const
Definition GameObject.h:227
static ObjectGuid GetGUID(Object const *o)
Definition Object.h:114
uint32 GetPhaseMask() const
Definition Object.h:516
constexpr bool holds_alternative() const
Definition ChatCommandTags.h:298
Definition GameObjectData.h:715
uint32 id
Definition GameObjectData.h:717
uint32 lootId
Definition GameObjectData.h:85
struct GameObjectTemplate::@234::@255 fishinghole
struct GameObjectTemplate::@234::@239 chest
bool empty() const
Definition LootMgr.h:367
bool isLooted() const
Definition LootMgr.h:368

References GameObjectTemplate::chest, GameObjectTemplate::displayId, Loot::empty(), GameObjectTemplate::fishinghole, GAMEOBJECT_TYPE_CHEST, GAMEOBJECT_TYPE_FISHINGHOLE, GameObject::GetGoState(), Object::GetGUID(), GameObject::GetLootMode(), GameObject::getLootState(), ChatHandler::GetObjectFromPlayerMapByDbGuid(), WorldObject::GetPhaseMask(), GameObjectData::id, Loot::isLooted(), LANG_COMMAND_OBJNOTFOUND, LANG_GAMEOBJECT_NOT_EXIST, LANG_GOINFO_DISPLAYID, LANG_GOINFO_ENTRY, LANG_GOINFO_LOOTID, LANG_GOINFO_NAME, LANG_GOINFO_TYPE, GameObject::loot, GameObjectTemplate::lootId, GameObjectTemplate::name, ChatHandler::PSendSysMessage(), ChatHandler::SendErrorMessage(), sObjectMgr, ObjectGuid::ToString(), and GameObjectTemplate::type.

Referenced by GetCommands().

◆ HandleGameObjectLoadCommand()

static bool gobject_commandscript::HandleGameObjectLoadCommand ( ChatHandler handler,
GameObjectSpawnId  spawnId 
)
inlinestatic
154 {
155 if (!spawnId)
156 return false;
157
158 if (sObjectMgr->GetGameObjectData(spawnId))
159 {
160 handler->SendErrorMessage("Gameobject spawn {} is already loaded.", uint32(spawnId));
161 return false;
162 }
163
164 GameObjectData const* data = sObjectMgr->LoadGameObjectDataFromDB(spawnId);
165 if (!data)
166 {
167 handler->SendErrorMessage("Gameobject spawn {} not found in the database.", uint32(spawnId));
168 return false;
169 }
170
171 if (sPoolMgr->IsPartOfAPool<GameObject>(spawnId))
172 {
173 handler->SendErrorMessage("Gameobject spawn {} is part of a pool and cannot be manually loaded.", uint32(spawnId));
174 return false;
175 }
176
177 QueryResult eventResult = WorldDatabase.Query("SELECT guid FROM game_event_gameobject WHERE guid = {}", uint32(spawnId));
178 if (eventResult)
179 {
180 handler->SendErrorMessage("Gameobject spawn {} is managed by the game event system and cannot be manually loaded.", uint32(spawnId));
181 return false;
182 }
183
184 Map* map = sMapMgr->FindBaseNonInstanceMap(data->mapid);
185 if (!map)
186 {
187 handler->SendErrorMessage("Gameobject spawn {} is on a non-continent map (ID: {}). Only continent maps are supported.", uint32(spawnId), data->mapid);
188 return false;
189 }
190
191 GameObjectTemplate const* objectInfo = sObjectMgr->GetGameObjectTemplate(data->id);
192 if (!objectInfo)
193 {
194 handler->SendErrorMessage("Gameobject template not found for entry {}.", data->id);
195 return false;
196 }
197
198 GameObject* object = sObjectMgr->IsGameObjectStaticTransport(objectInfo->entry) ? new StaticTransport() : new GameObject();
199 if (!object->LoadGameObjectFromDB(spawnId, map, true))
200 {
201 delete object;
202 handler->SendErrorMessage("Failed to load gameobject spawn {}.", uint32(spawnId));
203 return false;
204 }
205
206 sObjectMgr->AddGameobjectToGrid(spawnId, data);
207 handler->PSendSysMessage("Gameobject spawn {} loaded successfully.", uint32(spawnId));
208 return true;
209 }
std::shared_ptr< ResultSet > QueryResult
Definition DatabaseEnvFwd.h:27
DatabaseWorkerPool< WorldDatabaseConnection > WorldDatabase
Accessor to the world database.
Definition DatabaseEnv.cpp:20
#define sMapMgr
Definition MapMgr.h:220
#define sPoolMgr
Definition PoolMgr.h:165
uint16 mapid
Definition SpawnData.h:64

References GameObjectTemplate::entry, GameObjectData::id, GameObject::LoadGameObjectFromDB(), SpawnData::mapid, ChatHandler::PSendSysMessage(), ChatHandler::SendErrorMessage(), sMapMgr, sObjectMgr, sPoolMgr, and WorldDatabase.

Referenced by GetCommands().

◆ HandleGameObjectMoveCommand()

static bool gobject_commandscript::HandleGameObjectMoveCommand ( ChatHandler handler,
GameObjectSpawnId  guidLow,
Optional< std::array< float, 3 > >  xyz 
)
inlinestatic
421 {
422 if (!guidLow)
423 return false;
424
425 GameObject* object = handler->GetObjectFromPlayerMapByDbGuid(guidLow);
426 if (!object)
427 {
429 return false;
430 }
431
432 Position pos;
433 if (xyz)
434 {
435 pos = { (*xyz)[0], (*xyz)[1], (*xyz)[2] };
436 if (!MapMgr::IsValidMapCoord(object->GetMapId(), pos))
437 {
439 return false;
440 }
441 }
442 else
443 {
444 pos = handler->GetSession()->GetPlayer()->GetPosition();
445 }
446
447 Map* map = object->GetMap();
448
449 pos.SetOrientation(object->GetOrientation());
450 object->Relocate(pos);
451
452 // update which cell has this gameobject registered for loading
453 sObjectMgr->RemoveGameobjectFromGrid(guidLow, object->GetGameObjectData());
454 object->SaveToDB();
455 sObjectMgr->AddGameobjectToGrid(guidLow, object->GetGameObjectData());
456
457 // Generate a completely new spawn with new guid
458 // 3.3.5a client caches recently deleted objects and brings them back to life
459 // when CreateObject block for this guid is received again
460 // however it entirely skips parsing that block and only uses already known location
461 object->Delete();
462
463 object = new GameObject();
464 if (!object->LoadGameObjectFromDB(guidLow, map, true))
465 {
466 delete object;
467 return false;
468 }
469
470 handler->PSendSysMessage(LANG_COMMAND_MOVEOBJMESSAGE, object->GetSpawnId(), object->GetGOInfo()->name, object->GetSpawnId());
471 return true;
472 }
@ LANG_COMMAND_MOVEOBJMESSAGE
Definition Language.h:327
@ LANG_INVALID_TARGET_COORD
Definition Language.h:313
GameObjectTemplate const * GetGOInfo() const
Definition GameObject.h:136
GameObjectData const * GetGameObjectData() const
Definition GameObject.h:138
static bool IsValidMapCoord(uint32 mapid, Position const &pos)
Definition MapMgr.h:90
uint32 GetMapId() const
Definition Position.h:281
Definition Position.h:27
void SetOrientation(float orientation)
Definition Position.h:116
void GetPosition(float &x, float &y) const
Definition Position.h:126

References GameObject::GetGameObjectData(), GameObject::GetGOInfo(), WorldLocation::GetMapId(), ChatHandler::GetObjectFromPlayerMapByDbGuid(), Position::GetOrientation(), WorldSession::GetPlayer(), Position::GetPosition(), Position::GetPositionX(), Position::GetPositionY(), ChatHandler::GetSession(), GameObject::GetSpawnId(), MapMgr::IsValidMapCoord(), LANG_COMMAND_MOVEOBJMESSAGE, LANG_COMMAND_OBJNOTFOUND, LANG_INVALID_TARGET_COORD, GameObject::LoadGameObjectFromDB(), GameObjectTemplate::name, ChatHandler::PSendSysMessage(), ChatHandler::SendErrorMessage(), Position::SetOrientation(), and sObjectMgr.

Referenced by GetCommands().

◆ HandleGameObjectNearCommand()

static bool gobject_commandscript::HandleGameObjectNearCommand ( ChatHandler handler,
Optional< float >  dist 
)
inlinestatic
499 {
500 float distance = dist.value_or(10.0f);
501 uint32 count = 0;
502
503 Player* player = handler->GetSession()->GetPlayer();
504
505 // Grid search - finds all game objects including temporary spawns
506 std::list<GameObject*> gameobjects;
507 Acore::GameObjectInRangeCheck check(player->GetPositionX(), player->GetPositionY(), player->GetPositionZ(), distance);
508 Acore::GameObjectListSearcher<Acore::GameObjectInRangeCheck> searcher(player, gameobjects, check);
509 Cell::VisitObjects(player, searcher, distance);
510
511 std::unordered_set<ObjectGuid::LowType> gridSpawnIds;
512
513 for (GameObject* go : gameobjects)
514 {
515 GameObjectTemplate const* gameObjectInfo = sObjectMgr->GetGameObjectTemplate(go->GetEntry());
516 if (!gameObjectInfo)
517 continue;
518
519 handler->PSendSysMessage(LANG_GO_LIST_CHAT, go->GetSpawnId(), go->GetEntry(),
520 go->GetSpawnId(), gameObjectInfo->name,
521 go->GetPositionX(), go->GetPositionY(), go->GetPositionZ(),
522 go->GetMapId(), "", "");
523
524 if (go->GetSpawnId())
525 gridSpawnIds.insert(go->GetSpawnId());
526 ++count;
527 }
528
529 if (count > 0 && distance <= SIZE_OF_GRIDS)
530 {
531 handler->PSendSysMessage(LANG_COMMAND_NEAROBJMESSAGE, distance, count);
532 return true;
533 }
534
535 // Fallback to DB query
537 stmt->SetData(0, player->GetPositionX());
538 stmt->SetData(1, player->GetPositionY());
539 stmt->SetData(2, player->GetPositionZ());
540 stmt->SetData(3, player->GetMapId());
541 stmt->SetData(4, player->GetPositionX());
542 stmt->SetData(5, player->GetPositionY());
543 stmt->SetData(6, player->GetPositionZ());
544 stmt->SetData(7, distance * distance);
545 stmt->SetData(8, player->GetPhaseMask());
546 PreparedQueryResult result = WorldDatabase.Query(stmt);
547
548 if (result)
549 {
550 do
551 {
552 Field* fields = result->Fetch();
553 ObjectGuid::LowType guid = fields[0].Get<uint32>();
554
555 // Skip entries already emitted via grid search
556 if (gridSpawnIds.count(guid))
557 continue;
558
559 uint32 entry = fields[1].Get<uint32>();
560 float x = fields[2].Get<float>();
561 float y = fields[3].Get<float>();
562 float z = fields[4].Get<float>();
563 uint16 mapId = fields[5].Get<uint16>();
564
565 GameObjectTemplate const* gameObjectInfo = sObjectMgr->GetGameObjectTemplate(entry);
566
567 if (!gameObjectInfo)
568 continue;
569
570 handler->PSendSysMessage(LANG_GO_LIST_CHAT, guid, entry, guid, gameObjectInfo->name, x, y, z, mapId, "", "");
571
572 ++count;
573 } while (result->NextRow());
574 }
575
576 handler->PSendSysMessage(LANG_COMMAND_NEAROBJMESSAGE, distance, count);
577 return true;
578 }
std::shared_ptr< PreparedResultSet > PreparedQueryResult
Definition DatabaseEnvFwd.h:45
std::uint16_t uint16
Definition Define.h:108
@ LANG_GO_LIST_CHAT
Definition Language.h:566
@ LANG_COMMAND_NEAROBJMESSAGE
Definition Language.h:646
#define SIZE_OF_GRIDS
Definition MapDefines.h:26
@ WORLD_SEL_GAMEOBJECT_NEAREST
Definition WorldDatabase.h:89
Definition GridNotifiers.h:1600
Class used to access individual fields of database query result.
Definition Field.h:98
std::enable_if_t< std::is_arithmetic_v< T >, T > Get() const
Definition Field.h:112
Acore::Types::is_default< T > SetData(const uint8 index, T value)
Definition PreparedStatement.h:77
Definition PreparedStatement.h:157
Definition GridNotifiers.h:341
static void VisitObjects(WorldObject const *obj, T &visitor, float radius)
Definition CellImpl.h:165

References Field::Get(), WorldLocation::GetMapId(), WorldObject::GetPhaseMask(), WorldSession::GetPlayer(), Position::GetPositionX(), Position::GetPositionY(), Position::GetPositionZ(), ChatHandler::GetSession(), LANG_COMMAND_NEAROBJMESSAGE, LANG_GO_LIST_CHAT, GameObjectTemplate::name, ChatHandler::PSendSysMessage(), PreparedStatementBase::SetData(), SIZE_OF_GRIDS, sObjectMgr, Cell::VisitObjects(), WORLD_SEL_GAMEOBJECT_NEAREST, and WorldDatabase.

Referenced by GetCommands().

◆ HandleGameObjectRespawn()

static bool gobject_commandscript::HandleGameObjectRespawn ( ChatHandler handler,
GameObjectSpawnId  guidLow 
)
inlinestatic
679 {
680 GameObject* object = handler->GetObjectFromPlayerMapByDbGuid(guidLow);
681 if (!object)
682 {
684 return false;
685 }
686
687 object->Respawn();
688 handler->PSendSysMessage(LANG_CMD_GO_RESPAWN, object->GetNameForLocaleIdx(handler->GetSessionDbcLocale()), object->GetEntry(), object->GetSpawnId());
689 return true;
690 }
@ LANG_CMD_GO_RESPAWN
Definition Language.h:1158
virtual LocaleConstant GetSessionDbcLocale() const
Definition Chat.cpp:870
std::string const & GetNameForLocaleIdx(LocaleConstant locale_idx) const override
Definition GameObject.cpp:2219
uint32 GetEntry() const
Definition Object.h:117

References Object::GetEntry(), GameObject::GetNameForLocaleIdx(), ChatHandler::GetObjectFromPlayerMapByDbGuid(), ChatHandler::GetSessionDbcLocale(), GameObject::GetSpawnId(), LANG_CMD_GO_RESPAWN, LANG_COMMAND_OBJNOTFOUND, ChatHandler::PSendSysMessage(), and ChatHandler::SendErrorMessage().

Referenced by GetCommands().

◆ HandleGameObjectSetPhaseCommand()

static bool gobject_commandscript::HandleGameObjectSetPhaseCommand ( ChatHandler handler,
GameObjectSpawnId  guidLow,
uint32  phaseMask 
)
inlinestatic
476 {
477 if (!guidLow)
478 return false;
479
480 GameObject* object = handler->GetObjectFromPlayerMapByDbGuid(guidLow);
481 if (!object)
482 {
484 return false;
485 }
486
487 if (!phaseMask)
488 {
490 return false;
491 }
492
493 object->SetPhaseMask(phaseMask, true);
494 object->SaveToDB();
495 return true;
496 }
@ LANG_BAD_VALUE
Definition Language.h:148

References ChatHandler::GetObjectFromPlayerMapByDbGuid(), LANG_BAD_VALUE, LANG_COMMAND_OBJNOTFOUND, and ChatHandler::SendErrorMessage().

Referenced by GetCommands().

◆ HandleGameObjectSetStateCommand()

static bool gobject_commandscript::HandleGameObjectSetStateCommand ( ChatHandler handler,
GameObjectSpawnId  guidLow,
int32  objectType,
Optional< uint32 objectState 
)
inlinestatic
645 {
646 if (!guidLow)
647 return false;
648
649 GameObject* object = handler->GetObjectFromPlayerMapByDbGuid(guidLow);
650 if (!object)
651 {
653 return false;
654 }
655
656 if (objectType < 0)
657 {
658 if (objectType == -1)
659 object->SendObjectDeSpawnAnim(object->GetGUID());
660 else if (objectType == -2)
661 return false;
662 return true;
663 }
664
665 if (!objectState)
666 return false;
667
668 if (objectType < 4)
669 object->SetByteValue(GAMEOBJECT_BYTES_1, objectType, *objectState);
670 else if (objectType == 4)
671 {
672 object->SendCustomAnim(*objectState);
673 }
674 handler->PSendSysMessage("Set gobject type {} state {}", objectType, *objectState);
675 return true;
676 }
@ GAMEOBJECT_BYTES_1
Definition UpdateFields.h:404

References GAMEOBJECT_BYTES_1, Object::GetGUID(), ChatHandler::GetObjectFromPlayerMapByDbGuid(), LANG_COMMAND_OBJNOTFOUND, ChatHandler::PSendSysMessage(), and ChatHandler::SendErrorMessage().

Referenced by GetCommands().

◆ HandleGameObjectTargetCommand()

static bool gobject_commandscript::HandleGameObjectTargetCommand ( ChatHandler handler,
Optional< Variant< GameObjectEntry, std::string_view > >  objectId 
)
inlinestatic
237 {
238 Player* player = handler->GetSession()->GetPlayer();
239 QueryResult result;
240 GameEventMgr::ActiveEvents const& activeEventsList = sGameEventMgr->GetActiveEventList();
241
242 if (objectId)
243 {
244 if (objectId->holds_alternative<GameObjectEntry>())
245 {
246 result = WorldDatabase.Query("SELECT guid, id, position_x, position_y, position_z, orientation, map, phaseMask, (POW(position_x - '{}', 2) + POW(position_y - '{}', 2) + POW(position_z - '{}', 2)) AS order_ FROM gameobject WHERE map = '{}' AND id = '{}' ORDER BY order_ ASC LIMIT 1",
247 player->GetPositionX(), player->GetPositionY(), player->GetPositionZ(), player->GetMapId(), static_cast<uint32>(objectId->get<GameObjectEntry>()));
248 }
249 else
250 {
251 std::string name = std::string(objectId->get<std::string_view>());
252 WorldDatabase.EscapeString(name);
253 result = WorldDatabase.Query(
254 "SELECT guid, id, position_x, position_y, position_z, orientation, map, phaseMask, (POW(position_x - {}, 2) + POW(position_y - {}, 2) + POW(position_z - {}, 2)) AS order_ "
255 "FROM gameobject LEFT JOIN gameobject_template ON gameobject_template.entry = gameobject.id WHERE map = {} AND name LIKE '%{}%' ORDER BY order_ ASC LIMIT 1",
256 player->GetPositionX(), player->GetPositionY(), player->GetPositionZ(), player->GetMapId(), name);
257 }
258 }
259 else
260 {
261 std::ostringstream eventFilter;
262 eventFilter << " AND (eventEntry IS NULL ";
263 bool initString = true;
264
265 for (GameEventMgr::ActiveEvents::const_iterator itr = activeEventsList.begin(); itr != activeEventsList.end(); ++itr)
266 {
267 if (initString)
268 {
269 eventFilter << "OR eventEntry IN (" << *itr;
270 initString = false;
271 }
272 else
273 eventFilter << ',' << *itr;
274 }
275
276 if (!initString)
277 eventFilter << "))";
278 else
279 eventFilter << ')';
280
281 result = WorldDatabase.Query("SELECT gameobject.guid, id, position_x, position_y, position_z, orientation, map, phaseMask, "
282 "(POW(position_x - {}, 2) + POW(position_y - {}, 2) + POW(position_z - {}, 2)) AS order_ FROM gameobject "
283 "LEFT OUTER JOIN game_event_gameobject on gameobject.guid = game_event_gameobject.guid WHERE map = '{}' {} ORDER BY order_ ASC LIMIT 10",
284 handler->GetSession()->GetPlayer()->GetPositionX(), handler->GetSession()->GetPlayer()->GetPositionY(), handler->GetSession()->GetPlayer()->GetPositionZ(),
285 handler->GetSession()->GetPlayer()->GetMapId(), eventFilter.str());
286 }
287
288 if (!result)
289 {
291 return true;
292 }
293
294 bool found = false;
295 float x, y, z, o;
296 ObjectGuid::LowType guidLow;
297 uint32 id, phase;
298 uint16 mapId;
299 uint32 poolId;
300
301 do
302 {
303 Field* fields = result->Fetch();
304 guidLow = fields[0].Get<uint32>();
305 id = fields[1].Get<uint32>();
306 x = fields[2].Get<float>();
307 y = fields[3].Get<float>();
308 z = fields[4].Get<float>();
309 o = fields[5].Get<float>();
310 mapId = fields[6].Get<uint16>();
311 phase = fields[7].Get<uint32>();
312 poolId = sPoolMgr->IsPartOfAPool<GameObject>(guidLow);
313 if (!poolId || sPoolMgr->IsSpawnedObject<GameObject>(guidLow))
314 found = true;
315 } while (result->NextRow() && !found);
316
317 if (!found)
318 {
320 return false;
321 }
322
323 GameObjectTemplate const* objectInfo = sObjectMgr->GetGameObjectTemplate(id);
324
325 if (!objectInfo)
326 {
328 return false;
329 }
330
331 GameObject* target = handler->GetObjectFromPlayerMapByDbGuid(guidLow);
332
333 handler->PSendSysMessage(LANG_GAMEOBJECT_DETAIL, guidLow, objectInfo->name, guidLow, id, x, y, z, mapId, o, phase);
334
335 if (target)
336 {
337 int32 curRespawnDelay = int32(target->GetRespawnTimeEx() - GameTime::GetGameTime().count());
338 if (curRespawnDelay < 0)
339 curRespawnDelay = 0;
340
341 std::string curRespawnDelayStr = secsToTimeString(curRespawnDelay, true);
342 std::string defRespawnDelayStr = secsToTimeString(target->GetRespawnDelay(), true);
343
344 handler->PSendSysMessage(LANG_COMMAND_RAWPAWNTIMES, defRespawnDelayStr, curRespawnDelayStr);
345 }
346 return true;
347 }
std::int32_t int32
Definition Define.h:103
#define sGameEventMgr
Definition GameEventMgr.h:201
@ LANG_GAMEOBJECT_DETAIL
Definition Language.h:575
@ LANG_COMMAND_TARGETOBJNOTFOUND
Definition Language.h:316
@ LANG_COMMAND_RAWPAWNTIMES
Definition Language.h:647
std::string secsToTimeString(uint64 timeInSecs, bool shortText)
Definition Util.cpp:73
virtual void SendSysMessage(std::string_view str, bool escapeCharacters=false)
Definition Chat.cpp:160
std::set< uint16 > ActiveEvents
Definition GameEventMgr.h:106
uint32 GetRespawnDelay() const
Definition GameObject.h:197
time_t GetRespawnTimeEx() const
Definition GameObject.cpp:2938
Seconds GetGameTime()
Definition GameTime.cpp:38
Definition ChatCommandTags.h:253

References Field::Get(), GameTime::GetGameTime(), WorldLocation::GetMapId(), ChatHandler::GetObjectFromPlayerMapByDbGuid(), WorldSession::GetPlayer(), Position::GetPositionX(), Position::GetPositionY(), Position::GetPositionZ(), GameObject::GetRespawnDelay(), GameObject::GetRespawnTimeEx(), ChatHandler::GetSession(), LANG_COMMAND_RAWPAWNTIMES, LANG_COMMAND_TARGETOBJNOTFOUND, LANG_GAMEOBJECT_DETAIL, LANG_GAMEOBJECT_NOT_EXIST, GameObjectTemplate::name, ChatHandler::PSendSysMessage(), secsToTimeString(), ChatHandler::SendSysMessage(), sGameEventMgr, sObjectMgr, sPoolMgr, and WorldDatabase.

Referenced by GetCommands().

◆ HandleGameObjectTurnCommand()

static bool gobject_commandscript::HandleGameObjectTurnCommand ( ChatHandler handler,
GameObjectSpawnId  guidLow,
Optional< float >  oz,
Optional< float >  oy,
Optional< float >  ox 
)
inlinestatic
383 {
384 if (!guidLow)
385 return false;
386
387 GameObject* object = handler->GetObjectFromPlayerMapByDbGuid(guidLow);
388 if (!object)
389 {
391 return false;
392 }
393
394 if (!oz)
395 oz = handler->GetSession()->GetPlayer()->GetOrientation();
396
397 Map* map = object->GetMap();
398 object->Relocate(object->GetPositionX(), object->GetPositionY(), object->GetPositionZ(), *oz);
399 object->SetWorldRotationAngles(*oz, oy.value_or(0.0f), ox.value_or(0.0f));
400 object->SaveToDB();
401
402 // Generate a completely new spawn with new guid
403 // 3.3.5a client caches recently deleted objects and brings them back to life
404 // when CreateObject block for this guid is received again
405 // however it entirely skips parsing that block and only uses already known location
406 object->Delete();
407
408 object = new GameObject();
409 if (!object->LoadGameObjectFromDB(guidLow, map, true))
410 {
411 delete object;
412 return false;
413 }
414
415 handler->PSendSysMessage(LANG_COMMAND_TURNOBJMESSAGE, object->GetSpawnId(), object->GetGOInfo()->name, object->GetSpawnId());
416 return true;
417 }
@ LANG_COMMAND_TURNOBJMESSAGE
Definition Language.h:326

References GameObject::GetGOInfo(), ChatHandler::GetObjectFromPlayerMapByDbGuid(), Position::GetOrientation(), WorldSession::GetPlayer(), Position::GetPositionX(), Position::GetPositionY(), Position::GetPositionZ(), ChatHandler::GetSession(), GameObject::GetSpawnId(), LANG_COMMAND_OBJNOTFOUND, LANG_COMMAND_TURNOBJMESSAGE, GameObject::LoadGameObjectFromDB(), GameObjectTemplate::name, ChatHandler::PSendSysMessage(), and ChatHandler::SendErrorMessage().

Referenced by GetCommands().


The documentation for this class was generated from the following file: