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); - } - } - -}