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];
}
}