update 1.21.111
This commit is contained in:
@@ -31,6 +31,10 @@ type BlockTranslator interface {
|
||||
DowngradeBlockPackets([]packet.Packet, *minecraft.Conn) (result []packet.Packet)
|
||||
// UpgradeBlockPackets upgrades the input block packets to the latest block packets.
|
||||
UpgradeBlockPackets([]packet.Packet, *minecraft.Conn) (result []packet.Packet)
|
||||
// DowngradeLevelChunk downgrades the given LevelChunk packet to a legacy format.
|
||||
DowngradeLevelChunk(*packet.LevelChunk) error
|
||||
// BlockMapping returns the block mapping used by this translator.
|
||||
BlockMapping() mapping.Block
|
||||
}
|
||||
|
||||
type DefaultBlockTranslator struct {
|
||||
@@ -45,63 +49,79 @@ func NewBlockTranslator(mapping mapping.Block, latestMapping mapping.Block, pse
|
||||
return &DefaultBlockTranslator{mapping: mapping, latest: latestMapping, pse: pse, pe: pe, oldFormat: oldFormat}
|
||||
}
|
||||
|
||||
func (t *DefaultBlockTranslator) BlockMapping() mapping.Block {
|
||||
return t.mapping
|
||||
}
|
||||
|
||||
func (t *DefaultBlockTranslator) DowngradeLevelChunk(pk *packet.LevelChunk) error {
|
||||
count := int(pk.SubChunkCount)
|
||||
if count == protocol.SubChunkRequestModeLimitless || count == protocol.SubChunkRequestModeLimited {
|
||||
return nil
|
||||
}
|
||||
|
||||
buf := bytes.NewBuffer(pk.RawPayload)
|
||||
writeBuf := bytes.NewBuffer(nil)
|
||||
if !pk.CacheEnabled {
|
||||
c, err := chunk.NetworkDecode(t.latest.Air(), buf, count, false, world.Overworld.Range(), LatestNetworkPersistentEncoding, LatestBlockPaletteEncoding)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
c = t.DowngradeChunk(c)
|
||||
|
||||
payload, err := chunk.NetworkEncode(t.mapping.Air(), c, t.oldFormat, t.pe)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
writeBuf.Write(payload)
|
||||
pk.SubChunkCount = uint32(len(c.Sub()))
|
||||
}
|
||||
safeBytes := buf.Bytes()
|
||||
|
||||
countBorder, err := buf.ReadByte()
|
||||
if err != nil {
|
||||
pk.RawPayload = append(writeBuf.Bytes(), safeBytes...)
|
||||
return err
|
||||
}
|
||||
borderBytes := make([]byte, countBorder)
|
||||
if _, err = buf.Read(borderBytes); err != nil {
|
||||
pk.RawPayload = append(writeBuf.Bytes(), safeBytes...)
|
||||
return err
|
||||
}
|
||||
writeBuf.WriteByte(countBorder)
|
||||
writeBuf.Write(borderBytes)
|
||||
|
||||
enc := nbt.NewEncoderWithEncoding(writeBuf, nbt.NetworkLittleEndian)
|
||||
dec := nbt.NewDecoderWithEncoding(buf, nbt.NetworkLittleEndian)
|
||||
for {
|
||||
var decNbt map[string]any
|
||||
if err = dec.Decode(&decNbt); err != nil {
|
||||
break
|
||||
}
|
||||
t.mapping.DowngradeBlockActorData(decNbt)
|
||||
|
||||
if err = enc.Encode(decNbt); err != nil {
|
||||
break
|
||||
}
|
||||
}
|
||||
pk.RawPayload = append(writeBuf.Bytes(), buf.Bytes()...)
|
||||
return nil
|
||||
}
|
||||
|
||||
func (t *DefaultBlockTranslator) DowngradeBlockPackets(pks []packet.Packet, conn *minecraft.Conn) (result []packet.Packet) {
|
||||
for _, pk := range pks {
|
||||
switch pk := pk.(type) {
|
||||
case *packet.LevelChunk:
|
||||
count := int(pk.SubChunkCount)
|
||||
if count == protocol.SubChunkRequestModeLimitless || count == protocol.SubChunkRequestModeLimited {
|
||||
if !EnableChunkTranslation {
|
||||
break
|
||||
}
|
||||
|
||||
buf := bytes.NewBuffer(pk.RawPayload)
|
||||
writeBuf := bytes.NewBuffer(nil)
|
||||
if !pk.CacheEnabled {
|
||||
c, err := chunk.NetworkDecode(t.latest.Air(), buf, count, false, world.Overworld.Range(), LatestNetworkPersistentEncoding, LatestBlockPaletteEncoding)
|
||||
if err != nil {
|
||||
//fmt.Println(err)
|
||||
break
|
||||
}
|
||||
c = t.DowngradeChunk(c)
|
||||
|
||||
payload, err := chunk.NetworkEncode(t.mapping.Air(), c, t.oldFormat, t.pe)
|
||||
if err != nil {
|
||||
//fmt.Println(err)
|
||||
break
|
||||
}
|
||||
writeBuf.Write(payload)
|
||||
pk.SubChunkCount = uint32(len(c.Sub()))
|
||||
}
|
||||
safeBytes := buf.Bytes()
|
||||
|
||||
countBorder, err := buf.ReadByte()
|
||||
if err != nil {
|
||||
pk.RawPayload = append(writeBuf.Bytes(), safeBytes...)
|
||||
if err := t.DowngradeLevelChunk(pk); err != nil {
|
||||
//fmt.Println(err)
|
||||
break
|
||||
}
|
||||
borderBytes := make([]byte, countBorder)
|
||||
if _, err = buf.Read(borderBytes); err != nil {
|
||||
pk.RawPayload = append(writeBuf.Bytes(), safeBytes...)
|
||||
break
|
||||
}
|
||||
writeBuf.WriteByte(countBorder)
|
||||
writeBuf.Write(borderBytes)
|
||||
|
||||
enc := nbt.NewEncoderWithEncoding(writeBuf, nbt.NetworkLittleEndian)
|
||||
dec := nbt.NewDecoderWithEncoding(buf, nbt.NetworkLittleEndian)
|
||||
for {
|
||||
var decNbt map[string]any
|
||||
if err = dec.Decode(&decNbt); err != nil {
|
||||
break
|
||||
}
|
||||
t.mapping.DowngradeBlockActorData(decNbt)
|
||||
|
||||
if err = enc.Encode(decNbt); err != nil {
|
||||
break
|
||||
}
|
||||
}
|
||||
pk.RawPayload = append(writeBuf.Bytes(), buf.Bytes()...)
|
||||
case *packet.SubChunk:
|
||||
if !EnableChunkTranslation {
|
||||
break
|
||||
}
|
||||
r := world.Overworld.Range()
|
||||
if t.oldFormat {
|
||||
r = cube.Range{0, 255}
|
||||
@@ -251,11 +271,11 @@ func (t *DefaultBlockTranslator) DowngradeBlockRuntimeID(input uint32) uint32 {
|
||||
}
|
||||
state, ok := t.latest.RuntimeIDToState(input)
|
||||
if !ok {
|
||||
return t.mapping.Air()
|
||||
return t.mapping.InfoUpdate()
|
||||
}
|
||||
runtimeID, ok := t.mapping.StateToRuntimeID(state)
|
||||
if !ok {
|
||||
return t.mapping.Air()
|
||||
return t.mapping.InfoUpdate()
|
||||
}
|
||||
return runtimeID
|
||||
}
|
||||
@@ -319,11 +339,11 @@ func (t *DefaultBlockTranslator) UpgradeBlockRuntimeID(input uint32) uint32 {
|
||||
}
|
||||
state, ok := t.mapping.RuntimeIDToState(input)
|
||||
if !ok {
|
||||
return t.latest.Air()
|
||||
return t.latest.InfoUpdate()
|
||||
}
|
||||
runtimeID, ok := t.latest.StateToRuntimeID(state)
|
||||
if !ok {
|
||||
return t.latest.Air()
|
||||
return t.latest.InfoUpdate()
|
||||
}
|
||||
return runtimeID
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user