Core/Commands: Convert quest commands to new system

Port From (https://github.com/TrinityCore/TrinityCore/commit/6d2b8511547004b997cc1de76cdbaf5498b8b12c)
This commit is contained in:
hondacrx
2022-09-02 18:08:55 -04:00
parent d5bf9cd42d
commit 6fcc12de09
3 changed files with 124 additions and 145 deletions
+9 -18
View File
@@ -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
+114 -126
View File
@@ -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<ItemPosCount> 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<ItemPosCount> 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;
}
}
}
}
}
+1 -1
View File
@@ -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