From f2e83c93ddb3d8e0166cd86bd6e511dd6cbb5279 Mon Sep 17 00:00:00 2001 From: TerminalAide0017 <135571388+TerminalAide0017@users.noreply.github.com> Date: Fri, 9 Jun 2023 00:23:54 -0700 Subject: [PATCH] More Helpful Help Command (#5) * Deleted TestCommand.cs No longer needed. * Update AbyssCommand.cs Added a command to adjust the player's bracket at will. * Update User.cs Added Abyss Group Value * Update Command.cs Added Examples[] to the constructor and handler. * Update HelpCommand.cs Made the Help command more helpful! * Update AbyssCommand.cs Added Help Examples * Update GiveCommand.cs Added help examples, handles negative inputs again, added more aliases, can add or remove materials by ID, can now for add all skipped characters with `give avatars-scuffed` * Update AbyssCommand.cs missed a quote * Update UltraEndlessGetMainDataReqHandler.cs Bracket can now be set with commands. Need to unscuff the fight cycle. * Update GiveCommand.cs Cheeky give gold command * Further refined the Help Command --------- Co-authored-by: TerminalAide0017 --- Common/Database/User.cs | 2 + GameServer/Commands/AbyssCommand.cs | 22 ++++++--- GameServer/Commands/AvatarCommand.cs | 5 +- GameServer/Commands/Command.cs | 8 +++- GameServer/Commands/GiveCommand.cs | 46 ++++++++++++------ GameServer/Commands/HelpCommand.cs | 48 +++++++++++++++++-- GameServer/Commands/LevelCommand.cs | 2 +- GameServer/Commands/TargetCommand.cs | 2 +- GameServer/Commands/TestCommand.cs | 17 ------- .../UltraEndlessGetMainDataReqHandler.cs | 7 +-- 10 files changed, 108 insertions(+), 51 deletions(-) delete mode 100644 GameServer/Commands/TestCommand.cs diff --git a/Common/Database/User.cs b/Common/Database/User.cs index ab6f4aa..bdaec13 100644 --- a/Common/Database/User.cs +++ b/Common/Database/User.cs @@ -36,6 +36,7 @@ namespace Common.Database AssistantAvatarId = 101, BirthDate = 0, AbyssDynamicHard = 100, + AbyssGroupLevel = 8, AvatarTeamList = new List { new AvatarTeam { AvatarIdLists = new uint[] { 101 }, StageType = ((uint)StageType.StageStory) } }, CustomAvatarTeamList = new List { } }; @@ -85,6 +86,7 @@ namespace Common.Database public int AssistantAvatarId { get; set; } public int BirthDate { get; set; } public uint AbyssDynamicHard { get; set; } + public uint AbyssGroupLevel { get; set; } public List AvatarTeamList { get; set; } public List CustomAvatarTeamList { get; set; } diff --git a/GameServer/Commands/AbyssCommand.cs b/GameServer/Commands/AbyssCommand.cs index b06ec1b..706a62b 100644 --- a/GameServer/Commands/AbyssCommand.cs +++ b/GameServer/Commands/AbyssCommand.cs @@ -1,31 +1,39 @@ -using PemukulPaku.GameServer.Game; +using Common.Database; +using Common.Resources.Proto; +using Common.Utils.ExcelReader; +using PemukulPaku.GameServer.Game; namespace PemukulPaku.GameServer.Commands { - [CommandHandler("abyss", "", CommandType.Player)] + [CommandHandler("abyss", " [#]", CommandType.Player,"temp 400", "bracket [1-9]")] internal class AbyssCommand : Command { public override void Run(Session session, string[] args) { Run(session.Player, args); - // session.ProcessPacket(Packet.FromProto(new UltraEndlessGetMainDataReq() { }, CmdId.UltraEndlessGetMainDataReq)); + //session.ProcessPacket(Packet.FromProto(new UltraEndlessGetMainDataReq() { }, CmdId.UltraEndlessGetMainDataReq)); } public override void Run(Player player, string[] args) { string action = args[0]; uint value = args[1] is not null ? uint.Parse(args[1]) : 0; - switch (action.ToLower()) + switch (action) { + case "disturbance": + case "d": case "temp": player.User.AbyssDynamicHard = value; break; - default: - throw new ArgumentException("Unrecognized action"); + case "bracket": + case "group": + player.User.AbyssGroupLevel = value > 0 && value < 10 ? value : 9; + break; + default: throw new ArgumentException("Unrecognized action"); } player.User.Save(); } } -} \ No newline at end of file +} diff --git a/GameServer/Commands/AvatarCommand.cs b/GameServer/Commands/AvatarCommand.cs index 4dd460a..b2c284c 100644 --- a/GameServer/Commands/AvatarCommand.cs +++ b/GameServer/Commands/AvatarCommand.cs @@ -6,7 +6,7 @@ using System.Globalization; namespace PemukulPaku.GameServer.Commands { - [CommandHandler("avatar", "Add avatar to player account", CommandType.Player)] + [CommandHandler("avatar", " [Prop] [#]", CommandType.Player, "add 406", "modify -1 star 5")] internal class AvatarCommand : Command { public override void Run(Session session, string[] args) @@ -26,7 +26,7 @@ namespace PemukulPaku.GameServer.Commands session.ProcessPacket(Packet.FromProto(new GetAvatarDataReq() { AvatarIdLists = new uint[] { (uint)avatarId } }, CmdId.GetAvatarDataReq)); } - if (action.ToLower() == "modify") + if (action.ToLower() == "modify" || action.ToLower() == "mod") { List updatedAvatars = new(); @@ -85,6 +85,7 @@ namespace PemukulPaku.GameServer.Commands player.Equipment.Save(); break; case "modify": + case "mod": if (avatarId == -1) { foreach (AvatarScheme av in player.AvatarList) diff --git a/GameServer/Commands/Command.cs b/GameServer/Commands/Command.cs index e2e9156..4ab8d50 100644 --- a/GameServer/Commands/Command.cs +++ b/GameServer/Commands/Command.cs @@ -1,4 +1,4 @@ -using Common.Utils; +using Common.Utils; using System.Reflection; using PemukulPaku.GameServer.Game; @@ -16,6 +16,7 @@ namespace PemukulPaku.GameServer.Commands public static readonly Logger c = new("Command", ConsoleColor.Cyan, false); public string Name = string.Empty; public string Description = string.Empty; + public string[] Examples = Array.Empty(); public CommandType CmdType = CommandType.Player; /// @@ -63,13 +64,15 @@ namespace PemukulPaku.GameServer.Commands { public string Name { get; } public string Description { get; } + public string[] Examples { get; } public CommandType CmdType { get; } - public CommandHandler(string name, string description, CommandType type = CommandType.Player) + public CommandHandler(string name, string description, CommandType type = CommandType.Player, params string[] examples) { Name = name; Description = description; CmdType = type; + Examples = examples; } } @@ -98,6 +101,7 @@ namespace PemukulPaku.GameServer.Commands cmd.Name = attr.Name; cmd.Description = attr.Description; cmd.CmdType = attr.CmdType; + cmd.Examples = attr.Examples; Commands.Add(cmd); #if DEBUG diff --git a/GameServer/Commands/GiveCommand.cs b/GameServer/Commands/GiveCommand.cs index 653d8a9..ffaba95 100644 --- a/GameServer/Commands/GiveCommand.cs +++ b/GameServer/Commands/GiveCommand.cs @@ -5,7 +5,10 @@ using PemukulPaku.GameServer.Game; namespace PemukulPaku.GameServer.Commands { - [CommandHandler("give", "Mass give resources", CommandType.Player)] + [CommandHandler("give", " [#] [id]", CommandType.Player, + //example commands list + "gold 123456789","stigs 1", "weaps", "mats 999 2008", "valks", "outfits" + )] internal class GiveCommand : Command { public override void Run(Session session, string[] args) @@ -19,9 +22,9 @@ namespace PemukulPaku.GameServer.Commands public override void Run(Player player, string[] args) { string action = args[0]; - uint value = (args.Length > 1 && args[1] is not null) ? uint.Parse(args[1]) : 0; + int value = (args.Length > 1 && args[1] is not null) ? int.Parse(args[1]) : -1; - switch (action.ToLower()) + switch (action) { case "avatars": case "characters": @@ -30,31 +33,39 @@ namespace PemukulPaku.GameServer.Commands case "valkyries": foreach (AvatarDataExcel avatarData in AvatarData.GetInstance().All) { - if (avatarData.AvatarId >= 9000 || avatarData.AvatarId == 316) continue; // Avoid APHO avatars + if (avatarData.AvatarId >= 9000 || avatarData.AvatarId == 316) continue; // Avoid scuffed characters + + AvatarScheme avatar = Common.Database.Avatar.Create(avatarData.AvatarId, player.User.Uid, player.Equipment); + player.AvatarList = player.AvatarList.Append(avatar).ToArray(); + } + break; + case "avatars-scuffed": + case "valkyries-scuffed": + foreach (AvatarDataExcel avatarData in AvatarData.GetInstance().All) + { + if (!(avatarData.AvatarId >= 9000 || avatarData.AvatarId == 316)) continue; // Adds scuffed characters AvatarScheme avatar = Common.Database.Avatar.Create(avatarData.AvatarId, player.User.Uid, player.Equipment); player.AvatarList = player.AvatarList.Append(avatar).ToArray(); } break; case "weapons": - case "weap": - case "wep": + case "weaps": foreach (WeaponDataExcel weaponData in WeaponData.GetInstance().All) { if (weaponData.EvoId == 0) { Weapon weapon = player.Equipment.AddWeapon(weaponData.Id); - weapon.Level = value == 0 ? (uint)weaponData.MaxLv : value; + weapon.Level = value <= 0 ? (uint)weaponData.MaxLv : (uint)value; } } break; case "weapons-all": - case "weap-all": - case "wep-all": + case "weaps-all": foreach (WeaponDataExcel weaponData in WeaponData.GetInstance().All) { Weapon weapon = player.Equipment.AddWeapon(weaponData.Id); - weapon.Level = value == 0 ? (uint)weaponData.MaxLv : value; + weapon.Level = value <= 0 ? (uint)weaponData.MaxLv : (uint)value; } break; case "stigmata": @@ -64,7 +75,7 @@ namespace PemukulPaku.GameServer.Commands if (stigmataData.EvoId == 0) { Stigmata stigmata = player.Equipment.AddStigmata(stigmataData.Id); - stigmata.Level = value == 0 ? (uint)stigmataData.MaxLv : value; + stigmata.Level = value <= 0 ? (uint)stigmataData.MaxLv : (uint)value; } } break; @@ -73,17 +84,24 @@ namespace PemukulPaku.GameServer.Commands foreach (StigmataDataExcel stigmataData in StigmataData.GetInstance().All) { Stigmata stigmata = player.Equipment.AddStigmata(stigmataData.Id); - stigmata.Level = value == 0 ? (uint)stigmataData.MaxLv : value; + stigmata.Level = value <= 0 ? (uint)stigmataData.MaxLv : (uint)value; } break; case "materials": + case "mats": case "matz": foreach (MaterialDataExcel materialData in MaterialData.GetInstance().All) - { - player.Equipment.AddMaterial(materialData.Id, value == 0 ? 1 : (int)value); + { + player.Equipment.AddMaterial(materialData.Id, value > 0 || value < -1 ? value : 9999); } break; + case "material-id": + case "gold": + int materialId = args[2] is not null ? int.Parse(args[2]) : 100; + player.Equipment.AddMaterial(materialId, value > 0 || value < -1 ? value : 9999); + break; case "dress": + case "outfits": foreach (DressDataExcel dressData in DressData.GetInstance().All) { foreach (int avatarId in dressData.AvatarIdList) diff --git a/GameServer/Commands/HelpCommand.cs b/GameServer/Commands/HelpCommand.cs index bf23d53..531bf71 100644 --- a/GameServer/Commands/HelpCommand.cs +++ b/GameServer/Commands/HelpCommand.cs @@ -1,13 +1,53 @@ -namespace PemukulPaku.GameServer.Commands +using Common.Resources.Proto; +using Common; + +namespace PemukulPaku.GameServer.Commands { - [CommandHandler("help", "Shows the help page", CommandType.All)] + [CommandHandler("help", " - shows help page >:3", CommandType.All)] internal class HelpCommand : Command { public override void Run(Session session, string[] args) { - // TODO: Implement online help - base.Run(session, args); + RecvChatMsgNotify notify = new() { }; + //hardcoding values is fun AND easy! + string msg = "Commands\n"; + msg += "command [optional]\n"; + //msg += "┌\n"; + foreach (Command Cmd in CommandFactory.Commands) + { + if(Cmd.CmdType == CommandType.All || Cmd.CmdType == CommandType.Player) + { + msg += "┝" + Cmd.Name + " " + Cmd.Description + "\n"; + if (Cmd.Examples is not null) + { + foreach (string Example in Cmd.Examples) + { + msg += "│┕" + Example + "\n"; + } + } + } + } + msg += ""; + + //I really want to figure out how to grab from Chatroom.cs instead, but oh well. + ChatMsg AiMsg = new() + { + Uid = 0, + Nickname = "Ai-chan", + Time = (uint)Global.GetUnixInSeconds(), + Msg = msg, + Content = new() { }, + Channel = ChatMsg.MsgChannel.World, + AvatarId = 3201, + DressId = 593201, + FrameId = 200001, + CustomHeadId = 161080, + CheckResult = new() { NumberCheck = 0, ShieldType = 0, RewriteText = msg } + }; + AiMsg.Content.Items.Add(new() { MsgStr = msg }); + notify.ChatMsgLists.Add(AiMsg); + session.Send(Packet.FromProto(notify, CmdId.RecvChatMsgNotify)); } public override void Run(string[] args) diff --git a/GameServer/Commands/LevelCommand.cs b/GameServer/Commands/LevelCommand.cs index 9802f36..b95f6ea 100644 --- a/GameServer/Commands/LevelCommand.cs +++ b/GameServer/Commands/LevelCommand.cs @@ -4,7 +4,7 @@ using Common.Resources.Proto; namespace PemukulPaku.GameServer.Commands { - [CommandHandler("level", "Modify the player captain level", CommandType.Player)] + [CommandHandler("level", "<1-88>", CommandType.Player)] internal class LevelCommand : Command { public override void Run(Session session, string[] args) diff --git a/GameServer/Commands/TargetCommand.cs b/GameServer/Commands/TargetCommand.cs index 82194ec..a0b3382 100644 --- a/GameServer/Commands/TargetCommand.cs +++ b/GameServer/Commands/TargetCommand.cs @@ -1,6 +1,6 @@ namespace PemukulPaku.GameServer.Commands { - [CommandHandler("target", "Select session target for console command action", CommandType.Console)] + [CommandHandler("target", "[id], displays and selects User sessions for commands", CommandType.Console)] internal class TargetCommand : Command { public override void Run(string[] args) diff --git a/GameServer/Commands/TestCommand.cs b/GameServer/Commands/TestCommand.cs deleted file mode 100644 index 90a5f56..0000000 --- a/GameServer/Commands/TestCommand.cs +++ /dev/null @@ -1,17 +0,0 @@ -namespace PemukulPaku.GameServer.Commands -{ - [CommandHandler("test", "Test command used for testing")] - public class TestCommand : Command - { - public override void Run(Session session, string[] args) - { - if (args.Length < 3) - { - c.Error("Not enough arguments"); - return; - } - - c.Log($"Testing {args[0]} {args[1]} {args[2]}"); - } - } -} diff --git a/GameServer/Handlers/Ultraendless/UltraEndlessGetMainDataReqHandler.cs b/GameServer/Handlers/Ultraendless/UltraEndlessGetMainDataReqHandler.cs index a2e1b5a..0849530 100644 --- a/GameServer/Handlers/Ultraendless/UltraEndlessGetMainDataReqHandler.cs +++ b/GameServer/Handlers/Ultraendless/UltraEndlessGetMainDataReqHandler.cs @@ -1,7 +1,6 @@ using Common; using Common.Resources.Proto; using Common.Utils.ExcelReader; -using Common.Database; namespace PemukulPaku.GameServer.Handlers { @@ -11,11 +10,13 @@ namespace PemukulPaku.GameServer.Handlers public void Handle(Session session, Packet packet) { + uint bracket = session.Player.User.AbyssGroupLevel; + uint temp = session.Player.User.AbyssDynamicHard; UltraEndlessGetMainDataRsp Rsp = new() { retcode = UltraEndlessGetMainDataRsp.Retcode.Succ, ScheduleId = 1028, - GroupLevel = 9, + GroupLevel = bracket, TopGroupLevel = 9, CupNum = 2000, MainData = new() @@ -27,7 +28,7 @@ namespace PemukulPaku.GameServer.Handlers CloseTime = (uint)Global.GetUnixInSeconds() + 3600 * 24 * 7 + 1200, CurSeasonId = 1 }, - DynamicHardLevel = session.Player.User.AbyssDynamicHard, + DynamicHardLevel = temp, LastSettleInfo = new() { } }; Rsp.MainData.SiteLists.AddRange(Common.Utils.ExcelReader.UltraEndlessSite.GetInstance().All.Where(x => x.SiteId > 1019).Select(siteData =>