diff --git a/OpenInvCore/src/main/java/com/lishid/openinv/internal/IAnySilentChest.java b/OpenInvCore/src/main/java/com/lishid/openinv/internal/IAnySilentChest.java
index 10ccaa5..12a08c0 100644
--- a/OpenInvCore/src/main/java/com/lishid/openinv/internal/IAnySilentChest.java
+++ b/OpenInvCore/src/main/java/com/lishid/openinv/internal/IAnySilentChest.java
@@ -18,8 +18,22 @@ package com.lishid.openinv.internal;
import org.bukkit.entity.Player;
+/**
+ * @deprecated Use {@link IAnySilentContainer}
+ */
+@Deprecated
public interface IAnySilentChest {
+
+ /**
+ * @deprecated Use {@link IAnySilentContainer#activateContainer(Player, boolean, boolean, int, int, int)}.
+ */
+ @Deprecated
+ public boolean activateChest(Player player, boolean anychest, boolean silentchest, int x, int y, int z);
+
+ /**
+ * @deprecated Use {@link IAnySilentContainer#isAnyContainerNeeded(Player, int, int, int)}.
+ */
+ @Deprecated
public boolean isAnyChestNeeded(Player player, int x, int y, int z);
- public boolean activateChest(Player player, boolean anychest, boolean silentchest, int x, int y, int z);
}
diff --git a/OpenInvCore/src/main/java/com/lishid/openinv/internal/IAnySilentContainer.java b/OpenInvCore/src/main/java/com/lishid/openinv/internal/IAnySilentContainer.java
new file mode 100644
index 0000000..6f74fa0
--- /dev/null
+++ b/OpenInvCore/src/main/java/com/lishid/openinv/internal/IAnySilentContainer.java
@@ -0,0 +1,40 @@
+package com.lishid.openinv.internal;
+
+import org.bukkit.block.Block;
+import org.bukkit.entity.Player;
+
+public interface IAnySilentContainer extends IAnySilentChest {
+
+ /**
+ * Checks if the given Block is a container which can be unblocked or silenced.
+ *
+ * @param block the Block
+ * @return true if the Block is a supported container
+ */
+ public boolean isAnySilentContainer(Block block);
+
+ /**
+ * Opens the container at the given coordinates for the Player.
+ *
+ * @param player
+ * @param anychest whether compatibility for blocked containers is to be used
+ * @param silentchest whether the container's noise is to be silenced
+ * @param x the x coordinate
+ * @param y the y coordinate
+ * @param z the z coordinate
+ * @return true if the container can be opened
+ */
+ public boolean activateContainer(Player player, boolean anychest, boolean silentchest, int x, int y, int z);
+
+ /**
+ * Checks if the container at the given coordinates is blocked.
+ *
+ * @param player the Player opening the container
+ * @param x the x coordinate
+ * @param y the y coordinate
+ * @param z the z coordinate
+ * @return true if the container is blocked
+ */
+ public boolean isAnyContainerNeeded(Player player, int x, int y, int z);
+
+}
diff --git a/OpenInvCore/src/main/java/com/lishid/openinv/internal/IInventoryAccess.java b/OpenInvCore/src/main/java/com/lishid/openinv/internal/IInventoryAccess.java
index ed47174..16ae2a4 100644
--- a/OpenInvCore/src/main/java/com/lishid/openinv/internal/IInventoryAccess.java
+++ b/OpenInvCore/src/main/java/com/lishid/openinv/internal/IInventoryAccess.java
@@ -20,5 +20,14 @@ 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/OpenInvCore/src/main/java/com/lishid/openinv/internal/ISpecialEnderChest.java b/OpenInvCore/src/main/java/com/lishid/openinv/internal/ISpecialEnderChest.java
index e0d88fe..29489e1 100644
--- a/OpenInvCore/src/main/java/com/lishid/openinv/internal/ISpecialEnderChest.java
+++ b/OpenInvCore/src/main/java/com/lishid/openinv/internal/ISpecialEnderChest.java
@@ -21,6 +21,11 @@ import org.bukkit.inventory.Inventory;
public interface ISpecialEnderChest {
+ /**
+ * Gets the Inventory associated with this ISpecialEnderChest.
+ *
+ * @return the Inventory
+ */
public Inventory getBukkitInventory();
/**
diff --git a/OpenInvCore/src/main/java/com/lishid/openinv/internal/ISpecialPlayerInventory.java b/OpenInvCore/src/main/java/com/lishid/openinv/internal/ISpecialPlayerInventory.java
index 24fae35..0ee9900 100644
--- a/OpenInvCore/src/main/java/com/lishid/openinv/internal/ISpecialPlayerInventory.java
+++ b/OpenInvCore/src/main/java/com/lishid/openinv/internal/ISpecialPlayerInventory.java
@@ -21,6 +21,11 @@ import org.bukkit.inventory.Inventory;
public interface ISpecialPlayerInventory {
+ /**
+ * Gets the Inventory associated with this ISpecialPlayerInventory.
+ *
+ * @return the Inventory
+ */
public Inventory getBukkitInventory();
/**
diff --git a/OpenInvCraftbukkit1_10_R1/src/main/java/com/lishid/openinv/internal/v1_10_R1/AnySilentChest.java b/OpenInvCraftbukkit1_10_R1/src/main/java/com/lishid/openinv/internal/v1_10_R1/AnySilentContainer.java
similarity index 74%
rename from OpenInvCraftbukkit1_10_R1/src/main/java/com/lishid/openinv/internal/v1_10_R1/AnySilentChest.java
rename to OpenInvCraftbukkit1_10_R1/src/main/java/com/lishid/openinv/internal/v1_10_R1/AnySilentContainer.java
index 15e3d17..76b2a90 100644
--- a/OpenInvCraftbukkit1_10_R1/src/main/java/com/lishid/openinv/internal/v1_10_R1/AnySilentChest.java
+++ b/OpenInvCraftbukkit1_10_R1/src/main/java/com/lishid/openinv/internal/v1_10_R1/AnySilentContainer.java
@@ -16,11 +16,11 @@
package com.lishid.openinv.internal.v1_10_R1;
+import com.lishid.openinv.internal.IAnySilentContainer;
+
import org.bukkit.ChatColor;
import org.bukkit.entity.Player;
-import com.lishid.openinv.internal.IAnySilentChest;
-
// Volatile
import net.minecraft.server.v1_10_R1.AxisAlignedBB;
import net.minecraft.server.v1_10_R1.Block;
@@ -37,12 +37,64 @@ import net.minecraft.server.v1_10_R1.World;
import org.bukkit.craftbukkit.v1_10_R1.entity.CraftPlayer;
-public class AnySilentChest implements IAnySilentChest {
+public class AnySilentContainer implements IAnySilentContainer {
+
@Override
- public boolean isAnyChestNeeded(Player p, int x, int y, int z) {
+ public boolean isAnySilentContainer(org.bukkit.block.Block block) {
+ return block instanceof org.bukkit.block.Chest;
+ }
+
+ @Override
+ public boolean activateContainer(Player p, boolean anychest, boolean silentchest, int x, int y, int z) {
+ EntityPlayer player = ((CraftPlayer) p).getHandle();
+ World world = player.world;
+ Object chest = world.getTileEntity(new BlockPosition(x, y, z));
+ if (chest == null)
+ return false;
+
+ if (!anychest && isAnyContainerNeeded(p, x, y, z)) {
+ return false;
+ }
+
+ int id = Block.getId(world.getType(new BlockPosition(x, y, z)).getBlock());
+
+ if (Block.getId(world.getType(new BlockPosition(x - 1, y, z)).getBlock()) == id)
+ chest = new InventoryLargeChest("Large chest", (TileEntityChest) world.getTileEntity(new BlockPosition(x - 1, y, z)), (ITileInventory) chest);
+ if (Block.getId(world.getType(new BlockPosition(x + 1, y, z)).getBlock()) == id)
+ chest = new InventoryLargeChest("Large chest", (ITileInventory) chest, (TileEntityChest) world.getTileEntity(new BlockPosition(x + 1, y, z)));
+ if (Block.getId(world.getType(new BlockPosition(x, y, z - 1)).getBlock()) == id)
+ chest = new InventoryLargeChest("Large chest", (TileEntityChest) world.getTileEntity(new BlockPosition(x, y, z - 1)), (ITileInventory) chest);
+ if (Block.getId(world.getType(new BlockPosition(x, y, z + 1)).getBlock()) == id)
+ chest = new InventoryLargeChest("Large chest", (ITileInventory) chest, (TileEntityChest) world.getTileEntity(new BlockPosition(x, y, z + 1)));
+
+ boolean returnValue = false;
+ if (!silentchest) {
+ player.openContainer((IInventory) chest);
+ returnValue = true;
+ } else {
+ try {
+ SilentContainerChest silentContainerChest = new SilentContainerChest(player.inventory, ((IInventory) chest), player);
+ int windowId = player.nextContainerCounter();
+ player.playerConnection.sendPacket(new PacketPlayOutOpenWindow(windowId, "minecraft:chest", ((IInventory) chest).getScoreboardDisplayName(), ((IInventory) chest).getSize()));
+ player.activeContainer = silentContainerChest;
+ player.activeContainer.windowId = windowId;
+ player.activeContainer.addSlotListener(player);
+ returnValue = true;
+ } catch (Exception e) {
+ e.printStackTrace();
+ p.sendMessage(ChatColor.RED + "Error while sending silent chest.");
+ }
+ }
+
+ return returnValue;
+ }
+
+ @Override
+ public boolean isAnyContainerNeeded(Player p, int x, int y, int z) {
// FOR REFERENCE, LOOK AT net.minecraft.server.BlockChest
EntityPlayer player = ((CraftPlayer) p).getHandle();
World world = player.world;
+
// If block or ocelot on top
if (world.getType(new BlockPosition(x, y + 1, z)).l() || hasOcelotOnTop(world, x, y, z))
return true;
@@ -50,16 +102,8 @@ public class AnySilentChest implements IAnySilentChest {
int id = Block.getId(world.getType(new BlockPosition(x, y, z)).getBlock());
// If block next to chest is chest and has a block or ocelot on top
- if (isBlockedChest(world, id, x - 1, y, z))
- return true;
- if (isBlockedChest(world, id, x + 1, y, z))
- return true;
- if (isBlockedChest(world, id, x, y, z - 1))
- return true;
- if (isBlockedChest(world, id, x, y, z + 1))
- return true;
-
- return false;
+ return isBlockedChest(world, id, x - 1, y, z) || isBlockedChest(world, id, x + 1, y, z)
+ || isBlockedChest(world, id, x, y, z - 1) || isBlockedChest(world, id, x, y, z + 1);
}
private boolean isBlockedChest(World world, int id, int x, int y, int z) {
@@ -87,58 +131,22 @@ public class AnySilentChest implements IAnySilentChest {
return false;
}
+ /**
+ * @deprecated Use {@link #activateContainer(Player, boolean, boolean, int, int, int)}.
+ */
+ @Deprecated
@Override
- public boolean activateChest(Player p, boolean anychest, boolean silentchest, int x, int y, int z) {
- EntityPlayer player = ((CraftPlayer) p).getHandle();
- World world = player.world;
- Object chest = world.getTileEntity(new BlockPosition(x, y, z));
- if (chest == null)
- return true;
-
- int id = Block.getId(world.getType(new BlockPosition(x, y, z)).getBlock());
-
- if (!anychest) {
- if (world.getType(new BlockPosition(x, y + 1, z)).l())
- return true;
- if ((Block.getId(world.getType(new BlockPosition(x - 1, y, z)).getBlock()) == id) && (world.getType(new BlockPosition(x - 1, y + 1, z)).l()))
- return true;
- if ((Block.getId(world.getType(new BlockPosition(x + 1, y, z)).getBlock()) == id) && (world.getType(new BlockPosition(x + 1, y + 1, z)).l()))
- return true;
- if ((Block.getId(world.getType(new BlockPosition(x, y, z - 1)).getBlock()) == id) && (world.getType(new BlockPosition(x, y + 1, z - 1)).l()))
- return true;
- if ((Block.getId(world.getType(new BlockPosition(x, y, z + 1)).getBlock()) == id) && (world.getType(new BlockPosition(x, y + 1, z + 1)).l()))
- return true;
- }
-
- if (Block.getId(world.getType(new BlockPosition(x - 1, y, z)).getBlock()) == id)
- chest = new InventoryLargeChest("Large chest", (TileEntityChest) world.getTileEntity(new BlockPosition(x - 1, y, z)), (ITileInventory) chest);
- if (Block.getId(world.getType(new BlockPosition(x + 1, y, z)).getBlock()) == id)
- chest = new InventoryLargeChest("Large chest", (ITileInventory) chest, (TileEntityChest) world.getTileEntity(new BlockPosition(x + 1, y, z)));
- if (Block.getId(world.getType(new BlockPosition(x, y, z - 1)).getBlock()) == id)
- chest = new InventoryLargeChest("Large chest", (TileEntityChest) world.getTileEntity(new BlockPosition(x, y, z - 1)), (ITileInventory) chest);
- if (Block.getId(world.getType(new BlockPosition(x, y, z + 1)).getBlock()) == id)
- chest = new InventoryLargeChest("Large chest", (ITileInventory) chest, (TileEntityChest) world.getTileEntity(new BlockPosition(x, y, z + 1)));
-
- boolean returnValue = true;
- if (!silentchest) {
- player.openContainer((IInventory) chest);
- }
- else {
- try {
- SilentContainerChest silentContainerChest = new SilentContainerChest(player.inventory, ((IInventory) chest), player);
- int windowId = player.nextContainerCounter();
- player.playerConnection.sendPacket(new PacketPlayOutOpenWindow(windowId, "minecraft:chest", ((IInventory) chest).getScoreboardDisplayName(), ((IInventory) chest).getSize()));
- player.activeContainer = silentContainerChest;
- player.activeContainer.windowId = windowId;
- player.activeContainer.addSlotListener(player);
- returnValue = false;
- }
- catch (Exception e) {
- e.printStackTrace();
- p.sendMessage(ChatColor.RED + "Error while sending silent chest.");
- }
- }
-
- return returnValue;
+ public boolean activateChest(Player player, boolean anychest, boolean silentchest, int x, int y, int z) {
+ return !activateContainer(player, anychest, silentchest, x, y, z);
}
+
+ /**
+ * @deprecated Use {@link #isAnyContainerNeeded(Player, int, int, int)}.
+ */
+ @Deprecated
+ @Override
+ public boolean isAnyChestNeeded(Player player, int x, int y, int z) {
+ return isAnyContainerNeeded(player, x, y, z);
+ }
+
}
diff --git a/OpenInvCraftbukkit1_11_R1/src/main/java/com/lishid/openinv/internal/v1_11_R1/AnySilentChest.java b/OpenInvCraftbukkit1_11_R1/src/main/java/com/lishid/openinv/internal/v1_11_R1/AnySilentChest.java
deleted file mode 100644
index 9652f5b..0000000
--- a/OpenInvCraftbukkit1_11_R1/src/main/java/com/lishid/openinv/internal/v1_11_R1/AnySilentChest.java
+++ /dev/null
@@ -1,144 +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 org.bukkit.ChatColor;
-import org.bukkit.entity.Player;
-
-import com.lishid.openinv.internal.IAnySilentChest;
-
-// Volatile
-import net.minecraft.server.v1_11_R1.AxisAlignedBB;
-import net.minecraft.server.v1_11_R1.Block;
-import net.minecraft.server.v1_11_R1.BlockPosition;
-import net.minecraft.server.v1_11_R1.Entity;
-import net.minecraft.server.v1_11_R1.EntityOcelot;
-import net.minecraft.server.v1_11_R1.EntityPlayer;
-import net.minecraft.server.v1_11_R1.IInventory;
-import net.minecraft.server.v1_11_R1.ITileInventory;
-import net.minecraft.server.v1_11_R1.InventoryLargeChest;
-import net.minecraft.server.v1_11_R1.PacketPlayOutOpenWindow;
-import net.minecraft.server.v1_11_R1.TileEntityChest;
-import net.minecraft.server.v1_11_R1.World;
-
-import org.bukkit.craftbukkit.v1_11_R1.entity.CraftPlayer;
-
-public class AnySilentChest implements IAnySilentChest {
- @Override
- public boolean isAnyChestNeeded(Player p, int x, int y, int z) {
- // FOR REFERENCE, LOOK AT net.minecraft.server.BlockChest
- EntityPlayer player = ((CraftPlayer) p).getHandle();
- World world = player.world;
- // If block or ocelot on top
- if (world.getType(new BlockPosition(x, y + 1, z)).l() || hasOcelotOnTop(world, x, y, z))
- return true;
-
- int id = Block.getId(world.getType(new BlockPosition(x, y, z)).getBlock());
-
- // If block next to chest is chest and has a block or ocelot on top
- if (isBlockedChest(world, id, x - 1, y, z))
- return true;
- if (isBlockedChest(world, id, x + 1, y, z))
- return true;
- if (isBlockedChest(world, id, x, y, z - 1))
- return true;
- if (isBlockedChest(world, id, x, y, z + 1))
- return true;
-
- return false;
- }
-
- private boolean isBlockedChest(World world, int id, int x, int y, int z) {
- BlockPosition position = new BlockPosition(x, y, z);
- if (Block.getId(world.getType(position).getBlock()) != id) {
- return false;
- }
-
- if (world.getType(position).l()) {
- return true;
- }
-
- return hasOcelotOnTop(world, x, y, z);
- }
-
- private boolean hasOcelotOnTop(World world, int x, int y, int z) {
- for (Entity localEntity : world.a(EntityOcelot.class,
- new AxisAlignedBB(x, y + 1, z, x + 1, y + 2, z + 1))) {
- EntityOcelot localEntityOcelot = (EntityOcelot) localEntity;
- if (localEntityOcelot.isSitting()) {
- return true;
- }
- }
-
- return false;
- }
-
- @Override
- public boolean activateChest(Player p, boolean anychest, boolean silentchest, int x, int y, int z) {
- EntityPlayer player = ((CraftPlayer) p).getHandle();
- World world = player.world;
- Object chest = world.getTileEntity(new BlockPosition(x, y, z));
- if (chest == null)
- return true;
-
- int id = Block.getId(world.getType(new BlockPosition(x, y, z)).getBlock());
-
- if (!anychest) {
- if (world.getType(new BlockPosition(x, y + 1, z)).l())
- return true;
- if ((Block.getId(world.getType(new BlockPosition(x - 1, y, z)).getBlock()) == id) && (world.getType(new BlockPosition(x - 1, y + 1, z)).l()))
- return true;
- if ((Block.getId(world.getType(new BlockPosition(x + 1, y, z)).getBlock()) == id) && (world.getType(new BlockPosition(x + 1, y + 1, z)).l()))
- return true;
- if ((Block.getId(world.getType(new BlockPosition(x, y, z - 1)).getBlock()) == id) && (world.getType(new BlockPosition(x, y + 1, z - 1)).l()))
- return true;
- if ((Block.getId(world.getType(new BlockPosition(x, y, z + 1)).getBlock()) == id) && (world.getType(new BlockPosition(x, y + 1, z + 1)).l()))
- return true;
- }
-
- if (Block.getId(world.getType(new BlockPosition(x - 1, y, z)).getBlock()) == id)
- chest = new InventoryLargeChest("Large chest", (TileEntityChest) world.getTileEntity(new BlockPosition(x - 1, y, z)), (ITileInventory) chest);
- if (Block.getId(world.getType(new BlockPosition(x + 1, y, z)).getBlock()) == id)
- chest = new InventoryLargeChest("Large chest", (ITileInventory) chest, (TileEntityChest) world.getTileEntity(new BlockPosition(x + 1, y, z)));
- if (Block.getId(world.getType(new BlockPosition(x, y, z - 1)).getBlock()) == id)
- chest = new InventoryLargeChest("Large chest", (TileEntityChest) world.getTileEntity(new BlockPosition(x, y, z - 1)), (ITileInventory) chest);
- if (Block.getId(world.getType(new BlockPosition(x, y, z + 1)).getBlock()) == id)
- chest = new InventoryLargeChest("Large chest", (ITileInventory) chest, (TileEntityChest) world.getTileEntity(new BlockPosition(x, y, z + 1)));
-
- boolean returnValue = true;
- if (!silentchest) {
- player.openContainer((IInventory) chest);
- }
- else {
- try {
- SilentContainerChest silentContainerChest = new SilentContainerChest(player.inventory, ((IInventory) chest), player);
- int windowId = player.nextContainerCounter();
- player.playerConnection.sendPacket(new PacketPlayOutOpenWindow(windowId, "minecraft:chest", ((IInventory) chest).getScoreboardDisplayName(), ((IInventory) chest).getSize()));
- player.activeContainer = silentContainerChest;
- player.activeContainer.windowId = windowId;
- player.activeContainer.addSlotListener(player);
- returnValue = false;
- }
- catch (Exception e) {
- e.printStackTrace();
- p.sendMessage(ChatColor.RED + "Error while sending silent chest.");
- }
- }
-
- return returnValue;
- }
-}
diff --git a/OpenInvCraftbukkit1_11_R1/src/main/java/com/lishid/openinv/internal/v1_11_R1/AnySilentContainer.java b/OpenInvCraftbukkit1_11_R1/src/main/java/com/lishid/openinv/internal/v1_11_R1/AnySilentContainer.java
new file mode 100644
index 0000000..1b7150a
--- /dev/null
+++ b/OpenInvCraftbukkit1_11_R1/src/main/java/com/lishid/openinv/internal/v1_11_R1/AnySilentContainer.java
@@ -0,0 +1,211 @@
+/*
+ * 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 com.lishid.openinv.internal.IAnySilentContainer;
+
+import org.bukkit.ChatColor;
+import org.bukkit.entity.Player;
+
+// Volatile
+import net.minecraft.server.v1_11_R1.AxisAlignedBB;
+import net.minecraft.server.v1_11_R1.Block;
+import net.minecraft.server.v1_11_R1.BlockChest;
+import net.minecraft.server.v1_11_R1.BlockChest.Type;
+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;
+import net.minecraft.server.v1_11_R1.EnumDirection;
+import net.minecraft.server.v1_11_R1.IInventory;
+import net.minecraft.server.v1_11_R1.ITileInventory;
+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.World;
+
+import org.bukkit.craftbukkit.v1_11_R1.entity.CraftPlayer;
+
+public class AnySilentContainer implements IAnySilentContainer {
+
+ @Override
+ public boolean isAnySilentContainer(org.bukkit.block.Block block) {
+ return block instanceof org.bukkit.block.Chest || block instanceof org.bukkit.block.ShulkerBox;
+ }
+
+ @Override
+ public boolean activateContainer(Player p, boolean anychest, boolean silentchest, int x, int y, int z) {
+
+ EntityPlayer player = ((CraftPlayer) p).getHandle();
+ World world = player.world;
+ BlockPosition blockPosition = new BlockPosition(x, y, z);
+ Object tile = world.getTileEntity(blockPosition);
+
+ if (tile == null) {
+ return false;
+ }
+
+ Block block = world.getType(new BlockPosition(x, y, z)).getBlock();
+ Container container = null;
+
+ if (block instanceof BlockChest) {
+ BlockChest blockChest = (BlockChest) block;
+
+ for (EnumDirection localEnumDirection : EnumDirection.EnumDirectionLimit.HORIZONTAL) {
+ BlockPosition localBlockPosition = blockPosition.shift(localEnumDirection);
+ Block localBlock = world.getType(localBlockPosition).getBlock();
+
+ if (localBlock != block) {
+ continue;
+ }
+
+ if (!anychest && isBlockedChest(world, localBlock, localBlockPosition)) {
+ return false;
+ }
+
+ TileEntity localTileEntity = world.getTileEntity(localBlockPosition);
+ if (!(localTileEntity instanceof TileEntityChest)) {
+ continue;
+ }
+
+ if ((localEnumDirection == EnumDirection.WEST) || (localEnumDirection == EnumDirection.NORTH)) {
+ tile = new InventoryLargeChest("container.chestDouble",
+ (TileEntityChest) localTileEntity, (ITileInventory) tile);
+ } else {
+ tile = new InventoryLargeChest("container.chestDouble",
+ (ITileInventory) tile, (TileEntityChest) localTileEntity);
+ }
+ break;
+ }
+
+ if (blockChest.g == Type.BASIC)
+ player.b(StatisticList.ac);
+ else if (blockChest.g == Type.TRAP) {
+ player.b(StatisticList.W);
+ }
+
+ if (silentchest) {
+ container = new SilentContainerChest(player.inventory, ((IInventory) tile), player);
+ }
+ }
+
+ if (block instanceof BlockShulkerBox) {
+ // TODO shulker
+ }
+
+ boolean returnValue = false;
+
+ if (!silentchest || container == null) {
+ player.openContainer((IInventory) tile);
+ returnValue = true;
+ } else {
+ try {
+ int windowId = player.nextContainerCounter();
+ player.playerConnection.sendPacket(new PacketPlayOutOpenWindow(windowId, "minecraft:chest", ((IInventory) tile).getScoreboardDisplayName(), ((IInventory) tile).getSize()));
+ player.activeContainer = container;
+ player.activeContainer.windowId = windowId;
+ player.activeContainer.addSlotListener(player);
+ returnValue = true;
+ } catch (Exception e) {
+ e.printStackTrace();
+ p.sendMessage(ChatColor.RED + "Error while sending silent chest.");
+ }
+ }
+
+
+ return returnValue;
+ }
+
+ @Override
+ public boolean isAnyContainerNeeded(Player p, int x, int y, int z) {
+ EntityPlayer player = ((CraftPlayer) p).getHandle();
+ World world = player.world;
+ BlockPosition blockPosition = new BlockPosition(x, y, z);
+ Block block = world.getType(blockPosition).getBlock();
+
+ if (block instanceof BlockShulkerBox) {
+ return isBlockedShulkerBox(world, x, y, z);
+ }
+
+ // FOR REFERENCE, LOOK AT net.minecraft.server.BlockChest
+ // Check if chest is blocked or has an ocelot on top
+ if (world.getType(new BlockPosition(x, y + 1, z)).m() || hasOcelotOnTop(world, blockPosition)) {
+ return true;
+ }
+
+ // Check for matching adjacent chests that are blocked or have an ocelot on top
+ for (EnumDirection localEnumDirection : EnumDirection.EnumDirectionLimit.HORIZONTAL) {
+ BlockPosition localBlockPosition = blockPosition.shift(localEnumDirection);
+ if (isBlockedChest(world, block, localBlockPosition)) {
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ private boolean isBlockedShulkerBox(World world, int x, int y, int z) {
+ // For reference, look at net.minecraft.server.BlockShulkerBox
+ // TODO
+ return false;
+ }
+
+ private boolean isBlockedChest(World world, Block block, BlockPosition blockPosition) {
+ if (world.getType(blockPosition).getBlock() == block) {
+ return false;
+ }
+
+ return world.getType(blockPosition).m() || hasOcelotOnTop(world, blockPosition);
+ }
+
+ private boolean hasOcelotOnTop(World world, BlockPosition blockPosition) {
+ for (Entity localEntity : world.a(EntityOcelot.class,
+ new AxisAlignedBB(blockPosition.getX(), blockPosition.getY() + 1,
+ blockPosition.getZ(), blockPosition.getX() + 1, blockPosition.getY() + 2,
+ blockPosition.getZ() + 1))) {
+ EntityOcelot localEntityOcelot = (EntityOcelot) localEntity;
+ if (localEntityOcelot.isSitting()) {
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ /**
+ * @deprecated Use {@link #activateContainer(Player, boolean, boolean, int, int, int)}.
+ */
+ @Deprecated
+ @Override
+ public boolean activateChest(Player player, boolean anychest, boolean silentchest, int x, int y, int z) {
+ return !activateContainer(player, anychest, silentchest, x, y, z);
+ }
+
+ /**
+ * @deprecated Use {@link #isAnyContainerNeeded(Player, int, int, int)}.
+ */
+ @Deprecated
+ @Override
+ public boolean isAnyChestNeeded(Player player, int x, int y, int z) {
+ return isAnyContainerNeeded(player, x, y, z);
+ }
+
+}
diff --git a/OpenInvCraftbukkit1_11_R1/src/main/java/com/lishid/openinv/internal/v1_11_R1/InventoryAccess.java b/OpenInvCraftbukkit1_11_R1/src/main/java/com/lishid/openinv/internal/v1_11_R1/InventoryAccess.java
index dc40405..4d26229 100644
--- a/OpenInvCraftbukkit1_11_R1/src/main/java/com/lishid/openinv/internal/v1_11_R1/InventoryAccess.java
+++ b/OpenInvCraftbukkit1_11_R1/src/main/java/com/lishid/openinv/internal/v1_11_R1/InventoryAccess.java
@@ -18,30 +18,29 @@ package com.lishid.openinv.internal.v1_11_R1;
import java.lang.reflect.Field;
-import org.bukkit.entity.HumanEntity;
-import org.bukkit.inventory.Inventory;
-
import com.lishid.openinv.OpenInv;
import com.lishid.openinv.Permissions;
import com.lishid.openinv.internal.IInventoryAccess;
+import org.bukkit.entity.HumanEntity;
+import org.bukkit.inventory.Inventory;
+
// Volatile
import net.minecraft.server.v1_11_R1.IInventory;
import org.bukkit.craftbukkit.v1_11_R1.inventory.CraftInventory;
public class InventoryAccess implements IInventoryAccess {
+
@Override
public boolean check(Inventory inventory, HumanEntity player) {
IInventory inv = grabInventory(inventory);
-
+
if (inv instanceof SpecialPlayerInventory) {
if (!OpenInv.hasPermission(player, Permissions.PERM_EDITINV)) {
return false;
}
- }
-
- else if (inv instanceof SpecialEnderChest) {
+ } else if (inv instanceof SpecialEnderChest) {
if (!OpenInv.hasPermission(player, Permissions.PERM_EDITENDER)) {
return false;
}
@@ -49,22 +48,21 @@ public class InventoryAccess implements IInventoryAccess {
return true;
}
-
+
private IInventory grabInventory(Inventory inventory) {
- if(inventory instanceof CraftInventory) {
+ if (inventory instanceof CraftInventory) {
return ((CraftInventory) inventory).getInventory();
}
-
- //Use reflection to find the iinventory
+
+ // Use reflection to find the iinventory
Class extends Inventory> clazz = inventory.getClass();
IInventory result = null;
- for(Field f : clazz.getDeclaredFields()) {
+ for (Field f : clazz.getDeclaredFields()) {
f.setAccessible(true);
- if(IInventory.class.isAssignableFrom(f.getDeclaringClass())) {
+ if (IInventory.class.isAssignableFrom(f.getDeclaringClass())) {
try {
result = (IInventory) f.get(inventory);
- }
- catch (Exception e) {
+ } catch (Exception e) {
e.printStackTrace();
}
}
diff --git a/OpenInvCraftbukkit1_4_5/src/main/java/com/lishid/openinv/internal/v1_4_5/AnySilentChest.java b/OpenInvCraftbukkit1_4_5/src/main/java/com/lishid/openinv/internal/v1_4_5/AnySilentContainer.java
similarity index 58%
rename from OpenInvCraftbukkit1_4_5/src/main/java/com/lishid/openinv/internal/v1_4_5/AnySilentChest.java
rename to OpenInvCraftbukkit1_4_5/src/main/java/com/lishid/openinv/internal/v1_4_5/AnySilentContainer.java
index 7eff2d2..9aade56 100644
--- a/OpenInvCraftbukkit1_4_5/src/main/java/com/lishid/openinv/internal/v1_4_5/AnySilentChest.java
+++ b/OpenInvCraftbukkit1_4_5/src/main/java/com/lishid/openinv/internal/v1_4_5/AnySilentContainer.java
@@ -18,13 +18,15 @@ package com.lishid.openinv.internal.v1_4_5;
import java.lang.reflect.Field;
+import com.lishid.openinv.internal.IAnySilentContainer;
+
import org.bukkit.ChatColor;
import org.bukkit.entity.Player;
-import com.lishid.openinv.internal.IAnySilentChest;
-
// Volatile
+import net.minecraft.server.v1_4_5.AxisAlignedBB;
import net.minecraft.server.v1_4_5.Block;
+import net.minecraft.server.v1_4_5.EntityOcelot;
import net.minecraft.server.v1_4_5.EntityPlayer;
import net.minecraft.server.v1_4_5.IInventory;
import net.minecraft.server.v1_4_5.InventoryLargeChest;
@@ -34,48 +36,23 @@ import net.minecraft.server.v1_4_5.World;
import org.bukkit.craftbukkit.v1_4_5.entity.CraftPlayer;
-public class AnySilentChest implements IAnySilentChest {
+public class AnySilentContainer implements IAnySilentContainer {
+
@Override
- public boolean isAnyChestNeeded(Player p, int x, int y, int z) {
- // FOR REFERENCE, LOOK AT net.minecraft.server.BlockChest
- EntityPlayer player = ((CraftPlayer) p).getHandle();
- World world = player.world;
- // If block on top
- if (world.s(x, y + 1, z))
- return true;
-
- // If block next to chest is chest and has a block on top
- if ((world.getTypeId(x - 1, y, z) == Block.CHEST.id) && (world.s(x - 1, y + 1, z)))
- return true;
- if ((world.getTypeId(x + 1, y, z) == Block.CHEST.id) && (world.s(x + 1, y + 1, z)))
- return true;
- if ((world.getTypeId(x, y, z - 1) == Block.CHEST.id) && (world.s(x, y + 1, z - 1)))
- return true;
- if ((world.getTypeId(x, y, z + 1) == Block.CHEST.id) && (world.s(x, y + 1, z + 1)))
- return true;
-
- return false;
+ public boolean isAnySilentContainer(org.bukkit.block.Block block) {
+ return block instanceof org.bukkit.block.Chest;
}
@Override
- public boolean activateChest(Player p, boolean anychest, boolean silentchest, int x, int y, int z) {
+ public boolean activateContainer(Player p, boolean anychest, boolean silentchest, int x, int y, int z) {
EntityPlayer player = ((CraftPlayer) p).getHandle();
World world = player.world;
Object chest = world.getTileEntity(x, y, z);
if (chest == null)
- return true;
+ return false;
- if (!anychest) {
- if (world.s(x, y + 1, z))
- return true;
- if ((world.getTypeId(x - 1, y, z) == Block.CHEST.id) && (world.s(x - 1, y + 1, z)))
- return true;
- if ((world.getTypeId(x + 1, y, z) == Block.CHEST.id) && (world.s(x + 1, y + 1, z)))
- return true;
- if ((world.getTypeId(x, y, z - 1) == Block.CHEST.id) && (world.s(x, y + 1, z - 1)))
- return true;
- if ((world.getTypeId(x, y, z + 1) == Block.CHEST.id) && (world.s(x, y + 1, z + 1)))
- return true;
+ if (!anychest && isAnyContainerNeeded(p, x, y, z)) {
+ return false;
}
if (world.getTypeId(x - 1, y, z) == Block.CHEST.id)
@@ -87,11 +64,11 @@ public class AnySilentChest implements IAnySilentChest {
if (world.getTypeId(x, y, z + 1) == Block.CHEST.id)
chest = new InventoryLargeChest("Large chest", (IInventory) chest, (TileEntityChest) world.getTileEntity(x, y, z + 1));
- boolean returnValue = true;
+ boolean returnValue = false;
if (!silentchest) {
player.openContainer((IInventory) chest);
- }
- else {
+ returnValue = true;
+ } else {
try {
int id = 0;
try {
@@ -100,16 +77,14 @@ public class AnySilentChest implements IAnySilentChest {
id = windowID.getInt(player);
id = id % 100 + 1;
windowID.setInt(player, id);
- }
- catch (NoSuchFieldException e) {}
+ } catch (NoSuchFieldException e) {}
player.netServerHandler.sendPacket(new Packet100OpenWindow(id, 0, ((IInventory) chest).getName(), ((IInventory) chest).getSize()));
player.activeContainer = new SilentContainerChest(player.inventory, ((IInventory) chest));
player.activeContainer.windowId = id;
player.activeContainer.addSlotListener(player);
- returnValue = false;
- }
- catch (Exception e) {
+ returnValue = true;
+ } catch (Exception e) {
e.printStackTrace();
p.sendMessage(ChatColor.RED + "Error while sending silent chest.");
}
@@ -117,4 +92,62 @@ public class AnySilentChest implements IAnySilentChest {
return returnValue;
}
+
+ @Override
+ public boolean isAnyContainerNeeded(Player p, int x, int y, int z) {
+ // FOR REFERENCE, LOOK AT net.minecraft.server.BlockChest
+ EntityPlayer player = ((CraftPlayer) p).getHandle();
+ World world = player.world;
+
+ // If block or ocelot on top
+ if (world.s(x, y + 1, z) || hasOcelotOnTop(world, x, y, z))
+ return true;
+
+ // If block next to chest is chest and has a block or ocelot on top
+ return isBlockedChest(world, x - 1, y, z) || isBlockedChest(world, x + 1, y, z)
+ || isBlockedChest(world, x, y, z - 1) || isBlockedChest(world, x, y, z + 1);
+ }
+
+ private boolean isBlockedChest(World world, int x, int y, int z) {
+ if (world.getTypeId(x, y, z) != Block.CHEST.id) {
+ return false;
+ }
+
+ if (world.s(x, y + 1, z)) {
+ return true;
+ }
+
+ return hasOcelotOnTop(world, x, y, z);
+ }
+
+ private boolean hasOcelotOnTop(World world, int x, int y, int z) {
+ for (Object localEntity : world.a(EntityOcelot.class,
+ AxisAlignedBB.a().a(x, y + 1, z, x + 1, y + 2, z + 1))) {
+ EntityOcelot localEntityOcelot = (EntityOcelot) localEntity;
+ if (localEntityOcelot.isSitting()) {
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ /**
+ * @deprecated Use {@link #activateContainer(Player, boolean, boolean, int, int, int)}.
+ */
+ @Deprecated
+ @Override
+ public boolean activateChest(Player player, boolean anychest, boolean silentchest, int x, int y, int z) {
+ return !activateContainer(player, anychest, silentchest, x, y, z);
+ }
+
+ /**
+ * @deprecated Use {@link #isAnyContainerNeeded(Player, int, int, int)}.
+ */
+ @Deprecated
+ @Override
+ public boolean isAnyChestNeeded(Player player, int x, int y, int z) {
+ return isAnyContainerNeeded(player, x, y, z);
+ }
+
}
diff --git a/OpenInvCraftbukkit1_4_6/src/main/java/com/lishid/openinv/internal/v1_4_6/AnySilentChest.java b/OpenInvCraftbukkit1_4_6/src/main/java/com/lishid/openinv/internal/v1_4_6/AnySilentContainer.java
similarity index 58%
rename from OpenInvCraftbukkit1_4_6/src/main/java/com/lishid/openinv/internal/v1_4_6/AnySilentChest.java
rename to OpenInvCraftbukkit1_4_6/src/main/java/com/lishid/openinv/internal/v1_4_6/AnySilentContainer.java
index af8c2ea..e8c7d3e 100644
--- a/OpenInvCraftbukkit1_4_6/src/main/java/com/lishid/openinv/internal/v1_4_6/AnySilentChest.java
+++ b/OpenInvCraftbukkit1_4_6/src/main/java/com/lishid/openinv/internal/v1_4_6/AnySilentContainer.java
@@ -18,12 +18,15 @@ package com.lishid.openinv.internal.v1_4_6;
import java.lang.reflect.Field;
+import com.lishid.openinv.internal.IAnySilentContainer;
+
import org.bukkit.ChatColor;
import org.bukkit.entity.Player;
-import com.lishid.openinv.internal.IAnySilentChest;
-
+// Volatile
+import net.minecraft.server.v1_4_6.AxisAlignedBB;
import net.minecraft.server.v1_4_6.Block;
+import net.minecraft.server.v1_4_6.EntityOcelot;
import net.minecraft.server.v1_4_6.EntityPlayer;
import net.minecraft.server.v1_4_6.IInventory;
import net.minecraft.server.v1_4_6.InventoryLargeChest;
@@ -31,51 +34,25 @@ import net.minecraft.server.v1_4_6.Packet100OpenWindow;
import net.minecraft.server.v1_4_6.TileEntityChest;
import net.minecraft.server.v1_4_6.World;
-// Volatile
import org.bukkit.craftbukkit.v1_4_6.entity.CraftPlayer;
-public class AnySilentChest implements IAnySilentChest {
+public class AnySilentContainer implements IAnySilentContainer {
+
@Override
- public boolean isAnyChestNeeded(Player p, int x, int y, int z) {
- // FOR REFERENCE, LOOK AT net.minecraft.server.BlockChest
- EntityPlayer player = ((CraftPlayer) p).getHandle();
- World world = player.world;
- // If block on top
- if (world.s(x, y + 1, z))
- return true;
-
- // If block next to chest is chest and has a block on top
- if ((world.getTypeId(x - 1, y, z) == Block.CHEST.id) && (world.s(x - 1, y + 1, z)))
- return true;
- if ((world.getTypeId(x + 1, y, z) == Block.CHEST.id) && (world.s(x + 1, y + 1, z)))
- return true;
- if ((world.getTypeId(x, y, z - 1) == Block.CHEST.id) && (world.s(x, y + 1, z - 1)))
- return true;
- if ((world.getTypeId(x, y, z + 1) == Block.CHEST.id) && (world.s(x, y + 1, z + 1)))
- return true;
-
- return false;
+ public boolean isAnySilentContainer(org.bukkit.block.Block block) {
+ return block instanceof org.bukkit.block.Chest;
}
@Override
- public boolean activateChest(Player p, boolean anychest, boolean silentchest, int x, int y, int z) {
+ public boolean activateContainer(Player p, boolean anychest, boolean silentchest, int x, int y, int z) {
EntityPlayer player = ((CraftPlayer) p).getHandle();
World world = player.world;
Object chest = world.getTileEntity(x, y, z);
if (chest == null)
- return true;
+ return false;
- if (!anychest) {
- if (world.s(x, y + 1, z))
- return true;
- if ((world.getTypeId(x - 1, y, z) == Block.CHEST.id) && (world.s(x - 1, y + 1, z)))
- return true;
- if ((world.getTypeId(x + 1, y, z) == Block.CHEST.id) && (world.s(x + 1, y + 1, z)))
- return true;
- if ((world.getTypeId(x, y, z - 1) == Block.CHEST.id) && (world.s(x, y + 1, z - 1)))
- return true;
- if ((world.getTypeId(x, y, z + 1) == Block.CHEST.id) && (world.s(x, y + 1, z + 1)))
- return true;
+ if (!anychest && isAnyContainerNeeded(p, x, y, z)) {
+ return false;
}
if (world.getTypeId(x - 1, y, z) == Block.CHEST.id)
@@ -87,11 +64,11 @@ public class AnySilentChest implements IAnySilentChest {
if (world.getTypeId(x, y, z + 1) == Block.CHEST.id)
chest = new InventoryLargeChest("Large chest", (IInventory) chest, (TileEntityChest) world.getTileEntity(x, y, z + 1));
- boolean returnValue = true;
+ boolean returnValue = false;
if (!silentchest) {
player.openContainer((IInventory) chest);
- }
- else {
+ returnValue = true;
+ } else {
try {
int id = 0;
try {
@@ -100,16 +77,14 @@ public class AnySilentChest implements IAnySilentChest {
id = windowID.getInt(player);
id = id % 100 + 1;
windowID.setInt(player, id);
- }
- catch (NoSuchFieldException e) {}
+ } catch (NoSuchFieldException e) {}
player.playerConnection.sendPacket(new Packet100OpenWindow(id, 0, ((IInventory) chest).getName(), ((IInventory) chest).getSize()));
player.activeContainer = new SilentContainerChest(player.inventory, ((IInventory) chest));
player.activeContainer.windowId = id;
player.activeContainer.addSlotListener(player);
- returnValue = false;
- }
- catch (Exception e) {
+ returnValue = true;
+ } catch (Exception e) {
e.printStackTrace();
p.sendMessage(ChatColor.RED + "Error while sending silent chest.");
}
@@ -117,4 +92,62 @@ public class AnySilentChest implements IAnySilentChest {
return returnValue;
}
+
+ @Override
+ public boolean isAnyContainerNeeded(Player p, int x, int y, int z) {
+ // FOR REFERENCE, LOOK AT net.minecraft.server.BlockChest
+ EntityPlayer player = ((CraftPlayer) p).getHandle();
+ World world = player.world;
+
+ // If block or ocelot on top
+ if (world.s(x, y + 1, z) || hasOcelotOnTop(world, x, y, z))
+ return true;
+
+ // If block next to chest is chest and has a block or ocelot on top
+ return isBlockedChest(world, x - 1, y, z) || isBlockedChest(world, x + 1, y, z)
+ || isBlockedChest(world, x, y, z - 1) || isBlockedChest(world, x, y, z + 1);
+ }
+
+ private boolean isBlockedChest(World world, int x, int y, int z) {
+ if (world.getTypeId(x, y, z) != Block.CHEST.id) {
+ return false;
+ }
+
+ if (world.s(x, y + 1, z)) {
+ return true;
+ }
+
+ return hasOcelotOnTop(world, x, y, z);
+ }
+
+ private boolean hasOcelotOnTop(World world, int x, int y, int z) {
+ for (Object localEntity : world.a(EntityOcelot.class,
+ AxisAlignedBB.a().a(x, y + 1, z, x + 1, y + 2, z + 1))) {
+ EntityOcelot localEntityOcelot = (EntityOcelot) localEntity;
+ if (localEntityOcelot.isSitting()) {
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ /**
+ * @deprecated Use {@link #activateContainer(Player, boolean, boolean, int, int, int)}.
+ */
+ @Deprecated
+ @Override
+ public boolean activateChest(Player player, boolean anychest, boolean silentchest, int x, int y, int z) {
+ return !activateContainer(player, anychest, silentchest, x, y, z);
+ }
+
+ /**
+ * @deprecated Use {@link #isAnyContainerNeeded(Player, int, int, int)}.
+ */
+ @Deprecated
+ @Override
+ public boolean isAnyChestNeeded(Player player, int x, int y, int z) {
+ return isAnyContainerNeeded(player, x, y, z);
+ }
+
}
diff --git a/OpenInvCraftbukkit1_4_R1/src/main/java/com/lishid/openinv/internal/v1_4_R1/AnySilentChest.java b/OpenInvCraftbukkit1_4_R1/src/main/java/com/lishid/openinv/internal/v1_4_R1/AnySilentContainer.java
similarity index 58%
rename from OpenInvCraftbukkit1_4_R1/src/main/java/com/lishid/openinv/internal/v1_4_R1/AnySilentChest.java
rename to OpenInvCraftbukkit1_4_R1/src/main/java/com/lishid/openinv/internal/v1_4_R1/AnySilentContainer.java
index 250c2e0..ea7ac83 100644
--- a/OpenInvCraftbukkit1_4_R1/src/main/java/com/lishid/openinv/internal/v1_4_R1/AnySilentChest.java
+++ b/OpenInvCraftbukkit1_4_R1/src/main/java/com/lishid/openinv/internal/v1_4_R1/AnySilentContainer.java
@@ -18,12 +18,15 @@ package com.lishid.openinv.internal.v1_4_R1;
import java.lang.reflect.Field;
+import com.lishid.openinv.internal.IAnySilentContainer;
+
import org.bukkit.ChatColor;
import org.bukkit.entity.Player;
-import com.lishid.openinv.internal.IAnySilentChest;
-
+// Volatile
+import net.minecraft.server.v1_4_R1.AxisAlignedBB;
import net.minecraft.server.v1_4_R1.Block;
+import net.minecraft.server.v1_4_R1.EntityOcelot;
import net.minecraft.server.v1_4_R1.EntityPlayer;
import net.minecraft.server.v1_4_R1.IInventory;
import net.minecraft.server.v1_4_R1.InventoryLargeChest;
@@ -31,51 +34,25 @@ import net.minecraft.server.v1_4_R1.Packet100OpenWindow;
import net.minecraft.server.v1_4_R1.TileEntityChest;
import net.minecraft.server.v1_4_R1.World;
-// Volatile
import org.bukkit.craftbukkit.v1_4_R1.entity.CraftPlayer;
-public class AnySilentChest implements IAnySilentChest {
+public class AnySilentContainer implements IAnySilentContainer {
+
@Override
- public boolean isAnyChestNeeded(Player p, int x, int y, int z) {
- // FOR REFERENCE, LOOK AT net.minecraft.server.BlockChest
- EntityPlayer player = ((CraftPlayer) p).getHandle();
- World world = player.world;
- // If block on top
- if (world.s(x, y + 1, z))
- return true;
-
- // If block next to chest is chest and has a block on top
- if ((world.getTypeId(x - 1, y, z) == Block.CHEST.id) && (world.s(x - 1, y + 1, z)))
- return true;
- if ((world.getTypeId(x + 1, y, z) == Block.CHEST.id) && (world.s(x + 1, y + 1, z)))
- return true;
- if ((world.getTypeId(x, y, z - 1) == Block.CHEST.id) && (world.s(x, y + 1, z - 1)))
- return true;
- if ((world.getTypeId(x, y, z + 1) == Block.CHEST.id) && (world.s(x, y + 1, z + 1)))
- return true;
-
- return false;
+ public boolean isAnySilentContainer(org.bukkit.block.Block block) {
+ return block instanceof org.bukkit.block.Chest;
}
@Override
- public boolean activateChest(Player p, boolean anychest, boolean silentchest, int x, int y, int z) {
+ public boolean activateContainer(Player p, boolean anychest, boolean silentchest, int x, int y, int z) {
EntityPlayer player = ((CraftPlayer) p).getHandle();
World world = player.world;
Object chest = world.getTileEntity(x, y, z);
if (chest == null)
- return true;
+ return false;
- if (!anychest) {
- if (world.s(x, y + 1, z))
- return true;
- if ((world.getTypeId(x - 1, y, z) == Block.CHEST.id) && (world.s(x - 1, y + 1, z)))
- return true;
- if ((world.getTypeId(x + 1, y, z) == Block.CHEST.id) && (world.s(x + 1, y + 1, z)))
- return true;
- if ((world.getTypeId(x, y, z - 1) == Block.CHEST.id) && (world.s(x, y + 1, z - 1)))
- return true;
- if ((world.getTypeId(x, y, z + 1) == Block.CHEST.id) && (world.s(x, y + 1, z + 1)))
- return true;
+ if (!anychest && isAnyContainerNeeded(p, x, y, z)) {
+ return false;
}
if (world.getTypeId(x - 1, y, z) == Block.CHEST.id)
@@ -87,11 +64,11 @@ public class AnySilentChest implements IAnySilentChest {
if (world.getTypeId(x, y, z + 1) == Block.CHEST.id)
chest = new InventoryLargeChest("Large chest", (IInventory) chest, (TileEntityChest) world.getTileEntity(x, y, z + 1));
- boolean returnValue = true;
+ boolean returnValue = false;
if (!silentchest) {
player.openContainer((IInventory) chest);
- }
- else {
+ returnValue = true;
+ } else {
try {
int id = 0;
try {
@@ -100,16 +77,14 @@ public class AnySilentChest implements IAnySilentChest {
id = windowID.getInt(player);
id = id % 100 + 1;
windowID.setInt(player, id);
- }
- catch (NoSuchFieldException e) {}
+ } catch (NoSuchFieldException e) {}
player.playerConnection.sendPacket(new Packet100OpenWindow(id, 0, ((IInventory) chest).getName(), ((IInventory) chest).getSize()));
player.activeContainer = new SilentContainerChest(player.inventory, ((IInventory) chest));
player.activeContainer.windowId = id;
player.activeContainer.addSlotListener(player);
- returnValue = false;
- }
- catch (Exception e) {
+ returnValue = true;
+ } catch (Exception e) {
e.printStackTrace();
p.sendMessage(ChatColor.RED + "Error while sending silent chest.");
}
@@ -117,4 +92,62 @@ public class AnySilentChest implements IAnySilentChest {
return returnValue;
}
+
+ @Override
+ public boolean isAnyContainerNeeded(Player p, int x, int y, int z) {
+ // FOR REFERENCE, LOOK AT net.minecraft.server.BlockChest
+ EntityPlayer player = ((CraftPlayer) p).getHandle();
+ World world = player.world;
+
+ // If block or ocelot on top
+ if (world.s(x, y + 1, z) || hasOcelotOnTop(world, x, y, z))
+ return true;
+
+ // If block next to chest is chest and has a block or ocelot on top
+ return isBlockedChest(world, x - 1, y, z) || isBlockedChest(world, x + 1, y, z)
+ || isBlockedChest(world, x, y, z - 1) || isBlockedChest(world, x, y, z + 1);
+ }
+
+ private boolean isBlockedChest(World world, int x, int y, int z) {
+ if (world.getTypeId(x, y, z) != Block.CHEST.id) {
+ return false;
+ }
+
+ if (world.s(x, y + 1, z)) {
+ return true;
+ }
+
+ return hasOcelotOnTop(world, x, y, z);
+ }
+
+ private boolean hasOcelotOnTop(World world, int x, int y, int z) {
+ for (Object localEntity : world.a(EntityOcelot.class,
+ AxisAlignedBB.a().a(x, y + 1, z, x + 1, y + 2, z + 1))) {
+ EntityOcelot localEntityOcelot = (EntityOcelot) localEntity;
+ if (localEntityOcelot.isSitting()) {
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ /**
+ * @deprecated Use {@link #activateContainer(Player, boolean, boolean, int, int, int)}.
+ */
+ @Deprecated
+ @Override
+ public boolean activateChest(Player player, boolean anychest, boolean silentchest, int x, int y, int z) {
+ return !activateContainer(player, anychest, silentchest, x, y, z);
+ }
+
+ /**
+ * @deprecated Use {@link #isAnyContainerNeeded(Player, int, int, int)}.
+ */
+ @Deprecated
+ @Override
+ public boolean isAnyChestNeeded(Player player, int x, int y, int z) {
+ return isAnyContainerNeeded(player, x, y, z);
+ }
+
}
diff --git a/OpenInvCraftbukkit1_5_R2/src/main/java/com/lishid/openinv/internal/v1_5_R2/AnySilentChest.java b/OpenInvCraftbukkit1_5_R2/src/main/java/com/lishid/openinv/internal/v1_5_R2/AnySilentContainer.java
similarity index 59%
rename from OpenInvCraftbukkit1_5_R2/src/main/java/com/lishid/openinv/internal/v1_5_R2/AnySilentChest.java
rename to OpenInvCraftbukkit1_5_R2/src/main/java/com/lishid/openinv/internal/v1_5_R2/AnySilentContainer.java
index 0006dd8..f2f9ba4 100644
--- a/OpenInvCraftbukkit1_5_R2/src/main/java/com/lishid/openinv/internal/v1_5_R2/AnySilentChest.java
+++ b/OpenInvCraftbukkit1_5_R2/src/main/java/com/lishid/openinv/internal/v1_5_R2/AnySilentContainer.java
@@ -18,12 +18,14 @@ package com.lishid.openinv.internal.v1_5_R2;
import java.lang.reflect.Field;
+import com.lishid.openinv.internal.IAnySilentContainer;
+
import org.bukkit.ChatColor;
import org.bukkit.entity.Player;
-import com.lishid.openinv.internal.IAnySilentChest;
-
// Volatile
+import net.minecraft.server.v1_5_R2.AxisAlignedBB;
+import net.minecraft.server.v1_5_R2.EntityOcelot;
import net.minecraft.server.v1_5_R2.EntityPlayer;
import net.minecraft.server.v1_5_R2.IInventory;
import net.minecraft.server.v1_5_R2.InventoryLargeChest;
@@ -33,54 +35,27 @@ import net.minecraft.server.v1_5_R2.World;
import org.bukkit.craftbukkit.v1_5_R2.entity.CraftPlayer;
-public class AnySilentChest implements IAnySilentChest {
+public class AnySilentContainer implements IAnySilentContainer {
+
@Override
- public boolean isAnyChestNeeded(Player p, int x, int y, int z) {
- // FOR REFERENCE, LOOK AT net.minecraft.server.BlockChest
- EntityPlayer player = ((CraftPlayer) p).getHandle();
- World world = player.world;
- // If block on top
- if (world.t(x, y + 1, z))
- return true;
-
- int id = world.getTypeId(x, y, z);
-
- // If block next to chest is chest and has a block on top
- if ((world.getTypeId(x - 1, y, z) == id) && (world.t(x - 1, y + 1, z)))
- return true;
- if ((world.getTypeId(x + 1, y, z) == id) && (world.t(x + 1, y + 1, z)))
- return true;
- if ((world.getTypeId(x, y, z - 1) == id) && (world.t(x, y + 1, z - 1)))
- return true;
- if ((world.getTypeId(x, y, z + 1) == id) && (world.t(x, y + 1, z + 1)))
- return true;
-
- return false;
+ public boolean isAnySilentContainer(org.bukkit.block.Block block) {
+ return block instanceof org.bukkit.block.Chest;
}
@Override
- public boolean activateChest(Player p, boolean anychest, boolean silentchest, int x, int y, int z) {
+ public boolean activateContainer(Player p, boolean anychest, boolean silentchest, int x, int y, int z) {
EntityPlayer player = ((CraftPlayer) p).getHandle();
World world = player.world;
Object chest = world.getTileEntity(x, y, z);
if (chest == null)
- return true;
+ return false;
+
+ if (!anychest && isAnyContainerNeeded(p, x, y, z)) {
+ return false;
+ }
int id = world.getTypeId(x, y, z);
- if (!anychest) {
- if (world.t(x, y + 1, z))
- return true;
- if ((world.getTypeId(x - 1, y, z) == id) && (world.t(x - 1, y + 1, z)))
- return true;
- if ((world.getTypeId(x + 1, y, z) == id) && (world.t(x + 1, y + 1, z)))
- return true;
- if ((world.getTypeId(x, y, z - 1) == id) && (world.t(x, y + 1, z - 1)))
- return true;
- if ((world.getTypeId(x, y, z + 1) == id) && (world.t(x, y + 1, z + 1)))
- return true;
- }
-
if (world.getTypeId(x - 1, y, z) == id)
chest = new InventoryLargeChest("Large chest", (TileEntityChest) world.getTileEntity(x - 1, y, z), (IInventory) chest);
if (world.getTypeId(x + 1, y, z) == id)
@@ -90,11 +65,11 @@ public class AnySilentChest implements IAnySilentChest {
if (world.getTypeId(x, y, z + 1) == id)
chest = new InventoryLargeChest("Large chest", (IInventory) chest, (TileEntityChest) world.getTileEntity(x, y, z + 1));
- boolean returnValue = true;
+ boolean returnValue = false;
if (!silentchest) {
player.openContainer((IInventory) chest);
- }
- else {
+ returnValue = true;
+ } else {
try {
int windowId = 0;
try {
@@ -103,16 +78,14 @@ public class AnySilentChest implements IAnySilentChest {
windowId = windowID.getInt(player);
windowId = windowId % 100 + 1;
windowID.setInt(player, windowId);
- }
- catch (NoSuchFieldException e) {}
+ } catch (NoSuchFieldException e) {}
player.playerConnection.sendPacket(new Packet100OpenWindow(windowId, 0, ((IInventory) chest).getName(), ((IInventory) chest).getSize(), true));
player.activeContainer = new SilentContainerChest(player.inventory, ((IInventory) chest));
player.activeContainer.windowId = windowId;
player.activeContainer.addSlotListener(player);
- returnValue = false;
- }
- catch (Exception e) {
+ returnValue = true;
+ } catch (Exception e) {
e.printStackTrace();
p.sendMessage(ChatColor.RED + "Error while sending silent chest.");
}
@@ -120,4 +93,64 @@ public class AnySilentChest implements IAnySilentChest {
return returnValue;
}
+
+ @Override
+ public boolean isAnyContainerNeeded(Player p, int x, int y, int z) {
+ // FOR REFERENCE, LOOK AT net.minecraft.server.BlockChest
+ EntityPlayer player = ((CraftPlayer) p).getHandle();
+ World world = player.world;
+
+ // If block or ocelot on top
+ if (world.t(x, y + 1, z) || hasOcelotOnTop(world, x, y, z))
+ return true;
+
+ int id = world.getTypeId(x, y, z);
+
+ // If block next to chest is chest and has a block or ocelot on top
+ return isBlockedChest(world, id, x - 1, y, z) || isBlockedChest(world, id, x + 1, y, z)
+ || isBlockedChest(world, id, x, y, z - 1) || isBlockedChest(world, id, x, y, z + 1);
+ }
+
+ private boolean isBlockedChest(World world, int id, int x, int y, int z) {
+ if (world.getTypeId(x, y, z) != id) {
+ return false;
+ }
+
+ if (world.t(x, y + 1, z)) {
+ return true;
+ }
+
+ return hasOcelotOnTop(world, x, y, z);
+ }
+
+ private boolean hasOcelotOnTop(World world, int x, int y, int z) {
+ for (Object localEntity : world.a(EntityOcelot.class,
+ AxisAlignedBB.a().a(x, y + 1, z, x + 1, y + 2, z + 1))) {
+ EntityOcelot localEntityOcelot = (EntityOcelot) localEntity;
+ if (localEntityOcelot.isSitting()) {
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ /**
+ * @deprecated Use {@link #activateContainer(Player, boolean, boolean, int, int, int)}.
+ */
+ @Deprecated
+ @Override
+ public boolean activateChest(Player player, boolean anychest, boolean silentchest, int x, int y, int z) {
+ return !activateContainer(player, anychest, silentchest, x, y, z);
+ }
+
+ /**
+ * @deprecated Use {@link #isAnyContainerNeeded(Player, int, int, int)}.
+ */
+ @Deprecated
+ @Override
+ public boolean isAnyChestNeeded(Player player, int x, int y, int z) {
+ return isAnyContainerNeeded(player, x, y, z);
+ }
+
}
diff --git a/OpenInvCraftbukkit1_5_R3/src/main/java/com/lishid/openinv/internal/v1_5_R3/AnySilentChest.java b/OpenInvCraftbukkit1_5_R3/src/main/java/com/lishid/openinv/internal/v1_5_R3/AnySilentContainer.java
similarity index 59%
rename from OpenInvCraftbukkit1_5_R3/src/main/java/com/lishid/openinv/internal/v1_5_R3/AnySilentChest.java
rename to OpenInvCraftbukkit1_5_R3/src/main/java/com/lishid/openinv/internal/v1_5_R3/AnySilentContainer.java
index 1572aa9..5485338 100644
--- a/OpenInvCraftbukkit1_5_R3/src/main/java/com/lishid/openinv/internal/v1_5_R3/AnySilentChest.java
+++ b/OpenInvCraftbukkit1_5_R3/src/main/java/com/lishid/openinv/internal/v1_5_R3/AnySilentContainer.java
@@ -18,12 +18,14 @@ package com.lishid.openinv.internal.v1_5_R3;
import java.lang.reflect.Field;
+import com.lishid.openinv.internal.IAnySilentContainer;
+
import org.bukkit.ChatColor;
import org.bukkit.entity.Player;
-import com.lishid.openinv.internal.IAnySilentChest;
-
//Volatile
+import net.minecraft.server.v1_5_R3.AxisAlignedBB;
+import net.minecraft.server.v1_5_R3.EntityOcelot;
import net.minecraft.server.v1_5_R3.EntityPlayer;
import net.minecraft.server.v1_5_R3.IInventory;
import net.minecraft.server.v1_5_R3.InventoryLargeChest;
@@ -33,54 +35,27 @@ import net.minecraft.server.v1_5_R3.World;
import org.bukkit.craftbukkit.v1_5_R3.entity.CraftPlayer;
-public class AnySilentChest implements IAnySilentChest {
+public class AnySilentContainer implements IAnySilentContainer {
+
@Override
- public boolean isAnyChestNeeded(Player p, int x, int y, int z) {
- // FOR REFERENCE, LOOK AT net.minecraft.server.BlockChest
- EntityPlayer player = ((CraftPlayer) p).getHandle();
- World world = player.world;
- // If block on top
- if (world.t(x, y + 1, z))
- return true;
-
- int id = world.getTypeId(x, y, z);
-
- // If block next to chest is chest and has a block on top
- if ((world.getTypeId(x - 1, y, z) == id) && (world.t(x - 1, y + 1, z)))
- return true;
- if ((world.getTypeId(x + 1, y, z) == id) && (world.t(x + 1, y + 1, z)))
- return true;
- if ((world.getTypeId(x, y, z - 1) == id) && (world.t(x, y + 1, z - 1)))
- return true;
- if ((world.getTypeId(x, y, z + 1) == id) && (world.t(x, y + 1, z + 1)))
- return true;
-
- return false;
+ public boolean isAnySilentContainer(org.bukkit.block.Block block) {
+ return block instanceof org.bukkit.block.Chest;
}
@Override
- public boolean activateChest(Player p, boolean anychest, boolean silentchest, int x, int y, int z) {
+ public boolean activateContainer(Player p, boolean anychest, boolean silentchest, int x, int y, int z) {
EntityPlayer player = ((CraftPlayer) p).getHandle();
World world = player.world;
Object chest = world.getTileEntity(x, y, z);
if (chest == null)
- return true;
+ return false;
+
+ if (!anychest && isAnyContainerNeeded(p, x, y, z)) {
+ return false;
+ }
int id = world.getTypeId(x, y, z);
- if (!anychest) {
- if (world.t(x, y + 1, z))
- return true;
- if ((world.getTypeId(x - 1, y, z) == id) && (world.t(x - 1, y + 1, z)))
- return true;
- if ((world.getTypeId(x + 1, y, z) == id) && (world.t(x + 1, y + 1, z)))
- return true;
- if ((world.getTypeId(x, y, z - 1) == id) && (world.t(x, y + 1, z - 1)))
- return true;
- if ((world.getTypeId(x, y, z + 1) == id) && (world.t(x, y + 1, z + 1)))
- return true;
- }
-
if (world.getTypeId(x - 1, y, z) == id)
chest = new InventoryLargeChest("Large chest", (TileEntityChest) world.getTileEntity(x - 1, y, z), (IInventory) chest);
if (world.getTypeId(x + 1, y, z) == id)
@@ -90,11 +65,11 @@ public class AnySilentChest implements IAnySilentChest {
if (world.getTypeId(x, y, z + 1) == id)
chest = new InventoryLargeChest("Large chest", (IInventory) chest, (TileEntityChest) world.getTileEntity(x, y, z + 1));
- boolean returnValue = true;
+ boolean returnValue = false;
if (!silentchest) {
player.openContainer((IInventory) chest);
- }
- else {
+ returnValue = true;
+ } else {
try {
int windowId = 0;
try {
@@ -103,16 +78,14 @@ public class AnySilentChest implements IAnySilentChest {
windowId = windowID.getInt(player);
windowId = windowId % 100 + 1;
windowID.setInt(player, windowId);
- }
- catch (NoSuchFieldException e) {}
+ } catch (NoSuchFieldException e) {}
player.playerConnection.sendPacket(new Packet100OpenWindow(windowId, 0, ((IInventory) chest).getName(), ((IInventory) chest).getSize(), true));
player.activeContainer = new SilentContainerChest(player.inventory, ((IInventory) chest));
player.activeContainer.windowId = windowId;
player.activeContainer.addSlotListener(player);
- returnValue = false;
- }
- catch (Exception e) {
+ returnValue = true;
+ } catch (Exception e) {
e.printStackTrace();
p.sendMessage(ChatColor.RED + "Error while sending silent chest.");
}
@@ -120,4 +93,64 @@ public class AnySilentChest implements IAnySilentChest {
return returnValue;
}
+
+ @Override
+ public boolean isAnyContainerNeeded(Player p, int x, int y, int z) {
+ // FOR REFERENCE, LOOK AT net.minecraft.server.BlockChest
+ EntityPlayer player = ((CraftPlayer) p).getHandle();
+ World world = player.world;
+
+ // If block or ocelot on top
+ if (world.t(x, y + 1, z) || hasOcelotOnTop(world, x, y, z))
+ return true;
+
+ int id = world.getTypeId(x, y, z);
+
+ // If block next to chest is chest and has a block or ocelot on top
+ return isBlockedChest(world, id, x - 1, y, z) || isBlockedChest(world, id, x + 1, y, z)
+ || isBlockedChest(world, id, x, y, z - 1) || isBlockedChest(world, id, x, y, z + 1);
+ }
+
+ private boolean isBlockedChest(World world, int id, int x, int y, int z) {
+ if (world.getTypeId(x, y, z) != id) {
+ return false;
+ }
+
+ if (world.t(x, y + 1, z)) {
+ return true;
+ }
+
+ return hasOcelotOnTop(world, x, y, z);
+ }
+
+ private boolean hasOcelotOnTop(World world, int x, int y, int z) {
+ for (Object localEntity : world.a(EntityOcelot.class,
+ AxisAlignedBB.a().a(x, y + 1, z, x + 1, y + 2, z + 1))) {
+ EntityOcelot localEntityOcelot = (EntityOcelot) localEntity;
+ if (localEntityOcelot.isSitting()) {
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ /**
+ * @deprecated Use {@link #activateContainer(Player, boolean, boolean, int, int, int)}.
+ */
+ @Deprecated
+ @Override
+ public boolean activateChest(Player player, boolean anychest, boolean silentchest, int x, int y, int z) {
+ return !activateContainer(player, anychest, silentchest, x, y, z);
+ }
+
+ /**
+ * @deprecated Use {@link #isAnyContainerNeeded(Player, int, int, int)}.
+ */
+ @Deprecated
+ @Override
+ public boolean isAnyChestNeeded(Player player, int x, int y, int z) {
+ return isAnyContainerNeeded(player, x, y, z);
+ }
+
}
diff --git a/OpenInvCraftbukkit1_6_R1/src/main/java/com/lishid/openinv/internal/v1_6_R1/AnySilentChest.java b/OpenInvCraftbukkit1_6_R1/src/main/java/com/lishid/openinv/internal/v1_6_R1/AnySilentContainer.java
similarity index 59%
rename from OpenInvCraftbukkit1_6_R1/src/main/java/com/lishid/openinv/internal/v1_6_R1/AnySilentChest.java
rename to OpenInvCraftbukkit1_6_R1/src/main/java/com/lishid/openinv/internal/v1_6_R1/AnySilentContainer.java
index c93d76d..b19a9cc 100644
--- a/OpenInvCraftbukkit1_6_R1/src/main/java/com/lishid/openinv/internal/v1_6_R1/AnySilentChest.java
+++ b/OpenInvCraftbukkit1_6_R1/src/main/java/com/lishid/openinv/internal/v1_6_R1/AnySilentContainer.java
@@ -18,12 +18,14 @@ package com.lishid.openinv.internal.v1_6_R1;
import java.lang.reflect.Field;
+import com.lishid.openinv.internal.IAnySilentContainer;
+
import org.bukkit.ChatColor;
import org.bukkit.entity.Player;
-import com.lishid.openinv.internal.IAnySilentChest;
-
// Volatile
+import net.minecraft.server.v1_6_R1.AxisAlignedBB;
+import net.minecraft.server.v1_6_R1.EntityOcelot;
import net.minecraft.server.v1_6_R1.EntityPlayer;
import net.minecraft.server.v1_6_R1.IInventory;
import net.minecraft.server.v1_6_R1.InventoryLargeChest;
@@ -33,54 +35,27 @@ import net.minecraft.server.v1_6_R1.World;
import org.bukkit.craftbukkit.v1_6_R1.entity.CraftPlayer;
-public class AnySilentChest implements IAnySilentChest {
+public class AnySilentContainer implements IAnySilentContainer {
+
@Override
- public boolean isAnyChestNeeded(Player p, int x, int y, int z) {
- // FOR REFERENCE, LOOK AT net.minecraft.server.BlockChest
- EntityPlayer player = ((CraftPlayer) p).getHandle();
- World world = player.world;
- // If block on top
- if (world.t(x, y + 1, z))
- return true;
-
- int id = world.getTypeId(x, y, z);
-
- // If block next to chest is chest and has a block on top
- if ((world.getTypeId(x - 1, y, z) == id) && (world.t(x - 1, y + 1, z)))
- return true;
- if ((world.getTypeId(x + 1, y, z) == id) && (world.t(x + 1, y + 1, z)))
- return true;
- if ((world.getTypeId(x, y, z - 1) == id) && (world.t(x, y + 1, z - 1)))
- return true;
- if ((world.getTypeId(x, y, z + 1) == id) && (world.t(x, y + 1, z + 1)))
- return true;
-
- return false;
+ public boolean isAnySilentContainer(org.bukkit.block.Block block) {
+ return block instanceof org.bukkit.block.Chest;
}
@Override
- public boolean activateChest(Player p, boolean anychest, boolean silentchest, int x, int y, int z) {
+ public boolean activateContainer(Player p, boolean anychest, boolean silentchest, int x, int y, int z) {
EntityPlayer player = ((CraftPlayer) p).getHandle();
World world = player.world;
Object chest = world.getTileEntity(x, y, z);
if (chest == null)
- return true;
+ return false;
+
+ if (!anychest && isAnyContainerNeeded(p, x, y, z)) {
+ return false;
+ }
int id = world.getTypeId(x, y, z);
- if (!anychest) {
- if (world.t(x, y + 1, z))
- return true;
- if ((world.getTypeId(x - 1, y, z) == id) && (world.t(x - 1, y + 1, z)))
- return true;
- if ((world.getTypeId(x + 1, y, z) == id) && (world.t(x + 1, y + 1, z)))
- return true;
- if ((world.getTypeId(x, y, z - 1) == id) && (world.t(x, y + 1, z - 1)))
- return true;
- if ((world.getTypeId(x, y, z + 1) == id) && (world.t(x, y + 1, z + 1)))
- return true;
- }
-
if (world.getTypeId(x - 1, y, z) == id)
chest = new InventoryLargeChest("Large chest", (TileEntityChest) world.getTileEntity(x - 1, y, z), (IInventory) chest);
if (world.getTypeId(x + 1, y, z) == id)
@@ -90,11 +65,11 @@ public class AnySilentChest implements IAnySilentChest {
if (world.getTypeId(x, y, z + 1) == id)
chest = new InventoryLargeChest("Large chest", (IInventory) chest, (TileEntityChest) world.getTileEntity(x, y, z + 1));
- boolean returnValue = true;
+ boolean returnValue = false;
if (!silentchest) {
player.openContainer((IInventory) chest);
- }
- else {
+ returnValue = true;
+ } else {
try {
int windowId = 0;
try {
@@ -103,16 +78,14 @@ public class AnySilentChest implements IAnySilentChest {
windowId = windowID.getInt(player);
windowId = windowId % 100 + 1;
windowID.setInt(player, windowId);
- }
- catch (NoSuchFieldException e) {}
+ } catch (NoSuchFieldException e) {}
player.playerConnection.sendPacket(new Packet100OpenWindow(windowId, 0, ((IInventory) chest).getName(), ((IInventory) chest).getSize(), true));
player.activeContainer = new SilentContainerChest(player.inventory, ((IInventory) chest));
player.activeContainer.windowId = windowId;
player.activeContainer.addSlotListener(player);
- returnValue = false;
- }
- catch (Exception e) {
+ returnValue = true;
+ } catch (Exception e) {
e.printStackTrace();
p.sendMessage(ChatColor.RED + "Error while sending silent chest.");
}
@@ -120,4 +93,64 @@ public class AnySilentChest implements IAnySilentChest {
return returnValue;
}
+
+ @Override
+ public boolean isAnyContainerNeeded(Player p, int x, int y, int z) {
+ // FOR REFERENCE, LOOK AT net.minecraft.server.BlockChest
+ EntityPlayer player = ((CraftPlayer) p).getHandle();
+ World world = player.world;
+
+ // If block or ocelot on top
+ if (world.t(x, y + 1, z) || hasOcelotOnTop(world, x, y, z))
+ return true;
+
+ int id = world.getTypeId(x, y, z);
+
+ // If block next to chest is chest and has a block or ocelot on top
+ return isBlockedChest(world, id, x - 1, y, z) || isBlockedChest(world, id, x + 1, y, z)
+ || isBlockedChest(world, id, x, y, z - 1) || isBlockedChest(world, id, x, y, z + 1);
+ }
+
+ private boolean isBlockedChest(World world, int id, int x, int y, int z) {
+ if (world.getTypeId(x, y, z) != id) {
+ return false;
+ }
+
+ if (world.t(x, y + 1, z)) {
+ return true;
+ }
+
+ return hasOcelotOnTop(world, x, y, z);
+ }
+
+ private boolean hasOcelotOnTop(World world, int x, int y, int z) {
+ for (Object localEntity : world.a(EntityOcelot.class,
+ AxisAlignedBB.a().a(x, y + 1, z, x + 1, y + 2, z + 1))) {
+ EntityOcelot localEntityOcelot = (EntityOcelot) localEntity;
+ if (localEntityOcelot.isSitting()) {
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ /**
+ * @deprecated Use {@link #activateContainer(Player, boolean, boolean, int, int, int)}.
+ */
+ @Deprecated
+ @Override
+ public boolean activateChest(Player player, boolean anychest, boolean silentchest, int x, int y, int z) {
+ return !activateContainer(player, anychest, silentchest, x, y, z);
+ }
+
+ /**
+ * @deprecated Use {@link #isAnyContainerNeeded(Player, int, int, int)}.
+ */
+ @Deprecated
+ @Override
+ public boolean isAnyChestNeeded(Player player, int x, int y, int z) {
+ return isAnyContainerNeeded(player, x, y, z);
+ }
+
}
diff --git a/OpenInvCraftbukkit1_6_R2/src/main/java/com/lishid/openinv/internal/v1_6_R2/AnySilentChest.java b/OpenInvCraftbukkit1_6_R2/src/main/java/com/lishid/openinv/internal/v1_6_R2/AnySilentContainer.java
similarity index 59%
rename from OpenInvCraftbukkit1_6_R2/src/main/java/com/lishid/openinv/internal/v1_6_R2/AnySilentChest.java
rename to OpenInvCraftbukkit1_6_R2/src/main/java/com/lishid/openinv/internal/v1_6_R2/AnySilentContainer.java
index d69ec49..b55f55f 100644
--- a/OpenInvCraftbukkit1_6_R2/src/main/java/com/lishid/openinv/internal/v1_6_R2/AnySilentChest.java
+++ b/OpenInvCraftbukkit1_6_R2/src/main/java/com/lishid/openinv/internal/v1_6_R2/AnySilentContainer.java
@@ -18,12 +18,14 @@ package com.lishid.openinv.internal.v1_6_R2;
import java.lang.reflect.Field;
+import com.lishid.openinv.internal.IAnySilentContainer;
+
import org.bukkit.ChatColor;
import org.bukkit.entity.Player;
-import com.lishid.openinv.internal.IAnySilentChest;
-
// Volatile
+import net.minecraft.server.v1_6_R2.AxisAlignedBB;
+import net.minecraft.server.v1_6_R2.EntityOcelot;
import net.minecraft.server.v1_6_R2.EntityPlayer;
import net.minecraft.server.v1_6_R2.IInventory;
import net.minecraft.server.v1_6_R2.InventoryLargeChest;
@@ -33,54 +35,27 @@ import net.minecraft.server.v1_6_R2.World;
import org.bukkit.craftbukkit.v1_6_R2.entity.CraftPlayer;
-public class AnySilentChest implements IAnySilentChest {
+public class AnySilentContainer implements IAnySilentContainer {
+
@Override
- public boolean isAnyChestNeeded(Player p, int x, int y, int z) {
- // FOR REFERENCE, LOOK AT net.minecraft.server.BlockChest
- EntityPlayer player = ((CraftPlayer) p).getHandle();
- World world = player.world;
- // If block on top
- if (world.t(x, y + 1, z))
- return true;
-
- int id = world.getTypeId(x, y, z);
-
- // If block next to chest is chest and has a block on top
- if ((world.getTypeId(x - 1, y, z) == id) && (world.t(x - 1, y + 1, z)))
- return true;
- if ((world.getTypeId(x + 1, y, z) == id) && (world.t(x + 1, y + 1, z)))
- return true;
- if ((world.getTypeId(x, y, z - 1) == id) && (world.t(x, y + 1, z - 1)))
- return true;
- if ((world.getTypeId(x, y, z + 1) == id) && (world.t(x, y + 1, z + 1)))
- return true;
-
- return false;
+ public boolean isAnySilentContainer(org.bukkit.block.Block block) {
+ return block instanceof org.bukkit.block.Chest;
}
@Override
- public boolean activateChest(Player p, boolean anychest, boolean silentchest, int x, int y, int z) {
+ public boolean activateContainer(Player p, boolean anychest, boolean silentchest, int x, int y, int z) {
EntityPlayer player = ((CraftPlayer) p).getHandle();
World world = player.world;
Object chest = world.getTileEntity(x, y, z);
if (chest == null)
- return true;
+ return false;
+
+ if (!anychest && isAnyContainerNeeded(p, x, y, z)) {
+ return false;
+ }
int id = world.getTypeId(x, y, z);
- if (!anychest) {
- if (world.t(x, y + 1, z))
- return true;
- if ((world.getTypeId(x - 1, y, z) == id) && (world.t(x - 1, y + 1, z)))
- return true;
- if ((world.getTypeId(x + 1, y, z) == id) && (world.t(x + 1, y + 1, z)))
- return true;
- if ((world.getTypeId(x, y, z - 1) == id) && (world.t(x, y + 1, z - 1)))
- return true;
- if ((world.getTypeId(x, y, z + 1) == id) && (world.t(x, y + 1, z + 1)))
- return true;
- }
-
if (world.getTypeId(x - 1, y, z) == id)
chest = new InventoryLargeChest("Large chest", (TileEntityChest) world.getTileEntity(x - 1, y, z), (IInventory) chest);
if (world.getTypeId(x + 1, y, z) == id)
@@ -90,11 +65,11 @@ public class AnySilentChest implements IAnySilentChest {
if (world.getTypeId(x, y, z + 1) == id)
chest = new InventoryLargeChest("Large chest", (IInventory) chest, (TileEntityChest) world.getTileEntity(x, y, z + 1));
- boolean returnValue = true;
+ boolean returnValue = false;
if (!silentchest) {
player.openContainer((IInventory) chest);
- }
- else {
+ returnValue = true;
+ } else {
try {
int windowId = 0;
try {
@@ -103,16 +78,14 @@ public class AnySilentChest implements IAnySilentChest {
windowId = windowID.getInt(player);
windowId = windowId % 100 + 1;
windowID.setInt(player, windowId);
- }
- catch (NoSuchFieldException e) {}
+ } catch (NoSuchFieldException e) {}
player.playerConnection.sendPacket(new Packet100OpenWindow(windowId, 0, ((IInventory) chest).getName(), ((IInventory) chest).getSize(), true));
player.activeContainer = new SilentContainerChest(player.inventory, ((IInventory) chest));
player.activeContainer.windowId = windowId;
player.activeContainer.addSlotListener(player);
- returnValue = false;
- }
- catch (Exception e) {
+ returnValue = true;
+ } catch (Exception e) {
e.printStackTrace();
p.sendMessage(ChatColor.RED + "Error while sending silent chest.");
}
@@ -120,4 +93,64 @@ public class AnySilentChest implements IAnySilentChest {
return returnValue;
}
+
+ @Override
+ public boolean isAnyContainerNeeded(Player p, int x, int y, int z) {
+ // FOR REFERENCE, LOOK AT net.minecraft.server.BlockChest
+ EntityPlayer player = ((CraftPlayer) p).getHandle();
+ World world = player.world;
+
+ // If block or ocelot on top
+ if (world.t(x, y + 1, z) || hasOcelotOnTop(world, x, y, z))
+ return true;
+
+ int id = world.getTypeId(x, y, z);
+
+ // If block next to chest is chest and has a block or ocelot on top
+ return isBlockedChest(world, id, x - 1, y, z) || isBlockedChest(world, id, x + 1, y, z)
+ || isBlockedChest(world, id, x, y, z - 1) || isBlockedChest(world, id, x, y, z + 1);
+ }
+
+ private boolean isBlockedChest(World world, int id, int x, int y, int z) {
+ if (world.getTypeId(x, y, z) != id) {
+ return false;
+ }
+
+ if (world.t(x, y + 1, z)) {
+ return true;
+ }
+
+ return hasOcelotOnTop(world, x, y, z);
+ }
+
+ private boolean hasOcelotOnTop(World world, int x, int y, int z) {
+ for (Object localEntity : world.a(EntityOcelot.class,
+ AxisAlignedBB.a().a(x, y + 1, z, x + 1, y + 2, z + 1))) {
+ EntityOcelot localEntityOcelot = (EntityOcelot) localEntity;
+ if (localEntityOcelot.isSitting()) {
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ /**
+ * @deprecated Use {@link #activateContainer(Player, boolean, boolean, int, int, int)}.
+ */
+ @Deprecated
+ @Override
+ public boolean activateChest(Player player, boolean anychest, boolean silentchest, int x, int y, int z) {
+ return !activateContainer(player, anychest, silentchest, x, y, z);
+ }
+
+ /**
+ * @deprecated Use {@link #isAnyContainerNeeded(Player, int, int, int)}.
+ */
+ @Deprecated
+ @Override
+ public boolean isAnyChestNeeded(Player player, int x, int y, int z) {
+ return isAnyContainerNeeded(player, x, y, z);
+ }
+
}
diff --git a/OpenInvCraftbukkit1_6_R3/src/main/java/com/lishid/openinv/internal/v1_6_R3/AnySilentChest.java b/OpenInvCraftbukkit1_6_R3/src/main/java/com/lishid/openinv/internal/v1_6_R3/AnySilentContainer.java
similarity index 59%
rename from OpenInvCraftbukkit1_6_R3/src/main/java/com/lishid/openinv/internal/v1_6_R3/AnySilentChest.java
rename to OpenInvCraftbukkit1_6_R3/src/main/java/com/lishid/openinv/internal/v1_6_R3/AnySilentContainer.java
index 619375b..e295412 100644
--- a/OpenInvCraftbukkit1_6_R3/src/main/java/com/lishid/openinv/internal/v1_6_R3/AnySilentChest.java
+++ b/OpenInvCraftbukkit1_6_R3/src/main/java/com/lishid/openinv/internal/v1_6_R3/AnySilentContainer.java
@@ -18,12 +18,14 @@ package com.lishid.openinv.internal.v1_6_R3;
import java.lang.reflect.Field;
+import com.lishid.openinv.internal.IAnySilentContainer;
+
import org.bukkit.ChatColor;
import org.bukkit.entity.Player;
-import com.lishid.openinv.internal.IAnySilentChest;
-
// Volatile
+import net.minecraft.server.v1_6_R3.AxisAlignedBB;
+import net.minecraft.server.v1_6_R3.EntityOcelot;
import net.minecraft.server.v1_6_R3.EntityPlayer;
import net.minecraft.server.v1_6_R3.IInventory;
import net.minecraft.server.v1_6_R3.InventoryLargeChest;
@@ -33,54 +35,27 @@ import net.minecraft.server.v1_6_R3.World;
import org.bukkit.craftbukkit.v1_6_R3.entity.CraftPlayer;
-public class AnySilentChest implements IAnySilentChest {
+public class AnySilentContainer implements IAnySilentContainer {
+
@Override
- public boolean isAnyChestNeeded(Player p, int x, int y, int z) {
- // FOR REFERENCE, LOOK AT net.minecraft.server.BlockChest
- EntityPlayer player = ((CraftPlayer) p).getHandle();
- World world = player.world;
- // If block on top
- if (world.t(x, y + 1, z))
- return true;
-
- int id = world.getTypeId(x, y, z);
-
- // If block next to chest is chest and has a block on top
- if ((world.getTypeId(x - 1, y, z) == id) && (world.t(x - 1, y + 1, z)))
- return true;
- if ((world.getTypeId(x + 1, y, z) == id) && (world.t(x + 1, y + 1, z)))
- return true;
- if ((world.getTypeId(x, y, z - 1) == id) && (world.t(x, y + 1, z - 1)))
- return true;
- if ((world.getTypeId(x, y, z + 1) == id) && (world.t(x, y + 1, z + 1)))
- return true;
-
- return false;
+ public boolean isAnySilentContainer(org.bukkit.block.Block block) {
+ return block instanceof org.bukkit.block.Chest;
}
@Override
- public boolean activateChest(Player p, boolean anychest, boolean silentchest, int x, int y, int z) {
+ public boolean activateContainer(Player p, boolean anychest, boolean silentchest, int x, int y, int z) {
EntityPlayer player = ((CraftPlayer) p).getHandle();
World world = player.world;
Object chest = world.getTileEntity(x, y, z);
if (chest == null)
- return true;
+ return false;
+
+ if (!anychest && isAnyContainerNeeded(p, x, y, z)) {
+ return false;
+ }
int id = world.getTypeId(x, y, z);
- if (!anychest) {
- if (world.t(x, y + 1, z))
- return true;
- if ((world.getTypeId(x - 1, y, z) == id) && (world.t(x - 1, y + 1, z)))
- return true;
- if ((world.getTypeId(x + 1, y, z) == id) && (world.t(x + 1, y + 1, z)))
- return true;
- if ((world.getTypeId(x, y, z - 1) == id) && (world.t(x, y + 1, z - 1)))
- return true;
- if ((world.getTypeId(x, y, z + 1) == id) && (world.t(x, y + 1, z + 1)))
- return true;
- }
-
if (world.getTypeId(x - 1, y, z) == id)
chest = new InventoryLargeChest("Large chest", (TileEntityChest) world.getTileEntity(x - 1, y, z), (IInventory) chest);
if (world.getTypeId(x + 1, y, z) == id)
@@ -90,11 +65,11 @@ public class AnySilentChest implements IAnySilentChest {
if (world.getTypeId(x, y, z + 1) == id)
chest = new InventoryLargeChest("Large chest", (IInventory) chest, (TileEntityChest) world.getTileEntity(x, y, z + 1));
- boolean returnValue = true;
+ boolean returnValue = false;
if (!silentchest) {
player.openContainer((IInventory) chest);
- }
- else {
+ returnValue = true;
+ } else {
try {
int windowId = 0;
try {
@@ -103,16 +78,14 @@ public class AnySilentChest implements IAnySilentChest {
windowId = windowID.getInt(player);
windowId = windowId % 100 + 1;
windowID.setInt(player, windowId);
- }
- catch (NoSuchFieldException e) {}
+ } catch (NoSuchFieldException e) {}
player.playerConnection.sendPacket(new Packet100OpenWindow(windowId, 0, ((IInventory) chest).getName(), ((IInventory) chest).getSize(), true));
player.activeContainer = new SilentContainerChest(player.inventory, ((IInventory) chest));
player.activeContainer.windowId = windowId;
player.activeContainer.addSlotListener(player);
- returnValue = false;
- }
- catch (Exception e) {
+ returnValue = true;
+ } catch (Exception e) {
e.printStackTrace();
p.sendMessage(ChatColor.RED + "Error while sending silent chest.");
}
@@ -120,4 +93,64 @@ public class AnySilentChest implements IAnySilentChest {
return returnValue;
}
+
+ @Override
+ public boolean isAnyContainerNeeded(Player p, int x, int y, int z) {
+ // FOR REFERENCE, LOOK AT net.minecraft.server.BlockChest
+ EntityPlayer player = ((CraftPlayer) p).getHandle();
+ World world = player.world;
+
+ // If block or ocelot on top
+ if (world.t(x, y + 1, z) || hasOcelotOnTop(world, x, y, z))
+ return true;
+
+ int id = world.getTypeId(x, y, z);
+
+ // If block next to chest is chest and has a block or ocelot on top
+ return isBlockedChest(world, id, x - 1, y, z) || isBlockedChest(world, id, x + 1, y, z)
+ || isBlockedChest(world, id, x, y, z - 1) || isBlockedChest(world, id, x, y, z + 1);
+ }
+
+ private boolean isBlockedChest(World world, int id, int x, int y, int z) {
+ if (world.getTypeId(x, y, z) != id) {
+ return false;
+ }
+
+ if (world.t(x, y + 1, z)) {
+ return true;
+ }
+
+ return hasOcelotOnTop(world, x, y, z);
+ }
+
+ private boolean hasOcelotOnTop(World world, int x, int y, int z) {
+ for (Object localEntity : world.a(EntityOcelot.class,
+ AxisAlignedBB.a().a(x, y + 1, z, x + 1, y + 2, z + 1))) {
+ EntityOcelot localEntityOcelot = (EntityOcelot) localEntity;
+ if (localEntityOcelot.isSitting()) {
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ /**
+ * @deprecated Use {@link #activateContainer(Player, boolean, boolean, int, int, int)}.
+ */
+ @Deprecated
+ @Override
+ public boolean activateChest(Player player, boolean anychest, boolean silentchest, int x, int y, int z) {
+ return !activateContainer(player, anychest, silentchest, x, y, z);
+ }
+
+ /**
+ * @deprecated Use {@link #isAnyContainerNeeded(Player, int, int, int)}.
+ */
+ @Deprecated
+ @Override
+ public boolean isAnyChestNeeded(Player player, int x, int y, int z) {
+ return isAnyContainerNeeded(player, x, y, z);
+ }
+
}
diff --git a/OpenInvCraftbukkit1_7_R1/src/main/java/com/lishid/openinv/internal/v1_7_R1/AnySilentChest.java b/OpenInvCraftbukkit1_7_R1/src/main/java/com/lishid/openinv/internal/v1_7_R1/AnySilentContainer.java
similarity index 59%
rename from OpenInvCraftbukkit1_7_R1/src/main/java/com/lishid/openinv/internal/v1_7_R1/AnySilentChest.java
rename to OpenInvCraftbukkit1_7_R1/src/main/java/com/lishid/openinv/internal/v1_7_R1/AnySilentContainer.java
index 43a0778..0dbc79b 100644
--- a/OpenInvCraftbukkit1_7_R1/src/main/java/com/lishid/openinv/internal/v1_7_R1/AnySilentChest.java
+++ b/OpenInvCraftbukkit1_7_R1/src/main/java/com/lishid/openinv/internal/v1_7_R1/AnySilentContainer.java
@@ -18,13 +18,15 @@ package com.lishid.openinv.internal.v1_7_R1;
import java.lang.reflect.Field;
+import com.lishid.openinv.internal.IAnySilentContainer;
+
import org.bukkit.ChatColor;
import org.bukkit.entity.Player;
-import com.lishid.openinv.internal.IAnySilentChest;
-
//Volatile
+import net.minecraft.server.v1_7_R1.AxisAlignedBB;
import net.minecraft.server.v1_7_R1.Block;
+import net.minecraft.server.v1_7_R1.EntityOcelot;
import net.minecraft.server.v1_7_R1.EntityPlayer;
import net.minecraft.server.v1_7_R1.IInventory;
import net.minecraft.server.v1_7_R1.InventoryLargeChest;
@@ -34,54 +36,27 @@ import net.minecraft.server.v1_7_R1.World;
import org.bukkit.craftbukkit.v1_7_R1.entity.CraftPlayer;
-public class AnySilentChest implements IAnySilentChest {
+public class AnySilentContainer implements IAnySilentContainer {
+
@Override
- public boolean isAnyChestNeeded(Player p, int x, int y, int z) {
- // FOR REFERENCE, LOOK AT net.minecraft.server.BlockChest
- EntityPlayer player = ((CraftPlayer) p).getHandle();
- World world = player.world;
- // If block on top
- if (world.getType(x, y + 1, z).c())
- return true;
-
- int id = Block.b(world.getType(x, y, z));
-
- // If block next to chest is chest and has a block on top
- if ((Block.b(world.getType(x - 1, y, z)) == id) && (world.getType(x - 1, y + 1, z).c()))
- return true;
- if ((Block.b(world.getType(x + 1, y, z)) == id) && (world.getType(x + 1, y + 1, z).c()))
- return true;
- if ((Block.b(world.getType(x, y, z - 1)) == id) && (world.getType(x, y + 1, z - 1).c()))
- return true;
- if ((Block.b(world.getType(x, y, z + 1)) == id) && (world.getType(x, y + 1, z + 1).c()))
- return true;
-
- return false;
+ public boolean isAnySilentContainer(org.bukkit.block.Block block) {
+ return block instanceof org.bukkit.block.Chest;
}
@Override
- public boolean activateChest(Player p, boolean anychest, boolean silentchest, int x, int y, int z) {
+ public boolean activateContainer(Player p, boolean anychest, boolean silentchest, int x, int y, int z) {
EntityPlayer player = ((CraftPlayer) p).getHandle();
World world = player.world;
Object chest = world.getTileEntity(x, y, z);
if (chest == null)
- return true;
+ return false;
+
+ if (!anychest && isAnyContainerNeeded(p, x, y, z)) {
+ return false;
+ }
int id = Block.b(world.getType(x, y, z));
- if (!anychest) {
- if (world.getType(x, y + 1, z).c())
- return true;
- if ((Block.b(world.getType(x - 1, y, z)) == id) && (world.getType(x - 1, y + 1, z).c()))
- return true;
- if ((Block.b(world.getType(x + 1, y, z)) == id) && (world.getType(x + 1, y + 1, z).c()))
- return true;
- if ((Block.b(world.getType(x, y, z - 1)) == id) && (world.getType(x, y + 1, z - 1).c()))
- return true;
- if ((Block.b(world.getType(x, y, z + 1)) == id) && (world.getType(x, y + 1, z + 1).c()))
- return true;
- }
-
if (Block.b(world.getType(x - 1, y, z)) == id)
chest = new InventoryLargeChest("Large chest", (TileEntityChest) world.getTileEntity(x - 1, y, z), (IInventory) chest);
if (Block.b(world.getType(x + 1, y, z)) == id)
@@ -91,11 +66,11 @@ public class AnySilentChest implements IAnySilentChest {
if (Block.b(world.getType(x, y, z + 1)) == id)
chest = new InventoryLargeChest("Large chest", (IInventory) chest, (TileEntityChest) world.getTileEntity(x, y, z + 1));
- boolean returnValue = true;
+ boolean returnValue = false;
if (!silentchest) {
player.openContainer((IInventory) chest);
- }
- else {
+ returnValue = true;
+ } else {
try {
int windowId = 0;
try {
@@ -104,16 +79,14 @@ public class AnySilentChest implements IAnySilentChest {
windowId = windowID.getInt(player);
windowId = windowId % 100 + 1;
windowID.setInt(player, windowId);
- }
- catch (NoSuchFieldException e) {}
+ } catch (NoSuchFieldException e) {}
player.playerConnection.sendPacket(new PacketPlayOutOpenWindow(windowId, 0, ((IInventory) chest).getInventoryName(), ((IInventory) chest).getSize(), true));
player.activeContainer = new SilentContainerChest(player.inventory, ((IInventory) chest));
player.activeContainer.windowId = windowId;
player.activeContainer.addSlotListener(player);
- returnValue = false;
- }
- catch (Exception e) {
+ returnValue = true;
+ } catch (Exception e) {
e.printStackTrace();
p.sendMessage(ChatColor.RED + "Error while sending silent chest.");
}
@@ -121,4 +94,64 @@ public class AnySilentChest implements IAnySilentChest {
return returnValue;
}
+
+ @Override
+ public boolean isAnyContainerNeeded(Player p, int x, int y, int z) {
+ // FOR REFERENCE, LOOK AT net.minecraft.server.BlockChest
+ EntityPlayer player = ((CraftPlayer) p).getHandle();
+ World world = player.world;
+
+ // If block or ocelot on top
+ if (world.t(x, y + 1, z) || hasOcelotOnTop(world, x, y, z))
+ return true;
+
+ int id = Block.b(world.getType(x, y, z));
+
+ // If block next to chest is chest and has a block or ocelot on top
+ return isBlockedChest(world, id, x - 1, y, z) || isBlockedChest(world, id, x + 1, y, z)
+ || isBlockedChest(world, id, x, y, z - 1) || isBlockedChest(world, id, x, y, z + 1);
+ }
+
+ private boolean isBlockedChest(World world, int id, int x, int y, int z) {
+ if (Block.b(world.getType(x, y, z)) != id) {
+ return false;
+ }
+
+ if (world.t(x, y + 1, z)) {
+ return true;
+ }
+
+ return hasOcelotOnTop(world, x, y, z);
+ }
+
+ private boolean hasOcelotOnTop(World world, int x, int y, int z) {
+ for (Object localEntity : world.a(EntityOcelot.class,
+ AxisAlignedBB.a().a(x, y + 1, z, x + 1, y + 2, z + 1))) {
+ EntityOcelot localEntityOcelot = (EntityOcelot) localEntity;
+ if (localEntityOcelot.isSitting()) {
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ /**
+ * @deprecated Use {@link #activateContainer(Player, boolean, boolean, int, int, int)}.
+ */
+ @Deprecated
+ @Override
+ public boolean activateChest(Player player, boolean anychest, boolean silentchest, int x, int y, int z) {
+ return !activateContainer(player, anychest, silentchest, x, y, z);
+ }
+
+ /**
+ * @deprecated Use {@link #isAnyContainerNeeded(Player, int, int, int)}.
+ */
+ @Deprecated
+ @Override
+ public boolean isAnyChestNeeded(Player player, int x, int y, int z) {
+ return isAnyContainerNeeded(player, x, y, z);
+ }
+
}
diff --git a/OpenInvCraftbukkit1_7_R2/src/main/java/com/lishid/openinv/internal/v1_7_R2/AnySilentChest.java b/OpenInvCraftbukkit1_7_R2/src/main/java/com/lishid/openinv/internal/v1_7_R2/AnySilentContainer.java
similarity index 59%
rename from OpenInvCraftbukkit1_7_R2/src/main/java/com/lishid/openinv/internal/v1_7_R2/AnySilentChest.java
rename to OpenInvCraftbukkit1_7_R2/src/main/java/com/lishid/openinv/internal/v1_7_R2/AnySilentContainer.java
index b3f6ab2..74629ed 100644
--- a/OpenInvCraftbukkit1_7_R2/src/main/java/com/lishid/openinv/internal/v1_7_R2/AnySilentChest.java
+++ b/OpenInvCraftbukkit1_7_R2/src/main/java/com/lishid/openinv/internal/v1_7_R2/AnySilentContainer.java
@@ -18,13 +18,15 @@ package com.lishid.openinv.internal.v1_7_R2;
import java.lang.reflect.Field;
+import com.lishid.openinv.internal.IAnySilentContainer;
+
import org.bukkit.ChatColor;
import org.bukkit.entity.Player;
-import com.lishid.openinv.internal.IAnySilentChest;
-
-import net.minecraft.server.v1_7_R2.Block;
//Volatile
+import net.minecraft.server.v1_7_R2.AxisAlignedBB;
+import net.minecraft.server.v1_7_R2.Block;
+import net.minecraft.server.v1_7_R2.EntityOcelot;
import net.minecraft.server.v1_7_R2.EntityPlayer;
import net.minecraft.server.v1_7_R2.IInventory;
import net.minecraft.server.v1_7_R2.InventoryLargeChest;
@@ -34,54 +36,27 @@ import net.minecraft.server.v1_7_R2.World;
import org.bukkit.craftbukkit.v1_7_R2.entity.CraftPlayer;
-public class AnySilentChest implements IAnySilentChest {
+public class AnySilentContainer implements IAnySilentContainer {
+
@Override
- public boolean isAnyChestNeeded(Player p, int x, int y, int z) {
- // FOR REFERENCE, LOOK AT net.minecraft.server.BlockChest
- EntityPlayer player = ((CraftPlayer) p).getHandle();
- World world = player.world;
- // If block on top
- if (world.getType(x, y + 1, z).c())
- return true;
-
- int id = Block.b(world.getType(x, y, z));
-
- // If block next to chest is chest and has a block on top
- if ((Block.b(world.getType(x - 1, y, z)) == id) && (world.getType(x - 1, y + 1, z).c()))
- return true;
- if ((Block.b(world.getType(x + 1, y, z)) == id) && (world.getType(x + 1, y + 1, z).c()))
- return true;
- if ((Block.b(world.getType(x, y, z - 1)) == id) && (world.getType(x, y + 1, z - 1).c()))
- return true;
- if ((Block.b(world.getType(x, y, z + 1)) == id) && (world.getType(x, y + 1, z + 1).c()))
- return true;
-
- return false;
+ public boolean isAnySilentContainer(org.bukkit.block.Block block) {
+ return block instanceof org.bukkit.block.Chest;
}
@Override
- public boolean activateChest(Player p, boolean anychest, boolean silentchest, int x, int y, int z) {
+ public boolean activateContainer(Player p, boolean anychest, boolean silentchest, int x, int y, int z) {
EntityPlayer player = ((CraftPlayer) p).getHandle();
World world = player.world;
Object chest = world.getTileEntity(x, y, z);
if (chest == null)
- return true;
+ return false;
+
+ if (!anychest && isAnyContainerNeeded(p, x, y, z)) {
+ return false;
+ }
int id = Block.b(world.getType(x, y, z));
- if (!anychest) {
- if (world.getType(x, y + 1, z).c())
- return true;
- if ((Block.b(world.getType(x - 1, y, z)) == id) && (world.getType(x - 1, y + 1, z).c()))
- return true;
- if ((Block.b(world.getType(x + 1, y, z)) == id) && (world.getType(x + 1, y + 1, z).c()))
- return true;
- if ((Block.b(world.getType(x, y, z - 1)) == id) && (world.getType(x, y + 1, z - 1).c()))
- return true;
- if ((Block.b(world.getType(x, y, z + 1)) == id) && (world.getType(x, y + 1, z + 1).c()))
- return true;
- }
-
if (Block.b(world.getType(x - 1, y, z)) == id)
chest = new InventoryLargeChest("Large chest", (TileEntityChest) world.getTileEntity(x - 1, y, z), (IInventory) chest);
if (Block.b(world.getType(x + 1, y, z)) == id)
@@ -91,11 +66,11 @@ public class AnySilentChest implements IAnySilentChest {
if (Block.b(world.getType(x, y, z + 1)) == id)
chest = new InventoryLargeChest("Large chest", (IInventory) chest, (TileEntityChest) world.getTileEntity(x, y, z + 1));
- boolean returnValue = true;
+ boolean returnValue = false;
if (!silentchest) {
player.openContainer((IInventory) chest);
- }
- else {
+ returnValue = true;
+ } else {
try {
int windowId = 0;
try {
@@ -104,16 +79,14 @@ public class AnySilentChest implements IAnySilentChest {
windowId = windowID.getInt(player);
windowId = windowId % 100 + 1;
windowID.setInt(player, windowId);
- }
- catch (NoSuchFieldException e) {}
+ } catch (NoSuchFieldException e) {}
player.playerConnection.sendPacket(new PacketPlayOutOpenWindow(windowId, 0, ((IInventory) chest).getInventoryName(), ((IInventory) chest).getSize(), true));
player.activeContainer = new SilentContainerChest(player.inventory, ((IInventory) chest));
player.activeContainer.windowId = windowId;
player.activeContainer.addSlotListener(player);
- returnValue = false;
- }
- catch (Exception e) {
+ returnValue = true;
+ } catch (Exception e) {
e.printStackTrace();
p.sendMessage(ChatColor.RED + "Error while sending silent chest.");
}
@@ -121,4 +94,64 @@ public class AnySilentChest implements IAnySilentChest {
return returnValue;
}
+
+ @Override
+ public boolean isAnyContainerNeeded(Player p, int x, int y, int z) {
+ // FOR REFERENCE, LOOK AT net.minecraft.server.BlockChest
+ EntityPlayer player = ((CraftPlayer) p).getHandle();
+ World world = player.world;
+
+ // If block or ocelot on top
+ if (world.t(x, y + 1, z) || hasOcelotOnTop(world, x, y, z))
+ return true;
+
+ int id = Block.b(world.getType(x, y, z));
+
+ // If block next to chest is chest and has a block or ocelot on top
+ return isBlockedChest(world, id, x - 1, y, z) || isBlockedChest(world, id, x + 1, y, z)
+ || isBlockedChest(world, id, x, y, z - 1) || isBlockedChest(world, id, x, y, z + 1);
+ }
+
+ private boolean isBlockedChest(World world, int id, int x, int y, int z) {
+ if (Block.b(world.getType(x, y, z)) != id) {
+ return false;
+ }
+
+ if (world.t(x, y + 1, z)) {
+ return true;
+ }
+
+ return hasOcelotOnTop(world, x, y, z);
+ }
+
+ private boolean hasOcelotOnTop(World world, int x, int y, int z) {
+ for (Object localEntity : world.a(EntityOcelot.class,
+ AxisAlignedBB.a(x, y + 1, z, x + 1, y + 2, z + 1))) {
+ EntityOcelot localEntityOcelot = (EntityOcelot) localEntity;
+ if (localEntityOcelot.isSitting()) {
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ /**
+ * @deprecated Use {@link #activateContainer(Player, boolean, boolean, int, int, int)}.
+ */
+ @Deprecated
+ @Override
+ public boolean activateChest(Player player, boolean anychest, boolean silentchest, int x, int y, int z) {
+ return !activateContainer(player, anychest, silentchest, x, y, z);
+ }
+
+ /**
+ * @deprecated Use {@link #isAnyContainerNeeded(Player, int, int, int)}.
+ */
+ @Deprecated
+ @Override
+ public boolean isAnyChestNeeded(Player player, int x, int y, int z) {
+ return isAnyContainerNeeded(player, x, y, z);
+ }
+
}
diff --git a/OpenInvCraftbukkit1_7_R3/src/main/java/com/lishid/openinv/internal/v1_7_R3/AnySilentChest.java b/OpenInvCraftbukkit1_7_R3/src/main/java/com/lishid/openinv/internal/v1_7_R3/AnySilentContainer.java
similarity index 59%
rename from OpenInvCraftbukkit1_7_R3/src/main/java/com/lishid/openinv/internal/v1_7_R3/AnySilentChest.java
rename to OpenInvCraftbukkit1_7_R3/src/main/java/com/lishid/openinv/internal/v1_7_R3/AnySilentContainer.java
index 87c6a0b..155ce13 100644
--- a/OpenInvCraftbukkit1_7_R3/src/main/java/com/lishid/openinv/internal/v1_7_R3/AnySilentChest.java
+++ b/OpenInvCraftbukkit1_7_R3/src/main/java/com/lishid/openinv/internal/v1_7_R3/AnySilentContainer.java
@@ -18,13 +18,15 @@ package com.lishid.openinv.internal.v1_7_R3;
import java.lang.reflect.Field;
+import com.lishid.openinv.internal.IAnySilentContainer;
+
import org.bukkit.ChatColor;
import org.bukkit.entity.Player;
-import com.lishid.openinv.internal.IAnySilentChest;
-
// Volatile
+import net.minecraft.server.v1_7_R3.AxisAlignedBB;
import net.minecraft.server.v1_7_R3.Block;
+import net.minecraft.server.v1_7_R3.EntityOcelot;
import net.minecraft.server.v1_7_R3.EntityPlayer;
import net.minecraft.server.v1_7_R3.IInventory;
import net.minecraft.server.v1_7_R3.InventoryLargeChest;
@@ -34,54 +36,27 @@ import net.minecraft.server.v1_7_R3.World;
import org.bukkit.craftbukkit.v1_7_R3.entity.CraftPlayer;
-public class AnySilentChest implements IAnySilentChest {
+public class AnySilentContainer implements IAnySilentContainer {
+
@Override
- public boolean isAnyChestNeeded(Player p, int x, int y, int z) {
- // FOR REFERENCE, LOOK AT net.minecraft.server.BlockChest
- EntityPlayer player = ((CraftPlayer) p).getHandle();
- World world = player.world;
- // If block on top
- if (world.getType(x, y + 1, z).c())
- return true;
-
- int id = Block.b(world.getType(x, y, z));
-
- // If block next to chest is chest and has a block on top
- if ((Block.b(world.getType(x - 1, y, z)) == id) && (world.getType(x - 1, y + 1, z).c()))
- return true;
- if ((Block.b(world.getType(x + 1, y, z)) == id) && (world.getType(x + 1, y + 1, z).c()))
- return true;
- if ((Block.b(world.getType(x, y, z - 1)) == id) && (world.getType(x, y + 1, z - 1).c()))
- return true;
- if ((Block.b(world.getType(x, y, z + 1)) == id) && (world.getType(x, y + 1, z + 1).c()))
- return true;
-
- return false;
+ public boolean isAnySilentContainer(org.bukkit.block.Block block) {
+ return block instanceof org.bukkit.block.Chest;
}
@Override
- public boolean activateChest(Player p, boolean anychest, boolean silentchest, int x, int y, int z) {
+ public boolean activateContainer(Player p, boolean anychest, boolean silentchest, int x, int y, int z) {
EntityPlayer player = ((CraftPlayer) p).getHandle();
World world = player.world;
Object chest = world.getTileEntity(x, y, z);
if (chest == null)
- return true;
+ return false;
+
+ if (!anychest && isAnyContainerNeeded(p, x, y, z)) {
+ return false;
+ }
int id = Block.b(world.getType(x, y, z));
- if (!anychest) {
- if (world.getType(x, y + 1, z).c())
- return true;
- if ((Block.b(world.getType(x - 1, y, z)) == id) && (world.getType(x - 1, y + 1, z).c()))
- return true;
- if ((Block.b(world.getType(x + 1, y, z)) == id) && (world.getType(x + 1, y + 1, z).c()))
- return true;
- if ((Block.b(world.getType(x, y, z - 1)) == id) && (world.getType(x, y + 1, z - 1).c()))
- return true;
- if ((Block.b(world.getType(x, y, z + 1)) == id) && (world.getType(x, y + 1, z + 1).c()))
- return true;
- }
-
if (Block.b(world.getType(x - 1, y, z)) == id)
chest = new InventoryLargeChest("Large chest", (TileEntityChest) world.getTileEntity(x - 1, y, z), (IInventory) chest);
if (Block.b(world.getType(x + 1, y, z)) == id)
@@ -91,11 +66,11 @@ public class AnySilentChest implements IAnySilentChest {
if (Block.b(world.getType(x, y, z + 1)) == id)
chest = new InventoryLargeChest("Large chest", (IInventory) chest, (TileEntityChest) world.getTileEntity(x, y, z + 1));
- boolean returnValue = true;
+ boolean returnValue = false;
if (!silentchest) {
player.openContainer((IInventory) chest);
- }
- else {
+ returnValue = true;
+ } else {
try {
int windowId = 0;
try {
@@ -104,16 +79,14 @@ public class AnySilentChest implements IAnySilentChest {
windowId = windowID.getInt(player);
windowId = windowId % 100 + 1;
windowID.setInt(player, windowId);
- }
- catch (NoSuchFieldException e) {}
+ } catch (NoSuchFieldException e) {}
player.playerConnection.sendPacket(new PacketPlayOutOpenWindow(windowId, 0, ((IInventory) chest).getInventoryName(), ((IInventory) chest).getSize(), true));
player.activeContainer = new SilentContainerChest(player.inventory, ((IInventory) chest));
player.activeContainer.windowId = windowId;
player.activeContainer.addSlotListener(player);
- returnValue = false;
- }
- catch (Exception e) {
+ returnValue = true;
+ } catch (Exception e) {
e.printStackTrace();
p.sendMessage(ChatColor.RED + "Error while sending silent chest.");
}
@@ -121,4 +94,64 @@ public class AnySilentChest implements IAnySilentChest {
return returnValue;
}
+
+ @Override
+ public boolean isAnyContainerNeeded(Player p, int x, int y, int z) {
+ // FOR REFERENCE, LOOK AT net.minecraft.server.BlockChest
+ EntityPlayer player = ((CraftPlayer) p).getHandle();
+ World world = player.world;
+
+ // If block or ocelot on top
+ if (world.t(x, y + 1, z) || hasOcelotOnTop(world, x, y, z))
+ return true;
+
+ int id = Block.b(world.getType(x, y, z));
+
+ // If block next to chest is chest and has a block or ocelot on top
+ return isBlockedChest(world, id, x - 1, y, z) || isBlockedChest(world, id, x + 1, y, z)
+ || isBlockedChest(world, id, x, y, z - 1) || isBlockedChest(world, id, x, y, z + 1);
+ }
+
+ private boolean isBlockedChest(World world, int id, int x, int y, int z) {
+ if (Block.b(world.getType(x, y, z)) != id) {
+ return false;
+ }
+
+ if (world.t(x, y + 1, z)) {
+ return true;
+ }
+
+ return hasOcelotOnTop(world, x, y, z);
+ }
+
+ private boolean hasOcelotOnTop(World world, int x, int y, int z) {
+ for (Object localEntity : world.a(EntityOcelot.class,
+ AxisAlignedBB.a(x, y + 1, z, x + 1, y + 2, z + 1))) {
+ EntityOcelot localEntityOcelot = (EntityOcelot) localEntity;
+ if (localEntityOcelot.isSitting()) {
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ /**
+ * @deprecated Use {@link #activateContainer(Player, boolean, boolean, int, int, int)}.
+ */
+ @Deprecated
+ @Override
+ public boolean activateChest(Player player, boolean anychest, boolean silentchest, int x, int y, int z) {
+ return !activateContainer(player, anychest, silentchest, x, y, z);
+ }
+
+ /**
+ * @deprecated Use {@link #isAnyContainerNeeded(Player, int, int, int)}.
+ */
+ @Deprecated
+ @Override
+ public boolean isAnyChestNeeded(Player player, int x, int y, int z) {
+ return isAnyContainerNeeded(player, x, y, z);
+ }
+
}
diff --git a/OpenInvCraftbukkit1_7_R4/src/main/java/com/lishid/openinv/internal/v1_7_R4/AnySilentChest.java b/OpenInvCraftbukkit1_7_R4/src/main/java/com/lishid/openinv/internal/v1_7_R4/AnySilentContainer.java
similarity index 59%
rename from OpenInvCraftbukkit1_7_R4/src/main/java/com/lishid/openinv/internal/v1_7_R4/AnySilentChest.java
rename to OpenInvCraftbukkit1_7_R4/src/main/java/com/lishid/openinv/internal/v1_7_R4/AnySilentContainer.java
index 196e177..99a8b39 100644
--- a/OpenInvCraftbukkit1_7_R4/src/main/java/com/lishid/openinv/internal/v1_7_R4/AnySilentChest.java
+++ b/OpenInvCraftbukkit1_7_R4/src/main/java/com/lishid/openinv/internal/v1_7_R4/AnySilentContainer.java
@@ -18,13 +18,15 @@ package com.lishid.openinv.internal.v1_7_R4;
import java.lang.reflect.Field;
+import com.lishid.openinv.internal.IAnySilentContainer;
+
import org.bukkit.ChatColor;
import org.bukkit.entity.Player;
-import com.lishid.openinv.internal.IAnySilentChest;
-
// Volatile
+import net.minecraft.server.v1_7_R4.AxisAlignedBB;
import net.minecraft.server.v1_7_R4.Block;
+import net.minecraft.server.v1_7_R4.EntityOcelot;
import net.minecraft.server.v1_7_R4.EntityPlayer;
import net.minecraft.server.v1_7_R4.IInventory;
import net.minecraft.server.v1_7_R4.InventoryLargeChest;
@@ -34,54 +36,27 @@ import net.minecraft.server.v1_7_R4.World;
import org.bukkit.craftbukkit.v1_7_R4.entity.CraftPlayer;
-public class AnySilentChest implements IAnySilentChest {
+public class AnySilentContainer implements IAnySilentContainer {
+
@Override
- public boolean isAnyChestNeeded(Player p, int x, int y, int z) {
- // FOR REFERENCE, LOOK AT net.minecraft.server.BlockChest
- EntityPlayer player = ((CraftPlayer) p).getHandle();
- World world = player.world;
- // If block on top
- if (world.getType(x, y + 1, z).c())
- return true;
-
- int id = Block.getId(world.getType(x, y, z));
-
- // If block next to chest is chest and has a block on top
- if ((Block.getId(world.getType(x - 1, y, z)) == id) && (world.getType(x - 1, y + 1, z).c()))
- return true;
- if ((Block.getId(world.getType(x + 1, y, z)) == id) && (world.getType(x + 1, y + 1, z).c()))
- return true;
- if ((Block.getId(world.getType(x, y, z - 1)) == id) && (world.getType(x, y + 1, z - 1).c()))
- return true;
- if ((Block.getId(world.getType(x, y, z + 1)) == id) && (world.getType(x, y + 1, z + 1).c()))
- return true;
-
- return false;
+ public boolean isAnySilentContainer(org.bukkit.block.Block block) {
+ return block instanceof org.bukkit.block.Chest;
}
@Override
- public boolean activateChest(Player p, boolean anychest, boolean silentchest, int x, int y, int z) {
+ public boolean activateContainer(Player p, boolean anychest, boolean silentchest, int x, int y, int z) {
EntityPlayer player = ((CraftPlayer) p).getHandle();
World world = player.world;
Object chest = world.getTileEntity(x, y, z);
if (chest == null)
- return true;
+ return false;
+
+ if (!anychest && isAnyContainerNeeded(p, x, y, z)) {
+ return false;
+ }
int id = Block.getId(world.getType(x, y, z));
- if (!anychest) {
- if (world.getType(x, y + 1, z).c())
- return true;
- if ((Block.getId(world.getType(x - 1, y, z)) == id) && (world.getType(x - 1, y + 1, z).c()))
- return true;
- if ((Block.getId(world.getType(x + 1, y, z)) == id) && (world.getType(x + 1, y + 1, z).c()))
- return true;
- if ((Block.getId(world.getType(x, y, z - 1)) == id) && (world.getType(x, y + 1, z - 1).c()))
- return true;
- if ((Block.getId(world.getType(x, y, z + 1)) == id) && (world.getType(x, y + 1, z + 1).c()))
- return true;
- }
-
if (Block.getId(world.getType(x - 1, y, z)) == id)
chest = new InventoryLargeChest("Large chest", (TileEntityChest) world.getTileEntity(x - 1, y, z), (IInventory) chest);
if (Block.getId(world.getType(x + 1, y, z)) == id)
@@ -91,11 +66,11 @@ public class AnySilentChest implements IAnySilentChest {
if (Block.getId(world.getType(x, y, z + 1)) == id)
chest = new InventoryLargeChest("Large chest", (IInventory) chest, (TileEntityChest) world.getTileEntity(x, y, z + 1));
- boolean returnValue = true;
+ boolean returnValue = false;
if (!silentchest) {
player.openContainer((IInventory) chest);
- }
- else {
+ returnValue = true;
+ } else {
try {
int windowId = 0;
try {
@@ -104,16 +79,14 @@ public class AnySilentChest implements IAnySilentChest {
windowId = windowID.getInt(player);
windowId = windowId % 100 + 1;
windowID.setInt(player, windowId);
- }
- catch (NoSuchFieldException e) {}
+ } catch (NoSuchFieldException e) {}
player.playerConnection.sendPacket(new PacketPlayOutOpenWindow(windowId, 0, ((IInventory) chest).getInventoryName(), ((IInventory) chest).getSize(), true));
player.activeContainer = new SilentContainerChest(player.inventory, ((IInventory) chest));
player.activeContainer.windowId = windowId;
player.activeContainer.addSlotListener(player);
- returnValue = false;
- }
- catch (Exception e) {
+ returnValue = true;
+ } catch (Exception e) {
e.printStackTrace();
p.sendMessage(ChatColor.RED + "Error while sending silent chest.");
}
@@ -121,4 +94,64 @@ public class AnySilentChest implements IAnySilentChest {
return returnValue;
}
+
+ @Override
+ public boolean isAnyContainerNeeded(Player p, int x, int y, int z) {
+ // FOR REFERENCE, LOOK AT net.minecraft.server.BlockChest
+ EntityPlayer player = ((CraftPlayer) p).getHandle();
+ World world = player.world;
+
+ // If block or ocelot on top
+ if (world.t(x, y + 1, z) || hasOcelotOnTop(world, x, y, z))
+ return true;
+
+ int id = Block.getId(world.getType(x, y, z));
+
+ // If block next to chest is chest and has a block or ocelot on top
+ return isBlockedChest(world, id, x - 1, y, z) || isBlockedChest(world, id, x + 1, y, z)
+ || isBlockedChest(world, id, x, y, z - 1) || isBlockedChest(world, id, x, y, z + 1);
+ }
+
+ private boolean isBlockedChest(World world, int id, int x, int y, int z) {
+ if (Block.getId(world.getType(x, y, z)) != id) {
+ return false;
+ }
+
+ if (world.t(x, y + 1, z)) {
+ return true;
+ }
+
+ return hasOcelotOnTop(world, x, y, z);
+ }
+
+ private boolean hasOcelotOnTop(World world, int x, int y, int z) {
+ for (Object localEntity : world.a(EntityOcelot.class,
+ AxisAlignedBB.a(x, y + 1, z, x + 1, y + 2, z + 1))) {
+ EntityOcelot localEntityOcelot = (EntityOcelot) localEntity;
+ if (localEntityOcelot.isSitting()) {
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ /**
+ * @deprecated Use {@link #activateContainer(Player, boolean, boolean, int, int, int)}.
+ */
+ @Deprecated
+ @Override
+ public boolean activateChest(Player player, boolean anychest, boolean silentchest, int x, int y, int z) {
+ return !activateContainer(player, anychest, silentchest, x, y, z);
+ }
+
+ /**
+ * @deprecated Use {@link #isAnyContainerNeeded(Player, int, int, int)}.
+ */
+ @Deprecated
+ @Override
+ public boolean isAnyChestNeeded(Player player, int x, int y, int z) {
+ return isAnyContainerNeeded(player, x, y, z);
+ }
+
}
diff --git a/OpenInvCraftbukkit1_8_R1/src/main/java/com/lishid/openinv/internal/v1_8_R1/AnySilentChest.java b/OpenInvCraftbukkit1_8_R1/src/main/java/com/lishid/openinv/internal/v1_8_R1/AnySilentContainer.java
similarity index 61%
rename from OpenInvCraftbukkit1_8_R1/src/main/java/com/lishid/openinv/internal/v1_8_R1/AnySilentChest.java
rename to OpenInvCraftbukkit1_8_R1/src/main/java/com/lishid/openinv/internal/v1_8_R1/AnySilentContainer.java
index 8303e0f..e08e1e5 100644
--- a/OpenInvCraftbukkit1_8_R1/src/main/java/com/lishid/openinv/internal/v1_8_R1/AnySilentChest.java
+++ b/OpenInvCraftbukkit1_8_R1/src/main/java/com/lishid/openinv/internal/v1_8_R1/AnySilentContainer.java
@@ -16,13 +16,16 @@
package com.lishid.openinv.internal.v1_8_R1;
+import com.lishid.openinv.internal.IAnySilentContainer;
+
import org.bukkit.ChatColor;
import org.bukkit.entity.Player;
-import com.lishid.openinv.internal.IAnySilentChest;
-
+//Volatile
+import net.minecraft.server.v1_8_R1.AxisAlignedBB;
import net.minecraft.server.v1_8_R1.Block;
import net.minecraft.server.v1_8_R1.BlockPosition;
+import net.minecraft.server.v1_8_R1.EntityOcelot;
import net.minecraft.server.v1_8_R1.EntityPlayer;
import net.minecraft.server.v1_8_R1.IInventory;
import net.minecraft.server.v1_8_R1.ITileInventory;
@@ -31,57 +34,29 @@ import net.minecraft.server.v1_8_R1.PacketPlayOutOpenWindow;
import net.minecraft.server.v1_8_R1.TileEntityChest;
import net.minecraft.server.v1_8_R1.World;
-//Volatile
import org.bukkit.craftbukkit.v1_8_R1.entity.CraftPlayer;
-public class AnySilentChest implements IAnySilentChest {
+public class AnySilentContainer implements IAnySilentContainer {
+
@Override
- public boolean isAnyChestNeeded(Player p, int x, int y, int z) {
- // FOR REFERENCE, LOOK AT net.minecraft.server.BlockChest
- EntityPlayer player = ((CraftPlayer) p).getHandle();
- World world = player.world;
- // If block on top
- if (world.getType(new BlockPosition(x, y + 1, z)).getBlock().c())
- return true;
-
- int id = Block.getId(world.getType(new BlockPosition(x, y, z)).getBlock());
-
- // If block next to chest is chest and has a block on top
- if ((Block.getId(world.getType(new BlockPosition(x - 1, y, z)).getBlock()) == id) && (world.getType(new BlockPosition(x - 1, y + 1, z)).getBlock().c()))
- return true;
- if ((Block.getId(world.getType(new BlockPosition(x + 1, y, z)).getBlock()) == id) && (world.getType(new BlockPosition(x + 1, y + 1, z)).getBlock().c()))
- return true;
- if ((Block.getId(world.getType(new BlockPosition(x, y, z - 1)).getBlock()) == id) && (world.getType(new BlockPosition(x, y + 1, z - 1)).getBlock().c()))
- return true;
- if ((Block.getId(world.getType(new BlockPosition(x, y, z + 1)).getBlock()) == id) && (world.getType(new BlockPosition(x, y + 1, z + 1)).getBlock().c()))
- return true;
-
- return false;
+ public boolean isAnySilentContainer(org.bukkit.block.Block block) {
+ return block instanceof org.bukkit.block.Chest;
}
@Override
- public boolean activateChest(Player p, boolean anychest, boolean silentchest, int x, int y, int z) {
+ public boolean activateContainer(Player p, boolean anychest, boolean silentchest, int x, int y, int z) {
EntityPlayer player = ((CraftPlayer) p).getHandle();
World world = player.world;
Object chest = world.getTileEntity(new BlockPosition(x, y, z));
if (chest == null)
- return true;
+ return false;
+
+ if (!anychest && isAnyContainerNeeded(p, x, y, z)) {
+ return false;
+ }
int id = Block.getId(world.getType(new BlockPosition(x, y, z)).getBlock());
- if (!anychest) {
- if (world.getType(new BlockPosition(x, y + 1, z)).getBlock().c())
- return true;
- if ((Block.getId(world.getType(new BlockPosition(x - 1, y, z)).getBlock()) == id) && (world.getType(new BlockPosition(x - 1, y + 1, z)).getBlock().c()))
- return true;
- if ((Block.getId(world.getType(new BlockPosition(x + 1, y, z)).getBlock()) == id) && (world.getType(new BlockPosition(x + 1, y + 1, z)).getBlock().c()))
- return true;
- if ((Block.getId(world.getType(new BlockPosition(x, y, z - 1)).getBlock()) == id) && (world.getType(new BlockPosition(x, y + 1, z - 1)).getBlock().c()))
- return true;
- if ((Block.getId(world.getType(new BlockPosition(x, y, z + 1)).getBlock()) == id) && (world.getType(new BlockPosition(x, y + 1, z + 1)).getBlock().c()))
- return true;
- }
-
if (Block.getId(world.getType(new BlockPosition(x - 1, y, z)).getBlock()) == id)
chest = new InventoryLargeChest("Large chest", (TileEntityChest) world.getTileEntity(new BlockPosition(x - 1, y, z)), (ITileInventory) chest);
if (Block.getId(world.getType(new BlockPosition(x + 1, y, z)).getBlock()) == id)
@@ -91,11 +66,11 @@ public class AnySilentChest implements IAnySilentChest {
if (Block.getId(world.getType(new BlockPosition(x, y, z + 1)).getBlock()) == id)
chest = new InventoryLargeChest("Large chest", (ITileInventory) chest, (TileEntityChest) world.getTileEntity(new BlockPosition(x, y, z + 1)));
- boolean returnValue = true;
+ boolean returnValue = false;
if (!silentchest) {
player.openContainer((IInventory) chest);
- }
- else {
+ returnValue = true;
+ } else {
try {
SilentContainerChest silentContainerChest = new SilentContainerChest(player.inventory, ((IInventory) chest), player);
int windowId = player.nextContainerCounter();
@@ -103,9 +78,8 @@ public class AnySilentChest implements IAnySilentChest {
player.activeContainer = silentContainerChest;
player.activeContainer.windowId = windowId;
player.activeContainer.addSlotListener(player);
- returnValue = false;
- }
- catch (Exception e) {
+ returnValue = true;
+ } catch (Exception e) {
e.printStackTrace();
p.sendMessage(ChatColor.RED + "Error while sending silent chest.");
}
@@ -113,4 +87,64 @@ public class AnySilentChest implements IAnySilentChest {
return returnValue;
}
+
+ @Override
+ public boolean isAnyContainerNeeded(Player p, int x, int y, int z) {
+ // FOR REFERENCE, LOOK AT net.minecraft.server.BlockChest
+ EntityPlayer player = ((CraftPlayer) p).getHandle();
+ World world = player.world;
+
+ // If block or ocelot on top
+ if (world.getType(new BlockPosition(x, y + 1, z)).getBlock().c() || hasOcelotOnTop(world, x, y, z))
+ return true;
+
+ int id = Block.getId(world.getType(new BlockPosition(x, y, z)).getBlock());
+
+ // If block next to chest is chest and has a block or ocelot on top
+ return isBlockedChest(world, id, x - 1, y, z) || isBlockedChest(world, id, x + 1, y, z)
+ || isBlockedChest(world, id, x, y, z - 1) || isBlockedChest(world, id, x, y, z + 1);
+ }
+
+ private boolean isBlockedChest(World world, int id, int x, int y, int z) {
+ if (Block.getId(world.getType(new BlockPosition(x, y, z)).getBlock()) != id) {
+ return false;
+ }
+
+ if (world.getType(new BlockPosition(x, y + 1, z)).getBlock().c()) {
+ return true;
+ }
+
+ return hasOcelotOnTop(world, x, y, z);
+ }
+
+ private boolean hasOcelotOnTop(World world, int x, int y, int z) {
+ for (Object localEntity : world.a(EntityOcelot.class,
+ AxisAlignedBB.a(x, y + 1, z, x + 1, y + 2, z + 1))) {
+ EntityOcelot localEntityOcelot = (EntityOcelot) localEntity;
+ if (localEntityOcelot.isSitting()) {
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ /**
+ * @deprecated Use {@link #activateContainer(Player, boolean, boolean, int, int, int)}.
+ */
+ @Deprecated
+ @Override
+ public boolean activateChest(Player player, boolean anychest, boolean silentchest, int x, int y, int z) {
+ return !activateContainer(player, anychest, silentchest, x, y, z);
+ }
+
+ /**
+ * @deprecated Use {@link #isAnyContainerNeeded(Player, int, int, int)}.
+ */
+ @Deprecated
+ @Override
+ public boolean isAnyChestNeeded(Player player, int x, int y, int z) {
+ return isAnyContainerNeeded(player, x, y, z);
+ }
+
}
diff --git a/OpenInvCraftbukkit1_8_R2/src/main/java/com/lishid/openinv/internal/v1_8_R2/AnySilentChest.java b/OpenInvCraftbukkit1_8_R2/src/main/java/com/lishid/openinv/internal/v1_8_R2/AnySilentContainer.java
similarity index 61%
rename from OpenInvCraftbukkit1_8_R2/src/main/java/com/lishid/openinv/internal/v1_8_R2/AnySilentChest.java
rename to OpenInvCraftbukkit1_8_R2/src/main/java/com/lishid/openinv/internal/v1_8_R2/AnySilentContainer.java
index 29d1835..6acf374 100644
--- a/OpenInvCraftbukkit1_8_R2/src/main/java/com/lishid/openinv/internal/v1_8_R2/AnySilentChest.java
+++ b/OpenInvCraftbukkit1_8_R2/src/main/java/com/lishid/openinv/internal/v1_8_R2/AnySilentContainer.java
@@ -16,13 +16,16 @@
package com.lishid.openinv.internal.v1_8_R2;
+import com.lishid.openinv.internal.IAnySilentContainer;
+
import org.bukkit.ChatColor;
import org.bukkit.entity.Player;
-import com.lishid.openinv.internal.IAnySilentChest;
-
+//Volatile
+import net.minecraft.server.v1_8_R2.AxisAlignedBB;
import net.minecraft.server.v1_8_R2.Block;
import net.minecraft.server.v1_8_R2.BlockPosition;
+import net.minecraft.server.v1_8_R2.EntityOcelot;
import net.minecraft.server.v1_8_R2.EntityPlayer;
import net.minecraft.server.v1_8_R2.IInventory;
import net.minecraft.server.v1_8_R2.ITileInventory;
@@ -31,57 +34,29 @@ import net.minecraft.server.v1_8_R2.PacketPlayOutOpenWindow;
import net.minecraft.server.v1_8_R2.TileEntityChest;
import net.minecraft.server.v1_8_R2.World;
-//Volatile
import org.bukkit.craftbukkit.v1_8_R2.entity.CraftPlayer;
-public class AnySilentChest implements IAnySilentChest {
+public class AnySilentContainer implements IAnySilentContainer {
+
@Override
- public boolean isAnyChestNeeded(Player p, int x, int y, int z) {
- // FOR REFERENCE, LOOK AT net.minecraft.server.BlockChest
- EntityPlayer player = ((CraftPlayer) p).getHandle();
- World world = player.world;
- // If block on top
- if (world.getType(new BlockPosition(x, y + 1, z)).getBlock().c())
- return true;
-
- int id = Block.getId(world.getType(new BlockPosition(x, y, z)).getBlock());
-
- // If block next to chest is chest and has a block on top
- if ((Block.getId(world.getType(new BlockPosition(x - 1, y, z)).getBlock()) == id) && (world.getType(new BlockPosition(x - 1, y + 1, z)).getBlock().c()))
- return true;
- if ((Block.getId(world.getType(new BlockPosition(x + 1, y, z)).getBlock()) == id) && (world.getType(new BlockPosition(x + 1, y + 1, z)).getBlock().c()))
- return true;
- if ((Block.getId(world.getType(new BlockPosition(x, y, z - 1)).getBlock()) == id) && (world.getType(new BlockPosition(x, y + 1, z - 1)).getBlock().c()))
- return true;
- if ((Block.getId(world.getType(new BlockPosition(x, y, z + 1)).getBlock()) == id) && (world.getType(new BlockPosition(x, y + 1, z + 1)).getBlock().c()))
- return true;
-
- return false;
+ public boolean isAnySilentContainer(org.bukkit.block.Block block) {
+ return block instanceof org.bukkit.block.Chest;
}
@Override
- public boolean activateChest(Player p, boolean anychest, boolean silentchest, int x, int y, int z) {
+ public boolean activateContainer(Player p, boolean anychest, boolean silentchest, int x, int y, int z) {
EntityPlayer player = ((CraftPlayer) p).getHandle();
World world = player.world;
Object chest = world.getTileEntity(new BlockPosition(x, y, z));
if (chest == null)
- return true;
+ return false;
+
+ if (!anychest && isAnyContainerNeeded(p, x, y, z)) {
+ return false;
+ }
int id = Block.getId(world.getType(new BlockPosition(x, y, z)).getBlock());
- if (!anychest) {
- if (world.getType(new BlockPosition(x, y + 1, z)).getBlock().c())
- return true;
- if ((Block.getId(world.getType(new BlockPosition(x - 1, y, z)).getBlock()) == id) && (world.getType(new BlockPosition(x - 1, y + 1, z)).getBlock().c()))
- return true;
- if ((Block.getId(world.getType(new BlockPosition(x + 1, y, z)).getBlock()) == id) && (world.getType(new BlockPosition(x + 1, y + 1, z)).getBlock().c()))
- return true;
- if ((Block.getId(world.getType(new BlockPosition(x, y, z - 1)).getBlock()) == id) && (world.getType(new BlockPosition(x, y + 1, z - 1)).getBlock().c()))
- return true;
- if ((Block.getId(world.getType(new BlockPosition(x, y, z + 1)).getBlock()) == id) && (world.getType(new BlockPosition(x, y + 1, z + 1)).getBlock().c()))
- return true;
- }
-
if (Block.getId(world.getType(new BlockPosition(x - 1, y, z)).getBlock()) == id)
chest = new InventoryLargeChest("Large chest", (TileEntityChest) world.getTileEntity(new BlockPosition(x - 1, y, z)), (ITileInventory) chest);
if (Block.getId(world.getType(new BlockPosition(x + 1, y, z)).getBlock()) == id)
@@ -91,11 +66,11 @@ public class AnySilentChest implements IAnySilentChest {
if (Block.getId(world.getType(new BlockPosition(x, y, z + 1)).getBlock()) == id)
chest = new InventoryLargeChest("Large chest", (ITileInventory) chest, (TileEntityChest) world.getTileEntity(new BlockPosition(x, y, z + 1)));
- boolean returnValue = true;
+ boolean returnValue = false;
if (!silentchest) {
player.openContainer((IInventory) chest);
- }
- else {
+ returnValue = true;
+ } else {
try {
SilentContainerChest silentContainerChest = new SilentContainerChest(player.inventory, ((IInventory) chest), player);
int windowId = player.nextContainerCounter();
@@ -103,9 +78,8 @@ public class AnySilentChest implements IAnySilentChest {
player.activeContainer = silentContainerChest;
player.activeContainer.windowId = windowId;
player.activeContainer.addSlotListener(player);
- returnValue = false;
- }
- catch (Exception e) {
+ returnValue = true;
+ } catch (Exception e) {
e.printStackTrace();
p.sendMessage(ChatColor.RED + "Error while sending silent chest.");
}
@@ -113,4 +87,64 @@ public class AnySilentChest implements IAnySilentChest {
return returnValue;
}
+
+ @Override
+ public boolean isAnyContainerNeeded(Player p, int x, int y, int z) {
+ // FOR REFERENCE, LOOK AT net.minecraft.server.BlockChest
+ EntityPlayer player = ((CraftPlayer) p).getHandle();
+ World world = player.world;
+
+ // If block or ocelot on top
+ if (world.getType(new BlockPosition(x, y + 1, z)).getBlock().c() || hasOcelotOnTop(world, x, y, z))
+ return true;
+
+ int id = Block.getId(world.getType(new BlockPosition(x, y, z)).getBlock());
+
+ // If block next to chest is chest and has a block or ocelot on top
+ return isBlockedChest(world, id, x - 1, y, z) || isBlockedChest(world, id, x + 1, y, z)
+ || isBlockedChest(world, id, x, y, z - 1) || isBlockedChest(world, id, x, y, z + 1);
+ }
+
+ private boolean isBlockedChest(World world, int id, int x, int y, int z) {
+ if (Block.getId(world.getType(new BlockPosition(x, y, z)).getBlock()) != id) {
+ return false;
+ }
+
+ if (world.getType(new BlockPosition(x, y + 1, z)).getBlock().c()) {
+ return true;
+ }
+
+ return hasOcelotOnTop(world, x, y, z);
+ }
+
+ private boolean hasOcelotOnTop(World world, int x, int y, int z) {
+ for (Object localEntity : world.a(EntityOcelot.class,
+ AxisAlignedBB.a(x, y + 1, z, x + 1, y + 2, z + 1))) {
+ EntityOcelot localEntityOcelot = (EntityOcelot) localEntity;
+ if (localEntityOcelot.isSitting()) {
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ /**
+ * @deprecated Use {@link #activateContainer(Player, boolean, boolean, int, int, int)}.
+ */
+ @Deprecated
+ @Override
+ public boolean activateChest(Player player, boolean anychest, boolean silentchest, int x, int y, int z) {
+ return !activateContainer(player, anychest, silentchest, x, y, z);
+ }
+
+ /**
+ * @deprecated Use {@link #isAnyContainerNeeded(Player, int, int, int)}.
+ */
+ @Deprecated
+ @Override
+ public boolean isAnyChestNeeded(Player player, int x, int y, int z) {
+ return isAnyContainerNeeded(player, x, y, z);
+ }
+
}
diff --git a/OpenInvCraftbukkit1_8_R3/src/main/java/com/lishid/openinv/internal/v1_8_R3/AnySilentChest.java b/OpenInvCraftbukkit1_8_R3/src/main/java/com/lishid/openinv/internal/v1_8_R3/AnySilentContainer.java
similarity index 61%
rename from OpenInvCraftbukkit1_8_R3/src/main/java/com/lishid/openinv/internal/v1_8_R3/AnySilentChest.java
rename to OpenInvCraftbukkit1_8_R3/src/main/java/com/lishid/openinv/internal/v1_8_R3/AnySilentContainer.java
index 6c6e686..a00cf63 100644
--- a/OpenInvCraftbukkit1_8_R3/src/main/java/com/lishid/openinv/internal/v1_8_R3/AnySilentChest.java
+++ b/OpenInvCraftbukkit1_8_R3/src/main/java/com/lishid/openinv/internal/v1_8_R3/AnySilentContainer.java
@@ -16,13 +16,16 @@
package com.lishid.openinv.internal.v1_8_R3;
+import com.lishid.openinv.internal.IAnySilentContainer;
+
import org.bukkit.ChatColor;
import org.bukkit.entity.Player;
-import com.lishid.openinv.internal.IAnySilentChest;
-
+//Volatile
+import net.minecraft.server.v1_8_R3.AxisAlignedBB;
import net.minecraft.server.v1_8_R3.Block;
import net.minecraft.server.v1_8_R3.BlockPosition;
+import net.minecraft.server.v1_8_R3.EntityOcelot;
import net.minecraft.server.v1_8_R3.EntityPlayer;
import net.minecraft.server.v1_8_R3.IInventory;
import net.minecraft.server.v1_8_R3.ITileInventory;
@@ -31,57 +34,29 @@ import net.minecraft.server.v1_8_R3.PacketPlayOutOpenWindow;
import net.minecraft.server.v1_8_R3.TileEntityChest;
import net.minecraft.server.v1_8_R3.World;
-//Volatile
import org.bukkit.craftbukkit.v1_8_R3.entity.CraftPlayer;
-public class AnySilentChest implements IAnySilentChest {
+public class AnySilentContainer implements IAnySilentContainer {
+
@Override
- public boolean isAnyChestNeeded(Player p, int x, int y, int z) {
- // FOR REFERENCE, LOOK AT net.minecraft.server.BlockChest
- EntityPlayer player = ((CraftPlayer) p).getHandle();
- World world = player.world;
- // If block on top
- if (world.getType(new BlockPosition(x, y + 1, z)).getBlock().c())
- return true;
-
- int id = Block.getId(world.getType(new BlockPosition(x, y, z)).getBlock());
-
- // If block next to chest is chest and has a block on top
- if ((Block.getId(world.getType(new BlockPosition(x - 1, y, z)).getBlock()) == id) && (world.getType(new BlockPosition(x - 1, y + 1, z)).getBlock().c()))
- return true;
- if ((Block.getId(world.getType(new BlockPosition(x + 1, y, z)).getBlock()) == id) && (world.getType(new BlockPosition(x + 1, y + 1, z)).getBlock().c()))
- return true;
- if ((Block.getId(world.getType(new BlockPosition(x, y, z - 1)).getBlock()) == id) && (world.getType(new BlockPosition(x, y + 1, z - 1)).getBlock().c()))
- return true;
- if ((Block.getId(world.getType(new BlockPosition(x, y, z + 1)).getBlock()) == id) && (world.getType(new BlockPosition(x, y + 1, z + 1)).getBlock().c()))
- return true;
-
- return false;
+ public boolean isAnySilentContainer(org.bukkit.block.Block block) {
+ return block instanceof org.bukkit.block.Chest;
}
@Override
- public boolean activateChest(Player p, boolean anychest, boolean silentchest, int x, int y, int z) {
+ public boolean activateContainer(Player p, boolean anychest, boolean silentchest, int x, int y, int z) {
EntityPlayer player = ((CraftPlayer) p).getHandle();
World world = player.world;
Object chest = world.getTileEntity(new BlockPosition(x, y, z));
if (chest == null)
- return true;
+ return false;
+
+ if (!anychest && isAnyContainerNeeded(p, x, y, z)) {
+ return false;
+ }
int id = Block.getId(world.getType(new BlockPosition(x, y, z)).getBlock());
- if (!anychest) {
- if (world.getType(new BlockPosition(x, y + 1, z)).getBlock().c())
- return true;
- if ((Block.getId(world.getType(new BlockPosition(x - 1, y, z)).getBlock()) == id) && (world.getType(new BlockPosition(x - 1, y + 1, z)).getBlock().c()))
- return true;
- if ((Block.getId(world.getType(new BlockPosition(x + 1, y, z)).getBlock()) == id) && (world.getType(new BlockPosition(x + 1, y + 1, z)).getBlock().c()))
- return true;
- if ((Block.getId(world.getType(new BlockPosition(x, y, z - 1)).getBlock()) == id) && (world.getType(new BlockPosition(x, y + 1, z - 1)).getBlock().c()))
- return true;
- if ((Block.getId(world.getType(new BlockPosition(x, y, z + 1)).getBlock()) == id) && (world.getType(new BlockPosition(x, y + 1, z + 1)).getBlock().c()))
- return true;
- }
-
if (Block.getId(world.getType(new BlockPosition(x - 1, y, z)).getBlock()) == id)
chest = new InventoryLargeChest("Large chest", (TileEntityChest) world.getTileEntity(new BlockPosition(x - 1, y, z)), (ITileInventory) chest);
if (Block.getId(world.getType(new BlockPosition(x + 1, y, z)).getBlock()) == id)
@@ -91,11 +66,11 @@ public class AnySilentChest implements IAnySilentChest {
if (Block.getId(world.getType(new BlockPosition(x, y, z + 1)).getBlock()) == id)
chest = new InventoryLargeChest("Large chest", (ITileInventory) chest, (TileEntityChest) world.getTileEntity(new BlockPosition(x, y, z + 1)));
- boolean returnValue = true;
+ boolean returnValue = false;
if (!silentchest) {
player.openContainer((IInventory) chest);
- }
- else {
+ returnValue = true;
+ } else {
try {
SilentContainerChest silentContainerChest = new SilentContainerChest(player.inventory, ((IInventory) chest), player);
int windowId = player.nextContainerCounter();
@@ -103,9 +78,8 @@ public class AnySilentChest implements IAnySilentChest {
player.activeContainer = silentContainerChest;
player.activeContainer.windowId = windowId;
player.activeContainer.addSlotListener(player);
- returnValue = false;
- }
- catch (Exception e) {
+ returnValue = true;
+ } catch (Exception e) {
e.printStackTrace();
p.sendMessage(ChatColor.RED + "Error while sending silent chest.");
}
@@ -113,4 +87,64 @@ public class AnySilentChest implements IAnySilentChest {
return returnValue;
}
+
+ @Override
+ public boolean isAnyContainerNeeded(Player p, int x, int y, int z) {
+ // FOR REFERENCE, LOOK AT net.minecraft.server.BlockChest
+ EntityPlayer player = ((CraftPlayer) p).getHandle();
+ World world = player.world;
+
+ // If block or ocelot on top
+ if (world.getType(new BlockPosition(x, y + 1, z)).getBlock().c() || hasOcelotOnTop(world, x, y, z))
+ return true;
+
+ int id = Block.getId(world.getType(new BlockPosition(x, y, z)).getBlock());
+
+ // If block next to chest is chest and has a block or ocelot on top
+ return isBlockedChest(world, id, x - 1, y, z) || isBlockedChest(world, id, x + 1, y, z)
+ || isBlockedChest(world, id, x, y, z - 1) || isBlockedChest(world, id, x, y, z + 1);
+ }
+
+ private boolean isBlockedChest(World world, int id, int x, int y, int z) {
+ if (Block.getId(world.getType(new BlockPosition(x, y, z)).getBlock()) != id) {
+ return false;
+ }
+
+ if (world.getType(new BlockPosition(x, y + 1, z)).getBlock().c()) {
+ return true;
+ }
+
+ return hasOcelotOnTop(world, x, y, z);
+ }
+
+ private boolean hasOcelotOnTop(World world, int x, int y, int z) {
+ for (Object localEntity : world.a(EntityOcelot.class,
+ AxisAlignedBB.a(x, y + 1, z, x + 1, y + 2, z + 1))) {
+ EntityOcelot localEntityOcelot = (EntityOcelot) localEntity;
+ if (localEntityOcelot.isSitting()) {
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ /**
+ * @deprecated Use {@link #activateContainer(Player, boolean, boolean, int, int, int)}.
+ */
+ @Deprecated
+ @Override
+ public boolean activateChest(Player player, boolean anychest, boolean silentchest, int x, int y, int z) {
+ return !activateContainer(player, anychest, silentchest, x, y, z);
+ }
+
+ /**
+ * @deprecated Use {@link #isAnyContainerNeeded(Player, int, int, int)}.
+ */
+ @Deprecated
+ @Override
+ public boolean isAnyChestNeeded(Player player, int x, int y, int z) {
+ return isAnyContainerNeeded(player, x, y, z);
+ }
+
}
diff --git a/OpenInvCraftbukkit1_9_R1/src/main/java/com/lishid/openinv/internal/v1_9_R1/AnySilentChest.java b/OpenInvCraftbukkit1_9_R1/src/main/java/com/lishid/openinv/internal/v1_9_R1/AnySilentContainer.java
similarity index 74%
rename from OpenInvCraftbukkit1_9_R1/src/main/java/com/lishid/openinv/internal/v1_9_R1/AnySilentChest.java
rename to OpenInvCraftbukkit1_9_R1/src/main/java/com/lishid/openinv/internal/v1_9_R1/AnySilentContainer.java
index 6edb90f..bc8b73e 100644
--- a/OpenInvCraftbukkit1_9_R1/src/main/java/com/lishid/openinv/internal/v1_9_R1/AnySilentChest.java
+++ b/OpenInvCraftbukkit1_9_R1/src/main/java/com/lishid/openinv/internal/v1_9_R1/AnySilentContainer.java
@@ -16,11 +16,11 @@
package com.lishid.openinv.internal.v1_9_R1;
+import com.lishid.openinv.internal.IAnySilentContainer;
+
import org.bukkit.ChatColor;
import org.bukkit.entity.Player;
-import com.lishid.openinv.internal.IAnySilentChest;
-
// Volatile
import net.minecraft.server.v1_9_R1.AxisAlignedBB;
import net.minecraft.server.v1_9_R1.Block;
@@ -37,12 +37,64 @@ import net.minecraft.server.v1_9_R1.World;
import org.bukkit.craftbukkit.v1_9_R1.entity.CraftPlayer;
-public class AnySilentChest implements IAnySilentChest {
+public class AnySilentContainer implements IAnySilentContainer {
+
@Override
- public boolean isAnyChestNeeded(Player p, int x, int y, int z) {
+ public boolean isAnySilentContainer(org.bukkit.block.Block block) {
+ return block instanceof org.bukkit.block.Chest;
+ }
+
+ @Override
+ public boolean activateContainer(Player p, boolean anychest, boolean silentchest, int x, int y, int z) {
+ EntityPlayer player = ((CraftPlayer) p).getHandle();
+ World world = player.world;
+ Object chest = world.getTileEntity(new BlockPosition(x, y, z));
+ if (chest == null)
+ return false;
+
+ if (!anychest && isAnyContainerNeeded(p, x, y, z)) {
+ return false;
+ }
+
+ int id = Block.getId(world.getType(new BlockPosition(x, y, z)).getBlock());
+
+ if (Block.getId(world.getType(new BlockPosition(x - 1, y, z)).getBlock()) == id)
+ chest = new InventoryLargeChest("Large chest", (TileEntityChest) world.getTileEntity(new BlockPosition(x - 1, y, z)), (ITileInventory) chest);
+ if (Block.getId(world.getType(new BlockPosition(x + 1, y, z)).getBlock()) == id)
+ chest = new InventoryLargeChest("Large chest", (ITileInventory) chest, (TileEntityChest) world.getTileEntity(new BlockPosition(x + 1, y, z)));
+ if (Block.getId(world.getType(new BlockPosition(x, y, z - 1)).getBlock()) == id)
+ chest = new InventoryLargeChest("Large chest", (TileEntityChest) world.getTileEntity(new BlockPosition(x, y, z - 1)), (ITileInventory) chest);
+ if (Block.getId(world.getType(new BlockPosition(x, y, z + 1)).getBlock()) == id)
+ chest = new InventoryLargeChest("Large chest", (ITileInventory) chest, (TileEntityChest) world.getTileEntity(new BlockPosition(x, y, z + 1)));
+
+ boolean returnValue = false;
+ if (!silentchest) {
+ player.openContainer((IInventory) chest);
+ returnValue = true;
+ } else {
+ try {
+ SilentContainerChest silentContainerChest = new SilentContainerChest(player.inventory, ((IInventory) chest), player);
+ int windowId = player.nextContainerCounter();
+ player.playerConnection.sendPacket(new PacketPlayOutOpenWindow(windowId, "minecraft:chest", ((IInventory) chest).getScoreboardDisplayName(), ((IInventory) chest).getSize()));
+ player.activeContainer = silentContainerChest;
+ player.activeContainer.windowId = windowId;
+ player.activeContainer.addSlotListener(player);
+ returnValue = true;
+ } catch (Exception e) {
+ e.printStackTrace();
+ p.sendMessage(ChatColor.RED + "Error while sending silent chest.");
+ }
+ }
+
+ return returnValue;
+ }
+
+ @Override
+ public boolean isAnyContainerNeeded(Player p, int x, int y, int z) {
// FOR REFERENCE, LOOK AT net.minecraft.server.BlockChest
EntityPlayer player = ((CraftPlayer) p).getHandle();
World world = player.world;
+
// If block or ocelot on top
if (world.getType(new BlockPosition(x, y + 1, z)).l() || hasOcelotOnTop(world, x, y, z))
return true;
@@ -50,16 +102,8 @@ public class AnySilentChest implements IAnySilentChest {
int id = Block.getId(world.getType(new BlockPosition(x, y, z)).getBlock());
// If block next to chest is chest and has a block or ocelot on top
- if (isBlockedChest(world, id, x - 1, y, z))
- return true;
- if (isBlockedChest(world, id, x + 1, y, z))
- return true;
- if (isBlockedChest(world, id, x, y, z - 1))
- return true;
- if (isBlockedChest(world, id, x, y, z + 1))
- return true;
-
- return false;
+ return isBlockedChest(world, id, x - 1, y, z) || isBlockedChest(world, id, x + 1, y, z)
+ || isBlockedChest(world, id, x, y, z - 1) || isBlockedChest(world, id, x, y, z + 1);
}
private boolean isBlockedChest(World world, int id, int x, int y, int z) {
@@ -87,58 +131,22 @@ public class AnySilentChest implements IAnySilentChest {
return false;
}
+ /**
+ * @deprecated Use {@link #activateContainer(Player, boolean, boolean, int, int, int)}.
+ */
+ @Deprecated
@Override
- public boolean activateChest(Player p, boolean anychest, boolean silentchest, int x, int y, int z) {
- EntityPlayer player = ((CraftPlayer) p).getHandle();
- World world = player.world;
- Object chest = world.getTileEntity(new BlockPosition(x, y, z));
- if (chest == null)
- return true;
-
- int id = Block.getId(world.getType(new BlockPosition(x, y, z)).getBlock());
-
- if (!anychest) {
- if (world.getType(new BlockPosition(x, y + 1, z)).l())
- return true;
- if ((Block.getId(world.getType(new BlockPosition(x - 1, y, z)).getBlock()) == id) && (world.getType(new BlockPosition(x - 1, y + 1, z)).l()))
- return true;
- if ((Block.getId(world.getType(new BlockPosition(x + 1, y, z)).getBlock()) == id) && (world.getType(new BlockPosition(x + 1, y + 1, z)).l()))
- return true;
- if ((Block.getId(world.getType(new BlockPosition(x, y, z - 1)).getBlock()) == id) && (world.getType(new BlockPosition(x, y + 1, z - 1)).l()))
- return true;
- if ((Block.getId(world.getType(new BlockPosition(x, y, z + 1)).getBlock()) == id) && (world.getType(new BlockPosition(x, y + 1, z + 1)).l()))
- return true;
- }
-
- if (Block.getId(world.getType(new BlockPosition(x - 1, y, z)).getBlock()) == id)
- chest = new InventoryLargeChest("Large chest", (TileEntityChest) world.getTileEntity(new BlockPosition(x - 1, y, z)), (ITileInventory) chest);
- if (Block.getId(world.getType(new BlockPosition(x + 1, y, z)).getBlock()) == id)
- chest = new InventoryLargeChest("Large chest", (ITileInventory) chest, (TileEntityChest) world.getTileEntity(new BlockPosition(x + 1, y, z)));
- if (Block.getId(world.getType(new BlockPosition(x, y, z - 1)).getBlock()) == id)
- chest = new InventoryLargeChest("Large chest", (TileEntityChest) world.getTileEntity(new BlockPosition(x, y, z - 1)), (ITileInventory) chest);
- if (Block.getId(world.getType(new BlockPosition(x, y, z + 1)).getBlock()) == id)
- chest = new InventoryLargeChest("Large chest", (ITileInventory) chest, (TileEntityChest) world.getTileEntity(new BlockPosition(x, y, z + 1)));
-
- boolean returnValue = true;
- if (!silentchest) {
- player.openContainer((IInventory) chest);
- }
- else {
- try {
- SilentContainerChest silentContainerChest = new SilentContainerChest(player.inventory, ((IInventory) chest), player);
- int windowId = player.nextContainerCounter();
- player.playerConnection.sendPacket(new PacketPlayOutOpenWindow(windowId, "minecraft:chest", ((IInventory) chest).getScoreboardDisplayName(), ((IInventory) chest).getSize()));
- player.activeContainer = silentContainerChest;
- player.activeContainer.windowId = windowId;
- player.activeContainer.addSlotListener(player);
- returnValue = false;
- }
- catch (Exception e) {
- e.printStackTrace();
- p.sendMessage(ChatColor.RED + "Error while sending silent chest.");
- }
- }
-
- return returnValue;
+ public boolean activateChest(Player player, boolean anychest, boolean silentchest, int x, int y, int z) {
+ return !activateContainer(player, anychest, silentchest, x, y, z);
}
+
+ /**
+ * @deprecated Use {@link #isAnyContainerNeeded(Player, int, int, int)}.
+ */
+ @Deprecated
+ @Override
+ public boolean isAnyChestNeeded(Player player, int x, int y, int z) {
+ return isAnyContainerNeeded(player, x, y, z);
+ }
+
}
diff --git a/OpenInvCraftbukkit1_9_R2/src/main/java/com/lishid/openinv/internal/v1_9_R2/AnySilentChest.java b/OpenInvCraftbukkit1_9_R2/src/main/java/com/lishid/openinv/internal/v1_9_R2/AnySilentContainer.java
similarity index 74%
rename from OpenInvCraftbukkit1_9_R2/src/main/java/com/lishid/openinv/internal/v1_9_R2/AnySilentChest.java
rename to OpenInvCraftbukkit1_9_R2/src/main/java/com/lishid/openinv/internal/v1_9_R2/AnySilentContainer.java
index 298e263..5d1c6b4 100644
--- a/OpenInvCraftbukkit1_9_R2/src/main/java/com/lishid/openinv/internal/v1_9_R2/AnySilentChest.java
+++ b/OpenInvCraftbukkit1_9_R2/src/main/java/com/lishid/openinv/internal/v1_9_R2/AnySilentContainer.java
@@ -16,11 +16,11 @@
package com.lishid.openinv.internal.v1_9_R2;
+import com.lishid.openinv.internal.IAnySilentContainer;
+
import org.bukkit.ChatColor;
import org.bukkit.entity.Player;
-import com.lishid.openinv.internal.IAnySilentChest;
-
// Volatile
import net.minecraft.server.v1_9_R2.AxisAlignedBB;
import net.minecraft.server.v1_9_R2.Block;
@@ -37,12 +37,64 @@ import net.minecraft.server.v1_9_R2.World;
import org.bukkit.craftbukkit.v1_9_R2.entity.CraftPlayer;
-public class AnySilentChest implements IAnySilentChest {
+public class AnySilentContainer implements IAnySilentContainer {
+
@Override
- public boolean isAnyChestNeeded(Player p, int x, int y, int z) {
+ public boolean isAnySilentContainer(org.bukkit.block.Block block) {
+ return block instanceof org.bukkit.block.Chest;
+ }
+
+ @Override
+ public boolean activateContainer(Player p, boolean anychest, boolean silentchest, int x, int y, int z) {
+ EntityPlayer player = ((CraftPlayer) p).getHandle();
+ World world = player.world;
+ Object chest = world.getTileEntity(new BlockPosition(x, y, z));
+ if (chest == null)
+ return false;
+
+ if (!anychest && isAnyContainerNeeded(p, x, y, z)) {
+ return false;
+ }
+
+ int id = Block.getId(world.getType(new BlockPosition(x, y, z)).getBlock());
+
+ if (Block.getId(world.getType(new BlockPosition(x - 1, y, z)).getBlock()) == id)
+ chest = new InventoryLargeChest("Large chest", (TileEntityChest) world.getTileEntity(new BlockPosition(x - 1, y, z)), (ITileInventory) chest);
+ if (Block.getId(world.getType(new BlockPosition(x + 1, y, z)).getBlock()) == id)
+ chest = new InventoryLargeChest("Large chest", (ITileInventory) chest, (TileEntityChest) world.getTileEntity(new BlockPosition(x + 1, y, z)));
+ if (Block.getId(world.getType(new BlockPosition(x, y, z - 1)).getBlock()) == id)
+ chest = new InventoryLargeChest("Large chest", (TileEntityChest) world.getTileEntity(new BlockPosition(x, y, z - 1)), (ITileInventory) chest);
+ if (Block.getId(world.getType(new BlockPosition(x, y, z + 1)).getBlock()) == id)
+ chest = new InventoryLargeChest("Large chest", (ITileInventory) chest, (TileEntityChest) world.getTileEntity(new BlockPosition(x, y, z + 1)));
+
+ boolean returnValue = false;
+ if (!silentchest) {
+ player.openContainer((IInventory) chest);
+ returnValue = true;
+ } else {
+ try {
+ SilentContainerChest silentContainerChest = new SilentContainerChest(player.inventory, ((IInventory) chest), player);
+ int windowId = player.nextContainerCounter();
+ player.playerConnection.sendPacket(new PacketPlayOutOpenWindow(windowId, "minecraft:chest", ((IInventory) chest).getScoreboardDisplayName(), ((IInventory) chest).getSize()));
+ player.activeContainer = silentContainerChest;
+ player.activeContainer.windowId = windowId;
+ player.activeContainer.addSlotListener(player);
+ returnValue = true;
+ } catch (Exception e) {
+ e.printStackTrace();
+ p.sendMessage(ChatColor.RED + "Error while sending silent chest.");
+ }
+ }
+
+ return returnValue;
+ }
+
+ @Override
+ public boolean isAnyContainerNeeded(Player p, int x, int y, int z) {
// FOR REFERENCE, LOOK AT net.minecraft.server.BlockChest
EntityPlayer player = ((CraftPlayer) p).getHandle();
World world = player.world;
+
// If block or ocelot on top
if (world.getType(new BlockPosition(x, y + 1, z)).l() || hasOcelotOnTop(world, x, y, z))
return true;
@@ -50,16 +102,8 @@ public class AnySilentChest implements IAnySilentChest {
int id = Block.getId(world.getType(new BlockPosition(x, y, z)).getBlock());
// If block next to chest is chest and has a block or ocelot on top
- if (isBlockedChest(world, id, x - 1, y, z))
- return true;
- if (isBlockedChest(world, id, x + 1, y, z))
- return true;
- if (isBlockedChest(world, id, x, y, z - 1))
- return true;
- if (isBlockedChest(world, id, x, y, z + 1))
- return true;
-
- return false;
+ return isBlockedChest(world, id, x - 1, y, z) || isBlockedChest(world, id, x + 1, y, z)
+ || isBlockedChest(world, id, x, y, z - 1) || isBlockedChest(world, id, x, y, z + 1);
}
private boolean isBlockedChest(World world, int id, int x, int y, int z) {
@@ -87,58 +131,22 @@ public class AnySilentChest implements IAnySilentChest {
return false;
}
+ /**
+ * @deprecated Use {@link #activateContainer(Player, boolean, boolean, int, int, int)}.
+ */
+ @Deprecated
@Override
- public boolean activateChest(Player p, boolean anychest, boolean silentchest, int x, int y, int z) {
- EntityPlayer player = ((CraftPlayer) p).getHandle();
- World world = player.world;
- Object chest = world.getTileEntity(new BlockPosition(x, y, z));
- if (chest == null)
- return true;
-
- int id = Block.getId(world.getType(new BlockPosition(x, y, z)).getBlock());
-
- if (!anychest) {
- if (world.getType(new BlockPosition(x, y + 1, z)).l())
- return true;
- if ((Block.getId(world.getType(new BlockPosition(x - 1, y, z)).getBlock()) == id) && (world.getType(new BlockPosition(x - 1, y + 1, z)).l()))
- return true;
- if ((Block.getId(world.getType(new BlockPosition(x + 1, y, z)).getBlock()) == id) && (world.getType(new BlockPosition(x + 1, y + 1, z)).l()))
- return true;
- if ((Block.getId(world.getType(new BlockPosition(x, y, z - 1)).getBlock()) == id) && (world.getType(new BlockPosition(x, y + 1, z - 1)).l()))
- return true;
- if ((Block.getId(world.getType(new BlockPosition(x, y, z + 1)).getBlock()) == id) && (world.getType(new BlockPosition(x, y + 1, z + 1)).l()))
- return true;
- }
-
- if (Block.getId(world.getType(new BlockPosition(x - 1, y, z)).getBlock()) == id)
- chest = new InventoryLargeChest("Large chest", (TileEntityChest) world.getTileEntity(new BlockPosition(x - 1, y, z)), (ITileInventory) chest);
- if (Block.getId(world.getType(new BlockPosition(x + 1, y, z)).getBlock()) == id)
- chest = new InventoryLargeChest("Large chest", (ITileInventory) chest, (TileEntityChest) world.getTileEntity(new BlockPosition(x + 1, y, z)));
- if (Block.getId(world.getType(new BlockPosition(x, y, z - 1)).getBlock()) == id)
- chest = new InventoryLargeChest("Large chest", (TileEntityChest) world.getTileEntity(new BlockPosition(x, y, z - 1)), (ITileInventory) chest);
- if (Block.getId(world.getType(new BlockPosition(x, y, z + 1)).getBlock()) == id)
- chest = new InventoryLargeChest("Large chest", (ITileInventory) chest, (TileEntityChest) world.getTileEntity(new BlockPosition(x, y, z + 1)));
-
- boolean returnValue = true;
- if (!silentchest) {
- player.openContainer((IInventory) chest);
- }
- else {
- try {
- SilentContainerChest silentContainerChest = new SilentContainerChest(player.inventory, ((IInventory) chest), player);
- int windowId = player.nextContainerCounter();
- player.playerConnection.sendPacket(new PacketPlayOutOpenWindow(windowId, "minecraft:chest", ((IInventory) chest).getScoreboardDisplayName(), ((IInventory) chest).getSize()));
- player.activeContainer = silentContainerChest;
- player.activeContainer.windowId = windowId;
- player.activeContainer.addSlotListener(player);
- returnValue = false;
- }
- catch (Exception e) {
- e.printStackTrace();
- p.sendMessage(ChatColor.RED + "Error while sending silent chest.");
- }
- }
-
- return returnValue;
+ public boolean activateChest(Player player, boolean anychest, boolean silentchest, int x, int y, int z) {
+ return !activateContainer(player, anychest, silentchest, x, y, z);
}
+
+ /**
+ * @deprecated Use {@link #isAnyContainerNeeded(Player, int, int, int)}.
+ */
+ @Deprecated
+ @Override
+ public boolean isAnyChestNeeded(Player player, int x, int y, int z) {
+ return isAnyContainerNeeded(player, x, y, z);
+ }
+
}
diff --git a/OpenInvPlugin/src/main/java/com/lishid/openinv/OpenInv.java b/OpenInvPlugin/src/main/java/com/lishid/openinv/OpenInv.java
index 6f261be..a23ddc9 100644
--- a/OpenInvPlugin/src/main/java/com/lishid/openinv/OpenInv.java
+++ b/OpenInvPlugin/src/main/java/com/lishid/openinv/OpenInv.java
@@ -27,7 +27,7 @@ import com.lishid.openinv.commands.OpenEnderPluginCommand;
import com.lishid.openinv.commands.OpenInvPluginCommand;
import com.lishid.openinv.commands.SearchInvPluginCommand;
import com.lishid.openinv.commands.SilentChestPluginCommand;
-import com.lishid.openinv.internal.IAnySilentChest;
+import com.lishid.openinv.internal.IAnySilentContainer;
import com.lishid.openinv.internal.IInventoryAccess;
import com.lishid.openinv.internal.IPlayerDataManager;
import com.lishid.openinv.internal.ISpecialEnderChest;
@@ -97,7 +97,7 @@ public class OpenInv extends JavaPlugin {
private InternalAccessor accessor;
private IPlayerDataManager playerLoader;
private IInventoryAccess inventoryAccess;
- private IAnySilentChest anySilentChest;
+ private IAnySilentContainer anySilentContainer;
@Override
public void onEnable() {
@@ -115,7 +115,7 @@ public class OpenInv extends JavaPlugin {
playerLoader = accessor.newPlayerDataManager();
inventoryAccess = accessor.newInventoryAccess();
- anySilentChest = accessor.newAnySilentChest();
+ anySilentContainer = accessor.newAnySilentContainer();
FileConfiguration config = getConfig();
boolean dirtyConfig = false;
@@ -164,8 +164,16 @@ public class OpenInv extends JavaPlugin {
return this.inventoryAccess;
}
- public IAnySilentChest getAnySilentChest() {
- return this.anySilentChest;
+ public IAnySilentContainer getAnySilentContainer() {
+ return this.anySilentContainer;
+ }
+
+ /**
+ * @deprecated Use {@link #getAnySilentContainer()}
+ */
+ @Deprecated
+ public com.lishid.openinv.internal.IAnySilentChest getAnySilentChest() {
+ return this.getAnySilentContainer();
}
public ISpecialPlayerInventory getInventoryFor(Player player, boolean online) {
diff --git a/OpenInvPlugin/src/main/java/com/lishid/openinv/OpenInvPlayerListener.java b/OpenInvPlugin/src/main/java/com/lishid/openinv/OpenInvPlayerListener.java
index b064e0c..077b835 100644
--- a/OpenInvPlugin/src/main/java/com/lishid/openinv/OpenInvPlayerListener.java
+++ b/OpenInvPlugin/src/main/java/com/lishid/openinv/OpenInvPlayerListener.java
@@ -16,8 +16,6 @@
package com.lishid.openinv;
-import org.bukkit.ChatColor;
-import org.bukkit.block.Chest;
import org.bukkit.entity.Player;
import org.bukkit.event.Event.Result;
import org.bukkit.event.EventHandler;
@@ -46,53 +44,41 @@ public class OpenInvPlayerListener implements Listener {
plugin.setPlayerOffline(event.getPlayer());
}
- @EventHandler(priority = EventPriority.MONITOR)
+ @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
public void onPlayerInteract(PlayerInteractEvent event) {
+ if (event.getAction() != Action.RIGHT_CLICK_BLOCK || event.getPlayer().isSneaking()
+ || event.useInteractedBlock() == Result.DENY) {
+ return;
+ }
+
Player player = event.getPlayer();
- if (event.getPlayer().isSneaking()) {
- return;
- }
-
- if (event.getAction() == Action.RIGHT_CLICK_BLOCK && event.useInteractedBlock() == Result.DENY) {
- return;
- }
-
- if (event.getAction() == Action.RIGHT_CLICK_BLOCK && event.getClickedBlock().getType() == org.bukkit.Material.ENDER_CHEST) {
- if (OpenInv.hasPermission(player, Permissions.PERM_SILENT) && plugin.getPlayerSilentChestStatus(player)) {
+ if (event.getClickedBlock().getType() == org.bukkit.Material.ENDER_CHEST) {
+ if (OpenInv.hasPermission(player, Permissions.PERM_SILENT)
+ && plugin.getPlayerSilentChestStatus(player)) {
event.setCancelled(true);
player.openInventory(player.getEnderChest());
}
+ return;
}
- if (event.getAction() == Action.RIGHT_CLICK_BLOCK && event.getClickedBlock().getState() instanceof Chest) {
- boolean silentchest = false;
- boolean anychest = false;
+ if (plugin.getAnySilentContainer().isAnySilentContainer(event.getClickedBlock())) {
+
+ boolean silentchest = OpenInv.hasPermission(player, Permissions.PERM_SILENT) && plugin.getPlayerSilentChestStatus(player);
+ boolean anychest = OpenInv.hasPermission(player, Permissions.PERM_ANYCHEST) && plugin.getPlayerAnyChestStatus(player);
+
int x = event.getClickedBlock().getX();
int y = event.getClickedBlock().getY();
int z = event.getClickedBlock().getZ();
- if (OpenInv.hasPermission(player, Permissions.PERM_SILENT) && plugin.getPlayerSilentChestStatus(player)) {
- silentchest = true;
- }
-
- if (OpenInv.hasPermission(player, Permissions.PERM_ANYCHEST) && plugin.getPlayerAnyChestStatus(player)) {
- try {
- anychest = plugin.getAnySilentChest().isAnyChestNeeded(player, x, y, z);
- }
- catch (Exception e) {
- player.sendMessage(ChatColor.RED + "Error while executing openinv. Unsupported CraftBukkit.");
- e.printStackTrace();
- }
- }
-
- // If the anychest or silentchest is active
+ // If anychest or silentchest is active
if (anychest || silentchest) {
- if (!plugin.getAnySilentChest().activateChest(player, anychest, silentchest, x, y, z)) {
- if (silentchest && plugin.notifySilentChest()) {
+ if (plugin.getAnySilentContainer().activateContainer(player, anychest, silentchest, x, y, z)) {
+ if (silentchest && plugin.notifySilentChest() && anychest && plugin.notifyAnyChest()) {
+ player.sendMessage("You are opening a blocked chest silently.");
+ } else if (silentchest && plugin.notifySilentChest()) {
player.sendMessage("You are opening a chest silently.");
- }
- if (anychest && plugin.notifyAnyChest()) {
+ } else if (anychest && plugin.notifyAnyChest()) {
player.sendMessage("You are opening a blocked chest.");
}
event.setCancelled(true);
diff --git a/OpenInvPlugin/src/main/java/com/lishid/openinv/internal/InternalAccessor.java b/OpenInvPlugin/src/main/java/com/lishid/openinv/internal/InternalAccessor.java
index d0939d8..7c37840 100644
--- a/OpenInvPlugin/src/main/java/com/lishid/openinv/internal/InternalAccessor.java
+++ b/OpenInvPlugin/src/main/java/com/lishid/openinv/internal/InternalAccessor.java
@@ -63,8 +63,16 @@ public class InternalAccessor {
return (IInventoryAccess) createObject(IInventoryAccess.class, "InventoryAccess");
}
+ public IAnySilentContainer newAnySilentContainer() {
+ return (IAnySilentContainer) createObject(IAnySilentContainer.class, "AnySilentContainer");
+ }
+
+ /**
+ * @deprecated Use {@link #newAnySilentContainer()}
+ */
+ @Deprecated
public IAnySilentChest newAnySilentChest() {
- return (IAnySilentChest) createObject(IAnySilentChest.class, "AnySilentChest");
+ return newAnySilentContainer();
}
public ISpecialPlayerInventory newSpecialPlayerInventory(Player player, boolean offline) {
diff --git a/README.MD b/README.MD
index e6549f3..7d689c1 100644
--- a/README.MD
+++ b/README.MD
@@ -9,6 +9,16 @@ This fork of OpenInv was created when the lag caused by offline player lookups p
## Previous Versions
This fork supports any version after 1.4.5. Binaries are available in the [releases tab](https://github.com/Jikoo/OpenInv/releases). Please allow a brief period after the release of a new version for updates.
+## For Developers
+To compile, the relevant Craftbukkit/Spigot jars must be installed in your local repository using the install plugin.
+Ex: `install:install-file -Dpackaging=jar -Dfile=spigot-1.11-R0.1-SNAPSHOT.jar -DgroupId=org.spigotmc -DartifactId=spigot -Dversion=1.11-R0.1-SNAPSHOT`
+
+Compiling OpenInv for a specific version is very easy - just compile the correct module.
+
+Compiling for a set of versions is slightly more complex. You'll need to use a profile for the versions you want to compile. Provided profiles are latest, modern (versions 1.7.10+), and all. For more information, check out the [official guide](http://maven.apache.org/guides/introduction/introduction-to-profiles.html).
+
+Regarding deprecation: Any deprecated methods will be removed in the next minor revision bump.
+
## License
```
Copyright (C) 2011-2014 lishid. All rights reserved.