diff --git a/example-proxy.go b/example-proxy.go index 8a67153..fd60a0a 100644 --- a/example-proxy.go +++ b/example-proxy.go @@ -28,7 +28,7 @@ func main() { } listener, err := minecraft.ListenConfig{ StatusProvider: p, - AcceptedProtocols: legacyver.All(), + AcceptedProtocols: legacyver.All(false), }.Listen("raknet", config.Connection.LocalAddress) if err != nil { panic(err) diff --git a/legacyver/all.go b/legacyver/all.go index 915545f..d723556 100644 --- a/legacyver/all.go +++ b/legacyver/all.go @@ -4,20 +4,22 @@ import ( "github.com/sandertv/gophertunnel/minecraft" ) -// All returns a slice of all legacy protocol versions that are supported. -func All() []minecraft.Protocol { +// 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 { return []minecraft.Protocol{ - New800(), - New786(), - New776(), - New766(), - New748(), - New729(), - New712(), - New686(), - New685(), - New671(), - New662(), - New649(), + New800(deleteDebugStick), + New786(deleteDebugStick), + New776(deleteDebugStick), + New766(deleteDebugStick), + New748(deleteDebugStick), + New729(deleteDebugStick), + New712(deleteDebugStick), + New686(deleteDebugStick), + New685(deleteDebugStick), + New671(deleteDebugStick), + New662(deleteDebugStick), + New649(deleteDebugStick), } } diff --git a/legacyver/block_translator.go b/legacyver/block_translator.go index b9634ed..d983c67 100644 --- a/legacyver/block_translator.go +++ b/legacyver/block_translator.go @@ -206,7 +206,7 @@ func (t *DefaultBlockTranslator) DowngradeBlockPackets(pks []packet.Packet, conn pk.EntityMetadata = t.downgradeEntityMetadata(pk.EntityMetadata) } case *packet.SetActorData: - pk.EntityMetadata = t.downgradeEntityMetadata(pk.EntityMetadata) + //pk.EntityMetadata = t.downgradeEntityMetadata(pk.EntityMetadata) case *packet.StartGame: t.latest.Adjust(pk.Blocks) t.mapping.Adjust(pk.Blocks) @@ -234,7 +234,7 @@ func (t *DefaultBlockTranslator) UpgradeBlockPackets(pks []packet.Packet, conn * pk.TransactionData = transactionData } case *packet.SetActorData: - pk.EntityMetadata = t.upgradeEntityMetadata(pk.EntityMetadata) + //pk.EntityMetadata = t.upgradeEntityMetadata(pk.EntityMetadata) } result = append(result, pk) } diff --git a/legacyver/item_translator.go b/legacyver/item_translator.go index 6576628..fb9f7b8 100644 --- a/legacyver/item_translator.go +++ b/legacyver/item_translator.go @@ -57,6 +57,7 @@ type DefaultItemTranslator struct { ridToCustomItem map[int32]world.CustomItem originalToCustom map[int32]int32 customToOriginal map[int32]int32 + hasDebugStick bool } func NewItemTranslator(mapping mapping.Item, latestMapping mapping.Item, blockMapping mapping.Block, blockMappingLatest mapping.Block) *DefaultItemTranslator { diff --git a/legacyver/v649.go b/legacyver/v649.go index 0a258a2..65f55ef 100644 --- a/legacyver/v649.go +++ b/legacyver/v649.go @@ -22,14 +22,14 @@ var ( ) // New649 ... -func New649() *Protocol { - itemMapping := mapping.NewItemMapping(requiredItemList649, ItemVersion649) +func New649(deleteDebugStick bool) *Protocol { + itemMapping := mapping.NewItemMapping(requiredItemList649, ItemVersion649, deleteDebugStick) 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, blockMapping, blockMappingLatest), + itemTranslator: NewItemTranslator(itemMapping, itemMappingLatest(deleteDebugStick), blockMapping, blockMappingLatest), } } diff --git a/legacyver/v662.go b/legacyver/v662.go index b47412a..38dded9 100644 --- a/legacyver/v662.go +++ b/legacyver/v662.go @@ -22,14 +22,14 @@ var ( ) // New662 ... -func New662() *Protocol { - itemMapping := mapping.NewItemMapping(requiredItemList662, ItemVersion662) +func New662(deleteDebugStick bool) *Protocol { + itemMapping := mapping.NewItemMapping(requiredItemList662, ItemVersion662, deleteDebugStick) 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, blockMapping, blockMappingLatest), + itemTranslator: NewItemTranslator(itemMapping, itemMappingLatest(deleteDebugStick), blockMapping, blockMappingLatest), } } diff --git a/legacyver/v671.go b/legacyver/v671.go index 8e4542c..73ca9cd 100644 --- a/legacyver/v671.go +++ b/legacyver/v671.go @@ -22,14 +22,14 @@ var ( ) // New671 ... -func New671() *Protocol { - itemMapping := mapping.NewItemMapping(requiredItemList671, ItemVersion671) +func New671(deleteDebugStick bool) *Protocol { + itemMapping := mapping.NewItemMapping(requiredItemList671, ItemVersion671, deleteDebugStick) 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, blockMapping, blockMappingLatest), + itemTranslator: NewItemTranslator(itemMapping, itemMappingLatest(deleteDebugStick), blockMapping, blockMappingLatest), } } diff --git a/legacyver/v685.go b/legacyver/v685.go index 3d7ea73..2ec8846 100644 --- a/legacyver/v685.go +++ b/legacyver/v685.go @@ -15,14 +15,14 @@ const ( ) // New685 uses same data as 686 -func New685() *Protocol { - itemMapping := mapping.NewItemMapping(requiredItemList686, ItemVersion685) +func New685(deleteDebugStick bool) *Protocol { + itemMapping := mapping.NewItemMapping(requiredItemList686, ItemVersion685, deleteDebugStick) 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, blockMapping, blockMappingLatest), + itemTranslator: NewItemTranslator(itemMapping, itemMappingLatest(deleteDebugStick), blockMapping, blockMappingLatest), } } diff --git a/legacyver/v686.go b/legacyver/v686.go index 8b72260..af85d79 100644 --- a/legacyver/v686.go +++ b/legacyver/v686.go @@ -21,14 +21,14 @@ var ( blockStateData686 []byte ) -func New686() *Protocol { - itemMapping := mapping.NewItemMapping(requiredItemList686, ItemVersion686) +func New686(deleteDebugStick bool) *Protocol { + itemMapping := mapping.NewItemMapping(requiredItemList686, ItemVersion686, deleteDebugStick) 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, blockMapping, blockMappingLatest), + itemTranslator: NewItemTranslator(itemMapping, itemMappingLatest(deleteDebugStick), blockMapping, blockMappingLatest), } } diff --git a/legacyver/v712.go b/legacyver/v712.go index a62a7d8..3158225 100644 --- a/legacyver/v712.go +++ b/legacyver/v712.go @@ -21,14 +21,14 @@ var ( blockStateData712 []byte ) -func New712() *Protocol { - itemMapping := mapping.NewItemMapping(requiredItemList712, ItemVersion712) +func New712(deleteDebugStick bool) *Protocol { + itemMapping := mapping.NewItemMapping(requiredItemList712, ItemVersion712, deleteDebugStick) 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, blockMapping, blockMappingLatest), + itemTranslator: NewItemTranslator(itemMapping, itemMappingLatest(deleteDebugStick), blockMapping, blockMappingLatest), } } diff --git a/legacyver/v729.go b/legacyver/v729.go index 82a87e3..1064ce3 100644 --- a/legacyver/v729.go +++ b/legacyver/v729.go @@ -21,14 +21,14 @@ var ( blockStateData729 []byte ) -func New729() *Protocol { - itemMapping := mapping.NewItemMapping(requiredItemList729, ItemVersion729) +func New729(deleteDebugStick bool) *Protocol { + itemMapping := mapping.NewItemMapping(requiredItemList729, ItemVersion729, deleteDebugStick) 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, blockMapping, blockMappingLatest), + itemTranslator: NewItemTranslator(itemMapping, itemMappingLatest(deleteDebugStick), blockMapping, blockMappingLatest), } } diff --git a/legacyver/v748.go b/legacyver/v748.go index 9ceefd6..540d0f7 100644 --- a/legacyver/v748.go +++ b/legacyver/v748.go @@ -21,14 +21,14 @@ var ( blockStateData748 []byte ) -func New748() *Protocol { - itemMapping := mapping.NewItemMapping(requiredItemList748, ItemVersion748) +func New748(deleteDebugStick bool) *Protocol { + itemMapping := mapping.NewItemMapping(requiredItemList748, ItemVersion748, deleteDebugStick) 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, blockMapping, blockMappingLatest), + itemTranslator: NewItemTranslator(itemMapping, itemMappingLatest(deleteDebugStick), blockMapping, blockMappingLatest), } } diff --git a/legacyver/v766.go b/legacyver/v766.go index 23e2580..51873a9 100644 --- a/legacyver/v766.go +++ b/legacyver/v766.go @@ -19,16 +19,15 @@ var ( requiredItemList766 []byte //go:embed data/block_states_766.nbt blockStateData766 []byte - - itemMapping766 = mapping.NewItemMapping(requiredItemList766, ItemVersion766) - blockMapping766 = mapping.NewBlockMapping(blockStateData766) ) -func New766() *Protocol { +func New766(deleteDebugStick bool) *Protocol { + itemMapping := mapping.NewItemMapping(requiredItemList766, ItemVersion766, deleteDebugStick) + blockMapping := mapping.NewBlockMapping(blockStateData766) return &Protocol{ ver: "1.21.50", id: proto.ID766, - blockTranslator: NewBlockTranslator(blockMapping766, blockMappingLatest, chunk.NewNetworkPersistentEncoding(blockMapping766, BlockVersion766), chunk.NewBlockPaletteEncoding(blockMapping766, BlockVersion766), false), - itemTranslator: NewItemTranslator(itemMapping766, itemMappingLatest, blockMapping766, blockMappingLatest), + blockTranslator: NewBlockTranslator(blockMapping, blockMappingLatest, chunk.NewNetworkPersistentEncoding(blockMapping, BlockVersion766), chunk.NewBlockPaletteEncoding(blockMapping, BlockVersion766), false), + itemTranslator: NewItemTranslator(itemMapping, itemMappingLatest(deleteDebugStick), blockMapping, blockMappingLatest), } } diff --git a/legacyver/v776.go b/legacyver/v776.go index bca0be5..33b6044 100644 --- a/legacyver/v776.go +++ b/legacyver/v776.go @@ -19,16 +19,16 @@ var ( requiredItemList776 []byte //go:embed data/block_states_776.nbt blockStateData776 []byte - - itemMapping776 = mapping.NewItemMapping(requiredItemList776, ItemVersion776) - blockMapping776 = mapping.NewBlockMapping(blockStateData776) ) -func New776() *Protocol { +func New776(deleteDebugStick bool) *Protocol { + itemMapping := mapping.NewItemMapping(requiredItemList776, ItemVersion776, deleteDebugStick) + blockMapping := mapping.NewBlockMapping(blockStateData776) + return &Protocol{ ver: "1.21.60", id: proto.ID776, - blockTranslator: NewBlockTranslator(blockMapping776, blockMappingLatest, chunk.NewNetworkPersistentEncoding(blockMapping776, BlockVersion776), chunk.NewBlockPaletteEncoding(blockMapping776, BlockVersion776), false), - itemTranslator: NewItemTranslator(itemMapping776, itemMappingLatest, blockMapping776, blockMappingLatest), + blockTranslator: NewBlockTranslator(blockMapping, blockMappingLatest, chunk.NewNetworkPersistentEncoding(blockMapping, BlockVersion776), chunk.NewBlockPaletteEncoding(blockMapping, BlockVersion776), false), + itemTranslator: NewItemTranslator(itemMapping, itemMappingLatest(deleteDebugStick), blockMapping, blockMappingLatest), } } diff --git a/legacyver/v786.go b/legacyver/v786.go index 34be23e..ac1043a 100644 --- a/legacyver/v786.go +++ b/legacyver/v786.go @@ -19,16 +19,15 @@ var ( requiredItemList786 []byte //go:embed data/block_states_786.nbt blockStateData786 []byte - - itemMapping786 = mapping.NewItemMapping(requiredItemList786, ItemVersion786) - blockMapping786 = mapping.NewBlockMapping(blockStateData786) ) -func New786() *Protocol { +func New786(deleteDebugStick bool) *Protocol { + itemMapping786 := mapping.NewItemMapping(requiredItemList786, ItemVersion786, deleteDebugStick) + 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, blockMapping786, blockMappingLatest), + itemTranslator: NewItemTranslator(itemMapping786, itemMappingLatest(deleteDebugStick), blockMapping786, blockMappingLatest), } } diff --git a/legacyver/v800.go b/legacyver/v800.go index 4d89a55..e7486ac 100644 --- a/legacyver/v800.go +++ b/legacyver/v800.go @@ -19,16 +19,15 @@ var ( requiredItemList800 []byte //go:embed data/block_states_800.nbt blockStateData800 []byte - - itemMapping800 = mapping.NewItemMapping(requiredItemList800, ItemVersion800) - blockMapping800 = mapping.NewBlockMapping(blockStateData800) ) -func New800() *Protocol { +func New800(deleteDebugStick bool) *Protocol { + itemMapping := mapping.NewItemMapping(requiredItemList800, ItemVersion800, deleteDebugStick) + blockMapping := mapping.NewBlockMapping(blockStateData800) return &Protocol{ ver: "1.21.80", id: proto.ID800, - blockTranslator: NewBlockTranslator(blockMapping800, blockMappingLatest, chunk.NewNetworkPersistentEncoding(blockMapping800, BlockVersion800), chunk.NewBlockPaletteEncoding(blockMapping800, BlockVersion800), false), - itemTranslator: NewItemTranslator(itemMapping800, itemMappingLatest, blockMapping800, blockMappingLatest), + blockTranslator: NewBlockTranslator(blockMapping, blockMappingLatest, chunk.NewNetworkPersistentEncoding(blockMapping, BlockVersion800), chunk.NewBlockPaletteEncoding(blockMapping, BlockVersion800), false), + itemTranslator: NewItemTranslator(itemMapping, itemMappingLatest(deleteDebugStick), blockMapping, blockMappingLatest), } } diff --git a/legacyver/v818.go b/legacyver/v818.go index 9c98bdd..6c1849f 100644 --- a/legacyver/v818.go +++ b/legacyver/v818.go @@ -18,6 +18,14 @@ var ( //go:embed data/block_states_818.nbt blockStateData818 []byte - itemMappingLatest = mapping.NewItemMapping(requiredItemList818, ItemVersion818) - blockMappingLatest = mapping.NewBlockMapping(blockStateData818) + itemMappingLatestWithDebugStick = mapping.NewItemMapping(requiredItemList818, ItemVersion818, false) + itemMappingLatestWithoutDebugStick = mapping.NewItemMapping(requiredItemList818, ItemVersion818, true) + blockMappingLatest = mapping.NewBlockMapping(blockStateData818) ) + +func itemMappingLatest(deleteDebugStick bool) mapping.Item { + if deleteDebugStick { + return itemMappingLatestWithDebugStick + } + return itemMappingLatestWithoutDebugStick +} diff --git a/mapping/item.go b/mapping/item.go index 6ea3dd1..50a3ead 100644 --- a/mapping/item.go +++ b/mapping/item.go @@ -43,17 +43,19 @@ type DefaultItemMapping struct { itemRuntimeIDToData map[int32]map[string]any // itemEntries holds a map to translate item string IDs to runtime IDs. itemEntries []ItemEntry + airRID int32 itemVersion uint16 } -func NewItemMapping(requiredItemList []byte, itemVersion uint16) *DefaultItemMapping { +func NewItemMapping(requiredItemList []byte, itemVersion uint16, deleteDebugStick bool) *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"` @@ -64,6 +66,22 @@ func NewItemMapping(requiredItemList []byte, itemVersion uint16) *DefaultItemMap if err := json.Unmarshal(requiredItemList, &m); err != nil { 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" {