diff --git a/pom.xml b/pom.xml
index f9956e1..9a2c7f3 100644
--- a/pom.xml
+++ b/pom.xml
@@ -5,7 +5,7 @@
com.loohp
Limbo
Limbo
- 0.5.3-ALPHA
+ 0.6.0-ALPHA
Standalone Limbo Minecraft Server.
https://github.com/LOOHP/Limbo
@@ -25,6 +25,21 @@
src/main/resources
true
+
+ **/*.java
+ **/*.ttf
+ **/*.jar
+ **/*.schem
+
+
+
+ src/main/resources
+ false
+
+ **/*.ttf
+ **/*.jar
+ **/*.schem
+
diff --git a/src/main/java/com/loohp/limbo/Limbo.java b/src/main/java/com/loohp/limbo/Limbo.java
index c58ce88..38769e1 100644
--- a/src/main/java/com/loohp/limbo/Limbo.java
+++ b/src/main/java/com/loohp/limbo/Limbo.java
@@ -5,15 +5,12 @@ import java.awt.image.BufferedImage;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
-import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.net.URL;
-import java.nio.channels.Channels;
-import java.nio.channels.ReadableByteChannel;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.util.ArrayList;
@@ -39,13 +36,9 @@ import org.json.simple.parser.ParseException;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
-import com.loohp.limbo.events.EventsManager;
-import com.loohp.limbo.server.ServerConnection;
-import com.loohp.limbo.server.packets.Packet;
-import com.loohp.limbo.server.packets.PacketIn;
-import com.loohp.limbo.server.packets.PacketOut;
import com.loohp.limbo.commands.CommandSender;
import com.loohp.limbo.consolegui.GUI;
+import com.loohp.limbo.events.EventsManager;
import com.loohp.limbo.file.ServerProperties;
import com.loohp.limbo.location.Location;
import com.loohp.limbo.metrics.Metrics;
@@ -55,6 +48,10 @@ import com.loohp.limbo.plugins.LimboPlugin;
import com.loohp.limbo.plugins.PluginManager;
import com.loohp.limbo.scheduler.LimboScheduler;
import com.loohp.limbo.scheduler.Tick;
+import com.loohp.limbo.server.ServerConnection;
+import com.loohp.limbo.server.packets.Packet;
+import com.loohp.limbo.server.packets.PacketIn;
+import com.loohp.limbo.server.packets.PacketOut;
import com.loohp.limbo.utils.CustomStringUtils;
import com.loohp.limbo.utils.ImageUtils;
import com.loohp.limbo.utils.NetworkUtils;
@@ -296,11 +293,12 @@ public class Limbo {
File defaultCommandsJar = new File(pluginFolder, "LimboDefaultCmd.jar");
defaultCommandsJar.delete();
- console.sendMessage("Downloading limbo default commands module from github...");
- ReadableByteChannel rbc = Channels.newChannel(new URL("https://github.com/LOOHP/Limbo/raw/master/modules/LimboDefaultCmd.jar").openStream());
- FileOutputStream fos = new FileOutputStream(defaultCommandsJar);
- fos.getChannel().transferFrom(rbc, 0, Long.MAX_VALUE);
- fos.close();
+ console.sendMessage("Loading limbo default commands module...");
+ try (InputStream in = Limbo.class.getClassLoader().getResourceAsStream("LimboDefaultCmd.jar")) {
+ Files.copy(in, defaultCommandsJar.toPath());
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
pluginManager = new PluginManager(pluginFolder);
try {
@@ -372,16 +370,25 @@ public class Limbo {
if (!schem.exists()) {
console.sendMessage("Schemetic file " + properties.getSchemFileName() + " for world " + properties.getLevelName() + " not found!");
+ console.sendMessage("Creating default world...");
+ try (InputStream in = Limbo.class.getClassLoader().getResourceAsStream("spawn.schem")) {
+ Files.copy(in, schem.toPath());
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+
+ try {
+ World world = Schematic.toWorld(properties.getLevelName().getKey(), Environment.fromNamespacedKey(properties.getLevelDimension()), (CompoundTag) NBTUtil.read(schem).getTag());
+ console.sendMessage("Loaded world " + properties.getLevelName() + "!");
+ return world;
+ } catch (Throwable e) {
+ console.sendMessage("Unable to load world " + properties.getSchemFileName() + "!");
+ e.printStackTrace();
console.sendMessage("Server will exit!");
System.exit(1);
return null;
}
-
- World world = Schematic.toWorld(properties.getLevelName().getKey(), Environment.fromNamespacedKey(properties.getLevelDimension()), (CompoundTag) NBTUtil.read(schem).getTag());
-
- console.sendMessage("Loaded world " + properties.getLevelName() + "!");
-
- return world;
}
public void registerWorld(World world) {
diff --git a/src/main/java/com/loohp/limbo/events/EventHandler.java b/src/main/java/com/loohp/limbo/events/EventHandler.java
index 126f257..9458d7f 100644
--- a/src/main/java/com/loohp/limbo/events/EventHandler.java
+++ b/src/main/java/com/loohp/limbo/events/EventHandler.java
@@ -10,5 +10,7 @@ import java.lang.annotation.Target;
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface EventHandler {
+
EventPriority priority() default EventPriority.NORMAL;
+
}
\ No newline at end of file
diff --git a/src/main/java/com/loohp/limbo/events/EventPriority.java b/src/main/java/com/loohp/limbo/events/EventPriority.java
index 89fc3f6..b7fef26 100644
--- a/src/main/java/com/loohp/limbo/events/EventPriority.java
+++ b/src/main/java/com/loohp/limbo/events/EventPriority.java
@@ -1,6 +1,7 @@
package com.loohp.limbo.events;
public enum EventPriority {
+
LOWEST(0),
LOW(1),
NORMAL(2),
@@ -34,4 +35,5 @@ public enum EventPriority {
}
return array;
}
+
}
\ No newline at end of file
diff --git a/src/main/java/com/loohp/limbo/events/EventsManager.java b/src/main/java/com/loohp/limbo/events/EventsManager.java
index 1db524f..e8525fc 100644
--- a/src/main/java/com/loohp/limbo/events/EventsManager.java
+++ b/src/main/java/com/loohp/limbo/events/EventsManager.java
@@ -3,33 +3,31 @@ package com.loohp.limbo.events;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.concurrent.ConcurrentHashMap;
import com.loohp.limbo.plugins.LimboPlugin;
public class EventsManager {
private List listeners;
+ private Map cachedListeners;
public EventsManager() {
listeners = new ArrayList<>();
+ cachedListeners = new ConcurrentHashMap<>();
}
public T callEvent(T event) {
for (EventPriority priority : EventPriority.getPrioritiesInOrder()) {
- for (ListenerPair entry : listeners) {
- Listener listener = entry.listener;
- for (Method method : listener.getClass().getMethods()) {
- if (method.isAnnotationPresent(EventHandler.class)) {
- if (method.getAnnotation(EventHandler.class).priority().equals(priority)) {
- if (method.getParameterCount() == 1 && method.getParameterTypes()[0].equals(event.getClass())) {
- try {
- method.invoke(listener, event);
- } catch (Exception e) {
- System.err.println("Error while passing " + event.getClass().getCanonicalName() + " to the plugin \"" + entry.plugin.getName() + "\"");
- e.printStackTrace();
- }
- }
- }
+ for (Entry entry : cachedListeners.entrySet()) {
+ for (Method method : entry.getValue().getListeners(event.getClass(), priority)) {
+ try {
+ method.invoke(entry.getKey(), event);
+ } catch (Exception e) {
+ System.err.println("Error while passing " + event.getClass().getCanonicalName() + " to the plugin \"" + entry.getValue().getPlugin().getName() + "\"");
+ e.printStackTrace();
}
}
}
@@ -39,10 +37,18 @@ public class EventsManager {
public void registerEvents(LimboPlugin plugin, Listener listener) {
listeners.add(new ListenerPair(plugin, listener));
+ cachedListeners.put(listener, new RegisteredCachedListener(plugin, listener));
}
public void unregisterAllListeners(LimboPlugin plugin) {
- listeners.removeIf(each -> each.plugin.equals(plugin));
+ listeners.removeIf(each -> {
+ if (each.plugin.equals(plugin)) {
+ cachedListeners.remove(each.listener);
+ return true;
+ } else {
+ return false;
+ }
+ });
}
protected static class ListenerPair {
diff --git a/src/main/java/com/loohp/limbo/events/RegisteredCachedListener.java b/src/main/java/com/loohp/limbo/events/RegisteredCachedListener.java
new file mode 100644
index 0000000..e5effd4
--- /dev/null
+++ b/src/main/java/com/loohp/limbo/events/RegisteredCachedListener.java
@@ -0,0 +1,47 @@
+package com.loohp.limbo.events;
+
+import java.lang.reflect.Method;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
+import com.loohp.limbo.plugins.LimboPlugin;
+
+public class RegisteredCachedListener {
+
+ private LimboPlugin plugin;
+ private Map, Map>> listeners;
+
+ @SuppressWarnings("unchecked")
+ public RegisteredCachedListener(LimboPlugin plugin, Listener listener) {
+ this.plugin = plugin;
+ this.listeners = new ConcurrentHashMap<>();
+ for (Method method : listener.getClass().getMethods()) {
+ if (method.isAnnotationPresent(EventHandler.class) && method.getParameterCount() == 1 && Event.class.isAssignableFrom(method.getParameterTypes()[0])) {
+ Class extends Event> eventClass = (Class extends Event>) method.getParameterTypes()[0];
+ listeners.putIfAbsent(eventClass, new ConcurrentHashMap<>());
+ Map> mapping = listeners.get(eventClass);
+ EventPriority priority = method.getAnnotation(EventHandler.class).priority();
+ mapping.putIfAbsent(priority, new ArrayList<>());
+ List list = mapping.get(priority);
+ list.add(method);
+ }
+ }
+ }
+
+ public LimboPlugin getPlugin() {
+ return plugin;
+ }
+
+ public List getListeners(Class extends Event> eventClass, EventPriority priority) {
+ Map> mapping = listeners.get(eventClass);
+ if (mapping == null) {
+ return Collections.emptyList();
+ }
+ List list = mapping.get(priority);
+ return list == null ? Collections.emptyList() : Collections.unmodifiableList(list);
+ }
+
+}
diff --git a/src/main/java/com/loohp/limbo/file/ServerProperties.java b/src/main/java/com/loohp/limbo/file/ServerProperties.java
index a2c2418..8e7c981 100644
--- a/src/main/java/com/loohp/limbo/file/ServerProperties.java
+++ b/src/main/java/com/loohp/limbo/file/ServerProperties.java
@@ -1,5 +1,21 @@
package com.loohp.limbo.file;
+import java.awt.image.BufferedImage;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.io.OutputStreamWriter;
+import java.io.PrintWriter;
+import java.nio.charset.StandardCharsets;
+import java.util.List;
+import java.util.Map.Entry;
+import java.util.Optional;
+import java.util.Properties;
+
+import javax.imageio.ImageIO;
+
import com.google.common.collect.Lists;
import com.loohp.limbo.Limbo;
import com.loohp.limbo.location.Location;
@@ -7,15 +23,6 @@ import com.loohp.limbo.utils.GameMode;
import com.loohp.limbo.utils.NamespacedKey;
import com.loohp.limbo.world.World;
-import javax.imageio.ImageIO;
-import java.awt.image.BufferedImage;
-import java.io.*;
-import java.nio.charset.StandardCharsets;
-import java.util.List;
-import java.util.Map.Entry;
-import java.util.Optional;
-import java.util.Properties;
-
public class ServerProperties {
public static final String COMMENT = "For explaination of what each of the options does, please visit:\nhttps://github.com/LOOHP/Limbo/blob/master/src/main/resources/server.properties";
diff --git a/src/main/java/com/loohp/limbo/player/Player.java b/src/main/java/com/loohp/limbo/player/Player.java
index dc972aa..6fe8c3d 100644
--- a/src/main/java/com/loohp/limbo/player/Player.java
+++ b/src/main/java/com/loohp/limbo/player/Player.java
@@ -4,21 +4,21 @@ import java.io.IOException;
import java.util.UUID;
import com.loohp.limbo.Limbo;
+import com.loohp.limbo.commands.CommandSender;
+import com.loohp.limbo.entity.DataWatcher;
+import com.loohp.limbo.entity.DataWatcher.WatchableField;
+import com.loohp.limbo.entity.DataWatcher.WatchableObjectType;
+import com.loohp.limbo.entity.EntityType;
+import com.loohp.limbo.entity.LivingEntity;
import com.loohp.limbo.events.player.PlayerChatEvent;
import com.loohp.limbo.events.player.PlayerTeleportEvent;
+import com.loohp.limbo.location.Location;
import com.loohp.limbo.server.ClientConnection;
import com.loohp.limbo.server.packets.PacketPlayOutChat;
import com.loohp.limbo.server.packets.PacketPlayOutGameState;
import com.loohp.limbo.server.packets.PacketPlayOutHeldItemChange;
import com.loohp.limbo.server.packets.PacketPlayOutPositionAndLook;
import com.loohp.limbo.server.packets.PacketPlayOutRespawn;
-import com.loohp.limbo.commands.CommandSender;
-import com.loohp.limbo.entity.DataWatcher;
-import com.loohp.limbo.entity.EntityType;
-import com.loohp.limbo.entity.LivingEntity;
-import com.loohp.limbo.entity.DataWatcher.WatchableField;
-import com.loohp.limbo.entity.DataWatcher.WatchableObjectType;
-import com.loohp.limbo.location.Location;
import com.loohp.limbo.utils.GameMode;
import net.md_5.bungee.api.chat.BaseComponent;
diff --git a/src/main/java/com/loohp/limbo/player/PlayerInteractManager.java b/src/main/java/com/loohp/limbo/player/PlayerInteractManager.java
index a6828ed..3b7eef6 100644
--- a/src/main/java/com/loohp/limbo/player/PlayerInteractManager.java
+++ b/src/main/java/com/loohp/limbo/player/PlayerInteractManager.java
@@ -11,6 +11,8 @@ import java.util.Set;
import java.util.stream.Collectors;
import com.loohp.limbo.Limbo;
+import com.loohp.limbo.entity.Entity;
+import com.loohp.limbo.location.Location;
import com.loohp.limbo.server.packets.PacketPlayOutEntityDestroy;
import com.loohp.limbo.server.packets.PacketPlayOutEntityMetadata;
import com.loohp.limbo.server.packets.PacketPlayOutLightUpdate;
@@ -18,8 +20,6 @@ import com.loohp.limbo.server.packets.PacketPlayOutMapChunk;
import com.loohp.limbo.server.packets.PacketPlayOutSpawnEntity;
import com.loohp.limbo.server.packets.PacketPlayOutSpawnEntityLiving;
import com.loohp.limbo.server.packets.PacketPlayOutUnloadChunk;
-import com.loohp.limbo.entity.Entity;
-import com.loohp.limbo.location.Location;
import com.loohp.limbo.world.World;
import net.querz.mca.Chunk;
diff --git a/src/main/java/com/loohp/limbo/server/ClientConnection.java b/src/main/java/com/loohp/limbo/server/ClientConnection.java
index d667cf2..90f9923 100644
--- a/src/main/java/com/loohp/limbo/server/ClientConnection.java
+++ b/src/main/java/com/loohp/limbo/server/ClientConnection.java
@@ -1,41 +1,90 @@
package com.loohp.limbo.server;
-import com.google.gson.JsonArray;
-import com.google.gson.JsonElement;
-import com.google.gson.JsonParser;
-import com.loohp.limbo.Limbo;
-import com.loohp.limbo.events.player.*;
-import com.loohp.limbo.events.status.StatusPingEvent;
-import com.loohp.limbo.file.ServerProperties;
-import com.loohp.limbo.location.Location;
-import com.loohp.limbo.player.Player;
-import com.loohp.limbo.player.PlayerInteractManager;
-import com.loohp.limbo.server.packets.*;
-import com.loohp.limbo.server.packets.PacketPlayOutPlayerAbilities.PlayerAbilityFlags;
-import com.loohp.limbo.server.packets.PacketPlayOutPlayerInfo.PlayerInfoAction;
-import com.loohp.limbo.server.packets.PacketPlayOutPlayerInfo.PlayerInfoData;
-import com.loohp.limbo.server.packets.PacketPlayOutPlayerInfo.PlayerInfoData.PlayerInfoDataAddPlayer.PlayerSkinProperty;
-import com.loohp.limbo.server.packets.PacketPlayOutTabComplete.TabCompleteMatches;
-import com.loohp.limbo.utils.*;
-import com.loohp.limbo.utils.MojangAPIUtils.SkinResponse;
-import com.loohp.limbo.world.BlockPosition;
-import com.loohp.limbo.world.World;
-import net.md_5.bungee.api.ChatColor;
-import net.md_5.bungee.api.chat.BaseComponent;
-import net.md_5.bungee.api.chat.TextComponent;
-import net.md_5.bungee.chat.ComponentSerializer;
-
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.InetAddress;
import java.net.Socket;
import java.nio.charset.StandardCharsets;
-import java.util.*;
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Optional;
+import java.util.Random;
+import java.util.Set;
+import java.util.UUID;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicLong;
import java.util.stream.Collectors;
+import org.json.simple.JSONArray;
+import org.json.simple.JSONObject;
+import org.json.simple.parser.JSONParser;
+
+import com.loohp.limbo.Limbo;
+import com.loohp.limbo.events.player.PlayerJoinEvent;
+import com.loohp.limbo.events.player.PlayerLoginEvent;
+import com.loohp.limbo.events.player.PlayerMoveEvent;
+import com.loohp.limbo.events.player.PlayerQuitEvent;
+import com.loohp.limbo.events.player.PlayerSelectedSlotChangeEvent;
+import com.loohp.limbo.events.status.StatusPingEvent;
+import com.loohp.limbo.file.ServerProperties;
+import com.loohp.limbo.location.Location;
+import com.loohp.limbo.player.Player;
+import com.loohp.limbo.player.PlayerInteractManager;
+import com.loohp.limbo.server.packets.Packet;
+import com.loohp.limbo.server.packets.PacketHandshakingIn;
+import com.loohp.limbo.server.packets.PacketLoginInLoginStart;
+import com.loohp.limbo.server.packets.PacketLoginInPluginMessaging;
+import com.loohp.limbo.server.packets.PacketLoginOutDisconnect;
+import com.loohp.limbo.server.packets.PacketLoginOutLoginSuccess;
+import com.loohp.limbo.server.packets.PacketLoginOutPluginMessaging;
+import com.loohp.limbo.server.packets.PacketOut;
+import com.loohp.limbo.server.packets.PacketPlayInChat;
+import com.loohp.limbo.server.packets.PacketPlayInHeldItemChange;
+import com.loohp.limbo.server.packets.PacketPlayInKeepAlive;
+import com.loohp.limbo.server.packets.PacketPlayInPosition;
+import com.loohp.limbo.server.packets.PacketPlayInPositionAndLook;
+import com.loohp.limbo.server.packets.PacketPlayInRotation;
+import com.loohp.limbo.server.packets.PacketPlayInTabComplete;
+import com.loohp.limbo.server.packets.PacketPlayOutDeclareCommands;
+import com.loohp.limbo.server.packets.PacketPlayOutDisconnect;
+import com.loohp.limbo.server.packets.PacketPlayOutEntityMetadata;
+import com.loohp.limbo.server.packets.PacketPlayOutGameState;
+import com.loohp.limbo.server.packets.PacketPlayOutHeldItemChange;
+import com.loohp.limbo.server.packets.PacketPlayOutLogin;
+import com.loohp.limbo.server.packets.PacketPlayOutPlayerAbilities;
+import com.loohp.limbo.server.packets.PacketPlayOutPlayerAbilities.PlayerAbilityFlags;
+import com.loohp.limbo.server.packets.PacketPlayOutPlayerInfo;
+import com.loohp.limbo.server.packets.PacketPlayOutPlayerInfo.PlayerInfoAction;
+import com.loohp.limbo.server.packets.PacketPlayOutPlayerInfo.PlayerInfoData;
+import com.loohp.limbo.server.packets.PacketPlayOutPlayerInfo.PlayerInfoData.PlayerInfoDataAddPlayer.PlayerSkinProperty;
+import com.loohp.limbo.server.packets.PacketPlayOutPositionAndLook;
+import com.loohp.limbo.server.packets.PacketPlayOutSpawnPosition;
+import com.loohp.limbo.server.packets.PacketPlayOutTabComplete;
+import com.loohp.limbo.server.packets.PacketPlayOutTabComplete.TabCompleteMatches;
+import com.loohp.limbo.server.packets.PacketPlayOutUpdateViewPosition;
+import com.loohp.limbo.server.packets.PacketStatusInPing;
+import com.loohp.limbo.server.packets.PacketStatusInRequest;
+import com.loohp.limbo.server.packets.PacketStatusOutPong;
+import com.loohp.limbo.server.packets.PacketStatusOutResponse;
+import com.loohp.limbo.utils.CheckedBiConsumer;
+import com.loohp.limbo.utils.CustomStringUtils;
+import com.loohp.limbo.utils.DataTypeIO;
+import com.loohp.limbo.utils.DeclareCommands;
+import com.loohp.limbo.utils.ForwardingUtils;
+import com.loohp.limbo.utils.GameMode;
+import com.loohp.limbo.utils.MojangAPIUtils;
+import com.loohp.limbo.utils.MojangAPIUtils.SkinResponse;
+import com.loohp.limbo.utils.NamespacedKey;
+import com.loohp.limbo.world.BlockPosition;
+import com.loohp.limbo.world.World;
+
+import net.md_5.bungee.api.ChatColor;
+import net.md_5.bungee.api.chat.BaseComponent;
+import net.md_5.bungee.api.chat.TextComponent;
+import net.md_5.bungee.chat.ComponentSerializer;
+
public class ClientConnection extends Thread {
public static enum ClientState {
@@ -48,7 +97,6 @@ public class ClientConnection extends Thread {
}
private final Random random = new Random();
- private final JsonParser jsonParser = new JsonParser();
private final Socket client_socket;
private boolean running;
@@ -212,15 +260,16 @@ public class ClientConnection extends Thread {
boolean bungeeGuardFound = false;
if (data.length > 3) {
- JsonArray skinJson = this.jsonParser.parse(data[3]).getAsJsonArray();
+ JSONArray skinJson = (JSONArray) new JSONParser().parse(data[3]);
- for (JsonElement property : skinJson) {
- if (property.getAsJsonObject().get("name").getAsString().equals("textures")) {
- String skin = property.getAsJsonObject().get("value").getAsString();
- String signature = property.getAsJsonObject().get("signature").getAsString();
+ for (Object obj : skinJson) {
+ JSONObject property = (JSONObject) obj;
+ if (property.get("name").toString().equals("textures")) {
+ String skin = property.get("value").toString();
+ String signature = property.get("signature").toString();
forwardedSkin = new SkinResponse(skin, signature);
- } else if (isBungeeGuard && property.getAsJsonObject().get("name").getAsString().equals("bungeeguard-token")) {
- String token = property.getAsJsonObject().get("value").getAsString();
+ } else if (isBungeeGuard && property.get("name").toString().equals("bungeeguard-token")) {
+ String token = property.get("value").toString();
bungeeGuardFound = Limbo.getInstance().getServerProperties().getForwardingSecrets().contains(token);
}
}
@@ -272,15 +321,16 @@ public class ClientConnection extends Thread {
disconnectDuringLogin(TextComponent.fromLegacyText("Internal error, messageId did not match"));
break;
}
- if (response.getData() == null) {
+ if (!response.getData().isPresent()) {
disconnectDuringLogin(TextComponent.fromLegacyText("Unknown login plugin response packet!"));
break;
}
- if (!ForwardingUtils.validateVelocityModernResponse(response.getData())) {
+ byte[] responseData = response.getData().get();
+ if (!ForwardingUtils.validateVelocityModernResponse(responseData)) {
disconnectDuringLogin(TextComponent.fromLegacyText("Invalid playerinfo forwarding!"));
break;
}
- ForwardingUtils.VelocityModernForwardingData data = ForwardingUtils.getVelocityDataFrom(response.getData());
+ ForwardingUtils.VelocityModernForwardingData data = ForwardingUtils.getVelocityDataFrom(responseData);
inetAddress = InetAddress.getByName(data.getIpAddress());
forwardedSkin = data.getSkinResponse();
@@ -376,8 +426,7 @@ public class ClientConnection extends Thread {
int packetId = DataTypeIO.readVarInt(input);
Class extends Packet> packetType = Packet.getPlayIn().get(packetId);
//Limbo.getInstance().getConsole().sendMessage(packetId + " -> " + packetType);
- CheckedConsumer processMoveEvent = event -> {
- Location originalTo = event.getTo().clone();
+ CheckedBiConsumer processMoveEvent = (event, originalTo) -> {
if (event.isCancelled()) {
Location returnTo = event.getFrom();
PacketPlayOutPositionAndLook cancel = new PacketPlayOutPositionAndLook(returnTo.getX(), returnTo.getY(), returnTo.getZ(), returnTo.getYaw(), returnTo.getPitch(), 1, false);
@@ -401,22 +450,28 @@ public class ClientConnection extends Thread {
Location from = player.getLocation();
Location to = new Location(player.getWorld(), pos.getX(), pos.getY(), pos.getZ(), pos.getYaw(), pos.getPitch());
- PlayerMoveEvent event = Limbo.getInstance().getEventsManager().callEvent(new PlayerMoveEvent(player, from, to));
- processMoveEvent.consume(event);
+ if (!from.equals(to)) {
+ PlayerMoveEvent event = Limbo.getInstance().getEventsManager().callEvent(new PlayerMoveEvent(player, from, to));
+ processMoveEvent.consume(event, to);
+ }
} else if (packetType.equals(PacketPlayInPosition.class)) {
PacketPlayInPosition pos = new PacketPlayInPosition(input);
Location from = player.getLocation();
Location to = new Location(player.getWorld(), pos.getX(), pos.getY(), pos.getZ(), player.getLocation().getYaw(), player.getLocation().getPitch());
- PlayerMoveEvent event = Limbo.getInstance().getEventsManager().callEvent(new PlayerMoveEvent(player, from, to));
- processMoveEvent.consume(event);
+ if (!from.equals(to)) {
+ PlayerMoveEvent event = Limbo.getInstance().getEventsManager().callEvent(new PlayerMoveEvent(player, from, to));
+ processMoveEvent.consume(event, to);
+ }
} else if (packetType.equals(PacketPlayInRotation.class)) {
PacketPlayInRotation pos = new PacketPlayInRotation(input);
Location from = player.getLocation();
Location to = new Location(player.getWorld(), player.getLocation().getX(), player.getLocation().getY(), player.getLocation().getZ(), pos.getYaw(), pos.getPitch());
- PlayerMoveEvent event = Limbo.getInstance().getEventsManager().callEvent(new PlayerMoveEvent(player, from, to));
- processMoveEvent.consume(event);
+ if (!from.equals(to)) {
+ PlayerMoveEvent event = Limbo.getInstance().getEventsManager().callEvent(new PlayerMoveEvent(player, from, to));
+ processMoveEvent.consume(event, to);
+ }
} else if (packetType.equals(PacketPlayInKeepAlive.class)) {
PacketPlayInKeepAlive alive = new PacketPlayInKeepAlive(input);
if (alive.getPayload() != getLastKeepAlivePayLoad()) {
@@ -485,9 +540,5 @@ public class ClientConnection extends Thread {
Limbo.getInstance().getServerConnection().getClients().remove(this);
running = false;
}
-
- @FunctionalInterface
- public interface CheckedConsumer {
- void consume(T t) throws TException;
- }
+
}
diff --git a/src/main/java/com/loohp/limbo/server/packets/PacketLoginInPluginMessaging.java b/src/main/java/com/loohp/limbo/server/packets/PacketLoginInPluginMessaging.java
index d0a1582..b94e599 100644
--- a/src/main/java/com/loohp/limbo/server/packets/PacketLoginInPluginMessaging.java
+++ b/src/main/java/com/loohp/limbo/server/packets/PacketLoginInPluginMessaging.java
@@ -1,19 +1,21 @@
package com.loohp.limbo.server.packets;
-import com.loohp.limbo.utils.DataTypeIO;
-
import java.io.DataInputStream;
import java.io.IOException;
+import java.util.Optional;
+
+import com.loohp.limbo.utils.DataTypeIO;
public class PacketLoginInPluginMessaging extends PacketIn {
private int messageId;
private boolean successful;
- private byte[] data = null;
+ private Optional data;
public PacketLoginInPluginMessaging(int messageId, boolean successful, byte[] data) {
this.messageId = messageId;
- this.data = data;
+ this.successful = successful;
+ this.data = successful ? Optional.of(data) : Optional.empty();
}
public PacketLoginInPluginMessaging(DataInputStream in, int packetLength, int packetId) throws IOException {
@@ -22,9 +24,14 @@ public class PacketLoginInPluginMessaging extends PacketIn {
if (successful) {
int dataLength = packetLength - DataTypeIO.getVarIntLength(packetId) - DataTypeIO.getVarIntLength(messageId) - 1;
if (dataLength != 0) {
- data = new byte[dataLength];
+ byte[] data = new byte[dataLength];
in.readFully(data);
+ this.data = Optional.of(data);
+ } else {
+ this.data = Optional.of(new byte[0]);
}
+ } else {
+ data = Optional.empty();
}
}
@@ -36,7 +43,7 @@ public class PacketLoginInPluginMessaging extends PacketIn {
return successful;
}
- public byte[] getData() {
+ public Optional getData() {
return data;
}
diff --git a/src/main/java/com/loohp/limbo/server/packets/PacketLoginOutPluginMessaging.java b/src/main/java/com/loohp/limbo/server/packets/PacketLoginOutPluginMessaging.java
index bcd0ec3..65a2bb2 100644
--- a/src/main/java/com/loohp/limbo/server/packets/PacketLoginOutPluginMessaging.java
+++ b/src/main/java/com/loohp/limbo/server/packets/PacketLoginOutPluginMessaging.java
@@ -1,13 +1,13 @@
package com.loohp.limbo.server.packets;
-import com.loohp.limbo.utils.DataTypeIO;
-import com.loohp.limbo.utils.NamespacedKey;
-
import java.io.ByteArrayOutputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
+import com.loohp.limbo.utils.DataTypeIO;
+import com.loohp.limbo.utils.NamespacedKey;
+
public class PacketLoginOutPluginMessaging extends PacketOut {
private int messageId;
diff --git a/src/main/java/com/loohp/limbo/server/packets/PacketPlayOutEntityMetadata.java b/src/main/java/com/loohp/limbo/server/packets/PacketPlayOutEntityMetadata.java
index 0ae4671..1ab894f 100644
--- a/src/main/java/com/loohp/limbo/server/packets/PacketPlayOutEntityMetadata.java
+++ b/src/main/java/com/loohp/limbo/server/packets/PacketPlayOutEntityMetadata.java
@@ -13,10 +13,10 @@ import java.util.Map;
import java.util.Map.Entry;
import java.util.UUID;
-import com.loohp.limbo.entity.Entity;
-import com.loohp.limbo.entity.Pose;
import com.loohp.limbo.entity.DataWatcher.WatchableObject;
import com.loohp.limbo.entity.DataWatcher.WatchableObjectType;
+import com.loohp.limbo.entity.Entity;
+import com.loohp.limbo.entity.Pose;
import com.loohp.limbo.utils.DataTypeIO;
import com.loohp.limbo.utils.Rotation3f;
import com.loohp.limbo.world.BlockPosition;
diff --git a/src/main/java/com/loohp/limbo/utils/CheckedBiConsumer.java b/src/main/java/com/loohp/limbo/utils/CheckedBiConsumer.java
new file mode 100644
index 0000000..bc5ac14
--- /dev/null
+++ b/src/main/java/com/loohp/limbo/utils/CheckedBiConsumer.java
@@ -0,0 +1,8 @@
+package com.loohp.limbo.utils;
+
+@FunctionalInterface
+public interface CheckedBiConsumer {
+
+ void consume(T t, U u) throws TException;
+
+}
\ No newline at end of file
diff --git a/src/main/java/com/loohp/limbo/utils/DeclareCommands.java b/src/main/java/com/loohp/limbo/utils/DeclareCommands.java
index 4c58e2a..76005cd 100644
--- a/src/main/java/com/loohp/limbo/utils/DeclareCommands.java
+++ b/src/main/java/com/loohp/limbo/utils/DeclareCommands.java
@@ -7,8 +7,8 @@ import java.nio.charset.StandardCharsets;
import java.util.List;
import com.loohp.limbo.Limbo;
-import com.loohp.limbo.server.packets.PacketPlayOutDeclareCommands;
import com.loohp.limbo.commands.CommandSender;
+import com.loohp.limbo.server.packets.PacketPlayOutDeclareCommands;
public class DeclareCommands {
diff --git a/src/main/java/com/loohp/limbo/world/World.java b/src/main/java/com/loohp/limbo/world/World.java
index d891099..bef2b1d 100644
--- a/src/main/java/com/loohp/limbo/world/World.java
+++ b/src/main/java/com/loohp/limbo/world/World.java
@@ -11,15 +11,15 @@ import java.util.Set;
import java.util.stream.Collectors;
import com.loohp.limbo.Limbo;
-import com.loohp.limbo.server.packets.PacketPlayOutEntityDestroy;
-import com.loohp.limbo.server.packets.PacketPlayOutEntityMetadata;
import com.loohp.limbo.entity.ArmorStand;
import com.loohp.limbo.entity.DataWatcher;
+import com.loohp.limbo.entity.DataWatcher.WatchableObject;
import com.loohp.limbo.entity.Entity;
import com.loohp.limbo.entity.EntityType;
-import com.loohp.limbo.entity.DataWatcher.WatchableObject;
import com.loohp.limbo.location.Location;
import com.loohp.limbo.player.Player;
+import com.loohp.limbo.server.packets.PacketPlayOutEntityDestroy;
+import com.loohp.limbo.server.packets.PacketPlayOutEntityMetadata;
import com.loohp.limbo.utils.SchematicConvertionUtils;
import net.querz.mca.Chunk;
diff --git a/modules/LimboDefaultCmd.jar b/src/main/resources/LimboDefaultCmd.jar
similarity index 100%
rename from modules/LimboDefaultCmd.jar
rename to src/main/resources/LimboDefaultCmd.jar
diff --git a/src/main/resources/spawn.schem b/src/main/resources/spawn.schem
new file mode 100644
index 0000000..0a800b5
Binary files /dev/null and b/src/main/resources/spawn.schem differ