// Code generated by codegen. DO NOT EDIT.
// Source: login.xml

package generated

import (
	"encoding/binary"
	"git.sharkk.net/EQ2/Protocol/types"
)


// LSCreateCharacterReply represents packet structure for OP_CreateCharacterReplyMsg
type LSCreateCharacterReply struct {
	AccountId uint32 `eq2:"account_id"`
	Response uint8 `eq2:"response"`
	Name string `eq2:"name,type:str16"`
}

// Serialize writes the packet data to the provided buffer
func (p *LSCreateCharacterReply) Serialize(dest []byte) uint32 {
	offset := uint32(0)
	binary.LittleEndian.PutUint32(dest[offset:], uint32(p.AccountId))
	offset += 4
	dest[offset] = byte(p.Response)
	offset++
	binary.LittleEndian.PutUint16(dest[offset:], uint16(len(p.Name)))
	offset += 2
	copy(dest[offset:], []byte(p.Name))
	offset += uint32(len(p.Name))
	return offset
}

// Size returns the serialized size of the packet
func (p *LSCreateCharacterReply) Size() uint32 {
	size := uint32(0)
	size += 4
	size += 1
	size += 2 + uint32(len(p.Name))
	return size
}

// LSCreateCharacterReplyV1189 represents packet structure for OP_CreateCharacterReplyMsg
type LSCreateCharacterReplyV1189 struct {
	AccountId uint32 `eq2:"account_id"`
	Unknown uint32 `eq2:"unknown"`  // TODO: Identify purpose
	Response uint8 `eq2:"response"`
	Name string `eq2:"name,type:str16"`
}

// Serialize writes the packet data to the provided buffer
func (p *LSCreateCharacterReplyV1189) Serialize(dest []byte) uint32 {
	offset := uint32(0)
	binary.LittleEndian.PutUint32(dest[offset:], uint32(p.AccountId))
	offset += 4
	binary.LittleEndian.PutUint32(dest[offset:], uint32(p.Unknown))
	offset += 4
	dest[offset] = byte(p.Response)
	offset++
	binary.LittleEndian.PutUint16(dest[offset:], uint16(len(p.Name)))
	offset += 2
	copy(dest[offset:], []byte(p.Name))
	offset += uint32(len(p.Name))
	return offset
}

// Size returns the serialized size of the packet
func (p *LSCreateCharacterReplyV1189) Size() uint32 {
	size := uint32(0)
	size += 4
	size += 4
	size += 1
	size += 2 + uint32(len(p.Name))
	return size
}

// LSCreateCharacterReplyV60085 represents packet structure for OP_CreateCharacterReplyMsg
type LSCreateCharacterReplyV60085 struct {
	AccountId uint32 `eq2:"account_id"`
	Unknown uint32 `eq2:"unknown"`  // TODO: Identify purpose
	Response uint8 `eq2:"response"`
	Name string `eq2:"name,type:str16"`
}

// Serialize writes the packet data to the provided buffer
func (p *LSCreateCharacterReplyV60085) Serialize(dest []byte) uint32 {
	offset := uint32(0)
	binary.LittleEndian.PutUint32(dest[offset:], uint32(p.AccountId))
	offset += 4
	binary.LittleEndian.PutUint32(dest[offset:], uint32(p.Unknown))
	offset += 4
	dest[offset] = byte(p.Response)
	offset++
	binary.LittleEndian.PutUint16(dest[offset:], uint16(len(p.Name)))
	offset += 2
	copy(dest[offset:], []byte(p.Name))
	offset += uint32(len(p.Name))
	return offset
}

// Size returns the serialized size of the packet
func (p *LSCreateCharacterReplyV60085) Size() uint32 {
	size := uint32(0)
	size += 4
	size += 4
	size += 1
	size += 2 + uint32(len(p.Name))
	return size
}

// LSDeleteCharacterRequest represents packet structure for OP_DeleteCharacterRequestMsg
type LSDeleteCharacterRequest struct {
	CharId uint32 `eq2:"char_id"`
	ServerId uint32 `eq2:"server_id"`
	Unknown uint32 `eq2:"unknown"`  // TODO: Identify purpose
	Name string `eq2:"name,type:str16"`
}

// Serialize writes the packet data to the provided buffer
func (p *LSDeleteCharacterRequest) Serialize(dest []byte) uint32 {
	offset := uint32(0)
	binary.LittleEndian.PutUint32(dest[offset:], uint32(p.CharId))
	offset += 4
	binary.LittleEndian.PutUint32(dest[offset:], uint32(p.ServerId))
	offset += 4
	binary.LittleEndian.PutUint32(dest[offset:], uint32(p.Unknown))
	offset += 4
	binary.LittleEndian.PutUint16(dest[offset:], uint16(len(p.Name)))
	offset += 2
	copy(dest[offset:], []byte(p.Name))
	offset += uint32(len(p.Name))
	return offset
}

// Size returns the serialized size of the packet
func (p *LSDeleteCharacterRequest) Size() uint32 {
	size := uint32(0)
	size += 4
	size += 4
	size += 4
	size += 2 + uint32(len(p.Name))
	return size
}

// LSDeleteCharacterResponse represents packet structure for OP_DeleteCharacterReplyMsg
type LSDeleteCharacterResponse struct {
	Response uint8 `eq2:"response"`
	ServerId uint32 `eq2:"server_id"`
	CharId uint32 `eq2:"char_id"`
	AccountId uint32 `eq2:"account_id"`
	Name string `eq2:"name,type:str16"`
	MaxCharacters uint32 `eq2:"max_characters"`
}

// Serialize writes the packet data to the provided buffer
func (p *LSDeleteCharacterResponse) Serialize(dest []byte) uint32 {
	offset := uint32(0)
	dest[offset] = byte(p.Response)
	offset++
	binary.LittleEndian.PutUint32(dest[offset:], uint32(p.ServerId))
	offset += 4
	binary.LittleEndian.PutUint32(dest[offset:], uint32(p.CharId))
	offset += 4
	binary.LittleEndian.PutUint32(dest[offset:], uint32(p.AccountId))
	offset += 4
	binary.LittleEndian.PutUint16(dest[offset:], uint16(len(p.Name)))
	offset += 2
	copy(dest[offset:], []byte(p.Name))
	offset += uint32(len(p.Name))
	binary.LittleEndian.PutUint32(dest[offset:], uint32(p.MaxCharacters))
	offset += 4
	return offset
}

// Size returns the serialized size of the packet
func (p *LSDeleteCharacterResponse) Size() uint32 {
	size := uint32(0)
	size += 1
	size += 4
	size += 4
	size += 4
	size += 2 + uint32(len(p.Name))
	size += 4
	return size
}

// LSLoginRequest represents packet structure for OP_LoginRequestMsg
type LSLoginRequest struct {
	SessionID string `eq2:"sessionID,type:str16"`
	SessionRecycleToken string `eq2:"sessionRecycleToken,type:str16"`
	Username string `eq2:"username,type:str16"`
	Password string `eq2:"password,type:str16"`
	AcctNum uint32 `eq2:"acctNum"`
	PassCode uint32 `eq2:"passCode"`
	Version uint16 `eq2:"version"`
}

// Serialize writes the packet data to the provided buffer
func (p *LSLoginRequest) Serialize(dest []byte) uint32 {
	offset := uint32(0)
	binary.LittleEndian.PutUint16(dest[offset:], uint16(len(p.SessionID)))
	offset += 2
	copy(dest[offset:], []byte(p.SessionID))
	offset += uint32(len(p.SessionID))
	binary.LittleEndian.PutUint16(dest[offset:], uint16(len(p.SessionRecycleToken)))
	offset += 2
	copy(dest[offset:], []byte(p.SessionRecycleToken))
	offset += uint32(len(p.SessionRecycleToken))
	binary.LittleEndian.PutUint16(dest[offset:], uint16(len(p.Username)))
	offset += 2
	copy(dest[offset:], []byte(p.Username))
	offset += uint32(len(p.Username))
	binary.LittleEndian.PutUint16(dest[offset:], uint16(len(p.Password)))
	offset += 2
	copy(dest[offset:], []byte(p.Password))
	offset += uint32(len(p.Password))
	binary.LittleEndian.PutUint32(dest[offset:], uint32(p.AcctNum))
	offset += 4
	binary.LittleEndian.PutUint32(dest[offset:], uint32(p.PassCode))
	offset += 4
	binary.LittleEndian.PutUint16(dest[offset:], uint16(p.Version))
	offset += 2
	return offset
}

// Size returns the serialized size of the packet
func (p *LSLoginRequest) Size() uint32 {
	size := uint32(0)
	size += 2 + uint32(len(p.SessionID))
	size += 2 + uint32(len(p.SessionRecycleToken))
	size += 2 + uint32(len(p.Username))
	size += 2 + uint32(len(p.Password))
	size += 4
	size += 4
	size += 2
	return size
}

// LSLoginRequestV562 represents packet structure for OP_LoginRequestMsg
type LSLoginRequestV562 struct {
	Accesscode string `eq2:"accesscode,type:str16"`
	Unknown1 string `eq2:"unknown1,type:str16"`  // TODO: Identify purpose
	Username string `eq2:"username,type:str16"`
	Password string `eq2:"password,type:str16"`
	Unknown2 [8]uint8 `eq2:"unknown2,size:8"`  // TODO: Identify purpose
	Unknown3 [2]uint8 `eq2:"unknown3,size:2"`  // TODO: Identify purpose
	Version uint32 `eq2:"version"`
	Unknown4 uint16 `eq2:"unknown4"`  // TODO: Identify purpose
	Unknown5 uint32 `eq2:"unknown5"`  // TODO: Identify purpose
}

// Serialize writes the packet data to the provided buffer
func (p *LSLoginRequestV562) Serialize(dest []byte) uint32 {
	offset := uint32(0)
	binary.LittleEndian.PutUint16(dest[offset:], uint16(len(p.Accesscode)))
	offset += 2
	copy(dest[offset:], []byte(p.Accesscode))
	offset += uint32(len(p.Accesscode))
	binary.LittleEndian.PutUint16(dest[offset:], uint16(len(p.Unknown1)))
	offset += 2
	copy(dest[offset:], []byte(p.Unknown1))
	offset += uint32(len(p.Unknown1))
	binary.LittleEndian.PutUint16(dest[offset:], uint16(len(p.Username)))
	offset += 2
	copy(dest[offset:], []byte(p.Username))
	offset += uint32(len(p.Username))
	binary.LittleEndian.PutUint16(dest[offset:], uint16(len(p.Password)))
	offset += 2
	copy(dest[offset:], []byte(p.Password))
	offset += uint32(len(p.Password))
	for i := 0; i < 8; i++ {
		dest[offset] = p.Unknown2[i]
		offset++
	}
	for i := 0; i < 2; i++ {
		dest[offset] = p.Unknown3[i]
		offset++
	}
	binary.LittleEndian.PutUint32(dest[offset:], uint32(p.Version))
	offset += 4
	binary.LittleEndian.PutUint16(dest[offset:], uint16(p.Unknown4))
	offset += 2
	binary.LittleEndian.PutUint32(dest[offset:], uint32(p.Unknown5))
	offset += 4
	return offset
}

// Size returns the serialized size of the packet
func (p *LSLoginRequestV562) Size() uint32 {
	size := uint32(0)
	size += 2 + uint32(len(p.Accesscode))
	size += 2 + uint32(len(p.Unknown1))
	size += 2 + uint32(len(p.Username))
	size += 2 + uint32(len(p.Password))
	size += uint32(8)
	size += uint32(2)
	size += 4
	size += 2
	size += 4
	return size
}

// LSLoginRequestV1208 represents packet structure for OP_LoginRequestMsg
type LSLoginRequestV1208 struct {
	Accesscode string `eq2:"accesscode,type:str16"`
	Unknown1 string `eq2:"unknown1,type:str16"`  // TODO: Identify purpose
	Username string `eq2:"username,type:str16"`
	Password string `eq2:"password,type:str16"`
	Unknown2 [8]uint8 `eq2:"unknown2,size:8"`  // TODO: Identify purpose
	Unknown3 [2]uint8 `eq2:"unknown3,size:2"`  // TODO: Identify purpose
	Version uint16 `eq2:"version"`
	Unknown4 uint8 `eq2:"unknown4"`  // TODO: Identify purpose
	Unknown5 [3]uint32 `eq2:"unknown5,size:3"`  // TODO: Identify purpose
	Unknown6 uint16 `eq2:"unknown6"`  // TODO: Identify purpose
	Unknown7 string `eq2:"unknown7,type:str16"`  // TODO: Identify purpose
}

// Serialize writes the packet data to the provided buffer
func (p *LSLoginRequestV1208) Serialize(dest []byte) uint32 {
	offset := uint32(0)
	binary.LittleEndian.PutUint16(dest[offset:], uint16(len(p.Accesscode)))
	offset += 2
	copy(dest[offset:], []byte(p.Accesscode))
	offset += uint32(len(p.Accesscode))
	binary.LittleEndian.PutUint16(dest[offset:], uint16(len(p.Unknown1)))
	offset += 2
	copy(dest[offset:], []byte(p.Unknown1))
	offset += uint32(len(p.Unknown1))
	binary.LittleEndian.PutUint16(dest[offset:], uint16(len(p.Username)))
	offset += 2
	copy(dest[offset:], []byte(p.Username))
	offset += uint32(len(p.Username))
	binary.LittleEndian.PutUint16(dest[offset:], uint16(len(p.Password)))
	offset += 2
	copy(dest[offset:], []byte(p.Password))
	offset += uint32(len(p.Password))
	for i := 0; i < 8; i++ {
		dest[offset] = p.Unknown2[i]
		offset++
	}
	for i := 0; i < 2; i++ {
		dest[offset] = p.Unknown3[i]
		offset++
	}
	binary.LittleEndian.PutUint16(dest[offset:], uint16(p.Version))
	offset += 2
	dest[offset] = byte(p.Unknown4)
	offset++
	for i := 0; i < 3; i++ {
		binary.LittleEndian.PutUint32(dest[offset:], uint32(p.Unknown5[i]))
		offset += 4
	}
	binary.LittleEndian.PutUint16(dest[offset:], uint16(p.Unknown6))
	offset += 2
	binary.LittleEndian.PutUint16(dest[offset:], uint16(len(p.Unknown7)))
	offset += 2
	copy(dest[offset:], []byte(p.Unknown7))
	offset += uint32(len(p.Unknown7))
	return offset
}

// Size returns the serialized size of the packet
func (p *LSLoginRequestV1208) Size() uint32 {
	size := uint32(0)
	size += 2 + uint32(len(p.Accesscode))
	size += 2 + uint32(len(p.Unknown1))
	size += 2 + uint32(len(p.Username))
	size += 2 + uint32(len(p.Password))
	size += uint32(8)
	size += uint32(2)
	size += 2
	size += 1
	size += uint32(3) * 4
	size += 2
	size += 2 + uint32(len(p.Unknown7))
	return size
}

// LSWorldList represents packet structure for OP_WorldListMsg
type LSWorldList struct {
	NumWorlds uint8 `eq2:"num_worlds"`
	WorldList []struct {
		Id uint32 `eq2:"id"`
		Name string `eq2:"name,type:str16"`
		Online uint8 `eq2:"online"`
		Locked uint8 `eq2:"locked"`
		Unknown2 uint8 `eq2:"unknown2"`
		Unknown3 uint8 `eq2:"unknown3"`
		Load uint8 `eq2:"load"`
	} `eq2:"world_list,sizeVar:num_worlds"`
}

// Serialize writes the packet data to the provided buffer
func (p *LSWorldList) Serialize(dest []byte) uint32 {
	offset := uint32(0)
	dest[offset] = byte(p.NumWorlds)
	offset++
	for _, elem := range p.WorldList {
		binary.LittleEndian.PutUint32(dest[offset:], elem.Id)
		offset += 4
		dest[offset] = byte(len(elem.Name))
		offset++
		copy(dest[offset:], []byte(elem.Name))
		offset += uint32(len(elem.Name))
		dest[offset] = elem.Online
		offset++
		dest[offset] = elem.Locked
		offset++
		dest[offset] = elem.Unknown2
		offset++
		dest[offset] = elem.Unknown3
		offset++
		dest[offset] = elem.Load
		offset++
	}
	return offset
}

// Size returns the serialized size of the packet
func (p *LSWorldList) Size() uint32 {
	size := uint32(0)
	size += 1
	for _, elem := range p.WorldList {
		_ = elem
		size += 4
		size += 1 + uint32(len(elem.Name))
		size += 1
		size += 1
		size += 1
		size += 1
		size += 1

	}
	return size
}

// LSWorldListV373 represents packet structure for OP_WorldListMsg
type LSWorldListV373 struct {
	NumWorlds uint8 `eq2:"num_worlds"`
	WorldList []struct {
		Id uint32 `eq2:"id"`
		Name string `eq2:"name,type:str16"`
		Tag uint8 `eq2:"tag"`
		Locked uint8 `eq2:"locked"`
		Hidden uint8 `eq2:"hidden"`
		Unknown uint8 `eq2:"unknown"`
		NumPlayers uint16 `eq2:"num_players"`
		Load uint8 `eq2:"load"`
		NumberOnlineFlag uint8 `eq2:"number_online_flag"`
		AllowedRaces uint32 `eq2:"allowed_races"`
	} `eq2:"world_list,sizeVar:num_worlds"`
}

// Serialize writes the packet data to the provided buffer
func (p *LSWorldListV373) Serialize(dest []byte) uint32 {
	offset := uint32(0)
	dest[offset] = byte(p.NumWorlds)
	offset++
	for _, elem := range p.WorldList {
		binary.LittleEndian.PutUint32(dest[offset:], elem.Id)
		offset += 4
		dest[offset] = byte(len(elem.Name))
		offset++
		copy(dest[offset:], []byte(elem.Name))
		offset += uint32(len(elem.Name))
		dest[offset] = elem.Tag
		offset++
		dest[offset] = elem.Locked
		offset++
		dest[offset] = elem.Hidden
		offset++
		dest[offset] = elem.Unknown
		offset++
		binary.LittleEndian.PutUint16(dest[offset:], elem.NumPlayers)
		offset += 2
		dest[offset] = elem.Load
		offset++
		dest[offset] = elem.NumberOnlineFlag
		offset++
		binary.LittleEndian.PutUint32(dest[offset:], elem.AllowedRaces)
		offset += 4
	}
	return offset
}

// Size returns the serialized size of the packet
func (p *LSWorldListV373) Size() uint32 {
	size := uint32(0)
	size += 1
	for _, elem := range p.WorldList {
		_ = elem
		size += 4
		size += 1 + uint32(len(elem.Name))
		size += 1
		size += 1
		size += 1
		size += 1
		size += 2
		size += 1
		size += 1
		size += 4

	}
	return size
}

// LSWorldListV546 represents packet structure for OP_WorldListMsg
type LSWorldListV546 struct {
	NumWorlds uint8 `eq2:"num_worlds"`
	WorldList []struct {
		Id uint32 `eq2:"id"`
		Name string `eq2:"name,type:str16"`
		Name2 string `eq2:"name2,type:str16"`
		Tag uint8 `eq2:"tag"`
		Locked uint8 `eq2:"locked"`
		Hidden uint8 `eq2:"hidden"`
		Unknown uint8 `eq2:"unknown"`
		NumPlayers uint16 `eq2:"num_players"`
		Load uint8 `eq2:"load"`
		NumberOnlineFlag uint8 `eq2:"number_online_flag"`
		Unknown2 uint8 `eq2:"unknown2"`
		AllowedRaces uint32 `eq2:"allowed_races"`
	} `eq2:"world_list,sizeVar:num_worlds"`
}

// Serialize writes the packet data to the provided buffer
func (p *LSWorldListV546) Serialize(dest []byte) uint32 {
	offset := uint32(0)
	dest[offset] = byte(p.NumWorlds)
	offset++
	for _, elem := range p.WorldList {
		binary.LittleEndian.PutUint32(dest[offset:], elem.Id)
		offset += 4
		dest[offset] = byte(len(elem.Name))
		offset++
		copy(dest[offset:], []byte(elem.Name))
		offset += uint32(len(elem.Name))
		dest[offset] = byte(len(elem.Name2))
		offset++
		copy(dest[offset:], []byte(elem.Name2))
		offset += uint32(len(elem.Name2))
		dest[offset] = elem.Tag
		offset++
		dest[offset] = elem.Locked
		offset++
		dest[offset] = elem.Hidden
		offset++
		dest[offset] = elem.Unknown
		offset++
		binary.LittleEndian.PutUint16(dest[offset:], elem.NumPlayers)
		offset += 2
		dest[offset] = elem.Load
		offset++
		dest[offset] = elem.NumberOnlineFlag
		offset++
		dest[offset] = elem.Unknown2
		offset++
		binary.LittleEndian.PutUint32(dest[offset:], elem.AllowedRaces)
		offset += 4
	}
	return offset
}

// Size returns the serialized size of the packet
func (p *LSWorldListV546) Size() uint32 {
	size := uint32(0)
	size += 1
	for _, elem := range p.WorldList {
		_ = elem
		size += 4
		size += 1 + uint32(len(elem.Name))
		size += 1 + uint32(len(elem.Name2))
		size += 1
		size += 1
		size += 1
		size += 1
		size += 2
		size += 1
		size += 1
		size += 1
		size += 4

	}
	return size
}

// LSWorldListV562 represents packet structure for OP_WorldListMsg
type LSWorldListV562 struct {
	NumWorlds uint8 `eq2:"num_worlds"`
	WorldList []struct {
		Id uint32 `eq2:"id"`
		Name string `eq2:"name,type:str16"`
		Name2 string `eq2:"name2,type:str16"`
		Tag uint8 `eq2:"tag"`
		Locked uint8 `eq2:"locked"`
		Hidden uint8 `eq2:"hidden"`
		Unknown uint8 `eq2:"unknown"`
		NumPlayers uint16 `eq2:"num_players"`
		Load uint8 `eq2:"load"`
		NumberOnlineFlag uint8 `eq2:"number_online_flag"`
		FeatureSet [2]uint8 `eq2:"feature_set,size:2"`
		AllowedRaces uint32 `eq2:"allowed_races"`
	} `eq2:"world_list,sizeVar:num_worlds"`
	Unknown2 uint8 `eq2:"unknown2"`  // TODO: Identify purpose
}

// Serialize writes the packet data to the provided buffer
func (p *LSWorldListV562) Serialize(dest []byte) uint32 {
	offset := uint32(0)
	dest[offset] = byte(p.NumWorlds)
	offset++
	for _, elem := range p.WorldList {
		binary.LittleEndian.PutUint32(dest[offset:], elem.Id)
		offset += 4
		dest[offset] = byte(len(elem.Name))
		offset++
		copy(dest[offset:], []byte(elem.Name))
		offset += uint32(len(elem.Name))
		dest[offset] = byte(len(elem.Name2))
		offset++
		copy(dest[offset:], []byte(elem.Name2))
		offset += uint32(len(elem.Name2))
		dest[offset] = elem.Tag
		offset++
		dest[offset] = elem.Locked
		offset++
		dest[offset] = elem.Hidden
		offset++
		dest[offset] = elem.Unknown
		offset++
		binary.LittleEndian.PutUint16(dest[offset:], elem.NumPlayers)
		offset += 2
		dest[offset] = elem.Load
		offset++
		dest[offset] = elem.NumberOnlineFlag
		offset++
		for i := 0; i < 2; i++ {
			dest[offset] = byte(elem.FeatureSet[i])
			offset++
		}
		binary.LittleEndian.PutUint32(dest[offset:], elem.AllowedRaces)
		offset += 4
	}
	dest[offset] = byte(p.Unknown2)
	offset++
	return offset
}

// Size returns the serialized size of the packet
func (p *LSWorldListV562) Size() uint32 {
	size := uint32(0)
	size += 1
	for _, elem := range p.WorldList {
		_ = elem
		size += 4
		size += 1 + uint32(len(elem.Name))
		size += 1 + uint32(len(elem.Name2))
		size += 1
		size += 1
		size += 1
		size += 1
		size += 2
		size += 1
		size += 1
		size += uint32(2)
		size += 4

	}
	size += 1
	return size
}

// LSWorldListV60114 represents packet structure for OP_WorldListMsg
type LSWorldListV60114 struct {
	NumWorlds uint8 `eq2:"num_worlds"`
	WorldList []struct {
		Id uint32 `eq2:"id"`
		Name string `eq2:"name,type:str16"`
		Name2 string `eq2:"name2,type:str16"`
		Tag uint8 `eq2:"tag"`
		Locked uint8 `eq2:"locked"`
		Hidden uint8 `eq2:"hidden"`
		Unknown uint8 `eq2:"unknown"`
		NumPlayers uint16 `eq2:"num_players"`
		Load uint8 `eq2:"load"`
		NumberOnlineFlag uint8 `eq2:"number_online_flag"`
		FeatureSet [2]uint8 `eq2:"feature_set,size:2"`
		AllowedRaces uint32 `eq2:"allowed_races"`
	} `eq2:"world_list,sizeVar:num_worlds"`
	Unknown2 uint8 `eq2:"unknown2"`  // TODO: Identify purpose
}

// Serialize writes the packet data to the provided buffer
func (p *LSWorldListV60114) Serialize(dest []byte) uint32 {
	offset := uint32(0)
	dest[offset] = byte(p.NumWorlds)
	offset++
	for _, elem := range p.WorldList {
		binary.LittleEndian.PutUint32(dest[offset:], elem.Id)
		offset += 4
		dest[offset] = byte(len(elem.Name))
		offset++
		copy(dest[offset:], []byte(elem.Name))
		offset += uint32(len(elem.Name))
		dest[offset] = byte(len(elem.Name2))
		offset++
		copy(dest[offset:], []byte(elem.Name2))
		offset += uint32(len(elem.Name2))
		dest[offset] = elem.Tag
		offset++
		dest[offset] = elem.Locked
		offset++
		dest[offset] = elem.Hidden
		offset++
		dest[offset] = elem.Unknown
		offset++
		binary.LittleEndian.PutUint16(dest[offset:], elem.NumPlayers)
		offset += 2
		dest[offset] = elem.Load
		offset++
		dest[offset] = elem.NumberOnlineFlag
		offset++
		for i := 0; i < 2; i++ {
			dest[offset] = byte(elem.FeatureSet[i])
			offset++
		}
		binary.LittleEndian.PutUint32(dest[offset:], elem.AllowedRaces)
		offset += 4
	}
	dest[offset] = byte(p.Unknown2)
	offset++
	return offset
}

// Size returns the serialized size of the packet
func (p *LSWorldListV60114) Size() uint32 {
	size := uint32(0)
	size += 1
	for _, elem := range p.WorldList {
		_ = elem
		size += 4
		size += 1 + uint32(len(elem.Name))
		size += 1 + uint32(len(elem.Name2))
		size += 1
		size += 1
		size += 1
		size += 1
		size += 2
		size += 1
		size += 1
		size += uint32(2)
		size += 4

	}
	size += 1
	return size
}

// LSWorldListV65534 represents packet structure for OP_WorldListMsg
type LSWorldListV65534 struct {
	NumWorlds uint8 `eq2:"num_worlds"`
	WorldList []struct {
		Id uint32 `eq2:"id"`
		Name string `eq2:"name,type:str16"`
		Name2 string `eq2:"name2,type:str16"`
		Tag uint8 `eq2:"tag"`
		Locked uint8 `eq2:"locked"`
		Hidden uint8 `eq2:"hidden"`
		Unknown uint8 `eq2:"unknown"`
		NumPlayers uint16 `eq2:"num_players"`
		Load uint8 `eq2:"load"`
		NumberOnlineFlag uint8 `eq2:"number_online_flag"`
		FeatureSet [3]uint8 `eq2:"feature_set,size:3"`
		AllowedRaces uint32 `eq2:"allowed_races"`
	} `eq2:"world_list,sizeVar:num_worlds"`
	Unknown2 uint8 `eq2:"unknown2"`  // TODO: Identify purpose
}

