From e34e51d12718e0eef705b169846c0fdfab35ee79 Mon Sep 17 00:00:00 2001 From: Jikoo Date: Fri, 20 Jan 2017 12:56:31 -0500 Subject: [PATCH] Better support other Player implementations Closes #60 Removed all volatile comments - they require me to occasionally manually maintain them and NMS/OBC imports are already kept separate --- .../internal/v1_4_5/AnySilentContainer.java | 6 ++--- .../internal/v1_4_5/InventoryAccess.java | 1 - .../internal/v1_4_5/PlayerDataManager.java | 23 ++++++++++++++++++- .../internal/v1_4_5/SilentContainerChest.java | 1 - .../internal/v1_4_5/SpecialEnderChest.java | 19 +++++++-------- .../v1_4_5/SpecialPlayerInventory.java | 6 ++--- .../internal/v1_4_6/AnySilentContainer.java | 6 ++--- .../internal/v1_4_6/InventoryAccess.java | 1 - .../internal/v1_4_6/PlayerDataManager.java | 23 ++++++++++++++++++- .../internal/v1_4_6/SilentContainerChest.java | 1 - .../internal/v1_4_6/SpecialEnderChest.java | 19 +++++++-------- .../v1_4_6/SpecialPlayerInventory.java | 6 ++--- .../internal/v1_10_R1/AnySilentContainer.java | 6 ++--- .../internal/v1_10_R1/InventoryAccess.java | 1 - .../internal/v1_10_R1/PlayerDataManager.java | 23 ++++++++++++++++++- .../v1_10_R1/SilentContainerChest.java | 1 - .../internal/v1_10_R1/SpecialEnderChest.java | 21 ++++++++--------- .../v1_10_R1/SpecialPlayerInventory.java | 6 ++--- .../internal/v1_11_R1/AnySilentContainer.java | 6 ++--- .../internal/v1_11_R1/InventoryAccess.java | 1 - .../internal/v1_11_R1/PlayerDataManager.java | 23 ++++++++++++++++++- .../v1_11_R1/SilentContainerChest.java | 1 - .../internal/v1_11_R1/SpecialEnderChest.java | 21 ++++++++--------- .../v1_11_R1/SpecialPlayerInventory.java | 6 ++--- .../internal/v1_4_R1/AnySilentContainer.java | 6 ++--- .../internal/v1_4_R1/InventoryAccess.java | 1 - .../internal/v1_4_R1/PlayerDataManager.java | 23 ++++++++++++++++++- .../v1_4_R1/SilentContainerChest.java | 1 - .../internal/v1_4_R1/SpecialEnderChest.java | 19 +++++++-------- .../v1_4_R1/SpecialPlayerInventory.java | 6 ++--- .../internal/v1_5_R2/AnySilentContainer.java | 6 ++--- .../internal/v1_5_R2/InventoryAccess.java | 1 - .../internal/v1_5_R2/PlayerDataManager.java | 23 ++++++++++++++++++- .../v1_5_R2/SilentContainerChest.java | 1 - .../internal/v1_5_R2/SpecialEnderChest.java | 21 +++++++++-------- .../v1_5_R2/SpecialPlayerInventory.java | 6 ++--- .../internal/v1_5_R3/AnySilentContainer.java | 6 ++--- .../internal/v1_5_R3/InventoryAccess.java | 1 - .../internal/v1_5_R3/PlayerDataManager.java | 23 ++++++++++++++++++- .../v1_5_R3/SilentContainerChest.java | 1 - .../internal/v1_5_R3/SpecialEnderChest.java | 21 +++++++++-------- .../v1_5_R3/SpecialPlayerInventory.java | 6 ++--- .../internal/v1_6_R1/AnySilentContainer.java | 6 ++--- .../internal/v1_6_R1/InventoryAccess.java | 1 - .../internal/v1_6_R1/PlayerDataManager.java | 23 ++++++++++++++++++- .../v1_6_R1/SilentContainerChest.java | 1 - .../internal/v1_6_R1/SpecialEnderChest.java | 21 +++++++++-------- .../v1_6_R1/SpecialPlayerInventory.java | 6 ++--- .../internal/v1_6_R2/AnySilentContainer.java | 6 ++--- .../internal/v1_6_R2/InventoryAccess.java | 1 - .../internal/v1_6_R2/PlayerDataManager.java | 23 ++++++++++++++++++- .../v1_6_R2/SilentContainerChest.java | 1 - .../internal/v1_6_R2/SpecialEnderChest.java | 21 +++++++++-------- .../v1_6_R2/SpecialPlayerInventory.java | 6 ++--- .../internal/v1_6_R3/AnySilentContainer.java | 6 ++--- .../internal/v1_6_R3/InventoryAccess.java | 1 - .../internal/v1_6_R3/PlayerDataManager.java | 23 ++++++++++++++++++- .../v1_6_R3/SilentContainerChest.java | 1 - .../internal/v1_6_R3/SpecialEnderChest.java | 21 +++++++++-------- .../v1_6_R3/SpecialPlayerInventory.java | 6 ++--- .../internal/v1_7_R1/AnySilentContainer.java | 6 ++--- .../internal/v1_7_R1/InventoryAccess.java | 1 - .../internal/v1_7_R1/PlayerDataManager.java | 23 ++++++++++++++++++- .../v1_7_R1/SilentContainerChest.java | 1 - .../internal/v1_7_R1/SpecialEnderChest.java | 21 +++++++++-------- .../v1_7_R1/SpecialPlayerInventory.java | 6 ++--- .../internal/v1_7_R2/AnySilentContainer.java | 6 ++--- .../internal/v1_7_R2/InventoryAccess.java | 1 - .../internal/v1_7_R2/PlayerDataManager.java | 23 ++++++++++++++++++- .../v1_7_R2/SilentContainerChest.java | 1 - .../internal/v1_7_R2/SpecialEnderChest.java | 21 +++++++++-------- .../v1_7_R2/SpecialPlayerInventory.java | 6 ++--- .../internal/v1_7_R3/AnySilentContainer.java | 6 ++--- .../internal/v1_7_R3/InventoryAccess.java | 1 - .../internal/v1_7_R3/PlayerDataManager.java | 23 ++++++++++++++++++- .../v1_7_R3/SilentContainerChest.java | 1 - .../internal/v1_7_R3/SpecialEnderChest.java | 21 +++++++++-------- .../v1_7_R3/SpecialPlayerInventory.java | 6 ++--- .../internal/v1_7_R4/AnySilentContainer.java | 6 ++--- .../internal/v1_7_R4/InventoryAccess.java | 1 - .../internal/v1_7_R4/PlayerDataManager.java | 23 ++++++++++++++++++- .../v1_7_R4/SilentContainerChest.java | 1 - .../internal/v1_7_R4/SpecialEnderChest.java | 21 +++++++++-------- .../v1_7_R4/SpecialPlayerInventory.java | 6 ++--- .../internal/v1_8_R1/AnySilentContainer.java | 6 ++--- .../internal/v1_8_R1/InventoryAccess.java | 1 - .../internal/v1_8_R1/PlayerDataManager.java | 23 ++++++++++++++++++- .../v1_8_R1/SilentContainerChest.java | 1 - .../internal/v1_8_R1/SpecialEnderChest.java | 21 ++++++++--------- .../v1_8_R1/SpecialPlayerInventory.java | 6 ++--- .../internal/v1_8_R2/AnySilentContainer.java | 6 ++--- .../internal/v1_8_R2/InventoryAccess.java | 1 - .../internal/v1_8_R2/PlayerDataManager.java | 23 ++++++++++++++++++- .../v1_8_R2/SilentContainerChest.java | 1 - .../internal/v1_8_R2/SpecialEnderChest.java | 21 ++++++++--------- .../v1_8_R2/SpecialPlayerInventory.java | 6 ++--- .../internal/v1_8_R3/AnySilentContainer.java | 6 ++--- .../internal/v1_8_R3/InventoryAccess.java | 1 - .../internal/v1_8_R3/PlayerDataManager.java | 23 ++++++++++++++++++- .../v1_8_R3/SilentContainerChest.java | 1 - .../internal/v1_8_R3/SpecialEnderChest.java | 21 ++++++++--------- .../v1_8_R3/SpecialPlayerInventory.java | 6 ++--- .../internal/v1_9_R1/AnySilentContainer.java | 6 ++--- .../internal/v1_9_R1/InventoryAccess.java | 1 - .../internal/v1_9_R1/PlayerDataManager.java | 23 ++++++++++++++++++- .../v1_9_R1/SilentContainerChest.java | 1 - .../internal/v1_9_R1/SpecialEnderChest.java | 21 ++++++++--------- .../v1_9_R1/SpecialPlayerInventory.java | 6 ++--- .../internal/v1_9_R2/AnySilentContainer.java | 6 ++--- .../internal/v1_9_R2/InventoryAccess.java | 1 - .../internal/v1_9_R2/PlayerDataManager.java | 23 ++++++++++++++++++- .../v1_9_R2/SilentContainerChest.java | 1 - .../internal/v1_9_R2/SpecialEnderChest.java | 21 ++++++++--------- .../v1_9_R2/SpecialPlayerInventory.java | 6 ++--- 114 files changed, 693 insertions(+), 403 deletions(-) diff --git a/internal/1_4_5/src/main/java/com/lishid/openinv/internal/v1_4_5/AnySilentContainer.java b/internal/1_4_5/src/main/java/com/lishid/openinv/internal/v1_4_5/AnySilentContainer.java index be34e71..55ea5d7 100644 --- a/internal/1_4_5/src/main/java/com/lishid/openinv/internal/v1_4_5/AnySilentContainer.java +++ b/internal/1_4_5/src/main/java/com/lishid/openinv/internal/v1_4_5/AnySilentContainer.java @@ -22,7 +22,6 @@ import org.bukkit.ChatColor; import org.bukkit.Material; import org.bukkit.entity.Player; -// Volatile import net.minecraft.server.v1_4_5.AxisAlignedBB; import net.minecraft.server.v1_4_5.BlockEnderChest; import net.minecraft.server.v1_4_5.Container; @@ -36,7 +35,6 @@ import net.minecraft.server.v1_4_5.TileEntityChest; import net.minecraft.server.v1_4_5.TileEntityEnderChest; import net.minecraft.server.v1_4_5.World; -import org.bukkit.craftbukkit.v1_4_5.entity.CraftPlayer; import org.bukkit.craftbukkit.v1_4_5.event.CraftEventFactory; public class AnySilentContainer implements IAnySilentContainer { @@ -49,7 +47,7 @@ public class AnySilentContainer implements IAnySilentContainer { @Override public boolean isAnyContainerNeeded(Player p, org.bukkit.block.Block block) { // FOR REFERENCE, LOOK AT net.minecraft.server.BlockChest - EntityPlayer player = ((CraftPlayer) p).getHandle(); + EntityPlayer player = PlayerDataManager.getHandle(p); World world = player.world; if (block instanceof BlockEnderChest) { @@ -97,7 +95,7 @@ public class AnySilentContainer implements IAnySilentContainer { @Override public boolean activateContainer(Player p, boolean silentchest, org.bukkit.block.Block block) { - EntityPlayer player = ((CraftPlayer) p).getHandle(); + EntityPlayer player = PlayerDataManager.getHandle(p); // Silent ender chest is API-only if (silentchest && block.getType() == Material.ENDER_CHEST) { diff --git a/internal/1_4_5/src/main/java/com/lishid/openinv/internal/v1_4_5/InventoryAccess.java b/internal/1_4_5/src/main/java/com/lishid/openinv/internal/v1_4_5/InventoryAccess.java index 802b914..471fc75 100644 --- a/internal/1_4_5/src/main/java/com/lishid/openinv/internal/v1_4_5/InventoryAccess.java +++ b/internal/1_4_5/src/main/java/com/lishid/openinv/internal/v1_4_5/InventoryAccess.java @@ -23,7 +23,6 @@ import com.lishid.openinv.util.InternalAccessor; import org.bukkit.inventory.Inventory; -// Volatile import net.minecraft.server.v1_4_5.IInventory; import org.bukkit.craftbukkit.v1_4_5.inventory.CraftInventory; diff --git a/internal/1_4_5/src/main/java/com/lishid/openinv/internal/v1_4_5/PlayerDataManager.java b/internal/1_4_5/src/main/java/com/lishid/openinv/internal/v1_4_5/PlayerDataManager.java index 104b282..c9a126a 100644 --- a/internal/1_4_5/src/main/java/com/lishid/openinv/internal/v1_4_5/PlayerDataManager.java +++ b/internal/1_4_5/src/main/java/com/lishid/openinv/internal/v1_4_5/PlayerDataManager.java @@ -23,14 +23,15 @@ import com.lishid.openinv.internal.IPlayerDataManager; import org.bukkit.Bukkit; import org.bukkit.OfflinePlayer; +import org.bukkit.Server; import org.bukkit.entity.Player; -// Volatile import net.minecraft.server.v1_4_5.EntityPlayer; import net.minecraft.server.v1_4_5.ItemInWorldManager; import net.minecraft.server.v1_4_5.MinecraftServer; import org.bukkit.craftbukkit.v1_4_5.CraftServer; +import org.bukkit.craftbukkit.v1_4_5.entity.CraftPlayer; public class PlayerDataManager implements IPlayerDataManager { @@ -77,4 +78,24 @@ public class PlayerDataManager implements IPlayerDataManager { return Arrays.asList(Bukkit.getOnlinePlayers()); } + public static EntityPlayer getHandle(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().f(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; + } + } diff --git a/internal/1_4_5/src/main/java/com/lishid/openinv/internal/v1_4_5/SilentContainerChest.java b/internal/1_4_5/src/main/java/com/lishid/openinv/internal/v1_4_5/SilentContainerChest.java index 0405f7a..fd3e707 100644 --- a/internal/1_4_5/src/main/java/com/lishid/openinv/internal/v1_4_5/SilentContainerChest.java +++ b/internal/1_4_5/src/main/java/com/lishid/openinv/internal/v1_4_5/SilentContainerChest.java @@ -16,7 +16,6 @@ package com.lishid.openinv.internal.v1_4_5; -// Volatile import net.minecraft.server.v1_4_5.ContainerChest; import net.minecraft.server.v1_4_5.EntityHuman; import net.minecraft.server.v1_4_5.IInventory; diff --git a/internal/1_4_5/src/main/java/com/lishid/openinv/internal/v1_4_5/SpecialEnderChest.java b/internal/1_4_5/src/main/java/com/lishid/openinv/internal/v1_4_5/SpecialEnderChest.java index abedc51..ab2cb5c 100644 --- a/internal/1_4_5/src/main/java/com/lishid/openinv/internal/v1_4_5/SpecialEnderChest.java +++ b/internal/1_4_5/src/main/java/com/lishid/openinv/internal/v1_4_5/SpecialEnderChest.java @@ -27,7 +27,7 @@ import org.bukkit.entity.Player; import org.bukkit.inventory.Inventory; import org.bukkit.inventory.InventoryHolder; -// Volatile +import net.minecraft.server.v1_4_5.EntityPlayer; import net.minecraft.server.v1_4_5.IInventory; import net.minecraft.server.v1_4_5.InventoryEnderChest; import net.minecraft.server.v1_4_5.InventorySubcontainer; @@ -46,12 +46,12 @@ public class SpecialEnderChest extends InventorySubcontainer implements IInvento private CraftPlayer owner; private int maxStack = MAX_STACK; - public SpecialEnderChest(Player p, Boolean online) { - super(((CraftPlayer) p).getHandle().getEnderChest().getName(), - ((CraftPlayer) p).getHandle().getEnderChest().getSize()); - CraftPlayer player = (CraftPlayer) p; - this.enderChest = player.getHandle().getEnderChest(); - this.owner = player; + public SpecialEnderChest(Player player, Boolean online) { + super(((CraftPlayer) player).getHandle().getEnderChest().getName(), + ((CraftPlayer) player).getHandle().getEnderChest().getSize()); + EntityPlayer nmsPlayer = PlayerDataManager.getHandle(player); + this.enderChest = nmsPlayer.getEnderChest(); + this.owner = nmsPlayer.getBukkitEntity(); this.items = enderChest.getContents(); } @@ -64,8 +64,9 @@ public class SpecialEnderChest extends InventorySubcontainer implements IInvento public void setPlayerOnline(Player player) { if (!playerOnline) { try { - owner = (CraftPlayer) player; - InventoryEnderChest playerEnderChest = owner.getHandle().getEnderChest(); + EntityPlayer nmsPlayer = PlayerDataManager.getHandle(player); + this.owner = nmsPlayer.getBukkitEntity(); + InventoryEnderChest playerEnderChest = nmsPlayer.getEnderChest(); Field field = playerEnderChest.getClass().getField("items"); field.setAccessible(true); field.set(playerEnderChest, this.items); diff --git a/internal/1_4_5/src/main/java/com/lishid/openinv/internal/v1_4_5/SpecialPlayerInventory.java b/internal/1_4_5/src/main/java/com/lishid/openinv/internal/v1_4_5/SpecialPlayerInventory.java index b989c48..fcf3231 100644 --- a/internal/1_4_5/src/main/java/com/lishid/openinv/internal/v1_4_5/SpecialPlayerInventory.java +++ b/internal/1_4_5/src/main/java/com/lishid/openinv/internal/v1_4_5/SpecialPlayerInventory.java @@ -21,11 +21,9 @@ import com.lishid.openinv.internal.ISpecialPlayerInventory; import org.bukkit.entity.Player; import org.bukkit.inventory.Inventory; -// Volatile import net.minecraft.server.v1_4_5.ItemStack; import net.minecraft.server.v1_4_5.PlayerInventory; -import org.bukkit.craftbukkit.v1_4_5.entity.CraftPlayer; import org.bukkit.craftbukkit.v1_4_5.inventory.CraftInventory; public class SpecialPlayerInventory extends PlayerInventory implements ISpecialPlayerInventory { @@ -35,7 +33,7 @@ public class SpecialPlayerInventory extends PlayerInventory implements ISpecialP private boolean playerOnline = false; public SpecialPlayerInventory(Player bukkitPlayer, Boolean online) { - super(((CraftPlayer) bukkitPlayer).getHandle()); + super(PlayerDataManager.getHandle(bukkitPlayer)); this.playerOnline = online; this.items = player.inventory.items; this.armor = player.inventory.armor; @@ -49,7 +47,7 @@ public class SpecialPlayerInventory extends PlayerInventory implements ISpecialP @Override public void setPlayerOnline(Player player) { if (!playerOnline) { - this.player = ((CraftPlayer) player).getHandle(); + this.player = PlayerDataManager.getHandle(player); this.player.inventory.items = this.items; this.player.inventory.armor = this.armor; playerOnline = true; diff --git a/internal/1_4_6/src/main/java/com/lishid/openinv/internal/v1_4_6/AnySilentContainer.java b/internal/1_4_6/src/main/java/com/lishid/openinv/internal/v1_4_6/AnySilentContainer.java index 20a33a1..14d440c 100644 --- a/internal/1_4_6/src/main/java/com/lishid/openinv/internal/v1_4_6/AnySilentContainer.java +++ b/internal/1_4_6/src/main/java/com/lishid/openinv/internal/v1_4_6/AnySilentContainer.java @@ -22,7 +22,6 @@ import org.bukkit.ChatColor; import org.bukkit.Material; import org.bukkit.entity.Player; -// Volatile import net.minecraft.server.v1_4_6.AxisAlignedBB; import net.minecraft.server.v1_4_6.BlockEnderChest; import net.minecraft.server.v1_4_6.Container; @@ -36,7 +35,6 @@ import net.minecraft.server.v1_4_6.TileEntityChest; import net.minecraft.server.v1_4_6.TileEntityEnderChest; import net.minecraft.server.v1_4_6.World; -import org.bukkit.craftbukkit.v1_4_6.entity.CraftPlayer; import org.bukkit.craftbukkit.v1_4_6.event.CraftEventFactory; public class AnySilentContainer implements IAnySilentContainer { @@ -49,7 +47,7 @@ public class AnySilentContainer implements IAnySilentContainer { @Override public boolean isAnyContainerNeeded(Player p, org.bukkit.block.Block block) { // FOR REFERENCE, LOOK AT net.minecraft.server.BlockChest - EntityPlayer player = ((CraftPlayer) p).getHandle(); + EntityPlayer player = PlayerDataManager.getHandle(p); World world = player.world; if (block instanceof BlockEnderChest) { @@ -97,7 +95,7 @@ public class AnySilentContainer implements IAnySilentContainer { @Override public boolean activateContainer(Player p, boolean silentchest, org.bukkit.block.Block block) { - EntityPlayer player = ((CraftPlayer) p).getHandle(); + EntityPlayer player = PlayerDataManager.getHandle(p); // Silent ender chest is API-only if (silentchest && block.getType() == Material.ENDER_CHEST) { diff --git a/internal/1_4_6/src/main/java/com/lishid/openinv/internal/v1_4_6/InventoryAccess.java b/internal/1_4_6/src/main/java/com/lishid/openinv/internal/v1_4_6/InventoryAccess.java index 5d0e844..2fc37fc 100644 --- a/internal/1_4_6/src/main/java/com/lishid/openinv/internal/v1_4_6/InventoryAccess.java +++ b/internal/1_4_6/src/main/java/com/lishid/openinv/internal/v1_4_6/InventoryAccess.java @@ -23,7 +23,6 @@ import com.lishid.openinv.util.InternalAccessor; import org.bukkit.inventory.Inventory; -// Volatile import net.minecraft.server.v1_4_6.IInventory; import org.bukkit.craftbukkit.v1_4_6.inventory.CraftInventory; diff --git a/internal/1_4_6/src/main/java/com/lishid/openinv/internal/v1_4_6/PlayerDataManager.java b/internal/1_4_6/src/main/java/com/lishid/openinv/internal/v1_4_6/PlayerDataManager.java index 38c91c2..e708908 100644 --- a/internal/1_4_6/src/main/java/com/lishid/openinv/internal/v1_4_6/PlayerDataManager.java +++ b/internal/1_4_6/src/main/java/com/lishid/openinv/internal/v1_4_6/PlayerDataManager.java @@ -23,14 +23,15 @@ import com.lishid.openinv.internal.IPlayerDataManager; import org.bukkit.Bukkit; import org.bukkit.OfflinePlayer; +import org.bukkit.Server; import org.bukkit.entity.Player; -// Volatile import net.minecraft.server.v1_4_6.EntityPlayer; import net.minecraft.server.v1_4_6.MinecraftServer; import net.minecraft.server.v1_4_6.PlayerInteractManager; import org.bukkit.craftbukkit.v1_4_6.CraftServer; +import org.bukkit.craftbukkit.v1_4_6.entity.CraftPlayer; public class PlayerDataManager implements IPlayerDataManager { @@ -77,4 +78,24 @@ public class PlayerDataManager implements IPlayerDataManager { return Arrays.asList(Bukkit.getOnlinePlayers()); } + public static EntityPlayer getHandle(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().f(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; + } + } diff --git a/internal/1_4_6/src/main/java/com/lishid/openinv/internal/v1_4_6/SilentContainerChest.java b/internal/1_4_6/src/main/java/com/lishid/openinv/internal/v1_4_6/SilentContainerChest.java index c613a7b..93e1589 100644 --- a/internal/1_4_6/src/main/java/com/lishid/openinv/internal/v1_4_6/SilentContainerChest.java +++ b/internal/1_4_6/src/main/java/com/lishid/openinv/internal/v1_4_6/SilentContainerChest.java @@ -16,7 +16,6 @@ package com.lishid.openinv.internal.v1_4_6; -// Volatile import net.minecraft.server.v1_4_6.ContainerChest; import net.minecraft.server.v1_4_6.EntityHuman; import net.minecraft.server.v1_4_6.IInventory; diff --git a/internal/1_4_6/src/main/java/com/lishid/openinv/internal/v1_4_6/SpecialEnderChest.java b/internal/1_4_6/src/main/java/com/lishid/openinv/internal/v1_4_6/SpecialEnderChest.java index b863941..e019d03 100644 --- a/internal/1_4_6/src/main/java/com/lishid/openinv/internal/v1_4_6/SpecialEnderChest.java +++ b/internal/1_4_6/src/main/java/com/lishid/openinv/internal/v1_4_6/SpecialEnderChest.java @@ -27,7 +27,7 @@ import org.bukkit.entity.Player; import org.bukkit.inventory.Inventory; import org.bukkit.inventory.InventoryHolder; -// Volatile +import net.minecraft.server.v1_4_6.EntityPlayer; import net.minecraft.server.v1_4_6.IInventory; import net.minecraft.server.v1_4_6.InventoryEnderChest; import net.minecraft.server.v1_4_6.InventorySubcontainer; @@ -46,12 +46,12 @@ public class SpecialEnderChest extends InventorySubcontainer implements IInvento private CraftPlayer owner; private int maxStack = MAX_STACK; - public SpecialEnderChest(Player p, Boolean online) { - super(((CraftPlayer) p).getHandle().getEnderChest().getName(), - ((CraftPlayer) p).getHandle().getEnderChest().getSize()); - CraftPlayer player = (CraftPlayer) p; - this.enderChest = player.getHandle().getEnderChest(); - this.owner = player; + public SpecialEnderChest(Player player, Boolean online) { + super(((CraftPlayer) player).getHandle().getEnderChest().getName(), + ((CraftPlayer) player).getHandle().getEnderChest().getSize()); + EntityPlayer nmsPlayer = PlayerDataManager.getHandle(player); + this.enderChest = nmsPlayer.getEnderChest(); + this.owner = nmsPlayer.getBukkitEntity(); this.items = enderChest.getContents(); } @@ -64,8 +64,9 @@ public class SpecialEnderChest extends InventorySubcontainer implements IInvento public void setPlayerOnline(Player player) { if (!playerOnline) { try { - owner = (CraftPlayer) player; - InventoryEnderChest playerEnderChest = owner.getHandle().getEnderChest(); + EntityPlayer nmsPlayer = PlayerDataManager.getHandle(player); + this.owner = nmsPlayer.getBukkitEntity(); + InventoryEnderChest playerEnderChest = nmsPlayer.getEnderChest(); Field field = playerEnderChest.getClass().getField("items"); field.setAccessible(true); field.set(playerEnderChest, this.items); diff --git a/internal/1_4_6/src/main/java/com/lishid/openinv/internal/v1_4_6/SpecialPlayerInventory.java b/internal/1_4_6/src/main/java/com/lishid/openinv/internal/v1_4_6/SpecialPlayerInventory.java index 42fa710..722ec74 100644 --- a/internal/1_4_6/src/main/java/com/lishid/openinv/internal/v1_4_6/SpecialPlayerInventory.java +++ b/internal/1_4_6/src/main/java/com/lishid/openinv/internal/v1_4_6/SpecialPlayerInventory.java @@ -21,11 +21,9 @@ import com.lishid.openinv.internal.ISpecialPlayerInventory; import org.bukkit.entity.Player; import org.bukkit.inventory.Inventory; -// Volatile import net.minecraft.server.v1_4_6.ItemStack; import net.minecraft.server.v1_4_6.PlayerInventory; -import org.bukkit.craftbukkit.v1_4_6.entity.CraftPlayer; import org.bukkit.craftbukkit.v1_4_6.inventory.CraftInventory; public class SpecialPlayerInventory extends PlayerInventory implements ISpecialPlayerInventory { @@ -35,7 +33,7 @@ public class SpecialPlayerInventory extends PlayerInventory implements ISpecialP private boolean playerOnline = false; public SpecialPlayerInventory(Player bukkitPlayer, Boolean online) { - super(((CraftPlayer) bukkitPlayer).getHandle()); + super(PlayerDataManager.getHandle(bukkitPlayer)); this.playerOnline = online; this.items = player.inventory.items; this.armor = player.inventory.armor; @@ -49,7 +47,7 @@ public class SpecialPlayerInventory extends PlayerInventory implements ISpecialP @Override public void setPlayerOnline(Player player) { if (!playerOnline) { - this.player = ((CraftPlayer) player).getHandle(); + this.player = PlayerDataManager.getHandle(player); this.player.inventory.items = this.items; this.player.inventory.armor = this.armor; playerOnline = true; diff --git a/internal/v1_10_R1/src/main/java/com/lishid/openinv/internal/v1_10_R1/AnySilentContainer.java b/internal/v1_10_R1/src/main/java/com/lishid/openinv/internal/v1_10_R1/AnySilentContainer.java index 8dca3aa..66182f1 100644 --- a/internal/v1_10_R1/src/main/java/com/lishid/openinv/internal/v1_10_R1/AnySilentContainer.java +++ b/internal/v1_10_R1/src/main/java/com/lishid/openinv/internal/v1_10_R1/AnySilentContainer.java @@ -22,7 +22,6 @@ import org.bukkit.ChatColor; import org.bukkit.Material; import org.bukkit.entity.Player; -// Volatile import net.minecraft.server.v1_10_R1.AxisAlignedBB; import net.minecraft.server.v1_10_R1.Block; import net.minecraft.server.v1_10_R1.BlockChest; @@ -43,7 +42,6 @@ import net.minecraft.server.v1_10_R1.TileEntityChest; import net.minecraft.server.v1_10_R1.TileEntityEnderChest; import net.minecraft.server.v1_10_R1.World; -import org.bukkit.craftbukkit.v1_10_R1.entity.CraftPlayer; import org.bukkit.craftbukkit.v1_10_R1.event.CraftEventFactory; public class AnySilentContainer implements IAnySilentContainer { @@ -55,7 +53,7 @@ public class AnySilentContainer implements IAnySilentContainer { @Override public boolean isAnyContainerNeeded(Player p, org.bukkit.block.Block b) { - EntityPlayer player = ((CraftPlayer) p).getHandle(); + EntityPlayer player = PlayerDataManager.getHandle(p); World world = player.world; BlockPosition blockPosition = new BlockPosition(b.getX(), b.getY(), b.getZ()); Block block = world.getType(blockPosition).getBlock(); @@ -114,7 +112,7 @@ public class AnySilentContainer implements IAnySilentContainer { @Override public boolean activateContainer(Player p, boolean silentchest, org.bukkit.block.Block b) { - EntityPlayer player = ((CraftPlayer) p).getHandle(); + EntityPlayer player = PlayerDataManager.getHandle(p); // Silent ender chest is pretty much API-only if (silentchest && b.getType() == Material.ENDER_CHEST) { diff --git a/internal/v1_10_R1/src/main/java/com/lishid/openinv/internal/v1_10_R1/InventoryAccess.java b/internal/v1_10_R1/src/main/java/com/lishid/openinv/internal/v1_10_R1/InventoryAccess.java index 8e7e028..ae1e7b3 100644 --- a/internal/v1_10_R1/src/main/java/com/lishid/openinv/internal/v1_10_R1/InventoryAccess.java +++ b/internal/v1_10_R1/src/main/java/com/lishid/openinv/internal/v1_10_R1/InventoryAccess.java @@ -23,7 +23,6 @@ import com.lishid.openinv.util.InternalAccessor; import org.bukkit.inventory.Inventory; -// Volatile import net.minecraft.server.v1_10_R1.IInventory; import org.bukkit.craftbukkit.v1_10_R1.inventory.CraftInventory; diff --git a/internal/v1_10_R1/src/main/java/com/lishid/openinv/internal/v1_10_R1/PlayerDataManager.java b/internal/v1_10_R1/src/main/java/com/lishid/openinv/internal/v1_10_R1/PlayerDataManager.java index 1b784fd..ca18f6f 100644 --- a/internal/v1_10_R1/src/main/java/com/lishid/openinv/internal/v1_10_R1/PlayerDataManager.java +++ b/internal/v1_10_R1/src/main/java/com/lishid/openinv/internal/v1_10_R1/PlayerDataManager.java @@ -25,14 +25,15 @@ import com.mojang.authlib.GameProfile; import org.bukkit.Bukkit; import org.bukkit.OfflinePlayer; +import org.bukkit.Server; import org.bukkit.entity.Player; -// Volatile import net.minecraft.server.v1_10_R1.EntityPlayer; import net.minecraft.server.v1_10_R1.MinecraftServer; import net.minecraft.server.v1_10_R1.PlayerInteractManager; import org.bukkit.craftbukkit.v1_10_R1.CraftServer; +import org.bukkit.craftbukkit.v1_10_R1.entity.CraftPlayer; public class PlayerDataManager implements IPlayerDataManager { @@ -85,4 +86,24 @@ public class PlayerDataManager implements IPlayerDataManager { return Bukkit.getOnlinePlayers(); } + public static EntityPlayer getHandle(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; + } + } diff --git a/internal/v1_10_R1/src/main/java/com/lishid/openinv/internal/v1_10_R1/SilentContainerChest.java b/internal/v1_10_R1/src/main/java/com/lishid/openinv/internal/v1_10_R1/SilentContainerChest.java index 0185618..8705bc3 100644 --- a/internal/v1_10_R1/src/main/java/com/lishid/openinv/internal/v1_10_R1/SilentContainerChest.java +++ b/internal/v1_10_R1/src/main/java/com/lishid/openinv/internal/v1_10_R1/SilentContainerChest.java @@ -16,7 +16,6 @@ package com.lishid.openinv.internal.v1_10_R1; -// Volatile import net.minecraft.server.v1_10_R1.ContainerChest; import net.minecraft.server.v1_10_R1.EntityHuman; import net.minecraft.server.v1_10_R1.IInventory; diff --git a/internal/v1_10_R1/src/main/java/com/lishid/openinv/internal/v1_10_R1/SpecialEnderChest.java b/internal/v1_10_R1/src/main/java/com/lishid/openinv/internal/v1_10_R1/SpecialEnderChest.java index aabdde3..66adece 100644 --- a/internal/v1_10_R1/src/main/java/com/lishid/openinv/internal/v1_10_R1/SpecialEnderChest.java +++ b/internal/v1_10_R1/src/main/java/com/lishid/openinv/internal/v1_10_R1/SpecialEnderChest.java @@ -24,13 +24,12 @@ import com.lishid.openinv.internal.ISpecialEnderChest; import org.bukkit.entity.Player; import org.bukkit.inventory.Inventory; -// Volatile +import net.minecraft.server.v1_10_R1.EntityPlayer; import net.minecraft.server.v1_10_R1.IInventory; import net.minecraft.server.v1_10_R1.InventoryEnderChest; import net.minecraft.server.v1_10_R1.InventorySubcontainer; import net.minecraft.server.v1_10_R1.ItemStack; -import org.bukkit.craftbukkit.v1_10_R1.entity.CraftPlayer; import org.bukkit.craftbukkit.v1_10_R1.inventory.CraftInventory; public class SpecialEnderChest extends InventorySubcontainer implements IInventory, ISpecialEnderChest { @@ -40,12 +39,12 @@ public class SpecialEnderChest extends InventorySubcontainer implements IInvento private boolean playerOnline = false; public SpecialEnderChest(Player player, Boolean online) { - super(((CraftPlayer) player).getHandle().getEnderChest().getName(), - ((CraftPlayer) player).getHandle().getEnderChest().hasCustomName(), - ((CraftPlayer) player).getHandle().getEnderChest().getSize()); - CraftPlayer craftPlayer = (CraftPlayer) player; - this.enderChest = craftPlayer.getHandle().getEnderChest(); - this.bukkitOwner = craftPlayer; + super(PlayerDataManager.getHandle(player).getEnderChest().getName(), + PlayerDataManager.getHandle(player).getEnderChest().hasCustomName(), + PlayerDataManager.getHandle(player).getEnderChest().getSize()); + EntityPlayer nmsPlayer = PlayerDataManager.getHandle(player); + this.enderChest = nmsPlayer.getEnderChest(); + this.bukkitOwner = nmsPlayer.getBukkitEntity(); setItemArrays(this, enderChest.getContents()); } @@ -78,9 +77,9 @@ public class SpecialEnderChest extends InventorySubcontainer implements IInvento public void setPlayerOnline(Player player) { if (!playerOnline) { try { - this.bukkitOwner = player; - CraftPlayer craftPlayer = (CraftPlayer) player; - setItemArrays(craftPlayer.getHandle().getEnderChest(), this.items); + EntityPlayer nmsPlayer = PlayerDataManager.getHandle(player); + this.bukkitOwner = nmsPlayer.getBukkitEntity(); + setItemArrays(nmsPlayer.getEnderChest(), this.items); } catch (Exception e) {} playerOnline = true; } diff --git a/internal/v1_10_R1/src/main/java/com/lishid/openinv/internal/v1_10_R1/SpecialPlayerInventory.java b/internal/v1_10_R1/src/main/java/com/lishid/openinv/internal/v1_10_R1/SpecialPlayerInventory.java index db86309..de99b24 100644 --- a/internal/v1_10_R1/src/main/java/com/lishid/openinv/internal/v1_10_R1/SpecialPlayerInventory.java +++ b/internal/v1_10_R1/src/main/java/com/lishid/openinv/internal/v1_10_R1/SpecialPlayerInventory.java @@ -24,12 +24,10 @@ import com.lishid.openinv.internal.ISpecialPlayerInventory; import org.bukkit.entity.Player; import org.bukkit.inventory.Inventory; -// Volatile import net.minecraft.server.v1_10_R1.EntityHuman; import net.minecraft.server.v1_10_R1.ItemStack; import net.minecraft.server.v1_10_R1.PlayerInventory; -import org.bukkit.craftbukkit.v1_10_R1.entity.CraftPlayer; import org.bukkit.craftbukkit.v1_10_R1.inventory.CraftInventory; public class SpecialPlayerInventory extends PlayerInventory implements ISpecialPlayerInventory { @@ -39,7 +37,7 @@ public class SpecialPlayerInventory extends PlayerInventory implements ISpecialP private boolean playerOnline = false; public SpecialPlayerInventory(Player bukkitPlayer, Boolean online) { - super(((CraftPlayer) bukkitPlayer).getHandle()); + super(PlayerDataManager.getHandle(bukkitPlayer)); this.playerOnline = online; setItemArrays(this, player.inventory.items, player.inventory.armor, player.inventory.extraSlots); } @@ -89,7 +87,7 @@ public class SpecialPlayerInventory extends PlayerInventory implements ISpecialP @Override public void setPlayerOnline(Player player) { if (!playerOnline) { - this.player = ((CraftPlayer) player).getHandle(); + this.player = PlayerDataManager.getHandle(player); setItemArrays(this.player.inventory, items, armor, extraSlots); playerOnline = true; } diff --git a/internal/v1_11_R1/src/main/java/com/lishid/openinv/internal/v1_11_R1/AnySilentContainer.java b/internal/v1_11_R1/src/main/java/com/lishid/openinv/internal/v1_11_R1/AnySilentContainer.java index 5464f35..98ec7c0 100644 --- a/internal/v1_11_R1/src/main/java/com/lishid/openinv/internal/v1_11_R1/AnySilentContainer.java +++ b/internal/v1_11_R1/src/main/java/com/lishid/openinv/internal/v1_11_R1/AnySilentContainer.java @@ -25,7 +25,6 @@ import org.bukkit.block.BlockState; import org.bukkit.entity.Player; import org.bukkit.scheduler.BukkitRunnable; -// Volatile import net.minecraft.server.v1_11_R1.AxisAlignedBB; import net.minecraft.server.v1_11_R1.Block; import net.minecraft.server.v1_11_R1.BlockChest; @@ -49,7 +48,6 @@ import net.minecraft.server.v1_11_R1.TileEntityEnderChest; import net.minecraft.server.v1_11_R1.TileEntityShulkerBox; import net.minecraft.server.v1_11_R1.World; -import org.bukkit.craftbukkit.v1_11_R1.entity.CraftPlayer; import org.bukkit.craftbukkit.v1_11_R1.event.CraftEventFactory; public class AnySilentContainer implements IAnySilentContainer { @@ -65,7 +63,7 @@ public class AnySilentContainer implements IAnySilentContainer { @Override public boolean isAnyContainerNeeded(Player p, org.bukkit.block.Block b) { - EntityPlayer player = ((CraftPlayer) p).getHandle(); + EntityPlayer player = PlayerDataManager.getHandle(p); World world = player.world; BlockPosition blockPosition = new BlockPosition(b.getX(), b.getY(), b.getZ()); IBlockData blockData = world.getType(blockPosition); @@ -156,7 +154,7 @@ public class AnySilentContainer implements IAnySilentContainer { @Override public boolean activateContainer(Player p, boolean silentchest, org.bukkit.block.Block b) { - EntityPlayer player = ((CraftPlayer) p).getHandle(); + EntityPlayer player = PlayerDataManager.getHandle(p); // Silent ender chest is pretty much API-only if (silentchest && b.getType() == Material.ENDER_CHEST) { diff --git a/internal/v1_11_R1/src/main/java/com/lishid/openinv/internal/v1_11_R1/InventoryAccess.java b/internal/v1_11_R1/src/main/java/com/lishid/openinv/internal/v1_11_R1/InventoryAccess.java index 346d82b..730e83a 100644 --- a/internal/v1_11_R1/src/main/java/com/lishid/openinv/internal/v1_11_R1/InventoryAccess.java +++ b/internal/v1_11_R1/src/main/java/com/lishid/openinv/internal/v1_11_R1/InventoryAccess.java @@ -23,7 +23,6 @@ import com.lishid.openinv.util.InternalAccessor; import org.bukkit.inventory.Inventory; -// Volatile import net.minecraft.server.v1_11_R1.IInventory; import org.bukkit.craftbukkit.v1_11_R1.inventory.CraftInventory; diff --git a/internal/v1_11_R1/src/main/java/com/lishid/openinv/internal/v1_11_R1/PlayerDataManager.java b/internal/v1_11_R1/src/main/java/com/lishid/openinv/internal/v1_11_R1/PlayerDataManager.java index cc376ad..af39f4b 100644 --- a/internal/v1_11_R1/src/main/java/com/lishid/openinv/internal/v1_11_R1/PlayerDataManager.java +++ b/internal/v1_11_R1/src/main/java/com/lishid/openinv/internal/v1_11_R1/PlayerDataManager.java @@ -25,14 +25,15 @@ import com.mojang.authlib.GameProfile; import org.bukkit.Bukkit; import org.bukkit.OfflinePlayer; +import org.bukkit.Server; import org.bukkit.entity.Player; -// Volatile import net.minecraft.server.v1_11_R1.EntityPlayer; import net.minecraft.server.v1_11_R1.MinecraftServer; import net.minecraft.server.v1_11_R1.PlayerInteractManager; import org.bukkit.craftbukkit.v1_11_R1.CraftServer; +import org.bukkit.craftbukkit.v1_11_R1.entity.CraftPlayer; public class PlayerDataManager implements IPlayerDataManager { @@ -85,4 +86,24 @@ public class PlayerDataManager implements IPlayerDataManager { return Bukkit.getOnlinePlayers(); } + public static EntityPlayer getHandle(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; + } + } diff --git a/internal/v1_11_R1/src/main/java/com/lishid/openinv/internal/v1_11_R1/SilentContainerChest.java b/internal/v1_11_R1/src/main/java/com/lishid/openinv/internal/v1_11_R1/SilentContainerChest.java index 16c15a9..65df1e6 100644 --- a/internal/v1_11_R1/src/main/java/com/lishid/openinv/internal/v1_11_R1/SilentContainerChest.java +++ b/internal/v1_11_R1/src/main/java/com/lishid/openinv/internal/v1_11_R1/SilentContainerChest.java @@ -16,7 +16,6 @@ package com.lishid.openinv.internal.v1_11_R1; -// Volatile import net.minecraft.server.v1_11_R1.ContainerChest; import net.minecraft.server.v1_11_R1.EntityHuman; import net.minecraft.server.v1_11_R1.IInventory; diff --git a/internal/v1_11_R1/src/main/java/com/lishid/openinv/internal/v1_11_R1/SpecialEnderChest.java b/internal/v1_11_R1/src/main/java/com/lishid/openinv/internal/v1_11_R1/SpecialEnderChest.java index b533c20..9c235a9 100644 --- a/internal/v1_11_R1/src/main/java/com/lishid/openinv/internal/v1_11_R1/SpecialEnderChest.java +++ b/internal/v1_11_R1/src/main/java/com/lishid/openinv/internal/v1_11_R1/SpecialEnderChest.java @@ -25,13 +25,12 @@ import com.lishid.openinv.internal.ISpecialEnderChest; import org.bukkit.entity.Player; import org.bukkit.inventory.Inventory; -// Volatile +import net.minecraft.server.v1_11_R1.EntityPlayer; import net.minecraft.server.v1_11_R1.IInventory; import net.minecraft.server.v1_11_R1.InventoryEnderChest; import net.minecraft.server.v1_11_R1.InventorySubcontainer; import net.minecraft.server.v1_11_R1.ItemStack; -import org.bukkit.craftbukkit.v1_11_R1.entity.CraftPlayer; import org.bukkit.craftbukkit.v1_11_R1.inventory.CraftInventory; public class SpecialEnderChest extends InventorySubcontainer implements IInventory, ISpecialEnderChest { @@ -41,12 +40,12 @@ public class SpecialEnderChest extends InventorySubcontainer implements IInvento private boolean playerOnline = false; public SpecialEnderChest(Player player, Boolean online) { - super(((CraftPlayer) player).getHandle().getEnderChest().getName(), - ((CraftPlayer) player).getHandle().getEnderChest().hasCustomName(), - ((CraftPlayer) player).getHandle().getEnderChest().getSize()); - CraftPlayer craftPlayer = (CraftPlayer) player; - this.enderChest = craftPlayer.getHandle().getEnderChest(); - this.bukkitOwner = craftPlayer; + super(PlayerDataManager.getHandle(player).getEnderChest().getName(), + PlayerDataManager.getHandle(player).getEnderChest().hasCustomName(), + PlayerDataManager.getHandle(player).getEnderChest().getSize()); + EntityPlayer nmsPlayer = PlayerDataManager.getHandle(player); + this.enderChest = nmsPlayer.getEnderChest(); + this.bukkitOwner = nmsPlayer.getBukkitEntity(); setItemLists(this, enderChest.getContents()); } @@ -79,9 +78,9 @@ public class SpecialEnderChest extends InventorySubcontainer implements IInvento public void setPlayerOnline(Player player) { if (!playerOnline) { try { - this.bukkitOwner = player; - CraftPlayer craftPlayer = (CraftPlayer) player; - setItemLists(craftPlayer.getHandle().getEnderChest(), this.items); + EntityPlayer nmsPlayer = PlayerDataManager.getHandle(player); + this.bukkitOwner = nmsPlayer.getBukkitEntity(); + setItemLists(nmsPlayer.getEnderChest(), this.items); } catch (Exception e) {} playerOnline = true; } diff --git a/internal/v1_11_R1/src/main/java/com/lishid/openinv/internal/v1_11_R1/SpecialPlayerInventory.java b/internal/v1_11_R1/src/main/java/com/lishid/openinv/internal/v1_11_R1/SpecialPlayerInventory.java index dbd07ed..3731b70 100644 --- a/internal/v1_11_R1/src/main/java/com/lishid/openinv/internal/v1_11_R1/SpecialPlayerInventory.java +++ b/internal/v1_11_R1/src/main/java/com/lishid/openinv/internal/v1_11_R1/SpecialPlayerInventory.java @@ -26,13 +26,11 @@ import org.bukkit.entity.Player; import org.bukkit.inventory.Inventory; import net.minecraft.server.v1_11_R1.ContainerUtil; -// Volatile import net.minecraft.server.v1_11_R1.EntityHuman; import net.minecraft.server.v1_11_R1.ItemStack; import net.minecraft.server.v1_11_R1.NonNullList; import net.minecraft.server.v1_11_R1.PlayerInventory; -import org.bukkit.craftbukkit.v1_11_R1.entity.CraftPlayer; import org.bukkit.craftbukkit.v1_11_R1.inventory.CraftInventory; public class SpecialPlayerInventory extends PlayerInventory implements ISpecialPlayerInventory { @@ -41,7 +39,7 @@ public class SpecialPlayerInventory extends PlayerInventory implements ISpecialP private boolean playerOnline = false; public SpecialPlayerInventory(Player bukkitPlayer, Boolean online) { - super(((CraftPlayer) bukkitPlayer).getHandle()); + super(PlayerDataManager.getHandle(bukkitPlayer)); this.playerOnline = online; setItemArrays(this, player.inventory.items, player.inventory.armor, player.inventory.extraSlots); } @@ -91,7 +89,7 @@ public class SpecialPlayerInventory extends PlayerInventory implements ISpecialP @Override public void setPlayerOnline(Player player) { if (!playerOnline) { - this.player = ((CraftPlayer) player).getHandle(); + this.player = PlayerDataManager.getHandle(player);; setItemArrays(this.player.inventory, items, armor, extraSlots); playerOnline = true; } diff --git a/internal/v1_4_R1/src/main/java/com/lishid/openinv/internal/v1_4_R1/AnySilentContainer.java b/internal/v1_4_R1/src/main/java/com/lishid/openinv/internal/v1_4_R1/AnySilentContainer.java index ec1e7b6..3ef4bae 100644 --- a/internal/v1_4_R1/src/main/java/com/lishid/openinv/internal/v1_4_R1/AnySilentContainer.java +++ b/internal/v1_4_R1/src/main/java/com/lishid/openinv/internal/v1_4_R1/AnySilentContainer.java @@ -22,7 +22,6 @@ import org.bukkit.ChatColor; import org.bukkit.Material; import org.bukkit.entity.Player; -// Volatile import net.minecraft.server.v1_4_R1.AxisAlignedBB; import net.minecraft.server.v1_4_R1.BlockEnderChest; import net.minecraft.server.v1_4_R1.Container; @@ -36,7 +35,6 @@ import net.minecraft.server.v1_4_R1.TileEntityChest; import net.minecraft.server.v1_4_R1.TileEntityEnderChest; import net.minecraft.server.v1_4_R1.World; -import org.bukkit.craftbukkit.v1_4_R1.entity.CraftPlayer; import org.bukkit.craftbukkit.v1_4_R1.event.CraftEventFactory; public class AnySilentContainer implements IAnySilentContainer { @@ -49,7 +47,7 @@ public class AnySilentContainer implements IAnySilentContainer { @Override public boolean isAnyContainerNeeded(Player p, org.bukkit.block.Block block) { // FOR REFERENCE, LOOK AT net.minecraft.server.BlockChest - EntityPlayer player = ((CraftPlayer) p).getHandle(); + EntityPlayer player = PlayerDataManager.getHandle(p); World world = player.world; if (block instanceof BlockEnderChest) { @@ -97,7 +95,7 @@ public class AnySilentContainer implements IAnySilentContainer { @Override public boolean activateContainer(Player p, boolean silentchest, org.bukkit.block.Block block) { - EntityPlayer player = ((CraftPlayer) p).getHandle(); + EntityPlayer player = PlayerDataManager.getHandle(p); // Silent ender chest is API-only if (silentchest && block.getType() == Material.ENDER_CHEST) { diff --git a/internal/v1_4_R1/src/main/java/com/lishid/openinv/internal/v1_4_R1/InventoryAccess.java b/internal/v1_4_R1/src/main/java/com/lishid/openinv/internal/v1_4_R1/InventoryAccess.java index 78b42b5..eddf654 100644 --- a/internal/v1_4_R1/src/main/java/com/lishid/openinv/internal/v1_4_R1/InventoryAccess.java +++ b/internal/v1_4_R1/src/main/java/com/lishid/openinv/internal/v1_4_R1/InventoryAccess.java @@ -23,7 +23,6 @@ import com.lishid.openinv.util.InternalAccessor; import org.bukkit.inventory.Inventory; -// Volatile import net.minecraft.server.v1_4_R1.IInventory; import org.bukkit.craftbukkit.v1_4_R1.inventory.CraftInventory; diff --git a/internal/v1_4_R1/src/main/java/com/lishid/openinv/internal/v1_4_R1/PlayerDataManager.java b/internal/v1_4_R1/src/main/java/com/lishid/openinv/internal/v1_4_R1/PlayerDataManager.java index 796d272..e89517e 100644 --- a/internal/v1_4_R1/src/main/java/com/lishid/openinv/internal/v1_4_R1/PlayerDataManager.java +++ b/internal/v1_4_R1/src/main/java/com/lishid/openinv/internal/v1_4_R1/PlayerDataManager.java @@ -23,14 +23,15 @@ import com.lishid.openinv.internal.IPlayerDataManager; import org.bukkit.Bukkit; import org.bukkit.OfflinePlayer; +import org.bukkit.Server; import org.bukkit.entity.Player; import net.minecraft.server.v1_4_R1.EntityPlayer; import net.minecraft.server.v1_4_R1.MinecraftServer; import net.minecraft.server.v1_4_R1.PlayerInteractManager; -// Volatile import org.bukkit.craftbukkit.v1_4_R1.CraftServer; +import org.bukkit.craftbukkit.v1_4_R1.entity.CraftPlayer; public class PlayerDataManager implements IPlayerDataManager { @@ -78,4 +79,24 @@ public class PlayerDataManager implements IPlayerDataManager { return Arrays.asList(Bukkit.getOnlinePlayers()); } + public static EntityPlayer getHandle(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().f(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; + } + } diff --git a/internal/v1_4_R1/src/main/java/com/lishid/openinv/internal/v1_4_R1/SilentContainerChest.java b/internal/v1_4_R1/src/main/java/com/lishid/openinv/internal/v1_4_R1/SilentContainerChest.java index 24c4018..9554dad 100644 --- a/internal/v1_4_R1/src/main/java/com/lishid/openinv/internal/v1_4_R1/SilentContainerChest.java +++ b/internal/v1_4_R1/src/main/java/com/lishid/openinv/internal/v1_4_R1/SilentContainerChest.java @@ -16,7 +16,6 @@ package com.lishid.openinv.internal.v1_4_R1; -// Volatile import net.minecraft.server.v1_4_R1.ContainerChest; import net.minecraft.server.v1_4_R1.EntityHuman; import net.minecraft.server.v1_4_R1.IInventory; diff --git a/internal/v1_4_R1/src/main/java/com/lishid/openinv/internal/v1_4_R1/SpecialEnderChest.java b/internal/v1_4_R1/src/main/java/com/lishid/openinv/internal/v1_4_R1/SpecialEnderChest.java index ff5e70c..7108e07 100644 --- a/internal/v1_4_R1/src/main/java/com/lishid/openinv/internal/v1_4_R1/SpecialEnderChest.java +++ b/internal/v1_4_R1/src/main/java/com/lishid/openinv/internal/v1_4_R1/SpecialEnderChest.java @@ -27,7 +27,7 @@ import org.bukkit.entity.Player; import org.bukkit.inventory.Inventory; import org.bukkit.inventory.InventoryHolder; -// Volatile +import net.minecraft.server.v1_4_R1.EntityPlayer; import net.minecraft.server.v1_4_R1.IInventory; import net.minecraft.server.v1_4_R1.InventoryEnderChest; import net.minecraft.server.v1_4_R1.InventorySubcontainer; @@ -46,12 +46,12 @@ public class SpecialEnderChest extends InventorySubcontainer implements IInvento private CraftPlayer owner; private int maxStack = MAX_STACK; - public SpecialEnderChest(Player p, Boolean online) { - super(((CraftPlayer) p).getHandle().getEnderChest().getName(), - ((CraftPlayer) p).getHandle().getEnderChest().getSize()); - CraftPlayer player = (CraftPlayer) p; - this.enderChest = player.getHandle().getEnderChest(); - this.owner = player; + public SpecialEnderChest(Player player, Boolean online) { + super(PlayerDataManager.getHandle(player).getEnderChest().getName(), + PlayerDataManager.getHandle(player).getEnderChest().getSize()); + EntityPlayer nmsPlayer = PlayerDataManager.getHandle(player); + this.enderChest = nmsPlayer.getEnderChest(); + this.owner = nmsPlayer.getBukkitEntity(); this.items = enderChest.getContents(); } @@ -64,8 +64,9 @@ public class SpecialEnderChest extends InventorySubcontainer implements IInvento public void setPlayerOnline(Player player) { if (!playerOnline) { try { - owner = (CraftPlayer) player; - InventoryEnderChest playerEnderChest = owner.getHandle().getEnderChest(); + EntityPlayer nmsPlayer = PlayerDataManager.getHandle(player); + this.owner = nmsPlayer.getBukkitEntity(); + InventoryEnderChest playerEnderChest = nmsPlayer.getEnderChest(); Field field = playerEnderChest.getClass().getField("items"); field.setAccessible(true); field.set(playerEnderChest, this.items); diff --git a/internal/v1_4_R1/src/main/java/com/lishid/openinv/internal/v1_4_R1/SpecialPlayerInventory.java b/internal/v1_4_R1/src/main/java/com/lishid/openinv/internal/v1_4_R1/SpecialPlayerInventory.java index e3c760e..4306769 100644 --- a/internal/v1_4_R1/src/main/java/com/lishid/openinv/internal/v1_4_R1/SpecialPlayerInventory.java +++ b/internal/v1_4_R1/src/main/java/com/lishid/openinv/internal/v1_4_R1/SpecialPlayerInventory.java @@ -21,11 +21,9 @@ import com.lishid.openinv.internal.ISpecialPlayerInventory; import org.bukkit.entity.Player; import org.bukkit.inventory.Inventory; -// Volatile import net.minecraft.server.v1_4_R1.ItemStack; import net.minecraft.server.v1_4_R1.PlayerInventory; -import org.bukkit.craftbukkit.v1_4_R1.entity.CraftPlayer; import org.bukkit.craftbukkit.v1_4_R1.inventory.CraftInventory; public class SpecialPlayerInventory extends PlayerInventory implements ISpecialPlayerInventory { @@ -35,7 +33,7 @@ public class SpecialPlayerInventory extends PlayerInventory implements ISpecialP private boolean playerOnline = false; public SpecialPlayerInventory(Player bukkitPlayer, Boolean online) { - super(((CraftPlayer) bukkitPlayer).getHandle()); + super(PlayerDataManager.getHandle(bukkitPlayer)); this.playerOnline = online; this.items = player.inventory.items; this.armor = player.inventory.armor; @@ -49,7 +47,7 @@ public class SpecialPlayerInventory extends PlayerInventory implements ISpecialP @Override public void setPlayerOnline(Player player) { if (!playerOnline) { - this.player = ((CraftPlayer) player).getHandle(); + this.player = PlayerDataManager.getHandle(player); this.player.inventory.items = this.items; this.player.inventory.armor = this.armor; playerOnline = true; diff --git a/internal/v1_5_R2/src/main/java/com/lishid/openinv/internal/v1_5_R2/AnySilentContainer.java b/internal/v1_5_R2/src/main/java/com/lishid/openinv/internal/v1_5_R2/AnySilentContainer.java index 5cb2c26..76f2cb9 100644 --- a/internal/v1_5_R2/src/main/java/com/lishid/openinv/internal/v1_5_R2/AnySilentContainer.java +++ b/internal/v1_5_R2/src/main/java/com/lishid/openinv/internal/v1_5_R2/AnySilentContainer.java @@ -22,7 +22,6 @@ import org.bukkit.ChatColor; import org.bukkit.Material; import org.bukkit.entity.Player; -// Volatile import net.minecraft.server.v1_5_R2.AxisAlignedBB; import net.minecraft.server.v1_5_R2.BlockEnderChest; import net.minecraft.server.v1_5_R2.Container; @@ -36,7 +35,6 @@ import net.minecraft.server.v1_5_R2.TileEntityChest; import net.minecraft.server.v1_5_R2.TileEntityEnderChest; import net.minecraft.server.v1_5_R2.World; -import org.bukkit.craftbukkit.v1_5_R2.entity.CraftPlayer; import org.bukkit.craftbukkit.v1_5_R2.event.CraftEventFactory; public class AnySilentContainer implements IAnySilentContainer { @@ -49,7 +47,7 @@ public class AnySilentContainer implements IAnySilentContainer { @Override public boolean isAnyContainerNeeded(Player p, org.bukkit.block.Block block) { // FOR REFERENCE, LOOK AT net.minecraft.server.BlockChest - EntityPlayer player = ((CraftPlayer) p).getHandle(); + EntityPlayer player = PlayerDataManager.getHandle(p); World world = player.world; if (block instanceof BlockEnderChest) { @@ -97,7 +95,7 @@ public class AnySilentContainer implements IAnySilentContainer { @Override public boolean activateContainer(Player p, boolean silentchest, org.bukkit.block.Block block) { - EntityPlayer player = ((CraftPlayer) p).getHandle(); + EntityPlayer player = PlayerDataManager.getHandle(p); // Silent ender chest is API-only if (silentchest && block.getType() == Material.ENDER_CHEST) { diff --git a/internal/v1_5_R2/src/main/java/com/lishid/openinv/internal/v1_5_R2/InventoryAccess.java b/internal/v1_5_R2/src/main/java/com/lishid/openinv/internal/v1_5_R2/InventoryAccess.java index 932bf21..bf22dc9 100644 --- a/internal/v1_5_R2/src/main/java/com/lishid/openinv/internal/v1_5_R2/InventoryAccess.java +++ b/internal/v1_5_R2/src/main/java/com/lishid/openinv/internal/v1_5_R2/InventoryAccess.java @@ -23,7 +23,6 @@ import com.lishid.openinv.util.InternalAccessor; import org.bukkit.inventory.Inventory; -// Volatile import net.minecraft.server.v1_5_R2.IInventory; import org.bukkit.craftbukkit.v1_5_R2.inventory.CraftInventory; diff --git a/internal/v1_5_R2/src/main/java/com/lishid/openinv/internal/v1_5_R2/PlayerDataManager.java b/internal/v1_5_R2/src/main/java/com/lishid/openinv/internal/v1_5_R2/PlayerDataManager.java index 50ed22b..38bf6b9 100644 --- a/internal/v1_5_R2/src/main/java/com/lishid/openinv/internal/v1_5_R2/PlayerDataManager.java +++ b/internal/v1_5_R2/src/main/java/com/lishid/openinv/internal/v1_5_R2/PlayerDataManager.java @@ -23,14 +23,15 @@ import com.lishid.openinv.internal.IPlayerDataManager; import org.bukkit.Bukkit; import org.bukkit.OfflinePlayer; +import org.bukkit.Server; import org.bukkit.entity.Player; -// Volatile import net.minecraft.server.v1_5_R2.EntityPlayer; import net.minecraft.server.v1_5_R2.MinecraftServer; import net.minecraft.server.v1_5_R2.PlayerInteractManager; import org.bukkit.craftbukkit.v1_5_R2.CraftServer; +import org.bukkit.craftbukkit.v1_5_R2.entity.CraftPlayer; public class PlayerDataManager implements IPlayerDataManager { @@ -77,4 +78,24 @@ public class PlayerDataManager implements IPlayerDataManager { return Arrays.asList(Bukkit.getOnlinePlayers()); } + public static EntityPlayer getHandle(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().f(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; + } + } diff --git a/internal/v1_5_R2/src/main/java/com/lishid/openinv/internal/v1_5_R2/SilentContainerChest.java b/internal/v1_5_R2/src/main/java/com/lishid/openinv/internal/v1_5_R2/SilentContainerChest.java index 60e085b..e7317cd 100644 --- a/internal/v1_5_R2/src/main/java/com/lishid/openinv/internal/v1_5_R2/SilentContainerChest.java +++ b/internal/v1_5_R2/src/main/java/com/lishid/openinv/internal/v1_5_R2/SilentContainerChest.java @@ -16,7 +16,6 @@ package com.lishid.openinv.internal.v1_5_R2; -// Volatile import net.minecraft.server.v1_5_R2.ContainerChest; import net.minecraft.server.v1_5_R2.EntityHuman; import net.minecraft.server.v1_5_R2.IInventory; diff --git a/internal/v1_5_R2/src/main/java/com/lishid/openinv/internal/v1_5_R2/SpecialEnderChest.java b/internal/v1_5_R2/src/main/java/com/lishid/openinv/internal/v1_5_R2/SpecialEnderChest.java index 50355b7..26c0285 100644 --- a/internal/v1_5_R2/src/main/java/com/lishid/openinv/internal/v1_5_R2/SpecialEnderChest.java +++ b/internal/v1_5_R2/src/main/java/com/lishid/openinv/internal/v1_5_R2/SpecialEnderChest.java @@ -27,7 +27,7 @@ import org.bukkit.entity.Player; import org.bukkit.inventory.Inventory; import org.bukkit.inventory.InventoryHolder; -// Volatile +import net.minecraft.server.v1_5_R2.EntityPlayer; import net.minecraft.server.v1_5_R2.IInventory; import net.minecraft.server.v1_5_R2.InventoryEnderChest; import net.minecraft.server.v1_5_R2.InventorySubcontainer; @@ -46,13 +46,13 @@ public class SpecialEnderChest extends InventorySubcontainer implements IInvento private CraftPlayer owner; private int maxStack = MAX_STACK; - public SpecialEnderChest(Player p, Boolean online) { - super(((CraftPlayer) p).getHandle().getEnderChest().getName(), - ((CraftPlayer) p).getHandle().getEnderChest().c(), - ((CraftPlayer) p).getHandle().getEnderChest().getSize()); - CraftPlayer player = (CraftPlayer) p; - this.enderChest = player.getHandle().getEnderChest(); - this.owner = player; + public SpecialEnderChest(Player player, Boolean online) { + super(PlayerDataManager.getHandle(player).getEnderChest().getName(), + PlayerDataManager.getHandle(player).getEnderChest().c(), + PlayerDataManager.getHandle(player).getEnderChest().getSize()); + EntityPlayer nmsPlayer = PlayerDataManager.getHandle(player); + this.enderChest = nmsPlayer.getEnderChest(); + this.owner = nmsPlayer.getBukkitEntity(); this.items = enderChest.getContents(); } @@ -65,8 +65,9 @@ public class SpecialEnderChest extends InventorySubcontainer implements IInvento public void setPlayerOnline(Player player) { if (!playerOnline) { try { - owner = (CraftPlayer) player; - InventoryEnderChest playerEnderChest = owner.getHandle().getEnderChest(); + EntityPlayer nmsPlayer = PlayerDataManager.getHandle(player); + this.owner = nmsPlayer.getBukkitEntity(); + InventoryEnderChest playerEnderChest = nmsPlayer.getEnderChest(); Field field = playerEnderChest.getClass().getField("items"); field.setAccessible(true); field.set(playerEnderChest, this.items); diff --git a/internal/v1_5_R2/src/main/java/com/lishid/openinv/internal/v1_5_R2/SpecialPlayerInventory.java b/internal/v1_5_R2/src/main/java/com/lishid/openinv/internal/v1_5_R2/SpecialPlayerInventory.java index 81c949e..b47eaf1 100644 --- a/internal/v1_5_R2/src/main/java/com/lishid/openinv/internal/v1_5_R2/SpecialPlayerInventory.java +++ b/internal/v1_5_R2/src/main/java/com/lishid/openinv/internal/v1_5_R2/SpecialPlayerInventory.java @@ -21,11 +21,9 @@ import com.lishid.openinv.internal.ISpecialPlayerInventory; import org.bukkit.entity.Player; import org.bukkit.inventory.Inventory; -// Volatile import net.minecraft.server.v1_5_R2.ItemStack; import net.minecraft.server.v1_5_R2.PlayerInventory; -import org.bukkit.craftbukkit.v1_5_R2.entity.CraftPlayer; import org.bukkit.craftbukkit.v1_5_R2.inventory.CraftInventory; public class SpecialPlayerInventory extends PlayerInventory implements ISpecialPlayerInventory { @@ -35,7 +33,7 @@ public class SpecialPlayerInventory extends PlayerInventory implements ISpecialP private boolean playerOnline = false; public SpecialPlayerInventory(Player bukkitPlayer, Boolean online) { - super(((CraftPlayer) bukkitPlayer).getHandle()); + super(PlayerDataManager.getHandle(bukkitPlayer)); this.playerOnline = online; this.items = player.inventory.items; this.armor = player.inventory.armor; @@ -49,7 +47,7 @@ public class SpecialPlayerInventory extends PlayerInventory implements ISpecialP @Override public void setPlayerOnline(Player player) { if (!playerOnline) { - this.player = ((CraftPlayer) player).getHandle(); + this.player = PlayerDataManager.getHandle(player); this.player.inventory.items = this.items; this.player.inventory.armor = this.armor; playerOnline = true; diff --git a/internal/v1_5_R3/src/main/java/com/lishid/openinv/internal/v1_5_R3/AnySilentContainer.java b/internal/v1_5_R3/src/main/java/com/lishid/openinv/internal/v1_5_R3/AnySilentContainer.java index 7d011a0..f5393a6 100644 --- a/internal/v1_5_R3/src/main/java/com/lishid/openinv/internal/v1_5_R3/AnySilentContainer.java +++ b/internal/v1_5_R3/src/main/java/com/lishid/openinv/internal/v1_5_R3/AnySilentContainer.java @@ -22,7 +22,6 @@ import org.bukkit.ChatColor; import org.bukkit.Material; import org.bukkit.entity.Player; -//Volatile import net.minecraft.server.v1_5_R3.AxisAlignedBB; import net.minecraft.server.v1_5_R3.BlockEnderChest; import net.minecraft.server.v1_5_R3.Container; @@ -36,7 +35,6 @@ import net.minecraft.server.v1_5_R3.TileEntityChest; import net.minecraft.server.v1_5_R3.TileEntityEnderChest; import net.minecraft.server.v1_5_R3.World; -import org.bukkit.craftbukkit.v1_5_R3.entity.CraftPlayer; import org.bukkit.craftbukkit.v1_5_R3.event.CraftEventFactory; public class AnySilentContainer implements IAnySilentContainer { @@ -49,7 +47,7 @@ public class AnySilentContainer implements IAnySilentContainer { @Override public boolean isAnyContainerNeeded(Player p, org.bukkit.block.Block block) { // FOR REFERENCE, LOOK AT net.minecraft.server.BlockChest - EntityPlayer player = ((CraftPlayer) p).getHandle(); + EntityPlayer player = PlayerDataManager.getHandle(p); World world = player.world; if (block instanceof BlockEnderChest) { @@ -97,7 +95,7 @@ public class AnySilentContainer implements IAnySilentContainer { @Override public boolean activateContainer(Player p, boolean silentchest, org.bukkit.block.Block block) { - EntityPlayer player = ((CraftPlayer) p).getHandle(); + EntityPlayer player = PlayerDataManager.getHandle(p); // Silent ender chest is API-only if (silentchest && block.getType() == Material.ENDER_CHEST) { diff --git a/internal/v1_5_R3/src/main/java/com/lishid/openinv/internal/v1_5_R3/InventoryAccess.java b/internal/v1_5_R3/src/main/java/com/lishid/openinv/internal/v1_5_R3/InventoryAccess.java index aa09220..a58d68b 100644 --- a/internal/v1_5_R3/src/main/java/com/lishid/openinv/internal/v1_5_R3/InventoryAccess.java +++ b/internal/v1_5_R3/src/main/java/com/lishid/openinv/internal/v1_5_R3/InventoryAccess.java @@ -23,7 +23,6 @@ import com.lishid.openinv.util.InternalAccessor; import org.bukkit.inventory.Inventory; -// Volatile import net.minecraft.server.v1_5_R3.IInventory; import org.bukkit.craftbukkit.v1_5_R3.inventory.CraftInventory; diff --git a/internal/v1_5_R3/src/main/java/com/lishid/openinv/internal/v1_5_R3/PlayerDataManager.java b/internal/v1_5_R3/src/main/java/com/lishid/openinv/internal/v1_5_R3/PlayerDataManager.java index c0b181e..18b6be1 100644 --- a/internal/v1_5_R3/src/main/java/com/lishid/openinv/internal/v1_5_R3/PlayerDataManager.java +++ b/internal/v1_5_R3/src/main/java/com/lishid/openinv/internal/v1_5_R3/PlayerDataManager.java @@ -23,14 +23,15 @@ import com.lishid.openinv.internal.IPlayerDataManager; import org.bukkit.Bukkit; import org.bukkit.OfflinePlayer; +import org.bukkit.Server; import org.bukkit.entity.Player; -// Volatile import net.minecraft.server.v1_5_R3.EntityPlayer; import net.minecraft.server.v1_5_R3.MinecraftServer; import net.minecraft.server.v1_5_R3.PlayerInteractManager; import org.bukkit.craftbukkit.v1_5_R3.CraftServer; +import org.bukkit.craftbukkit.v1_5_R3.entity.CraftPlayer; public class PlayerDataManager implements IPlayerDataManager { @@ -77,4 +78,24 @@ public class PlayerDataManager implements IPlayerDataManager { return Arrays.asList(Bukkit.getOnlinePlayers()); } + public static EntityPlayer getHandle(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; + } + } diff --git a/internal/v1_5_R3/src/main/java/com/lishid/openinv/internal/v1_5_R3/SilentContainerChest.java b/internal/v1_5_R3/src/main/java/com/lishid/openinv/internal/v1_5_R3/SilentContainerChest.java index 59c452e..e0b217c 100644 --- a/internal/v1_5_R3/src/main/java/com/lishid/openinv/internal/v1_5_R3/SilentContainerChest.java +++ b/internal/v1_5_R3/src/main/java/com/lishid/openinv/internal/v1_5_R3/SilentContainerChest.java @@ -16,7 +16,6 @@ package com.lishid.openinv.internal.v1_5_R3; -// Volatile import net.minecraft.server.v1_5_R3.ContainerChest; import net.minecraft.server.v1_5_R3.EntityHuman; import net.minecraft.server.v1_5_R3.IInventory; diff --git a/internal/v1_5_R3/src/main/java/com/lishid/openinv/internal/v1_5_R3/SpecialEnderChest.java b/internal/v1_5_R3/src/main/java/com/lishid/openinv/internal/v1_5_R3/SpecialEnderChest.java index 06c52b7..47ef32e 100644 --- a/internal/v1_5_R3/src/main/java/com/lishid/openinv/internal/v1_5_R3/SpecialEnderChest.java +++ b/internal/v1_5_R3/src/main/java/com/lishid/openinv/internal/v1_5_R3/SpecialEnderChest.java @@ -27,7 +27,7 @@ import org.bukkit.entity.Player; import org.bukkit.inventory.Inventory; import org.bukkit.inventory.InventoryHolder; -// Volatile +import net.minecraft.server.v1_5_R3.EntityPlayer; import net.minecraft.server.v1_5_R3.IInventory; import net.minecraft.server.v1_5_R3.InventoryEnderChest; import net.minecraft.server.v1_5_R3.InventorySubcontainer; @@ -46,13 +46,13 @@ public class SpecialEnderChest extends InventorySubcontainer implements IInvento private CraftPlayer owner; private int maxStack = MAX_STACK; - public SpecialEnderChest(Player p, Boolean online) { - super(((CraftPlayer) p).getHandle().getEnderChest().getName(), - ((CraftPlayer) p).getHandle().getEnderChest().c(), - ((CraftPlayer) p).getHandle().getEnderChest().getSize()); - CraftPlayer player = (CraftPlayer) p; - this.enderChest = player.getHandle().getEnderChest(); - this.owner = player; + public SpecialEnderChest(Player player, Boolean online) { + super(PlayerDataManager.getHandle(player).getEnderChest().getName(), + PlayerDataManager.getHandle(player).getEnderChest().c(), + PlayerDataManager.getHandle(player).getEnderChest().getSize()); + EntityPlayer nmsPlayer = PlayerDataManager.getHandle(player); + this.enderChest = nmsPlayer.getEnderChest(); + this.owner = nmsPlayer.getBukkitEntity(); this.items = enderChest.getContents(); } @@ -65,8 +65,9 @@ public class SpecialEnderChest extends InventorySubcontainer implements IInvento public void setPlayerOnline(Player player) { if (!playerOnline) { try { - owner = (CraftPlayer) player; - InventoryEnderChest playerEnderChest = owner.getHandle().getEnderChest(); + EntityPlayer nmsPlayer = PlayerDataManager.getHandle(player); + this.owner = nmsPlayer.getBukkitEntity(); + InventoryEnderChest playerEnderChest = nmsPlayer.getEnderChest(); Field field = playerEnderChest.getClass().getField("items"); field.setAccessible(true); field.set(playerEnderChest, this.items); diff --git a/internal/v1_5_R3/src/main/java/com/lishid/openinv/internal/v1_5_R3/SpecialPlayerInventory.java b/internal/v1_5_R3/src/main/java/com/lishid/openinv/internal/v1_5_R3/SpecialPlayerInventory.java index f4668b9..f212392 100644 --- a/internal/v1_5_R3/src/main/java/com/lishid/openinv/internal/v1_5_R3/SpecialPlayerInventory.java +++ b/internal/v1_5_R3/src/main/java/com/lishid/openinv/internal/v1_5_R3/SpecialPlayerInventory.java @@ -21,11 +21,9 @@ import com.lishid.openinv.internal.ISpecialPlayerInventory; import org.bukkit.entity.Player; import org.bukkit.inventory.Inventory; -// Volatile import net.minecraft.server.v1_5_R3.ItemStack; import net.minecraft.server.v1_5_R3.PlayerInventory; -import org.bukkit.craftbukkit.v1_5_R3.entity.CraftPlayer; import org.bukkit.craftbukkit.v1_5_R3.inventory.CraftInventory; public class SpecialPlayerInventory extends PlayerInventory implements ISpecialPlayerInventory { @@ -35,7 +33,7 @@ public class SpecialPlayerInventory extends PlayerInventory implements ISpecialP private boolean playerOnline = false; public SpecialPlayerInventory(Player bukkitPlayer, Boolean online) { - super(((CraftPlayer) bukkitPlayer).getHandle()); + super(PlayerDataManager.getHandle(bukkitPlayer)); this.playerOnline = online; this.items = player.inventory.items; this.armor = player.inventory.armor; @@ -49,7 +47,7 @@ public class SpecialPlayerInventory extends PlayerInventory implements ISpecialP @Override public void setPlayerOnline(Player player) { if (!playerOnline) { - this.player = ((CraftPlayer) player).getHandle(); + this.player = PlayerDataManager.getHandle(player); this.player.inventory.items = this.items; this.player.inventory.armor = this.armor; playerOnline = true; diff --git a/internal/v1_6_R1/src/main/java/com/lishid/openinv/internal/v1_6_R1/AnySilentContainer.java b/internal/v1_6_R1/src/main/java/com/lishid/openinv/internal/v1_6_R1/AnySilentContainer.java index 1a79320..fb5a306 100644 --- a/internal/v1_6_R1/src/main/java/com/lishid/openinv/internal/v1_6_R1/AnySilentContainer.java +++ b/internal/v1_6_R1/src/main/java/com/lishid/openinv/internal/v1_6_R1/AnySilentContainer.java @@ -22,7 +22,6 @@ import org.bukkit.ChatColor; import org.bukkit.Material; import org.bukkit.entity.Player; -// Volatile import net.minecraft.server.v1_6_R1.AxisAlignedBB; import net.minecraft.server.v1_6_R1.BlockEnderChest; import net.minecraft.server.v1_6_R1.Container; @@ -36,7 +35,6 @@ import net.minecraft.server.v1_6_R1.TileEntityChest; import net.minecraft.server.v1_6_R1.TileEntityEnderChest; import net.minecraft.server.v1_6_R1.World; -import org.bukkit.craftbukkit.v1_6_R1.entity.CraftPlayer; import org.bukkit.craftbukkit.v1_6_R1.event.CraftEventFactory; public class AnySilentContainer implements IAnySilentContainer { @@ -49,7 +47,7 @@ public class AnySilentContainer implements IAnySilentContainer { @Override public boolean isAnyContainerNeeded(Player p, org.bukkit.block.Block block) { // FOR REFERENCE, LOOK AT net.minecraft.server.BlockChest - EntityPlayer player = ((CraftPlayer) p).getHandle(); + EntityPlayer player = PlayerDataManager.getHandle(p); World world = player.world; if (block instanceof BlockEnderChest) { @@ -97,7 +95,7 @@ public class AnySilentContainer implements IAnySilentContainer { @Override public boolean activateContainer(Player p, boolean silentchest, org.bukkit.block.Block block) { - EntityPlayer player = ((CraftPlayer) p).getHandle(); + EntityPlayer player = PlayerDataManager.getHandle(p); // Silent ender chest is API-only if (silentchest && block.getType() == Material.ENDER_CHEST) { diff --git a/internal/v1_6_R1/src/main/java/com/lishid/openinv/internal/v1_6_R1/InventoryAccess.java b/internal/v1_6_R1/src/main/java/com/lishid/openinv/internal/v1_6_R1/InventoryAccess.java index aa3b591..24c7ccd 100644 --- a/internal/v1_6_R1/src/main/java/com/lishid/openinv/internal/v1_6_R1/InventoryAccess.java +++ b/internal/v1_6_R1/src/main/java/com/lishid/openinv/internal/v1_6_R1/InventoryAccess.java @@ -23,7 +23,6 @@ import com.lishid.openinv.util.InternalAccessor; import org.bukkit.inventory.Inventory; -// Volatile import net.minecraft.server.v1_6_R1.IInventory; import org.bukkit.craftbukkit.v1_6_R1.inventory.CraftInventory; diff --git a/internal/v1_6_R1/src/main/java/com/lishid/openinv/internal/v1_6_R1/PlayerDataManager.java b/internal/v1_6_R1/src/main/java/com/lishid/openinv/internal/v1_6_R1/PlayerDataManager.java index d1559f6..b186ba3 100644 --- a/internal/v1_6_R1/src/main/java/com/lishid/openinv/internal/v1_6_R1/PlayerDataManager.java +++ b/internal/v1_6_R1/src/main/java/com/lishid/openinv/internal/v1_6_R1/PlayerDataManager.java @@ -23,14 +23,15 @@ import com.lishid.openinv.internal.IPlayerDataManager; import org.bukkit.Bukkit; import org.bukkit.OfflinePlayer; +import org.bukkit.Server; import org.bukkit.entity.Player; -// Volatile import net.minecraft.server.v1_6_R1.EntityPlayer; import net.minecraft.server.v1_6_R1.MinecraftServer; import net.minecraft.server.v1_6_R1.PlayerInteractManager; import org.bukkit.craftbukkit.v1_6_R1.CraftServer; +import org.bukkit.craftbukkit.v1_6_R1.entity.CraftPlayer; public class PlayerDataManager implements IPlayerDataManager { @@ -77,4 +78,24 @@ public class PlayerDataManager implements IPlayerDataManager { return Arrays.asList(Bukkit.getOnlinePlayers()); } + public static EntityPlayer getHandle(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; + } + } diff --git a/internal/v1_6_R1/src/main/java/com/lishid/openinv/internal/v1_6_R1/SilentContainerChest.java b/internal/v1_6_R1/src/main/java/com/lishid/openinv/internal/v1_6_R1/SilentContainerChest.java index 92c910f..e1ea429 100644 --- a/internal/v1_6_R1/src/main/java/com/lishid/openinv/internal/v1_6_R1/SilentContainerChest.java +++ b/internal/v1_6_R1/src/main/java/com/lishid/openinv/internal/v1_6_R1/SilentContainerChest.java @@ -16,7 +16,6 @@ package com.lishid.openinv.internal.v1_6_R1; -// Volatile import net.minecraft.server.v1_6_R1.ContainerChest; import net.minecraft.server.v1_6_R1.EntityHuman; import net.minecraft.server.v1_6_R1.IInventory; diff --git a/internal/v1_6_R1/src/main/java/com/lishid/openinv/internal/v1_6_R1/SpecialEnderChest.java b/internal/v1_6_R1/src/main/java/com/lishid/openinv/internal/v1_6_R1/SpecialEnderChest.java index d10b591..a1051c8 100644 --- a/internal/v1_6_R1/src/main/java/com/lishid/openinv/internal/v1_6_R1/SpecialEnderChest.java +++ b/internal/v1_6_R1/src/main/java/com/lishid/openinv/internal/v1_6_R1/SpecialEnderChest.java @@ -27,7 +27,7 @@ import org.bukkit.entity.Player; import org.bukkit.inventory.Inventory; import org.bukkit.inventory.InventoryHolder; -// Volatile +import net.minecraft.server.v1_6_R1.EntityPlayer; import net.minecraft.server.v1_6_R1.IInventory; import net.minecraft.server.v1_6_R1.InventoryEnderChest; import net.minecraft.server.v1_6_R1.InventorySubcontainer; @@ -46,13 +46,13 @@ public class SpecialEnderChest extends InventorySubcontainer implements IInvento private CraftPlayer owner; private int maxStack = MAX_STACK; - public SpecialEnderChest(Player p, Boolean online) { - super(((CraftPlayer) p).getHandle().getEnderChest().getName(), - ((CraftPlayer) p).getHandle().getEnderChest().c(), - ((CraftPlayer) p).getHandle().getEnderChest().getSize()); - CraftPlayer player = (CraftPlayer) p; - this.enderChest = player.getHandle().getEnderChest(); - this.owner = player; + public SpecialEnderChest(Player player, Boolean online) { + super(PlayerDataManager.getHandle(player).getEnderChest().getName(), + PlayerDataManager.getHandle(player).getEnderChest().c(), + PlayerDataManager.getHandle(player).getEnderChest().getSize()); + EntityPlayer nmsPlayer = PlayerDataManager.getHandle(player); + this.enderChest = nmsPlayer.getEnderChest(); + this.owner = nmsPlayer.getBukkitEntity(); this.items = enderChest.getContents(); } @@ -65,8 +65,9 @@ public class SpecialEnderChest extends InventorySubcontainer implements IInvento public void setPlayerOnline(Player player) { if (!playerOnline) { try { - owner = (CraftPlayer) player; - InventoryEnderChest playerEnderChest = owner.getHandle().getEnderChest(); + EntityPlayer nmsPlayer = PlayerDataManager.getHandle(player); + this.owner = nmsPlayer.getBukkitEntity(); + InventoryEnderChest playerEnderChest = nmsPlayer.getEnderChest(); Field field = playerEnderChest.getClass().getField("items"); field.setAccessible(true); field.set(playerEnderChest, this.items); diff --git a/internal/v1_6_R1/src/main/java/com/lishid/openinv/internal/v1_6_R1/SpecialPlayerInventory.java b/internal/v1_6_R1/src/main/java/com/lishid/openinv/internal/v1_6_R1/SpecialPlayerInventory.java index dc397e4..ef3cb03 100644 --- a/internal/v1_6_R1/src/main/java/com/lishid/openinv/internal/v1_6_R1/SpecialPlayerInventory.java +++ b/internal/v1_6_R1/src/main/java/com/lishid/openinv/internal/v1_6_R1/SpecialPlayerInventory.java @@ -21,11 +21,9 @@ import com.lishid.openinv.internal.ISpecialPlayerInventory; import org.bukkit.entity.Player; import org.bukkit.inventory.Inventory; -// Volatile import net.minecraft.server.v1_6_R1.ItemStack; import net.minecraft.server.v1_6_R1.PlayerInventory; -import org.bukkit.craftbukkit.v1_6_R1.entity.CraftPlayer; import org.bukkit.craftbukkit.v1_6_R1.inventory.CraftInventory; public class SpecialPlayerInventory extends PlayerInventory implements ISpecialPlayerInventory { @@ -35,7 +33,7 @@ public class SpecialPlayerInventory extends PlayerInventory implements ISpecialP private boolean playerOnline = false; public SpecialPlayerInventory(Player bukkitPlayer, Boolean online) { - super(((CraftPlayer) bukkitPlayer).getHandle()); + super(PlayerDataManager.getHandle(bukkitPlayer)); this.playerOnline = online; this.items = player.inventory.items; this.armor = player.inventory.armor; @@ -49,7 +47,7 @@ public class SpecialPlayerInventory extends PlayerInventory implements ISpecialP @Override public void setPlayerOnline(Player player) { if (!playerOnline) { - this.player = ((CraftPlayer) player).getHandle(); + this.player = PlayerDataManager.getHandle(player); this.player.inventory.items = this.items; this.player.inventory.armor = this.armor; playerOnline = true; diff --git a/internal/v1_6_R2/src/main/java/com/lishid/openinv/internal/v1_6_R2/AnySilentContainer.java b/internal/v1_6_R2/src/main/java/com/lishid/openinv/internal/v1_6_R2/AnySilentContainer.java index ab1ff97..1b20b29 100644 --- a/internal/v1_6_R2/src/main/java/com/lishid/openinv/internal/v1_6_R2/AnySilentContainer.java +++ b/internal/v1_6_R2/src/main/java/com/lishid/openinv/internal/v1_6_R2/AnySilentContainer.java @@ -22,7 +22,6 @@ import org.bukkit.ChatColor; import org.bukkit.Material; import org.bukkit.entity.Player; -// Volatile import net.minecraft.server.v1_6_R2.AxisAlignedBB; import net.minecraft.server.v1_6_R2.BlockEnderChest; import net.minecraft.server.v1_6_R2.Container; @@ -36,7 +35,6 @@ import net.minecraft.server.v1_6_R2.TileEntityChest; import net.minecraft.server.v1_6_R2.TileEntityEnderChest; import net.minecraft.server.v1_6_R2.World; -import org.bukkit.craftbukkit.v1_6_R2.entity.CraftPlayer; import org.bukkit.craftbukkit.v1_6_R2.event.CraftEventFactory; public class AnySilentContainer implements IAnySilentContainer { @@ -49,7 +47,7 @@ public class AnySilentContainer implements IAnySilentContainer { @Override public boolean isAnyContainerNeeded(Player p, org.bukkit.block.Block block) { // FOR REFERENCE, LOOK AT net.minecraft.server.BlockChest - EntityPlayer player = ((CraftPlayer) p).getHandle(); + EntityPlayer player = PlayerDataManager.getHandle(p); World world = player.world; if (block instanceof BlockEnderChest) { @@ -97,7 +95,7 @@ public class AnySilentContainer implements IAnySilentContainer { @Override public boolean activateContainer(Player p, boolean silentchest, org.bukkit.block.Block block) { - EntityPlayer player = ((CraftPlayer) p).getHandle(); + EntityPlayer player = PlayerDataManager.getHandle(p); // Silent ender chest is API-only if (silentchest && block.getType() == Material.ENDER_CHEST) { diff --git a/internal/v1_6_R2/src/main/java/com/lishid/openinv/internal/v1_6_R2/InventoryAccess.java b/internal/v1_6_R2/src/main/java/com/lishid/openinv/internal/v1_6_R2/InventoryAccess.java index 25f85bc..6dbaf56 100644 --- a/internal/v1_6_R2/src/main/java/com/lishid/openinv/internal/v1_6_R2/InventoryAccess.java +++ b/internal/v1_6_R2/src/main/java/com/lishid/openinv/internal/v1_6_R2/InventoryAccess.java @@ -23,7 +23,6 @@ import com.lishid.openinv.util.InternalAccessor; import org.bukkit.inventory.Inventory; -// Volatile import net.minecraft.server.v1_6_R2.IInventory; import org.bukkit.craftbukkit.v1_6_R2.inventory.CraftInventory; diff --git a/internal/v1_6_R2/src/main/java/com/lishid/openinv/internal/v1_6_R2/PlayerDataManager.java b/internal/v1_6_R2/src/main/java/com/lishid/openinv/internal/v1_6_R2/PlayerDataManager.java index 36160bc..f0f7b69 100644 --- a/internal/v1_6_R2/src/main/java/com/lishid/openinv/internal/v1_6_R2/PlayerDataManager.java +++ b/internal/v1_6_R2/src/main/java/com/lishid/openinv/internal/v1_6_R2/PlayerDataManager.java @@ -23,14 +23,15 @@ import com.lishid.openinv.internal.IPlayerDataManager; import org.bukkit.Bukkit; import org.bukkit.OfflinePlayer; +import org.bukkit.Server; import org.bukkit.entity.Player; -// Volatile import net.minecraft.server.v1_6_R2.EntityPlayer; import net.minecraft.server.v1_6_R2.MinecraftServer; import net.minecraft.server.v1_6_R2.PlayerInteractManager; import org.bukkit.craftbukkit.v1_6_R2.CraftServer; +import org.bukkit.craftbukkit.v1_6_R2.entity.CraftPlayer; public class PlayerDataManager implements IPlayerDataManager { @@ -77,4 +78,24 @@ public class PlayerDataManager implements IPlayerDataManager { return Arrays.asList(Bukkit.getOnlinePlayers()); } + public static EntityPlayer getHandle(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; + } + } diff --git a/internal/v1_6_R2/src/main/java/com/lishid/openinv/internal/v1_6_R2/SilentContainerChest.java b/internal/v1_6_R2/src/main/java/com/lishid/openinv/internal/v1_6_R2/SilentContainerChest.java index b8cb9dc..d86ca95 100644 --- a/internal/v1_6_R2/src/main/java/com/lishid/openinv/internal/v1_6_R2/SilentContainerChest.java +++ b/internal/v1_6_R2/src/main/java/com/lishid/openinv/internal/v1_6_R2/SilentContainerChest.java @@ -16,7 +16,6 @@ package com.lishid.openinv.internal.v1_6_R2; -// Volatile import net.minecraft.server.v1_6_R2.ContainerChest; import net.minecraft.server.v1_6_R2.EntityHuman; import net.minecraft.server.v1_6_R2.IInventory; diff --git a/internal/v1_6_R2/src/main/java/com/lishid/openinv/internal/v1_6_R2/SpecialEnderChest.java b/internal/v1_6_R2/src/main/java/com/lishid/openinv/internal/v1_6_R2/SpecialEnderChest.java index b7216ec..86ae0c0 100644 --- a/internal/v1_6_R2/src/main/java/com/lishid/openinv/internal/v1_6_R2/SpecialEnderChest.java +++ b/internal/v1_6_R2/src/main/java/com/lishid/openinv/internal/v1_6_R2/SpecialEnderChest.java @@ -27,7 +27,7 @@ import org.bukkit.entity.Player; import org.bukkit.inventory.Inventory; import org.bukkit.inventory.InventoryHolder; -// Volatile +import net.minecraft.server.v1_6_R2.EntityPlayer; import net.minecraft.server.v1_6_R2.IInventory; import net.minecraft.server.v1_6_R2.InventoryEnderChest; import net.minecraft.server.v1_6_R2.InventorySubcontainer; @@ -46,13 +46,13 @@ public class SpecialEnderChest extends InventorySubcontainer implements IInvento private CraftPlayer owner; private int maxStack = MAX_STACK; - public SpecialEnderChest(Player p, Boolean online) { - super(((CraftPlayer) p).getHandle().getEnderChest().getName(), - ((CraftPlayer) p).getHandle().getEnderChest().c(), - ((CraftPlayer) p).getHandle().getEnderChest().getSize()); - CraftPlayer player = (CraftPlayer) p; - this.enderChest = player.getHandle().getEnderChest(); - this.owner = player; + public SpecialEnderChest(Player player, Boolean online) { + super(PlayerDataManager.getHandle(player).getEnderChest().getName(), + PlayerDataManager.getHandle(player).getEnderChest().c(), + PlayerDataManager.getHandle(player).getEnderChest().getSize()); + EntityPlayer nmsPlayer = PlayerDataManager.getHandle(player); + this.enderChest = nmsPlayer.getEnderChest(); + this.owner = nmsPlayer.getBukkitEntity(); this.items = enderChest.getContents(); } @@ -65,8 +65,9 @@ public class SpecialEnderChest extends InventorySubcontainer implements IInvento public void setPlayerOnline(Player player) { if (!playerOnline) { try { - owner = (CraftPlayer) player; - InventoryEnderChest playerEnderChest = owner.getHandle().getEnderChest(); + EntityPlayer nmsPlayer = PlayerDataManager.getHandle(player); + this.owner = nmsPlayer.getBukkitEntity(); + InventoryEnderChest playerEnderChest = nmsPlayer.getEnderChest(); Field field = playerEnderChest.getClass().getField("items"); field.setAccessible(true); field.set(playerEnderChest, this.items); diff --git a/internal/v1_6_R2/src/main/java/com/lishid/openinv/internal/v1_6_R2/SpecialPlayerInventory.java b/internal/v1_6_R2/src/main/java/com/lishid/openinv/internal/v1_6_R2/SpecialPlayerInventory.java index 3e766da..f25c8cc 100644 --- a/internal/v1_6_R2/src/main/java/com/lishid/openinv/internal/v1_6_R2/SpecialPlayerInventory.java +++ b/internal/v1_6_R2/src/main/java/com/lishid/openinv/internal/v1_6_R2/SpecialPlayerInventory.java @@ -21,11 +21,9 @@ import com.lishid.openinv.internal.ISpecialPlayerInventory; import org.bukkit.entity.Player; import org.bukkit.inventory.Inventory; -// Volatile import net.minecraft.server.v1_6_R2.ItemStack; import net.minecraft.server.v1_6_R2.PlayerInventory; -import org.bukkit.craftbukkit.v1_6_R2.entity.CraftPlayer; import org.bukkit.craftbukkit.v1_6_R2.inventory.CraftInventory; public class SpecialPlayerInventory extends PlayerInventory implements ISpecialPlayerInventory { @@ -35,7 +33,7 @@ public class SpecialPlayerInventory extends PlayerInventory implements ISpecialP private boolean playerOnline = false; public SpecialPlayerInventory(Player bukkitPlayer, Boolean online) { - super(((CraftPlayer) bukkitPlayer).getHandle()); + super(PlayerDataManager.getHandle(bukkitPlayer)); this.playerOnline = online; this.items = player.inventory.items; this.armor = player.inventory.armor; @@ -49,7 +47,7 @@ public class SpecialPlayerInventory extends PlayerInventory implements ISpecialP @Override public void setPlayerOnline(Player player) { if (!playerOnline) { - this.player = ((CraftPlayer) player).getHandle(); + this.player = PlayerDataManager.getHandle(player); this.player.inventory.items = this.items; this.player.inventory.armor = this.armor; playerOnline = true; diff --git a/internal/v1_6_R3/src/main/java/com/lishid/openinv/internal/v1_6_R3/AnySilentContainer.java b/internal/v1_6_R3/src/main/java/com/lishid/openinv/internal/v1_6_R3/AnySilentContainer.java index d97d39d..a7dec1d 100644 --- a/internal/v1_6_R3/src/main/java/com/lishid/openinv/internal/v1_6_R3/AnySilentContainer.java +++ b/internal/v1_6_R3/src/main/java/com/lishid/openinv/internal/v1_6_R3/AnySilentContainer.java @@ -22,7 +22,6 @@ import org.bukkit.ChatColor; import org.bukkit.Material; import org.bukkit.entity.Player; -// Volatile import net.minecraft.server.v1_6_R3.AxisAlignedBB; import net.minecraft.server.v1_6_R3.BlockEnderChest; import net.minecraft.server.v1_6_R3.Container; @@ -36,7 +35,6 @@ import net.minecraft.server.v1_6_R3.TileEntityChest; import net.minecraft.server.v1_6_R3.TileEntityEnderChest; import net.minecraft.server.v1_6_R3.World; -import org.bukkit.craftbukkit.v1_6_R3.entity.CraftPlayer; import org.bukkit.craftbukkit.v1_6_R3.event.CraftEventFactory; public class AnySilentContainer implements IAnySilentContainer { @@ -49,7 +47,7 @@ public class AnySilentContainer implements IAnySilentContainer { @Override public boolean isAnyContainerNeeded(Player p, org.bukkit.block.Block block) { // FOR REFERENCE, LOOK AT net.minecraft.server.BlockChest - EntityPlayer player = ((CraftPlayer) p).getHandle(); + EntityPlayer player = PlayerDataManager.getHandle(p); World world = player.world; if (block instanceof BlockEnderChest) { @@ -97,7 +95,7 @@ public class AnySilentContainer implements IAnySilentContainer { @Override public boolean activateContainer(Player p, boolean silentchest, org.bukkit.block.Block block) { - EntityPlayer player = ((CraftPlayer) p).getHandle(); + EntityPlayer player = PlayerDataManager.getHandle(p); // Silent ender chest is API-only if (silentchest && block.getType() == Material.ENDER_CHEST) { diff --git a/internal/v1_6_R3/src/main/java/com/lishid/openinv/internal/v1_6_R3/InventoryAccess.java b/internal/v1_6_R3/src/main/java/com/lishid/openinv/internal/v1_6_R3/InventoryAccess.java index 9bb400f..1a41928 100644 --- a/internal/v1_6_R3/src/main/java/com/lishid/openinv/internal/v1_6_R3/InventoryAccess.java +++ b/internal/v1_6_R3/src/main/java/com/lishid/openinv/internal/v1_6_R3/InventoryAccess.java @@ -23,7 +23,6 @@ import com.lishid.openinv.util.InternalAccessor; import org.bukkit.inventory.Inventory; -// Volatile import net.minecraft.server.v1_6_R3.IInventory; import org.bukkit.craftbukkit.v1_6_R3.inventory.CraftInventory; diff --git a/internal/v1_6_R3/src/main/java/com/lishid/openinv/internal/v1_6_R3/PlayerDataManager.java b/internal/v1_6_R3/src/main/java/com/lishid/openinv/internal/v1_6_R3/PlayerDataManager.java index 4f8758c..f930485 100644 --- a/internal/v1_6_R3/src/main/java/com/lishid/openinv/internal/v1_6_R3/PlayerDataManager.java +++ b/internal/v1_6_R3/src/main/java/com/lishid/openinv/internal/v1_6_R3/PlayerDataManager.java @@ -23,14 +23,15 @@ import com.lishid.openinv.internal.IPlayerDataManager; import org.bukkit.Bukkit; import org.bukkit.OfflinePlayer; +import org.bukkit.Server; import org.bukkit.entity.Player; -// Volatile import net.minecraft.server.v1_6_R3.EntityPlayer; import net.minecraft.server.v1_6_R3.MinecraftServer; import net.minecraft.server.v1_6_R3.PlayerInteractManager; import org.bukkit.craftbukkit.v1_6_R3.CraftServer; +import org.bukkit.craftbukkit.v1_6_R3.entity.CraftPlayer; public class PlayerDataManager implements IPlayerDataManager { @@ -77,4 +78,24 @@ public class PlayerDataManager implements IPlayerDataManager { return Arrays.asList(Bukkit.getOnlinePlayers()); } + public static EntityPlayer getHandle(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; + } + } diff --git a/internal/v1_6_R3/src/main/java/com/lishid/openinv/internal/v1_6_R3/SilentContainerChest.java b/internal/v1_6_R3/src/main/java/com/lishid/openinv/internal/v1_6_R3/SilentContainerChest.java index 57675ba..19b20d6 100644 --- a/internal/v1_6_R3/src/main/java/com/lishid/openinv/internal/v1_6_R3/SilentContainerChest.java +++ b/internal/v1_6_R3/src/main/java/com/lishid/openinv/internal/v1_6_R3/SilentContainerChest.java @@ -16,7 +16,6 @@ package com.lishid.openinv.internal.v1_6_R3; -// Volatile import net.minecraft.server.v1_6_R3.ContainerChest; import net.minecraft.server.v1_6_R3.EntityHuman; import net.minecraft.server.v1_6_R3.IInventory; diff --git a/internal/v1_6_R3/src/main/java/com/lishid/openinv/internal/v1_6_R3/SpecialEnderChest.java b/internal/v1_6_R3/src/main/java/com/lishid/openinv/internal/v1_6_R3/SpecialEnderChest.java index ef0a51e..810fd72 100644 --- a/internal/v1_6_R3/src/main/java/com/lishid/openinv/internal/v1_6_R3/SpecialEnderChest.java +++ b/internal/v1_6_R3/src/main/java/com/lishid/openinv/internal/v1_6_R3/SpecialEnderChest.java @@ -27,7 +27,7 @@ import org.bukkit.entity.Player; import org.bukkit.inventory.Inventory; import org.bukkit.inventory.InventoryHolder; -// Volatile +import net.minecraft.server.v1_6_R3.EntityPlayer; import net.minecraft.server.v1_6_R3.IInventory; import net.minecraft.server.v1_6_R3.InventoryEnderChest; import net.minecraft.server.v1_6_R3.InventorySubcontainer; @@ -46,13 +46,13 @@ public class SpecialEnderChest extends InventorySubcontainer implements IInvento private CraftPlayer owner; private int maxStack = MAX_STACK; - public SpecialEnderChest(Player p, Boolean online) { - super(((CraftPlayer) p).getHandle().getEnderChest().getName(), - ((CraftPlayer) p).getHandle().getEnderChest().c(), - ((CraftPlayer) p).getHandle().getEnderChest().getSize()); - CraftPlayer player = (CraftPlayer) p; - this.enderChest = player.getHandle().getEnderChest(); - this.owner = player; + public SpecialEnderChest(Player player, Boolean online) { + super(PlayerDataManager.getHandle(player).getEnderChest().getName(), + PlayerDataManager.getHandle(player).getEnderChest().c(), + PlayerDataManager.getHandle(player).getEnderChest().getSize()); + EntityPlayer nmsPlayer = PlayerDataManager.getHandle(player); + this.enderChest = nmsPlayer.getEnderChest(); + this.owner = nmsPlayer.getBukkitEntity(); this.items = enderChest.getContents(); } @@ -65,8 +65,9 @@ public class SpecialEnderChest extends InventorySubcontainer implements IInvento public void setPlayerOnline(Player player) { if (!playerOnline) { try { - owner = (CraftPlayer) player; - InventoryEnderChest playerEnderChest = owner.getHandle().getEnderChest(); + EntityPlayer nmsPlayer = PlayerDataManager.getHandle(player); + this.owner = nmsPlayer.getBukkitEntity(); + InventoryEnderChest playerEnderChest = nmsPlayer.getEnderChest(); Field field = playerEnderChest.getClass().getField("items"); field.setAccessible(true); field.set(playerEnderChest, this.items); diff --git a/internal/v1_6_R3/src/main/java/com/lishid/openinv/internal/v1_6_R3/SpecialPlayerInventory.java b/internal/v1_6_R3/src/main/java/com/lishid/openinv/internal/v1_6_R3/SpecialPlayerInventory.java index 9031b60..c6d4aac 100644 --- a/internal/v1_6_R3/src/main/java/com/lishid/openinv/internal/v1_6_R3/SpecialPlayerInventory.java +++ b/internal/v1_6_R3/src/main/java/com/lishid/openinv/internal/v1_6_R3/SpecialPlayerInventory.java @@ -21,11 +21,9 @@ import com.lishid.openinv.internal.ISpecialPlayerInventory; import org.bukkit.entity.Player; import org.bukkit.inventory.Inventory; -// Volatile import net.minecraft.server.v1_6_R3.ItemStack; import net.minecraft.server.v1_6_R3.PlayerInventory; -import org.bukkit.craftbukkit.v1_6_R3.entity.CraftPlayer; import org.bukkit.craftbukkit.v1_6_R3.inventory.CraftInventory; public class SpecialPlayerInventory extends PlayerInventory implements ISpecialPlayerInventory { @@ -35,7 +33,7 @@ public class SpecialPlayerInventory extends PlayerInventory implements ISpecialP private boolean playerOnline = false; public SpecialPlayerInventory(Player bukkitPlayer, Boolean online) { - super(((CraftPlayer) bukkitPlayer).getHandle()); + super(PlayerDataManager.getHandle(bukkitPlayer)); this.playerOnline = online; this.items = player.inventory.items; this.armor = player.inventory.armor; @@ -49,7 +47,7 @@ public class SpecialPlayerInventory extends PlayerInventory implements ISpecialP @Override public void setPlayerOnline(Player player) { if (!playerOnline) { - this.player = ((CraftPlayer) player).getHandle(); + this.player = PlayerDataManager.getHandle(player); this.player.inventory.items = this.items; this.player.inventory.armor = this.armor; playerOnline = true; diff --git a/internal/v1_7_R1/src/main/java/com/lishid/openinv/internal/v1_7_R1/AnySilentContainer.java b/internal/v1_7_R1/src/main/java/com/lishid/openinv/internal/v1_7_R1/AnySilentContainer.java index c9e82a1..2e71862 100644 --- a/internal/v1_7_R1/src/main/java/com/lishid/openinv/internal/v1_7_R1/AnySilentContainer.java +++ b/internal/v1_7_R1/src/main/java/com/lishid/openinv/internal/v1_7_R1/AnySilentContainer.java @@ -22,7 +22,6 @@ import org.bukkit.ChatColor; import org.bukkit.Material; import org.bukkit.entity.Player; -//Volatile import net.minecraft.server.v1_7_R1.AxisAlignedBB; import net.minecraft.server.v1_7_R1.Block; import net.minecraft.server.v1_7_R1.BlockEnderChest; @@ -37,7 +36,6 @@ import net.minecraft.server.v1_7_R1.TileEntityChest; import net.minecraft.server.v1_7_R1.TileEntityEnderChest; import net.minecraft.server.v1_7_R1.World; -import org.bukkit.craftbukkit.v1_7_R1.entity.CraftPlayer; import org.bukkit.craftbukkit.v1_7_R1.event.CraftEventFactory; public class AnySilentContainer implements IAnySilentContainer { @@ -50,7 +48,7 @@ public class AnySilentContainer implements IAnySilentContainer { @Override public boolean isAnyContainerNeeded(Player p, org.bukkit.block.Block block) { // FOR REFERENCE, LOOK AT net.minecraft.server.BlockChest - EntityPlayer player = ((CraftPlayer) p).getHandle(); + EntityPlayer player = PlayerDataManager.getHandle(p); World world = player.world; if (block instanceof BlockEnderChest) { @@ -98,7 +96,7 @@ public class AnySilentContainer implements IAnySilentContainer { @Override public boolean activateContainer(Player p, boolean silentchest, org.bukkit.block.Block block) { - EntityPlayer player = ((CraftPlayer) p).getHandle(); + EntityPlayer player = PlayerDataManager.getHandle(p); // Silent ender chest is API-only if (silentchest && block.getType() == Material.ENDER_CHEST) { diff --git a/internal/v1_7_R1/src/main/java/com/lishid/openinv/internal/v1_7_R1/InventoryAccess.java b/internal/v1_7_R1/src/main/java/com/lishid/openinv/internal/v1_7_R1/InventoryAccess.java index 372a2b9..056d132 100644 --- a/internal/v1_7_R1/src/main/java/com/lishid/openinv/internal/v1_7_R1/InventoryAccess.java +++ b/internal/v1_7_R1/src/main/java/com/lishid/openinv/internal/v1_7_R1/InventoryAccess.java @@ -23,7 +23,6 @@ import com.lishid.openinv.util.InternalAccessor; import org.bukkit.inventory.Inventory; -// Volatile import net.minecraft.server.v1_7_R1.IInventory; import org.bukkit.craftbukkit.v1_7_R1.inventory.CraftInventory; diff --git a/internal/v1_7_R1/src/main/java/com/lishid/openinv/internal/v1_7_R1/PlayerDataManager.java b/internal/v1_7_R1/src/main/java/com/lishid/openinv/internal/v1_7_R1/PlayerDataManager.java index 1b94342..e063345 100644 --- a/internal/v1_7_R1/src/main/java/com/lishid/openinv/internal/v1_7_R1/PlayerDataManager.java +++ b/internal/v1_7_R1/src/main/java/com/lishid/openinv/internal/v1_7_R1/PlayerDataManager.java @@ -23,15 +23,16 @@ import com.lishid.openinv.internal.IPlayerDataManager; import org.bukkit.Bukkit; import org.bukkit.OfflinePlayer; +import org.bukkit.Server; import org.bukkit.entity.Player; -// Volatile import net.minecraft.server.v1_7_R1.EntityPlayer; import net.minecraft.server.v1_7_R1.MinecraftServer; import net.minecraft.server.v1_7_R1.PlayerInteractManager; import net.minecraft.util.com.mojang.authlib.GameProfile; import org.bukkit.craftbukkit.v1_7_R1.CraftServer; +import org.bukkit.craftbukkit.v1_7_R1.entity.CraftPlayer; public class PlayerDataManager implements IPlayerDataManager { @@ -78,4 +79,24 @@ public class PlayerDataManager implements IPlayerDataManager { return Arrays.asList(Bukkit.getOnlinePlayers()); } + public static EntityPlayer getHandle(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; + } + } diff --git a/internal/v1_7_R1/src/main/java/com/lishid/openinv/internal/v1_7_R1/SilentContainerChest.java b/internal/v1_7_R1/src/main/java/com/lishid/openinv/internal/v1_7_R1/SilentContainerChest.java index 232c4b7..ea7861c 100644 --- a/internal/v1_7_R1/src/main/java/com/lishid/openinv/internal/v1_7_R1/SilentContainerChest.java +++ b/internal/v1_7_R1/src/main/java/com/lishid/openinv/internal/v1_7_R1/SilentContainerChest.java @@ -16,7 +16,6 @@ package com.lishid.openinv.internal.v1_7_R1; -// Volatile import net.minecraft.server.v1_7_R1.ContainerChest; import net.minecraft.server.v1_7_R1.EntityHuman; import net.minecraft.server.v1_7_R1.IInventory; diff --git a/internal/v1_7_R1/src/main/java/com/lishid/openinv/internal/v1_7_R1/SpecialEnderChest.java b/internal/v1_7_R1/src/main/java/com/lishid/openinv/internal/v1_7_R1/SpecialEnderChest.java index 2d0cac5..9ca3a5a 100644 --- a/internal/v1_7_R1/src/main/java/com/lishid/openinv/internal/v1_7_R1/SpecialEnderChest.java +++ b/internal/v1_7_R1/src/main/java/com/lishid/openinv/internal/v1_7_R1/SpecialEnderChest.java @@ -27,7 +27,7 @@ import org.bukkit.entity.Player; import org.bukkit.inventory.Inventory; import org.bukkit.inventory.InventoryHolder; -// Volatile +import net.minecraft.server.v1_7_R1.EntityPlayer; import net.minecraft.server.v1_7_R1.IInventory; import net.minecraft.server.v1_7_R1.InventoryEnderChest; import net.minecraft.server.v1_7_R1.InventorySubcontainer; @@ -46,13 +46,13 @@ public class SpecialEnderChest extends InventorySubcontainer implements IInvento private CraftPlayer owner; private int maxStack = MAX_STACK; - public SpecialEnderChest(Player p, Boolean online) { - super(((CraftPlayer) p).getHandle().getEnderChest().getInventoryName(), - ((CraftPlayer) p).getHandle().getEnderChest().k_(), - ((CraftPlayer) p).getHandle().getEnderChest().getSize()); - CraftPlayer player = (CraftPlayer) p; - this.enderChest = player.getHandle().getEnderChest(); - this.owner = player; + public SpecialEnderChest(Player player, Boolean online) { + super(PlayerDataManager.getHandle(player).getEnderChest().getInventoryName(), + PlayerDataManager.getHandle(player).getEnderChest().k_(), + PlayerDataManager.getHandle(player).getEnderChest().getSize()); + EntityPlayer nmsPlayer = PlayerDataManager.getHandle(player); + this.enderChest = nmsPlayer.getEnderChest(); + this.owner = nmsPlayer.getBukkitEntity(); this.items = enderChest.getContents(); } @@ -65,8 +65,9 @@ public class SpecialEnderChest extends InventorySubcontainer implements IInvento public void setPlayerOnline(Player player) { if (!playerOnline) { try { - owner = (CraftPlayer) player; - InventoryEnderChest playerEnderChest = owner.getHandle().getEnderChest(); + EntityPlayer nmsPlayer = PlayerDataManager.getHandle(player); + this.owner = nmsPlayer.getBukkitEntity(); + InventoryEnderChest playerEnderChest = nmsPlayer.getEnderChest(); Field field = playerEnderChest.getClass().getField("items"); field.setAccessible(true); field.set(playerEnderChest, this.items); diff --git a/internal/v1_7_R1/src/main/java/com/lishid/openinv/internal/v1_7_R1/SpecialPlayerInventory.java b/internal/v1_7_R1/src/main/java/com/lishid/openinv/internal/v1_7_R1/SpecialPlayerInventory.java index 885369a..911d2fb 100644 --- a/internal/v1_7_R1/src/main/java/com/lishid/openinv/internal/v1_7_R1/SpecialPlayerInventory.java +++ b/internal/v1_7_R1/src/main/java/com/lishid/openinv/internal/v1_7_R1/SpecialPlayerInventory.java @@ -21,11 +21,9 @@ import com.lishid.openinv.internal.ISpecialPlayerInventory; import org.bukkit.entity.Player; import org.bukkit.inventory.Inventory; -// Volatile import net.minecraft.server.v1_7_R1.ItemStack; import net.minecraft.server.v1_7_R1.PlayerInventory; -import org.bukkit.craftbukkit.v1_7_R1.entity.CraftPlayer; import org.bukkit.craftbukkit.v1_7_R1.inventory.CraftInventory; public class SpecialPlayerInventory extends PlayerInventory implements ISpecialPlayerInventory { @@ -35,7 +33,7 @@ public class SpecialPlayerInventory extends PlayerInventory implements ISpecialP private boolean playerOnline = false; public SpecialPlayerInventory(Player bukkitPlayer, Boolean online) { - super(((CraftPlayer) bukkitPlayer).getHandle()); + super(PlayerDataManager.getHandle(bukkitPlayer)); this.playerOnline = online; this.items = player.inventory.items; this.armor = player.inventory.armor; @@ -49,7 +47,7 @@ public class SpecialPlayerInventory extends PlayerInventory implements ISpecialP @Override public void setPlayerOnline(Player player) { if (!playerOnline) { - this.player = ((CraftPlayer) player).getHandle(); + this.player = PlayerDataManager.getHandle(player); this.player.inventory.items = this.items; this.player.inventory.armor = this.armor; playerOnline = true; diff --git a/internal/v1_7_R2/src/main/java/com/lishid/openinv/internal/v1_7_R2/AnySilentContainer.java b/internal/v1_7_R2/src/main/java/com/lishid/openinv/internal/v1_7_R2/AnySilentContainer.java index ddd5e43..2252593 100644 --- a/internal/v1_7_R2/src/main/java/com/lishid/openinv/internal/v1_7_R2/AnySilentContainer.java +++ b/internal/v1_7_R2/src/main/java/com/lishid/openinv/internal/v1_7_R2/AnySilentContainer.java @@ -22,7 +22,6 @@ import org.bukkit.ChatColor; import org.bukkit.Material; import org.bukkit.entity.Player; -//Volatile import net.minecraft.server.v1_7_R2.AxisAlignedBB; import net.minecraft.server.v1_7_R2.Block; import net.minecraft.server.v1_7_R2.BlockEnderChest; @@ -37,7 +36,6 @@ import net.minecraft.server.v1_7_R2.TileEntityChest; import net.minecraft.server.v1_7_R2.TileEntityEnderChest; import net.minecraft.server.v1_7_R2.World; -import org.bukkit.craftbukkit.v1_7_R2.entity.CraftPlayer; import org.bukkit.craftbukkit.v1_7_R2.event.CraftEventFactory; public class AnySilentContainer implements IAnySilentContainer { @@ -50,7 +48,7 @@ public class AnySilentContainer implements IAnySilentContainer { @Override public boolean isAnyContainerNeeded(Player p, org.bukkit.block.Block block) { // FOR REFERENCE, LOOK AT net.minecraft.server.BlockChest - EntityPlayer player = ((CraftPlayer) p).getHandle(); + EntityPlayer player = PlayerDataManager.getHandle(p); World world = player.world; if (block instanceof BlockEnderChest) { @@ -98,7 +96,7 @@ public class AnySilentContainer implements IAnySilentContainer { @Override public boolean activateContainer(Player p, boolean silentchest, org.bukkit.block.Block block) { - EntityPlayer player = ((CraftPlayer) p).getHandle(); + EntityPlayer player = PlayerDataManager.getHandle(p); // Silent ender chest is API-only if (silentchest && block.getType() == Material.ENDER_CHEST) { diff --git a/internal/v1_7_R2/src/main/java/com/lishid/openinv/internal/v1_7_R2/InventoryAccess.java b/internal/v1_7_R2/src/main/java/com/lishid/openinv/internal/v1_7_R2/InventoryAccess.java index 1012348..bb8464f 100644 --- a/internal/v1_7_R2/src/main/java/com/lishid/openinv/internal/v1_7_R2/InventoryAccess.java +++ b/internal/v1_7_R2/src/main/java/com/lishid/openinv/internal/v1_7_R2/InventoryAccess.java @@ -23,7 +23,6 @@ import com.lishid.openinv.util.InternalAccessor; import org.bukkit.inventory.Inventory; -// Volatile import net.minecraft.server.v1_7_R2.IInventory; import org.bukkit.craftbukkit.v1_7_R2.inventory.CraftInventory; diff --git a/internal/v1_7_R2/src/main/java/com/lishid/openinv/internal/v1_7_R2/PlayerDataManager.java b/internal/v1_7_R2/src/main/java/com/lishid/openinv/internal/v1_7_R2/PlayerDataManager.java index cd786df..d079981 100644 --- a/internal/v1_7_R2/src/main/java/com/lishid/openinv/internal/v1_7_R2/PlayerDataManager.java +++ b/internal/v1_7_R2/src/main/java/com/lishid/openinv/internal/v1_7_R2/PlayerDataManager.java @@ -23,15 +23,16 @@ import com.lishid.openinv.internal.IPlayerDataManager; import org.bukkit.Bukkit; import org.bukkit.OfflinePlayer; +import org.bukkit.Server; import org.bukkit.entity.Player; -//Volatile import net.minecraft.server.v1_7_R2.EntityPlayer; import net.minecraft.server.v1_7_R2.MinecraftServer; import net.minecraft.server.v1_7_R2.PlayerInteractManager; import net.minecraft.util.com.mojang.authlib.GameProfile; import org.bukkit.craftbukkit.v1_7_R2.CraftServer; +import org.bukkit.craftbukkit.v1_7_R2.entity.CraftPlayer; @SuppressWarnings("deprecation") // Deprecated methods are used properly and will not change. public class PlayerDataManager implements IPlayerDataManager { @@ -79,4 +80,24 @@ public class PlayerDataManager implements IPlayerDataManager { return Arrays.asList(Bukkit.getOnlinePlayers()); } + public static EntityPlayer getHandle(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; + } + } diff --git a/internal/v1_7_R2/src/main/java/com/lishid/openinv/internal/v1_7_R2/SilentContainerChest.java b/internal/v1_7_R2/src/main/java/com/lishid/openinv/internal/v1_7_R2/SilentContainerChest.java index 7a9ce16..d6c943a 100644 --- a/internal/v1_7_R2/src/main/java/com/lishid/openinv/internal/v1_7_R2/SilentContainerChest.java +++ b/internal/v1_7_R2/src/main/java/com/lishid/openinv/internal/v1_7_R2/SilentContainerChest.java @@ -16,7 +16,6 @@ package com.lishid.openinv.internal.v1_7_R2; -// Volatile import net.minecraft.server.v1_7_R2.ContainerChest; import net.minecraft.server.v1_7_R2.EntityHuman; import net.minecraft.server.v1_7_R2.IInventory; diff --git a/internal/v1_7_R2/src/main/java/com/lishid/openinv/internal/v1_7_R2/SpecialEnderChest.java b/internal/v1_7_R2/src/main/java/com/lishid/openinv/internal/v1_7_R2/SpecialEnderChest.java index 0bd4456..1b12b80 100644 --- a/internal/v1_7_R2/src/main/java/com/lishid/openinv/internal/v1_7_R2/SpecialEnderChest.java +++ b/internal/v1_7_R2/src/main/java/com/lishid/openinv/internal/v1_7_R2/SpecialEnderChest.java @@ -27,7 +27,7 @@ import org.bukkit.entity.Player; import org.bukkit.inventory.Inventory; import org.bukkit.inventory.InventoryHolder; -// Volatile +import net.minecraft.server.v1_7_R2.EntityPlayer; import net.minecraft.server.v1_7_R2.IInventory; import net.minecraft.server.v1_7_R2.InventoryEnderChest; import net.minecraft.server.v1_7_R2.InventorySubcontainer; @@ -46,13 +46,13 @@ public class SpecialEnderChest extends InventorySubcontainer implements IInvento private CraftPlayer owner; private int maxStack = MAX_STACK; - public SpecialEnderChest(Player p, Boolean online) { - super(((CraftPlayer) p).getHandle().getEnderChest().getInventoryName(), - ((CraftPlayer) p).getHandle().getEnderChest().k_(), - ((CraftPlayer) p).getHandle().getEnderChest().getSize()); - CraftPlayer player = (CraftPlayer) p; - this.enderChest = player.getHandle().getEnderChest(); - this.owner = player; + public SpecialEnderChest(Player player, Boolean online) { + super(((CraftPlayer) player).getHandle().getEnderChest().getInventoryName(), + ((CraftPlayer) player).getHandle().getEnderChest().k_(), + ((CraftPlayer) player).getHandle().getEnderChest().getSize()); + EntityPlayer nmsPlayer = PlayerDataManager.getHandle(player); + this.enderChest = nmsPlayer.getEnderChest(); + this.owner = nmsPlayer.getBukkitEntity(); this.items = enderChest.getContents(); } @@ -65,8 +65,9 @@ public class SpecialEnderChest extends InventorySubcontainer implements IInvento public void setPlayerOnline(Player player) { if (!playerOnline) { try { - owner = (CraftPlayer) player; - InventoryEnderChest playerEnderChest = owner.getHandle().getEnderChest(); + EntityPlayer nmsPlayer = PlayerDataManager.getHandle(player); + this.owner = nmsPlayer.getBukkitEntity(); + InventoryEnderChest playerEnderChest = nmsPlayer.getEnderChest(); Field field = playerEnderChest.getClass().getField("items"); field.setAccessible(true); field.set(playerEnderChest, this.items); diff --git a/internal/v1_7_R2/src/main/java/com/lishid/openinv/internal/v1_7_R2/SpecialPlayerInventory.java b/internal/v1_7_R2/src/main/java/com/lishid/openinv/internal/v1_7_R2/SpecialPlayerInventory.java index c08d9e0..f259f31 100644 --- a/internal/v1_7_R2/src/main/java/com/lishid/openinv/internal/v1_7_R2/SpecialPlayerInventory.java +++ b/internal/v1_7_R2/src/main/java/com/lishid/openinv/internal/v1_7_R2/SpecialPlayerInventory.java @@ -21,11 +21,9 @@ import com.lishid.openinv.internal.ISpecialPlayerInventory; import org.bukkit.entity.Player; import org.bukkit.inventory.Inventory; -// Volatile import net.minecraft.server.v1_7_R2.ItemStack; import net.minecraft.server.v1_7_R2.PlayerInventory; -import org.bukkit.craftbukkit.v1_7_R2.entity.CraftPlayer; import org.bukkit.craftbukkit.v1_7_R2.inventory.CraftInventory; public class SpecialPlayerInventory extends PlayerInventory implements ISpecialPlayerInventory { @@ -35,7 +33,7 @@ public class SpecialPlayerInventory extends PlayerInventory implements ISpecialP private boolean playerOnline = false; public SpecialPlayerInventory(Player bukkitPlayer, Boolean online) { - super(((CraftPlayer) bukkitPlayer).getHandle()); + super(PlayerDataManager.getHandle(bukkitPlayer)); this.playerOnline = online; this.items = player.inventory.items; this.armor = player.inventory.armor; @@ -49,7 +47,7 @@ public class SpecialPlayerInventory extends PlayerInventory implements ISpecialP @Override public void setPlayerOnline(Player player) { if (!playerOnline) { - this.player = ((CraftPlayer) player).getHandle(); + this.player = PlayerDataManager.getHandle(player); this.player.inventory.items = this.items; this.player.inventory.armor = this.armor; playerOnline = true; diff --git a/internal/v1_7_R3/src/main/java/com/lishid/openinv/internal/v1_7_R3/AnySilentContainer.java b/internal/v1_7_R3/src/main/java/com/lishid/openinv/internal/v1_7_R3/AnySilentContainer.java index d057b01..da958e5 100644 --- a/internal/v1_7_R3/src/main/java/com/lishid/openinv/internal/v1_7_R3/AnySilentContainer.java +++ b/internal/v1_7_R3/src/main/java/com/lishid/openinv/internal/v1_7_R3/AnySilentContainer.java @@ -22,7 +22,6 @@ import org.bukkit.ChatColor; import org.bukkit.Material; import org.bukkit.entity.Player; -// Volatile import net.minecraft.server.v1_7_R3.AxisAlignedBB; import net.minecraft.server.v1_7_R3.Block; import net.minecraft.server.v1_7_R3.BlockEnderChest; @@ -37,7 +36,6 @@ import net.minecraft.server.v1_7_R3.TileEntityChest; import net.minecraft.server.v1_7_R3.TileEntityEnderChest; import net.minecraft.server.v1_7_R3.World; -import org.bukkit.craftbukkit.v1_7_R3.entity.CraftPlayer; import org.bukkit.craftbukkit.v1_7_R3.event.CraftEventFactory; public class AnySilentContainer implements IAnySilentContainer { @@ -50,7 +48,7 @@ public class AnySilentContainer implements IAnySilentContainer { @Override public boolean isAnyContainerNeeded(Player p, org.bukkit.block.Block block) { // FOR REFERENCE, LOOK AT net.minecraft.server.BlockChest - EntityPlayer player = ((CraftPlayer) p).getHandle(); + EntityPlayer player = PlayerDataManager.getHandle(p); World world = player.world; if (block instanceof BlockEnderChest) { @@ -98,7 +96,7 @@ public class AnySilentContainer implements IAnySilentContainer { @Override public boolean activateContainer(Player p, boolean silentchest, org.bukkit.block.Block block) { - EntityPlayer player = ((CraftPlayer) p).getHandle(); + EntityPlayer player = PlayerDataManager.getHandle(p); // Silent ender chest is API-only if (silentchest && block.getType() == Material.ENDER_CHEST) { diff --git a/internal/v1_7_R3/src/main/java/com/lishid/openinv/internal/v1_7_R3/InventoryAccess.java b/internal/v1_7_R3/src/main/java/com/lishid/openinv/internal/v1_7_R3/InventoryAccess.java index 41ff36f..f62dbc4 100644 --- a/internal/v1_7_R3/src/main/java/com/lishid/openinv/internal/v1_7_R3/InventoryAccess.java +++ b/internal/v1_7_R3/src/main/java/com/lishid/openinv/internal/v1_7_R3/InventoryAccess.java @@ -23,7 +23,6 @@ import com.lishid.openinv.util.InternalAccessor; import org.bukkit.inventory.Inventory; -// Volatile import net.minecraft.server.v1_7_R3.IInventory; import org.bukkit.craftbukkit.v1_7_R3.inventory.CraftInventory; diff --git a/internal/v1_7_R3/src/main/java/com/lishid/openinv/internal/v1_7_R3/PlayerDataManager.java b/internal/v1_7_R3/src/main/java/com/lishid/openinv/internal/v1_7_R3/PlayerDataManager.java index ecc6cf0..d8a7070 100644 --- a/internal/v1_7_R3/src/main/java/com/lishid/openinv/internal/v1_7_R3/PlayerDataManager.java +++ b/internal/v1_7_R3/src/main/java/com/lishid/openinv/internal/v1_7_R3/PlayerDataManager.java @@ -24,15 +24,16 @@ import com.lishid.openinv.internal.IPlayerDataManager; import org.bukkit.Bukkit; import org.bukkit.OfflinePlayer; +import org.bukkit.Server; import org.bukkit.entity.Player; -// Volatile import net.minecraft.server.v1_7_R3.EntityPlayer; import net.minecraft.server.v1_7_R3.MinecraftServer; import net.minecraft.server.v1_7_R3.PlayerInteractManager; import net.minecraft.util.com.mojang.authlib.GameProfile; import org.bukkit.craftbukkit.v1_7_R3.CraftServer; +import org.bukkit.craftbukkit.v1_7_R3.entity.CraftPlayer; public class PlayerDataManager implements IPlayerDataManager { @@ -85,4 +86,24 @@ public class PlayerDataManager implements IPlayerDataManager { return Arrays.asList(Bukkit.getOnlinePlayers()); } + public static EntityPlayer getHandle(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; + } + } diff --git a/internal/v1_7_R3/src/main/java/com/lishid/openinv/internal/v1_7_R3/SilentContainerChest.java b/internal/v1_7_R3/src/main/java/com/lishid/openinv/internal/v1_7_R3/SilentContainerChest.java index cc1a746..3e89651 100644 --- a/internal/v1_7_R3/src/main/java/com/lishid/openinv/internal/v1_7_R3/SilentContainerChest.java +++ b/internal/v1_7_R3/src/main/java/com/lishid/openinv/internal/v1_7_R3/SilentContainerChest.java @@ -16,7 +16,6 @@ package com.lishid.openinv.internal.v1_7_R3; -// Volatile import net.minecraft.server.v1_7_R3.ContainerChest; import net.minecraft.server.v1_7_R3.EntityHuman; import net.minecraft.server.v1_7_R3.IInventory; diff --git a/internal/v1_7_R3/src/main/java/com/lishid/openinv/internal/v1_7_R3/SpecialEnderChest.java b/internal/v1_7_R3/src/main/java/com/lishid/openinv/internal/v1_7_R3/SpecialEnderChest.java index 60d5e4e..349fccb 100644 --- a/internal/v1_7_R3/src/main/java/com/lishid/openinv/internal/v1_7_R3/SpecialEnderChest.java +++ b/internal/v1_7_R3/src/main/java/com/lishid/openinv/internal/v1_7_R3/SpecialEnderChest.java @@ -27,7 +27,7 @@ import org.bukkit.entity.Player; import org.bukkit.inventory.Inventory; import org.bukkit.inventory.InventoryHolder; -// Volatile +import net.minecraft.server.v1_7_R3.EntityPlayer; import net.minecraft.server.v1_7_R3.IInventory; import net.minecraft.server.v1_7_R3.InventoryEnderChest; import net.minecraft.server.v1_7_R3.InventorySubcontainer; @@ -46,13 +46,13 @@ public class SpecialEnderChest extends InventorySubcontainer implements IInvento private CraftPlayer owner; private int maxStack = MAX_STACK; - public SpecialEnderChest(Player p, Boolean online) { - super(((CraftPlayer) p).getHandle().getEnderChest().getInventoryName(), - ((CraftPlayer) p).getHandle().getEnderChest().k_(), - ((CraftPlayer) p).getHandle().getEnderChest().getSize()); - CraftPlayer player = (CraftPlayer) p; - this.enderChest = player.getHandle().getEnderChest(); - this.owner = player; + public SpecialEnderChest(Player player, Boolean online) { + super(PlayerDataManager.getHandle(player).getEnderChest().getInventoryName(), + PlayerDataManager.getHandle(player).getEnderChest().k_(), + PlayerDataManager.getHandle(player).getEnderChest().getSize()); + EntityPlayer nmsPlayer = PlayerDataManager.getHandle(player); + this.enderChest = nmsPlayer.getEnderChest(); + this.owner = nmsPlayer.getBukkitEntity(); this.items = enderChest.getContents(); } @@ -65,8 +65,9 @@ public class SpecialEnderChest extends InventorySubcontainer implements IInvento public void setPlayerOnline(Player player) { if (!playerOnline) { try { - owner = (CraftPlayer) player; - InventoryEnderChest playerEnderChest = owner.getHandle().getEnderChest(); + EntityPlayer nmsPlayer = PlayerDataManager.getHandle(player); + this.owner = nmsPlayer.getBukkitEntity(); + InventoryEnderChest playerEnderChest = nmsPlayer.getEnderChest(); Field field = playerEnderChest.getClass().getField("items"); field.setAccessible(true); field.set(playerEnderChest, this.items); diff --git a/internal/v1_7_R3/src/main/java/com/lishid/openinv/internal/v1_7_R3/SpecialPlayerInventory.java b/internal/v1_7_R3/src/main/java/com/lishid/openinv/internal/v1_7_R3/SpecialPlayerInventory.java index af2b6d3..5126447 100644 --- a/internal/v1_7_R3/src/main/java/com/lishid/openinv/internal/v1_7_R3/SpecialPlayerInventory.java +++ b/internal/v1_7_R3/src/main/java/com/lishid/openinv/internal/v1_7_R3/SpecialPlayerInventory.java @@ -21,11 +21,9 @@ import com.lishid.openinv.internal.ISpecialPlayerInventory; import org.bukkit.entity.Player; import org.bukkit.inventory.Inventory; -// Volatile import net.minecraft.server.v1_7_R3.ItemStack; import net.minecraft.server.v1_7_R3.PlayerInventory; -import org.bukkit.craftbukkit.v1_7_R3.entity.CraftPlayer; import org.bukkit.craftbukkit.v1_7_R3.inventory.CraftInventory; public class SpecialPlayerInventory extends PlayerInventory implements ISpecialPlayerInventory { @@ -35,7 +33,7 @@ public class SpecialPlayerInventory extends PlayerInventory implements ISpecialP private boolean playerOnline = false; public SpecialPlayerInventory(Player bukkitPlayer, Boolean online) { - super(((CraftPlayer) bukkitPlayer).getHandle()); + super(PlayerDataManager.getHandle(bukkitPlayer)); this.playerOnline = online; this.items = player.inventory.items; this.armor = player.inventory.armor; @@ -49,7 +47,7 @@ public class SpecialPlayerInventory extends PlayerInventory implements ISpecialP @Override public void setPlayerOnline(Player player) { if (!playerOnline) { - this.player = ((CraftPlayer) player).getHandle(); + this.player = PlayerDataManager.getHandle(player); this.player.inventory.items = this.items; this.player.inventory.armor = this.armor; playerOnline = true; diff --git a/internal/v1_7_R4/src/main/java/com/lishid/openinv/internal/v1_7_R4/AnySilentContainer.java b/internal/v1_7_R4/src/main/java/com/lishid/openinv/internal/v1_7_R4/AnySilentContainer.java index 0b2b855..c56b6b9 100644 --- a/internal/v1_7_R4/src/main/java/com/lishid/openinv/internal/v1_7_R4/AnySilentContainer.java +++ b/internal/v1_7_R4/src/main/java/com/lishid/openinv/internal/v1_7_R4/AnySilentContainer.java @@ -22,7 +22,6 @@ import org.bukkit.ChatColor; import org.bukkit.Material; import org.bukkit.entity.Player; -// Volatile import net.minecraft.server.v1_7_R4.AxisAlignedBB; import net.minecraft.server.v1_7_R4.Block; import net.minecraft.server.v1_7_R4.BlockEnderChest; @@ -37,7 +36,6 @@ import net.minecraft.server.v1_7_R4.TileEntityChest; import net.minecraft.server.v1_7_R4.TileEntityEnderChest; import net.minecraft.server.v1_7_R4.World; -import org.bukkit.craftbukkit.v1_7_R4.entity.CraftPlayer; import org.bukkit.craftbukkit.v1_7_R4.event.CraftEventFactory; public class AnySilentContainer implements IAnySilentContainer { @@ -50,7 +48,7 @@ public class AnySilentContainer implements IAnySilentContainer { @Override public boolean isAnyContainerNeeded(Player p, org.bukkit.block.Block block) { // FOR REFERENCE, LOOK AT net.minecraft.server.BlockChest - EntityPlayer player = ((CraftPlayer) p).getHandle(); + EntityPlayer player = PlayerDataManager.getHandle(p); World world = player.world; if (block instanceof BlockEnderChest) { @@ -98,7 +96,7 @@ public class AnySilentContainer implements IAnySilentContainer { @Override public boolean activateContainer(Player p, boolean silentchest, org.bukkit.block.Block block) { - EntityPlayer player = ((CraftPlayer) p).getHandle(); + EntityPlayer player = PlayerDataManager.getHandle(p); // Silent ender chest is API-only if (silentchest && block.getType() == Material.ENDER_CHEST) { diff --git a/internal/v1_7_R4/src/main/java/com/lishid/openinv/internal/v1_7_R4/InventoryAccess.java b/internal/v1_7_R4/src/main/java/com/lishid/openinv/internal/v1_7_R4/InventoryAccess.java index dc7b7c1..4f5e0c3 100644 --- a/internal/v1_7_R4/src/main/java/com/lishid/openinv/internal/v1_7_R4/InventoryAccess.java +++ b/internal/v1_7_R4/src/main/java/com/lishid/openinv/internal/v1_7_R4/InventoryAccess.java @@ -23,7 +23,6 @@ import com.lishid.openinv.util.InternalAccessor; import org.bukkit.inventory.Inventory; -// Volatile import net.minecraft.server.v1_7_R4.IInventory; import org.bukkit.craftbukkit.v1_7_R4.inventory.CraftInventory; diff --git a/internal/v1_7_R4/src/main/java/com/lishid/openinv/internal/v1_7_R4/PlayerDataManager.java b/internal/v1_7_R4/src/main/java/com/lishid/openinv/internal/v1_7_R4/PlayerDataManager.java index 62f85b9..0b765ae 100644 --- a/internal/v1_7_R4/src/main/java/com/lishid/openinv/internal/v1_7_R4/PlayerDataManager.java +++ b/internal/v1_7_R4/src/main/java/com/lishid/openinv/internal/v1_7_R4/PlayerDataManager.java @@ -23,15 +23,16 @@ import com.lishid.openinv.internal.IPlayerDataManager; import org.bukkit.Bukkit; import org.bukkit.OfflinePlayer; +import org.bukkit.Server; import org.bukkit.entity.Player; -// Volatile import net.minecraft.server.v1_7_R4.EntityPlayer; import net.minecraft.server.v1_7_R4.MinecraftServer; import net.minecraft.server.v1_7_R4.PlayerInteractManager; import net.minecraft.util.com.mojang.authlib.GameProfile; import org.bukkit.craftbukkit.v1_7_R4.CraftServer; +import org.bukkit.craftbukkit.v1_7_R4.entity.CraftPlayer; public class PlayerDataManager implements IPlayerDataManager { @@ -84,4 +85,24 @@ public class PlayerDataManager implements IPlayerDataManager { return Bukkit.getOnlinePlayers(); } + public static EntityPlayer getHandle(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; + } + } diff --git a/internal/v1_7_R4/src/main/java/com/lishid/openinv/internal/v1_7_R4/SilentContainerChest.java b/internal/v1_7_R4/src/main/java/com/lishid/openinv/internal/v1_7_R4/SilentContainerChest.java index b816cee..1243cdd 100644 --- a/internal/v1_7_R4/src/main/java/com/lishid/openinv/internal/v1_7_R4/SilentContainerChest.java +++ b/internal/v1_7_R4/src/main/java/com/lishid/openinv/internal/v1_7_R4/SilentContainerChest.java @@ -16,7 +16,6 @@ package com.lishid.openinv.internal.v1_7_R4; -// Volatile import net.minecraft.server.v1_7_R4.ContainerChest; import net.minecraft.server.v1_7_R4.EntityHuman; import net.minecraft.server.v1_7_R4.IInventory; diff --git a/internal/v1_7_R4/src/main/java/com/lishid/openinv/internal/v1_7_R4/SpecialEnderChest.java b/internal/v1_7_R4/src/main/java/com/lishid/openinv/internal/v1_7_R4/SpecialEnderChest.java index 3ff6db5..7716d6a 100644 --- a/internal/v1_7_R4/src/main/java/com/lishid/openinv/internal/v1_7_R4/SpecialEnderChest.java +++ b/internal/v1_7_R4/src/main/java/com/lishid/openinv/internal/v1_7_R4/SpecialEnderChest.java @@ -27,7 +27,7 @@ import org.bukkit.entity.Player; import org.bukkit.inventory.Inventory; import org.bukkit.inventory.InventoryHolder; -//Volatile +import net.minecraft.server.v1_7_R4.EntityPlayer; import net.minecraft.server.v1_7_R4.IInventory; import net.minecraft.server.v1_7_R4.InventoryEnderChest; import net.minecraft.server.v1_7_R4.InventorySubcontainer; @@ -46,13 +46,13 @@ public class SpecialEnderChest extends InventorySubcontainer implements IInvento private CraftPlayer owner; private int maxStack = MAX_STACK; - public SpecialEnderChest(Player p, Boolean online) { - super(((CraftPlayer) p).getHandle().getEnderChest().getInventoryName(), - ((CraftPlayer) p).getHandle().getEnderChest().k_(), - ((CraftPlayer) p).getHandle().getEnderChest().getSize()); - CraftPlayer player = (CraftPlayer) p; - this.enderChest = player.getHandle().getEnderChest(); - this.owner = player; + public SpecialEnderChest(Player player, Boolean online) { + super(PlayerDataManager.getHandle(player).getEnderChest().getInventoryName(), + PlayerDataManager.getHandle(player).getEnderChest().k_(), + PlayerDataManager.getHandle(player).getEnderChest().getSize()); + EntityPlayer nmsPlayer = PlayerDataManager.getHandle(player); + this.enderChest = nmsPlayer.getEnderChest(); + this.owner = nmsPlayer.getBukkitEntity(); this.items = enderChest.getContents(); } @@ -65,8 +65,9 @@ public class SpecialEnderChest extends InventorySubcontainer implements IInvento public void setPlayerOnline(Player player) { if (!playerOnline) { try { - owner = (CraftPlayer) player; - InventoryEnderChest playerEnderChest = owner.getHandle().getEnderChest(); + EntityPlayer nmsPlayer = PlayerDataManager.getHandle(player); + this.owner = nmsPlayer.getBukkitEntity(); + InventoryEnderChest playerEnderChest = nmsPlayer.getEnderChest(); Field field = playerEnderChest.getClass().getField("items"); field.setAccessible(true); field.set(playerEnderChest, this.items); diff --git a/internal/v1_7_R4/src/main/java/com/lishid/openinv/internal/v1_7_R4/SpecialPlayerInventory.java b/internal/v1_7_R4/src/main/java/com/lishid/openinv/internal/v1_7_R4/SpecialPlayerInventory.java index 1283d4e..c4cadc8 100644 --- a/internal/v1_7_R4/src/main/java/com/lishid/openinv/internal/v1_7_R4/SpecialPlayerInventory.java +++ b/internal/v1_7_R4/src/main/java/com/lishid/openinv/internal/v1_7_R4/SpecialPlayerInventory.java @@ -21,11 +21,9 @@ import com.lishid.openinv.internal.ISpecialPlayerInventory; import org.bukkit.entity.Player; import org.bukkit.inventory.Inventory; -// Volatile import net.minecraft.server.v1_7_R4.ItemStack; import net.minecraft.server.v1_7_R4.PlayerInventory; -import org.bukkit.craftbukkit.v1_7_R4.entity.CraftPlayer; import org.bukkit.craftbukkit.v1_7_R4.inventory.CraftInventory; public class SpecialPlayerInventory extends PlayerInventory implements ISpecialPlayerInventory { @@ -35,7 +33,7 @@ public class SpecialPlayerInventory extends PlayerInventory implements ISpecialP private boolean playerOnline = false; public SpecialPlayerInventory(Player bukkitPlayer, Boolean online) { - super(((CraftPlayer) bukkitPlayer).getHandle()); + super(PlayerDataManager.getHandle(bukkitPlayer)); this.playerOnline = online; this.items = player.inventory.items; this.armor = player.inventory.armor; @@ -49,7 +47,7 @@ public class SpecialPlayerInventory extends PlayerInventory implements ISpecialP @Override public void setPlayerOnline(Player player) { if (!playerOnline) { - this.player = ((CraftPlayer) player).getHandle(); + this.player = PlayerDataManager.getHandle(player); this.player.inventory.items = this.items; this.player.inventory.armor = this.armor; playerOnline = true; diff --git a/internal/v1_8_R1/src/main/java/com/lishid/openinv/internal/v1_8_R1/AnySilentContainer.java b/internal/v1_8_R1/src/main/java/com/lishid/openinv/internal/v1_8_R1/AnySilentContainer.java index 9b2ea34..17b195b 100644 --- a/internal/v1_8_R1/src/main/java/com/lishid/openinv/internal/v1_8_R1/AnySilentContainer.java +++ b/internal/v1_8_R1/src/main/java/com/lishid/openinv/internal/v1_8_R1/AnySilentContainer.java @@ -22,7 +22,6 @@ import org.bukkit.ChatColor; import org.bukkit.Material; import org.bukkit.entity.Player; -//Volatile import net.minecraft.server.v1_8_R1.AxisAlignedBB; import net.minecraft.server.v1_8_R1.Block; import net.minecraft.server.v1_8_R1.BlockChest; @@ -41,7 +40,6 @@ import net.minecraft.server.v1_8_R1.TileEntityChest; import net.minecraft.server.v1_8_R1.TileEntityEnderChest; import net.minecraft.server.v1_8_R1.World; -import org.bukkit.craftbukkit.v1_8_R1.entity.CraftPlayer; import org.bukkit.craftbukkit.v1_8_R1.event.CraftEventFactory; public class AnySilentContainer implements IAnySilentContainer { @@ -53,7 +51,7 @@ public class AnySilentContainer implements IAnySilentContainer { @Override public boolean isAnyContainerNeeded(Player p, org.bukkit.block.Block b) { - EntityPlayer player = ((CraftPlayer) p).getHandle(); + EntityPlayer player = PlayerDataManager.getHandle(p); World world = player.world; BlockPosition blockPosition = new BlockPosition(b.getX(), b.getY(), b.getZ()); Block block = world.getType(blockPosition).getBlock(); @@ -117,7 +115,7 @@ public class AnySilentContainer implements IAnySilentContainer { @Override public boolean activateContainer(Player p, boolean silentchest, org.bukkit.block.Block b) { - EntityPlayer player = ((CraftPlayer) p).getHandle(); + EntityPlayer player = PlayerDataManager.getHandle(p); // Silent ender chest is API-only if (silentchest && b.getType() == Material.ENDER_CHEST) { diff --git a/internal/v1_8_R1/src/main/java/com/lishid/openinv/internal/v1_8_R1/InventoryAccess.java b/internal/v1_8_R1/src/main/java/com/lishid/openinv/internal/v1_8_R1/InventoryAccess.java index d348ca5..6f39a6d 100644 --- a/internal/v1_8_R1/src/main/java/com/lishid/openinv/internal/v1_8_R1/InventoryAccess.java +++ b/internal/v1_8_R1/src/main/java/com/lishid/openinv/internal/v1_8_R1/InventoryAccess.java @@ -23,7 +23,6 @@ import com.lishid.openinv.util.InternalAccessor; import org.bukkit.inventory.Inventory; -// Volatile import net.minecraft.server.v1_8_R1.IInventory; import org.bukkit.craftbukkit.v1_8_R1.inventory.CraftInventory; diff --git a/internal/v1_8_R1/src/main/java/com/lishid/openinv/internal/v1_8_R1/PlayerDataManager.java b/internal/v1_8_R1/src/main/java/com/lishid/openinv/internal/v1_8_R1/PlayerDataManager.java index 4e5c5c5..14b9fd4 100644 --- a/internal/v1_8_R1/src/main/java/com/lishid/openinv/internal/v1_8_R1/PlayerDataManager.java +++ b/internal/v1_8_R1/src/main/java/com/lishid/openinv/internal/v1_8_R1/PlayerDataManager.java @@ -25,14 +25,15 @@ import com.mojang.authlib.GameProfile; import org.bukkit.Bukkit; import org.bukkit.OfflinePlayer; +import org.bukkit.Server; import org.bukkit.entity.Player; import net.minecraft.server.v1_8_R1.EntityPlayer; import net.minecraft.server.v1_8_R1.MinecraftServer; import net.minecraft.server.v1_8_R1.PlayerInteractManager; -//Volatile import org.bukkit.craftbukkit.v1_8_R1.CraftServer; +import org.bukkit.craftbukkit.v1_8_R1.entity.CraftPlayer; public class PlayerDataManager implements IPlayerDataManager { @@ -85,4 +86,24 @@ public class PlayerDataManager implements IPlayerDataManager { return Bukkit.getOnlinePlayers(); } + public static EntityPlayer getHandle(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; + } + } diff --git a/internal/v1_8_R1/src/main/java/com/lishid/openinv/internal/v1_8_R1/SilentContainerChest.java b/internal/v1_8_R1/src/main/java/com/lishid/openinv/internal/v1_8_R1/SilentContainerChest.java index 5a5a8af..c47baa7 100644 --- a/internal/v1_8_R1/src/main/java/com/lishid/openinv/internal/v1_8_R1/SilentContainerChest.java +++ b/internal/v1_8_R1/src/main/java/com/lishid/openinv/internal/v1_8_R1/SilentContainerChest.java @@ -16,7 +16,6 @@ package com.lishid.openinv.internal.v1_8_R1; -//Volatile import net.minecraft.server.v1_8_R1.ContainerChest; import net.minecraft.server.v1_8_R1.EntityHuman; import net.minecraft.server.v1_8_R1.IInventory; diff --git a/internal/v1_8_R1/src/main/java/com/lishid/openinv/internal/v1_8_R1/SpecialEnderChest.java b/internal/v1_8_R1/src/main/java/com/lishid/openinv/internal/v1_8_R1/SpecialEnderChest.java index 9c2283f..b404385 100644 --- a/internal/v1_8_R1/src/main/java/com/lishid/openinv/internal/v1_8_R1/SpecialEnderChest.java +++ b/internal/v1_8_R1/src/main/java/com/lishid/openinv/internal/v1_8_R1/SpecialEnderChest.java @@ -23,12 +23,11 @@ import com.lishid.openinv.internal.ISpecialEnderChest; import org.bukkit.entity.Player; import org.bukkit.inventory.Inventory; -//Volatile +import net.minecraft.server.v1_8_R1.EntityPlayer; import net.minecraft.server.v1_8_R1.IInventory; import net.minecraft.server.v1_8_R1.InventoryEnderChest; import net.minecraft.server.v1_8_R1.InventorySubcontainer; -import org.bukkit.craftbukkit.v1_8_R1.entity.CraftPlayer; import org.bukkit.craftbukkit.v1_8_R1.inventory.CraftInventory; public class SpecialEnderChest extends InventorySubcontainer implements IInventory, ISpecialEnderChest { @@ -38,12 +37,12 @@ public class SpecialEnderChest extends InventorySubcontainer implements IInvento private boolean playerOnline = false; public SpecialEnderChest(Player player, Boolean online) { - super(((CraftPlayer) player).getHandle().getEnderChest().getName(), - ((CraftPlayer) player).getHandle().getEnderChest().hasCustomName(), - ((CraftPlayer) player).getHandle().getEnderChest().getSize()); - CraftPlayer craftPlayer = (CraftPlayer) player; - this.enderChest = craftPlayer.getHandle().getEnderChest(); - this.bukkitOwner = craftPlayer; + super(PlayerDataManager.getHandle(player).getEnderChest().getName(), + PlayerDataManager.getHandle(player).getEnderChest().hasCustomName(), + PlayerDataManager.getHandle(player).getEnderChest().getSize()); + EntityPlayer nmsPlayer = PlayerDataManager.getHandle(player); + this.enderChest = nmsPlayer.getEnderChest(); + this.bukkitOwner = nmsPlayer.getBukkitEntity(); this.items = enderChest.getContents(); } @@ -56,9 +55,9 @@ public class SpecialEnderChest extends InventorySubcontainer implements IInvento public void setPlayerOnline(Player player) { if (!playerOnline) { try { - this.bukkitOwner = player; - CraftPlayer craftPlayer = (CraftPlayer) player; - InventoryEnderChest playerEnderChest = craftPlayer.getHandle().getEnderChest(); + EntityPlayer nmsPlayer = PlayerDataManager.getHandle(player); + this.bukkitOwner = nmsPlayer.getBukkitEntity(); + InventoryEnderChest playerEnderChest = nmsPlayer.getEnderChest(); Field field = playerEnderChest.getClass().getField("items"); field.setAccessible(true); field.set(playerEnderChest, this.items); diff --git a/internal/v1_8_R1/src/main/java/com/lishid/openinv/internal/v1_8_R1/SpecialPlayerInventory.java b/internal/v1_8_R1/src/main/java/com/lishid/openinv/internal/v1_8_R1/SpecialPlayerInventory.java index 0ba51a6..ad1911a 100644 --- a/internal/v1_8_R1/src/main/java/com/lishid/openinv/internal/v1_8_R1/SpecialPlayerInventory.java +++ b/internal/v1_8_R1/src/main/java/com/lishid/openinv/internal/v1_8_R1/SpecialPlayerInventory.java @@ -21,11 +21,9 @@ import com.lishid.openinv.internal.ISpecialPlayerInventory; import org.bukkit.entity.Player; import org.bukkit.inventory.Inventory; -//Volatile import net.minecraft.server.v1_8_R1.ItemStack; import net.minecraft.server.v1_8_R1.PlayerInventory; -import org.bukkit.craftbukkit.v1_8_R1.entity.CraftPlayer; import org.bukkit.craftbukkit.v1_8_R1.inventory.CraftInventory; public class SpecialPlayerInventory extends PlayerInventory implements ISpecialPlayerInventory { @@ -35,7 +33,7 @@ public class SpecialPlayerInventory extends PlayerInventory implements ISpecialP private boolean playerOnline = false; public SpecialPlayerInventory(Player bukkitPlayer, Boolean online) { - super(((CraftPlayer) bukkitPlayer).getHandle()); + super(PlayerDataManager.getHandle(bukkitPlayer)); this.playerOnline = online; this.items = player.inventory.items; this.armor = player.inventory.armor; @@ -49,7 +47,7 @@ public class SpecialPlayerInventory extends PlayerInventory implements ISpecialP @Override public void setPlayerOnline(Player player) { if (!playerOnline) { - this.player = ((CraftPlayer) player).getHandle(); + this.player = PlayerDataManager.getHandle(player); this.player.inventory.items = this.items; this.player.inventory.armor = this.armor; playerOnline = true; diff --git a/internal/v1_8_R2/src/main/java/com/lishid/openinv/internal/v1_8_R2/AnySilentContainer.java b/internal/v1_8_R2/src/main/java/com/lishid/openinv/internal/v1_8_R2/AnySilentContainer.java index eeb18af..83680c8 100644 --- a/internal/v1_8_R2/src/main/java/com/lishid/openinv/internal/v1_8_R2/AnySilentContainer.java +++ b/internal/v1_8_R2/src/main/java/com/lishid/openinv/internal/v1_8_R2/AnySilentContainer.java @@ -22,7 +22,6 @@ import org.bukkit.ChatColor; import org.bukkit.Material; import org.bukkit.entity.Player; -//Volatile import net.minecraft.server.v1_8_R2.AxisAlignedBB; import net.minecraft.server.v1_8_R2.Block; import net.minecraft.server.v1_8_R2.BlockChest; @@ -43,7 +42,6 @@ import net.minecraft.server.v1_8_R2.TileEntityChest; import net.minecraft.server.v1_8_R2.TileEntityEnderChest; import net.minecraft.server.v1_8_R2.World; -import org.bukkit.craftbukkit.v1_8_R2.entity.CraftPlayer; import org.bukkit.craftbukkit.v1_8_R2.event.CraftEventFactory; public class AnySilentContainer implements IAnySilentContainer { @@ -55,7 +53,7 @@ public class AnySilentContainer implements IAnySilentContainer { @Override public boolean isAnyContainerNeeded(Player p, org.bukkit.block.Block b) { - EntityPlayer player = ((CraftPlayer) p).getHandle(); + EntityPlayer player = PlayerDataManager.getHandle(p); World world = player.world; BlockPosition blockPosition = new BlockPosition(b.getX(), b.getY(), b.getZ()); Block block = world.getType(blockPosition).getBlock(); @@ -114,7 +112,7 @@ public class AnySilentContainer implements IAnySilentContainer { @Override public boolean activateContainer(Player p, boolean silentchest, org.bukkit.block.Block b) { - EntityPlayer player = ((CraftPlayer) p).getHandle(); + EntityPlayer player = PlayerDataManager.getHandle(p); // Silent ender chest is pretty much API-only if (silentchest && b.getType() == Material.ENDER_CHEST) { diff --git a/internal/v1_8_R2/src/main/java/com/lishid/openinv/internal/v1_8_R2/InventoryAccess.java b/internal/v1_8_R2/src/main/java/com/lishid/openinv/internal/v1_8_R2/InventoryAccess.java index fdeb50a..7a11e0b 100644 --- a/internal/v1_8_R2/src/main/java/com/lishid/openinv/internal/v1_8_R2/InventoryAccess.java +++ b/internal/v1_8_R2/src/main/java/com/lishid/openinv/internal/v1_8_R2/InventoryAccess.java @@ -23,7 +23,6 @@ import com.lishid.openinv.util.InternalAccessor; import org.bukkit.inventory.Inventory; -// Volatile import net.minecraft.server.v1_8_R2.IInventory; import org.bukkit.craftbukkit.v1_8_R2.inventory.CraftInventory; diff --git a/internal/v1_8_R2/src/main/java/com/lishid/openinv/internal/v1_8_R2/PlayerDataManager.java b/internal/v1_8_R2/src/main/java/com/lishid/openinv/internal/v1_8_R2/PlayerDataManager.java index 4106af1..febbc68 100644 --- a/internal/v1_8_R2/src/main/java/com/lishid/openinv/internal/v1_8_R2/PlayerDataManager.java +++ b/internal/v1_8_R2/src/main/java/com/lishid/openinv/internal/v1_8_R2/PlayerDataManager.java @@ -25,14 +25,15 @@ import com.mojang.authlib.GameProfile; import org.bukkit.Bukkit; import org.bukkit.OfflinePlayer; +import org.bukkit.Server; import org.bukkit.entity.Player; -// Volatile import net.minecraft.server.v1_8_R2.EntityPlayer; import net.minecraft.server.v1_8_R2.MinecraftServer; import net.minecraft.server.v1_8_R2.PlayerInteractManager; import org.bukkit.craftbukkit.v1_8_R2.CraftServer; +import org.bukkit.craftbukkit.v1_8_R2.entity.CraftPlayer; public class PlayerDataManager implements IPlayerDataManager { @@ -85,4 +86,24 @@ public class PlayerDataManager implements IPlayerDataManager { return Bukkit.getOnlinePlayers(); } + public static EntityPlayer getHandle(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; + } + } diff --git a/internal/v1_8_R2/src/main/java/com/lishid/openinv/internal/v1_8_R2/SilentContainerChest.java b/internal/v1_8_R2/src/main/java/com/lishid/openinv/internal/v1_8_R2/SilentContainerChest.java index d7e1196..066f771 100644 --- a/internal/v1_8_R2/src/main/java/com/lishid/openinv/internal/v1_8_R2/SilentContainerChest.java +++ b/internal/v1_8_R2/src/main/java/com/lishid/openinv/internal/v1_8_R2/SilentContainerChest.java @@ -16,7 +16,6 @@ package com.lishid.openinv.internal.v1_8_R2; -// Volatile import net.minecraft.server.v1_8_R2.ContainerChest; import net.minecraft.server.v1_8_R2.EntityHuman; import net.minecraft.server.v1_8_R2.IInventory; diff --git a/internal/v1_8_R2/src/main/java/com/lishid/openinv/internal/v1_8_R2/SpecialEnderChest.java b/internal/v1_8_R2/src/main/java/com/lishid/openinv/internal/v1_8_R2/SpecialEnderChest.java index e353cd9..278aa18 100644 --- a/internal/v1_8_R2/src/main/java/com/lishid/openinv/internal/v1_8_R2/SpecialEnderChest.java +++ b/internal/v1_8_R2/src/main/java/com/lishid/openinv/internal/v1_8_R2/SpecialEnderChest.java @@ -23,12 +23,11 @@ import com.lishid.openinv.internal.ISpecialEnderChest; import org.bukkit.entity.Player; import org.bukkit.inventory.Inventory; -// Volatile +import net.minecraft.server.v1_8_R2.EntityPlayer; import net.minecraft.server.v1_8_R2.IInventory; import net.minecraft.server.v1_8_R2.InventoryEnderChest; import net.minecraft.server.v1_8_R2.InventorySubcontainer; -import org.bukkit.craftbukkit.v1_8_R2.entity.CraftPlayer; import org.bukkit.craftbukkit.v1_8_R2.inventory.CraftInventory; public class SpecialEnderChest extends InventorySubcontainer implements IInventory, ISpecialEnderChest { @@ -38,12 +37,12 @@ public class SpecialEnderChest extends InventorySubcontainer implements IInvento private boolean playerOnline = false; public SpecialEnderChest(Player player, Boolean online) { - super(((CraftPlayer) player).getHandle().getEnderChest().getName(), - ((CraftPlayer) player).getHandle().getEnderChest().hasCustomName(), - ((CraftPlayer) player).getHandle().getEnderChest().getSize()); - CraftPlayer craftPlayer = (CraftPlayer) player; - this.enderChest = craftPlayer.getHandle().getEnderChest(); - this.bukkitOwner = craftPlayer; + super(PlayerDataManager.getHandle(player).getEnderChest().getName(), + PlayerDataManager.getHandle(player).getEnderChest().hasCustomName(), + PlayerDataManager.getHandle(player).getEnderChest().getSize()); + EntityPlayer nmsPlayer = PlayerDataManager.getHandle(player); + this.enderChest = nmsPlayer.getEnderChest(); + this.bukkitOwner = nmsPlayer.getBukkitEntity(); this.items = enderChest.getContents(); } @@ -56,9 +55,9 @@ public class SpecialEnderChest extends InventorySubcontainer implements IInvento public void setPlayerOnline(Player player) { if (!playerOnline) { try { - this.bukkitOwner = player; - CraftPlayer craftPlayer = (CraftPlayer) player; - InventoryEnderChest playerEnderChest = craftPlayer.getHandle().getEnderChest(); + EntityPlayer nmsPlayer = PlayerDataManager.getHandle(player); + this.bukkitOwner = nmsPlayer.getBukkitEntity(); + InventoryEnderChest playerEnderChest = nmsPlayer.getEnderChest(); Field field = playerEnderChest.getClass().getField("items"); field.setAccessible(true); field.set(playerEnderChest, this.items); diff --git a/internal/v1_8_R2/src/main/java/com/lishid/openinv/internal/v1_8_R2/SpecialPlayerInventory.java b/internal/v1_8_R2/src/main/java/com/lishid/openinv/internal/v1_8_R2/SpecialPlayerInventory.java index 34bd8ab..0f4e596 100644 --- a/internal/v1_8_R2/src/main/java/com/lishid/openinv/internal/v1_8_R2/SpecialPlayerInventory.java +++ b/internal/v1_8_R2/src/main/java/com/lishid/openinv/internal/v1_8_R2/SpecialPlayerInventory.java @@ -21,11 +21,9 @@ import com.lishid.openinv.internal.ISpecialPlayerInventory; import org.bukkit.entity.Player; import org.bukkit.inventory.Inventory; -// Volatile import net.minecraft.server.v1_8_R2.ItemStack; import net.minecraft.server.v1_8_R2.PlayerInventory; -import org.bukkit.craftbukkit.v1_8_R2.entity.CraftPlayer; import org.bukkit.craftbukkit.v1_8_R2.inventory.CraftInventory; public class SpecialPlayerInventory extends PlayerInventory implements ISpecialPlayerInventory { @@ -35,7 +33,7 @@ public class SpecialPlayerInventory extends PlayerInventory implements ISpecialP private boolean playerOnline = false; public SpecialPlayerInventory(Player bukkitPlayer, Boolean online) { - super(((CraftPlayer) bukkitPlayer).getHandle()); + super(PlayerDataManager.getHandle(bukkitPlayer)); this.playerOnline = online; this.items = player.inventory.items; this.armor = player.inventory.armor; @@ -49,7 +47,7 @@ public class SpecialPlayerInventory extends PlayerInventory implements ISpecialP @Override public void setPlayerOnline(Player player) { if (!playerOnline) { - this.player = ((CraftPlayer) player).getHandle(); + this.player = PlayerDataManager.getHandle(player); this.player.inventory.items = this.items; this.player.inventory.armor = this.armor; playerOnline = true; diff --git a/internal/v1_8_R3/src/main/java/com/lishid/openinv/internal/v1_8_R3/AnySilentContainer.java b/internal/v1_8_R3/src/main/java/com/lishid/openinv/internal/v1_8_R3/AnySilentContainer.java index baa29cc..fea742a 100644 --- a/internal/v1_8_R3/src/main/java/com/lishid/openinv/internal/v1_8_R3/AnySilentContainer.java +++ b/internal/v1_8_R3/src/main/java/com/lishid/openinv/internal/v1_8_R3/AnySilentContainer.java @@ -22,7 +22,6 @@ import org.bukkit.ChatColor; import org.bukkit.Material; import org.bukkit.entity.Player; -//Volatile import net.minecraft.server.v1_8_R3.AxisAlignedBB; import net.minecraft.server.v1_8_R3.Block; import net.minecraft.server.v1_8_R3.BlockChest; @@ -43,7 +42,6 @@ import net.minecraft.server.v1_8_R3.TileEntityChest; import net.minecraft.server.v1_8_R3.TileEntityEnderChest; import net.minecraft.server.v1_8_R3.World; -import org.bukkit.craftbukkit.v1_8_R3.entity.CraftPlayer; import org.bukkit.craftbukkit.v1_8_R3.event.CraftEventFactory; public class AnySilentContainer implements IAnySilentContainer { @@ -55,7 +53,7 @@ public class AnySilentContainer implements IAnySilentContainer { @Override public boolean isAnyContainerNeeded(Player p, org.bukkit.block.Block b) { - EntityPlayer player = ((CraftPlayer) p).getHandle(); + EntityPlayer player = PlayerDataManager.getHandle(p); World world = player.world; BlockPosition blockPosition = new BlockPosition(b.getX(), b.getY(), b.getZ()); Block block = world.getType(blockPosition).getBlock(); @@ -114,7 +112,7 @@ public class AnySilentContainer implements IAnySilentContainer { @Override public boolean activateContainer(Player p, boolean silentchest, org.bukkit.block.Block b) { - EntityPlayer player = ((CraftPlayer) p).getHandle(); + EntityPlayer player = PlayerDataManager.getHandle(p); // Silent ender chest is pretty much API-only if (silentchest && b.getType() == Material.ENDER_CHEST) { diff --git a/internal/v1_8_R3/src/main/java/com/lishid/openinv/internal/v1_8_R3/InventoryAccess.java b/internal/v1_8_R3/src/main/java/com/lishid/openinv/internal/v1_8_R3/InventoryAccess.java index 5b18964..98c3357 100644 --- a/internal/v1_8_R3/src/main/java/com/lishid/openinv/internal/v1_8_R3/InventoryAccess.java +++ b/internal/v1_8_R3/src/main/java/com/lishid/openinv/internal/v1_8_R3/InventoryAccess.java @@ -23,7 +23,6 @@ import com.lishid.openinv.util.InternalAccessor; import org.bukkit.inventory.Inventory; -// Volatile import net.minecraft.server.v1_8_R3.IInventory; import org.bukkit.craftbukkit.v1_8_R3.inventory.CraftInventory; diff --git a/internal/v1_8_R3/src/main/java/com/lishid/openinv/internal/v1_8_R3/PlayerDataManager.java b/internal/v1_8_R3/src/main/java/com/lishid/openinv/internal/v1_8_R3/PlayerDataManager.java index 62eee4c..76bcaf2 100644 --- a/internal/v1_8_R3/src/main/java/com/lishid/openinv/internal/v1_8_R3/PlayerDataManager.java +++ b/internal/v1_8_R3/src/main/java/com/lishid/openinv/internal/v1_8_R3/PlayerDataManager.java @@ -25,14 +25,15 @@ import com.mojang.authlib.GameProfile; import org.bukkit.Bukkit; import org.bukkit.OfflinePlayer; +import org.bukkit.Server; import org.bukkit.entity.Player; import net.minecraft.server.v1_8_R3.EntityPlayer; import net.minecraft.server.v1_8_R3.MinecraftServer; import net.minecraft.server.v1_8_R3.PlayerInteractManager; -//Volatile import org.bukkit.craftbukkit.v1_8_R3.CraftServer; +import org.bukkit.craftbukkit.v1_8_R3.entity.CraftPlayer; public class PlayerDataManager implements IPlayerDataManager { @@ -85,4 +86,24 @@ public class PlayerDataManager implements IPlayerDataManager { return Bukkit.getOnlinePlayers(); } + public static EntityPlayer getHandle(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; + } + } diff --git a/internal/v1_8_R3/src/main/java/com/lishid/openinv/internal/v1_8_R3/SilentContainerChest.java b/internal/v1_8_R3/src/main/java/com/lishid/openinv/internal/v1_8_R3/SilentContainerChest.java index 24c4288..ef20562 100644 --- a/internal/v1_8_R3/src/main/java/com/lishid/openinv/internal/v1_8_R3/SilentContainerChest.java +++ b/internal/v1_8_R3/src/main/java/com/lishid/openinv/internal/v1_8_R3/SilentContainerChest.java @@ -16,7 +16,6 @@ package com.lishid.openinv.internal.v1_8_R3; -// Volatile import net.minecraft.server.v1_8_R3.ContainerChest; import net.minecraft.server.v1_8_R3.EntityHuman; import net.minecraft.server.v1_8_R3.IInventory; diff --git a/internal/v1_8_R3/src/main/java/com/lishid/openinv/internal/v1_8_R3/SpecialEnderChest.java b/internal/v1_8_R3/src/main/java/com/lishid/openinv/internal/v1_8_R3/SpecialEnderChest.java index a8780c5..1b4b8f4 100644 --- a/internal/v1_8_R3/src/main/java/com/lishid/openinv/internal/v1_8_R3/SpecialEnderChest.java +++ b/internal/v1_8_R3/src/main/java/com/lishid/openinv/internal/v1_8_R3/SpecialEnderChest.java @@ -23,12 +23,11 @@ import com.lishid.openinv.internal.ISpecialEnderChest; import org.bukkit.entity.Player; import org.bukkit.inventory.Inventory; -// Volatile +import net.minecraft.server.v1_8_R3.EntityPlayer; import net.minecraft.server.v1_8_R3.IInventory; import net.minecraft.server.v1_8_R3.InventoryEnderChest; import net.minecraft.server.v1_8_R3.InventorySubcontainer; -import org.bukkit.craftbukkit.v1_8_R3.entity.CraftPlayer; import org.bukkit.craftbukkit.v1_8_R3.inventory.CraftInventory; public class SpecialEnderChest extends InventorySubcontainer implements IInventory, ISpecialEnderChest { @@ -38,12 +37,12 @@ public class SpecialEnderChest extends InventorySubcontainer implements IInvento private boolean playerOnline = false; public SpecialEnderChest(Player player, Boolean online) { - super(((CraftPlayer) player).getHandle().getEnderChest().getName(), - ((CraftPlayer) player).getHandle().getEnderChest().hasCustomName(), - ((CraftPlayer) player).getHandle().getEnderChest().getSize()); - CraftPlayer craftPlayer = (CraftPlayer) player; - this.enderChest = craftPlayer.getHandle().getEnderChest(); - this.bukkitOwner = craftPlayer; + super(PlayerDataManager.getHandle(player).getEnderChest().getName(), + PlayerDataManager.getHandle(player).getEnderChest().hasCustomName(), + PlayerDataManager.getHandle(player).getEnderChest().getSize()); + EntityPlayer nmsPlayer = PlayerDataManager.getHandle(player); + this.enderChest = nmsPlayer.getEnderChest(); + this.bukkitOwner = nmsPlayer.getBukkitEntity(); this.items = enderChest.getContents(); } @@ -56,9 +55,9 @@ public class SpecialEnderChest extends InventorySubcontainer implements IInvento public void setPlayerOnline(Player player) { if (!playerOnline) { try { - this.bukkitOwner = player; - CraftPlayer craftPlayer = (CraftPlayer) player; - InventoryEnderChest playerEnderChest = craftPlayer.getHandle().getEnderChest(); + EntityPlayer nmsPlayer = PlayerDataManager.getHandle(player); + this.bukkitOwner = nmsPlayer.getBukkitEntity(); + InventoryEnderChest playerEnderChest = nmsPlayer.getEnderChest(); Field field = playerEnderChest.getClass().getField("items"); field.setAccessible(true); field.set(playerEnderChest, this.items); diff --git a/internal/v1_8_R3/src/main/java/com/lishid/openinv/internal/v1_8_R3/SpecialPlayerInventory.java b/internal/v1_8_R3/src/main/java/com/lishid/openinv/internal/v1_8_R3/SpecialPlayerInventory.java index 25d0536..8483a4c 100644 --- a/internal/v1_8_R3/src/main/java/com/lishid/openinv/internal/v1_8_R3/SpecialPlayerInventory.java +++ b/internal/v1_8_R3/src/main/java/com/lishid/openinv/internal/v1_8_R3/SpecialPlayerInventory.java @@ -21,11 +21,9 @@ import com.lishid.openinv.internal.ISpecialPlayerInventory; import org.bukkit.entity.Player; import org.bukkit.inventory.Inventory; -//Volatile import net.minecraft.server.v1_8_R3.ItemStack; import net.minecraft.server.v1_8_R3.PlayerInventory; -import org.bukkit.craftbukkit.v1_8_R3.entity.CraftPlayer; import org.bukkit.craftbukkit.v1_8_R3.inventory.CraftInventory; public class SpecialPlayerInventory extends PlayerInventory implements ISpecialPlayerInventory { @@ -35,7 +33,7 @@ public class SpecialPlayerInventory extends PlayerInventory implements ISpecialP private boolean playerOnline = false; public SpecialPlayerInventory(Player bukkitPlayer, Boolean online) { - super(((CraftPlayer) bukkitPlayer).getHandle()); + super(PlayerDataManager.getHandle(bukkitPlayer)); this.playerOnline = online; this.items = player.inventory.items; this.armor = player.inventory.armor; @@ -49,7 +47,7 @@ public class SpecialPlayerInventory extends PlayerInventory implements ISpecialP @Override public void setPlayerOnline(Player player) { if (!playerOnline) { - this.player = ((CraftPlayer) player).getHandle(); + this.player = PlayerDataManager.getHandle(player); this.player.inventory.items = this.items; this.player.inventory.armor = this.armor; playerOnline = true; diff --git a/internal/v1_9_R1/src/main/java/com/lishid/openinv/internal/v1_9_R1/AnySilentContainer.java b/internal/v1_9_R1/src/main/java/com/lishid/openinv/internal/v1_9_R1/AnySilentContainer.java index c9d2c38..08933fd 100644 --- a/internal/v1_9_R1/src/main/java/com/lishid/openinv/internal/v1_9_R1/AnySilentContainer.java +++ b/internal/v1_9_R1/src/main/java/com/lishid/openinv/internal/v1_9_R1/AnySilentContainer.java @@ -22,7 +22,6 @@ import org.bukkit.ChatColor; import org.bukkit.Material; import org.bukkit.entity.Player; -// Volatile import net.minecraft.server.v1_9_R1.AxisAlignedBB; import net.minecraft.server.v1_9_R1.Block; import net.minecraft.server.v1_9_R1.BlockChest; @@ -43,7 +42,6 @@ import net.minecraft.server.v1_9_R1.TileEntityChest; import net.minecraft.server.v1_9_R1.TileEntityEnderChest; import net.minecraft.server.v1_9_R1.World; -import org.bukkit.craftbukkit.v1_9_R1.entity.CraftPlayer; import org.bukkit.craftbukkit.v1_9_R1.event.CraftEventFactory; public class AnySilentContainer implements IAnySilentContainer { @@ -55,7 +53,7 @@ public class AnySilentContainer implements IAnySilentContainer { @Override public boolean isAnyContainerNeeded(Player p, org.bukkit.block.Block b) { - EntityPlayer player = ((CraftPlayer) p).getHandle(); + EntityPlayer player = PlayerDataManager.getHandle(p); World world = player.world; BlockPosition blockPosition = new BlockPosition(b.getX(), b.getY(), b.getZ()); Block block = world.getType(blockPosition).getBlock(); @@ -114,7 +112,7 @@ public class AnySilentContainer implements IAnySilentContainer { @Override public boolean activateContainer(Player p, boolean silentchest, org.bukkit.block.Block b) { - EntityPlayer player = ((CraftPlayer) p).getHandle(); + EntityPlayer player = PlayerDataManager.getHandle(p); // Silent ender chest is pretty much API-only if (silentchest && b.getType() == Material.ENDER_CHEST) { diff --git a/internal/v1_9_R1/src/main/java/com/lishid/openinv/internal/v1_9_R1/InventoryAccess.java b/internal/v1_9_R1/src/main/java/com/lishid/openinv/internal/v1_9_R1/InventoryAccess.java index 8b2c196..4cc1f93 100644 --- a/internal/v1_9_R1/src/main/java/com/lishid/openinv/internal/v1_9_R1/InventoryAccess.java +++ b/internal/v1_9_R1/src/main/java/com/lishid/openinv/internal/v1_9_R1/InventoryAccess.java @@ -23,7 +23,6 @@ import com.lishid.openinv.util.InternalAccessor; import org.bukkit.inventory.Inventory; -// Volatile import net.minecraft.server.v1_9_R1.IInventory; import org.bukkit.craftbukkit.v1_9_R1.inventory.CraftInventory; diff --git a/internal/v1_9_R1/src/main/java/com/lishid/openinv/internal/v1_9_R1/PlayerDataManager.java b/internal/v1_9_R1/src/main/java/com/lishid/openinv/internal/v1_9_R1/PlayerDataManager.java index 3a89a49..b2e3988 100644 --- a/internal/v1_9_R1/src/main/java/com/lishid/openinv/internal/v1_9_R1/PlayerDataManager.java +++ b/internal/v1_9_R1/src/main/java/com/lishid/openinv/internal/v1_9_R1/PlayerDataManager.java @@ -25,14 +25,15 @@ import com.mojang.authlib.GameProfile; import org.bukkit.Bukkit; import org.bukkit.OfflinePlayer; +import org.bukkit.Server; import org.bukkit.entity.Player; -// Volatile import net.minecraft.server.v1_9_R1.EntityPlayer; import net.minecraft.server.v1_9_R1.MinecraftServer; import net.minecraft.server.v1_9_R1.PlayerInteractManager; import org.bukkit.craftbukkit.v1_9_R1.CraftServer; +import org.bukkit.craftbukkit.v1_9_R1.entity.CraftPlayer; public class PlayerDataManager implements IPlayerDataManager { @@ -85,4 +86,24 @@ public class PlayerDataManager implements IPlayerDataManager { return Bukkit.getOnlinePlayers(); } + public static EntityPlayer getHandle(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; + } + } diff --git a/internal/v1_9_R1/src/main/java/com/lishid/openinv/internal/v1_9_R1/SilentContainerChest.java b/internal/v1_9_R1/src/main/java/com/lishid/openinv/internal/v1_9_R1/SilentContainerChest.java index 3a25cf6..fa11826 100644 --- a/internal/v1_9_R1/src/main/java/com/lishid/openinv/internal/v1_9_R1/SilentContainerChest.java +++ b/internal/v1_9_R1/src/main/java/com/lishid/openinv/internal/v1_9_R1/SilentContainerChest.java @@ -16,7 +16,6 @@ package com.lishid.openinv.internal.v1_9_R1; -// Volatile import net.minecraft.server.v1_9_R1.ContainerChest; import net.minecraft.server.v1_9_R1.EntityHuman; import net.minecraft.server.v1_9_R1.IInventory; diff --git a/internal/v1_9_R1/src/main/java/com/lishid/openinv/internal/v1_9_R1/SpecialEnderChest.java b/internal/v1_9_R1/src/main/java/com/lishid/openinv/internal/v1_9_R1/SpecialEnderChest.java index 2306fca..ef2b09f 100644 --- a/internal/v1_9_R1/src/main/java/com/lishid/openinv/internal/v1_9_R1/SpecialEnderChest.java +++ b/internal/v1_9_R1/src/main/java/com/lishid/openinv/internal/v1_9_R1/SpecialEnderChest.java @@ -23,12 +23,11 @@ import com.lishid.openinv.internal.ISpecialEnderChest; import org.bukkit.entity.Player; import org.bukkit.inventory.Inventory; -// Volatile +import net.minecraft.server.v1_9_R1.EntityPlayer; import net.minecraft.server.v1_9_R1.IInventory; import net.minecraft.server.v1_9_R1.InventoryEnderChest; import net.minecraft.server.v1_9_R1.InventorySubcontainer; -import org.bukkit.craftbukkit.v1_9_R1.entity.CraftPlayer; import org.bukkit.craftbukkit.v1_9_R1.inventory.CraftInventory; public class SpecialEnderChest extends InventorySubcontainer implements IInventory, ISpecialEnderChest { @@ -38,12 +37,12 @@ public class SpecialEnderChest extends InventorySubcontainer implements IInvento private boolean playerOnline = false; public SpecialEnderChest(Player player, Boolean online) { - super(((CraftPlayer) player).getHandle().getEnderChest().getName(), - ((CraftPlayer) player).getHandle().getEnderChest().hasCustomName(), - ((CraftPlayer) player).getHandle().getEnderChest().getSize()); - CraftPlayer craftPlayer = (CraftPlayer) player; - this.enderChest = craftPlayer.getHandle().getEnderChest(); - this.bukkitOwner = craftPlayer; + super(PlayerDataManager.getHandle(player).getEnderChest().getName(), + PlayerDataManager.getHandle(player).getEnderChest().hasCustomName(), + PlayerDataManager.getHandle(player).getEnderChest().getSize()); + EntityPlayer nmsPlayer = PlayerDataManager.getHandle(player); + this.enderChest = nmsPlayer.getEnderChest(); + this.bukkitOwner = nmsPlayer.getBukkitEntity(); this.items = enderChest.getContents(); } @@ -56,9 +55,9 @@ public class SpecialEnderChest extends InventorySubcontainer implements IInvento public void setPlayerOnline(Player player) { if (!playerOnline) { try { - this.bukkitOwner = player; - CraftPlayer craftPlayer = (CraftPlayer) player; - InventoryEnderChest playerEnderChest = craftPlayer.getHandle().getEnderChest(); + EntityPlayer nmsPlayer = PlayerDataManager.getHandle(player); + this.bukkitOwner = nmsPlayer.getBukkitEntity(); + InventoryEnderChest playerEnderChest = nmsPlayer.getEnderChest(); Field field = playerEnderChest.getClass().getField("items"); field.setAccessible(true); field.set(playerEnderChest, this.items); diff --git a/internal/v1_9_R1/src/main/java/com/lishid/openinv/internal/v1_9_R1/SpecialPlayerInventory.java b/internal/v1_9_R1/src/main/java/com/lishid/openinv/internal/v1_9_R1/SpecialPlayerInventory.java index 1b61828..f86e4b2 100644 --- a/internal/v1_9_R1/src/main/java/com/lishid/openinv/internal/v1_9_R1/SpecialPlayerInventory.java +++ b/internal/v1_9_R1/src/main/java/com/lishid/openinv/internal/v1_9_R1/SpecialPlayerInventory.java @@ -24,11 +24,9 @@ import com.lishid.openinv.internal.ISpecialPlayerInventory; import org.bukkit.entity.Player; import org.bukkit.inventory.Inventory; -// Volatile import net.minecraft.server.v1_9_R1.ItemStack; import net.minecraft.server.v1_9_R1.PlayerInventory; -import org.bukkit.craftbukkit.v1_9_R1.entity.CraftPlayer; import org.bukkit.craftbukkit.v1_9_R1.inventory.CraftInventory; public class SpecialPlayerInventory extends PlayerInventory implements ISpecialPlayerInventory { @@ -38,7 +36,7 @@ public class SpecialPlayerInventory extends PlayerInventory implements ISpecialP private boolean playerOnline = false; public SpecialPlayerInventory(Player bukkitPlayer, Boolean online) { - super(((CraftPlayer) bukkitPlayer).getHandle()); + super(PlayerDataManager.getHandle(bukkitPlayer)); this.playerOnline = online; setItemArrays(this, player.inventory.items, player.inventory.armor, player.inventory.extraSlots); } @@ -88,7 +86,7 @@ public class SpecialPlayerInventory extends PlayerInventory implements ISpecialP @Override public void setPlayerOnline(Player player) { if (!playerOnline) { - this.player = ((CraftPlayer) player).getHandle(); + this.player = PlayerDataManager.getHandle(player); setItemArrays(this.player.inventory, items, armor, extraSlots); playerOnline = true; } diff --git a/internal/v1_9_R2/src/main/java/com/lishid/openinv/internal/v1_9_R2/AnySilentContainer.java b/internal/v1_9_R2/src/main/java/com/lishid/openinv/internal/v1_9_R2/AnySilentContainer.java index 550cc08..539c45d 100644 --- a/internal/v1_9_R2/src/main/java/com/lishid/openinv/internal/v1_9_R2/AnySilentContainer.java +++ b/internal/v1_9_R2/src/main/java/com/lishid/openinv/internal/v1_9_R2/AnySilentContainer.java @@ -22,7 +22,6 @@ import org.bukkit.ChatColor; import org.bukkit.Material; import org.bukkit.entity.Player; -// Volatile import net.minecraft.server.v1_9_R2.AxisAlignedBB; import net.minecraft.server.v1_9_R2.Block; import net.minecraft.server.v1_9_R2.BlockChest; @@ -43,7 +42,6 @@ import net.minecraft.server.v1_9_R2.TileEntityChest; import net.minecraft.server.v1_9_R2.TileEntityEnderChest; import net.minecraft.server.v1_9_R2.World; -import org.bukkit.craftbukkit.v1_9_R2.entity.CraftPlayer; import org.bukkit.craftbukkit.v1_9_R2.event.CraftEventFactory; public class AnySilentContainer implements IAnySilentContainer { @@ -55,7 +53,7 @@ public class AnySilentContainer implements IAnySilentContainer { @Override public boolean isAnyContainerNeeded(Player p, org.bukkit.block.Block b) { - EntityPlayer player = ((CraftPlayer) p).getHandle(); + EntityPlayer player = PlayerDataManager.getHandle(p); World world = player.world; BlockPosition blockPosition = new BlockPosition(b.getX(), b.getY(), b.getZ()); Block block = world.getType(blockPosition).getBlock(); @@ -114,7 +112,7 @@ public class AnySilentContainer implements IAnySilentContainer { @Override public boolean activateContainer(Player p, boolean silentchest, org.bukkit.block.Block b) { - EntityPlayer player = ((CraftPlayer) p).getHandle(); + EntityPlayer player = PlayerDataManager.getHandle(p); // Silent ender chest is pretty much API-only if (silentchest && b.getType() == Material.ENDER_CHEST) { diff --git a/internal/v1_9_R2/src/main/java/com/lishid/openinv/internal/v1_9_R2/InventoryAccess.java b/internal/v1_9_R2/src/main/java/com/lishid/openinv/internal/v1_9_R2/InventoryAccess.java index 0f00bc8..fb2d2cc 100644 --- a/internal/v1_9_R2/src/main/java/com/lishid/openinv/internal/v1_9_R2/InventoryAccess.java +++ b/internal/v1_9_R2/src/main/java/com/lishid/openinv/internal/v1_9_R2/InventoryAccess.java @@ -23,7 +23,6 @@ import com.lishid.openinv.util.InternalAccessor; import org.bukkit.inventory.Inventory; -// Volatile import net.minecraft.server.v1_9_R2.IInventory; import org.bukkit.craftbukkit.v1_9_R2.inventory.CraftInventory; diff --git a/internal/v1_9_R2/src/main/java/com/lishid/openinv/internal/v1_9_R2/PlayerDataManager.java b/internal/v1_9_R2/src/main/java/com/lishid/openinv/internal/v1_9_R2/PlayerDataManager.java index d5fc3d2..ff004f4 100644 --- a/internal/v1_9_R2/src/main/java/com/lishid/openinv/internal/v1_9_R2/PlayerDataManager.java +++ b/internal/v1_9_R2/src/main/java/com/lishid/openinv/internal/v1_9_R2/PlayerDataManager.java @@ -25,14 +25,15 @@ import com.mojang.authlib.GameProfile; import org.bukkit.Bukkit; import org.bukkit.OfflinePlayer; +import org.bukkit.Server; import org.bukkit.entity.Player; -// Volatile import net.minecraft.server.v1_9_R2.EntityPlayer; import net.minecraft.server.v1_9_R2.MinecraftServer; import net.minecraft.server.v1_9_R2.PlayerInteractManager; import org.bukkit.craftbukkit.v1_9_R2.CraftServer; +import org.bukkit.craftbukkit.v1_9_R2.entity.CraftPlayer; public class PlayerDataManager implements IPlayerDataManager { @@ -85,4 +86,24 @@ public class PlayerDataManager implements IPlayerDataManager { return Bukkit.getOnlinePlayers(); } + public static EntityPlayer getHandle(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; + } + } diff --git a/internal/v1_9_R2/src/main/java/com/lishid/openinv/internal/v1_9_R2/SilentContainerChest.java b/internal/v1_9_R2/src/main/java/com/lishid/openinv/internal/v1_9_R2/SilentContainerChest.java index d0fba74..f08ecb8 100644 --- a/internal/v1_9_R2/src/main/java/com/lishid/openinv/internal/v1_9_R2/SilentContainerChest.java +++ b/internal/v1_9_R2/src/main/java/com/lishid/openinv/internal/v1_9_R2/SilentContainerChest.java @@ -16,7 +16,6 @@ package com.lishid.openinv.internal.v1_9_R2; -// Volatile import net.minecraft.server.v1_9_R2.ContainerChest; import net.minecraft.server.v1_9_R2.EntityHuman; import net.minecraft.server.v1_9_R2.IInventory; diff --git a/internal/v1_9_R2/src/main/java/com/lishid/openinv/internal/v1_9_R2/SpecialEnderChest.java b/internal/v1_9_R2/src/main/java/com/lishid/openinv/internal/v1_9_R2/SpecialEnderChest.java index 01c4be5..d95ea82 100644 --- a/internal/v1_9_R2/src/main/java/com/lishid/openinv/internal/v1_9_R2/SpecialEnderChest.java +++ b/internal/v1_9_R2/src/main/java/com/lishid/openinv/internal/v1_9_R2/SpecialEnderChest.java @@ -23,12 +23,11 @@ import com.lishid.openinv.internal.ISpecialEnderChest; import org.bukkit.entity.Player; import org.bukkit.inventory.Inventory; -// Volatile +import net.minecraft.server.v1_9_R2.EntityPlayer; import net.minecraft.server.v1_9_R2.IInventory; import net.minecraft.server.v1_9_R2.InventoryEnderChest; import net.minecraft.server.v1_9_R2.InventorySubcontainer; -import org.bukkit.craftbukkit.v1_9_R2.entity.CraftPlayer; import org.bukkit.craftbukkit.v1_9_R2.inventory.CraftInventory; public class SpecialEnderChest extends InventorySubcontainer implements IInventory, ISpecialEnderChest { @@ -38,12 +37,12 @@ public class SpecialEnderChest extends InventorySubcontainer implements IInvento private boolean playerOnline = false; public SpecialEnderChest(Player player, Boolean online) { - super(((CraftPlayer) player).getHandle().getEnderChest().getName(), - ((CraftPlayer) player).getHandle().getEnderChest().hasCustomName(), - ((CraftPlayer) player).getHandle().getEnderChest().getSize()); - CraftPlayer craftPlayer = (CraftPlayer) player; - this.enderChest = craftPlayer.getHandle().getEnderChest(); - this.bukkitOwner = craftPlayer; + super(PlayerDataManager.getHandle(player).getEnderChest().getName(), + PlayerDataManager.getHandle(player).getEnderChest().hasCustomName(), + PlayerDataManager.getHandle(player).getEnderChest().getSize()); + EntityPlayer nmsPlayer = PlayerDataManager.getHandle(player); + this.enderChest = nmsPlayer.getEnderChest(); + this.bukkitOwner = nmsPlayer.getBukkitEntity(); this.items = enderChest.getContents(); } @@ -56,9 +55,9 @@ public class SpecialEnderChest extends InventorySubcontainer implements IInvento public void setPlayerOnline(Player player) { if (!playerOnline) { try { - this.bukkitOwner = player; - CraftPlayer craftPlayer = (CraftPlayer) player; - InventoryEnderChest playerEnderChest = craftPlayer.getHandle().getEnderChest(); + EntityPlayer nmsPlayer = PlayerDataManager.getHandle(player); + this.bukkitOwner = nmsPlayer.getBukkitEntity(); + InventoryEnderChest playerEnderChest = nmsPlayer.getEnderChest(); Field field = playerEnderChest.getClass().getField("items"); field.setAccessible(true); field.set(playerEnderChest, this.items); diff --git a/internal/v1_9_R2/src/main/java/com/lishid/openinv/internal/v1_9_R2/SpecialPlayerInventory.java b/internal/v1_9_R2/src/main/java/com/lishid/openinv/internal/v1_9_R2/SpecialPlayerInventory.java index 4682171..b4e23de 100644 --- a/internal/v1_9_R2/src/main/java/com/lishid/openinv/internal/v1_9_R2/SpecialPlayerInventory.java +++ b/internal/v1_9_R2/src/main/java/com/lishid/openinv/internal/v1_9_R2/SpecialPlayerInventory.java @@ -24,12 +24,10 @@ import com.lishid.openinv.internal.ISpecialPlayerInventory; import org.bukkit.entity.Player; import org.bukkit.inventory.Inventory; -// Volatile import net.minecraft.server.v1_9_R2.ItemStack; import net.minecraft.server.v1_9_R2.PlayerInventory; import org.bukkit.craftbukkit.v1_9_R2.entity.CraftHumanEntity; -import org.bukkit.craftbukkit.v1_9_R2.entity.CraftPlayer; import org.bukkit.craftbukkit.v1_9_R2.inventory.CraftInventory; public class SpecialPlayerInventory extends PlayerInventory implements ISpecialPlayerInventory { @@ -39,7 +37,7 @@ public class SpecialPlayerInventory extends PlayerInventory implements ISpecialP private boolean playerOnline = false; public SpecialPlayerInventory(Player bukkitPlayer, Boolean online) { - super(((CraftPlayer) bukkitPlayer).getHandle()); + super(PlayerDataManager.getHandle(bukkitPlayer)); this.playerOnline = online; setItemArrays(this, player.inventory.items, player.inventory.armor, player.inventory.extraSlots); } @@ -89,7 +87,7 @@ public class SpecialPlayerInventory extends PlayerInventory implements ISpecialP @Override public void setPlayerOnline(Player player) { if (!playerOnline) { - this.player = ((CraftPlayer) player).getHandle(); + this.player = PlayerDataManager.getHandle(player); setItemArrays(this.player.inventory, items, armor, extraSlots); playerOnline = true; }