From 7d8208272f119ecda0d85bd8f8d21b01597ec1e3 Mon Sep 17 00:00:00 2001 From: LOOHP Date: Thu, 19 Aug 2021 20:50:45 +0800 Subject: [PATCH] Cache Event Methods, Polish Last PR --- pom.xml | 17 +- src/main/java/com/loohp/limbo/Limbo.java | 45 +++--- .../com/loohp/limbo/events/EventHandler.java | 2 + .../com/loohp/limbo/events/EventPriority.java | 2 + .../com/loohp/limbo/events/EventsManager.java | 36 +++-- .../events/RegisteredCachedListener.java | 47 ++++++ .../loohp/limbo/file/ServerProperties.java | 25 +-- .../java/com/loohp/limbo/player/Player.java | 14 +- .../limbo/player/PlayerInteractManager.java | 4 +- .../loohp/limbo/server/ClientConnection.java | 151 ++++++++++++------ .../packets/PacketLoginInPluginMessaging.java | 19 ++- .../PacketLoginOutPluginMessaging.java | 6 +- .../packets/PacketPlayOutEntityMetadata.java | 4 +- .../loohp/limbo/utils/CheckedBiConsumer.java | 8 + .../loohp/limbo/utils/DeclareCommands.java | 2 +- .../java/com/loohp/limbo/world/World.java | 6 +- .../main/resources}/LimboDefaultCmd.jar | Bin src/main/resources/spawn.schem | Bin 0 -> 6609 bytes 18 files changed, 270 insertions(+), 118 deletions(-) create mode 100644 src/main/java/com/loohp/limbo/events/RegisteredCachedListener.java create mode 100644 src/main/java/com/loohp/limbo/utils/CheckedBiConsumer.java rename {modules => src/main/resources}/LimboDefaultCmd.jar (100%) create mode 100644 src/main/resources/spawn.schem 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 eventClass = (Class) 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 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 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 0000000000000000000000000000000000000000..0a800b50ce1b8fed7f9291330f03d7d4f3c24c9a GIT binary patch literal 6609 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 literal 0 HcmV?d00001