diff --git a/legacyver/block_translator.go b/legacyver/block_translator.go index 4499bcb..b9634ed 100644 --- a/legacyver/block_translator.go +++ b/legacyver/block_translator.go @@ -18,15 +18,10 @@ const ( ) var ( - //go:embed data/block_states_766.nbt - latestBlockStateData []byte - - // latestBlockMapping is the BlockMapping used for translating blocks between versions. - latestBlockMapping = mapping.NewBlockMapping(latestBlockStateData) // LatestNetworkPersistentEncoding is the Encoding used for sending a Chunk over network. It uses NBT, unlike NetworkEncoding. - LatestNetworkPersistentEncoding = chunk.NewNetworkPersistentEncoding(latestBlockMapping, BlockVersionLatest) + LatestNetworkPersistentEncoding = chunk.NewNetworkPersistentEncoding(blockMappingLatest, BlockVersionLatest) // LatestBlockPaletteEncoding is the paletteEncoding used for encoding a palette of block states encoded as NBT. - LatestBlockPaletteEncoding = chunk.NewBlockPaletteEncoding(latestBlockMapping, BlockVersionLatest) + LatestBlockPaletteEncoding = chunk.NewBlockPaletteEncoding(blockMappingLatest, BlockVersionLatest) ) type BlockTranslator interface { diff --git a/legacyver/item_translator.go b/legacyver/item_translator.go index 2d63066..3a4f651 100644 --- a/legacyver/item_translator.go +++ b/legacyver/item_translator.go @@ -43,6 +43,10 @@ type ItemTranslator interface { DowngradeLegacyItemRegistry(entries []proto.LegacyItemRegistryEntry) []proto.LegacyItemRegistryEntry // UpgradeLegacyItemRegistry ... UpgradeLegacyItemRegistry(entries []proto.LegacyItemRegistryEntry) []proto.LegacyItemRegistryEntry + // DowngradeItemEntries ... + DowngradeItemEntries(entries []proto.ItemEntry) []proto.ItemEntry + // UpgradeItemEntries ... + UpgradeItemEntries(entries []proto.ItemEntry) []proto.ItemEntry } type DefaultItemTranslator struct { @@ -562,6 +566,70 @@ func (t *DefaultItemTranslator) UpgradeLegacyItemRegistry(entries []proto.Legacy return entries } +func (t *DefaultItemTranslator) DowngradeItemEntries(entries []proto.ItemEntry) []proto.ItemEntry { + for i, entry := range entries { + if !entry.ComponentBased { + itemType := t.DowngradeItemType(protocol.ItemType{ + NetworkID: int32(entry.RuntimeID), + MetadataValue: 0, + }) + if itemType.NetworkID == t.mapping.Air() { + removeIndex(entries, i) + continue + } + entry.RuntimeID = int16(itemType.NetworkID) + + var ok bool + if entry.Name, ok = t.mapping.ItemRuntimeIDToName(int32(entry.RuntimeID)); !ok { + panic(entry) + } + } else { + t.latest.RegisterEntryRID(entry.Name, int32(entry.RuntimeID), 2) + entry.RuntimeID = int16(t.mapping.RegisterEntry(entry.Name)) + } + entries[i] = entry + } + for rid, i := range t.CustomItems() { + name, _ := i.EncodeItem() + entries = append(entries, proto.ItemEntry{ + Name: name, + RuntimeID: int16(rid), + ComponentBased: true, + }) + } + return entries +} + +func (t *DefaultItemTranslator) UpgradeItemEntries(entries []proto.ItemEntry) []proto.ItemEntry { + for i, entry := range entries { + if !entry.ComponentBased { + itemType := t.UpgradeItemType(protocol.ItemType{ + NetworkID: int32(entry.RuntimeID), + MetadataValue: 0, + }) + entry.RuntimeID = int16(itemType.NetworkID) + + var ok bool + if entry.Name, ok = t.latest.ItemRuntimeIDToName(int32(entry.RuntimeID)); !ok { + panic(entry) + } + } else { + t.latest.RegisterEntryRID(entry.Name, int32(entry.RuntimeID), 2) + entry.RuntimeID = int16(t.mapping.RegisterEntry(entry.Name)) + } + entries[i] = entry + } + for rid, i := range t.CustomItems() { + name, _ := i.EncodeItem() + entries = append(entries, proto.ItemEntry{ + Name: name, + RuntimeID: int16(rid), + ComponentBased: true, + }) + } + return entries +} + func (t *DefaultItemTranslator) UpgradeItemPackets(pks []packet.Packet, _ *minecraft.Conn) (result []packet.Packet) { for _, pk := range pks { switch pk := pk.(type) { diff --git a/legacyver/legacypacket/item_registry.go b/legacyver/legacypacket/item_registry.go index e34e033..9d718b9 100644 --- a/legacyver/legacypacket/item_registry.go +++ b/legacyver/legacypacket/item_registry.go @@ -20,6 +20,8 @@ type ItemRegistry struct { func (*ItemRegistry) ID() uint32 { return packet.IDItemRegistry } + +// Marshal ... func (pk *ItemRegistry) Marshal(io protocol.IO) { protocol.Slice(io, &pk.Items) } diff --git a/legacyver/protocol.go b/legacyver/protocol.go index b49b260..4b68949 100644 --- a/legacyver/protocol.go +++ b/legacyver/protocol.go @@ -559,9 +559,13 @@ func (p *Protocol) downgradePackets(pks []packet.Packet, conn *minecraft.Conn) [ for i, it := range pk.Items { items[i] = (&proto.ItemEntry{}).FromLatest(it) } + + items = p.itemTranslator.DowngradeItemEntries(items) + pks[pkIndex] = &legacypacket.ItemRegistry{ Items: items, } + return []packet.Packet{} case *packet.StructureBlockUpdate: pks[pkIndex] = &legacypacket.StructureBlockUpdate{ Position: pk.Position, @@ -1052,10 +1056,13 @@ func (p *Protocol) upgradePackets(pks []packet.Packet, conn *minecraft.Conn) []p Items: items, } case *legacypacket.ItemRegistry: + pk.Items = p.itemTranslator.UpgradeItemEntries(pk.Items) + items := make([]protocol.ItemEntry, len(pk.Items)) for i, it := range pk.Items { items[i] = it.ToLatest() } + pks[pkIndex] = &packet.ItemRegistry{Items: items} case *legacypacket.StructureBlockUpdate: pks[pkIndex] = &packet.StructureBlockUpdate{ diff --git a/legacyver/v671.go b/legacyver/v671.go index 383fd12..9ed3091 100644 --- a/legacyver/v671.go +++ b/legacyver/v671.go @@ -31,7 +31,7 @@ func New671() *Protocol { return &Protocol{ ver: "1.20.80", id: proto.ID671, - blockTranslator: NewBlockTranslator(blockMapping, latestBlockMapping, chunk.NewNetworkPersistentEncoding(blockMapping, BlockVersion671), chunk.NewBlockPaletteEncoding(blockMapping, BlockVersion671), false), + blockTranslator: NewBlockTranslator(blockMapping, blockMappingLatest, chunk.NewNetworkPersistentEncoding(blockMapping, BlockVersion671), chunk.NewBlockPaletteEncoding(blockMapping, BlockVersion671), false), itemTranslator: NewItemTranslator(itemMapping, itemMappingLatest, blockMapping, blockMappingLatest), } } diff --git a/legacyver/v685.go b/legacyver/v685.go index dc70d99..8447ca8 100644 --- a/legacyver/v685.go +++ b/legacyver/v685.go @@ -22,7 +22,7 @@ func New685() *Protocol { return &Protocol{ ver: "1.21.0", id: proto.ID685, - blockTranslator: NewBlockTranslator(blockMapping, latestBlockMapping, chunk.NewNetworkPersistentEncoding(blockMapping, BlockVersion685), chunk.NewBlockPaletteEncoding(blockMapping, BlockVersion685), false), + blockTranslator: NewBlockTranslator(blockMapping, blockMappingLatest, chunk.NewNetworkPersistentEncoding(blockMapping, BlockVersion685), chunk.NewBlockPaletteEncoding(blockMapping, BlockVersion685), false), itemTranslator: NewItemTranslator(itemMapping, itemMappingLatest, blockMapping, blockMappingLatest), } } diff --git a/legacyver/v686.go b/legacyver/v686.go index 82b396e..a5ac3d0 100644 --- a/legacyver/v686.go +++ b/legacyver/v686.go @@ -30,7 +30,7 @@ func New686() *Protocol { return &Protocol{ ver: "1.21.2", id: proto.ID686, - blockTranslator: NewBlockTranslator(blockMapping, latestBlockMapping, chunk.NewNetworkPersistentEncoding(blockMapping, BlockVersion686), chunk.NewBlockPaletteEncoding(blockMapping, BlockVersion686), false), + blockTranslator: NewBlockTranslator(blockMapping, blockMappingLatest, chunk.NewNetworkPersistentEncoding(blockMapping, BlockVersion686), chunk.NewBlockPaletteEncoding(blockMapping, BlockVersion686), false), itemTranslator: NewItemTranslator(itemMapping, itemMappingLatest, blockMapping, blockMappingLatest), } } diff --git a/legacyver/v712.go b/legacyver/v712.go index ab6a6da..54146ea 100644 --- a/legacyver/v712.go +++ b/legacyver/v712.go @@ -30,7 +30,7 @@ func New712() *Protocol { return &Protocol{ ver: "1.21.20", id: proto.ID712, - blockTranslator: NewBlockTranslator(blockMapping, latestBlockMapping, chunk.NewNetworkPersistentEncoding(blockMapping, BlockVersion712), chunk.NewBlockPaletteEncoding(blockMapping, BlockVersion712), false), + blockTranslator: NewBlockTranslator(blockMapping, blockMappingLatest, chunk.NewNetworkPersistentEncoding(blockMapping, BlockVersion712), chunk.NewBlockPaletteEncoding(blockMapping, BlockVersion712), false), itemTranslator: NewItemTranslator(itemMapping, itemMappingLatest, blockMapping, blockMappingLatest), } } diff --git a/legacyver/v729.go b/legacyver/v729.go index 0016069..4333361 100644 --- a/legacyver/v729.go +++ b/legacyver/v729.go @@ -30,7 +30,7 @@ func New729() *Protocol { return &Protocol{ ver: "1.21.30", id: proto.ID729, - blockTranslator: NewBlockTranslator(blockMapping, latestBlockMapping, chunk.NewNetworkPersistentEncoding(blockMapping, BlockVersion729), chunk.NewBlockPaletteEncoding(blockMapping, BlockVersion729), false), + blockTranslator: NewBlockTranslator(blockMapping, blockMappingLatest, chunk.NewNetworkPersistentEncoding(blockMapping, BlockVersion729), chunk.NewBlockPaletteEncoding(blockMapping, BlockVersion729), false), itemTranslator: NewItemTranslator(itemMapping, itemMappingLatest, blockMapping, blockMappingLatest), } } diff --git a/legacyver/v748.go b/legacyver/v748.go index 1db72dc..a3d8d2f 100644 --- a/legacyver/v748.go +++ b/legacyver/v748.go @@ -30,7 +30,7 @@ func New748() *Protocol { return &Protocol{ ver: "1.21.40", id: proto.ID748, - blockTranslator: NewBlockTranslator(blockMapping, latestBlockMapping, chunk.NewNetworkPersistentEncoding(blockMapping, BlockVersion748), chunk.NewBlockPaletteEncoding(blockMapping, BlockVersion748), false), + blockTranslator: NewBlockTranslator(blockMapping, blockMappingLatest, chunk.NewNetworkPersistentEncoding(blockMapping, BlockVersion748), chunk.NewBlockPaletteEncoding(blockMapping, BlockVersion748), false), itemTranslator: NewItemTranslator(itemMapping, itemMappingLatest, blockMapping, blockMappingLatest), } } diff --git a/legacyver/v766.go b/legacyver/v766.go index 99aae65..e2df9ba 100644 --- a/legacyver/v766.go +++ b/legacyver/v766.go @@ -30,7 +30,7 @@ func New766() *Protocol { return &Protocol{ ver: "1.21.50", id: proto.ID766, - blockTranslator: NewBlockTranslator(blockMapping766, latestBlockMapping, chunk.NewNetworkPersistentEncoding(blockMapping766, BlockVersion766), chunk.NewBlockPaletteEncoding(blockMapping766, BlockVersion766), false), + blockTranslator: NewBlockTranslator(blockMapping766, blockMappingLatest, chunk.NewNetworkPersistentEncoding(blockMapping766, BlockVersion766), chunk.NewBlockPaletteEncoding(blockMapping766, BlockVersion766), false), itemTranslator: NewItemTranslator(itemMapping766, itemMappingLatest, blockMapping766, blockMappingLatest), } }