// Serialize writes the packet data to the provided buffer
func (p *LSWorldListV65534) Serialize(dest []byte) uint32 {
	offset := uint32(0)
	dest[offset] = byte(p.NumWorlds)
	offset++
	for _, elem := range p.WorldList {
		binary.LittleEndian.PutUint32(dest[offset:], elem.Id)
		offset += 4
		dest[offset] = byte(len(elem.Name))
		offset++
		copy(dest[offset:], []byte(elem.Name))
		offset += uint32(len(elem.Name))
		dest[offset] = byte(len(elem.Name2))
		offset++
		copy(dest[offset:], []byte(elem.Name2))
		offset += uint32(len(elem.Name2))
		dest[offset] = elem.Tag
		offset++
		dest[offset] = elem.Locked
		offset++
		dest[offset] = elem.Hidden
		offset++
		dest[offset] = elem.Unknown
		offset++
		binary.LittleEndian.PutUint16(dest[offset:], elem.NumPlayers)
		offset += 2
		dest[offset] = elem.Load
		offset++
		dest[offset] = elem.NumberOnlineFlag
		offset++
		for i := 0; i < 3; i++ {
			dest[offset] = byte(elem.FeatureSet[i])
			offset++
		}
		binary.LittleEndian.PutUint32(dest[offset:], elem.AllowedRaces)
		offset += 4
	}
	dest[offset] = byte(p.Unknown2)
	offset++
	return offset
}

// Size returns the serialized size of the packet
func (p *LSWorldListV65534) Size() uint32 {
	size := uint32(0)
	size += 1
	for _, elem := range p.WorldList {
		_ = elem
		size += 4
		size += 1 + uint32(len(elem.Name))
		size += 1 + uint32(len(elem.Name2))
		size += 1
		size += 1
		size += 1
		size += 1
		size += 2
		size += 1
		size += 1
		size += uint32(3)
		size += 4

	}
	size += 1
	return size
}

// LSWorldUpdate represents packet structure for OP_WorldStatusChangeMsg
type LSWorldUpdate struct {
	ServerId uint32 `eq2:"server_id"`
	Up uint8 `eq2:"up"`
	Locked uint8 `eq2:"locked"`
	Unknown1 uint8 `eq2:"unknown1"`  // TODO: Identify purpose
	Unknown2 uint8 `eq2:"unknown2"`  // TODO: Identify purpose
}

// Serialize writes the packet data to the provided buffer
func (p *LSWorldUpdate) Serialize(dest []byte) uint32 {
	offset := uint32(0)
	binary.LittleEndian.PutUint32(dest[offset:], uint32(p.ServerId))
	offset += 4
	dest[offset] = byte(p.Up)
	offset++
	dest[offset] = byte(p.Locked)
	offset++
	dest[offset] = byte(p.Unknown1)
	offset++
	dest[offset] = byte(p.Unknown2)
	offset++
	return offset
}

// Size returns the serialized size of the packet
func (p *LSWorldUpdate) Size() uint32 {
	size := uint32(0)
	size += 4
	size += 1
	size += 1
	size += 1
	size += 1
	return size
}

// LSPlayRequest represents packet structure for OP_PlayCharacterRequestMsg
type LSPlayRequest struct {
	CharId uint32 `eq2:"char_id"`
	Name string `eq2:"name,type:str16"`
}

// Serialize writes the packet data to the provided buffer
func (p *LSPlayRequest) Serialize(dest []byte) uint32 {
	offset := uint32(0)
	binary.LittleEndian.PutUint32(dest[offset:], uint32(p.CharId))
	offset += 4
	binary.LittleEndian.PutUint16(dest[offset:], uint16(len(p.Name)))
	offset += 2
	copy(dest[offset:], []byte(p.Name))
	offset += uint32(len(p.Name))
	return offset
}

// Size returns the serialized size of the packet
func (p *LSPlayRequest) Size() uint32 {
	size := uint32(0)
	size += 4
	size += 2 + uint32(len(p.Name))
	return size
}

// LSPlayRequestV284 represents packet structure for OP_PlayCharacterRequestMsg
type LSPlayRequestV284 struct {
	CharId uint32 `eq2:"char_id"`
	ServerId uint32 `eq2:"server_id"`
	Unknown [3]uint8 `eq2:"unknown,size:3"`  // TODO: Identify purpose
}

// Serialize writes the packet data to the provided buffer
func (p *LSPlayRequestV284) Serialize(dest []byte) uint32 {
	offset := uint32(0)
	binary.LittleEndian.PutUint32(dest[offset:], uint32(p.CharId))
	offset += 4
	binary.LittleEndian.PutUint32(dest[offset:], uint32(p.ServerId))
	offset += 4
	for i := 0; i < 3; i++ {
		dest[offset] = p.Unknown[i]
		offset++
	}
	return offset
}

// Size returns the serialized size of the packet
func (p *LSPlayRequestV284) Size() uint32 {
	size := uint32(0)
	size += 4
	size += 4
	size += uint32(3)
	return size
}

// LSPlayResponse represents packet structure for OP_PlayCharacterReplyMsg
type LSPlayResponse struct {
	Response uint8 `eq2:"response"`
	Server string `eq2:"server,type:str8"`
	Port uint16 `eq2:"port"`
	AccountId uint32 `eq2:"account_id"`
	AccessCode uint32 `eq2:"access_code"`
}

// Serialize writes the packet data to the provided buffer
func (p *LSPlayResponse) Serialize(dest []byte) uint32 {
	offset := uint32(0)
	dest[offset] = byte(p.Response)
	offset++
	dest[offset] = byte(len(p.Server))
	offset++
	copy(dest[offset:], []byte(p.Server))
	offset += uint32(len(p.Server))
	binary.LittleEndian.PutUint16(dest[offset:], uint16(p.Port))
	offset += 2
	binary.LittleEndian.PutUint32(dest[offset:], uint32(p.AccountId))
	offset += 4
	binary.LittleEndian.PutUint32(dest[offset:], uint32(p.AccessCode))
	offset += 4
	return offset
}

// Size returns the serialized size of the packet
func (p *LSPlayResponse) Size() uint32 {
	size := uint32(0)
	size += 1
	size += 1 + uint32(len(p.Server))
	size += 2
	size += 4
	size += 4
	return size
}

// LSPlayResponseV1096 represents packet structure for OP_PlayCharacterReplyMsg
type LSPlayResponseV1096 struct {
	Response uint8 `eq2:"response"`
	Unknown1 uint16 `eq2:"unknown1"`  // TODO: Identify purpose
	Server string `eq2:"server,type:str8"`
	Port uint16 `eq2:"port"`
	AccountId uint32 `eq2:"account_id"`
	AccessCode uint32 `eq2:"access_code"`
}

// Serialize writes the packet data to the provided buffer
func (p *LSPlayResponseV1096) Serialize(dest []byte) uint32 {
	offset := uint32(0)
	dest[offset] = byte(p.Response)
	offset++
	binary.LittleEndian.PutUint16(dest[offset:], uint16(p.Unknown1))
	offset += 2
	dest[offset] = byte(len(p.Server))
	offset++
	copy(dest[offset:], []byte(p.Server))
	offset += uint32(len(p.Server))
	binary.LittleEndian.PutUint16(dest[offset:], uint16(p.Port))
	offset += 2
	binary.LittleEndian.PutUint32(dest[offset:], uint32(p.AccountId))
	offset += 4
	binary.LittleEndian.PutUint32(dest[offset:], uint32(p.AccessCode))
	offset += 4
	return offset
}

// Size returns the serialized size of the packet
func (p *LSPlayResponseV1096) Size() uint32 {
	size := uint32(0)
	size += 1
	size += 2
	size += 1 + uint32(len(p.Server))
	size += 2
	size += 4
	size += 4
	return size
}

// LSPlayResponseV60085 represents packet structure for OP_PlayCharacterReplyMsg
type LSPlayResponseV60085 struct {
	Response uint8 `eq2:"response"`
	Unknown1 [3]uint16 `eq2:"unknown1,size:3"`  // TODO: Identify purpose
	Server string `eq2:"server,type:str8"`
	Port uint16 `eq2:"port"`
	AccountId uint32 `eq2:"account_id"`
	AccessCode uint32 `eq2:"access_code"`
}

// Serialize writes the packet data to the provided buffer
func (p *LSPlayResponseV60085) Serialize(dest []byte) uint32 {
	offset := uint32(0)
	dest[offset] = byte(p.Response)
	offset++
	for i := 0; i < 3; i++ {
		binary.LittleEndian.PutUint16(dest[offset:], uint16(p.Unknown1[i]))
		offset += 2
	}
	dest[offset] = byte(len(p.Server))
	offset++
	copy(dest[offset:], []byte(p.Server))
	offset += uint32(len(p.Server))
	binary.LittleEndian.PutUint16(dest[offset:], uint16(p.Port))
	offset += 2
	binary.LittleEndian.PutUint32(dest[offset:], uint32(p.AccountId))
	offset += 4
	binary.LittleEndian.PutUint32(dest[offset:], uint32(p.AccessCode))
	offset += 4
	return offset
}

// Size returns the serialized size of the packet
func (p *LSPlayResponseV60085) Size() uint32 {
	size := uint32(0)
	size += 1
	size += uint32(3) * 2
	size += 1 + uint32(len(p.Server))
	size += 2
	size += 4
	size += 4
	return size
}

// LSPlayResponseV60099 represents packet structure for OP_PlayCharacterReplyMsg
type LSPlayResponseV60099 struct {
	Response uint8 `eq2:"response"`
	Unknown1 [3]uint16 `eq2:"unknown1,size:3"`  // TODO: Identify purpose
	Server string `eq2:"server,type:str8"`
	Port uint16 `eq2:"port"`
	AccountId uint32 `eq2:"account_id"`
	AccessCode uint32 `eq2:"access_code"`
}

// Serialize writes the packet data to the provided buffer
func (p *LSPlayResponseV60099) Serialize(dest []byte) uint32 {
	offset := uint32(0)
	dest[offset] = byte(p.Response)
	offset++
	for i := 0; i < 3; i++ {
		binary.LittleEndian.PutUint16(dest[offset:], uint16(p.Unknown1[i]))
		offset += 2
	}
	dest[offset] = byte(len(p.Server))
	offset++
	copy(dest[offset:], []byte(p.Server))
	offset += uint32(len(p.Server))
	binary.LittleEndian.PutUint16(dest[offset:], uint16(p.Port))
	offset += 2
	binary.LittleEndian.PutUint32(dest[offset:], uint32(p.AccountId))
	offset += 4
	binary.LittleEndian.PutUint32(dest[offset:], uint32(p.AccessCode))
	offset += 4
	return offset
}

// Size returns the serialized size of the packet
func (p *LSPlayResponseV60099) Size() uint32 {
	size := uint32(0)
	size += 1
	size += uint32(3) * 2
	size += 1 + uint32(len(p.Server))
	size += 2
	size += 4
	size += 4
	return size
}

// CharSelectProfile represents packet structure for client version 1
type CharSelectProfile struct {
	Charid uint32 `eq2:"charid"`
	ServerId uint32 `eq2:"server_id"`
	Name string `eq2:"name,type:str16"`
	Race uint8 `eq2:"race"`
	Class uint8 `eq2:"class"`
	Level uint32 `eq2:"level"`
	Zone string `eq2:"zone,type:str16"`
	Unknown1 uint32 `eq2:"unknown1"`  // TODO: Identify purpose
	Unknown2 uint32 `eq2:"unknown2"`  // TODO: Identify purpose
	CreatedDate uint32 `eq2:"created_date"`
	LastPlayed uint32 `eq2:"last_played"`
	Unknown3 uint32 `eq2:"unknown3"`  // TODO: Identify purpose
	Unknown4 uint32 `eq2:"unknown4"`  // TODO: Identify purpose
	Zonename2 string `eq2:"zonename2,type:str16"`
	Zonedesc string `eq2:"zonedesc,type:str16"`
	Version uint8 `eq2:"version"`
	RaceType uint16 `eq2:"race_type"`
	SkinColor [3]int8 `eq2:"skin_color,size:3"`
	EyeColor [3]int8 `eq2:"eye_color,size:3"`
	Equip [21]types.EquipmentItem `eq2:"equip,size:21"`
	HairType uint16 `eq2:"hair_type"`
	HairTypeColor [3]int8 `eq2:"hair_type_color,size:3"`
	HairTypeHighlightColor [3]int8 `eq2:"hair_type_highlight_color,size:3"`
	HairFaceType uint16 `eq2:"hair_face_type"`
	HairFaceColor [3]int8 `eq2:"hair_face_color,size:3"`
	HairFaceHighlightColor [3]int8 `eq2:"hair_face_highlight_color,size:3"`
	ChestType uint16 `eq2:"chest_type"`
	ShirtColor [3]int8 `eq2:"shirt_color,size:3"`
	UnknownChestColor [3]int8 `eq2:"unknown_chest_color,size:3"`  // TODO: Identify purpose
	LegsType uint16 `eq2:"legs_type"`
	PantsColor [3]int8 `eq2:"pants_color,size:3"`
	UnknownLegsColor [3]int8 `eq2:"unknown_legs_color,size:3"`  // TODO: Identify purpose
	Unknown9 [3]int8 `eq2:"unknown9,size:3"`  // TODO: Identify purpose
	EyeType [3]int8 `eq2:"eye_type,size:3"`
	EarType [3]int8 `eq2:"ear_type,size:3"`
	EyeBrowType [3]int8 `eq2:"eye_brow_type,size:3"`
	CheekType [3]int8 `eq2:"cheek_type,size:3"`
	LipType [3]int8 `eq2:"lip_type,size:3"`
	ChinType [3]int8 `eq2:"chin_type,size:3"`
	NoseType [3]int8 `eq2:"nose_type,size:3"`
	BodySize int8 `eq2:"body_size"`
	BumpScale int8 `eq2:"bump_scale"`
	Mount uint16 `eq2:"mount"`
	MountColor1 [3]int8 `eq2:"mount_color1,size:3"`
	MountColor2 [3]int8 `eq2:"mount_color2,size:3"`
	HairColor1 [3]int8 `eq2:"hair_color1,size:3"`
	HairColor2 [3]int8 `eq2:"hair_color2,size:3"`
	HairColor3 [3]int8 `eq2:"hair_color3,size:3"`
	Flags uint8 `eq2:"flags"`
}

// Serialize writes the packet data to the provided buffer
func (p *CharSelectProfile) Serialize(dest []byte) uint32 {
	offset := uint32(0)
	binary.LittleEndian.PutUint32(dest[offset:], uint32(p.Charid))
	offset += 4
	binary.LittleEndian.PutUint32(dest[offset:], uint32(p.ServerId))
	offset += 4
	binary.LittleEndian.PutUint16(dest[offset:], uint16(len(p.Name)))
	offset += 2
	copy(dest[offset:], []byte(p.Name))
	offset += uint32(len(p.Name))
	dest[offset] = byte(p.Race)
	offset++
	dest[offset] = byte(p.Class)
	offset++
	binary.LittleEndian.PutUint32(dest[offset:], uint32(p.Level))
	offset += 4
	binary.LittleEndian.PutUint16(dest[offset:], uint16(len(p.Zone)))
	offset += 2
	copy(dest[offset:], []byte(p.Zone))
	offset += uint32(len(p.Zone))
	binary.LittleEndian.PutUint32(dest[offset:], uint32(p.Unknown1))
	offset += 4
	binary.LittleEndian.PutUint32(dest[offset:], uint32(p.Unknown2))
	offset += 4
	binary.LittleEndian.PutUint32(dest[offset:], uint32(p.CreatedDate))
	offset += 4
	binary.LittleEndian.PutUint32(dest[offset:], uint32(p.LastPlayed))
	offset += 4
	binary.LittleEndian.PutUint32(dest[offset:], uint32(p.Unknown3))
	offset += 4
	binary.LittleEndian.PutUint32(dest[offset:], uint32(p.Unknown4))
	offset += 4
	binary.LittleEndian.PutUint16(dest[offset:], uint16(len(p.Zonename2)))
	offset += 2
	copy(dest[offset:], []byte(p.Zonename2))
	offset += uint32(len(p.Zonename2))
	binary.LittleEndian.PutUint16(dest[offset:], uint16(len(p.Zonedesc)))
	offset += 2
	copy(dest[offset:], []byte(p.Zonedesc))
	offset += uint32(len(p.Zonedesc))
	dest[offset] = byte(p.Version)
	offset++
	binary.LittleEndian.PutUint16(dest[offset:], uint16(p.RaceType))
	offset += 2
	for i := 0; i < 3; i++ {
		dest[offset] = byte(p.SkinColor[i])
		offset++
	}
	for i := 0; i < 3; i++ {
		dest[offset] = byte(p.EyeColor[i])
		offset++
	}
	for i := 0; i < 21; i++ {
		binary.LittleEndian.PutUint16(dest[offset:], p.Equip[i].Type)
		offset += 2
		dest[offset] = p.Equip[i].Color.R
		dest[offset+1] = p.Equip[i].Color.G
		dest[offset+2] = p.Equip[i].Color.B
		offset += 3
		dest[offset] = p.Equip[i].Highlight.R
		dest[offset+1] = p.Equip[i].Highlight.G
		dest[offset+2] = p.Equip[i].Highlight.B
		offset += 3
	}
	binary.LittleEndian.PutUint16(dest[offset:], uint16(p.HairType))
	offset += 2
	for i := 0; i < 3; i++ {
		dest[offset] = byte(p.HairTypeColor[i])
		offset++
	}
	for i := 0; i < 3; i++ {
		dest[offset] = byte(p.HairTypeHighlightColor[i])
		offset++
	}
	binary.LittleEndian.PutUint16(dest[offset:], uint16(p.HairFaceType))
	offset += 2
	for i := 0; i < 3; i++ {
		dest[offset] = byte(p.HairFaceColor[i])
		offset++
	}
	for i := 0; i < 3; i++ {
		dest[offset] = byte(p.HairFaceHighlightColor[i])
		offset++
	}
	binary.LittleEndian.PutUint16(dest[offset:], uint16(p.ChestType))
	offset += 2
	for i := 0; i < 3; i++ {
		dest[offset] = byte(p.ShirtColor[i])
		offset++
	}
	for i := 0; i < 3; i++ {
		dest[offset] = byte(p.UnknownChestColor[i])
		offset++
	}
	binary.LittleEndian.PutUint16(dest[offset:], uint16(p.LegsType))
	offset += 2
	for i := 0; i < 3; i++ {
		dest[offset] = byte(p.PantsColor[i])
		offset++
	}
	for i := 0; i < 3; i++ {
		dest[offset] = byte(p.UnknownLegsColor[i])
		offset++
	}
	for i := 0; i < 3; i++ {
		dest[offset] = byte(p.Unknown9[i])
		offset++
	}
	for i := 0; i < 3; i++ {
		dest[offset] = byte(p.EyeType[i])
		offset++
	}
	for i := 0; i < 3; i++ {
		dest[offset] = byte(p.EarType[i])
		offset++
	}
	for i := 0; i < 3; i++ {
		dest[offset] = byte(p.EyeBrowType[i])
		offset++
	}
	for i := 0; i < 3; i++ {
		dest[offset] = byte(p.CheekType[i])
		offset++
	}
	for i := 0; i < 3; i++ {
		dest[offset] = byte(p.LipType[i])
		offset++
	}
	for i := 0; i < 3; i++ {
		dest[offset] = byte(p.ChinType[i])
		offset++
	}
	for i := 0; i < 3; i++ {
		dest[offset] = byte(p.NoseType[i])
		offset++
	}
	dest[offset] = byte(p.BodySize)
	offset++
	dest[offset] = byte(p.BumpScale)
	offset++
	binary.LittleEndian.PutUint16(dest[offset:], uint16(p.Mount))
	offset += 2
	for i := 0; i < 3; i++ {
		dest[offset] = byte(p.MountColor1[i])
		offset++
	}
	for i := 0; i < 3; i++ {
		dest[offset] = byte(p.MountColor2[i])
		offset++
	}
	for i := 0; i < 3; i++ {
		dest[offset] = byte(p.HairColor1[i])
		offset++
	}
	for i := 0; i < 3; i++ {
		dest[offset] = byte(p.HairColor2[i])
		offset++
	}
	for i := 0; i < 3; i++ {
		dest[offset] = byte(p.HairColor3[i])
		offset++
	}
	dest[offset] = byte(p.Flags)
	offset++
	return offset
}

// Size returns the serialized size of the packet
func (p *CharSelectProfile) Size() uint32 {
	size := uint32(0)
	size += 4
	size += 4
	size += 2 + uint32(len(p.Name))
	size += 1
	size += 1
	size += 4
	size += 2 + uint32(len(p.Zone))
	size += 4
	size += 4
	size += 4
	size += 4
	size += 4
	size += 4
	size += 2 + uint32(len(p.Zonename2))
	size += 2 + uint32(len(p.Zonedesc))
	size += 1
	size += 2
	size += uint32(3)
	size += uint32(3)
	size += uint32(21) * 8
	size += 2
	size += uint32(3)
	size += uint32(3)
	size += 2
	size += uint32(3)
	size += uint32(3)
	size += 2
	size += uint32(3)
	size += uint32(3)
	size += 2
	size += uint32(3)
	size += uint32(3)
	size += uint32(3)
	size += uint32(3)
	size += uint32(3)
	size += uint32(3)
	size += uint32(3)
	size += uint32(3)
	size += uint32(3)
	size += uint32(3)
	size += 1
	size += 1
	size += 2
	size += uint32(3)
	size += uint32(3)
	size += uint32(3)
	size += uint32(3)
	size += uint32(3)
	size += 1
	return size
}

// CharSelectProfileV373 represents packet structure for client version 373
type CharSelectProfileV373 struct {
	Charid uint32 `eq2:"charid"`
	ServerId uint32 `eq2:"server_id"`
	Name string `eq2:"name,type:str16"`
	Race uint8 `eq2:"race"`
	Class uint8 `eq2:"class"`
	Level uint32 `eq2:"level"`
	Zone string `eq2:"zone,type:str16"`
	Unknown1 uint32 `eq2:"unknown1"`  // TODO: Identify purpose
	Unknown2 uint32 `eq2:"unknown2"`  // TODO: Identify purpose
	CreatedDate uint32 `eq2:"created_date"`
	LastPlayed uint32 `eq2:"last_played"`
	Unknown3 uint32 `eq2:"unknown3"`  // TODO: Identify purpose
	Unknown4 uint32 `eq2:"unknown4"`  // TODO: Identify purpose
	Zonename2 string `eq2:"zonename2,type:str16"`
	Zonedesc string `eq2:"zonedesc,type:str16"`
	Version uint8 `eq2:"version"`
	RaceType uint16 `eq2:"race_type"`
	SkinColor [3]int8 `eq2:"skin_color,size:3"`
	EyeColor [3]int8 `eq2:"eye_color,size:3"`
	Equip [21]types.EquipmentItem `eq2:"equip,size:21"`
	HairType uint16 `eq2:"hair_type"`
	HairTypeColor [3]int8 `eq2:"hair_type_color,size:3"`
	HairTypeHighlightColor [3]int8 `eq2:"hair_type_highlight_color,size:3"`
	HairFaceType uint16 `eq2:"hair_face_type"`
	HairFaceColor [3]int8 `eq2:"hair_face_color,size:3"`
	HairFaceHighlightColor [3]int8 `eq2:"hair_face_highlight_color,size:3"`
	ChestType uint16 `eq2:"chest_type"`
	ShirtColor [3]int8 `eq2:"shirt_color,size:3"`
	UnknownChestColor [3]int8 `eq2:"unknown_chest_color,size:3"`  // TODO: Identify purpose
	LegsType uint16 `eq2:"legs_type"`
	PantsColor [3]int8 `eq2:"pants_color,size:3"`
	UnknownLegsColor [3]int8 `eq2:"unknown_legs_color,size:3"`  // TODO: Identify purpose
	Unknown9 [3]int8 `eq2:"unknown9,size:3"`  // TODO: Identify purpose
	EyeType [3]int8 `eq2:"eye_type,size:3"`
	EarType [3]int8 `eq2:"ear_type,size:3"`
	EyeBrowType [3]int8 `eq2:"eye_brow_type,size:3"`
	CheekType [3]int8 `eq2:"cheek_type,size:3"`
	LipType [3]int8 `eq2:"lip_type,size:3"`
	ChinType [3]int8 `eq2:"chin_type,size:3"`
	NoseType [3]int8 `eq2:"nose_type,size:3"`
	BodySize int8 `eq2:"body_size"`
	BumpScale int8 `eq2:"bump_scale"`
	Mount uint16 `eq2:"mount"`
	MountColor1 [3]int8 `eq2:"mount_color1,size:3"`
	MountColor2 [3]int8 `eq2:"mount_color2,size:3"`
	HairColor1 [3]int8 `eq2:"hair_color1,size:3"`
	HairColor2 [3]int8 `eq2:"hair_color2,size:3"`
	HairColor3 [3]int8 `eq2:"hair_color3,size:3"`
	Flags uint8 `eq2:"flags"`
}

