diff --git a/.gitignore b/.gitignore index 3c10ff7..dac1d9c 100644 --- a/.gitignore +++ b/.gitignore @@ -1,9 +1,10 @@ -/.settings -/.gitignore -/.project -/.classpath -/.idea -/target -/bin -/lib -/out +**/.settings +**/.gitignore +**/.project +**/.classpath +**/.idea +**/target +**/bin +**/lib +**/out +**dependency-reduced-pom.xml diff --git a/assembly/pom.xml b/assembly/pom.xml new file mode 100644 index 0000000..86563e3 --- /dev/null +++ b/assembly/pom.xml @@ -0,0 +1,77 @@ + + 4.0.0 + + + com.lishid + openinv + 1.0-SNAPSHOT + + + openinvassembly + OpenInvAssembly + + + + + latest + + + com.lishid + openinvadapter1_11_R1 + 1.0-SNAPSHOT + + + + + + all + + + com.lishid + openinvadapter1_11_R1 + 1.0-SNAPSHOT + + + + + + + + ../target + OpenInv + + + + org.apache.maven.plugins + maven-shade-plugin + 2.4.3 + + + true + + + com.lishid:* + + com/lishid/openinv/**/* + plugin.yml + + + + + + + package + + shade + + + + + + + + \ No newline at end of file diff --git a/internal/pom.xml b/internal/pom.xml new file mode 100644 index 0000000..ce65e5c --- /dev/null +++ b/internal/pom.xml @@ -0,0 +1,23 @@ + + 4.0.0 + + + com.lishid + openinv + 1.0-SNAPSHOT + + + openinvinternal + OpenInvInternal + + + + org.bukkit + bukkit + 1.4.5-R1.0 + provided + + + + diff --git a/internal/src/main/java/com/lishid/openinv/internal/IAnySilentChest.java b/internal/src/main/java/com/lishid/openinv/internal/IAnySilentChest.java new file mode 100644 index 0000000..b109b12 --- /dev/null +++ b/internal/src/main/java/com/lishid/openinv/internal/IAnySilentChest.java @@ -0,0 +1,40 @@ +/* + * Copyright (C) 2011-2014 lishid. All rights reserved. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, version 3. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.lishid.openinv.internal; + +import org.bukkit.block.Block; +import org.bukkit.entity.Player; + +/** + * @deprecated Use {@link IAnySilentContainer} + */ +@Deprecated +public interface IAnySilentChest { + + /** + * @deprecated Use {@link IAnySilentContainer#activateContainer(Player, boolean, Block)}. + */ + @Deprecated + public boolean activateChest(Player player, boolean anychest, boolean silentchest, int x, int y, int z); + + /** + * @deprecated Use {@link IAnySilentContainer#isAnyContainerNeeded(Player, Block)}. + */ + @Deprecated + public boolean isAnyChestNeeded(Player player, int x, int y, int z); + +} diff --git a/internal/src/main/java/com/lishid/openinv/internal/IAnySilentContainer.java b/internal/src/main/java/com/lishid/openinv/internal/IAnySilentContainer.java new file mode 100644 index 0000000..a7b6802 --- /dev/null +++ b/internal/src/main/java/com/lishid/openinv/internal/IAnySilentContainer.java @@ -0,0 +1,38 @@ +package com.lishid.openinv.internal; + +import org.bukkit.block.Block; +import org.bukkit.entity.Player; + +@SuppressWarnings("deprecation") +public interface IAnySilentContainer extends IAnySilentChest { + + /** + * Checks if the given block is a container which can be unblocked or silenced. + * + * @param block the BlockState + * @return true if the Block is a supported container + */ + public boolean isAnySilentContainer(Block block); + + /** + * Checks if the container at the given coordinates is blocked. + * + * @param player the Player opening the container + * @param block the Block + * @return true if the container is blocked + */ + public boolean isAnyContainerNeeded(Player player, Block block); + + /** + * Opens the container at the given coordinates for the Player. If you do not want blocked + * containers to open, be sure to check {@link #isAnyContainerNeeded(Player, Block)} + * first. + * + * @param player + * @param silentchest whether the container's noise is to be silenced + * @param block the Block + * @return true if the container can be opened + */ + public boolean activateContainer(Player player, boolean silentchest, Block block); + +} diff --git a/internal/src/main/java/com/lishid/openinv/internal/IInventoryAccess.java b/internal/src/main/java/com/lishid/openinv/internal/IInventoryAccess.java new file mode 100644 index 0000000..16ae2a4 --- /dev/null +++ b/internal/src/main/java/com/lishid/openinv/internal/IInventoryAccess.java @@ -0,0 +1,33 @@ +/* + * Copyright (C) 2011-2014 lishid. All rights reserved. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, version 3. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.lishid.openinv.internal; + +import org.bukkit.entity.HumanEntity; +import org.bukkit.inventory.Inventory; + +public interface IInventoryAccess { + + /** + * Check if an entity has permission to modify the contents of an inventory. + * + * @param inventory the Inventory + * @param player the HumanEntity + * @return true if the HumanEntity can modify the Inventory + */ + public boolean check(Inventory inventory, HumanEntity player); + +} diff --git a/internal/src/main/java/com/lishid/openinv/internal/IPlayerDataManager.java b/internal/src/main/java/com/lishid/openinv/internal/IPlayerDataManager.java new file mode 100644 index 0000000..d9738a6 --- /dev/null +++ b/internal/src/main/java/com/lishid/openinv/internal/IPlayerDataManager.java @@ -0,0 +1,50 @@ +/* + * Copyright (C) 2011-2014 lishid. All rights reserved. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, version 3. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.lishid.openinv.internal; + +import java.util.UUID; + +import org.bukkit.OfflinePlayer; +import org.bukkit.entity.Player; + +public interface IPlayerDataManager { + + /** + * Loads a Player for an OfflinePlayer. + *

+ * This method is potentially blocking, and should not be called on the main thread. + * + * @param offline + * @return + */ + public Player loadPlayer(OfflinePlayer offline); + + /** + * @deprecated use {@link #loadPlayer(OfflinePlayer)} + */ + @Deprecated + public Player loadPlayer(UUID uuid); + + /** + * Gets a unique identifying string for an OfflinePlayer. + * + * @param player + * @return + */ + public String getPlayerDataID(OfflinePlayer player); + +} diff --git a/internal/src/main/java/com/lishid/openinv/internal/ISpecialEnderChest.java b/internal/src/main/java/com/lishid/openinv/internal/ISpecialEnderChest.java new file mode 100644 index 0000000..2b7c6cd --- /dev/null +++ b/internal/src/main/java/com/lishid/openinv/internal/ISpecialEnderChest.java @@ -0,0 +1,62 @@ +/* + * Copyright (C) 2011-2014 lishid. All rights reserved. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, version 3. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.lishid.openinv.internal; + +import org.bukkit.entity.Player; +import org.bukkit.inventory.Inventory; + +public interface ISpecialEnderChest { + + /** + * Gets the Inventory associated with this ISpecialEnderChest. + * + * @return the Inventory + */ + public Inventory getBukkitInventory(); + + /** + * Sets the Player associated with this ISpecialEnderChest online. + * + * @param player the Player coming online + */ + public void setPlayerOnline(Player player); + + /** + * @deprecated use {@link #setPlayerOnline(Player)} + */ + @Deprecated + public void playerOnline(Player player); + + /** + * Sets the Player associated with this ISpecialEnderChest offline. + */ + public void setPlayerOffline(); + + /** + * @deprecated use {@link #setPlayerOffline()} + */ + @Deprecated + public void playerOffline(); + + /** + * Gets whether or not this ISpecialEnderChest is in use. + * + * @return true if the ISpecialEnderChest is in use + */ + public boolean isInUse(); + +} diff --git a/internal/src/main/java/com/lishid/openinv/internal/ISpecialPlayerInventory.java b/internal/src/main/java/com/lishid/openinv/internal/ISpecialPlayerInventory.java new file mode 100644 index 0000000..088ee5f --- /dev/null +++ b/internal/src/main/java/com/lishid/openinv/internal/ISpecialPlayerInventory.java @@ -0,0 +1,62 @@ +/* + * Copyright (C) 2011-2014 lishid. All rights reserved. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, version 3. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.lishid.openinv.internal; + +import org.bukkit.entity.Player; +import org.bukkit.inventory.Inventory; + +public interface ISpecialPlayerInventory { + + /** + * Gets the Inventory associated with this ISpecialPlayerInventory. + * + * @return the Inventory + */ + public Inventory getBukkitInventory(); + + /** + * Sets the Player associated with this ISpecialPlayerInventory online. + * + * @param player the Player coming online + */ + public void setPlayerOnline(Player player); + + /** + * @deprecated use {@link #setPlayerOnline(Player)} + */ + @Deprecated + public void playerOnline(Player player); + + /** + * Sets the Player associated with this ISpecialPlayerInventory offline. + */ + public void setPlayerOffline(); + + /** + * @deprecated use {@link #setPlayerOffline()} + */ + @Deprecated + public void playerOffline(); + + /** + * Gets whether or not this ISpecialPlayerInventory is in use. + * + * @return true if the ISpecialPlayerInventory is in use + */ + public boolean isInUse(); + +} diff --git a/internal/src/main/java/com/lishid/openinv/internal/InternalAccessor.java b/internal/src/main/java/com/lishid/openinv/internal/InternalAccessor.java new file mode 100644 index 0000000..01ea58d --- /dev/null +++ b/internal/src/main/java/com/lishid/openinv/internal/InternalAccessor.java @@ -0,0 +1,183 @@ +/* + * Copyright (C) 2011-2014 lishid. All rights reserved. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, version 3. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.lishid.openinv.internal; + +import java.lang.reflect.Constructor; + +import org.bukkit.Server; +import org.bukkit.entity.Player; +import org.bukkit.plugin.Plugin; + +public class InternalAccessor { + + private final Plugin plugin; + + private String version; + private boolean supported = false; + + public InternalAccessor(Plugin plugin) { + this.plugin = plugin; + } + + /** + * Check if the current server version is supported, and, if it is, prepare to load version-specific code. + * + * @param server the Server + * + * @return true if supported + */ + public boolean initialize(Server server) { + String packageName = server.getClass().getPackage().getName(); + version = packageName.substring(packageName.lastIndexOf('.') + 1); + + try { + Class.forName("com.lishid.openinv.internal." + version + ".PlayerDataManager"); + return (supported = true); + } catch (Exception e) { + return false; + } + } + + /** + * Gets the server implementation version. If not initialized, returns the string "null" + * instead. + * + * @return the version, or "null" + */ + public String getVersion() { + return this.version != null ? this.version : "null"; + } + + /** + * Checks if the server implementation is supported. + * + * @return true if initialized for a supported server version + */ + public boolean isSupported() { + return this.supported; + } + + /** + * Creates an instance of the IPlayerDataManager implementation for the current server version, + * or null if unsupported. + * + * @return the IPlayerDataManager + */ + public IPlayerDataManager newPlayerDataManager() { + return createObject(IPlayerDataManager.class, "PlayerDataManager"); + } + + /** + * Creates an instance of the IInventoryAccess implementation for the current server version, or + * null if unsupported. + * + * @return the IInventoryAccess + */ + public IInventoryAccess newInventoryAccess() { + return createObject(IInventoryAccess.class, "InventoryAccess"); + } + + /** + * Creates an instance of the IAnySilentContainer implementation for the current server version, + * or null if unsupported. + * + * @return the IAnySilentContainer + */ + public IAnySilentContainer newAnySilentContainer() { + return createObject(IAnySilentContainer.class, "AnySilentContainer"); + } + + /** + * @deprecated Use {@link #newAnySilentContainer()} + */ + @Deprecated + public IAnySilentChest newAnySilentChest() { + IAnySilentChest iAnySilentChest = createObject(IAnySilentChest.class, "AnySilentChest"); + return iAnySilentChest != null ? iAnySilentChest : newAnySilentContainer(); + } + + /** + * Creates an instance of the ISpecialPlayerInventory implementation for the given Player, or + * null if the current version is unsupported. + * + * @param player the Player + * @param online true if the Player is online + * @return the ISpecialPlayerInventory created + */ + public ISpecialPlayerInventory newSpecialPlayerInventory(Player player, boolean online) { + return createObject(ISpecialPlayerInventory.class, "SpecialPlayerInventory", player, online); + } + + /** + * Creates an instance of the ISpecialEnderChest implementation for the given Player, or + * null if the current version is unsupported. + * + * @param player the Player + * @param online true if the Player is online + * @return the ISpecialEnderChest created + */ + public ISpecialEnderChest newSpecialEnderChest(Player player, boolean online) { + return createObject(ISpecialEnderChest.class, "SpecialEnderChest", player, online); + } + + private T createObject(Class assignableClass, String className, Object... params) { + try { + // Check if internal versioned class exists + Class internalClass = Class.forName("com.lishid.openinv.internal." + version + "." + className); + if (!assignableClass.isAssignableFrom(internalClass)) { + plugin.getLogger().warning("Found class " + internalClass.getName() + " but cannot cast to " + assignableClass.getName()); + return null; + } + + // Quick return: no parameters, no need to fiddle about finding the correct constructor. + if (params.length == 0) { + return assignableClass.cast(internalClass.getConstructor().newInstance()); + } + + // Search constructors for one matching the given parameters + nextConstructor: for (Constructor constructor : internalClass.getConstructors()) { + Class[] requiredClasses = constructor.getParameterTypes(); + if (requiredClasses.length != params.length) { + continue; + } + for (int i = 0; i < params.length; ++i) { + if (!requiredClasses[i].isAssignableFrom(params[i].getClass())) { + continue nextConstructor; + } + } + return assignableClass.cast(constructor.newInstance(params)); + } + + StringBuilder message = new StringBuilder("Found class ").append(internalClass.getName()) + .append(" but cannot find any matching constructors for ["); + for (Object object : params) { + message.append(object.getClass().getName()).append(", "); + } + if (params.length > 0) { + message.delete(message.length() - 2, message.length()); + } + + plugin.getLogger().warning(message.append(']').toString()); + } catch (Exception e) { + plugin.getLogger().warning("OpenInv encountered an error with the CraftBukkit version \"" + version + "\". Please look for an updated version of OpenInv."); + e.printStackTrace(); + } + + return null; + } + +} diff --git a/plugin/pom.xml b/plugin/pom.xml new file mode 100644 index 0000000..64c32d7 --- /dev/null +++ b/plugin/pom.xml @@ -0,0 +1,38 @@ + + 4.0.0 + + + com.lishid + openinv + 1.0-SNAPSHOT + + + openinvplugin + OpenInvPlugin + + + + org.bukkit + bukkit + + 1.11-R0.1-SNAPSHOT + provided + + + com.lishid + openinvinternal + 1.0-SNAPSHOT + + + + + + + src/main/resources + true + + + + + \ No newline at end of file diff --git a/src/main/java/com/lishid/openinv/ConfigUpdater.java b/plugin/src/main/java/com/lishid/openinv/ConfigUpdater.java similarity index 100% rename from src/main/java/com/lishid/openinv/ConfigUpdater.java rename to plugin/src/main/java/com/lishid/openinv/ConfigUpdater.java diff --git a/src/main/java/com/lishid/openinv/Configuration.java b/plugin/src/main/java/com/lishid/openinv/Configuration.java similarity index 100% rename from src/main/java/com/lishid/openinv/Configuration.java rename to plugin/src/main/java/com/lishid/openinv/Configuration.java diff --git a/src/main/java/com/lishid/openinv/OpenInv.java b/plugin/src/main/java/com/lishid/openinv/OpenInv.java similarity index 80% rename from src/main/java/com/lishid/openinv/OpenInv.java rename to plugin/src/main/java/com/lishid/openinv/OpenInv.java index 6b62e35..4474e2b 100644 --- a/src/main/java/com/lishid/openinv/OpenInv.java +++ b/plugin/src/main/java/com/lishid/openinv/OpenInv.java @@ -20,13 +20,6 @@ import java.util.HashMap; import java.util.Map; import java.util.UUID; -import org.bukkit.ChatColor; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; -import org.bukkit.permissions.Permissible; -import org.bukkit.plugin.PluginManager; -import org.bukkit.plugin.java.JavaPlugin; - import com.lishid.openinv.commands.AnyChestCommand; import com.lishid.openinv.commands.OpenEnderCommand; import com.lishid.openinv.commands.OpenInvCommand; @@ -34,25 +27,34 @@ import com.lishid.openinv.commands.SearchEnderCommand; import com.lishid.openinv.commands.SearchInvCommand; import com.lishid.openinv.commands.SilentChestCommand; import com.lishid.openinv.commands.ToggleOpenInvCommand; -import com.lishid.openinv.internal.AnySilentChest; -import com.lishid.openinv.internal.InventoryAccess; -import com.lishid.openinv.internal.PlayerDataManager; -import com.lishid.openinv.internal.SpecialEnderChest; -import com.lishid.openinv.internal.SpecialPlayerInventory; +import com.lishid.openinv.internal.IAnySilentChest; +import com.lishid.openinv.internal.IInventoryAccess; +import com.lishid.openinv.internal.IPlayerDataManager; +import com.lishid.openinv.internal.ISpecialEnderChest; +import com.lishid.openinv.internal.ISpecialPlayerInventory; +import com.lishid.openinv.internal.InternalAccessor; import com.lishid.openinv.listeners.OpenInvEntityListener; import com.lishid.openinv.listeners.OpenInvInventoryListener; import com.lishid.openinv.listeners.OpenInvPlayerListener; +import org.bukkit.ChatColor; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; +import org.bukkit.permissions.Permissible; +import org.bukkit.plugin.PluginManager; +import org.bukkit.plugin.java.JavaPlugin; + public class OpenInv extends JavaPlugin { - private final Map inventories = new HashMap(); - private final Map enderChests = new HashMap(); + private final Map inventories = new HashMap(); + private final Map enderChests = new HashMap(); private Configuration configuration; - private PlayerDataManager playerLoader; - private InventoryAccess inventoryAccess; - private AnySilentChest anySilentChest; + private InternalAccessor accessor; + private IPlayerDataManager playerLoader; + private IInventoryAccess inventoryAccess; + private IAnySilentChest anySilentChest; @Override public void onEnable() { @@ -62,14 +64,21 @@ public class OpenInv extends JavaPlugin { // Config configuration = new Configuration(this); - // Initialize - playerLoader = new PlayerDataManager(this); - inventoryAccess = new InventoryAccess(this); - anySilentChest = new AnySilentChest(this); - - // Register the plugin's events PluginManager pm = getServer().getPluginManager(); + // Version check + if (!accessor.initialize(getServer())) { + getLogger().info("Your version of CraftBukkit (" + accessor.getVersion() + ") is not supported."); + getLogger().info("Please look for an updated version of OpenInv."); + pm.disablePlugin(this); + return; + } + + playerLoader = accessor.newPlayerDataManager(); + inventoryAccess = accessor.newInventoryAccess(); + anySilentChest = accessor.newAnySilentChest(); + + // Register the plugin's events pm.registerEvents(new OpenInvPlayerListener(this), this); pm.registerEvents(new OpenInvEntityListener(this), this); pm.registerEvents(new OpenInvInventoryListener(this), this); @@ -98,7 +107,7 @@ public class OpenInv extends JavaPlugin { * * @return an instance of PlayerDataManager */ - public PlayerDataManager getPlayerLoader() { + public IPlayerDataManager getPlayerLoader() { return playerLoader; } @@ -107,7 +116,7 @@ public class OpenInv extends JavaPlugin { * * @return an instance of InventoryAccess */ - public InventoryAccess getInventoryAccess() { + public IInventoryAccess getInventoryAccess() { return inventoryAccess; } @@ -116,7 +125,7 @@ public class OpenInv extends JavaPlugin { * * @return an instance of AnySilentChest */ - public AnySilentChest getAnySilentChest() { + public IAnySilentChest getAnySilentChest() { return anySilentChest; } @@ -127,11 +136,11 @@ public class OpenInv extends JavaPlugin { * @param createIfNull whether or not to create it if it doesn't exist * @return the player's SpecialPlayerInventory or null */ - public SpecialPlayerInventory getPlayerInventory(Player player, boolean createIfNull) { - SpecialPlayerInventory inventory = inventories.get(player.getUniqueId()); + public ISpecialPlayerInventory getPlayerInventory(Player player, boolean createIfNull) { + ISpecialPlayerInventory inventory = inventories.get(player.getUniqueId()); if (inventory == null && createIfNull) { - inventory = new SpecialPlayerInventory(player, player.isOnline()); + inventory = accessor.newSpecialPlayerInventory(player, !player.isOnline()); inventories.put(player.getUniqueId(), inventory); } @@ -145,11 +154,11 @@ public class OpenInv extends JavaPlugin { * @param createIfNull whether or not to create it if it doesn't exist * @return the player's SpecialEnderChest or null */ - public SpecialEnderChest getPlayerEnderChest(Player player, boolean createIfNull) { - SpecialEnderChest enderChest = enderChests.get(player.getUniqueId()); + public ISpecialEnderChest getPlayerEnderChest(Player player, boolean createIfNull) { + ISpecialEnderChest enderChest = enderChests.get(player.getUniqueId()); if (enderChest == null && createIfNull) { - enderChest = new SpecialEnderChest(player, player.isOnline()); + enderChest = accessor.newSpecialEnderChest(player, player.isOnline()); enderChests.put(player.getUniqueId(), enderChest); } diff --git a/src/main/java/com/lishid/openinv/Permissions.java b/plugin/src/main/java/com/lishid/openinv/Permissions.java similarity index 97% rename from src/main/java/com/lishid/openinv/Permissions.java rename to plugin/src/main/java/com/lishid/openinv/Permissions.java index 5021236..0577a51 100644 --- a/src/main/java/com/lishid/openinv/Permissions.java +++ b/plugin/src/main/java/com/lishid/openinv/Permissions.java @@ -1,19 +1,19 @@ -package com.lishid.openinv; - -public final class Permissions { - - private Permissions() {} - - public static final String PERM_OPENINV = "OpenInv.openinv"; - public static final String PERM_OVERRIDE = "OpenInv.override"; - public static final String PERM_EXEMPT = "OpenInv.exempt"; - public static final String PERM_CROSSWORLD = "OpenInv.crossworld"; - public static final String PERM_SILENT = "OpenInv.silent"; - public static final String PERM_ANYCHEST = "OpenInv.anychest"; - public static final String PERM_ENDERCHEST = "OpenInv.openender"; - public static final String PERM_ENDERCHEST_ALL = "OpenInv.openenderall"; - public static final String PERM_SEARCH = "OpenInv.search"; - public static final String PERM_EDITINV = "OpenInv.editinv"; - public static final String PERM_EDITENDER = "OpenInv.editender"; - public static final String PERM_OPENSELF = "OpenInv.openself"; -} +package com.lishid.openinv; + +public final class Permissions { + + private Permissions() {} + + public static final String PERM_OPENINV = "OpenInv.openinv"; + public static final String PERM_OVERRIDE = "OpenInv.override"; + public static final String PERM_EXEMPT = "OpenInv.exempt"; + public static final String PERM_CROSSWORLD = "OpenInv.crossworld"; + public static final String PERM_SILENT = "OpenInv.silent"; + public static final String PERM_ANYCHEST = "OpenInv.anychest"; + public static final String PERM_ENDERCHEST = "OpenInv.openender"; + public static final String PERM_ENDERCHEST_ALL = "OpenInv.openenderall"; + public static final String PERM_SEARCH = "OpenInv.search"; + public static final String PERM_EDITINV = "OpenInv.editinv"; + public static final String PERM_EDITENDER = "OpenInv.editender"; + public static final String PERM_OPENSELF = "OpenInv.openself"; +} diff --git a/src/main/java/com/lishid/openinv/commands/AnyChestCommand.java b/plugin/src/main/java/com/lishid/openinv/commands/AnyChestCommand.java similarity index 100% rename from src/main/java/com/lishid/openinv/commands/AnyChestCommand.java rename to plugin/src/main/java/com/lishid/openinv/commands/AnyChestCommand.java diff --git a/src/main/java/com/lishid/openinv/commands/OpenEnderCommand.java b/plugin/src/main/java/com/lishid/openinv/commands/OpenEnderCommand.java similarity index 97% rename from src/main/java/com/lishid/openinv/commands/OpenEnderCommand.java rename to plugin/src/main/java/com/lishid/openinv/commands/OpenEnderCommand.java index 11727a4..aef46ca 100644 --- a/src/main/java/com/lishid/openinv/commands/OpenEnderCommand.java +++ b/plugin/src/main/java/com/lishid/openinv/commands/OpenEnderCommand.java @@ -20,6 +20,11 @@ import java.util.Map; import java.util.UUID; import java.util.concurrent.ConcurrentHashMap; +import com.lishid.openinv.OpenInv; +import com.lishid.openinv.Permissions; +import com.lishid.openinv.internal.ISpecialEnderChest; +import com.lishid.openinv.utils.UUIDUtils; + import org.bukkit.Bukkit; import org.bukkit.ChatColor; import org.bukkit.command.Command; @@ -27,11 +32,6 @@ import org.bukkit.command.CommandExecutor; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; -import com.lishid.openinv.OpenInv; -import com.lishid.openinv.Permissions; -import com.lishid.openinv.internal.SpecialEnderChest; -import com.lishid.openinv.utils.UUIDUtils; - public class OpenEnderCommand implements CommandExecutor { private final OpenInv plugin; @@ -155,7 +155,7 @@ public class OpenEnderCommand implements CommandExecutor { openEnderHistory.put(player.getUniqueId(), target.getUniqueId()); // Get the inventory and open it - SpecialEnderChest enderChest = plugin.getPlayerEnderChest(target, true); + ISpecialEnderChest enderChest = plugin.getPlayerEnderChest(target, true); player.openInventory(enderChest.getBukkitInventory()); } } diff --git a/src/main/java/com/lishid/openinv/commands/OpenInvCommand.java b/plugin/src/main/java/com/lishid/openinv/commands/OpenInvCommand.java similarity index 95% rename from src/main/java/com/lishid/openinv/commands/OpenInvCommand.java rename to plugin/src/main/java/com/lishid/openinv/commands/OpenInvCommand.java index 49afd30..0b2e37a 100644 --- a/src/main/java/com/lishid/openinv/commands/OpenInvCommand.java +++ b/plugin/src/main/java/com/lishid/openinv/commands/OpenInvCommand.java @@ -20,20 +20,17 @@ import java.util.Map; import java.util.UUID; import java.util.concurrent.ConcurrentHashMap; +import com.lishid.openinv.OpenInv; +import com.lishid.openinv.Permissions; +import com.lishid.openinv.internal.ISpecialPlayerInventory; +import com.lishid.openinv.utils.UUIDUtils; + import org.bukkit.Bukkit; import org.bukkit.ChatColor; import org.bukkit.command.Command; import org.bukkit.command.CommandExecutor; import org.bukkit.command.CommandSender; -import org.bukkit.command.ConsoleCommandSender; import org.bukkit.entity.Player; -import org.bukkit.inventory.Inventory; -import org.bukkit.inventory.ItemStack; - -import com.lishid.openinv.OpenInv; -import com.lishid.openinv.Permissions; -import com.lishid.openinv.internal.SpecialPlayerInventory; -import com.lishid.openinv.utils.UUIDUtils; public class OpenInvCommand implements CommandExecutor { @@ -153,7 +150,7 @@ public class OpenInvCommand implements CommandExecutor { openInvHistory.put(player.getUniqueId(), target.getUniqueId()); // Get the inventory and open it - SpecialPlayerInventory inventory = plugin.getPlayerInventory(target, true); + ISpecialPlayerInventory inventory = plugin.getPlayerInventory(target, true); player.openInventory(inventory.getBukkitInventory()); } } diff --git a/src/main/java/com/lishid/openinv/commands/SearchEnderCommand.java b/plugin/src/main/java/com/lishid/openinv/commands/SearchEnderCommand.java similarity index 100% rename from src/main/java/com/lishid/openinv/commands/SearchEnderCommand.java rename to plugin/src/main/java/com/lishid/openinv/commands/SearchEnderCommand.java diff --git a/src/main/java/com/lishid/openinv/commands/SearchInvCommand.java b/plugin/src/main/java/com/lishid/openinv/commands/SearchInvCommand.java similarity index 100% rename from src/main/java/com/lishid/openinv/commands/SearchInvCommand.java rename to plugin/src/main/java/com/lishid/openinv/commands/SearchInvCommand.java diff --git a/src/main/java/com/lishid/openinv/commands/SilentChestCommand.java b/plugin/src/main/java/com/lishid/openinv/commands/SilentChestCommand.java similarity index 100% rename from src/main/java/com/lishid/openinv/commands/SilentChestCommand.java rename to plugin/src/main/java/com/lishid/openinv/commands/SilentChestCommand.java diff --git a/src/main/java/com/lishid/openinv/commands/ToggleOpenInvCommand.java b/plugin/src/main/java/com/lishid/openinv/commands/ToggleOpenInvCommand.java similarity index 100% rename from src/main/java/com/lishid/openinv/commands/ToggleOpenInvCommand.java rename to plugin/src/main/java/com/lishid/openinv/commands/ToggleOpenInvCommand.java diff --git a/src/main/java/com/lishid/openinv/listeners/OpenInvEntityListener.java b/plugin/src/main/java/com/lishid/openinv/listeners/OpenInvEntityListener.java similarity index 100% rename from src/main/java/com/lishid/openinv/listeners/OpenInvEntityListener.java rename to plugin/src/main/java/com/lishid/openinv/listeners/OpenInvEntityListener.java diff --git a/src/main/java/com/lishid/openinv/listeners/OpenInvInventoryListener.java b/plugin/src/main/java/com/lishid/openinv/listeners/OpenInvInventoryListener.java similarity index 100% rename from src/main/java/com/lishid/openinv/listeners/OpenInvInventoryListener.java rename to plugin/src/main/java/com/lishid/openinv/listeners/OpenInvInventoryListener.java diff --git a/src/main/java/com/lishid/openinv/listeners/OpenInvPlayerListener.java b/plugin/src/main/java/com/lishid/openinv/listeners/OpenInvPlayerListener.java similarity index 90% rename from src/main/java/com/lishid/openinv/listeners/OpenInvPlayerListener.java rename to plugin/src/main/java/com/lishid/openinv/listeners/OpenInvPlayerListener.java index 22949a9..22495fa 100644 --- a/src/main/java/com/lishid/openinv/listeners/OpenInvPlayerListener.java +++ b/plugin/src/main/java/com/lishid/openinv/listeners/OpenInvPlayerListener.java @@ -16,6 +16,12 @@ package com.lishid.openinv.listeners; +import com.lishid.openinv.Configuration; +import com.lishid.openinv.OpenInv; +import com.lishid.openinv.Permissions; +import com.lishid.openinv.internal.ISpecialEnderChest; +import com.lishid.openinv.internal.ISpecialPlayerInventory; + import org.bukkit.ChatColor; import org.bukkit.Material; import org.bukkit.block.Block; @@ -32,12 +38,6 @@ import org.bukkit.event.player.PlayerJoinEvent; import org.bukkit.event.player.PlayerQuitEvent; import org.bukkit.scheduler.BukkitRunnable; -import com.lishid.openinv.OpenInv; -import com.lishid.openinv.Permissions; -import com.lishid.openinv.Configuration; -import com.lishid.openinv.internal.SpecialEnderChest; -import com.lishid.openinv.internal.SpecialPlayerInventory; - public class OpenInvPlayerListener implements Listener { private final OpenInv plugin; @@ -60,13 +60,13 @@ public class OpenInvPlayerListener implements Listener { return; } - SpecialPlayerInventory inventory = plugin.getPlayerInventory(player, false); + ISpecialPlayerInventory inventory = plugin.getPlayerInventory(player, false); if (inventory != null) { inventory.playerOnline(player); player.updateInventory(); } - SpecialEnderChest enderChest = plugin.getPlayerEnderChest(player, false); + ISpecialEnderChest enderChest = plugin.getPlayerEnderChest(player, false); if (enderChest != null) { enderChest.playerOnline(player); } @@ -78,16 +78,18 @@ public class OpenInvPlayerListener implements Listener { public void onPlayerQuit(PlayerQuitEvent event) { Player player = event.getPlayer(); - SpecialPlayerInventory inventory = plugin.getPlayerInventory(player, false); + ISpecialPlayerInventory inventory = plugin.getPlayerInventory(player, false); if (inventory != null) { - if (inventory.playerOffline()) { + inventory.playerOffline(); + if (inventory.isInUse()) { plugin.removeLoadedInventory(event.getPlayer()); } } - SpecialEnderChest enderChest = plugin.getPlayerEnderChest(player, false); + ISpecialEnderChest enderChest = plugin.getPlayerEnderChest(player, false); if (enderChest != null) { - if (enderChest.playerOffline()) { + enderChest.playerOffline(); + if (!enderChest.isInUse()) { plugin.removeLoadedEnderChest(event.getPlayer()); } } diff --git a/plugin/src/main/java/com/lishid/openinv/util/Cache.java b/plugin/src/main/java/com/lishid/openinv/util/Cache.java new file mode 100644 index 0000000..5a552b3 --- /dev/null +++ b/plugin/src/main/java/com/lishid/openinv/util/Cache.java @@ -0,0 +1,160 @@ +package com.lishid.openinv.util; + +import java.util.Comparator; +import java.util.HashMap; +import java.util.Iterator; +import java.util.Map; + +import com.google.common.collect.Multimap; +import com.google.common.collect.TreeMultimap; + +/** + * A minimal time-based cache implementation backed by a HashMap and TreeMultimap. + * + * @author Jikoo + */ +public class Cache { + + private final Map internal; + private final Multimap expiry; + private final long retention; + private final Function inUseCheck, postRemoval; + + /** + * Constructs a Cache with the specified retention duration, in use function, and post-removal function. + * + * @param retention duration after which keys are automatically invalidated if not in use + * @param inUseCheck Function used to check if a key is considered in use + * @param postRemoval Function used to perform any operations required when a key is invalidated + */ + public Cache(long retention, Function inUseCheck, Function postRemoval) { + this.internal = new HashMap(); + + this.expiry = TreeMultimap.create(new Comparator() { + @Override + public int compare(Long long1, Long long2) { + return long1.compareTo(long2); + } + }, + new Comparator() { + @Override + public int compare(K k1, K k2) { + return 0; + } + }); + + this.retention = retention; + this.inUseCheck = inUseCheck; + this.postRemoval = postRemoval; + } + + /** + * Set a key and value pair. Keys are unique. Using an existing key will cause the old value to + * be overwritten and the expiration timer to be reset. + * + * @param key key with which the specified value is to be associated + * @param value value to be associated with the specified key + */ + public void put(K key, V value) { + // Invalidate key - runs lazy check and ensures value won't be cleaned up early + invalidate(key); + + internal.put(key, value); + expiry.put(System.currentTimeMillis() + retention, key); + } + + /** + * Returns the value to which the specified key is mapped, or null if no value is mapped for the key. + * + * @param key the key whose associated value is to be returned + * @return the value to which the specified key is mapped, or null if no value is mapped for the key + */ + public V get(K key) { + // Run lazy check to clean cache + lazyCheck(); + + return internal.get(key); + } + + /** + * Returns true if the specified key is mapped to a value. + * + * @param key key to check if a mapping exists for + * @return true if a mapping exists for the specified key + */ + public boolean containsKey(K key) { + // Run lazy check to clean cache + lazyCheck(); + + return internal.containsKey(key); + } + + /** + * Forcibly invalidates a key, even if it is considered to be in use. + * + * @param key key to invalidate + */ + public void invalidate(K key) { + // Run lazy check to clean cache + lazyCheck(); + + if (!internal.containsKey(key)) { + // Value either not present or cleaned by lazy check. Either way, we're good + return; + } + + // Remove stored object + internal.remove(key); + + // Remove expiration entry - prevents more work later, plus prevents issues with values invalidating early + for (Iterator> iterator = expiry.entries().iterator(); iterator.hasNext();) { + if (key.equals(iterator.next().getValue())) { + iterator.remove(); + break; + } + } + } + + /** + * Forcibly invalidates all keys, even if they are considered to be in use. + */ + public void invalidateAll() { + for (V value : internal.values()) { + postRemoval.run(value); + } + expiry.clear(); + internal.clear(); + } + + /** + * Invalidate all expired keys that are not considered in use. If a key is expired but is + * considered in use by the provided Function, its expiration time is reset. + */ + private void lazyCheck() { + long now = System.currentTimeMillis(); + long nextExpiry = now + retention; + for (Iterator> iterator = expiry.entries().iterator(); iterator.hasNext();) { + Map.Entry entry = iterator.next(); + + if (entry.getKey() > now) { + break; + } + + iterator.remove(); + + if (inUseCheck.run(internal.get(entry.getValue()))) { + expiry.put(nextExpiry, entry.getValue()); + continue; + } + + V value = internal.remove(entry.getValue()); + + if (value == null) { + continue; + } + + postRemoval.run(value); + } + } + +} diff --git a/plugin/src/main/java/com/lishid/openinv/util/Function.java b/plugin/src/main/java/com/lishid/openinv/util/Function.java new file mode 100644 index 0000000..37894c1 --- /dev/null +++ b/plugin/src/main/java/com/lishid/openinv/util/Function.java @@ -0,0 +1,12 @@ +package com.lishid.openinv.util; + +/** + * Abstraction for some simple cache calls. + * + * @author Jikoo + */ +public abstract class Function { + + public abstract boolean run(V value); + +} diff --git a/src/main/java/com/lishid/openinv/utils/UUIDFetcher.java b/plugin/src/main/java/com/lishid/openinv/utils/UUIDFetcher.java similarity index 100% rename from src/main/java/com/lishid/openinv/utils/UUIDFetcher.java rename to plugin/src/main/java/com/lishid/openinv/utils/UUIDFetcher.java diff --git a/src/main/java/com/lishid/openinv/utils/UUIDUtils.java b/plugin/src/main/java/com/lishid/openinv/utils/UUIDUtils.java similarity index 100% rename from src/main/java/com/lishid/openinv/utils/UUIDUtils.java rename to plugin/src/main/java/com/lishid/openinv/utils/UUIDUtils.java diff --git a/src/main/resources/config.yml b/plugin/src/main/resources/config.yml similarity index 100% rename from src/main/resources/config.yml rename to plugin/src/main/resources/config.yml diff --git a/src/main/resources/plugin.yml b/plugin/src/main/resources/plugin.yml similarity index 96% rename from src/main/resources/plugin.yml rename to plugin/src/main/resources/plugin.yml index 78e279d..32c0457 100644 --- a/src/main/resources/plugin.yml +++ b/plugin/src/main/resources/plugin.yml @@ -1,45 +1,45 @@ -name: OpenInv -main: com.lishid.openinv.OpenInv -version: 2.4.0 -author: lishid -authors: [ShadowRanger] -description: > - This plugin allows you to open a player's inventory as a chest and interact with it in real time. -commands: - openinv: - aliases: [oi, inv, open] - description: Opens a player's inventory. - usage: | - / - Opens last person's inventory. - / - Opens a player's inventory. - openender: - aliases: [oe] - description: Opens a player's ender chest. - usage: | - / - Opens last person's ender chest. - / - Opens a player's ender chest. - searchinv: - aliases: [si] - description: Searches and lists players that have a specific item in their inventory. - usage: | - / [minAmount] - Item can be the Item ID or the CraftBukkit Item Name, minAmount is the minimum amount to be considered. - searchender: - aliases: [se] - description: Searches and lists players that have a specific item in their ender chest. - usage: | - / [minAmount] - Item can be the Item ID or the CraftBukkit Item Name, minAmount is the minimum amount to be considered. - toggleopeninv: - aliases: [toi, toggleoi, toggleinv] - description: Toggles the item openinv function. - usage: | - / [check] - Checks whether item openinv is enabled. - anychest: - aliases: [ac] - description: Toggles the any chest function, which allows opening of blocked chests. - usage: | - / [check] - Checks whether any chest is enabled. - silentchest: - aliases: [sc, silent] - description: Toggles the silent chest function, which hides the animation of a chest when opened or closed, and suppresses the sound. - usage: | - / [check] - Checks whether silent chest is enabled. \ No newline at end of file +name: OpenInv +main: com.lishid.openinv.OpenInv +version: ${openinv.version} +author: lishid +authors: [ShadowRanger] +description: > + This plugin allows you to open a player's inventory as a chest and interact with it in real time. +commands: + openinv: + aliases: [oi, inv, open] + description: Opens a player's inventory. + usage: | + / - Opens last person's inventory. + / - Opens a player's inventory. + openender: + aliases: [oe] + description: Opens a player's ender chest. + usage: | + / - Opens last person's ender chest. + / - Opens a player's ender chest. + searchinv: + aliases: [si] + description: Searches and lists players that have a specific item in their inventory. + usage: | + / [minAmount] - Item can be the Item ID or the CraftBukkit Item Name, minAmount is the minimum amount to be considered. + searchender: + aliases: [se] + description: Searches and lists players that have a specific item in their ender chest. + usage: | + / [minAmount] - Item can be the Item ID or the CraftBukkit Item Name, minAmount is the minimum amount to be considered. + toggleopeninv: + aliases: [toi, toggleoi, toggleinv] + description: Toggles the item openinv function. + usage: | + / [check] - Checks whether item openinv is enabled. + anychest: + aliases: [ac] + description: Toggles the any chest function, which allows opening of blocked chests. + usage: | + / [check] - Checks whether any chest is enabled. + silentchest: + aliases: [sc, silent] + description: Toggles the silent chest function, which hides the animation of a chest when opened or closed, and suppresses the sound. + usage: | + / [check] - Checks whether silent chest is enabled. diff --git a/pom.xml b/pom.xml index 647b723..8bd482c 100644 --- a/pom.xml +++ b/pom.xml @@ -1,55 +1,128 @@ - 4.0.0 - com.lishid - openinv - jar - 2.4.0 - OpenInv - http://dev.bukkit.org/bukkit-plugins/openinv/ + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> + 4.0.0 + com.lishid + openinv + pom + 1.0-SNAPSHOT + OpenInv + http://dev.bukkit.org/bukkit-plugins/openinv/ - - UTF-8 - + + UTF-8 + 3.0.0-SNAPSHOT + - - - bukkit-repo - https://hub.spigotmc.org/nexus/content/groups/public/ - - + - - - org.bukkit - craftbukkit - 1.11-R0.1-SNAPSHOT - provided - - + - - clean install - src/main/java - - - src/main/resources - true - - **/*.java - - - + + + reactorbuildfirst + + + !breakBuildProcess + + + + internal + plugin + + + + + latest + + + latest + true + + + + v1_11_R1 + + + + + all + + true + + + v1_11_R1 + + + + + + reactorbuildlast + + + !breakBuildProcess + + + + assembly + + + + + + + + spigot-repo + https://hub.spigotmc.org/nexus/content/groups/public/ + + + + + + + org.apache.maven.plugins + maven-shade-plugin + 2.4.3 + + + + *:* + + META-INF/maven/** + + + + + + package + + shade + + + + + + + maven-compiler-plugin + 3.5.1 + + 1.6 + 1.6 + + + + - - - maven-compiler-plugin - 2.3.2 - - 1.6 - 1.6 - - - - \ No newline at end of file diff --git a/v1_11_R1/pom.xml b/v1_11_R1/pom.xml new file mode 100644 index 0000000..bfbba58 --- /dev/null +++ b/v1_11_R1/pom.xml @@ -0,0 +1,28 @@ + + 4.0.0 + + + com.lishid + openinv + 1.0-SNAPSHOT + + + openinvadapter1_11_R1 + OpenInvAdapter1_11_R1 + + + + com.lishid + openinvplugin + 1.0-SNAPSHOT + + + org.spigotmc + spigot + 1.11-R0.1-SNAPSHOT + provided + + + + diff --git a/src/main/java/com/lishid/openinv/internal/AnySilentChest.java b/v1_11_R1/src/main/java/com/lishid/openinv/internal/v1_11_R1/AnySilentChest.java similarity index 91% rename from src/main/java/com/lishid/openinv/internal/AnySilentChest.java rename to v1_11_R1/src/main/java/com/lishid/openinv/internal/v1_11_R1/AnySilentChest.java index 27d86a9..ebe3624 100644 --- a/src/main/java/com/lishid/openinv/internal/AnySilentChest.java +++ b/v1_11_R1/src/main/java/com/lishid/openinv/internal/v1_11_R1/AnySilentChest.java @@ -14,14 +14,14 @@ * along with this program. If not, see . */ -package com.lishid.openinv.internal; +package com.lishid.openinv.internal.v1_11_R1; import java.util.Iterator; -import org.bukkit.craftbukkit.v1_11_R1.entity.CraftPlayer; -import org.bukkit.entity.Player; - import com.lishid.openinv.OpenInv; +import com.lishid.openinv.internal.IAnySilentChest; + +import org.bukkit.entity.Player; import net.minecraft.server.v1_11_R1.AxisAlignedBB; import net.minecraft.server.v1_11_R1.Block; @@ -38,7 +38,9 @@ import net.minecraft.server.v1_11_R1.TileEntity; import net.minecraft.server.v1_11_R1.TileEntityChest; import net.minecraft.server.v1_11_R1.World; -public class AnySilentChest { +import org.bukkit.craftbukkit.v1_11_R1.entity.CraftPlayer; + +public class AnySilentChest implements IAnySilentChest { private final OpenInv plugin; @@ -46,7 +48,8 @@ public class AnySilentChest { this.plugin = plugin; } - public boolean isAnyChestNeeded(Player p, int x, int y, int z) { + @Override + public boolean isAnyChestNeeded(Player p, int x, int y, int z) { // FOR REFERENCE, LOOK AT net.minecraft.server.BlockChest BlockPosition position = new BlockPosition(x, y, z); EntityPlayer player = ((CraftPlayer) p).getHandle(); @@ -86,9 +89,9 @@ public class AnySilentChest { private boolean ocelotOnTop(World world, BlockPosition position) { Iterator iterator = world.a(EntityOcelot.class, - new AxisAlignedBB((double) position.getX(), (double) (position.getY() + 1), - (double) position.getZ(), (double) (position.getX() + 1), - (double) (position.getY() + 2), (double) (position.getZ() + 1))).iterator(); + new AxisAlignedBB(position.getX(), position.getY() + 1, + position.getZ(), position.getX() + 1, + position.getY() + 2, position.getZ() + 1)).iterator(); EntityOcelot entityOcelot; @@ -105,7 +108,8 @@ public class AnySilentChest { return true; } - public boolean activateChest(Player p, boolean anyChest, boolean silentChest, int x, int y, int z) { + @Override + public boolean activateChest(Player p, boolean anyChest, boolean silentChest, int x, int y, int z) { BlockPosition position = new BlockPosition(x, y, z); EntityPlayer player = ((CraftPlayer) p).getHandle(); World world = player.world; diff --git a/src/main/java/com/lishid/openinv/internal/EnumDirectionList.java b/v1_11_R1/src/main/java/com/lishid/openinv/internal/v1_11_R1/EnumDirectionList.java similarity index 92% rename from src/main/java/com/lishid/openinv/internal/EnumDirectionList.java rename to v1_11_R1/src/main/java/com/lishid/openinv/internal/v1_11_R1/EnumDirectionList.java index 36f19de..7236969 100644 --- a/src/main/java/com/lishid/openinv/internal/EnumDirectionList.java +++ b/v1_11_R1/src/main/java/com/lishid/openinv/internal/v1_11_R1/EnumDirectionList.java @@ -1,4 +1,4 @@ -package com.lishid.openinv.internal; +package com.lishid.openinv.internal.v1_11_R1; import java.util.Iterator; diff --git a/src/main/java/com/lishid/openinv/internal/InventoryAccess.java b/v1_11_R1/src/main/java/com/lishid/openinv/internal/v1_11_R1/InventoryAccess.java similarity index 98% rename from src/main/java/com/lishid/openinv/internal/InventoryAccess.java rename to v1_11_R1/src/main/java/com/lishid/openinv/internal/v1_11_R1/InventoryAccess.java index 2470e56..0dd1061 100644 --- a/src/main/java/com/lishid/openinv/internal/InventoryAccess.java +++ b/v1_11_R1/src/main/java/com/lishid/openinv/internal/v1_11_R1/InventoryAccess.java @@ -14,7 +14,7 @@ * along with this program. If not, see . */ -package com.lishid.openinv.internal; +package com.lishid.openinv.internal.v1_11_R1; import java.lang.reflect.Field; diff --git a/src/main/java/com/lishid/openinv/internal/PlayerDataManager.java b/v1_11_R1/src/main/java/com/lishid/openinv/internal/v1_11_R1/PlayerDataManager.java similarity index 97% rename from src/main/java/com/lishid/openinv/internal/PlayerDataManager.java rename to v1_11_R1/src/main/java/com/lishid/openinv/internal/v1_11_R1/PlayerDataManager.java index f764aed..0632b89 100644 --- a/src/main/java/com/lishid/openinv/internal/PlayerDataManager.java +++ b/v1_11_R1/src/main/java/com/lishid/openinv/internal/v1_11_R1/PlayerDataManager.java @@ -14,7 +14,7 @@ * along with this program. If not, see . */ -package com.lishid.openinv.internal; +package com.lishid.openinv.internal.v1_11_R1; import java.util.UUID; diff --git a/src/main/java/com/lishid/openinv/internal/SilentInventory.java b/v1_11_R1/src/main/java/com/lishid/openinv/internal/v1_11_R1/SilentInventory.java similarity index 98% rename from src/main/java/com/lishid/openinv/internal/SilentInventory.java rename to v1_11_R1/src/main/java/com/lishid/openinv/internal/v1_11_R1/SilentInventory.java index ea5020c..4786853 100644 --- a/src/main/java/com/lishid/openinv/internal/SilentInventory.java +++ b/v1_11_R1/src/main/java/com/lishid/openinv/internal/v1_11_R1/SilentInventory.java @@ -1,4 +1,4 @@ -package com.lishid.openinv.internal; +package com.lishid.openinv.internal.v1_11_R1; import java.util.List; diff --git a/src/main/java/com/lishid/openinv/internal/SpecialEnderChest.java b/v1_11_R1/src/main/java/com/lishid/openinv/internal/v1_11_R1/SpecialEnderChest.java similarity index 98% rename from src/main/java/com/lishid/openinv/internal/SpecialEnderChest.java rename to v1_11_R1/src/main/java/com/lishid/openinv/internal/v1_11_R1/SpecialEnderChest.java index 3b82d2f..45e53e2 100644 --- a/src/main/java/com/lishid/openinv/internal/SpecialEnderChest.java +++ b/v1_11_R1/src/main/java/com/lishid/openinv/internal/v1_11_R1/SpecialEnderChest.java @@ -14,7 +14,7 @@ * along with this program. If not, see . */ -package com.lishid.openinv.internal; +package com.lishid.openinv.internal.v1_11_R1; import java.lang.reflect.Field; import java.util.List; diff --git a/src/main/java/com/lishid/openinv/internal/SpecialPlayerInventory.java b/v1_11_R1/src/main/java/com/lishid/openinv/internal/v1_11_R1/SpecialPlayerInventory.java similarity index 99% rename from src/main/java/com/lishid/openinv/internal/SpecialPlayerInventory.java rename to v1_11_R1/src/main/java/com/lishid/openinv/internal/v1_11_R1/SpecialPlayerInventory.java index b857690..a19bfe4 100644 --- a/src/main/java/com/lishid/openinv/internal/SpecialPlayerInventory.java +++ b/v1_11_R1/src/main/java/com/lishid/openinv/internal/v1_11_R1/SpecialPlayerInventory.java @@ -14,7 +14,7 @@ * along with this program. If not, see . */ -package com.lishid.openinv.internal; +package com.lishid.openinv.internal.v1_11_R1; import java.lang.reflect.Field;