Add DowngradeLevelChunkPacket

This commit is contained in:
AkmalFairuz
2025-08-23 08:41:20 +07:00
parent d9d8b0bc75
commit 2bb1292e03
18 changed files with 144 additions and 101 deletions

View File

@@ -1,7 +1,20 @@
package legacyver
import (
"fmt"
"sync"
"github.com/akmalfairuz/legacy-version/internal/chunk"
"github.com/akmalfairuz/legacy-version/mapping"
"github.com/sandertv/gophertunnel/minecraft"
"github.com/sandertv/gophertunnel/minecraft/protocol/packet"
)
var (
EnableChunkTranslation = true
blockTranslatorsMu sync.RWMutex
blockTranslators map[int32]BlockTranslator
)
// All returns a slice of all legacy protocol versions that are supported. dragonflyMapping
@@ -24,3 +37,37 @@ func All(dragonflyMapping bool) []minecraft.Protocol {
New649(dragonflyMapping),
}
}
// lookupOrCreateBlockTranslator looks up a block translator for the given protocol version.
func lookupOrCreateBlockTranslator(protocolVersion, blockVersion int32, blockStateData []byte) BlockTranslator {
blockTranslatorsMu.RLock()
if translator, ok := blockTranslators[protocolVersion]; ok {
blockTranslatorsMu.RUnlock()
return translator
}
blockTranslatorsMu.RUnlock()
blockTranslatorsMu.Lock()
defer blockTranslatorsMu.Unlock()
if translator, ok := blockTranslators[protocolVersion]; ok {
return translator
}
blockMapping := mapping.NewBlockMapping(blockStateData)
ret := NewBlockTranslator(blockMapping, blockMappingLatest, chunk.NewNetworkPersistentEncoding(blockMapping, blockVersion), chunk.NewBlockPaletteEncoding(blockMapping, blockVersion), false)
blockTranslators[protocolVersion] = ret
return ret
}
// DowngradeLevelChunkPacket downgrades the given level chunk packet to the specified protocol version.
func DowngradeLevelChunkPacket(protocolVersion int32, pk *packet.LevelChunk) error {
blockTranslatorsMu.RLock()
translator, ok := blockTranslators[protocolVersion]
blockTranslatorsMu.RUnlock()
if !ok {
return fmt.Errorf("no block translator found for protocol version %d", protocolVersion)
}
return translator.DowngradeLevelChunk(pk)
}