Add deleteDebugStick parameter to fix broken item translation in dragonfly

This commit is contained in:
AkmalFairuz
2025-06-20 19:43:29 +07:00
parent 752b98fb5c
commit 3d2c85b07b
18 changed files with 93 additions and 67 deletions

View File

@@ -28,7 +28,7 @@ func main() {
} }
listener, err := minecraft.ListenConfig{ listener, err := minecraft.ListenConfig{
StatusProvider: p, StatusProvider: p,
AcceptedProtocols: legacyver.All(), AcceptedProtocols: legacyver.All(false),
}.Listen("raknet", config.Connection.LocalAddress) }.Listen("raknet", config.Connection.LocalAddress)
if err != nil { if err != nil {
panic(err) panic(err)

View File

@@ -4,20 +4,22 @@ import (
"github.com/sandertv/gophertunnel/minecraft" "github.com/sandertv/gophertunnel/minecraft"
) )
// All returns a slice of all legacy protocol versions that are supported. // All returns a slice of all legacy protocol versions that are supported. deleteDebugStick
func All() []minecraft.Protocol { // 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{ return []minecraft.Protocol{
New800(), New800(deleteDebugStick),
New786(), New786(deleteDebugStick),
New776(), New776(deleteDebugStick),
New766(), New766(deleteDebugStick),
New748(), New748(deleteDebugStick),
New729(), New729(deleteDebugStick),
New712(), New712(deleteDebugStick),
New686(), New686(deleteDebugStick),
New685(), New685(deleteDebugStick),
New671(), New671(deleteDebugStick),
New662(), New662(deleteDebugStick),
New649(), New649(deleteDebugStick),
} }
} }

View File

@@ -206,7 +206,7 @@ func (t *DefaultBlockTranslator) DowngradeBlockPackets(pks []packet.Packet, conn
pk.EntityMetadata = t.downgradeEntityMetadata(pk.EntityMetadata) pk.EntityMetadata = t.downgradeEntityMetadata(pk.EntityMetadata)
} }
case *packet.SetActorData: case *packet.SetActorData:
pk.EntityMetadata = t.downgradeEntityMetadata(pk.EntityMetadata) //pk.EntityMetadata = t.downgradeEntityMetadata(pk.EntityMetadata)
case *packet.StartGame: case *packet.StartGame:
t.latest.Adjust(pk.Blocks) t.latest.Adjust(pk.Blocks)
t.mapping.Adjust(pk.Blocks) t.mapping.Adjust(pk.Blocks)
@@ -234,7 +234,7 @@ func (t *DefaultBlockTranslator) UpgradeBlockPackets(pks []packet.Packet, conn *
pk.TransactionData = transactionData pk.TransactionData = transactionData
} }
case *packet.SetActorData: case *packet.SetActorData:
pk.EntityMetadata = t.upgradeEntityMetadata(pk.EntityMetadata) //pk.EntityMetadata = t.upgradeEntityMetadata(pk.EntityMetadata)
} }
result = append(result, pk) result = append(result, pk)
} }

View File

@@ -57,6 +57,7 @@ type DefaultItemTranslator struct {
ridToCustomItem map[int32]world.CustomItem ridToCustomItem map[int32]world.CustomItem
originalToCustom map[int32]int32 originalToCustom map[int32]int32
customToOriginal map[int32]int32 customToOriginal map[int32]int32
hasDebugStick bool
} }
func NewItemTranslator(mapping mapping.Item, latestMapping mapping.Item, blockMapping mapping.Block, blockMappingLatest mapping.Block) *DefaultItemTranslator { func NewItemTranslator(mapping mapping.Item, latestMapping mapping.Item, blockMapping mapping.Block, blockMappingLatest mapping.Block) *DefaultItemTranslator {

View File

@@ -22,14 +22,14 @@ var (
) )
// New649 ... // New649 ...
func New649() *Protocol { func New649(deleteDebugStick bool) *Protocol {
itemMapping := mapping.NewItemMapping(requiredItemList649, ItemVersion649) itemMapping := mapping.NewItemMapping(requiredItemList649, ItemVersion649, deleteDebugStick)
blockMapping := mapping.NewBlockMapping(blockStateData649) blockMapping := mapping.NewBlockMapping(blockStateData649)
return &Protocol{ return &Protocol{
ver: "1.20.60", ver: "1.20.60",
id: proto.ID649, id: proto.ID649,
blockTranslator: NewBlockTranslator(blockMapping, blockMappingLatest, chunk.NewNetworkPersistentEncoding(blockMapping, BlockVersion649), chunk.NewBlockPaletteEncoding(blockMapping, BlockVersion649), false), 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),
} }
} }

