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
 
virtual std::vector< Acore::ChatCommands::ChatCommandBuilderGetCommands () const =0
 
- Public Member Functions inherited from ScriptObject
virtual bool IsDatabaseBound () const
 
virtual bool isAfterLoadScript () const
 
virtual void checkValidity ()
 
const std::string & GetName () const
 

Static Public Member Functions

static bool HandleGameObjectActivateCommand (ChatHandler *handler, GameObjectSpawnId guidLow)
 
static bool HandleGameObjectAddCommand (ChatHandler *handler, GameObjectEntry objectId, Optional< int32 > spawnTimeSecs)
 
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)
 

Additional Inherited Members

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

Detailed Description

Constructor & Destructor Documentation

◆ gobject_commandscript()

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

Member Function Documentation

◆ GetCommands()

ChatCommandTable gobject_commandscript::GetCommands ( ) const
inlineoverridevirtual

Implements CommandScript.

49 {
50 static ChatCommandTable gobjectCommandTable =
51 {
52 { "activate", HandleGameObjectActivateCommand, SEC_GAMEMASTER, Console::No },
53 { "delete", HandleGameObjectDeleteCommand, SEC_ADMINISTRATOR, Console::No },
54 { "info", HandleGameObjectInfoCommand, SEC_MODERATOR, Console::No },
55 { "move", HandleGameObjectMoveCommand, SEC_ADMINISTRATOR, Console::No },
56 { "near", HandleGameObjectNearCommand, SEC_MODERATOR, Console::No },
57 { "target", HandleGameObjectTargetCommand, SEC_MODERATOR, Console::No },
58 { "turn", HandleGameObjectTurnCommand, SEC_ADMINISTRATOR, Console::No },
59 { "add temp", HandleGameObjectAddTempCommand, SEC_GAMEMASTER, Console::No },
60 { "add", HandleGameObjectAddCommand, SEC_ADMINISTRATOR, Console::No },
61 { "set phase", HandleGameObjectSetPhaseCommand, SEC_ADMINISTRATOR, Console::No },
62 { "set state", HandleGameObjectSetStateCommand, SEC_ADMINISTRATOR, Console::No }
63 };
64 static ChatCommandTable commandTable =
65 {
66 { "gobject", gobjectCommandTable }
67 };
68 return commandTable;
69 }
@ SEC_ADMINISTRATOR
Definition: Common.h:62
@ SEC_GAMEMASTER
Definition: Common.h:61
@ SEC_MODERATOR
Definition: Common.h:60
std::vector< ChatCommandBuilder > ChatCommandTable
Definition: ChatCommand.h:49
static bool HandleGameObjectDeleteCommand(ChatHandler *handler, GameObjectSpawnId spawnId)
Definition: cs_gobject.cpp:293
static bool HandleGameObjectTargetCommand(ChatHandler *handler, Optional< Variant< GameObjectEntry, std::string_view > > objectId)
Definition: cs_gobject.cpp:179
static bool HandleGameObjectNearCommand(ChatHandler *handler, Optional< float > dist)
Definition: cs_gobject.cpp:441
static bool HandleGameObjectInfoCommand(ChatHandler *handler, Optional< EXACT_SEQUENCE("guid")> isGuid, Variant< Hyperlink< gameobject_entry >, Hyperlink< gameobject >, uint32 > data)
Definition: cs_gobject.cpp:488
static bool HandleGameObjectAddCommand(ChatHandler *handler, GameObjectEntry objectId, Optional< int32 > spawnTimeSecs)
Definition: cs_gobject.cpp:92
static bool HandleGameObjectActivateCommand(ChatHandler *handler, GameObjectSpawnId guidLow)
Definition: cs_gobject.cpp:71
static bool HandleGameObjectAddTempCommand(ChatHandler *handler, GameObjectEntry objectId, Optional< uint64 > spawntime)
Definition: cs_gobject.cpp:155
static bool HandleGameObjectMoveCommand(ChatHandler *handler, GameObjectSpawnId guidLow, Optional< std::array< float, 3 > > xyz)
Definition: cs_gobject.cpp:363
static bool HandleGameObjectTurnCommand(ChatHandler *handler, GameObjectSpawnId guidLow, Optional< float > oz, Optional< float > oy, Optional< float > ox)
Definition: cs_gobject.cpp:325
static bool HandleGameObjectSetStateCommand(ChatHandler *handler, GameObjectSpawnId guidLow, int32 objectType, Optional< uint32 > objectState)
Definition: cs_gobject.cpp:551
static bool HandleGameObjectSetPhaseCommand(ChatHandler *handler, GameObjectSpawnId guidLow, uint32 phaseMask)
Definition: cs_gobject.cpp:418

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

