Skip to content

Commit 870fa89

Browse files
committed
WIP
1 parent b1f7937 commit 870fa89

1 file changed

Lines changed: 69 additions & 29 deletions

File tree

src/main/java/it/feargames/tileculling/CullingPlugin.java

Lines changed: 69 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@
99
import it.feargames.tileculling.occlusionculling.BlockChangeListener;
1010
import it.unimi.dsi.fastutil.ints.IntOpenHashSet;
1111
import it.unimi.dsi.fastutil.ints.IntSet;
12-
import it.unimi.dsi.fastutil.longs.LongSet;
1312
import net.minecraft.server.v1_16_R3.PacketDataSerializer;
1413
import org.bukkit.Bukkit;
1514
import org.bukkit.Material;
@@ -56,7 +55,7 @@ public void onPacketSending(PacketEvent event) {
5655
Player player = event.getPlayer();
5756
PacketContainer packet = event.getPacket();
5857

59-
if (!player.getName().equals("sgdc3")) {
58+
if (!player.getName().equals("sgdc3") && !player.getName().equals("tr7zw")) {
6059
return;
6160
}
6261

@@ -69,12 +68,7 @@ public void onPacketSending(PacketEvent event) {
6968
return;
7069
}
7170

72-
//boolean full = packet.getBooleans().read(0);
73-
int bitMask = packet.getIntegers().read(2); // 65535 when chunk is marked as full?
74-
//NbtCompound heightmaps = (NbtCompound) packet.getNbtModifier().read(0);
75-
//if (full) {
76-
// int[] biomes = packet.getIntegerArrays().read(0);
77-
//}
71+
int bitMask = packet.getIntegers().read(2);
7872
byte[] chunkData = packet.getByteArrays().read(0);
7973

8074
IntSet removedBlocks = null;
@@ -85,6 +79,8 @@ public void onPacketSending(PacketEvent event) {
8579
if (!type.equals(Material.CHEST.getKey().toString())) {
8680
continue;
8781
}
82+
83+
iterator.remove();
8884
if (removedBlocks == null) {
8985
removedBlocks = new IntOpenHashSet();
9086
}
@@ -96,6 +92,7 @@ public void onPacketSending(PacketEvent event) {
9692
byte z = (byte) (compound.getInteger("z") & 0xF);
9793

9894
int key = section + (x << 8) + (y << 16) + (z << 24);
95+
removedBlocks.add(key);
9996

10097
getLogger().info(section + ": " + x + "," + y + "," + z + " => " + key);
10198
}
@@ -106,63 +103,106 @@ public void onPacketSending(PacketEvent event) {
106103
getLogger().warning(chunkX + "," + chunkZ + ": Changes detected.");
107104
packet.getListNbtModifier().write(0, tileEntities);
108105

109-
PacketDataSerializer serializer = new PacketDataSerializer(Unpooled.wrappedBuffer(chunkData));
106+
PacketDataSerializer reader = new PacketDataSerializer(Unpooled.wrappedBuffer(chunkData));
107+
PacketDataSerializer writer = new PacketDataSerializer(Unpooled.buffer());
110108
for (int sectionY = 0; sectionY < 16; sectionY++) {
111109
if ((bitMask & (1 << sectionY)) == 0) {
112110
continue;
113111
}
114112

115-
short nonAirBlockCount = serializer.readShort();
116-
byte bitsPerBlock = serializer.readByte();
117-
if (bitsPerBlock < 4) {
118-
//bitsPerBlock = 4;
113+
short nonAirBlockCount = reader.readShort();
114+
writer.writeShort(nonAirBlockCount);
115+
116+
byte bitsPerBlock = reader.readByte();
117+
if (bitsPerBlock < 4 || bitsPerBlock > 64) {
119118
throw new RuntimeException("Invalid bits per block! (" + bitsPerBlock + ")");
120119
}
121120
boolean direct = bitsPerBlock > 8;
122-
int indirectAirId = -1;
121+
writer.writeByte(bitsPerBlock);
122+
123+
int palletteAirIndex;
124+
if (direct) {
125+
palletteAirIndex = 0; // Global index
126+
} else {
127+
palletteAirIndex = -1;
128+
129+
int palletLength = reader.readVarInt();
130+
int[] pallette = new int[palletLength];
123131

124-
if (!direct) {
125-
getLogger().info("Indirect!");
126-
int palletLength = serializer.readVarInt();
127132
for (int i = 0; i < palletLength; i++) {
128-
int globalId = serializer.readVarInt();
129-
//getLogger().info(i + " => " + globalId);
133+
int globalId = reader.readVarInt();
134+
pallette[i] = globalId;
135+
130136
if (globalId == 0) {
131-
indirectAirId = i;
132-
break;
137+
palletteAirIndex = i;
133138
}
134139
}
135-
if (indirectAirId == -1) {
136-
getLogger().severe("Missing air in pallette!");
137-
continue;
140+
141+
if (palletteAirIndex == -1) {
142+
// Expand
143+
int[] newPallette = new int[palletLength + 1];
144+
System.arraycopy(pallette, 0, newPallette, 0, palletLength);
145+
pallette = newPallette;
146+
palletLength++;
147+
// Add mapping to pallet
148+
pallette[palletLength - 1] = 0;
149+
palletteAirIndex = palletLength - 1;
150+
}
151+
152+
writer.d(palletLength);
153+
for (int i = 0; i < palletLength; i++) {
154+
writer.d(pallette[i]);
138155
}
139156
}
140157

141-
int dataArrayLength = serializer.readVarInt();
158+
int dataArrayLength = reader.readVarInt();
159+
writer.b(dataArrayLength);
160+
142161
long[] dataArray = new long[dataArrayLength];
143162
for (int i = 0; i < dataArrayLength; i++) {
144-
dataArray[i] = serializer.readLong();
163+
dataArray[i] = reader.readLong();
145164
}
146165

147166
int individualValueMask = ((1 << bitsPerBlock) - 1);
148167
byte blocksPerLong = (byte) (64 / bitsPerBlock);
149168

150-
//StringBuffer buffer = new StringBuffer();
151169
for (byte y = 0; y < 16; y++) {
152170
for (byte z = 0; z < 16; z++) {
153171
for (byte x = 0; x < 16; x++) {
172+
int key = sectionY + (x << 8) + (y << 16) + (z << 24);
173+
if (!removedBlocks.contains(key)) {
174+
continue;
175+
}
176+
154177
short blockNumber = (short) ((((y * 16) + z) * 16) + x);
155178
short longIndex = (short) (blockNumber / blocksPerLong);
156179
byte startOffset = (byte) (blockNumber % blocksPerLong);
157180

181+
if (longIndex >= dataArrayLength) {
182+
getLogger().severe("Tried to access section data at index " + longIndex + " but length was " + dataArrayLength);
183+
continue;
184+
}
185+
158186
int data = (int) (dataArray[longIndex] >> startOffset);
159187
data &= individualValueMask;
160-
//buffer.append(x).append(',').append(y).append(',').append(z).append(':').append(data).append(';');
188+
189+
// TODO: replace data
161190
}
162191
}
163192
}
164-
//getLogger().warning(buffer.toString());
193+
194+
for (int i = 0; i < dataArrayLength; i++) {
195+
writer.writeLong(dataArray[i]);
196+
}
197+
198+
// Copy light data
199+
writer.writeBytes(reader);
165200
}
201+
202+
// Replace data
203+
chunkData = writer.array();
204+
packet.getByteArrays().write(0, chunkData);
205+
166206
getLogger().warning(chunkX + "," + chunkZ + ": Processed.");
167207
} catch (Throwable t) {
168208
getLogger().log(Level.SEVERE, "WTF", t);

0 commit comments

Comments
 (0)