TrinityCore
cs_go.cpp
Go to the documentation of this file.
1/*
2 * This file is part of the TrinityCore Project. See AUTHORS file for Copyright information
3 *
4 * This program is free software; you can redistribute it and/or modify it
5 * under the terms of the GNU General Public License as published by the
6 * Free Software Foundation; either version 2 of the License, or (at your
7 * option) any later version.
8 *
9 * This program is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12 * more details.
13 *
14 * You should have received a copy of the GNU General Public License along
15 * with this program. If not, see <http://www.gnu.org/licenses/>.
16 */
17
18/* ScriptData
19Name: go_commandscript
20%Complete: 100
21Comment: All go related commands
22Category: commandscripts
23EndScriptData */
24
25#include "ScriptMgr.h"
26#include "Chat.h"
27#include "ChatCommand.h"
28#include "Containers.h"
29#include "DB2Stores.h"
30#include "Language.h"
31#include "MapManager.h"
32#include "ObjectMgr.h"
33#include "PhasingHandler.h"
34#include "Player.h"
35#include "RBAC.h"
36#include "SupportMgr.h"
37#include "TerrainMgr.h"
38#include "Transport.h"
39#include "Util.h"
40#include "WorldSession.h"
41#include <sstream>
42
43using namespace Trinity::ChatCommands;
44
46{
47public:
48 go_commandscript() : CommandScript("go_commandscript") { }
49
51 {
52 static ChatCommandTable goCommandTable =
53 {
55 { "creature id", HandleGoCreatureCIdCommand, rbac::RBAC_PERM_COMMAND_GO, Console::No },
57 { "gameobject id", HandleGoGameObjectGOIdCommand, rbac::RBAC_PERM_COMMAND_GO, Console::No },
58 { "graveyard", HandleGoGraveyardCommand, rbac::RBAC_PERM_COMMAND_GO, Console::No },
59 { "grid", HandleGoGridCommand, rbac::RBAC_PERM_COMMAND_GO, Console::No },
60 { "quest", HandleGoQuestCommand, rbac::RBAC_PERM_COMMAND_GO, Console::No },
61 { "taxinode", HandleGoTaxinodeCommand, rbac::RBAC_PERM_COMMAND_GO, Console::No },
62 { "areatrigger", HandleGoAreaTriggerCommand, rbac::RBAC_PERM_COMMAND_GO, Console::No },
63 { "zonexy", HandleGoZoneXYCommand, rbac::RBAC_PERM_COMMAND_GO, Console::No },
64 { "xyz", HandleGoXYZCommand, rbac::RBAC_PERM_COMMAND_GO, Console::No },
65 { "bugticket", HandleGoTicketCommand<BugTicket>, rbac::RBAC_PERM_COMMAND_GO, Console::No },
66 { "complaintticket", HandleGoTicketCommand<ComplaintTicket>, rbac::RBAC_PERM_COMMAND_GO, Console::No },
67 { "suggestionticket", HandleGoTicketCommand<SuggestionTicket>,rbac::RBAC_PERM_COMMAND_GO, Console::No },
68 { "offset", HandleGoOffsetCommand, rbac::RBAC_PERM_COMMAND_GO, Console::No },
69 { "instance", HandleGoInstanceCommand, rbac::RBAC_PERM_COMMAND_GO, Console::No },
70 { "boss", HandleGoBossCommand, rbac::RBAC_PERM_COMMAND_GO, Console::No }
71 };
72
73 static ChatCommandTable commandTable =
74 {
75 { "go", goCommandTable },
76 };
77 return commandTable;
78 }
79
80 static bool DoTeleport(ChatHandler* handler, Position pos, uint32 mapId = MAPID_INVALID)
81 {
82 Player* player = handler->GetSession()->GetPlayer();
83
84 if (mapId == MAPID_INVALID)
85 mapId = player->GetMapId();
86 if (!MapManager::IsValidMapCoord(mapId, pos) || sObjectMgr->IsTransportMap(mapId))
87 {
89 handler->SetSentErrorMessage(true);
90 return false;
91 }
92
93 // stop flight if need
94 if (player->IsInFlight())
95 player->FinishTaxiFlight();
96 else
97 player->SaveRecallPosition(); // save only in non-flight case
98
99 player->TeleportTo({ mapId, pos });
100 return true;
101 }
102
104 {
105 CreatureData const* spawnpoint = sObjectMgr->GetCreatureData(spawnId);
106 if (!spawnpoint)
107 {
109 handler->SetSentErrorMessage(true);
110 return false;
111 }
112
113 return DoTeleport(handler, spawnpoint->spawnPoint, spawnpoint->mapId);
114 }
115
117 {
118 CreatureData const* spawnpoint = nullptr;
119 for (auto const& pair : sObjectMgr->GetAllCreatureData())
120 {
121 if (pair.second.id != *cId)
122 continue;
123
124 if (!spawnpoint)
125 spawnpoint = &pair.second;
126 else
127 {
129 break;
130 }
131 }
132
133 if (!spawnpoint)
134 {
136 handler->SetSentErrorMessage(true);
137 return false;
138 }
139
140 return DoTeleport(handler, spawnpoint->spawnPoint, spawnpoint->mapId);
141 }
142
144 {
145 GameObjectData const* spawnpoint = sObjectMgr->GetGameObjectData(spawnId);
146 if (!spawnpoint)
147 {
149 handler->SetSentErrorMessage(true);
150 return false;
151 }
152
153 return DoTeleport(handler, spawnpoint->spawnPoint, spawnpoint->mapId);
154 }
155
157 {
158 GameObjectData const* spawnpoint = nullptr;
159 for (auto const& pair : sObjectMgr->GetAllGameObjectData())
160 {
161 if (pair.second.id != *goId)
162 continue;
163
164 if (!spawnpoint)
165 spawnpoint = &pair.second;
166 else
167 {
169 break;
170 }
171 }
172
173 if (!spawnpoint)
174 {
176 handler->SetSentErrorMessage(true);
177 return false;
178 }
179
180 return DoTeleport(handler, spawnpoint->spawnPoint, spawnpoint->mapId);
181 }
182
183 static bool HandleGoGraveyardCommand(ChatHandler* handler, uint32 gyId)
184 {
185 WorldSafeLocsEntry const* gy = sObjectMgr->GetWorldSafeLoc(gyId);
186 if (!gy)
187 {
189 handler->SetSentErrorMessage(true);
190 return false;
191 }
192
194 {
196 handler->SetSentErrorMessage(true);
197 return false;
198 }
199
200 Player* player = handler->GetSession()->GetPlayer();
201 // stop flight if need
202 if (player->IsInFlight())
203 player->FinishTaxiFlight();
204 else
205 player->SaveRecallPosition(); // save only in non-flight case
206
207 player->TeleportTo(gy->Loc);
208 return true;
209 }
210
211 //teleport to grid
212 static bool HandleGoGridCommand(ChatHandler* handler, float gridX, float gridY, Optional<uint32> oMapId)
213 {
214 Player* player = handler->GetSession()->GetPlayer();
215 uint32 mapId = oMapId.value_or(player->GetMapId());
216
217 // center of grid
218 float x = (gridX - CENTER_GRID_ID + 0.5f) * SIZE_OF_GRIDS;
219 float y = (gridY - CENTER_GRID_ID + 0.5f) * SIZE_OF_GRIDS;
220
221 if (!MapManager::IsValidMapCoord(mapId, x, y))
222 {
223 handler->PSendSysMessage(LANG_INVALID_TARGET_COORD, x, y, mapId);
224 handler->SetSentErrorMessage(true);
225 return false;
226 }
227
228 // stop flight if need
229 if (player->IsInFlight())
230 player->FinishTaxiFlight();
231 else
232 player->SaveRecallPosition(); // save only in non-flight case
233
234 std::shared_ptr<TerrainInfo> terrain = sTerrainMgr.LoadTerrain(mapId);
235 float z = std::max(terrain->GetStaticHeight(PhasingHandler::GetEmptyPhaseShift(), mapId, x, y, MAX_HEIGHT), terrain->GetWaterLevel(PhasingHandler::GetEmptyPhaseShift(), mapId, x, y));
236
237 player->TeleportTo(mapId, x, y, z, player->GetOrientation());
238 return true;
239 }
240
242 {
243 Player* player = handler->GetSession()->GetPlayer();
244
245 uint32 questID;
246 if (questData.holds_alternative<uint32>())
247 {
248 questID = questData.get<uint32>();
249
250 if (!sObjectMgr->GetQuestTemplate(questID))
251 {
253 handler->SetSentErrorMessage(true);
254 return false;
255 }
256 }
257 else
258 questID = questData.get<Hyperlink<quest>>()->Quest->GetQuestId();
259
260 float x, y, z;
261 uint32 mapId;
262
263 if (QuestPOIData const* poiData = sObjectMgr->GetQuestPOIData(questID))
264 {
265 QuestPOIBlobData const& data = poiData->Blobs.front();
266
267 mapId = data.MapID;
268
269 x = data.Points.front().X;
270 y = data.Points.front().Y;
271 z = data.Points.front().Z;
272 }
273 else
274 {
276 handler->SetSentErrorMessage(true);
277 return false;
278 }
279
280 if (!MapManager::IsValidMapCoord(mapId, x, y) || sObjectMgr->IsTransportMap(mapId))
281 {
282 handler->PSendSysMessage(LANG_INVALID_TARGET_COORD, x, y, mapId);
283 handler->SetSentErrorMessage(true);
284 return false;
285 }
286
287 // stop flight if need
288 if (player->IsInFlight())
289 player->FinishTaxiFlight();
290 else
291 player->SaveRecallPosition(); // save only in non-flight case
292
293 std::shared_ptr<TerrainInfo> terrain = sTerrainMgr.LoadTerrain(mapId);
294 z = std::max(terrain->GetStaticHeight(PhasingHandler::GetEmptyPhaseShift(), mapId, x, y, MAX_HEIGHT), terrain->GetWaterLevel(PhasingHandler::GetEmptyPhaseShift(), mapId, x, y));
295
296 player->TeleportTo(mapId, x, y, z, 0.0f);
297 return true;
298 }
299
301 {
302 TaxiNodesEntry const* node = sTaxiNodesStore.LookupEntry(nodeId);
303 if (!node)
304 {
306 handler->SetSentErrorMessage(true);
307 return false;
308 }
309 return DoTeleport(handler, { node->Pos.X, node->Pos.Y, node->Pos.Z }, node->ContinentID);
310 }
311
313 {
314 AreaTriggerEntry const* at = sAreaTriggerStore.LookupEntry(areaTriggerId);
315 if (!at)
316 {
317 handler->PSendSysMessage(LANG_COMMAND_GOAREATRNOTFOUND, areaTriggerId);
318 handler->SetSentErrorMessage(true);
319 return false;
320 }
321 return DoTeleport(handler, { at->Pos.X, at->Pos.Y, at->Pos.Z }, at->ContinentID);
322 }
323
324 //teleport at coordinates
325 static bool HandleGoZoneXYCommand(ChatHandler* handler, float x, float y, Optional<Variant<Hyperlink<area>, uint32>> areaIdArg)
326 {
327 Player* player = handler->GetSession()->GetPlayer();
328
329 uint32 areaId = areaIdArg ? *areaIdArg : player->GetZoneId();
330
331 AreaTableEntry const* areaEntry = sAreaTableStore.LookupEntry(areaId);
332
333 if (x < 0 || x > 100 || y < 0 || y > 100 || !areaEntry)
334 {
335 handler->PSendSysMessage(LANG_INVALID_ZONE_COORD, x, y, areaId);
336 handler->SetSentErrorMessage(true);
337 return false;
338 }
339
340 // update to parent zone if exist (client map show only zones without parents)
341 AreaTableEntry const* zoneEntry = areaEntry->ParentAreaID && areaEntry->GetFlags().HasFlag(AreaFlags::IsSubzone)
342 ? sAreaTableStore.LookupEntry(areaEntry->ParentAreaID)
343 : areaEntry;
344 ASSERT(zoneEntry);
345
346 x /= 100.0f;
347 y /= 100.0f;
348
349 std::shared_ptr<TerrainInfo> terrain = sTerrainMgr.LoadTerrain(zoneEntry->ContinentID);
350 if (!sDB2Manager.Zone2MapCoordinates(zoneEntry->ID, x, y))
351 {
352 handler->PSendSysMessage(LANG_INVALID_ZONE_MAP, areaId, areaEntry->AreaName[handler->GetSessionDbcLocale()], terrain->GetId(), terrain->GetMapName());
353 handler->SetSentErrorMessage(true);
354 return false;
355 }
356
357 if (!MapManager::IsValidMapCoord(zoneEntry->ContinentID, x, y))
358 {
359 handler->PSendSysMessage(LANG_INVALID_TARGET_COORD, x, y, uint32(zoneEntry->ContinentID));
360 handler->SetSentErrorMessage(true);
361 return false;
362 }
363
364 // stop flight if need
365 if (player->IsInFlight())
366 player->FinishTaxiFlight();
367 else
368 player->SaveRecallPosition(); // save only in non-flight case
369
370 float z = std::max(terrain->GetStaticHeight(PhasingHandler::GetEmptyPhaseShift(), zoneEntry->ContinentID, x, y, MAX_HEIGHT), terrain->GetWaterLevel(PhasingHandler::GetEmptyPhaseShift(), zoneEntry->ContinentID, x, y));
371
372 player->TeleportTo(zoneEntry->ContinentID, x, y, z, player->GetOrientation());
373 return true;
374 }
375
376 //teleport at coordinates, including Z and orientation
377 static bool HandleGoXYZCommand(ChatHandler* handler, float x, float y, Optional<float> z, Optional<uint32> id, Optional<float> o)
378 {
379 Player* player = handler->GetSession()->GetPlayer();
380 uint32 mapId = id.value_or(player->GetMapId());
381 if (z)
382 {
383 if (!MapManager::IsValidMapCoord(mapId, x, y, *z))
384 {
385 handler->PSendSysMessage(LANG_INVALID_TARGET_COORD, x, y, mapId);
386 handler->SetSentErrorMessage(true);
387 return false;
388 }
389 }
390 else
391 {
392 if (!MapManager::IsValidMapCoord(mapId, x, y))
393 {
394 handler->PSendSysMessage(LANG_INVALID_TARGET_COORD, x, y, mapId);
395 handler->SetSentErrorMessage(true);
396 return false;
397 }
398 std::shared_ptr<TerrainInfo> terrain = sTerrainMgr.LoadTerrain(mapId);
399 z = std::max(terrain->GetStaticHeight(PhasingHandler::GetEmptyPhaseShift(), mapId, x, y, MAX_HEIGHT), terrain->GetWaterLevel(PhasingHandler::GetEmptyPhaseShift(), mapId, x, y));
400 }
401
402 return DoTeleport(handler, { x, y, *z, o.value_or(0.0f) }, mapId);
403 }
404
405 template<typename T>
406 static bool HandleGoTicketCommand(ChatHandler* handler, uint32 ticketId)
407 {
408 T* ticket = sSupportMgr->GetTicket<T>(ticketId);
409 if (!ticket)
410 {
412 return true;
413 }
414
415 Player* player = handler->GetSession()->GetPlayer();
416
417 // stop flight if need
418 if (player->IsInFlight())
419 player->FinishTaxiFlight();
420 else
421 player->SaveRecallPosition(); // save only in non-flight case
422
423 ticket->TeleportTo(player);
424 return true;
425 }
426
428 {
429 Position loc = handler->GetSession()->GetPlayer()->GetPosition();
430 loc.RelocateOffset({ dX, dY.value_or(0.0f), dZ.value_or(0.0f), dO.value_or(0.0f) });
431
432 return DoTeleport(handler, loc);
433 }
434
435 static bool HandleGoInstanceCommand(ChatHandler* handler, std::vector<std::string_view> labels)
436 {
437 if (labels.empty())
438 return false;
439
440 // #matched labels -> (mapid, scriptname)
441 std::multimap<uint32, std::tuple<uint16, char const*, char const*>> matches;
442 for (auto const& pair : sObjectMgr->GetInstanceTemplates())
443 {
444 uint32 count = 0;
445 std::string const& scriptName = sObjectMgr->GetScriptName(pair.second.ScriptId);
446 char const* mapName = ASSERT_NOTNULL(sMapStore.LookupEntry(pair.first))->MapName[handler->GetSessionDbcLocale()];
447 for (std::string_view label : labels)
448 if (StringContainsStringI(scriptName, label))
449 ++count;
450
451 if (count)
452 matches.emplace(count, decltype(matches)::mapped_type(pair.first, mapName, scriptName.c_str()));
453 }
454 if (matches.empty())
455 {
457 handler->SetSentErrorMessage(true);
458 return false;
459 }
460
461 auto it = matches.crbegin(), end = matches.crend();
462 uint32 const maxCount = it->first;
463 if ((++it) != end && it->first == maxCount)
464 {
466 --it;
467 do
468 handler->PSendSysMessage(LANG_COMMAND_MULTIPLE_INSTANCES_ENTRY, std::get<1>(it->second), std::get<0>(it->second), std::get<2>(it->second));
469 while (((++it) != end) && (it->first == maxCount));
470 handler->SetSentErrorMessage(true);
471 return false;
472 }
473
474 it = matches.crbegin();
475 uint32 const mapId = std::get<0>(it->second);
476 char const* const mapName = std::get<1>(it->second);
477
478 Player* player = handler->GetSession()->GetPlayer();
479 if (player->IsInFlight())
480 player->FinishTaxiFlight();
481 else
482 player->SaveRecallPosition();
483
484 // try going to entrance
485 if (AreaTriggerStruct const* exit = sObjectMgr->GetGoBackTrigger(mapId))
486 {
487 if (player->TeleportTo(exit->target_mapId, exit->target_X, exit->target_Y, exit->target_Z, exit->target_Orientation + M_PI))
488 {
489 handler->PSendSysMessage(LANG_COMMAND_WENT_TO_INSTANCE_GATE, mapName, mapId);
490 return true;
491 }
492 else
493 {
494 uint32 const parentMapId = exit->target_mapId;
495 char const* const parentMapName = ASSERT_NOTNULL(sMapStore.LookupEntry(parentMapId))->MapName[handler->GetSessionDbcLocale()];
496 handler->PSendSysMessage(LANG_COMMAND_GO_INSTANCE_GATE_FAILED, mapName, mapId, parentMapName, parentMapId);
497 }
498 }
499 else
500 handler->PSendSysMessage(LANG_COMMAND_INSTANCE_NO_EXIT, mapName, mapId);
501
502 // try going to start
503 if (AreaTriggerStruct const* entrance = sObjectMgr->GetMapEntranceTrigger(mapId))
504 {
505 if (player->TeleportTo(entrance->target_mapId, entrance->target_X, entrance->target_Y, entrance->target_Z, entrance->target_Orientation))
506 {
508 return true;
509 }
510 else
512 }
513 else
514 handler->PSendSysMessage(LANG_COMMAND_INSTANCE_NO_ENTRANCE, mapName, mapId);
515
516 handler->SetSentErrorMessage(true);
517 return false;
518 }
519
520 static bool HandleGoBossCommand(ChatHandler* handler, std::vector<std::string_view> needles)
521 {
522 if (needles.empty())
523 return false;
524
525 std::multimap<uint32, CreatureTemplate const*, std::greater<uint32>> matches;
526 std::unordered_map<uint32, std::vector<CreatureData const*>> spawnLookup;
527
528 // find all boss flagged mobs that match our needles
529 for (auto const& pair : sObjectMgr->GetCreatureTemplates())
530 {
531 CreatureTemplate const& data = pair.second;
532 uint32 count = 0;
533 std::string const& scriptName = sObjectMgr->GetScriptName(data.ScriptID);
534 for (std::string_view label : needles)
535 if (StringContainsStringI(scriptName, label) || StringContainsStringI(data.Name, label))
536 ++count;
537
538 if (count)
539 {
540 matches.emplace(count, &data);
541 spawnLookup.try_emplace(data.Entry); // inserts default-constructed vector
542 }
543 }
544
545 if (!matches.empty())
546 {
547 // find the spawn points of any matches
548 for (auto const& pair : sObjectMgr->GetAllCreatureData())
549 {
550 CreatureData const& data = pair.second;
551 auto it = spawnLookup.find(data.id);
552 if (it != spawnLookup.end())
553 it->second.push_back(&data);
554 }
555
556 // remove any matches without spawns
557 Trinity::Containers::EraseIf(matches, [&spawnLookup](decltype(matches)::value_type const& pair) { return spawnLookup[pair.second->Entry].empty(); });
558 }
559
560 // check if we even have any matches left
561 if (matches.empty())
562 {
564 handler->SetSentErrorMessage(true);
565 return false;
566 }
567
568 // see if we have multiple equal matches left
569 auto it = matches.cbegin(), end = matches.cend();
570 uint32 const maxCount = it->first;
571 if ((++it) != end && it->first == maxCount)
572 {
574 --it;
575 do
576 handler->PSendSysMessage(LANG_COMMAND_MULTIPLE_BOSSES_ENTRY, it->second->Entry, it->second->Name.c_str(), sObjectMgr->GetScriptName(it->second->ScriptID).c_str());
577 while (((++it) != end) && (it->first == maxCount));
578 handler->SetSentErrorMessage(true);
579 return false;
580 }
581
582 CreatureTemplate const* const boss = matches.cbegin()->second;
583 std::vector<CreatureData const*> const& spawns = spawnLookup[boss->Entry];
584 ASSERT(!spawns.empty());
585
586 if (spawns.size() > 1)
587 {
588 handler->PSendSysMessage(LANG_COMMAND_BOSS_MULTIPLE_SPAWNS, boss->Name.c_str(), boss->Entry);
589 for (CreatureData const* spawn : spawns)
590 {
591 uint32 const mapId = spawn->mapId;
592 MapEntry const* const map = ASSERT_NOTNULL(sMapStore.LookupEntry(mapId));
593 handler->PSendSysMessage(LANG_COMMAND_BOSS_MULTIPLE_SPAWN_ETY, spawn->spawnId, mapId, map->MapName[handler->GetSessionDbcLocale()], spawn->spawnPoint.ToString().c_str());
594 }
595 handler->SetSentErrorMessage(true);
596 return false;
597 }
598
599 Player* player = handler->GetSession()->GetPlayer();
600 if (player->IsInFlight())
601 player->FinishTaxiFlight();
602 else
603 player->SaveRecallPosition();
604
605 CreatureData const* const spawn = spawns.front();
606 uint32 const mapId = spawn->mapId;
607 if (!player->TeleportTo({ mapId, spawn->spawnPoint }))
608 {
609 char const* const mapName = ASSERT_NOTNULL(sMapStore.LookupEntry(mapId))->MapName[handler->GetSessionDbcLocale()];
610 handler->PSendSysMessage(LANG_COMMAND_GO_BOSS_FAILED, spawn->spawnId, boss->Name.c_str(), boss->Entry, mapName);
611 handler->SetSentErrorMessage(true);
612 return false;
613 }
614
615 handler->PSendSysMessage(LANG_COMMAND_WENT_TO_BOSS, boss->Name.c_str(), boss->Entry, spawn->spawnId);
616 return true;
617 }
618};
619
621{
622 new go_commandscript();
623}
#define M_PI
Definition: Common.h:115
DB2Storage< MapEntry > sMapStore("Map.db2", &MapLoadInfo::Instance)
DB2Storage< TaxiNodesEntry > sTaxiNodesStore("TaxiNodes.db2", &TaxiNodesLoadInfo::Instance)
DB2Storage< AreaTriggerEntry > sAreaTriggerStore("AreaTrigger.db2", &AreaTriggerLoadInfo::Instance)
DB2Storage< AreaTableEntry > sAreaTableStore("AreaTable.db2", &AreaTableLoadInfo::Instance)
#define sDB2Manager
Definition: DB2Stores.h:538
uint32_t uint32
Definition: Define.h:142
#define ASSERT_NOTNULL(pointer)
Definition: Errors.h:84
#define ASSERT
Definition: Errors.h:68
#define SIZE_OF_GRIDS
Definition: GridDefines.h:40
#define MAX_HEIGHT
Definition: GridDefines.h:60
#define CENTER_GRID_ID
Definition: GridDefines.h:41
@ LANG_COMMAND_INSTANCE_NO_ENTRANCE
Definition: Language.h:966
@ LANG_COMMAND_GO_INSTANCE_START_FAILED
Definition: Language.h:971
@ LANG_COMMAND_NO_BOSSES_MATCH
Definition: Language.h:981
@ LANG_COMMAND_GO_BOSS_FAILED
Definition: Language.h:986
@ LANG_COMMAND_GOCREATNOTFOUND
Definition: Language.h:320
@ LANG_COMMAND_BOSS_MULTIPLE_SPAWNS
Definition: Language.h:984
@ LANG_COMMAND_GRAVEYARDNOEXIST
Definition: Language.h:509
@ LANG_COMMAND_NO_INSTANCES_MATCH
Definition: Language.h:962
@ LANG_COMMAND_GOAREATRNOTFOUND
Definition: Language.h:314
@ LANG_COMMAND_WENT_TO_INSTANCE_GATE
Definition: Language.h:968
@ LANG_COMMAND_MULTIPLE_INSTANCES_ENTRY
Definition: Language.h:964
@ LANG_COMMAND_GOTAXINODENOTFOUND
Definition: Language.h:403
@ LANG_COMMAND_MULTIPLE_INSTANCES_MATCH
Definition: Language.h:963
@ LANG_INVALID_ZONE_MAP
Definition: Language.h:317
@ LANG_COMMAND_GOOBJNOTFOUND
Definition: Language.h:319
@ LANG_COMMAND_WENT_TO_INSTANCE_START
Definition: Language.h:969
@ LANG_INVALID_TARGET_COORD
Definition: Language.h:315
@ LANG_COMMAND_INSTANCE_NO_EXIT
Definition: Language.h:967
@ LANG_COMMAND_MULTIPLE_BOSSES_MATCH
Definition: Language.h:982
@ LANG_COMMAND_GOCREATMULTIPLE
Definition: Language.h:321
@ LANG_COMMAND_BOSS_MULTIPLE_SPAWN_ETY
Definition: Language.h:985
@ LANG_COMMAND_TICKETNOTEXIST
Definition: Language.h:1027
@ LANG_COMMAND_WENT_TO_BOSS
Definition: Language.h:987
@ LANG_INVALID_ZONE_COORD
Definition: Language.h:316
@ LANG_COMMAND_QUEST_NOTFOUND
Definition: Language.h:532
@ LANG_COMMAND_GO_INSTANCE_GATE_FAILED
Definition: Language.h:970
@ LANG_COMMAND_MULTIPLE_BOSSES_ENTRY
Definition: Language.h:983
#define sObjectMgr
Definition: ObjectMgr.h:1946
std::optional< T > Optional
Optional helper class to wrap optional values within.
Definition: Optional.h:25
#define MAPID_INVALID
Definition: Position.h:176
Role Based Access Control related classes definition.
#define sSupportMgr
Definition: SupportMgr.h:310
#define sTerrainMgr
Definition: TerrainMgr.h:165
bool StringContainsStringI(std::string_view haystack, std::string_view needle)
Definition: Util.cpp:896
WorldSession * GetSession()
Definition: Chat.h:42
virtual LocaleConstant GetSessionDbcLocale() const
Definition: Chat.cpp:592
void PSendSysMessage(const char *fmt, Args &&... args)
Definition: Chat.h:57
void SetSentErrorMessage(bool val)
Definition: Chat.h:114
virtual void SendSysMessage(std::string_view str, bool escapeCharacters=false)
Definition: Chat.cpp:113
static bool IsValidMapCoord(uint32 mapid, float x, float y)
Definition: MapManager.h:82
uint64 LowType
Definition: ObjectGuid.h:278
static PhaseShift const & GetEmptyPhaseShift()
bool TeleportTo(uint32 mapid, float x, float y, float z, float orientation, TeleportToOptions options=TELE_TO_NONE, Optional< uint32 > instanceId={})
Definition: Player.cpp:1250
void SaveRecallPosition()
Definition: Player.h:2491
void FinishTaxiFlight()
Definition: Player.cpp:22706
uint32 GetQuestId() const
Definition: QuestDef.h:587
bool IsInFlight() const
Definition: Unit.h:1012
constexpr uint32 GetMapId() const
Definition: Position.h:201
uint32 GetZoneId() const
Definition: Object.h:545
Player * GetPlayer() const
static bool HandleGoAreaTriggerCommand(ChatHandler *handler, Variant< Hyperlink< areatrigger >, uint32 > areaTriggerId)
Definition: cs_go.cpp:312
static bool HandleGoGameObjectSpawnIdCommand(ChatHandler *handler, Variant< Hyperlink< gameobject >, ObjectGuid::LowType > spawnId)
Definition: cs_go.cpp:143
static bool HandleGoGraveyardCommand(ChatHandler *handler, uint32 gyId)
Definition: cs_go.cpp:183
static bool HandleGoInstanceCommand(ChatHandler *handler, std::vector< std::string_view > labels)
Definition: cs_go.cpp:435
ChatCommandTable GetCommands() const override
Definition: cs_go.cpp:50
static bool HandleGoGameObjectGOIdCommand(ChatHandler *handler, Variant< Hyperlink< gameobject_entry >, uint32 > goId)
Definition: cs_go.cpp:156
static bool HandleGoOffsetCommand(ChatHandler *handler, float dX, Optional< float > dY, Optional< float > dZ, Optional< float > dO)
Definition: cs_go.cpp:427
static bool HandleGoTaxinodeCommand(ChatHandler *handler, Variant< Hyperlink< taxinode >, uint32 > nodeId)
Definition: cs_go.cpp:300
static bool DoTeleport(ChatHandler *handler, Position pos, uint32 mapId=MAPID_INVALID)
Definition: cs_go.cpp:80
static bool HandleGoQuestCommand(ChatHandler *handler, Variant< Hyperlink< quest >, uint32 > questData)
Definition: cs_go.cpp:241
static bool HandleGoBossCommand(ChatHandler *handler, std::vector< std::string_view > needles)
Definition: cs_go.cpp:520
static bool HandleGoGridCommand(ChatHandler *handler, float gridX, float gridY, Optional< uint32 > oMapId)
Definition: cs_go.cpp:212
static bool HandleGoTicketCommand(ChatHandler *handler, uint32 ticketId)
Definition: cs_go.cpp:406
static bool HandleGoCreatureSpawnIdCommand(ChatHandler *handler, Variant< Hyperlink< creature >, ObjectGuid::LowType > spawnId)
Definition: cs_go.cpp:103
static bool HandleGoZoneXYCommand(ChatHandler *handler, float x, float y, Optional< Variant< Hyperlink< area >, uint32 > > areaIdArg)
Definition: cs_go.cpp:325
static bool HandleGoXYZCommand(ChatHandler *handler, float x, float y, Optional< float > z, Optional< uint32 > id, Optional< float > o)
Definition: cs_go.cpp:377
static bool HandleGoCreatureCIdCommand(ChatHandler *handler, Variant< Hyperlink< creature_entry >, uint32 > cId)
Definition: cs_go.cpp:116
void AddSC_go_commandscript()
Definition: cs_go.cpp:620
std::vector< ChatCommandBuilder > ChatCommandTable
Definition: ChatCommand.h:49
void EraseIf(Container &c, Predicate p)
Definition: Containers.h:279
@ RBAC_PERM_COMMAND_GO
Definition: RBAC.h:249
uint16 ParentAreaID
Definition: DB2Structure.h:131
uint16 ContinentID
Definition: DB2Structure.h:130
EnumFlag< AreaFlags > GetFlags() const
Definition: DB2Structure.h:153
LocalizedString AreaName
Definition: DB2Structure.h:129
DBCPosition3D Pos
Definition: DB2Structure.h:165
std::string Name
Definition: CreatureData.h:483
LocalizedString MapName
constexpr float GetPositionX() const
Definition: Position.h:76
constexpr float GetPositionY() const
Definition: Position.h:77
constexpr void GetPosition(float &x, float &y) const
Definition: Position.h:81
void RelocateOffset(Position const &offset)
Definition: Position.cpp:34
constexpr float GetOrientation() const
Definition: Position.h:79
std::vector< QuestPOIBlobPoint > Points
Definition: ObjectMgr.h:805
uint32 id
Definition: SpawnData.h:104
Position spawnPoint
Definition: SpawnData.h:105
uint64 spawnId
Definition: SpawnData.h:93
uint32 mapId
Definition: SpawnData.h:94
DBCPosition3D Pos
WorldLocation Loc
Definition: ObjectMgr.h:835