/* * Copyright (c) CovertJaguar, 2014 http://railcraft.info * * This code is the property of CovertJaguar * and may only be used with explicit written * permission unless otherwise specified on the * license page at http://railcraft.info/wiki/info:license. */ package mods.railcraft.common.blocks.machine.delta; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; import java.util.ArrayList; import mods.railcraft.api.core.IPostConnection; import mods.railcraft.api.electricity.IElectricGrid; import mods.railcraft.common.blocks.frame.BlockFrame; import mods.railcraft.common.blocks.machine.BoundingBoxManager; import mods.railcraft.common.blocks.machine.BoundingBoxManager.ReducedBoundingBox; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.IIcon; import mods.railcraft.common.blocks.machine.IEnumMachine; import mods.railcraft.common.blocks.machine.TileMachineBase; import mods.railcraft.common.plugins.forge.WorldPlugin; import mods.railcraft.common.util.inventory.InvTools; import mods.railcraft.common.util.misc.Game; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.AxisAlignedBB; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; /** * * @author CovertJaguar <http://www.railcraft.info> */ public class TileWire extends TileMachineBase implements IElectricGrid { public enum AddonType { NONE, FRAME, PYLON; public static final AddonType[] VALUES = values(); public static AddonType fromOrdinal(int ordinal) { if (ordinal < 0 || ordinal >= VALUES.length) return NONE; return VALUES[ordinal]; } } private final ChargeHandler chargeHandler = new ChargeHandler(this, ChargeHandler.ConnectType.WIRE, 0.25); private AddonType addon = AddonType.NONE; @Override public IEnumMachine getMachineType() { return EnumMachineDelta.WIRE; } @Override public IIcon getIcon(int side) { return getMachineType().getTexture(0); } @Override public boolean blockActivated(EntityPlayer player, int side) { ItemStack current = player.getCurrentEquippedItem(); if (current != null && InvTools.isStackEqualToBlock(current, BlockFrame.getBlock())) if (setAddon(AddonType.FRAME)) { if (!player.capabilities.isCreativeMode) player.setCurrentItemOrArmor(0, InvTools.depleteItem(current)); return true; } return super.blockActivated(player, side); } @Override public ArrayList<ItemStack> getDrops(int fortune) { ArrayList<ItemStack> drops = super.getDrops(fortune); if (addon == AddonType.FRAME && BlockFrame.getBlock() != null) drops.add(BlockFrame.getItem()); return drops; } @Override public boolean isSideSolid(ForgeDirection side) { if (addon == AddonType.FRAME) return side == ForgeDirection.UP; return false; } @Override public void updateEntity() { super.updateEntity(); if (Game.isNotHost(getWorld())) return; chargeHandler.tick(); } @Override public void writeToNBT(NBTTagCompound data) { super.writeToNBT(data); chargeHandler.writeToNBT(data); data.setString("addonType", addon.name()); } @Override public void readFromNBT(NBTTagCompound data) { super.readFromNBT(data); chargeHandler.readFromNBT(data); addon = AddonType.valueOf(data.getString("addonType")); } @Override public void writePacketData(DataOutputStream data) throws IOException { super.writePacketData(data); data.writeByte(addon.ordinal()); } @Override public void readPacketData(DataInputStream data) throws IOException { super.readPacketData(data); setAddon(AddonType.fromOrdinal(data.readByte())); markBlockForUpdate(); } public AddonType getAddon() { return addon; } public boolean setAddon(AddonType addon) { if (this.addon == addon) return false; if (this.addon != AddonType.NONE) { //dropstuff } this.addon = addon; sendUpdateToClient(); return true; } @Override public ChargeHandler getChargeHandler() { return chargeHandler; } @Override public TileEntity getTile() { return this; } @Override public IPostConnection.ConnectStyle connectsToPost(ForgeDirection side) { if (getAddon() == AddonType.FRAME) return IPostConnection.ConnectStyle.TWO_THIN; return IPostConnection.ConnectStyle.NONE; } public static class WireBoundingBox extends ReducedBoundingBox { public WireBoundingBox() { super(4); } @Override public AxisAlignedBB getBox(World world, int x, int y, int z) { TileEntity tile = WorldPlugin.getBlockTile(world, x, y, z); if (tile instanceof TileWire) { TileWire wire = (TileWire) tile; AddonType type = wire.getAddon(); if (type == AddonType.NONE) return super.getBox(world, x, y, z); } return BoundingBoxManager.DEFAULT.getBox(world, x, y, z); } } }