2024-09-01 20:42:39 +02:00
|
|
|
using System.Collections.Generic;
|
2026-06-27 14:41:41 -03:00
|
|
|
using System.Text.Json.Serialization;
|
2024-09-11 20:35:23 +02:00
|
|
|
using MinecraftClient.Inventory.ItemPalettes;
|
2024-09-01 20:42:39 +02:00
|
|
|
|
|
|
|
|
namespace MinecraftClient.Protocol.Handlers.StructuredComponents.Core;
|
|
|
|
|
|
2024-09-11 20:35:23 +02:00
|
|
|
public abstract class StructuredComponent(DataTypes dataTypes, ItemPalette itemPalette, SubComponentRegistry subComponentRegistry)
|
2024-09-01 20:42:39 +02:00
|
|
|
{
|
|
|
|
|
protected DataTypes DataTypes { get; private set; } = dataTypes;
|
|
|
|
|
protected SubComponentRegistry SubComponentRegistry { get; private set; } = subComponentRegistry;
|
2024-09-11 20:35:23 +02:00
|
|
|
protected ItemPalette ItemPalette { get; private set; } = itemPalette;
|
Wire up 1.20.6 structured components to Item and fix GetItemSlot serialization
In 1.20.6+, items use structured components instead of NBT for metadata.
Previously, ReadNextItemSlot parsed the components but never stored them
on the Item instance, leaving DisplayName/Lores/Damage/Enchantments all
empty. GetItemSlot also still used the pre-1.20.6 format (bool + VarInt +
byte + NBT), causing the server to reject any item operation packets.
Changes:
Item.cs:
- Add List<StructuredComponent>? Components field to hold the raw
component list for round-trip serialization
- DisplayName property: read from CustomNameComponent (with
ItemNameComponent as fallback) when Components is present
- Lores property: read from LoreNameComponent1206 when Components is
present
- Damage property: read from DamageComponent when Components is present
- Add EnchantmentList property: read from EnchantmentsComponent (covers
both normal and StoredEnchantmentsComponent for enchanted books)
- ToFullString(): use EnchantmentList with EnchantmentMapping for display
when available, fall back to NBT path for older versions
- Add CloneWithCount() method that preserves both NBT and Components
DataTypes.cs - ReadNextItemSlot:
- Assign parsed strcturedComponentsToAdd to item.Components
DataTypes.cs - GetItemSlot:
- Add 1.20.6+ branch: write VarInt(count) + VarInt(itemId) + component
counts + serialized components (using each component's TypeId and
Serialize() method)
- Empty slot sends VarInt(0) per the 1.20.6 protocol spec
StructuredComponent.cs:
- Add int TypeId property (default -1) to store the registry type ID
assigned during parsing, enabling round-trip serialization
StructuredComponentRegistry.cs:
- Set component.TypeId = id after instantiation in ParseComponent()
McClient.cs:
- Replace manual Item constructor calls (new Item(type, count, nbt))
with Item.CloneWithCount() to preserve Components during inventory
operations like slot moves, stack splits, and right-click placement
Made-with: Cursor
2026-03-19 00:26:24 +08:00
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// The registry type ID assigned during parsing, used for round-trip serialization.
|
|
|
|
|
/// </summary>
|
2026-06-27 14:41:41 -03:00
|
|
|
[JsonIgnore]
|
Wire up 1.20.6 structured components to Item and fix GetItemSlot serialization
In 1.20.6+, items use structured components instead of NBT for metadata.
Previously, ReadNextItemSlot parsed the components but never stored them
on the Item instance, leaving DisplayName/Lores/Damage/Enchantments all
empty. GetItemSlot also still used the pre-1.20.6 format (bool + VarInt +
byte + NBT), causing the server to reject any item operation packets.
Changes:
Item.cs:
- Add List<StructuredComponent>? Components field to hold the raw
component list for round-trip serialization
- DisplayName property: read from CustomNameComponent (with
ItemNameComponent as fallback) when Components is present
- Lores property: read from LoreNameComponent1206 when Components is
present
- Damage property: read from DamageComponent when Components is present
- Add EnchantmentList property: read from EnchantmentsComponent (covers
both normal and StoredEnchantmentsComponent for enchanted books)
- ToFullString(): use EnchantmentList with EnchantmentMapping for display
when available, fall back to NBT path for older versions
- Add CloneWithCount() method that preserves both NBT and Components
DataTypes.cs - ReadNextItemSlot:
- Assign parsed strcturedComponentsToAdd to item.Components
DataTypes.cs - GetItemSlot:
- Add 1.20.6+ branch: write VarInt(count) + VarInt(itemId) + component
counts + serialized components (using each component's TypeId and
Serialize() method)
- Empty slot sends VarInt(0) per the 1.20.6 protocol spec
StructuredComponent.cs:
- Add int TypeId property (default -1) to store the registry type ID
assigned during parsing, enabling round-trip serialization
StructuredComponentRegistry.cs:
- Set component.TypeId = id after instantiation in ParseComponent()
McClient.cs:
- Replace manual Item constructor calls (new Item(type, count, nbt))
with Item.CloneWithCount() to preserve Components during inventory
operations like slot moves, stack splits, and right-click placement
Made-with: Cursor
2026-03-19 00:26:24 +08:00
|
|
|
public int TypeId { get; set; } = -1;
|
|
|
|
|
|
2026-06-27 14:41:41 -03:00
|
|
|
/// <summary>
|
|
|
|
|
/// The registry name assigned during parsing (e.g. "minecraft:custom_data"), used for NBT serialization.
|
|
|
|
|
/// </summary>
|
|
|
|
|
[JsonIgnore]
|
|
|
|
|
public string ComponentName { get; set; } = string.Empty;
|
|
|
|
|
|
2024-09-01 20:42:39 +02:00
|
|
|
public abstract void Parse(Queue<byte> data);
|
|
|
|
|
public abstract Queue<byte> Serialize();
|
|
|
|
|
}
|