◆ HandleGameObjectActivateCommand()

static bool gobject_commandscript::HandleGameObjectActivateCommand ( ChatHandler handler,
GameObjectSpawnId  guidLow 
)
inlinestatic
72 {
73 GameObject* object = handler->GetObjectFromPlayerMapByDbGuid(guidLow);
74 if (!object)
75 {
77 return false;
78 }
79
80 uint32_t const autoCloseTime = object->GetGOInfo()->GetAutoCloseTime() ? 10000u : 0u;
81
82 // Activate
83 object->SetLootState(GO_READY);
84 object->UseDoorOrButton(autoCloseTime, false, handler->GetSession()->GetPlayer());
85
86 handler->PSendSysMessage("Object activated!");
87
88 return true;
89 }
std::uint32_t uint32
Definition: Define.h:108
@ GO_READY
Definition: GameObject.h:113
@ LANG_COMMAND_OBJNOTFOUND
Definition: Language.h:318
WorldSession * GetSession()
Definition: Chat.h:139
void SendErrorMessage(uint32 entry)
Definition: Chat.cpp:152
GameObject * GetObjectFromPlayerMapByDbGuid(ObjectGuid::LowType lowguid)
Definition: Chat.cpp:516
void PSendSysMessage(char const *fmt, Args &&... args)
Definition: Chat.h:60
Definition: GameObject.h:122
Player * GetPlayer() const
Definition: WorldSession.h:364

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 ?
93 {
94 if (!objectId)
95 return false;
96
97 GameObjectTemplate const* objectInfo = sObjectMgr->GetGameObjectTemplate(objectId);
98 if (!objectInfo)
99 {
101 return false;
102 }
103
104 if (objectInfo->displayId && !sGameObjectDisplayInfoStore.LookupEntry(objectInfo->displayId))
105 {
106 // report to DB errors log as in loading case
107 LOG_ERROR("sql.sql", "Gameobject (Entry {} GoType: {}) have invalid displayId ({}), not spawned.", *objectId, objectInfo->type, objectInfo->displayId);
109 return false;
110 }
111
112 Player* player = handler->GetSession()->GetPlayer();
113 float x = float(player->GetPositionX());
114 float y = float(player->GetPositionY());
115 float z = float(player->GetPositionZ());
116 float o = float(player->GetOrientation());
117 Map* map = player->GetMap();
118
119 GameObject* object = sObjectMgr->IsGameObjectStaticTransport(objectInfo->entry) ? new StaticTransport() : new GameObject();
120 ObjectGuid::LowType guidLow = map->GenerateLowGuid<HighGuid::GameObject>();
121
122 if (!object->Create(guidLow, objectInfo->entry, map, player->GetPhaseMaskForSpawn(), x, y, z, o, G3D::Quat(), 0, GO_STATE_READY))
123 {
124 delete object;
125 return false;
126 }
127
128 if (spawnTimeSecs)
129 object->SetRespawnTime(*spawnTimeSecs);
130
131 // fill the gameobject data and save to the db
132 object->SaveToDB(map->GetId(), (1 << map->GetSpawnMode()), player->GetPhaseMaskForSpawn());
133 guidLow = object->GetSpawnId();
134
135 // delete the old object and do a clean load from DB with a fresh new GameObject instance.
136 // this is required to avoid weird behavior and memory leaks
137 delete object;
138
139 object = sObjectMgr->IsGameObjectStaticTransport(objectInfo->entry) ? new StaticTransport() : new GameObject();
140 // this will generate a new guid if the object is in an instance
141 if (!object->LoadGameObjectFromDB(guidLow, map, true))
142 {
143 delete object;
144 return false;
145 }
146
148 sObjectMgr->AddGameobjectToGrid(guidLow, sObjectMgr->GetGameObjectData(guidLow));
149
150 handler->PSendSysMessage(LANG_GAMEOBJECT_ADD, uint32(objectId), objectInfo->name.c_str(), guidLow, player->GetPositionX(), player->GetPositionY(), player->GetPositionZ());
151 return true;
152 }
#define LOG_ERROR(filterType__,...)
Definition: Log.h:157
DBCStorage< GameObjectDisplayInfoEntry > sGameObjectDisplayInfoStore(GameObjectDisplayInfofmt)
@ GO_STATE_READY
Definition: GameObjectData.h:691
#define sObjectMgr
Definition: ObjectMgr.h:1640
@ LANG_GAMEOBJECT_HAVE_INVALID_DATA
Definition: Language.h:389
@ LANG_GAMEOBJECT_NOT_EXIST
Definition: Language.h:549
@ LANG_GAMEOBJECT_ADD
Definition: Language.h:553
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:248
void SetRespawnTime(int32 respawn)
Definition: GameObject.cpp:1301
bool LoadGameObjectFromDB(ObjectGuid::LowType guid, Map *map, bool addToMap=true)
Definition: GameObject.cpp:1120
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
Map * GetMap() const
Definition: Object.h:517
uint32 LowType
Definition: ObjectGuid.h:124
float GetPositionZ() const
Definition: Position.h:119
float GetOrientation() const
Definition: Position.h:120
float GetPositionX() const
Definition: Position.h:117
float GetPositionY() const
Definition: Position.h:118
Definition: Player.h:1056
uint32 GetPhaseMaskForSpawn() const
Definition: Player.cpp:13685
Definition: Transport.h:112
Definition: Map.h:313
uint8 GetSpawnMode() const
Definition: Map.h:420
ObjectGuid::LowType GenerateLowGuid()
Definition: Map.h:637
uint32 GetId() const
Definition: Map.h:379