View File

@@ -22,14 +22,14 @@ var (
) )
// New662 ... // New662 ...
func New662() *Protocol { func New662(deleteDebugStick bool) *Protocol {
itemMapping := mapping.NewItemMapping(requiredItemList662, ItemVersion662) itemMapping := mapping.NewItemMapping(requiredItemList662, ItemVersion662, deleteDebugStick)
blockMapping := mapping.NewBlockMapping(blockStateData662) blockMapping := mapping.NewBlockMapping(blockStateData662)
return &Protocol{ return &Protocol{
ver: "1.20.70", ver: "1.20.70",
id: proto.ID662, id: proto.ID662,
blockTranslator: NewBlockTranslator(blockMapping, blockMappingLatest, chunk.NewNetworkPersistentEncoding(blockMapping, BlockVersion662), chunk.NewBlockPaletteEncoding(blockMapping, BlockVersion662), false), 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),
} }
} }

View File

@@ -22,14 +22,14 @@ var (
) )
// New671 ... // New671 ...
func New671() *Protocol { func New671(deleteDebugStick bool) *Protocol {
itemMapping := mapping.NewItemMapping(requiredItemList671, ItemVersion671) itemMapping := mapping.NewItemMapping(requiredItemList671, ItemVersion671, deleteDebugStick)
blockMapping := mapping.NewBlockMapping(blockStateData671) blockMapping := mapping.NewBlockMapping(blockStateData671)
return &Protocol{ return &Protocol{
ver: "1.20.80", ver: "1.20.80",
id: proto.ID671, id: proto.ID671,
blockTranslator: NewBlockTranslator(blockMapping, blockMappingLatest, 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), itemTranslator: NewItemTranslator(itemMapping, itemMappingLatest(deleteDebugStick), blockMapping, blockMappingLatest),
} }
} }

View File

@@ -15,14 +15,14 @@ const (
) )
// New685 uses same data as 686 // New685 uses same data as 686
func New685() *Protocol { func New685(deleteDebugStick bool) *Protocol {
itemMapping := mapping.NewItemMapping(requiredItemList686, ItemVersion685) itemMapping := mapping.NewItemMapping(requiredItemList686, ItemVersion685, deleteDebugStick)
blockMapping := mapping.NewBlockMapping(blockStateData686) blockMapping := mapping.NewBlockMapping(blockStateData686)
return &Protocol{ return &Protocol{
ver: "1.21.0", ver: "1.21.0",
id: proto.ID685, id: proto.ID685,
blockTranslator: NewBlockTranslator(blockMapping, blockMappingLatest, 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), itemTranslator: NewItemTranslator(itemMapping, itemMappingLatest(deleteDebugStick), blockMapping, blockMappingLatest),
} }
} }

View File

@@ -21,14 +21,14 @@ var (
blockStateData686 []byte blockStateData686 []byte
) )
func New686() *Protocol { func New686(deleteDebugStick bool) *Protocol {
itemMapping := mapping.NewItemMapping(requiredItemList686, ItemVersion686) itemMapping := mapping.NewItemMapping(requiredItemList686, ItemVersion686, deleteDebugStick)
blockMapping := mapping.NewBlockMapping(blockStateData686) blockMapping := mapping.NewBlockMapping(blockStateData686)
return &Protocol{ return &Protocol{
ver: "1.21.2", ver: "1.21.2",
id: proto.ID686, id: proto.ID686,
blockTranslator: NewBlockTranslator(blockMapping, blockMappingLatest, 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), itemTranslator: NewItemTranslator(itemMapping, itemMappingLatest(deleteDebugStick), blockMapping, blockMappingLatest),
} }
} }

View File

@@ -21,14 +21,14 @@ var (
blockStateData712 []byte blockStateData712 []byte
) )
func New712() *Protocol { func New712(deleteDebugStick bool) *Protocol {
itemMapping := mapping.NewItemMapping(requiredItemList712, ItemVersion712) itemMapping := mapping.NewItemMapping(requiredItemList712, ItemVersion712, deleteDebugStick)
blockMapping := mapping.NewBlockMapping(blockStateData712) blockMapping := mapping.NewBlockMapping(blockStateData712)
return &Protocol{ return &Protocol{
ver: "1.21.20", ver: "1.21.20",
id: proto.ID712, id: proto.ID712,
blockTranslator: NewBlockTranslator(blockMapping, blockMappingLatest, 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), itemTranslator: NewItemTranslator(itemMapping, itemMappingLatest(deleteDebugStick), blockMapping, blockMappingLatest),
} }
} }

