diff --git a/legacyver/all.go b/legacyver/all.go index d723556..ab33df4 100644 --- a/legacyver/all.go +++ b/legacyver/all.go @@ -4,22 +4,21 @@ import ( "github.com/sandertv/gophertunnel/minecraft" ) -// All returns a slice of all legacy protocol versions that are supported. deleteDebugStick -// must be set to true if you're using Dragonfly. deleteDebugStick must be set to false if you're using -// PocketMine, Nukkit, or other server software that includes the debug stick in the item registry. -func All(deleteDebugStick bool) []minecraft.Protocol { +// All returns a slice of all legacy protocol versions that are supported. dragonflyMapping +// must be set to true if you're using Dragonfly. +func All(dragonflyMapping bool) []minecraft.Protocol { return []minecraft.Protocol{ - New800(deleteDebugStick), - New786(deleteDebugStick), - New776(deleteDebugStick), - New766(deleteDebugStick), - New748(deleteDebugStick), - New729(deleteDebugStick), - New712(deleteDebugStick), - New686(deleteDebugStick), - New685(deleteDebugStick), - New671(deleteDebugStick), - New662(deleteDebugStick), - New649(deleteDebugStick), + New800(dragonflyMapping), + New786(dragonflyMapping), + New776(dragonflyMapping), + New766(dragonflyMapping), + New748(dragonflyMapping), + New729(dragonflyMapping), + New712(dragonflyMapping), + New686(dragonflyMapping), + New685(dragonflyMapping), + New671(dragonflyMapping), + New662(dragonflyMapping), + New649(dragonflyMapping), } } diff --git a/legacyver/data/dragonfly_latest_vanilla_items.nbt b/legacyver/data/dragonfly_latest_vanilla_items.nbt new file mode 100644 index 0000000..a03fd48 Binary files /dev/null and b/legacyver/data/dragonfly_latest_vanilla_items.nbt differ diff --git a/legacyver/v649.go b/legacyver/v649.go index 65f55ef..3d51800 100644 --- a/legacyver/v649.go +++ b/legacyver/v649.go @@ -22,14 +22,14 @@ var ( ) // New649 ... -func New649(deleteDebugStick bool) *Protocol { - itemMapping := mapping.NewItemMapping(requiredItemList649, ItemVersion649, deleteDebugStick) +func New649(dragonflyMapping bool) *Protocol { + itemMapping := mapping.NewItemMapping(requiredItemList649, ItemVersion649) blockMapping := mapping.NewBlockMapping(blockStateData649) return &Protocol{ ver: "1.20.60", id: proto.ID649, blockTranslator: NewBlockTranslator(blockMapping, blockMappingLatest, chunk.NewNetworkPersistentEncoding(blockMapping, BlockVersion649), chunk.NewBlockPaletteEncoding(blockMapping, BlockVersion649), false), - itemTranslator: NewItemTranslator(itemMapping, itemMappingLatest(deleteDebugStick), blockMapping, blockMappingLatest), + itemTranslator: NewItemTranslator(itemMapping, itemMappingLatest(dragonflyMapping), blockMapping, blockMappingLatest), } } diff --git a/legacyver/v662.go b/legacyver/v662.go index 38dded9..bb978f7 100644 --- a/legacyver/v662.go +++ b/legacyver/v662.go @@ -22,14 +22,14 @@ var ( ) // New662 ... -func New662(deleteDebugStick bool) *Protocol { - itemMapping := mapping.NewItemMapping(requiredItemList662, ItemVersion662, deleteDebugStick) +func New662(dragonflyMapping bool) *Protocol { + itemMapping := mapping.NewItemMapping(requiredItemList662, ItemVersion662) blockMapping := mapping.NewBlockMapping(blockStateData662) return &Protocol{ ver: "1.20.70", id: proto.ID662, blockTranslator: NewBlockTranslator(blockMapping, blockMappingLatest, chunk.NewNetworkPersistentEncoding(blockMapping, BlockVersion662), chunk.NewBlockPaletteEncoding(blockMapping, BlockVersion662), false), - itemTranslator: NewItemTranslator(itemMapping, itemMappingLatest(deleteDebugStick), blockMapping, blockMappingLatest), + itemTranslator: NewItemTranslator(itemMapping, itemMappingLatest(dragonflyMapping), blockMapping, blockMappingLatest), } } diff --git a/legacyver/v671.go b/legacyver/v671.go index 73ca9cd..63824db 100644 --- a/legacyver/v671.go +++ b/legacyver/v671.go @@ -22,14 +22,14 @@ var ( ) // New671 ... -func New671(deleteDebugStick bool) *Protocol { - itemMapping := mapping.NewItemMapping(requiredItemList671, ItemVersion671, deleteDebugStick) +func New671(dragonflyMapping bool) *Protocol { + itemMapping := mapping.NewItemMapping(requiredItemList671, ItemVersion671) blockMapping := mapping.NewBlockMapping(blockStateData671) return &Protocol{ ver: "1.20.80", id: proto.ID671, blockTranslator: NewBlockTranslator(blockMapping, blockMappingLatest, chunk.NewNetworkPersistentEncoding(blockMapping, BlockVersion671), chunk.NewBlockPaletteEncoding(blockMapping, BlockVersion671), false), - itemTranslator: NewItemTranslator(itemMapping, itemMappingLatest(deleteDebugStick), blockMapping, blockMappingLatest), + itemTranslator: NewItemTranslator(itemMapping, itemMappingLatest(dragonflyMapping), blockMapping, blockMappingLatest), } } diff --git a/legacyver/v685.go b/legacyver/v685.go index 2ec8846..5f89872 100644 --- a/legacyver/v685.go +++ b/legacyver/v685.go @@ -15,14 +15,14 @@ const ( ) // New685 uses same data as 686 -func New685(deleteDebugStick bool) *Protocol { - itemMapping := mapping.NewItemMapping(requiredItemList686, ItemVersion685, deleteDebugStick) +func New685(dragonflyMapping bool) *Protocol { + itemMapping := mapping.NewItemMapping(requiredItemList686, ItemVersion685) blockMapping := mapping.NewBlockMapping(blockStateData686) return &Protocol{ ver: "1.21.0", id: proto.ID685, blockTranslator: NewBlockTranslator(blockMapping, blockMappingLatest, chunk.NewNetworkPersistentEncoding(blockMapping, BlockVersion685), chunk.NewBlockPaletteEncoding(blockMapping, BlockVersion685), false), - itemTranslator: NewItemTranslator(itemMapping, itemMappingLatest(deleteDebugStick), blockMapping, blockMappingLatest), + itemTranslator: NewItemTranslator(itemMapping, itemMappingLatest(dragonflyMapping), blockMapping, blockMappingLatest), } } diff --git a/legacyver/v686.go b/legacyver/v686.go index af85d79..0438728 100644 --- a/legacyver/v686.go +++ b/legacyver/v686.go @@ -21,14 +21,14 @@ var ( blockStateData686 []byte ) -func New686(deleteDebugStick bool) *Protocol { - itemMapping := mapping.NewItemMapping(requiredItemList686, ItemVersion686, deleteDebugStick) +func New686(dragonflyMapping bool) *Protocol { + itemMapping := mapping.NewItemMapping(requiredItemList686, ItemVersion686) blockMapping := mapping.NewBlockMapping(blockStateData686) return &Protocol{ ver: "1.21.2", id: proto.ID686, blockTranslator: NewBlockTranslator(blockMapping, blockMappingLatest, chunk.NewNetworkPersistentEncoding(blockMapping, BlockVersion686), chunk.NewBlockPaletteEncoding(blockMapping, BlockVersion686), false), - itemTranslator: NewItemTranslator(itemMapping, itemMappingLatest(deleteDebugStick), blockMapping, blockMappingLatest), + itemTranslator: NewItemTranslator(itemMapping, itemMappingLatest(dragonflyMapping), blockMapping, blockMappingLatest), } } diff --git a/legacyver/v712.go b/legacyver/v712.go index 3158225..b826441 100644 --- a/legacyver/v712.go +++ b/legacyver/v712.go @@ -21,14 +21,14 @@ var ( blockStateData712 []byte ) -func New712(deleteDebugStick bool) *Protocol { - itemMapping := mapping.NewItemMapping(requiredItemList712, ItemVersion712, deleteDebugStick) +func New712(dragonflyMapping bool) *Protocol { + itemMapping := mapping.NewItemMapping(requiredItemList712, ItemVersion712) blockMapping := mapping.NewBlockMapping(blockStateData712) return &Protocol{ ver: "1.21.20", id: proto.ID712, blockTranslator: NewBlockTranslator(blockMapping, blockMappingLatest, chunk.NewNetworkPersistentEncoding(blockMapping, BlockVersion712), chunk.NewBlockPaletteEncoding(blockMapping, BlockVersion712), false), - itemTranslator: NewItemTranslator(itemMapping, itemMappingLatest(deleteDebugStick), blockMapping, blockMappingLatest), + itemTranslator: NewItemTranslator(itemMapping, itemMappingLatest(dragonflyMapping), blockMapping, blockMappingLatest), } } diff --git a/legacyver/v729.go b/legacyver/v729.go index 1064ce3..71e48eb 100644 --- a/legacyver/v729.go +++ b/legacyver/v729.go @@ -21,14 +21,14 @@ var ( blockStateData729 []byte ) -func New729(deleteDebugStick bool) *Protocol { - itemMapping := mapping.NewItemMapping(requiredItemList729, ItemVersion729, deleteDebugStick) +func New729(dragonflyMapping bool) *Protocol { + itemMapping := mapping.NewItemMapping(requiredItemList729, ItemVersion729) blockMapping := mapping.NewBlockMapping(blockStateData729) return &Protocol{ ver: "1.21.30", id: proto.ID729, blockTranslator: NewBlockTranslator(blockMapping, blockMappingLatest, chunk.NewNetworkPersistentEncoding(blockMapping, BlockVersion729), chunk.NewBlockPaletteEncoding(blockMapping, BlockVersion729), false), - itemTranslator: NewItemTranslator(itemMapping, itemMappingLatest(deleteDebugStick), blockMapping, blockMappingLatest), + itemTranslator: NewItemTranslator(itemMapping, itemMappingLatest(dragonflyMapping), blockMapping, blockMappingLatest), } } diff --git a/legacyver/v748.go b/legacyver/v748.go index 540d0f7..8f24941 100644 --- a/legacyver/v748.go +++ b/legacyver/v748.go @@ -21,14 +21,14 @@ var ( blockStateData748 []byte ) -func New748(deleteDebugStick bool) *Protocol { - itemMapping := mapping.NewItemMapping(requiredItemList748, ItemVersion748, deleteDebugStick) +func New748(dragonflyMapping bool) *Protocol { + itemMapping := mapping.NewItemMapping(requiredItemList748, ItemVersion748) blockMapping := mapping.NewBlockMapping(blockStateData748) return &Protocol{ ver: "1.21.40", id: proto.ID748, blockTranslator: NewBlockTranslator(blockMapping, blockMappingLatest, chunk.NewNetworkPersistentEncoding(blockMapping, BlockVersion748), chunk.NewBlockPaletteEncoding(blockMapping, BlockVersion748), false), - itemTranslator: NewItemTranslator(itemMapping, itemMappingLatest(deleteDebugStick), blockMapping, blockMappingLatest), + itemTranslator: NewItemTranslator(itemMapping, itemMappingLatest(dragonflyMapping), blockMapping, blockMappingLatest), } } diff --git a/legacyver/v766.go b/legacyver/v766.go index 51873a9..dbe9829 100644 --- a/legacyver/v766.go +++ b/legacyver/v766.go @@ -21,13 +21,13 @@ var ( blockStateData766 []byte ) -func New766(deleteDebugStick bool) *Protocol { - itemMapping := mapping.NewItemMapping(requiredItemList766, ItemVersion766, deleteDebugStick) +func New766(dragonflyMapping bool) *Protocol { + itemMapping := mapping.NewItemMapping(requiredItemList766, ItemVersion766) blockMapping := mapping.NewBlockMapping(blockStateData766) return &Protocol{ ver: "1.21.50", id: proto.ID766, blockTranslator: NewBlockTranslator(blockMapping, blockMappingLatest, chunk.NewNetworkPersistentEncoding(blockMapping, BlockVersion766), chunk.NewBlockPaletteEncoding(blockMapping, BlockVersion766), false), - itemTranslator: NewItemTranslator(itemMapping, itemMappingLatest(deleteDebugStick), blockMapping, blockMappingLatest), + itemTranslator: NewItemTranslator(itemMapping, itemMappingLatest(dragonflyMapping), blockMapping, blockMappingLatest), } } diff --git a/legacyver/v776.go b/legacyver/v776.go index 33b6044..9e519a1 100644 --- a/legacyver/v776.go +++ b/legacyver/v776.go @@ -21,14 +21,14 @@ var ( blockStateData776 []byte ) -func New776(deleteDebugStick bool) *Protocol { - itemMapping := mapping.NewItemMapping(requiredItemList776, ItemVersion776, deleteDebugStick) +func New776(dragonflyMapping bool) *Protocol { + itemMapping := mapping.NewItemMapping(requiredItemList776, ItemVersion776) blockMapping := mapping.NewBlockMapping(blockStateData776) return &Protocol{ ver: "1.21.60", id: proto.ID776, blockTranslator: NewBlockTranslator(blockMapping, blockMappingLatest, chunk.NewNetworkPersistentEncoding(blockMapping, BlockVersion776), chunk.NewBlockPaletteEncoding(blockMapping, BlockVersion776), false), - itemTranslator: NewItemTranslator(itemMapping, itemMappingLatest(deleteDebugStick), blockMapping, blockMappingLatest), + itemTranslator: NewItemTranslator(itemMapping, itemMappingLatest(dragonflyMapping), blockMapping, blockMappingLatest), } } diff --git a/legacyver/v786.go b/legacyver/v786.go index ac1043a..ab23433 100644 --- a/legacyver/v786.go +++ b/legacyver/v786.go @@ -21,13 +21,13 @@ var ( blockStateData786 []byte ) -func New786(deleteDebugStick bool) *Protocol { - itemMapping786 := mapping.NewItemMapping(requiredItemList786, ItemVersion786, deleteDebugStick) +func New786(dragonflyMapping bool) *Protocol { + itemMapping786 := mapping.NewItemMapping(requiredItemList786, ItemVersion786) blockMapping786 := mapping.NewBlockMapping(blockStateData786) return &Protocol{ ver: "1.21.70", id: proto.ID786, blockTranslator: NewBlockTranslator(blockMapping786, blockMappingLatest, chunk.NewNetworkPersistentEncoding(blockMapping786, BlockVersion786), chunk.NewBlockPaletteEncoding(blockMapping786, BlockVersion786), false), - itemTranslator: NewItemTranslator(itemMapping786, itemMappingLatest(deleteDebugStick), blockMapping786, blockMappingLatest), + itemTranslator: NewItemTranslator(itemMapping786, itemMappingLatest(dragonflyMapping), blockMapping786, blockMappingLatest), } } diff --git a/legacyver/v800.go b/legacyver/v800.go index e7486ac..a67455f 100644 --- a/legacyver/v800.go +++ b/legacyver/v800.go @@ -21,13 +21,13 @@ var ( blockStateData800 []byte ) -func New800(deleteDebugStick bool) *Protocol { - itemMapping := mapping.NewItemMapping(requiredItemList800, ItemVersion800, deleteDebugStick) +func New800(dragonflyMapping bool) *Protocol { + itemMapping := mapping.NewItemMapping(requiredItemList800, ItemVersion800) blockMapping := mapping.NewBlockMapping(blockStateData800) return &Protocol{ ver: "1.21.80", id: proto.ID800, blockTranslator: NewBlockTranslator(blockMapping, blockMappingLatest, chunk.NewNetworkPersistentEncoding(blockMapping, BlockVersion800), chunk.NewBlockPaletteEncoding(blockMapping, BlockVersion800), false), - itemTranslator: NewItemTranslator(itemMapping, itemMappingLatest(deleteDebugStick), blockMapping, blockMappingLatest), + itemTranslator: NewItemTranslator(itemMapping, itemMappingLatest(dragonflyMapping), blockMapping, blockMappingLatest), } } diff --git a/legacyver/v818.go b/legacyver/v818.go index e6f3b32..e4fe46b 100644 --- a/legacyver/v818.go +++ b/legacyver/v818.go @@ -3,6 +3,7 @@ package legacyver import ( _ "embed" "github.com/akmalfairuz/legacy-version/mapping" + "github.com/sandertv/gophertunnel/minecraft/nbt" ) const ( @@ -17,15 +18,33 @@ var ( requiredItemList818 []byte //go:embed data/block_states_818.nbt blockStateData818 []byte + //go:embed data/dragonfly_latest_vanilla_items.nbt + dragonflyLatestVanillaItemsRaw []byte - itemMappingLatestWithDebugStick = mapping.NewItemMapping(requiredItemList818, ItemVersion818, false) - itemMappingLatestWithoutDebugStick = mapping.NewItemMapping(requiredItemList818, ItemVersion818, true) - blockMappingLatest = mapping.NewBlockMapping(blockStateData818) + itemMappingLatestPocketMine = mapping.NewItemMapping(requiredItemList818, ItemVersion818) + itemMappingLatestDragonfly = mapping.NewItemMapping(requiredItemList818, ItemVersion818) + blockMappingLatest = mapping.NewBlockMapping(blockStateData818) ) -func itemMappingLatest(deleteDebugStick bool) mapping.Item { - if deleteDebugStick { - return itemMappingLatestWithoutDebugStick +func init() { + var m map[string]struct { + RuntimeID int32 `nbt:"runtime_id"` + ComponentBased bool `nbt:"component_based"` + Version int32 `nbt:"version"` + Data map[string]any `nbt:"data,omitempty"` + } + if err := nbt.Unmarshal(dragonflyLatestVanillaItemsRaw, &m); err != nil { + panic(err) + } + + for identifier, v := range m { + itemMappingLatestDragonfly.SetItemRuntimeID(identifier, v.RuntimeID) } - return itemMappingLatestWithDebugStick +} + +func itemMappingLatest(dragonflyMapping bool) mapping.Item { + if dragonflyMapping { + return itemMappingLatestDragonfly + } + return itemMappingLatestPocketMine } diff --git a/mapping/item.go b/mapping/item.go index 50a3ead..64d4c6e 100644 --- a/mapping/item.go +++ b/mapping/item.go @@ -21,6 +21,7 @@ type Item interface { Air() int32 ItemVersion() uint16 ItemEntries() []ItemEntry + SetItemRuntimeID(string, int32) } type ItemEntry struct { @@ -48,14 +49,13 @@ type DefaultItemMapping struct { itemVersion uint16 } -func NewItemMapping(requiredItemList []byte, itemVersion uint16, deleteDebugStick bool) *DefaultItemMapping { +func NewItemMapping(requiredItemList []byte, itemVersion uint16) *DefaultItemMapping { itemRuntimeIDsToNames := make(map[int32]string) itemNamesToRuntimeIDs := make(map[string]int32) itemRuntimeIDToVersion := make(map[int32]uint8) itemRuntimeIDToData := make(map[int32]map[string]any) itemEntries := make([]ItemEntry, 0, 1600) var airRID *int32 - var debugStickRID *int32 var m map[string]struct { RuntimeID int16 `json:"runtime_id"` @@ -67,21 +67,6 @@ func NewItemMapping(requiredItemList []byte, itemVersion uint16, deleteDebugStic panic(err) } - if v, ok := m["minecraft:debug_stick"]; ok { - rid := int32(v.RuntimeID) - debugStickRID = &rid - } - - if deleteDebugStick && debugStickRID != nil { - delete(m, "minecraft:debug_stick") - for name, data := range m { - if int32(data.RuntimeID) > *debugStickRID { - data.RuntimeID-- // Shift all runtime IDs down by 1 - } - m[name] = data - } - } - for name, data := range m { rid := int32(data.RuntimeID) if name == "minecraft:air" { @@ -121,6 +106,13 @@ func NewItemMapping(requiredItemList []byte, itemVersion uint16, deleteDebugStic return &DefaultItemMapping{itemRuntimeIDsToNames: itemRuntimeIDsToNames, itemNamesToRuntimeIDs: itemNamesToRuntimeIDs, itemRuntimeIDToVersion: itemRuntimeIDToVersion, airRID: *airRID, itemVersion: itemVersion, itemRuntimeIDToData: itemRuntimeIDToData, itemEntries: itemEntries} } +func (m *DefaultItemMapping) SetItemRuntimeID(name string, runtimeID int32) { + m.mu.Lock() + defer m.mu.Unlock() + m.itemNamesToRuntimeIDs[name] = runtimeID + m.itemRuntimeIDsToNames[runtimeID] = name +} + func (m *DefaultItemMapping) ItemRuntimeIDToName(runtimeID int32) (name string, found bool) { defer m.mu.Unlock() m.mu.Lock()