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

99 lines
3.4 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-08-11 07:46:49 +02:00
import cpw.mods.fml.common.ObfuscationReflectionHelper;
2012-02-02 05:24:31 +01:00
import net.minecraft.src.EntityPlayer;
import net.minecraft.src.Item;
import net.minecraft.src.ItemStack;
import net.minecraft.src.TileEntity;
import net.minecraft.src.TileEntityChest;
2012-02-02 05:24:31 +01:00
import net.minecraft.src.World;
2012-08-11 07:46:49 +02:00
public class ItemChestChanger extends Item {
2012-02-02 05:24:31 +01:00
private ChestChangerType type;
public ItemChestChanger(int id, ChestChangerType type) {
super(id);
setMaxStackSize(1);
this.type=type;
setIconIndex(type.ordinal());
2012-02-02 05:24:31 +01:00
setItemName(type.itemName);
}
@Override
public boolean onItemUseFirst(ItemStack stack, EntityPlayer player, World world, int X, int Y, int Z, int side) {
2012-08-12 06:38:28 +02:00
if (world.isRemote)
return false;
2012-02-02 05:24:31 +01:00
TileEntity te=world.getBlockTileEntity(X,Y,Z);
TileEntityIronChest newchest;
2012-02-02 05:24:31 +01:00
if (te!=null && te instanceof TileEntityIronChest) {
TileEntityIronChest ironchest=(TileEntityIronChest)te;
newchest=ironchest.applyUpgradeItem(this);
2012-02-02 05:24:31 +01:00
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;
2012-08-11 07:46:49 +02:00
ItemStack[] chestContents = ObfuscationReflectionHelper.getPrivateValue(TileEntityChest.class, tec, 0);
System.arraycopy(chestContents, 0, newchest.chestContents, 0, Math.min(newSize, chestContents.length));
2012-08-11 07:46:49 +02:00
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);
2012-02-02 05:24:31 +01:00
} 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.markBlockNeedsUpdate(X, Y, Z);
2012-08-12 06:38:28 +02:00
world.markBlocksDirty(X, Y, Z, X, Y, Z);
stack.stackSize=0;
return true;
2012-02-02 05:24:31 +01:00
}
@Override
public String getTextureFile() {
2012-02-07 03:29:48 +01:00
return "/cpw/mods/ironchest/sprites/item_textures.png";
2012-02-02 05:24:31 +01:00
}
public int getTargetChestOrdinal(int sourceOrdinal) {
return type.getTarget();
}
public ChestChangerType getType() {
return type;
}
}