update 1.21.111

This commit is contained in:
ethaniccc
2025-10-05 16:59:50 -04:00
53 changed files with 19315 additions and 9585 deletions

View File

@@ -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
}