ironbarrels/IronChests2/common/cpw/mods/ironchest/ItemChestChanger.java

113 lines
4.1 KiB
Java
Raw Normal View History

/*******************************************************************************
* Copyright (c) 2012 cpw.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the GNU Public License v3.0
* which accompanies this distribution, and is available at
* http://www.gnu.org/licenses/gpl.html
*
* Contributors:
* cpw - initial API and implementation
******************************************************************************/
2012-02-02 05:24:31 +01:00
package cpw.mods.ironchest;
2012-12-13 14:02:41 +01:00
import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.tileentity.TileEntityChest;
import net.minecraft.world.World;
2012-08-11 07:46:49 +02:00
import cpw.mods.fml.common.ObfuscationReflectionHelper;
2012-02-02 05:24:31 +01:00
2012-08-11 07:46:49 +02:00
public class ItemChestChanger extends Item {
2012-02-02 05:24:31 +01:00
private ChestChangerType type;
2012-02-02 05:24:31 +01:00
public ItemChestChanger(int id, ChestChangerType type)
{
super(id);
setMaxStackSize(1);
this.type = type;
setIconIndex(type.ordinal());
setItemName(type.itemName);
setCreativeTab(CreativeTabs.tabMisc);
}
2012-02-02 05:24:31 +01:00
@Override
public boolean onItemUseFirst(ItemStack stack, EntityPlayer player, World world, int X, int Y, int Z, int side, float hitX, float hitY, float hitZ)
{
if (world.isRemote) return false;
TileEntity te = world.getBlockTileEntity(X, Y, Z);
TileEntityIronChest newchest;
if (te != null && te instanceof TileEntityIronChest)
{
TileEntityIronChest ironchest = (TileEntityIronChest) te;
newchest = ironchest.applyUpgradeItem(this);
if (newchest == null)
{
return false;
}
}
else if (te != null && te instanceof TileEntityChest)
{
TileEntityChest tec = (TileEntityChest) te;
if (tec.numUsingPlayers > 0)
{
return false;
}
if (!getType().canUpgrade(IronChestType.WOOD))
{
return false;
}
// Force old TE out of the world so that adjacent chests can update
newchest = IronChestType.makeEntity(getTargetChestOrdinal(IronChestType.WOOD.ordinal()));
int newSize = newchest.chestContents.length;
ItemStack[] chestContents = ObfuscationReflectionHelper.getPrivateValue(TileEntityChest.class, tec, 0);
System.arraycopy(chestContents, 0, newchest.chestContents, 0, Math.min(newSize, chestContents.length));
BlockIronChest block = IronChest.ironChestBlock;
block.dropContent(newSize, tec, world, tec.xCoord, tec.yCoord, tec.zCoord);
newchest.setFacing((byte) tec.getBlockMetadata());
newchest.sortTopStacks();
for (int i = 0; i < Math.min(newSize, chestContents.length); i++)
{
chestContents[i] = null;
}
// Clear the old block out
world.setBlock(X, Y, Z, 0);
// Force the Chest TE to reset it's knowledge of neighbouring blocks
tec.updateContainingBlockInfo();
// Force the Chest TE to update any neighbours so they update next
// tick
tec.checkForAdjacentChests();
// And put in our block instead
world.setBlock(X, Y, Z, block.blockID);
}
else
{
return false;
}
world.setBlockTileEntity(X, Y, Z, newchest);
world.setBlockMetadataWithNotify(X, Y, Z, newchest.getType().ordinal());
world.notifyBlocksOfNeighborChange(X, Y, Z, world.getBlockId(X, Y, Z));
world.markBlockForUpdate(X, Y, Z);
stack.stackSize = 0;
return true;
}
2012-02-02 05:24:31 +01:00
@Override
public String getTextureFile()
{
return "/cpw/mods/ironchest/sprites/item_textures.png";
}
2012-02-02 05:24:31 +01:00
public int getTargetChestOrdinal(int sourceOrdinal)
{
return type.getTarget();
}
2012-02-02 05:24:31 +01:00
public ChestChangerType getType()
{
return type;
}
2012-02-02 05:24:31 +01:00
}