// Serialize writes the packet data to the provided buffer
func (p *CharSelectProfileV373) Serialize(dest []byte) uint32 {
	offset := uint32(0)
	binary.LittleEndian.PutUint32(dest[offset:], uint32(p.Charid))
	offset += 4
	binary.LittleEndian.PutUint32(dest[offset:], uint32(p.ServerId))
	offset += 4
	binary.LittleEndian.PutUint16(dest[offset:], uint16(len(p.Name)))
	offset += 2
	copy(dest[offset:], []byte(p.Name))
	offset += uint32(len(p.Name))
	dest[offset] = byte(p.Race)
	offset++
	dest[offset] = byte(p.Class)
	offset++
	binary.LittleEndian.PutUint32(dest[offset:], uint32(p.Level))
	offset += 4
	binary.LittleEndian.PutUint16(dest[offset:], uint16(len(p.Zone)))
	offset += 2
	copy(dest[offset:], []byte(p.Zone))
	offset += uint32(len(p.Zone))
	binary.LittleEndian.PutUint32(dest[offset:], uint32(p.Unknown1))
	offset += 4
	binary.LittleEndian.PutUint32(dest[offset:], uint32(p.Unknown2))
	offset += 4
	binary.LittleEndian.PutUint32(dest[offset:], uint32(p.CreatedDate))
	offset += 4
	binary.LittleEndian.PutUint32(dest[offset:], uint32(p.LastPlayed))
	offset += 4
	binary.LittleEndian.PutUint32(dest[offset:], uint32(p.Unknown3))
	offset += 4
	binary.LittleEndian.PutUint32(dest[offset:], uint32(p.Unknown4))
	offset += 4
	binary.LittleEndian.PutUint16(dest[offset:], uint16(len(p.Zonename2)))
	offset += 2
	copy(dest[offset:], []byte(p.Zonename2))
	offset += uint32(len(p.Zonename2))
	binary.LittleEndian.PutUint16(dest[offset:], uint16(len(p.Zonedesc)))
	offset += 2
	copy(dest[offset:], []byte(p.Zonedesc))
	offset += uint32(len(p.Zonedesc))
	dest[offset] = byte(p.Version)
	offset++
	binary.LittleEndian.PutUint16(dest[offset:], uint16(p.RaceType))
	offset += 2
	for i := 0; i < 3; i++ {
		dest[offset] = byte(p.SkinColor[i])
		offset++
	}
	for i := 0; i < 3; i++ {
		dest[offset] = byte(p.EyeColor[i])
		offset++
	}
	for i := 0; i < 21; i++ {
		binary.LittleEndian.PutUint16(dest[offset:], p.Equip[i].Type)
		offset += 2
		dest[offset] = p.Equip[i].Color.R
		dest[offset+1] = p.Equip[i].Color.G
		dest[offset+2] = p.Equip[i].Color.B
		offset += 3
		dest[offset] = p.Equip[i].Highlight.R
		dest[offset+1] = p.Equip[i].Highlight.G
		dest[offset+2] = p.Equip[i].Highlight.B
		offset += 3
	}
	binary.LittleEndian.PutUint16(dest[offset:], uint16(p.HairType))
	offset += 2
	for i := 0; i < 3; i++ {
		dest[offset] = byte(p.HairTypeColor[i])
		offset++
	}
	for i := 0; i < 3; i++ {
		dest[offset] = byte(p.HairTypeHighlightColor[i])
		offset++
	}
	binary.LittleEndian.PutUint16(dest[offset:], uint16(p.HairFaceType))
	offset += 2
	for i := 0; i < 3; i++ {
		dest[offset] = byte(p.HairFaceColor[i])
		offset++
	}
	for i := 0; i < 3; i++ {
		dest[offset] = byte(p.HairFaceHighlightColor[i])
		offset++
	}
	binary.LittleEndian.PutUint16(dest[offset:], uint16(p.ChestType))
	offset += 2
	for i := 0; i < 3; i++ {
		dest[offset] = byte(p.ShirtColor[i])
		offset++
	}
	for i := 0; i < 3; i++ {
		dest[offset] = byte(p.UnknownChestColor[i])
		offset++
	}
	binary.LittleEndian.PutUint16(dest[offset:], uint16(p.LegsType))
	offset += 2
	for i := 0; i < 3; i++ {
		dest[offset] = byte(p.PantsColor[i])
		offset++
	}
	for i := 0; i < 3; i++ {
		dest[offset] = byte(p.UnknownLegsColor[i])
		offset++
	}
	for i := 0; i < 3; i++ {
		dest[offset] = byte(p.Unknown9[i])
		offset++
	}
	for i := 0; i < 3; i++ {
		dest[offset] = byte(p.EyeType[i])
		offset++
	}
	for i := 0; i < 3; i++ {
		dest[offset] = byte(p.EarType[i])
		offset++
	}
	for i := 0; i < 3; i++ {
		dest[offset] = byte(p.EyeBrowType[i])
		offset++
	}
	for i := 0; i < 3; i++ {
		dest[offset] = byte(p.CheekType[i])
		offset++
	}
	for i := 0; i < 3; i++ {
		dest[offset] = byte(p.LipType[i])
		offset++
	}
	for i := 0; i < 3; i++ {
		dest[offset] = byte(p.ChinType[i])
		offset++
	}
	for i := 0; i < 3; i++ {
		dest[offset] = byte(p.NoseType[i])
		offset++
	}
	dest[offset] = byte(p.BodySize)
	offset++
	dest[offset] = byte(p.BumpScale)
	offset++
	binary.LittleEndian.PutUint16(dest[offset:], uint16(p.Mount))
	offset += 2
	for i := 0; i < 3; i++ {
		dest[offset] = byte(p.MountColor1[i])
		offset++
	}
	for i := 0; i < 3; i++ {
		dest[offset] = byte(p.MountColor2[i])
		offset++
	}
	for i := 0; i < 3; i++ {
		dest[offset] = byte(p.HairColor1[i])
		offset++
	}
	for i := 0; i < 3; i++ {
		dest[offset] = byte(p.HairColor2[i])
		offset++
	}
	for i := 0; i < 3; i++ {
		dest[offset] = byte(p.HairColor3[i])
		offset++
	}
	dest[offset] = byte(p.Flags)
	offset++
	return offset
}

// Size returns the serialized size of the packet
func (p *CharSelectProfileV373) Size() uint32 {
	size := uint32(0)
	size += 4
	size += 4
	size += 2 + uint32(len(p.Name))
	size += 1
	size += 1
	size += 4
	size += 2 + uint32(len(p.Zone))
	size += 4
	size += 4
	size += 4
	size += 4
	size += 4
	size += 4
	size += 2 + uint32(len(p.Zonename2))
	size += 2 + uint32(len(p.Zonedesc))
	size += 1
	size += 2
	size += uint32(3)
	size += uint32(3)
	size += uint32(21) * 8
	size += 2
	size += uint32(3)
	size += uint32(3)
	size += 2
	size += uint32(3)
	size += uint32(3)
	size += 2
	size += uint32(3)
	size += uint32(3)
	size += 2
	size += uint32(3)
	size += uint32(3)
	size += uint32(3)
	size += uint32(3)
	size += uint32(3)
	size += uint32(3)
	size += uint32(3)
	size += uint32(3)
	size += uint32(3)
	size += uint32(3)
	size += 1
	size += 1
	size += 2
	size += uint32(3)
	size += uint32(3)
	size += uint32(3)
	size += uint32(3)
	size += uint32(3)
	size += 1
	return size
}

// CharSelectProfileV546 represents packet structure for client version 546
type CharSelectProfileV546 struct {
	Charid uint32 `eq2:"charid"`
	ServerId uint32 `eq2:"server_id"`
	Name string `eq2:"name,type:str16"`
	Race uint8 `eq2:"race"`
	Class uint8 `eq2:"class"`
	Gender uint8 `eq2:"gender"`
	Level uint32 `eq2:"level"`
	Zone string `eq2:"zone,type:str16"`
	Unknown1 uint32 `eq2:"unknown1"`  // TODO: Identify purpose
	Unknown2 uint32 `eq2:"unknown2"`  // TODO: Identify purpose
	CreatedDate uint32 `eq2:"created_date"`
	LastPlayed uint32 `eq2:"last_played"`
	Unknown3 uint32 `eq2:"unknown3"`  // TODO: Identify purpose
	Unknown4 uint32 `eq2:"unknown4"`  // TODO: Identify purpose
	Zonename2 string `eq2:"zonename2,type:str16"`
	Zonedesc string `eq2:"zonedesc,type:str16"`
	Unknown5 uint32 `eq2:"unknown5"`  // TODO: Identify purpose
	Version uint8 `eq2:"version"`
	RaceType uint16 `eq2:"race_type"`
	SkinColor [3]int8 `eq2:"skin_color,size:3"`
	EyeColor [3]int8 `eq2:"eye_color,size:3"`
	Equip [23]types.EquipmentItem `eq2:"equip,size:23"`
	HairType uint16 `eq2:"hair_type"`
	HairTypeColor [3]int8 `eq2:"hair_type_color,size:3"`
	HairTypeHighlightColor [3]int8 `eq2:"hair_type_highlight_color,size:3"`
	HairFaceType uint16 `eq2:"hair_face_type"`
	HairFaceColor [3]int8 `eq2:"hair_face_color,size:3"`
	HairFaceHighlightColor [3]int8 `eq2:"hair_face_highlight_color,size:3"`
	ChestType uint16 `eq2:"chest_type"`
	ShirtColor [3]int8 `eq2:"shirt_color,size:3"`
	UnknownChestColor [3]int8 `eq2:"unknown_chest_color,size:3"`  // TODO: Identify purpose
	LegsType uint16 `eq2:"legs_type"`
	PantsColor [3]int8 `eq2:"pants_color,size:3"`
	UnknownLegsColor [3]int8 `eq2:"unknown_legs_color,size:3"`  // TODO: Identify purpose
	Unknown9 [3]int8 `eq2:"unknown9,size:3"`  // TODO: Identify purpose
	EyeType [3]int8 `eq2:"eye_type,size:3"`
	EarType [3]int8 `eq2:"ear_type,size:3"`
	EyeBrowType [3]int8 `eq2:"eye_brow_type,size:3"`
	CheekType [3]int8 `eq2:"cheek_type,size:3"`
	LipType [3]int8 `eq2:"lip_type,size:3"`
	ChinType [3]int8 `eq2:"chin_type,size:3"`
	NoseType [3]int8 `eq2:"nose_type,size:3"`
	BodySize int8 `eq2:"body_size"`
	BumpScale int8 `eq2:"bump_scale"`
	Mount uint16 `eq2:"mount"`
	MountColor1 [3]int8 `eq2:"mount_color1,size:3"`
	MountColor2 [3]int8 `eq2:"mount_color2,size:3"`
	HairColor1 [3]int8 `eq2:"hair_color1,size:3"`
	HairColor2 [3]int8 `eq2:"hair_color2,size:3"`
	HairColor3 [3]int8 `eq2:"hair_color3,size:3"`
	Unknown11 [10]uint8 `eq2:"unknown11,size:10"`  // TODO: Identify purpose
	SogaRaceType uint16 `eq2:"soga_race_type"`
	SogaSkinColorx types.Color `eq2:"soga_skin_colorx"`
	SogaEyeColor types.Color `eq2:"soga_eye_color"`
	Unknown12 [3]uint8 `eq2:"Unknown12,size:3"`  // TODO: Identify purpose
	SogaEyeType [3]int8 `eq2:"soga_eye_type,size:3"`
	SogaEarType [3]int8 `eq2:"soga_ear_type,size:3"`
	SogaEyeBrowType [3]int8 `eq2:"soga_eye_brow_type,size:3"`
	SogaCheekType [3]int8 `eq2:"soga_cheek_type,size:3"`
	SogaLipType [3]int8 `eq2:"soga_lip_type,size:3"`
	SogaChinType [3]int8 `eq2:"soga_chin_type,size:3"`
	SogaNoseType [3]int8 `eq2:"soga_nose_type,size:3"`
	SogaHairColor1 types.Color `eq2:"soga_hair_color1"`
	SogaChestType uint16 `eq2:"soga_chest_type"`
	SogaHairColor2 types.Color `eq2:"soga_hair_color2"`
	SogaHairColor3 types.Color `eq2:"soga_hair_color3"`
	SogaHairType uint16 `eq2:"soga_hair_type"`
	SogaHairTypeColor types.Color `eq2:"soga_hair_type_color"`
	SogaHairTypeHighlightColor types.Color `eq2:"soga_hair_type_highlight_color"`
	SogaHairFaceType uint16 `eq2:"soga_hair_face_type"`
	SogaHairFaceColor types.Color `eq2:"soga_hair_face_color"`
	SogaHairFaceHighlightColor types.Color `eq2:"soga_hair_face_highlight_color"`
}

// Serialize writes the packet data to the provided buffer
func (p *CharSelectProfileV546) Serialize(dest []byte) uint32 {
	offset := uint32(0)
	binary.LittleEndian.PutUint32(dest[offset:], uint32(p.Charid))
	offset += 4
	binary.LittleEndian.PutUint32(dest[offset:], uint32(p.ServerId))
	offset += 4
	binary.LittleEndian.PutUint16(dest[offset:], uint16(len(p.Name)))
	offset += 2
	copy(dest[offset:], []byte(p.Name))
	offset += uint32(len(p.Name))
	dest[offset] = byte(p.Race)
	offset++
	dest[offset] = byte(p.Class)
	offset++
	dest[offset] = byte(p.Gender)
	offset++
	binary.LittleEndian.PutUint32(dest[offset:], uint32(p.Level))
	offset += 4
	binary.LittleEndian.PutUint16(dest[offset:], uint16(len(p.Zone)))
	offset += 2
	copy(dest[offset:], []byte(p.Zone))
	offset += uint32(len(p.Zone))
	binary.LittleEndian.PutUint32(dest[offset:], uint32(p.Unknown1))
	offset += 4
	binary.LittleEndian.PutUint32(dest[offset:], uint32(p.Unknown2))
	offset += 4
	binary.LittleEndian.PutUint32(dest[offset:], uint32(p.CreatedDate))
	offset += 4
	binary.LittleEndian.PutUint32(dest[offset:], uint32(p.LastPlayed))
	offset += 4
	binary.LittleEndian.PutUint32(dest[offset:], uint32(p.Unknown3))
	offset += 4
	binary.LittleEndian.PutUint32(dest[offset:], uint32(p.Unknown4))
	offset += 4
	binary.LittleEndian.PutUint16(dest[offset:], uint16(len(p.Zonename2)))
	offset += 2
	copy(dest[offset:], []byte(p.Zonename2))
	offset += uint32(len(p.Zonename2))
	binary.LittleEndian.PutUint16(dest[offset:], uint16(len(p.Zonedesc)))
	offset += 2
	copy(dest[offset:], []byte(p.Zonedesc))
	offset += uint32(len(p.Zonedesc))
	binary.LittleEndian.PutUint32(dest[offset:], uint32(p.Unknown5))
	offset += 4
	dest[offset] = byte(p.Version)
	offset++
	binary.LittleEndian.PutUint16(dest[offset:], uint16(p.RaceType))
	offset += 2
	for i := 0; i < 3; i++ {
		dest[offset] = byte(p.SkinColor[i])
		offset++
	}
	for i := 0; i < 3; i++ {
		dest[offset] = byte(p.EyeColor[i])
		offset++
	}
	for i := 0; i < 23; i++ {
		binary.LittleEndian.PutUint16(dest[offset:], p.Equip[i].Type)
		offset += 2
		dest[offset] = p.Equip[i].Color.R
		dest[offset+1] = p.Equip[i].Color.G
		dest[offset+2] = p.Equip[i].Color.B
		offset += 3
		dest[offset] = p.Equip[i].Highlight.R
		dest[offset+1] = p.Equip[i].Highlight.G
		dest[offset+2] = p.Equip[i].Highlight.B
		offset += 3
	}
	binary.LittleEndian.PutUint16(dest[offset:], uint16(p.HairType))
	offset += 2
	for i := 0; i < 3; i++ {
		dest[offset] = byte(p.HairTypeColor[i])
		offset++
	}
	for i := 0; i < 3; i++ {
		dest[offset] = byte(p.HairTypeHighlightColor[i])
		offset++
	}
	binary.LittleEndian.PutUint16(dest[offset:], uint16(p.HairFaceType))
	offset += 2
	for i := 0; i < 3; i++ {
		dest[offset] = byte(p.HairFaceColor[i])
		offset++
	}
	for i := 0; i < 3; i++ {
		dest[offset] = byte(p.HairFaceHighlightColor[i])
		offset++
	}
	binary.LittleEndian.PutUint16(dest[offset:], uint16(p.ChestType))
	offset += 2
	for i := 0; i < 3; i++ {
		dest[offset] = byte(p.ShirtColor[i])
		offset++
	}
	for i := 0; i < 3; i++ {
		dest[offset] = byte(p.UnknownChestColor[i])
		offset++
	}
	binary.LittleEndian.PutUint16(dest[offset:], uint16(p.LegsType))
	offset += 2
	for i := 0; i < 3; i++ {
		dest[offset] = byte(p.PantsColor[i])
		offset++
	}
	for i := 0; i < 3; i++ {
		dest[offset] = byte(p.UnknownLegsColor[i])
		offset++
	}
	for i := 0; i < 3; i++ {
		dest[offset] = byte(p.Unknown9[i])
		offset++
	}
	for i := 0; i < 3; i++ {
		dest[offset] = byte(p.EyeType[i])
		offset++
	}
	for i := 0; i < 3; i++ {
		dest[offset] = byte(p.EarType[i])
		offset++
	}
	for i := 0; i < 3; i++ {
		dest[offset] = byte(p.EyeBrowType[i])
		offset++
	}
	for i := 0; i < 3; i++ {
		dest[offset] = byte(p.CheekType[i])
		offset++
	}
	for i := 0; i < 3; i++ {
		dest[offset] = byte(p.LipType[i])
		offset++
	}
	for i := 0; i < 3; i++ {
		dest[offset] = byte(p.ChinType[i])
		offset++
	}
	for i := 0; i < 3; i++ {
		dest[offset] = byte(p.NoseType[i])
		offset++
	}
	dest[offset] = byte(p.BodySize)
	offset++
	dest[offset] = byte(p.BumpScale)
	offset++
	binary.LittleEndian.PutUint16(dest[offset:], uint16(p.Mount))
	offset += 2
	for i := 0; i < 3; i++ {
		dest[offset] = byte(p.MountColor1[i])
		offset++
	}
	for i := 0; i < 3; i++ {
		dest[offset] = byte(p.MountColor2[i])
		offset++
	}
	for i := 0; i < 3; i++ {
		dest[offset] = byte(p.HairColor1[i])
		offset++
	}
	for i := 0; i < 3; i++ {
		dest[offset] = byte(p.HairColor2[i])
		offset++
	}
	for i := 0; i < 3; i++ {
		dest[offset] = byte(p.HairColor3[i])
		offset++
	}
	for i := 0; i < 10; i++ {
		dest[offset] = p.Unknown11[i]
		offset++
	}
	binary.LittleEndian.PutUint16(dest[offset:], uint16(p.SogaRaceType))
	offset += 2
	dest[offset] = p.SogaSkinColorx.R
	dest[offset+1] = p.SogaSkinColorx.G
	dest[offset+2] = p.SogaSkinColorx.B
	offset += 3
	dest[offset] = p.SogaEyeColor.R
	dest[offset+1] = p.SogaEyeColor.G
	dest[offset+2] = p.SogaEyeColor.B
	offset += 3
	for i := 0; i < 3; i++ {
		dest[offset] = p.Unknown12[i]
		offset++
	}
	for i := 0; i < 3; i++ {
		dest[offset] = byte(p.SogaEyeType[i])
		offset++
	}
	for i := 0; i < 3; i++ {
		dest[offset] = byte(p.SogaEarType[i])
		offset++
	}
	for i := 0; i < 3; i++ {
		dest[offset] = byte(p.SogaEyeBrowType[i])
		offset++
	}
	for i := 0; i < 3; i++ {
		dest[offset] = byte(p.SogaCheekType[i])
		offset++
	}
	for i := 0; i < 3; i++ {
		dest[offset] = byte(p.SogaLipType[i])
		offset++
	}
	for i := 0; i < 3; i++ {
		dest[offset] = byte(p.SogaChinType[i])
		offset++
	}
	for i := 0; i < 3; i++ {
		dest[offset] = byte(p.SogaNoseType[i])
		offset++
	}
	dest[offset] = p.SogaHairColor1.R
	dest[offset+1] = p.SogaHairColor1.G
	dest[offset+2] = p.SogaHairColor1.B
	offset += 3
	binary.LittleEndian.PutUint16(dest[offset:], uint16(p.SogaChestType))
	offset += 2
	dest[offset] = p.SogaHairColor2.R
	dest[offset+1] = p.SogaHairColor2.G
	dest[offset+2] = p.SogaHairColor2.B
	offset += 3
	dest[offset] = p.SogaHairColor3.R
	dest[offset+1] = p.SogaHairColor3.G
	dest[offset+2] = p.SogaHairColor3.B
	offset += 3
	binary.LittleEndian.PutUint16(dest[offset:], uint16(p.SogaHairType))
	offset += 2
	dest[offset] = p.SogaHairTypeColor.R
	dest[offset+1] = p.SogaHairTypeColor.G
	dest[offset+2] = p.SogaHairTypeColor.B
	offset += 3
	dest[offset] = p.SogaHairTypeHighlightColor.R
	dest[offset+1] = p.SogaHairTypeHighlightColor.G
	dest[offset+2] = p.SogaHairTypeHighlightColor.B
	offset += 3
	binary.LittleEndian.PutUint16(dest[offset:], uint16(p.SogaHairFaceType))
	offset += 2
	dest[offset] = p.SogaHairFaceColor.R
	dest[offset+1] = p.SogaHairFaceColor.G
	dest[offset+2] = p.SogaHairFaceColor.B
	offset += 3
	dest[offset] = p.SogaHairFaceHighlightColor.R
	dest[offset+1] = p.SogaHairFaceHighlightColor.G
	dest[offset+2] = p.SogaHairFaceHighlightColor.B
	offset += 3
	return offset
}

// Size returns the serialized size of the packet
func (p *CharSelectProfileV546) Size() uint32 {
	size := uint32(0)
	size += 4
	size += 4
	size += 2 + uint32(len(p.Name))
	size += 1
	size += 1
	size += 1
	size += 4
	size += 2 + uint32(len(p.Zone))
	size += 4
	size += 4
	size += 4
	size += 4
	size += 4
	size += 4
	size += 2 + uint32(len(p.Zonename2))
	size += 2 + uint32(len(p.Zonedesc))
	size += 4
	size += 1
	size += 2
	size += uint32(3)
	size += uint32(3)
	size += uint32(23) * 8
	size += 2
	size += uint32(3)
	size += uint32(3)
	size += 2
	size += uint32(3)
	size += uint32(3)
	size += 2
	size += uint32(3)
	size += uint32(3)
	size += 2
	size += uint32(3)
	size += uint32(3)
	size += uint32(3)
	size += uint32(3)
	size += uint32(3)
	size += uint32(3)
	size += uint32(3)
	size += uint32(3)
	size += uint32(3)
	size += uint32(3)
	size += 1
	size += 1
	size += 2
	size += uint32(3)
	size += uint32(3)
	size += uint32(3)
	size += uint32(3)
	size += uint32(3)
	size += uint32(10)
	size += 2
	size += 3
	size += 3
	size += uint32(3)
	size += uint32(3)
	size += uint32(3)
	size += uint32(3)
	size += uint32(3)
	size += uint32(3)
	size += uint32(3)
	size += uint32(3)
	size += 3
	size += 2
	size += 3
	size += 3
	size += 2
	size += 3
	size += 3
	size += 2
	size += 3
	size += 3
	return size
}

// CharSelectProfileV562 represents packet structure for client version 562
type CharSelectProfileV562 struct {
	Version uint32 `eq2:"version"`
	Charid uint32 `eq2:"charid"`
	ServerId uint32 `eq2:"server_id"`
	Name string `eq2:"name,type:str16"`
	Unknown uint8 `eq2:"unknown"`  // TODO: Identify purpose
	Race uint8 `eq2:"race"`
	Class uint8 `eq2:"class"`
	Gender uint8 `eq2:"gender"`
	Level uint32 `eq2:"level"`
	Zone string `eq2:"zone,type:str16"`
	Unknown1 uint32 `eq2:"unknown1"`  // TODO: Identify purpose
	Unknown2 uint32 `eq2:"unknown2"`  // TODO: Identify purpose
	CreatedDate uint32 `eq2:"created_date"`
	LastPlayed uint32 `eq2:"last_played"`
	Unknown3 uint32 `eq2:"unknown3"`  // TODO: Identify purpose
	Unknown4 uint32 `eq2:"unknown4"`  // TODO: Identify purpose
	Zonename2 string `eq2:"zonename2,type:str16"`
	Zonedesc string `eq2:"zonedesc,type:str16"`
	Unknown5 uint32 `eq2:"unknown5"`  // TODO: Identify purpose
	ServerName string `eq2:"server_name,type:str16"`
	AccountId uint32 `eq2:"account_id"`
	Unknown6 [2]uint8 `eq2:"unknown6,size:2"`  // TODO: Identify purpose
	Unknown7 uint32 `eq2:"unknown7"`  // TODO: Identify purpose
	Unknown8 uint8 `eq2:"unknown8"`  // TODO: Identify purpose
	RaceType uint16 `eq2:"race_type"`
	SkinColor types.Color `eq2:"skin_color"`
	EyeColor types.Color `eq2:"eye_color"`
	Equip [25]types.EquipmentItem `eq2:"equip,size:25"`
	HairType uint16 `eq2:"hair_type"`
	HairTypeColor types.Color `eq2:"hair_type_color"`
	HairTypeHighlightColor types.Color `eq2:"hair_type_highlight_color"`
	HairFaceType uint16 `eq2:"hair_face_type"`
	HairFaceColor types.Color `eq2:"hair_face_color"`
	HairFaceHighlightColor types.Color `eq2:"hair_face_highlight_color"`
	ChestType uint16 `eq2:"chest_type"`
	ShirtColor types.Color `eq2:"shirt_color"`
	UnknownChestColor types.Color `eq2:"unknown_chest_color"`  // TODO: Identify purpose
	LegsType uint16 `eq2:"legs_type"`
	PantsColor types.Color `eq2:"pants_color"`
	UnknownLegsColor types.Color `eq2:"unknown_legs_color"`  // TODO: Identify purpose
	Unknown9 types.Color `eq2:"unknown9"`  // TODO: Identify purpose
	EyeType [3]int8 `eq2:"eye_type,size:3"`
	EarType [3]int8 `eq2:"ear_type,size:3"`
	EyeBrowType [3]int8 `eq2:"eye_brow_type,size:3"`
	CheekType [3]int8 `eq2:"cheek_type,size:3"`
	LipType [3]int8 `eq2:"lip_type,size:3"`
	ChinType [3]int8 `eq2:"chin_type,size:3"`
	NoseType [3]int8 `eq2:"nose_type,size:3"`
	BodySize int8 `eq2:"body_size"`
	Unknown10 [9]uint8 `eq2:"unknown10,size:9"`  // TODO: Identify purpose
	HairColor1 types.Color `eq2:"hair_color1"`
	HairColor2 types.Color `eq2:"hair_color2"`
	Unknown11 [13]uint8 `eq2:"unknown11,size:13"`  // TODO: Identify purpose
	Unknown15 [7]uint8 `eq2:"unknown15,size:7"`  // TODO: Identify purpose
}

