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