diff --git a/src/de/anura/core/API/Core.java b/src/de/anura/core/API/Core.java index 83677e7..8f07c46 100644 --- a/src/de/anura/core/API/Core.java +++ b/src/de/anura/core/API/Core.java @@ -1,6 +1,8 @@ package de.anura.core.API; import de.anura.core.AnuraCore; +import java.io.ByteArrayOutputStream; +import java.io.DataOutputStream; import java.sql.ResultSet; import java.util.HashMap; import java.util.Map; @@ -241,4 +243,16 @@ public class Core { public static Level getLevel() { return getMainClass().level; } + + public static void kickToLobby(Player P) { + try { + ByteArrayOutputStream b = new ByteArrayOutputStream(); + DataOutputStream out = new DataOutputStream(b); + out.writeUTF("Connect"); + out.writeUTF("lobby"); + P.sendPluginMessage(getMainClass(), "BungeeCord", b.toByteArray()); + } catch (Throwable ex) { + Errors.reportException(ex); + } + } } diff --git a/src/de/anura/core/AnuraCore.java b/src/de/anura/core/AnuraCore.java index b59a9a1..b0dd651 100644 --- a/src/de/anura/core/AnuraCore.java +++ b/src/de/anura/core/AnuraCore.java @@ -70,6 +70,7 @@ public class AnuraCore extends JavaPlugin { Setup.setupTasks(); Setup.setupCommands(); this.getServer().getMessenger().registerIncomingPluginChannel(this, "BungeeCord", signs); + this.getServer().getMessenger().registerIncomingPluginChannel(this, "BungeeCord", new Teleports()); sql.queryUpdate("DELETE FROM coreServers WHERE name = '" + this.getConfig().getString("server-name") + "'"); sql.queryUpdate("INSERT INTO coreServers (name, maxPlayers) VALUES ('" + this.getConfig().getString("server-name") + "','" + this.getServer().getMaxPlayers() + "')"); } else { diff --git a/src/de/anura/core/Setup.java b/src/de/anura/core/Setup.java index 3dd0cf3..9ee16f4 100644 --- a/src/de/anura/core/Setup.java +++ b/src/de/anura/core/Setup.java @@ -216,6 +216,7 @@ public class Setup { Core.getMainClass().getCommand("toggleboat").setExecutor(pc); Core.getMainClass().getCommand("toggleboatflight").setExecutor(tc); Core.getMainClass().getCommand("bug").setExecutor(pc); + Core.getMainClass().getCommand("warplist").setExecutor(tc); } private static void setupInventories() { diff --git a/src/de/anura/core/Teleports.java b/src/de/anura/core/Teleports.java new file mode 100644 index 0000000..e04418b --- /dev/null +++ b/src/de/anura/core/Teleports.java @@ -0,0 +1,81 @@ +package de.anura.core; + +import de.anura.core.API.Errors; +import java.io.ByteArrayInputStream; +import java.io.DataInputStream; +import java.util.HashMap; +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.World; +import org.bukkit.entity.Player; +import org.bukkit.plugin.messaging.PluginMessageListener; + +public class Teleports implements PluginMessageListener { + + public final static HashMap queuedLocs = new HashMap<>(); + + @Override + public void onPluginMessageReceived(String channel, Player player, byte[] bytes) { + try { + if (!channel.equalsIgnoreCase("BungeeCord")) { + return; + } + DataInputStream in = new DataInputStream(new ByteArrayInputStream(bytes)); + String subchannel = in.readUTF(); + if (subchannel.equalsIgnoreCase("teleport")) { + String subsubChannel = in.readUTF(); + switch (subsubChannel) { + case "player": + String p = in.readUTF(); + String tar = in.readUTF(); + Player P = Bukkit.getPlayer(p); + Player target = Bukkit.getPlayer(tar); + if (target == null) return; + if (P == null) { + queuedLocs.put(p, target.getLocation()); + return; + } + P.teleport(target); + break; + case "coords": + String p2 = in.readUTF(); + int x = in.readInt(); + int y = in.readInt(); + int z = in.readInt(); + Player P2 = Bukkit.getPlayer(p2); + String mode = in.readUTF(); + Location loc; + if (mode.equalsIgnoreCase("main-world")) { + loc = new Location(Bukkit.getWorlds().get(0), x, y, z); + } else { + loc = new Location(P2.getWorld(), x, y, z); + } + if (P2 == null) { + queuedLocs.put(p2, loc); + } else { + P2.teleport(loc); + } + break; + case "worldcoords": + String p3 = in.readUTF(); + int X = in.readInt(); + int Y = in.readInt(); + int Z = in.readInt(); + Player P3 = Bukkit.getPlayer(p3); + String world = in.readUTF(); + World w = Bukkit.getWorld(world); + if (w == null) return; + Location l = new Location(w, X, Y, Z); + if (P3 == null) { + queuedLocs.put(p3, l); + } else { + P3.teleport(l); + } + break; + } + } + } catch (Throwable ex) { + Errors.reportException(ex); + } + } +} diff --git a/src/de/anura/core/commands/TeamCommands.java b/src/de/anura/core/commands/TeamCommands.java index 5ee7847..bb7aa12 100644 --- a/src/de/anura/core/commands/TeamCommands.java +++ b/src/de/anura/core/commands/TeamCommands.java @@ -319,6 +319,13 @@ public class TeamCommands implements CommandExecutor { Core.statusMsg(P, "no_perms", false); return true; } + } else if (cmd.getName().equalsIgnoreCase("warplist")) { + if (P == null) return false; + ResultSet rs = Core.getMySql().querySelect("SELECT name, userWarp FROM coreWarps WHERE server = '" + Core.getMainClass().getConfig().getString("server-name") + "'"); + while (rs.next()) { + Bukkit.dispatchCommand(Bukkit.getConsoleSender(), "tellraw " + P.getName() + " {color:\"" + (rs.getBoolean("userWarp") ? "green" : "blue") + "\",text:\"" + rs.getString("name") + "\",clickEvent:{action:run_command,value:\"/warp " + rs.getString("name") + "\"}}"); + } + return true; } } catch(Throwable e) { Errors.reportException(e); diff --git a/src/de/anura/core/events/PlayerInteract.java b/src/de/anura/core/events/PlayerInteract.java index 5a6b498..88ed03a 100644 --- a/src/de/anura/core/events/PlayerInteract.java +++ b/src/de/anura/core/events/PlayerInteract.java @@ -161,6 +161,8 @@ public class PlayerInteract implements Listener { cancelled = false; } else if (event.getPlayer().getItemInHand().getType().equals(Material.EXP_BOTTLE)) { cancelled = false; + } else if (event.getPlayer().getItemInHand().getType().equals(Material.ENDER_PEARL)) { + cancelled = false; } } event.setCancelled(cancelled); diff --git a/src/de/anura/core/events/PlayerJoin.java b/src/de/anura/core/events/PlayerJoin.java index eb277c8..dd9462b 100644 --- a/src/de/anura/core/events/PlayerJoin.java +++ b/src/de/anura/core/events/PlayerJoin.java @@ -3,6 +3,7 @@ package de.anura.core.events; import de.anura.core.API.Core; import de.anura.core.API.Errors; import de.anura.core.AnuraCore; +import de.anura.core.Teleports; import java.sql.ResultSet; import java.util.UUID; @@ -24,7 +25,11 @@ public class PlayerJoin implements Listener { ResultSet rs; rs = AnuraCore.getSql().querySelect("SELECT name FROM players WHERE uuid LIKE '" + uuid.toString() + "'"); if (rs == null) { - event.getPlayer().kickPlayer("Please try again"); + if (plugin.getConfig().getBoolean("is-main-lobby")) { + event.getPlayer().kickPlayer("Please try again"); + } else { + Core.kickToLobby(event.getPlayer()); + } event.setJoinMessage(null); return; } @@ -44,6 +49,11 @@ public class PlayerJoin implements Listener { if (plugin.getConfig().getBoolean("on-join-to-spawn")) { event.getPlayer().teleport(event.getPlayer().getWorld().getSpawnLocation()); } + String name = event.getPlayer().getName(); + if (Teleports.queuedLocs.containsKey(name)) { + event.getPlayer().teleport(Teleports.queuedLocs.get(name)); + Teleports.queuedLocs.remove(name); + } } catch(Throwable e) { Errors.reportException(e); } diff --git a/src/plugin.yml b/src/plugin.yml index 08cc2c9..89080fc 100644 --- a/src/plugin.yml +++ b/src/plugin.yml @@ -90,4 +90,7 @@ commands: usage: / bug: description: Reports a bug and collects some server specific server data - usage: / ... \ No newline at end of file + usage: / ... + warplist: + description: Prints a list of warps + usage: / \ No newline at end of file