From 1a631babe2357af0c3ed52dd7dc6b3638473ff33 Mon Sep 17 00:00:00 2001 From: rafi1212122 Date: Fri, 2 Jun 2023 10:25:29 +0700 Subject: [PATCH] chat cmd & hopefully proper avatar level up --- Common/Database/Avatar.cs | 9 +++ Common/Utils/ExcelReader/AvatarLevelData.cs | 64 +++++++++++++++++++ Common/Utils/ExcelReader/MaterialData.cs | 5 ++ GameServer/Game/Chatrooms/Chatroom.cs | 60 ++++++++++++++++- .../AddAvatarExpByMaterialReqHandler.cs | 41 ++++++++++++ 5 files changed, 176 insertions(+), 3 deletions(-) create mode 100644 Common/Utils/ExcelReader/AvatarLevelData.cs create mode 100644 GameServer/Handlers/AddAvatarExpByMaterialReqHandler.cs diff --git a/Common/Database/Avatar.cs b/Common/Database/Avatar.cs index 6d2f624..43eea27 100644 --- a/Common/Database/Avatar.cs +++ b/Common/Database/Avatar.cs @@ -71,5 +71,14 @@ namespace Common.Database { Avatar.collection.ReplaceOne(Builders.Filter.Eq(avatar => avatar.Id, Id), this); } + + public PlayerLevelData.LevelData AddExp(uint exp) + { + PlayerLevelData.LevelData levelData = AvatarLevelData.GetInstance().CalculateLevel((int)(exp + Exp)); + Level = (uint)levelData.Level; + Exp = (uint)levelData.Exp; + + return levelData; + } } } diff --git a/Common/Utils/ExcelReader/AvatarLevelData.cs b/Common/Utils/ExcelReader/AvatarLevelData.cs new file mode 100644 index 0000000..94152a8 --- /dev/null +++ b/Common/Utils/ExcelReader/AvatarLevelData.cs @@ -0,0 +1,64 @@ +using Newtonsoft.Json; + +namespace Common.Utils.ExcelReader +{ + public class AvatarLevelData : BaseExcelReader + { + public override string FileName { get { return "AvatarLevelData.json"; } } + + public PlayerLevelData.LevelData CalculateLevel(int exp) + { + int level = 1; + int expRemain = exp; + + foreach (AvatarLevelDataExcel levelData in All) + { + if (expRemain < 1) + { + break; + } + else if (expRemain >= levelData.Exp) + { + if (level == All.OrderByDescending(level => level.Level).First().Level) + { + expRemain = All.OrderByDescending(level => level.Level).First().Exp; + break; + } + + level++; + expRemain -= levelData.Exp; + } + } + + return new PlayerLevelData.LevelData(level, expRemain); + } + + public int CalculateCost(int startLevel, int endLevel) + { + int[] costs = All.Where(level => level.Level > startLevel && level.Level < endLevel).Select(level => level.Cost).ToArray(); + return costs.Sum(); + } + } + +#pragma warning disable CS8618 // Non-nullable field must contain a non-null value when exiting constructor. Consider declaring as nullable. + public partial class AvatarLevelDataExcel + { + [JsonProperty("exp")] + public int Exp { get; set; } + + [JsonProperty("cost")] + public int Cost { get; set; } + + [JsonProperty("avatarAssistConf")] + public double AvatarAssistConf { get; set; } + + [JsonProperty("subSkillScoin")] + public int SubSkillScoin { get; set; } + + [JsonProperty("DataImpl")] + public object DataImpl { get; set; } + + [JsonProperty("level")] + public int Level { get; set; } + } +} diff --git a/Common/Utils/ExcelReader/MaterialData.cs b/Common/Utils/ExcelReader/MaterialData.cs index 6c5a711..1cfe521 100644 --- a/Common/Utils/ExcelReader/MaterialData.cs +++ b/Common/Utils/ExcelReader/MaterialData.cs @@ -5,6 +5,11 @@ namespace Common.Utils.ExcelReader public class MaterialData : BaseExcelReader { public override string FileName { get { return "MaterialData.json"; } } + + public MaterialDataExcel? FromId(uint id) + { + return All.Where(material => material.Id == id).FirstOrDefault(); + } } #pragma warning disable CS8618 // Non-nullable field must contain a non-null value when exiting constructor. Consider declaring as nullable. diff --git a/GameServer/Game/Chatrooms/Chatroom.cs b/GameServer/Game/Chatrooms/Chatroom.cs index 4a9cec0..487ab5c 100644 --- a/GameServer/Game/Chatrooms/Chatroom.cs +++ b/GameServer/Game/Chatrooms/Chatroom.cs @@ -25,13 +25,33 @@ namespace PemukulPaku.GameServer.Game.Chatrooms { string? StringMsg = chatMsg.Content.Items.Where(item => item.MsgStr != null).FirstOrDefault()?.MsgStr; - if (StringMsg != null) - { + if (StringMsg != null) + { // do we need cmds? - Command? Cmd = CommandFactory.Commands.Find(cmd => StringMsg.Split(' ').ToList()[0] == cmd.Name.ToLower()); + List args = StringMsg.Split(' ').ToList(); + Command? Cmd = CommandFactory.Commands.Find(cmd => args[0] == cmd.Name.ToLower()); if (Cmd != null) { + args.RemoveAt(0); + try + { + if (Cmd.CmdType == CommandType.All || Cmd.CmdType == CommandType.Player) + { + Cmd.Run(session, args.ToArray()); + if (Cmd.CmdType == CommandType.Player) + SendAiMsg("Command executed", session); + } + else + { + SendAiMsg("Invalid usage", session); + } + } + catch (Exception ex) + { + SendAiMsg(ex.Message, session); + } + return; } chatMsg.CheckResult = new() @@ -67,6 +87,40 @@ namespace PemukulPaku.GameServer.Game.Chatrooms session.Send(Packet.FromProto(notify, CmdId.RecvChatMsgNotify)); } } + + public void SendAiMsg(string msg, Session? session) + { + if(session == null) + { + foreach (Session valSession in Members) + { + SendAiMsg(msg, valSession); + } + return; + } + + + RecvChatMsgNotify notify = new() { }; + 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 abstract class BaseChatroom where TSelf : BaseChatroom diff --git a/GameServer/Handlers/AddAvatarExpByMaterialReqHandler.cs b/GameServer/Handlers/AddAvatarExpByMaterialReqHandler.cs new file mode 100644 index 0000000..a6faaf1 --- /dev/null +++ b/GameServer/Handlers/AddAvatarExpByMaterialReqHandler.cs @@ -0,0 +1,41 @@ +using Common.Database; +using Common.Resources.Proto; +using Common.Utils.ExcelReader; + +namespace PemukulPaku.GameServer.Handlers +{ + [PacketCmdId(CmdId.AddAvatarExpByMaterialReq)] + internal class AddAvatarExpByMaterialReqHandler : IPacketHandler + { + public void Handle(Session session, Packet packet) + { + AddAvatarExpByMaterialReq Data = packet.GetDecodedBody(); + MaterialDataExcel? materialData = MaterialData.GetInstance().FromId(Data.MaterialId); + AvatarScheme? avatar = session.Player.AvatarList.FirstOrDefault(avatar => avatar.AvatarId == Data.AvatarId); + + AddAvatarExpByMaterialRsp Rsp = new() { retcode = AddAvatarExpByMaterialRsp.Retcode.Succ }; + + if (avatar is not null && materialData is not null) + { + session.Player.Equipment.AddMaterial(materialData.Id, -(int)Data.MaterialNum); + GetEquipmentDataRsp EquipmentRsp = new() + { + retcode = GetEquipmentDataRsp.Retcode.Succ, + VitalityValue = 0, + IsAll = true + }; + EquipmentRsp.MaterialLists.Add(session.Player.Equipment.MaterialList.First(mat => mat.Id == materialData.Id)); + + avatar.AddExp((uint)materialData.CharacterExpProvide * Data.MaterialNum); + + session.Send(Packet.FromProto(EquipmentRsp, CmdId.GetEquipmentDataRsp)); + session.ProcessPacket(Packet.FromProto(new GetAvatarDataReq() { AvatarIdLists = new uint[] { avatar.AvatarId } }, CmdId.GetAvatarDataReq)); + } + else + { + Rsp.retcode = AddAvatarExpByMaterialRsp.Retcode.AvatarNotExist; + } + session.Send(Packet.FromProto(Rsp, CmdId.AddAvatarExpByMaterialRsp)); + } + } +}