2025-03-11 00:23:54 +01:00
|
|
|
package game.packet;
|
|
|
|
|
|
|
|
import java.io.IOException;
|
|
|
|
import java.util.List;
|
|
|
|
|
2025-03-25 11:31:48 +01:00
|
|
|
import game.collect.Lists;
|
2025-03-26 12:22:32 +01:00
|
|
|
import game.network.ClientPlayer;
|
2025-03-11 00:23:54 +01:00
|
|
|
import game.network.Packet;
|
|
|
|
import game.network.PacketBuffer;
|
|
|
|
import game.world.BlockArray;
|
|
|
|
import game.world.Chunk;
|
|
|
|
|
2025-03-26 12:22:32 +01:00
|
|
|
public class SPacketChunkData implements Packet<ClientPlayer>
|
2025-03-11 00:23:54 +01:00
|
|
|
{
|
|
|
|
private int chunkX;
|
|
|
|
private int chunkZ;
|
|
|
|
private SPacketChunkData.Extracted extractedData;
|
|
|
|
private boolean biomes;
|
|
|
|
|
|
|
|
public SPacketChunkData()
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
public SPacketChunkData(Chunk chunkIn, boolean biomes, int segUpdate)
|
|
|
|
{
|
|
|
|
this.chunkX = chunkIn.xPos;
|
|
|
|
this.chunkZ = chunkIn.zPos;
|
|
|
|
this.biomes = biomes;
|
|
|
|
this.extractedData = getExtractedData(chunkIn, biomes, !chunkIn.getWorld().dimension.hasNoLight(), segUpdate);
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Reads the raw packet data from the data stream.
|
|
|
|
*/
|
|
|
|
public void readPacketData(PacketBuffer buf) throws IOException
|
|
|
|
{
|
|
|
|
this.chunkX = buf.readInt();
|
|
|
|
this.chunkZ = buf.readInt();
|
|
|
|
this.biomes = buf.readBoolean();
|
|
|
|
this.extractedData = new SPacketChunkData.Extracted();
|
|
|
|
this.extractedData.dataSize = buf.readInt();
|
|
|
|
this.extractedData.data = buf.readByteArray();
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Writes the raw packet data to the data stream.
|
|
|
|
*/
|
|
|
|
public void writePacketData(PacketBuffer buf) throws IOException
|
|
|
|
{
|
|
|
|
buf.writeInt(this.chunkX);
|
|
|
|
buf.writeInt(this.chunkZ);
|
|
|
|
buf.writeBoolean(this.biomes);
|
|
|
|
buf.writeInt(this.extractedData.dataSize);
|
|
|
|
buf.writeByteArray(this.extractedData.data);
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Passes this Packet on to the NetHandler for processing.
|
|
|
|
*/
|
2025-03-26 12:22:32 +01:00
|
|
|
public void processPacket(ClientPlayer handler)
|
2025-03-11 00:23:54 +01:00
|
|
|
{
|
|
|
|
handler.handleChunkData(this);
|
|
|
|
}
|
|
|
|
|
|
|
|
public byte[] getExtractedDataBytes()
|
|
|
|
{
|
|
|
|
return this.extractedData.data;
|
|
|
|
}
|
|
|
|
|
|
|
|
protected static int getSize(int segments, boolean overworld, boolean biomes)
|
|
|
|
{
|
|
|
|
int i = segments * 2 * 16 * 16 * 16;
|
|
|
|
int j = segments * 16 * 16 * 16 / 2;
|
|
|
|
int k = overworld ? segments * 16 * 16 * 16 / 2 : 0;
|
|
|
|
int l = biomes ? 256 : 0;
|
|
|
|
return i + j + k + l;
|
|
|
|
}
|
|
|
|
|
|
|
|
public static SPacketChunkData.Extracted getExtractedData(Chunk chunk, boolean biomes, boolean overworld, int segUpdate)
|
|
|
|
{
|
|
|
|
BlockArray[] aextendedblockstorage = chunk.getStorage();
|
|
|
|
SPacketChunkData.Extracted s21packetchunkdata$extracted = new SPacketChunkData.Extracted();
|
|
|
|
List<BlockArray> list = Lists.<BlockArray>newArrayList();
|
|
|
|
|
|
|
|
for (int i = 0; i < aextendedblockstorage.length; ++i)
|
|
|
|
{
|
|
|
|
BlockArray extendedblockstorage = aextendedblockstorage[i];
|
|
|
|
|
|
|
|
if (extendedblockstorage != null && (!biomes || !extendedblockstorage.isEmpty()) && (segUpdate & 1 << i) != 0)
|
|
|
|
{
|
|
|
|
s21packetchunkdata$extracted.dataSize |= 1 << i;
|
|
|
|
list.add(extendedblockstorage);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
s21packetchunkdata$extracted.data = new byte[getSize(Integer.bitCount(s21packetchunkdata$extracted.dataSize), overworld, biomes)];
|
|
|
|
int j = 0;
|
|
|
|
|
|
|
|
for (BlockArray extendedblockstorage1 : list)
|
|
|
|
{
|
|
|
|
char[] achar = extendedblockstorage1.getData();
|
|
|
|
|
|
|
|
for (char c0 : achar)
|
|
|
|
{
|
|
|
|
s21packetchunkdata$extracted.data[j++] = (byte)(c0 & 255);
|
|
|
|
s21packetchunkdata$extracted.data[j++] = (byte)(c0 >> 8 & 255);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
for (BlockArray extendedblockstorage2 : list)
|
|
|
|
{
|
|
|
|
j = copyTo(extendedblockstorage2.getBlocklight().getData(), s21packetchunkdata$extracted.data, j);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (overworld)
|
|
|
|
{
|
|
|
|
for (BlockArray extendedblockstorage3 : list)
|
|
|
|
{
|
|
|
|
j = copyTo(extendedblockstorage3.getSkylight().getData(), s21packetchunkdata$extracted.data, j);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (biomes)
|
|
|
|
{
|
|
|
|
copyTo(chunk.getBiomes(), s21packetchunkdata$extracted.data, j);
|
|
|
|
}
|
|
|
|
|
|
|
|
return s21packetchunkdata$extracted;
|
|
|
|
}
|
|
|
|
|
|
|
|
private static int copyTo(byte[] src, byte[] dest, int offset)
|
|
|
|
{
|
|
|
|
System.arraycopy(src, 0, dest, offset, src.length);
|
|
|
|
return offset + src.length;
|
|
|
|
}
|
|
|
|
|
|
|
|
public int getChunkX()
|
|
|
|
{
|
|
|
|
return this.chunkX;
|
|
|
|
}
|
|
|
|
|
|
|
|
public int getChunkZ()
|
|
|
|
{
|
|
|
|
return this.chunkZ;
|
|
|
|
}
|
|
|
|
|
|
|
|
public int getExtractedSize()
|
|
|
|
{
|
|
|
|
return this.extractedData.dataSize;
|
|
|
|
}
|
|
|
|
|
|
|
|
public boolean hasBiomes()
|
|
|
|
{
|
|
|
|
return this.biomes;
|
|
|
|
}
|
|
|
|
|
|
|
|
public static class Extracted
|
|
|
|
{
|
|
|
|
public byte[] data;
|
|
|
|
public int dataSize;
|
|
|
|
}
|
|
|
|
}
|