diff options
author | ModoX <moardox@gmail.com> | 2022-08-11 20:54:12 +0200 |
---|---|---|
committer | Shauren <shauren.trinity@gmail.com> | 2022-09-02 19:27:27 +0200 |
commit | 10302dca55ffc7db8c8cfc5b42f68bb082b1e8d7 (patch) | |
tree | cb5f1d391e2d0d32d10cbcd2794263081b2feb76 | |
parent | b08a58dec6511b757fea7d9fb3a1a178d56d8bba (diff) |
Core/Commands: Added .quest objective complete command to complete single quest objectives
-rw-r--r-- | sql/base/auth_database.sql | 7 | ||||
-rw-r--r-- | sql/updates/auth/master/2022_09_02_00_auth.sql | 10 | ||||
-rw-r--r-- | sql/updates/world/master/2022_09_02_01_world.sql | 10 | ||||
-rw-r--r-- | src/server/game/Accounts/RBAC.h | 1 | ||||
-rw-r--r-- | src/server/game/Miscellaneous/Language.h | 3 | ||||
-rw-r--r-- | src/server/scripts/Commands/cs_quest.cpp | 161 |
6 files changed, 125 insertions, 67 deletions
diff --git a/sql/base/auth_database.sql b/sql/base/auth_database.sql index e358475568a..8c0005696bf 100644 --- a/sql/base/auth_database.sql +++ b/sql/base/auth_database.sql @@ -1306,6 +1306,7 @@ INSERT INTO `rbac_linked_permissions` VALUES (196,879), (196,881), (196,882), +(196,883), (197,232), (197,236), (197,237), @@ -2229,7 +2230,8 @@ INSERT INTO `rbac_permissions` VALUES (879,'Command: debug poolstatus'), (880,'Command: pdump copy'), (881,'Command: reload vehicle_template'), -(882,'Command: reload spell_script_names'); +(882,'Command: reload spell_script_names'), +(883,'Command: quest objective complete'); /*!40000 ALTER TABLE `rbac_permissions` ENABLE KEYS */; UNLOCK TABLES; @@ -2615,7 +2617,8 @@ INSERT INTO `updates` VALUES ('2022_08_17_00_auth.sql','1A45DAE660690A7F4D0822C514116BF44A3185BB','ARCHIVED','2022-08-17 10:16:00',0), ('2022_08_19_00_auth.sql','332E7CC2E69D69BF274E5C61768FB80D1C217BDB','ARCHIVED','2022-08-19 09:52:06',0), ('2022_08_19_01_auth.sql','8B32826AE09C27B98C9480EF4D61205666F68318','ARCHIVED','2022-08-19 23:43:01',0), -('2022_08_21_00_auth.sql','5DEC0CB848F99D575B90356D82276749F2473B72','ARCHIVED','2022-08-21 00:02:03',0); +('2022_08_21_00_auth.sql','5DEC0CB848F99D575B90356D82276749F2473B72','ARCHIVED','2022-08-21 00:02:03',0), +('2022_09_02_00_auth.sql','E2ED8B4B90829CFD283C9679AE265A9C9B2CF762','RELEASED','2022-09-02 15:52:22',0); /*!40000 ALTER TABLE `updates` ENABLE KEYS */; UNLOCK TABLES; diff --git a/sql/updates/auth/master/2022_09_02_00_auth.sql b/sql/updates/auth/master/2022_09_02_00_auth.sql new file mode 100644 index 00000000000..ead11623565 --- /dev/null +++ b/sql/updates/auth/master/2022_09_02_00_auth.sql @@ -0,0 +1,10 @@ +-- +SET @PERMISSION := 883; + +DELETE FROM `rbac_linked_permissions` WHERE `linkedId`=@PERMISSION; +DELETE FROM `rbac_permissions` WHERE `id`=@PERMISSION; +INSERT INTO `rbac_permissions` (`id`, `name`) VALUES +(@PERMISSION, 'Command: quest objective complete'); + +INSERT INTO `rbac_linked_permissions` (`id`, `linkedId`) VALUES +(196, @PERMISSION); diff --git a/sql/updates/world/master/2022_09_02_01_world.sql b/sql/updates/world/master/2022_09_02_01_world.sql new file mode 100644 index 00000000000..c94250e6468 --- /dev/null +++ b/sql/updates/world/master/2022_09_02_01_world.sql @@ -0,0 +1,10 @@ +-- +SET @STRINGENTRY := 884; + +DELETE FROM `command` WHERE `name`='quest objective complete'; +INSERT INTO `command` (`name`,`help`) VALUES +('quest objective complete','Syntax: .quest objective complete #questObjectiveId\nMark specific quest objective as completed for target character.'); + +DELETE FROM `trinity_string` WHERE `entry`=@STRINGENTRY; +INSERT INTO `trinity_string` (`entry`, `content_default`) VALUES +(@STRINGENTRY, 'Objective %u not found.'); diff --git a/src/server/game/Accounts/RBAC.h b/src/server/game/Accounts/RBAC.h index eeccc323446..c06c9fbe8df 100644 --- a/src/server/game/Accounts/RBAC.h +++ b/src/server/game/Accounts/RBAC.h @@ -748,6 +748,7 @@ enum RBACPermissions RBAC_PERM_COMMAND_PDUMP_COPY = 880, RBAC_PERM_COMMAND_RELOAD_VEHICLE_TEMPLATE = 881, RBAC_PERM_COMMAND_RELOAD_SPELL_SCRIPT_NAMES = 882, + RBAC_PERM_COMMAND_QUEST_OBJECTIVE_COMPLETE = 883, // // IF YOU ADD NEW PERMISSIONS, ADD THEM IN 3.3.5 BRANCH AS WELL! // diff --git a/src/server/game/Miscellaneous/Language.h b/src/server/game/Miscellaneous/Language.h index 0a55efb3bf9..6475ca55ddf 100644 --- a/src/server/game/Miscellaneous/Language.h +++ b/src/server/game/Miscellaneous/Language.h @@ -827,7 +827,8 @@ enum TrinityStrings LANG_RBAC_EMAIL_REQUIRED = 881, // = 882, LANG_PINFO_CHR_MAP_WITH_AREA LANG_ACCOUNT = 883, - // Room for in-game strings 884-999 not used + LANG_COMMAND_QUEST_OBJECTIVE_NOTFOUND = 884, + // Room for in-game strings 885-999 not used // Level 4 (CLI only commands) LANG_COMMAND_EXIT = 1000, diff --git a/src/server/scripts/Commands/cs_quest.cpp b/src/server/scripts/Commands/cs_quest.cpp index f901737fab7..a258be267f9 100644 --- a/src/server/scripts/Commands/cs_quest.cpp +++ b/src/server/scripts/Commands/cs_quest.cpp @@ -38,23 +38,30 @@ EndScriptData */ #pragma GCC diagnostic ignored "-Wdeprecated-declarations" #endif +using namespace Trinity::ChatCommands; + class quest_commandscript : public CommandScript { public: quest_commandscript() : CommandScript("quest_commandscript") { } - std::vector<ChatCommand> GetCommands() const override + ChatCommandTable GetCommands() const override { - static std::vector<ChatCommand> questCommandTable = + static ChatCommandTable objectiveCommandTable = + { + { "complete", HandleQuestObjectiveComplete, rbac::RBAC_PERM_COMMAND_QUEST_OBJECTIVE_COMPLETE, Console::No } + }; + static ChatCommandTable questCommandTable = { - { "add", rbac::RBAC_PERM_COMMAND_QUEST_ADD, false, &HandleQuestAdd, "" }, - { "complete", rbac::RBAC_PERM_COMMAND_QUEST_COMPLETE, false, &HandleQuestComplete, "" }, - { "remove", rbac::RBAC_PERM_COMMAND_QUEST_REMOVE, false, &HandleQuestRemove, "" }, - { "reward", rbac::RBAC_PERM_COMMAND_QUEST_REWARD, false, &HandleQuestReward, "" }, + { "add", HandleQuestAdd, rbac::RBAC_PERM_COMMAND_QUEST_ADD, Console::No }, + { "complete", HandleQuestComplete, rbac::RBAC_PERM_COMMAND_QUEST_COMPLETE, Console::No }, + { "objective", objectiveCommandTable }, + { "remove", HandleQuestRemove, rbac::RBAC_PERM_COMMAND_QUEST_REMOVE, Console::No }, + { "reward", HandleQuestReward, rbac::RBAC_PERM_COMMAND_QUEST_REWARD, Console::No }, }; - static std::vector<ChatCommand> commandTable = + static ChatCommandTable commandTable = { - { "quest", rbac::RBAC_PERM_COMMAND_QUEST, false, nullptr, "", questCommandTable }, + { "quest", questCommandTable } }; return commandTable; } @@ -176,6 +183,65 @@ public: } } + static void CompleteObjective(Player* player, QuestObjective const& obj) + { + switch (obj.Type) + { + case QUEST_OBJECTIVE_ITEM: + { + uint32 curItemCount = player->GetItemCount(obj.ObjectID, true); + ItemPosCountVec dest; + uint8 msg = player->CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, obj.ObjectID, obj.Amount - curItemCount); + if (msg == EQUIP_ERR_OK) + { + Item* item = player->StoreNewItem(dest, obj.ObjectID, true); + player->SendNewItem(item, obj.Amount - curItemCount, true, false); + } + break; + } + case QUEST_OBJECTIVE_MONSTER: + { + if (CreatureTemplate const* creatureInfo = sObjectMgr->GetCreatureTemplate(obj.ObjectID)) + for (uint16 z = 0; z < obj.Amount; ++z) + player->KilledMonster(creatureInfo, ObjectGuid::Empty); + break; + } + case QUEST_OBJECTIVE_GAMEOBJECT: + { + for (uint16 z = 0; z < obj.Amount; ++z) + player->KillCreditGO(obj.ObjectID); + break; + } + case QUEST_OBJECTIVE_MIN_REPUTATION: + { + uint32 curRep = player->GetReputationMgr().GetReputation(obj.ObjectID); + if (curRep < uint32(obj.Amount)) + if (FactionEntry const* factionEntry = sFactionStore.LookupEntry(obj.ObjectID)) + player->GetReputationMgr().SetReputation(factionEntry, obj.Amount); + break; + } + case QUEST_OBJECTIVE_MAX_REPUTATION: + { + uint32 curRep = player->GetReputationMgr().GetReputation(obj.ObjectID); + if (curRep > uint32(obj.Amount)) + if (FactionEntry const* factionEntry = sFactionStore.LookupEntry(obj.ObjectID)) + player->GetReputationMgr().SetReputation(factionEntry, obj.Amount); + break; + } + case QUEST_OBJECTIVE_MONEY: + { + player->ModifyMoney(obj.Amount); + break; + } + case QUEST_OBJECTIVE_PLAYERKILLS: + { + for (uint16 z = 0; z < obj.Amount; ++z) + player->KilledPlayerCredit(ObjectGuid::Empty); + break; + } + } + } + static bool HandleQuestComplete(ChatHandler* handler, char const* args) { Player* player = handler->getSelectedPlayerOrSelf(); @@ -208,62 +274,7 @@ public: for (uint32 i = 0; i < quest->Objectives.size(); ++i) { QuestObjective const& obj = quest->Objectives[i]; - - switch (obj.Type) - { - case QUEST_OBJECTIVE_ITEM: - { - uint32 curItemCount = player->GetItemCount(obj.ObjectID, true); - ItemPosCountVec dest; - uint8 msg = player->CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, obj.ObjectID, obj.Amount - curItemCount); - if (msg == EQUIP_ERR_OK) - { - Item* item = player->StoreNewItem(dest, obj.ObjectID, true); - player->SendNewItem(item, obj.Amount - curItemCount, true, false); - } - break; - } - case QUEST_OBJECTIVE_MONSTER: - { - if (CreatureTemplate const* creatureInfo = sObjectMgr->GetCreatureTemplate(obj.ObjectID)) - for (uint16 z = 0; z < obj.Amount; ++z) - player->KilledMonster(creatureInfo, ObjectGuid::Empty); - break; - } - case QUEST_OBJECTIVE_GAMEOBJECT: - { - for (uint16 z = 0; z < obj.Amount; ++z) - player->KillCreditGO(obj.ObjectID); - break; - } - case QUEST_OBJECTIVE_MIN_REPUTATION: - { - uint32 curRep = player->GetReputationMgr().GetReputation(obj.ObjectID); - if (curRep < uint32(obj.Amount)) - if (FactionEntry const* factionEntry = sFactionStore.LookupEntry(obj.ObjectID)) - player->GetReputationMgr().SetReputation(factionEntry, obj.Amount); - break; - } - case QUEST_OBJECTIVE_MAX_REPUTATION: - { - uint32 curRep = player->GetReputationMgr().GetReputation(obj.ObjectID); - if (curRep > uint32(obj.Amount)) - if (FactionEntry const* factionEntry = sFactionStore.LookupEntry(obj.ObjectID)) - player->GetReputationMgr().SetReputation(factionEntry, obj.Amount); - break; - } - case QUEST_OBJECTIVE_MONEY: - { - player->ModifyMoney(obj.Amount); - break; - } - case QUEST_OBJECTIVE_PLAYERKILLS: - { - for (uint16 z = 0; z < obj.Amount; ++z) - player->KilledPlayerCredit(ObjectGuid::Empty); - break; - } - } + CompleteObjective(player, obj); } if (sWorld->getBoolConfig(CONFIG_QUEST_ENABLE_QUEST_TRACKER)) // check if Quest Tracker is enabled @@ -281,6 +292,28 @@ public: return true; } + static bool HandleQuestObjectiveComplete(ChatHandler* handler, uint32 objectiveId) + { + Player* player = handler->getSelectedPlayerOrSelf(); + if (!player) + { + handler->SendSysMessage(LANG_NO_CHAR_SELECTED); + handler->SetSentErrorMessage(true); + return false; + } + + QuestObjective const* obj = sObjectMgr->GetQuestObjective(objectiveId); + if (!obj) + { + handler->SendSysMessage(LANG_COMMAND_QUEST_OBJECTIVE_NOTFOUND); + handler->SetSentErrorMessage(true); + return false; + } + + CompleteObjective(player, *obj); + return true; + } + static bool HandleQuestReward(ChatHandler* handler, char const* args) { Player* player = handler->getSelectedPlayer(); |