// Serialize writes the packet data to the provided buffer
func (p *CharSelectProfileV562) Serialize(dest []byte) uint32 {
	offset := uint32(0)
	binary.LittleEndian.PutUint32(dest[offset:], uint32(p.Version))
	offset += 4
	binary.LittleEndian.PutUint32(dest[offset:], uint32(p.Charid))
	offset += 4
	binary.LittleEndian.PutUint32(dest[offset:], uint32(p.ServerId))
	offset += 4
	binary.LittleEndian.PutUint16(dest[offset:], uint16(len(p.Name)))
	offset += 2
	copy(dest[offset:], []byte(p.Name))
	offset += uint32(len(p.Name))
	dest[offset] = byte(p.Unknown)
	offset++
	dest[offset] = byte(p.Race)
	offset++
	dest[offset] = byte(p.Class)
	offset++
	dest[offset] = byte(p.Gender)
	offset++
	binary.LittleEndian.PutUint32(dest[offset:], uint32(p.Level))
	offset += 4
	binary.LittleEndian.PutUint16(dest[offset:], uint16(len(p.Zone)))
	offset += 2
	copy(dest[offset:], []byte(p.Zone))
	offset += uint32(len(p.Zone))
	binary.LittleEndian.PutUint32(dest[offset:], uint32(p.Unknown1))
	offset += 4
	binary.LittleEndian.PutUint32(dest[offset:], uint32(p.Unknown2))
	offset += 4
	binary.LittleEndian.PutUint32(dest[offset:], uint32(p.CreatedDate))
	offset += 4
	binary.LittleEndian.PutUint32(dest[offset:], uint32(p.LastPlayed))
	offset += 4
	binary.LittleEndian.PutUint32(dest[offset:], uint32(p.Unknown3))
	offset += 4
	binary.LittleEndian.PutUint32(dest[offset:], uint32(p.Unknown4))
	offset += 4
	binary.LittleEndian.PutUint16(dest[offset:], uint16(len(p.Zonename2)))
	offset += 2
	copy(dest[offset:], []byte(p.Zonename2))
	offset += uint32(len(p.Zonename2))
	binary.LittleEndian.PutUint16(dest[offset:], uint16(len(p.Zonedesc)))
	offset += 2
	copy(dest[offset:], []byte(p.Zonedesc))
	offset += uint32(len(p.Zonedesc))
	binary.LittleEndian.PutUint32(dest[offset:], uint32(p.Unknown5))
	offset += 4
	binary.LittleEndian.PutUint16(dest[offset:], uint16(len(p.ServerName)))
	offset += 2
	copy(dest[offset:], []byte(p.ServerName))
	offset += uint32(len(p.ServerName))
	binary.LittleEndian.PutUint32(dest[offset:], uint32(p.AccountId))
	offset += 4
	for i := 0; i < 2; i++ {
		dest[offset] = p.Unknown6[i]
		offset++
	}
	binary.LittleEndian.PutUint32(dest[offset:], uint32(p.Unknown7))
	offset += 4
	dest[offset] = byte(p.Unknown8)
	offset++
	binary.LittleEndian.PutUint16(dest[offset:], uint16(p.RaceType))
	offset += 2
	dest[offset] = p.SkinColor.R
	dest[offset+1] = p.SkinColor.G
	dest[offset+2] = p.SkinColor.B
	offset += 3
	dest[offset] = p.EyeColor.R
	dest[offset+1] = p.EyeColor.G
	dest[offset+2] = p.EyeColor.B
	offset += 3
	for i := 0; i < 25; i++ {
		binary.LittleEndian.PutUint16(dest[offset:], p.Equip[i].Type)
		offset += 2
		dest[offset] = p.Equip[i].Color.R
		dest[offset+1] = p.Equip[i].Color.G
		dest[offset+2] = p.Equip[i].Color.B
		offset += 3
		dest[offset] = p.Equip[i].Highlight.R
		dest[offset+1] = p.Equip[i].Highlight.G
		dest[offset+2] = p.Equip[i].Highlight.B
		offset += 3
	}
	binary.LittleEndian.PutUint16(dest[offset:], uint16(p.HairType))
	offset += 2
	dest[offset] = p.HairTypeColor.R
	dest[offset+1] = p.HairTypeColor.G
	dest[offset+2] = p.HairTypeColor.B
	offset += 3
	dest[offset] = p.HairTypeHighlightColor.R
	dest[offset+1] = p.HairTypeHighlightColor.G
	dest[offset+2] = p.HairTypeHighlightColor.B
	offset += 3
	binary.LittleEndian.PutUint16(dest[offset:], uint16(p.HairFaceType))
	offset += 2
	dest[offset] = p.HairFaceColor.R
	dest[offset+1] = p.HairFaceColor.G
	dest[offset+2] = p.HairFaceColor.B
	offset += 3
	dest[offset] = p.HairFaceHighlightColor.R
	dest[offset+1] = p.HairFaceHighlightColor.G
	dest[offset+2] = p.HairFaceHighlightColor.B
	offset += 3
	binary.LittleEndian.PutUint16(dest[offset:], uint16(p.ChestType))
	offset += 2
	dest[offset] = p.ShirtColor.R
	dest[offset+1] = p.ShirtColor.G
	dest[offset+2] = p.ShirtColor.B
	offset += 3
	dest[offset] = p.UnknownChestColor.R
	dest[offset+1] = p.UnknownChestColor.G
	dest[offset+2] = p.UnknownChestColor.B
	offset += 3
	binary.LittleEndian.PutUint16(dest[offset:], uint16(p.LegsType))
	offset += 2
	dest[offset] = p.PantsColor.R
	dest[offset+1] = p.PantsColor.G
	dest[offset+2] = p.PantsColor.B
	offset += 3
	dest[offset] = p.UnknownLegsColor.R
	dest[offset+1] = p.UnknownLegsColor.G
	dest[offset+2] = p.UnknownLegsColor.B
	offset += 3
	dest[offset] = p.Unknown9.R
	dest[offset+1] = p.Unknown9.G
	dest[offset+2] = p.Unknown9.B
	offset += 3
	for i := 0; i < 3; i++ {
		dest[offset] = byte(p.EyeType[i])
		offset++
	}
	for i := 0; i < 3; i++ {
		dest[offset] = byte(p.EarType[i])
		offset++
	}
	for i := 0; i < 3; i++ {
		dest[offset] = byte(p.EyeBrowType[i])
		offset++
	}
	for i := 0; i < 3; i++ {
		dest[offset] = byte(p.CheekType[i])
		offset++
	}
	for i := 0; i < 3; i++ {
		dest[offset] = byte(p.LipType[i])
		offset++
	}
	for i := 0; i < 3; i++ {
		dest[offset] = byte(p.ChinType[i])
		offset++
	}
	for i := 0; i < 3; i++ {
		dest[offset] = byte(p.NoseType[i])
		offset++
	}
	dest[offset] = byte(p.BodySize)
	offset++
	for i := 0; i < 9; i++ {
		dest[offset] = p.Unknown10[i]
		offset++
	}
	dest[offset] = p.HairColor1.R
	dest[offset+1] = p.HairColor1.G
	dest[offset+2] = p.HairColor1.B
	offset += 3
	dest[offset] = p.HairColor2.R
	dest[offset+1] = p.HairColor2.G
	dest[offset+2] = p.HairColor2.B
	offset += 3
	for i := 0; i < 13; i++ {
		dest[offset] = p.Unknown11[i]
		offset++
	}
	for i := 0; i < 7; i++ {
		dest[offset] = p.Unknown15[i]
		offset++
	}
	return offset
}

// Size returns the serialized size of the packet
func (p *CharSelectProfileV562) Size() uint32 {
	size := uint32(0)
	size += 4
	size += 4
	size += 4
	size += 2 + uint32(len(p.Name))
	size += 1
	size += 1
	size += 1
	size += 1
	size += 4
	size += 2 + uint32(len(p.Zone))
	size += 4
	size += 4
	size += 4
	size += 4
	size += 4
	size += 4
	size += 2 + uint32(len(p.Zonename2))
	size += 2 + uint32(len(p.Zonedesc))
	size += 4
	size += 2 + uint32(len(p.ServerName))
	size += 4
	size += uint32(2)
	size += 4
	size += 1
	size += 2
	size += 3
	size += 3
	size += uint32(25) * 8
	size += 2
	size += 3
	size += 3
	size += 2
	size += 3
	size += 3
	size += 2
	size += 3
	size += 3
	size += 2
	size += 3
	size += 3
	size += 3
	size += uint32(3)
	size += uint32(3)
	size += uint32(3)
	size += uint32(3)
	size += uint32(3)
	size += uint32(3)
	size += uint32(3)
	size += 1
	size += uint32(9)
	size += 3
	size += 3
	size += uint32(13)
	size += uint32(7)
	return size
}

// CharSelectProfileV887 represents packet structure for client version 887
type CharSelectProfileV887 struct {
	Version uint32 `eq2:"version"`
	Charid uint32 `eq2:"charid"`
	ServerId uint32 `eq2:"server_id"`
	Name string `eq2:"name,type:str16"`
	Unknown uint8 `eq2:"unknown"`  // TODO: Identify purpose
	Race uint8 `eq2:"race"`
	Class uint8 `eq2:"class"`
	Gender uint8 `eq2:"gender"`
	Level uint32 `eq2:"level"`
	Zone string `eq2:"zone,type:str16"`
	Unknown1 uint32 `eq2:"unknown1"`  // TODO: Identify purpose
	Unknown2 uint32 `eq2:"unknown2"`  // TODO: Identify purpose
	CreatedDate uint32 `eq2:"created_date"`
	LastPlayed uint32 `eq2:"last_played"`
	Unknown3 uint32 `eq2:"unknown3"`  // TODO: Identify purpose
	Unknown4 uint32 `eq2:"unknown4"`  // TODO: Identify purpose
	Zonename2 string `eq2:"zonename2,type:str16"`
	Zonedesc string `eq2:"zonedesc,type:str16"`
	Unknown5 uint32 `eq2:"unknown5"`  // TODO: Identify purpose
	ServerName string `eq2:"server_name,type:str16"`
	AccountId uint32 `eq2:"account_id"`
	Unknown6 [2]uint8 `eq2:"unknown6,size:2"`  // TODO: Identify purpose
	Unknown7 uint32 `eq2:"unknown7"`  // TODO: Identify purpose
	TradeskillClass uint8 `eq2:"tradeskill_class"`
	TradeskillLevel uint32 `eq2:"tradeskill_level"`
	Unknown8 uint8 `eq2:"unknown8"`  // TODO: Identify purpose
	RaceType uint16 `eq2:"race_type"`
	SkinColor types.Color `eq2:"skin_color"`
	EyeColor types.Color `eq2:"eye_color"`
	Equip [25]types.EquipmentItem `eq2:"equip,size:25"`
	HairType uint16 `eq2:"hair_type"`
	HairTypeColor types.Color `eq2:"hair_type_color"`
	HairTypeHighlightColor types.Color `eq2:"hair_type_highlight_color"`
	HairFaceType uint16 `eq2:"hair_face_type"`
	HairFaceColor types.Color `eq2:"hair_face_color"`
	HairFaceHighlightColor types.Color `eq2:"hair_face_highlight_color"`
	WingType uint16 `eq2:"wing_type"`
	WingColor1 types.Color `eq2:"wing_color1"`
	WingColor2 types.Color `eq2:"wing_color2"`
	ChestType uint16 `eq2:"chest_type"`
	ShirtColor types.Color `eq2:"shirt_color"`
	UnknownChestColor types.Color `eq2:"unknown_chest_color"`  // TODO: Identify purpose
	LegsType uint16 `eq2:"legs_type"`
	PantsColor types.Color `eq2:"pants_color"`
	UnknownLegsColor types.Color `eq2:"unknown_legs_color"`  // TODO: Identify purpose
	Unknown9 types.Color `eq2:"unknown9"`  // TODO: Identify purpose
	EyeType [3]int8 `eq2:"eye_type,size:3"`
	EarType [3]int8 `eq2:"ear_type,size:3"`
	EyeBrowType [3]int8 `eq2:"eye_brow_type,size:3"`
	CheekType [3]int8 `eq2:"cheek_type,size:3"`
	LipType [3]int8 `eq2:"lip_type,size:3"`
	ChinType [3]int8 `eq2:"chin_type,size:3"`
	NoseType [3]int8 `eq2:"nose_type,size:3"`
	BodySize int8 `eq2:"body_size"`
	Unknown10 [9]uint8 `eq2:"unknown10,size:9"`  // TODO: Identify purpose
	HairColor1 types.Color `eq2:"hair_color1"`
	HairColor2 types.Color `eq2:"hair_color2"`
	Unknown11 [13]uint8 `eq2:"unknown11,size:13"`  // TODO: Identify purpose
	SogaRaceType uint16 `eq2:"soga_race_type"`
	SogaSkinColor types.Color `eq2:"soga_skin_color"`
	SogaEyeColor types.Color `eq2:"soga_eye_color"`
	Unknown12 [3]uint8 `eq2:"Unknown12,size:3"`  // TODO: Identify purpose
	SogaEyeType [3]int8 `eq2:"soga_eye_type,size:3"`
	SogaEarType [3]int8 `eq2:"soga_ear_type,size:3"`
	SogaEyeBrowType [3]int8 `eq2:"soga_eye_brow_type,size:3"`
	SogaCheekType [3]int8 `eq2:"soga_cheek_type,size:3"`
	SogaLipType [3]int8 `eq2:"soga_lip_type,size:3"`
	SogaChinType [3]int8 `eq2:"soga_chin_type,size:3"`
	SogaNoseType [3]int8 `eq2:"soga_nose_type,size:3"`
	Unknown13 uint16 `eq2:"unknown13"`  // TODO: Identify purpose
	SogaHairColor1 types.Color `eq2:"soga_hair_color1"`
	SogaHairColor2 types.Color `eq2:"soga_hair_color2"`
	Unknown14 types.Color `eq2:"unknown14"`  // TODO: Identify purpose
	SogaHairType uint16 `eq2:"soga_hair_type"`
	SogaHairTypeColor types.Color `eq2:"soga_hair_type_color"`
	SogaHairTypeHighlightColor types.Color `eq2:"soga_hair_type_highlight_color"`
	SogaHairFaceType uint16 `eq2:"soga_hair_face_type"`
	SogaHairFaceColor types.Color `eq2:"soga_hair_face_color"`
	SogaHairFaceHighlightColor types.Color `eq2:"soga_hair_face_highlight_color"`
	Unknown15 [7]uint8 `eq2:"unknown15,size:7"`  // TODO: Identify purpose
}

// Serialize writes the packet data to the provided buffer
func (p *CharSelectProfileV887) Serialize(dest []byte) uint32 {
	offset := uint32(0)
	binary.LittleEndian.PutUint32(dest[offset:], uint32(p.Version))
	offset += 4
	binary.LittleEndian.PutUint32(dest[offset:], uint32(p.Charid))
	offset += 4
	binary.LittleEndian.PutUint32(dest[offset:], uint32(p.ServerId))
	offset += 4
	binary.LittleEndian.PutUint16(dest[offset:], uint16(len(p.Name)))
	offset += 2
	copy(dest[offset:], []byte(p.Name))
	offset += uint32(len(p.Name))
	dest[offset] = byte(p.Unknown)
	offset++
	dest[offset] = byte(p.Race)
	offset++
	dest[offset] = byte(p.Class)
	offset++
	dest[offset] = byte(p.Gender)
	offset++
	binary.LittleEndian.PutUint32(dest[offset:], uint32(p.Level))
	offset += 4
	binary.LittleEndian.PutUint16(dest[offset:], uint16(len(p.Zone)))
	offset += 2
	copy(dest[offset:], []byte(p.Zone))
	offset += uint32(len(p.Zone))
	binary.LittleEndian.PutUint32(dest[offset:], uint32(p.Unknown1))
	offset += 4
	binary.LittleEndian.PutUint32(dest[offset:], uint32(p.Unknown2))
	offset += 4
	binary.LittleEndian.PutUint32(dest[offset:], uint32(p.CreatedDate))
	offset += 4
	binary.LittleEndian.PutUint32(dest[offset:], uint32(p.LastPlayed))
	offset += 4
	binary.LittleEndian.PutUint32(dest[offset:], uint32(p.Unknown3))
	offset += 4
	binary.LittleEndian.PutUint32(dest[offset:], uint32(p.Unknown4))
	offset += 4
	binary.LittleEndian.PutUint16(dest[offset:], uint16(len(p.Zonename2)))
	offset += 2
	copy(dest[offset:], []byte(p.Zonename2))
	offset += uint32(len(p.Zonename2))
	binary.LittleEndian.PutUint16(dest[offset:], uint16(len(p.Zonedesc)))
	offset += 2
	copy(dest[offset:], []byte(p.Zonedesc))
	offset += uint32(len(p.Zonedesc))
	binary.LittleEndian.PutUint32(dest[offset:], uint32(p.Unknown5))
	offset += 4
	binary.LittleEndian.PutUint16(dest[offset:], uint16(len(p.ServerName)))
	offset += 2
	copy(dest[offset:], []byte(p.ServerName))
	offset += uint32(len(p.ServerName))
	binary.LittleEndian.PutUint32(dest[offset:], uint32(p.AccountId))
	offset += 4
	for i := 0; i < 2; i++ {
		dest[offset] = p.Unknown6[i]
		offset++
	}
	binary.LittleEndian.PutUint32(dest[offset:], uint32(p.Unknown7))
	offset += 4
	dest[offset] = byte(p.TradeskillClass)
	offset++
	binary.LittleEndian.PutUint32(dest[offset:], uint32(p.TradeskillLevel))
	offset += 4
	dest[offset] = byte(p.Unknown8)
	offset++
	binary.LittleEndian.PutUint16(dest[offset:], uint16(p.RaceType))
	offset += 2
	dest[offset] = p.SkinColor.R
	dest[offset+1] = p.SkinColor.G
	dest[offset+2] = p.SkinColor.B
	offset += 3
	dest[offset] = p.EyeColor.R
	dest[offset+1] = p.EyeColor.G
	dest[offset+2] = p.EyeColor.B
	offset += 3
	for i := 0; i < 25; i++ {
		binary.LittleEndian.PutUint16(dest[offset:], p.Equip[i].Type)
		offset += 2
		dest[offset] = p.Equip[i].Color.R
		dest[offset+1] = p.Equip[i].Color.G
		dest[offset+2] = p.Equip[i].Color.B
		offset += 3
		dest[offset] = p.Equip[i].Highlight.R
		dest[offset+1] = p.Equip[i].Highlight.G
		dest[offset+2] = p.Equip[i].Highlight.B
		offset += 3
	}
	binary.LittleEndian.PutUint16(dest[offset:], uint16(p.HairType))
	offset += 2
	dest[offset] = p.HairTypeColor.R
	dest[offset+1] = p.HairTypeColor.G
	dest[offset+2] = p.HairTypeColor.B
	offset += 3
	dest[offset] = p.HairTypeHighlightColor.R
	dest[offset+1] = p.HairTypeHighlightColor.G
	dest[offset+2] = p.HairTypeHighlightColor.B
	offset += 3
	binary.LittleEndian.PutUint16(dest[offset:], uint16(p.HairFaceType))
	offset += 2
	dest[offset] = p.HairFaceColor.R
	dest[offset+1] = p.HairFaceColor.G
	dest[offset+2] = p.HairFaceColor.B
	offset += 3
	dest[offset] = p.HairFaceHighlightColor.R
	dest[offset+1] = p.HairFaceHighlightColor.G
	dest[offset+2] = p.HairFaceHighlightColor.B
	offset += 3
	binary.LittleEndian.PutUint16(dest[offset:], uint16(p.WingType))
	offset += 2
	dest[offset] = p.WingColor1.R
	dest[offset+1] = p.WingColor1.G
	dest[offset+2] = p.WingColor1.B
	offset += 3
	dest[offset] = p.WingColor2.R
	dest[offset+1] = p.WingColor2.G
	dest[offset+2] = p.WingColor2.B
	offset += 3
	binary.LittleEndian.PutUint16(dest[offset:], uint16(p.ChestType))
	offset += 2
	dest[offset] = p.ShirtColor.R
	dest[offset+1] = p.ShirtColor.G
	dest[offset+2] = p.ShirtColor.B
	offset += 3
	dest[offset] = p.UnknownChestColor.R
	dest[offset+1] = p.UnknownChestColor.G
	dest[offset+2] = p.UnknownChestColor.B
	offset += 3
	binary.LittleEndian.PutUint16(dest[offset:], uint16(p.LegsType))
	offset += 2
	dest[offset] = p.PantsColor.R
	dest[offset+1] = p.PantsColor.G
	dest[offset+2] = p.PantsColor.B
	offset += 3
	dest[offset] = p.UnknownLegsColor.R
	dest[offset+1] = p.UnknownLegsColor.G
	dest[offset+2] = p.UnknownLegsColor.B
	offset += 3
	dest[offset] = p.Unknown9.R
	dest[offset+1] = p.Unknown9.G
	dest[offset+2] = p.Unknown9.B
	offset += 3
	for i := 0; i < 3; i++ {
		dest[offset] = byte(p.EyeType[i])
		offset++
	}
	for i := 0; i < 3; i++ {
		dest[offset] = byte(p.EarType[i])
		offset++
	}
	for i := 0; i < 3; i++ {
		dest[offset] = byte(p.EyeBrowType[i])
		offset++
	}
	for i := 0; i < 3; i++ {
		dest[offset] = byte(p.CheekType[i])
		offset++
	}
	for i := 0; i < 3; i++ {
		dest[offset] = byte(p.LipType[i])
		offset++
	}
	for i := 0; i < 3; i++ {
		dest[offset] = byte(p.ChinType[i])
		offset++
	}
	for i := 0; i < 3; i++ {
		dest[offset] = byte(p.NoseType[i])
		offset++
	}
	dest[offset] = byte(p.BodySize)
	offset++
	for i := 0; i < 9; i++ {
		dest[offset] = p.Unknown10[i]
		offset++
	}
	dest[offset] = p.HairColor1.R
	dest[offset+1] = p.HairColor1.G
	dest[offset+2] = p.HairColor1.B
	offset += 3
	dest[offset] = p.HairColor2.R
	dest[offset+1] = p.HairColor2.G
	dest[offset+2] = p.HairColor2.B
	offset += 3
	for i := 0; i < 13; i++ {
		dest[offset] = p.Unknown11[i]
		offset++
	}
	binary.LittleEndian.PutUint16(dest[offset:], uint16(p.SogaRaceType))
	offset += 2
	dest[offset] = p.SogaSkinColor.R
	dest[offset+1] = p.SogaSkinColor.G
	dest[offset+2] = p.SogaSkinColor.B
	offset += 3
	dest[offset] = p.SogaEyeColor.R
	dest[offset+1] = p.SogaEyeColor.G
	dest[offset+2] = p.SogaEyeColor.B
	offset += 3
	for i := 0; i < 3; i++ {
		dest[offset] = p.Unknown12[i]
		offset++
	}
	for i := 0; i < 3; i++ {
		dest[offset] = byte(p.SogaEyeType[i])
		offset++
	}
	for i := 0; i < 3; i++ {
		dest[offset] = byte(p.SogaEarType[i])
		offset++
	}
	for i := 0; i < 3; i++ {
		dest[offset] = byte(p.SogaEyeBrowType[i])
		offset++
	}
	for i := 0; i < 3; i++ {
		dest[offset] = byte(p.SogaCheekType[i])
		offset++
	}
	for i := 0; i < 3; i++ {
		dest[offset] = byte(p.SogaLipType[i])
		offset++
	}
	for i := 0; i < 3; i++ {
		dest[offset] = byte(p.SogaChinType[i])
		offset++
	}
	for i := 0; i < 3; i++ {
		dest[offset] = byte(p.SogaNoseType[i])
		offset++
	}
	binary.LittleEndian.PutUint16(dest[offset:], uint16(p.Unknown13))
	offset += 2
	dest[offset] = p.SogaHairColor1.R
	dest[offset+1] = p.SogaHairColor1.G
	dest[offset+2] = p.SogaHairColor1.B
	offset += 3
	dest[offset] = p.SogaHairColor2.R
	dest[offset+1] = p.SogaHairColor2.G
	dest[offset+2] = p.SogaHairColor2.B
	offset += 3
	dest[offset] = p.Unknown14.R
	dest[offset+1] = p.Unknown14.G
	dest[offset+2] = p.Unknown14.B
	offset += 3
	binary.LittleEndian.PutUint16(dest[offset:], uint16(p.SogaHairType))
	offset += 2
	dest[offset] = p.SogaHairTypeColor.R
	dest[offset+1] = p.SogaHairTypeColor.G
	dest[offset+2] = p.SogaHairTypeColor.B
	offset += 3
	dest[offset] = p.SogaHairTypeHighlightColor.R
	dest[offset+1] = p.SogaHairTypeHighlightColor.G
	dest[offset+2] = p.SogaHairTypeHighlightColor.B
	offset += 3
	binary.LittleEndian.PutUint16(dest[offset:], uint16(p.SogaHairFaceType))
	offset += 2
	dest[offset] = p.SogaHairFaceColor.R
	dest[offset+1] = p.SogaHairFaceColor.G
	dest[offset+2] = p.SogaHairFaceColor.B
	offset += 3
	dest[offset] = p.SogaHairFaceHighlightColor.R
	dest[offset+1] = p.SogaHairFaceHighlightColor.G
	dest[offset+2] = p.SogaHairFaceHighlightColor.B
	offset += 3
	for i := 0; i < 7; i++ {
		dest[offset] = p.Unknown15[i]
		offset++
	}
	return offset
}

// Size returns the serialized size of the packet
func (p *CharSelectProfileV887) Size() uint32 {
	size := uint32(0)
	size += 4
	size += 4
	size += 4
	size += 2 + uint32(len(p.Name))
	size += 1
	size += 1
	size += 1
	size += 1
	size += 4
	size += 2 + uint32(len(p.Zone))
	size += 4
	size += 4
	size += 4
	size += 4
	size += 4
	size += 4
	size += 2 + uint32(len(p.Zonename2))
	size += 2 + uint32(len(p.Zonedesc))
	size += 4
	size += 2 + uint32(len(p.ServerName))
	size += 4
	size += uint32(2)
	size += 4
	size += 1
	size += 4
	size += 1
	size += 2
	size += 3
	size += 3
	size += uint32(25) * 8
	size += 2
	size += 3
	size += 3
	size += 2
	size += 3
	size += 3
	size += 2
	size += 3
	size += 3
	size += 2
	size += 3
	size += 3
	size += 2
	size += 3
	size += 3
	size += 3
	size += uint32(3)
	size += uint32(3)
	size += uint32(3)
	size += uint32(3)
	size += uint32(3)
	size += uint32(3)
	size += uint32(3)
	size += 1
	size += uint32(9)
	size += 3
	size += 3
	size += uint32(13)
	size += 2
	size += 3
	size += 3
	size += uint32(3)
	size += uint32(3)
	size += uint32(3)
	size += uint32(3)
	size += uint32(3)
	size += uint32(3)
	size += uint32(3)
	size += uint32(3)
	size += 2
	size += 3
	size += 3
	size += 3
	size += 2
	size += 3
	size += 3
	size += 2
	size += 3
	size += 3
	size += uint32(7)
	return size
}

