diff --git a/internal/pom.xml b/internal/pom.xml
index fa36d4c..5509e52 100644
--- a/internal/pom.xml
+++ b/internal/pom.xml
@@ -34,7 +34,6 @@
all
v1_8_R3
- v1_13_R2
v1_14_R1
v1_15_R1
diff --git a/internal/v1_13_R2/pom.xml b/internal/v1_13_R2/pom.xml
deleted file mode 100644
index e84efbd..0000000
--- a/internal/v1_13_R2/pom.xml
+++ /dev/null
@@ -1,74 +0,0 @@
-
-
-
- 4.0.0
-
-
- com.lishid
- openinvinternal
- 4.0.8-SNAPSHOT
-
-
- openinvadapter1_13_R2
- OpenInvAdapter1_13_R2
-
-
-
- org.spigotmc
- spigot
- 1.13.2-R0.1-SNAPSHOT
- provided
-
-
- com.lishid
- openinvcommon
- 4.0.8-SNAPSHOT
-
-
-
-
-
-
- org.apache.maven.plugins
- maven-shade-plugin
- 3.0.0
-
- true
-
-
-
- package
-
- shade
-
-
-
-
-
-
- maven-compiler-plugin
- 3.8.1
-
- 1.8
- 1.8
-
-
-
-
-
-
diff --git a/internal/v1_13_R2/src/main/java/com/lishid/openinv/internal/v1_13_R2/AnySilentContainer.java b/internal/v1_13_R2/src/main/java/com/lishid/openinv/internal/v1_13_R2/AnySilentContainer.java
deleted file mode 100644
index 4b32bc9..0000000
--- a/internal/v1_13_R2/src/main/java/com/lishid/openinv/internal/v1_13_R2/AnySilentContainer.java
+++ /dev/null
@@ -1,311 +0,0 @@
-/*
- * Copyright (C) 2011-2019 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_13_R2;
-
-import com.lishid.openinv.internal.IAnySilentContainer;
-import java.lang.reflect.Field;
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
-import net.minecraft.server.v1_13_R2.AxisAlignedBB;
-import net.minecraft.server.v1_13_R2.Block;
-import net.minecraft.server.v1_13_R2.BlockChest;
-import net.minecraft.server.v1_13_R2.BlockChestTrapped;
-import net.minecraft.server.v1_13_R2.BlockEnderChest;
-import net.minecraft.server.v1_13_R2.BlockPosition;
-import net.minecraft.server.v1_13_R2.BlockPropertyChestType;
-import net.minecraft.server.v1_13_R2.BlockShulkerBox;
-import net.minecraft.server.v1_13_R2.ChatMessage;
-import net.minecraft.server.v1_13_R2.Entity;
-import net.minecraft.server.v1_13_R2.EntityOcelot;
-import net.minecraft.server.v1_13_R2.EntityPlayer;
-import net.minecraft.server.v1_13_R2.EnumDirection;
-import net.minecraft.server.v1_13_R2.EnumGamemode;
-import net.minecraft.server.v1_13_R2.IBlockData;
-import net.minecraft.server.v1_13_R2.ITileInventory;
-import net.minecraft.server.v1_13_R2.InventoryEnderChest;
-import net.minecraft.server.v1_13_R2.InventoryLargeChest;
-import net.minecraft.server.v1_13_R2.PlayerInteractManager;
-import net.minecraft.server.v1_13_R2.TileEntity;
-import net.minecraft.server.v1_13_R2.TileEntityChest;
-import net.minecraft.server.v1_13_R2.TileEntityEnderChest;
-import net.minecraft.server.v1_13_R2.TileEntityShulkerBox;
-import net.minecraft.server.v1_13_R2.VoxelShape;
-import net.minecraft.server.v1_13_R2.VoxelShapes;
-import net.minecraft.server.v1_13_R2.World;
-import org.bukkit.Material;
-import org.bukkit.Statistic;
-import org.bukkit.block.BlockState;
-import org.bukkit.entity.Player;
-import org.bukkit.inventory.InventoryView;
-import org.jetbrains.annotations.NotNull;
-
-public class AnySilentContainer implements IAnySilentContainer {
-
- private Field playerInteractManagerGamemode;
-
- public AnySilentContainer() {
- try {
- this.playerInteractManagerGamemode = PlayerInteractManager.class.getDeclaredField("gamemode");
- this.playerInteractManagerGamemode.setAccessible(true);
- } catch (NoSuchFieldException | SecurityException e) {
- System.err.println("[OpenInv] Unable to directly write player gamemode! SilentChest will fail.");
- e.printStackTrace();
- }
- }
-
- @Override
- public boolean isAnySilentContainer(@NotNull final org.bukkit.block.Block bukkitBlock) {
- if (bukkitBlock.getType() == Material.ENDER_CHEST) {
- return true;
- }
- BlockState state = bukkitBlock.getState();
- return state instanceof org.bukkit.block.Chest
- || state instanceof org.bukkit.block.ShulkerBox;
- }
-
- @Override
- public boolean isAnyContainerNeeded(@NotNull final Player bukkitPlayer, @NotNull final org.bukkit.block.Block bukkitBlock) {
-
- World world = PlayerDataManager.getHandle(bukkitPlayer).world;
- BlockPosition blockPosition = new BlockPosition(bukkitBlock.getX(), bukkitBlock.getY(), bukkitBlock.getZ());
- IBlockData blockData = world.getType(blockPosition);
- Block block = blockData.getBlock();
-
- if (block instanceof BlockShulkerBox) {
- return this.isBlockedShulkerBox(world, blockPosition, blockData);
- }
-
- if (block instanceof BlockEnderChest) {
- // Ender chests are not blocked by ocelots.
- return world.getType(blockPosition.up()).isOccluding();
- }
-
- // Check if chest is blocked or has an ocelot on top
- if (this.isBlockedChest(world, blockPosition)) {
- return true;
- }
-
- // Check for matching adjacent chests that are blocked or have an ocelot on top
- BlockPropertyChestType chestType = blockData.get(BlockChest.b);
-
- if (chestType == BlockPropertyChestType.SINGLE) {
- return false;
- }
-
- BlockPosition adjacentBlockPosition = blockPosition.shift(BlockChest.k(blockData));
- IBlockData adjacentBlockData = world.getType(adjacentBlockPosition);
-
- if (adjacentBlockData.getBlock() == block) {
-
- BlockPropertyChestType adjacentChestType = adjacentBlockData.get(BlockChest.b);
-
- if (adjacentChestType != BlockPropertyChestType.SINGLE && chestType != adjacentChestType
- && adjacentBlockData.get(BlockChest.FACING) == blockData.get(BlockChest.FACING)) {
-
- return this.isBlockedChest(world, adjacentBlockPosition);
- }
- }
-
- return false;
- }
-
- private boolean isBlockedShulkerBox(final World world, final BlockPosition blockPosition,
- final IBlockData blockData) {
- // For reference, look at net.minecraft.server.BlockShulkerBox
- TileEntity tile = world.getTileEntity(blockPosition);
-
- if (!(tile instanceof TileEntityShulkerBox)) {
- return false;
- }
-
- EnumDirection enumDirection = blockData.get(BlockShulkerBox.a);
- if (((TileEntityShulkerBox) tile).r() == TileEntityShulkerBox.AnimationPhase.CLOSED) {
- AxisAlignedBB axisAlignedBB;
- try {
- Method method = VoxelShape.class.getMethod("a");
- axisAlignedBB = (AxisAlignedBB) method.invoke(VoxelShapes.b());
- } catch (NoSuchMethodException e) {
- axisAlignedBB = VoxelShapes.b().getBoundingBox();
- } catch (InvocationTargetException | IllegalAccessException e) {
- return false;
- }
- axisAlignedBB = axisAlignedBB
- .b(0.5F * enumDirection.getAdjacentX(), 0.5F * enumDirection.getAdjacentY(), 0.5F * enumDirection.getAdjacentZ())
- .a(enumDirection.getAdjacentX(), enumDirection.getAdjacentY(), enumDirection.getAdjacentZ());
- return !world.getCubes(null, axisAlignedBB.a(blockPosition.shift(enumDirection)));
- }
-
- return false;
- }
-
- private boolean isBlockedChest(final World world, final BlockPosition blockPosition) {
- // For reference, loot at net.minecraft.server.BlockChest
- return world.getType(blockPosition.up()).isOccluding() || this.hasOcelotOnTop(world, blockPosition);
- }
-
- private boolean hasOcelotOnTop(final World world, final BlockPosition blockPosition) {
- for (Entity entity : world.a(EntityOcelot.class,
- new AxisAlignedBB(blockPosition.getX(), blockPosition.getY() + 1,
- blockPosition.getZ(), blockPosition.getX() + 1, blockPosition.getY() + 2,
- blockPosition.getZ() + 1))) {
- EntityOcelot entityOcelot = (EntityOcelot) entity;
- if (entityOcelot.isSitting()) {
- return true;
- }
- }
-
- return false;
- }
-
- @Override
- public boolean activateContainer(@NotNull final Player bukkitPlayer, final boolean silent,
- @NotNull final org.bukkit.block.Block bukkitBlock) {
-
- // Silent ender chest is API-only
- if (silent && bukkitBlock.getType() == Material.ENDER_CHEST) {
- bukkitPlayer.openInventory(bukkitPlayer.getEnderChest());
- bukkitPlayer.incrementStatistic(Statistic.ENDERCHEST_OPENED);
- return true;
- }
-
- EntityPlayer player = PlayerDataManager.getHandle(bukkitPlayer);
-
- final World world = player.world;
- final BlockPosition blockPosition = new BlockPosition(bukkitBlock.getX(), bukkitBlock.getY(), bukkitBlock.getZ());
- final Object tile = world.getTileEntity(blockPosition);
-
- if (tile == null) {
- return false;
- }
-
- if (tile instanceof TileEntityEnderChest) {
- // Anychest ender chest. See net.minecraft.server.BlockEnderChest
- InventoryEnderChest enderChest = player.getEnderChest();
- enderChest.a((TileEntityEnderChest) tile);
- player.openContainer(enderChest);
- bukkitPlayer.incrementStatistic(Statistic.ENDERCHEST_OPENED);
- return true;
- }
-
- if (!(tile instanceof ITileInventory)) {
- return false;
- }
-
- ITileInventory tileInventory = (ITileInventory) tile;
- IBlockData blockData = world.getType(blockPosition);
- Block block = blockData.getBlock();
-
- if (block instanceof BlockChest) {
-
- BlockPropertyChestType chestType = blockData.get(BlockChest.b);
-
- if (chestType != BlockPropertyChestType.SINGLE) {
-
- BlockPosition adjacentBlockPosition = blockPosition.shift(BlockChest.k(blockData));
- IBlockData adjacentBlockData = world.getType(adjacentBlockPosition);
-
- if (adjacentBlockData.getBlock() == block) {
-
- BlockPropertyChestType adjacentChestType = adjacentBlockData.get(BlockChest.b);
-
- if (adjacentChestType != BlockPropertyChestType.SINGLE && chestType != adjacentChestType
- && adjacentBlockData.get(BlockChest.FACING) == blockData.get(BlockChest.FACING)) {
-
- TileEntity adjacentTile = world.getTileEntity(adjacentBlockPosition);
-
- if (adjacentTile instanceof TileEntityChest) {
- ITileInventory rightChest = chestType == BlockPropertyChestType.RIGHT ? tileInventory : (ITileInventory) adjacentTile;
- ITileInventory leftChest = chestType == BlockPropertyChestType.RIGHT ? (ITileInventory) adjacentTile : tileInventory;
- tileInventory = new InventoryLargeChest(new ChatMessage("container.chestDouble"), rightChest, leftChest);
- }
- }
- }
- }
-
- if (block instanceof BlockChestTrapped) {
- bukkitPlayer.incrementStatistic(Statistic.TRAPPED_CHEST_TRIGGERED);
- } else {
- bukkitPlayer.incrementStatistic(Statistic.CHEST_OPENED);
- }
- }
-
- if (block instanceof BlockShulkerBox) {
- bukkitPlayer.incrementStatistic(Statistic.SHULKER_BOX_OPENED);
- }
-
- // AnyChest only - SilentChest not active, container unsupported, or unnecessary.
- if (!silent || player.playerInteractManager.getGameMode() == EnumGamemode.SPECTATOR) {
- player.openContainer(tileInventory);
- return true;
- }
-
- // SilentChest requires access to setting players' gamemode directly.
- if (this.playerInteractManagerGamemode == null) {
- return false;
- }
-
- EnumGamemode gamemode = player.playerInteractManager.getGameMode();
- this.forceGameMode(player, EnumGamemode.SPECTATOR);
- player.openContainer(tileInventory);
- this.forceGameMode(player, gamemode);
- return true;
- }
-
- @Override
- public void deactivateContainer(@NotNull final Player bukkitPlayer) {
- if (this.playerInteractManagerGamemode == null) {
- return;
- }
-
- InventoryView view = bukkitPlayer.getOpenInventory();
- switch (view.getType()) {
- case CHEST:
- case ENDER_CHEST:
- case SHULKER_BOX:
- break;
- default:
- return;
- }
-
- EntityPlayer player = PlayerDataManager.getHandle(bukkitPlayer);
-
- EnumGamemode gamemode = player.playerInteractManager.getGameMode();
- this.forceGameMode(player, EnumGamemode.SPECTATOR);
- player.activeContainer.b(player);
- player.activeContainer.a(player, false);
- player.activeContainer.transferTo(player.defaultContainer, player.getBukkitEntity());
- player.activeContainer = player.defaultContainer;
- this.forceGameMode(player, gamemode);
- }
-
- private void forceGameMode(final EntityPlayer player, final EnumGamemode gameMode) {
- if (this.playerInteractManagerGamemode == null) {
- // No need to warn repeatedly, error on startup and lack of function should be enough.
- return;
- }
- try {
- if (!this.playerInteractManagerGamemode.isAccessible()) {
- // Just in case, ensure accessible.
- this.playerInteractManagerGamemode.setAccessible(true);
- }
- this.playerInteractManagerGamemode.set(player.playerInteractManager, gameMode);
- } catch (IllegalArgumentException | IllegalAccessException e) {
- e.printStackTrace();
- }
- }
-
-}
diff --git a/internal/v1_13_R2/src/main/java/com/lishid/openinv/internal/v1_13_R2/PlayerDataManager.java b/internal/v1_13_R2/src/main/java/com/lishid/openinv/internal/v1_13_R2/PlayerDataManager.java
deleted file mode 100644
index 1a3a311..0000000
--- a/internal/v1_13_R2/src/main/java/com/lishid/openinv/internal/v1_13_R2/PlayerDataManager.java
+++ /dev/null
@@ -1,85 +0,0 @@
-/*
- * Copyright (C) 2011-2019 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_13_R2;
-
-import com.lishid.openinv.internal.IPlayerDataManager;
-import com.lishid.openinv.internal.ISpecialInventory;
-import com.mojang.authlib.GameProfile;
-import net.minecraft.server.v1_13_R2.DimensionManager;
-import net.minecraft.server.v1_13_R2.EntityPlayer;
-import net.minecraft.server.v1_13_R2.MinecraftServer;
-import net.minecraft.server.v1_13_R2.PlayerInteractManager;
-import org.bukkit.Bukkit;
-import org.bukkit.OfflinePlayer;
-import org.bukkit.Server;
-import org.bukkit.craftbukkit.v1_13_R2.CraftServer;
-import org.bukkit.craftbukkit.v1_13_R2.entity.CraftPlayer;
-import org.bukkit.entity.Player;
-import org.bukkit.inventory.InventoryView;
-import org.jetbrains.annotations.NotNull;
-
-public class PlayerDataManager implements IPlayerDataManager {
-
- public static EntityPlayer getHandle(final Player player) {
- if (player instanceof CraftPlayer) {
- return ((CraftPlayer) player).getHandle();
- }
-
- Server server = player.getServer();
- EntityPlayer nmsPlayer = null;
-
- if (server instanceof CraftServer) {
- nmsPlayer = ((CraftServer) server).getHandle().getPlayer(player.getName());
- }
-
- if (nmsPlayer == null) {
- // Could use reflection to examine fields, but it's honestly not worth the bother.
- throw new RuntimeException("Unable to fetch EntityPlayer from provided Player implementation");
- }
-
- return nmsPlayer;
- }
-
- @Override
- public Player loadPlayer(@NotNull final OfflinePlayer offline) {
- // Ensure player has data
- if (!offline.hasPlayedBefore()) {
- return null;
- }
-
- // Create a profile and entity to load the player data
- GameProfile profile = new GameProfile(offline.getUniqueId(), offline.getName());
- MinecraftServer server = ((CraftServer) Bukkit.getServer()).getServer();
- EntityPlayer entity = new EntityPlayer(server, server.getWorldServer(DimensionManager.OVERWORLD), profile,
- new PlayerInteractManager(server.getWorldServer(DimensionManager.OVERWORLD)));
-
- // Get the bukkit entity
- Player target = entity.getBukkitEntity();
- if (target != null) {
- // Load data
- target.loadData();
- }
- // Return the entity
- return target;
- }
-
- @Override
- public InventoryView openInventory(@NotNull Player player, @NotNull ISpecialInventory inventory) {
- return player.openInventory(inventory.getBukkitInventory());
- }
-
-}
diff --git a/internal/v1_13_R2/src/main/java/com/lishid/openinv/internal/v1_13_R2/SpecialEnderChest.java b/internal/v1_13_R2/src/main/java/com/lishid/openinv/internal/v1_13_R2/SpecialEnderChest.java
deleted file mode 100644
index 944936c..0000000
--- a/internal/v1_13_R2/src/main/java/com/lishid/openinv/internal/v1_13_R2/SpecialEnderChest.java
+++ /dev/null
@@ -1,266 +0,0 @@
-/*
- * Copyright (C) 2011-2019 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_13_R2;
-
-import com.lishid.openinv.internal.ISpecialEnderChest;
-import java.util.List;
-import javax.annotation.Nullable;
-import net.minecraft.server.v1_13_R2.AutoRecipeOutput;
-import net.minecraft.server.v1_13_R2.AutoRecipeStackManager;
-import net.minecraft.server.v1_13_R2.ContainerUtil;
-import net.minecraft.server.v1_13_R2.EntityHuman;
-import net.minecraft.server.v1_13_R2.EntityPlayer;
-import net.minecraft.server.v1_13_R2.IChatBaseComponent;
-import net.minecraft.server.v1_13_R2.IInventory;
-import net.minecraft.server.v1_13_R2.IInventoryListener;
-import net.minecraft.server.v1_13_R2.InventoryEnderChest;
-import net.minecraft.server.v1_13_R2.ItemStack;
-import net.minecraft.server.v1_13_R2.NonNullList;
-import org.bukkit.Location;
-import org.bukkit.craftbukkit.v1_13_R2.entity.CraftHumanEntity;
-import org.bukkit.craftbukkit.v1_13_R2.inventory.CraftInventory;
-import org.bukkit.entity.HumanEntity;
-import org.bukkit.entity.Player;
-import org.bukkit.inventory.Inventory;
-import org.bukkit.inventory.InventoryHolder;
-import org.jetbrains.annotations.NotNull;
-
-public class SpecialEnderChest implements IInventory, ISpecialEnderChest, AutoRecipeOutput {
-
- private EntityPlayer owner;
- private final IChatBaseComponent displayName;
- private final CraftInventory inventory;
- private NonNullList items;
- private boolean playerOnline;
-
- public SpecialEnderChest(final Player player, final Boolean online) {
- this.owner = PlayerDataManager.getHandle(player);
- this.displayName = this.owner.getEnderChest().getDisplayName();
- this.inventory = new CraftInventory(this);
- this.items = this.owner.getEnderChest().items;
- this.playerOnline = online;
- }
-
- @Override
- public @NotNull Inventory getBukkitInventory() {
- return this.inventory;
- }
-
- @Override
- public boolean isInUse() {
- return !this.getViewers().isEmpty();
- }
-
- @Override
- public void setPlayerOffline() {
- this.playerOnline = false;
- }
-
- @Override
- public void setPlayerOnline(@NotNull final Player player) {
- if (!this.playerOnline) {
- try {
- this.owner = PlayerDataManager.getHandle(player);
- InventoryEnderChest enderChest = owner.getEnderChest();
- for (int i = 0; i < enderChest.getSize(); ++i) {
- enderChest.setItem(i, this.items.get(i));
- }
- this.items = enderChest.items;
- } catch (Exception ignored) {}
- this.playerOnline = true;
- }
- }
-
- @Override
- public void update() {
- this.owner.getEnderChest().update();
- }
-
- public List getContents() {
- return this.items;
- }
-
- public void onOpen(CraftHumanEntity who) {
- this.owner.getEnderChest().onOpen(who);
- }
-
- public void onClose(CraftHumanEntity who) {
- this.owner.getEnderChest().onClose(who);
- }
-
- public List getViewers() {
- return this.owner.getEnderChest().getViewers();
- }
-
- public void setMaxStackSize(int i) {
- this.owner.getEnderChest().setMaxStackSize(i);
- }
-
- public InventoryHolder getOwner() {
- return this.owner.getEnderChest().getOwner();
- }
-
- public Location getLocation() {
- return null;
- }
-
- public void a(IInventoryListener iinventorylistener) {
- this.owner.getEnderChest().a(iinventorylistener);
- }
-
- public void b(IInventoryListener iinventorylistener) {
- this.owner.getEnderChest().b(iinventorylistener);
- }
-
- public ItemStack getItem(int i) {
- return i >= 0 && i < this.items.size() ? this.items.get(i) : ItemStack.a;
- }
-
- public ItemStack splitStack(int i, int j) {
- ItemStack itemstack = ContainerUtil.a(this.items, i, j);
- if (!itemstack.isEmpty()) {
- this.update();
- }
-
- return itemstack;
- }
-
- public ItemStack a(ItemStack itemstack) {
- ItemStack itemstack1 = itemstack.cloneItemStack();
-
- for (int i = 0; i < this.getSize(); ++i) {
- ItemStack itemstack2 = this.getItem(i);
- if (itemstack2.isEmpty()) {
- this.setItem(i, itemstack1);
- this.update();
- return ItemStack.a;
- }
-
- if (ItemStack.c(itemstack2, itemstack1)) {
- int j = Math.min(this.getMaxStackSize(), itemstack2.getMaxStackSize());
- int k = Math.min(itemstack1.getCount(), j - itemstack2.getCount());
- if (k > 0) {
- itemstack2.add(k);
- itemstack1.subtract(k);
- if (itemstack1.isEmpty()) {
- this.update();
- return ItemStack.a;
- }
- }
- }
- }
-
- if (itemstack1.getCount() != itemstack.getCount()) {
- this.update();
- }
-
- return itemstack1;
- }
-
- public ItemStack splitWithoutUpdate(int i) {
- ItemStack itemstack = this.items.get(i);
- if (itemstack.isEmpty()) {
- return ItemStack.a;
- } else {
- this.items.set(i, ItemStack.a);
- return itemstack;
- }
- }
-
- public void setItem(int i, ItemStack itemstack) {
- this.items.set(i, itemstack);
- if (!itemstack.isEmpty() && itemstack.getCount() > this.getMaxStackSize()) {
- itemstack.setCount(this.getMaxStackSize());
- }
-
- this.update();
- }
-
- public int getSize() {
- return this.owner.getEnderChest().getSize();
- }
-
- public boolean P_() {
-
- for (ItemStack itemstack : this.items) {
- if (!itemstack.isEmpty()) {
- return false;
- }
- }
-
- return true;
- }
-
- public IChatBaseComponent getDisplayName() {
- return this.displayName;
- }
-
- @Nullable
- public IChatBaseComponent getCustomName() {
- return this.displayName;
- }
-
- public boolean hasCustomName() {
- return false;
- }
-
- public void a(@Nullable IChatBaseComponent ichatbasecomponent) {
- // Ignored - name is always player's name.
- }
-
- public int getMaxStackSize() {
- return 64;
- }
-
- public boolean a(EntityHuman entityhuman) {
- return true;
- }
-
- public void startOpen(EntityHuman entityhuman) {
- }
-
- public void closeContainer(EntityHuman entityhuman) {
- }
-
- public boolean b(int i, ItemStack itemstack) {
- return true;
- }
-
- public int getProperty(int i) {
- return 0;
- }
-
- public void setProperty(int i, int j) {
- }
-
- public int h() {
- return 0;
- }
-
- public void clear() {
- this.items.clear();
- }
-
- public void a(AutoRecipeStackManager autorecipestackmanager) {
-
- for (ItemStack itemstack : this.items) {
- autorecipestackmanager.b(itemstack);
- }
-
- }
-
-}
diff --git a/internal/v1_13_R2/src/main/java/com/lishid/openinv/internal/v1_13_R2/SpecialPlayerInventory.java b/internal/v1_13_R2/src/main/java/com/lishid/openinv/internal/v1_13_R2/SpecialPlayerInventory.java
deleted file mode 100644
index a36da79..0000000
--- a/internal/v1_13_R2/src/main/java/com/lishid/openinv/internal/v1_13_R2/SpecialPlayerInventory.java
+++ /dev/null
@@ -1,736 +0,0 @@
-/*
- * Copyright (C) 2011-2019 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_13_R2;
-
-import com.google.common.collect.ImmutableList;
-import com.lishid.openinv.internal.ISpecialPlayerInventory;
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-import java.util.function.Predicate;
-import javax.annotation.Nullable;
-import net.minecraft.server.v1_13_R2.AutoRecipeStackManager;
-import net.minecraft.server.v1_13_R2.ChatMessage;
-import net.minecraft.server.v1_13_R2.ContainerUtil;
-import net.minecraft.server.v1_13_R2.CrashReport;
-import net.minecraft.server.v1_13_R2.CrashReportSystemDetails;
-import net.minecraft.server.v1_13_R2.EntityHuman;
-import net.minecraft.server.v1_13_R2.EntityPlayer;
-import net.minecraft.server.v1_13_R2.IBlockData;
-import net.minecraft.server.v1_13_R2.IChatBaseComponent;
-import net.minecraft.server.v1_13_R2.Item;
-import net.minecraft.server.v1_13_R2.ItemArmor;
-import net.minecraft.server.v1_13_R2.ItemStack;
-import net.minecraft.server.v1_13_R2.NBTTagCompound;
-import net.minecraft.server.v1_13_R2.NBTTagList;
-import net.minecraft.server.v1_13_R2.NonNullList;
-import net.minecraft.server.v1_13_R2.PacketPlayOutSetSlot;
-import net.minecraft.server.v1_13_R2.PlayerInventory;
-import net.minecraft.server.v1_13_R2.ReportedException;
-import net.minecraft.server.v1_13_R2.World;
-import org.bukkit.Location;
-import org.bukkit.craftbukkit.v1_13_R2.entity.CraftHumanEntity;
-import org.bukkit.craftbukkit.v1_13_R2.inventory.CraftInventory;
-import org.bukkit.entity.HumanEntity;
-import org.bukkit.entity.Player;
-import org.bukkit.inventory.Inventory;
-import org.bukkit.inventory.InventoryHolder;
-import org.jetbrains.annotations.NotNull;
-
-public class SpecialPlayerInventory extends PlayerInventory implements ISpecialPlayerInventory {
-
- private final CraftInventory inventory = new CraftInventory(this);
- private boolean playerOnline;
- private NonNullList items, armor, extraSlots;
- private List> f;
-
- public SpecialPlayerInventory(final Player bukkitPlayer, final Boolean online) {
- super(PlayerDataManager.getHandle(bukkitPlayer));
- this.playerOnline = online;
- this.items = this.player.inventory.items;
- this.armor = this.player.inventory.armor;
- this.extraSlots = this.player.inventory.extraSlots;
- this.f = ImmutableList.of(this.items, this.armor, this.extraSlots);
- }
-
- @Override
- public void setPlayerOnline(@NotNull final Player player) {
- if (!this.playerOnline) {
- EntityPlayer entityPlayer = PlayerDataManager.getHandle(player);
- entityPlayer.inventory.transaction.addAll(this.transaction);
- this.player = entityPlayer;
- for (int i = 0; i < getSize(); ++i) {
- this.player.inventory.setItem(i, getRawItem(i));
- }
- this.player.inventory.itemInHandIndex = this.itemInHandIndex;
- this.items = this.player.inventory.items;
- this.armor = this.player.inventory.armor;
- this.extraSlots = this.player.inventory.extraSlots;
- this.f = ImmutableList.of(this.items, this.armor, this.extraSlots);
- this.playerOnline = true;
- }
- }
-
- @Override
- public boolean a(final EntityHuman entityhuman) {
- return true;
- }
-
- @Override
- public @NotNull Inventory getBukkitInventory() {
- return inventory;
- }
-
- @Override
- public ItemStack getItem(int i) {
- List list = this.items;
-
- if (i >= list.size()) {
- i -= list.size();
- list = this.armor;
- } else {
- i = this.getReversedItemSlotNum(i);
- }
-
- if (i >= list.size()) {
- i -= list.size();
- list = this.extraSlots;
- } else if (list == this.armor) {
- i = this.getReversedArmorSlotNum(i);
- }
-
- if (i >= list.size()) {
- return ItemStack.a;
- }
-
- return list.get(i);
- }
-
- private ItemStack getRawItem(int i) {
- NonNullList list = null;
- for (NonNullList next : this.f) {
- if (i < next.size()) {
- list = next;
- break;
- }
- i -= next.size();
- }
-
- return list == null ? ItemStack.a : list.get(i);
- }
-
- @Override
- public IChatBaseComponent getDisplayName() {
- return new ChatMessage(this.player.getName());
- }
-
- @Override
- public boolean hasCustomName() {
- return false;
- }
-
- private int getReversedArmorSlotNum(final int i) {
- if (i == 0) {
- return 3;
- }
- if (i == 1) {
- return 2;
- }
- if (i == 2) {
- return 1;
- }
- if (i == 3) {
- return 0;
- }
- return i;
- }
-
- private int getReversedItemSlotNum(final int i) {
- if (i >= 27) {
- return i - 27;
- }
- return i + 9;
- }
-
- @Override
- public int getSize() {
- return super.getSize() + 4;
- }
-
- @Override
- public boolean isInUse() {
- return !this.getViewers().isEmpty();
- }
-
- @Override
- public void setItem(int i, final ItemStack itemstack) {
- List list = this.items;
-
- if (i >= list.size()) {
- i -= list.size();
- list = this.armor;
- } else {
- i = this.getReversedItemSlotNum(i);
- }
-
- if (i >= list.size()) {
- i -= list.size();
- list = this.extraSlots;
- } else if (list == this.armor) {
- i = this.getReversedArmorSlotNum(i);
- }
-
- if (i >= list.size()) {
- this.player.drop(itemstack, true);
- return;
- }
-
- list.set(i, itemstack);
- }
-
- @Override
- public void setPlayerOffline() {
- this.playerOnline = false;
- }
-
- @Override
- public ItemStack splitStack(int i, final int j) {
- NonNullList list = this.items;
-
- if (i >= list.size()) {
- i -= list.size();
- list = this.armor;
- } else {
- i = this.getReversedItemSlotNum(i);
- }
-
- if (i >= list.size()) {
- i -= list.size();
- list = this.extraSlots;
- } else if (list == this.armor) {
- i = this.getReversedArmorSlotNum(i);
- }
-
- if (i >= list.size()) {
- return ItemStack.a;
- }
-
- return list.get(i).isEmpty() ? ItemStack.a : ContainerUtil.a(list, i, j);
- }
-
- @Override
- public ItemStack splitWithoutUpdate(int i) {
- NonNullList list = this.items;
-
- if (i >= list.size()) {
- i -= list.size();
- list = this.armor;
- } else {
- i = this.getReversedItemSlotNum(i);
- }
-
- if (i >= list.size()) {
- i -= list.size();
- list = this.extraSlots;
- } else if (list == this.armor) {
- i = this.getReversedArmorSlotNum(i);
- }
-
- if (i >= list.size()) {
- return ItemStack.a;
- }
-
- if (!list.get(i).isEmpty()) {
- ItemStack itemstack = list.get(i);
-
- list.set(i, ItemStack.a);
- return itemstack;
- }
-
- return ItemStack.a;
- }
-
- public List getContents() {
- List combined = new ArrayList<>(this.items.size() + this.armor.size() + this.extraSlots.size());
-
- for (List sub : this.f) {
- combined.addAll(sub);
- }
-
- return combined;
- }
-
- public List getArmorContents() {
- return this.armor;
- }
-
- public void onOpen(CraftHumanEntity who) {
- this.transaction.add(who);
- }
-
- public void onClose(CraftHumanEntity who) {
- this.transaction.remove(who);
- }
-
- public List getViewers() {
- return this.transaction;
- }
-
- public InventoryHolder getOwner() {
- return this.player.getBukkitEntity();
- }
-
- public Location getLocation() {
- return this.player.getBukkitEntity().getLocation();
- }
-
- public ItemStack getItemInHand() {
- return e(this.itemInHandIndex) ? this.items.get(this.itemInHandIndex) : ItemStack.a;
- }
-
- public static int getHotbarSize() {
- return 9;
- }
-
- private boolean a(ItemStack itemstack, ItemStack itemstack1) {
- return !itemstack.isEmpty() && this.b(itemstack, itemstack1) && itemstack.isStackable() && itemstack.getCount() < itemstack.getMaxStackSize() && itemstack.getCount() < this.getMaxStackSize();
- }
-
- private boolean b(ItemStack itemstack, ItemStack itemstack1) {
- return itemstack.getItem() == itemstack1.getItem() && ItemStack.equals(itemstack, itemstack1);
- }
-
- public int canHold(ItemStack itemstack) {
- int remains = itemstack.getCount();
-
- for(int i = 0; i < this.items.size(); ++i) {
- ItemStack itemstack1 = this.getItem(i);
- if (itemstack1.isEmpty()) {
- return itemstack.getCount();
- }
-
- if (!this.a(itemstack, itemstack1)) {
- remains -= (itemstack1.getMaxStackSize() < this.getMaxStackSize() ? itemstack1.getMaxStackSize() : this.getMaxStackSize()) - itemstack1.getCount();
- }
-
- if (remains <= 0) {
- return itemstack.getCount();
- }
- }
-
- return itemstack.getCount() - remains;
- }
-
- public int getFirstEmptySlotIndex() {
- for(int i = 0; i < this.items.size(); ++i) {
- if (this.items.get(i).isEmpty()) {
- return i;
- }
- }
-
- return -1;
- }
-
- public void d(int i) {
- this.itemInHandIndex = this.l();
- ItemStack itemstack = this.items.get(this.itemInHandIndex);
- this.items.set(this.itemInHandIndex, this.items.get(i));
- this.items.set(i, itemstack);
- }
-
- public static boolean e(int i) {
- return i >= 0 && i < 9;
- }
-
- public int c(ItemStack itemstack) {
- for(int i = 0; i < this.items.size(); ++i) {
- ItemStack itemstack1 = this.items.get(i);
- if (!this.items.get(i).isEmpty() && this.b(itemstack, this.items.get(i)) && !this.items.get(i).f() && !itemstack1.hasEnchantments() && !itemstack1.hasName()) {
- return i;
- }
- }
-
- return -1;
- }
-
- public int l() {
- int i;
- int j;
- for(j = 0; j < 9; ++j) {
- i = (this.itemInHandIndex + j) % 9;
- if (this.items.get(i).isEmpty()) {
- return i;
- }
- }
-
- for(j = 0; j < 9; ++j) {
- i = (this.itemInHandIndex + j) % 9;
- if (!this.items.get(i).hasEnchantments()) {
- return i;
- }
- }
-
- return this.itemInHandIndex;
- }
-
- public int a(Predicate predicate, int i) {
- int j = 0;
-
- int k;
- for(k = 0; k < this.getSize(); ++k) {
- ItemStack itemstack = this.getItem(k);
- if (!itemstack.isEmpty() && predicate.test(itemstack)) {
- int l = i <= 0 ? itemstack.getCount() : Math.min(i - j, itemstack.getCount());
- j += l;
- if (i != 0) {
- itemstack.subtract(l);
- if (itemstack.isEmpty()) {
- this.setItem(k, ItemStack.a);
- }
-
- if (i > 0 && j >= i) {
- return j;
- }
- }
- }
- }
-
- if (!this.getCarried().isEmpty() && predicate.test(this.getCarried())) {
- k = i <= 0 ? this.getCarried().getCount() : Math.min(i - j, this.getCarried().getCount());
- j += k;
- if (i != 0) {
- this.getCarried().subtract(k);
- if (this.getCarried().isEmpty()) {
- this.setCarried(ItemStack.a);
- }
-
- if (i > 0 && j >= i) {
- return j;
- }
- }
- }
-
- return j;
- }
-
- private int i(ItemStack itemstack) {
- int i = this.firstPartial(itemstack);
- if (i == -1) {
- i = this.getFirstEmptySlotIndex();
- }
-
- return i == -1 ? itemstack.getCount() : this.d(i, itemstack);
- }
-
- private int d(int i, ItemStack itemstack) {
- Item item = itemstack.getItem();
- int j = itemstack.getCount();
- ItemStack itemstack1 = this.getItem(i);
- if (itemstack1.isEmpty()) {
- itemstack1 = new ItemStack(item, 0);
- if (itemstack.hasTag()) {
- itemstack1.setTag(itemstack.getTag().clone());
- }
-
- this.setItem(i, itemstack1);
- }
-
- int k = j;
- if (j > itemstack1.getMaxStackSize() - itemstack1.getCount()) {
- k = itemstack1.getMaxStackSize() - itemstack1.getCount();
- }
-
- if (k > this.getMaxStackSize() - itemstack1.getCount()) {
- k = this.getMaxStackSize() - itemstack1.getCount();
- }
-
- if (k == 0) {
- return j;
- } else {
- j -= k;
- itemstack1.add(k);
- itemstack1.d(5);
- return j;
- }
- }
-
- public int firstPartial(ItemStack itemstack) {
- if (this.a(this.getItem(this.itemInHandIndex), itemstack)) {
- return this.itemInHandIndex;
- } else if (this.a(this.getItem(40), itemstack)) {
- return 40;
- } else {
- for(int i = 0; i < this.items.size(); ++i) {
- if (this.a(this.items.get(i), itemstack)) {
- return i;
- }
- }
-
- return -1;
- }
- }
-
- public void p() {
-
- for (NonNullList itemStacks : this.f) {
- for (int i = 0; i < itemStacks.size(); ++i) {
- if (!itemStacks.get(i).isEmpty()) {
- itemStacks.get(i).a(this.player.world, this.player, i, this.itemInHandIndex == i);
- }
- }
- }
-
- }
-
- public boolean pickup(ItemStack itemstack) {
- return this.c(-1, itemstack);
- }
-
- public boolean c(int i, ItemStack itemstack) {
- if (itemstack.isEmpty()) {
- return false;
- } else {
- try {
- if (itemstack.f()) {
- if (i == -1) {
- i = this.getFirstEmptySlotIndex();
- }
-
- if (i >= 0) {
- this.items.set(i, itemstack.cloneItemStack());
- this.items.get(i).d(5);
- itemstack.setCount(0);
- return true;
- } else if (this.player.abilities.canInstantlyBuild) {
- itemstack.setCount(0);
- return true;
- } else {
- return false;
- }
- } else {
- int j;
- do {
- j = itemstack.getCount();
- if (i == -1) {
- itemstack.setCount(this.i(itemstack));
- } else {
- itemstack.setCount(this.d(i, itemstack));
- }
- } while(!itemstack.isEmpty() && itemstack.getCount() < j);
-
- if (itemstack.getCount() == j && this.player.abilities.canInstantlyBuild) {
- itemstack.setCount(0);
- return true;
- } else {
- return itemstack.getCount() < j;
- }
- }
- } catch (Throwable var6) {
- CrashReport crashreport = CrashReport.a(var6, "Adding item to inventory");
- CrashReportSystemDetails crashreportsystemdetails = crashreport.a("Item being added");
- crashreportsystemdetails.a("Item ID", Item.getId(itemstack.getItem()));
- crashreportsystemdetails.a("Item data", itemstack.getDamage());
- crashreportsystemdetails.a("Item name", () -> itemstack.getName().getString());
- throw new ReportedException(crashreport);
- }
- }
- }
-
- public void a(World world, ItemStack itemstack) {
- if (!world.isClientSide) {
- while(!itemstack.isEmpty()) {
- int i = this.firstPartial(itemstack);
- if (i == -1) {
- i = this.getFirstEmptySlotIndex();
- }
-
- if (i == -1) {
- this.player.drop(itemstack, false);
- break;
- }
-
- int j = itemstack.getMaxStackSize() - this.getItem(i).getCount();
- if (this.c(i, itemstack.cloneAndSubtract(j))) {
- ((EntityPlayer)this.player).playerConnection.sendPacket(new PacketPlayOutSetSlot(-2, i, this.getItem(i)));
- }
- }
- }
-
- }
-
- public void f(ItemStack itemstack) {
-
- for (NonNullList nonnulllist : this.f) {
- for (int i = 0; i < nonnulllist.size(); ++i) {
- if (nonnulllist.get(i) == itemstack) {
- nonnulllist.set(i, ItemStack.a);
- break;
- }
- }
- }
- }
-
- public float a(IBlockData iblockdata) {
- return this.items.get(this.itemInHandIndex).a(iblockdata);
- }
-
- public NBTTagList a(NBTTagList nbttaglist) {
- NBTTagCompound nbttagcompound;
- int i;
- for(i = 0; i < this.items.size(); ++i) {
- if (!this.items.get(i).isEmpty()) {
- nbttagcompound = new NBTTagCompound();
- nbttagcompound.setByte("Slot", (byte) i);
- this.items.get(i).save(nbttagcompound);
- nbttaglist.add(nbttagcompound);
- }
- }
-
- for(i = 0; i < this.armor.size(); ++i) {
- if (!this.armor.get(i).isEmpty()) {
- nbttagcompound = new NBTTagCompound();
- nbttagcompound.setByte("Slot", (byte) (i + 100));
- this.armor.get(i).save(nbttagcompound);
- nbttaglist.add(nbttagcompound);
- }
- }
-
- for(i = 0; i < this.extraSlots.size(); ++i) {
- if (!this.extraSlots.get(i).isEmpty()) {
- nbttagcompound = new NBTTagCompound();
- nbttagcompound.setByte("Slot", (byte) (i + 150));
- this.extraSlots.get(i).save(nbttagcompound);
- nbttaglist.add(nbttagcompound);
- }
- }
-
- return nbttaglist;
- }
-
- public void b(NBTTagList nbttaglist) {
- this.items.clear();
- this.armor.clear();
- this.extraSlots.clear();
-
- for(int i = 0; i < nbttaglist.size(); ++i) {
- NBTTagCompound nbttagcompound = nbttaglist.getCompound(i);
- int j = nbttagcompound.getByte("Slot") & 255;
- ItemStack itemstack = ItemStack.a(nbttagcompound);
- if (!itemstack.isEmpty()) {
- if (j < this.items.size()) {
- this.items.set(j, itemstack);
- } else if (j >= 100 && j < this.armor.size() + 100) {
- this.armor.set(j - 100, itemstack);
- } else if (j >= 150 && j < this.extraSlots.size() + 150) {
- this.extraSlots.set(j - 150, itemstack);
- }
- }
- }
-
- }
-
- public boolean P_() {
- Iterator iterator = this.items.iterator();
-
- ItemStack itemstack;
- while(iterator.hasNext()) {
- itemstack = (ItemStack)iterator.next();
- if (!itemstack.isEmpty()) {
- return false;
- }
- }
-
- iterator = this.armor.iterator();
-
- while(iterator.hasNext()) {
- itemstack = (ItemStack)iterator.next();
- if (!itemstack.isEmpty()) {
- return false;
- }
- }
-
- iterator = this.extraSlots.iterator();
-
- while(iterator.hasNext()) {
- itemstack = (ItemStack)iterator.next();
- if (!itemstack.isEmpty()) {
- return false;
- }
- }
-
- return true;
- }
-
- @Nullable
- public IChatBaseComponent getCustomName() {
- return null;
- }
-
- public boolean b(IBlockData iblockdata) {
- return this.getItem(this.itemInHandIndex).b(iblockdata);
- }
-
- public void a(float f) {
- if (f > 0.0F) {
- f /= 4.0F;
- if (f < 1.0F) {
- f = 1.0F;
- }
-
- for (ItemStack itemstack : this.armor) {
- if (itemstack.getItem() instanceof ItemArmor) {
- itemstack.damage((int) f, this.player);
- }
- }
- }
- }
-
- public void dropContents() {
- for (NonNullList itemStacks : this.f) {
- for (int i = 0; i < itemStacks.size(); ++i) {
- ItemStack itemstack = itemStacks.get(i);
- if (!itemstack.isEmpty()) {
- itemStacks.set(i, ItemStack.a);
- this.player.a(itemstack, true, false);
- }
- }
- }
- }
-
- public boolean h(ItemStack itemstack) {
- return this.f.stream().flatMap(NonNullList::stream).anyMatch(itemStack1 -> !itemStack1.isEmpty() && itemStack1.doMaterialsMatch(itemstack));
- }
-
- public void a(PlayerInventory playerinventory) {
- for (int i = 0; i < playerinventory.getSize(); ++i) {
- this.setItem(i, playerinventory.getItem(i));
- }
-
- this.itemInHandIndex = playerinventory.itemInHandIndex;
- }
-
- public void clear() {
- this.f.forEach(NonNullList::clear);
- }
-
- public void a(AutoRecipeStackManager autorecipestackmanager) {
- for (ItemStack itemstack : this.items) {
- autorecipestackmanager.a(itemstack);
- }
- }
-
-}