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) if (type.IsEnum)
type = type.GetEnumUnderlyingType(); type = type.GetEnumUnderlyingType();
var (token, tail) = Tokenize(args); var (token, tail) = args.Tokenize();
switch (Type.GetTypeCode(type)) switch (Type.GetTypeCode(type))
{ {
case TypeCode.SByte: case TypeCode.SByte:
@@ -271,6 +271,14 @@ namespace Game.Chat
return ChatCommandResult.FromErrorMessage(handler.GetParsedString(CypherStrings.CmdparserSpellNoExist, tempVal)); 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; break;
} }
@@ -312,23 +320,6 @@ namespace Game.Chat
else else
return default; 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 public struct ChatCommandResult
+114 -126
View File
@@ -16,7 +16,6 @@
*/ */
using Framework.Constants; using Framework.Constants;
using Framework.IO;
using Game.DataStorage; using Game.DataStorage;
using Game.Entities; using Game.Entities;
using System.Collections.Generic; using System.Collections.Generic;
@@ -28,7 +27,7 @@ namespace Game.Chat
class QuestCommands class QuestCommands
{ {
[Command("add", RBACPermissions.CommandQuestAdd)] [Command("add", RBACPermissions.CommandQuestAdd)]
static bool HandleQuestAdd(CommandHandler handler, StringArguments args) static bool HandleQuestAdd(CommandHandler handler, Quest quest)
{ {
Player player = handler.GetSelectedPlayer(); Player player = handler.GetSelectedPlayer();
if (!player) if (!player)
@@ -37,30 +36,23 @@ namespace Game.Chat
return false; return false;
} }
// .addquest #entry' if (Global.DisableMgr.IsDisabledFor(DisableType.Quest, quest.Id, null))
// 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))
{ {
handler.SendSysMessage(CypherStrings.CommandQuestNotfound, entry); handler.SendSysMessage(CypherStrings.CommandQuestNotfound, quest.Id);
return false; return false;
} }
// check item starting quest (it can work incorrectly if added without item in inventory) // check item starting quest (it can work incorrectly if added without item in inventory)
var itc = Global.ObjectMgr.GetItemTemplates(); 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) if (result != null)
{ {
handler.SendSysMessage(CypherStrings.CommandQuestStartfromitem, entry, result.GetId()); handler.SendSysMessage(CypherStrings.CommandQuestStartfromitem, quest.Id, result.GetId());
return false; return false;
} }
if (player.IsActiveQuest(entry)) if (player.IsActiveQuest(quest.Id))
return false; return false;
// ok, normal (creature/GO starting) quest // ok, normal (creature/GO starting) quest
@@ -71,7 +63,7 @@ namespace Game.Chat
} }
[Command("complete", RBACPermissions.CommandQuestComplete)] [Command("complete", RBACPermissions.CommandQuestComplete)]
static bool HandleQuestComplete(CommandHandler handler, StringArguments args) static bool HandleQuestComplete(CommandHandler handler, Quest quest)
{ {
Player player = handler.GetSelectedPlayer(); Player player = handler.GetSelectedPlayer();
if (!player) if (!player)
@@ -80,96 +72,22 @@ namespace Game.Chat
return false; 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 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; return false;
} }
for (int i = 0; i < quest.Objectives.Count; ++i) foreach (var obj in quest.Objectives)
{ CompleteObjective(player, obj);
QuestObjective obj = quest.Objectives[i];
switch (obj.Type) player.CompleteQuest(quest.Id);
{
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);
return true; return true;
} }
[Command("remove", RBACPermissions.CommandQuestRemove)] [Command("remove", RBACPermissions.CommandQuestRemove)]
static bool HandleQuestRemove(CommandHandler handler, StringArguments args) static bool HandleQuestRemove(CommandHandler handler, Quest quest)
{ {
Player player = handler.GetSelectedPlayer(); Player player = handler.GetSelectedPlayer();
if (!player) if (!player)
@@ -178,28 +96,15 @@ namespace Game.Chat
return false; return false;
} }
// .removequest #entry' QuestStatus oldStatus = player.GetQuestStatus(quest.Id);
// 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 (oldStatus != QuestStatus.None)
if (quest == null)
{
handler.SendSysMessage(CypherStrings.CommandQuestNotfound, entry);
return false;
}
QuestStatus oldStatus = player.GetQuestStatus(entry);
if (player.GetQuestStatus(entry) != QuestStatus.None)
{ {
// remove all quest entries for 'entry' from quest log // remove all quest entries for 'entry' from quest log
for (byte slot = 0; slot < SharedConst.MaxQuestLogSize; ++slot) for (byte slot = 0; slot < SharedConst.MaxQuestLogSize; ++slot)
{ {
uint logQuest = player.GetQuestSlotQuestId(slot); uint logQuest = player.GetQuestSlotQuestId(slot);
if (logQuest == entry) if (logQuest == quest.Id)
{ {
player.SetQuestSlot(slot, 0); player.SetQuestSlot(slot, 0);
@@ -214,10 +119,10 @@ namespace Game.Chat
} }
} }
player.RemoveActiveQuest(entry, false); player.RemoveActiveQuest(quest.Id, false);
player.RemoveRewardedQuest(entry); player.RemoveRewardedQuest(quest.Id);
Global.ScriptMgr.OnQuestStatusChange(player, entry); Global.ScriptMgr.OnQuestStatusChange(player, quest.Id);
Global.ScriptMgr.OnQuestStatusChange(player, quest, oldStatus, QuestStatus.None); Global.ScriptMgr.OnQuestStatusChange(player, quest, oldStatus, QuestStatus.None);
handler.SendSysMessage(CypherStrings.CommandQuestRemoved); handler.SendSysMessage(CypherStrings.CommandQuestRemoved);
@@ -225,13 +130,13 @@ namespace Game.Chat
} }
else else
{ {
handler.SendSysMessage(CypherStrings.CommandQuestNotfound, entry); handler.SendSysMessage(CypherStrings.CommandQuestNotfound, quest.Id);
return false; return false;
} }
} }
[Command("reward", RBACPermissions.CommandQuestReward)] [Command("reward", RBACPermissions.CommandQuestReward)]
static bool HandleQuestReward(CommandHandler handler, StringArguments args) static bool HandleQuestReward(CommandHandler handler, Quest quest)
{ {
Player player = handler.GetSelectedPlayer(); Player player = handler.GetSelectedPlayer();
if (!player) if (!player)
@@ -240,23 +145,106 @@ namespace Game.Chat
return false; 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 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; return false;
} }
player.RewardQuest(quest, LootItemType.Item, 0, player); player.RewardQuest(quest, LootItemType.Item, 0, player);
return true; 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 // 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 */ if (token.IsEmpty()) /* empty token = first character is delimiter, skip past it */
return new ChatCommandResult(next); return new ChatCommandResult(next);
else else