Merge pull request #2614 from williewillus/entitycaps

Expose IItemHandler on vanilla entities
This commit is contained in:
LexManos committed 2016-03-21 19:27:25 -07:00
commit 5cb4fe33bc
9 files changed
+185 -82

No files matched your search

@@ -20,6 +20,11 @@ public class ItemStackHandler implements IItemHandler, IItemHandlerModifiable, I
stacks = new ItemStack[size];
}
public ItemStackHandler(ItemStack[] stacks)
{
this.stacks = stacks;
}
public void setSize(int size)
{
stacks = new ItemStack[size];
@@ -4,29 +4,14 @@ import net.minecraft.entity.player.InventoryPlayer;
import net.minecraft.inventory.EntityEquipmentSlot;
import net.minecraft.item.ItemStack;
public class PlayerArmorInvWrapper extends InvWrapper
public class PlayerArmorInvWrapper extends RangedWrapper
{
public final InventoryPlayer inventoryPlayer;
public final int offset;
public PlayerArmorInvWrapper(InventoryPlayer inv)
{
super(inv);
super(new InvWrapper(inv), inv.mainInventory.length, inv.mainInventory.length + inv.armorInventory.length);
inventoryPlayer = inv;
offset = inventoryPlayer.mainInventory.length;
}
@Override
public int getSlots()
{
return inventoryPlayer.armorInventory.length;
}
@Override
public ItemStack getStackInSlot(int slot)
{
return super.getStackInSlot(slot + offset);
}
@Override
@@ -44,20 +29,8 @@ public class PlayerArmorInvWrapper extends InvWrapper
// check if it's valid for the armor slot
if (slot < 4 && stack != null && stack.getItem().isValidArmor(stack, equ, inventoryPlayer.player))
{
return super.insertItem(slot + offset, stack, simulate);
return super.insertItem(slot, stack, simulate);
}
return stack;
}
@Override
public void setStackInSlot(int slot, ItemStack stack)
{
super.setStackInSlot(slot + offset, stack);
}
@Override
public ItemStack extractItem(int slot, int amount, boolean simulate)
{
return super.extractItem(slot + offset, amount, simulate);
}
}
@@ -6,6 +6,6 @@ public class PlayerInvWrapper extends CombinedInvWrapper
{
public PlayerInvWrapper(InventoryPlayer inv)
{
super(new PlayerMainInvWrapper(inv), new PlayerArmorInvWrapper(inv));
super(new PlayerMainInvWrapper(inv), new PlayerArmorInvWrapper(inv), new PlayerOffhandInvWrapper(inv));
}
}
@@ -8,55 +8,19 @@ import net.minecraft.item.ItemStack;
* Exposes the player inventory WITHOUT the armor inventory as IItemHandler.
* Also takes core of inserting/extracting having the same logic as picking up items.
*/
public class PlayerMainInvWrapper extends InvWrapper
public class PlayerMainInvWrapper extends RangedWrapper
{
public final InventoryPlayer inventoryPlayer;
public PlayerMainInvWrapper(InventoryPlayer inv)
{
super(inv);
super(new InvWrapper(inv), 0, inv.mainInventory.length);
inventoryPlayer = inv;
}
@Override
public int getSlots()
{
return inventoryPlayer.mainInventory.length;
}
@Override
public void setStackInSlot(int slot, ItemStack stack)
{
// prevent setting of armor inventory
if (slot > getSlots())
{
return;
}
super.setStackInSlot(slot, stack);
}
@Override
public ItemStack getStackInSlot(int slot)
{
// prevent getting of armor inventory
if (slot > getSlots())
{
return null;
}
return super.getStackInSlot(slot);
}
@Override
public ItemStack insertItem(int slot, ItemStack stack, boolean simulate)
{
// prevent inserting into armor inventory
if (slot > getSlots())
{
return stack;
}
ItemStack rest = super.insertItem(slot, stack, simulate);
if (rest == null || rest.stackSize != stack.stackSize)
{
@@ -75,15 +39,4 @@ public class PlayerMainInvWrapper extends InvWrapper
}
return rest;
}
@Override
public ItemStack extractItem(int slot, int amount, boolean simulate)
{
// prevent extraction from armor inventory
if (slot > getSlots())
{
return null;
}
return super.extractItem(slot, amount, simulate);
}
}
@@ -0,0 +1,13 @@
package net.minecraftforge.items.wrapper;
import net.minecraft.entity.player.InventoryPlayer;
import net.minecraft.item.ItemStack;
public class PlayerOffhandInvWrapper extends RangedWrapper
{
public PlayerOffhandInvWrapper(InventoryPlayer inv)
{
super(new InvWrapper(inv), inv.mainInventory.length + inv.armorInventory.length,
inv.mainInventory.length + inv.armorInventory.length + inv.offHandInventory.length);
}
}
@@ -0,0 +1,78 @@
package net.minecraftforge.items.wrapper;
import com.google.common.base.Preconditions;
import net.minecraft.item.ItemStack;
import net.minecraftforge.items.IItemHandlerModifiable;
/**
* A wrapper that composes another IItemHandlerModifiable, exposing only a range of the composed slots.
* Shifting of slot indices is handled automatically for you.
*/
public class RangedWrapper implements IItemHandlerModifiable {
private final IItemHandlerModifiable compose;
private final int minSlot;
private final int maxSlot;
public RangedWrapper(IItemHandlerModifiable compose, int minSlot, int maxSlotExclusive)
{
Preconditions.checkArgument(maxSlotExclusive > minSlot, "Max slot must be greater than min slot");
this.compose = compose;
this.minSlot = minSlot;
this.maxSlot = maxSlotExclusive;
}
@Override
public int getSlots()
{
return maxSlot - minSlot;
}
@Override
public ItemStack getStackInSlot(int slot)
{
if (checkSlot(slot))
{
return compose.getStackInSlot(slot + minSlot);
}
return null;
}
@Override
public ItemStack insertItem(int slot, ItemStack stack, boolean simulate)
{
if (checkSlot(slot))
{
return compose.insertItem(slot + minSlot, stack, simulate);
}
return stack;
}
@Override
public ItemStack extractItem(int slot, int amount, boolean simulate)
{
if (checkSlot(slot))
{
return compose.extractItem(slot + minSlot, amount, simulate);
}
return null;
}
@Override
public void setStackInSlot(int slot, ItemStack stack)
{
if (checkSlot(slot))
{
compose.setStackInSlot(slot + minSlot, stack);
}
}
private boolean checkSlot(int localSlot)
{
return localSlot + minSlot < maxSlot;
}
}