package lilypad.bukkit.connect; import lilypad.bukkit.connect.hooks.SpigotHook; import lilypad.bukkit.connect.injector.HandlerListInjector; import lilypad.bukkit.connect.injector.NettyInjector; import lilypad.bukkit.connect.injector.OfflineInjector; import lilypad.bukkit.connect.injector.PacketInjector; import lilypad.bukkit.connect.login.LoginListener; import lilypad.bukkit.connect.login.LoginNettyInjectHandler; import lilypad.bukkit.connect.login.LoginPayloadCache; import lilypad.bukkit.connect.protocol.IProtocol; import lilypad.bukkit.connect.protocol.Protocol1_10_R1; import lilypad.bukkit.connect.protocol.Protocol1_11_R1; import lilypad.bukkit.connect.protocol.Protocol1_8_R1; import lilypad.bukkit.connect.protocol.Protocol1_8_R2; import lilypad.bukkit.connect.protocol.Protocol1_9_R1; import lilypad.bukkit.connect.protocol.Protocol1_9_R2; import lilypad.bukkit.connect.util.ReflectionUtils; import lilypad.client.connect.api.Connect; import lilypad.client.connect.lib.ConnectImpl; import org.bukkit.configuration.file.YamlConfiguration; import org.bukkit.event.player.AsyncPlayerPreLoginEvent; import org.bukkit.event.player.PlayerLoginEvent; import org.bukkit.plugin.ServicePriority; import org.bukkit.plugin.java.JavaPlugin; import java.net.InetSocketAddress; public class ConnectPlugin extends JavaPlugin { private LoginPayloadCache payloadCache = new LoginPayloadCache(); private SpigotHook spigotHook = new SpigotHook(); private Connect connect; private ConnectThread connectThread; private String securityKey; private int commonPort; private static IProtocol protocol; @Override public void onLoad() { super.getConfig().options().copyDefaults(true); super.saveConfig(); super.reloadConfig(); } @Override public void onEnable() { String version = super.getServer().getClass().getPackage().getName().replace(".", ",").split(",")[3]; switch (version) { case "v1_8_R1": protocol = new Protocol1_8_R1(); break; case "v1_8_R2": case "v1_8_R3": protocol = new Protocol1_8_R2(); break; case "v1_9_R1": protocol = new Protocol1_9_R1(); break; case "v1_9_R2": protocol = new Protocol1_9_R2(); break; case "v1_10_R1": protocol = new Protocol1_10_R1(); break; case "v1_11_R1": protocol = new Protocol1_11_R1(); break; default: System.out.println("[Connect] Unable to start plugin - unsupported version (" + version + "). Please retrieve the newest version at http://lilypadmc.org"); return; } try { // Modify handshake packet max string size // -- as of 1.8 I do not believe this is necessary anymore /*if (!protocol.getGeneralVersion().equals("1.10")) { PacketInjector.injectStringMaxSize(super.getServer(), "handshaking", 0x00, 65535); }*/ // Handle LilyPad handshake packet commonPort = NettyInjector.injectAndFindPort(super.getServer(), new LoginNettyInjectHandler(this, payloadCache)); // If we are in online-mode if (super.getServer().getOnlineMode()) { // Prioritize our events HandlerListInjector.prioritize(this, AsyncPlayerPreLoginEvent.class); HandlerListInjector.prioritize(this, PlayerLoginEvent.class); // Pseudo offline mode OfflineInjector.inject(super.getServer()); } } catch(Exception exception) { exception.printStackTrace(); System.out.println("[Connect] Unable to start plugin - unsupported version?"); return; } this.connect = new ConnectImpl(new ConnectSettingsImpl(super.getConfig()), this.getInboundAddress().getAddress().getHostAddress()); this.connectThread = new ConnectThread(this); super.getServer().getServicesManager().register(Connect.class, this.connect, this, ServicePriority.Normal); super.getServer().getPluginManager().registerEvents(new LoginListener(this, payloadCache), this); super.getServer().getScheduler().runTask(this, new Runnable() { public void run() { try { // Connection Throttle Object craftServer = ConnectPlugin.super.getServer(); YamlConfiguration configuration = ReflectionUtils.getPrivateField(craftServer.getClass(), craftServer, YamlConfiguration.class, "configuration"); configuration.set("settings.connection-throttle", 0); // Start ConnectPlugin.this.connectThread.start(); } catch(Exception exception) { exception.printStackTrace(); System.out.println("[Connect] Unable to start plugin - unsupported version?"); } } }); } @Override public void onDisable() { try { if (this.connectThread != null) { this.connectThread.stop(); } if (this.connect != null) { this.connect.close(); } } catch(Exception exception) { exception.printStackTrace(); } finally { this.connect = null; this.connectThread = null; protocol = null; } } public InetSocketAddress getInboundAddress() { String ip = super.getServer().getIp(); if (ip.isEmpty()) { ip = "0.0.0.0"; } int port = super.getServer().getPort(); if (port == 0) { port = this.commonPort; } return new InetSocketAddress(ip, port); } public Connect getConnect() { return this.connect; } public String getSecurityKey() { return this.securityKey; } public void setSecurityKey(String securityKey) { this.securityKey = securityKey; } public SpigotHook getSpigotHook() { return this.spigotHook; } public static IProtocol getProtocol() { return protocol; } }