// CharSelectProfileV60085 represents packet structure for client version 60085
type CharSelectProfileV60085 struct {
	Version uint32 `eq2:"version"`
	Charid uint32 `eq2:"charid"`
	ServerId uint32 `eq2:"server_id"`
	Name string `eq2:"name,type:str16"`
	Unknown uint8 `eq2:"unknown"`  // TODO: Identify purpose
	Race uint8 `eq2:"race"`
	Class uint8 `eq2:"class"`
	Gender uint8 `eq2:"gender"`
	Level uint32 `eq2:"level"`
	Zone string `eq2:"zone,type:str16"`
	Unknown1 uint32 `eq2:"unknown1"`  // TODO: Identify purpose
	Unknown2 uint32 `eq2:"unknown2"`  // TODO: Identify purpose
	CreatedDate uint32 `eq2:"created_date"`
	LastPlayed uint32 `eq2:"last_played"`
	Unknown3 uint32 `eq2:"unknown3"`  // TODO: Identify purpose
	Unknown4 uint32 `eq2:"unknown4"`  // TODO: Identify purpose
	Zonename2 string `eq2:"zonename2,type:str16"`
	Zonedesc string `eq2:"zonedesc,type:str16"`
	Unknown5 uint32 `eq2:"unknown5"`  // TODO: Identify purpose
	ServerName string `eq2:"server_name,type:str16"`
	AccountId uint32 `eq2:"account_id"`
	Unknown6 [2]uint8 `eq2:"unknown6,size:2"`  // TODO: Identify purpose
	Unknown7 uint32 `eq2:"unknown7"`  // TODO: Identify purpose
	TradeskillClass uint8 `eq2:"tradeskill_class"`
	TradeskillLevel uint32 `eq2:"tradeskill_level"`
	Unknown8 uint8 `eq2:"unknown8"`  // TODO: Identify purpose
	RaceType uint16 `eq2:"race_type"`
	SkinColor types.Color `eq2:"skin_color"`
	EyeColor types.Color `eq2:"eye_color"`
	Equip [25]types.EquipmentItem `eq2:"equip,size:25"`
	HairType uint16 `eq2:"hair_type"`
	HairTypeColor types.Color `eq2:"hair_type_color"`
	HairTypeHighlightColor types.Color `eq2:"hair_type_highlight_color"`
	HairFaceType uint16 `eq2:"hair_face_type"`
	HairFaceColor types.Color `eq2:"hair_face_color"`
	HairFaceHighlightColor types.Color `eq2:"hair_face_highlight_color"`
	WingType uint16 `eq2:"wing_type"`
	WingColor1 types.Color `eq2:"wing_color1"`
	WingColor2 types.Color `eq2:"wing_color2"`
	ChestType uint16 `eq2:"chest_type"`
	ShirtColor types.Color `eq2:"shirt_color"`
	UnknownChestColor types.Color `eq2:"unknown_chest_color"`  // TODO: Identify purpose
	LegsType uint16 `eq2:"legs_type"`
	PantsColor types.Color `eq2:"pants_color"`
	UnknownLegsColor types.Color `eq2:"unknown_legs_color"`  // TODO: Identify purpose
	Unknown9 types.Color `eq2:"unknown9"`  // TODO: Identify purpose
	EyeType [3]int8 `eq2:"eye_type,size:3"`
	EarType [3]int8 `eq2:"ear_type,size:3"`
	EyeBrowType [3]int8 `eq2:"eye_brow_type,size:3"`
	CheekType [3]int8 `eq2:"cheek_type,size:3"`
	LipType [3]int8 `eq2:"lip_type,size:3"`
	ChinType [3]int8 `eq2:"chin_type,size:3"`
	NoseType [3]int8 `eq2:"nose_type,size:3"`
	BodySize int8 `eq2:"body_size"`
	Unknown10 [9]uint8 `eq2:"unknown10,size:9"`  // TODO: Identify purpose
	HairColor1 types.Color `eq2:"hair_color1"`
	HairColor2 types.Color `eq2:"hair_color2"`
	Unknown11 [13]uint8 `eq2:"unknown11,size:13"`  // TODO: Identify purpose
	SogaRaceType uint16 `eq2:"soga_race_type"`
	SogaSkinColor types.Color `eq2:"soga_skin_color"`
	SogaEyeColor types.Color `eq2:"soga_eye_color"`
	Unknown12 [3]uint8 `eq2:"Unknown12,size:3"`  // TODO: Identify purpose
	SogaEyeType [3]int8 `eq2:"soga_eye_type,size:3"`
	SogaEarType [3]int8 `eq2:"soga_ear_type,size:3"`
	SogaEyeBrowType [3]int8 `eq2:"soga_eye_brow_type,size:3"`
	SogaCheekType [3]int8 `eq2:"soga_cheek_type,size:3"`
	SogaLipType [3]int8 `eq2:"soga_lip_type,size:3"`
	SogaChinType [3]int8 `eq2:"soga_chin_type,size:3"`
	SogaNoseType [3]int8 `eq2:"soga_nose_type,size:3"`
	Unknown13 uint16 `eq2:"unknown13"`  // TODO: Identify purpose
	SogaHairColor1 types.Color `eq2:"soga_hair_color1"`
	SogaHairColor2 types.Color `eq2:"soga_hair_color2"`
	Unknown14 types.Color `eq2:"unknown14"`  // TODO: Identify purpose
	SogaHairType uint16 `eq2:"soga_hair_type"`
	SogaHairTypeColor types.Color `eq2:"soga_hair_type_color"`
	SogaHairTypeHighlightColor types.Color `eq2:"soga_hair_type_highlight_color"`
	SogaHairFaceType uint16 `eq2:"soga_hair_face_type"`
	SogaHairFaceColor types.Color `eq2:"soga_hair_face_color"`
	SogaHairFaceHighlightColor types.Color `eq2:"soga_hair_face_highlight_color"`
	Unknown15 [7]uint8 `eq2:"unknown15,size:7"`  // TODO: Identify purpose
}

// Serialize writes the packet data to the provided buffer
func (p *CharSelectProfileV60085) Serialize(dest []byte) uint32 {
	offset := uint32(0)
	binary.LittleEndian.PutUint32(dest[offset:], uint32(p.Version))
	offset += 4
	binary.LittleEndian.PutUint32(dest[offset:], uint32(p.Charid))
	offset += 4
	binary.LittleEndian.PutUint32(dest[offset:], uint32(p.ServerId))
	offset += 4
	binary.LittleEndian.PutUint16(dest[offset:], uint16(len(p.Name)))
	offset += 2
	copy(dest[offset:], []byte(p.Name))
	offset += uint32(len(p.Name))
	dest[offset] = byte(p.Unknown)
	offset++
	dest[offset] = byte(p.Race)
	offset++
	dest[offset] = byte(p.Class)
	offset++
	dest[offset] = byte(p.Gender)
	offset++
	binary.LittleEndian.PutUint32(dest[offset:], uint32(p.Level))
	offset += 4
	binary.LittleEndian.PutUint16(dest[offset:], uint16(len(p.Zone)))
	offset += 2
	copy(dest[offset:], []byte(p.Zone))
	offset += uint32(len(p.Zone))
	binary.LittleEndian.PutUint32(dest[offset:], uint32(p.Unknown1))
	offset += 4
	binary.LittleEndian.PutUint32(dest[offset:], uint32(p.Unknown2))
	offset += 4
	binary.LittleEndian.PutUint32(dest[offset:], uint32(p.CreatedDate))
	offset += 4
	binary.LittleEndian.PutUint32(dest[offset:], uint32(p.LastPlayed))
	offset += 4
	binary.LittleEndian.PutUint32(dest[offset:], uint32(p.Unknown3))
	offset += 4
	binary.LittleEndian.PutUint32(dest[offset:], uint32(p.Unknown4))
	offset += 4
	binary.LittleEndian.PutUint16(dest[offset:], uint16(len(p.Zonename2)))
	offset += 2
	copy(dest[offset:], []byte(p.Zonename2))
	offset += uint32(len(p.Zonename2))
	binary.LittleEndian.PutUint16(dest[offset:], uint16(len(p.Zonedesc)))
	offset += 2
	copy(dest[offset:], []byte(p.Zonedesc))
	offset += uint32(len(p.Zonedesc))
	binary.LittleEndian.PutUint32(dest[offset:], uint32(p.Unknown5))
	offset += 4
	binary.LittleEndian.PutUint16(dest[offset:], uint16(len(p.ServerName)))
	offset += 2
	copy(dest[offset:], []byte(p.ServerName))
	offset += uint32(len(p.ServerName))
	binary.LittleEndian.PutUint32(dest[offset:], uint32(p.AccountId))
	offset += 4
	for i := 0; i < 2; i++ {
		dest[offset] = p.Unknown6[i]
		offset++
	}
	binary.LittleEndian.PutUint32(dest[offset:], uint32(p.Unknown7))
	offset += 4
	dest[offset] = byte(p.TradeskillClass)
	offset++
	binary.LittleEndian.PutUint32(dest[offset:], uint32(p.TradeskillLevel))
	offset += 4
	dest[offset] = byte(p.Unknown8)
	offset++
	binary.LittleEndian.PutUint16(dest[offset:], uint16(p.RaceType))
	offset += 2
	dest[offset] = p.SkinColor.R
	dest[offset+1] = p.SkinColor.G
	dest[offset+2] = p.SkinColor.B
	offset += 3
	dest[offset] = p.EyeColor.R
	dest[offset+1] = p.EyeColor.G
	dest[offset+2] = p.EyeColor.B
	offset += 3
	for i := 0; i < 25; i++ {
		binary.LittleEndian.PutUint16(dest[offset:], p.Equip[i].Type)
		offset += 2
		dest[offset] = p.Equip[i].Color.R
		dest[offset+1] = p.Equip[i].Color.G
		dest[offset+2] = p.Equip[i].Color.B
		offset += 3
		dest[offset] = p.Equip[i].Highlight.R
		dest[offset+1] = p.Equip[i].Highlight.G
		dest[offset+2] = p.Equip[i].Highlight.B
		offset += 3
	}
	binary.LittleEndian.PutUint16(dest[offset:], uint16(p.HairType))
	offset += 2
	dest[offset] = p.HairTypeColor.R
	dest[offset+1] = p.HairTypeColor.G
	dest[offset+2] = p.HairTypeColor.B
	offset += 3
	dest[offset] = p.HairTypeHighlightColor.R
	dest[offset+1] = p.HairTypeHighlightColor.G
	dest[offset+2] = p.HairTypeHighlightColor.B
	offset += 3
	binary.LittleEndian.PutUint16(dest[offset:], uint16(p.HairFaceType))
	offset += 2
	dest[offset] = p.HairFaceColor.R
	dest[offset+1] = p.HairFaceColor.G
	dest[offset+2] = p.HairFaceColor.B
	offset += 3
	dest[offset] = p.HairFaceHighlightColor.R
	dest[offset+1] = p.HairFaceHighlightColor.G
	dest[offset+2] = p.HairFaceHighlightColor.B
	offset += 3
	binary.LittleEndian.PutUint16(dest[offset:], uint16(p.WingType))
	offset += 2
	dest[offset] = p.WingColor1.R
	dest[offset+1] = p.WingColor1.G
	dest[offset+2] = p.WingColor1.B
	offset += 3
	dest[offset] = p.WingColor2.R
	dest[offset+1] = p.WingColor2.G
	dest[offset+2] = p.WingColor2.B
	offset += 3
	binary.LittleEndian.PutUint16(dest[offset:], uint16(p.ChestType))
	offset += 2
	dest[offset] = p.ShirtColor.R
	dest[offset+1] = p.ShirtColor.G
	dest[offset+2] = p.ShirtColor.B
	offset += 3
	dest[offset] = p.UnknownChestColor.R
	dest[offset+1] = p.UnknownChestColor.G
	dest[offset+2] = p.UnknownChestColor.B
	offset += 3
	binary.LittleEndian.PutUint16(dest[offset:], uint16(p.LegsType))
	offset += 2
	dest[offset] = p.PantsColor.R
	dest[offset+1] = p.PantsColor.G
	dest[offset+2] = p.PantsColor.B
	offset += 3
	dest[offset] = p.UnknownLegsColor.R
	dest[offset+1] = p.UnknownLegsColor.G
	dest[offset+2] = p.UnknownLegsColor.B
	offset += 3
	dest[offset] = p.Unknown9.R
	dest[offset+1] = p.Unknown9.G
	dest[offset+2] = p.Unknown9.B
	offset += 3
	for i := 0; i < 3; i++ {
		dest[offset] = byte(p.EyeType[i])
		offset++
	}
	for i := 0; i < 3; i++ {
		dest[offset] = byte(p.EarType[i])
		offset++
	}
	for i := 0; i < 3; i++ {
		dest[offset] = byte(p.EyeBrowType[i])
		offset++
	}
	for i := 0; i < 3; i++ {
		dest[offset] = byte(p.CheekType[i])
		offset++
	}
	for i := 0; i < 3; i++ {
		dest[offset] = byte(p.LipType[i])
		offset++
	}
	for i := 0; i < 3; i++ {
		dest[offset] = byte(p.ChinType[i])
		offset++
	}
	for i := 0; i < 3; i++ {
		dest[offset] = byte(p.NoseType[i])
		offset++
	}
	dest[offset] = byte(p.BodySize)
	offset++
	for i := 0; i < 9; i++ {
		dest[offset] = p.Unknown10[i]
		offset++
	}
	dest[offset] = p.HairColor1.R
	dest[offset+1] = p.HairColor1.G
	dest[offset+2] = p.HairColor1.B
	offset += 3
	dest[offset] = p.HairColor2.R
	dest[offset+1] = p.HairColor2.G
	dest[offset+2] = p.HairColor2.B
	offset += 3
	for i := 0; i < 13; i++ {
		dest[offset] = p.Unknown11[i]
		offset++
	}
	binary.LittleEndian.PutUint16(dest[offset:], uint16(p.SogaRaceType))
	offset += 2
	dest[offset] = p.SogaSkinColor.R
	dest[offset+1] = p.SogaSkinColor.G
	dest[offset+2] = p.SogaSkinColor.B
	offset += 3
	dest[offset] = p.SogaEyeColor.R
	dest[offset+1] = p.SogaEyeColor.G
	dest[offset+2] = p.SogaEyeColor.B
	offset += 3
	for i := 0; i < 3; i++ {
		dest[offset] = p.Unknown12[i]
		offset++
	}
	for i := 0; i < 3; i++ {
		dest[offset] = byte(p.SogaEyeType[i])
		offset++
	}
	for i := 0; i < 3; i++ {
		dest[offset] = byte(p.SogaEarType[i])
		offset++
	}
	for i := 0; i < 3; i++ {
		dest[offset] = byte(p.SogaEyeBrowType[i])
		offset++
	}
	for i := 0; i < 3; i++ {
		dest[offset] = byte(p.SogaCheekType[i])
		offset++
	}
	for i := 0; i < 3; i++ {
		dest[offset] = byte(p.SogaLipType[i])
		offset++
	}
	for i := 0; i < 3; i++ {
		dest[offset] = byte(p.SogaChinType[i])
		offset++
	}
	for i := 0; i < 3; i++ {
		dest[offset] = byte(p.SogaNoseType[i])
		offset++
	}
	binary.LittleEndian.PutUint16(dest[offset:], uint16(p.Unknown13))
	offset += 2
	dest[offset] = p.SogaHairColor1.R
	dest[offset+1] = p.SogaHairColor1.G
	dest[offset+2] = p.SogaHairColor1.B
	offset += 3
	dest[offset] = p.SogaHairColor2.R
	dest[offset+1] = p.SogaHairColor2.G
	dest[offset+2] = p.SogaHairColor2.B
	offset += 3
	dest[offset] = p.Unknown14.R
	dest[offset+1] = p.Unknown14.G
	dest[offset+2] = p.Unknown14.B
	offset += 3
	binary.LittleEndian.PutUint16(dest[offset:], uint16(p.SogaHairType))
	offset += 2
	dest[offset] = p.SogaHairTypeColor.R
	dest[offset+1] = p.SogaHairTypeColor.G
	dest[offset+2] = p.SogaHairTypeColor.B
	offset += 3
	dest[offset] = p.SogaHairTypeHighlightColor.R
	dest[offset+1] = p.SogaHairTypeHighlightColor.G
	dest[offset+2] = p.SogaHairTypeHighlightColor.B
	offset += 3
	binary.LittleEndian.PutUint16(dest[offset:], uint16(p.SogaHairFaceType))
	offset += 2
	dest[offset] = p.SogaHairFaceColor.R
	dest[offset+1] = p.SogaHairFaceColor.G
	dest[offset+2] = p.SogaHairFaceColor.B
	offset += 3
	dest[offset] = p.SogaHairFaceHighlightColor.R
	dest[offset+1] = p.SogaHairFaceHighlightColor.G
	dest[offset+2] = p.SogaHairFaceHighlightColor.B
	offset += 3
	for i := 0; i < 7; i++ {
		dest[offset] = p.Unknown15[i]
		offset++
	}
	return offset
}

// Size returns the serialized size of the packet
func (p *CharSelectProfileV60085) Size() uint32 {
	size := uint32(0)
	size += 4
	size += 4
	size += 4
	size += 2 + uint32(len(p.Name))
	size += 1
	size += 1
	size += 1
	size += 1
	size += 4
	size += 2 + uint32(len(p.Zone))
	size += 4
	size += 4
	size += 4
	size += 4
	size += 4
	size += 4
	size += 2 + uint32(len(p.Zonename2))
	size += 2 + uint32(len(p.Zonedesc))
	size += 4
	size += 2 + uint32(len(p.ServerName))
	size += 4
	size += uint32(2)
	size += 4
	size += 1
	size += 4
	size += 1
	size += 2
	size += 3
	size += 3
	size += uint32(25) * 8
	size += 2
	size += 3
	size += 3
	size += 2
	size += 3
	size += 3
	size += 2
	size += 3
	size += 3
	size += 2
	size += 3
	size += 3
	size += 2
	size += 3
	size += 3
	size += 3
	size += uint32(3)
	size += uint32(3)
	size += uint32(3)
	size += uint32(3)
	size += uint32(3)
	size += uint32(3)
	size += uint32(3)
	size += 1
	size += uint32(9)
	size += 3
	size += 3
	size += uint32(13)
	size += 2
	size += 3
	size += 3
	size += uint32(3)
	size += uint32(3)
	size += uint32(3)
	size += uint32(3)
	size += uint32(3)
	size += uint32(3)
	size += uint32(3)
	size += uint32(3)
	size += 2
	size += 3
	size += 3
	size += 3
	size += 2
	size += 3
	size += 3
	size += 2
	size += 3
	size += 3
	size += uint32(7)
	return size
}

// LSLoginReplyMsg represents packet structure for OP_LoginReplyMsg
type LSLoginReplyMsg struct {
	LoginResponse uint8 `eq2:"login_response"`
	WorldName string `eq2:"worldName,type:str16"`
	ParentalControlFlag uint8 `eq2:"parental_control_flag"`
	ParentalControlTimer [2]uint32 `eq2:"parental_control_timer,size:2"`
	ParentalControlNext uint32 `eq2:"parental_control_next"`
	AccountId uint32 `eq2:"account_id"`
}

// Serialize writes the packet data to the provided buffer
func (p *LSLoginReplyMsg) Serialize(dest []byte) uint32 {
	offset := uint32(0)
	dest[offset] = byte(p.LoginResponse)
	offset++
	binary.LittleEndian.PutUint16(dest[offset:], uint16(len(p.WorldName)))
	offset += 2
	copy(dest[offset:], []byte(p.WorldName))
	offset += uint32(len(p.WorldName))
	dest[offset] = byte(p.ParentalControlFlag)
	offset++
	for i := 0; i < 2; i++ {
		binary.LittleEndian.PutUint32(dest[offset:], uint32(p.ParentalControlTimer[i]))
		offset += 4
	}
	binary.LittleEndian.PutUint32(dest[offset:], uint32(p.ParentalControlNext))
	offset += 4
	binary.LittleEndian.PutUint32(dest[offset:], uint32(p.AccountId))
	offset += 4
	return offset
}

// Size returns the serialized size of the packet
func (p *LSLoginReplyMsg) Size() uint32 {
	size := uint32(0)
	size += 1
	size += 2 + uint32(len(p.WorldName))
	size += 1
	size += uint32(2) * 4
	size += 4
	size += 4
	return size
}

// LSLoginReplyMsgV284 represents packet structure for OP_LoginReplyMsg
type LSLoginReplyMsgV284 struct {
	LoginResponse uint8 `eq2:"login_response"`
	Unknown string `eq2:"unknown,type:str16"`  // TODO: Identify purpose
	ParentalControlFlag uint8 `eq2:"parental_control_flag"`
	ParentalControlTimer uint32 `eq2:"parental_control_timer"`
	Unknown2 [8]uint8 `eq2:"unknown2,size:8"`  // TODO: Identify purpose
	CacheSettingAccountId uint32 `eq2:"cache_setting_account_id"`
	Unknown3 string `eq2:"unknown3,type:str16"`  // TODO: Identify purpose
	ResetAppearance uint8 `eq2:"reset_appearance"`
	DoNotForceSoga uint8 `eq2:"do_not_force_soga"`
	Unknown5 uint16 `eq2:"unknown5"`  // TODO: Identify purpose
	Unknown6 uint8 `eq2:"unknown6"`  // TODO: Identify purpose
	Unknown7 uint32 `eq2:"unknown7"`  // TODO: Identify purpose
	Unknown8 [2]uint8 `eq2:"unknown8,size:2"`  // TODO: Identify purpose
	Unknown10 uint8 `eq2:"unknown10"`  // TODO: Identify purpose
	NumClassItems uint8 `eq2:"num_class_items,ifSet:unknown10"`
	ClassItems []struct {
		ClassId uint8 `eq2:"class_id"`
		NumItems uint8 `eq2:"num_items"`
		StartingItems []struct {
		ModelId uint16 `eq2:"model_id"`
		SlotId uint8 `eq2:"slot_id"`
		UseColor uint8 `eq2:"use_color"`
		UseHighlightColor uint8 `eq2:"use_highlight_color"`
		ModelColor types.Color `eq2:"model_color"`
		ModelHighlightColor types.Color `eq2:"model_highlight_color"`
	} `eq2:"starting_items"`
	} `eq2:"class_items,sizeVar:num_class_items,ifSet:unknown10"`
	UnknownArray2Size uint8 `eq2:"unknown_array2_size"`  // TODO: Identify purpose
	UnknownArray2 []struct {
		Array2Unknown uint32 `eq2:"array2_unknown"`
	} `eq2:"unknown_array2,sizeVar:unknown_array2_size"`
}

// Serialize writes the packet data to the provided buffer
func (p *LSLoginReplyMsgV284) Serialize(dest []byte) uint32 {
	offset := uint32(0)
	dest[offset] = byte(p.LoginResponse)
	offset++
	binary.LittleEndian.PutUint16(dest[offset:], uint16(len(p.Unknown)))
	offset += 2
	copy(dest[offset:], []byte(p.Unknown))
	offset += uint32(len(p.Unknown))
	dest[offset] = byte(p.ParentalControlFlag)
	offset++
	binary.LittleEndian.PutUint32(dest[offset:], uint32(p.ParentalControlTimer))
	offset += 4
	for i := 0; i < 8; i++ {
		dest[offset] = p.Unknown2[i]
		offset++
	}
	binary.LittleEndian.PutUint32(dest[offset:], uint32(p.CacheSettingAccountId))
	offset += 4
	binary.LittleEndian.PutUint16(dest[offset:], uint16(len(p.Unknown3)))
	offset += 2
	copy(dest[offset:], []byte(p.Unknown3))
	offset += uint32(len(p.Unknown3))
	dest[offset] = byte(p.ResetAppearance)
	offset++
	dest[offset] = byte(p.DoNotForceSoga)
	offset++
	binary.LittleEndian.PutUint16(dest[offset:], uint16(p.Unknown5))
	offset += 2
	dest[offset] = byte(p.Unknown6)
	offset++
	binary.LittleEndian.PutUint32(dest[offset:], uint32(p.Unknown7))
	offset += 4
	for i := 0; i < 2; i++ {
		dest[offset] = p.Unknown8[i]
		offset++
	}
	dest[offset] = byte(p.Unknown10)
	offset++
	if p.Unknown10 != 0 {
	dest[offset] = byte(p.NumClassItems)
	offset++
	}
	if p.Unknown10 != 0 {
	for _, elem := range p.ClassItems {
		dest[offset] = elem.ClassId
		offset++
		dest[offset] = elem.NumItems
		offset++
		for _, nestedElem := range elem.StartingItems {
			binary.LittleEndian.PutUint16(dest[offset:], nestedElem.ModelId)
			offset += 2
			dest[offset] = nestedElem.SlotId
			offset++
			dest[offset] = nestedElem.UseColor
			offset++
			dest[offset] = nestedElem.UseHighlightColor
			offset++
			dest[offset] = nestedElem.ModelColor.R
			dest[offset+1] = nestedElem.ModelColor.G
			dest[offset+2] = nestedElem.ModelColor.B
			offset += 3
			dest[offset] = nestedElem.ModelHighlightColor.R
			dest[offset+1] = nestedElem.ModelHighlightColor.G
			dest[offset+2] = nestedElem.ModelHighlightColor.B
			offset += 3
		}
	}
	}
	dest[offset] = byte(p.UnknownArray2Size)
	offset++
	for _, elem := range p.UnknownArray2 {
		binary.LittleEndian.PutUint32(dest[offset:], elem.Array2Unknown)
		offset += 4
	}
	return offset
}

// Size returns the serialized size of the packet
func (p *LSLoginReplyMsgV284) Size() uint32 {
	size := uint32(0)
	size += 1
	size += 2 + uint32(len(p.Unknown))
	size += 1
	size += 4
	size += uint32(8)
	size += 4
	size += 2 + uint32(len(p.Unknown3))
	size += 1
	size += 1
	size += 2
	size += 1
	size += 4
	size += uint32(2)
	size += 1
	if p.Unknown10 != 0 {
	size += 1
	}
	if p.Unknown10 != 0 {
	for _, elem := range p.ClassItems {
		_ = elem
		size += 1
		size += 1
		for _, nestedElem := range elem.StartingItems {
			_ = nestedElem
			size += 2
			size += 1
			size += 1
			size += 1
			size += 3
			size += 3

		}

	}
	}
	size += 1
	for _, elem := range p.UnknownArray2 {
		_ = elem
		size += 4

	}
	return size
}

// LSLoginReplyMsgV843 represents packet structure for OP_LoginReplyMsg
type LSLoginReplyMsgV843 struct {
	LoginResponse uint8 `eq2:"login_response"`
	Unknown string `eq2:"unknown,type:str16"`  // TODO: Identify purpose
	ParentalControlFlag uint8 `eq2:"parental_control_flag"`
	ParentalControlTimer uint32 `eq2:"parental_control_timer"`
	Unknown2 [8]uint8 `eq2:"unknown2,size:8"`  // TODO: Identify purpose
	AccountId uint32 `eq2:"account_id"`
	Unknown3 string `eq2:"unknown3,type:str16"`  // TODO: Identify purpose
	ResetAppearance uint8 `eq2:"reset_appearance"`
	DoNotForceSoga uint8 `eq2:"do_not_force_soga"`
	Unknown4 uint8 `eq2:"unknown4"`  // TODO: Identify purpose
	Unknown5 uint16 `eq2:"unknown5"`  // TODO: Identify purpose
	Unknown6 uint8 `eq2:"unknown6"`  // TODO: Identify purpose
	Unknown7 uint32 `eq2:"unknown7"`  // TODO: Identify purpose
	RaceUnknown uint8 `eq2:"race_unknown"`
	Unknown8 [3]uint8 `eq2:"unknown8,size:3"`  // TODO: Identify purpose
	Unknown9 uint8 `eq2:"unknown9"`  // TODO: Identify purpose
	Unknown10 uint8 `eq2:"unknown10"`  // TODO: Identify purpose
	NumClassItems uint8 `eq2:"num_class_items,ifSet:unknown10"`
	ClassItems []struct {
		ClassId uint8 `eq2:"class_id"`
		NumItems uint8 `eq2:"num_items"`
		StartingItems []struct {
		ModelId uint16 `eq2:"model_id"`
		SlotId uint8 `eq2:"slot_id"`
		UseColor uint8 `eq2:"use_color"`
		UseHighlightColor uint8 `eq2:"use_highlight_color"`
		ModelColor types.Color `eq2:"model_color"`
		ModelHighlightColor types.Color `eq2:"model_highlight_color"`
	} `eq2:"starting_items"`
	} `eq2:"class_items,sizeVar:num_class_items,ifSet:unknown10"`
	UnknownArray2Size uint8 `eq2:"unknown_array2_size"`  // TODO: Identify purpose
	UnknownArray2 []struct {
		Array2Unknown uint32 `eq2:"array2_unknown"`
	} `eq2:"unknown_array2,sizeVar:unknown_array2_size"`
}

