Fix ItemRegistry & block translation
This commit is contained in:
@@ -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 {
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
@@ -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{
|
||||
|
||||
@@ -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),
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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),
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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),
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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),
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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),
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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),
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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),
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user