minecraft-src/net/minecraft/network/protocol/game/ClientboundLightUpdatePacketData.java
2025-07-04 01:41:11 +03:00

100 lines
3.4 KiB
Java

package net.minecraft.network.protocol.game;
import com.google.common.collect.Lists;
import io.netty.buffer.ByteBuf;
import java.util.BitSet;
import java.util.List;
import net.minecraft.core.SectionPos;
import net.minecraft.network.FriendlyByteBuf;
import net.minecraft.network.codec.ByteBufCodecs;
import net.minecraft.network.codec.StreamCodec;
import net.minecraft.world.level.ChunkPos;
import net.minecraft.world.level.LightLayer;
import net.minecraft.world.level.chunk.DataLayer;
import net.minecraft.world.level.lighting.LevelLightEngine;
import org.jetbrains.annotations.Nullable;
public class ClientboundLightUpdatePacketData {
private static final StreamCodec<ByteBuf, byte[]> DATA_LAYER_STREAM_CODEC = ByteBufCodecs.byteArray(2048);
private final BitSet skyYMask;
private final BitSet blockYMask;
private final BitSet emptySkyYMask;
private final BitSet emptyBlockYMask;
private final List<byte[]> skyUpdates;
private final List<byte[]> blockUpdates;
public ClientboundLightUpdatePacketData(ChunkPos chunkPos, LevelLightEngine lightEngine, @Nullable BitSet skyLight, @Nullable BitSet blockLight) {
this.skyYMask = new BitSet();
this.blockYMask = new BitSet();
this.emptySkyYMask = new BitSet();
this.emptyBlockYMask = new BitSet();
this.skyUpdates = Lists.<byte[]>newArrayList();
this.blockUpdates = Lists.<byte[]>newArrayList();
for (int i = 0; i < lightEngine.getLightSectionCount(); i++) {
if (skyLight == null || skyLight.get(i)) {
this.prepareSectionData(chunkPos, lightEngine, LightLayer.SKY, i, this.skyYMask, this.emptySkyYMask, this.skyUpdates);
}
if (blockLight == null || blockLight.get(i)) {
this.prepareSectionData(chunkPos, lightEngine, LightLayer.BLOCK, i, this.blockYMask, this.emptyBlockYMask, this.blockUpdates);
}
}
}
public ClientboundLightUpdatePacketData(FriendlyByteBuf buffer, int x, int z) {
this.skyYMask = buffer.readBitSet();
this.blockYMask = buffer.readBitSet();
this.emptySkyYMask = buffer.readBitSet();
this.emptyBlockYMask = buffer.readBitSet();
this.skyUpdates = buffer.readList(DATA_LAYER_STREAM_CODEC);
this.blockUpdates = buffer.readList(DATA_LAYER_STREAM_CODEC);
}
public void write(FriendlyByteBuf buffer) {
buffer.writeBitSet(this.skyYMask);
buffer.writeBitSet(this.blockYMask);
buffer.writeBitSet(this.emptySkyYMask);
buffer.writeBitSet(this.emptyBlockYMask);
buffer.writeCollection(this.skyUpdates, DATA_LAYER_STREAM_CODEC);
buffer.writeCollection(this.blockUpdates, DATA_LAYER_STREAM_CODEC);
}
private void prepareSectionData(
ChunkPos chunkPos, LevelLightEngine levelLightEngine, LightLayer lightLayer, int index, BitSet skyLight, BitSet blockLight, List<byte[]> updates
) {
DataLayer dataLayer = levelLightEngine.getLayerListener(lightLayer).getDataLayerData(SectionPos.of(chunkPos, levelLightEngine.getMinLightSection() + index));
if (dataLayer != null) {
if (dataLayer.isEmpty()) {
blockLight.set(index);
} else {
skyLight.set(index);
updates.add(dataLayer.copy().getData());
}
}
}
public BitSet getSkyYMask() {
return this.skyYMask;
}
public BitSet getEmptySkyYMask() {
return this.emptySkyYMask;
}
public List<byte[]> getSkyUpdates() {
return this.skyUpdates;
}
public BitSet getBlockYMask() {
return this.blockYMask;
}
public BitSet getEmptyBlockYMask() {
return this.emptyBlockYMask;
}
public List<byte[]> getBlockUpdates() {
return this.blockUpdates;
}
}