Minecraft-Console-Client/MinecraftClient/Protocol/Handlers/StructuredComponents/Components/Subcomponents/1_21/AttributeSubComponent121.cs
BruceChen c23c229eb2 feat: protocol 767 (1.21) packet handling and AttributeSubComponent update
- Add AttributeSubComponent121 that uses ResourceLocation(string) instead
  of UUID+Name, matching the 1.21 attribute modifier wire format change.
  Register it in SubComponentRegistry121 via new ReplaceSubComponent method.
- Add ProjectilePower packet handler: reads 1 double (accelerationPower)
  for 1.21+, or 3 doubles (xPower/yPower/zPower) for 1.20.6.
- Add CustomReportDetails and ServerLinks packet handlers in both Play
  and Configuration phases, consuming all fields to prevent byte offset
  errors on 1.21 servers.

Made-with: Cursor
2026-03-20 01:22:25 +08:00

38 lines
1.5 KiB
C#

using System;
using System.Collections.Generic;
using MinecraftClient.Protocol.Handlers.StructuredComponents.Core;
namespace MinecraftClient.Protocol.Handlers.StructuredComponents.Components.Subcomponents._1_21;
public class AttributeSubComponent121(DataTypes dataTypes, SubComponentRegistry subComponentRegistry) : SubComponent(dataTypes, subComponentRegistry)
{
public int TypeId { get; set; }
public string? ResourceLocation { get; set; }
public double Value { get; set; }
public int Operation { get; set; }
public int Slot { get; set; }
protected override void Parse(Queue<byte> data)
{
TypeId = dataTypes.ReadNextVarInt(data);
ResourceLocation = dataTypes.ReadNextString(data);
Value = dataTypes.ReadNextDouble(data);
Operation = dataTypes.ReadNextVarInt(data);
Slot = dataTypes.ReadNextVarInt(data);
}
public override Queue<byte> Serialize()
{
var data = new List<byte>();
data.AddRange(DataTypes.GetVarInt(TypeId));
if (string.IsNullOrEmpty(ResourceLocation?.Trim()))
throw new ArgumentNullException($"Can not serialize AttributeSubComponent121 due to ResourceLocation being null or empty!");
data.AddRange(DataTypes.GetString(ResourceLocation));
data.AddRange(DataTypes.GetDouble(Value));
data.AddRange(DataTypes.GetVarInt(Operation));
data.AddRange(DataTypes.GetVarInt(Slot));
return new Queue<byte>(data);
}
}