References GameObject::Create(), GameObjectTemplate::displayId, GameObjectTemplate::entry, 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
156 {
157 Player* player = handler->GetSession()->GetPlayer();
158 uint64 spawntm(spawntime.value_or(300));
159
160 if (!sObjectMgr->GetGameObjectTemplate(objectId))
161 {
163 return false;
164 }
165
166 float x = player->GetPositionX();
167 float y = player->GetPositionY();
168 float z = player->GetPositionZ();
169 float ang = player->GetOrientation();
170
171 float rot2 = std::sin(ang / 2);
172 float rot3 = cos(ang / 2);
173
174 player->SummonGameObject(objectId, x, y, z, ang, 0, 0, rot2, rot3, spawntm);
175
176 return true;
177 }
std::uint64_t uint64
Definition: Define.h:107
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:2357

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
294 {
295 GameObject* object = handler->GetObjectFromPlayerMapByDbGuid(spawnId);
296 if (!object)
297 {
299 return false;
300 }
301
302 ObjectGuid ownerGuid = object->GetOwnerGUID();
303 if (ownerGuid)
304 {
305 Unit* owner = ObjectAccessor::GetUnit(*handler->GetSession()->GetPlayer(), ownerGuid);
306 if (!owner || !ownerGuid.IsPlayer())
307 {
309 return false;
310 }
311
312 owner->RemoveGameObject(object, false);
313 }
314
315 object->SetRespawnTime(0); // not save respawn time
316 object->Delete();
317 object->DeleteFromDB();
318
320
321 return true;
322 }
@ LANG_COMMAND_DELOBJMESSAGE
Definition: Language.h:320
@ LANG_COMMAND_DELOBJREFERCREATURE
Definition: Language.h:319
Unit * GetUnit(WorldObject const &, ObjectGuid const guid)
Definition: ObjectAccessor.cpp:202
ObjectGuid::LowType GetSpawnId() const
Definition: GameObject.h:146
Definition: ObjectGuid.h:120
LowType GetCounter() const
Definition: ObjectGuid.h:147
bool IsPlayer() const
Definition: ObjectGuid.h:170
Definition: Unit.h:1302
void RemoveGameObject(GameObject *gameObj, bool del)
Definition: Unit.cpp:6135

