From 2d7434f767e4dde6691190ea0f3441271577836a Mon Sep 17 00:00:00 2001 From: Skjalf <47818697+Nyeriah@users.noreply.github.com> Date: Mon, 31 Jan 2022 08:56:37 -0300 Subject: [PATCH] feat(Scripts/Commands): Implement go quest starter/ender command (#10442) * feat(Scripts/Commands): Implement go quest starter/ender command * Update cs_go.cpp --- .../rev_1643502379399332300.sql | 9 + src/server/game/Miscellaneous/Language.h | 4 +- src/server/scripts/Commands/cs_go.cpp | 173 +++++++++++++++--- 3 files changed, 156 insertions(+), 30 deletions(-) create mode 100644 data/sql/updates/pending_db_world/rev_1643502379399332300.sql diff --git a/data/sql/updates/pending_db_world/rev_1643502379399332300.sql b/data/sql/updates/pending_db_world/rev_1643502379399332300.sql new file mode 100644 index 000000000..c45747ee2 --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1643502379399332300.sql @@ -0,0 +1,9 @@ +INSERT INTO `version_db_world` (`sql_rev`) VALUES ('1643502379399332300'); + +DELETE FROM `command` WHERE `name` = 'go quest'; +INSERT INTO `command` (`name`, `security`, `help`) VALUES +('go quest', 1, 'Syntax: .go quest .\nTeleports you to the quest starter/ender creature or object.'); + +DELETE FROM `acore_string` WHERE `entry` = 5082; +INSERT INTO `acore_string` (`entry`, `content_default`, `locale_deDE`) VALUES +(5082, 'Incorrect syntax. Specify either \'starter\' or \'ender\'.', 'Falsche syntax. Entweder \'starter\' oder \'ender\' angeben.'); diff --git a/src/server/game/Miscellaneous/Language.h b/src/server/game/Miscellaneous/Language.h index 0380ebd5c..ac1dde52c 100644 --- a/src/server/game/Miscellaneous/Language.h +++ b/src/server/game/Miscellaneous/Language.h @@ -1248,7 +1248,9 @@ enum AcoreStrings LANG_CMD_SETTINGS_ANNOUNCER_ON = 5080, LANG_CMD_SETTINGS_ANNOUNCER_OFF = 5081, - // Room for more strings 5082-9999 + LANG_CMD_GOQUEST_INVALID_SYNTAX = 5082, + + // Room for more strings 5083-9999 // Level requirement notifications LANG_SAY_REQ = 6604, diff --git a/src/server/scripts/Commands/cs_go.cpp b/src/server/scripts/Commands/cs_go.cpp index c82376570..a2914ca66 100644 --- a/src/server/scripts/Commands/cs_go.cpp +++ b/src/server/scripts/Commands/cs_go.cpp @@ -52,7 +52,8 @@ public: { "trigger", HandleGoTriggerCommand, SEC_MODERATOR, Console::No }, { "zonexy", HandleGoZoneXYCommand, SEC_MODERATOR, Console::No }, { "xyz", HandleGoXYZCommand, SEC_MODERATOR, Console::No }, - { "ticket", HandleGoTicketCommand, SEC_GAMEMASTER, Console::No } + { "ticket", HandleGoTicketCommand, SEC_GAMEMASTER, Console::No }, + { "quest", HandleGoQuestCommand, SEC_MODERATOR, Console::No }, }; static ChatCommandTable commandTable = @@ -91,20 +92,7 @@ public: static bool HandleGoCreatureCIdCommand(ChatHandler* handler, Variant, uint32> cId) { - CreatureData const* spawnpoint = nullptr; - for (auto const& pair : sObjectMgr->GetAllCreatureData()) - { - if (pair.second.id1 != *cId) - continue; - - if (!spawnpoint) - spawnpoint = &pair.second; - else - { - handler->SendSysMessage(LANG_COMMAND_GOCREATMULTIPLE); - break; - } - } + CreatureData const* spawnpoint = GetCreatureData(handler, *cId); if (!spawnpoint) { @@ -144,20 +132,7 @@ public: static bool HandleGoGameObjectGOIdCommand(ChatHandler* handler, uint32 goId) { - GameObjectData const* spawnpoint = nullptr; - for (auto const& pair : sObjectMgr->GetAllGOData()) - { - if (pair.second.id != goId) - continue; - - if (!spawnpoint) - spawnpoint = &pair.second; - else - { - handler->SendSysMessage(LANG_COMMAND_GOCREATMULTIPLE); - break; - } - } + GameObjectData const* spawnpoint = GetGameObjectData(handler, goId); if (!spawnpoint) { @@ -367,6 +342,146 @@ public: ticket->TeleportTo(player); return true; } + + static bool HandleGoQuestCommand(ChatHandler* handler, std::string_view type, Quest const* quest) + { + uint32 entry = quest->GetQuestId(); + + if (type == "starter") + { + QuestRelations* qr = sObjectMgr->GetCreatureQuestRelationMap(); + + for (auto itr = qr->begin(); itr != qr->end(); ++itr) + { + if (itr->second == entry) + { + CreatureData const* spawnpoint = GetCreatureData(handler, itr->first); + if (!spawnpoint) + { + handler->SendSysMessage(LANG_COMMAND_GOCREATNOTFOUND); + handler->SetSentErrorMessage(true); + return false; + } + + // We've found a creature, teleport to it. + return DoTeleport(handler, { spawnpoint->posX, spawnpoint->posY, spawnpoint->posZ }, spawnpoint->mapid); + } + } + + qr = sObjectMgr->GetGOQuestRelationMap(); + + for (auto itr = qr->begin(); itr != qr->end(); ++itr) + { + if (itr->second == entry) + { + GameObjectData const* spawnpoint = GetGameObjectData(handler, itr->first); + if (!spawnpoint) + { + handler->SendSysMessage(LANG_COMMAND_GOOBJNOTFOUND); + handler->SetSentErrorMessage(true); + return false; + } + + return DoTeleport(handler, { spawnpoint->posX, spawnpoint->posY, spawnpoint->posZ }, spawnpoint->mapid); + } + } + } + else if (type == "ender") + { + QuestRelations* qr = sObjectMgr->GetCreatureQuestInvolvedRelationMap(); + + for (auto itr = qr->begin(); itr != qr->end(); ++itr) + { + if (itr->second == entry) + { + CreatureData const* spawnpoint = GetCreatureData(handler, itr->first); + if (!spawnpoint) + { + handler->SendSysMessage(LANG_COMMAND_GOCREATNOTFOUND); + handler->SetSentErrorMessage(true); + return false; + } + + // We've found a creature, teleport to it. + return DoTeleport(handler, { spawnpoint->posX, spawnpoint->posY, spawnpoint->posZ }, spawnpoint->mapid); + } + } + + qr = sObjectMgr->GetGOQuestInvolvedRelationMap(); + + for (auto itr = qr->begin(); itr != qr->end(); ++itr) + { + if (itr->second == entry) + { + GameObjectData const* spawnpoint = GetGameObjectData(handler, itr->first); + if (!spawnpoint) + { + handler->SendSysMessage(LANG_COMMAND_GOOBJNOTFOUND); + handler->SetSentErrorMessage(true); + return false; + } + + return DoTeleport(handler, { spawnpoint->posX, spawnpoint->posY, spawnpoint->posZ }, spawnpoint->mapid); + } + } + } + else + { + handler->SendSysMessage(LANG_CMD_GOQUEST_INVALID_SYNTAX); + handler->SetSentErrorMessage(true); + return false; + } + + return false; + } + + static CreatureData const* GetCreatureData(ChatHandler* handler, uint32 entry) + { + CreatureData const* spawnpoint = nullptr; + for (auto const& pair : sObjectMgr->GetAllCreatureData()) + { + if (pair.second.id1 != entry) + { + continue; + } + + if (!spawnpoint) + { + spawnpoint = &pair.second; + } + else + { + handler->SendSysMessage(LANG_COMMAND_GOCREATMULTIPLE); + break; + } + } + + return spawnpoint; + } + + static GameObjectData const* GetGameObjectData(ChatHandler* handler, uint32 entry) + { + GameObjectData const* spawnpoint = nullptr; + for (auto const& pair : sObjectMgr->GetAllGOData()) + { + if (pair.second.id != entry) + { + continue; + } + + if (!spawnpoint) + { + spawnpoint = &pair.second; + } + else + { + handler->SendSysMessage(LANG_COMMAND_GOCREATMULTIPLE); + break; + } + } + + return spawnpoint; + } }; void AddSC_go_commandscript()