Two bugs fixed:
1. EnchantmentsComponent was reading a trailing ShowTooltip boolean that
was removed from the wire format in MC 1.21.5. Created
EnchantmentsComponent1215 and StoredEnchantmentsComponent1215 that
omit the boolean. Used by StructuredComponentsRegistry1215 and 12111.
2. MC 1.21.5+ changed ServerboundContainerClickPacket to use HashedStack
(item holder id + count + hashed component patch map) instead of full
ItemStack for changed slots and carried item. Added GetHashedItemSlot()
in DataTypes.cs and gated SendWindowAction in Protocol18.cs to use it
for 1.21.5+. Since MCC doesn't track component hashes, an empty
HashedPatchMap is sent; the server detects stateId mismatch and resyncs.
Tested: AutoFishing bot successfully catches fish on MC 1.21.11 with
enchanted fishing rods (Lure III + Luck of the Sea III).
Made-with: Cursor
Updated the SKILL.md documentation to include critical steps for generating server reports and validating decompiled source against server data, emphasizing the importance of using server data since MC 1.21.9. Enhanced the diff_registries.py script to support cross-validation with server registries.json, allowing for accurate palette generation. Added new scripts for generating block and entity palettes from server data, ensuring completeness and correctness of entries.
This update improves the workflow for adapting to new Minecraft versions and ensures that palette generation reflects the latest changes in item and block registration.
Made-with: Cursor
MC 1.21.9 changed how some items and blocks are registered — 24 block
items (copper bars/chains/lanterns variants, potted azalea renames) and
additional blocks are now registered outside of Items.java/Blocks.java
field declarations, making the previous source-field-order-based palette
generation produce incorrect protocol IDs.
Regenerated ItemPalette1219.cs using server registries.json (1488 items,
up from 1464) and Palette1219.cs using blocks.json (1166 blocks with
correct state IDs). Added 37 new enum values to ItemType.cs (35 new +
DryShortGrass/DryTallGrass for backward compat) and 9 new values to
Material.cs.
Verified all item/block/entity identification against a 1.21.10 server.
Made-with: Cursor
Minecraft 1.21.9 changed the SpawnEntity (Add Entity) packet layout:
the velocity/movement field was moved before the angle fields and
switched from 3 x Short to a new variable-length LpVec3 encoding.
Add ReadNextLpVec3() to consume the LpVec3 wire format (1 byte header,
optionally 5+ more bytes with a continuation VarInt), and update
ReadNextEntity() to use the new field order for protocol >= 773.
Made-with: Cursor
- Route block/entity/item/packet/metadata palettes to new 1219 variants
for protocol >= 773, and raise upper-bound guards from MC_1_21_7 to
MC_1_21_9 so terrain, inventory, and entity handling are enabled.
- Add DataTypes readers for three new entity metadata serializer types:
CopperGolemState and WeatheringCopperState (both VarInt), and
ResolvableProfile (composite: Either<GameProfile, Partial> with
optional name/UUID/properties + PlayerSkin.Patch with 4 optional
fields for body/cape/elytra texture ResourceLocations and model type).
Made-with: Cursor
- Palette1219.cs: 1053 blocks with new copper chests, copper golem
statues, copper torches, shelves, oxidized lightning rods, iron chain
- EntityPalette1219.cs: 153 entities (+copper_golem at 27, mannequin at 82)
- ItemPalette1219.cs: 1464 items (generated via gen_item_palette.py)
- EntityMetadataPalette1219.cs: 37 serializers (COMPOUND_TAG removed,
+CopperGolemState, WeatheringCopperState, ResolvableProfile)
- PacketPalette1219.cs: updated clientbound IDs for 4 new debug packets
and GameTestHighlightPos, plus config CodeOfConduct/AcceptCodeOfConduct
Also update gen_entity_metadata_palette.py FIELD_TO_ENUM with the three
new serializer type mappings.
Made-with: Cursor
Register protocol 773 for Minecraft 1.21.9 and 1.21.10 (which share the
same protocol as a hotfix release). Update MCHighestVersion to 1.21.10.
Add 49 new item types (copper tools/armor, shelves, copper chests,
copper golem statue variants, oxidized lightning rods, iron chain, etc.),
2 new entity types (CopperGolem, Mannequin), 38 new block materials,
3 new entity metadata serializer types (CopperGolemState,
WeatheringCopperState, ResolvableProfile), and 6 new packet types
(DebugBlockValue, DebugChunkValue, DebugEntityValue, DebugEvent,
GameTestHighlightPos, CodeOfConduct, AcceptCodeOfConduct).
Chain item/block renamed to IronChain in 1.21.9; old enum values
retained for backward compatibility with older palettes.
Made-with: Cursor
1.21.7 and 1.21.8 share protocol 772. The only registry change from
1.21.6 is one new item (music_disc_lava_chicken). All other palettes
(blocks, entities, packets, entity metadata, structured components)
are unchanged and reuse 1.21.6 versions.
Changes:
- Add MC_1_21_7_Version (772) constant
- Add "1.21.7" / "1.21.8" version mappings in ProtocolHandler
- Add MusicDiscLavaChicken to ItemType enum
- Generate ItemPalette1217 (1416 items) for the new item palette
- Update all version upper-bound checks from MC_1_21_6 to MC_1_21_7
- Update MCHighestVersion to "1.21.8"
Made-with: Cursor
The biome PalettedContainer data array length was calculated as
ceil(64 * bitsPerEntry / 64) which is incorrect for non-power-of-2
bit widths. The correct calculation uses SimpleBitStorage's formula:
valuesPerLong = 64 / bitsPerEntry, then ceil(64 / valuesPerLong).
For example, with bitsPerEntry=3: old formula gave 3 longs but the
actual data contains 4 longs (valuesPerLong=21, ceil(64/21)=4).
This bug was masked in 1.21.5 by excess padding bytes in chunk buffers
(due to PalettedContainer.Data.getSerializedSize over-counting). MC
1.21.6 fixed the size calculation server-side, removing the padding
and exposing this pre-existing MCC bug.
Made-with: Cursor
- ItemPalette1216: 1415 items (generated from decompiled Items.java)
- EntityPalette1216: 151 entities (HappyGhast at index 56, all after +1)
- Palette1216: block states (DriedGhast 32 states at 13826-13857, all after +32)
- PacketPalette1216: clientbound +3 (Waypoint, ClearDialog, ShowDialog),
serverbound +2 (ChangeGameMode at 0x04 shifting all after, CustomClickAction at end),
config clientbound +2 (ClearDialog, ShowDialog),
config serverbound +1 (CustomClickAction)
- Version routing in Protocol18.cs, PacketType18Handler.cs, EntityMetadataPalette.cs
updated to select 1216 palettes for protocol >= 771
- EntityMetadataPalette reuses 1215 (EntityDataSerializers unchanged)
Made-with: Cursor
1.21.5 changed LastSeenMessages.Update to include a trailing checksum
byte (0 = skip verification). This affects serverbound chat and signed
chat command packets.
Additionally, the clientbound PlayerChat packet now has a globalIndex
VarInt prepended before the sender UUID.
Without these fixes:
- Sending plain chat messages causes DecoderException on the server
- Receiving player chat messages causes Queue empty crash in MCC
Made-with: Cursor
In 1.21.5, two wire format changes in level chunk packets:
1. Heightmaps changed from NBT CompoundTag to map<VarInt, long[]> encoding
2. PalettedContainer data arrays no longer have VarInt length prefix
(uses writeFixedSizeLongArray instead of writeLongArray)
Both changes affect ChunkData (level_chunk_with_light) packet parsing.
Without this fix, MCC crashes with "Queue empty" when processing chunks.
Made-with: Cursor
Added entries to the .gitignore file to exclude possible debug files related to Minecraft, including language files, input configurations, and backup files.
Made-with: Cursor
Added a new entry to the .gitignore file to exclude the directory for decompiled Minecraft official source code. Also ensured that the .vscode/launch.json file is not ignored.
Made-with: Cursor
The PickItem packet was split into PickItemFromBlock (0x22) and
PickItemFromEntity (0x23) in 1.21.4. Mapping both to the same
PacketTypesOut.PickItem enum caused a duplicate key error in the
reverse mapping. Added PickItemFromEntity enum to resolve this.
Made-with: Cursor
Add complete protocol 769 support for Minecraft 1.21.4:
- Version constants: Add 769 to supported versions, MC_1_21_4_Version constant,
and version string mappings (including 1.21.3 -> 768 compatibility)
- Item palette: 10 new items (Resin series + Eyeblossom), generated ItemPalette1214
- Entity palette: Remove CreakingTransient (149 entities, down from 150)
- Block palette: 10 new blocks with correct blockstate ID ranges from server data
- Packet palette: Serverbound packet ID reshuffling - PickItem split into
PickItemFromBlock/PickItemFromEntity, new PlayerLoaded packet inserted after
PlayerInput, subsequent IDs shifted accordingly. Clientbound unchanged.
- PlayerLoaded: Send empty PlayerLoaded packet after JoinGame processing (>= 1.21.4)
- EntityMetadata/DataComponents: Reuse 1.20.6 palettes (unchanged registries)
- Update all version guard checks from MC_1_21_2 to MC_1_21_4
Made-with: Cursor
Update submodule to commit a045f7e which adds net8.0 target framework,
fixing NETSDK1005 build error in CI when publishing with -f net8.0.
Made-with: Cursor
The previous commits added palette files, packet IDs, and structured components
for MC 1.21.2 (protocol 768), but terrain/inventory/entity features were still
disabled at runtime because the version guards in the constructor checked
> MC_1_21_Version (767) instead of > MC_1_21_2_Version (768).
This commit completes the 1.21.2 adaptation with the following changes:
- Update feature-disable guards from > MC_1_21_Version to > MC_1_21_2_Version
so terrain, inventory, and entity handling are enabled for protocol 768
- Update healthField metadata index guard to > MC_1_21_2_Version
- Handle container ID encoding change: byte -> VarInt for 1.21.2+ in both
clientbound reads (CloseWindow, WindowItems, WindowProperty, SetSlot) and
serverbound sends (ClickWindow, CloseWindow)
- Handle EntityTeleport format change: 1.21.2 uses PositionMoveRotation
(pos + delta + float angles) + relative flags bitmask (int) + onGround
- Handle TimeUpdate format change: 1.21.2 appends a tickDayTime boolean
- Add handlers for new 1.21.2 packets: EntityPositionSync, PlayerRotation,
SetCursorItem, SetPlayerInventory, MoveMinecartAlongTrack, and
RecipeBookAdd/Remove/Settings (ignored, MCC doesn't track recipes)
Tested: successful connection to 1.21.2 vanilla server with inventory,
entity tracking, and chat all working correctly.
Made-with: Cursor
- SpawnEntity packet handler now registers non-player entities via OnSpawnEntity
for protocol >= 1.20.2 (previously only players were tracked, causing 'entity near'
to find nothing)
- PlaceBlock gains lookAtBlock option that sends a position/rotation update before the
block placement packet, fixing containers not opening via useblock
- Enchantment registry IDs are now dynamically parsed from server RegistryData
(minecraft:enchantment), fixing incorrect enchantment name display in 1.21
- AttributeModifiersComponent uses base SubComponent type to avoid InvalidCastException
when parsing 1.21-specific attribute subcomponents
Made-with: Cursor
Add tools/ directory with Python scripts for comparing Minecraft version
registries and generating MCC palette files:
- diff_registries.py: Compare Items/EntityTypes/Blocks/DataComponents/
EntityDataSerializers between two decompiled MC versions, reporting
which palettes need updating with ID shift analysis.
- gen_item_palette.py: Generate ItemPaletteXXX.cs from Items.java field
declaration order, with name validation against ItemType.cs.
- gen_entity_metadata_palette.py: Generate EntityMetadataPaletteXXX.cs
from EntityDataSerializers.java registration order.
- README.md: Usage documentation for all scripts.
Made-with: Cursor
1.20.6 introduced three new EntityDataSerializer types compared to 1.20.4:
- PARTICLES (id 18) - list of particles, inserted after PARTICLE
- WOLF_VARIANT (id 23) - wolf variant holder, inserted after CAT_VARIANT
- ARMADILLO_STATE (id 28) - armadillo state, inserted after SNIFFER_STATE
These insertions shifted subsequent serializer IDs, causing the 1.19.4
palette (EntityMetadataPalette1194) to misidentify metadata types on
1.20.6+ servers. This could lead to incorrect byte consumption and
potential packet parse failures when entities with affected metadata
types (e.g. wolves, armadillos, area effect clouds with particles)
were present.
Changes:
- Add Particles, WolfVariant, ArmadilloState to EntityMetaDataType enum
- Create EntityMetadataPalette1206 with correct 31-entry ID mapping
- Route 1.20.6+ to the new palette in EntityMetadataPalette.GetPalette()
- Add read logic for the three new types in DataTypes.cs
Verified on 1.21.1 vanilla server: cat, wolf, frog, armadillo, painting
entities all spawn without metadata parse errors.
Made-with: Cursor