Mirror von
https://github.com/PaperMC/Velocity.git
synchronisiert 2024-11-17 05:20:14 +01:00
Ursprung
3db2fe8d63
Commit
e531cdb373
@ -62,17 +62,6 @@ public enum ProtocolUtils {
|
|||||||
private static final int DEFAULT_MAX_STRING_SIZE = 65536; // 64KiB
|
private static final int DEFAULT_MAX_STRING_SIZE = 65536; // 64KiB
|
||||||
private static final QuietDecoderException BAD_VARINT_CACHED =
|
private static final QuietDecoderException BAD_VARINT_CACHED =
|
||||||
new QuietDecoderException("Bad varint decoded");
|
new QuietDecoderException("Bad varint decoded");
|
||||||
private static final int[] VAR_INT_LENGTHS = new int[33];
|
|
||||||
|
|
||||||
static {
|
|
||||||
// Inspired by https://richardstartin.github.io/posts/dont-use-protobuf-for-telemetry
|
|
||||||
//
|
|
||||||
// This has been slightly modified in that we reduce the length to 32-bit only, since Velocity
|
|
||||||
// doesn't look at any part of the Minecraft protocol that requires us to look at VarLongs.
|
|
||||||
for (int i = 0; i <= 32; ++i) {
|
|
||||||
VAR_INT_LENGTHS[i] = (31 - i) / 7;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Reads a Minecraft-style VarInt from the specified {@code buf}.
|
* Reads a Minecraft-style VarInt from the specified {@code buf}.
|
||||||
@ -108,22 +97,21 @@ public enum ProtocolUtils {
|
|||||||
return Integer.MIN_VALUE;
|
return Integer.MIN_VALUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static int varintBytes(int value) {
|
|
||||||
return VAR_INT_LENGTHS[Integer.numberOfLeadingZeros(value)];
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Writes a Minecraft-style VarInt to the specified {@code buf}.
|
* Writes a Minecraft-style VarInt to the specified {@code buf}.
|
||||||
* @param buf the buffer to read from
|
* @param buf the buffer to read from
|
||||||
* @param value the integer to write
|
* @param value the integer to write
|
||||||
*/
|
*/
|
||||||
public static void writeVarInt(ByteBuf buf, int value) {
|
public static void writeVarInt(ByteBuf buf, int value) {
|
||||||
int length = varintBytes(value);
|
while (true) {
|
||||||
for (int i = 0; i < length; ++i) {
|
if ((value & 0xFFFFFF80) == 0) {
|
||||||
buf.writeByte(((byte) ((value & 0x7F) | 0x80)));
|
buf.writeByte(value);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
buf.writeByte(value & 0x7F | 0x80);
|
||||||
value >>>= 7;
|
value >>>= 7;
|
||||||
}
|
}
|
||||||
buf.writeByte((byte) value);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static String readString(ByteBuf buf) {
|
public static String readString(ByteBuf buf) {
|
||||||
|
Laden…
In neuem Issue referenzieren
Einen Benutzer sperren