Fix ItemRegistry & block translation

This commit is contained in:
AkmalFairuz
2025-02-22 09:49:02 +07:00
parent 04ae436a21
commit 50ed6fb5b8
11 changed files with 86 additions and 14 deletions

View File

@@ -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 {

View File

@@ -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) {

View File

@@ -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)
}

View File

@@ -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{

View File

@@ -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),
}
}

View File

@@ -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),
}
}

View File

@@ -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),
}
}

View File

@@ -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),
}
}

View File

@@ -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),
}
}

View File

@@ -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),
}
}

View File

@@ -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),
}
}