References ObjectGuid::GetCounter(), 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(), and ChatHandler::SendErrorMessage().

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
489 {
490 uint32 entry = 0;
491 uint32 type = 0;
492 uint32 displayId = 0;
493 std::string name;
494 uint32 lootId = 0;
495 GameObject* gameObject = nullptr;
496
497 ObjectGuid::LowType spawnId = 0;
498 if (isGuid || data.holds_alternative<Hyperlink<gameobject>>())
499 {
500 spawnId = *data;
501 GameObjectData const* spawnData = sObjectMgr->GetGameObjectData(spawnId);
502 if (!spawnData)
503 {
505 return false;
506 }
507 entry = spawnData->id;
508 gameObject = handler->GetObjectFromPlayerMapByDbGuid(spawnId);
509 }
510 else
511 {
512 entry = *data;
513 }
514
515 GameObjectTemplate const* gameObjectInfo = sObjectMgr->GetGameObjectTemplate(entry);
516 if (!gameObjectInfo)
517 {
519 return false;
520 }
521
522 type = gameObjectInfo->type;
523 displayId = gameObjectInfo->displayId;
524 name = gameObjectInfo->name;
525 if (type == GAMEOBJECT_TYPE_CHEST)
526 lootId = gameObjectInfo->chest.lootId;
527 else if (type == GAMEOBJECT_TYPE_FISHINGHOLE)
528 lootId = gameObjectInfo->fishinghole.lootId;
529
530 handler->PSendSysMessage(LANG_GOINFO_ENTRY, entry);
531 if (gameObject)
532 handler->PSendSysMessage("GUID: %u", gameObject->GetGUID().GetCounter());
533 handler->PSendSysMessage(LANG_GOINFO_TYPE, type);
534 handler->PSendSysMessage(LANG_GOINFO_LOOTID, lootId);
535 handler->PSendSysMessage(LANG_GOINFO_DISPLAYID, displayId);
536 if (gameObject)
537 {
538 handler->PSendSysMessage("LootMode: %u", gameObject->GetLootMode());
539 handler->PSendSysMessage("LootState: %u", gameObject->getLootState());
540 handler->PSendSysMessage("GOState: %u", gameObject->GetGoState());
541 handler->PSendSysMessage("PhaseMask: %u", gameObject->GetPhaseMask());
542 handler->PSendSysMessage("IsLootEmpty: %u", gameObject->loot.empty());
543 handler->PSendSysMessage("IsLootLooted: %u", gameObject->loot.isLooted());
544 }
545
546 handler->PSendSysMessage(LANG_GOINFO_NAME, name.c_str());
547
548 return true;
549 }
@ LANG_GOINFO_NAME
Definition: Language.h:1090
@ LANG_GOINFO_DISPLAYID
Definition: Language.h:1089
@ LANG_GOINFO_ENTRY
Definition: Language.h:1087
@ LANG_GOINFO_LOOTID
Definition: Language.h:1091
@ LANG_GOINFO_TYPE
Definition: Language.h:1088
@ GAMEOBJECT_TYPE_CHEST
Definition: SharedDefines.h:1563
@ GAMEOBJECT_TYPE_FISHINGHOLE
Definition: SharedDefines.h:1585
Definition: ChatCommandTags.h:204
constexpr bool holds_alternative() const
Definition: ChatCommandTags.h:302
Loot loot
Definition: GameObject.h:249
GOState GetGoState() const
Definition: GameObject.h:207
LootState getLootState() const
Definition: GameObject.h:226
uint16 GetLootMode() const
Definition: GameObject.h:230
uint32 lootId
Definition: GameObjectData.h:85
struct GameObjectTemplate::@223::@244 fishinghole
struct GameObjectTemplate::@223::@228 chest
Definition: GameObjectData.h:697
uint32 id
Definition: GameObjectData.h:699
static ObjectGuid GetGUID(Object const *o)
Definition: Object.h:106
uint32 GetPhaseMask() const
Definition: Object.h:434
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, ObjectGuid::GetCounter(), 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, and GameObjectTemplate::type.

Referenced by GetCommands().

◆ HandleGameObjectMoveCommand()

