- 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
Audited all 8 batch-2 components (enchantments, stored_enchantments,
can_place_on, can_break, lodestone_tracker, firework_explosion, fireworks,
banner_patterns, suspicious_stew_effects, bees) against official 1.20.6
decompiled STREAM_CODEC definitions.
Found and fixed 3 bugs in BlockPredicate/PropertySubComponent:
1. BlockPredicateSubcomponent.Serialize(): missing HasNbt bool write.
Parse reads the bool but Serialize skipped writing it, causing all
subsequent fields to be offset by one byte.
2. BlockPredicateSubcomponent.Serialize(): missing Properties list count
VarInt write. Parse reads VarInt count before iterating, but Serialize
only wrote the elements without the preceding count.
3. PropertySubComponent: RangedMatcher min/max values must use Optional
encoding (Bool prefix + conditional String), matching the official
ByteBufCodecs.either(ExactMatcher, RangedMatcher) where RangedMatcher
uses ByteBufCodecs.optional(STRING_UTF8) for both min and max fields.
Previously read/wrote plain Strings unconditionally.
Remaining 6 components (enchantments, stored_enchantments, lodestone_tracker,
firework_explosion, fireworks, banner_patterns, suspicious_stew_effects, bees)
verified correct — no changes needed.
Made-with: Cursor