Merge branch 'master' into feature/performance-improvements

This commit is contained in:
Kas-tle 2025-11-13 17:56:00 -08:00 committed by GitHub
commit a7e53115ab
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
20 changed files with 57943 additions and 40348 deletions

View File

@ -1,8 +1,9 @@
# Limbo
[![Build Status](http://ci.loohpjames.com/job/Limbo/badge/icon)](http://ci.loohpjames.com/job/Limbo/) [![Build Status](http://ci.loohpjames.com/job/Limbo/badge/icon)](http://ci.loohpjames.com/job/Limbo/)
## Standalone Limbo Minecraft Server (Currently 1.21.8) # Limbo
## Standalone Limbo Minecraft Server (Currently 1.21.10)
https://www.spigotmc.org/resources/82468/ https://www.spigotmc.org/resources/82468/<br>
https://modrinth.com/mod/limbo-server
### Starting the server ### Starting the server
Use the following command lines to start the limbo server just like any other Minecraft server Use the following command lines to start the limbo server just like any other Minecraft server
@ -18,7 +19,7 @@ IP: mc.loohpjames.com
``` ```
![Server Banner](https://api.loohpjames.com/serverbanner.png?ip=mc.loohpjames.com&width=918&name=IP:%20mc.loohpjames.com) ![Server Banner](https://api.loohpjames.com/serverbanner.png?ip=mc.loohpjames.com&width=918&name=IP:%20mc.loohpjames.com)
*** ***
### Downloads (1.17.1-1.21.8) ### Downloads (1.17.1-1.21.10)
- [Jenkins](http://ci.loohpjames.com/job/Limbo/) - [Jenkins](http://ci.loohpjames.com/job/Limbo/)
*** ***
### Offical Plugins ### Offical Plugins

14
pom.xml
View File

@ -24,7 +24,7 @@
<groupId>com.loohp</groupId> <groupId>com.loohp</groupId>
<artifactId>Limbo</artifactId> <artifactId>Limbo</artifactId>
<name>Limbo</name> <name>Limbo</name>
<version>0.7.15-ALPHA</version> <version>0.7.16-ALPHA</version>
<description>Standalone Limbo Minecraft Server.</description> <description>Standalone Limbo Minecraft Server.</description>
<url>https://github.com/LOOHP/Limbo</url> <url>https://github.com/LOOHP/Limbo</url>
@ -136,7 +136,7 @@
</executions> </executions>
</plugin> </plugin>
</plugins> </plugins>
<finalName>${project.artifactId}-${project.version}-1.21.8</finalName> <finalName>${project.artifactId}-${project.version}-1.21.10</finalName>
</build> </build>
<profiles> <profiles>
@ -264,31 +264,31 @@
<dependency> <dependency>
<groupId>net.kyori</groupId> <groupId>net.kyori</groupId>
<artifactId>adventure-text-serializer-gson</artifactId> <artifactId>adventure-text-serializer-gson</artifactId>
<version>4.24.0</version> <version>4.25.0</version>
<scope>compile</scope> <scope>compile</scope>
</dependency> </dependency>
<dependency> <dependency>
<groupId>net.kyori</groupId> <groupId>net.kyori</groupId>
<artifactId>adventure-text-serializer-legacy</artifactId> <artifactId>adventure-text-serializer-legacy</artifactId>
<version>4.24.0</version> <version>4.25.0</version>
<scope>compile</scope> <scope>compile</scope>
</dependency> </dependency>
<dependency> <dependency>
<groupId>net.kyori</groupId> <groupId>net.kyori</groupId>
<artifactId>adventure-text-serializer-plain</artifactId> <artifactId>adventure-text-serializer-plain</artifactId>
<version>4.24.0</version> <version>4.25.0</version>
<scope>compile</scope> <scope>compile</scope>
</dependency> </dependency>
<dependency> <dependency>
<groupId>net.kyori</groupId> <groupId>net.kyori</groupId>
<artifactId>adventure-api</artifactId> <artifactId>adventure-api</artifactId>
<version>4.24.0</version> <version>4.25.0</version>
<scope>compile</scope> <scope>compile</scope>
</dependency> </dependency>
<dependency> <dependency>
<groupId>net.kyori</groupId> <groupId>net.kyori</groupId>
<artifactId>adventure-nbt</artifactId> <artifactId>adventure-nbt</artifactId>
<version>4.24.0</version> <version>4.25.0</version>
<scope>compile</scope> <scope>compile</scope>
</dependency> </dependency>
<dependency> <dependency>

View File

@ -86,7 +86,7 @@ public class Console implements CommandSender {
protected final PrintStream logs; protected final PrintStream logs;
public Console(InputStream in, PrintStream out, PrintStream err) throws IOException { public Console(InputStream in, PrintStream out, PrintStream err) throws IOException {
String fileName = new SimpleDateFormat("yyyy'-'MM'-'dd'_'HH'-'mm'-'ss'_'zzz'.log'").format(new Date()); String fileName = new SimpleDateFormat("yyyy'-'MM'-'dd'_'HH'-'mm'-'ss'_'zzz'.log'").format(new Date()).replace(":", "");
File dir = new File("logs"); File dir = new File("logs");
dir.mkdirs(); dir.mkdirs();
File logs = new File(dir, fileName); File logs = new File(dir, fileName);

View File

@ -132,8 +132,8 @@ public final class Limbo {
//=========================== //===========================
public final String SERVER_IMPLEMENTATION_VERSION = "1.21.8"; public final String SERVER_IMPLEMENTATION_VERSION = "1.21.10";
public final int SERVER_IMPLEMENTATION_PROTOCOL = 772; public final int SERVER_IMPLEMENTATION_PROTOCOL = 773;
public final String LIMBO_IMPLEMENTATION_VERSION; public final String LIMBO_IMPLEMENTATION_VERSION;
private final AtomicBoolean isRunning; private final AtomicBoolean isRunning;

View File

@ -85,6 +85,7 @@ public class Unsafe {
public void a(Player player) { public void a(Player player) {
instance.playersByName.put(player.getName(), player); instance.playersByName.put(player.getName(), player);
instance.playersByUUID.put(player.getUniqueId(), player); instance.playersByUUID.put(player.getUniqueId(), player);
instance.getMetrics().updatePlayersCount();
} }
@Deprecated @Deprecated

View File

@ -0,0 +1,46 @@
/*
* This file is part of Limbo.
*
* Copyright (C) 2025. LoohpJames <jamesloohp@gmail.com>
* Copyright (C) 2025. Contributors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.loohp.limbo.location;
import com.loohp.limbo.world.BlockPosition;
import com.loohp.limbo.world.World;
public class GlobalPos {
private final World world;
private final BlockPosition pos;
public GlobalPos(World world, BlockPosition pos) {
this.world = world;
this.pos = pos;
}
public World getWorld() {
return world;
}
public BlockPosition getPos() {
return pos;
}
public static GlobalPos from(Location location) {
return new GlobalPos(location.getWorld(), BlockPosition.from(location));
}
}

View File

@ -39,6 +39,7 @@ import java.util.Timer;
import java.util.TimerTask; import java.util.TimerTask;
import java.util.UUID; import java.util.UUID;
import java.util.concurrent.Callable; import java.util.concurrent.Callable;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.zip.GZIPOutputStream; import java.util.zip.GZIPOutputStream;
/** /**
@ -49,6 +50,9 @@ import java.util.zip.GZIPOutputStream;
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
public class Metrics { public class Metrics {
// The name of the server software
private static final String SERVER_SOFTWARE = "Limbo";
// The version of this bStats class // The version of this bStats class
public static final int B_STATS_VERSION = 1; public static final int B_STATS_VERSION = 1;
@ -58,29 +62,15 @@ public class Metrics {
// Should failed requests be logged? // Should failed requests be logged?
private static boolean logFailedRequests = false; private static boolean logFailedRequests = false;
// The name of the server software
private final String name;
// The uuid of the server // The uuid of the server
private final String serverUUID; private final String serverUUID;
private final String limboVersion;
// A list with all custom charts // A list with all custom charts
private final List<CustomChart> charts = new ArrayList<>(); private final List<CustomChart> charts = new ArrayList<>();
/** private final AtomicInteger maxPlayerCountInPeriod = new AtomicInteger(0);
* Class constructor.
*
* @param name The name of the server software.
* @param serverUUID The uuid of the server.
* @param logFailedRequests Whether failed requests should be logged or not.
* @param logger The logger for the failed requests.
* @throws IOException
*/
public Metrics() throws IOException {
name = "Limbo";
public Metrics() throws IOException {
// Get the config file // Get the config file
File configFile = new File("plugins/bStats", "config.yml"); File configFile = new File("plugins/bStats", "config.yml");
FileConfiguration config = new FileConfiguration(configFile); FileConfiguration config = new FileConfiguration(configFile);
@ -109,8 +99,6 @@ public class Metrics {
} }
} }
limboVersion = Limbo.getInstance().LIMBO_IMPLEMENTATION_VERSION;
// Load the data // Load the data
serverUUID = config.get("serverUuid", String.class); serverUUID = config.get("serverUuid", String.class);
logFailedRequests = config.get("logFailedRequests", Boolean.class); logFailedRequests = config.get("logFailedRequests", Boolean.class);
@ -118,26 +106,16 @@ public class Metrics {
startSubmitting(); startSubmitting();
} }
addCustomChart(new Metrics.SingleLineChart("players", new Callable<Integer>() { addCustomChart(new Metrics.SingleLineChart("players", () -> maxPlayerCountInPeriod.getAndSet(0)));
@Override addCustomChart(new Metrics.SimplePie("limbo_version", () -> Limbo.getInstance().LIMBO_IMPLEMENTATION_VERSION));
public Integer call() throws Exception { addCustomChart(new Metrics.SimplePie("minecraftVersion", () -> Limbo.getInstance().SERVER_IMPLEMENTATION_VERSION));
return Limbo.getInstance().getPlayers().size();
} }
}));
addCustomChart(new Metrics.SimplePie("limbo_version", new Callable<String>() { /**
@Override * Record the max player count for the last update period.
public String call() throws Exception { */
return limboVersion; public void updatePlayersCount() {
} maxPlayerCountInPeriod.getAndUpdate(i -> Math.max(i, Limbo.getInstance().getPlayers().size()));
}));
addCustomChart(new Metrics.SimplePie("minecraftVersion", new Callable<String>() {
@Override
public String call() throws Exception {
return Limbo.getInstance().SERVER_IMPLEMENTATION_VERSION;
}
}));
} }
/** /**
@ -176,7 +154,7 @@ public class Metrics {
private JSONObject getPluginData() { private JSONObject getPluginData() {
JSONObject data = new JSONObject(); JSONObject data = new JSONObject();
data.put("pluginName", name); // Append the name of the server software data.put("pluginName", SERVER_SOFTWARE); // Append the name of the server software
JSONArray customCharts = new JSONArray(); JSONArray customCharts = new JSONArray();
for (CustomChart customChart : charts) { for (CustomChart customChart : charts) {
// Add the data of the custom charts // Add the data of the custom charts
@ -232,7 +210,7 @@ public class Metrics {
} catch (Exception e) { } catch (Exception e) {
// Something went wrong! :( // Something went wrong! :(
if (logFailedRequests) { if (logFailedRequests) {
Limbo.getInstance().getConsole().sendMessage("Could not submit stats of " + name + "\n" + e); Limbo.getInstance().getConsole().sendMessage("Could not submit stats of " + SERVER_SOFTWARE + "\n" + e);
} }
} }
} }

View File

@ -40,8 +40,10 @@ import com.loohp.limbo.file.ServerProperties;
import com.loohp.limbo.inventory.AnvilInventory; import com.loohp.limbo.inventory.AnvilInventory;
import com.loohp.limbo.inventory.Inventory; import com.loohp.limbo.inventory.Inventory;
import com.loohp.limbo.inventory.ItemStack; import com.loohp.limbo.inventory.ItemStack;
import com.loohp.limbo.location.GlobalPos;
import com.loohp.limbo.location.Location; import com.loohp.limbo.location.Location;
import com.loohp.limbo.network.protocol.packets.ClientboundFinishConfigurationPacket; import com.loohp.limbo.network.protocol.packets.ClientboundFinishConfigurationPacket;
import com.loohp.limbo.network.protocol.packets.ClientboundLevelChunkWithLightPacket;
import com.loohp.limbo.network.protocol.packets.ClientboundRegistryDataPacket; import com.loohp.limbo.network.protocol.packets.ClientboundRegistryDataPacket;
import com.loohp.limbo.network.protocol.packets.PacketHandshakingIn; import com.loohp.limbo.network.protocol.packets.PacketHandshakingIn;
import com.loohp.limbo.network.protocol.packets.PacketIn; import com.loohp.limbo.network.protocol.packets.PacketIn;
@ -617,7 +619,7 @@ public class ClientConnection implements Runnable {
sendPacket(declare); sendPacket(declare);
} }
PacketPlayOutSpawnPosition spawnPos = new PacketPlayOutSpawnPosition(BlockPosition.from(worldSpawn), worldSpawn.getPitch()); PacketPlayOutSpawnPosition spawnPos = new PacketPlayOutSpawnPosition(GlobalPos.from(worldSpawn), worldSpawn.getYaw(), worldSpawn.getPitch());
sendPacket(spawnPos); sendPacket(spawnPos);
PacketPlayOutPositionAndLook positionLook = new PacketPlayOutPositionAndLook(worldSpawn.getX(), worldSpawn.getY(), worldSpawn.getZ(), worldSpawn.getYaw(), worldSpawn.getPitch(), 1); PacketPlayOutPositionAndLook positionLook = new PacketPlayOutPositionAndLook(worldSpawn.getX(), worldSpawn.getY(), worldSpawn.getZ(), worldSpawn.getYaw(), worldSpawn.getPitch(), 1);

View File

@ -20,6 +20,7 @@
package com.loohp.limbo.network.protocol.packets; package com.loohp.limbo.network.protocol.packets;
import com.loohp.limbo.entity.EntityType; import com.loohp.limbo.entity.EntityType;
import com.loohp.limbo.location.Vector;
import com.loohp.limbo.registry.PacketRegistry; import com.loohp.limbo.registry.PacketRegistry;
import com.loohp.limbo.utils.DataTypeIO; import com.loohp.limbo.utils.DataTypeIO;
@ -40,11 +41,9 @@ public class PacketPlayOutSpawnEntity extends PacketOut {
private final float yaw; private final float yaw;
private final float headYaw; private final float headYaw;
private final int data; private final int data;
private final short velocityX; private final Vector movement;
private final short velocityY;
private final short velocityZ;
public PacketPlayOutSpawnEntity(int entityId, UUID uuid, EntityType type, double x, double y, double z, float pitch, float yaw, float headYaw, int data, short velocityX, short velocityY, short velocityZ) { public PacketPlayOutSpawnEntity(int entityId, UUID uuid, EntityType type, double x, double y, double z, float pitch, float yaw, float headYaw, int data, Vector movement) {
this.entityId = entityId; this.entityId = entityId;
this.uuid = uuid; this.uuid = uuid;
this.type = type; this.type = type;
@ -55,9 +54,7 @@ public class PacketPlayOutSpawnEntity extends PacketOut {
this.yaw = yaw; this.yaw = yaw;
this.headYaw = headYaw; this.headYaw = headYaw;
this.data = data; this.data = data;
this.velocityX = velocityX; this.movement = movement.clone();
this.velocityY = velocityY;
this.velocityZ = velocityZ;
} }
public int getEntityId() { public int getEntityId() {
@ -100,16 +97,8 @@ public class PacketPlayOutSpawnEntity extends PacketOut {
return data; return data;
} }
public short getVelocityX() { public Vector getMovement() {
return velocityX; return movement.clone();
}
public short getVelocityY() {
return velocityY;
}
public short getVelocityZ() {
return velocityZ;
} }
@Override @Override
@ -124,13 +113,11 @@ public class PacketPlayOutSpawnEntity extends PacketOut {
output.writeDouble(x); output.writeDouble(x);
output.writeDouble(y); output.writeDouble(y);
output.writeDouble(z); output.writeDouble(z);
DataTypeIO.writeLpVec3(output, movement);
output.writeByte((byte) (int) (pitch * 256.0F / 360.0F)); output.writeByte((byte) (int) (pitch * 256.0F / 360.0F));
output.writeByte((byte) (int) (yaw * 256.0F / 360.0F)); output.writeByte((byte) (int) (yaw * 256.0F / 360.0F));
output.writeByte((byte) (int) (headYaw * 256.0F / 360.0F)); output.writeByte((byte) (int) (headYaw * 256.0F / 360.0F));
DataTypeIO.writeVarInt(output, data); DataTypeIO.writeVarInt(output, data);
output.writeShort(velocityX * 8000);
output.writeShort(velocityY * 8000);
output.writeShort(velocityZ * 8000);
return buffer.toByteArray(); return buffer.toByteArray();
} }

View File

@ -19,30 +19,38 @@
package com.loohp.limbo.network.protocol.packets; package com.loohp.limbo.network.protocol.packets;
import com.loohp.limbo.location.GlobalPos;
import com.loohp.limbo.registry.PacketRegistry; import com.loohp.limbo.registry.PacketRegistry;
import com.loohp.limbo.utils.DataTypeIO; import com.loohp.limbo.utils.DataTypeIO;
import com.loohp.limbo.world.BlockPosition; import net.kyori.adventure.key.Key;
import java.io.ByteArrayOutputStream; import java.io.ByteArrayOutputStream;
import java.io.DataOutputStream; import java.io.DataOutputStream;
import java.io.IOException; import java.io.IOException;
import java.nio.charset.StandardCharsets;
public class PacketPlayOutSpawnPosition extends PacketOut { public class PacketPlayOutSpawnPosition extends PacketOut {
private final BlockPosition position; private final GlobalPos position;
private final float angle; private final float yaw;
private final float pitch;
public PacketPlayOutSpawnPosition(BlockPosition position, float angle) { public PacketPlayOutSpawnPosition(GlobalPos position, float yaw, float pitch) {
this.position = position; this.position = position;
this.angle = angle; this.yaw = yaw;
this.pitch = pitch;
} }
public BlockPosition getPosition() { public GlobalPos getPosition() {
return position; return position;
} }
public float getAngle() { public float getYaw() {
return angle; return yaw;
}
public float getPitch() {
return pitch;
} }
public byte[] serializePacket() throws IOException { public byte[] serializePacket() throws IOException {
@ -50,8 +58,10 @@ public class PacketPlayOutSpawnPosition extends PacketOut {
DataOutputStream output = new DataOutputStream(buffer); DataOutputStream output = new DataOutputStream(buffer);
output.writeByte(PacketRegistry.getPacketId(getClass())); output.writeByte(PacketRegistry.getPacketId(getClass()));
DataTypeIO.writeBlockPosition(output, position); DataTypeIO.writeString(output, Key.key(position.getWorld().getName()).toString(), StandardCharsets.UTF_8);
output.writeFloat(angle); DataTypeIO.writeBlockPosition(output, position.getPos());
output.writeFloat(yaw);
output.writeFloat(pitch);
return buffer.toByteArray(); return buffer.toByteArray();
} }

View File

@ -97,14 +97,14 @@ public class Player extends LivingEntity implements CommandSender, InventoryHold
protected final InventoryView inventoryView; protected final InventoryView inventoryView;
private final AtomicInteger containerIdCounter; private final AtomicInteger containerIdCounter;
@WatchableField(MetadataIndex = 15, WatchableObjectType = WatchableObjectType.FLOAT) @WatchableField(MetadataIndex = 15, WatchableObjectType = WatchableObjectType.BYTE)
protected float additionalHearts = 0.0F;
@WatchableField(MetadataIndex = 16, WatchableObjectType = WatchableObjectType.VARINT)
protected int score = 0;
@WatchableField(MetadataIndex = 17, WatchableObjectType = WatchableObjectType.BYTE)
protected byte skinLayers = 0;
@WatchableField(MetadataIndex = 18, WatchableObjectType = WatchableObjectType.BYTE)
protected byte mainHand = 1; protected byte mainHand = 1;
@WatchableField(MetadataIndex = 16, WatchableObjectType = WatchableObjectType.BYTE)
protected byte skinLayers = 0;
@WatchableField(MetadataIndex = 17, WatchableObjectType = WatchableObjectType.FLOAT)
protected float additionalHearts = 0.0F;
@WatchableField(MetadataIndex = 18, WatchableObjectType = WatchableObjectType.VARINT)
protected int score = 0;
//@WatchableField(MetadataIndex = 19, WatchableObjectType = WatchableObjectType.NBT) //@WatchableField(MetadataIndex = 19, WatchableObjectType = WatchableObjectType.NBT)
//protected Entity leftShoulder = null; //protected Entity leftShoulder = null;
//@WatchableField(MetadataIndex = 20, WatchableObjectType = WatchableObjectType.NBT) //@WatchableField(MetadataIndex = 20, WatchableObjectType = WatchableObjectType.NBT)

View File

@ -22,6 +22,7 @@ package com.loohp.limbo.player;
import com.loohp.limbo.Limbo; import com.loohp.limbo.Limbo;
import com.loohp.limbo.entity.Entity; import com.loohp.limbo.entity.Entity;
import com.loohp.limbo.location.Location; import com.loohp.limbo.location.Location;
import com.loohp.limbo.location.Vector;
import com.loohp.limbo.network.ClientConnection; import com.loohp.limbo.network.ClientConnection;
import com.loohp.limbo.network.protocol.packets.ClientboundChunkBatchFinishedPacket; import com.loohp.limbo.network.protocol.packets.ClientboundChunkBatchFinishedPacket;
import com.loohp.limbo.network.protocol.packets.ClientboundChunkBatchStartPacket; import com.loohp.limbo.network.protocol.packets.ClientboundChunkBatchStartPacket;
@ -81,7 +82,7 @@ public class PlayerInteractManager {
Set<Entity> entitiesInRange = player.getWorld().getEntities().stream().filter(each -> each.getLocation().distanceSquared(location) < viewDistanceBlocks * viewDistanceBlocks).collect(Collectors.toSet()); Set<Entity> entitiesInRange = player.getWorld().getEntities().stream().filter(each -> each.getLocation().distanceSquared(location) < viewDistanceBlocks * viewDistanceBlocks).collect(Collectors.toSet());
for (Entity entity : entitiesInRange) { for (Entity entity : entitiesInRange) {
if (!entities.contains(entity)) { if (!entities.contains(entity)) {
PacketPlayOutSpawnEntity packet = new PacketPlayOutSpawnEntity(entity.getEntityId(), entity.getUniqueId(), entity.getType(), entity.getX(), entity.getY(), entity.getZ(), entity.getYaw(), entity.getPitch(), entity.getPitch(), 0, (short) 0, (short) 0, (short) 0); PacketPlayOutSpawnEntity packet = new PacketPlayOutSpawnEntity(entity.getEntityId(), entity.getUniqueId(), entity.getType(), entity.getX(), entity.getY(), entity.getZ(), entity.getYaw(), entity.getPitch(), entity.getPitch(), 0, new Vector(0, 0, 0));
player.clientConnection.sendPacket(packet); player.clientConnection.sendPacket(packet);
PacketPlayOutEntityMetadata meta = new PacketPlayOutEntityMetadata(entity); PacketPlayOutEntityMetadata meta = new PacketPlayOutEntityMetadata(entity);

View File

@ -351,4 +351,38 @@ public class DataTypeIO {
} }
} }
private static double sanitize(double d0) {
return Double.isNaN(d0) ? 0.0D : Math.min(Math.max(d0, -1.7179869183E10D), 1.7179869183E10D);
}
private static long pack(double d0) {
return Math.round((d0 * 0.5D + 0.5D) * 32766.0D);
}
public static void writeLpVec3(DataOutputStream out, Vector vec3d) throws IOException {
double d0 = sanitize(vec3d.getX());
double d1 = sanitize(vec3d.getY());
double d2 = sanitize(vec3d.getZ());
double d3 = Math.max(Math.abs(d0), Math.max(Math.abs(d1), Math.abs(d2)));
if (d3 < 3.051944088384301E-5D) {
out.writeByte(0);
} else {
long i = (long) Math.ceil(d3);
boolean flag = (i & 3L) != i;
long j = flag ? i & 3L | 4L : i;
long k = pack(d0 / (double) i) << 3;
long l = pack(d1 / (double) i) << 18;
long i1 = pack(d2 / (double) i) << 33;
long j1 = j | k | l | i1;
out.writeByte((byte) ((int) j1));
out.writeByte((byte) ((int) (j1 >> 8)));
out.writeInt((int) (j1 >> 16));
if (flag) {
writeVarInt(out, (int) (i >> 2));
}
}
}
} }

View File

@ -34,13 +34,19 @@ public class DeclareCommands {
public static PacketPlayOutDeclareCommands getDeclareCommandsPacket(CommandSender sender) throws IOException { public static PacketPlayOutDeclareCommands getDeclareCommandsPacket(CommandSender sender) throws IOException {
List<String> commands = Limbo.getInstance().getPluginManager().getTabOptions(sender, new String[0]); List<String> commands = Limbo.getInstance().getPluginManager().getTabOptions(sender, new String[0]);
if (commands.isEmpty()) {
return null;
}
ByteArrayOutputStream buffer = new ByteArrayOutputStream(); ByteArrayOutputStream buffer = new ByteArrayOutputStream();
DataOutputStream output = new DataOutputStream(buffer); DataOutputStream output = new DataOutputStream(buffer);
if (commands.isEmpty()) {
DataTypeIO.writeVarInt(output, 1);
output.writeByte(0);
DataTypeIO.writeVarInt(output, 0);
DataTypeIO.writeVarInt(output, 0);
return new PacketPlayOutDeclareCommands(buffer.toByteArray());
}
DataTypeIO.writeVarInt(output, commands.size() * 2 + 1); DataTypeIO.writeVarInt(output, commands.size() * 2 + 1);
output.writeByte(0); output.writeByte(0);

View File

@ -94,7 +94,7 @@ public class MojangAPIUtils {
connection.addRequestProperty("Cache-Control", "no-cache, no-store, must-revalidate"); connection.addRequestProperty("Cache-Control", "no-cache, no-store, must-revalidate");
connection.addRequestProperty("Pragma", "no-cache"); connection.addRequestProperty("Pragma", "no-cache");
if (connection.getResponseCode() == HttpsURLConnection.HTTP_OK) { if (connection.getResponseCode() == HttpsURLConnection.HTTP_OK) {
String reply = String.join("", new BufferedReader(new InputStreamReader(connection.getInputStream())).lines().collect(Collectors.toList())).replace(" ", ""); String reply = new BufferedReader(new InputStreamReader(connection.getInputStream())).lines().collect(Collectors.joining("")).replace(" ", "");
String skin = reply.split("\"value\":\"")[1].split("\"")[0]; String skin = reply.split("\"value\":\"")[1].split("\"")[0];
String signature = reply.split("\"signature\":\"")[1].split("\"")[0]; String signature = reply.split("\"signature\":\"")[1].split("\"")[0];
return new SkinResponse(skin, signature); return new SkinResponse(skin, signature);

View File

@ -1,22 +1,18 @@
{ {
"ambient_light": 0.0, "ambient_light": 0.25,
"bed_works": false, "bed_works": false,
"coordinate_scale": 1.0, "coordinate_scale": 1.0,
"effects": "minecraft:the_end", "effects": "minecraft:the_end",
"fixed_time": 6000, "fixed_time": 6000,
"has_ceiling": false, "has_ceiling": false,
"has_raids": true, "has_raids": true,
"has_skylight": false, "has_skylight": true,
"height": 256, "height": 256,
"infiniburn": "#minecraft:infiniburn_end", "infiniburn": "#minecraft:infiniburn_end",
"logical_height": 256, "logical_height": 256,
"min_y": 0, "min_y": 0,
"monster_spawn_block_light_limit": 0, "monster_spawn_block_light_limit": 0,
"monster_spawn_light_level": { "monster_spawn_light_level": 15,
"type": "minecraft:uniform",
"max_inclusive": 7,
"min_inclusive": 0
},
"natural": false, "natural": false,
"piglin_safe": false, "piglin_safe": false,
"respawn_anchor_works": false, "respawn_anchor_works": false,

View File

@ -74,7 +74,6 @@
"minecraft:mushroom_island_vegetation", "minecraft:mushroom_island_vegetation",
"minecraft:brown_mushroom_taiga", "minecraft:brown_mushroom_taiga",
"minecraft:red_mushroom_taiga", "minecraft:red_mushroom_taiga",
"minecraft:patch_pumpkin",
"minecraft:patch_sugar_cane", "minecraft:patch_sugar_cane",
"minecraft:patch_firefly_bush_near_water" "minecraft:patch_firefly_bush_near_water"
], ],

File diff suppressed because it is too large Load Diff

View File

@ -4,6 +4,9 @@
"minecraft:clear_dialog": { "minecraft:clear_dialog": {
"protocol_id": 17 "protocol_id": 17
}, },
"minecraft:code_of_conduct": {
"protocol_id": 19
},
"minecraft:cookie_request": { "minecraft:cookie_request": {
"protocol_id": 0 "protocol_id": 0
}, },
@ -60,6 +63,9 @@
} }
}, },
"serverbound": { "serverbound": {
"minecraft:accept_code_of_conduct": {
"protocol_id": 9
},
"minecraft:client_information": { "minecraft:client_information": {
"protocol_id": 0 "protocol_id": 0
}, },
@ -180,7 +186,7 @@
"protocol_id": 13 "protocol_id": 13
}, },
"minecraft:clear_dialog": { "minecraft:clear_dialog": {
"protocol_id": 132 "protocol_id": 137
}, },
"minecraft:clear_titles": { "minecraft:clear_titles": {
"protocol_id": 14 "protocol_id": 14
@ -216,328 +222,343 @@
"protocol_id": 24 "protocol_id": 24
}, },
"minecraft:custom_report_details": { "minecraft:custom_report_details": {
"protocol_id": 129 "protocol_id": 134
}, },
"minecraft:damage_event": { "minecraft:damage_event": {
"protocol_id": 25 "protocol_id": 25
}, },
"minecraft:debug_sample": { "minecraft:debug/block_value": {
"protocol_id": 26 "protocol_id": 26
}, },
"minecraft:delete_chat": { "minecraft:debug/chunk_value": {
"protocol_id": 27 "protocol_id": 27
}, },
"minecraft:disconnect": { "minecraft:debug/entity_value": {
"protocol_id": 28 "protocol_id": 28
}, },
"minecraft:disguised_chat": { "minecraft:debug/event": {
"protocol_id": 29 "protocol_id": 29
}, },
"minecraft:entity_event": { "minecraft:debug_sample": {
"protocol_id": 30 "protocol_id": 30
}, },
"minecraft:entity_position_sync": { "minecraft:delete_chat": {
"protocol_id": 31 "protocol_id": 31
}, },
"minecraft:explode": { "minecraft:disconnect": {
"protocol_id": 32 "protocol_id": 32
}, },
"minecraft:forget_level_chunk": { "minecraft:disguised_chat": {
"protocol_id": 33 "protocol_id": 33
}, },
"minecraft:game_event": { "minecraft:entity_event": {
"protocol_id": 34 "protocol_id": 34
}, },
"minecraft:horse_screen_open": { "minecraft:entity_position_sync": {
"protocol_id": 35 "protocol_id": 35
}, },
"minecraft:hurt_animation": { "minecraft:explode": {
"protocol_id": 36 "protocol_id": 36
}, },
"minecraft:initialize_border": { "minecraft:forget_level_chunk": {
"protocol_id": 37 "protocol_id": 37
}, },
"minecraft:keep_alive": { "minecraft:game_event": {
"protocol_id": 38 "protocol_id": 38
}, },
"minecraft:level_chunk_with_light": { "minecraft:game_test_highlight_pos": {
"protocol_id": 39 "protocol_id": 39
}, },
"minecraft:level_event": { "minecraft:horse_screen_open": {
"protocol_id": 40 "protocol_id": 40
}, },
"minecraft:level_particles": { "minecraft:hurt_animation": {
"protocol_id": 41 "protocol_id": 41
}, },
"minecraft:light_update": { "minecraft:initialize_border": {
"protocol_id": 42 "protocol_id": 42
}, },
"minecraft:login": { "minecraft:keep_alive": {
"protocol_id": 43 "protocol_id": 43
}, },
"minecraft:map_item_data": { "minecraft:level_chunk_with_light": {
"protocol_id": 44 "protocol_id": 44
}, },
"minecraft:merchant_offers": { "minecraft:level_event": {
"protocol_id": 45 "protocol_id": 45
}, },
"minecraft:move_entity_pos": { "minecraft:level_particles": {
"protocol_id": 46 "protocol_id": 46
}, },
"minecraft:move_entity_pos_rot": { "minecraft:light_update": {
"protocol_id": 47 "protocol_id": 47
}, },
"minecraft:move_entity_rot": { "minecraft:login": {
"protocol_id": 49
},
"minecraft:move_minecart_along_track": {
"protocol_id": 48 "protocol_id": 48
}, },
"minecraft:move_vehicle": { "minecraft:map_item_data": {
"protocol_id": 49
},
"minecraft:merchant_offers": {
"protocol_id": 50 "protocol_id": 50
}, },
"minecraft:open_book": { "minecraft:move_entity_pos": {
"protocol_id": 51 "protocol_id": 51
}, },
"minecraft:open_screen": { "minecraft:move_entity_pos_rot": {
"protocol_id": 52 "protocol_id": 52
}, },
"minecraft:open_sign_editor": { "minecraft:move_entity_rot": {
"protocol_id": 53
},
"minecraft:ping": {
"protocol_id": 54 "protocol_id": 54
}, },
"minecraft:place_ghost_recipe": { "minecraft:move_minecart_along_track": {
"protocol_id": 56 "protocol_id": 53
}, },
"minecraft:player_abilities": { "minecraft:move_vehicle": {
"protocol_id": 57
},
"minecraft:player_chat": {
"protocol_id": 58
},
"minecraft:player_combat_end": {
"protocol_id": 59
},
"minecraft:player_combat_enter": {
"protocol_id": 60
},
"minecraft:player_combat_kill": {
"protocol_id": 61
},
"minecraft:player_info_remove": {
"protocol_id": 62
},
"minecraft:player_info_update": {
"protocol_id": 63
},
"minecraft:player_look_at": {
"protocol_id": 64
},
"minecraft:player_position": {
"protocol_id": 65
},
"minecraft:player_rotation": {
"protocol_id": 66
},
"minecraft:pong_response": {
"protocol_id": 55 "protocol_id": 55
}, },
"minecraft:projectile_power": { "minecraft:open_book": {
"protocol_id": 128 "protocol_id": 56
}, },
"minecraft:recipe_book_add": { "minecraft:open_screen": {
"protocol_id": 57
},
"minecraft:open_sign_editor": {
"protocol_id": 58
},
"minecraft:ping": {
"protocol_id": 59
},
"minecraft:place_ghost_recipe": {
"protocol_id": 61
},
"minecraft:player_abilities": {
"protocol_id": 62
},
"minecraft:player_chat": {
"protocol_id": 63
},
"minecraft:player_combat_end": {
"protocol_id": 64
},
"minecraft:player_combat_enter": {
"protocol_id": 65
},
"minecraft:player_combat_kill": {
"protocol_id": 66
},
"minecraft:player_info_remove": {
"protocol_id": 67 "protocol_id": 67
}, },
"minecraft:recipe_book_remove": { "minecraft:player_info_update": {
"protocol_id": 68 "protocol_id": 68
}, },
"minecraft:recipe_book_settings": { "minecraft:player_look_at": {
"protocol_id": 69 "protocol_id": 69
}, },
"minecraft:remove_entities": { "minecraft:player_position": {
"protocol_id": 70 "protocol_id": 70
}, },
"minecraft:remove_mob_effect": { "minecraft:player_rotation": {
"protocol_id": 71 "protocol_id": 71
}, },
"minecraft:reset_score": { "minecraft:pong_response": {
"protocol_id": 72 "protocol_id": 60
}, },
"minecraft:resource_pack_pop": { "minecraft:projectile_power": {
"protocol_id": 73
},
"minecraft:resource_pack_push": {
"protocol_id": 74
},
"minecraft:respawn": {
"protocol_id": 75
},
"minecraft:rotate_head": {
"protocol_id": 76
},
"minecraft:section_blocks_update": {
"protocol_id": 77
},
"minecraft:select_advancements_tab": {
"protocol_id": 78
},
"minecraft:server_data": {
"protocol_id": 79
},
"minecraft:server_links": {
"protocol_id": 130
},
"minecraft:set_action_bar_text": {
"protocol_id": 80
},
"minecraft:set_border_center": {
"protocol_id": 81
},
"minecraft:set_border_lerp_size": {
"protocol_id": 82
},
"minecraft:set_border_size": {
"protocol_id": 83
},
"minecraft:set_border_warning_delay": {
"protocol_id": 84
},
"minecraft:set_border_warning_distance": {
"protocol_id": 85
},
"minecraft:set_camera": {
"protocol_id": 86
},
"minecraft:set_chunk_cache_center": {
"protocol_id": 87
},
"minecraft:set_chunk_cache_radius": {
"protocol_id": 88
},
"minecraft:set_cursor_item": {
"protocol_id": 89
},
"minecraft:set_default_spawn_position": {
"protocol_id": 90
},
"minecraft:set_display_objective": {
"protocol_id": 91
},
"minecraft:set_entity_data": {
"protocol_id": 92
},
"minecraft:set_entity_link": {
"protocol_id": 93
},
"minecraft:set_entity_motion": {
"protocol_id": 94
},
"minecraft:set_equipment": {
"protocol_id": 95
},
"minecraft:set_experience": {
"protocol_id": 96
},
"minecraft:set_health": {
"protocol_id": 97
},
"minecraft:set_held_slot": {
"protocol_id": 98
},
"minecraft:set_objective": {
"protocol_id": 99
},
"minecraft:set_passengers": {
"protocol_id": 100
},
"minecraft:set_player_inventory": {
"protocol_id": 101
},
"minecraft:set_player_team": {
"protocol_id": 102
},
"minecraft:set_score": {
"protocol_id": 103
},
"minecraft:set_simulation_distance": {
"protocol_id": 104
},
"minecraft:set_subtitle_text": {
"protocol_id": 105
},
"minecraft:set_time": {
"protocol_id": 106
},
"minecraft:set_title_text": {
"protocol_id": 107
},
"minecraft:set_titles_animation": {
"protocol_id": 108
},
"minecraft:show_dialog": {
"protocol_id": 133 "protocol_id": 133
}, },
"minecraft:sound": { "minecraft:recipe_book_add": {
"protocol_id": 110 "protocol_id": 72
}, },
"minecraft:sound_entity": { "minecraft:recipe_book_remove": {
"protocol_id": 73
},
"minecraft:recipe_book_settings": {
"protocol_id": 74
},
"minecraft:remove_entities": {
"protocol_id": 75
},
"minecraft:remove_mob_effect": {
"protocol_id": 76
},
"minecraft:reset_score": {
"protocol_id": 77
},
"minecraft:resource_pack_pop": {
"protocol_id": 78
},
"minecraft:resource_pack_push": {
"protocol_id": 79
},
"minecraft:respawn": {
"protocol_id": 80
},
"minecraft:rotate_head": {
"protocol_id": 81
},
"minecraft:section_blocks_update": {
"protocol_id": 82
},
"minecraft:select_advancements_tab": {
"protocol_id": 83
},
"minecraft:server_data": {
"protocol_id": 84
},
"minecraft:server_links": {
"protocol_id": 135
},
"minecraft:set_action_bar_text": {
"protocol_id": 85
},
"minecraft:set_border_center": {
"protocol_id": 86
},
"minecraft:set_border_lerp_size": {
"protocol_id": 87
},
"minecraft:set_border_size": {
"protocol_id": 88
},
"minecraft:set_border_warning_delay": {
"protocol_id": 89
},
"minecraft:set_border_warning_distance": {
"protocol_id": 90
},
"minecraft:set_camera": {
"protocol_id": 91
},
"minecraft:set_chunk_cache_center": {
"protocol_id": 92
},
"minecraft:set_chunk_cache_radius": {
"protocol_id": 93
},
"minecraft:set_cursor_item": {
"protocol_id": 94
},
"minecraft:set_default_spawn_position": {
"protocol_id": 95
},
"minecraft:set_display_objective": {
"protocol_id": 96
},
"minecraft:set_entity_data": {
"protocol_id": 97
},
"minecraft:set_entity_link": {
"protocol_id": 98
},
"minecraft:set_entity_motion": {
"protocol_id": 99
},
"minecraft:set_equipment": {
"protocol_id": 100
},
"minecraft:set_experience": {
"protocol_id": 101
},
"minecraft:set_health": {
"protocol_id": 102
},
"minecraft:set_held_slot": {
"protocol_id": 103
},
"minecraft:set_objective": {
"protocol_id": 104
},
"minecraft:set_passengers": {
"protocol_id": 105
},
"minecraft:set_player_inventory": {
"protocol_id": 106
},
"minecraft:set_player_team": {
"protocol_id": 107
},
"minecraft:set_score": {
"protocol_id": 108
},
"minecraft:set_simulation_distance": {
"protocol_id": 109 "protocol_id": 109
}, },
"minecraft:start_configuration": { "minecraft:set_subtitle_text": {
"protocol_id": 110
},
"minecraft:set_time": {
"protocol_id": 111 "protocol_id": 111
}, },
"minecraft:stop_sound": { "minecraft:set_title_text": {
"protocol_id": 112 "protocol_id": 112
}, },
"minecraft:store_cookie": { "minecraft:set_titles_animation": {
"protocol_id": 113 "protocol_id": 113
}, },
"minecraft:system_chat": { "minecraft:show_dialog": {
"protocol_id": 114 "protocol_id": 138
}, },
"minecraft:tab_list": { "minecraft:sound": {
"protocol_id": 115 "protocol_id": 115
}, },
"minecraft:tag_query": { "minecraft:sound_entity": {
"protocol_id": 114
},
"minecraft:start_configuration": {
"protocol_id": 116 "protocol_id": 116
}, },
"minecraft:take_item_entity": { "minecraft:stop_sound": {
"protocol_id": 117 "protocol_id": 117
}, },
"minecraft:teleport_entity": { "minecraft:store_cookie": {
"protocol_id": 118 "protocol_id": 118
}, },
"minecraft:test_instance_block_status": { "minecraft:system_chat": {
"protocol_id": 119 "protocol_id": 119
}, },
"minecraft:ticking_state": { "minecraft:tab_list": {
"protocol_id": 120 "protocol_id": 120
}, },
"minecraft:ticking_step": { "minecraft:tag_query": {
"protocol_id": 121 "protocol_id": 121
}, },
"minecraft:transfer": { "minecraft:take_item_entity": {
"protocol_id": 122 "protocol_id": 122
}, },
"minecraft:update_advancements": { "minecraft:teleport_entity": {
"protocol_id": 123 "protocol_id": 123
}, },
"minecraft:update_attributes": { "minecraft:test_instance_block_status": {
"protocol_id": 124 "protocol_id": 124
}, },
"minecraft:update_mob_effect": { "minecraft:ticking_state": {
"protocol_id": 125 "protocol_id": 125
}, },
"minecraft:update_recipes": { "minecraft:ticking_step": {
"protocol_id": 126 "protocol_id": 126
}, },
"minecraft:update_tags": { "minecraft:transfer": {
"protocol_id": 127 "protocol_id": 127
}, },
"minecraft:waypoint": { "minecraft:update_advancements": {
"protocol_id": 128
},
"minecraft:update_attributes": {
"protocol_id": 129
},
"minecraft:update_mob_effect": {
"protocol_id": 130
},
"minecraft:update_recipes": {
"protocol_id": 131 "protocol_id": 131
},
"minecraft:update_tags": {
"protocol_id": 132
},
"minecraft:waypoint": {
"protocol_id": 136
} }
}, },
"serverbound": { "serverbound": {
@ -610,7 +631,7 @@
"minecraft:custom_payload": { "minecraft:custom_payload": {
"protocol_id": 21 "protocol_id": 21
}, },
"minecraft:debug_sample_subscription": { "minecraft:debug_subscription_request": {
"protocol_id": 22 "protocol_id": 22
}, },
"minecraft:edit_book": { "minecraft:edit_book": {

File diff suppressed because it is too large Load Diff