using System.Collections.Generic; using MinecraftClient.Inventory.ItemPalettes; using MinecraftClient.Protocol.Handlers.StructuredComponents.Core; namespace MinecraftClient.Protocol.Handlers.StructuredComponents.Components._1_20_6; public class CustomModelDataComponent(DataTypes dataTypes, ItemPalette itemPalette, SubComponentRegistry subComponentRegistry) : StructuredComponent(dataTypes, itemPalette, subComponentRegistry) { public List Floats { get; set; } = []; public List Flags { get; set; } = []; public List Strings { get; set; } = []; public List Colors { get; set; } = []; public override void Parse(Queue data) { Floats = ReadList(data, static (dataTypes, componentData) => dataTypes.ReadNextFloat(componentData)); Flags = ReadList(data, static (dataTypes, componentData) => dataTypes.ReadNextBool(componentData)); Strings = ReadList(data, static (dataTypes, componentData) => dataTypes.ReadNextString(componentData)); Colors = ReadList(data, static (dataTypes, componentData) => dataTypes.ReadNextInt(componentData)); } public override Queue Serialize() { var data = new List(); WriteList(data, Floats, static (dataTypes, value) => dataTypes.GetFloat(value)); WriteList(data, Flags, static (dataTypes, value) => dataTypes.GetBool(value)); WriteList(data, Strings, static (dataTypes, value) => dataTypes.GetString(value)); WriteList(data, Colors, static (_, value) => DataTypes.GetInt(value)); return new Queue(data); } private List ReadList(Queue data, ReadDelegate read) { var count = DataTypes.ReadNextVarInt(data); var values = new List(count); for (var i = 0; i < count; i++) values.Add(read(DataTypes, data)); return values; } private void WriteList(List data, List values, WriteDelegate write) { data.AddRange(DataTypes.GetVarInt(values.Count)); foreach (var value in values) data.AddRange(write(DataTypes, value)); } private delegate T ReadDelegate(DataTypes dataTypes, Queue data); private delegate byte[] WriteDelegate(DataTypes dataTypes, T value); }