mirror of
https://github.com/GeyserMC/MCProtocolLib.git
synced 2024-12-04 21:01:02 -05:00
Fix wrong packet ids, clean up chunk padded array and fix tests
This commit is contained in:
parent
8380afbaa5
commit
597d60bed5
2 changed files with 33 additions and 32 deletions
|
@ -389,7 +389,7 @@ public class MinecraftProtocol extends PacketProtocol {
|
|||
this.registerIncoming(0x0C, ServerBossBarPacket.class);
|
||||
this.registerIncoming(0x0D, ServerDifficultyPacket.class);
|
||||
this.registerIncoming(0x0E, ServerChatPacket.class);
|
||||
this.registerIncoming(0x1F, ServerMultiBlockChangePacket.class);
|
||||
this.registerIncoming(0x0F, ServerMultiBlockChangePacket.class);
|
||||
this.registerIncoming(0x10, ServerTabCompletePacket.class);
|
||||
this.registerIncoming(0x11, ServerDeclareCommandsPacket.class);
|
||||
this.registerIncoming(0x12, ServerConfirmTransactionPacket.class);
|
||||
|
@ -421,7 +421,7 @@ public class MinecraftProtocol extends PacketProtocol {
|
|||
this.registerIncoming(0x2C, ServerVehicleMovePacket.class);
|
||||
this.registerIncoming(0x2D, ServerOpenBookPacket.class);
|
||||
this.registerIncoming(0x2E, ServerOpenWindowPacket.class);
|
||||
this.registerIncoming(0x3F, ServerOpenTileEntityEditorPacket.class);
|
||||
this.registerIncoming(0x2F, ServerOpenTileEntityEditorPacket.class);
|
||||
this.registerIncoming(0x30, ServerPreparedCraftingGridPacket.class);
|
||||
this.registerIncoming(0x31, ServerPlayerAbilitiesPacket.class);
|
||||
this.registerIncoming(0x32, ServerCombatPacket.class);
|
||||
|
@ -437,7 +437,7 @@ public class MinecraftProtocol extends PacketProtocol {
|
|||
this.registerIncoming(0x3C, ServerAdvancementTabPacket.class);
|
||||
this.registerIncoming(0x3D, ServerWorldBorderPacket.class);
|
||||
this.registerIncoming(0x3E, ServerSwitchCameraPacket.class);
|
||||
this.registerIncoming(0x4F, ServerPlayerChangeHeldItemPacket.class);
|
||||
this.registerIncoming(0x3F, ServerPlayerChangeHeldItemPacket.class);
|
||||
this.registerIncoming(0x40, ServerUpdateViewPositionPacket.class);
|
||||
this.registerIncoming(0x41, ServerUpdateViewDistancePacket.class);
|
||||
this.registerIncoming(0x42, ServerSpawnPositionPacket.class);
|
||||
|
@ -453,7 +453,7 @@ public class MinecraftProtocol extends PacketProtocol {
|
|||
this.registerIncoming(0x4C, ServerTeamPacket.class);
|
||||
this.registerIncoming(0x4D, ServerUpdateScorePacket.class);
|
||||
this.registerIncoming(0x4E, ServerUpdateTimePacket.class);
|
||||
this.registerIncoming(0x5F, ServerTitlePacket.class);
|
||||
this.registerIncoming(0x4F, ServerTitlePacket.class);
|
||||
this.registerIncoming(0x50, ServerEntitySoundEffectPacket.class);
|
||||
this.registerIncoming(0x51, ServerPlayBuiltinSoundPacket.class);
|
||||
this.registerIncoming(0x52, ServerStopSoundPacket.class);
|
||||
|
@ -482,7 +482,7 @@ public class MinecraftProtocol extends PacketProtocol {
|
|||
this.registerOutgoing(0x0C, ClientEditBookPacket.class);
|
||||
this.registerOutgoing(0x0D, ClientEntityNBTRequestPacket.class);
|
||||
this.registerOutgoing(0x0E, ClientPlayerInteractEntityPacket.class);
|
||||
this.registerIncoming(0x0F, ClientGenerateStructuresPacket.class);
|
||||
this.registerOutgoing(0x0F, ClientGenerateStructuresPacket.class);
|
||||
this.registerOutgoing(0x10, ClientKeepAlivePacket.class);
|
||||
this.registerOutgoing(0x11, ClientLockDifficultyPacket.class);
|
||||
this.registerOutgoing(0x12, ClientPlayerPositionPacket.class);
|
||||
|
@ -596,7 +596,7 @@ public class MinecraftProtocol extends PacketProtocol {
|
|||
this.registerOutgoing(0x1C, ServerExplosionPacket.class);
|
||||
this.registerOutgoing(0x1D, ServerUnloadChunkPacket.class);
|
||||
this.registerOutgoing(0x1E, ServerNotifyClientPacket.class);
|
||||
this.registerOutgoing(0x2F, ServerOpenHorseWindowPacket.class);
|
||||
this.registerOutgoing(0x1F, ServerOpenHorseWindowPacket.class);
|
||||
this.registerOutgoing(0x20, ServerKeepAlivePacket.class);
|
||||
this.registerOutgoing(0x21, ServerChunkDataPacket.class);
|
||||
this.registerOutgoing(0x22, ServerPlayEffectPacket.class);
|
||||
|
@ -612,7 +612,7 @@ public class MinecraftProtocol extends PacketProtocol {
|
|||
this.registerOutgoing(0x2C, ServerVehicleMovePacket.class);
|
||||
this.registerOutgoing(0x2D, ServerOpenBookPacket.class);
|
||||
this.registerOutgoing(0x2E, ServerOpenWindowPacket.class);
|
||||
this.registerOutgoing(0x3F, ServerOpenTileEntityEditorPacket.class);
|
||||
this.registerOutgoing(0x2F, ServerOpenTileEntityEditorPacket.class);
|
||||
this.registerOutgoing(0x30, ServerPreparedCraftingGridPacket.class);
|
||||
this.registerOutgoing(0x31, ServerPlayerAbilitiesPacket.class);
|
||||
this.registerOutgoing(0x32, ServerCombatPacket.class);
|
||||
|
@ -628,7 +628,7 @@ public class MinecraftProtocol extends PacketProtocol {
|
|||
this.registerOutgoing(0x3C, ServerAdvancementTabPacket.class);
|
||||
this.registerOutgoing(0x3D, ServerWorldBorderPacket.class);
|
||||
this.registerOutgoing(0x3E, ServerSwitchCameraPacket.class);
|
||||
this.registerOutgoing(0x4F, ServerPlayerChangeHeldItemPacket.class);
|
||||
this.registerOutgoing(0x3F, ServerPlayerChangeHeldItemPacket.class);
|
||||
this.registerOutgoing(0x40, ServerUpdateViewPositionPacket.class);
|
||||
this.registerOutgoing(0x41, ServerUpdateViewDistancePacket.class);
|
||||
this.registerOutgoing(0x42, ServerSpawnPositionPacket.class);
|
||||
|
|
|
@ -17,20 +17,12 @@ public class FlexibleStorage {
|
|||
}
|
||||
|
||||
public FlexibleStorage(int bitsPerEntry, @NonNull long[] data) {
|
||||
if(bitsPerEntry < 4) {
|
||||
bitsPerEntry = 4;
|
||||
}
|
||||
|
||||
char valuesPerLong = (char) (64 / bitsPerEntry);
|
||||
int expectedLength = (4096 + valuesPerLong - 1) / valuesPerLong;
|
||||
|
||||
this.bitsPerEntry = bitsPerEntry;
|
||||
this.data = padArray(bitsPerEntry, Arrays.copyOf(data, data.length), valuesPerLong, expectedLength);
|
||||
|
||||
if (this.data.length != expectedLength) {
|
||||
throw new IllegalArgumentException("Got " + this.data.length + " as the chunk data length, but was expecting " + expectedLength);
|
||||
if(bitsPerEntry <= 8) {
|
||||
this.data = padArray(bitsPerEntry, Arrays.copyOf(data, data.length));
|
||||
} else {
|
||||
this.data = padArray(bitsPerEntry, 14, Arrays.copyOf(data, data.length));
|
||||
}
|
||||
|
||||
this.size = data.length * 64 / this.bitsPerEntry;
|
||||
this.maxEntryValue = (1L << this.bitsPerEntry) - 1;
|
||||
}
|
||||
|
@ -109,25 +101,34 @@ public class FlexibleStorage {
|
|||
70409299, 70409299, 0, 69273666, 69273666, 0, 68174084, 68174084, 0, Integer.MIN_VALUE,
|
||||
0, 5 };
|
||||
|
||||
private static long[] padArray(int bitsPerEntry, long[] oldData, char valuesPerLong, int size) {
|
||||
private static long[] padArray(int bitsPerEntry, long[] oldData) {
|
||||
return padArray(bitsPerEntry, bitsPerEntry, oldData);
|
||||
}
|
||||
|
||||
private static long[] padArray(int bitsPerEntry, int newBitsPerEntry, long[] oldData) {
|
||||
long maxEntryValue = (1L << bitsPerEntry) - 1;
|
||||
char valuesPerLong = (char) (64 / newBitsPerEntry);
|
||||
int magicIndex = (valuesPerLong - 1) * 3;
|
||||
long divideMultiply = Integer.toUnsignedLong(MAGIC_CHUNK_VALUES[magicIndex]);
|
||||
long divideAdd = Integer.toUnsignedLong(MAGIC_CHUNK_VALUES[magicIndex + 1]);
|
||||
int divideShift = MAGIC_CHUNK_VALUES[magicIndex + 2];
|
||||
long maxEntries = (1L << bitsPerEntry) - 1;
|
||||
long[] data = new long[size];
|
||||
for (int index = 0; index < 4096; index++) {
|
||||
int startIndex = (index * bitsPerEntry) / 64;
|
||||
long[] data = new long[(4096 + valuesPerLong - 1) / valuesPerLong];
|
||||
for(int index = 0; index < 4096; index++) {
|
||||
int bitIndex = index * bitsPerEntry;
|
||||
int startIndex = bitIndex / 64;
|
||||
int endIndex = ((index + 1) * bitsPerEntry - 1) / 64;
|
||||
int startBitSubIndex = (index * bitsPerEntry) % 64;
|
||||
int startBitSubIndex = bitIndex % 64;
|
||||
int value;
|
||||
if (startIndex != endIndex) {
|
||||
value = (int) ((oldData[startIndex] >>> startBitSubIndex | oldData[endIndex] << (64 - startBitSubIndex)) & maxEntries);
|
||||
if(startIndex != endIndex) {
|
||||
int endBitSubIndex = 64 - startBitSubIndex;
|
||||
value = (int) ((oldData[startIndex] >>> startBitSubIndex | oldData[endIndex] << endBitSubIndex) & maxEntryValue);
|
||||
} else {
|
||||
value = (int) (oldData[startIndex] >>> startBitSubIndex & maxEntries);
|
||||
value = (int) (oldData[startIndex] >>> startBitSubIndex & maxEntryValue);
|
||||
}
|
||||
|
||||
int cellIndex = (int) (index * ((long) MAGIC_CHUNK_VALUES[magicIndex]) & 0xffffffffL + ((long) MAGIC_CHUNK_VALUES[magicIndex + 1]) & 0xffffffffL >> 32L >> divideShift);
|
||||
int bitIndex = (index - cellIndex * valuesPerLong) * bitsPerEntry;
|
||||
data[cellIndex] = data[cellIndex] & ~(maxEntries << bitIndex) | (value & maxEntries) << bitIndex;
|
||||
int cellIndex = (int) (index * divideMultiply + divideAdd >> 32L >> divideShift);
|
||||
int newBitIndex = (index - cellIndex * valuesPerLong) * newBitsPerEntry;
|
||||
data[cellIndex] = data[cellIndex] & ~(maxEntryValue << newBitIndex) | (value & maxEntryValue) << newBitIndex;
|
||||
}
|
||||
return data;
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue