using PSO2SERVER.Protocol; namespace PSO2SERVER.Models { // 对象类型枚举 public enum ObjectType : ushort { Unknown = 0x0000, /// 玩家对象。 Player = 0x0004, /// 区域对象。 Map = 0x0005, /// 大部分的对象和NPC。 Object = 0x0006, /// 一些可破坏的物体(例如一些树木)。 StaticObject = 0x0007, /// 任务对象。11 Quest = 0x000B, /// 队伍对象。13 Party = 0x000D, /// 世界(地图池中的)对象。16 World = 0x0010, /// 非玩家可控的伙伴。22 APC = 0x0016, /// 未定义的类型。 Undefined = 0xFFFF } // 对象头部结构体 public struct ObjectHeader { /// 对象的ID。 public uint ID; public uint padding; // 总是有填充 /// 对象的类型。 public ObjectType ObjectType; /// 对象所在的区域ID。玩家对象没有设置这个字段。 public ushort MapID; // 只包含ID和类型的构造函数 public ObjectHeader(uint id, ObjectType type) : this() { ID = id; ObjectType = type; } // 包含ID、类型和区域ID的构造函数 public ObjectHeader(uint id, ObjectType type, ushort mapid) : this() { ID = id; ObjectType = type; MapID = mapid; } // 从数据流中读取数据并填充到当前结构体 public void ReadObjectHeaderFromStream(PacketReader reader) { ID = reader.ReadUInt32(); // 读取对象ID padding = reader.ReadUInt32(); // 读取填充部分 ObjectType = (ObjectType)reader.ReadUInt16(); // 读取对象类型 MapID = reader.ReadUInt16(); // 读取区域ID } // 将当前结构体的数据写入到数据流 public void WriteObjectHeaderToStream(PacketWriter writer) { writer.Write(ID); // 写入对象ID writer.Write(padding); // 写入填充部分 writer.Write((ushort)ObjectType); // 写入对象类型 writer.Write(MapID); // 写入区域ID } } }