package pl.tinlink.rsutils.warp; import java.io.File; import java.io.IOException; import java.util.HashMap; import org.bukkit.Bukkit; import org.bukkit.ChatColor; import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.World; import org.bukkit.block.Sign; import org.bukkit.configuration.file.YamlConfiguration; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import org.bukkit.event.block.Action; import org.bukkit.event.block.BlockBreakEvent; import org.bukkit.event.block.SignChangeEvent; import org.bukkit.event.entity.PlayerDeathEvent; import org.bukkit.event.player.PlayerInteractEvent; import org.bukkit.event.player.PlayerQuitEvent; import pl.tinlink.rsutils.Main; import pl.tinlink.rsutils.exceptions.WarpNotFoundException; import pl.tinlink.rsutils.permissions.PermissionsResolver; public class Warp implements Listener{ private static HashMap last = new HashMap(); private final String warpsFolder = Main.instance.getDataFolder() + File.separator + "warps" + File.separator; private final String signsFile = Main.instance.getDataFolder() + File.separator + "signs.yml"; public void warp(Player player, String[] args){ PermissionsResolver per = new PermissionsResolver(player); if(per.hasPermission("rsutils.warp.teleport") || per.hasPermission("rsutils.warp.op") || player.isOp()){ if (args.length == 1){ try { Location loc = getWarp(args[0]); last.put(player, player.getLocation()); player.sendMessage(ChatColor.GREEN + "Teleportowanie..."+ (per.hasPermission("rsutils.warp.back")?" Wpisz /back, by powrócić do poprzedniej lokacji.":"")); player.teleport(loc); } catch (WarpNotFoundException e){ player.sendMessage(ChatColor.RED + "Podany warp nie istnieje!"); } } else if (args.length > 1){ player.sendMessage(ChatColor.RED + "Za dużo argumentów!"); } else if (args.length == 0) { player.sendMessage(ChatColor.RED + "Podaj warpa!"); } } else { player.sendMessage(ChatColor.RED + "Nie posiadasz permisji!"); } } /** * * @param name * @return * @throws WarpNotFoundException */ public Location getWarp(String name) throws WarpNotFoundException{ File[] files = new File(warpsFolder).listFiles(); if(files == null) throw new WarpNotFoundException(); for (File warp : files){ if (warp.getName().split("\\.")[0].equalsIgnoreCase(name)){ YamlConfiguration con = YamlConfiguration.loadConfiguration(warp); World world = Bukkit.getWorld(con.getString("world")); double x = con.getDouble("x"); double y = con.getDouble("y"); double z = con.getDouble("z"); float yaw = (float) con.getDouble("yaw"); float pitch = (float) con.getDouble("pitch"); Location loc = new Location(world, x, y, z, yaw, pitch); return loc; } } throw new WarpNotFoundException(); } public void createWarp(Player player, String[] args){ PermissionsResolver res = new PermissionsResolver(player); if (res.hasPermission("rsutils.warp.create") || res.hasPermission("rsutils.warp.op") || player.isOp()){ if (args.length ==1){ args[0] = args[0].toLowerCase(); new File(warpsFolder).mkdirs(); Location loc = player.getLocation(); File file = new File(warpsFolder + args[0] + ".yml"); YamlConfiguration con = YamlConfiguration.loadConfiguration(file); con.set("world", loc.getWorld().getName()); con.set("x", loc.getX()); con.set("y", loc.getY()); con.set("z", loc.getZ()); con.set("yaw", loc.getYaw()); con.set("pitch", loc.getPitch()); try { con.save(file); } catch (IOException e) { e.printStackTrace(); } player.sendMessage(ChatColor.GREEN + "Stworzono warpa!"); } else if (args.length > 1){ player.sendMessage(ChatColor.RED + "Za dużo argumentów!"); } else if (args.length == 0) { player.sendMessage(ChatColor.RED + "Podaj nazwę warpa!"); } } else { player.sendMessage(ChatColor.RED + "Nie posiadasz permisji!"); } } public void deleteWarp(Player player, String[] args){ PermissionsResolver per = new PermissionsResolver(player); if (per.hasPermission("rsutils.warp.delete") || per.hasPermission("rsutils.warp.op") || player.isOp()){ if (args.length == 1){ File[] files = new File(warpsFolder).listFiles(); for(File file : files){ if (file.getName().split("\\.")[0].equalsIgnoreCase(args[0])){ file.delete(); player.sendMessage(ChatColor.RED + "Warpa usunięto!"); return; } } } else if (args.length > 1){ player.sendMessage(ChatColor.RED + "Za dużo argumentów!"); } else if (args.length == 0) { player.sendMessage(ChatColor.RED + "Podaj nazwę warpa!"); } } else { player.sendMessage(ChatColor.RED + "Nie posiadasz permisji!"); } } public void back(Player player){ PermissionsResolver res = new PermissionsResolver(player); if (res.hasPermission("rsutils.warp.back") || res.hasPermission("rsutils.warp.op") || player.isOp()){ if (last.get(player) !=null){ Location loc = last.get(player); last.put(player, player.getLocation()); player.sendMessage(ChatColor.GREEN + "Teleportowanie do ostatniej lokalizacji..."); player.teleport(loc); } else { player.sendMessage(ChatColor.RED + "Nie posiadasz ostatniej lokalizacji!"); } } else { player.sendMessage(ChatColor.RED + "Nie posiadasz permisji!"); } } public void warpList(Player player){ PermissionsResolver per = new PermissionsResolver(player); if(per.hasPermission("rsutils.warp.teleport") || per.hasPermission("rsutils.warp.op") || player.isOp()){ File[] files = new File(warpsFolder).listFiles(); String all = ""; for (File file : files){ all = all + ChatColor.GOLD + ChatColor.BOLD + file.getName().split("\\.")[0] + ChatColor.RESET + ChatColor.GRAY + ", "; } player.sendMessage(ChatColor.AQUA + "Warpy: " + all); } else { player.sendMessage(ChatColor.RED + "Nie posiadasz permisji!"); } } @EventHandler public void onPlayerQuit(PlayerQuitEvent e){ last.remove(e.getPlayer()); } @EventHandler public void onPlayerDeath(PlayerDeathEvent e){ PermissionsResolver per = new PermissionsResolver(e.getEntity()); if (per.hasPermission("rsutils.warp.back") || per.hasPermission("rsutils.warp.op") || e.getEntity().isOp()){ last.put(e.getEntity(), e.getEntity().getLocation()); e.getEntity().sendMessage(ChatColor.GREEN + "Zginąłeś. Wpisz /back by powrócić na miejsce śmierci"); } } @EventHandler public void onPlayerSetSign(SignChangeEvent e){ if(e.getLine(0).equals("[warp]")){ PermissionsResolver per = new PermissionsResolver(e.getPlayer()); if (per.hasPermission("rsutils.warp.createsign") || e.getPlayer().isOp()){ if (e.getLine(1) != null){ File[] files = new File(warpsFolder).listFiles(); for(File file : files){ if(file.getName().split("\\.")[0].equalsIgnoreCase(e.getLine(1))){ File fil = new File(signsFile); YamlConfiguration con = YamlConfiguration.loadConfiguration(fil); Location lo = e.getBlock().getLocation(); e.setLine(0, "[" + ChatColor.GREEN + "warp" + ChatColor.RESET + "]"); con.set("signs." + lo.hashCode(), e.getLine(1)); try { con.save(fil); } catch (IOException e1) { e1.printStackTrace(); } e.getPlayer().sendMessage(ChatColor.GREEN + "Stworzono tabliczkę z warpem!"); } } } } else { e.getPlayer().sendMessage(ChatColor.RED + "Nie masz permisji by stworzyć tabliczkowego warpa!"); } } } @EventHandler public void onPlayerClickSign(PlayerInteractEvent e){ if((e.getAction() == Action.RIGHT_CLICK_BLOCK)) { if (e.getClickedBlock().getType() == Material.SIGN_POST || e.getClickedBlock().getType() == Material.WALL_SIGN){ e.setCancelled(true); Sign sign = (Sign) e.getClickedBlock().getState(); if(sign.getLine(0).equals("[" + ChatColor.GREEN + "warp" + ChatColor.RESET + "]")){ Player player = e.getPlayer(); warp(player, new String[]{sign.getLine(1)}); } } } } @EventHandler public void onDestroyEvent(BlockBreakEvent e){ if(e.getBlock().getType() == Material.SIGN_POST || e.getBlock().getType() == Material.WALL_SIGN){ Sign sign = (Sign) e.getBlock().getState(); if(sign.getLine(0).equals("[" + ChatColor.GREEN + "warp" + ChatColor.RESET + "]")){ File file = new File(signsFile); YamlConfiguration con = YamlConfiguration.loadConfiguration(file); con.set("signs."+e.getBlock().getLocation().hashCode(), null); try { con.save(file); } catch (IOException e1) { e1.printStackTrace(); } e.getPlayer().sendMessage(ChatColor.GREEN + "Zniszczono tabliczkę z warpem!"); } } } }