// Serialize writes the packet data to the provided buffer
func (p *LSLoginReplyMsgV843) Serialize(dest []byte) uint32 {
	offset := uint32(0)
	dest[offset] = byte(p.LoginResponse)
	offset++
	binary.LittleEndian.PutUint16(dest[offset:], uint16(len(p.Unknown)))
	offset += 2
	copy(dest[offset:], []byte(p.Unknown))
	offset += uint32(len(p.Unknown))
	dest[offset] = byte(p.ParentalControlFlag)
	offset++
	binary.LittleEndian.PutUint32(dest[offset:], uint32(p.ParentalControlTimer))
	offset += 4
	for i := 0; i < 8; i++ {
		dest[offset] = p.Unknown2[i]
		offset++
	}
	binary.LittleEndian.PutUint32(dest[offset:], uint32(p.AccountId))
	offset += 4
	binary.LittleEndian.PutUint16(dest[offset:], uint16(len(p.Unknown3)))
	offset += 2
	copy(dest[offset:], []byte(p.Unknown3))
	offset += uint32(len(p.Unknown3))
	dest[offset] = byte(p.ResetAppearance)
	offset++
	dest[offset] = byte(p.DoNotForceSoga)
	offset++
	dest[offset] = byte(p.Unknown4)
	offset++
	binary.LittleEndian.PutUint16(dest[offset:], uint16(p.Unknown5))
	offset += 2
	dest[offset] = byte(p.Unknown6)
	offset++
	binary.LittleEndian.PutUint32(dest[offset:], uint32(p.Unknown7))
	offset += 4
	dest[offset] = byte(p.RaceUnknown)
	offset++
	for i := 0; i < 3; i++ {
		dest[offset] = p.Unknown8[i]
		offset++
	}
	dest[offset] = byte(p.Unknown9)
	offset++
	dest[offset] = byte(p.Unknown10)
	offset++
	if p.Unknown10 != 0 {
	dest[offset] = byte(p.NumClassItems)
	offset++
	}
	if p.Unknown10 != 0 {
	for _, elem := range p.ClassItems {
		dest[offset] = elem.ClassId
		offset++
		dest[offset] = elem.NumItems
		offset++
		for _, nestedElem := range elem.StartingItems {
			binary.LittleEndian.PutUint16(dest[offset:], nestedElem.ModelId)
			offset += 2
			dest[offset] = nestedElem.SlotId
			offset++
			dest[offset] = nestedElem.UseColor
			offset++
			dest[offset] = nestedElem.UseHighlightColor
			offset++
			dest[offset] = nestedElem.ModelColor.R
			dest[offset+1] = nestedElem.ModelColor.G
			dest[offset+2] = nestedElem.ModelColor.B
			offset += 3
			dest[offset] = nestedElem.ModelHighlightColor.R
			dest[offset+1] = nestedElem.ModelHighlightColor.G
			dest[offset+2] = nestedElem.ModelHighlightColor.B
			offset += 3
		}
	}
	}
	dest[offset] = byte(p.UnknownArray2Size)
	offset++
	for _, elem := range p.UnknownArray2 {
		binary.LittleEndian.PutUint32(dest[offset:], elem.Array2Unknown)
		offset += 4
	}
	return offset
}

// Size returns the serialized size of the packet
func (p *LSLoginReplyMsgV843) Size() uint32 {
	size := uint32(0)
	size += 1
	size += 2 + uint32(len(p.Unknown))
	size += 1
	size += 4
	size += uint32(8)
	size += 4
	size += 2 + uint32(len(p.Unknown3))
	size += 1
	size += 1
	size += 1
	size += 2
	size += 1
	size += 4
	size += 1
	size += uint32(3)
	size += 1
	size += 1
	if p.Unknown10 != 0 {
	size += 1
	}
	if p.Unknown10 != 0 {
	for _, elem := range p.ClassItems {
		_ = elem
		size += 1
		size += 1
		for _, nestedElem := range elem.StartingItems {
			_ = nestedElem
			size += 2
			size += 1
			size += 1
			size += 1
			size += 3
			size += 3

		}

	}
	}
	size += 1
	for _, elem := range p.UnknownArray2 {
		_ = elem
		size += 4

	}
	return size
}

// LSLoginReplyMsgV1096 represents packet structure for OP_LoginReplyMsg
type LSLoginReplyMsgV1096 struct {
	LoginResponse uint8 `eq2:"login_response"`
	Unknown string `eq2:"unknown,type:str16"`  // TODO: Identify purpose
	ParentalControlFlag uint8 `eq2:"parental_control_flag"`
	ParentalControlTimer uint32 `eq2:"parental_control_timer"`
	Unknown2 [8]uint8 `eq2:"unknown2,size:8"`  // TODO: Identify purpose
	AccountId uint32 `eq2:"account_id"`
	Unknown3 string `eq2:"unknown3,type:str16"`  // TODO: Identify purpose
	ResetAppearance uint8 `eq2:"reset_appearance"`
	DoNotForceSoga uint8 `eq2:"do_not_force_soga"`
	Unknown4 uint8 `eq2:"unknown4"`  // TODO: Identify purpose
	Unknown5 uint16 `eq2:"unknown5"`  // TODO: Identify purpose
	Unknown6 [5]uint8 `eq2:"unknown6,size:5"`  // TODO: Identify purpose
	Unknown7 uint32 `eq2:"unknown7"`  // TODO: Identify purpose
	RaceUnknown uint8 `eq2:"race_unknown"`
	Unknown8 [3]uint8 `eq2:"unknown8,size:3"`  // TODO: Identify purpose
	Unknown9 uint8 `eq2:"unknown9"`  // TODO: Identify purpose
	Unknown10 uint8 `eq2:"unknown10"`  // TODO: Identify purpose
	NumClassItems uint8 `eq2:"num_class_items,ifSet:unknown10"`
	ClassItems []struct {
		ClassId uint8 `eq2:"class_id"`
		NumItems uint8 `eq2:"num_items"`
		StartingItems []struct {
		ModelId uint16 `eq2:"model_id"`
		SlotId uint8 `eq2:"slot_id"`
		UseColor uint8 `eq2:"use_color"`
		UseHighlightColor uint8 `eq2:"use_highlight_color"`
		ModelColor types.Color `eq2:"model_color"`
		ModelHighlightColor types.Color `eq2:"model_highlight_color"`
	} `eq2:"starting_items"`
	} `eq2:"class_items,sizeVar:num_class_items,ifSet:unknown10"`
	UnknownArray2Size uint8 `eq2:"unknown_array2_size"`  // TODO: Identify purpose
	UnknownArray2 []struct {
		Array2Unknown uint32 `eq2:"array2_unknown"`
	} `eq2:"unknown_array2,sizeVar:unknown_array2_size"`
	Unknown11 uint32 `eq2:"unknown11"`  // TODO: Identify purpose
	SubLevel uint32 `eq2:"sub_level"`
	RaceFlag uint32 `eq2:"race_flag"`
	ClassFlag uint32 `eq2:"class_flag"`
	Password string `eq2:"password,type:str16"`
	Username string `eq2:"username,type:str16"`
}

// Serialize writes the packet data to the provided buffer
func (p *LSLoginReplyMsgV1096) Serialize(dest []byte) uint32 {
	offset := uint32(0)
	dest[offset] = byte(p.LoginResponse)
	offset++
	binary.LittleEndian.PutUint16(dest[offset:], uint16(len(p.Unknown)))
	offset += 2
	copy(dest[offset:], []byte(p.Unknown))
	offset += uint32(len(p.Unknown))
	dest[offset] = byte(p.ParentalControlFlag)
	offset++
	binary.LittleEndian.PutUint32(dest[offset:], uint32(p.ParentalControlTimer))
	offset += 4
	for i := 0; i < 8; i++ {
		dest[offset] = p.Unknown2[i]
		offset++
	}
	binary.LittleEndian.PutUint32(dest[offset:], uint32(p.AccountId))
	offset += 4
	binary.LittleEndian.PutUint16(dest[offset:], uint16(len(p.Unknown3)))
	offset += 2
	copy(dest[offset:], []byte(p.Unknown3))
	offset += uint32(len(p.Unknown3))
	dest[offset] = byte(p.ResetAppearance)
	offset++
	dest[offset] = byte(p.DoNotForceSoga)
	offset++
	dest[offset] = byte(p.Unknown4)
	offset++
	binary.LittleEndian.PutUint16(dest[offset:], uint16(p.Unknown5))
	offset += 2
	for i := 0; i < 5; i++ {
		dest[offset] = p.Unknown6[i]
		offset++
	}
	binary.LittleEndian.PutUint32(dest[offset:], uint32(p.Unknown7))
	offset += 4
	dest[offset] = byte(p.RaceUnknown)
	offset++
	for i := 0; i < 3; i++ {
		dest[offset] = p.Unknown8[i]
		offset++
	}
	dest[offset] = byte(p.Unknown9)
	offset++
	dest[offset] = byte(p.Unknown10)
	offset++
	if p.Unknown10 != 0 {
	dest[offset] = byte(p.NumClassItems)
	offset++
	}
	if p.Unknown10 != 0 {
	for _, elem := range p.ClassItems {
		dest[offset] = elem.ClassId
		offset++
		dest[offset] = elem.NumItems
		offset++
		for _, nestedElem := range elem.StartingItems {
			binary.LittleEndian.PutUint16(dest[offset:], nestedElem.ModelId)
			offset += 2
			dest[offset] = nestedElem.SlotId
			offset++
			dest[offset] = nestedElem.UseColor
			offset++
			dest[offset] = nestedElem.UseHighlightColor
			offset++
			dest[offset] = nestedElem.ModelColor.R
			dest[offset+1] = nestedElem.ModelColor.G
			dest[offset+2] = nestedElem.ModelColor.B
			offset += 3
			dest[offset] = nestedElem.ModelHighlightColor.R
			dest[offset+1] = nestedElem.ModelHighlightColor.G
			dest[offset+2] = nestedElem.ModelHighlightColor.B
			offset += 3
		}
	}
	}
	dest[offset] = byte(p.UnknownArray2Size)
	offset++
	for _, elem := range p.UnknownArray2 {
		binary.LittleEndian.PutUint32(dest[offset:], elem.Array2Unknown)
		offset += 4
	}
	binary.LittleEndian.PutUint32(dest[offset:], uint32(p.Unknown11))
	offset += 4
	binary.LittleEndian.PutUint32(dest[offset:], uint32(p.SubLevel))
	offset += 4
	binary.LittleEndian.PutUint32(dest[offset:], uint32(p.RaceFlag))
	offset += 4
	binary.LittleEndian.PutUint32(dest[offset:], uint32(p.ClassFlag))
	offset += 4
	binary.LittleEndian.PutUint16(dest[offset:], uint16(len(p.Password)))
	offset += 2
	copy(dest[offset:], []byte(p.Password))
	offset += uint32(len(p.Password))
	binary.LittleEndian.PutUint16(dest[offset:], uint16(len(p.Username)))
	offset += 2
	copy(dest[offset:], []byte(p.Username))
	offset += uint32(len(p.Username))
	return offset
}

// Size returns the serialized size of the packet
func (p *LSLoginReplyMsgV1096) Size() uint32 {
	size := uint32(0)
	size += 1
	size += 2 + uint32(len(p.Unknown))
	size += 1
	size += 4
	size += uint32(8)
	size += 4
	size += 2 + uint32(len(p.Unknown3))
	size += 1
	size += 1
	size += 1
	size += 2
	size += uint32(5)
	size += 4
	size += 1
	size += uint32(3)
	size += 1
	size += 1
	if p.Unknown10 != 0 {
	size += 1
	}
	if p.Unknown10 != 0 {
	for _, elem := range p.ClassItems {
		_ = elem
		size += 1
		size += 1
		for _, nestedElem := range elem.StartingItems {
			_ = nestedElem
			size += 2
			size += 1
			size += 1
			size += 1
			size += 3
			size += 3

		}

	}
	}
	size += 1
	for _, elem := range p.UnknownArray2 {
		_ = elem
		size += 4

	}
	size += 4
	size += 4
	size += 4
	size += 4
	size += 2 + uint32(len(p.Password))
	size += 2 + uint32(len(p.Username))
	return size
}

// LSLoginReplyMsgV1142 represents packet structure for OP_LoginReplyMsg
type LSLoginReplyMsgV1142 struct {
	LoginResponse uint8 `eq2:"login_response"`
	Unknown string `eq2:"unknown,type:str16"`  // TODO: Identify purpose
	ParentalControlFlag uint8 `eq2:"parental_control_flag"`
	ParentalControlTimer uint32 `eq2:"parental_control_timer"`
	Unknown2 [8]uint8 `eq2:"unknown2,size:8"`  // TODO: Identify purpose
	AccountId uint32 `eq2:"account_id"`
	Unknown3 string `eq2:"unknown3,type:str16"`  // TODO: Identify purpose
	ResetAppearance uint8 `eq2:"reset_appearance"`
	DoNotForceSoga uint8 `eq2:"do_not_force_soga"`
	Unknown4 uint8 `eq2:"unknown4"`  // TODO: Identify purpose
	Unknown5 uint16 `eq2:"unknown5"`  // TODO: Identify purpose
	Unknown6 [5]uint8 `eq2:"unknown6,size:5"`  // TODO: Identify purpose
	Unknown7 uint32 `eq2:"unknown7"`  // TODO: Identify purpose
	Unknown7a uint32 `eq2:"unknown7a"`  // TODO: Identify purpose
	RaceUnknown uint8 `eq2:"race_unknown"`
	Unknown8 [3]uint8 `eq2:"unknown8,size:3"`  // TODO: Identify purpose
	Unknown9 uint8 `eq2:"unknown9"`  // TODO: Identify purpose
	Unknown10 uint8 `eq2:"unknown10"`  // TODO: Identify purpose
	NumClassItems uint8 `eq2:"num_class_items,ifSet:unknown10"`
	ClassItems []struct {
		ClassId uint8 `eq2:"class_id"`
		NumItems uint8 `eq2:"num_items"`
		StartingItems []struct {
		ModelId uint16 `eq2:"model_id"`
		SlotId uint8 `eq2:"slot_id"`
		UseColor uint8 `eq2:"use_color"`
		UseHighlightColor uint8 `eq2:"use_highlight_color"`
		ModelColor types.Color `eq2:"model_color"`
		ModelHighlightColor types.Color `eq2:"model_highlight_color"`
	} `eq2:"starting_items"`
	} `eq2:"class_items,sizeVar:num_class_items,ifSet:unknown10"`
	UnknownArray2Size uint8 `eq2:"unknown_array2_size"`  // TODO: Identify purpose
	UnknownArray2 []struct {
		Array2Unknown uint32 `eq2:"array2_unknown"`
	} `eq2:"unknown_array2,sizeVar:unknown_array2_size"`
	Unknown11 uint32 `eq2:"unknown11"`  // TODO: Identify purpose
	SubLevel uint32 `eq2:"sub_level"`
	RaceFlag uint32 `eq2:"race_flag"`
	ClassFlag uint32 `eq2:"class_flag"`
	Password string `eq2:"password,type:str16"`
	Username string `eq2:"username,type:str16"`
}

// Serialize writes the packet data to the provided buffer
func (p *LSLoginReplyMsgV1142) Serialize(dest []byte) uint32 {
	offset := uint32(0)
	dest[offset] = byte(p.LoginResponse)
	offset++
	binary.LittleEndian.PutUint16(dest[offset:], uint16(len(p.Unknown)))
	offset += 2
	copy(dest[offset:], []byte(p.Unknown))
	offset += uint32(len(p.Unknown))
	dest[offset] = byte(p.ParentalControlFlag)
	offset++
	binary.LittleEndian.PutUint32(dest[offset:], uint32(p.ParentalControlTimer))
	offset += 4
	for i := 0; i < 8; i++ {
		dest[offset] = p.Unknown2[i]
		offset++
	}
	binary.LittleEndian.PutUint32(dest[offset:], uint32(p.AccountId))
	offset += 4
	binary.LittleEndian.PutUint16(dest[offset:], uint16(len(p.Unknown3)))
	offset += 2
	copy(dest[offset:], []byte(p.Unknown3))
	offset += uint32(len(p.Unknown3))
	dest[offset] = byte(p.ResetAppearance)
	offset++
	dest[offset] = byte(p.DoNotForceSoga)
	offset++
	dest[offset] = byte(p.Unknown4)
	offset++
	binary.LittleEndian.PutUint16(dest[offset:], uint16(p.Unknown5))
	offset += 2
	for i := 0; i < 5; i++ {
		dest[offset] = p.Unknown6[i]
		offset++
	}
	binary.LittleEndian.PutUint32(dest[offset:], uint32(p.Unknown7))
	offset += 4
	binary.LittleEndian.PutUint32(dest[offset:], uint32(p.Unknown7a))
	offset += 4
	dest[offset] = byte(p.RaceUnknown)
	offset++
	for i := 0; i < 3; i++ {
		dest[offset] = p.Unknown8[i]
		offset++
	}
	dest[offset] = byte(p.Unknown9)
	offset++
	dest[offset] = byte(p.Unknown10)
	offset++
	if p.Unknown10 != 0 {
	dest[offset] = byte(p.NumClassItems)
	offset++
	}
	if p.Unknown10 != 0 {
	for _, elem := range p.ClassItems {
		dest[offset] = elem.ClassId
		offset++
		dest[offset] = elem.NumItems
		offset++
		for _, nestedElem := range elem.StartingItems {
			binary.LittleEndian.PutUint16(dest[offset:], nestedElem.ModelId)
			offset += 2
			dest[offset] = nestedElem.SlotId
			offset++
			dest[offset] = nestedElem.UseColor
			offset++
			dest[offset] = nestedElem.UseHighlightColor
			offset++
			dest[offset] = nestedElem.ModelColor.R
			dest[offset+1] = nestedElem.ModelColor.G
			dest[offset+2] = nestedElem.ModelColor.B
			offset += 3
			dest[offset] = nestedElem.ModelHighlightColor.R
			dest[offset+1] = nestedElem.ModelHighlightColor.G
			dest[offset+2] = nestedElem.ModelHighlightColor.B
			offset += 3
		}
	}
	}
	dest[offset] = byte(p.UnknownArray2Size)
	offset++
	for _, elem := range p.UnknownArray2 {
		binary.LittleEndian.PutUint32(dest[offset:], elem.Array2Unknown)
		offset += 4
	}
	binary.LittleEndian.PutUint32(dest[offset:], uint32(p.Unknown11))
	offset += 4
	binary.LittleEndian.PutUint32(dest[offset:], uint32(p.SubLevel))
	offset += 4
	binary.LittleEndian.PutUint32(dest[offset:], uint32(p.RaceFlag))
	offset += 4
	binary.LittleEndian.PutUint32(dest[offset:], uint32(p.ClassFlag))
	offset += 4
	binary.LittleEndian.PutUint16(dest[offset:], uint16(len(p.Password)))
	offset += 2
	copy(dest[offset:], []byte(p.Password))
	offset += uint32(len(p.Password))
	binary.LittleEndian.PutUint16(dest[offset:], uint16(len(p.Username)))
	offset += 2
	copy(dest[offset:], []byte(p.Username))
	offset += uint32(len(p.Username))
	return offset
}

// Size returns the serialized size of the packet
func (p *LSLoginReplyMsgV1142) Size() uint32 {
	size := uint32(0)
	size += 1
	size += 2 + uint32(len(p.Unknown))
	size += 1
	size += 4
	size += uint32(8)
	size += 4
	size += 2 + uint32(len(p.Unknown3))
	size += 1
	size += 1
	size += 1
	size += 2
	size += uint32(5)
	size += 4
	size += 4
	size += 1
	size += uint32(3)
	size += 1
	size += 1
	if p.Unknown10 != 0 {
	size += 1
	}
	if p.Unknown10 != 0 {
	for _, elem := range p.ClassItems {
		_ = elem
		size += 1
		size += 1
		for _, nestedElem := range elem.StartingItems {
			_ = nestedElem
			size += 2
			size += 1
			size += 1
			size += 1
			size += 3
			size += 3

		}

	}
	}
	size += 1
	for _, elem := range p.UnknownArray2 {
		_ = elem
		size += 4

	}
	size += 4
	size += 4
	size += 4
	size += 4
	size += 2 + uint32(len(p.Password))
	size += 2 + uint32(len(p.Username))
	return size
}

// LSLoginReplyMsgV1188 represents packet structure for OP_LoginReplyMsg
type LSLoginReplyMsgV1188 struct {
	LoginResponse uint8 `eq2:"login_response"`
	Unknown string `eq2:"unknown,type:str16"`  // TODO: Identify purpose
	ParentalControlFlag uint8 `eq2:"parental_control_flag"`
	ParentalControlTimer uint32 `eq2:"parental_control_timer"`
	Unknown2 [8]uint8 `eq2:"unknown2,size:8"`  // TODO: Identify purpose
	AccountId uint32 `eq2:"account_id"`
	Unknown3 string `eq2:"unknown3,type:str16"`  // TODO: Identify purpose
	ResetAppearance uint8 `eq2:"reset_appearance"`
	DoNotForceSoga uint8 `eq2:"do_not_force_soga"`
	Unknown4 uint8 `eq2:"unknown4"`  // TODO: Identify purpose
	Unknown5 uint16 `eq2:"unknown5"`  // TODO: Identify purpose
	Unknown6 [5]uint8 `eq2:"unknown6,size:5"`  // TODO: Identify purpose
	Unknown7 uint32 `eq2:"unknown7"`  // TODO: Identify purpose
	Unknown7a uint32 `eq2:"unknown7a"`  // TODO: Identify purpose
	RaceUnknown uint8 `eq2:"race_unknown"`
	Unknown8 [3]uint8 `eq2:"unknown8,size:3"`  // TODO: Identify purpose
	Unknown9 uint8 `eq2:"unknown9"`  // TODO: Identify purpose
	Unknown10 uint8 `eq2:"unknown10"`  // TODO: Identify purpose
	NumClassItems uint8 `eq2:"num_class_items,ifSet:unknown10"`
	ClassItems []struct {
		ClassId uint8 `eq2:"class_id"`
		NumItems uint8 `eq2:"num_items"`
		StartingItems []struct {
		ModelId uint16 `eq2:"model_id"`
		SlotId uint8 `eq2:"slot_id"`
		UseColor uint8 `eq2:"use_color"`
		UseHighlightColor uint8 `eq2:"use_highlight_color"`
		ModelColor types.Color `eq2:"model_color"`
		ModelHighlightColor types.Color `eq2:"model_highlight_color"`
	} `eq2:"starting_items"`
	} `eq2:"class_items,sizeVar:num_class_items,ifSet:unknown10"`
	UnknownArray2Size uint8 `eq2:"unknown_array2_size"`  // TODO: Identify purpose
	UnknownArray2 []struct {
		Array2Unknown uint32 `eq2:"array2_unknown"`
	} `eq2:"unknown_array2,sizeVar:unknown_array2_size"`
	Unknown11 uint32 `eq2:"unknown11"`  // TODO: Identify purpose
	SubLevel uint32 `eq2:"sub_level"`
	RaceFlag uint32 `eq2:"race_flag"`
	ClassFlag uint32 `eq2:"class_flag"`
	Password string `eq2:"password,type:str16"`
	Username string `eq2:"username,type:str16"`
	Unknown12 string `eq2:"unknown12,type:str16"`  // TODO: Identify purpose
}

// Serialize writes the packet data to the provided buffer
func (p *LSLoginReplyMsgV1188) Serialize(dest []byte) uint32 {
	offset := uint32(0)
	dest[offset] = byte(p.LoginResponse)
	offset++
	binary.LittleEndian.PutUint16(dest[offset:], uint16(len(p.Unknown)))
	offset += 2
	copy(dest[offset:], []byte(p.Unknown))
	offset += uint32(len(p.Unknown))
	dest[offset] = byte(p.ParentalControlFlag)
	offset++
	binary.LittleEndian.PutUint32(dest[offset:], uint32(p.ParentalControlTimer))
	offset += 4
	for i := 0; i < 8; i++ {
		dest[offset] = p.Unknown2[i]
		offset++
	}
	binary.LittleEndian.PutUint32(dest[offset:], uint32(p.AccountId))
	offset += 4
	binary.LittleEndian.PutUint16(dest[offset:], uint16(len(p.Unknown3)))
	offset += 2
	copy(dest[offset:], []byte(p.Unknown3))
	offset += uint32(len(p.Unknown3))
	dest[offset] = byte(p.ResetAppearance)
	offset++
	dest[offset] = byte(p.DoNotForceSoga)
	offset++
	dest[offset] = byte(p.Unknown4)
	offset++
	binary.LittleEndian.PutUint16(dest[offset:], uint16(p.Unknown5))
	offset += 2
	for i := 0; i < 5; i++ {
		dest[offset] = p.Unknown6[i]
		offset++
	}
	binary.LittleEndian.PutUint32(dest[offset:], uint32(p.Unknown7))
	offset += 4
	binary.LittleEndian.PutUint32(dest[offset:], uint32(p.Unknown7a))
	offset += 4
	dest[offset] = byte(p.RaceUnknown)
	offset++
	for i := 0; i < 3; i++ {
		dest[offset] = p.Unknown8[i]
		offset++
	}
	dest[offset] = byte(p.Unknown9)
	offset++
	dest[offset] = byte(p.Unknown10)
	offset++
	if p.Unknown10 != 0 {
	dest[offset] = byte(p.NumClassItems)
	offset++
	}
	if p.Unknown10 != 0 {
	for _, elem := range p.ClassItems {
		dest[offset] = elem.ClassId
		offset++
		dest[offset] = elem.NumItems
		offset++
		for _, nestedElem := range elem.StartingItems {
			binary.LittleEndian.PutUint16(dest[offset:], nestedElem.ModelId)
			offset += 2
			dest[offset] = nestedElem.SlotId
			offset++
			dest[offset] = nestedElem.UseColor
			offset++
			dest[offset] = nestedElem.UseHighlightColor
			offset++
			dest[offset] = nestedElem.ModelColor.R
			dest[offset+1] = nestedElem.ModelColor.G
			dest[offset+2] = nestedElem.ModelColor.B
			offset += 3
			dest[offset] = nestedElem.ModelHighlightColor.R
			dest[offset+1] = nestedElem.ModelHighlightColor.G
			dest[offset+2] = nestedElem.ModelHighlightColor.B
			offset += 3
		}
	}
	}
	dest[offset] = byte(p.UnknownArray2Size)
	offset++
	for _, elem := range p.UnknownArray2 {
		binary.LittleEndian.PutUint32(dest[offset:], elem.Array2Unknown)
		offset += 4
	}
	binary.LittleEndian.PutUint32(dest[offset:], uint32(p.Unknown11))
	offset += 4
	binary.LittleEndian.PutUint32(dest[offset:], uint32(p.SubLevel))
	offset += 4
	binary.LittleEndian.PutUint32(dest[offset:], uint32(p.RaceFlag))
	offset += 4
	binary.LittleEndian.PutUint32(dest[offset:], uint32(p.ClassFlag))
	offset += 4
	binary.LittleEndian.PutUint16(dest[offset:], uint16(len(p.Password)))
	offset += 2
	copy(dest[offset:], []byte(p.Password))
	offset += uint32(len(p.Password))
	binary.LittleEndian.PutUint16(dest[offset:], uint16(len(p.Username)))
	offset += 2
	copy(dest[offset:], []byte(p.Username))
	offset += uint32(len(p.Username))
	binary.LittleEndian.PutUint16(dest[offset:], uint16(len(p.Unknown12)))
	offset += 2
	copy(dest[offset:], []byte(p.Unknown12))
	offset += uint32(len(p.Unknown12))
	return offset
}

