using System.Collections.Generic; using MinecraftClient.Inventory.ItemPalettes; using MinecraftClient.Protocol.Handlers.StructuredComponents.Core; namespace MinecraftClient.Protocol.Handlers.StructuredComponents.Components._1_21_5; public class BlocksAttacksComponent(DataTypes dataTypes, ItemPalette itemPalette, SubComponentRegistry subComponentRegistry) : StructuredComponent(dataTypes, itemPalette, subComponentRegistry) { public float BlockDelaySeconds { get; set; } public float DisableCooldownScale { get; set; } public List RawDamageReductions { get; set; } = []; public float ItemDamageThreshold { get; set; } public float ItemDamageBase { get; set; } public float ItemDamageFactor { get; set; } public override void Parse(Queue data) { BlockDelaySeconds = DataTypes.ReadNextFloat(data); DisableCooldownScale = DataTypes.ReadNextFloat(data); var reductionCount = DataTypes.ReadNextVarInt(data); for (var i = 0; i < reductionCount; i++) { var horizontalBlockingAngle = DataTypes.ReadNextFloat(data); var hasTypeFilter = DataTypes.ReadNextBool(data); if (hasTypeFilter) ReadHolderSet(data); var baseDmg = DataTypes.ReadNextFloat(data); var factor = DataTypes.ReadNextFloat(data); } ItemDamageThreshold = DataTypes.ReadNextFloat(data); ItemDamageBase = DataTypes.ReadNextFloat(data); ItemDamageFactor = DataTypes.ReadNextFloat(data); var hasBypassedBy = DataTypes.ReadNextBool(data); if (hasBypassedBy) DataTypes.ReadNextString(data); // TagKey as ResourceLocation var hasBlockSound = DataTypes.ReadNextBool(data); if (hasBlockSound) ReadSoundEventHolder(data); var hasDisableSound = DataTypes.ReadNextBool(data); if (hasDisableSound) ReadSoundEventHolder(data); } private void ReadHolderSet(Queue data) { var sizeOrTag = DataTypes.ReadNextVarInt(data); if (sizeOrTag == 0) { DataTypes.ReadNextString(data); // Tag ResourceLocation } else { var count = sizeOrTag - 1; for (var i = 0; i < count; i++) DataTypes.ReadNextVarInt(data); // Holder registry ids } } private void ReadSoundEventHolder(Queue data) { var holderId = DataTypes.ReadNextVarInt(data); if (holderId == 0) { DataTypes.ReadNextString(data); // ResourceLocation var hasFixedRange = DataTypes.ReadNextBool(data); if (hasFixedRange) DataTypes.ReadNextFloat(data); } } public override Queue Serialize() { return new Queue(); } }