三角洲行动的通信协议库,用于特勤处服务器和游戏服务器之间的通信。
本协议库定义了特勤处(Core)和游戏服务器(Game)之间的所有通信数据包格式和处理逻辑。
public enum PacketType : byte
{
// 系统
Request, Response,
// 连接
Connect, Disconnect,
// 游戏状态
GameState, GameStateResponse,
// 心跳
Heartbeat, HeartbeatResponse,
// 背包数据
PlayerInventoryRequest, PlayerInventoryResponse,
SaveInventoryRequest, SaveInventoryResponse,
// 小队数据
SquadDataRequest, SquadDataResponse,
// 物品清单
ItemListRequest, ItemListResponse,
// 客户端标识
ClientIdentity, ClientIdentityResponse,
// 玩家位置
PlayerPositionRequest, PlayerPositionResponse,
}用于特勤处通知游戏服务器游戏开始或结束。
public class GameStatePacket : IRequestPacket
{
public PacketType PacketID => PacketType.GameState;
public Guid RequestId { get; set; }
public bool IsGameActive { get; set; } // 游戏是否进行中
public int GameMode { get; set; } // 游戏模式
public int GameTime { get; set; } // 游戏时间
}游戏服务器请求特勤处的物品配置列表。
public class ItemListRequestPacket : IRequestPacket
public class ItemListResponsePacket : IResponsePacket
{
public ItemInfo[] Items { get; set; }
public int TotalCount { get; set; }
}
public class ItemInfo
{
public string Name { get; set; } // 物品名称
public int Type { get; set; } // 物品类型ID
public int Weight { get; set; } // 物品权重
public long Value { get; set; } // 物品价值(哈夫币)
}游戏服务器请求当前匹配的小队数据。
public class SquadDataRequestPacket : IRequestPacket
public class SquadDataResponsePacket : IResponsePacket
{
public SquadInfo[] Squads { get; set; }
}
public class SquadInfo
{
public int SquadId { get; set; } // 小队ID
public SquadMemberInfo[] Members { get; set; } // 小队成员
}
public class SquadMemberInfo
{
public string PlayerName { get; set; } // 玩家名称
public int Team { get; set; } // 队伍ID
}用于同步玩家背包数据。
public class PlayerInventoryRequestPacket : IRequestPacket
{
public string PlayerName { get; set; }
}
public class PlayerInventoryResponsePacket : IResponsePacket
{
public string PlayerName { get; set; }
public ItemData[] Items { get; set; }
}
public class ItemData
{
public int Type { get; set; } // 物品类型
public int Stack { get; set; } // 数量
public byte Prefix { get; set; } // 前缀
}游戏服务器主动保存玩家背包数据到特勤处。
public class SaveInventoryRequestPacket : IRequestPacket
{
public string PlayerName { get; set; }
public string Inventory { get; set; } // 序列化的背包数据
public int Health { get; set; }
public int MaxHealth { get; set; }
public int Mana { get; set; }
public int MaxMana { get; set; }
// ... 其他玩家属性
}
public class SaveInventoryResponsePacket : IResponsePacket
{
public string PlayerName { get; set; }
public DateTime SavedAt { get; set; }
}用于维持连接和检测断开。
public class HeartbeatPacket : IRequestPacket
public class HeartbeatResponsePacket : IResponsePacket游戏服务器连接后发送身份验证。
public class ClientIdentityPacket : INetPacket
{
public Guid ClientId { get; set; }
public string ClientName { get; set; }
}协议使用二进制序列化,支持以下数据类型:
- 基础类型:byte, short, int, long, bool, float, double
- 字符串:UTF-8 编码
- 数组:支持任意类型的数组
- 复杂对象:支持嵌套对象
[PacketType(PacketType.GameState)] // 指定数据包类型
public class GameStatePacket : IRequestPacket
{
public Guid RequestId { get; set; } // 自动序列化
public bool IsGameActive { get; set; }
}public abstract class RequestHandlerBase<TRequest, TResponse>
where TRequest : IRequestPacket
where TResponse : IResponsePacket, new()
{
public abstract TResponse Handle(TRequest request);
protected TResponse CreateSuccessResponse(TRequest request, string message);
protected TResponse CreateFailureResponse(TRequest request, string message);
}var processor = new PacketProcessor();
processor.RegisterHandler<GameStateHandler>();
processor.RegisterHandlersFromAssembly(Assembly.GetExecutingAssembly());var request = new ItemListRequestPacket();
var response = await client.RequestAsync<ItemListRequestPacket, ItemListResponsePacket>(request);public class ItemListHandler : RequestHandlerBase<ItemListRequestPacket, ItemListResponsePacket>
{
public override ItemListResponsePacket Handle(ItemListRequestPacket request)
{
var items = GetItemsFromConfig();
var response = CreateSuccessResponse(request, "Success");
response.Items = items;
response.TotalCount = items.Length;
return response;
}
}- .NET 9.0
- 无外部依赖
少司命