90 lines
2.8 KiB
C#
90 lines
2.8 KiB
C#
using Newtonsoft.Json;
|
||
using PSO2SERVER.Json;
|
||
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。
|
||
[JsonProperty("id")]
|
||
public uint ID { get; set; }
|
||
[JsonProperty("unk")]
|
||
public uint Padding { get; set; }
|
||
/// 对象的类型。
|
||
[JsonProperty("entity_type")]
|
||
[JsonConverter(typeof(ObjectTypeConverter))]
|
||
public ObjectType ObjectType { get; set; }
|
||
/// 对象所在的区域ID。玩家对象没有设置这个字段。
|
||
[JsonProperty("map_id")]
|
||
public ushort MapID { get; set; }
|
||
|
||
// 只包含ID和类型的构造函数
|
||
public ObjectHeader(uint id, ObjectType objectType)
|
||
{
|
||
ID = id;
|
||
Padding = 0;
|
||
ObjectType = objectType;
|
||
MapID = 0;
|
||
}
|
||
|
||
// 包含ID、类型和区域ID的构造函数
|
||
public ObjectHeader(uint id, ObjectType objectType, ushort mapid)
|
||
{
|
||
ID = id;
|
||
Padding = 0;
|
||
ObjectType = objectType;
|
||
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
|
||
}
|
||
|
||
// ToString 方法,用来返回 ObjectHeader 的字符串表示
|
||
public override string ToString()
|
||
{
|
||
return $"ObjectHeader [ID={ID}, Padding={Padding}, ObjectType={ObjectType}, MapID={MapID}]";
|
||
}
|
||
}
|
||
}
|