100 lines
3.4 KiB
Java
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;
|
|
}
|
|
}
|