// Size returns the serialized size of the packet
func (p *LSLoginReplyMsgV1188) Size() uint32 {
	size := uint32(0)
	size += 1
	size += 2 + uint32(len(p.Unknown))
	size += 1
	size += 4
	size += uint32(8)
	size += 4
	size += 2 + uint32(len(p.Unknown3))
	size += 1
	size += 1
	size += 1
	size += 2
	size += uint32(5)
	size += 4
	size += 4
	size += 1
	size += uint32(3)
	size += 1
	size += 1
	if p.Unknown10 != 0 {
	size += 1
	}
	if p.Unknown10 != 0 {
	for _, elem := range p.ClassItems {
		_ = elem
		size += 1
		size += 1
		for _, nestedElem := range elem.StartingItems {
			_ = nestedElem
			size += 2
			size += 1
			size += 1
			size += 1
			size += 3
			size += 3

		}

	}
	}
	size += 1
	for _, elem := range p.UnknownArray2 {
		_ = elem
		size += 4

	}
	size += 4
	size += 4
	size += 4
	size += 4
	size += 2 + uint32(len(p.Password))
	size += 2 + uint32(len(p.Username))
	size += 2 + uint32(len(p.Unknown12))
	return size
}

// LSLoginReplyMsgV57080 represents packet structure for OP_LoginReplyMsg
type LSLoginReplyMsgV57080 struct {
	LoginResponse uint8 `eq2:"login_response"`
	Unknown string `eq2:"unknown,type:str16"`  // TODO: Identify purpose
	ParentalControlFlag uint8 `eq2:"parental_control_flag"`
	ParentalControlTimer uint32 `eq2:"parental_control_timer"`
	Unknown2 [8]uint8 `eq2:"unknown2,size:8"`  // TODO: Identify purpose
	AccountId uint32 `eq2:"account_id"`
	Unknown3 string `eq2:"unknown3,type:str16"`  // TODO: Identify purpose
	ResetAppearance uint8 `eq2:"reset_appearance"`
	DoNotForceSoga uint8 `eq2:"do_not_force_soga"`
	Unknown4 uint8 `eq2:"unknown4"`  // TODO: Identify purpose
	Unknown5 uint16 `eq2:"unknown5"`  // TODO: Identify purpose
	Unknown6 [5]uint8 `eq2:"unknown6,size:5"`  // TODO: Identify purpose
	Unknown7 uint32 `eq2:"unknown7"`  // TODO: Identify purpose
	Unknown7a uint32 `eq2:"unknown7a"`  // TODO: Identify purpose
	RaceUnknown uint8 `eq2:"race_unknown"`
	Unknown8 [3]uint8 `eq2:"unknown8,size:3"`  // TODO: Identify purpose
	Unknown9 uint8 `eq2:"unknown9"`  // TODO: Identify purpose
	Unknown10 uint8 `eq2:"unknown10"`  // TODO: Identify purpose
	NumClassItems uint8 `eq2:"num_class_items,ifSet:unknown10"`
	ClassItems []struct {
		ClassId uint8 `eq2:"class_id"`
		NumItems uint8 `eq2:"num_items"`
		StartingItems []struct {
		ModelId uint32 `eq2:"model_id"`
		SlotId uint8 `eq2:"slot_id"`
		UseColor uint8 `eq2:"use_color"`
		UseHighlightColor uint8 `eq2:"use_highlight_color"`
		ModelColor types.Color `eq2:"model_color"`
		ModelHighlightColor types.Color `eq2:"model_highlight_color"`
	} `eq2:"starting_items"`
	} `eq2:"class_items,sizeVar:num_class_items,ifSet:unknown10"`
	UnknownArray2Size uint8 `eq2:"unknown_array2_size"`  // TODO: Identify purpose
	UnknownArray2 []struct {
		Array2Unknown uint32 `eq2:"array2_unknown"`
	} `eq2:"unknown_array2,sizeVar:unknown_array2_size"`
	Unknown11 uint32 `eq2:"unknown11"`  // TODO: Identify purpose
	SubLevel uint32 `eq2:"sub_level"`
	RaceFlag uint32 `eq2:"race_flag"`
	ClassFlag uint32 `eq2:"class_flag"`
	Password string `eq2:"password,type:str16"`
	Username string `eq2:"username,type:str16"`
	Service string `eq2:"service,type:str16"`
	Web1 string `eq2:"web1,type:str16"`
	Web2 string `eq2:"web2,type:str16"`
	Web3 string `eq2:"web3,type:str16"`
	Web4 string `eq2:"web4,type:str16"`
	Web5 string `eq2:"web5,type:str16"`
	Web6 string `eq2:"web6,type:str16"`
	Web7 string `eq2:"web7,type:str16"`
	Web8 string `eq2:"web8,type:str16"`
	Web9 string `eq2:"web9,type:str16"`
	Unknown12 uint8 `eq2:"unknown12"`  // TODO: Identify purpose
	Lvl90NumClassItems uint8 `eq2:"lvl90_num_class_items,ifSet:unknown10"`
	Lvl90ClassItems []struct {
		ClassId uint8 `eq2:"class_id"`
		NumItems uint8 `eq2:"num_items"`
		StartingItems []struct {
		ModelId uint32 `eq2:"model_id"`
		SlotId uint8 `eq2:"slot_id"`
		UseColor uint8 `eq2:"use_color"`
		UseHighlightColor uint8 `eq2:"use_highlight_color"`
		ModelColor types.Color `eq2:"model_color"`
		ModelHighlightColor types.Color `eq2:"model_highlight_color"`
	} `eq2:"starting_items"`
	} `eq2:"lvl90_class_items,sizeVar:lvl90_num_class_items,ifSet:unknown10"`
	Unknown13 [5]uint8 `eq2:"unknown13,size:5"`  // TODO: Identify purpose
}

// Serialize writes the packet data to the provided buffer
func (p *LSLoginReplyMsgV57080) Serialize(dest []byte) uint32 {
	offset := uint32(0)
	dest[offset] = byte(p.LoginResponse)
	offset++
	binary.LittleEndian.PutUint16(dest[offset:], uint16(len(p.Unknown)))
	offset += 2
	copy(dest[offset:], []byte(p.Unknown))
	offset += uint32(len(p.Unknown))
	dest[offset] = byte(p.ParentalControlFlag)
	offset++
	binary.LittleEndian.PutUint32(dest[offset:], uint32(p.ParentalControlTimer))
	offset += 4
	for i := 0; i < 8; i++ {
		dest[offset] = p.Unknown2[i]
		offset++
	}
	binary.LittleEndian.PutUint32(dest[offset:], uint32(p.AccountId))
	offset += 4
	binary.LittleEndian.PutUint16(dest[offset:], uint16(len(p.Unknown3)))
	offset += 2
	copy(dest[offset:], []byte(p.Unknown3))
	offset += uint32(len(p.Unknown3))
	dest[offset] = byte(p.ResetAppearance)
	offset++
	dest[offset] = byte(p.DoNotForceSoga)
	offset++
	dest[offset] = byte(p.Unknown4)
	offset++
	binary.LittleEndian.PutUint16(dest[offset:], uint16(p.Unknown5))
	offset += 2
	for i := 0; i < 5; i++ {
		dest[offset] = p.Unknown6[i]
		offset++
	}
	binary.LittleEndian.PutUint32(dest[offset:], uint32(p.Unknown7))
	offset += 4
	binary.LittleEndian.PutUint32(dest[offset:], uint32(p.Unknown7a))
	offset += 4
	dest[offset] = byte(p.RaceUnknown)
	offset++
	for i := 0; i < 3; i++ {
		dest[offset] = p.Unknown8[i]
		offset++
	}
	dest[offset] = byte(p.Unknown9)
	offset++
	dest[offset] = byte(p.Unknown10)
	offset++
	if p.Unknown10 != 0 {
	dest[offset] = byte(p.NumClassItems)
	offset++
	}
	if p.Unknown10 != 0 {
	for _, elem := range p.ClassItems {
		dest[offset] = elem.ClassId
		offset++
		dest[offset] = elem.NumItems
		offset++
		for _, nestedElem := range elem.StartingItems {
			binary.LittleEndian.PutUint32(dest[offset:], nestedElem.ModelId)
			offset += 4
			dest[offset] = nestedElem.SlotId
			offset++
			dest[offset] = nestedElem.UseColor
			offset++
			dest[offset] = nestedElem.UseHighlightColor
			offset++
			dest[offset] = nestedElem.ModelColor.R
			dest[offset+1] = nestedElem.ModelColor.G
			dest[offset+2] = nestedElem.ModelColor.B
			offset += 3
			dest[offset] = nestedElem.ModelHighlightColor.R
			dest[offset+1] = nestedElem.ModelHighlightColor.G
			dest[offset+2] = nestedElem.ModelHighlightColor.B
			offset += 3
		}
	}
	}
	dest[offset] = byte(p.UnknownArray2Size)
	offset++
	for _, elem := range p.UnknownArray2 {
		binary.LittleEndian.PutUint32(dest[offset:], elem.Array2Unknown)
		offset += 4
	}
	binary.LittleEndian.PutUint32(dest[offset:], uint32(p.Unknown11))
	offset += 4
	binary.LittleEndian.PutUint32(dest[offset:], uint32(p.SubLevel))
	offset += 4
	binary.LittleEndian.PutUint32(dest[offset:], uint32(p.RaceFlag))
	offset += 4
	binary.LittleEndian.PutUint32(dest[offset:], uint32(p.ClassFlag))
	offset += 4
	binary.LittleEndian.PutUint16(dest[offset:], uint16(len(p.Password)))
	offset += 2
	copy(dest[offset:], []byte(p.Password))
	offset += uint32(len(p.Password))
	binary.LittleEndian.PutUint16(dest[offset:], uint16(len(p.Username)))
	offset += 2
	copy(dest[offset:], []byte(p.Username))
	offset += uint32(len(p.Username))
	binary.LittleEndian.PutUint16(dest[offset:], uint16(len(p.Service)))
	offset += 2
	copy(dest[offset:], []byte(p.Service))
	offset += uint32(len(p.Service))
	binary.LittleEndian.PutUint16(dest[offset:], uint16(len(p.Web1)))
	offset += 2
	copy(dest[offset:], []byte(p.Web1))
	offset += uint32(len(p.Web1))
	binary.LittleEndian.PutUint16(dest[offset:], uint16(len(p.Web2)))
	offset += 2
	copy(dest[offset:], []byte(p.Web2))
	offset += uint32(len(p.Web2))
	binary.LittleEndian.PutUint16(dest[offset:], uint16(len(p.Web3)))
	offset += 2
	copy(dest[offset:], []byte(p.Web3))
	offset += uint32(len(p.Web3))
	binary.LittleEndian.PutUint16(dest[offset:], uint16(len(p.Web4)))
	offset += 2
	copy(dest[offset:], []byte(p.Web4))
	offset += uint32(len(p.Web4))
	binary.LittleEndian.PutUint16(dest[offset:], uint16(len(p.Web5)))
	offset += 2
	copy(dest[offset:], []byte(p.Web5))
	offset += uint32(len(p.Web5))
	binary.LittleEndian.PutUint16(dest[offset:], uint16(len(p.Web6)))
	offset += 2
	copy(dest[offset:], []byte(p.Web6))
	offset += uint32(len(p.Web6))
	binary.LittleEndian.PutUint16(dest[offset:], uint16(len(p.Web7)))
	offset += 2
	copy(dest[offset:], []byte(p.Web7))
	offset += uint32(len(p.Web7))
	binary.LittleEndian.PutUint16(dest[offset:], uint16(len(p.Web8)))
	offset += 2
	copy(dest[offset:], []byte(p.Web8))
	offset += uint32(len(p.Web8))
	binary.LittleEndian.PutUint16(dest[offset:], uint16(len(p.Web9)))
	offset += 2
	copy(dest[offset:], []byte(p.Web9))
	offset += uint32(len(p.Web9))
	dest[offset] = byte(p.Unknown12)
	offset++
	if p.Unknown10 != 0 {
	dest[offset] = byte(p.Lvl90NumClassItems)
	offset++
	}
	if p.Unknown10 != 0 {
	for _, elem := range p.Lvl90ClassItems {
		dest[offset] = elem.ClassId
		offset++
		dest[offset] = elem.NumItems
		offset++
		for _, nestedElem := range elem.StartingItems {
			binary.LittleEndian.PutUint32(dest[offset:], nestedElem.ModelId)
			offset += 4
			dest[offset] = nestedElem.SlotId
			offset++
			dest[offset] = nestedElem.UseColor
			offset++
			dest[offset] = nestedElem.UseHighlightColor
			offset++
			dest[offset] = nestedElem.ModelColor.R
			dest[offset+1] = nestedElem.ModelColor.G
			dest[offset+2] = nestedElem.ModelColor.B
			offset += 3
			dest[offset] = nestedElem.ModelHighlightColor.R
			dest[offset+1] = nestedElem.ModelHighlightColor.G
			dest[offset+2] = nestedElem.ModelHighlightColor.B
			offset += 3
		}
	}
	}
	for i := 0; i < 5; i++ {
		dest[offset] = p.Unknown13[i]
		offset++
	}
	return offset
}

// Size returns the serialized size of the packet
func (p *LSLoginReplyMsgV57080) Size() uint32 {
	size := uint32(0)
	size += 1
	size += 2 + uint32(len(p.Unknown))
	size += 1
	size += 4
	size += uint32(8)
	size += 4
	size += 2 + uint32(len(p.Unknown3))
	size += 1
	size += 1
	size += 1
	size += 2
	size += uint32(5)
	size += 4
	size += 4
	size += 1
	size += uint32(3)
	size += 1
	size += 1
	if p.Unknown10 != 0 {
	size += 1
	}
	if p.Unknown10 != 0 {
	for _, elem := range p.ClassItems {
		_ = elem
		size += 1
		size += 1
		for _, nestedElem := range elem.StartingItems {
			_ = nestedElem
			size += 4
			size += 1
			size += 1
			size += 1
			size += 3
			size += 3

		}

	}
	}
	size += 1
	for _, elem := range p.UnknownArray2 {
		_ = elem
		size += 4

	}
	size += 4
	size += 4
	size += 4
	size += 4
	size += 2 + uint32(len(p.Password))
	size += 2 + uint32(len(p.Username))
	size += 2 + uint32(len(p.Service))
	size += 2 + uint32(len(p.Web1))
	size += 2 + uint32(len(p.Web2))
	size += 2 + uint32(len(p.Web3))
	size += 2 + uint32(len(p.Web4))
	size += 2 + uint32(len(p.Web5))
	size += 2 + uint32(len(p.Web6))
	size += 2 + uint32(len(p.Web7))
	size += 2 + uint32(len(p.Web8))
	size += 2 + uint32(len(p.Web9))
	size += 1
	if p.Unknown10 != 0 {
	size += 1
	}
	if p.Unknown10 != 0 {
	for _, elem := range p.Lvl90ClassItems {
		_ = elem
		size += 1
		size += 1
		for _, nestedElem := range elem.StartingItems {
			_ = nestedElem
			size += 4
			size += 1
			size += 1
			size += 1
			size += 3
			size += 3

		}

	}
	}
	size += uint32(5)
	return size
}

// LSLoginReplyMsgV60100 represents packet structure for OP_LoginReplyMsg
type LSLoginReplyMsgV60100 struct {
	LoginResponse uint8 `eq2:"login_response"`
	Unknown string `eq2:"unknown,type:str16"`  // TODO: Identify purpose
	ParentalControlFlag uint8 `eq2:"parental_control_flag"`
	ParentalControlTimer uint32 `eq2:"parental_control_timer"`
	Unknown2 [8]uint8 `eq2:"unknown2,size:8"`  // TODO: Identify purpose
	AccountId uint32 `eq2:"account_id"`
	Unknown3 string `eq2:"unknown3,type:str16"`  // TODO: Identify purpose
	ResetAppearance uint8 `eq2:"reset_appearance"`
	DoNotForceSoga uint8 `eq2:"do_not_force_soga"`
	Unknown5 int64 `eq2:"unknown5"`  // TODO: Identify purpose
	Unknown7 uint32 `eq2:"unknown7"`  // TODO: Identify purpose
	Unknown7a uint16 `eq2:"unknown7a"`  // TODO: Identify purpose
	RaceUnknown uint8 `eq2:"race_unknown"`
	Unknown8 [3]uint8 `eq2:"unknown8,size:3"`  // TODO: Identify purpose
	Unknown9 [3]uint8 `eq2:"unknown9,size:3"`  // TODO: Identify purpose
	Unknown10 uint8 `eq2:"unknown10"`  // TODO: Identify purpose
	NumClassItems uint8 `eq2:"num_class_items,ifSet:unknown10"`
	ClassItems []struct {
		ClassId uint8 `eq2:"class_id"`
		NumItems uint8 `eq2:"num_items"`
		StartingItems []struct {
		ModelId uint32 `eq2:"model_id"`
		SlotId uint8 `eq2:"slot_id"`
		UseColor uint8 `eq2:"use_color"`
		UseHighlightColor uint8 `eq2:"use_highlight_color"`
		ModelColor types.Color `eq2:"model_color"`
		ModelHighlightColor types.Color `eq2:"model_highlight_color"`
	} `eq2:"starting_items"`
	} `eq2:"class_items,sizeVar:num_class_items,ifSet:unknown10"`
	UnknownArray2Size uint8 `eq2:"unknown_array2_size"`  // TODO: Identify purpose
	UnknownArray2 []struct {
		Array2Unknown uint32 `eq2:"array2_unknown"`
	} `eq2:"unknown_array2,sizeVar:unknown_array2_size"`
	Unknown11 uint32 `eq2:"unknown11"`  // TODO: Identify purpose
	SubLevel uint32 `eq2:"sub_level"`
	RaceFlag uint32 `eq2:"race_flag"`
	ClassFlag uint32 `eq2:"class_flag"`
	Password string `eq2:"password,type:str16"`
	Username string `eq2:"username,type:str16"`
	Service string `eq2:"service,type:str16"`
	Unknown12 uint8 `eq2:"unknown12"`  // TODO: Identify purpose
	Lvl90NumClassItems uint8 `eq2:"lvl90_num_class_items,ifSet:unknown12"`
	Lvl90ClassItems []struct {
		ClassId uint8 `eq2:"class_id"`
		NumItems uint8 `eq2:"num_items"`
		StartingItems []struct {
		ModelId uint32 `eq2:"model_id"`
		SlotId uint8 `eq2:"slot_id"`
		UseColor uint8 `eq2:"use_color"`
		UseHighlightColor uint8 `eq2:"use_highlight_color"`
		ModelColor types.Color `eq2:"model_color"`
		ModelHighlightColor types.Color `eq2:"model_highlight_color"`
	} `eq2:"starting_items"`
	} `eq2:"lvl90_class_items,sizeVar:lvl90_num_class_items,ifSet:unknown12"`
	Unknown13 uint8 `eq2:"unknown13"`  // TODO: Identify purpose
	TimeLockedNumClassItems uint8 `eq2:"time_locked_num_class_items,ifSet:unknown13"`
	TimeLockedClassItems []struct {
		ClassId uint8 `eq2:"class_id"`
		NumItems uint8 `eq2:"num_items"`
		StartingItems []struct {
		ModelId uint32 `eq2:"model_id"`
		SlotId uint8 `eq2:"slot_id"`
		UseColor uint8 `eq2:"use_color"`
		UseHighlightColor uint8 `eq2:"use_highlight_color"`
		ModelColor types.Color `eq2:"model_color"`
		ModelHighlightColor types.Color `eq2:"model_highlight_color"`
	} `eq2:"starting_items"`
	} `eq2:"time_locked_class_items,sizeVar:time_locked_num_class_items,ifSet:unknown13"`
	Unknown14 [13]uint8 `eq2:"unknown14,size:13"`  // TODO: Identify purpose
}

// Serialize writes the packet data to the provided buffer
func (p *LSLoginReplyMsgV60100) Serialize(dest []byte) uint32 {
	offset := uint32(0)
	dest[offset] = byte(p.LoginResponse)
	offset++
	binary.LittleEndian.PutUint16(dest[offset:], uint16(len(p.Unknown)))
	offset += 2
	copy(dest[offset:], []byte(p.Unknown))
	offset += uint32(len(p.Unknown))
	dest[offset] = byte(p.ParentalControlFlag)
	offset++
	binary.LittleEndian.PutUint32(dest[offset:], uint32(p.ParentalControlTimer))
	offset += 4
	for i := 0; i < 8; i++ {
		dest[offset] = p.Unknown2[i]
		offset++
	}
	binary.LittleEndian.PutUint32(dest[offset:], uint32(p.AccountId))
	offset += 4
	binary.LittleEndian.PutUint16(dest[offset:], uint16(len(p.Unknown3)))
	offset += 2
	copy(dest[offset:], []byte(p.Unknown3))
	offset += uint32(len(p.Unknown3))
	dest[offset] = byte(p.ResetAppearance)
	offset++
	dest[offset] = byte(p.DoNotForceSoga)
	offset++
	binary.LittleEndian.PutUint64(dest[offset:], uint64(p.Unknown5))
	offset += 8
	binary.LittleEndian.PutUint32(dest[offset:], uint32(p.Unknown7))
	offset += 4
	binary.LittleEndian.PutUint16(dest[offset:], uint16(p.Unknown7a))
	offset += 2
	dest[offset] = byte(p.RaceUnknown)
	offset++
	for i := 0; i < 3; i++ {
		dest[offset] = p.Unknown8[i]
		offset++
	}
	for i := 0; i < 3; i++ {
		dest[offset] = p.Unknown9[i]
		offset++
	}
	dest[offset] = byte(p.Unknown10)
	offset++
	if p.Unknown10 != 0 {
	dest[offset] = byte(p.NumClassItems)
	offset++
	}
	if p.Unknown10 != 0 {
	for _, elem := range p.ClassItems {
		dest[offset] = elem.ClassId
		offset++
		dest[offset] = elem.NumItems
		offset++
		for _, nestedElem := range elem.StartingItems {
			binary.LittleEndian.PutUint32(dest[offset:], nestedElem.ModelId)
			offset += 4
			dest[offset] = nestedElem.SlotId
			offset++
			dest[offset] = nestedElem.UseColor
			offset++
			dest[offset] = nestedElem.UseHighlightColor
			offset++
			dest[offset] = nestedElem.ModelColor.R
			dest[offset+1] = nestedElem.ModelColor.G
			dest[offset+2] = nestedElem.ModelColor.B
			offset += 3
			dest[offset] = nestedElem.ModelHighlightColor.R
			dest[offset+1] = nestedElem.ModelHighlightColor.G
			dest[offset+2] = nestedElem.ModelHighlightColor.B
			offset += 3
		}
	}
	}
	dest[offset] = byte(p.UnknownArray2Size)
	offset++
	for _, elem := range p.UnknownArray2 {
		binary.LittleEndian.PutUint32(dest[offset:], elem.Array2Unknown)
		offset += 4
	}
	binary.LittleEndian.PutUint32(dest[offset:], uint32(p.Unknown11))
	offset += 4
	binary.LittleEndian.PutUint32(dest[offset:], uint32(p.SubLevel))
	offset += 4
	binary.LittleEndian.PutUint32(dest[offset:], uint32(p.RaceFlag))
	offset += 4
	binary.LittleEndian.PutUint32(dest[offset:], uint32(p.ClassFlag))
	offset += 4
	binary.LittleEndian.PutUint16(dest[offset:], uint16(len(p.Password)))
	offset += 2
	copy(dest[offset:], []byte(p.Password))
	offset += uint32(len(p.Password))
	binary.LittleEndian.PutUint16(dest[offset:], uint16(len(p.Username)))
	offset += 2
	copy(dest[offset:], []byte(p.Username))
	offset += uint32(len(p.Username))
	binary.LittleEndian.PutUint16(dest[offset:], uint16(len(p.Service)))
	offset += 2
	copy(dest[offset:], []byte(p.Service))
	offset += uint32(len(p.Service))
	dest[offset] = byte(p.Unknown12)
	offset++
	if p.Unknown12 != 0 {
	dest[offset] = byte(p.Lvl90NumClassItems)
	offset++
	}
	if p.Unknown12 != 0 {
	for _, elem := range p.Lvl90ClassItems {
		dest[offset] = elem.ClassId
		offset++
		dest[offset] = elem.NumItems
		offset++
		for _, nestedElem := range elem.StartingItems {
			binary.LittleEndian.PutUint32(dest[offset:], nestedElem.ModelId)
			offset += 4
			dest[offset] = nestedElem.SlotId
			offset++
			dest[offset] = nestedElem.UseColor
			offset++
			dest[offset] = nestedElem.UseHighlightColor
			offset++
			dest[offset] = nestedElem.ModelColor.R
			dest[offset+1] = nestedElem.ModelColor.G
			dest[offset+2] = nestedElem.ModelColor.B
			offset += 3
			dest[offset] = nestedElem.ModelHighlightColor.R
			dest[offset+1] = nestedElem.ModelHighlightColor.G
			dest[offset+2] = nestedElem.ModelHighlightColor.B
			offset += 3
		}
	}
	}
	dest[offset] = byte(p.Unknown13)
	offset++
	if p.Unknown13 != 0 {
	dest[offset] = byte(p.TimeLockedNumClassItems)
	offset++
	}
	if p.Unknown13 != 0 {
	for _, elem := range p.TimeLockedClassItems {
		dest[offset] = elem.ClassId
		offset++
		dest[offset] = elem.NumItems
		offset++
		for _, nestedElem := range elem.StartingItems {
			binary.LittleEndian.PutUint32(dest[offset:], nestedElem.ModelId)
			offset += 4
			dest[offset] = nestedElem.SlotId
			offset++
			dest[offset] = nestedElem.UseColor
			offset++
			dest[offset] = nestedElem.UseHighlightColor
			offset++
			dest[offset] = nestedElem.ModelColor.R
			dest[offset+1] = nestedElem.ModelColor.G
			dest[offset+2] = nestedElem.ModelColor.B
			offset += 3
			dest[offset] = nestedElem.ModelHighlightColor.R
			dest[offset+1] = nestedElem.ModelHighlightColor.G
			dest[offset+2] = nestedElem.ModelHighlightColor.B
			offset += 3
		}
	}
	}
	for i := 0; i < 13; i++ {
		dest[offset] = p.Unknown14[i]
		offset++
	}
	return offset
}

// Size returns the serialized size of the packet
func (p *LSLoginReplyMsgV60100) Size() uint32 {
	size := uint32(0)
	size += 1
	size += 2 + uint32(len(p.Unknown))
	size += 1
	size += 4
	size += uint32(8)
	size += 4
	size += 2 + uint32(len(p.Unknown3))
	size += 1
	size += 1
	size += 8
	size += 4
	size += 2
	size += 1
	size += uint32(3)
	size += uint32(3)
	size += 1
	if p.Unknown10 != 0 {
	size += 1
	}
	if p.Unknown10 != 0 {
	for _, elem := range p.ClassItems {
		_ = elem
		size += 1
		size += 1
		for _, nestedElem := range elem.StartingItems {
			_ = nestedElem
			size += 4
			size += 1
			size += 1
			size += 1
			size += 3
			size += 3

		}

	}
	}
	size += 1
	for _, elem := range p.UnknownArray2 {
		_ = elem
		size += 4

	}
	size += 4
	size += 4
	size += 4
	size += 4
	size += 2 + uint32(len(p.Password))
	size += 2 + uint32(len(p.Username))
	size += 2 + uint32(len(p.Service))
	size += 1
	if p.Unknown12 != 0 {
	size += 1
	}
	if p.Unknown12 != 0 {
	for _, elem := range p.Lvl90ClassItems {
		_ = elem
		size += 1
		size += 1
		for _, nestedElem := range elem.StartingItems {
			_ = nestedElem
			size += 4
			size += 1
			size += 1
			size += 1
			size += 3
			size += 3

		}

	}
	}
	size += 1
	if p.Unknown13 != 0 {
	size += 1
	}
	if p.Unknown13 != 0 {
	for _, elem := range p.TimeLockedClassItems {
		_ = elem
		size += 1
		size += 1
		for _, nestedElem := range elem.StartingItems {
			_ = nestedElem
			size += 4
			size += 1
			size += 1
			size += 1
			size += 3
			size += 3

		}

	}
	}
	size += uint32(13)
	return size
}

