diff --git a/data/sql/updates/pending_db_world/rev_1763246362850973100.sql b/data/sql/updates/pending_db_world/rev_1763246362850973100.sql new file mode 100644 index 000000000..3285ad14d --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1763246362850973100.sql @@ -0,0 +1,9 @@ +-- +DELETE FROM `acore_string` WHERE `entry` IN (5088, 5089); +INSERT INTO `acore_string` (`entry`, `content_default`) VALUES +(5088, 'Quest: {} ({}) \nStatus: {}'), +(5089, 'Quest can\'t be taken!'); + +DELETE FROM `command` WHERE `name` = 'quest status'; +INSERT INTO `command` (`name`, `security`, `help`) VALUES +('quest status', 2, 'Syntax: .quest status $id [$name]. Displays the selected player\'s status for the specified quest.'); diff --git a/src/server/game/Miscellaneous/Language.h b/src/server/game/Miscellaneous/Language.h index 66db5fd99..66268e3b4 100644 --- a/src/server/game/Miscellaneous/Language.h +++ b/src/server/game/Miscellaneous/Language.h @@ -1157,7 +1157,10 @@ enum AcoreStrings LANG_CMD_NO_DOOR_FOUND = 5086, LANG_CMD_DOOR_OPENED = 5087, - // Room for more strings 5088-9999 + LANG_CMD_QUEST_STATUS = 5088, + LANG_CMD_QUEST_UNAVAILABLE = 5089, + + // Room for more strings 5090-9999 // Level requirement notifications LANG_SAY_REQ = 6604, diff --git a/src/server/scripts/Commands/cs_quest.cpp b/src/server/scripts/Commands/cs_quest.cpp index c2ae75cb6..9730b3221 100644 --- a/src/server/scripts/Commands/cs_quest.cpp +++ b/src/server/scripts/Commands/cs_quest.cpp @@ -37,6 +37,7 @@ public: { "complete", HandleQuestComplete, SEC_GAMEMASTER, Console::Yes }, { "remove", HandleQuestRemove, SEC_GAMEMASTER, Console::Yes }, { "reward", HandleQuestReward, SEC_GAMEMASTER, Console::Yes }, + { "status", HandleQuestStatus, SEC_GAMEMASTER, Console::Yes }, }; static ChatCommandTable commandTable = { @@ -724,6 +725,53 @@ public: handler->SetSentErrorMessage(false); return true; } + + static bool HandleQuestStatus(ChatHandler* handler, Quest const* quest, Optional playerTarget) + { + if (!playerTarget) + playerTarget = PlayerIdentifier::FromTargetOrSelf(handler); + + if (!playerTarget) + { + handler->SendErrorMessage(LANG_PLAYER_NOT_FOUND); + return false; + } + + uint32 entry = quest->GetQuestId(); + std::string status; + if (Player* player = playerTarget->GetConnectedPlayer()) + { + QuestStatus qs = player->GetQuestStatus(entry); + switch (qs) + { + case QUEST_STATUS_NONE: + status = "Not Taken"; + break; + case QUEST_STATUS_COMPLETE: + status = "Complete"; + break; + case QUEST_STATUS_INCOMPLETE: + status = "Incomplete"; + break; + case QUEST_STATUS_FAILED: + status = "Failed"; + break; + case QUEST_STATUS_REWARDED: + status = "Rewarded"; + break; + default: + status = "Unknown"; + break; + } + + handler->PSendSysMessage(LANG_CMD_QUEST_STATUS, quest->GetTitle(), entry, status); + + if (!player->CanTakeQuest(quest, true)) + handler->PSendSysMessage(LANG_CMD_QUEST_UNAVAILABLE, entry, status); + } + + return true; + } }; void AddSC_quest_commandscript()