Fix ItemRegistry & block translation
This commit is contained in:
@@ -18,15 +18,10 @@ const (
|
|||||||
)
|
)
|
||||||
|
|
||||||
var (
|
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 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 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 {
|
type BlockTranslator interface {
|
||||||
|
|||||||
@@ -43,6 +43,10 @@ type ItemTranslator interface {
|
|||||||
DowngradeLegacyItemRegistry(entries []proto.LegacyItemRegistryEntry) []proto.LegacyItemRegistryEntry
|
DowngradeLegacyItemRegistry(entries []proto.LegacyItemRegistryEntry) []proto.LegacyItemRegistryEntry
|
||||||
// UpgradeLegacyItemRegistry ...
|
// UpgradeLegacyItemRegistry ...
|
||||||
UpgradeLegacyItemRegistry(entries []proto.LegacyItemRegistryEntry) []proto.LegacyItemRegistryEntry
|
UpgradeLegacyItemRegistry(entries []proto.LegacyItemRegistryEntry) []proto.LegacyItemRegistryEntry
|
||||||
|
// DowngradeItemEntries ...
|
||||||
|
DowngradeItemEntries(entries []proto.ItemEntry) []proto.ItemEntry
|
||||||
|
// UpgradeItemEntries ...
|
||||||
|
UpgradeItemEntries(entries []proto.ItemEntry) []proto.ItemEntry
|
||||||
}
|
}
|
||||||
|
|
||||||
type DefaultItemTranslator struct {
|
type DefaultItemTranslator struct {
|
||||||
@@ -562,6 +566,70 @@ func (t *DefaultItemTranslator) UpgradeLegacyItemRegistry(entries []proto.Legacy
|
|||||||
return entries
|
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) {
|
func (t *DefaultItemTranslator) UpgradeItemPackets(pks []packet.Packet, _ *minecraft.Conn) (result []packet.Packet) {
|
||||||
for _, pk := range pks {
|
for _, pk := range pks {
|
||||||
switch pk := pk.(type) {
|
switch pk := pk.(type) {
|
||||||
|
|||||||
@@ -20,6 +20,8 @@ type ItemRegistry struct {
|
|||||||
func (*ItemRegistry) ID() uint32 {
|
func (*ItemRegistry) ID() uint32 {
|
||||||
return packet.IDItemRegistry
|
return packet.IDItemRegistry
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Marshal ...
|
||||||
func (pk *ItemRegistry) Marshal(io protocol.IO) {
|
func (pk *ItemRegistry) Marshal(io protocol.IO) {
|
||||||
protocol.Slice(io, &pk.Items)
|
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 {
|
for i, it := range pk.Items {
|
||||||
items[i] = (&proto.ItemEntry{}).FromLatest(it)
|
items[i] = (&proto.ItemEntry{}).FromLatest(it)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
items = p.itemTranslator.DowngradeItemEntries(items)
|
||||||
|
|
||||||
pks[pkIndex] = &legacypacket.ItemRegistry{
|
pks[pkIndex] = &legacypacket.ItemRegistry{
|
||||||
Items: items,
|
Items: items,
|
||||||
}
|
}
|
||||||
|
return []packet.Packet{}
|
||||||
case *packet.StructureBlockUpdate:
|
case *packet.StructureBlockUpdate:
|
||||||
pks[pkIndex] = &legacypacket.StructureBlockUpdate{
|
pks[pkIndex] = &legacypacket.StructureBlockUpdate{
|
||||||
Position: pk.Position,
|
Position: pk.Position,
|
||||||
@@ -1052,10 +1056,13 @@ func (p *Protocol) upgradePackets(pks []packet.Packet, conn *minecraft.Conn) []p
|
|||||||
Items: items,
|
Items: items,
|
||||||
}
|
}
|
||||||
case *legacypacket.ItemRegistry:
|
case *legacypacket.ItemRegistry:
|
||||||
|
pk.Items = p.itemTranslator.UpgradeItemEntries(pk.Items)
|
||||||
|
|
||||||
items := make([]protocol.ItemEntry, len(pk.Items))
|
items := make([]protocol.ItemEntry, len(pk.Items))
|
||||||
for i, it := range pk.Items {
|
for i, it := range pk.Items {
|
||||||
items[i] = it.ToLatest()
|
items[i] = it.ToLatest()
|
||||||
}
|
}
|
||||||
|
|
||||||
pks[pkIndex] = &packet.ItemRegistry{Items: items}
|
pks[pkIndex] = &packet.ItemRegistry{Items: items}
|
||||||
case *legacypacket.StructureBlockUpdate:
|
case *legacypacket.StructureBlockUpdate:
|
||||||
pks[pkIndex] = &packet.StructureBlockUpdate{
|
pks[pkIndex] = &packet.StructureBlockUpdate{
|
||||||
|
|||||||
@@ -31,7 +31,7 @@ func New671() *Protocol {
|
|||||||
return &Protocol{
|
return &Protocol{
|
||||||
ver: "1.20.80",
|
ver: "1.20.80",
|
||||||
id: proto.ID671,
|
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),
|
itemTranslator: NewItemTranslator(itemMapping, itemMappingLatest, blockMapping, blockMappingLatest),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -22,7 +22,7 @@ func New685() *Protocol {
|
|||||||
return &Protocol{
|
return &Protocol{
|
||||||
ver: "1.21.0",
|
ver: "1.21.0",
|
||||||
id: proto.ID685,
|
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),
|
itemTranslator: NewItemTranslator(itemMapping, itemMappingLatest, blockMapping, blockMappingLatest),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -30,7 +30,7 @@ func New686() *Protocol {
|
|||||||
return &Protocol{
|
return &Protocol{
|
||||||
ver: "1.21.2",
|
ver: "1.21.2",
|
||||||
id: proto.ID686,
|
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),
|
itemTranslator: NewItemTranslator(itemMapping, itemMappingLatest, blockMapping, blockMappingLatest),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -30,7 +30,7 @@ func New712() *Protocol {
|
|||||||
return &Protocol{
|
return &Protocol{
|
||||||
ver: "1.21.20",
|
ver: "1.21.20",
|
||||||
id: proto.ID712,
|
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),
|
itemTranslator: NewItemTranslator(itemMapping, itemMappingLatest, blockMapping, blockMappingLatest),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -30,7 +30,7 @@ func New729() *Protocol {
|
|||||||
return &Protocol{
|
return &Protocol{
|
||||||
ver: "1.21.30",
|
ver: "1.21.30",
|
||||||
id: proto.ID729,
|
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),
|
itemTranslator: NewItemTranslator(itemMapping, itemMappingLatest, blockMapping, blockMappingLatest),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -30,7 +30,7 @@ func New748() *Protocol {
|
|||||||
return &Protocol{
|
return &Protocol{
|
||||||
ver: "1.21.40",
|
ver: "1.21.40",
|
||||||
id: proto.ID748,
|
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),
|
itemTranslator: NewItemTranslator(itemMapping, itemMappingLatest, blockMapping, blockMappingLatest),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -30,7 +30,7 @@ func New766() *Protocol {
|
|||||||
return &Protocol{
|
return &Protocol{
|
||||||
ver: "1.21.50",
|
ver: "1.21.50",
|
||||||
id: proto.ID766,
|
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),
|
itemTranslator: NewItemTranslator(itemMapping766, itemMappingLatest, blockMapping766, blockMappingLatest),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user