

cs
/// <summary>C→S:玩家发出的操作意图(按键方向/目标点)。服务器权威计算真实坐标。</summary>
[MessagePackObject]
public class EntityMoveCmd
{
[Key(0)] public long EntityId { get; set; } // 我控制的那个
[Key(1)] public float DirX { get; set; } // 标准化方向向量(或0)
[Key(2)] public float DirY { get; set; }
}
/// <summary>S→C:新实体出现在视野内(出生/进入)。</summary>
[MessagePackObject]
public class EntitySpawn
{
[Key(0)] public long EntityId { get; set; }
[Key(1)] public ushort TypeId { get; set; } // 精灵类型:玩家/小兵/怪物...
[Key(2)] public float IsoX { get; set; } // 浮点坐标(允许像素级插值)
[Key(3)] public float IsoY { get; set; }
[Key(4)] public byte FaceDir { get; set; } // 0-7 朝向
}
/// <summary>S→C:实体最新状态快照,多条打包。</summary>
[MessagePackObject]
public class EntityState
{
[Key(0)] public long EntityId { get; set; }
[Key(1)] public float IsoX { get; set; }
[Key(2)] public float IsoY { get; set; }
[Key(3)] public byte FaceDir { get; set; }
[Key(4)] public byte AnimFrame { get; set; } // 当前动画帧,0=idle
[Key(5)] public byte Flags { get; set; } // 位标志:1=移动中,2=攻击中...
}
/// <summary>S→C:实体消失(死亡/离开视野)。</summary>
[MessagePackObject]
public class EntityDespawn
{
[Key(0)] public long EntityId { get; set; }
}
/// <summary>S→C:批量状态更新包(1条消息含多条 EntityState,降低 UDP 头开销)。</summary>
[MessagePackObject]
public class EntityStateBatch
{
[Key(0)] public uint Tick { get; set; } // 服务器 tick 号,客户端做插值用
[Key(1)] public List<EntityState> States { get; set; } = new();
}

