// Code generated by codegen. DO NOT EDIT. // Source: common.xml package generated import ( "encoding/binary" "math" "git.sharkk.net/EQ2/Protocol/types" ) // CreateCharacter represents packet structure for OP_CreateCharacterRequestMsg type CreateCharacter struct { AccountId uint32 `eq2:"account_id"` ServerId uint32 `eq2:"server_id"` Name string `eq2:"name,type:str16"` Race uint8 `eq2:"race"` Gender uint8 `eq2:"gender"` Deity uint8 `eq2:"deity"` Class uint8 `eq2:"class"` Level uint8 `eq2:"level"` StartingZone uint8 `eq2:"starting_zone"` Unknown1 [2]uint8 `eq2:"unknown1,size:2"` // TODO: Identify purpose RaceFile string `eq2:"race_file,type:str16"` SkinColor [3]float32 `eq2:"skin_color,size:3"` EyeColor [3]float32 `eq2:"eye_color,size:3"` HairColor1 [3]float32 `eq2:"hair_color1,size:3"` HairColor2 [3]float32 `eq2:"hair_color2,size:3"` HairHighlight [3]float32 `eq2:"hair_highlight,size:3"` Unknown2 [26]uint8 `eq2:"unknown2,size:26"` // TODO: Identify purpose HairFile string `eq2:"hair_file,type:str16"` HairTypeColor [3]float32 `eq2:"hair_type_color,size:3"` HairTypeHighlightColor [3]float32 `eq2:"hair_type_highlight_color,size:3"` FaceFile string `eq2:"face_file,type:str16"` HairFaceColor [3]float32 `eq2:"hair_face_color,size:3"` HairFaceHighlightColor [3]float32 `eq2:"hair_face_highlight_color,size:3"` ChestFile string `eq2:"chest_file,type:str16"` ShirtColor [3]float32 `eq2:"shirt_color,size:3"` UnknownChestColor [3]float32 `eq2:"unknown_chest_color,size:3"` // TODO: Identify purpose LegsFile string `eq2:"legs_file,type:str16"` PantsColor [3]float32 `eq2:"pants_color,size:3"` UnknownLegsColor [3]float32 `eq2:"unknown_legs_color,size:3"` // TODO: Identify purpose Unknown9 [3]float32 `eq2:"unknown9,size:3"` // TODO: Identify purpose Eyes2 [3]float32 `eq2:"eyes2,size:3"` Ears [3]float32 `eq2:"ears,size:3"` EyeBrows [3]float32 `eq2:"eye_brows,size:3"` Cheeks [3]float32 `eq2:"cheeks,size:3"` Lips [3]float32 `eq2:"lips,size:3"` Chin [3]float32 `eq2:"chin,size:3"` Nose [3]float32 `eq2:"nose,size:3"` BodySize float32 `eq2:"body_size"` BodyAge float32 `eq2:"body_age"` } // Serialize writes the packet data to the provided buffer func (p *CreateCharacter) Serialize(dest []byte) uint32 { offset := uint32(0) // Write AccountId binary.LittleEndian.PutUint32(dest[offset:], uint32(p.AccountId)) offset += 4 // Write ServerId binary.LittleEndian.PutUint32(dest[offset:], uint32(p.ServerId)) offset += 4 // Write Name as 16-bit length-prefixed string binary.LittleEndian.PutUint16(dest[offset:], uint16(len(p.Name))) offset += 2 copy(dest[offset:], []byte(p.Name)) offset += uint32(len(p.Name)) // Write Race dest[offset] = byte(p.Race) offset++ // Write Gender dest[offset] = byte(p.Gender) offset++ // Write Deity dest[offset] = byte(p.Deity) offset++ // Write Class dest[offset] = byte(p.Class) offset++ // Write Level dest[offset] = byte(p.Level) offset++ // Write StartingZone dest[offset] = byte(p.StartingZone) offset++ // Write Unknown1 array for i := 0; i < 2; i++ { dest[offset] = p.Unknown1[i] offset++ } // Write RaceFile as 16-bit length-prefixed string binary.LittleEndian.PutUint16(dest[offset:], uint16(len(p.RaceFile))) offset += 2 copy(dest[offset:], []byte(p.RaceFile)) offset += uint32(len(p.RaceFile)) // Write SkinColor array for i := 0; i < 3; i++ { binary.LittleEndian.PutUint32(dest[offset:], math.Float32bits(p.SkinColor[i])) offset += 4 } // Write EyeColor array for i := 0; i < 3; i++ { binary.LittleEndian.PutUint32(dest[offset:], math.Float32bits(p.EyeColor[i])) offset += 4 } // Write HairColor1 array for i := 0; i < 3; i++ { binary.LittleEndian.PutUint32(dest[offset:], math.Float32bits(p.HairColor1[i])) offset += 4 } // Write HairColor2 array for i := 0; i < 3; i++ { binary.LittleEndian.PutUint32(dest[offset:], math.Float32bits(p.HairColor2[i])) offset += 4 } // Write HairHighlight array for i := 0; i < 3; i++ { binary.LittleEndian.PutUint32(dest[offset:], math.Float32bits(p.HairHighlight[i])) offset += 4 } // Write Unknown2 array for i := 0; i < 26; i++ { dest[offset] = p.Unknown2[i] offset++ } // Write HairFile as 16-bit length-prefixed string binary.LittleEndian.PutUint16(dest[offset:], uint16(len(p.HairFile))) offset += 2 copy(dest[offset:], []byte(p.HairFile)) offset += uint32(len(p.HairFile)) // Write HairTypeColor array for i := 0; i < 3; i++ { binary.LittleEndian.PutUint32(dest[offset:], math.Float32bits(p.HairTypeColor[i])) offset += 4 } // Write HairTypeHighlightColor array for i := 0; i < 3; i++ { binary.LittleEndian.PutUint32(dest[offset:], math.Float32bits(p.HairTypeHighlightColor[i])) offset += 4 } // Write FaceFile as 16-bit length-prefixed string binary.LittleEndian.PutUint16(dest[offset:], uint16(len(p.FaceFile))) offset += 2 copy(dest[offset:], []byte(p.FaceFile)) offset += uint32(len(p.FaceFile)) // Write HairFaceColor array for i := 0; i < 3; i++ { binary.LittleEndian.PutUint32(dest[offset:], math.Float32bits(p.HairFaceColor[i])) offset += 4 } // Write HairFaceHighlightColor array for i := 0; i < 3; i++ { binary.LittleEndian.PutUint32(dest[offset:], math.Float32bits(p.HairFaceHighlightColor[i])) offset += 4 } // Write ChestFile as 16-bit length-prefixed string binary.LittleEndian.PutUint16(dest[offset:], uint16(len(p.ChestFile))) offset += 2 copy(dest[offset:], []byte(p.ChestFile)) offset += uint32(len(p.ChestFile)) // Write ShirtColor array for i := 0; i < 3; i++ { binary.LittleEndian.PutUint32(dest[offset:], math.Float32bits(p.ShirtColor[i])) offset += 4 } // Write UnknownChestColor array for i := 0; i < 3; i++ { binary.LittleEndian.PutUint32(dest[offset:], math.Float32bits(p.UnknownChestColor[i])) offset += 4 } // Write LegsFile as 16-bit length-prefixed string binary.LittleEndian.PutUint16(dest[offset:], uint16(len(p.LegsFile))) offset += 2 copy(dest[offset:], []byte(p.LegsFile)) offset += uint32(len(p.LegsFile)) // Write PantsColor array for i := 0; i < 3; i++ { binary.LittleEndian.PutUint32(dest[offset:], math.Float32bits(p.PantsColor[i])) offset += 4 } // Write UnknownLegsColor array for i := 0; i < 3; i++ { binary.LittleEndian.PutUint32(dest[offset:], math.Float32bits(p.UnknownLegsColor[i])) offset += 4 } // Write Unknown9 array for i := 0; i < 3; i++ { binary.LittleEndian.PutUint32(dest[offset:], math.Float32bits(p.Unknown9[i])) offset += 4 } // Write Eyes2 array for i := 0; i < 3; i++ { binary.LittleEndian.PutUint32(dest[offset:], math.Float32bits(p.Eyes2[i])) offset += 4 } // Write Ears array for i := 0; i < 3; i++ { binary.LittleEndian.PutUint32(dest[offset:], math.Float32bits(p.Ears[i])) offset += 4 } // Write EyeBrows array for i := 0; i < 3; i++ { binary.LittleEndian.PutUint32(dest[offset:], math.Float32bits(p.EyeBrows[i])) offset += 4 } // Write Cheeks array for i := 0; i < 3; i++ { binary.LittleEndian.PutUint32(dest[offset:], math.Float32bits(p.Cheeks[i])) offset += 4 } // Write Lips array for i := 0; i < 3; i++ { binary.LittleEndian.PutUint32(dest[offset:], math.Float32bits(p.Lips[i])) offset += 4 } // Write Chin array for i := 0; i < 3; i++ { binary.LittleEndian.PutUint32(dest[offset:], math.Float32bits(p.Chin[i])) offset += 4 } // Write Nose array for i := 0; i < 3; i++ { binary.LittleEndian.PutUint32(dest[offset:], math.Float32bits(p.Nose[i])) offset += 4 } // Write BodySize binary.LittleEndian.PutUint32(dest[offset:], math.Float32bits(p.BodySize)) offset += 4 // Write BodyAge binary.LittleEndian.PutUint32(dest[offset:], math.Float32bits(p.BodyAge)) offset += 4 return offset } // Size returns the serialized size of the packet func (p *CreateCharacter) Size() uint32 { size := uint32(0) size += 4 size += 4 size += 2 + uint32(len(p.Name)) size += 1 size += 1 size += 1 size += 1 size += 1 size += 1 size += 2 size += 2 + uint32(len(p.RaceFile)) size += 3 * 4 size += 3 * 4 size += 3 * 4 size += 3 * 4 size += 3 * 4 size += 26 size += 2 + uint32(len(p.HairFile)) size += 3 * 4 size += 3 * 4 size += 2 + uint32(len(p.FaceFile)) size += 3 * 4 size += 3 * 4 size += 2 + uint32(len(p.ChestFile)) size += 3 * 4 size += 3 * 4 size += 2 + uint32(len(p.LegsFile)) size += 3 * 4 size += 3 * 4 size += 3 * 4 size += 3 * 4 size += 3 * 4 size += 3 * 4 size += 3 * 4 size += 3 * 4 size += 3 * 4 size += 3 * 4 size += 4 size += 4 return size } // CreateCharacterV373 represents packet structure for OP_CreateCharacterRequestMsg type CreateCharacterV373 struct { Unknown0 uint32 `eq2:"unknown0"` // TODO: Identify purpose AccountId uint32 `eq2:"account_id"` ServerId uint32 `eq2:"server_id"` Name string `eq2:"name,type:str16"` Race uint8 `eq2:"race"` Gender uint8 `eq2:"gender"` Deity uint8 `eq2:"deity"` Class uint8 `eq2:"class"` Level uint8 `eq2:"level"` StartingZone uint8 `eq2:"starting_zone"` Unknown1 [2]uint8 `eq2:"unknown1,size:2"` // TODO: Identify purpose RaceFile string `eq2:"race_file,type:str16"` SkinColor [3]float32 `eq2:"skin_color,size:3"` EyeColor [3]float32 `eq2:"eye_color,size:3"` HairColor1 [3]float32 `eq2:"hair_color1,size:3"` HairColor2 [3]float32 `eq2:"hair_color2,size:3"` HairHighlight [3]float32 `eq2:"hair_highlight,size:3"` Unknown2 [26]uint8 `eq2:"unknown2,size:26"` // TODO: Identify purpose HairFile string `eq2:"hair_file,type:str16"` HairTypeColor [3]float32 `eq2:"hair_type_color,size:3"` HairTypeHighlightColor [3]float32 `eq2:"hair_type_highlight_color,size:3"` FaceFile string `eq2:"face_file,type:str16"` HairFaceColor [3]float32 `eq2:"hair_face_color,size:3"` HairFaceHighlightColor [3]float32 `eq2:"hair_face_highlight_color,size:3"` ChestFile string `eq2:"chest_file,type:str16"` ShirtColor [3]float32 `eq2:"shirt_color,size:3"` UnknownChestColor [3]float32 `eq2:"unknown_chest_color,size:3"` // TODO: Identify purpose LegsFile string `eq2:"legs_file,type:str16"` PantsColor [3]float32 `eq2:"pants_color,size:3"` UnknownLegsColor [3]float32 `eq2:"unknown_legs_color,size:3"` // TODO: Identify purpose Unknown9 [3]float32 `eq2:"unknown9,size:3"` // TODO: Identify purpose Eyes2 [3]float32 `eq2:"eyes2,size:3"` Ears [3]float32 `eq2:"ears,size:3"` EyeBrows [3]float32 `eq2:"eye_brows,size:3"` Cheeks [3]float32 `eq2:"cheeks,size:3"` Lips [3]float32 `eq2:"lips,size:3"` Chin [3]float32 `eq2:"chin,size:3"` Nose [3]float32 `eq2:"nose,size:3"` BodySize float32 `eq2:"body_size"` BodyAge float32 `eq2:"body_age"` } // Serialize writes the packet data to the provided buffer func (p *CreateCharacterV373) Serialize(dest []byte) uint32 { offset := uint32(0) // Write Unknown0 binary.LittleEndian.PutUint32(dest[offset:], uint32(p.Unknown0)) offset += 4 // Write AccountId binary.LittleEndian.PutUint32(dest[offset:], uint32(p.AccountId)) offset += 4 // Write ServerId binary.LittleEndian.PutUint32(dest[offset:], uint32(p.ServerId)) offset += 4 // Write Name as 16-bit length-prefixed string binary.LittleEndian.PutUint16(dest[offset:], uint16(len(p.Name))) offset += 2 copy(dest[offset:], []byte(p.Name)) offset += uint32(len(p.Name)) // Write Race dest[offset] = byte(p.Race) offset++ // Write Gender dest[offset] = byte(p.Gender) offset++ // Write Deity dest[offset] = byte(p.Deity) offset++ // Write Class dest[offset] = byte(p.Class) offset++ // Write Level dest[offset] = byte(p.Level) offset++ // Write StartingZone dest[offset] = byte(p.StartingZone) offset++ // Write Unknown1 array for i := 0; i < 2; i++ { dest[offset] = p.Unknown1[i] offset++ } // Write RaceFile as 16-bit length-prefixed string binary.LittleEndian.PutUint16(dest[offset:], uint16(len(p.RaceFile))) offset += 2 copy(dest[offset:], []byte(p.RaceFile)) offset += uint32(len(p.RaceFile)) // Write SkinColor array for i := 0; i < 3; i++ { binary.LittleEndian.PutUint32(dest[offset:], math.Float32bits(p.SkinColor[i])) offset += 4 } // Write EyeColor array for i := 0; i < 3; i++ { binary.LittleEndian.PutUint32(dest[offset:], math.Float32bits(p.EyeColor[i])) offset += 4 } // Write HairColor1 array for i := 0; i < 3; i++ { binary.LittleEndian.PutUint32(dest[offset:], math.Float32bits(p.HairColor1[i])) offset += 4 } // Write HairColor2 array for i := 0; i < 3; i++ { binary.LittleEndian.PutUint32(dest[offset:], math.Float32bits(p.HairColor2[i])) offset += 4 } // Write HairHighlight array for i := 0; i < 3; i++ { binary.LittleEndian.PutUint32(dest[offset:], math.Float32bits(p.HairHighlight[i])) offset += 4 } // Write Unknown2 array for i := 0; i < 26; i++ { dest[offset] = p.Unknown2[i] offset++ } // Write HairFile as 16-bit length-prefixed string binary.LittleEndian.PutUint16(dest[offset:], uint16(len(p.HairFile))) offset += 2 copy(dest[offset:], []byte(p.HairFile)) offset += uint32(len(p.HairFile)) // Write HairTypeColor array for i := 0; i < 3; i++ { binary.LittleEndian.PutUint32(dest[offset:], math.Float32bits(p.HairTypeColor[i])) offset += 4 } // Write HairTypeHighlightColor array for i := 0; i < 3; i++ { binary.LittleEndian.PutUint32(dest[offset:], math.Float32bits(p.HairTypeHighlightColor[i])) offset += 4 } // Write FaceFile as 16-bit length-prefixed string binary.LittleEndian.PutUint16(dest[offset:], uint16(len(p.FaceFile))) offset += 2 copy(dest[offset:], []byte(p.FaceFile)) offset += uint32(len(p.FaceFile)) // Write HairFaceColor array for i := 0; i < 3; i++ { binary.LittleEndian.PutUint32(dest[offset:], math.Float32bits(p.HairFaceColor[i])) offset += 4 } // Write HairFaceHighlightColor array for i := 0; i < 3; i++ { binary.LittleEndian.PutUint32(dest[offset:], math.Float32bits(p.HairFaceHighlightColor[i])) offset += 4 } // Write ChestFile as 16-bit length-prefixed string binary.LittleEndian.PutUint16(dest[offset:], uint16(len(p.ChestFile))) offset += 2 copy(dest[offset:], []byte(p.ChestFile)) offset += uint32(len(p.ChestFile)) // Write ShirtColor array for i := 0; i < 3; i++ { binary.LittleEndian.PutUint32(dest[offset:], math.Float32bits(p.ShirtColor[i])) offset += 4 } // Write UnknownChestColor array for i := 0; i < 3; i++ { binary.LittleEndian.PutUint32(dest[offset:], math.Float32bits(p.UnknownChestColor[i])) offset += 4 } // Write LegsFile as 16-bit length-prefixed string binary.LittleEndian.PutUint16(dest[offset:], uint16(len(p.LegsFile))) offset += 2 copy(dest[offset:], []byte(p.LegsFile)) offset += uint32(len(p.LegsFile)) // Write PantsColor array for i := 0; i < 3; i++ { binary.LittleEndian.PutUint32(dest[offset:], math.Float32bits(p.PantsColor[i])) offset += 4 } // Write UnknownLegsColor array for i := 0; i < 3; i++ { binary.LittleEndian.PutUint32(dest[offset:], math.Float32bits(p.UnknownLegsColor[i])) offset += 4 } // Write Unknown9 array for i := 0; i < 3; i++ { binary.LittleEndian.PutUint32(dest[offset:], math.Float32bits(p.Unknown9[i])) offset += 4 } // Write Eyes2 array for i := 0; i < 3; i++ { binary.LittleEndian.PutUint32(dest[offset:], math.Float32bits(p.Eyes2[i])) offset += 4 } // Write Ears array for i := 0; i < 3; i++ { binary.LittleEndian.PutUint32(dest[offset:], math.Float32bits(p.Ears[i])) offset += 4 } // Write EyeBrows array for i := 0; i < 3; i++ { binary.LittleEndian.PutUint32(dest[offset:], math.Float32bits(p.EyeBrows[i])) offset += 4 } // Write Cheeks array for i := 0; i < 3; i++ { binary.LittleEndian.PutUint32(dest[offset:], math.Float32bits(p.Cheeks[i])) offset += 4 } // Write Lips array for i := 0; i < 3; i++ { binary.LittleEndian.PutUint32(dest[offset:], math.Float32bits(p.Lips[i])) offset += 4 } // Write Chin array for i := 0; i < 3; i++ { binary.LittleEndian.PutUint32(dest[offset:], math.Float32bits(p.Chin[i])) offset += 4 } // Write Nose array for i := 0; i < 3; i++ { binary.LittleEndian.PutUint32(dest[offset:], math.Float32bits(p.Nose[i])) offset += 4 } // Write BodySize binary.LittleEndian.PutUint32(dest[offset:], math.Float32bits(p.BodySize)) offset += 4 // Write BodyAge binary.LittleEndian.PutUint32(dest[offset:], math.Float32bits(p.BodyAge)) offset += 4 return offset } // Size returns the serialized size of the packet func (p *CreateCharacterV373) 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 += 1 size += 1 size += 2 size += 2 + uint32(len(p.RaceFile)) size += 3 * 4 size += 3 * 4 size += 3 * 4 size += 3 * 4 size += 3 * 4 size += 26 size += 2 + uint32(len(p.HairFile)) size += 3 * 4 size += 3 * 4 size += 2 + uint32(len(p.FaceFile)) size += 3 * 4 size += 3 * 4 size += 2 + uint32(len(p.ChestFile)) size += 3 * 4 size += 3 * 4 size += 2 + uint32(len(p.LegsFile)) size += 3 * 4 size += 3 * 4 size += 3 * 4 size += 3 * 4 size += 3 * 4 size += 3 * 4 size += 3 * 4 size += 3 * 4 size += 3 * 4 size += 3 * 4 size += 4 size += 4 return size } // CreateCharacterV546 represents packet structure for OP_CreateCharacterRequestMsg type CreateCharacterV546 struct { Unknown0 uint8 `eq2:"unknown0"` // TODO: Identify purpose Unknown1 uint32 `eq2:"unknown1"` // TODO: Identify purpose AccountId uint32 `eq2:"account_id"` ServerId uint32 `eq2:"server_id"` Name string `eq2:"name,type:str16"` Race uint8 `eq2:"race"` Gender uint8 `eq2:"gender"` Deity uint8 `eq2:"deity"` Class uint8 `eq2:"class"` Level uint8 `eq2:"level"` StartingZone uint8 `eq2:"starting_zone"` CcUnknown0 uint8 `eq2:"cc_unknown_0"` Version uint8 `eq2:"version"` RaceFile string `eq2:"race_file,type:str16"` SkinColor [3]float32 `eq2:"skin_color,size:3"` EyeColor [3]float32 `eq2:"eye_color,size:3"` HairColor1 [3]float32 `eq2:"hair_color1,size:3"` HairColor2 [3]float32 `eq2:"hair_color2,size:3"` HairHighlight [3]float32 `eq2:"hair_highlight,size:3"` Unknown2 [26]uint8 `eq2:"unknown2,size:26"` // TODO: Identify purpose HairFile string `eq2:"hair_file,type:str16"` HairTypeColor [3]float32 `eq2:"hair_type_color,size:3"` HairTypeHighlightColor [3]float32 `eq2:"hair_type_highlight_color,size:3"` FaceFile string `eq2:"face_file,type:str16"` HairFaceColor [3]float32 `eq2:"hair_face_color,size:3"` HairFaceHighlightColor [3]float32 `eq2:"hair_face_highlight_color,size:3"` ChestFile string `eq2:"chest_file,type:str16"` ShirtColor [3]float32 `eq2:"shirt_color,size:3"` UnknownChestColor [3]float32 `eq2:"unknown_chest_color,size:3"` // TODO: Identify purpose LegsFile string `eq2:"legs_file,type:str16"` PantsColor [3]float32 `eq2:"pants_color,size:3"` UnknownLegsColor [3]float32 `eq2:"unknown_legs_color,size:3"` // TODO: Identify purpose Unknown9 [3]float32 `eq2:"unknown9,size:3"` // TODO: Identify purpose Eyes2 [3]float32 `eq2:"eyes2,size:3"` Ears [3]float32 `eq2:"ears,size:3"` EyeBrows [3]float32 `eq2:"eye_brows,size:3"` Cheeks [3]float32 `eq2:"cheeks,size:3"` Lips [3]float32 `eq2:"lips,size:3"` Chin [3]float32 `eq2:"chin,size:3"` Nose [3]float32 `eq2:"nose,size:3"` BodySize float32 `eq2:"body_size"` BodyAge float32 `eq2:"body_age"` } // Serialize writes the packet data to the provided buffer func (p *CreateCharacterV546) Serialize(dest []byte) uint32 { offset := uint32(0) // Write Unknown0 dest[offset] = byte(p.Unknown0) offset++ // Write Unknown1 binary.LittleEndian.PutUint32(dest[offset:], uint32(p.Unknown1)) offset += 4 // Write AccountId binary.LittleEndian.PutUint32(dest[offset:], uint32(p.AccountId)) offset += 4 // Write ServerId binary.LittleEndian.PutUint32(dest[offset:], uint32(p.ServerId)) offset += 4 // Write Name as 16-bit length-prefixed string binary.LittleEndian.PutUint16(dest[offset:], uint16(len(p.Name))) offset += 2 copy(dest[offset:], []byte(p.Name)) offset += uint32(len(p.Name)) // Write Race dest[offset] = byte(p.Race) offset++ // Write Gender dest[offset] = byte(p.Gender) offset++ // Write Deity dest[offset] = byte(p.Deity) offset++ // Write Class dest[offset] = byte(p.Class) offset++ // Write Level dest[offset] = byte(p.Level) offset++ // Write StartingZone dest[offset] = byte(p.StartingZone) offset++ // Write CcUnknown0 dest[offset] = byte(p.CcUnknown0) offset++ // Write Version dest[offset] = byte(p.Version) offset++ // Write RaceFile as 16-bit length-prefixed string binary.LittleEndian.PutUint16(dest[offset:], uint16(len(p.RaceFile))) offset += 2 copy(dest[offset:], []byte(p.RaceFile)) offset += uint32(len(p.RaceFile)) // Write SkinColor array for i := 0; i < 3; i++ { binary.LittleEndian.PutUint32(dest[offset:], math.Float32bits(p.SkinColor[i])) offset += 4 } // Write EyeColor array for i := 0; i < 3; i++ { binary.LittleEndian.PutUint32(dest[offset:], math.Float32bits(p.EyeColor[i])) offset += 4 } // Write HairColor1 array for i := 0; i < 3; i++ { binary.LittleEndian.PutUint32(dest[offset:], math.Float32bits(p.HairColor1[i])) offset += 4 } // Write HairColor2 array for i := 0; i < 3; i++ { binary.LittleEndian.PutUint32(dest[offset:], math.Float32bits(p.HairColor2[i])) offset += 4 } // Write HairHighlight array for i := 0; i < 3; i++ { binary.LittleEndian.PutUint32(dest[offset:], math.Float32bits(p.HairHighlight[i])) offset += 4 } // Write Unknown2 array for i := 0; i < 26; i++ { dest[offset] = p.Unknown2[i] offset++ } // Write HairFile as 16-bit length-prefixed string binary.LittleEndian.PutUint16(dest[offset:], uint16(len(p.HairFile))) offset += 2 copy(dest[offset:], []byte(p.HairFile)) offset += uint32(len(p.HairFile)) // Write HairTypeColor array for i := 0; i < 3; i++ { binary.LittleEndian.PutUint32(dest[offset:], math.Float32bits(p.HairTypeColor[i])) offset += 4 } // Write HairTypeHighlightColor array for i := 0; i < 3; i++ { binary.LittleEndian.PutUint32(dest[offset:], math.Float32bits(p.HairTypeHighlightColor[i])) offset += 4 } // Write FaceFile as 16-bit length-prefixed string binary.LittleEndian.PutUint16(dest[offset:], uint16(len(p.FaceFile))) offset += 2 copy(dest[offset:], []byte(p.FaceFile)) offset += uint32(len(p.FaceFile)) // Write HairFaceColor array for i := 0; i < 3; i++ { binary.LittleEndian.PutUint32(dest[offset:], math.Float32bits(p.HairFaceColor[i])) offset += 4 } // Write HairFaceHighlightColor array for i := 0; i < 3; i++ { binary.LittleEndian.PutUint32(dest[offset:], math.Float32bits(p.HairFaceHighlightColor[i])) offset += 4 } // Write ChestFile as 16-bit length-prefixed string binary.LittleEndian.PutUint16(dest[offset:], uint16(len(p.ChestFile))) offset += 2 copy(dest[offset:], []byte(p.ChestFile)) offset += uint32(len(p.ChestFile)) // Write ShirtColor array for i := 0; i < 3; i++ { binary.LittleEndian.PutUint32(dest[offset:], math.Float32bits(p.ShirtColor[i])) offset += 4 } // Write UnknownChestColor array for i := 0; i < 3; i++ { binary.LittleEndian.PutUint32(dest[offset:], math.Float32bits(p.UnknownChestColor[i])) offset += 4 } // Write LegsFile as 16-bit length-prefixed string binary.LittleEndian.PutUint16(dest[offset:], uint16(len(p.LegsFile))) offset += 2 copy(dest[offset:], []byte(p.LegsFile)) offset += uint32(len(p.LegsFile)) // Write PantsColor array for i := 0; i < 3; i++ { binary.LittleEndian.PutUint32(dest[offset:], math.Float32bits(p.PantsColor[i])) offset += 4 } // Write UnknownLegsColor array for i := 0; i < 3; i++ { binary.LittleEndian.PutUint32(dest[offset:], math.Float32bits(p.UnknownLegsColor[i])) offset += 4 } // Write Unknown9 array for i := 0; i < 3; i++ { binary.LittleEndian.PutUint32(dest[offset:], math.Float32bits(p.Unknown9[i])) offset += 4 } // Write Eyes2 array for i := 0; i < 3; i++ { binary.LittleEndian.PutUint32(dest[offset:], math.Float32bits(p.Eyes2[i])) offset += 4 } // Write Ears array for i := 0; i < 3; i++ { binary.LittleEndian.PutUint32(dest[offset:], math.Float32bits(p.Ears[i])) offset += 4 } // Write EyeBrows array for i := 0; i < 3; i++ { binary.LittleEndian.PutUint32(dest[offset:], math.Float32bits(p.EyeBrows[i])) offset += 4 } // Write Cheeks array for i := 0; i < 3; i++ { binary.LittleEndian.PutUint32(dest[offset:], math.Float32bits(p.Cheeks[i])) offset += 4 } // Write Lips array for i := 0; i < 3; i++ { binary.LittleEndian.PutUint32(dest[offset:], math.Float32bits(p.Lips[i])) offset += 4 } // Write Chin array for i := 0; i < 3; i++ { binary.LittleEndian.PutUint32(dest[offset:], math.Float32bits(p.Chin[i])) offset += 4 } // Write Nose array for i := 0; i < 3; i++ { binary.LittleEndian.PutUint32(dest[offset:], math.Float32bits(p.Nose[i])) offset += 4 } // Write BodySize binary.LittleEndian.PutUint32(dest[offset:], math.Float32bits(p.BodySize)) offset += 4 // Write BodyAge binary.LittleEndian.PutUint32(dest[offset:], math.Float32bits(p.BodyAge)) offset += 4 return offset } // Size returns the serialized size of the packet func (p *CreateCharacterV546) Size() uint32 { size := uint32(0) size += 1 size += 4 size += 4 size += 4 size += 2 + uint32(len(p.Name)) size += 1 size += 1 size += 1 size += 1 size += 1 size += 1 size += 1 size += 1 size += 2 + uint32(len(p.RaceFile)) size += 3 * 4 size += 3 * 4 size += 3 * 4 size += 3 * 4 size += 3 * 4 size += 26 size += 2 + uint32(len(p.HairFile)) size += 3 * 4 size += 3 * 4 size += 2 + uint32(len(p.FaceFile)) size += 3 * 4 size += 3 * 4 size += 2 + uint32(len(p.ChestFile)) size += 3 * 4 size += 3 * 4 size += 2 + uint32(len(p.LegsFile)) size += 3 * 4 size += 3 * 4 size += 3 * 4 size += 3 * 4 size += 3 * 4 size += 3 * 4 size += 3 * 4 size += 3 * 4 size += 3 * 4 size += 3 * 4 size += 4 size += 4 return size } // CreateCharacterV561 represents packet structure for OP_CreateCharacterRequestMsg type CreateCharacterV561 struct { Unknown0 uint8 `eq2:"unknown0"` // TODO: Identify purpose Unknown1 uint32 `eq2:"unknown1"` // TODO: Identify purpose AccountId uint32 `eq2:"account_id"` ServerId uint32 `eq2:"server_id"` Name string `eq2:"name,type:str16"` Race uint8 `eq2:"race"` Gender uint8 `eq2:"gender"` Deity uint8 `eq2:"deity"` Class uint8 `eq2:"class"` Level uint8 `eq2:"level"` StartingZone uint8 `eq2:"starting_zone"` Version uint8 `eq2:"version"` RaceFile string `eq2:"race_file,type:str16"` SkinColor [3]float32 `eq2:"skin_color,size:3"` EyeColor [3]float32 `eq2:"eye_color,size:3"` HairColor1 [3]float32 `eq2:"hair_color1,size:3"` HairColor2 [3]float32 `eq2:"hair_color2,size:3"` HairHighlight [3]float32 `eq2:"hair_highlight,size:3"` Unknown2 [26]uint8 `eq2:"unknown2,size:26"` // TODO: Identify purpose HairFile string `eq2:"hair_file,type:str16"` HairTypeColor [3]float32 `eq2:"hair_type_color,size:3"` HairTypeHighlightColor [3]float32 `eq2:"hair_type_highlight_color,size:3"` FaceFile string `eq2:"face_file,type:str16"` HairFaceColor [3]float32 `eq2:"hair_face_color,size:3"` HairFaceHighlightColor [3]float32 `eq2:"hair_face_highlight_color,size:3"` ChestFile string `eq2:"chest_file,type:str16"` ShirtColor [3]float32 `eq2:"shirt_color,size:3"` UnknownChestColor [3]float32 `eq2:"unknown_chest_color,size:3"` // TODO: Identify purpose LegsFile string `eq2:"legs_file,type:str16"` PantsColor [3]float32 `eq2:"pants_color,size:3"` UnknownLegsColor [3]float32 `eq2:"unknown_legs_color,size:3"` // TODO: Identify purpose Unknown9 [3]float32 `eq2:"unknown9,size:3"` // TODO: Identify purpose Eyes2 [3]float32 `eq2:"eyes2,size:3"` Ears [3]float32 `eq2:"ears,size:3"` EyeBrows [3]float32 `eq2:"eye_brows,size:3"` Cheeks [3]float32 `eq2:"cheeks,size:3"` Lips [3]float32 `eq2:"lips,size:3"` Chin [3]float32 `eq2:"chin,size:3"` Nose [3]float32 `eq2:"nose,size:3"` BodySize float32 `eq2:"body_size"` BodyAge float32 `eq2:"body_age"` } // Serialize writes the packet data to the provided buffer func (p *CreateCharacterV561) Serialize(dest []byte) uint32 { offset := uint32(0) // Write Unknown0 dest[offset] = byte(p.Unknown0) offset++ // Write Unknown1 binary.LittleEndian.PutUint32(dest[offset:], uint32(p.Unknown1)) offset += 4 // Write AccountId binary.LittleEndian.PutUint32(dest[offset:], uint32(p.AccountId)) offset += 4 // Write ServerId binary.LittleEndian.PutUint32(dest[offset:], uint32(p.ServerId)) offset += 4 // Write Name as 16-bit length-prefixed string binary.LittleEndian.PutUint16(dest[offset:], uint16(len(p.Name))) offset += 2 copy(dest[offset:], []byte(p.Name)) offset += uint32(len(p.Name)) // Write Race dest[offset] = byte(p.Race) offset++ // Write Gender dest[offset] = byte(p.Gender) offset++ // Write Deity dest[offset] = byte(p.Deity) offset++ // Write Class dest[offset] = byte(p.Class) offset++ // Write Level dest[offset] = byte(p.Level) offset++ // Write StartingZone dest[offset] = byte(p.StartingZone) offset++ // Write Version dest[offset] = byte(p.Version) offset++ // Write RaceFile as 16-bit length-prefixed string binary.LittleEndian.PutUint16(dest[offset:], uint16(len(p.RaceFile))) offset += 2 copy(dest[offset:], []byte(p.RaceFile)) offset += uint32(len(p.RaceFile)) // Write SkinColor array for i := 0; i < 3; i++ { binary.LittleEndian.PutUint32(dest[offset:], math.Float32bits(p.SkinColor[i])) offset += 4 } // Write EyeColor array for i := 0; i < 3; i++ { binary.LittleEndian.PutUint32(dest[offset:], math.Float32bits(p.EyeColor[i])) offset += 4 } // Write HairColor1 array for i := 0; i < 3; i++ { binary.LittleEndian.PutUint32(dest[offset:], math.Float32bits(p.HairColor1[i])) offset += 4 } // Write HairColor2 array for i := 0; i < 3; i++ { binary.LittleEndian.PutUint32(dest[offset:], math.Float32bits(p.HairColor2[i])) offset += 4 } // Write HairHighlight array for i := 0; i < 3; i++ { binary.LittleEndian.PutUint32(dest[offset:], math.Float32bits(p.HairHighlight[i])) offset += 4 } // Write Unknown2 array for i := 0; i < 26; i++ { dest[offset] = p.Unknown2[i] offset++ } // Write HairFile as 16-bit length-prefixed string binary.LittleEndian.PutUint16(dest[offset:], uint16(len(p.HairFile))) offset += 2 copy(dest[offset:], []byte(p.HairFile)) offset += uint32(len(p.HairFile)) // Write HairTypeColor array for i := 0; i < 3; i++ { binary.LittleEndian.PutUint32(dest[offset:], math.Float32bits(p.HairTypeColor[i])) offset += 4 } // Write HairTypeHighlightColor array for i := 0; i < 3; i++ { binary.LittleEndian.PutUint32(dest[offset:], math.Float32bits(p.HairTypeHighlightColor[i])) offset += 4 } // Write FaceFile as 16-bit length-prefixed string binary.LittleEndian.PutUint16(dest[offset:], uint16(len(p.FaceFile))) offset += 2 copy(dest[offset:], []byte(p.FaceFile)) offset += uint32(len(p.FaceFile)) // Write HairFaceColor array for i := 0; i < 3; i++ { binary.LittleEndian.PutUint32(dest[offset:], math.Float32bits(p.HairFaceColor[i])) offset += 4 } // Write HairFaceHighlightColor array for i := 0; i < 3; i++ { binary.LittleEndian.PutUint32(dest[offset:], math.Float32bits(p.HairFaceHighlightColor[i])) offset += 4 } // Write ChestFile as 16-bit length-prefixed string binary.LittleEndian.PutUint16(dest[offset:], uint16(len(p.ChestFile))) offset += 2 copy(dest[offset:], []byte(p.ChestFile)) offset += uint32(len(p.ChestFile)) // Write ShirtColor array for i := 0; i < 3; i++ { binary.LittleEndian.PutUint32(dest[offset:], math.Float32bits(p.ShirtColor[i])) offset += 4 } // Write UnknownChestColor array for i := 0; i < 3; i++ { binary.LittleEndian.PutUint32(dest[offset:], math.Float32bits(p.UnknownChestColor[i])) offset += 4 } // Write LegsFile as 16-bit length-prefixed string binary.LittleEndian.PutUint16(dest[offset:], uint16(len(p.LegsFile))) offset += 2 copy(dest[offset:], []byte(p.LegsFile)) offset += uint32(len(p.LegsFile)) // Write PantsColor array for i := 0; i < 3; i++ { binary.LittleEndian.PutUint32(dest[offset:], math.Float32bits(p.PantsColor[i])) offset += 4 } // Write UnknownLegsColor array for i := 0; i < 3; i++ { binary.LittleEndian.PutUint32(dest[offset:], math.Float32bits(p.UnknownLegsColor[i])) offset += 4 } // Write Unknown9 array for i := 0; i < 3; i++ { binary.LittleEndian.PutUint32(dest[offset:], math.Float32bits(p.Unknown9[i])) offset += 4 } // Write Eyes2 array for i := 0; i < 3; i++ { binary.LittleEndian.PutUint32(dest[offset:], math.Float32bits(p.Eyes2[i])) offset += 4 } // Write Ears array for i := 0; i < 3; i++ { binary.LittleEndian.PutUint32(dest[offset:], math.Float32bits(p.Ears[i])) offset += 4 } // Write EyeBrows array for i := 0; i < 3; i++ { binary.LittleEndian.PutUint32(dest[offset:], math.Float32bits(p.EyeBrows[i])) offset += 4 } // Write Cheeks array for i := 0; i < 3; i++ { binary.LittleEndian.PutUint32(dest[offset:], math.Float32bits(p.Cheeks[i])) offset += 4 } // Write Lips array for i := 0; i < 3; i++ { binary.LittleEndian.PutUint32(dest[offset:], math.Float32bits(p.Lips[i])) offset += 4 } // Write Chin array for i := 0; i < 3; i++ { binary.LittleEndian.PutUint32(dest[offset:], math.Float32bits(p.Chin[i])) offset += 4 } // Write Nose array for i := 0; i < 3; i++ { binary.LittleEndian.PutUint32(dest[offset:], math.Float32bits(p.Nose[i])) offset += 4 } // Write BodySize binary.LittleEndian.PutUint32(dest[offset:], math.Float32bits(p.BodySize)) offset += 4 // Write BodyAge binary.LittleEndian.PutUint32(dest[offset:], math.Float32bits(p.BodyAge)) offset += 4 return offset } // Size returns the serialized size of the packet func (p *CreateCharacterV561) Size() uint32 { size := uint32(0) size += 1 size += 4 size += 4 size += 4 size += 2 + uint32(len(p.Name)) size += 1 size += 1 size += 1 size += 1 size += 1 size += 1 size += 1 size += 2 + uint32(len(p.RaceFile)) size += 3 * 4 size += 3 * 4 size += 3 * 4 size += 3 * 4 size += 3 * 4 size += 26 size += 2 + uint32(len(p.HairFile)) size += 3 * 4 size += 3 * 4 size += 2 + uint32(len(p.FaceFile)) size += 3 * 4 size += 3 * 4 size += 2 + uint32(len(p.ChestFile)) size += 3 * 4 size += 3 * 4 size += 2 + uint32(len(p.LegsFile)) size += 3 * 4 size += 3 * 4 size += 3 * 4 size += 3 * 4 size += 3 * 4 size += 3 * 4 size += 3 * 4 size += 3 * 4 size += 3 * 4 size += 3 * 4 size += 4 size += 4 return size } // CreateCharacterV562 represents packet structure for OP_CreateCharacterRequestMsg type CreateCharacterV562 struct { Unknown0 uint8 `eq2:"unknown0"` // TODO: Identify purpose Unknown1 uint32 `eq2:"unknown1"` // TODO: Identify purpose AccountId uint32 `eq2:"account_id"` Unknown3 uint8 `eq2:"unknown3"` // TODO: Identify purpose ServerId uint32 `eq2:"server_id"` Name string `eq2:"name,type:str16"` Race uint8 `eq2:"race"` Gender uint8 `eq2:"gender"` Deity uint8 `eq2:"deity"` Class uint8 `eq2:"class"` Level uint8 `eq2:"level"` StartingZone uint8 `eq2:"starting_zone"` Version uint8 `eq2:"version"` RaceFile string `eq2:"race_file,type:str16"` SkinColor types.Color `eq2:"skin_color"` SkinColor2 types.Color `eq2:"skin_color2"` EyeColor types.Color `eq2:"eye_color"` HairColor1 types.Color `eq2:"hair_color1"` HairColor2 types.Color `eq2:"hair_color2"` Unknown8 [26]uint8 `eq2:"unknown8,size:26"` // TODO: Identify purpose HairFile string `eq2:"hair_file,type:str16"` HairTypeColor types.Color `eq2:"hair_type_color"` HairTypeHighlightColor types.Color `eq2:"hair_type_highlight_color"` FaceFile string `eq2:"face_file,type:str16"` HairFaceColor types.Color `eq2:"hair_face_color"` HairFaceHighlightColor types.Color `eq2:"hair_face_highlight_color"` WingFile string `eq2:"wing_file,type:str16"` WingColor1 types.Color `eq2:"wing_color1"` WingColor2 types.Color `eq2:"wing_color2"` ChestFile string `eq2:"chest_file,type:str16"` ShirtColor types.Color `eq2:"shirt_color"` UnknownChestColor types.Color `eq2:"unknown_chest_color"` // TODO: Identify purpose LegsFile string `eq2:"legs_file,type:str16"` PantsColor types.Color `eq2:"pants_color"` UnknownLegsColor types.Color `eq2:"unknown_legs_color"` // TODO: Identify purpose Unknown9 types.Color `eq2:"unknown9"` // TODO: Identify purpose Eyes2 [3]float32 `eq2:"eyes2,size:3"` Ears [3]float32 `eq2:"ears,size:3"` EyeBrows [3]float32 `eq2:"eye_brows,size:3"` Cheeks [3]float32 `eq2:"cheeks,size:3"` Lips [3]float32 `eq2:"lips,size:3"` Chin [3]float32 `eq2:"chin,size:3"` Nose [3]float32 `eq2:"nose,size:3"` BodySize float32 `eq2:"body_size"` BodyAge float32 `eq2:"body_age"` SogaVersion uint8 `eq2:"soga_version"` SogaRaceFile string `eq2:"soga_race_file,type:str16"` SogaSkinColor types.Color `eq2:"soga_skin_color"` SogaEyeColor types.Color `eq2:"soga_eye_color"` SogaHairColor1 types.Color `eq2:"soga_hair_color1"` SogaHairColor2 types.Color `eq2:"soga_hair_color2"` SogaHairHighlight types.Color `eq2:"soga_hair_highlight"` SogaUnknown11 [26]uint8 `eq2:"soga_unknown11,size:26"` SogaHairFile string `eq2:"soga_hair_file,type:str16"` SogaHairTypeColor types.Color `eq2:"soga_hair_type_color"` SogaHairTypeHighlightColor types.Color `eq2:"soga_hair_type_highlight_color"` SogaFaceFile string `eq2:"soga_face_file,type:str16"` SogaHairFaceColor types.Color `eq2:"soga_hair_face_color"` SogaHairFaceHighlightColor types.Color `eq2:"soga_hair_face_highlight_color"` SogaWingFile string `eq2:"soga_wing_file,type:str16"` SogaWingColor1 types.Color `eq2:"soga_wing_color1"` SogaWingColor2 types.Color `eq2:"soga_wing_color2"` SogaChestFile string `eq2:"soga_chest_file,type:str16"` SogaShirtColor types.Color `eq2:"soga_shirt_color"` SogaUnknownChestColor types.Color `eq2:"soga_unknown_chest_color"` SogaLegsFile string `eq2:"soga_legs_file,type:str16"` SogaPantsColor types.Color `eq2:"soga_pants_color"` SogaUnknownLegsColor types.Color `eq2:"soga_unknown_legs_color"` SogaUnknown12 types.Color `eq2:"soga_unknown12"` SogaEyes2 [3]float32 `eq2:"soga_eyes2,size:3"` SogaEars [3]float32 `eq2:"soga_ears,size:3"` SogaEyeBrows [3]float32 `eq2:"soga_eye_brows,size:3"` SogaCheeks [3]float32 `eq2:"soga_cheeks,size:3"` SogaLips [3]float32 `eq2:"soga_lips,size:3"` SogaChin [3]float32 `eq2:"soga_chin,size:3"` SogaNose [3]float32 `eq2:"soga_nose,size:3"` SogaBodySize float32 `eq2:"soga_body_size"` SogaBodyAge float32 `eq2:"soga_body_age"` } // Serialize writes the packet data to the provided buffer func (p *CreateCharacterV562) Serialize(dest []byte) uint32 { offset := uint32(0) // Write Unknown0 dest[offset] = byte(p.Unknown0) offset++ // Write Unknown1 binary.LittleEndian.PutUint32(dest[offset:], uint32(p.Unknown1)) offset += 4 // Write AccountId binary.LittleEndian.PutUint32(dest[offset:], uint32(p.AccountId)) offset += 4 // Write Unknown3 dest[offset] = byte(p.Unknown3) offset++ // Write ServerId binary.LittleEndian.PutUint32(dest[offset:], uint32(p.ServerId)) offset += 4 // Write Name as 16-bit length-prefixed string binary.LittleEndian.PutUint16(dest[offset:], uint16(len(p.Name))) offset += 2 copy(dest[offset:], []byte(p.Name)) offset += uint32(len(p.Name)) // Write Race dest[offset] = byte(p.Race) offset++ // Write Gender dest[offset] = byte(p.Gender) offset++ // Write Deity dest[offset] = byte(p.Deity) offset++ // Write Class dest[offset] = byte(p.Class) offset++ // Write Level dest[offset] = byte(p.Level) offset++ // Write StartingZone dest[offset] = byte(p.StartingZone) offset++ // Write Version dest[offset] = byte(p.Version) offset++ // Write RaceFile as 16-bit length-prefixed string binary.LittleEndian.PutUint16(dest[offset:], uint16(len(p.RaceFile))) offset += 2 copy(dest[offset:], []byte(p.RaceFile)) offset += uint32(len(p.RaceFile)) // Write SkinColor binary.LittleEndian.PutUint32(dest[offset:], p.SkinColor.ToUint32()) offset += 4 // Write SkinColor2 binary.LittleEndian.PutUint32(dest[offset:], p.SkinColor2.ToUint32()) offset += 4 // Write EyeColor binary.LittleEndian.PutUint32(dest[offset:], p.EyeColor.ToUint32()) offset += 4 // Write HairColor1 binary.LittleEndian.PutUint32(dest[offset:], p.HairColor1.ToUint32()) offset += 4 // Write HairColor2 binary.LittleEndian.PutUint32(dest[offset:], p.HairColor2.ToUint32()) offset += 4 // Write Unknown8 array for i := 0; i < 26; i++ { dest[offset] = p.Unknown8[i] offset++ } // Write HairFile as 16-bit length-prefixed string binary.LittleEndian.PutUint16(dest[offset:], uint16(len(p.HairFile))) offset += 2 copy(dest[offset:], []byte(p.HairFile)) offset += uint32(len(p.HairFile)) // Write HairTypeColor binary.LittleEndian.PutUint32(dest[offset:], p.HairTypeColor.ToUint32()) offset += 4 // Write HairTypeHighlightColor binary.LittleEndian.PutUint32(dest[offset:], p.HairTypeHighlightColor.ToUint32()) offset += 4 // Write FaceFile as 16-bit length-prefixed string binary.LittleEndian.PutUint16(dest[offset:], uint16(len(p.FaceFile))) offset += 2 copy(dest[offset:], []byte(p.FaceFile)) offset += uint32(len(p.FaceFile)) // Write HairFaceColor binary.LittleEndian.PutUint32(dest[offset:], p.HairFaceColor.ToUint32()) offset += 4 // Write HairFaceHighlightColor binary.LittleEndian.PutUint32(dest[offset:], p.HairFaceHighlightColor.ToUint32()) offset += 4 // Write WingFile as 16-bit length-prefixed string binary.LittleEndian.PutUint16(dest[offset:], uint16(len(p.WingFile))) offset += 2 copy(dest[offset:], []byte(p.WingFile)) offset += uint32(len(p.WingFile)) // Write WingColor1 binary.LittleEndian.PutUint32(dest[offset:], p.WingColor1.ToUint32()) offset += 4 // Write WingColor2 binary.LittleEndian.PutUint32(dest[offset:], p.WingColor2.ToUint32()) offset += 4 // Write ChestFile as 16-bit length-prefixed string binary.LittleEndian.PutUint16(dest[offset:], uint16(len(p.ChestFile))) offset += 2 copy(dest[offset:], []byte(p.ChestFile)) offset += uint32(len(p.ChestFile)) // Write ShirtColor binary.LittleEndian.PutUint32(dest[offset:], p.ShirtColor.ToUint32()) offset += 4 // Write UnknownChestColor binary.LittleEndian.PutUint32(dest[offset:], p.UnknownChestColor.ToUint32()) offset += 4 // Write LegsFile as 16-bit length-prefixed string binary.LittleEndian.PutUint16(dest[offset:], uint16(len(p.LegsFile))) offset += 2 copy(dest[offset:], []byte(p.LegsFile)) offset += uint32(len(p.LegsFile)) // Write PantsColor binary.LittleEndian.PutUint32(dest[offset:], p.PantsColor.ToUint32()) offset += 4 // Write UnknownLegsColor binary.LittleEndian.PutUint32(dest[offset:], p.UnknownLegsColor.ToUint32()) offset += 4 // Write Unknown9 binary.LittleEndian.PutUint32(dest[offset:], p.Unknown9.ToUint32()) offset += 4 // Write Eyes2 array for i := 0; i < 3; i++ { binary.LittleEndian.PutUint32(dest[offset:], math.Float32bits(p.Eyes2[i])) offset += 4 } // Write Ears array for i := 0; i < 3; i++ { binary.LittleEndian.PutUint32(dest[offset:], math.Float32bits(p.Ears[i])) offset += 4 } // Write EyeBrows array for i := 0; i < 3; i++ { binary.LittleEndian.PutUint32(dest[offset:], math.Float32bits(p.EyeBrows[i])) offset += 4 } // Write Cheeks array for i := 0; i < 3; i++ { binary.LittleEndian.PutUint32(dest[offset:], math.Float32bits(p.Cheeks[i])) offset += 4 } // Write Lips array for i := 0; i < 3; i++ { binary.LittleEndian.PutUint32(dest[offset:], math.Float32bits(p.Lips[i])) offset += 4 } // Write Chin array for i := 0; i < 3; i++ { binary.LittleEndian.PutUint32(dest[offset:], math.Float32bits(p.Chin[i])) offset += 4 } // Write Nose array for i := 0; i < 3; i++ { binary.LittleEndian.PutUint32(dest[offset:], math.Float32bits(p.Nose[i])) offset += 4 } // Write BodySize binary.LittleEndian.PutUint32(dest[offset:], math.Float32bits(p.BodySize)) offset += 4 // Write BodyAge binary.LittleEndian.PutUint32(dest[offset:], math.Float32bits(p.BodyAge)) offset += 4 // Write SogaVersion dest[offset] = byte(p.SogaVersion) offset++ // Write SogaRaceFile as 16-bit length-prefixed string binary.LittleEndian.PutUint16(dest[offset:], uint16(len(p.SogaRaceFile))) offset += 2 copy(dest[offset:], []byte(p.SogaRaceFile)) offset += uint32(len(p.SogaRaceFile)) // Write SogaSkinColor binary.LittleEndian.PutUint32(dest[offset:], p.SogaSkinColor.ToUint32()) offset += 4 // Write SogaEyeColor binary.LittleEndian.PutUint32(dest[offset:], p.SogaEyeColor.ToUint32()) offset += 4 // Write SogaHairColor1 binary.LittleEndian.PutUint32(dest[offset:], p.SogaHairColor1.ToUint32()) offset += 4 // Write SogaHairColor2 binary.LittleEndian.PutUint32(dest[offset:], p.SogaHairColor2.ToUint32()) offset += 4 // Write SogaHairHighlight binary.LittleEndian.PutUint32(dest[offset:], p.SogaHairHighlight.ToUint32()) offset += 4 // Write SogaUnknown11 array for i := 0; i < 26; i++ { dest[offset] = p.SogaUnknown11[i] offset++ } // Write SogaHairFile as 16-bit length-prefixed string binary.LittleEndian.PutUint16(dest[offset:], uint16(len(p.SogaHairFile))) offset += 2 copy(dest[offset:], []byte(p.SogaHairFile)) offset += uint32(len(p.SogaHairFile)) // Write SogaHairTypeColor binary.LittleEndian.PutUint32(dest[offset:], p.SogaHairTypeColor.ToUint32()) offset += 4 // Write SogaHairTypeHighlightColor binary.LittleEndian.PutUint32(dest[offset:], p.SogaHairTypeHighlightColor.ToUint32()) offset += 4 // Write SogaFaceFile as 16-bit length-prefixed string binary.LittleEndian.PutUint16(dest[offset:], uint16(len(p.SogaFaceFile))) offset += 2 copy(dest[offset:], []byte(p.SogaFaceFile)) offset += uint32(len(p.SogaFaceFile)) // Write SogaHairFaceColor binary.LittleEndian.PutUint32(dest[offset:], p.SogaHairFaceColor.ToUint32()) offset += 4 // Write SogaHairFaceHighlightColor binary.LittleEndian.PutUint32(dest[offset:], p.SogaHairFaceHighlightColor.ToUint32()) offset += 4 // Write SogaWingFile as 16-bit length-prefixed string binary.LittleEndian.PutUint16(dest[offset:], uint16(len(p.SogaWingFile))) offset += 2 copy(dest[offset:], []byte(p.SogaWingFile)) offset += uint32(len(p.SogaWingFile)) // Write SogaWingColor1 binary.LittleEndian.PutUint32(dest[offset:], p.SogaWingColor1.ToUint32()) offset += 4 // Write SogaWingColor2 binary.LittleEndian.PutUint32(dest[offset:], p.SogaWingColor2.ToUint32()) offset += 4 // Write SogaChestFile as 16-bit length-prefixed string binary.LittleEndian.PutUint16(dest[offset:], uint16(len(p.SogaChestFile))) offset += 2 copy(dest[offset:], []byte(p.SogaChestFile)) offset += uint32(len(p.SogaChestFile)) // Write SogaShirtColor binary.LittleEndian.PutUint32(dest[offset:], p.SogaShirtColor.ToUint32()) offset += 4 // Write SogaUnknownChestColor binary.LittleEndian.PutUint32(dest[offset:], p.SogaUnknownChestColor.ToUint32()) offset += 4 // Write SogaLegsFile as 16-bit length-prefixed string binary.LittleEndian.PutUint16(dest[offset:], uint16(len(p.SogaLegsFile))) offset += 2 copy(dest[offset:], []byte(p.SogaLegsFile)) offset += uint32(len(p.SogaLegsFile)) // Write SogaPantsColor binary.LittleEndian.PutUint32(dest[offset:], p.SogaPantsColor.ToUint32()) offset += 4 // Write SogaUnknownLegsColor binary.LittleEndian.PutUint32(dest[offset:], p.SogaUnknownLegsColor.ToUint32()) offset += 4 // Write SogaUnknown12 binary.LittleEndian.PutUint32(dest[offset:], p.SogaUnknown12.ToUint32()) offset += 4 // Write SogaEyes2 array for i := 0; i < 3; i++ { binary.LittleEndian.PutUint32(dest[offset:], math.Float32bits(p.SogaEyes2[i])) offset += 4 } // Write SogaEars array for i := 0; i < 3; i++ { binary.LittleEndian.PutUint32(dest[offset:], math.Float32bits(p.SogaEars[i])) offset += 4 } // Write SogaEyeBrows array for i := 0; i < 3; i++ { binary.LittleEndian.PutUint32(dest[offset:], math.Float32bits(p.SogaEyeBrows[i])) offset += 4 } // Write SogaCheeks array for i := 0; i < 3; i++ { binary.LittleEndian.PutUint32(dest[offset:], math.Float32bits(p.SogaCheeks[i])) offset += 4 } // Write SogaLips array for i := 0; i < 3; i++ { binary.LittleEndian.PutUint32(dest[offset:], math.Float32bits(p.SogaLips[i])) offset += 4 } // Write SogaChin array for i := 0; i < 3; i++ { binary.LittleEndian.PutUint32(dest[offset:], math.Float32bits(p.SogaChin[i])) offset += 4 } // Write SogaNose array for i := 0; i < 3; i++ { binary.LittleEndian.PutUint32(dest[offset:], math.Float32bits(p.SogaNose[i])) offset += 4 } // Write SogaBodySize binary.LittleEndian.PutUint32(dest[offset:], math.Float32bits(p.SogaBodySize)) offset += 4 // Write SogaBodyAge binary.LittleEndian.PutUint32(dest[offset:], math.Float32bits(p.SogaBodyAge)) offset += 4 return offset } // Size returns the serialized size of the packet func (p *CreateCharacterV562) Size() uint32 { size := uint32(0) size += 1 size += 4 size += 4 size += 1 size += 4 size += 2 + uint32(len(p.Name)) size += 1 size += 1 size += 1 size += 1 size += 1 size += 1 size += 1 size += 2 + uint32(len(p.RaceFile)) size += 4 size += 4 size += 4 size += 4 size += 4 size += 26 size += 2 + uint32(len(p.HairFile)) size += 4 size += 4 size += 2 + uint32(len(p.FaceFile)) size += 4 size += 4 size += 2 + uint32(len(p.WingFile)) size += 4 size += 4 size += 2 + uint32(len(p.ChestFile)) size += 4 size += 4 size += 2 + uint32(len(p.LegsFile)) size += 4 size += 4 size += 4 size += 3 * 4 size += 3 * 4 size += 3 * 4 size += 3 * 4 size += 3 * 4 size += 3 * 4 size += 3 * 4 size += 4 size += 4 size += 1 size += 2 + uint32(len(p.SogaRaceFile)) size += 4 size += 4 size += 4 size += 4 size += 4 size += 26 size += 2 + uint32(len(p.SogaHairFile)) size += 4 size += 4 size += 2 + uint32(len(p.SogaFaceFile)) size += 4 size += 4 size += 2 + uint32(len(p.SogaWingFile)) size += 4 size += 4 size += 2 + uint32(len(p.SogaChestFile)) size += 4 size += 4 size += 2 + uint32(len(p.SogaLegsFile)) size += 4 size += 4 size += 4 size += 3 * 4 size += 3 * 4 size += 3 * 4 size += 3 * 4 size += 3 * 4 size += 3 * 4 size += 3 * 4 size += 4 size += 4 return size } // CreateCharacterV869 represents packet structure for OP_CreateCharacterRequestMsg type CreateCharacterV869 struct { Unknown0 uint8 `eq2:"unknown0"` // TODO: Identify purpose Unknown1 uint32 `eq2:"unknown1"` // TODO: Identify purpose AccountId uint32 `eq2:"account_id"` Unknown3 uint8 `eq2:"unknown3"` // TODO: Identify purpose ServerId uint32 `eq2:"server_id"` Name string `eq2:"name,type:str16"` Race uint8 `eq2:"race"` Gender uint8 `eq2:"gender"` Deity uint8 `eq2:"deity"` Class uint8 `eq2:"class"` Level uint8 `eq2:"level"` StartingZone uint8 `eq2:"starting_zone"` Version uint8 `eq2:"version"` RaceFile string `eq2:"race_file,type:str16"` SkinColor types.Color `eq2:"skin_color"` SkinColor2 types.Color `eq2:"skin_color2"` EyeColor types.Color `eq2:"eye_color"` HairColor1 types.Color `eq2:"hair_color1"` HairColor2 types.Color `eq2:"hair_color2"` HairHighlight types.Color `eq2:"hair_highlight"` Unknown8 [26]uint8 `eq2:"unknown8,size:26"` // TODO: Identify purpose HairFile string `eq2:"hair_file,type:str16"` HairTypeColor types.Color `eq2:"hair_type_color"` HairTypeHighlightColor types.Color `eq2:"hair_type_highlight_color"` FaceFile string `eq2:"face_file,type:str16"` HairFaceColor types.Color `eq2:"hair_face_color"` HairFaceHighlightColor types.Color `eq2:"hair_face_highlight_color"` WingFile string `eq2:"wing_file,type:str16"` WingColor1 types.Color `eq2:"wing_color1"` WingColor2 types.Color `eq2:"wing_color2"` ChestFile string `eq2:"chest_file,type:str16"` ShirtColor types.Color `eq2:"shirt_color"` UnknownChestColor types.Color `eq2:"unknown_chest_color"` // TODO: Identify purpose LegsFile string `eq2:"legs_file,type:str16"` PantsColor types.Color `eq2:"pants_color"` UnknownLegsColor types.Color `eq2:"unknown_legs_color"` // TODO: Identify purpose Unknown9 types.Color `eq2:"unknown9"` // TODO: Identify purpose Eyes2 [3]float32 `eq2:"eyes2,size:3"` Ears [3]float32 `eq2:"ears,size:3"` EyeBrows [3]float32 `eq2:"eye_brows,size:3"` Cheeks [3]float32 `eq2:"cheeks,size:3"` Lips [3]float32 `eq2:"lips,size:3"` Chin [3]float32 `eq2:"chin,size:3"` Nose [3]float32 `eq2:"nose,size:3"` BodySize float32 `eq2:"body_size"` BodyAge float32 `eq2:"body_age"` SogaVersion uint8 `eq2:"soga_version"` SogaRaceFile string `eq2:"soga_race_file,type:str16"` SogaSkinColor types.Color `eq2:"soga_skin_color"` SogaEyeColor types.Color `eq2:"soga_eye_color"` SogaHairColor1 types.Color `eq2:"soga_hair_color1"` SogaHairColor2 types.Color `eq2:"soga_hair_color2"` SogaHairHighlight types.Color `eq2:"soga_hair_highlight"` SogaUnknownColor1 types.Color `eq2:"soga_unknown_color1"` SogaUnknown11 [26]uint8 `eq2:"soga_unknown11,size:26"` SogaHairFile string `eq2:"soga_hair_file,type:str16"` SogaHairTypeColor types.Color `eq2:"soga_hair_type_color"` SogaHairTypeHighlightColor types.Color `eq2:"soga_hair_type_highlight_color"` SogaFaceFile string `eq2:"soga_face_file,type:str16"` SogaHairFaceColor types.Color `eq2:"soga_hair_face_color"` SogaHairFaceHighlightColor types.Color `eq2:"soga_hair_face_highlight_color"` SogaWingFile string `eq2:"soga_wing_file,type:str16"` SogaWingColor1 types.Color `eq2:"soga_wing_color1"` SogaWingColor2 types.Color `eq2:"soga_wing_color2"` SogaChestFile string `eq2:"soga_chest_file,type:str16"` SogaShirtColor types.Color `eq2:"soga_shirt_color"` SogaUnknownChestColor types.Color `eq2:"soga_unknown_chest_color"` SogaLegsFile string `eq2:"soga_legs_file,type:str16"` SogaPantsColor types.Color `eq2:"soga_pants_color"` SogaUnknownLegsColor types.Color `eq2:"soga_unknown_legs_color"` SogaUnknown12 types.Color `eq2:"soga_unknown12"` SogaEyes2 [3]float32 `eq2:"soga_eyes2,size:3"` SogaEars [3]float32 `eq2:"soga_ears,size:3"` SogaEyeBrows [3]float32 `eq2:"soga_eye_brows,size:3"` SogaCheeks [3]float32 `eq2:"soga_cheeks,size:3"` SogaLips [3]float32 `eq2:"soga_lips,size:3"` SogaChin [3]float32 `eq2:"soga_chin,size:3"` SogaNose [3]float32 `eq2:"soga_nose,size:3"` SogaBodySize float32 `eq2:"soga_body_size"` SogaBodyAge float32 `eq2:"soga_body_age"` } // Serialize writes the packet data to the provided buffer func (p *CreateCharacterV869) Serialize(dest []byte) uint32 { offset := uint32(0) // Write Unknown0 dest[offset] = byte(p.Unknown0) offset++ // Write Unknown1 binary.LittleEndian.PutUint32(dest[offset:], uint32(p.Unknown1)) offset += 4 // Write AccountId binary.LittleEndian.PutUint32(dest[offset:], uint32(p.AccountId)) offset += 4 // Write Unknown3 dest[offset] = byte(p.Unknown3) offset++ // Write ServerId binary.LittleEndian.PutUint32(dest[offset:], uint32(p.ServerId)) offset += 4 // Write Name as 16-bit length-prefixed string binary.LittleEndian.PutUint16(dest[offset:], uint16(len(p.Name))) offset += 2 copy(dest[offset:], []byte(p.Name)) offset += uint32(len(p.Name)) // Write Race dest[offset] = byte(p.Race) offset++ // Write Gender dest[offset] = byte(p.Gender) offset++ // Write Deity dest[offset] = byte(p.Deity) offset++ // Write Class dest[offset] = byte(p.Class) offset++ // Write Level dest[offset] = byte(p.Level) offset++ // Write StartingZone dest[offset] = byte(p.StartingZone) offset++ // Write Version dest[offset] = byte(p.Version) offset++ // Write RaceFile as 16-bit length-prefixed string binary.LittleEndian.PutUint16(dest[offset:], uint16(len(p.RaceFile))) offset += 2 copy(dest[offset:], []byte(p.RaceFile)) offset += uint32(len(p.RaceFile)) // Write SkinColor binary.LittleEndian.PutUint32(dest[offset:], p.SkinColor.ToUint32()) offset += 4 // Write SkinColor2 binary.LittleEndian.PutUint32(dest[offset:], p.SkinColor2.ToUint32()) offset += 4 // Write EyeColor binary.LittleEndian.PutUint32(dest[offset:], p.EyeColor.ToUint32()) offset += 4 // Write HairColor1 binary.LittleEndian.PutUint32(dest[offset:], p.HairColor1.ToUint32()) offset += 4 // Write HairColor2 binary.LittleEndian.PutUint32(dest[offset:], p.HairColor2.ToUint32()) offset += 4 // Write HairHighlight binary.LittleEndian.PutUint32(dest[offset:], p.HairHighlight.ToUint32()) offset += 4 // Write Unknown8 array for i := 0; i < 26; i++ { dest[offset] = p.Unknown8[i] offset++ } // Write HairFile as 16-bit length-prefixed string binary.LittleEndian.PutUint16(dest[offset:], uint16(len(p.HairFile))) offset += 2 copy(dest[offset:], []byte(p.HairFile)) offset += uint32(len(p.HairFile)) // Write HairTypeColor binary.LittleEndian.PutUint32(dest[offset:], p.HairTypeColor.ToUint32()) offset += 4 // Write HairTypeHighlightColor binary.LittleEndian.PutUint32(dest[offset:], p.HairTypeHighlightColor.ToUint32()) offset += 4 // Write FaceFile as 16-bit length-prefixed string binary.LittleEndian.PutUint16(dest[offset:], uint16(len(p.FaceFile))) offset += 2 copy(dest[offset:], []byte(p.FaceFile)) offset += uint32(len(p.FaceFile)) // Write HairFaceColor binary.LittleEndian.PutUint32(dest[offset:], p.HairFaceColor.ToUint32()) offset += 4 // Write HairFaceHighlightColor binary.LittleEndian.PutUint32(dest[offset:], p.HairFaceHighlightColor.ToUint32()) offset += 4 // Write WingFile as 16-bit length-prefixed string binary.LittleEndian.PutUint16(dest[offset:], uint16(len(p.WingFile))) offset += 2 copy(dest[offset:], []byte(p.WingFile)) offset += uint32(len(p.WingFile)) // Write WingColor1 binary.LittleEndian.PutUint32(dest[offset:], p.WingColor1.ToUint32()) offset += 4 // Write WingColor2 binary.LittleEndian.PutUint32(dest[offset:], p.WingColor2.ToUint32()) offset += 4 // Write ChestFile as 16-bit length-prefixed string binary.LittleEndian.PutUint16(dest[offset:], uint16(len(p.ChestFile))) offset += 2 copy(dest[offset:], []byte(p.ChestFile)) offset += uint32(len(p.ChestFile)) // Write ShirtColor binary.LittleEndian.PutUint32(dest[offset:], p.ShirtColor.ToUint32()) offset += 4 // Write UnknownChestColor binary.LittleEndian.PutUint32(dest[offset:], p.UnknownChestColor.ToUint32()) offset += 4 // Write LegsFile as 16-bit length-prefixed string binary.LittleEndian.PutUint16(dest[offset:], uint16(len(p.LegsFile))) offset += 2 copy(dest[offset:], []byte(p.LegsFile)) offset += uint32(len(p.LegsFile)) // Write PantsColor binary.LittleEndian.PutUint32(dest[offset:], p.PantsColor.ToUint32()) offset += 4 // Write UnknownLegsColor binary.LittleEndian.PutUint32(dest[offset:], p.UnknownLegsColor.ToUint32()) offset += 4 // Write Unknown9 binary.LittleEndian.PutUint32(dest[offset:], p.Unknown9.ToUint32()) offset += 4 // Write Eyes2 array for i := 0; i < 3; i++ { binary.LittleEndian.PutUint32(dest[offset:], math.Float32bits(p.Eyes2[i])) offset += 4 } // Write Ears array for i := 0; i < 3; i++ { binary.LittleEndian.PutUint32(dest[offset:], math.Float32bits(p.Ears[i])) offset += 4 } // Write EyeBrows array for i := 0; i < 3; i++ { binary.LittleEndian.PutUint32(dest[offset:], math.Float32bits(p.EyeBrows[i])) offset += 4 } // Write Cheeks array for i := 0; i < 3; i++ { binary.LittleEndian.PutUint32(dest[offset:], math.Float32bits(p.Cheeks[i])) offset += 4 } // Write Lips array for i := 0; i < 3; i++ { binary.LittleEndian.PutUint32(dest[offset:], math.Float32bits(p.Lips[i])) offset += 4 } // Write Chin array for i := 0; i < 3; i++ { binary.LittleEndian.PutUint32(dest[offset:], math.Float32bits(p.Chin[i])) offset += 4 } // Write Nose array for i := 0; i < 3; i++ { binary.LittleEndian.PutUint32(dest[offset:], math.Float32bits(p.Nose[i])) offset += 4 } // Write BodySize binary.LittleEndian.PutUint32(dest[offset:], math.Float32bits(p.BodySize)) offset += 4 // Write BodyAge binary.LittleEndian.PutUint32(dest[offset:], math.Float32bits(p.BodyAge)) offset += 4 // Write SogaVersion dest[offset] = byte(p.SogaVersion) offset++ // Write SogaRaceFile as 16-bit length-prefixed string binary.LittleEndian.PutUint16(dest[offset:], uint16(len(p.SogaRaceFile))) offset += 2 copy(dest[offset:], []byte(p.SogaRaceFile)) offset += uint32(len(p.SogaRaceFile)) // Write SogaSkinColor binary.LittleEndian.PutUint32(dest[offset:], p.SogaSkinColor.ToUint32()) offset += 4 // Write SogaEyeColor binary.LittleEndian.PutUint32(dest[offset:], p.SogaEyeColor.ToUint32()) offset += 4 // Write SogaHairColor1 binary.LittleEndian.PutUint32(dest[offset:], p.SogaHairColor1.ToUint32()) offset += 4 // Write SogaHairColor2 binary.LittleEndian.PutUint32(dest[offset:], p.SogaHairColor2.ToUint32()) offset += 4 // Write SogaHairHighlight binary.LittleEndian.PutUint32(dest[offset:], p.SogaHairHighlight.ToUint32()) offset += 4 // Write SogaUnknownColor1 binary.LittleEndian.PutUint32(dest[offset:], p.SogaUnknownColor1.ToUint32()) offset += 4 // Write SogaUnknown11 array for i := 0; i < 26; i++ { dest[offset] = p.SogaUnknown11[i] offset++ } // Write SogaHairFile as 16-bit length-prefixed string binary.LittleEndian.PutUint16(dest[offset:], uint16(len(p.SogaHairFile))) offset += 2 copy(dest[offset:], []byte(p.SogaHairFile)) offset += uint32(len(p.SogaHairFile)) // Write SogaHairTypeColor binary.LittleEndian.PutUint32(dest[offset:], p.SogaHairTypeColor.ToUint32()) offset += 4 // Write SogaHairTypeHighlightColor binary.LittleEndian.PutUint32(dest[offset:], p.SogaHairTypeHighlightColor.ToUint32()) offset += 4 // Write SogaFaceFile as 16-bit length-prefixed string binary.LittleEndian.PutUint16(dest[offset:], uint16(len(p.SogaFaceFile))) offset += 2 copy(dest[offset:], []byte(p.SogaFaceFile)) offset += uint32(len(p.SogaFaceFile)) // Write SogaHairFaceColor binary.LittleEndian.PutUint32(dest[offset:], p.SogaHairFaceColor.ToUint32()) offset += 4 // Write SogaHairFaceHighlightColor binary.LittleEndian.PutUint32(dest[offset:], p.SogaHairFaceHighlightColor.ToUint32()) offset += 4 // Write SogaWingFile as 16-bit length-prefixed string binary.LittleEndian.PutUint16(dest[offset:], uint16(len(p.SogaWingFile))) offset += 2 copy(dest[offset:], []byte(p.SogaWingFile)) offset += uint32(len(p.SogaWingFile)) // Write SogaWingColor1 binary.LittleEndian.PutUint32(dest[offset:], p.SogaWingColor1.ToUint32()) offset += 4 // Write SogaWingColor2 binary.LittleEndian.PutUint32(dest[offset:], p.SogaWingColor2.ToUint32()) offset += 4 // Write SogaChestFile as 16-bit length-prefixed string binary.LittleEndian.PutUint16(dest[offset:], uint16(len(p.SogaChestFile))) offset += 2 copy(dest[offset:], []byte(p.SogaChestFile)) offset += uint32(len(p.SogaChestFile)) // Write SogaShirtColor binary.LittleEndian.PutUint32(dest[offset:], p.SogaShirtColor.ToUint32()) offset += 4 // Write SogaUnknownChestColor binary.LittleEndian.PutUint32(dest[offset:], p.SogaUnknownChestColor.ToUint32()) offset += 4 // Write SogaLegsFile as 16-bit length-prefixed string binary.LittleEndian.PutUint16(dest[offset:], uint16(len(p.SogaLegsFile))) offset += 2 copy(dest[offset:], []byte(p.SogaLegsFile)) offset += uint32(len(p.SogaLegsFile)) // Write SogaPantsColor binary.LittleEndian.PutUint32(dest[offset:], p.SogaPantsColor.ToUint32()) offset += 4 // Write SogaUnknownLegsColor binary.LittleEndian.PutUint32(dest[offset:], p.SogaUnknownLegsColor.ToUint32()) offset += 4 // Write SogaUnknown12 binary.LittleEndian.PutUint32(dest[offset:], p.SogaUnknown12.ToUint32()) offset += 4 // Write SogaEyes2 array for i := 0; i < 3; i++ { binary.LittleEndian.PutUint32(dest[offset:], math.Float32bits(p.SogaEyes2[i])) offset += 4 } // Write SogaEars array for i := 0; i < 3; i++ { binary.LittleEndian.PutUint32(dest[offset:], math.Float32bits(p.SogaEars[i])) offset += 4 } // Write SogaEyeBrows array for i := 0; i < 3; i++ { binary.LittleEndian.PutUint32(dest[offset:], math.Float32bits(p.SogaEyeBrows[i])) offset += 4 } // Write SogaCheeks array for i := 0; i < 3; i++ { binary.LittleEndian.PutUint32(dest[offset:], math.Float32bits(p.SogaCheeks[i])) offset += 4 } // Write SogaLips array for i := 0; i < 3; i++ { binary.LittleEndian.PutUint32(dest[offset:], math.Float32bits(p.SogaLips[i])) offset += 4 } // Write SogaChin array for i := 0; i < 3; i++ { binary.LittleEndian.PutUint32(dest[offset:], math.Float32bits(p.SogaChin[i])) offset += 4 } // Write SogaNose array for i := 0; i < 3; i++ { binary.LittleEndian.PutUint32(dest[offset:], math.Float32bits(p.SogaNose[i])) offset += 4 } // Write SogaBodySize binary.LittleEndian.PutUint32(dest[offset:], math.Float32bits(p.SogaBodySize)) offset += 4 // Write SogaBodyAge binary.LittleEndian.PutUint32(dest[offset:], math.Float32bits(p.SogaBodyAge)) offset += 4 return offset } // Size returns the serialized size of the packet func (p *CreateCharacterV869) Size() uint32 { size := uint32(0) size += 1 size += 4 size += 4 size += 1 size += 4 size += 2 + uint32(len(p.Name)) size += 1 size += 1 size += 1 size += 1 size += 1 size += 1 size += 1 size += 2 + uint32(len(p.RaceFile)) size += 4 size += 4 size += 4 size += 4 size += 4 size += 4 size += 26 size += 2 + uint32(len(p.HairFile)) size += 4 size += 4 size += 2 + uint32(len(p.FaceFile)) size += 4 size += 4 size += 2 + uint32(len(p.WingFile)) size += 4 size += 4 size += 2 + uint32(len(p.ChestFile)) size += 4 size += 4 size += 2 + uint32(len(p.LegsFile)) size += 4 size += 4 size += 4 size += 3 * 4 size += 3 * 4 size += 3 * 4 size += 3 * 4 size += 3 * 4 size += 3 * 4 size += 3 * 4 size += 4 size += 4 size += 1 size += 2 + uint32(len(p.SogaRaceFile)) size += 4 size += 4 size += 4 size += 4 size += 4 size += 4 size += 26 size += 2 + uint32(len(p.SogaHairFile)) size += 4 size += 4 size += 2 + uint32(len(p.SogaFaceFile)) size += 4 size += 4 size += 2 + uint32(len(p.SogaWingFile)) size += 4 size += 4 size += 2 + uint32(len(p.SogaChestFile)) size += 4 size += 4 size += 2 + uint32(len(p.SogaLegsFile)) size += 4 size += 4 size += 4 size += 3 * 4 size += 3 * 4 size += 3 * 4 size += 3 * 4 size += 3 * 4 size += 3 * 4 size += 3 * 4 size += 4 size += 4 return size } // CreateCharacterV1096 represents packet structure for OP_CreateCharacterRequestMsg type CreateCharacterV1096 struct { Unknown0 uint8 `eq2:"unknown0"` // TODO: Identify purpose Unknown1 uint32 `eq2:"unknown1"` // TODO: Identify purpose AccountId uint32 `eq2:"account_id"` Unknown3 uint8 `eq2:"unknown3"` // TODO: Identify purpose ServerId uint32 `eq2:"server_id"` Name string `eq2:"name,type:str16"` Race uint8 `eq2:"race"` Gender uint8 `eq2:"gender"` Deity uint8 `eq2:"deity"` Class uint8 `eq2:"class"` Level uint8 `eq2:"level"` StartingZone uint8 `eq2:"starting_zone"` Version uint8 `eq2:"version"` RaceFile string `eq2:"race_file,type:str16"` SkinColor types.Color `eq2:"skin_color"` SkinColor2 types.Color `eq2:"skin_color2"` EyeColor types.Color `eq2:"eye_color"` HairColor1 types.Color `eq2:"hair_color1"` HairColor2 types.Color `eq2:"hair_color2"` HairHighlight types.Color `eq2:"hair_highlight"` Unknown8 [26]uint8 `eq2:"unknown8,size:26"` // TODO: Identify purpose HairFile string `eq2:"hair_file,type:str16"` HairTypeColor types.Color `eq2:"hair_type_color"` HairTypeHighlightColor types.Color `eq2:"hair_type_highlight_color"` FaceFile string `eq2:"face_file,type:str16"` HairFaceColor types.Color `eq2:"hair_face_color"` HairFaceHighlightColor types.Color `eq2:"hair_face_highlight_color"` WingFile string `eq2:"wing_file,type:str16"` WingColor1 types.Color `eq2:"wing_color1"` WingColor2 types.Color `eq2:"wing_color2"` ChestFile string `eq2:"chest_file,type:str16"` ShirtColor types.Color `eq2:"shirt_color"` UnknownChestColor types.Color `eq2:"unknown_chest_color"` // TODO: Identify purpose LegsFile string `eq2:"legs_file,type:str16"` PantsColor types.Color `eq2:"pants_color"` UnknownLegsColor types.Color `eq2:"unknown_legs_color"` // TODO: Identify purpose Unknown9 types.Color `eq2:"unknown9"` // TODO: Identify purpose Eyes2 [3]float32 `eq2:"eyes2,size:3"` Ears [3]float32 `eq2:"ears,size:3"` EyeBrows [3]float32 `eq2:"eye_brows,size:3"` Cheeks [3]float32 `eq2:"cheeks,size:3"` Lips [3]float32 `eq2:"lips,size:3"` Chin [3]float32 `eq2:"chin,size:3"` Nose [3]float32 `eq2:"nose,size:3"` BodySize float32 `eq2:"body_size"` BodyAge float32 `eq2:"body_age"` SogaVersion uint8 `eq2:"soga_version"` SogaRaceFile string `eq2:"soga_race_file,type:str16"` SogaSkinColor types.Color `eq2:"soga_skin_color"` SogaEyeColor types.Color `eq2:"soga_eye_color"` SogaHairColor1 types.Color `eq2:"soga_hair_color1"` SogaHairColor2 types.Color `eq2:"soga_hair_color2"` SogaHairHighlight types.Color `eq2:"soga_hair_highlight"` SogaUnknownColor types.Color `eq2:"soga_unknown_color"` SogaUnknown11 [26]uint8 `eq2:"soga_unknown11,size:26"` SogaHairFile string `eq2:"soga_hair_file,type:str16"` SogaHairTypeColor types.Color `eq2:"soga_hair_type_color"` SogaHairTypeHighlightColor types.Color `eq2:"soga_hair_type_highlight_color"` SogaFaceFile string `eq2:"soga_face_file,type:str16"` SogaHairFaceColor types.Color `eq2:"soga_hair_face_color"` SogaHairFaceHighlightColor types.Color `eq2:"soga_hair_face_highlight_color"` SogaWingFile string `eq2:"soga_wing_file,type:str16"` SogaWingColor1 types.Color `eq2:"soga_wing_color1"` SogaWingColor2 types.Color `eq2:"soga_wing_color2"` SogaChestFile string `eq2:"soga_chest_file,type:str16"` SogaShirtColor types.Color `eq2:"soga_shirt_color"` SogaUnknownChestColor types.Color `eq2:"soga_unknown_chest_color"` SogaLegsFile string `eq2:"soga_legs_file,type:str16"` SogaPantsColor types.Color `eq2:"soga_pants_color"` SogaUnknownLegsColor types.Color `eq2:"soga_unknown_legs_color"` SogaUnknown12 types.Color `eq2:"soga_unknown12"` SogaEyes2 [3]float32 `eq2:"soga_eyes2,size:3"` SogaEars [3]float32 `eq2:"soga_ears,size:3"` SogaEyeBrows [3]float32 `eq2:"soga_eye_brows,size:3"` SogaCheeks [3]float32 `eq2:"soga_cheeks,size:3"` SogaLips [3]float32 `eq2:"soga_lips,size:3"` SogaChin [3]float32 `eq2:"soga_chin,size:3"` SogaNose [3]float32 `eq2:"soga_nose,size:3"` SogaBodySize float32 `eq2:"soga_body_size"` SogaBodyAge float32 `eq2:"soga_body_age"` } // Serialize writes the packet data to the provided buffer func (p *CreateCharacterV1096) Serialize(dest []byte) uint32 { offset := uint32(0) // Write Unknown0 dest[offset] = byte(p.Unknown0) offset++ // Write Unknown1 binary.LittleEndian.PutUint32(dest[offset:], uint32(p.Unknown1)) offset += 4 // Write AccountId binary.LittleEndian.PutUint32(dest[offset:], uint32(p.AccountId)) offset += 4 // Write Unknown3 dest[offset] = byte(p.Unknown3) offset++ // Write ServerId binary.LittleEndian.PutUint32(dest[offset:], uint32(p.ServerId)) offset += 4 // Write Name as 16-bit length-prefixed string binary.LittleEndian.PutUint16(dest[offset:], uint16(len(p.Name))) offset += 2 copy(dest[offset:], []byte(p.Name)) offset += uint32(len(p.Name)) // Write Race dest[offset] = byte(p.Race) offset++ // Write Gender dest[offset] = byte(p.Gender) offset++ // Write Deity dest[offset] = byte(p.Deity) offset++ // Write Class dest[offset] = byte(p.Class) offset++ // Write Level dest[offset] = byte(p.Level) offset++ // Write StartingZone dest[offset] = byte(p.StartingZone) offset++ // Write Version dest[offset] = byte(p.Version) offset++ // Write RaceFile as 16-bit length-prefixed string binary.LittleEndian.PutUint16(dest[offset:], uint16(len(p.RaceFile))) offset += 2 copy(dest[offset:], []byte(p.RaceFile)) offset += uint32(len(p.RaceFile)) // Write SkinColor binary.LittleEndian.PutUint32(dest[offset:], p.SkinColor.ToUint32()) offset += 4 // Write SkinColor2 binary.LittleEndian.PutUint32(dest[offset:], p.SkinColor2.ToUint32()) offset += 4 // Write EyeColor binary.LittleEndian.PutUint32(dest[offset:], p.EyeColor.ToUint32()) offset += 4 // Write HairColor1 binary.LittleEndian.PutUint32(dest[offset:], p.HairColor1.ToUint32()) offset += 4 // Write HairColor2 binary.LittleEndian.PutUint32(dest[offset:], p.HairColor2.ToUint32()) offset += 4 // Write HairHighlight binary.LittleEndian.PutUint32(dest[offset:], p.HairHighlight.ToUint32()) offset += 4 // Write Unknown8 array for i := 0; i < 26; i++ { dest[offset] = p.Unknown8[i] offset++ } // Write HairFile as 16-bit length-prefixed string binary.LittleEndian.PutUint16(dest[offset:], uint16(len(p.HairFile))) offset += 2 copy(dest[offset:], []byte(p.HairFile)) offset += uint32(len(p.HairFile)) // Write HairTypeColor binary.LittleEndian.PutUint32(dest[offset:], p.HairTypeColor.ToUint32()) offset += 4 // Write HairTypeHighlightColor binary.LittleEndian.PutUint32(dest[offset:], p.HairTypeHighlightColor.ToUint32()) offset += 4 // Write FaceFile as 16-bit length-prefixed string binary.LittleEndian.PutUint16(dest[offset:], uint16(len(p.FaceFile))) offset += 2 copy(dest[offset:], []byte(p.FaceFile)) offset += uint32(len(p.FaceFile)) // Write HairFaceColor binary.LittleEndian.PutUint32(dest[offset:], p.HairFaceColor.ToUint32()) offset += 4 // Write HairFaceHighlightColor binary.LittleEndian.PutUint32(dest[offset:], p.HairFaceHighlightColor.ToUint32()) offset += 4 // Write WingFile as 16-bit length-prefixed string binary.LittleEndian.PutUint16(dest[offset:], uint16(len(p.WingFile))) offset += 2 copy(dest[offset:], []byte(p.WingFile)) offset += uint32(len(p.WingFile)) // Write WingColor1 binary.LittleEndian.PutUint32(dest[offset:], p.WingColor1.ToUint32()) offset += 4 // Write WingColor2 binary.LittleEndian.PutUint32(dest[offset:], p.WingColor2.ToUint32()) offset += 4 // Write ChestFile as 16-bit length-prefixed string binary.LittleEndian.PutUint16(dest[offset:], uint16(len(p.ChestFile))) offset += 2 copy(dest[offset:], []byte(p.ChestFile)) offset += uint32(len(p.ChestFile)) // Write ShirtColor binary.LittleEndian.PutUint32(dest[offset:], p.ShirtColor.ToUint32()) offset += 4 // Write UnknownChestColor binary.LittleEndian.PutUint32(dest[offset:], p.UnknownChestColor.ToUint32()) offset += 4 // Write LegsFile as 16-bit length-prefixed string binary.LittleEndian.PutUint16(dest[offset:], uint16(len(p.LegsFile))) offset += 2 copy(dest[offset:], []byte(p.LegsFile)) offset += uint32(len(p.LegsFile)) // Write PantsColor binary.LittleEndian.PutUint32(dest[offset:], p.PantsColor.ToUint32()) offset += 4 // Write UnknownLegsColor binary.LittleEndian.PutUint32(dest[offset:], p.UnknownLegsColor.ToUint32()) offset += 4 // Write Unknown9 binary.LittleEndian.PutUint32(dest[offset:], p.Unknown9.ToUint32()) offset += 4 // Write Eyes2 array for i := 0; i < 3; i++ { binary.LittleEndian.PutUint32(dest[offset:], math.Float32bits(p.Eyes2[i])) offset += 4 } // Write Ears array for i := 0; i < 3; i++ { binary.LittleEndian.PutUint32(dest[offset:], math.Float32bits(p.Ears[i])) offset += 4 } // Write EyeBrows array for i := 0; i < 3; i++ { binary.LittleEndian.PutUint32(dest[offset:], math.Float32bits(p.EyeBrows[i])) offset += 4 } // Write Cheeks array for i := 0; i < 3; i++ { binary.LittleEndian.PutUint32(dest[offset:], math.Float32bits(p.Cheeks[i])) offset += 4 } // Write Lips array for i := 0; i < 3; i++ { binary.LittleEndian.PutUint32(dest[offset:], math.Float32bits(p.Lips[i])) offset += 4 } // Write Chin array for i := 0; i < 3; i++ { binary.LittleEndian.PutUint32(dest[offset:], math.Float32bits(p.Chin[i])) offset += 4 } // Write Nose array for i := 0; i < 3; i++ { binary.LittleEndian.PutUint32(dest[offset:], math.Float32bits(p.Nose[i])) offset += 4 } // Write BodySize binary.LittleEndian.PutUint32(dest[offset:], math.Float32bits(p.BodySize)) offset += 4 // Write BodyAge binary.LittleEndian.PutUint32(dest[offset:], math.Float32bits(p.BodyAge)) offset += 4 // Write SogaVersion dest[offset] = byte(p.SogaVersion) offset++ // Write SogaRaceFile as 16-bit length-prefixed string binary.LittleEndian.PutUint16(dest[offset:], uint16(len(p.SogaRaceFile))) offset += 2 copy(dest[offset:], []byte(p.SogaRaceFile)) offset += uint32(len(p.SogaRaceFile)) // Write SogaSkinColor binary.LittleEndian.PutUint32(dest[offset:], p.SogaSkinColor.ToUint32()) offset += 4 // Write SogaEyeColor binary.LittleEndian.PutUint32(dest[offset:], p.SogaEyeColor.ToUint32()) offset += 4 // Write SogaHairColor1 binary.LittleEndian.PutUint32(dest[offset:], p.SogaHairColor1.ToUint32()) offset += 4 // Write SogaHairColor2 binary.LittleEndian.PutUint32(dest[offset:], p.SogaHairColor2.ToUint32()) offset += 4 // Write SogaHairHighlight binary.LittleEndian.PutUint32(dest[offset:], p.SogaHairHighlight.ToUint32()) offset += 4 // Write SogaUnknownColor binary.LittleEndian.PutUint32(dest[offset:], p.SogaUnknownColor.ToUint32()) offset += 4 // Write SogaUnknown11 array for i := 0; i < 26; i++ { dest[offset] = p.SogaUnknown11[i] offset++ } // Write SogaHairFile as 16-bit length-prefixed string binary.LittleEndian.PutUint16(dest[offset:], uint16(len(p.SogaHairFile))) offset += 2 copy(dest[offset:], []byte(p.SogaHairFile)) offset += uint32(len(p.SogaHairFile)) // Write SogaHairTypeColor binary.LittleEndian.PutUint32(dest[offset:], p.SogaHairTypeColor.ToUint32()) offset += 4 // Write SogaHairTypeHighlightColor binary.LittleEndian.PutUint32(dest[offset:], p.SogaHairTypeHighlightColor.ToUint32()) offset += 4 // Write SogaFaceFile as 16-bit length-prefixed string binary.LittleEndian.PutUint16(dest[offset:], uint16(len(p.SogaFaceFile))) offset += 2 copy(dest[offset:], []byte(p.SogaFaceFile)) offset += uint32(len(p.SogaFaceFile)) // Write SogaHairFaceColor binary.LittleEndian.PutUint32(dest[offset:], p.SogaHairFaceColor.ToUint32()) offset += 4 // Write SogaHairFaceHighlightColor binary.LittleEndian.PutUint32(dest[offset:], p.SogaHairFaceHighlightColor.ToUint32()) offset += 4 // Write SogaWingFile as 16-bit length-prefixed string binary.LittleEndian.PutUint16(dest[offset:], uint16(len(p.SogaWingFile))) offset += 2 copy(dest[offset:], []byte(p.SogaWingFile)) offset += uint32(len(p.SogaWingFile)) // Write SogaWingColor1 binary.LittleEndian.PutUint32(dest[offset:], p.SogaWingColor1.ToUint32()) offset += 4 // Write SogaWingColor2 binary.LittleEndian.PutUint32(dest[offset:], p.SogaWingColor2.ToUint32()) offset += 4 // Write SogaChestFile as 16-bit length-prefixed string binary.LittleEndian.PutUint16(dest[offset:], uint16(len(p.SogaChestFile))) offset += 2 copy(dest[offset:], []byte(p.SogaChestFile)) offset += uint32(len(p.SogaChestFile)) // Write SogaShirtColor binary.LittleEndian.PutUint32(dest[offset:], p.SogaShirtColor.ToUint32()) offset += 4 // Write SogaUnknownChestColor binary.LittleEndian.PutUint32(dest[offset:], p.SogaUnknownChestColor.ToUint32()) offset += 4 // Write SogaLegsFile as 16-bit length-prefixed string binary.LittleEndian.PutUint16(dest[offset:], uint16(len(p.SogaLegsFile))) offset += 2 copy(dest[offset:], []byte(p.SogaLegsFile)) offset += uint32(len(p.SogaLegsFile)) // Write SogaPantsColor binary.LittleEndian.PutUint32(dest[offset:], p.SogaPantsColor.ToUint32()) offset += 4 // Write SogaUnknownLegsColor binary.LittleEndian.PutUint32(dest[offset:], p.SogaUnknownLegsColor.ToUint32()) offset += 4 // Write SogaUnknown12 binary.LittleEndian.PutUint32(dest[offset:], p.SogaUnknown12.ToUint32()) offset += 4 // Write SogaEyes2 array for i := 0; i < 3; i++ { binary.LittleEndian.PutUint32(dest[offset:], math.Float32bits(p.SogaEyes2[i])) offset += 4 } // Write SogaEars array for i := 0; i < 3; i++ { binary.LittleEndian.PutUint32(dest[offset:], math.Float32bits(p.SogaEars[i])) offset += 4 } // Write SogaEyeBrows array for i := 0; i < 3; i++ { binary.LittleEndian.PutUint32(dest[offset:], math.Float32bits(p.SogaEyeBrows[i])) offset += 4 } // Write SogaCheeks array for i := 0; i < 3; i++ { binary.LittleEndian.PutUint32(dest[offset:], math.Float32bits(p.SogaCheeks[i])) offset += 4 } // Write SogaLips array for i := 0; i < 3; i++ { binary.LittleEndian.PutUint32(dest[offset:], math.Float32bits(p.SogaLips[i])) offset += 4 } // Write SogaChin array for i := 0; i < 3; i++ { binary.LittleEndian.PutUint32(dest[offset:], math.Float32bits(p.SogaChin[i])) offset += 4 } // Write SogaNose array for i := 0; i < 3; i++ { binary.LittleEndian.PutUint32(dest[offset:], math.Float32bits(p.SogaNose[i])) offset += 4 } // Write SogaBodySize binary.LittleEndian.PutUint32(dest[offset:], math.Float32bits(p.SogaBodySize)) offset += 4 // Write SogaBodyAge binary.LittleEndian.PutUint32(dest[offset:], math.Float32bits(p.SogaBodyAge)) offset += 4 return offset } // Size returns the serialized size of the packet func (p *CreateCharacterV1096) Size() uint32 { size := uint32(0) size += 1 size += 4 size += 4 size += 1 size += 4 size += 2 + uint32(len(p.Name)) size += 1 size += 1 size += 1 size += 1 size += 1 size += 1 size += 1 size += 2 + uint32(len(p.RaceFile)) size += 4 size += 4 size += 4 size += 4 size += 4 size += 4 size += 26 size += 2 + uint32(len(p.HairFile)) size += 4 size += 4 size += 2 + uint32(len(p.FaceFile)) size += 4 size += 4 size += 2 + uint32(len(p.WingFile)) size += 4 size += 4 size += 2 + uint32(len(p.ChestFile)) size += 4 size += 4 size += 2 + uint32(len(p.LegsFile)) size += 4 size += 4 size += 4 size += 3 * 4 size += 3 * 4 size += 3 * 4 size += 3 * 4 size += 3 * 4 size += 3 * 4 size += 3 * 4 size += 4 size += 4 size += 1 size += 2 + uint32(len(p.SogaRaceFile)) size += 4 size += 4 size += 4 size += 4 size += 4 size += 4 size += 26 size += 2 + uint32(len(p.SogaHairFile)) size += 4 size += 4 size += 2 + uint32(len(p.SogaFaceFile)) size += 4 size += 4 size += 2 + uint32(len(p.SogaWingFile)) size += 4 size += 4 size += 2 + uint32(len(p.SogaChestFile)) size += 4 size += 4 size += 2 + uint32(len(p.SogaLegsFile)) size += 4 size += 4 size += 4 size += 3 * 4 size += 3 * 4 size += 3 * 4 size += 3 * 4 size += 3 * 4 size += 3 * 4 size += 3 * 4 size += 4 size += 4 return size } // CreateCharacterV57080 represents packet structure for OP_CreateCharacterRequestMsg type CreateCharacterV57080 struct { Unknown0 uint8 `eq2:"unknown0"` // TODO: Identify purpose Unknown1 uint32 `eq2:"unknown1"` // TODO: Identify purpose AccountId uint32 `eq2:"account_id"` Unknown3 uint8 `eq2:"unknown3"` // TODO: Identify purpose ServerId uint32 `eq2:"server_id"` Name string `eq2:"name,type:str16"` Race uint8 `eq2:"race"` Gender uint8 `eq2:"gender"` Deity uint8 `eq2:"deity"` Class uint8 `eq2:"class"` Level uint8 `eq2:"level"` StartingZone uint8 `eq2:"starting_zone"` Version uint8 `eq2:"version"` Unknown10 uint16 `eq2:"unknown10"` // TODO: Identify purpose RaceFile string `eq2:"race_file,type:str16"` SkinColor types.Color `eq2:"skin_color"` EyeColor types.Color `eq2:"eye_color"` UnknownSkinColor2 types.Color `eq2:"unknown_skin_color2"` // TODO: Identify purpose HairColor1 types.Color `eq2:"hair_color1"` HairColor2 types.Color `eq2:"hair_color2"` HairHighlight types.Color `eq2:"hair_highlight"` Unknown8 [26]uint8 `eq2:"unknown8,size:26"` // TODO: Identify purpose HairFile string `eq2:"hair_file,type:str16"` HairTypeColor types.Color `eq2:"hair_type_color"` HairTypeHighlightColor types.Color `eq2:"hair_type_highlight_color"` FaceFile string `eq2:"face_file,type:str16"` HairFaceColor types.Color `eq2:"hair_face_color"` HairFaceHighlightColor types.Color `eq2:"hair_face_highlight_color"` WingFile string `eq2:"wing_file,type:str16"` WingColor1 types.Color `eq2:"wing_color1"` WingColor2 types.Color `eq2:"wing_color2"` ChestFile string `eq2:"chest_file,type:str16"` ShirtColor types.Color `eq2:"shirt_color"` UnknownChestColor types.Color `eq2:"unknown_chest_color"` // TODO: Identify purpose LegsFile string `eq2:"legs_file,type:str16"` PantsColor types.Color `eq2:"pants_color"` UnknownLegsColor types.Color `eq2:"unknown_legs_color"` // TODO: Identify purpose Unknown9 types.Color `eq2:"unknown9"` // TODO: Identify purpose Eyes2 [3]float32 `eq2:"eyes2,size:3"` Ears [3]float32 `eq2:"ears,size:3"` EyeBrows [3]float32 `eq2:"eye_brows,size:3"` Cheeks [3]float32 `eq2:"cheeks,size:3"` Lips [3]float32 `eq2:"lips,size:3"` Chin [3]float32 `eq2:"chin,size:3"` Nose [3]float32 `eq2:"nose,size:3"` BodySize float32 `eq2:"body_size"` BodyAge float32 `eq2:"body_age"` SogaVersion uint8 `eq2:"soga_version"` SogaRaceFile string `eq2:"soga_race_file,type:str16"` SogaSkinColor types.Color `eq2:"soga_skin_color"` SogaEyeColor types.Color `eq2:"soga_eye_color"` SogaHairColor1 types.Color `eq2:"soga_hair_color1"` SogaHairColor2 types.Color `eq2:"soga_hair_color2"` SogaHairHighlight types.Color `eq2:"soga_hair_highlight"` SogaUnknownColor types.Color `eq2:"soga_unknown_color"` SogaUnknown11 [26]uint8 `eq2:"soga_unknown11,size:26"` SogaHairFile string `eq2:"soga_hair_file,type:str16"` SogaHairTypeColor types.Color `eq2:"soga_hair_type_color"` SogaHairTypeHighlightColor types.Color `eq2:"soga_hair_type_highlight_color"` SogaFaceFile string `eq2:"soga_face_file,type:str16"` SogaHairFaceColor types.Color `eq2:"soga_hair_face_color"` SogaHairFaceHighlightColor types.Color `eq2:"soga_hair_face_highlight_color"` SogaWingFile string `eq2:"soga_wing_file,type:str16"` SogaWingColor1 types.Color `eq2:"soga_wing_color1"` SogaWingColor2 types.Color `eq2:"soga_wing_color2"` SogaChestFile string `eq2:"soga_chest_file,type:str16"` SogaShirtColor types.Color `eq2:"soga_shirt_color"` SogaUnknownChestColor types.Color `eq2:"soga_unknown_chest_color"` SogaLegsFile string `eq2:"soga_legs_file,type:str16"` SogaPantsColor types.Color `eq2:"soga_pants_color"` SogaUnknownLegsColor types.Color `eq2:"soga_unknown_legs_color"` SogaUnknown12 types.Color `eq2:"soga_unknown12"` SogaEyes2 [3]float32 `eq2:"soga_eyes2,size:3"` SogaEars [3]float32 `eq2:"soga_ears,size:3"` SogaEyeBrows [3]float32 `eq2:"soga_eye_brows,size:3"` SogaCheeks [3]float32 `eq2:"soga_cheeks,size:3"` SogaLips [3]float32 `eq2:"soga_lips,size:3"` SogaChin [3]float32 `eq2:"soga_chin,size:3"` SogaNose [3]float32 `eq2:"soga_nose,size:3"` SogaBodySize float32 `eq2:"soga_body_size"` SogaBodyAge float32 `eq2:"soga_body_age"` } // Serialize writes the packet data to the provided buffer func (p *CreateCharacterV57080) Serialize(dest []byte) uint32 { offset := uint32(0) // Write Unknown0 dest[offset] = byte(p.Unknown0) offset++ // Write Unknown1 binary.LittleEndian.PutUint32(dest[offset:], uint32(p.Unknown1)) offset += 4 // Write AccountId binary.LittleEndian.PutUint32(dest[offset:], uint32(p.AccountId)) offset += 4 // Write Unknown3 dest[offset] = byte(p.Unknown3) offset++ // Write ServerId binary.LittleEndian.PutUint32(dest[offset:], uint32(p.ServerId)) offset += 4 // Write Name as 16-bit length-prefixed string binary.LittleEndian.PutUint16(dest[offset:], uint16(len(p.Name))) offset += 2 copy(dest[offset:], []byte(p.Name)) offset += uint32(len(p.Name)) // Write Race dest[offset] = byte(p.Race) offset++ // Write Gender dest[offset] = byte(p.Gender) offset++ // Write Deity dest[offset] = byte(p.Deity) offset++ // Write Class dest[offset] = byte(p.Class) offset++ // Write Level dest[offset] = byte(p.Level) offset++ // Write StartingZone dest[offset] = byte(p.StartingZone) offset++ // Write Version dest[offset] = byte(p.Version) offset++ // Write Unknown10 binary.LittleEndian.PutUint16(dest[offset:], uint16(p.Unknown10)) offset += 2 // Write RaceFile as 16-bit length-prefixed string binary.LittleEndian.PutUint16(dest[offset:], uint16(len(p.RaceFile))) offset += 2 copy(dest[offset:], []byte(p.RaceFile)) offset += uint32(len(p.RaceFile)) // Write SkinColor binary.LittleEndian.PutUint32(dest[offset:], p.SkinColor.ToUint32()) offset += 4 // Write EyeColor binary.LittleEndian.PutUint32(dest[offset:], p.EyeColor.ToUint32()) offset += 4 // Write UnknownSkinColor2 binary.LittleEndian.PutUint32(dest[offset:], p.UnknownSkinColor2.ToUint32()) offset += 4 // Write HairColor1 binary.LittleEndian.PutUint32(dest[offset:], p.HairColor1.ToUint32()) offset += 4 // Write HairColor2 binary.LittleEndian.PutUint32(dest[offset:], p.HairColor2.ToUint32()) offset += 4 // Write HairHighlight binary.LittleEndian.PutUint32(dest[offset:], p.HairHighlight.ToUint32()) offset += 4 // Write Unknown8 array for i := 0; i < 26; i++ { dest[offset] = p.Unknown8[i] offset++ } // Write HairFile as 16-bit length-prefixed string binary.LittleEndian.PutUint16(dest[offset:], uint16(len(p.HairFile))) offset += 2 copy(dest[offset:], []byte(p.HairFile)) offset += uint32(len(p.HairFile)) // Write HairTypeColor binary.LittleEndian.PutUint32(dest[offset:], p.HairTypeColor.ToUint32()) offset += 4 // Write HairTypeHighlightColor binary.LittleEndian.PutUint32(dest[offset:], p.HairTypeHighlightColor.ToUint32()) offset += 4 // Write FaceFile as 16-bit length-prefixed string binary.LittleEndian.PutUint16(dest[offset:], uint16(len(p.FaceFile))) offset += 2 copy(dest[offset:], []byte(p.FaceFile)) offset += uint32(len(p.FaceFile)) // Write HairFaceColor binary.LittleEndian.PutUint32(dest[offset:], p.HairFaceColor.ToUint32()) offset += 4 // Write HairFaceHighlightColor binary.LittleEndian.PutUint32(dest[offset:], p.HairFaceHighlightColor.ToUint32()) offset += 4 // Write WingFile as 16-bit length-prefixed string binary.LittleEndian.PutUint16(dest[offset:], uint16(len(p.WingFile))) offset += 2 copy(dest[offset:], []byte(p.WingFile)) offset += uint32(len(p.WingFile)) // Write WingColor1 binary.LittleEndian.PutUint32(dest[offset:], p.WingColor1.ToUint32()) offset += 4 // Write WingColor2 binary.LittleEndian.PutUint32(dest[offset:], p.WingColor2.ToUint32()) offset += 4 // Write ChestFile as 16-bit length-prefixed string binary.LittleEndian.PutUint16(dest[offset:], uint16(len(p.ChestFile))) offset += 2 copy(dest[offset:], []byte(p.ChestFile)) offset += uint32(len(p.ChestFile)) // Write ShirtColor binary.LittleEndian.PutUint32(dest[offset:], p.ShirtColor.ToUint32()) offset += 4 // Write UnknownChestColor binary.LittleEndian.PutUint32(dest[offset:], p.UnknownChestColor.ToUint32()) offset += 4 // Write LegsFile as 16-bit length-prefixed string binary.LittleEndian.PutUint16(dest[offset:], uint16(len(p.LegsFile))) offset += 2 copy(dest[offset:], []byte(p.LegsFile)) offset += uint32(len(p.LegsFile)) // Write PantsColor binary.LittleEndian.PutUint32(dest[offset:], p.PantsColor.ToUint32()) offset += 4 // Write UnknownLegsColor binary.LittleEndian.PutUint32(dest[offset:], p.UnknownLegsColor.ToUint32()) offset += 4 // Write Unknown9 binary.LittleEndian.PutUint32(dest[offset:], p.Unknown9.ToUint32()) offset += 4 // Write Eyes2 array for i := 0; i < 3; i++ { binary.LittleEndian.PutUint32(dest[offset:], math.Float32bits(p.Eyes2[i])) offset += 4 } // Write Ears array for i := 0; i < 3; i++ { binary.LittleEndian.PutUint32(dest[offset:], math.Float32bits(p.Ears[i])) offset += 4 } // Write EyeBrows array for i := 0; i < 3; i++ { binary.LittleEndian.PutUint32(dest[offset:], math.Float32bits(p.EyeBrows[i])) offset += 4 } // Write Cheeks array for i := 0; i < 3; i++ { binary.LittleEndian.PutUint32(dest[offset:], math.Float32bits(p.Cheeks[i])) offset += 4 } // Write Lips array for i := 0; i < 3; i++ { binary.LittleEndian.PutUint32(dest[offset:], math.Float32bits(p.Lips[i])) offset += 4 } // Write Chin array for i := 0; i < 3; i++ { binary.LittleEndian.PutUint32(dest[offset:], math.Float32bits(p.Chin[i])) offset += 4 } // Write Nose array for i := 0; i < 3; i++ { binary.LittleEndian.PutUint32(dest[offset:], math.Float32bits(p.Nose[i])) offset += 4 } // Write BodySize binary.LittleEndian.PutUint32(dest[offset:], math.Float32bits(p.BodySize)) offset += 4 // Write BodyAge binary.LittleEndian.PutUint32(dest[offset:], math.Float32bits(p.BodyAge)) offset += 4 // Write SogaVersion dest[offset] = byte(p.SogaVersion) offset++ // Write SogaRaceFile as 16-bit length-prefixed string binary.LittleEndian.PutUint16(dest[offset:], uint16(len(p.SogaRaceFile))) offset += 2 copy(dest[offset:], []byte(p.SogaRaceFile)) offset += uint32(len(p.SogaRaceFile)) // Write SogaSkinColor binary.LittleEndian.PutUint32(dest[offset:], p.SogaSkinColor.ToUint32()) offset += 4 // Write SogaEyeColor binary.LittleEndian.PutUint32(dest[offset:], p.SogaEyeColor.ToUint32()) offset += 4 // Write SogaHairColor1 binary.LittleEndian.PutUint32(dest[offset:], p.SogaHairColor1.ToUint32()) offset += 4 // Write SogaHairColor2 binary.LittleEndian.PutUint32(dest[offset:], p.SogaHairColor2.ToUint32()) offset += 4 // Write SogaHairHighlight binary.LittleEndian.PutUint32(dest[offset:], p.SogaHairHighlight.ToUint32()) offset += 4 // Write SogaUnknownColor binary.LittleEndian.PutUint32(dest[offset:], p.SogaUnknownColor.ToUint32()) offset += 4 // Write SogaUnknown11 array for i := 0; i < 26; i++ { dest[offset] = p.SogaUnknown11[i] offset++ } // Write SogaHairFile as 16-bit length-prefixed string binary.LittleEndian.PutUint16(dest[offset:], uint16(len(p.SogaHairFile))) offset += 2 copy(dest[offset:], []byte(p.SogaHairFile)) offset += uint32(len(p.SogaHairFile)) // Write SogaHairTypeColor binary.LittleEndian.PutUint32(dest[offset:], p.SogaHairTypeColor.ToUint32()) offset += 4 // Write SogaHairTypeHighlightColor binary.LittleEndian.PutUint32(dest[offset:], p.SogaHairTypeHighlightColor.ToUint32()) offset += 4 // Write SogaFaceFile as 16-bit length-prefixed string binary.LittleEndian.PutUint16(dest[offset:], uint16(len(p.SogaFaceFile))) offset += 2 copy(dest[offset:], []byte(p.SogaFaceFile)) offset += uint32(len(p.SogaFaceFile)) // Write SogaHairFaceColor binary.LittleEndian.PutUint32(dest[offset:], p.SogaHairFaceColor.ToUint32()) offset += 4 // Write SogaHairFaceHighlightColor binary.LittleEndian.PutUint32(dest[offset:], p.SogaHairFaceHighlightColor.ToUint32()) offset += 4 // Write SogaWingFile as 16-bit length-prefixed string binary.LittleEndian.PutUint16(dest[offset:], uint16(len(p.SogaWingFile))) offset += 2 copy(dest[offset:], []byte(p.SogaWingFile)) offset += uint32(len(p.SogaWingFile)) // Write SogaWingColor1 binary.LittleEndian.PutUint32(dest[offset:], p.SogaWingColor1.ToUint32()) offset += 4 // Write SogaWingColor2 binary.LittleEndian.PutUint32(dest[offset:], p.SogaWingColor2.ToUint32()) offset += 4 // Write SogaChestFile as 16-bit length-prefixed string binary.LittleEndian.PutUint16(dest[offset:], uint16(len(p.SogaChestFile))) offset += 2 copy(dest[offset:], []byte(p.SogaChestFile)) offset += uint32(len(p.SogaChestFile)) // Write SogaShirtColor binary.LittleEndian.PutUint32(dest[offset:], p.SogaShirtColor.ToUint32()) offset += 4 // Write SogaUnknownChestColor binary.LittleEndian.PutUint32(dest[offset:], p.SogaUnknownChestColor.ToUint32()) offset += 4 // Write SogaLegsFile as 16-bit length-prefixed string binary.LittleEndian.PutUint16(dest[offset:], uint16(len(p.SogaLegsFile))) offset += 2 copy(dest[offset:], []byte(p.SogaLegsFile)) offset += uint32(len(p.SogaLegsFile)) // Write SogaPantsColor binary.LittleEndian.PutUint32(dest[offset:], p.SogaPantsColor.ToUint32()) offset += 4 // Write SogaUnknownLegsColor binary.LittleEndian.PutUint32(dest[offset:], p.SogaUnknownLegsColor.ToUint32()) offset += 4 // Write SogaUnknown12 binary.LittleEndian.PutUint32(dest[offset:], p.SogaUnknown12.ToUint32()) offset += 4 // Write SogaEyes2 array for i := 0; i < 3; i++ { binary.LittleEndian.PutUint32(dest[offset:], math.Float32bits(p.SogaEyes2[i])) offset += 4 } // Write SogaEars array for i := 0; i < 3; i++ { binary.LittleEndian.PutUint32(dest[offset:], math.Float32bits(p.SogaEars[i])) offset += 4 } // Write SogaEyeBrows array for i := 0; i < 3; i++ { binary.LittleEndian.PutUint32(dest[offset:], math.Float32bits(p.SogaEyeBrows[i])) offset += 4 } // Write SogaCheeks array for i := 0; i < 3; i++ { binary.LittleEndian.PutUint32(dest[offset:], math.Float32bits(p.SogaCheeks[i])) offset += 4 } // Write SogaLips array for i := 0; i < 3; i++ { binary.LittleEndian.PutUint32(dest[offset:], math.Float32bits(p.SogaLips[i])) offset += 4 } // Write SogaChin array for i := 0; i < 3; i++ { binary.LittleEndian.PutUint32(dest[offset:], math.Float32bits(p.SogaChin[i])) offset += 4 } // Write SogaNose array for i := 0; i < 3; i++ { binary.LittleEndian.PutUint32(dest[offset:], math.Float32bits(p.SogaNose[i])) offset += 4 } // Write SogaBodySize binary.LittleEndian.PutUint32(dest[offset:], math.Float32bits(p.SogaBodySize)) offset += 4 // Write SogaBodyAge binary.LittleEndian.PutUint32(dest[offset:], math.Float32bits(p.SogaBodyAge)) offset += 4 return offset } // Size returns the serialized size of the packet func (p *CreateCharacterV57080) Size() uint32 { size := uint32(0) size += 1 size += 4 size += 4 size += 1 size += 4 size += 2 + uint32(len(p.Name)) size += 1 size += 1 size += 1 size += 1 size += 1 size += 1 size += 1 size += 2 size += 2 + uint32(len(p.RaceFile)) size += 4 size += 4 size += 4 size += 4 size += 4 size += 4 size += 26 size += 2 + uint32(len(p.HairFile)) size += 4 size += 4 size += 2 + uint32(len(p.FaceFile)) size += 4 size += 4 size += 2 + uint32(len(p.WingFile)) size += 4 size += 4 size += 2 + uint32(len(p.ChestFile)) size += 4 size += 4 size += 2 + uint32(len(p.LegsFile)) size += 4 size += 4 size += 4 size += 3 * 4 size += 3 * 4 size += 3 * 4 size += 3 * 4 size += 3 * 4 size += 3 * 4 size += 3 * 4 size += 4 size += 4 size += 1 size += 2 + uint32(len(p.SogaRaceFile)) size += 4 size += 4 size += 4 size += 4 size += 4 size += 4 size += 26 size += 2 + uint32(len(p.SogaHairFile)) size += 4 size += 4 size += 2 + uint32(len(p.SogaFaceFile)) size += 4 size += 4 size += 2 + uint32(len(p.SogaWingFile)) size += 4 size += 4 size += 2 + uint32(len(p.SogaChestFile)) size += 4 size += 4 size += 2 + uint32(len(p.SogaLegsFile)) size += 4 size += 4 size += 4 size += 3 * 4 size += 3 * 4 size += 3 * 4 size += 3 * 4 size += 3 * 4 size += 3 * 4 size += 3 * 4 size += 4 size += 4 return size } // CreateCharacterV60085 represents packet structure for OP_CreateCharacterRequestMsg type CreateCharacterV60085 struct { Unknown0 uint8 `eq2:"unknown0"` // TODO: Identify purpose Unknown1 uint32 `eq2:"unknown1"` // TODO: Identify purpose AccountId uint32 `eq2:"account_id"` Unknown3 uint8 `eq2:"unknown3"` // TODO: Identify purpose ServerId uint32 `eq2:"server_id"` Name string `eq2:"name,type:str16"` Race uint8 `eq2:"race"` Gender uint8 `eq2:"gender"` Deity uint8 `eq2:"deity"` Class uint8 `eq2:"class"` Level uint8 `eq2:"level"` StartingZone uint8 `eq2:"starting_zone"` Version uint8 `eq2:"version"` Unknown10 uint16 `eq2:"unknown10"` // TODO: Identify purpose RaceFile string `eq2:"race_file,type:str16"` SkinColor types.Color `eq2:"skin_color"` EyeColor types.Color `eq2:"eye_color"` UnknownSkinColor2 types.Color `eq2:"unknown_skin_color2"` // TODO: Identify purpose HairColor1 types.Color `eq2:"hair_color1"` HairColor2 types.Color `eq2:"hair_color2"` HairHighlight types.Color `eq2:"hair_highlight"` Unknown8 [26]uint8 `eq2:"unknown8,size:26"` // TODO: Identify purpose HairFile string `eq2:"hair_file,type:str16"` HairTypeColor types.Color `eq2:"hair_type_color"` HairTypeHighlightColor types.Color `eq2:"hair_type_highlight_color"` FaceFile string `eq2:"face_file,type:str16"` HairFaceColor types.Color `eq2:"hair_face_color"` HairFaceHighlightColor types.Color `eq2:"hair_face_highlight_color"` WingFile string `eq2:"wing_file,type:str16"` WingColor1 types.Color `eq2:"wing_color1"` WingColor2 types.Color `eq2:"wing_color2"` ChestFile string `eq2:"chest_file,type:str16"` ShirtColor types.Color `eq2:"shirt_color"` UnknownChestColor types.Color `eq2:"unknown_chest_color"` // TODO: Identify purpose LegsFile string `eq2:"legs_file,type:str16"` PantsColor types.Color `eq2:"pants_color"` UnknownLegsColor types.Color `eq2:"unknown_legs_color"` // TODO: Identify purpose Unknown9 types.Color `eq2:"unknown9"` // TODO: Identify purpose Eyes2 [3]float32 `eq2:"eyes2,size:3"` Ears [3]float32 `eq2:"ears,size:3"` EyeBrows [3]float32 `eq2:"eye_brows,size:3"` Cheeks [3]float32 `eq2:"cheeks,size:3"` Lips [3]float32 `eq2:"lips,size:3"` Chin [3]float32 `eq2:"chin,size:3"` Nose [3]float32 `eq2:"nose,size:3"` BodySize float32 `eq2:"body_size"` BodyAge float32 `eq2:"body_age"` SogaVersion uint8 `eq2:"soga_version"` SogaRaceFile string `eq2:"soga_race_file,type:str16"` SogaSkinColor types.Color `eq2:"soga_skin_color"` SogaEyeColor types.Color `eq2:"soga_eye_color"` SogaHairColor1 types.Color `eq2:"soga_hair_color1"` SogaHairColor2 types.Color `eq2:"soga_hair_color2"` SogaHairHighlight types.Color `eq2:"soga_hair_highlight"` SogaUnknownColor types.Color `eq2:"soga_unknown_color"` SogaUnknown11 [26]uint8 `eq2:"soga_unknown11,size:26"` SogaHairFile string `eq2:"soga_hair_file,type:str16"` SogaHairTypeColor types.Color `eq2:"soga_hair_type_color"` SogaHairTypeHighlightColor types.Color `eq2:"soga_hair_type_highlight_color"` SogaFaceFile string `eq2:"soga_face_file,type:str16"` SogaHairFaceColor types.Color `eq2:"soga_hair_face_color"` SogaHairFaceHighlightColor types.Color `eq2:"soga_hair_face_highlight_color"` SogaWingFile string `eq2:"soga_wing_file,type:str16"` SogaWingColor1 types.Color `eq2:"soga_wing_color1"` SogaWingColor2 types.Color `eq2:"soga_wing_color2"` SogaChestFile string `eq2:"soga_chest_file,type:str16"` SogaShirtColor types.Color `eq2:"soga_shirt_color"` SogaUnknownChestColor types.Color `eq2:"soga_unknown_chest_color"` SogaLegsFile string `eq2:"soga_legs_file,type:str16"` SogaPantsColor types.Color `eq2:"soga_pants_color"` SogaUnknownLegsColor types.Color `eq2:"soga_unknown_legs_color"` SogaUnknown12 types.Color `eq2:"soga_unknown12"` SogaEyes2 [3]float32 `eq2:"soga_eyes2,size:3"` SogaEars [3]float32 `eq2:"soga_ears,size:3"` SogaEyeBrows [3]float32 `eq2:"soga_eye_brows,size:3"` SogaCheeks [3]float32 `eq2:"soga_cheeks,size:3"` SogaLips [3]float32 `eq2:"soga_lips,size:3"` SogaChin [3]float32 `eq2:"soga_chin,size:3"` SogaNose [3]float32 `eq2:"soga_nose,size:3"` SogaBodySize float32 `eq2:"soga_body_size"` SogaBodyAge float32 `eq2:"soga_body_age"` } // Serialize writes the packet data to the provided buffer func (p *CreateCharacterV60085) Serialize(dest []byte) uint32 { offset := uint32(0) // Write Unknown0 dest[offset] = byte(p.Unknown0) offset++ // Write Unknown1 binary.LittleEndian.PutUint32(dest[offset:], uint32(p.Unknown1)) offset += 4 // Write AccountId binary.LittleEndian.PutUint32(dest[offset:], uint32(p.AccountId)) offset += 4 // Write Unknown3 dest[offset] = byte(p.Unknown3) offset++ // Write ServerId binary.LittleEndian.PutUint32(dest[offset:], uint32(p.ServerId)) offset += 4 // Write Name as 16-bit length-prefixed string binary.LittleEndian.PutUint16(dest[offset:], uint16(len(p.Name))) offset += 2 copy(dest[offset:], []byte(p.Name)) offset += uint32(len(p.Name)) // Write Race dest[offset] = byte(p.Race) offset++ // Write Gender dest[offset] = byte(p.Gender) offset++ // Write Deity dest[offset] = byte(p.Deity) offset++ // Write Class dest[offset] = byte(p.Class) offset++ // Write Level dest[offset] = byte(p.Level) offset++ // Write StartingZone dest[offset] = byte(p.StartingZone) offset++ // Write Version dest[offset] = byte(p.Version) offset++ // Write Unknown10 binary.LittleEndian.PutUint16(dest[offset:], uint16(p.Unknown10)) offset += 2 // Write RaceFile as 16-bit length-prefixed string binary.LittleEndian.PutUint16(dest[offset:], uint16(len(p.RaceFile))) offset += 2 copy(dest[offset:], []byte(p.RaceFile)) offset += uint32(len(p.RaceFile)) // Write SkinColor binary.LittleEndian.PutUint32(dest[offset:], p.SkinColor.ToUint32()) offset += 4 // Write EyeColor binary.LittleEndian.PutUint32(dest[offset:], p.EyeColor.ToUint32()) offset += 4 // Write UnknownSkinColor2 binary.LittleEndian.PutUint32(dest[offset:], p.UnknownSkinColor2.ToUint32()) offset += 4 // Write HairColor1 binary.LittleEndian.PutUint32(dest[offset:], p.HairColor1.ToUint32()) offset += 4 // Write HairColor2 binary.LittleEndian.PutUint32(dest[offset:], p.HairColor2.ToUint32()) offset += 4 // Write HairHighlight binary.LittleEndian.PutUint32(dest[offset:], p.HairHighlight.ToUint32()) offset += 4 // Write Unknown8 array for i := 0; i < 26; i++ { dest[offset] = p.Unknown8[i] offset++ } // Write HairFile as 16-bit length-prefixed string binary.LittleEndian.PutUint16(dest[offset:], uint16(len(p.HairFile))) offset += 2 copy(dest[offset:], []byte(p.HairFile)) offset += uint32(len(p.HairFile)) // Write HairTypeColor binary.LittleEndian.PutUint32(dest[offset:], p.HairTypeColor.ToUint32()) offset += 4 // Write HairTypeHighlightColor binary.LittleEndian.PutUint32(dest[offset:], p.HairTypeHighlightColor.ToUint32()) offset += 4 // Write FaceFile as 16-bit length-prefixed string binary.LittleEndian.PutUint16(dest[offset:], uint16(len(p.FaceFile))) offset += 2 copy(dest[offset:], []byte(p.FaceFile)) offset += uint32(len(p.FaceFile)) // Write HairFaceColor binary.LittleEndian.PutUint32(dest[offset:], p.HairFaceColor.ToUint32()) offset += 4 // Write HairFaceHighlightColor binary.LittleEndian.PutUint32(dest[offset:], p.HairFaceHighlightColor.ToUint32()) offset += 4 // Write WingFile as 16-bit length-prefixed string binary.LittleEndian.PutUint16(dest[offset:], uint16(len(p.WingFile))) offset += 2 copy(dest[offset:], []byte(p.WingFile)) offset += uint32(len(p.WingFile)) // Write WingColor1 binary.LittleEndian.PutUint32(dest[offset:], p.WingColor1.ToUint32()) offset += 4 // Write WingColor2 binary.LittleEndian.PutUint32(dest[offset:], p.WingColor2.ToUint32()) offset += 4 // Write ChestFile as 16-bit length-prefixed string binary.LittleEndian.PutUint16(dest[offset:], uint16(len(p.ChestFile))) offset += 2 copy(dest[offset:], []byte(p.ChestFile)) offset += uint32(len(p.ChestFile)) // Write ShirtColor binary.LittleEndian.PutUint32(dest[offset:], p.ShirtColor.ToUint32()) offset += 4 // Write UnknownChestColor binary.LittleEndian.PutUint32(dest[offset:], p.UnknownChestColor.ToUint32()) offset += 4 // Write LegsFile as 16-bit length-prefixed string binary.LittleEndian.PutUint16(dest[offset:], uint16(len(p.LegsFile))) offset += 2 copy(dest[offset:], []byte(p.LegsFile)) offset += uint32(len(p.LegsFile)) // Write PantsColor binary.LittleEndian.PutUint32(dest[offset:], p.PantsColor.ToUint32()) offset += 4 // Write UnknownLegsColor binary.LittleEndian.PutUint32(dest[offset:], p.UnknownLegsColor.ToUint32()) offset += 4 // Write Unknown9 binary.LittleEndian.PutUint32(dest[offset:], p.Unknown9.ToUint32()) offset += 4 // Write Eyes2 array for i := 0; i < 3; i++ { binary.LittleEndian.PutUint32(dest[offset:], math.Float32bits(p.Eyes2[i])) offset += 4 } // Write Ears array for i := 0; i < 3; i++ { binary.LittleEndian.PutUint32(dest[offset:], math.Float32bits(p.Ears[i])) offset += 4 } // Write EyeBrows array for i := 0; i < 3; i++ { binary.LittleEndian.PutUint32(dest[offset:], math.Float32bits(p.EyeBrows[i])) offset += 4 } // Write Cheeks array for i := 0; i < 3; i++ { binary.LittleEndian.PutUint32(dest[offset:], math.Float32bits(p.Cheeks[i])) offset += 4 } // Write Lips array for i := 0; i < 3; i++ { binary.LittleEndian.PutUint32(dest[offset:], math.Float32bits(p.Lips[i])) offset += 4 } // Write Chin array for i := 0; i < 3; i++ { binary.LittleEndian.PutUint32(dest[offset:], math.Float32bits(p.Chin[i])) offset += 4 } // Write Nose array for i := 0; i < 3; i++ { binary.LittleEndian.PutUint32(dest[offset:], math.Float32bits(p.Nose[i])) offset += 4 } // Write BodySize binary.LittleEndian.PutUint32(dest[offset:], math.Float32bits(p.BodySize)) offset += 4 // Write BodyAge binary.LittleEndian.PutUint32(dest[offset:], math.Float32bits(p.BodyAge)) offset += 4 // Write SogaVersion dest[offset] = byte(p.SogaVersion) offset++ // Write SogaRaceFile as 16-bit length-prefixed string binary.LittleEndian.PutUint16(dest[offset:], uint16(len(p.SogaRaceFile))) offset += 2 copy(dest[offset:], []byte(p.SogaRaceFile)) offset += uint32(len(p.SogaRaceFile)) // Write SogaSkinColor binary.LittleEndian.PutUint32(dest[offset:], p.SogaSkinColor.ToUint32()) offset += 4 // Write SogaEyeColor binary.LittleEndian.PutUint32(dest[offset:], p.SogaEyeColor.ToUint32()) offset += 4 // Write SogaHairColor1 binary.LittleEndian.PutUint32(dest[offset:], p.SogaHairColor1.ToUint32()) offset += 4 // Write SogaHairColor2 binary.LittleEndian.PutUint32(dest[offset:], p.SogaHairColor2.ToUint32()) offset += 4 // Write SogaHairHighlight binary.LittleEndian.PutUint32(dest[offset:], p.SogaHairHighlight.ToUint32()) offset += 4 // Write SogaUnknownColor binary.LittleEndian.PutUint32(dest[offset:], p.SogaUnknownColor.ToUint32()) offset += 4 // Write SogaUnknown11 array for i := 0; i < 26; i++ { dest[offset] = p.SogaUnknown11[i] offset++ } // Write SogaHairFile as 16-bit length-prefixed string binary.LittleEndian.PutUint16(dest[offset:], uint16(len(p.SogaHairFile))) offset += 2 copy(dest[offset:], []byte(p.SogaHairFile)) offset += uint32(len(p.SogaHairFile)) // Write SogaHairTypeColor binary.LittleEndian.PutUint32(dest[offset:], p.SogaHairTypeColor.ToUint32()) offset += 4 // Write SogaHairTypeHighlightColor binary.LittleEndian.PutUint32(dest[offset:], p.SogaHairTypeHighlightColor.ToUint32()) offset += 4 // Write SogaFaceFile as 16-bit length-prefixed string binary.LittleEndian.PutUint16(dest[offset:], uint16(len(p.SogaFaceFile))) offset += 2 copy(dest[offset:], []byte(p.SogaFaceFile)) offset += uint32(len(p.SogaFaceFile)) // Write SogaHairFaceColor binary.LittleEndian.PutUint32(dest[offset:], p.SogaHairFaceColor.ToUint32()) offset += 4 // Write SogaHairFaceHighlightColor binary.LittleEndian.PutUint32(dest[offset:], p.SogaHairFaceHighlightColor.ToUint32()) offset += 4 // Write SogaWingFile as 16-bit length-prefixed string binary.LittleEndian.PutUint16(dest[offset:], uint16(len(p.SogaWingFile))) offset += 2 copy(dest[offset:], []byte(p.SogaWingFile)) offset += uint32(len(p.SogaWingFile)) // Write SogaWingColor1 binary.LittleEndian.PutUint32(dest[offset:], p.SogaWingColor1.ToUint32()) offset += 4 // Write SogaWingColor2 binary.LittleEndian.PutUint32(dest[offset:], p.SogaWingColor2.ToUint32()) offset += 4 // Write SogaChestFile as 16-bit length-prefixed string binary.LittleEndian.PutUint16(dest[offset:], uint16(len(p.SogaChestFile))) offset += 2 copy(dest[offset:], []byte(p.SogaChestFile)) offset += uint32(len(p.SogaChestFile)) // Write SogaShirtColor binary.LittleEndian.PutUint32(dest[offset:], p.SogaShirtColor.ToUint32()) offset += 4 // Write SogaUnknownChestColor binary.LittleEndian.PutUint32(dest[offset:], p.SogaUnknownChestColor.ToUint32()) offset += 4 // Write SogaLegsFile as 16-bit length-prefixed string binary.LittleEndian.PutUint16(dest[offset:], uint16(len(p.SogaLegsFile))) offset += 2 copy(dest[offset:], []byte(p.SogaLegsFile)) offset += uint32(len(p.SogaLegsFile)) // Write SogaPantsColor binary.LittleEndian.PutUint32(dest[offset:], p.SogaPantsColor.ToUint32()) offset += 4 // Write SogaUnknownLegsColor binary.LittleEndian.PutUint32(dest[offset:], p.SogaUnknownLegsColor.ToUint32()) offset += 4 // Write SogaUnknown12 binary.LittleEndian.PutUint32(dest[offset:], p.SogaUnknown12.ToUint32()) offset += 4 // Write SogaEyes2 array for i := 0; i < 3; i++ { binary.LittleEndian.PutUint32(dest[offset:], math.Float32bits(p.SogaEyes2[i])) offset += 4 } // Write SogaEars array for i := 0; i < 3; i++ { binary.LittleEndian.PutUint32(dest[offset:], math.Float32bits(p.SogaEars[i])) offset += 4 } // Write SogaEyeBrows array for i := 0; i < 3; i++ { binary.LittleEndian.PutUint32(dest[offset:], math.Float32bits(p.SogaEyeBrows[i])) offset += 4 } // Write SogaCheeks array for i := 0; i < 3; i++ { binary.LittleEndian.PutUint32(dest[offset:], math.Float32bits(p.SogaCheeks[i])) offset += 4 } // Write SogaLips array for i := 0; i < 3; i++ { binary.LittleEndian.PutUint32(dest[offset:], math.Float32bits(p.SogaLips[i])) offset += 4 } // Write SogaChin array for i := 0; i < 3; i++ { binary.LittleEndian.PutUint32(dest[offset:], math.Float32bits(p.SogaChin[i])) offset += 4 } // Write SogaNose array for i := 0; i < 3; i++ { binary.LittleEndian.PutUint32(dest[offset:], math.Float32bits(p.SogaNose[i])) offset += 4 } // Write SogaBodySize binary.LittleEndian.PutUint32(dest[offset:], math.Float32bits(p.SogaBodySize)) offset += 4 // Write SogaBodyAge binary.LittleEndian.PutUint32(dest[offset:], math.Float32bits(p.SogaBodyAge)) offset += 4 return offset } // Size returns the serialized size of the packet func (p *CreateCharacterV60085) Size() uint32 { size := uint32(0) size += 1 size += 4 size += 4 size += 1 size += 4 size += 2 + uint32(len(p.Name)) size += 1 size += 1 size += 1 size += 1 size += 1 size += 1 size += 1 size += 2 size += 2 + uint32(len(p.RaceFile)) size += 4 size += 4 size += 4 size += 4 size += 4 size += 4 size += 26 size += 2 + uint32(len(p.HairFile)) size += 4 size += 4 size += 2 + uint32(len(p.FaceFile)) size += 4 size += 4 size += 2 + uint32(len(p.WingFile)) size += 4 size += 4 size += 2 + uint32(len(p.ChestFile)) size += 4 size += 4 size += 2 + uint32(len(p.LegsFile)) size += 4 size += 4 size += 4 size += 3 * 4 size += 3 * 4 size += 3 * 4 size += 3 * 4 size += 3 * 4 size += 3 * 4 size += 3 * 4 size += 4 size += 4 size += 1 size += 2 + uint32(len(p.SogaRaceFile)) size += 4 size += 4 size += 4 size += 4 size += 4 size += 4 size += 26 size += 2 + uint32(len(p.SogaHairFile)) size += 4 size += 4 size += 2 + uint32(len(p.SogaFaceFile)) size += 4 size += 4 size += 2 + uint32(len(p.SogaWingFile)) size += 4 size += 4 size += 2 + uint32(len(p.SogaChestFile)) size += 4 size += 4 size += 2 + uint32(len(p.SogaLegsFile)) size += 4 size += 4 size += 4 size += 3 * 4 size += 3 * 4 size += 3 * 4 size += 3 * 4 size += 3 * 4 size += 3 * 4 size += 3 * 4 size += 4 size += 4 return size } // CreateCharacterV64659 represents packet structure for OP_CreateCharacterRequestMsg type CreateCharacterV64659 struct { Unknown0 uint8 `eq2:"unknown0"` // TODO: Identify purpose Unknown1 uint32 `eq2:"unknown1"` // TODO: Identify purpose AccountId uint32 `eq2:"account_id"` Unknown3 uint8 `eq2:"unknown3"` // TODO: Identify purpose ServerId uint32 `eq2:"server_id"` Name string `eq2:"name,type:str16"` Race uint8 `eq2:"race"` Gender uint8 `eq2:"gender"` Deity uint8 `eq2:"deity"` Class uint8 `eq2:"class"` Level uint8 `eq2:"level"` StartingZone uint32 `eq2:"starting_zone"` Version uint8 `eq2:"version"` RaceFile string `eq2:"race_file,type:str16"` SkinColor types.Color `eq2:"skin_color"` SkinColor2 types.Color `eq2:"skin_color2"` EyeColor types.Color `eq2:"eye_color"` HairColor1 types.Color `eq2:"hair_color1"` HairColor2 types.Color `eq2:"hair_color2"` Unknown8 [38]uint8 `eq2:"unknown8,size:38"` // TODO: Identify purpose HairFile string `eq2:"hair_file,type:str16"` HairTypeColor types.Color `eq2:"hair_type_color"` HairTypeHighlightColor types.Color `eq2:"hair_type_highlight_color"` FaceFile string `eq2:"face_file,type:str16"` HairFaceColor types.Color `eq2:"hair_face_color"` HairFaceHighlightColor types.Color `eq2:"hair_face_highlight_color"` WingFile string `eq2:"wing_file,type:str16"` WingColor1 types.Color `eq2:"wing_color1"` WingColor2 types.Color `eq2:"wing_color2"` ChestFile string `eq2:"chest_file,type:str16"` ShirtColor types.Color `eq2:"shirt_color"` UnknownChestColor types.Color `eq2:"unknown_chest_color"` // TODO: Identify purpose LegsFile string `eq2:"legs_file,type:str16"` PantsColor types.Color `eq2:"pants_color"` UnknownLegsColor types.Color `eq2:"unknown_legs_color"` // TODO: Identify purpose Unknown9 types.Color `eq2:"unknown9"` // TODO: Identify purpose Eyes2 [3]float32 `eq2:"eyes2,size:3"` Ears [3]float32 `eq2:"ears,size:3"` EyeBrows [3]float32 `eq2:"eye_brows,size:3"` Cheeks [3]float32 `eq2:"cheeks,size:3"` Lips [3]float32 `eq2:"lips,size:3"` Chin [3]float32 `eq2:"chin,size:3"` Nose [3]float32 `eq2:"nose,size:3"` BodySize float32 `eq2:"body_size"` BodyAge float32 `eq2:"body_age"` SogaVersion uint8 `eq2:"soga_version"` SogaRaceFile string `eq2:"soga_race_file,type:str16"` SogaSkinColor types.Color `eq2:"soga_skin_color"` SogaEyeColor types.Color `eq2:"soga_eye_color"` SogaHairColor1 types.Color `eq2:"soga_hair_color1"` SogaHairColor2 types.Color `eq2:"soga_hair_color2"` SogaHairHighlight types.Color `eq2:"soga_hair_highlight"` SogaUnknown11 [38]uint8 `eq2:"soga_unknown11,size:38"` SogaHairFile string `eq2:"soga_hair_file,type:str16"` SogaHairTypeColor types.Color `eq2:"soga_hair_type_color"` SogaHairTypeHighlightColor types.Color `eq2:"soga_hair_type_highlight_color"` SogaFaceFile string `eq2:"soga_face_file,type:str16"` SogaHairFaceColor types.Color `eq2:"soga_hair_face_color"` SogaHairFaceHighlightColor types.Color `eq2:"soga_hair_face_highlight_color"` SogaWingFile string `eq2:"soga_wing_file,type:str16"` SogaWingColor1 types.Color `eq2:"soga_wing_color1"` SogaWingColor2 types.Color `eq2:"soga_wing_color2"` SogaChestFile string `eq2:"soga_chest_file,type:str16"` SogaShirtColor types.Color `eq2:"soga_shirt_color"` SogaUnknownChestColor types.Color `eq2:"soga_unknown_chest_color"` SogaLegsFile string `eq2:"soga_legs_file,type:str16"` SogaPantsColor types.Color `eq2:"soga_pants_color"` SogaUnknownLegsColor types.Color `eq2:"soga_unknown_legs_color"` SogaUnknown12 types.Color `eq2:"soga_unknown12"` SogaEyes2 [3]float32 `eq2:"soga_eyes2,size:3"` SogaEars [3]float32 `eq2:"soga_ears,size:3"` SogaEyeBrows [3]float32 `eq2:"soga_eye_brows,size:3"` SogaCheeks [3]float32 `eq2:"soga_cheeks,size:3"` SogaLips [3]float32 `eq2:"soga_lips,size:3"` SogaChin [3]float32 `eq2:"soga_chin,size:3"` SogaNose [3]float32 `eq2:"soga_nose,size:3"` SogaBodySize float32 `eq2:"soga_body_size"` SogaBodyAge float32 `eq2:"soga_body_age"` Unknown13 [2]uint8 `eq2:"unknown13,size:2"` // TODO: Identify purpose } // Serialize writes the packet data to the provided buffer func (p *CreateCharacterV64659) Serialize(dest []byte) uint32 { offset := uint32(0) // Write Unknown0 dest[offset] = byte(p.Unknown0) offset++ // Write Unknown1 binary.LittleEndian.PutUint32(dest[offset:], uint32(p.Unknown1)) offset += 4 // Write AccountId binary.LittleEndian.PutUint32(dest[offset:], uint32(p.AccountId)) offset += 4 // Write Unknown3 dest[offset] = byte(p.Unknown3) offset++ // Write ServerId binary.LittleEndian.PutUint32(dest[offset:], uint32(p.ServerId)) offset += 4 // Write Name as 16-bit length-prefixed string binary.LittleEndian.PutUint16(dest[offset:], uint16(len(p.Name))) offset += 2 copy(dest[offset:], []byte(p.Name)) offset += uint32(len(p.Name)) // Write Race dest[offset] = byte(p.Race) offset++ // Write Gender dest[offset] = byte(p.Gender) offset++ // Write Deity dest[offset] = byte(p.Deity) offset++ // Write Class dest[offset] = byte(p.Class) offset++ // Write Level dest[offset] = byte(p.Level) offset++ // Write StartingZone binary.LittleEndian.PutUint32(dest[offset:], uint32(p.StartingZone)) offset += 4 // Write Version dest[offset] = byte(p.Version) offset++ // Write RaceFile as 16-bit length-prefixed string binary.LittleEndian.PutUint16(dest[offset:], uint16(len(p.RaceFile))) offset += 2 copy(dest[offset:], []byte(p.RaceFile)) offset += uint32(len(p.RaceFile)) // Write SkinColor binary.LittleEndian.PutUint32(dest[offset:], p.SkinColor.ToUint32()) offset += 4 // Write SkinColor2 binary.LittleEndian.PutUint32(dest[offset:], p.SkinColor2.ToUint32()) offset += 4 // Write EyeColor binary.LittleEndian.PutUint32(dest[offset:], p.EyeColor.ToUint32()) offset += 4 // Write HairColor1 binary.LittleEndian.PutUint32(dest[offset:], p.HairColor1.ToUint32()) offset += 4 // Write HairColor2 binary.LittleEndian.PutUint32(dest[offset:], p.HairColor2.ToUint32()) offset += 4 // Write Unknown8 array for i := 0; i < 38; i++ { dest[offset] = p.Unknown8[i] offset++ } // Write HairFile as 16-bit length-prefixed string binary.LittleEndian.PutUint16(dest[offset:], uint16(len(p.HairFile))) offset += 2 copy(dest[offset:], []byte(p.HairFile)) offset += uint32(len(p.HairFile)) // Write HairTypeColor binary.LittleEndian.PutUint32(dest[offset:], p.HairTypeColor.ToUint32()) offset += 4 // Write HairTypeHighlightColor binary.LittleEndian.PutUint32(dest[offset:], p.HairTypeHighlightColor.ToUint32()) offset += 4 // Write FaceFile as 16-bit length-prefixed string binary.LittleEndian.PutUint16(dest[offset:], uint16(len(p.FaceFile))) offset += 2 copy(dest[offset:], []byte(p.FaceFile)) offset += uint32(len(p.FaceFile)) // Write HairFaceColor binary.LittleEndian.PutUint32(dest[offset:], p.HairFaceColor.ToUint32()) offset += 4 // Write HairFaceHighlightColor binary.LittleEndian.PutUint32(dest[offset:], p.HairFaceHighlightColor.ToUint32()) offset += 4 // Write WingFile as 16-bit length-prefixed string binary.LittleEndian.PutUint16(dest[offset:], uint16(len(p.WingFile))) offset += 2 copy(dest[offset:], []byte(p.WingFile)) offset += uint32(len(p.WingFile)) // Write WingColor1 binary.LittleEndian.PutUint32(dest[offset:], p.WingColor1.ToUint32()) offset += 4 // Write WingColor2 binary.LittleEndian.PutUint32(dest[offset:], p.WingColor2.ToUint32()) offset += 4 // Write ChestFile as 16-bit length-prefixed string binary.LittleEndian.PutUint16(dest[offset:], uint16(len(p.ChestFile))) offset += 2 copy(dest[offset:], []byte(p.ChestFile)) offset += uint32(len(p.ChestFile)) // Write ShirtColor binary.LittleEndian.PutUint32(dest[offset:], p.ShirtColor.ToUint32()) offset += 4 // Write UnknownChestColor binary.LittleEndian.PutUint32(dest[offset:], p.UnknownChestColor.ToUint32()) offset += 4 // Write LegsFile as 16-bit length-prefixed string binary.LittleEndian.PutUint16(dest[offset:], uint16(len(p.LegsFile))) offset += 2 copy(dest[offset:], []byte(p.LegsFile)) offset += uint32(len(p.LegsFile)) // Write PantsColor binary.LittleEndian.PutUint32(dest[offset:], p.PantsColor.ToUint32()) offset += 4 // Write UnknownLegsColor binary.LittleEndian.PutUint32(dest[offset:], p.UnknownLegsColor.ToUint32()) offset += 4 // Write Unknown9 binary.LittleEndian.PutUint32(dest[offset:], p.Unknown9.ToUint32()) offset += 4 // Write Eyes2 array for i := 0; i < 3; i++ { binary.LittleEndian.PutUint32(dest[offset:], math.Float32bits(p.Eyes2[i])) offset += 4 } // Write Ears array for i := 0; i < 3; i++ { binary.LittleEndian.PutUint32(dest[offset:], math.Float32bits(p.Ears[i])) offset += 4 } // Write EyeBrows array for i := 0; i < 3; i++ { binary.LittleEndian.PutUint32(dest[offset:], math.Float32bits(p.EyeBrows[i])) offset += 4 } // Write Cheeks array for i := 0; i < 3; i++ { binary.LittleEndian.PutUint32(dest[offset:], math.Float32bits(p.Cheeks[i])) offset += 4 } // Write Lips array for i := 0; i < 3; i++ { binary.LittleEndian.PutUint32(dest[offset:], math.Float32bits(p.Lips[i])) offset += 4 } // Write Chin array for i := 0; i < 3; i++ { binary.LittleEndian.PutUint32(dest[offset:], math.Float32bits(p.Chin[i])) offset += 4 } // Write Nose array for i := 0; i < 3; i++ { binary.LittleEndian.PutUint32(dest[offset:], math.Float32bits(p.Nose[i])) offset += 4 } // Write BodySize binary.LittleEndian.PutUint32(dest[offset:], math.Float32bits(p.BodySize)) offset += 4 // Write BodyAge binary.LittleEndian.PutUint32(dest[offset:], math.Float32bits(p.BodyAge)) offset += 4 // Write SogaVersion dest[offset] = byte(p.SogaVersion) offset++ // Write SogaRaceFile as 16-bit length-prefixed string binary.LittleEndian.PutUint16(dest[offset:], uint16(len(p.SogaRaceFile))) offset += 2 copy(dest[offset:], []byte(p.SogaRaceFile)) offset += uint32(len(p.SogaRaceFile)) // Write SogaSkinColor binary.LittleEndian.PutUint32(dest[offset:], p.SogaSkinColor.ToUint32()) offset += 4 // Write SogaEyeColor binary.LittleEndian.PutUint32(dest[offset:], p.SogaEyeColor.ToUint32()) offset += 4 // Write SogaHairColor1 binary.LittleEndian.PutUint32(dest[offset:], p.SogaHairColor1.ToUint32()) offset += 4 // Write SogaHairColor2 binary.LittleEndian.PutUint32(dest[offset:], p.SogaHairColor2.ToUint32()) offset += 4 // Write SogaHairHighlight binary.LittleEndian.PutUint32(dest[offset:], p.SogaHairHighlight.ToUint32()) offset += 4 // Write SogaUnknown11 array for i := 0; i < 38; i++ { dest[offset] = p.SogaUnknown11[i] offset++ } // Write SogaHairFile as 16-bit length-prefixed string binary.LittleEndian.PutUint16(dest[offset:], uint16(len(p.SogaHairFile))) offset += 2 copy(dest[offset:], []byte(p.SogaHairFile)) offset += uint32(len(p.SogaHairFile)) // Write SogaHairTypeColor binary.LittleEndian.PutUint32(dest[offset:], p.SogaHairTypeColor.ToUint32()) offset += 4 // Write SogaHairTypeHighlightColor binary.LittleEndian.PutUint32(dest[offset:], p.SogaHairTypeHighlightColor.ToUint32()) offset += 4 // Write SogaFaceFile as 16-bit length-prefixed string binary.LittleEndian.PutUint16(dest[offset:], uint16(len(p.SogaFaceFile))) offset += 2 copy(dest[offset:], []byte(p.SogaFaceFile)) offset += uint32(len(p.SogaFaceFile)) // Write SogaHairFaceColor binary.LittleEndian.PutUint32(dest[offset:], p.SogaHairFaceColor.ToUint32()) offset += 4 // Write SogaHairFaceHighlightColor binary.LittleEndian.PutUint32(dest[offset:], p.SogaHairFaceHighlightColor.ToUint32()) offset += 4 // Write SogaWingFile as 16-bit length-prefixed string binary.LittleEndian.PutUint16(dest[offset:], uint16(len(p.SogaWingFile))) offset += 2 copy(dest[offset:], []byte(p.SogaWingFile)) offset += uint32(len(p.SogaWingFile)) // Write SogaWingColor1 binary.LittleEndian.PutUint32(dest[offset:], p.SogaWingColor1.ToUint32()) offset += 4 // Write SogaWingColor2 binary.LittleEndian.PutUint32(dest[offset:], p.SogaWingColor2.ToUint32()) offset += 4 // Write SogaChestFile as 16-bit length-prefixed string binary.LittleEndian.PutUint16(dest[offset:], uint16(len(p.SogaChestFile))) offset += 2 copy(dest[offset:], []byte(p.SogaChestFile)) offset += uint32(len(p.SogaChestFile)) // Write SogaShirtColor binary.LittleEndian.PutUint32(dest[offset:], p.SogaShirtColor.ToUint32()) offset += 4 // Write SogaUnknownChestColor binary.LittleEndian.PutUint32(dest[offset:], p.SogaUnknownChestColor.ToUint32()) offset += 4 // Write SogaLegsFile as 16-bit length-prefixed string binary.LittleEndian.PutUint16(dest[offset:], uint16(len(p.SogaLegsFile))) offset += 2 copy(dest[offset:], []byte(p.SogaLegsFile)) offset += uint32(len(p.SogaLegsFile)) // Write SogaPantsColor binary.LittleEndian.PutUint32(dest[offset:], p.SogaPantsColor.ToUint32()) offset += 4 // Write SogaUnknownLegsColor binary.LittleEndian.PutUint32(dest[offset:], p.SogaUnknownLegsColor.ToUint32()) offset += 4 // Write SogaUnknown12 binary.LittleEndian.PutUint32(dest[offset:], p.SogaUnknown12.ToUint32()) offset += 4 // Write SogaEyes2 array for i := 0; i < 3; i++ { binary.LittleEndian.PutUint32(dest[offset:], math.Float32bits(p.SogaEyes2[i])) offset += 4 } // Write SogaEars array for i := 0; i < 3; i++ { binary.LittleEndian.PutUint32(dest[offset:], math.Float32bits(p.SogaEars[i])) offset += 4 } // Write SogaEyeBrows array for i := 0; i < 3; i++ { binary.LittleEndian.PutUint32(dest[offset:], math.Float32bits(p.SogaEyeBrows[i])) offset += 4 } // Write SogaCheeks array for i := 0; i < 3; i++ { binary.LittleEndian.PutUint32(dest[offset:], math.Float32bits(p.SogaCheeks[i])) offset += 4 } // Write SogaLips array for i := 0; i < 3; i++ { binary.LittleEndian.PutUint32(dest[offset:], math.Float32bits(p.SogaLips[i])) offset += 4 } // Write SogaChin array for i := 0; i < 3; i++ { binary.LittleEndian.PutUint32(dest[offset:], math.Float32bits(p.SogaChin[i])) offset += 4 } // Write SogaNose array for i := 0; i < 3; i++ { binary.LittleEndian.PutUint32(dest[offset:], math.Float32bits(p.SogaNose[i])) offset += 4 } // Write SogaBodySize binary.LittleEndian.PutUint32(dest[offset:], math.Float32bits(p.SogaBodySize)) offset += 4 // Write SogaBodyAge binary.LittleEndian.PutUint32(dest[offset:], math.Float32bits(p.SogaBodyAge)) offset += 4 // Write Unknown13 array for i := 0; i < 2; i++ { dest[offset] = p.Unknown13[i] offset++ } return offset } // Size returns the serialized size of the packet func (p *CreateCharacterV64659) Size() uint32 { size := uint32(0) size += 1 size += 4 size += 4 size += 1 size += 4 size += 2 + uint32(len(p.Name)) size += 1 size += 1 size += 1 size += 1 size += 1 size += 4 size += 1 size += 2 + uint32(len(p.RaceFile)) size += 4 size += 4 size += 4 size += 4 size += 4 size += 38 size += 2 + uint32(len(p.HairFile)) size += 4 size += 4 size += 2 + uint32(len(p.FaceFile)) size += 4 size += 4 size += 2 + uint32(len(p.WingFile)) size += 4 size += 4 size += 2 + uint32(len(p.ChestFile)) size += 4 size += 4 size += 2 + uint32(len(p.LegsFile)) size += 4 size += 4 size += 4 size += 3 * 4 size += 3 * 4 size += 3 * 4 size += 3 * 4 size += 3 * 4 size += 3 * 4 size += 3 * 4 size += 4 size += 4 size += 1 size += 2 + uint32(len(p.SogaRaceFile)) size += 4 size += 4 size += 4 size += 4 size += 4 size += 38 size += 2 + uint32(len(p.SogaHairFile)) size += 4 size += 4 size += 2 + uint32(len(p.SogaFaceFile)) size += 4 size += 4 size += 2 + uint32(len(p.SogaWingFile)) size += 4 size += 4 size += 2 + uint32(len(p.SogaChestFile)) size += 4 size += 4 size += 2 + uint32(len(p.SogaLegsFile)) size += 4 size += 4 size += 4 size += 3 * 4 size += 3 * 4 size += 3 * 4 size += 3 * 4 size += 3 * 4 size += 3 * 4 size += 3 * 4 size += 4 size += 4 size += 2 return size } // CreateCharacterV65534 represents packet structure for OP_CreateCharacterRequestMsg type CreateCharacterV65534 struct { Unknown0 uint8 `eq2:"unknown0"` // TODO: Identify purpose Unknown1 uint32 `eq2:"unknown1"` // TODO: Identify purpose AccountId uint32 `eq2:"account_id"` Unknown3 uint8 `eq2:"unknown3"` // TODO: Identify purpose ServerId uint32 `eq2:"server_id"` Name string `eq2:"name,type:str16"` Race uint8 `eq2:"race"` Gender uint8 `eq2:"gender"` Deity uint8 `eq2:"deity"` Class uint8 `eq2:"class"` Level uint8 `eq2:"level"` StartingZone uint32 `eq2:"starting_zone"` Version uint8 `eq2:"version"` RaceFile string `eq2:"race_file,type:str16"` SkinColor types.Color `eq2:"skin_color"` SkinColor2 types.Color `eq2:"skin_color2"` EyeColor types.Color `eq2:"eye_color"` HairColor1 types.Color `eq2:"hair_color1"` HairColor2 types.Color `eq2:"hair_color2"` Unknown8 [38]uint8 `eq2:"unknown8,size:38"` // TODO: Identify purpose HairFile string `eq2:"hair_file,type:str16"` HairTypeColor types.Color `eq2:"hair_type_color"` HairTypeHighlightColor types.Color `eq2:"hair_type_highlight_color"` FaceFile string `eq2:"face_file,type:str16"` HairFaceColor types.Color `eq2:"hair_face_color"` HairFaceHighlightColor types.Color `eq2:"hair_face_highlight_color"` WingFile string `eq2:"wing_file,type:str16"` WingColor1 types.Color `eq2:"wing_color1"` WingColor2 types.Color `eq2:"wing_color2"` ChestFile string `eq2:"chest_file,type:str16"` ShirtColor types.Color `eq2:"shirt_color"` UnknownChestColor types.Color `eq2:"unknown_chest_color"` // TODO: Identify purpose LegsFile string `eq2:"legs_file,type:str16"` PantsColor types.Color `eq2:"pants_color"` UnknownLegsColor types.Color `eq2:"unknown_legs_color"` // TODO: Identify purpose Unknown9 types.Color `eq2:"unknown9"` // TODO: Identify purpose Eyes2 [3]float32 `eq2:"eyes2,size:3"` Ears [3]float32 `eq2:"ears,size:3"` EyeBrows [3]float32 `eq2:"eye_brows,size:3"` Cheeks [3]float32 `eq2:"cheeks,size:3"` Lips [3]float32 `eq2:"lips,size:3"` Chin [3]float32 `eq2:"chin,size:3"` Nose [3]float32 `eq2:"nose,size:3"` BodySize float32 `eq2:"body_size"` BodyAge float32 `eq2:"body_age"` SogaVersion uint8 `eq2:"soga_version"` SogaRaceFile string `eq2:"soga_race_file,type:str16"` SogaSkinColor types.Color `eq2:"soga_skin_color"` SogaEyeColor types.Color `eq2:"soga_eye_color"` SogaHairColor1 types.Color `eq2:"soga_hair_color1"` SogaHairColor2 types.Color `eq2:"soga_hair_color2"` SogaHairHighlight types.Color `eq2:"soga_hair_highlight"` SogaUnknown11 [38]uint8 `eq2:"soga_unknown11,size:38"` SogaHairFile string `eq2:"soga_hair_file,type:str16"` SogaHairTypeColor types.Color `eq2:"soga_hair_type_color"` SogaHairTypeHighlightColor types.Color `eq2:"soga_hair_type_highlight_color"` SogaFaceFile string `eq2:"soga_face_file,type:str16"` SogaHairFaceColor types.Color `eq2:"soga_hair_face_color"` SogaHairFaceHighlightColor types.Color `eq2:"soga_hair_face_highlight_color"` SogaWingFile string `eq2:"soga_wing_file,type:str16"` SogaWingColor1 types.Color `eq2:"soga_wing_color1"` SogaWingColor2 types.Color `eq2:"soga_wing_color2"` SogaChestFile string `eq2:"soga_chest_file,type:str16"` SogaShirtColor types.Color `eq2:"soga_shirt_color"` SogaUnknownChestColor types.Color `eq2:"soga_unknown_chest_color"` SogaLegsFile string `eq2:"soga_legs_file,type:str16"` SogaPantsColor types.Color `eq2:"soga_pants_color"` SogaUnknownLegsColor types.Color `eq2:"soga_unknown_legs_color"` SogaUnknown12 types.Color `eq2:"soga_unknown12"` SogaEyes2 [3]float32 `eq2:"soga_eyes2,size:3"` SogaEars [3]float32 `eq2:"soga_ears,size:3"` SogaEyeBrows [3]float32 `eq2:"soga_eye_brows,size:3"` SogaCheeks [3]float32 `eq2:"soga_cheeks,size:3"` SogaLips [3]float32 `eq2:"soga_lips,size:3"` SogaChin [3]float32 `eq2:"soga_chin,size:3"` SogaNose [3]float32 `eq2:"soga_nose,size:3"` SogaBodySize float32 `eq2:"soga_body_size"` SogaBodyAge float32 `eq2:"soga_body_age"` Unknown13 [2]uint8 `eq2:"unknown13,size:2"` // TODO: Identify purpose } // Serialize writes the packet data to the provided buffer func (p *CreateCharacterV65534) Serialize(dest []byte) uint32 { offset := uint32(0) // Write Unknown0 dest[offset] = byte(p.Unknown0) offset++ // Write Unknown1 binary.LittleEndian.PutUint32(dest[offset:], uint32(p.Unknown1)) offset += 4 // Write AccountId binary.LittleEndian.PutUint32(dest[offset:], uint32(p.AccountId)) offset += 4 // Write Unknown3 dest[offset] = byte(p.Unknown3) offset++ // Write ServerId binary.LittleEndian.PutUint32(dest[offset:], uint32(p.ServerId)) offset += 4 // Write Name as 16-bit length-prefixed string binary.LittleEndian.PutUint16(dest[offset:], uint16(len(p.Name))) offset += 2 copy(dest[offset:], []byte(p.Name)) offset += uint32(len(p.Name)) // Write Race dest[offset] = byte(p.Race) offset++ // Write Gender dest[offset] = byte(p.Gender) offset++ // Write Deity dest[offset] = byte(p.Deity) offset++ // Write Class dest[offset] = byte(p.Class) offset++ // Write Level dest[offset] = byte(p.Level) offset++ // Write StartingZone binary.LittleEndian.PutUint32(dest[offset:], uint32(p.StartingZone)) offset += 4 // Write Version dest[offset] = byte(p.Version) offset++ // Write RaceFile as 16-bit length-prefixed string binary.LittleEndian.PutUint16(dest[offset:], uint16(len(p.RaceFile))) offset += 2 copy(dest[offset:], []byte(p.RaceFile)) offset += uint32(len(p.RaceFile)) // Write SkinColor binary.LittleEndian.PutUint32(dest[offset:], p.SkinColor.ToUint32()) offset += 4 // Write SkinColor2 binary.LittleEndian.PutUint32(dest[offset:], p.SkinColor2.ToUint32()) offset += 4 // Write EyeColor binary.LittleEndian.PutUint32(dest[offset:], p.EyeColor.ToUint32()) offset += 4 // Write HairColor1 binary.LittleEndian.PutUint32(dest[offset:], p.HairColor1.ToUint32()) offset += 4 // Write HairColor2 binary.LittleEndian.PutUint32(dest[offset:], p.HairColor2.ToUint32()) offset += 4 // Write Unknown8 array for i := 0; i < 38; i++ { dest[offset] = p.Unknown8[i] offset++ } // Write HairFile as 16-bit length-prefixed string binary.LittleEndian.PutUint16(dest[offset:], uint16(len(p.HairFile))) offset += 2 copy(dest[offset:], []byte(p.HairFile)) offset += uint32(len(p.HairFile)) // Write HairTypeColor binary.LittleEndian.PutUint32(dest[offset:], p.HairTypeColor.ToUint32()) offset += 4 // Write HairTypeHighlightColor binary.LittleEndian.PutUint32(dest[offset:], p.HairTypeHighlightColor.ToUint32()) offset += 4 // Write FaceFile as 16-bit length-prefixed string binary.LittleEndian.PutUint16(dest[offset:], uint16(len(p.FaceFile))) offset += 2 copy(dest[offset:], []byte(p.FaceFile)) offset += uint32(len(p.FaceFile)) // Write HairFaceColor binary.LittleEndian.PutUint32(dest[offset:], p.HairFaceColor.ToUint32()) offset += 4 // Write HairFaceHighlightColor binary.LittleEndian.PutUint32(dest[offset:], p.HairFaceHighlightColor.ToUint32()) offset += 4 // Write WingFile as 16-bit length-prefixed string binary.LittleEndian.PutUint16(dest[offset:], uint16(len(p.WingFile))) offset += 2 copy(dest[offset:], []byte(p.WingFile)) offset += uint32(len(p.WingFile)) // Write WingColor1 binary.LittleEndian.PutUint32(dest[offset:], p.WingColor1.ToUint32()) offset += 4 // Write WingColor2 binary.LittleEndian.PutUint32(dest[offset:], p.WingColor2.ToUint32()) offset += 4 // Write ChestFile as 16-bit length-prefixed string binary.LittleEndian.PutUint16(dest[offset:], uint16(len(p.ChestFile))) offset += 2 copy(dest[offset:], []byte(p.ChestFile)) offset += uint32(len(p.ChestFile)) // Write ShirtColor binary.LittleEndian.PutUint32(dest[offset:], p.ShirtColor.ToUint32()) offset += 4 // Write UnknownChestColor binary.LittleEndian.PutUint32(dest[offset:], p.UnknownChestColor.ToUint32()) offset += 4 // Write LegsFile as 16-bit length-prefixed string binary.LittleEndian.PutUint16(dest[offset:], uint16(len(p.LegsFile))) offset += 2 copy(dest[offset:], []byte(p.LegsFile)) offset += uint32(len(p.LegsFile)) // Write PantsColor binary.LittleEndian.PutUint32(dest[offset:], p.PantsColor.ToUint32()) offset += 4 // Write UnknownLegsColor binary.LittleEndian.PutUint32(dest[offset:], p.UnknownLegsColor.ToUint32()) offset += 4 // Write Unknown9 binary.LittleEndian.PutUint32(dest[offset:], p.Unknown9.ToUint32()) offset += 4 // Write Eyes2 array for i := 0; i < 3; i++ { binary.LittleEndian.PutUint32(dest[offset:], math.Float32bits(p.Eyes2[i])) offset += 4 } // Write Ears array for i := 0; i < 3; i++ { binary.LittleEndian.PutUint32(dest[offset:], math.Float32bits(p.Ears[i])) offset += 4 } // Write EyeBrows array for i := 0; i < 3; i++ { binary.LittleEndian.PutUint32(dest[offset:], math.Float32bits(p.EyeBrows[i])) offset += 4 } // Write Cheeks array for i := 0; i < 3; i++ { binary.LittleEndian.PutUint32(dest[offset:], math.Float32bits(p.Cheeks[i])) offset += 4 } // Write Lips array for i := 0; i < 3; i++ { binary.LittleEndian.PutUint32(dest[offset:], math.Float32bits(p.Lips[i])) offset += 4 } // Write Chin array for i := 0; i < 3; i++ { binary.LittleEndian.PutUint32(dest[offset:], math.Float32bits(p.Chin[i])) offset += 4 } // Write Nose array for i := 0; i < 3; i++ { binary.LittleEndian.PutUint32(dest[offset:], math.Float32bits(p.Nose[i])) offset += 4 } // Write BodySize binary.LittleEndian.PutUint32(dest[offset:], math.Float32bits(p.BodySize)) offset += 4 // Write BodyAge binary.LittleEndian.PutUint32(dest[offset:], math.Float32bits(p.BodyAge)) offset += 4 // Write SogaVersion dest[offset] = byte(p.SogaVersion) offset++ // Write SogaRaceFile as 16-bit length-prefixed string binary.LittleEndian.PutUint16(dest[offset:], uint16(len(p.SogaRaceFile))) offset += 2 copy(dest[offset:], []byte(p.SogaRaceFile)) offset += uint32(len(p.SogaRaceFile)) // Write SogaSkinColor binary.LittleEndian.PutUint32(dest[offset:], p.SogaSkinColor.ToUint32()) offset += 4 // Write SogaEyeColor binary.LittleEndian.PutUint32(dest[offset:], p.SogaEyeColor.ToUint32()) offset += 4 // Write SogaHairColor1 binary.LittleEndian.PutUint32(dest[offset:], p.SogaHairColor1.ToUint32()) offset += 4 // Write SogaHairColor2 binary.LittleEndian.PutUint32(dest[offset:], p.SogaHairColor2.ToUint32()) offset += 4 // Write SogaHairHighlight binary.LittleEndian.PutUint32(dest[offset:], p.SogaHairHighlight.ToUint32()) offset += 4 // Write SogaUnknown11 array for i := 0; i < 38; i++ { dest[offset] = p.SogaUnknown11[i] offset++ } // Write SogaHairFile as 16-bit length-prefixed string binary.LittleEndian.PutUint16(dest[offset:], uint16(len(p.SogaHairFile))) offset += 2 copy(dest[offset:], []byte(p.SogaHairFile)) offset += uint32(len(p.SogaHairFile)) // Write SogaHairTypeColor binary.LittleEndian.PutUint32(dest[offset:], p.SogaHairTypeColor.ToUint32()) offset += 4 // Write SogaHairTypeHighlightColor binary.LittleEndian.PutUint32(dest[offset:], p.SogaHairTypeHighlightColor.ToUint32()) offset += 4 // Write SogaFaceFile as 16-bit length-prefixed string binary.LittleEndian.PutUint16(dest[offset:], uint16(len(p.SogaFaceFile))) offset += 2 copy(dest[offset:], []byte(p.SogaFaceFile)) offset += uint32(len(p.SogaFaceFile)) // Write SogaHairFaceColor binary.LittleEndian.PutUint32(dest[offset:], p.SogaHairFaceColor.ToUint32()) offset += 4 // Write SogaHairFaceHighlightColor binary.LittleEndian.PutUint32(dest[offset:], p.SogaHairFaceHighlightColor.ToUint32()) offset += 4 // Write SogaWingFile as 16-bit length-prefixed string binary.LittleEndian.PutUint16(dest[offset:], uint16(len(p.SogaWingFile))) offset += 2 copy(dest[offset:], []byte(p.SogaWingFile)) offset += uint32(len(p.SogaWingFile)) // Write SogaWingColor1 binary.LittleEndian.PutUint32(dest[offset:], p.SogaWingColor1.ToUint32()) offset += 4 // Write SogaWingColor2 binary.LittleEndian.PutUint32(dest[offset:], p.SogaWingColor2.ToUint32()) offset += 4 // Write SogaChestFile as 16-bit length-prefixed string binary.LittleEndian.PutUint16(dest[offset:], uint16(len(p.SogaChestFile))) offset += 2 copy(dest[offset:], []byte(p.SogaChestFile)) offset += uint32(len(p.SogaChestFile)) // Write SogaShirtColor binary.LittleEndian.PutUint32(dest[offset:], p.SogaShirtColor.ToUint32()) offset += 4 // Write SogaUnknownChestColor binary.LittleEndian.PutUint32(dest[offset:], p.SogaUnknownChestColor.ToUint32()) offset += 4 // Write SogaLegsFile as 16-bit length-prefixed string binary.LittleEndian.PutUint16(dest[offset:], uint16(len(p.SogaLegsFile))) offset += 2 copy(dest[offset:], []byte(p.SogaLegsFile)) offset += uint32(len(p.SogaLegsFile)) // Write SogaPantsColor binary.LittleEndian.PutUint32(dest[offset:], p.SogaPantsColor.ToUint32()) offset += 4 // Write SogaUnknownLegsColor binary.LittleEndian.PutUint32(dest[offset:], p.SogaUnknownLegsColor.ToUint32()) offset += 4 // Write SogaUnknown12 binary.LittleEndian.PutUint32(dest[offset:], p.SogaUnknown12.ToUint32()) offset += 4 // Write SogaEyes2 array for i := 0; i < 3; i++ { binary.LittleEndian.PutUint32(dest[offset:], math.Float32bits(p.SogaEyes2[i])) offset += 4 } // Write SogaEars array for i := 0; i < 3; i++ { binary.LittleEndian.PutUint32(dest[offset:], math.Float32bits(p.SogaEars[i])) offset += 4 } // Write SogaEyeBrows array for i := 0; i < 3; i++ { binary.LittleEndian.PutUint32(dest[offset:], math.Float32bits(p.SogaEyeBrows[i])) offset += 4 } // Write SogaCheeks array for i := 0; i < 3; i++ { binary.LittleEndian.PutUint32(dest[offset:], math.Float32bits(p.SogaCheeks[i])) offset += 4 } // Write SogaLips array for i := 0; i < 3; i++ { binary.LittleEndian.PutUint32(dest[offset:], math.Float32bits(p.SogaLips[i])) offset += 4 } // Write SogaChin array for i := 0; i < 3; i++ { binary.LittleEndian.PutUint32(dest[offset:], math.Float32bits(p.SogaChin[i])) offset += 4 } // Write SogaNose array for i := 0; i < 3; i++ { binary.LittleEndian.PutUint32(dest[offset:], math.Float32bits(p.SogaNose[i])) offset += 4 } // Write SogaBodySize binary.LittleEndian.PutUint32(dest[offset:], math.Float32bits(p.SogaBodySize)) offset += 4 // Write SogaBodyAge binary.LittleEndian.PutUint32(dest[offset:], math.Float32bits(p.SogaBodyAge)) offset += 4 // Write Unknown13 array for i := 0; i < 2; i++ { dest[offset] = p.Unknown13[i] offset++ } return offset } // Size returns the serialized size of the packet func (p *CreateCharacterV65534) Size() uint32 { size := uint32(0) size += 1 size += 4 size += 4 size += 1 size += 4 size += 2 + uint32(len(p.Name)) size += 1 size += 1 size += 1 size += 1 size += 1 size += 4 size += 1 size += 2 + uint32(len(p.RaceFile)) size += 4 size += 4 size += 4 size += 4 size += 4 size += 38 size += 2 + uint32(len(p.HairFile)) size += 4 size += 4 size += 2 + uint32(len(p.FaceFile)) size += 4 size += 4 size += 2 + uint32(len(p.WingFile)) size += 4 size += 4 size += 2 + uint32(len(p.ChestFile)) size += 4 size += 4 size += 2 + uint32(len(p.LegsFile)) size += 4 size += 4 size += 4 size += 3 * 4 size += 3 * 4 size += 3 * 4 size += 3 * 4 size += 3 * 4 size += 3 * 4 size += 3 * 4 size += 4 size += 4 size += 1 size += 2 + uint32(len(p.SogaRaceFile)) size += 4 size += 4 size += 4 size += 4 size += 4 size += 38 size += 2 + uint32(len(p.SogaHairFile)) size += 4 size += 4 size += 2 + uint32(len(p.SogaFaceFile)) size += 4 size += 4 size += 2 + uint32(len(p.SogaWingFile)) size += 4 size += 4 size += 2 + uint32(len(p.SogaChestFile)) size += 4 size += 4 size += 2 + uint32(len(p.SogaLegsFile)) size += 4 size += 4 size += 4 size += 3 * 4 size += 3 * 4 size += 3 * 4 size += 3 * 4 size += 3 * 4 size += 3 * 4 size += 3 * 4 size += 4 size += 4 size += 2 return size } // BadLanguageFilter represents packet structure for OP_BadLanguageFilter type BadLanguageFilter struct { NumWords uint16 `eq2:"num_words"` WordsArray []struct { Word string `eq2:"word,type:str16"` } `eq2:"words_array,sizeVar:num_words"` } // Serialize writes the packet data to the provided buffer func (p *BadLanguageFilter) Serialize(dest []byte) uint32 { offset := uint32(0) // Write NumWords binary.LittleEndian.PutUint16(dest[offset:], uint16(p.NumWords)) offset += 2 // Write WordsArray array (dynamic size) for _, elem := range p.WordsArray { // Write Word string field dest[offset] = byte(len(elem.Word)) offset++ copy(dest[offset:], []byte(elem.Word)) offset += uint32(len(elem.Word)) } return offset } // Size returns the serialized size of the packet func (p *BadLanguageFilter) Size() uint32 { size := uint32(0) size += 2 // Dynamic array: WordsArray for _, elem := range p.WordsArray { _ = elem // Avoid unused variable warning size += 1 + uint32(len(elem.Word)) } return size }