From 6fcc12de09a3cd31f83aafcaa763509ca1545869 Mon Sep 17 00:00:00 2001 From: hondacrx Date: Fri, 2 Sep 2022 18:08:55 -0400 Subject: [PATCH] Core/Commands: Convert quest commands to new system Port From (https://github.com/TrinityCore/TrinityCore/commit/6d2b8511547004b997cc1de76cdbaf5498b8b12c) --- Source/Game/Chat/CommandArgs.cs | 27 +-- Source/Game/Chat/Commands/QuestCommands.cs | 240 ++++++++++----------- Source/Game/Chat/Hyperlink.cs | 2 +- 3 files changed, 124 insertions(+), 145 deletions(-) diff --git a/Source/Game/Chat/CommandArgs.cs b/Source/Game/Chat/CommandArgs.cs index 04ea1c562..fc1a412a8 100644 --- a/Source/Game/Chat/CommandArgs.cs +++ b/Source/Game/Chat/CommandArgs.cs @@ -93,7 +93,7 @@ namespace Game.Chat if (type.IsEnum) type = type.GetEnumUnderlyingType(); - var (token, tail) = Tokenize(args); + var (token, tail) = args.Tokenize(); switch (Type.GetTypeCode(type)) { case TypeCode.SByte: @@ -271,6 +271,14 @@ namespace Game.Chat return ChatCommandResult.FromErrorMessage(handler.GetParsedString(CypherStrings.CmdparserSpellNoExist, tempVal)); } + case nameof(Quest): + { + ChatCommandResult result = TryConsume(out dynamic tempVal, typeof(uint), handler, args); + if (!result.IsSuccessful() || (val = Global.ObjectMgr.GetQuestTemplate(tempVal))) + return result; + + return ChatCommandResult.FromErrorMessage(handler.GetParsedString(CypherStrings.CmdparserQuestNoExist, tempVal)); + } } break; } @@ -312,23 +320,6 @@ namespace Game.Chat else return default; } - - public static (string token, string tail) Tokenize(string args) - { - (string token, string tail) result = new ("", ""); - int delimPos = args.IndexOf(' '); - if (delimPos != -1) - { - result.token = args.Substring(0, delimPos); - int tailPos = args.FindFirstNotOf(" ", delimPos); - if (tailPos != -1) - result.tail = args.Substring(tailPos); - } - else - result.token = args; - - return result; - } } public struct ChatCommandResult diff --git a/Source/Game/Chat/Commands/QuestCommands.cs b/Source/Game/Chat/Commands/QuestCommands.cs index 45577e872..a90a3849d 100644 --- a/Source/Game/Chat/Commands/QuestCommands.cs +++ b/Source/Game/Chat/Commands/QuestCommands.cs @@ -16,7 +16,6 @@ */ using Framework.Constants; -using Framework.IO; using Game.DataStorage; using Game.Entities; using System.Collections.Generic; @@ -28,7 +27,7 @@ namespace Game.Chat class QuestCommands { [Command("add", RBACPermissions.CommandQuestAdd)] - static bool HandleQuestAdd(CommandHandler handler, StringArguments args) + static bool HandleQuestAdd(CommandHandler handler, Quest quest) { Player player = handler.GetSelectedPlayer(); if (!player) @@ -37,30 +36,23 @@ namespace Game.Chat return false; } - // .addquest #entry' - // number or [name] Shift-click form |color|Hquest:quest_id:quest_level:min_level:max_level:scaling_faction|h[name]|h|r - string cId = handler.ExtractKeyFromLink(args, "Hquest"); - if (!uint.TryParse(cId, out uint entry)) - return false; - - Quest quest = Global.ObjectMgr.GetQuestTemplate(entry); - if (quest == null || Global.DisableMgr.IsDisabledFor(DisableType.Quest, entry, null)) + if (Global.DisableMgr.IsDisabledFor(DisableType.Quest, quest.Id, null)) { - handler.SendSysMessage(CypherStrings.CommandQuestNotfound, entry); + handler.SendSysMessage(CypherStrings.CommandQuestNotfound, quest.Id); return false; } // check item starting quest (it can work incorrectly if added without item in inventory) var itc = Global.ObjectMgr.GetItemTemplates(); - var result = itc.Values.FirstOrDefault(p => p.GetStartQuest() == entry); + var result = itc.Values.FirstOrDefault(p => p.GetStartQuest() == quest.Id); if (result != null) { - handler.SendSysMessage(CypherStrings.CommandQuestStartfromitem, entry, result.GetId()); + handler.SendSysMessage(CypherStrings.CommandQuestStartfromitem, quest.Id, result.GetId()); return false; } - if (player.IsActiveQuest(entry)) + if (player.IsActiveQuest(quest.Id)) return false; // ok, normal (creature/GO starting) quest @@ -71,7 +63,7 @@ namespace Game.Chat } [Command("complete", RBACPermissions.CommandQuestComplete)] - static bool HandleQuestComplete(CommandHandler handler, StringArguments args) + static bool HandleQuestComplete(CommandHandler handler, Quest quest) { Player player = handler.GetSelectedPlayer(); if (!player) @@ -80,96 +72,22 @@ namespace Game.Chat return false; } - // .quest complete #entry - // number or [name] Shift-click form |color|Hquest:quest_id:quest_level:min_level:max_level:scaling_faction|h[name]|h|r - string cId = handler.ExtractKeyFromLink(args, "Hquest"); - if (!uint.TryParse(cId, out uint entry)) - return false; - - Quest quest = Global.ObjectMgr.GetQuestTemplate(entry); - // If player doesn't have the quest - if (quest == null || player.GetQuestStatus(entry) == QuestStatus.None || Global.DisableMgr.IsDisabledFor(DisableType.Quest, entry, null)) + if (player.GetQuestStatus(quest.Id) == QuestStatus.None || Global.DisableMgr.IsDisabledFor(DisableType.Quest, quest.Id, null)) { - handler.SendSysMessage(CypherStrings.CommandQuestNotfound, entry); + handler.SendSysMessage(CypherStrings.CommandQuestNotfound, quest.Id); return false; } - for (int i = 0; i < quest.Objectives.Count; ++i) - { - QuestObjective obj = quest.Objectives[i]; + foreach (var obj in quest.Objectives) + CompleteObjective(player, obj); - switch (obj.Type) - { - case QuestObjectiveType.Item: - { - uint curItemCount = player.GetItemCount((uint)obj.ObjectID, true); - List dest = new(); - InventoryResult msg = player.CanStoreNewItem(ItemConst.NullBag, ItemConst.NullSlot, dest, (uint)obj.ObjectID, (uint)(obj.Amount - curItemCount)); - if (msg == InventoryResult.Ok) - { - Item item = player.StoreNewItem(dest, (uint)obj.ObjectID, true); - player.SendNewItem(item, (uint)(obj.Amount - curItemCount), true, false); - } - break; - } - case QuestObjectiveType.Monster: - { - CreatureTemplate creatureInfo = Global.ObjectMgr.GetCreatureTemplate((uint)obj.ObjectID); - if (creatureInfo != null) - for (int z = 0; z < obj.Amount; ++z) - player.KilledMonster(creatureInfo, ObjectGuid.Empty); - break; - } - case QuestObjectiveType.GameObject: - { - for (int z = 0; z < obj.Amount; ++z) - player.KillCreditGO((uint)obj.ObjectID); - break; - } - case QuestObjectiveType.MinReputation: - { - int curRep = player.GetReputationMgr().GetReputation((uint)obj.ObjectID); - if (curRep < obj.Amount) - { - FactionRecord factionEntry = CliDB.FactionStorage.LookupByKey(obj.ObjectID); - if (factionEntry != null) - player.GetReputationMgr().SetReputation(factionEntry, obj.Amount); - } - break; - } - case QuestObjectiveType.MaxReputation: - { - int curRep = player.GetReputationMgr().GetReputation((uint)obj.ObjectID); - if (curRep > obj.Amount) - { - FactionRecord factionEntry = CliDB.FactionStorage.LookupByKey(obj.ObjectID); - if (factionEntry != null) - player.GetReputationMgr().SetReputation(factionEntry, obj.Amount); - } - break; - } - case QuestObjectiveType.Money: - { - player.ModifyMoney(obj.Amount); - break; - } - case QuestObjectiveType.PlayerKills: - { - for (var z = 0; z < obj.Amount; ++z) - player.KilledPlayerCredit(ObjectGuid.Empty); - break; - } - } - - } - - player.CompleteQuest(entry); + player.CompleteQuest(quest.Id); return true; } [Command("remove", RBACPermissions.CommandQuestRemove)] - static bool HandleQuestRemove(CommandHandler handler, StringArguments args) + static bool HandleQuestRemove(CommandHandler handler, Quest quest) { Player player = handler.GetSelectedPlayer(); if (!player) @@ -178,28 +96,15 @@ namespace Game.Chat return false; } - // .removequest #entry' - // number or [name] Shift-click form |color|Hquest:quest_id:quest_level:min_level:max_level:scaling_faction|h[name]|h|r - string cId = handler.ExtractKeyFromLink(args, "Hquest"); - if (!uint.TryParse(cId, out uint entry)) - return false; + QuestStatus oldStatus = player.GetQuestStatus(quest.Id); - Quest quest = Global.ObjectMgr.GetQuestTemplate(entry); - if (quest == null) - { - handler.SendSysMessage(CypherStrings.CommandQuestNotfound, entry); - return false; - } - - QuestStatus oldStatus = player.GetQuestStatus(entry); - - if (player.GetQuestStatus(entry) != QuestStatus.None) + if (oldStatus != QuestStatus.None) { // remove all quest entries for 'entry' from quest log for (byte slot = 0; slot < SharedConst.MaxQuestLogSize; ++slot) { uint logQuest = player.GetQuestSlotQuestId(slot); - if (logQuest == entry) + if (logQuest == quest.Id) { player.SetQuestSlot(slot, 0); @@ -214,10 +119,10 @@ namespace Game.Chat } } - player.RemoveActiveQuest(entry, false); - player.RemoveRewardedQuest(entry); + player.RemoveActiveQuest(quest.Id, false); + player.RemoveRewardedQuest(quest.Id); - Global.ScriptMgr.OnQuestStatusChange(player, entry); + Global.ScriptMgr.OnQuestStatusChange(player, quest.Id); Global.ScriptMgr.OnQuestStatusChange(player, quest, oldStatus, QuestStatus.None); handler.SendSysMessage(CypherStrings.CommandQuestRemoved); @@ -225,13 +130,13 @@ namespace Game.Chat } else { - handler.SendSysMessage(CypherStrings.CommandQuestNotfound, entry); + handler.SendSysMessage(CypherStrings.CommandQuestNotfound, quest.Id); return false; } } [Command("reward", RBACPermissions.CommandQuestReward)] - static bool HandleQuestReward(CommandHandler handler, StringArguments args) + static bool HandleQuestReward(CommandHandler handler, Quest quest) { Player player = handler.GetSelectedPlayer(); if (!player) @@ -240,23 +145,106 @@ namespace Game.Chat return false; } - // .quest reward #entry - // number or [name] Shift-click form |color|Hquest:quest_id:quest_level:min_level:max_level:scaling_faction|h[name]|h|r - string cId = handler.ExtractKeyFromLink(args, "Hquest"); - if (!uint.TryParse(cId, out uint entry)) - return false; - - Quest quest = Global.ObjectMgr.GetQuestTemplate(entry); - // If player doesn't have the quest - if (quest == null || player.GetQuestStatus(entry) != QuestStatus.Complete || Global.DisableMgr.IsDisabledFor(DisableType.Quest, entry, null)) + if (player.GetQuestStatus(quest.Id) != QuestStatus.Complete || Global.DisableMgr.IsDisabledFor(DisableType.Quest, quest.Id, null)) { - handler.SendSysMessage(CypherStrings.CommandQuestNotfound, entry); + handler.SendSysMessage(CypherStrings.CommandQuestNotfound, quest.Id); return false; } player.RewardQuest(quest, LootItemType.Item, 0, player); return true; } + + [CommandGroup("objective")] + class ObjectiveCommands + { + [Command("complete", RBACPermissions.CommandQuestObjectiveComplete)] + static bool HandleQuestObjectiveComplete(CommandHandler handler, uint objectiveId) + { + Player player = handler.GetSelectedPlayerOrSelf(); + if (!player) + { + handler.SendSysMessage(CypherStrings.NoCharSelected); + return false; + } + + QuestObjective obj = Global.ObjectMgr.GetQuestObjective(objectiveId); + if (obj == null) + { + handler.SendSysMessage(CypherStrings.QuestObjectiveNotfound); + return false; + } + + CompleteObjective(player, obj); + return true; + } + } + + static void CompleteObjective(Player player, QuestObjective obj) + { + switch (obj.Type) + { + case QuestObjectiveType.Item: + { + uint curItemCount = player.GetItemCount((uint)obj.ObjectID, true); + List dest = new(); + var msg = player.CanStoreNewItem(ItemConst.NullBag, ItemConst.NullSlot, dest, (uint)obj.ObjectID, (uint)(obj.Amount - curItemCount)); + if (msg == InventoryResult.Ok) + { + Item item = player.StoreNewItem(dest, (uint)obj.ObjectID, true); + player.SendNewItem(item, (uint)(obj.Amount - curItemCount), true, false); + } + break; + } + case QuestObjectiveType.Monster: + { + CreatureTemplate creatureInfo = Global.ObjectMgr.GetCreatureTemplate((uint)obj.ObjectID); + if (creatureInfo != null) + for (var z = 0; z < obj.Amount; ++z) + player.KilledMonster(creatureInfo, ObjectGuid.Empty); + break; + } + case QuestObjectiveType.GameObject: + { + for (var z = 0; z < obj.Amount; ++z) + player.KillCreditGO((uint)obj.ObjectID); + break; + } + case QuestObjectiveType.MinReputation: + { + int curRep = player.GetReputationMgr().GetReputation((uint)obj.ObjectID); + if (curRep < obj.Amount) + { + var factionEntry = CliDB.FactionStorage.LookupByKey(obj.ObjectID); + if (factionEntry != null) + player.GetReputationMgr().SetReputation(factionEntry, obj.Amount); + } + break; + } + case QuestObjectiveType.MaxReputation: + { + int curRep = player.GetReputationMgr().GetReputation((uint)obj.ObjectID); + if (curRep > obj.Amount) + { + var factionEntry = CliDB.FactionStorage.LookupByKey(obj.ObjectID); + if (factionEntry != null) + player.GetReputationMgr().SetReputation(factionEntry, obj.Amount); + } + break; + } + case QuestObjectiveType.Money: + { + player.ModifyMoney(obj.Amount); + break; + } + case QuestObjectiveType.PlayerKills: + { + for (var z = 0; z < obj.Amount; ++z) + player.KilledPlayerCredit(ObjectGuid.Empty); + break; + } + } + } } } diff --git a/Source/Game/Chat/Hyperlink.cs b/Source/Game/Chat/Hyperlink.cs index 36635ed3e..d3dc23b16 100644 --- a/Source/Game/Chat/Hyperlink.cs +++ b/Source/Game/Chat/Hyperlink.cs @@ -62,7 +62,7 @@ namespace Game.Chat } // finally, skip any potential delimiters - var (token, next) = CommandArgs.Tokenize(info.Tail); + var (token, next) = info.Tail.Tokenize(); if (token.IsEmpty()) /* empty token = first character is delimiter, skip past it */ return new ChatCommandResult(next); else