diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftHumanEntity.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftHumanEntity.java index 9e4be51..2291747 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftHumanEntity.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftHumanEntity.java @@ -3,9 +3,14 @@ import net.minecraft.entity.player.EntityPlayerMP; import org.bukkit.GameMode; import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.block.Block; import org.bukkit.craftbukkit.CraftServer; +import org.bukkit.craftbukkit.event.CraftEventFactory; +import org.bukkit.craftbukkit.inventory.CraftContainer; import org.bukkit.craftbukkit.inventory.CraftInventory; import org.bukkit.craftbukkit.inventory.CraftInventoryPlayer; +import org.bukkit.craftbukkit.inventory.CraftInventoryView; import org.bukkit.craftbukkit.inventory.CraftItemStack; import org.bukkit.entity.HumanEntity; import org.bukkit.event.inventory.InventoryType; @@ -20,6 +25,8 @@ import org.bukkit.permissions.PermissionAttachmentInfo; import org.bukkit.plugin.Plugin; import org.ultramine.mods.bukkit.interfaces.entity.player.IMixinPlayer; +import org.ultramine.mods.bukkit.interfaces.entity.player.IMixinPlayerMP; +import org.ultramine.mods.bukkit.interfaces.inventory.IMixinContainer; import java.util.Set; @@ -205,9 +212,8 @@ } public InventoryView getOpenInventory() - { //TODO -// return getHandle().openContainer.getBukkitView(); - throw new UnsupportedOperationException(); + { + return ((IMixinContainer) getHandle().openContainer).getBukkitView(); } public InventoryView openInventory(Inventory inventory) @@ -283,103 +289,99 @@ { return null; } -// getHandle().openContainer.checkReachable = false; -// return getHandle().openContainer.getBukkitView(); - - throw new UnsupportedOperationException(); //TODO + //TODO +// getHandle().openContainer.checkReachable = false; + return ((IMixinContainer) getHandle().openContainer).getBukkitView(); } private void openCustomInventory(Inventory inventory, net.minecraft.entity.player.EntityPlayerMP player, int windowType) { -// if (player.playerNetServerHandler == null) return; -// net.minecraft.inventory.Container container = new CraftContainer(inventory, this, player.nextContainerCounter()); -// -// container = CraftEventFactory.callInventoryOpenEvent(player, container); -// if(container == null) return; -// -// String title = container.getBukkitView().getTitle(); -// int size = container.getBukkitView().getTopInventory().getSize(); -// -// player.playerNetServerHandler.sendPacket(new net.minecraft.network.play.server.S2DPacketOpenWindow(container.windowId, windowType, title, size, true)); -// getHandle().openContainer = container; -// getHandle().openContainer.addCraftingToCrafters(player); + if (player.playerNetServerHandler == null) return; + net.minecraft.inventory.Container container = new CraftContainer(inventory, this, ((IMixinPlayerMP) player).nextContainerCounter()); - throw new UnsupportedOperationException(); //TODO + container = CraftEventFactory.callInventoryOpenEvent(player, container); + if(container == null) return; + + InventoryView view = ((IMixinContainer) container).getBukkitView(); + if(view == null) return; + + String title = view.getTitle(); + int size = view.getTopInventory().getSize(); + + player.playerNetServerHandler.sendPacket(new net.minecraft.network.play.server.S2DPacketOpenWindow(container.windowId, windowType, title, size, true)); + getHandle().openContainer = container; + getHandle().openContainer.addCraftingToCrafters(player); } public InventoryView openWorkbench(Location location, boolean force) { -// if (!force) { -// Block block = location.getBlock(); -// if (block.getType() != Material.WORKBENCH) { -// return null; -// } -// } -// if (location == null) { -// location = getLocation(); -// } -// getHandle().displayGUIWorkbench(location.getBlockX(), location.getBlockY(), location.getBlockZ()); -// if (force) { -// getHandle().openContainer.checkReachable = false; -// } -// return getHandle().openContainer.getBukkitView(); - - throw new UnsupportedOperationException(); //TODO + if (!force) { + Block block = location.getBlock(); + if (block.getType() != Material.WORKBENCH) { + return null; + } + } + if (location == null) { + location = getLocation(); + } + getHandle().displayGUIWorkbench(location.getBlockX(), location.getBlockY(), location.getBlockZ()); + if (force) { + // TODO +// getHandle().openContainer.checkReachable = false; + } + return ((IMixinContainer) getHandle().openContainer).getBukkitView(); } public InventoryView openEnchanting(Location location, boolean force) { -// if (!force) { -// Block block = location.getBlock(); -// if (block.getType() != Material.ENCHANTMENT_TABLE) { -// return null; -// } -// } -// if (location == null) { -// location = getLocation(); -// } -// getHandle().displayGUIEnchantment(location.getBlockX(), location.getBlockY(), location.getBlockZ(), null); -// if (force) { -// getHandle().openContainer.checkReachable = false; -// } -// return getHandle().openContainer.getBukkitView(); - - throw new UnsupportedOperationException(); //TODO + if (!force) { + Block block = location.getBlock(); + if (block.getType() != Material.ENCHANTMENT_TABLE) { + return null; + } + } + if (location == null) { + location = getLocation(); + } + getHandle().displayGUIEnchantment(location.getBlockX(), location.getBlockY(), location.getBlockZ(), null); + if (force) { + // TODO +// getHandle().openContainer.checkReachable = false; + } + return ((IMixinContainer) getHandle().openContainer).getBukkitView(); } public void openInventory(InventoryView inventory) { -// if (!(getHandle() instanceof net.minecraft.entity.player.EntityPlayerMP)) return; // TODO: NPC support? -// if (((net.minecraft.entity.player.EntityPlayerMP) getHandle()).playerNetServerHandler == null) return; -// if (getHandle().openContainer != getHandle().inventoryContainer) { -// // fire INVENTORY_CLOSE if one already open -// ((net.minecraft.entity.player.EntityPlayerMP)getHandle()).playerNetServerHandler.processCloseWindow(new net.minecraft.network.play.client.C0DPacketCloseWindow(getHandle().openContainer.windowId)); -// } -// net.minecraft.entity.player.EntityPlayerMP player = (net.minecraft.entity.player.EntityPlayerMP) getHandle(); -// net.minecraft.inventory.Container container; -// if (inventory instanceof CraftInventoryView) { -// container = ((CraftInventoryView) inventory).getHandle(); -// } else { -// player.getNextWindowId(); -// container = new CraftContainer(inventory, player.currentWindowId); -// } -// -// // Trigger an INVENTORY_OPEN event -// container = CraftEventFactory.callInventoryOpenEvent(player, container); -// if (container == null) { -// return; -// } -// -// // Now open the window -// InventoryType type = inventory.getType(); -// int windowType = CraftContainer.getNotchInventoryType(type); -// String title = inventory.getTitle(); -// int size = inventory.getTopInventory().getSize(); -// player.playerNetServerHandler.sendPacket(new net.minecraft.network.play.server.S2DPacketOpenWindow(container.windowId, windowType, title, size, false)); -// player.openContainer = container; -// player.openContainer.addCraftingToCrafters(player); + if (!(getHandle() instanceof net.minecraft.entity.player.EntityPlayerMP)) return; // TODO: NPC support? + if (((net.minecraft.entity.player.EntityPlayerMP) getHandle()).playerNetServerHandler == null) return; + if (getHandle().openContainer != getHandle().inventoryContainer) { + // fire INVENTORY_CLOSE if one already open + ((net.minecraft.entity.player.EntityPlayerMP)getHandle()).playerNetServerHandler.processCloseWindow(new net.minecraft.network.play.client.C0DPacketCloseWindow(getHandle().openContainer.windowId)); + } + net.minecraft.entity.player.EntityPlayerMP player = (net.minecraft.entity.player.EntityPlayerMP) getHandle(); + net.minecraft.inventory.Container container; + if (inventory instanceof CraftInventoryView) { + container = ((CraftInventoryView) inventory).getHandle(); + } else { + player.getNextWindowId(); + container = new CraftContainer(inventory, player.currentWindowId); + } - throw new UnsupportedOperationException(); //TODO + // Trigger an INVENTORY_OPEN event + container = CraftEventFactory.callInventoryOpenEvent(player, container); + if (container == null) { + return; + } + + // Now open the window + InventoryType type = inventory.getType(); + int windowType = CraftContainer.getNotchInventoryType(type); + String title = inventory.getTitle(); + int size = inventory.getTopInventory().getSize(); + player.playerNetServerHandler.sendPacket(new net.minecraft.network.play.server.S2DPacketOpenWindow(container.windowId, windowType, title, size, false)); + player.openContainer = container; + player.openContainer.addCraftingToCrafters(player); } public void closeInventory() diff --git a/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java b/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java index cc1f575..db8c493 100644 --- a/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java +++ b/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java @@ -29,8 +29,10 @@ import org.bukkit.craftbukkit.block.CraftBlock; import org.bukkit.craftbukkit.block.CraftBlockState; import org.bukkit.craftbukkit.entity.CraftEntity; +import org.bukkit.craftbukkit.entity.CraftHumanEntity; import org.bukkit.craftbukkit.entity.CraftLivingEntity; import org.bukkit.craftbukkit.entity.CraftPlayer; +import org.bukkit.craftbukkit.inventory.CraftInventoryCrafting; import org.bukkit.craftbukkit.inventory.CraftItemStack; import org.bukkit.craftbukkit.util.CraftDamageSource; import org.bukkit.craftbukkit.util.CraftMagicNumbers; @@ -87,6 +89,9 @@ import org.bukkit.event.entity.PotionSplashEvent; import org.bukkit.event.entity.ProjectileHitEvent; import org.bukkit.event.entity.ProjectileLaunchEvent; +import org.bukkit.event.inventory.InventoryCloseEvent; +import org.bukkit.event.inventory.InventoryOpenEvent; +import org.bukkit.event.inventory.PrepareItemCraftEvent; import org.bukkit.event.player.PlayerAchievementAwardedEvent; import org.bukkit.event.player.PlayerBucketEmptyEvent; import org.bukkit.event.player.PlayerBucketFillEvent; @@ -99,12 +104,14 @@ import org.bukkit.event.player.PlayerStatisticIncrementEvent; import org.bukkit.event.player.PlayerUnleashEntityEvent; import org.bukkit.event.server.ServerListPingEvent; +import org.bukkit.inventory.InventoryView; import org.bukkit.inventory.meta.BookMeta; import org.ultramine.mods.bukkit.interfaces.IMixinEntityDamageSourceIndirect; import org.ultramine.mods.bukkit.interfaces.entity.IMixinEntity; import org.ultramine.mods.bukkit.interfaces.entity.IMixinEntityLiving; import org.ultramine.mods.bukkit.interfaces.entity.IMixinEntityLivingBase; import org.ultramine.mods.bukkit.interfaces.entity.player.IMixinPlayerMP; +import org.ultramine.mods.bukkit.interfaces.inventory.IMixinContainer; import org.ultramine.mods.bukkit.interfaces.world.IMixinWorld; import org.ultramine.mods.bukkit.util.ArmorPropertiesUM; @@ -1066,44 +1073,44 @@ //TODO // Cauldron start - allow inventory force close to be toggled -// public static net.minecraft.inventory.Container callInventoryOpenEvent(net.minecraft.entity.player.EntityPlayerMP player, net.minecraft.inventory.Container container) { -// return callInventoryOpenEvent(player, container, true); -// } + public static net.minecraft.inventory.Container callInventoryOpenEvent(net.minecraft.entity.player.EntityPlayerMP player, net.minecraft.inventory.Container container) { + return callInventoryOpenEvent(player, container, true); + } -// public static net.minecraft.inventory.Container callInventoryOpenEvent(net.minecraft.entity.player.EntityPlayerMP player, net.minecraft.inventory.Container container, boolean closeInv) { -// if (player.openContainer != player.inventoryContainer && closeInv) { // fire INVENTORY_CLOSE if one already open -// // Cauldron end -// player.playerNetServerHandler.processCloseWindow(new net.minecraft.network.play.client.C0DPacketCloseWindow(player.openContainer.windowId)); -// } -// -// CraftServer server = ((IMixinWorld) player.worldObj).getServer(); -// CraftPlayer craftPlayer = (CraftPlayer) ((IMixinEntity) player).getBukkitEntity(); -// // Cauldron start - vanilla compatibility -// try { -// player.openContainer.transferTo(container, craftPlayer); -// } -// catch (AbstractMethodError e) { -// // do nothing -// } -// // Cauldron end -// InventoryOpenEvent event = new InventoryOpenEvent(container.getBukkitView()); -// if (container.getBukkitView() != null) server.getPluginManager().callEvent(event); // Cauldron - allow vanilla mods to bypass -// -// if (event.isCancelled()) { -// container.transferTo(player.openContainer, craftPlayer); -// // Cauldron start - handle close for modded containers -// if (!closeInv) { // fire INVENTORY_CLOSE if one already open -// player.openContainer = container; // make sure the right container is processed -// player.closeScreen(); -// player.openContainer = player.inventoryContainer; -// } -// // Cauldron end -// return null; -// } -// -// return container; -// } -// + public static net.minecraft.inventory.Container callInventoryOpenEvent(net.minecraft.entity.player.EntityPlayerMP player, net.minecraft.inventory.Container container, boolean closeInv) { + if (player.openContainer != player.inventoryContainer && closeInv) { // fire INVENTORY_CLOSE if one already open + // Cauldron end + player.playerNetServerHandler.processCloseWindow(new net.minecraft.network.play.client.C0DPacketCloseWindow(player.openContainer.windowId)); + } + + CraftServer server = ((IMixinWorld) player.worldObj).getServer(); + CraftPlayer craftPlayer = (CraftPlayer) ((IMixinEntity) player).getBukkitEntity(); + // Cauldron start - vanilla compatibility + try { + ((IMixinContainer) player.openContainer).transferTo(container, craftPlayer); + } + catch (AbstractMethodError e) { + // do nothing + } + // Cauldron end + InventoryOpenEvent event = new InventoryOpenEvent(((IMixinContainer) container).getBukkitView()); + if (((IMixinContainer) container).getBukkitView() != null) server.getPluginManager().callEvent(event); // Cauldron - allow vanilla mods to bypass + + if (event.isCancelled()) { + ((IMixinContainer) container).transferTo(player.openContainer, craftPlayer); + // Cauldron start - handle close for modded containers + if (!closeInv) { // fire INVENTORY_CLOSE if one already open + player.openContainer = container; // make sure the right container is processed + player.closeScreen(); + player.openContainer = player.inventoryContainer; + } + // Cauldron end + return null; + } + + return container; + } + // public static net.minecraft.item.ItemStack callPreCraftEvent(net.minecraft.inventory.InventoryCrafting matrix, net.minecraft.item.ItemStack result, InventoryView lastCraftView, boolean isRepair) { // CraftInventoryCrafting inventory = new CraftInventoryCrafting(matrix, matrix.resultInventory); // inventory.setResult(CraftItemStack.asCraftMirror(result)); @@ -1227,12 +1234,12 @@ return event; } - //TODO !!! public static void handleInventoryCloseEvent(net.minecraft.entity.player.EntityPlayer human) - { //TODO !!! -// InventoryCloseEvent event = new InventoryCloseEvent(human.openContainer.getBukkitView()); -// if (human.openContainer.getBukkitView() != null) ((IMixinWorld) human.worldObj).getServer().getPluginManager().callEvent(event); // Cauldron - allow vanilla mods to bypass -// human.openContainer.transferTo(human.inventoryContainer, (HumanEntity) ((IMixinEntity) human).getBukkitEntity()); + { + InventoryView view = ((IMixinContainer) human.openContainer).getBukkitView(); + if(view != null) + ((IMixinWorld) human.worldObj).getServer().getPluginManager().callEvent(new InventoryCloseEvent(view)); // Cauldron - allow vanilla mods to bypass + ((IMixinContainer) human.openContainer).transferTo(human.inventoryContainer, (CraftHumanEntity) ((IMixinEntity) human).getBukkitEntity()); } public static void handleEditBookEvent(net.minecraft.entity.player.EntityPlayerMP player, net.minecraft.item.ItemStack newBookItem) diff --git a/src/main/java/org/bukkit/craftbukkit/inventory/CraftInventoryEnchanting.java b/src/main/java/org/bukkit/craftbukkit/inventory/CraftInventoryEnchanting.java index 9b5f6c8..bc51354 100644 --- a/src/main/java/org/bukkit/craftbukkit/inventory/CraftInventoryEnchanting.java +++ b/src/main/java/org/bukkit/craftbukkit/inventory/CraftInventoryEnchanting.java @@ -1,22 +1,24 @@ package org.bukkit.craftbukkit.inventory; -// TODO +import org.bukkit.inventory.EnchantingInventory; +import org.bukkit.inventory.ItemStack; -//public class CraftInventoryEnchanting extends CraftInventory implements EnchantingInventory { -// public CraftInventoryEnchanting(net.minecraft.inventory.ContainerEnchantTableInventory inventory) { -// super(inventory); -// } -// -// public void setItem(ItemStack item) { -// setItem(0,item); -// } -// -// public ItemStack getItem() { -// return getItem(0); -// } -// +public class CraftInventoryEnchanting extends CraftInventory implements EnchantingInventory +{ + public CraftInventoryEnchanting(net.minecraft.inventory.IInventory inventory) { + super(inventory); + } + + public void setItem(ItemStack item) { + setItem(0, item); + } + + public ItemStack getItem() { + return getItem(0); + } + // @Override // public net.minecraft.inventory.ContainerEnchantTableInventory getInventory() { // return (net.minecraft.inventory.ContainerEnchantTableInventory)inventory; // } -//} +} diff --git a/src/main/java/org/ultramine/mods/bukkit/interfaces/entity/player/IMixinPlayerMP.java b/src/main/java/org/ultramine/mods/bukkit/interfaces/entity/player/IMixinPlayerMP.java index 8b51e05..6f655d4 100644 --- a/src/main/java/org/ultramine/mods/bukkit/interfaces/entity/player/IMixinPlayerMP.java +++ b/src/main/java/org/ultramine/mods/bukkit/interfaces/entity/player/IMixinPlayerMP.java @@ -50,4 +50,6 @@ boolean isCollidesWithEntities(); void setCollidesWithEntities(boolean collidesWithEntities); + + int nextContainerCounter(); } diff --git a/src/main/java/org/ultramine/mods/bukkit/interfaces/inventory/IMixinContainer.java b/src/main/java/org/ultramine/mods/bukkit/interfaces/inventory/IMixinContainer.java new file mode 100644 index 0000000..e6504d0 --- /dev/null +++ b/src/main/java/org/ultramine/mods/bukkit/interfaces/inventory/IMixinContainer.java @@ -0,0 +1,13 @@ +package org.ultramine.mods.bukkit.interfaces.inventory; + +import net.minecraft.inventory.Container; +import org.bukkit.inventory.InventoryView; + +import javax.annotation.Nullable; + +public interface IMixinContainer +{ + @Nullable InventoryView getBukkitView(); + + void transferTo(Container other, org.bukkit.craftbukkit.entity.CraftHumanEntity player); +} diff --git a/src/main/java/org/ultramine/mods/bukkit/mixin/entity/player/MixinPlayerMP.java b/src/main/java/org/ultramine/mods/bukkit/mixin/entity/player/MixinPlayerMP.java index a5e4529..22521bb 100644 --- a/src/main/java/org/ultramine/mods/bukkit/mixin/entity/player/MixinPlayerMP.java +++ b/src/main/java/org/ultramine/mods/bukkit/mixin/entity/player/MixinPlayerMP.java @@ -18,6 +18,7 @@ private int lastExperience; @Shadow private int field_147101_bU; + @Shadow public int currentWindowId; // CraftBukkit start public String displayName; @@ -170,6 +171,12 @@ this.collidesWithEntities = collidesWithEntities; } + public int nextContainerCounter() + { + this.currentWindowId = this.currentWindowId % 100 + 1; + return this.currentWindowId; + } + @Inject(method = "readEntityFromNBT", at = @At("RETURN")) public void onReadEntityFromNBT(NBTTagCompound nbt, CallbackInfo ci) { diff --git a/src/main/java/org/ultramine/mods/bukkit/mixin/inventory/MixinContainer.java b/src/main/java/org/ultramine/mods/bukkit/mixin/inventory/MixinContainer.java new file mode 100644 index 0000000..fa739b6 --- /dev/null +++ b/src/main/java/org/ultramine/mods/bukkit/mixin/inventory/MixinContainer.java @@ -0,0 +1,152 @@ +package org.ultramine.mods.bukkit.mixin.inventory; + +import net.minecraft.entity.player.InventoryPlayer; +import net.minecraft.inventory.Container; +import net.minecraft.inventory.ContainerEnchantment; +import net.minecraft.inventory.ICrafting; +import net.minecraft.inventory.IInventory; +import net.minecraft.inventory.InventoryBasic; +import net.minecraft.inventory.InventoryCraftResult; +import net.minecraft.inventory.InventoryCrafting; +import net.minecraft.inventory.InventoryLargeChest; +import net.minecraft.inventory.Slot; +import net.minecraft.tileentity.TileEntityBeacon; +import net.minecraft.tileentity.TileEntityBrewingStand; +import net.minecraft.tileentity.TileEntityFurnace; +import org.bukkit.Bukkit; +import org.bukkit.craftbukkit.entity.CraftHumanEntity; +import org.bukkit.craftbukkit.entity.CraftPlayer; +import org.bukkit.craftbukkit.inventory.CraftInventory; +import org.bukkit.craftbukkit.inventory.CraftInventoryView; +import org.bukkit.event.inventory.InventoryType; +import org.bukkit.inventory.Inventory; +import org.bukkit.inventory.InventoryView; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.ultramine.mods.bukkit.interfaces.entity.player.IMixinPlayer; +import org.ultramine.mods.bukkit.interfaces.inventory.IMixinContainer; + +import javax.annotation.Nullable; +import java.util.ArrayList; +import java.util.HashSet; +import java.util.Iterator; +import java.util.List; +import java.util.Set; + +@Mixin(Container.class) +public class MixinContainer implements IMixinContainer +{ + @Shadow public List inventorySlots; + @Shadow protected List crafters; + + private InventoryView bukkitView; + private boolean isBukkitViewCreated; + + @Override + @Nullable + public InventoryView getBukkitView() + { + if(!isBukkitViewCreated) + { + isBukkitViewCreated = true; + bukkitView = computeBukkitView(); + return bukkitView; + } + + return bukkitView; // nullable here + } + + private InventoryView computeBukkitView() + { + Container container = (Container) (Object) this; + + Set uniqueInventorySet = new HashSet(); + for(Object o : inventorySlots) + uniqueInventorySet.add(((Slot) o).inventory); + List invs = new ArrayList(uniqueInventorySet); + + InventoryPlayer playerInv = null; + + for(Iterator it = invs.iterator(); it.hasNext();) + { + IInventory inv = it.next(); + if(inv instanceof InventoryPlayer) + { + InventoryPlayer foundPlayerInv = (InventoryPlayer) inv; + //noinspection SuspiciousMethodCalls + if(crafters.contains(foundPlayerInv.player)) + { + playerInv = foundPlayerInv; + it.remove(); + break; + } + } + } + + if(playerInv == null) + return null; + + Inventory craftInv = null; + if(invs.size() == 1) + { + IInventory firstInv = invs.get(0); + if(container instanceof ContainerEnchantment) + craftInv = new org.bukkit.craftbukkit.inventory.CraftInventoryEnchanting(firstInv); + else if (firstInv instanceof InventoryPlayer) + craftInv = new org.bukkit.craftbukkit.inventory.CraftInventoryPlayer((CraftHumanEntity) ((IMixinPlayer) ((InventoryPlayer) firstInv).player).getBukkitEntity()); + else if (firstInv instanceof InventoryLargeChest) + craftInv = new org.bukkit.craftbukkit.inventory.CraftInventoryDoubleChest((InventoryLargeChest) firstInv); + else if(firstInv instanceof TileEntityBeacon) + craftInv = new org.bukkit.craftbukkit.inventory.CraftInventoryBeacon((TileEntityBeacon) firstInv); + else if(firstInv instanceof TileEntityBrewingStand) + craftInv = new org.bukkit.craftbukkit.inventory.CraftInventoryBrewer((TileEntityBrewingStand) firstInv); + else if(firstInv instanceof TileEntityFurnace) + craftInv = new org.bukkit.craftbukkit.inventory.CraftInventoryFurnace((TileEntityFurnace) firstInv); + } + else if(invs.size() == 2) + { + InventoryCraftResult result = findInstance(invs, InventoryCraftResult.class); + if(result != null) + { + InventoryCrafting crafting = findInstance(invs, InventoryCrafting.class); + if(crafting != null) + { + craftInv = new org.bukkit.craftbukkit.inventory.CraftInventoryCrafting(crafting, result); + } + else + { + InventoryBasic basic = findInstance(invs, InventoryBasic.class); + if(basic != null && "Repair".equals(basic.getInventoryName())) + craftInv = new org.bukkit.craftbukkit.inventory.CraftInventoryAnvil(basic, result); + } + } + } + + CraftPlayer bukkitPlayer = (CraftPlayer) ((IMixinPlayer) playerInv.player).getBukkitEntity(); + + if(craftInv == null) + { + if(invs.size() != 1) + craftInv = Bukkit.getServer().createInventory(bukkitPlayer, InventoryType.CHEST); + else + craftInv = new CraftInventory(invs.get(0)); + } + + return new CraftInventoryView(bukkitPlayer, craftInv, container); + } + + @Nullable + private static T findInstance(List list, Class type) + { + for(Object o : list) + if(type.isInstance(o)) + return type.cast(o); + return null; + } + + @Override + public void transferTo(Container other, CraftHumanEntity player) + { + + } +} diff --git a/src/main/resources/mixin.umbukkitimpl.json b/src/main/resources/mixin.umbukkitimpl.json index 82d0f38..fdbe2f7 100644 --- a/src/main/resources/mixin.umbukkitimpl.json +++ b/src/main/resources/mixin.umbukkitimpl.json @@ -56,6 +56,7 @@ "entity.item.MixinEntityItemFrame", "entity.item.MixinEntityFireworkRocket", "entity.effect.MixinEntityLightningBolt", + "inventory.MixinContainer", "inventory.MixinInventoryLargeChest", "item.MixinItemFlintAndSteel", "item.MixinItemBucket",