diff --git a/api/pom.xml b/api/pom.xml index 15bae96..3a66ec0 100644 --- a/api/pom.xml +++ b/api/pom.xml @@ -5,7 +5,7 @@ com.lishid openinvparent - 3.2.2-SNAPSHOT + 3.3.0-SNAPSHOT openinvapi diff --git a/api/src/main/java/com/lishid/openinv/internal/IAnySilentContainer.java b/api/src/main/java/com/lishid/openinv/internal/IAnySilentContainer.java index 8f97e18..7eac2bf 100644 --- a/api/src/main/java/com/lishid/openinv/internal/IAnySilentContainer.java +++ b/api/src/main/java/com/lishid/openinv/internal/IAnySilentContainer.java @@ -6,16 +6,27 @@ import org.bukkit.entity.Player; public interface IAnySilentContainer { /** - * 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 + * 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 the Player opening the container + * @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 isAnySilentContainer(Block block); + public boolean activateContainer(Player player, boolean silentchest, Block block); + + /** + * Closes the Player's currently open container silently, if necessary. + * + * @param player the Player closing a container + */ + public void deactivateContainer(Player player); /** * 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 @@ -23,15 +34,11 @@ public interface IAnySilentContainer { 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 + * 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 activateContainer(Player player, boolean silentchest, Block block); + public boolean isAnySilentContainer(Block block); } diff --git a/assembly/pom.xml b/assembly/pom.xml index 4e3b67c..c503030 100644 --- a/assembly/pom.xml +++ b/assembly/pom.xml @@ -5,7 +5,7 @@ com.lishid openinvparent - 3.2.2-SNAPSHOT + 3.3.0-SNAPSHOT openinvassembly diff --git a/common/pom.xml b/common/pom.xml index 5e6738d..e014004 100644 --- a/common/pom.xml +++ b/common/pom.xml @@ -5,7 +5,7 @@ com.lishid openinvparent - 3.2.2-SNAPSHOT + 3.3.0-SNAPSHOT openinvcommon @@ -22,7 +22,7 @@ com.lishid openinvapi - 3.2.2-SNAPSHOT + 3.3.0-SNAPSHOT diff --git a/internal/1_4_5/pom.xml b/internal/1_4_5/pom.xml index 4afc9bf..0e8e075 100644 --- a/internal/1_4_5/pom.xml +++ b/internal/1_4_5/pom.xml @@ -5,7 +5,7 @@ com.lishid openinvinternal - 3.2.2-SNAPSHOT + 3.3.0-SNAPSHOT openinvadapter1_4_5 @@ -21,7 +21,7 @@ com.lishid openinvcommon - 3.2.2-SNAPSHOT + 3.3.0-SNAPSHOT diff --git a/internal/1_4_5/src/main/java/com/lishid/openinv/internal/v1_4_5/AnySilentContainer.java b/internal/1_4_5/src/main/java/com/lishid/openinv/internal/v1_4_5/AnySilentContainer.java index 55ea5d7..4bff7b8 100644 --- a/internal/1_4_5/src/main/java/com/lishid/openinv/internal/v1_4_5/AnySilentContainer.java +++ b/internal/1_4_5/src/main/java/com/lishid/openinv/internal/v1_4_5/AnySilentContainer.java @@ -165,4 +165,7 @@ public class AnySilentContainer implements IAnySilentContainer { } } + @Override + public void deactivateContainer(final Player bukkitPlayer) {} + } diff --git a/internal/1_4_6/pom.xml b/internal/1_4_6/pom.xml index 5a5b0d0..df34a76 100644 --- a/internal/1_4_6/pom.xml +++ b/internal/1_4_6/pom.xml @@ -5,7 +5,7 @@ com.lishid openinvinternal - 3.2.2-SNAPSHOT + 3.3.0-SNAPSHOT openinvadapter1_4_6 @@ -21,7 +21,7 @@ com.lishid openinvcommon - 3.2.2-SNAPSHOT + 3.3.0-SNAPSHOT diff --git a/internal/1_4_6/src/main/java/com/lishid/openinv/internal/v1_4_6/AnySilentContainer.java b/internal/1_4_6/src/main/java/com/lishid/openinv/internal/v1_4_6/AnySilentContainer.java index 14d440c..f420591 100644 --- a/internal/1_4_6/src/main/java/com/lishid/openinv/internal/v1_4_6/AnySilentContainer.java +++ b/internal/1_4_6/src/main/java/com/lishid/openinv/internal/v1_4_6/AnySilentContainer.java @@ -165,4 +165,7 @@ public class AnySilentContainer implements IAnySilentContainer { } } + @Override + public void deactivateContainer(final Player bukkitPlayer) {} + } diff --git a/internal/pom.xml b/internal/pom.xml index 735b2e7..b78ad8c 100644 --- a/internal/pom.xml +++ b/internal/pom.xml @@ -5,7 +5,7 @@ com.lishid openinvparent - 3.2.2-SNAPSHOT + 3.3.0-SNAPSHOT openinvinternal diff --git a/internal/v1_10_R1/pom.xml b/internal/v1_10_R1/pom.xml index 2363e42..81a8306 100644 --- a/internal/v1_10_R1/pom.xml +++ b/internal/v1_10_R1/pom.xml @@ -5,7 +5,7 @@ com.lishid openinvinternal - 3.2.2-SNAPSHOT + 3.3.0-SNAPSHOT openinvadapter1_10_R1 @@ -21,7 +21,7 @@ com.lishid openinvcommon - 3.2.2-SNAPSHOT + 3.3.0-SNAPSHOT diff --git a/internal/v1_10_R1/src/main/java/com/lishid/openinv/internal/v1_10_R1/AnySilentContainer.java b/internal/v1_10_R1/src/main/java/com/lishid/openinv/internal/v1_10_R1/AnySilentContainer.java index 66182f1..916427b 100644 --- a/internal/v1_10_R1/src/main/java/com/lishid/openinv/internal/v1_10_R1/AnySilentContainer.java +++ b/internal/v1_10_R1/src/main/java/com/lishid/openinv/internal/v1_10_R1/AnySilentContainer.java @@ -211,4 +211,7 @@ public class AnySilentContainer implements IAnySilentContainer { } } + @Override + public void deactivateContainer(final Player bukkitPlayer) {} + } diff --git a/internal/v1_11_R1/pom.xml b/internal/v1_11_R1/pom.xml index 567b310..20a693c 100644 --- a/internal/v1_11_R1/pom.xml +++ b/internal/v1_11_R1/pom.xml @@ -5,7 +5,7 @@ com.lishid openinvinternal - 3.2.2-SNAPSHOT + 3.3.0-SNAPSHOT openinvadapter1_11_R1 @@ -21,7 +21,7 @@ com.lishid openinvcommon - 3.2.2-SNAPSHOT + 3.3.0-SNAPSHOT diff --git a/internal/v1_11_R1/src/main/java/com/lishid/openinv/internal/v1_11_R1/AnySilentContainer.java b/internal/v1_11_R1/src/main/java/com/lishid/openinv/internal/v1_11_R1/AnySilentContainer.java index 2a5621d..cb0a110 100644 --- a/internal/v1_11_R1/src/main/java/com/lishid/openinv/internal/v1_11_R1/AnySilentContainer.java +++ b/internal/v1_11_R1/src/main/java/com/lishid/openinv/internal/v1_11_R1/AnySilentContainer.java @@ -16,14 +16,14 @@ package com.lishid.openinv.internal.v1_11_R1; +import java.lang.reflect.Field; + import com.lishid.openinv.internal.IAnySilentContainer; -import org.bukkit.Bukkit; -import org.bukkit.ChatColor; import org.bukkit.Material; import org.bukkit.block.BlockState; import org.bukkit.entity.Player; -import org.bukkit.scheduler.BukkitRunnable; +import org.bukkit.inventory.InventoryView; import net.minecraft.server.v1_11_R1.AxisAlignedBB; import net.minecraft.server.v1_11_R1.Block; @@ -31,7 +31,6 @@ import net.minecraft.server.v1_11_R1.BlockChest; import net.minecraft.server.v1_11_R1.BlockEnderChest; import net.minecraft.server.v1_11_R1.BlockPosition; import net.minecraft.server.v1_11_R1.BlockShulkerBox; -import net.minecraft.server.v1_11_R1.Container; import net.minecraft.server.v1_11_R1.Entity; import net.minecraft.server.v1_11_R1.EntityOcelot; import net.minecraft.server.v1_11_R1.EntityPlayer; @@ -40,18 +39,29 @@ import net.minecraft.server.v1_11_R1.IBlockData; import net.minecraft.server.v1_11_R1.ITileInventory; import net.minecraft.server.v1_11_R1.InventoryEnderChest; import net.minecraft.server.v1_11_R1.InventoryLargeChest; -import net.minecraft.server.v1_11_R1.PacketPlayOutOpenWindow; import net.minecraft.server.v1_11_R1.StatisticList; import net.minecraft.server.v1_11_R1.TileEntity; import net.minecraft.server.v1_11_R1.TileEntityChest; import net.minecraft.server.v1_11_R1.TileEntityEnderChest; import net.minecraft.server.v1_11_R1.TileEntityShulkerBox; import net.minecraft.server.v1_11_R1.World; - -import org.bukkit.craftbukkit.v1_11_R1.event.CraftEventFactory; +import net.minecraft.server.v1_11_R1.EnumGamemode; +import net.minecraft.server.v1_11_R1.PlayerInteractManager; public class AnySilentContainer implements IAnySilentContainer { + private Field playerInteractManagerGamemode; + + public AnySilentContainer() { + try { + this.playerInteractManagerGamemode = PlayerInteractManager.class.getDeclaredField("gamemode"); + this.playerInteractManagerGamemode.setAccessible(true); + } catch (Exception e) { + System.err.println("[OpenInv] Unable to directly write player gamemode! SilentChest will fail."); + e.printStackTrace(); + } + } + @Override public boolean isAnySilentContainer(org.bukkit.block.Block block) { if (block.getType() == Material.ENDER_CHEST) { @@ -186,7 +196,6 @@ public class AnySilentContainer implements IAnySilentContainer { ITileInventory tileInventory = (ITileInventory) tile; Block block = world.getType(blockPosition).getBlock(); - Container container = null; if (block instanceof BlockChest) { for (EnumDirection localEnumDirection : EnumDirection.EnumDirectionLimit.HORIZONTAL) { @@ -218,68 +227,68 @@ public class AnySilentContainer implements IAnySilentContainer { } else if (blockChest.g == BlockChest.Type.TRAP) { player.b(StatisticList.getStatistic("stat.trappedChestTriggered")); } - - if (silentchest) { - container = new SilentContainerChest(player.inventory, tileInventory, player); - } } if (block instanceof BlockShulkerBox) { player.b(StatisticList.getStatistic("stat.shulkerBoxOpened")); - - if (silentchest && tileInventory instanceof TileEntityShulkerBox) { - // Set value to current + 1. Ensures consistency later when resetting. - SilentContainerShulkerBox.setOpenValue((TileEntityShulkerBox) tileInventory, - SilentContainerShulkerBox.getOpenValue((TileEntityShulkerBox) tileInventory) + 1); - - container = new SilentContainerShulkerBox(player.inventory, tileInventory, player); - } } - // AnyChest only - SilentChest not active or container unsupported - if (!silentchest || container == null) { + // AnyChest only - SilentChest not active, container unsupported, or unnecessary. + if (!silentchest || player.playerInteractManager.getGameMode() == EnumGamemode.SPECTATOR) { player.openContainer(tileInventory); return true; } - // SilentChest + // SilentChest requires access to setting players' gamemode directly. + if (this.playerInteractManagerGamemode == null) { + return false; + } + + EnumGamemode gamemode = player.playerInteractManager.getGameMode(); + this.forceGameMode(player, EnumGamemode.SPECTATOR); + player.openContainer(tileInventory); + this.forceGameMode(player, gamemode); + return true; + } + + @Override + public void deactivateContainer(final Player bukkitPlayer) { + if (this.playerInteractManagerGamemode == null) { + return; + } + + InventoryView view = bukkitPlayer.getOpenInventory(); + switch (view.getType()) { + case CHEST: + case ENDER_CHEST: + case SHULKER_BOX: + break; + default: + return; + } + + EntityPlayer player = PlayerDataManager.getHandle(bukkitPlayer); + + EnumGamemode gamemode = player.playerInteractManager.getGameMode(); + this.forceGameMode(player, EnumGamemode.SPECTATOR); + player.activeContainer.b(player); + player.activeContainer = player.defaultContainer; + this.forceGameMode(player, gamemode); + } + + private void forceGameMode(final EntityPlayer player, final EnumGamemode gameMode) { + if (this.playerInteractManagerGamemode == null) { + // No need to warn repeatedly, error on startup and lack of function should be enough. + return; + } try { - // Call InventoryOpenEvent - container = CraftEventFactory.callInventoryOpenEvent(player, container, false); - if (container == null) { - return false; + if (!this.playerInteractManagerGamemode.isAccessible()) { + // Just in case, ensure accessible. + this.playerInteractManagerGamemode.setAccessible(true); } - - // Open window - int windowId = player.nextContainerCounter(); - player.playerConnection.sendPacket(new PacketPlayOutOpenWindow(windowId, tileInventory.getContainerName(), tileInventory.getScoreboardDisplayName(), tileInventory.getSize())); - player.activeContainer = container; - player.activeContainer.windowId = windowId; - player.activeContainer.addSlotListener(player); - - // Special handling for shulker boxes - reset value for viewers to what it was initially. - if (tile instanceof TileEntityShulkerBox) { - new BukkitRunnable() { - @Override - public void run() { - // TODO hacky - Object tile = world.getTileEntity(blockPosition); - if (!(tile instanceof TileEntityShulkerBox)) { - return; - } - TileEntityShulkerBox box = (TileEntityShulkerBox) tile; - // Reset back - we added 1, and calling TileEntityShulkerBox#startOpen adds 1 more. - SilentContainerShulkerBox.setOpenValue(box, - SilentContainerShulkerBox.getOpenValue((TileEntityShulkerBox) tile) - 2); - } - }.runTaskLater(Bukkit.getPluginManager().getPlugin("OpenInv"), 2); - } - - return true; + this.playerInteractManagerGamemode.set(player.playerInteractManager, gameMode); } catch (Exception e) { e.printStackTrace(); - p.sendMessage(ChatColor.RED + "Error while sending silent container."); - return false; } } diff --git a/internal/v1_11_R1/src/main/java/com/lishid/openinv/internal/v1_11_R1/SilentContainerChest.java b/internal/v1_11_R1/src/main/java/com/lishid/openinv/internal/v1_11_R1/SilentContainerChest.java deleted file mode 100644 index 65df1e6..0000000 --- a/internal/v1_11_R1/src/main/java/com/lishid/openinv/internal/v1_11_R1/SilentContainerChest.java +++ /dev/null @@ -1,46 +0,0 @@ -/* - * 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.v1_11_R1; - -import net.minecraft.server.v1_11_R1.ContainerChest; -import net.minecraft.server.v1_11_R1.EntityHuman; -import net.minecraft.server.v1_11_R1.IInventory; -import net.minecraft.server.v1_11_R1.ItemStack; -import net.minecraft.server.v1_11_R1.PlayerInventory; - -public class SilentContainerChest extends ContainerChest { - - public SilentContainerChest(PlayerInventory playerInventory, IInventory iInventory, - EntityHuman entityHuman) { - super(playerInventory, iInventory, entityHuman); - // Send close signal - iInventory.closeContainer(entityHuman); - } - - @Override - public void b(EntityHuman entityHuman) { - // Don't send close signal twice, might screw up - PlayerInventory playerinventory = entityHuman.inventory; - - if (playerinventory.getCarried() != ItemStack.a) { - ItemStack carried = playerinventory.getCarried(); - playerinventory.setCarried(ItemStack.a); - entityHuman.drop(carried, false); - } - } - -} diff --git a/internal/v1_11_R1/src/main/java/com/lishid/openinv/internal/v1_11_R1/SilentContainerShulkerBox.java b/internal/v1_11_R1/src/main/java/com/lishid/openinv/internal/v1_11_R1/SilentContainerShulkerBox.java deleted file mode 100644 index 9fd4fbf..0000000 --- a/internal/v1_11_R1/src/main/java/com/lishid/openinv/internal/v1_11_R1/SilentContainerShulkerBox.java +++ /dev/null @@ -1,56 +0,0 @@ -package com.lishid.openinv.internal.v1_11_R1; - -import java.lang.reflect.Field; - -import net.minecraft.server.v1_11_R1.ContainerShulkerBox; -import net.minecraft.server.v1_11_R1.EntityHuman; -import net.minecraft.server.v1_11_R1.IInventory; -import net.minecraft.server.v1_11_R1.ItemStack; -import net.minecraft.server.v1_11_R1.PlayerInventory; -import net.minecraft.server.v1_11_R1.TileEntityShulkerBox; - -public class SilentContainerShulkerBox extends ContainerShulkerBox { - - private static Field fieldShulkerActionData; - - public SilentContainerShulkerBox(PlayerInventory playerInventory, IInventory iInventory, - EntityHuman entityHuman) { - super(playerInventory, iInventory, entityHuman); - } - - @Override - public void b(EntityHuman entityHuman) { - PlayerInventory playerinventory = entityHuman.inventory; - - if (!playerinventory.getCarried().isEmpty()) { - entityHuman.drop(playerinventory.getCarried(), false); - playerinventory.setCarried(ItemStack.a); - } - } - - private static Field exposeOpenStatus() throws NoSuchFieldException, SecurityException { - if (fieldShulkerActionData == null) { - fieldShulkerActionData = TileEntityShulkerBox.class.getDeclaredField("h"); - fieldShulkerActionData.setAccessible(true); - } - return fieldShulkerActionData; - } - - public static void setOpenValue(TileEntityShulkerBox tileShulkerBox, Object value) { - try { - exposeOpenStatus().set(tileShulkerBox, value); - } catch (Exception e) { - e.printStackTrace(); - } - } - - public static Integer getOpenValue(TileEntityShulkerBox tileShulkerBox) { - try { - return (Integer) exposeOpenStatus().get(tileShulkerBox); - } catch (Exception e) { - e.printStackTrace(); - return 0; - } - } - -} diff --git a/internal/v1_12_R1/pom.xml b/internal/v1_12_R1/pom.xml index e4e237c..6d93dab 100644 --- a/internal/v1_12_R1/pom.xml +++ b/internal/v1_12_R1/pom.xml @@ -5,7 +5,7 @@ com.lishid openinvinternal - 3.2.2-SNAPSHOT + 3.3.0-SNAPSHOT openinvadapter1_12_R1 @@ -21,8 +21,21 @@ com.lishid openinvcommon - 3.2.2-SNAPSHOT + 3.3.0-SNAPSHOT + + + + maven-compiler-plugin + 3.6.1 + + 1.8 + 1.8 + + + + + diff --git a/internal/v1_12_R1/src/main/java/com/lishid/openinv/internal/v1_12_R1/AnySilentContainer.java b/internal/v1_12_R1/src/main/java/com/lishid/openinv/internal/v1_12_R1/AnySilentContainer.java index 904aad8..dfde6be 100644 --- a/internal/v1_12_R1/src/main/java/com/lishid/openinv/internal/v1_12_R1/AnySilentContainer.java +++ b/internal/v1_12_R1/src/main/java/com/lishid/openinv/internal/v1_12_R1/AnySilentContainer.java @@ -10,15 +10,15 @@ package com.lishid.openinv.internal.v1_12_R1; +import java.lang.reflect.Field; + import com.lishid.openinv.internal.IAnySilentContainer; -import org.bukkit.Bukkit; -import org.bukkit.ChatColor; import org.bukkit.Material; import org.bukkit.Statistic; import org.bukkit.block.BlockState; import org.bukkit.entity.Player; -import org.bukkit.scheduler.BukkitRunnable; +import org.bukkit.inventory.InventoryView; import net.minecraft.server.v1_12_R1.AxisAlignedBB; import net.minecraft.server.v1_12_R1.Block; @@ -26,26 +26,36 @@ import net.minecraft.server.v1_12_R1.BlockChest; import net.minecraft.server.v1_12_R1.BlockEnderChest; import net.minecraft.server.v1_12_R1.BlockPosition; import net.minecraft.server.v1_12_R1.BlockShulkerBox; -import net.minecraft.server.v1_12_R1.Container; import net.minecraft.server.v1_12_R1.Entity; import net.minecraft.server.v1_12_R1.EntityOcelot; import net.minecraft.server.v1_12_R1.EntityPlayer; import net.minecraft.server.v1_12_R1.EnumDirection; +import net.minecraft.server.v1_12_R1.EnumGamemode; import net.minecraft.server.v1_12_R1.IBlockData; import net.minecraft.server.v1_12_R1.ITileInventory; import net.minecraft.server.v1_12_R1.InventoryEnderChest; import net.minecraft.server.v1_12_R1.InventoryLargeChest; -import net.minecraft.server.v1_12_R1.PacketPlayOutOpenWindow; +import net.minecraft.server.v1_12_R1.PlayerInteractManager; import net.minecraft.server.v1_12_R1.TileEntity; import net.minecraft.server.v1_12_R1.TileEntityChest; import net.minecraft.server.v1_12_R1.TileEntityEnderChest; import net.minecraft.server.v1_12_R1.TileEntityShulkerBox; import net.minecraft.server.v1_12_R1.World; -import org.bukkit.craftbukkit.v1_12_R1.event.CraftEventFactory; - public class AnySilentContainer implements IAnySilentContainer { + private Field playerInteractManagerGamemode; + + public AnySilentContainer() { + try { + this.playerInteractManagerGamemode = PlayerInteractManager.class.getDeclaredField("gamemode"); + this.playerInteractManagerGamemode.setAccessible(true); + } catch (NoSuchFieldException | SecurityException e) { + System.err.println("[OpenInv] Unable to directly write player gamemode! SilentChest will fail."); + e.printStackTrace(); + } + } + @Override public boolean activateContainer(final Player bukkitPlayer, final boolean silentchest, final org.bukkit.block.Block bukkitBlock) { @@ -82,7 +92,6 @@ public class AnySilentContainer implements IAnySilentContainer { ITileInventory tileInventory = (ITileInventory) tile; Block block = world.getType(blockPosition).getBlock(); - Container container = null; if (block instanceof BlockChest) { for (EnumDirection localEnumDirection : EnumDirection.EnumDirectionLimit.HORIZONTAL) { @@ -115,73 +124,69 @@ public class AnySilentContainer implements IAnySilentContainer { } else if (blockChest.g == BlockChest.Type.TRAP) { bukkitPlayer.incrementStatistic(Statistic.TRAPPED_CHEST_TRIGGERED); } - - if (silentchest) { - container = new SilentContainerChest(player.inventory, tileInventory, player); - } } if (block instanceof BlockShulkerBox) { bukkitPlayer.incrementStatistic(Statistic.SHULKER_BOX_OPENED); - - if (silentchest && tileInventory instanceof TileEntityShulkerBox) { - // Set value to current + 1. Ensures consistency later when resetting. - SilentContainerShulkerBox.setOpenValue((TileEntityShulkerBox) tileInventory, - SilentContainerShulkerBox.getOpenValue((TileEntityShulkerBox) tileInventory) - + 1); - - container = new SilentContainerShulkerBox(player.inventory, tileInventory, player); - } } - // AnyChest only - SilentChest not active or container unsupported - if (!silentchest || container == null) { + // AnyChest only - SilentChest not active, container unsupported, or unnecessary. + if (!silentchest || player.playerInteractManager.getGameMode() == EnumGamemode.SPECTATOR) { player.openContainer(tileInventory); return true; } - // SilentChest - try { - // Call InventoryOpenEvent - container = CraftEventFactory.callInventoryOpenEvent(player, container, false); - if (container == null) { - return false; - } - - // Open window - int windowId = player.nextContainerCounter(); - player.playerConnection.sendPacket( - new PacketPlayOutOpenWindow(windowId, tileInventory.getContainerName(), - tileInventory.getScoreboardDisplayName(), tileInventory.getSize())); - player.activeContainer = container; - player.activeContainer.windowId = windowId; - player.activeContainer.addSlotListener(player); - - // Special handling for shulker boxes - reset value for viewers to what it was initially. - if (tile instanceof TileEntityShulkerBox) { - new BukkitRunnable() { - @Override - public void run() { - // TODO hacky - Object tile = world.getTileEntity(blockPosition); - if (!(tile instanceof TileEntityShulkerBox)) { - return; - } - TileEntityShulkerBox box = (TileEntityShulkerBox) tile; - // Reset back - we added 1, and calling TileEntityShulkerBox#startOpen adds 1 more. - SilentContainerShulkerBox.setOpenValue(box, - SilentContainerShulkerBox.getOpenValue((TileEntityShulkerBox) tile) - - 2); - } - }.runTaskLater(Bukkit.getPluginManager().getPlugin("OpenInv"), 2); - } - - return true; - } catch (Exception e) { - e.printStackTrace(); - bukkitPlayer.sendMessage(ChatColor.RED + "Error while sending silent container."); + // SilentChest requires access to setting players' gamemode directly. + if (this.playerInteractManagerGamemode == null) { return false; } + + EnumGamemode gamemode = player.playerInteractManager.getGameMode(); + this.forceGameMode(player, EnumGamemode.SPECTATOR); + player.openContainer(tileInventory); + this.forceGameMode(player, gamemode); + return true; + } + + @Override + public void deactivateContainer(final Player bukkitPlayer) { + if (this.playerInteractManagerGamemode == null) { + return; + } + + InventoryView view = bukkitPlayer.getOpenInventory(); + switch (view.getType()) { + case CHEST: + case ENDER_CHEST: + case SHULKER_BOX: + break; + default: + return; + } + + EntityPlayer player = PlayerDataManager.getHandle(bukkitPlayer); + + EnumGamemode gamemode = player.playerInteractManager.getGameMode(); + this.forceGameMode(player, EnumGamemode.SPECTATOR); + player.activeContainer.b(player); + player.activeContainer = player.defaultContainer; + this.forceGameMode(player, gamemode); + } + + private void forceGameMode(final EntityPlayer player, final EnumGamemode gameMode) { + if (this.playerInteractManagerGamemode == null) { + // No need to warn repeatedly, error on startup and lack of function should be enough. + return; + } + try { + if (!this.playerInteractManagerGamemode.isAccessible()) { + // Just in case, ensure accessible. + this.playerInteractManagerGamemode.setAccessible(true); + } + this.playerInteractManagerGamemode.set(player.playerInteractManager, gameMode); + } catch (IllegalArgumentException | IllegalAccessException e) { + e.printStackTrace(); + } } private boolean hasOcelotOnTop(final World world, final BlockPosition blockPosition) { diff --git a/internal/v1_12_R1/src/main/java/com/lishid/openinv/internal/v1_12_R1/SilentContainerChest.java b/internal/v1_12_R1/src/main/java/com/lishid/openinv/internal/v1_12_R1/SilentContainerChest.java deleted file mode 100644 index 09a4424..0000000 --- a/internal/v1_12_R1/src/main/java/com/lishid/openinv/internal/v1_12_R1/SilentContainerChest.java +++ /dev/null @@ -1,40 +0,0 @@ -/* - * 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.v1_12_R1; - -import net.minecraft.server.v1_12_R1.ContainerChest; -import net.minecraft.server.v1_12_R1.EntityHuman; -import net.minecraft.server.v1_12_R1.IInventory; -import net.minecraft.server.v1_12_R1.ItemStack; -import net.minecraft.server.v1_12_R1.PlayerInventory; - -public class SilentContainerChest extends ContainerChest { - - public SilentContainerChest(final PlayerInventory playerInventory, final IInventory iInventory, - final EntityHuman entityHuman) { - super(playerInventory, iInventory, entityHuman); - // Send close signal - iInventory.closeContainer(entityHuman); - } - - @Override - public void b(final EntityHuman entityHuman) { - // Don't send close signal twice, might screw up - PlayerInventory playerinventory = entityHuman.inventory; - - if (playerinventory.getCarried() != ItemStack.a) { - ItemStack carried = playerinventory.getCarried(); - playerinventory.setCarried(ItemStack.a); - entityHuman.drop(carried, false); - } - } - -} diff --git a/internal/v1_12_R1/src/main/java/com/lishid/openinv/internal/v1_12_R1/SilentContainerShulkerBox.java b/internal/v1_12_R1/src/main/java/com/lishid/openinv/internal/v1_12_R1/SilentContainerShulkerBox.java deleted file mode 100644 index bc94298..0000000 --- a/internal/v1_12_R1/src/main/java/com/lishid/openinv/internal/v1_12_R1/SilentContainerShulkerBox.java +++ /dev/null @@ -1,57 +0,0 @@ -package com.lishid.openinv.internal.v1_12_R1; - -import java.lang.reflect.Field; - -import net.minecraft.server.v1_12_R1.ContainerShulkerBox; -import net.minecraft.server.v1_12_R1.EntityHuman; -import net.minecraft.server.v1_12_R1.IInventory; -import net.minecraft.server.v1_12_R1.ItemStack; -import net.minecraft.server.v1_12_R1.PlayerInventory; -import net.minecraft.server.v1_12_R1.TileEntityShulkerBox; - -public class SilentContainerShulkerBox extends ContainerShulkerBox { - - private static Field fieldShulkerActionData; - - private static Field exposeOpenStatus() throws NoSuchFieldException, SecurityException { - if (SilentContainerShulkerBox.fieldShulkerActionData == null) { - SilentContainerShulkerBox.fieldShulkerActionData = TileEntityShulkerBox.class - .getDeclaredField("h"); - SilentContainerShulkerBox.fieldShulkerActionData.setAccessible(true); - } - return SilentContainerShulkerBox.fieldShulkerActionData; - } - - public static Integer getOpenValue(final TileEntityShulkerBox tileShulkerBox) { - try { - return (Integer) SilentContainerShulkerBox.exposeOpenStatus().get(tileShulkerBox); - } catch (Exception e) { - e.printStackTrace(); - return 0; - } - } - - public static void setOpenValue(final TileEntityShulkerBox tileShulkerBox, final Object value) { - try { - SilentContainerShulkerBox.exposeOpenStatus().set(tileShulkerBox, value); - } catch (Exception e) { - e.printStackTrace(); - } - } - - public SilentContainerShulkerBox(final PlayerInventory playerInventory, - final IInventory iInventory, final EntityHuman entityHuman) { - super(playerInventory, iInventory, entityHuman); - } - - @Override - public void b(final EntityHuman entityHuman) { - PlayerInventory playerinventory = entityHuman.inventory; - - if (!playerinventory.getCarried().isEmpty()) { - entityHuman.drop(playerinventory.getCarried(), false); - playerinventory.setCarried(ItemStack.a); - } - } - -} diff --git a/internal/v1_4_R1/pom.xml b/internal/v1_4_R1/pom.xml index 4a41bc1..c7b6c5a 100644 --- a/internal/v1_4_R1/pom.xml +++ b/internal/v1_4_R1/pom.xml @@ -5,7 +5,7 @@ com.lishid openinvinternal - 3.2.2-SNAPSHOT + 3.3.0-SNAPSHOT openinvadapter1_4_R1 @@ -21,7 +21,7 @@ com.lishid openinvcommon - 3.2.2-SNAPSHOT + 3.3.0-SNAPSHOT diff --git a/internal/v1_4_R1/src/main/java/com/lishid/openinv/internal/v1_4_R1/AnySilentContainer.java b/internal/v1_4_R1/src/main/java/com/lishid/openinv/internal/v1_4_R1/AnySilentContainer.java index 3ef4bae..8bdcbd3 100644 --- a/internal/v1_4_R1/src/main/java/com/lishid/openinv/internal/v1_4_R1/AnySilentContainer.java +++ b/internal/v1_4_R1/src/main/java/com/lishid/openinv/internal/v1_4_R1/AnySilentContainer.java @@ -165,4 +165,7 @@ public class AnySilentContainer implements IAnySilentContainer { } } + @Override + public void deactivateContainer(final Player bukkitPlayer) {} + } diff --git a/internal/v1_5_R2/pom.xml b/internal/v1_5_R2/pom.xml index cc08ed4..ce49cf5 100644 --- a/internal/v1_5_R2/pom.xml +++ b/internal/v1_5_R2/pom.xml @@ -5,7 +5,7 @@ com.lishid openinvinternal - 3.2.2-SNAPSHOT + 3.3.0-SNAPSHOT openinvadapter1_5_R2 @@ -21,7 +21,7 @@ com.lishid openinvcommon - 3.2.2-SNAPSHOT + 3.3.0-SNAPSHOT diff --git a/internal/v1_5_R2/src/main/java/com/lishid/openinv/internal/v1_5_R2/AnySilentContainer.java b/internal/v1_5_R2/src/main/java/com/lishid/openinv/internal/v1_5_R2/AnySilentContainer.java index 76f2cb9..b2f3c43 100644 --- a/internal/v1_5_R2/src/main/java/com/lishid/openinv/internal/v1_5_R2/AnySilentContainer.java +++ b/internal/v1_5_R2/src/main/java/com/lishid/openinv/internal/v1_5_R2/AnySilentContainer.java @@ -165,4 +165,7 @@ public class AnySilentContainer implements IAnySilentContainer { } } + @Override + public void deactivateContainer(final Player bukkitPlayer) {} + } diff --git a/internal/v1_5_R3/pom.xml b/internal/v1_5_R3/pom.xml index d62a25a..02c453d 100644 --- a/internal/v1_5_R3/pom.xml +++ b/internal/v1_5_R3/pom.xml @@ -5,7 +5,7 @@ com.lishid openinvinternal - 3.2.2-SNAPSHOT + 3.3.0-SNAPSHOT openinvadapter1_5_R3 @@ -21,7 +21,7 @@ com.lishid openinvcommon - 3.2.2-SNAPSHOT + 3.3.0-SNAPSHOT diff --git a/internal/v1_5_R3/src/main/java/com/lishid/openinv/internal/v1_5_R3/AnySilentContainer.java b/internal/v1_5_R3/src/main/java/com/lishid/openinv/internal/v1_5_R3/AnySilentContainer.java index f5393a6..02dc321 100644 --- a/internal/v1_5_R3/src/main/java/com/lishid/openinv/internal/v1_5_R3/AnySilentContainer.java +++ b/internal/v1_5_R3/src/main/java/com/lishid/openinv/internal/v1_5_R3/AnySilentContainer.java @@ -165,4 +165,7 @@ public class AnySilentContainer implements IAnySilentContainer { } } + @Override + public void deactivateContainer(final Player bukkitPlayer) {} + } diff --git a/internal/v1_6_R1/pom.xml b/internal/v1_6_R1/pom.xml index 9518816..31c62ed 100644 --- a/internal/v1_6_R1/pom.xml +++ b/internal/v1_6_R1/pom.xml @@ -5,7 +5,7 @@ com.lishid openinvinternal - 3.2.2-SNAPSHOT + 3.3.0-SNAPSHOT openinvadapter1_6_R1 @@ -21,7 +21,7 @@ com.lishid openinvcommon - 3.2.2-SNAPSHOT + 3.3.0-SNAPSHOT diff --git a/internal/v1_6_R1/src/main/java/com/lishid/openinv/internal/v1_6_R1/AnySilentContainer.java b/internal/v1_6_R1/src/main/java/com/lishid/openinv/internal/v1_6_R1/AnySilentContainer.java index fb5a306..660fefd 100644 --- a/internal/v1_6_R1/src/main/java/com/lishid/openinv/internal/v1_6_R1/AnySilentContainer.java +++ b/internal/v1_6_R1/src/main/java/com/lishid/openinv/internal/v1_6_R1/AnySilentContainer.java @@ -165,4 +165,7 @@ public class AnySilentContainer implements IAnySilentContainer { } } + @Override + public void deactivateContainer(final Player bukkitPlayer) {} + } diff --git a/internal/v1_6_R2/pom.xml b/internal/v1_6_R2/pom.xml index 71331a7..1909fed 100644 --- a/internal/v1_6_R2/pom.xml +++ b/internal/v1_6_R2/pom.xml @@ -5,7 +5,7 @@ com.lishid openinvinternal - 3.2.2-SNAPSHOT + 3.3.0-SNAPSHOT openinvadapter1_6_R2 @@ -21,7 +21,7 @@ com.lishid openinvcommon - 3.2.2-SNAPSHOT + 3.3.0-SNAPSHOT diff --git a/internal/v1_6_R2/src/main/java/com/lishid/openinv/internal/v1_6_R2/AnySilentContainer.java b/internal/v1_6_R2/src/main/java/com/lishid/openinv/internal/v1_6_R2/AnySilentContainer.java index 1b20b29..bd40860 100644 --- a/internal/v1_6_R2/src/main/java/com/lishid/openinv/internal/v1_6_R2/AnySilentContainer.java +++ b/internal/v1_6_R2/src/main/java/com/lishid/openinv/internal/v1_6_R2/AnySilentContainer.java @@ -165,4 +165,7 @@ public class AnySilentContainer implements IAnySilentContainer { } } + @Override + public void deactivateContainer(final Player bukkitPlayer) {} + } diff --git a/internal/v1_6_R3/pom.xml b/internal/v1_6_R3/pom.xml index e3e8d24..6c1445f 100644 --- a/internal/v1_6_R3/pom.xml +++ b/internal/v1_6_R3/pom.xml @@ -5,7 +5,7 @@ com.lishid openinvinternal - 3.2.2-SNAPSHOT + 3.3.0-SNAPSHOT openinvadapter1_6_R3 @@ -21,7 +21,7 @@ com.lishid openinvcommon - 3.2.2-SNAPSHOT + 3.3.0-SNAPSHOT diff --git a/internal/v1_6_R3/src/main/java/com/lishid/openinv/internal/v1_6_R3/AnySilentContainer.java b/internal/v1_6_R3/src/main/java/com/lishid/openinv/internal/v1_6_R3/AnySilentContainer.java index a7dec1d..d61e09c 100644 --- a/internal/v1_6_R3/src/main/java/com/lishid/openinv/internal/v1_6_R3/AnySilentContainer.java +++ b/internal/v1_6_R3/src/main/java/com/lishid/openinv/internal/v1_6_R3/AnySilentContainer.java @@ -165,4 +165,7 @@ public class AnySilentContainer implements IAnySilentContainer { } } + @Override + public void deactivateContainer(final Player bukkitPlayer) {} + } diff --git a/internal/v1_7_R1/pom.xml b/internal/v1_7_R1/pom.xml index 504f7a9..558472d 100644 --- a/internal/v1_7_R1/pom.xml +++ b/internal/v1_7_R1/pom.xml @@ -5,7 +5,7 @@ com.lishid openinvinternal - 3.2.2-SNAPSHOT + 3.3.0-SNAPSHOT openinvadapter1_7_R1 @@ -21,7 +21,7 @@ com.lishid openinvcommon - 3.2.2-SNAPSHOT + 3.3.0-SNAPSHOT diff --git a/internal/v1_7_R1/src/main/java/com/lishid/openinv/internal/v1_7_R1/AnySilentContainer.java b/internal/v1_7_R1/src/main/java/com/lishid/openinv/internal/v1_7_R1/AnySilentContainer.java index 2e71862..f400239 100644 --- a/internal/v1_7_R1/src/main/java/com/lishid/openinv/internal/v1_7_R1/AnySilentContainer.java +++ b/internal/v1_7_R1/src/main/java/com/lishid/openinv/internal/v1_7_R1/AnySilentContainer.java @@ -166,4 +166,7 @@ public class AnySilentContainer implements IAnySilentContainer { } } + @Override + public void deactivateContainer(final Player bukkitPlayer) {} + } diff --git a/internal/v1_7_R2/pom.xml b/internal/v1_7_R2/pom.xml index 3dc0519..14419bd 100644 --- a/internal/v1_7_R2/pom.xml +++ b/internal/v1_7_R2/pom.xml @@ -5,7 +5,7 @@ com.lishid openinvinternal - 3.2.2-SNAPSHOT + 3.3.0-SNAPSHOT openinvadapter1_7_R2 @@ -21,7 +21,7 @@ com.lishid openinvcommon - 3.2.2-SNAPSHOT + 3.3.0-SNAPSHOT diff --git a/internal/v1_7_R2/src/main/java/com/lishid/openinv/internal/v1_7_R2/AnySilentContainer.java b/internal/v1_7_R2/src/main/java/com/lishid/openinv/internal/v1_7_R2/AnySilentContainer.java index 2252593..d2f541c 100644 --- a/internal/v1_7_R2/src/main/java/com/lishid/openinv/internal/v1_7_R2/AnySilentContainer.java +++ b/internal/v1_7_R2/src/main/java/com/lishid/openinv/internal/v1_7_R2/AnySilentContainer.java @@ -166,4 +166,7 @@ public class AnySilentContainer implements IAnySilentContainer { } } + @Override + public void deactivateContainer(final Player bukkitPlayer) {} + } diff --git a/internal/v1_7_R3/pom.xml b/internal/v1_7_R3/pom.xml index 847c265..e9eb8b3 100644 --- a/internal/v1_7_R3/pom.xml +++ b/internal/v1_7_R3/pom.xml @@ -5,7 +5,7 @@ com.lishid openinvinternal - 3.2.2-SNAPSHOT + 3.3.0-SNAPSHOT openinvadapter1_7_R3 @@ -21,7 +21,7 @@ com.lishid openinvcommon - 3.2.2-SNAPSHOT + 3.3.0-SNAPSHOT diff --git a/internal/v1_7_R3/src/main/java/com/lishid/openinv/internal/v1_7_R3/AnySilentContainer.java b/internal/v1_7_R3/src/main/java/com/lishid/openinv/internal/v1_7_R3/AnySilentContainer.java index da958e5..1675080 100644 --- a/internal/v1_7_R3/src/main/java/com/lishid/openinv/internal/v1_7_R3/AnySilentContainer.java +++ b/internal/v1_7_R3/src/main/java/com/lishid/openinv/internal/v1_7_R3/AnySilentContainer.java @@ -166,4 +166,7 @@ public class AnySilentContainer implements IAnySilentContainer { } } + @Override + public void deactivateContainer(final Player bukkitPlayer) {} + } diff --git a/internal/v1_7_R4/pom.xml b/internal/v1_7_R4/pom.xml index 04446c7..871b352 100644 --- a/internal/v1_7_R4/pom.xml +++ b/internal/v1_7_R4/pom.xml @@ -5,7 +5,7 @@ com.lishid openinvinternal - 3.2.2-SNAPSHOT + 3.3.0-SNAPSHOT openinvadapter1_7_R4 @@ -27,7 +27,7 @@ com.lishid openinvcommon - 3.2.2-SNAPSHOT + 3.3.0-SNAPSHOT diff --git a/internal/v1_7_R4/src/main/java/com/lishid/openinv/internal/v1_7_R4/AnySilentContainer.java b/internal/v1_7_R4/src/main/java/com/lishid/openinv/internal/v1_7_R4/AnySilentContainer.java index c56b6b9..6323e5d 100644 --- a/internal/v1_7_R4/src/main/java/com/lishid/openinv/internal/v1_7_R4/AnySilentContainer.java +++ b/internal/v1_7_R4/src/main/java/com/lishid/openinv/internal/v1_7_R4/AnySilentContainer.java @@ -166,4 +166,7 @@ public class AnySilentContainer implements IAnySilentContainer { } } + @Override + public void deactivateContainer(final Player bukkitPlayer) {} + } diff --git a/internal/v1_8_R1/pom.xml b/internal/v1_8_R1/pom.xml index 0d7b775..f05f553 100644 --- a/internal/v1_8_R1/pom.xml +++ b/internal/v1_8_R1/pom.xml @@ -5,7 +5,7 @@ com.lishid openinvinternal - 3.2.2-SNAPSHOT + 3.3.0-SNAPSHOT openinvadapter1_8_R1 @@ -21,7 +21,7 @@ com.lishid openinvcommon - 3.2.2-SNAPSHOT + 3.3.0-SNAPSHOT diff --git a/internal/v1_8_R1/src/main/java/com/lishid/openinv/internal/v1_8_R1/AnySilentContainer.java b/internal/v1_8_R1/src/main/java/com/lishid/openinv/internal/v1_8_R1/AnySilentContainer.java index 17b195b..b5cb77a 100644 --- a/internal/v1_8_R1/src/main/java/com/lishid/openinv/internal/v1_8_R1/AnySilentContainer.java +++ b/internal/v1_8_R1/src/main/java/com/lishid/openinv/internal/v1_8_R1/AnySilentContainer.java @@ -210,4 +210,7 @@ public class AnySilentContainer implements IAnySilentContainer { } } + @Override + public void deactivateContainer(final Player bukkitPlayer) {} + } diff --git a/internal/v1_8_R2/pom.xml b/internal/v1_8_R2/pom.xml index 26e4815..0b8ef6d 100644 --- a/internal/v1_8_R2/pom.xml +++ b/internal/v1_8_R2/pom.xml @@ -5,7 +5,7 @@ com.lishid openinvinternal - 3.2.2-SNAPSHOT + 3.3.0-SNAPSHOT openinvadapter1_8_R2 @@ -21,7 +21,7 @@ com.lishid openinvcommon - 3.2.2-SNAPSHOT + 3.3.0-SNAPSHOT diff --git a/internal/v1_8_R2/src/main/java/com/lishid/openinv/internal/v1_8_R2/AnySilentContainer.java b/internal/v1_8_R2/src/main/java/com/lishid/openinv/internal/v1_8_R2/AnySilentContainer.java index 83680c8..773f1f9 100644 --- a/internal/v1_8_R2/src/main/java/com/lishid/openinv/internal/v1_8_R2/AnySilentContainer.java +++ b/internal/v1_8_R2/src/main/java/com/lishid/openinv/internal/v1_8_R2/AnySilentContainer.java @@ -211,4 +211,7 @@ public class AnySilentContainer implements IAnySilentContainer { } } + @Override + public void deactivateContainer(final Player bukkitPlayer) {} + } diff --git a/internal/v1_8_R3/pom.xml b/internal/v1_8_R3/pom.xml index f80f372..8121fac 100644 --- a/internal/v1_8_R3/pom.xml +++ b/internal/v1_8_R3/pom.xml @@ -5,7 +5,7 @@ com.lishid openinvinternal - 3.2.2-SNAPSHOT + 3.3.0-SNAPSHOT openinvadapter1_8_R3 @@ -21,7 +21,7 @@ com.lishid openinvcommon - 3.2.2-SNAPSHOT + 3.3.0-SNAPSHOT diff --git a/internal/v1_8_R3/src/main/java/com/lishid/openinv/internal/v1_8_R3/AnySilentContainer.java b/internal/v1_8_R3/src/main/java/com/lishid/openinv/internal/v1_8_R3/AnySilentContainer.java index fea742a..3789042 100644 --- a/internal/v1_8_R3/src/main/java/com/lishid/openinv/internal/v1_8_R3/AnySilentContainer.java +++ b/internal/v1_8_R3/src/main/java/com/lishid/openinv/internal/v1_8_R3/AnySilentContainer.java @@ -211,4 +211,7 @@ public class AnySilentContainer implements IAnySilentContainer { } } + @Override + public void deactivateContainer(final Player bukkitPlayer) {} + } diff --git a/internal/v1_9_R1/pom.xml b/internal/v1_9_R1/pom.xml index 39a84da..f01f6a5 100644 --- a/internal/v1_9_R1/pom.xml +++ b/internal/v1_9_R1/pom.xml @@ -5,7 +5,7 @@ com.lishid openinvinternal - 3.2.2-SNAPSHOT + 3.3.0-SNAPSHOT openinvadapter1_9_R1 @@ -21,7 +21,7 @@ com.lishid openinvcommon - 3.2.2-SNAPSHOT + 3.3.0-SNAPSHOT diff --git a/internal/v1_9_R1/src/main/java/com/lishid/openinv/internal/v1_9_R1/AnySilentContainer.java b/internal/v1_9_R1/src/main/java/com/lishid/openinv/internal/v1_9_R1/AnySilentContainer.java index 08933fd..e4e26c8 100644 --- a/internal/v1_9_R1/src/main/java/com/lishid/openinv/internal/v1_9_R1/AnySilentContainer.java +++ b/internal/v1_9_R1/src/main/java/com/lishid/openinv/internal/v1_9_R1/AnySilentContainer.java @@ -211,4 +211,7 @@ public class AnySilentContainer implements IAnySilentContainer { } } + @Override + public void deactivateContainer(final Player bukkitPlayer) {} + } diff --git a/internal/v1_9_R2/pom.xml b/internal/v1_9_R2/pom.xml index c70697e..e66a721 100644 --- a/internal/v1_9_R2/pom.xml +++ b/internal/v1_9_R2/pom.xml @@ -5,7 +5,7 @@ com.lishid openinvinternal - 3.2.2-SNAPSHOT + 3.3.0-SNAPSHOT openinvadapter1_9_R2 @@ -21,7 +21,7 @@ com.lishid openinvcommon - 3.2.2-SNAPSHOT + 3.3.0-SNAPSHOT diff --git a/internal/v1_9_R2/src/main/java/com/lishid/openinv/internal/v1_9_R2/AnySilentContainer.java b/internal/v1_9_R2/src/main/java/com/lishid/openinv/internal/v1_9_R2/AnySilentContainer.java index 539c45d..430f179 100644 --- a/internal/v1_9_R2/src/main/java/com/lishid/openinv/internal/v1_9_R2/AnySilentContainer.java +++ b/internal/v1_9_R2/src/main/java/com/lishid/openinv/internal/v1_9_R2/AnySilentContainer.java @@ -211,4 +211,7 @@ public class AnySilentContainer implements IAnySilentContainer { } } + @Override + public void deactivateContainer(final Player bukkitPlayer) {} + } diff --git a/plugin/plugin-core/pom.xml b/plugin/plugin-core/pom.xml index 4cf014b..ec55518 100644 --- a/plugin/plugin-core/pom.xml +++ b/plugin/plugin-core/pom.xml @@ -5,7 +5,7 @@ com.lishid openinvplugin - 3.2.2-SNAPSHOT + 3.3.0-SNAPSHOT openinvplugincore @@ -22,12 +22,12 @@ com.lishid openinvcommon - 3.2.2-SNAPSHOT + 3.3.0-SNAPSHOT com.lishid openinvpluginv1_10_r1 - 3.2.2-SNAPSHOT + 3.3.0-SNAPSHOT diff --git a/plugin/plugin-core/src/main/java/com/lishid/openinv/OpenInv.java b/plugin/plugin-core/src/main/java/com/lishid/openinv/OpenInv.java index b9bfc02..723e7a6 100644 --- a/plugin/plugin-core/src/main/java/com/lishid/openinv/OpenInv.java +++ b/plugin/plugin-core/src/main/java/com/lishid/openinv/OpenInv.java @@ -41,6 +41,7 @@ import com.lishid.openinv.internal.IInventoryAccess; import com.lishid.openinv.internal.ISpecialEnderChest; import com.lishid.openinv.internal.ISpecialPlayerInventory; import com.lishid.openinv.listeners.InventoryClickListener; +import com.lishid.openinv.listeners.InventoryCloseListener; import com.lishid.openinv.listeners.InventoryDragListener; import com.lishid.openinv.listeners.PlayerListener; import com.lishid.openinv.listeners.PluginListener; @@ -504,6 +505,7 @@ public class OpenInv extends JavaPlugin implements IOpenInv { pm.registerEvents(new PlayerListener(this), this); pm.registerEvents(new PluginListener(this), this); pm.registerEvents(new InventoryClickListener(this), this); + pm.registerEvents(new InventoryCloseListener(this), this); // Bukkit will handle missing events for us, attempt to register InventoryDragEvent without a version check pm.registerEvents(new InventoryDragListener(this), this); diff --git a/plugin/plugin-core/src/main/java/com/lishid/openinv/listeners/InventoryCloseListener.java b/plugin/plugin-core/src/main/java/com/lishid/openinv/listeners/InventoryCloseListener.java new file mode 100644 index 0000000..73fe3eb --- /dev/null +++ b/plugin/plugin-core/src/main/java/com/lishid/openinv/listeners/InventoryCloseListener.java @@ -0,0 +1,36 @@ +package com.lishid.openinv.listeners; + +import com.lishid.openinv.IOpenInv; + +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.inventory.InventoryCloseEvent; + +/** + * + * + * @author Jikoo + */ +public class InventoryCloseListener implements Listener { + + private final IOpenInv plugin; + + public InventoryCloseListener(final IOpenInv plugin) { + this.plugin = plugin; + } + + @EventHandler + public void onInventoryClose(final InventoryCloseEvent event) { + if (!(event.getPlayer() instanceof Player)) { + return; + } + + Player player = (Player) event.getPlayer(); + + if (this.plugin.getPlayerSilentChestStatus(player)) { + this.plugin.getAnySilentContainer().deactivateContainer(player); + } + } + +} diff --git a/plugin/plugin-v1_10_R1/pom.xml b/plugin/plugin-v1_10_R1/pom.xml index 303348f..101c689 100644 --- a/plugin/plugin-v1_10_R1/pom.xml +++ b/plugin/plugin-v1_10_R1/pom.xml @@ -5,7 +5,7 @@ com.lishid openinvplugin - 3.2.2-SNAPSHOT + 3.3.0-SNAPSHOT openinvpluginv1_10_r1 @@ -21,7 +21,7 @@ com.lishid openinvcommon - 3.2.2-SNAPSHOT + 3.3.0-SNAPSHOT diff --git a/plugin/pom.xml b/plugin/pom.xml index 5453c2a..37b8479 100644 --- a/plugin/pom.xml +++ b/plugin/pom.xml @@ -5,7 +5,7 @@ com.lishid openinvparent - 3.2.2-SNAPSHOT + 3.3.0-SNAPSHOT openinvplugin diff --git a/pom.xml b/pom.xml index b63ebfe..2372e38 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ openinvparent OpenInvParent http://dev.bukkit.org/bukkit-plugins/openinv/ - 3.2.2-SNAPSHOT + 3.3.0-SNAPSHOT pom