static bool gobject_commandscript::HandleGameObjectMoveCommand ( ChatHandler handler,
GameObjectSpawnId  guidLow,
Optional< std::array< float, 3 > >  xyz 
)
inlinestatic
364 {
365 if (!guidLow)
366 return false;
367
368 GameObject* object = handler->GetObjectFromPlayerMapByDbGuid(guidLow);
369 if (!object)
370 {
372 return false;
373 }
374
375 Position pos;
376 if (xyz)
377 {
378 pos = { (*xyz)[0], (*xyz)[1], (*xyz)[2] };
379 if (!MapMgr::IsValidMapCoord(object->GetMapId(), pos))
380 {
382 return false;
383 }
384 }
385 else
386 {
387 pos = handler->GetSession()->GetPlayer()->GetPosition();
388 }
389
390 Map* map = object->GetMap();
391
392 pos.SetOrientation(object->GetOrientation());
393 object->Relocate(pos);
394
395 // update which cell has this gameobject registered for loading
396 sObjectMgr->RemoveGameobjectFromGrid(guidLow, object->GetGameObjectData());
397 object->SaveToDB();
398 sObjectMgr->AddGameobjectToGrid(guidLow, object->GetGameObjectData());
399
400 // Generate a completely new spawn with new guid
401 // 3.3.5a client caches recently deleted objects and brings them back to life
402 // when CreateObject block for this guid is received again
403 // however it entirely skips parsing that block and only uses already known location
404 object->Delete();
405
406 object = new GameObject();
407 if (!object->LoadGameObjectFromDB(guidLow, map, true))
408 {
409 delete object;
410 return false;
411 }
412
413 handler->PSendSysMessage(LANG_COMMAND_MOVEOBJMESSAGE, object->GetSpawnId(), object->GetGOInfo()->name.c_str(), object->GetSpawnId());
414 return true;
415 }
@ LANG_COMMAND_MOVEOBJMESSAGE
Definition: Language.h:322
@ LANG_INVALID_TARGET_COORD
Definition: Language.h:308
GameObjectTemplate const * GetGOInfo() const
Definition: GameObject.h:138
GameObjectData const * GetGameObjectData() const
Definition: GameObject.h:140
Definition: Position.h:28
void SetOrientation(float orientation)
Definition: Position.h:112
void GetPosition(float &x, float &y) const
Definition: Position.h:122
uint32 GetMapId() const
Definition: Position.h:276
static bool IsValidMapCoord(uint32 mapid, Position const &pos)
Definition: MapMgr.h:91

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
442 {
443 float distance = dist.value_or(10.0f);
444 uint32 count = 0;
445
446 Player* player = handler->GetSession()->GetPlayer();
447
449 stmt->SetData(0, player->GetPositionX());
450 stmt->SetData(1, player->GetPositionY());
451 stmt->SetData(2, player->GetPositionZ());
452 stmt->SetData(3, player->GetMapId());
453 stmt->SetData(4, player->GetPositionX());
454 stmt->SetData(5, player->GetPositionY());
455 stmt->SetData(6, player->GetPositionZ());
456 stmt->SetData(7, distance * distance);
457 stmt->SetData(8, player->GetPhaseMask());
458 PreparedQueryResult result = WorldDatabase.Query(stmt);
459
460 if (result)
461 {
462 do
463 {
464 Field* fields = result->Fetch();
465 ObjectGuid::LowType guid = fields[0].Get<uint32>();
466 uint32 entry = fields[1].Get<uint32>();
467 float x = fields[2].Get<float>();
468 float y = fields[3].Get<float>();
469 float z = fields[4].Get<float>();
470 uint16 mapId = fields[5].Get<uint16>();
471
472 GameObjectTemplate const* gameObjectInfo = sObjectMgr->GetGameObjectTemplate(entry);
473
474 if (!gameObjectInfo)
475 continue;
476
477 handler->PSendSysMessage(LANG_GO_LIST_CHAT, guid, entry, guid, gameObjectInfo->name.c_str(), x, y, z, mapId, "", "");
478
479 ++count;
480 } while (result->NextRow());
481 }
482
483 handler->PSendSysMessage(LANG_COMMAND_NEAROBJMESSAGE, distance, count);
484 return true;
485 }
std::uint16_t uint16
Definition: Define.h:109
DatabaseWorkerPool< WorldDatabaseConnection > WorldDatabase
Accessor to the world database.
Definition: DatabaseEnv.cpp:20
std::shared_ptr< PreparedResultSet > PreparedQueryResult
Definition: DatabaseEnvFwd.h:46
@ WORLD_SEL_GAMEOBJECT_NEAREST
Definition: WorldDatabase.h:89
@ LANG_GO_LIST_CHAT
Definition: Language.h:543
@ LANG_COMMAND_NEAROBJMESSAGE
Definition: Language.h:623
Definition: PreparedStatement.h:158
Class used to access individual fields of database query result.
Definition: Field.h:99
std::enable_if_t< std::is_arithmetic_v< T >, T > Get() const
Definition: Field.h:113
Acore::Types::is_default< T > SetData(const uint8 index, T value)
Definition: PreparedStatement.h:78

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

