(APPEARS TO BE) SOLVED: the tutorial I followed never mentioned that I needed to have an @NetworkMod annotation, if you have the same problem then add @NetworkMod after the @Mod annotation and it's parameters.
I've followed a tutorial for how to make a simple inventory block but I cannot get the container class to work properly (I think it's an issue with the container class at the least) it appears that the slots for the tile/block are for some reason 'tangling' with those of the player's inventory with the same slot id (clicking on the slot for the tile entity will *appear* to take an item from the corresponding slot from the player's inv).
Here is the code for the Container Class:
public class ContainerCrystaliser extends Container
{
TileCrystaliser tile;
InventoryPlayer player;
public ContainerCrystaliser(TileCrystaliser _tile, InventoryPlayer _player)
{
tile = _tile;
this.player = _player;
//add player slots
for (int i = 0; i < 9; i++) {
addSlotToContainer(new Slot(player, i, 8 + i * 18, 142));
}
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 9; j++) {
addSlotToContainer(new Slot(player, j + i * 9 + 9, 8 + j * 18, 84 + i * 18));
}
}
//add tile slots
addSlotToContainer(new Slot(tile,0,17,17));
addSlotToContainer(new Slot(tile,1,17,49));
addSlotToContainer(new Slot(tile,2,143,49));
}
@Override
public ItemStack transferStackInSlot(EntityPlayer player, int slot)
{
ItemStack stack = null;
Slot slotObject = (Slot) inventorySlots.get(slot);
if (slotObject != null && slotObject.getHasStack()) {
ItemStack stackInSlot = slotObject.getStack();
stack = stackInSlot.copy();
//merges the item into player inventory since its in the tileEntity
if (slot >= 36) {
if (!this.mergeItemStack(stackInSlot, 0, 35, false)) {
return null;
}
}
//places it into the tileEntity is possible since its in the player inventory
else if (!this.mergeItemStack(stackInSlot, 36, 39, false)) {
return null;
}
if (stackInSlot.stackSize == 0) {slotObject.putStack(null);}
else
slotObject.onSlotChanged();
if (stackInSlot.stackSize == stack.stackSize)
{
return null;
}
slotObject.onPickupFromSlot(player, stackInSlot);
}
return stack;
}
@Override
public boolean canInteractWith(EntityPlayer player)
{
return tile.isUseableByPlayer(player);
}
}
EDIT:
Gui Handler
public class GuiHandler implements IGuiHandler
{
@Override
public Object getServerGuiElement(int ID, EntityPlayer player, World world, int x, int y, int z)
{
TileEntity tileEntity = world.getBlockTileEntity(x, y, z);
if(tileEntity instanceof TileCrystaliser){
return new ContainerCrystaliser((TileCrystaliser) tileEntity, player.inventory);
}
return null;
}
@Override
public Object getClientGuiElement(int id, EntityPlayer player, World world, int x, int y, int z)
{
TileEntity tileEntity = world.getBlockTileEntity(x, y, z);
if(tileEntity instanceof TileCrystaliser){
return new GuiCrystaliser(player.inventory, (TileCrystaliser) tileEntity);
}
return null;
}
}
Proxies
public class CommonProxy
{
public void registerRendering() {
}
public int addArmour(String path) {
return 0;
}
}
public class CommonProxy
{
public void registerRendering() {
}
public int addArmour(String path) {
return 0;
}
}
and as a bit of a side note; if I swap the order of the code for the tile and player slots, clicking on a player inv slot will pick up an item from 6 slots to the left (though it wraps from hotbar to the end of the inventory, such that clicking from the leftmost hotbar slot will pick up an item 6 from the right of the bottom line of the main inv.)
though it does also sometimes do other odd things, such as the hotbar being completely non-interactable, even if I comment out the adding of the tile's slots.