// LSLoginReplyMsgV63181 represents packet structure for OP_LoginReplyMsg
type LSLoginReplyMsgV63181 struct {
	LoginResponse uint8 `eq2:"login_response"`
	Unknown string `eq2:"unknown,type:str16"`  // TODO: Identify purpose
	ParentalControlFlag uint8 `eq2:"parental_control_flag"`
	ParentalControlTimer uint32 `eq2:"parental_control_timer"`
	Unknown2 [8]uint8 `eq2:"unknown2,size:8"`  // TODO: Identify purpose
	AccountId uint32 `eq2:"account_id"`
	Unknown3 string `eq2:"unknown3,type:str16"`  // TODO: Identify purpose
	ResetAppearance uint8 `eq2:"reset_appearance"`
	DoNotForceSoga uint8 `eq2:"do_not_force_soga"`
	Unknown4 uint8 `eq2:"unknown4"`  // TODO: Identify purpose
	Unknown5 uint16 `eq2:"unknown5"`  // TODO: Identify purpose
	Unknown6 [5]uint8 `eq2:"unknown6,size:5"`  // TODO: Identify purpose
	Unknown6a [8]uint8 `eq2:"unknown6a,size:8"`  // TODO: Identify purpose
	Unknown7 uint32 `eq2:"unknown7"`  // TODO: Identify purpose
	Unknown7a uint16 `eq2:"unknown7a"`  // TODO: Identify purpose
	RaceUnknown uint8 `eq2:"race_unknown"`
	Unknown8 [3]uint8 `eq2:"unknown8,size:3"`  // TODO: Identify purpose
	Unknown9 [3]uint8 `eq2:"unknown9,size:3"`  // TODO: Identify purpose
	Unknown10 uint8 `eq2:"unknown10"`  // TODO: Identify purpose
	NumClassItems uint8 `eq2:"num_class_items,ifSet:unknown10"`
	ClassItems []struct {
		ClassId uint8 `eq2:"class_id"`
		NumItems uint8 `eq2:"num_items"`
		StartingItems []struct {
		ModelId uint32 `eq2:"model_id"`
		SlotId uint8 `eq2:"slot_id"`
		UseColor uint8 `eq2:"use_color"`
		UseHighlightColor uint8 `eq2:"use_highlight_color"`
		ModelColor types.Color `eq2:"model_color"`
		ModelHighlightColor types.Color `eq2:"model_highlight_color"`
	} `eq2:"starting_items"`
	} `eq2:"class_items,sizeVar:num_class_items,ifSet:unknown10"`
	UnknownArray2Size uint8 `eq2:"unknown_array2_size"`  // TODO: Identify purpose
	UnknownArray2 []struct {
		Array2Unknown uint32 `eq2:"array2_unknown"`
	} `eq2:"unknown_array2,sizeVar:unknown_array2_size"`
	Unknown11 uint32 `eq2:"unknown11"`  // TODO: Identify purpose
	SubLevel uint32 `eq2:"sub_level"`
	RaceFlag uint32 `eq2:"race_flag"`
	ClassFlag uint32 `eq2:"class_flag"`
	Password string `eq2:"password,type:str16"`
	Username string `eq2:"username,type:str16"`
	Service string `eq2:"service,type:str16"`
	Unknown12 uint8 `eq2:"unknown12"`  // TODO: Identify purpose
	Lvl90NumClassItems uint8 `eq2:"lvl90_num_class_items,ifSet:unknown12"`
	Lvl90ClassItems []struct {
		ClassId uint8 `eq2:"class_id"`
		NumItems uint8 `eq2:"num_items"`
		StartingItems []struct {
		ModelId uint32 `eq2:"model_id"`
		SlotId uint8 `eq2:"slot_id"`
		UseColor uint8 `eq2:"use_color"`
		UseHighlightColor uint8 `eq2:"use_highlight_color"`
		ModelColor types.Color `eq2:"model_color"`
		ModelHighlightColor types.Color `eq2:"model_highlight_color"`
	} `eq2:"starting_items"`
	} `eq2:"lvl90_class_items,sizeVar:lvl90_num_class_items,ifSet:unknown12"`
	Unknown13 uint8 `eq2:"unknown13"`  // TODO: Identify purpose
	TimeLockedNumClassItems uint8 `eq2:"time_locked_num_class_items,ifSet:unknown13"`
	TimeLockedClassItems []struct {
		ClassId uint8 `eq2:"class_id"`
		NumItems uint8 `eq2:"num_items"`
		StartingItems []struct {
		ModelId uint32 `eq2:"model_id"`
		SlotId uint8 `eq2:"slot_id"`
		UseColor uint8 `eq2:"use_color"`
		UseHighlightColor uint8 `eq2:"use_highlight_color"`
		ModelColor types.Color `eq2:"model_color"`
		ModelHighlightColor types.Color `eq2:"model_highlight_color"`
	} `eq2:"starting_items"`
	} `eq2:"time_locked_class_items,sizeVar:time_locked_num_class_items,ifSet:unknown13"`
	Unknown14 [9]uint8 `eq2:"unknown14,size:9"`  // TODO: Identify purpose
}

// Serialize writes the packet data to the provided buffer
func (p *LSLoginReplyMsgV63181) Serialize(dest []byte) uint32 {
	offset := uint32(0)
	dest[offset] = byte(p.LoginResponse)
	offset++
	binary.LittleEndian.PutUint16(dest[offset:], uint16(len(p.Unknown)))
	offset += 2
	copy(dest[offset:], []byte(p.Unknown))
	offset += uint32(len(p.Unknown))
	dest[offset] = byte(p.ParentalControlFlag)
	offset++
	binary.LittleEndian.PutUint32(dest[offset:], uint32(p.ParentalControlTimer))
	offset += 4
	for i := 0; i < 8; i++ {
		dest[offset] = p.Unknown2[i]
		offset++
	}
	binary.LittleEndian.PutUint32(dest[offset:], uint32(p.AccountId))
	offset += 4
	binary.LittleEndian.PutUint16(dest[offset:], uint16(len(p.Unknown3)))
	offset += 2
	copy(dest[offset:], []byte(p.Unknown3))
	offset += uint32(len(p.Unknown3))
	dest[offset] = byte(p.ResetAppearance)
	offset++
	dest[offset] = byte(p.DoNotForceSoga)
	offset++
	dest[offset] = byte(p.Unknown4)
	offset++
	binary.LittleEndian.PutUint16(dest[offset:], uint16(p.Unknown5))
	offset += 2
	for i := 0; i < 5; i++ {
		dest[offset] = p.Unknown6[i]
		offset++
	}
	for i := 0; i < 8; i++ {
		dest[offset] = p.Unknown6a[i]
		offset++
	}
	binary.LittleEndian.PutUint32(dest[offset:], uint32(p.Unknown7))
	offset += 4
	binary.LittleEndian.PutUint16(dest[offset:], uint16(p.Unknown7a))
	offset += 2
	dest[offset] = byte(p.RaceUnknown)
	offset++
	for i := 0; i < 3; i++ {
		dest[offset] = p.Unknown8[i]
		offset++
	}
	for i := 0; i < 3; i++ {
		dest[offset] = p.Unknown9[i]
		offset++
	}
	dest[offset] = byte(p.Unknown10)
	offset++
	if p.Unknown10 != 0 {
	dest[offset] = byte(p.NumClassItems)
	offset++
	}
	if p.Unknown10 != 0 {
	for _, elem := range p.ClassItems {
		dest[offset] = elem.ClassId
		offset++
		dest[offset] = elem.NumItems
		offset++
		for _, nestedElem := range elem.StartingItems {
			binary.LittleEndian.PutUint32(dest[offset:], nestedElem.ModelId)
			offset += 4
			dest[offset] = nestedElem.SlotId
			offset++
			dest[offset] = nestedElem.UseColor
			offset++
			dest[offset] = nestedElem.UseHighlightColor
			offset++
			dest[offset] = nestedElem.ModelColor.R
			dest[offset+1] = nestedElem.ModelColor.G
			dest[offset+2] = nestedElem.ModelColor.B
			offset += 3
			dest[offset] = nestedElem.ModelHighlightColor.R
			dest[offset+1] = nestedElem.ModelHighlightColor.G
			dest[offset+2] = nestedElem.ModelHighlightColor.B
			offset += 3
		}
	}
	}
	dest[offset] = byte(p.UnknownArray2Size)
	offset++
	for _, elem := range p.UnknownArray2 {
		binary.LittleEndian.PutUint32(dest[offset:], elem.Array2Unknown)
		offset += 4
	}
	binary.LittleEndian.PutUint32(dest[offset:], uint32(p.Unknown11))
	offset += 4
	binary.LittleEndian.PutUint32(dest[offset:], uint32(p.SubLevel))
	offset += 4
	binary.LittleEndian.PutUint32(dest[offset:], uint32(p.RaceFlag))
	offset += 4
	binary.LittleEndian.PutUint32(dest[offset:], uint32(p.ClassFlag))
	offset += 4
	binary.LittleEndian.PutUint16(dest[offset:], uint16(len(p.Password)))
	offset += 2
	copy(dest[offset:], []byte(p.Password))
	offset += uint32(len(p.Password))
	binary.LittleEndian.PutUint16(dest[offset:], uint16(len(p.Username)))
	offset += 2
	copy(dest[offset:], []byte(p.Username))
	offset += uint32(len(p.Username))
	binary.LittleEndian.PutUint16(dest[offset:], uint16(len(p.Service)))
	offset += 2
	copy(dest[offset:], []byte(p.Service))
	offset += uint32(len(p.Service))
	dest[offset] = byte(p.Unknown12)
	offset++
	if p.Unknown12 != 0 {
	dest[offset] = byte(p.Lvl90NumClassItems)
	offset++
	}
	if p.Unknown12 != 0 {
	for _, elem := range p.Lvl90ClassItems {
		dest[offset] = elem.ClassId
		offset++
		dest[offset] = elem.NumItems
		offset++
		for _, nestedElem := range elem.StartingItems {
			binary.LittleEndian.PutUint32(dest[offset:], nestedElem.ModelId)
			offset += 4
			dest[offset] = nestedElem.SlotId
			offset++
			dest[offset] = nestedElem.UseColor
			offset++
			dest[offset] = nestedElem.UseHighlightColor
			offset++
			dest[offset] = nestedElem.ModelColor.R
			dest[offset+1] = nestedElem.ModelColor.G
			dest[offset+2] = nestedElem.ModelColor.B
			offset += 3
			dest[offset] = nestedElem.ModelHighlightColor.R
			dest[offset+1] = nestedElem.ModelHighlightColor.G
			dest[offset+2] = nestedElem.ModelHighlightColor.B
			offset += 3
		}
	}
	}
	dest[offset] = byte(p.Unknown13)
	offset++
	if p.Unknown13 != 0 {
	dest[offset] = byte(p.TimeLockedNumClassItems)
	offset++
	}
	if p.Unknown13 != 0 {
	for _, elem := range p.TimeLockedClassItems {
		dest[offset] = elem.ClassId
		offset++
		dest[offset] = elem.NumItems
		offset++
		for _, nestedElem := range elem.StartingItems {
			binary.LittleEndian.PutUint32(dest[offset:], nestedElem.ModelId)
			offset += 4
			dest[offset] = nestedElem.SlotId
			offset++
			dest[offset] = nestedElem.UseColor
			offset++
			dest[offset] = nestedElem.UseHighlightColor
			offset++
			dest[offset] = nestedElem.ModelColor.R
			dest[offset+1] = nestedElem.ModelColor.G
			dest[offset+2] = nestedElem.ModelColor.B
			offset += 3
			dest[offset] = nestedElem.ModelHighlightColor.R
			dest[offset+1] = nestedElem.ModelHighlightColor.G
			dest[offset+2] = nestedElem.ModelHighlightColor.B
			offset += 3
		}
	}
	}
	for i := 0; i < 9; i++ {
		dest[offset] = p.Unknown14[i]
		offset++
	}
	return offset
}

// Size returns the serialized size of the packet
func (p *LSLoginReplyMsgV63181) Size() uint32 {
	size := uint32(0)
	size += 1
	size += 2 + uint32(len(p.Unknown))
	size += 1
	size += 4
	size += uint32(8)
	size += 4
	size += 2 + uint32(len(p.Unknown3))
	size += 1
	size += 1
	size += 1
	size += 2
	size += uint32(5)
	size += uint32(8)
	size += 4
	size += 2
	size += 1
	size += uint32(3)
	size += uint32(3)
	size += 1
	if p.Unknown10 != 0 {
	size += 1
	}
	if p.Unknown10 != 0 {
	for _, elem := range p.ClassItems {
		_ = elem
		size += 1
		size += 1
		for _, nestedElem := range elem.StartingItems {
			_ = nestedElem
			size += 4
			size += 1
			size += 1
			size += 1
			size += 3
			size += 3

		}

	}
	}
	size += 1
	for _, elem := range p.UnknownArray2 {
		_ = elem
		size += 4

	}
	size += 4
	size += 4
	size += 4
	size += 4
	size += 2 + uint32(len(p.Password))
	size += 2 + uint32(len(p.Username))
	size += 2 + uint32(len(p.Service))
	size += 1
	if p.Unknown12 != 0 {
	size += 1
	}
	if p.Unknown12 != 0 {
	for _, elem := range p.Lvl90ClassItems {
		_ = elem
		size += 1
		size += 1
		for _, nestedElem := range elem.StartingItems {
			_ = nestedElem
			size += 4
			size += 1
			size += 1
			size += 1
			size += 3
			size += 3

		}

	}
	}
	size += 1
	if p.Unknown13 != 0 {
	size += 1
	}
	if p.Unknown13 != 0 {
	for _, elem := range p.TimeLockedClassItems {
		_ = elem
		size += 1
		size += 1
		for _, nestedElem := range elem.StartingItems {
			_ = nestedElem
			size += 4
			size += 1
			size += 1
			size += 1
			size += 3
			size += 3

		}

	}
	}
	size += uint32(9)
	return size
}

// LSLoginReplyMsgV65534 represents packet structure for OP_LoginReplyMsg
type LSLoginReplyMsgV65534 struct {
	LoginResponse uint8 `eq2:"login_response"`
	WorldName string `eq2:"world_name,type:str16"`
	ParentalControlFlag uint8 `eq2:"parental_control_flag"`
	ParentalControlTimer int64 `eq2:"parental_control_timer"`
	Unknown2 uint32 `eq2:"unknown2"`  // TODO: Identify purpose
	AccountId uint32 `eq2:"account_id"`
	Unknown3 string `eq2:"unknown3,type:str16"`  // TODO: Identify purpose
	ResetAppearance uint8 `eq2:"reset_appearance"`
	DoNotForceSoga uint8 `eq2:"do_not_force_soga"`
	Unknown4 string `eq2:"unknown4,type:EQ2_32Bit_String"`  // TODO: Identify purpose
	Unknown7 string `eq2:"unknown7,type:EQ2_32Bit_String"`  // TODO: Identify purpose
	RaceUnknown uint32 `eq2:"race_unknown"`
	Unknown8 uint8 `eq2:"unknown8"`  // TODO: Identify purpose
	Unknown10 uint8 `eq2:"unknown10"`  // TODO: Identify purpose
	NumClassItems uint8 `eq2:"num_class_items,ifSet:unknown10"`
	ClassItems []struct {
		ClassId uint8 `eq2:"class_id"`
		NumItems uint8 `eq2:"num_items"`
		StartingItems []struct {
		ModelId uint32 `eq2:"model_id"`
		SlotId uint8 `eq2:"slot_id"`
		UseColor uint8 `eq2:"use_color"`
		UseHighlightColor uint8 `eq2:"use_highlight_color"`
		ModelColor types.Color `eq2:"model_color"`
		ModelHighlightColor types.Color `eq2:"model_highlight_color"`
	} `eq2:"starting_items"`
	} `eq2:"class_items,sizeVar:num_class_items,ifSet:unknown10"`
	UnknownArray2Size uint8 `eq2:"unknown_array2_size"`  // TODO: Identify purpose
	UnknownArray2 []struct {
		Array2Unknown uint32 `eq2:"array2_unknown"`
	} `eq2:"unknown_array2,sizeVar:unknown_array2_size,ifSet:unknown_array2_size"`
	Unknown11 uint32 `eq2:"unknown11"`  // TODO: Identify purpose
	SubLevel uint32 `eq2:"sub_level"`
	RaceFlag uint32 `eq2:"race_flag"`
	ClassFlag uint32 `eq2:"class_flag"`
	Password string `eq2:"password,type:str16"`
	Username string `eq2:"username,type:str16"`
	Service string `eq2:"service,type:str16"`
	Unknown12 uint8 `eq2:"unknown12"`  // TODO: Identify purpose
	Lvl90NumClassItems uint8 `eq2:"lvl90_num_class_items,ifSet:unknown12"`
	Lvl90ClassItems []struct {
		ClassId uint8 `eq2:"class_id"`
		NumItems uint8 `eq2:"num_items"`
		StartingItems []struct {
		ModelId uint32 `eq2:"model_id"`
		SlotId uint8 `eq2:"slot_id"`
		UseColor uint8 `eq2:"use_color"`
		UseHighlightColor uint8 `eq2:"use_highlight_color"`
		ModelColor types.Color `eq2:"model_color"`
		ModelHighlightColor types.Color `eq2:"model_highlight_color"`
	} `eq2:"starting_items"`
	} `eq2:"lvl90_class_items,sizeVar:lvl90_num_class_items,ifSet:unknown12"`
	Unknown13 uint8 `eq2:"unknown13"`  // TODO: Identify purpose
	TimeLockedNumClassItems uint8 `eq2:"time_locked_num_class_items,ifSet:unknown13"`
	TimeLockedClassItems []struct {
		ClassId uint8 `eq2:"class_id"`
		NumItems uint8 `eq2:"num_items"`
		StartingItems []struct {
		ModelId uint32 `eq2:"model_id"`
		SlotId uint8 `eq2:"slot_id"`
		UseColor uint8 `eq2:"use_color"`
		UseHighlightColor uint8 `eq2:"use_highlight_color"`
		ModelColor types.Color `eq2:"model_color"`
		ModelHighlightColor types.Color `eq2:"model_highlight_color"`
	} `eq2:"starting_items"`
	} `eq2:"time_locked_class_items,sizeVar:time_locked_num_class_items,ifSet:unknown13"`
	Unknown14 [13]uint8 `eq2:"unknown14,size:13"`  // TODO: Identify purpose
}

// Serialize writes the packet data to the provided buffer
func (p *LSLoginReplyMsgV65534) Serialize(dest []byte) uint32 {
	offset := uint32(0)
	dest[offset] = byte(p.LoginResponse)
	offset++
	binary.LittleEndian.PutUint16(dest[offset:], uint16(len(p.WorldName)))
	offset += 2
	copy(dest[offset:], []byte(p.WorldName))
	offset += uint32(len(p.WorldName))
	dest[offset] = byte(p.ParentalControlFlag)
	offset++
	binary.LittleEndian.PutUint64(dest[offset:], uint64(p.ParentalControlTimer))
	offset += 8
	binary.LittleEndian.PutUint32(dest[offset:], uint32(p.Unknown2))
	offset += 4
	binary.LittleEndian.PutUint32(dest[offset:], uint32(p.AccountId))
	offset += 4
	binary.LittleEndian.PutUint16(dest[offset:], uint16(len(p.Unknown3)))
	offset += 2
	copy(dest[offset:], []byte(p.Unknown3))
	offset += uint32(len(p.Unknown3))
	dest[offset] = byte(p.ResetAppearance)
	offset++
	dest[offset] = byte(p.DoNotForceSoga)
	offset++
	binary.LittleEndian.PutUint32(dest[offset:], uint32(len(p.Unknown4)))
	offset += 4
	copy(dest[offset:], []byte(p.Unknown4))
	offset += uint32(len(p.Unknown4))
	binary.LittleEndian.PutUint32(dest[offset:], uint32(len(p.Unknown7)))
	offset += 4
	copy(dest[offset:], []byte(p.Unknown7))
	offset += uint32(len(p.Unknown7))
	binary.LittleEndian.PutUint32(dest[offset:], uint32(p.RaceUnknown))
	offset += 4
	dest[offset] = byte(p.Unknown8)
	offset++
	dest[offset] = byte(p.Unknown10)
	offset++
	if p.Unknown10 != 0 {
	dest[offset] = byte(p.NumClassItems)
	offset++
	}
	if p.Unknown10 != 0 {
	for _, elem := range p.ClassItems {
		dest[offset] = elem.ClassId
		offset++
		dest[offset] = elem.NumItems
		offset++
		for _, nestedElem := range elem.StartingItems {
			binary.LittleEndian.PutUint32(dest[offset:], nestedElem.ModelId)
			offset += 4
			dest[offset] = nestedElem.SlotId
			offset++
			dest[offset] = nestedElem.UseColor
			offset++
			dest[offset] = nestedElem.UseHighlightColor
			offset++
			dest[offset] = nestedElem.ModelColor.R
			dest[offset+1] = nestedElem.ModelColor.G
			dest[offset+2] = nestedElem.ModelColor.B
			offset += 3
			dest[offset] = nestedElem.ModelHighlightColor.R
			dest[offset+1] = nestedElem.ModelHighlightColor.G
			dest[offset+2] = nestedElem.ModelHighlightColor.B
			offset += 3
		}
	}
	}
	dest[offset] = byte(p.UnknownArray2Size)
	offset++
	if p.UnknownArray2Size != 0 {
	for _, elem := range p.UnknownArray2 {
		binary.LittleEndian.PutUint32(dest[offset:], elem.Array2Unknown)
		offset += 4
	}
	}
	binary.LittleEndian.PutUint32(dest[offset:], uint32(p.Unknown11))
	offset += 4
	binary.LittleEndian.PutUint32(dest[offset:], uint32(p.SubLevel))
	offset += 4
	binary.LittleEndian.PutUint32(dest[offset:], uint32(p.RaceFlag))
	offset += 4
	binary.LittleEndian.PutUint32(dest[offset:], uint32(p.ClassFlag))
	offset += 4
	binary.LittleEndian.PutUint16(dest[offset:], uint16(len(p.Password)))
	offset += 2
	copy(dest[offset:], []byte(p.Password))
	offset += uint32(len(p.Password))
	binary.LittleEndian.PutUint16(dest[offset:], uint16(len(p.Username)))
	offset += 2
	copy(dest[offset:], []byte(p.Username))
	offset += uint32(len(p.Username))
	binary.LittleEndian.PutUint16(dest[offset:], uint16(len(p.Service)))
	offset += 2
	copy(dest[offset:], []byte(p.Service))
	offset += uint32(len(p.Service))
	dest[offset] = byte(p.Unknown12)
	offset++
	if p.Unknown12 != 0 {
	dest[offset] = byte(p.Lvl90NumClassItems)
	offset++
	}
	if p.Unknown12 != 0 {
	for _, elem := range p.Lvl90ClassItems {
		dest[offset] = elem.ClassId
		offset++
		dest[offset] = elem.NumItems
		offset++
		for _, nestedElem := range elem.StartingItems {
			binary.LittleEndian.PutUint32(dest[offset:], nestedElem.ModelId)
			offset += 4
			dest[offset] = nestedElem.SlotId
			offset++
			dest[offset] = nestedElem.UseColor
			offset++
			dest[offset] = nestedElem.UseHighlightColor
			offset++
			dest[offset] = nestedElem.ModelColor.R
			dest[offset+1] = nestedElem.ModelColor.G
			dest[offset+2] = nestedElem.ModelColor.B
			offset += 3
			dest[offset] = nestedElem.ModelHighlightColor.R
			dest[offset+1] = nestedElem.ModelHighlightColor.G
			dest[offset+2] = nestedElem.ModelHighlightColor.B
			offset += 3
		}
	}
	}
	dest[offset] = byte(p.Unknown13)
	offset++
	if p.Unknown13 != 0 {
	dest[offset] = byte(p.TimeLockedNumClassItems)
	offset++
	}
	if p.Unknown13 != 0 {
	for _, elem := range p.TimeLockedClassItems {
		dest[offset] = elem.ClassId
		offset++
		dest[offset] = elem.NumItems
		offset++
		for _, nestedElem := range elem.StartingItems {
			binary.LittleEndian.PutUint32(dest[offset:], nestedElem.ModelId)
			offset += 4
			dest[offset] = nestedElem.SlotId
			offset++
			dest[offset] = nestedElem.UseColor
			offset++
			dest[offset] = nestedElem.UseHighlightColor
			offset++
			dest[offset] = nestedElem.ModelColor.R
			dest[offset+1] = nestedElem.ModelColor.G
			dest[offset+2] = nestedElem.ModelColor.B
			offset += 3
			dest[offset] = nestedElem.ModelHighlightColor.R
			dest[offset+1] = nestedElem.ModelHighlightColor.G
			dest[offset+2] = nestedElem.ModelHighlightColor.B
			offset += 3
		}
	}
	}
	for i := 0; i < 13; i++ {
		dest[offset] = p.Unknown14[i]
		offset++
	}
	return offset
}

// Size returns the serialized size of the packet
func (p *LSLoginReplyMsgV65534) Size() uint32 {
	size := uint32(0)
	size += 1
	size += 2 + uint32(len(p.WorldName))
	size += 1
	size += 8
	size += 4
	size += 4
	size += 2 + uint32(len(p.Unknown3))
	size += 1
	size += 1
	size += 4 + uint32(len(p.Unknown4))
	size += 4 + uint32(len(p.Unknown7))
	size += 4
	size += 1
	size += 1
	if p.Unknown10 != 0 {
	size += 1
	}
	if p.Unknown10 != 0 {
	for _, elem := range p.ClassItems {
		_ = elem
		size += 1
		size += 1
		for _, nestedElem := range elem.StartingItems {
			_ = nestedElem
			size += 4
			size += 1
			size += 1
			size += 1
			size += 3
			size += 3

		}

	}
	}
	size += 1
	if p.UnknownArray2Size != 0 {
	for _, elem := range p.UnknownArray2 {
		_ = elem
		size += 4

	}
	}
	size += 4
	size += 4
	size += 4
	size += 4
	size += 2 + uint32(len(p.Password))
	size += 2 + uint32(len(p.Username))
	size += 2 + uint32(len(p.Service))
	size += 1
	if p.Unknown12 != 0 {
	size += 1
	}
	if p.Unknown12 != 0 {
	for _, elem := range p.Lvl90ClassItems {
		_ = elem
		size += 1
		size += 1
		for _, nestedElem := range elem.StartingItems {
			_ = nestedElem
			size += 4
			size += 1
			size += 1
			size += 1
			size += 3
			size += 3

		}

	}
	}
	size += 1
	if p.Unknown13 != 0 {
	size += 1
	}
	if p.Unknown13 != 0 {
	for _, elem := range p.TimeLockedClassItems {
		_ = elem
		size += 1
		size += 1
		for _, nestedElem := range elem.StartingItems {
			_ = nestedElem
			size += 4
			size += 1
			size += 1
			size += 1
			size += 3
			size += 3

		}

	}
	}
	size += uint32(13)
	return size
}