Referenced by GetCommands().

◆ HandleGameObjectSetPhaseCommand()

static bool gobject_commandscript::HandleGameObjectSetPhaseCommand ( ChatHandler handler,
GameObjectSpawnId  guidLow,
uint32  phaseMask 
)
inlinestatic
419 {
420 if (!guidLow)
421 return false;
422
423 GameObject* object = handler->GetObjectFromPlayerMapByDbGuid(guidLow);
424 if (!object)
425 {
427 return false;
428 }
429
430 if (!phaseMask)
431 {
433 return false;
434 }
435
436 object->SetPhaseMask(phaseMask, true);
437 object->SaveToDB();
438 return true;
439 }
@ LANG_BAD_VALUE
Definition: Language.h:147

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
552 {
553 if (!guidLow)
554 return false;
555
556 GameObject* object = handler->GetObjectFromPlayerMapByDbGuid(guidLow);
557 if (!object)
558 {
560 return false;
561 }
562
563 if (objectType < 0)
564 {
565 if (objectType == -1)
566 object->SendObjectDeSpawnAnim(object->GetGUID());
567 else if (objectType == -2)
568 return false;
569 return true;
570 }
571
572 if (!objectState)
573 return false;
574
575 if (objectType < 4)
576 object->SetByteValue(GAMEOBJECT_BYTES_1, objectType, *objectState);
577 else if (objectType == 4)
578 {
579 object->SendCustomAnim(*objectState);
580 }
581 handler->PSendSysMessage("Set gobject type %d state %u", objectType, *objectState);
582 return true;
583 }
@ 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
180 {
181 Player* player = handler->GetSession()->GetPlayer();
182 QueryResult result;
183 GameEventMgr::ActiveEvents const& activeEventsList = sGameEventMgr->GetActiveEventList();
184
185 if (objectId)
186 {
187 if (objectId->holds_alternative<GameObjectEntry>())
188 {
189 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",
190 player->GetPositionX(), player->GetPositionY(), player->GetPositionZ(), player->GetMapId(), static_cast<uint32>(objectId->get<GameObjectEntry>()));
191 }
192 else
193 {
194 std::string name = std::string(objectId->get<std::string_view>());
195 WorldDatabase.EscapeString(name);
196 result = WorldDatabase.Query(
197 "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_ "
198 "FROM gameobject LEFT JOIN gameobject_template ON gameobject_template.entry = gameobject.id WHERE map = {} AND name LIKE '%{}%' ORDER BY order_ ASC LIMIT 1",
199 player->GetPositionX(), player->GetPositionY(), player->GetPositionZ(), player->GetMapId(), name);
200 }
201 }
202 else
203 {
204 std::ostringstream eventFilter;
205 eventFilter << " AND (eventEntry IS NULL ";
206 bool initString = true;
207
208 for (GameEventMgr::ActiveEvents::const_iterator itr = activeEventsList.begin(); itr != activeEventsList.end(); ++itr)
209 {
210 if (initString)
211 {
212 eventFilter << "OR eventEntry IN (" << *itr;
213 initString = false;
214 }
215 else
216 eventFilter << ',' << *itr;
217 }
218
219 if (!initString)
220 eventFilter << "))";
221 else
222 eventFilter << ')';
223
224 result = WorldDatabase.Query("SELECT gameobject.guid, id, position_x, position_y, position_z, orientation, map, phaseMask, "
225 "(POW(position_x - {}, 2) + POW(position_y - {}, 2) + POW(position_z - {}, 2)) AS order_ FROM gameobject "
226 "LEFT OUTER JOIN game_event_gameobject on gameobject.guid = game_event_gameobject.guid WHERE map = '{}' {} ORDER BY order_ ASC LIMIT 10",
227 handler->GetSession()->GetPlayer()->GetPositionX(), handler->GetSession()->GetPlayer()->GetPositionY(), handler->GetSession()->GetPlayer()->GetPositionZ(),
228 handler->GetSession()->GetPlayer()->GetMapId(), eventFilter.str());
229 }
230
231 if (!result)
232 {
234 return true;
235 }
236
237 bool found = false;
238 float x, y, z, o;
239 ObjectGuid::LowType guidLow;
240 uint32 id, phase;
241 uint16 mapId;
242 uint32 poolId;
243
244 do
245 {
246 Field* fields = result->Fetch();
247 guidLow = fields[0].Get<uint32>();
248 id = fields[1].Get<uint32>();
249 x = fields[2].Get<float>();
250 y = fields[3].Get<float>();
251 z = fields[4].Get<float>();
252 o = fields[5].Get<float>();
253 mapId = fields[6].Get<uint16>();
254 phase = fields[7].Get<uint32>();
255 poolId = sPoolMgr->IsPartOfAPool<GameObject>(guidLow);
256 if (!poolId || sPoolMgr->IsSpawnedObject<GameObject>(guidLow))
257 found = true;
258 } while (result->NextRow() && !found);
259
260 if (!found)
261 {
263 return false;
264 }
265
266 GameObjectTemplate const* objectInfo = sObjectMgr->GetGameObjectTemplate(id);
267
268 if (!objectInfo)
269 {
271 return false;
272 }
273
274 GameObject* target = handler->GetObjectFromPlayerMapByDbGuid(guidLow);
275
276 handler->PSendSysMessage(LANG_GAMEOBJECT_DETAIL, guidLow, objectInfo->name.c_str(), guidLow, id, x, y, z, mapId, o, phase);
277
278 if (target)
279 {
280 int32 curRespawnDelay = int32(target->GetRespawnTimeEx() - GameTime::GetGameTime().count());
281 if (curRespawnDelay < 0)
282 curRespawnDelay = 0;
283
284 std::string curRespawnDelayStr = secsToTimeString(curRespawnDelay, true);
285 std::string defRespawnDelayStr = secsToTimeString(target->GetRespawnDelay(), true);
286
287 handler->PSendSysMessage(LANG_COMMAND_RAWPAWNTIMES, defRespawnDelayStr.c_str(), curRespawnDelayStr.c_str());
288 }
289 return true;
290 }
std::int32_t int32
Definition: Define.h:104
std::string secsToTimeString(uint64 timeInSecs, bool shortText)
Definition: Util.cpp:73
std::shared_ptr< ResultSet > QueryResult
Definition: DatabaseEnvFwd.h:28
#define sGameEventMgr
Definition: GameEventMgr.h:186
@ LANG_GAMEOBJECT_DETAIL
Definition: Language.h:552
@ LANG_COMMAND_TARGETOBJNOTFOUND
Definition: Language.h:311
@ LANG_COMMAND_RAWPAWNTIMES
Definition: Language.h:624
#define sPoolMgr
Definition: PoolMgr.h:163
phase
Definition: boss_skadi.cpp:103
Seconds GetGameTime()
Definition: GameTime.cpp:38
virtual void SendSysMessage(std::string_view str, bool escapeCharacters=false)
Definition: Chat.cpp:101
Definition: ChatCommandTags.h:257
uint32 GetRespawnDelay() const
Definition: GameObject.h:199
time_t GetRespawnTimeEx() const
Definition: GameObject.cpp:2978
std::set< uint16 > ActiveEvents
Definition: GameEventMgr.h:106

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
326 {
327 if (!guidLow)
328 return false;
329
330 GameObject* object = handler->GetObjectFromPlayerMapByDbGuid(guidLow);
331 if (!object)
332 {
334 return false;
335 }
336
337 if (!oz)
338 oz = handler->GetSession()->GetPlayer()->GetOrientation();
339
340 Map* map = object->GetMap();
341 object->Relocate(object->GetPositionX(), object->GetPositionY(), object->GetPositionZ(), *oz);
342 object->SetLocalRotationAngles(*oz, oy.value_or(0.0f), ox.value_or(0.0f));
343 object->SaveToDB();
344
345 // Generate a completely new spawn with new guid
346 // 3.3.5a client caches recently deleted objects and brings them back to life
347 // when CreateObject block for this guid is received again
348 // however it entirely skips parsing that block and only uses already known location
349 object->Delete();
350
351 object = new GameObject();
352 if (!object->LoadGameObjectFromDB(guidLow, map, true))
353 {
354 delete object;
355 return false;
356 }
357
358 handler->PSendSysMessage(LANG_COMMAND_TURNOBJMESSAGE, object->GetSpawnId(), object->GetGOInfo()->name.c_str(), object->GetSpawnId());
359 return true;
360 }
@ LANG_COMMAND_TURNOBJMESSAGE
Definition: Language.h:321

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().