using Island.StandardLib.Math; using Island.StandardLib.Storage; using System; using System.Collections.Generic; using System.Text; namespace Island.StandardLib.Storage { /// /// 表示一次客户端报文的所有内容 /// public abstract class ConnectObject { /// /// 指令列表 /// public StorableFixedArray Commands; protected void ReadCommands(DataStorage data) => data.Read(out Commands); protected void WriteCommands(DataStorage data) => data.Write(Commands); protected void InitCommands() => Commands = new StorableFixedArray(); /// /// 检查是否包含具有指定名称的指令 /// /// 指令名称 public bool HasCommand(int commandName) { for (int i = 0; i < Commands.Length; i++) { if (Commands[i].Name == commandName) return true; } return false; } /// /// 添加指令 /// /// 指令名称 /// 是否替换现有相同名称的指令 public void AddCommand(ConnectCommand command, bool replaceSameCommand = false) { lock (this) { if (replaceSameCommand) { for (int i = 0; i < Commands.Length; i++) { if (Commands[i].Name == command.Name) { Commands[i].Args = command.Args; return; } } } Commands.Add(command); } } public void AddCommand(ConnectCommand command, Func compareFunc) { lock (this) { for (int i = 0; i < Commands.Length; i++) { if (command.Name == Commands[i].Name) { if (compareFunc(command, Commands[i])) { Commands[i].Args = command.Args; return; } } } Commands.Add(command); } } /// /// 清除指令 /// public void ClearCommands() { Commands.Clear(); } } /// /// 表示一次客户端报文的所有内容 /// public class ConnectObjectFromClient : ConnectObject, IStorable { public ConnectObjectFromClient() => InitCommands(); public void ReadFromData(DataStorage data) { ReadCommands(data); } public void WriteToData(DataStorage data) { WriteCommands(data); } } /// /// 表示一次服务器报文的所有内容 /// public class ConnectObjectFromServer : ConnectObject, IStorable { public ConnectObjectFromServer() { InitCommands(); } public void ReadFromData(DataStorage data) { ReadCommands(data); } public void WriteToData(DataStorage data) { WriteCommands(data); } } /// /// 表示一个指令 /// public class ConnectCommand : IStorable { /// /// 指令名称 /// public int Name; /// /// 指令参数列表 /// public StorableMultArray Args; public ConnectCommand() => Args = new StorableMultArray(); public ConnectCommand(int command, params MultData[] args) { Args = new StorableMultArray(); Name = command; for (int i = 0; i < args.Length; i++) Args.Add(args[i]); } public void ReadFromData(DataStorage data) { data.Read(out Name); data.Read(out Args); } public void WriteToData(DataStorage data) { data.Write(Name); data.Write(Args); } /// /// 获取某个参数 /// /// 参数位置 public MultData this[int index] => Args[index]; } }