package ovh.mxg.cubetp; import org.bukkit.*; import org.bukkit.block.Block; import org.bukkit.block.BlockState; import org.bukkit.block.Sign; import org.bukkit.block.sign.Side; import org.bukkit.block.sign.SignSide; import org.bukkit.entity.HumanEntity; import org.bukkit.entity.Item; 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.EntityDamageByEntityEvent; import org.bukkit.event.entity.ProjectileHitEvent; import org.bukkit.event.inventory.InventoryClickEvent; import org.bukkit.event.inventory.InventoryCloseEvent; import org.bukkit.event.player.AsyncPlayerChatEvent; import org.bukkit.event.player.PlayerEggThrowEvent; import org.bukkit.event.player.PlayerInteractEntityEvent; import org.bukkit.event.player.PlayerInteractEvent; import org.bukkit.inventory.EquipmentSlot; import org.bukkit.inventory.Inventory; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.MainHand; import org.bukkit.inventory.meta.ItemMeta; import org.bukkit.plugin.java.JavaPlugin; import java.io.File; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.text.MessageFormat; import java.util.ArrayList; import java.util.Arrays; import java.util.Random; public final class CubeTP extends JavaPlugin implements Listener { public static String host; public static String port; public static String database; public static String username; public static String password; public static Material cubeTP; public static Material tomePortalReagent; Inventory inv = null; Location clickedCubeLoc; Block clickedBlock; String curCubeName = ""; boolean curCubePrivate = false; boolean inCubeTPInventory = false; double curCubeX = 0; double curCubeY = 0; double curCubeZ = 0; @Override public void onEnable() { getServer().getPluginManager().registerEvents(this,this); //Config File f = new File("plugins/CubeTP/config.yml"); if(!f.exists()) { saveDefaultConfig(); } getLogger().info("Loading config..."); host = getConfig().getString("CubeTP.sqlHost"); port = getConfig().getString("CubeTP.sqlPort"); database = getConfig().getString("CubeTP.sqlDB"); username = getConfig().getString("CubeTP.sqlUser"); password = getConfig().getString("CubeTP.sqlPass"); cubeTP = Material.valueOf(getConfig().getString("CubeTP.cubeMaterial")); tomePortalReagent = Material.valueOf(getConfig().getString("CubeTP.tomePortalReagent")); getLogger().info("Enabled!"); } @EventHandler public void PlayerInteractEvent(PlayerInteractEvent event) throws SQLException { clickedBlock = event.getClickedBlock(); Player player = event.getPlayer(); Action action = event.getAction(); if(event.getHand() == EquipmentSlot.HAND){ if (clickedBlock == null) return; World world = player.getWorld(); Block block = world.getBlockAt(clickedBlock.getLocation().getBlockX(), clickedBlock.getLocation().getBlockY()+1, clickedBlock.getLocation().getBlockZ()); if(action == Action.RIGHT_CLICK_BLOCK && clickedBlock.getType() == cubeTP && block.getState() instanceof Sign){ clickedCubeLoc = clickedBlock.getLocation(); world = getServer().getWorld("world"); block = world.getBlockAt(clickedBlock.getLocation().getBlockX(), clickedBlock.getLocation().getBlockY()+1, clickedBlock.getLocation().getBlockZ()); BlockState state = block.getState(); Sign sign = (Sign) state; SignSide sside = sign.getSide(Side.FRONT); curCubeName = sside.getLine(0); if(!sside.getLine(1).isEmpty()){ curCubePrivate = true; } else { curCubePrivate = false; } curCubeX = clickedBlock.getLocation().getBlockX(); curCubeY = clickedBlock.getLocation().getBlockY(); curCubeZ = clickedBlock.getLocation().getBlockZ(); inCubeTPInventory = true; ShowUI(player); } if(action == Action.RIGHT_CLICK_BLOCK){ ItemStack mhi = player.getInventory().getItemInMainHand(); if(mhi.getItemMeta() != null){ String mainhand = mhi.getItemMeta().getDisplayName(); if(mainhand.equals("Tome de portail")){ inCubeTPInventory = true; ShowUIPortal(player); mhi.setAmount(0); } } } } } @EventHandler public void onInventoryClick(final InventoryClickEvent e) throws SQLException { if(inCubeTPInventory){ e.setCancelled(true); if (!e.isLeftClick()) return; final ItemStack clickedItem = e.getCurrentItem(); // verify current item is not null if (clickedItem == null || clickedItem.getType().isAir()) return; final Player p = (Player) e.getWhoClicked(); // register the cube if (e.getRawSlot() == 3){ if(SQL.CheckCubeNameExists(curCubeName)){ p.sendMessage(MessageFormat.format("§bLe cube {0} existe déjà. Changez le nom.", curCubeName)); } else { if(curCubePrivate){ SQL.AddCube(curCubeName, curCubeX, curCubeY, curCubeZ, p.getUniqueId().toString()); } else { SQL.AddCube(curCubeName, curCubeX, curCubeY, curCubeZ, null); } p.sendMessage(MessageFormat.format("§bLe cube {0} a été ajouté.", curCubeName)); ShowUI(p); } inCubeTPInventory = false; } // create a tome of portal from a book if (e.getRawSlot() == 4){ Inventory pinv = p.getInventory(); if(HaveBook(p)){ TakeBook(p); pinv.addItem(createGuiItem(Material.ENCHANTED_BOOK, "Tome de portail", "Permets d'aller vers un cube, pas de revenir.")); } else { p.sendMessage("§bVous devez posséder un livre pour créer cet objet."); } inCubeTPInventory = false; } // unregister a cube if (e.getRawSlot() == 5){ if(SQL.CheckCubeNameExists(curCubeName)){ SQL.DeleteCubeByName(curCubeName); p.sendMessage(MessageFormat.format("§bLe cube {0} a été supprimé.", curCubeName)); ShowUI(p); } else { p.sendMessage(MessageFormat.format("§bLe cube {0} n'existe pas.", curCubeName)); } inCubeTPInventory = false; } // tp to a remote cube if (e.getRawSlot() >= 9){ String name = e.getCurrentItem().getItemMeta().getDisplayName(); CubeTP(p,name); inCubeTPInventory = false; } } } @EventHandler public void InventoryCloseEvent(final InventoryCloseEvent e) throws SQLException { inCubeTPInventory = false; } @EventHandler public void onBlockBreakWithSignOnIt(BlockBreakEvent event){ } @EventHandler public void onBlockBreak(BlockBreakEvent event) throws SQLException { final Player p = event.getPlayer(); Block block = event.getBlock(); if(block.getState() instanceof Sign){ BlockState state = block.getState(); Sign sign = (Sign) state; SignSide sside = sign.getSide(Side.FRONT); double x = block.getX(); double y = block.getY()-1; double z = block.getZ(); if(SQL.CheckCubeByLocation(x, y, z)){ String st = sside.getLine(0); SQL.DeleteCubeByName(st); Block cb = p.getWorld().getBlockAt(block.getX(),block.getY()-1, block.getZ()); cb.setType(Material.AIR); ItemStack item = new ItemStack(cubeTP, 1); p.getWorld().dropItem(p.getLocation(), item); } } if(block.getType() == Material.GOLD_BLOCK){ double x = block.getX(); double y = block.getY(); double z = block.getZ(); if(SQL.CheckCubeByLocation(x, y, z)){ Block sb = p.getWorld().getBlockAt(block.getX(),block.getY()+1, block.getZ()); BlockState state = sb.getState(); Sign sign = (Sign) state; SignSide sside = sign.getSide(Side.FRONT); String st = sside.getLine(0); SQL.DeleteCubeByName(st); sb.setType(Material.AIR); ItemStack item = new ItemStack(Material.OAK_SIGN, 1); p.getWorld().dropItem(p.getLocation(), item); } } } @EventHandler public void onPlayerChat(AsyncPlayerChatEvent event){ } public boolean HaveBook(Player player){ boolean hb = false; Inventory pinv = player.getInventory(); for(ItemStack i: pinv){ if(i != null){ if(i.getType() == tomePortalReagent){ hb = true; } } } return hb; } public void TakeBook(Player player){ int ba = 0; Inventory pinv = player.getInventory(); for(ItemStack i: pinv){ if(i != null){ if(i.getType() == tomePortalReagent){ ba = i.getAmount(); i.setAmount(ba-1); } } } } public void ShowUI(Player player) throws SQLException { inv = Bukkit.createInventory(null, 45, "CubeTP"); World world = getServer().getWorld("world"); Block block = world.getBlockAt(clickedBlock.getLocation().getBlockX(), clickedBlock.getLocation().getBlockY()+1, clickedBlock.getLocation().getBlockZ()); BlockState state = block.getState(); Sign sign = (Sign) state; SignSide sside = sign.getSide(Side.FRONT); String lore01 = MessageFormat.format("{0}", sside.getLine(0)); String lore02 = MessageFormat.format("x{0} y{1} z{2}", clickedBlock.getLocation().getBlockX(), clickedBlock.getLocation().getBlockY(), clickedBlock.getLocation().getBlockZ()); inv.setItem(0,createGuiItem(Material.BLACK_WOOL, " ")); inv.setItem(1,createGuiItem(Material.BLACK_WOOL, " ")); inv.setItem(2,createGuiItem(Material.BLACK_WOOL, " ")); inv.setItem(3,createGuiItem(Material.CYAN_WOOL, "§bEnregistrer", lore01, lore02)); inv.setItem(4,createGuiItem(Material.CYAN_WOOL, "§bTome de portail")); inv.setItem(5,createGuiItem(Material.CYAN_WOOL, "§bRetirer")); inv.setItem(6,createGuiItem(Material.BLACK_WOOL, " ")); inv.setItem(7,createGuiItem(Material.BLACK_WOOL, " ")); inv.setItem(8,createGuiItem(Material.BLACK_WOOL, " ")); AddAllCubes(player); player.openInventory(inv); } public void ShowUIPortal(Player player) throws SQLException { inv = Bukkit.createInventory(null, 45, "CubeTP"); inv.setItem(0,createGuiItem(Material.BLACK_WOOL, " ")); inv.setItem(1,createGuiItem(Material.BLACK_WOOL, " ")); inv.setItem(2,createGuiItem(Material.BLACK_WOOL, " ")); inv.setItem(3,createGuiItem(Material.BLACK_WOOL, " ")); inv.setItem(4,createGuiItem(Material.BLACK_WOOL, " ")); inv.setItem(5,createGuiItem(Material.BLACK_WOOL, " ")); inv.setItem(6,createGuiItem(Material.BLACK_WOOL, " ")); inv.setItem(7,createGuiItem(Material.BLACK_WOOL, " ")); inv.setItem(8,createGuiItem(Material.BLACK_WOOL, " ")); AddAllCubes(player); player.openInventory(inv); } public void AddAllCubes(Player player) throws SQLException { String uuid = player.getUniqueId().toString(); SQL.connect(); PreparedStatement ps = SQL.getConnection().prepareStatement("SELECT * FROM cubetp WHERE uuid IS NULL"); ResultSet rs = ps.executeQuery(); int slot = 9; while(rs != null && rs.next()) { String lore01 = MessageFormat.format("x{0} y{1} z{2}", rs.getDouble("x"), rs.getDouble("y"), rs.getDouble("z")); inv.setItem(slot,createGuiItem(Material.GREEN_WOOL, rs.getString("name"), lore01)); slot++; } PreparedStatement psp = SQL.getConnection().prepareStatement("SELECT * FROM cubetp WHERE uuid IS NOT NULL AND uuid = ?"); psp.setString(1, uuid); ResultSet rsp = psp.executeQuery(); while(rsp != null && rsp.next()) { String lore01 = MessageFormat.format("x{0} y{1} z{2}", rsp.getDouble("x"), rsp.getDouble("y"), rsp.getDouble("z")); inv.setItem(slot,createGuiItem(Material.ORANGE_WOOL, rsp.getString("name"), lore01)); slot++; } } public void CubeTP(Player player, String name) throws SQLException { SQL.connect(); PreparedStatement ps = SQL.getConnection().prepareStatement("SELECT * FROM cubetp WHERE name = ?"); ps.setString(1, name); ResultSet rs = ps.executeQuery(); int slot = 9; if(rs.next()) { Location loc = new Location(player.getWorld(), rs.getDouble("x"),rs.getDouble("y"),rs.getDouble("z"), 0, 0); player.teleport(loc); } } protected ItemStack createGuiItem(final Material material, final String name, final String... lore) { final ItemStack item = new ItemStack(material, 1); final ItemMeta meta = item.getItemMeta(); // Set the name of the item meta.setDisplayName(name); // Set the lore of the item meta.setLore(Arrays.asList(lore)); item.setItemMeta(meta); return item; } @Override public void onDisable() { } }