package net.diamonddominion.esaych.global; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.util.ArrayList; import java.util.HashMap; import java.util.Map; import net.diamonddominion.esaych.CustomPlugin; import net.diamonddominion.esaych.util.SQL; import org.bukkit.Bukkit; import org.bukkit.ChatColor; import org.bukkit.Location; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; import org.bukkit.event.player.PlayerJoinEvent; public class Homes { private CustomPlugin plugin; public Homes(CustomPlugin plugin) { this.plugin = plugin; } public void enable() { log("Enabled"); } public boolean onCommand(CommandSender sender, String label, String[] args) { if (!(sender instanceof Player)) { log("idgaf"); return true; } Player player = (Player) sender; if (player.getWorld().getName().equals("EventWorld")) { msg(player, "You can't use homes in the EventWorld"); return true; } String homeName; if (args.length == 0) homeName = "home"; else homeName = args[0]; int amountOfHomes = getHomesAmount(player); //sethome, delhome, home, homes if (label.equalsIgnoreCase("sethome")) { if (amountOfHomes > getHomesList(player).size() || amountOfHomes == -1) { addHome(player, homeName, player.getLocation()); } else { msg(player, "You have exceeded your maximum of " + amountOfHomes + " homes."); } return true; } else if (label.equalsIgnoreCase("delhome")) { if (getHomesList(player).contains(homeName)) { delHome(player, homeName); } else { msg(player, "Your home '" + homeName + "' does not exist!"); } return true; } else if (label.equalsIgnoreCase("home")) { teleportPlayer(player, getHomeLocation(player, homeName)); return true; } else if (label.equalsIgnoreCase("homes")) { msg(player, "Your current homes list:"); for (String home : getHomesList(player)) { player.sendMessage(" - " + ChatColor.AQUA + home); } return true; } return false; } Map<String, String> toTp = new HashMap<String, String>(); public void onBungeeMessageReceived(String channel, Player player, byte[] message) { DataInputStream in = new DataInputStream(new ByteArrayInputStream(message)); String subchannel = null; try { subchannel = in.readUTF(); } catch (IOException e) { log("Could not read plugin message"); e.printStackTrace(); } if (subchannel.equals("DDCustomPlugin_Homes")) { try { short len = in.readShort(); byte[] msgbytes = new byte[len]; in.readFully(msgbytes); DataInputStream msgin = new DataInputStream(new ByteArrayInputStream(msgbytes)); String playerName = msgin.readUTF(); String location = msgin.readUTF(); // log(location + "; " + playerName); ArrayList<String> onlinePlayers = new ArrayList<String>(); for (Player onlineplayer : Bukkit.getOnlinePlayers()) { onlinePlayers.add(onlineplayer.getName()); } if (onlinePlayers.contains(playerName)) { teleportPlayer(Bukkit.getPlayer(playerName), location); } else { toTp.put(playerName, location); } } catch (Exception e) {} } } public void onJoinEvent(PlayerJoinEvent event) { String name = event.getPlayer().getName(); if (toTp.containsKey(name)) { teleportPlayer(event.getPlayer(), toTp.get(name)); toTp.remove(name); } } private ArrayList<String> getHomesList(Player player) { ArrayList<String> homes = new ArrayList<String>(); ResultSet result = null; Connection con = null; try { con = SQL.getConnection(); Statement st = (Statement) con.createStatement(); result = st.executeQuery("SELECT `home_name` FROM BungeeHomes WHERE `player`='" + player.getName() + "';"); while (result.next()) { homes.add(result.getString("home_name")); } } catch (SQLException e) { e.printStackTrace(); } return homes; } private void teleportPlayer(Player player, String location) { // log("TP: " + player.getName() + ": " + location); String[] array = location.split(";"); if (array.length == 0) { msg(player, "The location for this home is blank."); return; } if (getServerWorld(array[0]).equals(plugin.detectedServer())) { Location loc = new Location(Bukkit.getWorld(array[0]), Double.parseDouble(array[1]), Double.parseDouble(array[2]), Double.parseDouble(array[3]), Float.parseFloat(array[5]), Float.parseFloat(array[4])); if (loc.getWorld() == null) { msg(player, "The location for this home has a world that is unavailable"); return; } player.teleport(loc); // msg(player, "You have been teleported to your home"); } else { String server = getServerWorld(array[0]); if (server.equals("")) { msg(player, "The location for this home refers to a server that doesn't exist."); return; } ByteArrayOutputStream b = new ByteArrayOutputStream(); DataOutputStream out = new DataOutputStream(b); try { out.writeUTF("Forward"); out.writeUTF("ALL"); out.writeUTF("DDCustomPlugin_Homes"); ByteArrayOutputStream msgbytes = new ByteArrayOutputStream(); DataOutputStream msgout = new DataOutputStream(msgbytes); msgout.writeUTF(player.getName()); msgout.writeUTF(location); out.writeShort(msgbytes.toByteArray().length); out.write(msgbytes.toByteArray()); player.sendPluginMessage(plugin, "BungeeCord", b.toByteArray()); b = new ByteArrayOutputStream(); out = new DataOutputStream(b); out.writeUTF("Connect"); out.writeUTF(server); } catch (IOException e) { e.printStackTrace(); } player.sendPluginMessage(plugin, "BungeeCord", b.toByteArray()); } } private String getServerWorld(String world) { if (world.equals("Survival") || world.equals("TownWorld") || world.equals("End") || world.equals("Nether")) return "survival"; if (world.equals("EventWorld")) return "events"; if (world.equals("Build")) return "creative"; if (world.equals("Destruction")) return "destruction"; if (world.equals("SkyBlock")) return "skyblock"; return ""; } private String getHomeLocation(Player player, String homeName) { //Location string is WORLD;X;Y;Z;YAW;PITCH String location = ""; ResultSet result = null; Connection con = null; try { con = SQL.getConnection(); Statement st = (Statement) con.createStatement(); result = st.executeQuery("SELECT * FROM `BungeeHomes` WHERE `player`='" + player.getName() + "' && `home_name`='" + homeName + "';"); while (result.next()) { location += result.getString("world") + ";"; location += result.getString("x") + ";"; location += result.getString("y") + ";"; location += result.getString("z") + ";"; location += result.getString("yaw") + ";"; location += result.getString("pitch"); } } catch (SQLException e) { e.printStackTrace(); } return location; } private void addHome(Player player, String homeName, Location homeLoc) { SQL.singleQuery("DELETE FROM `BungeeHomes` WHERE `player`='" + player.getName() + "' && `home_name`='" + homeName + "';"); SQL.singleQuery("INSERT INTO `BungeeHomes` (`player`, `home_name`, `server`, `world`, `x`, `y`, `z`, `yaw`, `pitch`) VALUES " + "('" + player.getName() + "', '" + homeName + "', '" + plugin.detectedServer() + "', '" + homeLoc.getWorld().getName() + "', " + homeLoc.getX() + ", " + homeLoc.getY() + ", " + homeLoc.getZ() + ", " + homeLoc.getYaw() + ", " + homeLoc.getPitch() + ");"); msg(player, "Home set"); } private void delHome(Player player, String homeName) { SQL.singleQuery("DELETE FROM `BungeeHomes` WHERE `player`='" + player.getName() + "' && `home_name`='" + homeName + "';"); msg(player, "Home deleted"); } private int getHomesAmount(Player player) { @SuppressWarnings("static-access") String rank = plugin.chat.perms.getPlayerGroups(player)[0]; if (rank.contains("Player")) return 5; if (rank.contains("YouTuber")) return 5; if (rank.contains("Respected")) return 5; if (rank.contains("Assistant")) return 5; if (rank.contains("VIP")) return 10; if (rank.contains("Premium")) return 15; if (rank.contains("Elite")) return 25; if (rank.contains("Exclusive")) return 30; if (rank.contains("Ultimate")) return 50; if (rank.contains("DemiGod")) return -1; if (rank.contains("Mod")) return 10; if (rank.contains("VIMod")) return 20; if (rank.contains("PMod")) return 25; if (rank.contains("EMod")) return 35; if (rank.contains("ExMod")) return 40; if (rank.contains("UMod")) return 60; if (rank.contains("DGMod")) return -1; if (rank.contains("HeadMod")) return 100; if (rank.contains("Admin")) return -1; if (rank.contains("HeadAdmin")) return -1; if (rank.contains("Owner")) return -1; return 5; } private void msg(Player player, String msg) { player.sendMessage(ChatColor.DARK_BLUE + "[" + ChatColor.WHITE + "DDHomes" + ChatColor.DARK_BLUE + "] " + ChatColor.GREEN + msg); } public void log(String info) { plugin.getLogger().info("<Homes> " + info); } }