View File

@@ -21,14 +21,14 @@ var (
blockStateData729 []byte blockStateData729 []byte
) )
func New729() *Protocol { func New729(deleteDebugStick bool) *Protocol {
itemMapping := mapping.NewItemMapping(requiredItemList729, ItemVersion729) itemMapping := mapping.NewItemMapping(requiredItemList729, ItemVersion729, deleteDebugStick)
blockMapping := mapping.NewBlockMapping(blockStateData729) blockMapping := mapping.NewBlockMapping(blockStateData729)
return &Protocol{ return &Protocol{
ver: "1.21.30", ver: "1.21.30",
id: proto.ID729, id: proto.ID729,
blockTranslator: NewBlockTranslator(blockMapping, blockMappingLatest, 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), itemTranslator: NewItemTranslator(itemMapping, itemMappingLatest(deleteDebugStick), blockMapping, blockMappingLatest),
} }
} }

View File

@@ -21,14 +21,14 @@ var (
blockStateData748 []byte blockStateData748 []byte
) )
func New748() *Protocol { func New748(deleteDebugStick bool) *Protocol {
itemMapping := mapping.NewItemMapping(requiredItemList748, ItemVersion748) itemMapping := mapping.NewItemMapping(requiredItemList748, ItemVersion748, deleteDebugStick)
blockMapping := mapping.NewBlockMapping(blockStateData748) blockMapping := mapping.NewBlockMapping(blockStateData748)
return &Protocol{ return &Protocol{
ver: "1.21.40", ver: "1.21.40",
id: proto.ID748, id: proto.ID748,
blockTranslator: NewBlockTranslator(blockMapping, blockMappingLatest, 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), itemTranslator: NewItemTranslator(itemMapping, itemMappingLatest(deleteDebugStick), blockMapping, blockMappingLatest),
} }
} }

View File

@@ -19,16 +19,15 @@ var (
requiredItemList766 []byte requiredItemList766 []byte
//go:embed data/block_states_766.nbt //go:embed data/block_states_766.nbt
blockStateData766 []byte 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{ return &Protocol{
ver: "1.21.50", ver: "1.21.50",
id: proto.ID766, id: proto.ID766,
blockTranslator: NewBlockTranslator(blockMapping766, blockMappingLatest, chunk.NewNetworkPersistentEncoding(blockMapping766, BlockVersion766), chunk.NewBlockPaletteEncoding(blockMapping766, BlockVersion766), false), blockTranslator: NewBlockTranslator(blockMapping, blockMappingLatest, chunk.NewNetworkPersistentEncoding(blockMapping, BlockVersion766), chunk.NewBlockPaletteEncoding(blockMapping, BlockVersion766), false),
itemTranslator: NewItemTranslator(itemMapping766, itemMappingLatest, blockMapping766, blockMappingLatest), itemTranslator: NewItemTranslator(itemMapping, itemMappingLatest(deleteDebugStick), blockMapping, blockMappingLatest),
} }
} }

View File

@@ -19,16 +19,16 @@ var (
requiredItemList776 []byte requiredItemList776 []byte
//go:embed data/block_states_776.nbt //go:embed data/block_states_776.nbt
blockStateData776 []byte 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{ return &Protocol{
ver: "1.21.60", ver: "1.21.60",
id: proto.ID776, id: proto.ID776,
blockTranslator: NewBlockTranslator(blockMapping776, blockMappingLatest, chunk.NewNetworkPersistentEncoding(blockMapping776, BlockVersion776), chunk.NewBlockPaletteEncoding(blockMapping776, BlockVersion776), false), blockTranslator: NewBlockTranslator(blockMapping, blockMappingLatest, chunk.NewNetworkPersistentEncoding(blockMapping, BlockVersion776), chunk.NewBlockPaletteEncoding(blockMapping, BlockVersion776), false),
itemTranslator: NewItemTranslator(itemMapping776, itemMappingLatest, blockMapping776, blockMappingLatest), itemTranslator: NewItemTranslator(itemMapping, itemMappingLatest(deleteDebugStick), blockMapping, blockMappingLatest),
} }
} }

View File

