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 /src | |
parent | b08a58dec6511b757fea7d9fb3a1a178d56d8bba (diff) |
Core/Commands: Added .quest objective complete command to complete single quest objectives
Diffstat (limited to 'src')
-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 |
3 files changed, 100 insertions, 65 deletions
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(); |