From 54ae5efabdeb949b12203e5f8a47d8f51cecb496 Mon Sep 17 00:00:00 2001 From: rafi1212122 Date: Thu, 1 Jun 2023 12:20:51 +0700 Subject: [PATCH] avatar cmd & update assistant --- Common/Database/Equipment.cs | 2 +- Common/Utils/ExcelReader/PlayerLevelData.cs | 24 +++++++- GameServer/Commands/AvatarCommand.cs | 55 +++++++++++++++++++ GameServer/Commands/LevelCommand.cs | 30 ++++++++++ GameServer/Commands/ReadLine.cs | 26 +++++---- .../UpdateAssistantAvatarIdReqHandler.cs | 19 +++++++ 6 files changed, 143 insertions(+), 13 deletions(-) create mode 100644 GameServer/Commands/AvatarCommand.cs create mode 100644 GameServer/Commands/LevelCommand.cs create mode 100644 GameServer/Handlers/UpdateAssistantAvatarIdReqHandler.cs diff --git a/Common/Database/Equipment.cs b/Common/Database/Equipment.cs index 4771275..909af0f 100644 --- a/Common/Database/Equipment.cs +++ b/Common/Database/Equipment.cs @@ -22,7 +22,7 @@ namespace Common.Database EquipmentScheme Equipment = new() { OwnerUid = uid, - MaterialList = Array.Empty(), + MaterialList = new Resources.Proto.Material[] { new Resources.Proto.Material { Id = 100, Num = 750 }, new Resources.Proto.Material { Id = 119107, Num = 6 } }, WeaponList = Array.Empty(), StigmataList = Array.Empty(), MechaList = Array.Empty(), diff --git a/Common/Utils/ExcelReader/PlayerLevelData.cs b/Common/Utils/ExcelReader/PlayerLevelData.cs index 22e6ef6..d642bb7 100644 --- a/Common/Utils/ExcelReader/PlayerLevelData.cs +++ b/Common/Utils/ExcelReader/PlayerLevelData.cs @@ -27,13 +27,13 @@ namespace Common.Utils.ExcelReader int level = 1; int expRemain = exp; - foreach (var levelData in All) + foreach (PlayerLevelDataExcel levelData in All) { if(expRemain < 1) { break; } - else if(expRemain > levelData.Exp) + else if(expRemain >= levelData.Exp) { level++; expRemain -= levelData.Exp; @@ -42,6 +42,26 @@ namespace Common.Utils.ExcelReader return new LevelData(level, expRemain); } + + public LevelData CalculateExpForLevel(int level) + { + int exp = 0; + + foreach (PlayerLevelDataExcel levelData in All) + { + if (levelData.Level >= level) + { + break; + }else + { + exp += levelData.Exp; + continue; + } + + } + + return new LevelData(level, exp); + } } #pragma warning disable CS8618 // Non-nullable field must contain a non-null value when exiting constructor. Consider declaring as nullable. diff --git a/GameServer/Commands/AvatarCommand.cs b/GameServer/Commands/AvatarCommand.cs new file mode 100644 index 0000000..a88b04f --- /dev/null +++ b/GameServer/Commands/AvatarCommand.cs @@ -0,0 +1,55 @@ +using Common.Database; +using Common.Resources.Proto; +using Common.Utils.ExcelReader; +using PemukulPaku.GameServer.Game; + +namespace PemukulPaku.GameServer.Commands +{ + [CommandHandler("avatar", "Add avatar to player account", CommandType.Player)] + internal class AvatarCommand : Command + { + public override void Run(Session session, string[] args) + { + int avatarId = int.Parse(args[1]); + Run(session.Player, args); + + session.ProcessPacket(Packet.FromProto(new GetEquipmentDataReq() { }, CmdId.GetEquipmentDataReq)); + if (avatarId == -1) + { + session.ProcessPacket(Packet.FromProto(new GetAvatarDataReq() { AvatarIdLists = new uint[] { 0 } }, CmdId.GetAvatarDataReq)); + } + else + { + session.ProcessPacket(Packet.FromProto(new GetAvatarDataReq() { AvatarIdLists = new uint[] { (uint)avatarId } }, CmdId.GetAvatarDataReq)); + } + } + + public override void Run(Player player, string[] args) + { + string action = args[0]; + int avatarId = int.Parse(args[1]); + + switch (action) + { + case "add": + if (avatarId == -1) + { + foreach (AvatarDataExcel avatarData in AvatarData.GetInstance().All) + { + AvatarScheme avatar = Common.Database.Avatar.Create(avatarData.AvatarId, player.User.Uid, player.Equipment); + player.AvatarList = player.AvatarList.Append(avatar).ToArray(); + } + } + else + { + AvatarScheme avatar = Common.Database.Avatar.Create(avatarId, player.User.Uid, player.Equipment); + player.AvatarList = player.AvatarList.Append(avatar).ToArray(); + } + player.Equipment.Save(); + break; + default: + throw new ArgumentException("Unrecognized action"); + } + } + } +} diff --git a/GameServer/Commands/LevelCommand.cs b/GameServer/Commands/LevelCommand.cs new file mode 100644 index 0000000..ced7c35 --- /dev/null +++ b/GameServer/Commands/LevelCommand.cs @@ -0,0 +1,30 @@ +using Common.Utils.ExcelReader; +using PemukulPaku.GameServer.Game; +using Common.Resources.Proto; + +namespace PemukulPaku.GameServer.Commands +{ + [CommandHandler("level", "Modify the player captain level", CommandType.Player)] + internal class LevelCommand : Command + { + public override void Run(Session session, string[] args) + { + Run(session.Player, args); + + GetMainDataRsp Rsp = new() + { + retcode = GetMainDataRsp.Retcode.Succ, + Level = (uint)PlayerLevelData.GetInstance().CalculateLevel(session.Player.User.Exp).Level, + Exp = (uint)PlayerLevelData.GetInstance().CalculateLevel(session.Player.User.Exp).Exp + }; + session.Send(Packet.FromProto(Rsp, CmdId.GetMainDataRsp), Packet.FromProto(new PlayerLevelUpNotify() { NewLevel = Rsp.Level }, CmdId.PlayerLevelUpNotify)); + } + + public override void Run(Player player, string[] args) + { + int level = int.Parse(args[0]); + player.User.Exp = PlayerLevelData.GetInstance().CalculateExpForLevel(level).Exp; + player.User.Save(); + } + } +} diff --git a/GameServer/Commands/ReadLine.cs b/GameServer/Commands/ReadLine.cs index 42d266b..743afe5 100644 --- a/GameServer/Commands/ReadLine.cs +++ b/GameServer/Commands/ReadLine.cs @@ -25,19 +25,25 @@ { args.RemoveAt(0); - if (Cmd.CmdType == CommandType.All || Cmd.CmdType == CommandType.Console) + try { - Cmd.Run(args.ToArray()); + if (Cmd.CmdType == CommandType.All || Cmd.CmdType == CommandType.Console) + { + Cmd.Run(args.ToArray()); + } + else if(session != null) + { + Cmd.Run(session, args.ToArray()); + Command.c.Log("Command executed"); + } + else + { + Command.c.Error("Invalid usage, try selecting session first with target"); + } } - else if(session != null) + catch (Exception ex) { - - Command.c.Log("Command executed"); - } - else - { - Command.c.Error("Invalid usage, try selecting session first with target"); - continue; + Command.c.Error(ex.Message); } continue; diff --git a/GameServer/Handlers/UpdateAssistantAvatarIdReqHandler.cs b/GameServer/Handlers/UpdateAssistantAvatarIdReqHandler.cs new file mode 100644 index 0000000..74d6068 --- /dev/null +++ b/GameServer/Handlers/UpdateAssistantAvatarIdReqHandler.cs @@ -0,0 +1,19 @@ +using Common.Resources.Proto; + +namespace PemukulPaku.GameServer.Handlers +{ + [PacketCmdId(CmdId.UpdateAssistantAvatarIdReq)] + public class UpdateAssistantAvatarIdReqHandler : IPacketHandler + { + public void Handle(Session session, Packet packet) + { + UpdateAssistantAvatarIdReq Data = packet.GetDecodedBody(); + session.Player.User.AssistantAvatarId = (int)Data.AvatarId; + + UpdateAssistantAvatarIdRsp Rsp = new() { retcode = UpdateAssistantAvatarIdRsp.Retcode.Succ }; + GetMainDataRsp MainDataRsp = new() { retcode = GetMainDataRsp.Retcode.Succ, AssistantAvatarId = (uint)session.Player.User.AssistantAvatarId }; + + session.Send(Packet.FromProto(MainDataRsp, CmdId.GetMainDataRsp), Packet.FromProto(Rsp, CmdId.UpdateAssistantAvatarIdRsp)); + } + } +}