diff --git a/EpicHoppers-Plugin/src/main/java/com/songoda/epichoppers/storage/types/StorageYaml.java b/EpicHoppers-Plugin/src/main/java/com/songoda/epichoppers/storage/types/StorageYaml.java index 38ad794..0aeae28 100644 --- a/EpicHoppers-Plugin/src/main/java/com/songoda/epichoppers/storage/types/StorageYaml.java +++ b/EpicHoppers-Plugin/src/main/java/com/songoda/epichoppers/storage/types/StorageYaml.java @@ -4,12 +4,10 @@ import com.songoda.epichoppers.EpicHoppersPlugin; import com.songoda.epichoppers.storage.Storage; import com.songoda.epichoppers.storage.StorageItem; import com.songoda.epichoppers.storage.StorageRow; -import org.apache.commons.io.FileUtils; import org.bukkit.configuration.ConfigurationSection; import org.bukkit.configuration.MemorySection; -import java.io.File; -import java.io.IOException; +import java.io.*; import java.util.*; public class StorageYaml extends Storage { @@ -110,7 +108,7 @@ public class StorageYaml extends Storage { File data = new File(instance.getDataFolder(), "data.yml"); File dataClone = new File(instance.getDataFolder(), "data-backup-" + System.currentTimeMillis() + ".yml"); try { - FileUtils.copyFile(data, dataClone); + copyFile(data, dataClone); } catch (IOException e) { e.printStackTrace(); } @@ -129,4 +127,21 @@ public class StorageYaml extends Storage { public void closeConnection() { dataFile.saveConfig(); } + + private static void copyFile(File source, File dest) throws IOException { + InputStream is = null; + OutputStream os = null; + try { + is = new FileInputStream(source); + os = new FileOutputStream(dest); + byte[] buffer = new byte[1024]; + int length; + while ((length = is.read(buffer)) > 0) { + os.write(buffer, 0, length); + } + } finally { + is.close(); + os.close(); + } + } } diff --git a/EpicHoppers-Plugin/src/main/java/com/songoda/epichoppers/utils/SettingsManager.java b/EpicHoppers-Plugin/src/main/java/com/songoda/epichoppers/utils/SettingsManager.java index 267a528..df487d3 100644 --- a/EpicHoppers-Plugin/src/main/java/com/songoda/epichoppers/utils/SettingsManager.java +++ b/EpicHoppers-Plugin/src/main/java/com/songoda/epichoppers/utils/SettingsManager.java @@ -43,14 +43,14 @@ public class SettingsManager implements Listener { return; } - if (event.getInventory().getTitle().equals(pluginName + " Settings Manager")) { + if (event.getView().getTitle().equals(pluginName + " Settings Manager")) { event.setCancelled(true); if (clickedItem.getType().name().contains("STAINED_GLASS")) return; String type = ChatColor.stripColor(clickedItem.getItemMeta().getDisplayName()); this.cat.put((Player) event.getWhoClicked(), type); this.openEditor((Player) event.getWhoClicked()); - } else if (event.getInventory().getTitle().equals(pluginName + " Settings Editor")) { + } else if (event.getView().getTitle().equals(pluginName + " Settings Editor")) { event.setCancelled(true); if (clickedItem.getType().name().contains("STAINED_GLASS")) return; diff --git a/EpicHoppers-Plugin/src/main/java/com/songoda/epichoppers/utils/gui/AbstractAnvilGUI.java b/EpicHoppers-Plugin/src/main/java/com/songoda/epichoppers/utils/gui/AbstractAnvilGUI.java deleted file mode 100644 index 27cf3fc..0000000 --- a/EpicHoppers-Plugin/src/main/java/com/songoda/epichoppers/utils/gui/AbstractAnvilGUI.java +++ /dev/null @@ -1,270 +0,0 @@ -package com.songoda.epichoppers.utils.gui; - -import com.songoda.epichoppers.EpicHoppersPlugin; -import com.songoda.epichoppers.utils.version.NMSUtil; -import org.bukkit.Bukkit; -import org.bukkit.Sound; -import org.bukkit.entity.Player; -import org.bukkit.event.EventHandler; -import org.bukkit.event.HandlerList; -import org.bukkit.event.Listener; -import org.bukkit.event.inventory.InventoryClickEvent; -import org.bukkit.event.inventory.InventoryCloseEvent; -import org.bukkit.event.player.PlayerQuitEvent; -import org.bukkit.inventory.Inventory; -import org.bukkit.inventory.ItemStack; -import org.bukkit.inventory.meta.ItemMeta; - -import java.lang.reflect.Constructor; -import java.lang.reflect.Field; -import java.lang.reflect.Method; -import java.util.HashMap; -import java.util.Map; - -public class AbstractAnvilGUI { - - private static Class BlockPosition; - private static Class PacketPlayOutOpenWindow; - private static Class ContainerAnvil; - private static Class ChatMessage; - private static Class EntityHuman; - private static boolean loadedClasses = false; - private Player player; - @SuppressWarnings("unused") - private AnvilClickEventHandler handler; - private Map items = new HashMap<>(); - private OnClose onClose = null; - private Inventory inv; - private Listener listener; - - private Sound closeSound = Sound.ENTITY_PLAYER_LEVELUP; - - public AbstractAnvilGUI(final Player player, final AnvilClickEventHandler handler) { - loadClasses(); - this.player = player; - this.handler = handler; - - this.listener = new Listener() { - @EventHandler - public void onInventoryClick(InventoryClickEvent event) { - if (!(event.getWhoClicked() instanceof Player) || !event.getInventory().equals(inv)) return; - - event.setCancelled(true); - - ItemStack item = event.getCurrentItem(); - int slot = event.getRawSlot(); - String name = ""; - - if (item != null) { - if (item.hasItemMeta()) { - ItemMeta meta = item.getItemMeta(); - - if (meta.hasDisplayName()) { - name = meta.getDisplayName(); - } - } - } - - AnvilClickEvent clickEvent = new AnvilClickEvent(AnvilSlot.bySlot(slot), name); - - handler.onAnvilClick(clickEvent); - - if (clickEvent.getWillClose()) { - event.getWhoClicked().closeInventory(); - } - - if (clickEvent.getWillDestroy()) { - destroy(); - } - } - - @EventHandler - public void onInventoryClose(InventoryCloseEvent event) { - if (!(event.getPlayer() instanceof Player)) return; - Inventory inv = event.getInventory(); - player.setLevel(player.getLevel() - 1); - if (!inv.equals(AbstractAnvilGUI.this.inv)) return; - inv.clear(); - OnClose onClose = getOnClose(); - player.playSound(player.getLocation(), closeSound, 1F, 1F); - Bukkit.getScheduler().scheduleSyncDelayedTask(EpicHoppersPlugin.getInstance(), () -> { - if (onClose != null) onClose.OnClose(player, inv); - destroy(); - }, 1L); - } - - @EventHandler - public void onPlayerQuit(PlayerQuitEvent event) { - if (!event.getPlayer().equals(getPlayer())) return; - player.setLevel(player.getLevel() - 1); - destroy(); - } - }; - - Bukkit.getPluginManager().registerEvents(listener, EpicHoppersPlugin.getInstance()); - } - - private void loadClasses() { - if (loadedClasses) return; - BlockPosition = NMSUtil.getNMSClass("BlockPosition"); - PacketPlayOutOpenWindow = NMSUtil.getNMSClass("PacketPlayOutOpenWindow"); - ContainerAnvil = NMSUtil.getNMSClass("ContainerAnvil"); - EntityHuman = NMSUtil.getNMSClass("EntityHuman"); - ChatMessage = NMSUtil.getNMSClass("ChatMessage"); - loadedClasses = true; - } - - public Player getPlayer() { - return player; - } - - public void setSlot(AnvilSlot slot, ItemStack item) { - items.put(slot, item); - } - - public void open() { - player.setLevel(player.getLevel() + 1); - - try { - Object craftPlayer = NMSUtil.getCraftClass("entity.CraftPlayer").cast(player); - Method getHandleMethod = craftPlayer.getClass().getMethod("getHandle", new Class[0]); - Object entityPlayer = getHandleMethod.invoke(craftPlayer, new Object[0]); - - Object container; - - if (NMSUtil.getVersionNumber() == 7) { - container = ContainerAnvil.getConstructor(new Class[]{NMSUtil.getNMSClass("PlayerInventory"), NMSUtil.getNMSClass("World"), Integer.TYPE, Integer.TYPE, Integer.TYPE, EntityHuman}).newInstance(new Object[]{NMSUtil.getFieldObject(entityPlayer, NMSUtil.getField(entityPlayer.getClass(), "inventory", false)), NMSUtil.getFieldObject(entityPlayer, NMSUtil.getField(entityPlayer.getClass(), "world", false)), Integer.valueOf(0), Integer.valueOf(0), Integer.valueOf(0), entityPlayer}); - } else { - container = ContainerAnvil.getConstructor(NMSUtil.getNMSClass("PlayerInventory"), NMSUtil.getNMSClass("World"), BlockPosition, EntityHuman).newInstance(NMSUtil.getFieldObject(entityPlayer, NMSUtil.getField(entityPlayer.getClass(), "inventory", false)), NMSUtil.getFieldObject(entityPlayer, NMSUtil.getField(entityPlayer.getClass(), "world", false)), BlockPosition.getConstructor(int.class, int.class, int.class).newInstance(0, 0, 0), entityPlayer); - } - - NMSUtil.getField(NMSUtil.getNMSClass("Container"), "checkReachable", true).set(container, false); - - Method getBukkitViewMethod = container.getClass().getMethod("getBukkitView", new Class[0]); - Object bukkitView = getBukkitViewMethod.invoke(container); - Method getTopInventoryMethod = bukkitView.getClass().getMethod("getTopInventory", new Class[0]); - inv = (Inventory) getTopInventoryMethod.invoke(bukkitView); - - for (AnvilSlot slot : items.keySet()) { - inv.setItem(slot.getSlot(), items.get(slot)); - } - - Method nextContainerCounterMethod = entityPlayer.getClass().getMethod("nextContainerCounter", new Class[0]); - int c = (int) nextContainerCounterMethod.invoke(entityPlayer); - - Constructor chatMessageConstructor = ChatMessage.getConstructor(String.class, Object[].class); - Object packet; - - if (NMSUtil.getVersionNumber() == 7) { - packet = PacketPlayOutOpenWindow.getConstructor(new Class[]{Integer.TYPE, Integer.TYPE, String.class, Integer.TYPE, Boolean.TYPE, Integer.TYPE}).newInstance(new Object[]{Integer.valueOf(c), Integer.valueOf(8), "Repairing", Integer.valueOf(0), Boolean.valueOf(true), Integer.valueOf(0)}); - } else { - packet = PacketPlayOutOpenWindow.getConstructor(int.class, String.class, NMSUtil.getNMSClass("IChatBaseComponent"), int.class).newInstance(c, "minecraft:anvil", chatMessageConstructor.newInstance("Repairing", new Object[]{}), 0); - } - - NMSUtil.sendPacket(player, packet); - - Field activeContainerField = NMSUtil.getField(EntityHuman, "activeContainer", true); - - if (activeContainerField != null) { - activeContainerField.set(entityPlayer, container); - NMSUtil.getField(NMSUtil.getNMSClass("Container"), "windowId", true).set(activeContainerField.get(entityPlayer), c); - - Method addSlotListenerMethod = activeContainerField.get(entityPlayer).getClass().getMethod("addSlotListener", NMSUtil.getNMSClass("ICrafting")); - addSlotListenerMethod.invoke(activeContainerField.get(entityPlayer), entityPlayer); - } - } catch (Exception e) { - e.printStackTrace(); - } - } - - public void destroy() { - onClose = null; - player = null; - handler = null; - items = null; - - HandlerList.unregisterAll(listener); - - listener = null; - } - - private OnClose getOnClose() { - return onClose; - } - - public void setOnClose(OnClose onClose) { - this.onClose = onClose; - } - - public void setCloseSound(Sound sound) { - closeSound = sound; - } - - public enum AnvilSlot { - INPUT_LEFT(0), - INPUT_RIGHT(1), - OUTPUT(2); - - private int slot; - - private AnvilSlot(int slot) { - this.slot = slot; - } - - public static AnvilSlot bySlot(int slot) { - for (AnvilSlot anvilSlot : values()) { - if (anvilSlot.getSlot() == slot) { - return anvilSlot; - } - } - - return null; - } - - public int getSlot() { - return slot; - } - } - - public interface AnvilClickEventHandler { - void onAnvilClick(AnvilClickEvent event); - } - - public class AnvilClickEvent { - private AnvilSlot slot; - - private String name; - - private boolean close = true; - private boolean destroy = true; - - public AnvilClickEvent(AnvilSlot slot, String name) { - this.slot = slot; - this.name = name; - } - - public AnvilSlot getSlot() { - return slot; - } - - public String getName() { - return name; - } - - public boolean getWillClose() { - return close; - } - - public void setWillClose(boolean close) { - this.close = close; - } - - public boolean getWillDestroy() { - return destroy; - } - - public void setWillDestroy(boolean destroy) { - this.destroy = destroy; - } - } -} diff --git a/EpicHoppers-Plugin/src/main/java/com/songoda/epichoppers/utils/gui/AbstractGUI.java b/EpicHoppers-Plugin/src/main/java/com/songoda/epichoppers/utils/gui/AbstractGUI.java index a63c749..13c0385 100644 --- a/EpicHoppers-Plugin/src/main/java/com/songoda/epichoppers/utils/gui/AbstractGUI.java +++ b/EpicHoppers-Plugin/src/main/java/com/songoda/epichoppers/utils/gui/AbstractGUI.java @@ -114,7 +114,7 @@ public abstract class AbstractGUI implements Listener { protected void init(String title, int slots) { if (inventory == null || inventory.getSize() != slots - || ChatColor.translateAlternateColorCodes('&', title) != inventory.getTitle()) { + || !ChatColor.translateAlternateColorCodes('&', title).equals(player.getOpenInventory().getTitle())) { this.inventory = Bukkit.getServer().createInventory(new GUIHolder(), slots, ChatColor.translateAlternateColorCodes('&', title)); registerClickables(); registerOnCloses(); diff --git a/EpicHoppers-Plugin/src/main/java/com/songoda/epichoppers/utils/version/NMSUtil.java b/EpicHoppers-Plugin/src/main/java/com/songoda/epichoppers/utils/version/NMSUtil.java deleted file mode 100644 index eae5e67..0000000 --- a/EpicHoppers-Plugin/src/main/java/com/songoda/epichoppers/utils/version/NMSUtil.java +++ /dev/null @@ -1,100 +0,0 @@ -package com.songoda.epichoppers.utils.version; - -import org.bukkit.Bukkit; -import org.bukkit.entity.Player; - -import java.lang.reflect.Field; - -public class NMSUtil { - - public static String getVersion() { - String name = Bukkit.getServer().getClass().getPackage().getName(); - return name.substring(name.lastIndexOf('.') + 1) + "."; - } - - public static int getVersionNumber() { - String name = getVersion().substring(3); - return Integer.valueOf(name.substring(0, name.length() - 4)); - } - - public static int getVersionReleaseNumber() { - String NMSVersion = getVersion(); - return Integer.valueOf(NMSVersion.substring(NMSVersion.length() - 2).replace(".", "")); - } - - public static Class getNMSClass(String className) { - try { - String fullName = "net.minecraft.server." + getVersion() + className; - Class clazz = Class.forName(fullName); - return clazz; - } catch (Exception e) { - e.printStackTrace(); - return null; - } - } - - public static Class getCraftClass(String className) throws ClassNotFoundException { - try { - String fullName = "org.bukkit.craftbukkit." + getVersion() + className; - Class clazz = Class.forName(fullName); - return clazz; - } catch (Exception e) { - e.printStackTrace(); - return null; - } - } - - public static Field getField(Class clazz, String name, boolean declared) { - try { - Field field; - - if (declared) { - field = clazz.getDeclaredField(name); - } else { - field = clazz.getField(name); - } - - field.setAccessible(true); - return field; - } catch (Exception e) { - e.printStackTrace(); - return null; - } - } - - public static Object getFieldObject(Object object, Field field) { - try { - return field.get(object); - } catch (Exception e) { - e.printStackTrace(); - return null; - } - } - - public static void setField(Object object, String fieldName, Object fieldValue, boolean declared) { - try { - Field field; - - if (declared) { - field = object.getClass().getDeclaredField(fieldName); - } else { - field = object.getClass().getField(fieldName); - } - - field.setAccessible(true); - field.set(object, fieldValue); - } catch (Exception e) { - e.printStackTrace(); - } - } - - public static void sendPacket(Player player, Object packet) { - try { - Object handle = player.getClass().getMethod("getHandle").invoke(player); - Object playerConnection = handle.getClass().getField("playerConnection").get(handle); - playerConnection.getClass().getMethod("sendPacket", getNMSClass("Packet")).invoke(playerConnection, packet); - } catch (Exception e) { - e.printStackTrace(); - } - } -} diff --git a/pom.xml b/pom.xml index f16ae25..ca6a3ca 100644 --- a/pom.xml +++ b/pom.xml @@ -16,7 +16,7 @@ org.spigotmc spigot - 1.13.2 + 1.14-pre5 provided