/*
* 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.alpha;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import mods.railcraft.client.util.textures.TextureAtlasSheet;
import mods.railcraft.common.blocks.RailcraftBlocks;
import mods.railcraft.common.blocks.machine.IEnumMachine;
import mods.railcraft.common.blocks.machine.TileMachineBase;
import mods.railcraft.common.carts.ItemCartAnchor;
import mods.railcraft.common.core.RailcraftConfig;
import mods.railcraft.common.core.RailcraftConstants;
import mods.railcraft.common.gui.tooltips.ToolTip;
import mods.railcraft.common.modules.ModuleManager;
import mods.railcraft.common.modules.ModuleManager.Module;
import mods.railcraft.common.plugins.forge.LocalizationPlugin;
import net.minecraft.block.Block;
import net.minecraft.client.renderer.texture.IIconRegister;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.ItemStack;
import net.minecraft.util.IIcon;
import java.util.ArrayList;
import java.util.List;
/**
*
* @author CovertJaguar
*/
public enum EnumMachineAlpha implements IEnumMachine {
WORLD_ANCHOR(Module.CHUNK_LOADING, "anchor.world", TileAnchorWorld.class, 3, 1, 0, 0, 1, 1, 1, 1, 2),
TURBINE(Module.ELECTRICITY, "turbine", TileSteamTurbine.class, 3, 3, 2, 2, 2, 2, 6, 2, 0, 1, 3, 4, 5, 7),
PERSONAL_ANCHOR(Module.CHUNK_LOADING, "anchor.personal", TileAnchorPersonal.class, 3, 1, 0, 0, 1, 1, 1, 1, 2),
STEAM_OVEN(Module.FACTORY, "steam.oven", TileSteamOven.class, 4, 2, 2, 2, 3, 3, 6, 3, 0, 1, 4, 5),
ADMIN_ANCHOR(Module.CHUNK_LOADING, "anchor.admin", TileAnchorAdmin.class, 3, 1, 0, 0, 1, 1, 1, 1, 2),
SMOKER(Module.STRUCTURES, "smoker", TileSmoker.class, 3, 1, 0, 1, 2, 2, 2, 2),
TRADE_STATION(Module.AUTOMATION, "trade.station", TileTradeStation.class, 3, 1, 0, 0, 1, 1, 2, 1),
COKE_OVEN(Module.FACTORY, "coke.oven", TileCokeOven.class, 3, 1, 0, 0, 0, 0, 1, 0, 1, 2),
ROLLING_MACHINE(Module.FACTORY, "rolling.machine", TileRollingMachine.class, 3, 1, 0, 1, 2, 2, 2, 2),
STEAM_TRAP_MANUAL(Module.EXTRAS, "steam.trap", TileSteamTrapManual.class, 3, 1, 0, 2, 1, 1, 1, 1, 0, 1, 2),
STEAM_TRAP_AUTO(Module.EXTRAS, "steam.trap.auto", TileSteamTrapAuto.class, 4, 1, 0, 2, 1, 1, 1, 1, 0, 1, 2, 3),
FEED_STATION(Module.AUTOMATION, "feed.station", TileFeedStation.class, 2, 1, 0, 0, 1, 1, 1, 1),
BLAST_FURNACE(Module.FACTORY, "blast.furnace", TileBlastFurnace.class, 3, 1, 0, 0, 0, 0, 1, 0, 1, 2),
PASSIVE_ANCHOR(Module.CHUNK_LOADING, "anchor.passive",TileAnchorPassive.class, 3, 1, 0, 0, 1, 1, 1, 1, 2),
TANK_WATER(Module.TRANSPORT, "tank.water", TileTankWater.class, 2, 1, 0, 0, 1, 1, 1, 1),
ROCK_CRUSHER(Module.FACTORY, "rock.crusher", TileRockCrusher.class, 4, 3, 3, 11, 3, 3, 7, 3, 7, 0, 1, 2, 4, 6, 8, 9, 10);
private final Module module;
private final String tag;
private final Class<? extends TileMachineBase> tile;
private final int[] textureInfo;
private IIcon[] texture = new IIcon[12];
private static final List<EnumMachineAlpha> creativeList = new ArrayList<EnumMachineAlpha>();
private static final EnumMachineAlpha[] VALUES = values();
private ToolTip tip;
static {
creativeList.add(COKE_OVEN);
creativeList.add(BLAST_FURNACE);
creativeList.add(STEAM_OVEN);
creativeList.add(TANK_WATER);
creativeList.add(ROLLING_MACHINE);
creativeList.add(ROCK_CRUSHER);
creativeList.add(FEED_STATION);
creativeList.add(TRADE_STATION);
creativeList.add(WORLD_ANCHOR);
creativeList.add(PERSONAL_ANCHOR);
creativeList.add(PASSIVE_ANCHOR);
creativeList.add(ADMIN_ANCHOR);
creativeList.add(TURBINE);
creativeList.add(SMOKER);
creativeList.add(STEAM_TRAP_MANUAL);
creativeList.add(STEAM_TRAP_AUTO);
}
private EnumMachineAlpha(Module module, String tag, Class<? extends TileMachineBase> tile, int... textureInfo) {
this.module = module;
this.tile = tile;
this.tag = tag;
this.textureInfo = textureInfo;
}
@Override
public boolean isDepreciated() {
return module == null;
}
@Override
public IIcon getTexture(int index) {
if (index < 0 || index >= texture.length)
index = 0;
return texture[index];
}
@SideOnly(Side.CLIENT)
public static void registerIcons(IIconRegister iconRegister) {
for (EnumMachineAlpha machine : VALUES) {
if (machine.isDepreciated()) continue;
machine.texture = new IIcon[machine.textureInfo.length - 2];
int columns = machine.textureInfo[0];
int rows = machine.textureInfo[1];
IIcon[] icons = TextureAtlasSheet.unstitchIcons(iconRegister, "railcraft:" + machine.tag, columns, rows);
for (int i = 0; i < machine.texture.length; i++) {
machine.texture[i] = icons[machine.textureInfo[i + 2]];
}
}
}
public static EnumMachineAlpha fromId(int id) {
if (id < 0 || id >= VALUES.length)
id = 0;
return VALUES[id];
}
public static List<EnumMachineAlpha> getCreativeList() {
return creativeList;
}
@Override
public String getTag() {
return "tile.railcraft.machine.alpha." + tag;
}
@Override
public Class getTileClass() {
return tile;
}
public TileMachineBase getTileEntity() {
try {
return tile.newInstance();
} catch (Exception ex) {
}
return null;
}
@Override
public ItemStack getItem() {
return getItem(1);
}
@Override
public ItemStack getItem(int qty) {
Block block = getBlock();
if (block == null)
return null;
return new ItemStack(block, qty, ordinal());
}
public Module getModule() {
return module;
}
@Override
public Block getBlock() {
return RailcraftBlocks.getBlockMachineAlpha();
}
/**
* Block is enabled, but may not be defined yet.
*
* @return
*/
public boolean isEnabled() {
return ModuleManager.isModuleLoaded(getModule()) && RailcraftConfig.isSubBlockEnabled(getTag());
}
/**
* Block is enabled and defined.
*
* @return
*/
@Override
public boolean isAvaliable() {
return getBlock() != null && isEnabled();
}
@Override
public ToolTip getToolTip(ItemStack stack, EntityPlayer player, boolean adv) {
if (tip != null)
return tip;
switch (this) {
case WORLD_ANCHOR:
if (!RailcraftConfig.anchorFuelWorld.isEmpty())
return addAnchorInfo(stack);
break;
case PERSONAL_ANCHOR:
if (!RailcraftConfig.anchorFuelPersonal.isEmpty())
return addAnchorInfo(stack);
break;
case PASSIVE_ANCHOR:
if (!RailcraftConfig.anchorFuelPassive.isEmpty())
return addAnchorInfo(stack);
break;
default:
String tipTag = getTag() + ".tip";
if (LocalizationPlugin.hasTag(tipTag))
tip = ToolTip.buildToolTip(tipTag);
break;
}
return tip;
}
private ToolTip addAnchorInfo(ItemStack stack) {
ToolTip toolTip = new ToolTip();
long fuel = ItemCartAnchor.getFuel(stack);
double hours = (double) fuel / RailcraftConstants.TICKS_PER_HOUR;
String format = LocalizationPlugin.translate("railcraft.gui.anchor.fuel.remaining");
toolTip.add(String.format(format, hours));
return toolTip;
}
public boolean register() {
if (RailcraftConfig.isSubBlockEnabled(getTag())) {
RailcraftBlocks.registerBlockMachineAlpha();
return getBlock() != null;
}
return false;
}
}