Prep for silent shulker boxes, backport ocelot fix to all versions
No clue why I didn't port it to all versions, seems like I stopped after 1.8 or something. Ocelots have been around since 1.2.
This commit is contained in:
		@@ -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);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
		Reference in New Issue
	
	Block a user