diff --git a/Common/Database/Avatar/AvatarData.cs b/Common/Database/Avatar/AvatarData.cs index a0fdccd..3d00537 100644 --- a/Common/Database/Avatar/AvatarData.cs +++ b/Common/Database/Avatar/AvatarData.cs @@ -66,7 +66,7 @@ public class AvatarInfo avatarSkill.SubSkillList.AddRange(skill.SubSkillList.Select(x => new Proto.AvatarSubSkill { SubSkillId = (uint)x.SubSkillId, - Level = x.Level, + Level = (uint)x.Level, IsMask = x.IsMask })); @@ -84,7 +84,7 @@ public class AvatarSkill public class AvatarSubSkill { public int SubSkillId { get; set; } - public uint Level { get; set; } + public int Level { get; set; } public bool IsMask { get; set; } } public class AvatarArtifactDetail diff --git a/Common/Internationalization/Message/LanguageEN.cs b/Common/Internationalization/Message/LanguageEN.cs index aa3dcde..9c5a58f 100644 --- a/Common/Internationalization/Message/LanguageEN.cs +++ b/Common/Internationalization/Message/LanguageEN.cs @@ -209,7 +209,7 @@ public class HelpTextEN "Usage: /help [cmd]"; public string Commands => "Commands: "; public string CommandUsage => "Usage: "; - public string CommandPermission => "Level Permission Untuk Access: "; + public string CommandPermission => "Level Permission For Access: "; public string CommandAlias => "Command Alias:"; } @@ -219,14 +219,23 @@ public class HelpTextEN public class ValkTextEN { public string Desc => "Set attributes for owned characters\n" + - "Note: -1 means all owned characters"; + "Note: -1 means all owned characters\n"; public string Usage => - "Usage: /valk add [AvatarID/-1] l s\n\n"; + "Usage: /valk add [ValkID/-1] l s\n\n" + + "Usage: /valk level [ValkID/-1] [Level]\n\n" + + "Usage: /valk star [ValkID/-1] [Star]\n\n" + + "Usage: /valk skill [ValkID/-1] for max skill level"; public string ValkNotFound => "Character does not exist!"; public string ValkAddedAll => "Granted all characters to player!"; public string ValkAdded => "Granted character {0} to player!"; + public string ValkSetLevelAll => "Set all characters to level {0}!"; + public string ValkSetLevel => "Set character {0} to level {1}!"; + public string ValkSetStarAll => "Set all characters' Resonance to {0}!"; + public string ValkSetStar => "Set character {0}'s Resonance to {1}!"; + public string ValkSetSkillLevelAll => "Set all characters' skill levels to max!"; + public string ValkSetSkillLevel => "Set character {0}'s skill levels to max!"; } diff --git a/GameServer/Command/Commands/CommandValk.cs b/GameServer/Command/Commands/CommandValk.cs index 87a3a3e..b70abc8 100644 --- a/GameServer/Command/Commands/CommandValk.cs +++ b/GameServer/Command/Commands/CommandValk.cs @@ -1,4 +1,5 @@ using KianaBH.Data; +using KianaBH.Database.Avatar; using KianaBH.Enums.Player; using KianaBH.Internationalization; @@ -8,7 +9,7 @@ namespace KianaBH.GameServer.Command.Commands; public class CommandValk : ICommands { [CommandMethod("add")] - public async ValueTask GetRole(CommandArg arg) + public async ValueTask GetValk(CommandArg arg) { if (!await arg.CheckOnlineTarget()) return; @@ -39,4 +40,149 @@ public class CommandValk : ICommands valk!.FaceAnimationGroupName ?? valkId.ToString())); } } + + [CommandMethod("level")] + public async ValueTask SetValkLevel(CommandArg arg) + { + if (!await arg.CheckOnlineTarget()) return; + if (!await arg.CheckArgCnt(2)) return; + + var valkId = arg.GetInt(0); + var level = Math.Max(1, Math.Min(80, arg.GetInt(1))); // Limit level to 1-80 + + if (valkId == -1) + { + // set level for all valk + foreach (var config in arg.Target!.Player!.AvatarManager!.AvatarData.Avatars) + { + config.Level = level; + } + await arg.SendMsg(I18NManager.Translate("Game.Command.Valk.ValkSetLevelAll", level.ToString())); + } + else + { + var valk = arg.Target!.Player!.AvatarManager!.GetAvatar(valkId); + if (valk == null) + { + await arg.SendMsg(I18NManager.Translate("Game.Command.Valk.ValkNotFound")); + return; + } + + valk.Level = level; + await arg.SendMsg(I18NManager.Translate("Game.Command.Valk.ValkSetLevel", + valkId.ToString(), level.ToString())); + } + await arg.Target!.Player!.SyncValk(); + } + + [CommandMethod("star")] + public async ValueTask SetValkStar(CommandArg arg) + { + if (!await arg.CheckOnlineTarget()) return; + if (!await arg.CheckArgCnt(2)) return; + + var valkId = arg.GetInt(0); + var star = Math.Max(1, Math.Min(5, arg.GetInt(1))); // Limit star to 1-5 + + if (valkId == -1) + { + // set star for all valk + foreach (var config in arg.Target!.Player!.AvatarManager!.AvatarData.Avatars) + { + config.Star = star; + } + await arg.SendMsg(I18NManager.Translate("Game.Command.Valk.ValkSetStarAll", star.ToString())); + } + else + { + var valk = arg.Target!.Player!.AvatarManager!.GetAvatar(valkId); + if (valk == null) + { + await arg.SendMsg(I18NManager.Translate("Game.Command.Valk.ValkNotFound")); + return; + } + + valk.Star = star; + await arg.SendMsg(I18NManager.Translate("Game.Command.Valk.ValkSetStar", + valkId.ToString(), star.ToString())); + } + await arg.Target!.Player!.SyncValk(); + } + + [CommandMethod("skill")] + public async ValueTask SetValkSkill(CommandArg arg) + { + if (!await arg.CheckOnlineTarget()) return; + if (!await arg.CheckArgCnt(1)) return; + + var valkId = arg.GetInt(0); + if (valkId == -1) + { + foreach (var valk in arg.Target!.Player!.AvatarManager!.AvatarData.Avatars) + { + foreach (var skill in valk.SkillList) + { + var subSkillList = GameData.AvatarSubSkillData.Values + .Where(x => x.SkillId == skill.SkillId); + + foreach (var subSkillData in subSkillList) + { + var subSkill = skill.SubSkillList + .Find(x => x.SubSkillId == subSkillData.AvatarSubSkillId); + + if (subSkill != null) + { + subSkill.Level = subSkillData.MaxLv; + } + else + { + skill.SubSkillList.Add(new AvatarSubSkill + { + SubSkillId = subSkillData.AvatarSubSkillId, + Level = subSkillData.MaxLv + }); + } + } + } + } + await arg.SendMsg(I18NManager.Translate("Game.Command.Valk.ValkSetSkillLevelAll")); + } + else + { + var valk = arg.Target!.Player!.AvatarManager!.GetAvatar(valkId); + if (valk == null) + { + await arg.SendMsg(I18NManager.Translate("Game.Command.Valk.ValkNotFound")); + return; + } + + foreach (var skill in valk.SkillList) + { + var subSkillList = GameData.AvatarSubSkillData.Values + .Where(x => x.SkillId == skill.SkillId); + + foreach (var subSkillData in subSkillList) + { + var subSkill = skill.SubSkillList + .Find(x => x.SubSkillId == subSkillData.AvatarSubSkillId); + + if (subSkill != null) + { + subSkill.Level = subSkillData.MaxLv; + } + else + { + skill.SubSkillList.Add(new AvatarSubSkill + { + SubSkillId = subSkillData.AvatarSubSkillId, + Level = subSkillData.MaxLv + }); + } + } + } + await arg.SendMsg(I18NManager.Translate("Game.Command.Valk.ValkSetSkillLevel", + valkId.ToString())); + } + await arg.Target!.Player!.SyncValk(); + } } \ No newline at end of file diff --git a/GameServer/Game/Avatar/AvatarManager.cs b/GameServer/Game/Avatar/AvatarManager.cs index 8b2e3c0..c368770 100644 --- a/GameServer/Game/Avatar/AvatarManager.cs +++ b/GameServer/Game/Avatar/AvatarManager.cs @@ -54,9 +54,8 @@ public class AvatarManager(PlayerInstance player) : BasePlayerManager(player) return avatarExcel; } - public AvatarInfo? GetAvatar(uint avatarId) + public AvatarInfo? GetAvatar(int avatarId) { - return AvatarData.Avatars.Find(avatar => avatar.AvatarId == avatarId); } } \ No newline at end of file diff --git a/GameServer/Game/Player/PlayerInstance.cs b/GameServer/Game/Player/PlayerInstance.cs index 77ffc5f..c55f773 100644 --- a/GameServer/Game/Player/PlayerInstance.cs +++ b/GameServer/Game/Player/PlayerInstance.cs @@ -111,6 +111,11 @@ public class PlayerInstance(PlayerData data) return Data.ToProto(); } + public async ValueTask SyncValk() + { + await SendPacket(new PacketGetAvatarDataRsp(AvatarManager!.AvatarData!.Avatars!.ToList(), true)); + } + public async ValueTask SyncAll() { await SendPacket(new PacketGetEquipmentDataRsp(this)); diff --git a/GameServer/Server/Packet/Recv/Avatar/HandlerGetAvatarDataReq.cs b/GameServer/Server/Packet/Recv/Avatar/HandlerGetAvatarDataReq.cs index 3040dc4..9a2d3b6 100644 --- a/GameServer/Server/Packet/Recv/Avatar/HandlerGetAvatarDataReq.cs +++ b/GameServer/Server/Packet/Recv/Avatar/HandlerGetAvatarDataReq.cs @@ -14,7 +14,7 @@ public class HandlerGetAvatarDataReq : Handler var player = connection.Player!; var avatars = req.AvatarIdList.Any(id => id != 0) ? req.AvatarIdList - .Select(id => player.AvatarManager!.GetAvatar(id)) + .Select(id => player.AvatarManager!.GetAvatar((int)id)) .Where(avatar => avatar != null) .ToList()! : player.AvatarManager?.AvatarData?.Avatars?.ToList();