diff --git a/legacyver/block_translator.go b/legacyver/block_translator.go index cf65bd9..af93fa6 100644 --- a/legacyver/block_translator.go +++ b/legacyver/block_translator.go @@ -39,13 +39,15 @@ type BlockTranslator interface { BlockMapping() mapping.Block } type DefaultBlockTranslator struct { - mapping mapping.Block - latest mapping.Block - pse chunk.Encoding - pe chunk.PaletteEncoding - oldFormat bool - dimensionDefinitions []protocol.DimensionDefinition - currentDimension int32 + mapping mapping.Block + latest mapping.Block + pse chunk.Encoding + pe chunk.PaletteEncoding + oldFormat bool + dimensionDefinitions []protocol.DimensionDefinition + currentDimension int32 + UseBlockNetworkIDHashes bool + BaseGameVersion string } func NewBlockTranslator(mapping mapping.Block, latestMapping mapping.Block, pse chunk.Encoding, pe chunk.PaletteEncoding, oldFormat bool) *DefaultBlockTranslator { @@ -65,7 +67,7 @@ func (t *DefaultBlockTranslator) DowngradeLevelChunk(pk *packet.LevelChunk, conn buf := bytes.NewBuffer(pk.RawPayload) writeBuf := bytes.NewBuffer(nil) if !pk.CacheEnabled { - c, err := chunk.NetworkDecode(t.latest.Air(), buf, count, false, t.getRange(conn), LatestNetworkPersistentEncoding, LatestBlockPaletteEncoding, t.latest, conn.GameData().UseBlockNetworkIDHashes) + c, err := chunk.NetworkDecode(t.latest.Air(), buf, count, false, t.getRange(conn), LatestNetworkPersistentEncoding, LatestBlockPaletteEncoding, t.latest, t.UseBlockNetworkIDHashes) if err != nil { return err } @@ -136,7 +138,7 @@ func (t *DefaultBlockTranslator) DowngradeBlockPackets(pks []packet.Packet, conn writeBuf := bytes.NewBuffer(nil) if !pk.CacheEnabled && !conn.ClientCacheEnabled() { ind := byte(i) - subChunk, err := chunk.DecodeSubChunk(t.latest.Air(), r, buf, &ind, chunk.NetworkEncoding, LatestNetworkPersistentEncoding, LatestBlockPaletteEncoding, t.latest, conn.GameData().UseBlockNetworkIDHashes) + subChunk, err := chunk.DecodeSubChunk(t.latest.Air(), r, buf, &ind, chunk.NetworkEncoding, LatestNetworkPersistentEncoding, LatestBlockPaletteEncoding, t.latest, t.UseBlockNetworkIDHashes) if err != nil { //fmt.Println(err) continue @@ -173,7 +175,7 @@ func (t *DefaultBlockTranslator) DowngradeBlockPackets(pks []packet.Packet, conn for i, blob := range pk.Blobs { buf := bytes.NewBuffer(blob.Payload) ind := byte(0) - subChunk, err := chunk.DecodeSubChunk(t.latest.Air(), r, buf, &ind, chunk.NetworkEncoding, LatestNetworkPersistentEncoding, LatestBlockPaletteEncoding, t.latest, conn.GameData().UseBlockNetworkIDHashes) + subChunk, err := chunk.DecodeSubChunk(t.latest.Air(), r, buf, &ind, chunk.NetworkEncoding, LatestNetworkPersistentEncoding, LatestBlockPaletteEncoding, t.latest, t.UseBlockNetworkIDHashes) if err != nil { // Has a possibility to be a biome, ignore then continue @@ -234,6 +236,8 @@ func (t *DefaultBlockTranslator) DowngradeBlockPackets(pks []packet.Packet, conn case *packet.SetActorData: //pk.EntityMetadata = t.downgradeEntityMetadata(pk.EntityMetadata) case *packet.StartGame: + t.UseBlockNetworkIDHashes = pk.UseBlockNetworkIDHashes + t.BaseGameVersion = pk.BaseGameVersion t.latest.Adjust(pk.Blocks) t.mapping.Adjust(pk.Blocks) case *packet.ResourcePackStack: @@ -366,7 +370,7 @@ func (t *DefaultBlockTranslator) getRange(conn *minecraft.Conn) (r cube.Range) { case 0: dimName = "minecraft:overworld" r = world.Overworld.Range() - v, err := version.NewVersion(conn.GameData().BaseGameVersion) + v, err := version.NewVersion(t.BaseGameVersion) if err == nil && v.LessThan(cavesAndCliffsVersion) { r = cube.Range{0, 255} } diff --git a/legacyver/protocol.go b/legacyver/protocol.go index e777e1c..be30ab7 100644 --- a/legacyver/protocol.go +++ b/legacyver/protocol.go @@ -154,6 +154,7 @@ type Protocol struct { blockTranslator BlockTranslator itemTranslator ItemTranslator + Items []protocol.ItemEntry } func (p *Protocol) Ver() string { @@ -533,8 +534,8 @@ func (p *Protocol) downgradePackets(pks []packet.Packet, conn *minecraft.Conn) [ pk.GameVersion = p.ver pk.BaseGameVersion = p.ver - items := make([]proto.LegacyItemRegistryEntry, len(conn.GameData().Items)) - for i, it := range conn.GameData().Items { + items := make([]proto.LegacyItemRegistryEntry, len(p.Items)) + for i, it := range p.Items { items[i] = (&proto.LegacyItemRegistryEntry{}).FromLatest(it) } @@ -628,6 +629,7 @@ func (p *Protocol) downgradePackets(pks []packet.Packet, conn *minecraft.Conn) [ CodeStatus: pk.CodeStatus, } case *packet.ItemRegistry: + p.Items = pk.Items items := make([]proto.ItemEntry, len(pk.Items)) for i, it := range pk.Items { items[i] = (&proto.ItemEntry{}).FromLatest(it)