mirror of
https://github.com/MikuLeaks/KianaBH3.git
synced 2025-12-12 13:04:33 +01:00
feat: add in game command handler
This commit is contained in:
@@ -71,12 +71,11 @@ public class ServerOption
|
||||
|
||||
public class ServerProfile
|
||||
{
|
||||
public string Name { get; set; } = "Server";
|
||||
public string Name { get; set; } = "Ai-chan";
|
||||
public int Uid { get; set; } = 80;
|
||||
public string Signature { get; set; } = "Type /help for a list of commands";
|
||||
public int Level { get; set; } = 1;
|
||||
public int HeadIcon { get; set; } = 200105;
|
||||
public int ChatBubbleId { get; set; } = 220001;
|
||||
public int DisplayAvatarId { get; set; } = 1001;
|
||||
public int DisplayAvatarLevel { get; set; } = 1;
|
||||
public int AvatarId { get; set; } = 3201;
|
||||
public int DressId { get; set; } = 593201;
|
||||
public int FrameId { get; set; } = 200001;
|
||||
public int HeadId { get; set; } = 161080;
|
||||
|
||||
}
|
||||
@@ -11,16 +11,16 @@ public class PlayerData : BaseDatabaseDataHelper
|
||||
{
|
||||
public string? Name { get; set; } = "";
|
||||
public string? Signature { get; set; } = "KianaPS";
|
||||
public uint Level { get; set; } = 88;
|
||||
public uint Exp { get; set; } = 0;
|
||||
public uint HCoin { get; set; } = 0;
|
||||
public uint Stamina { get; set; } = 240;
|
||||
public uint HeadIcon { get; set; } = 161090;
|
||||
public uint HeadFrame { get; set; } = 200001;
|
||||
public uint WarshipId { get; set; } = 400004;
|
||||
public uint PhonePendantId { get; set; } = 350005;
|
||||
public uint AssistantAvatarId { get; set; } = 101;
|
||||
public uint BirthDay { get; set; } = 0;
|
||||
public int Level { get; set; } = 88;
|
||||
public int Exp { get; set; } = 0;
|
||||
public int HCoin { get; set; } = 0;
|
||||
public int Stamina { get; set; } = 240;
|
||||
public int HeadIcon { get; set; } = 161090;
|
||||
public int HeadFrame { get; set; } = 200001;
|
||||
public int WarshipId { get; set; } = 400004;
|
||||
public int PhonePendantId { get; set; } = 350005;
|
||||
public int AssistantAvatarId { get; set; } = 101;
|
||||
public int BirthDay { get; set; } = 0;
|
||||
[SugarColumn(IsJson = true)] public WarshipAvatarData WarshipAvatar { get; set; } = new();
|
||||
[SugarColumn(IsNullable = true)] public long LastActiveTime { get; set; }
|
||||
public long RegisterTime { get; set; } = Extensions.GetUnixSec();
|
||||
@@ -35,23 +35,23 @@ public class PlayerData : BaseDatabaseDataHelper
|
||||
return new GetMainDataRsp
|
||||
{
|
||||
IsAll = true,
|
||||
AssistantAvatarId = 0,
|
||||
Birthday = BirthDay,
|
||||
AssistantAvatarId = (uint)AssistantAvatarId,
|
||||
Birthday = (uint)BirthDay,
|
||||
Nickname = Name,
|
||||
Level = Level,
|
||||
Exp = Exp,
|
||||
Hcoin = HCoin,
|
||||
CustomHeadId = HeadIcon,
|
||||
Level = (uint)Level,
|
||||
Exp = (uint)Exp,
|
||||
Hcoin = (uint)HCoin,
|
||||
CustomHeadId = (uint)HeadIcon,
|
||||
RegisterTime = (uint)RegisterTime,
|
||||
WarshipAvatar = new Proto.WarshipAvatarData
|
||||
{
|
||||
WarshipFirstAvatarId = 0,
|
||||
WarshipSecondAvatarId = 0,
|
||||
WarshipFirstAvatarId = (uint)WarshipAvatar.FirstAvatarId,
|
||||
WarshipSecondAvatarId = (uint)WarshipAvatar.SecondAvatarId,
|
||||
},
|
||||
SelfDesc = Signature,
|
||||
UseFrameId = HeadFrame,
|
||||
OnPhonePendantId = PhonePendantId,
|
||||
Stamina = Stamina,
|
||||
UseFrameId = (uint)HeadFrame,
|
||||
OnPhonePendantId = (uint)PhonePendantId,
|
||||
Stamina = (uint)Stamina,
|
||||
StaminaRecoverConfigTime = GameConstants.STAMINA_RECOVERY_TIME,
|
||||
StaminaRecoverLeftTime = GameConstants.STAMINA_RECOVERY_TIME,
|
||||
EquipmentSizeLimit = GameConstants.INVENTORY_MAX_EQUIPMENT,
|
||||
@@ -59,7 +59,7 @@ public class PlayerData : BaseDatabaseDataHelper
|
||||
LevelLockId = 1,
|
||||
WarshipTheme = new WarshipThemeData
|
||||
{
|
||||
WarshipId=0
|
||||
WarshipId=(uint)WarshipId
|
||||
},
|
||||
TotalLoginDays = 1
|
||||
};
|
||||
@@ -68,6 +68,6 @@ public class PlayerData : BaseDatabaseDataHelper
|
||||
|
||||
public class WarshipAvatarData
|
||||
{
|
||||
public uint FirstAvatarId { get; set; } = 101;
|
||||
public uint SecondAvatarId { get; set; } = 0;
|
||||
public int FirstAvatarId { get; set; } = 101;
|
||||
public int SecondAvatarId { get; set; } = 0;
|
||||
}
|
||||
@@ -1,5 +1,6 @@
|
||||
using KianaBH.Enums.Player;
|
||||
using KianaBH.GameServer.Game.Player;
|
||||
using KianaBH.GameServer.Server.Packet.Send.Chat;
|
||||
using KianaBH.Util;
|
||||
|
||||
namespace KianaBH.GameServer.Command;
|
||||
@@ -31,7 +32,7 @@ public class PlayerCommandSender(PlayerInstance player) : ICommandSender
|
||||
|
||||
public async ValueTask SendMsg(string msg)
|
||||
{
|
||||
// TODO SEND MSG
|
||||
await Player.SendPacket(new PacketRecvChatMsgNotify(msg));
|
||||
}
|
||||
|
||||
public int GetSender()
|
||||
|
||||
52
GameServer/Command/Commands/CommandHelp.cs
Normal file
52
GameServer/Command/Commands/CommandHelp.cs
Normal file
@@ -0,0 +1,52 @@
|
||||
using KianaBH.Enums.Player;
|
||||
using KianaBH.Internationalization;
|
||||
using KianaBH.Util.Extensions;
|
||||
|
||||
namespace KianaBH.GameServer.Command.Commands;
|
||||
|
||||
[CommandInfo("help", "Game.Command.Help.Desc", "Game.Command.Help.Usage", ["h"], [PermEnum.Support, PermEnum.Trial])]
|
||||
public class CommandHelp : ICommands
|
||||
{
|
||||
[CommandDefault]
|
||||
public async static ValueTask Help(CommandArg arg)
|
||||
{
|
||||
if (arg.Args.Count == 1)
|
||||
{
|
||||
var cmd = arg.Args[0];
|
||||
if (CommandManager.CommandInfo == null || !CommandManager.CommandInfo.TryGetValue(cmd, out var command))
|
||||
{
|
||||
await arg.SendMsg(I18NManager.Translate("Game.Command.Notice.CommandNotFound"));
|
||||
return;
|
||||
}
|
||||
|
||||
var msg =
|
||||
$"/{command.Name} - {I18NManager.Translate(command.Description)}\n{I18NManager.Translate(command.Usage)}";
|
||||
if (command.Alias.Length > 0)
|
||||
msg +=
|
||||
$"\n{I18NManager.Translate("Game.Command.Help.CommandAlias")} {command.Alias.ToList().ToArrayString()}";
|
||||
if (command.Perm != null)
|
||||
msg += $"\n{I18NManager.Translate("Game.Command.Help.CommandPermission")} {string.Join(", ", command.Perm.Select(perm => perm.ToString()))}";
|
||||
|
||||
await arg.SendMsg(msg + "\n");
|
||||
return;
|
||||
}
|
||||
else
|
||||
{
|
||||
await arg.SendMsg(I18NManager.Translate("Game.Command.Help.Commands"));
|
||||
if (CommandManager.CommandInfo == null) return;
|
||||
|
||||
foreach (var command in CommandManager.CommandInfo.Values)
|
||||
{
|
||||
var msg =
|
||||
$"/{command.Name} - {I18NManager.Translate(command.Description)}\n{I18NManager.Translate(command.Usage)}";
|
||||
if (command.Alias.Length > 0)
|
||||
msg +=
|
||||
$"\n{I18NManager.Translate("Game.Command.Help.CommandAlias")} {command.Alias.ToList().ToArrayString()}";
|
||||
|
||||
if (command.Perm != null)
|
||||
msg += $"\n{I18NManager.Translate("Game.Command.Help.CommandPermission")} {string.Join(", ", command.Perm.Select(perm => perm.ToString()))}";
|
||||
await arg.SendMsg(msg + "\n");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
31
GameServer/Game/Chat/WorldChatManager.cs
Normal file
31
GameServer/Game/Chat/WorldChatManager.cs
Normal file
@@ -0,0 +1,31 @@
|
||||
using KianaBH.GameServer.Command;
|
||||
using KianaBH.GameServer.Game.Player;
|
||||
using KianaBH.GameServer.Server.Packet.Send.Chat;
|
||||
using KianaBH.Proto;
|
||||
using KianaBH.Util.Extensions;
|
||||
|
||||
namespace KianaBH.GameServer.Game.Battle;
|
||||
|
||||
public class WorldChatManager(PlayerInstance player) : BasePlayerManager(player)
|
||||
{
|
||||
public List<ChatMsg> Chats { get; set; } = [];
|
||||
|
||||
public async ValueTask SendMessage(string message, ChatMsg chatMsg)
|
||||
{
|
||||
chatMsg.Uid = (uint)Player.Data.Uid;
|
||||
chatMsg.Nickname = Player.Data.Name;
|
||||
chatMsg.Time = (uint)Extensions.GetUnixSec();
|
||||
chatMsg.AvatarId = (uint)Player.Data.AssistantAvatarId;
|
||||
chatMsg.DressId = (uint)Player.AvatarManager!.AvatarData.Avatars.Where(avatar => avatar.AvatarId == Player.Data.AssistantAvatarId).First().DressId;
|
||||
chatMsg.FrameId = (uint)Player.Data.HeadFrame;
|
||||
chatMsg.CustomHeadId = (uint)Player.Data.HeadIcon;
|
||||
|
||||
await Player.SendPacket(new PacketRecvChatMsgNotify(chatMsg));
|
||||
|
||||
if (message.StartsWith('/') == true)
|
||||
{
|
||||
var cmd = message[1..];
|
||||
CommandExecutor.ExecuteCommand(new PlayerCommandSender(Player), cmd);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -4,6 +4,7 @@ using KianaBH.Database.Account;
|
||||
using KianaBH.Database.Client;
|
||||
using KianaBH.Database.Player;
|
||||
using KianaBH.GameServer.Game.Avatar;
|
||||
using KianaBH.GameServer.Game.Battle;
|
||||
using KianaBH.GameServer.Game.Inventory;
|
||||
using KianaBH.GameServer.Server;
|
||||
using KianaBH.KcpSharp;
|
||||
@@ -20,6 +21,7 @@ public class PlayerInstance(PlayerData data)
|
||||
public PlayerData Data { get; set; } = data;
|
||||
public ClientData? ClientData { get; private set; }
|
||||
public GuideData? GuideData { get; private set; }
|
||||
public WorldChatManager? WorldChatManager { get; private set; }
|
||||
public int Uid { get; set; }
|
||||
public Connection? Connection { get; set; }
|
||||
public bool Initialized { get; set; }
|
||||
@@ -53,6 +55,7 @@ public class PlayerInstance(PlayerData data)
|
||||
InventoryManager = new InventoryManager(this);
|
||||
ClientData = InitializeDatabase<ClientData>();
|
||||
GuideData = InitializeDatabase<GuideData>();
|
||||
WorldChatManager = new WorldChatManager(this);
|
||||
Data.LastActiveTime = Extensions.GetUnixSec();
|
||||
|
||||
await Task.CompletedTask;
|
||||
|
||||
@@ -175,6 +175,10 @@ public class Connection(KcpConversation conversation, IPEndPoint remote) : KcpCo
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
if (ConfigManager.Config.ServerOption.EnableDebug &&
|
||||
ConfigManager.Config.ServerOption.DebugNoHandlerPacket)
|
||||
Logger.Error($"No handler found for {packetName}({opcode})");
|
||||
}
|
||||
|
||||
private async Task SendDummy(string packetName)
|
||||
|
||||
@@ -0,0 +1,21 @@
|
||||
using KianaBH.GameServer.Command;
|
||||
using KianaBH.GameServer.Server.Packet.Send.Chat;
|
||||
using KianaBH.Proto;
|
||||
|
||||
namespace KianaBH.GameServer.Server.Packet.Recv.Chat;
|
||||
|
||||
[Opcode(CmdIds.SendChatMsgNotify)]
|
||||
public class HandlerSendChatMsgNotify : Handler
|
||||
{
|
||||
public override async Task OnHandle(Connection connection, byte[] header, byte[] data)
|
||||
{
|
||||
var req = SendChatMsgNotify.Parser.ParseFrom(data);
|
||||
var player = connection.Player!;
|
||||
if (player == null) return;
|
||||
|
||||
string msg = req.ChatMsg.Content.Items.Where(item => item.MsgStr != null).FirstOrDefault()?.MsgStr!;
|
||||
if (msg == null) return;
|
||||
|
||||
await player.WorldChatManager!.SendMessage(msg,req.ChatMsg);
|
||||
}
|
||||
}
|
||||
@@ -12,8 +12,8 @@ public class HandlerSetWarshipAvatarReq : Handler
|
||||
var player = connection.Player!;
|
||||
var req = SetWarshipAvatarReq.Parser.ParseFrom(data);
|
||||
|
||||
player.Data.WarshipAvatar.FirstAvatarId = req.FirstAvatarId;
|
||||
player.Data.WarshipAvatar.SecondAvatarId = req.SecondAvatarId;
|
||||
player.Data.WarshipAvatar.FirstAvatarId = (int)req.FirstAvatarId;
|
||||
player.Data.WarshipAvatar.SecondAvatarId = (int)req.SecondAvatarId;
|
||||
|
||||
await connection.SendPacket(new PacketGetMainDataRsp(req.FirstAvatarId,req.SecondAvatarId));
|
||||
await connection.SendPacket(CmdIds.SetWarshipAvatarRsp);
|
||||
|
||||
@@ -0,0 +1,56 @@
|
||||
using KianaBH.KcpSharp;
|
||||
using KianaBH.Proto;
|
||||
using KianaBH.Util;
|
||||
using KianaBH.Util.Extensions;
|
||||
|
||||
namespace KianaBH.GameServer.Server.Packet.Send.Chat;
|
||||
|
||||
public class PacketRecvChatMsgNotify : BasePacket
|
||||
{
|
||||
public PacketRecvChatMsgNotify(ChatMsg msgs) : base(CmdIds.RecvChatMsgNotify)
|
||||
{
|
||||
var proto = new RecvChatMsgNotify
|
||||
{
|
||||
ChatMsgList = { msgs }
|
||||
};
|
||||
|
||||
SetData(proto);
|
||||
}
|
||||
|
||||
public PacketRecvChatMsgNotify(string message) : base(CmdIds.RecvChatMsgNotify)
|
||||
{
|
||||
var proto = new RecvChatMsgNotify
|
||||
{
|
||||
ChatMsgList =
|
||||
{
|
||||
new ChatMsg
|
||||
{
|
||||
Uid = (uint)ConfigManager.Config.ServerOption.ServerProfile.Uid,
|
||||
Nickname = ConfigManager.Config.ServerOption.ServerProfile.Name,
|
||||
Time = (uint)Extensions.GetUnixSec(),
|
||||
Msg = message,
|
||||
Channel = ChatMsg.Types.MsgChannel.World,
|
||||
AvatarId = (uint)ConfigManager.Config.ServerOption.ServerProfile.AvatarId,
|
||||
DressId = (uint)ConfigManager.Config.ServerOption.ServerProfile.DressId,
|
||||
FrameId = (uint)ConfigManager.Config.ServerOption.ServerProfile.FrameId,
|
||||
CustomHeadId = (uint)ConfigManager.Config.ServerOption.ServerProfile.HeadId,
|
||||
CheckResult = new ChatMsgSensitiveCheckResult
|
||||
{
|
||||
RewriteText = message
|
||||
},
|
||||
Content = new ChatMsgContent
|
||||
{
|
||||
Items =
|
||||
{
|
||||
new ChatMsgItem
|
||||
{
|
||||
MsgStr = message,
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
SetData(proto);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user