@@ -19,16 +19,15 @@ var (
requiredItemList786 []byte requiredItemList786 []byte
//go:embed data/block_states_786.nbt //go:embed data/block_states_786.nbt
blockStateData786 []byte 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{ return &Protocol{
ver: "1.21.70", ver: "1.21.70",
id: proto.ID786, id: proto.ID786,
blockTranslator: NewBlockTranslator(blockMapping786, blockMappingLatest, chunk.NewNetworkPersistentEncoding(blockMapping786, BlockVersion786), chunk.NewBlockPaletteEncoding(blockMapping786, BlockVersion786), false), 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),
} }
} }

View File

@@ -19,16 +19,15 @@ var (
requiredItemList800 []byte requiredItemList800 []byte
//go:embed data/block_states_800.nbt //go:embed data/block_states_800.nbt
blockStateData800 []byte 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{ return &Protocol{
ver: "1.21.80", ver: "1.21.80",
id: proto.ID800, id: proto.ID800,
blockTranslator: NewBlockTranslator(blockMapping800, blockMappingLatest, chunk.NewNetworkPersistentEncoding(blockMapping800, BlockVersion800), chunk.NewBlockPaletteEncoding(blockMapping800, BlockVersion800), false), blockTranslator: NewBlockTranslator(blockMapping, blockMappingLatest, chunk.NewNetworkPersistentEncoding(blockMapping, BlockVersion800), chunk.NewBlockPaletteEncoding(blockMapping, BlockVersion800), false),
itemTranslator: NewItemTranslator(itemMapping800, itemMappingLatest, blockMapping800, blockMappingLatest), itemTranslator: NewItemTranslator(itemMapping, itemMappingLatest(deleteDebugStick), blockMapping, blockMappingLatest),
} }
} }

View File

@@ -18,6 +18,14 @@ var (
//go:embed data/block_states_818.nbt //go:embed data/block_states_818.nbt
blockStateData818 []byte blockStateData818 []byte
itemMappingLatest = mapping.NewItemMapping(requiredItemList818, ItemVersion818) itemMappingLatestWithDebugStick = mapping.NewItemMapping(requiredItemList818, ItemVersion818, false)
itemMappingLatestWithoutDebugStick = mapping.NewItemMapping(requiredItemList818, ItemVersion818, true)
blockMappingLatest = mapping.NewBlockMapping(blockStateData818) blockMappingLatest = mapping.NewBlockMapping(blockStateData818)
) )
func itemMappingLatest(deleteDebugStick bool) mapping.Item {
if deleteDebugStick {
return itemMappingLatestWithDebugStick
}
return itemMappingLatestWithoutDebugStick
}

View File

@@ -43,17 +43,19 @@ type DefaultItemMapping struct {
itemRuntimeIDToData map[int32]map[string]any itemRuntimeIDToData map[int32]map[string]any
// itemEntries holds a map to translate item string IDs to runtime IDs. // itemEntries holds a map to translate item string IDs to runtime IDs.
itemEntries []ItemEntry itemEntries []ItemEntry
airRID int32 airRID int32
itemVersion uint16 itemVersion uint16
} }
func NewItemMapping(requiredItemList []byte, itemVersion uint16) *DefaultItemMapping { func NewItemMapping(requiredItemList []byte, itemVersion uint16, deleteDebugStick bool) *DefaultItemMapping {
itemRuntimeIDsToNames := make(map[int32]string) itemRuntimeIDsToNames := make(map[int32]string)
itemNamesToRuntimeIDs := make(map[string]int32) itemNamesToRuntimeIDs := make(map[string]int32)
itemRuntimeIDToVersion := make(map[int32]uint8) itemRuntimeIDToVersion := make(map[int32]uint8)
itemRuntimeIDToData := make(map[int32]map[string]any) itemRuntimeIDToData := make(map[int32]map[string]any)
itemEntries := make([]ItemEntry, 0, 1600) itemEntries := make([]ItemEntry, 0, 1600)
var airRID *int32 var airRID *int32
var debugStickRID *int32
var m map[string]struct { var m map[string]struct {
RuntimeID int16 `json:"runtime_id"` RuntimeID int16 `json:"runtime_id"`
@@ -64,6 +66,22 @@ func NewItemMapping(requiredItemList []byte, itemVersion uint16) *DefaultItemMap
if err := json.Unmarshal(requiredItemList, &m); err != nil { if err := json.Unmarshal(requiredItemList, &m); err != nil {
panic(err) 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 { for name, data := range m {
rid := int32(data.RuntimeID) rid := int32(data.RuntimeID)
if name == "minecraft:air" { if name == "minecraft:air" {