/*
* 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.tracks;
import mods.railcraft.api.tracks.TrackRegistry;
import mods.railcraft.api.tracks.TrackSpec;
import mods.railcraft.common.blocks.machine.alpha.EnumMachineAlpha;
import mods.railcraft.common.core.Railcraft;
import mods.railcraft.common.core.RailcraftConfig;
import mods.railcraft.common.gui.tooltips.ToolTip;
import mods.railcraft.common.items.ItemCrowbar;
import mods.railcraft.common.items.ItemPlate.EnumPlate;
import mods.railcraft.common.items.ItemRail.EnumRail;
import mods.railcraft.common.items.ItemRailbed.EnumRailbed;
import mods.railcraft.common.items.ItemTicket;
import mods.railcraft.common.items.ItemTicketGold;
import mods.railcraft.common.items.ItemTie.EnumTie;
import mods.railcraft.common.items.RailcraftItem;
import mods.railcraft.common.modules.ModuleManager;
import mods.railcraft.common.modules.ModuleManager.Module;
import mods.railcraft.common.plugins.forge.CraftingPlugin;
import mods.railcraft.common.util.misc.Game;
import mods.railcraft.common.util.misc.MiscTools;
import net.minecraft.init.Blocks;
import net.minecraft.init.Items;
import net.minecraft.item.ItemStack;
import java.util.*;
public enum EnumTrack {
BOARDING(Module.TRACKS, 4, 1, "boarding", 8, TrackBoarding.class),
HOLDING(Module.TRACKS, 2, 1, "holding", 8, TrackHolding.class),
ONEWAY(Module.TRACKS, 4, 1, "oneway", 8, TrackOneWay.class),
CONTROL(Module.TRACKS, 2, 0, "control", 16, TrackControl.class),
LAUNCHER(Module.EXTRAS, 2, 1, "launcher", 1, TrackLauncher.class),
PRIMING(Module.EXTRAS, 2, 1, "priming", 8, TrackPriming.class),
JUNCTION(Module.TRACKS, 1, 0, "junction", 8, TrackJunction.class),
SWITCH(Module.SIGNALS, 4, 0, "switch", 8, TrackSwitch.class),
DISEMBARK(Module.TRACKS, 4, 1, "disembarking", 8, TrackDisembark.class),
SUSPENDED(Module.EXTRAS, 1, 0, "suspended", 8, TrackSuspended.class),
GATED_ONEWAY(Module.TRACKS, 2, 0, "gated.oneway", 4, TrackGatedOneWay.class),
GATED(Module.TRACKS, 1, 0, "gated", 4, TrackGated.class),
SLOW(Module.TRACKS_WOOD, 2, 0, "slow", 16, TrackSlow.class),
SLOW_BOOSTER(Module.TRACKS_WOOD, 2, 1, "slow.boost", 8, TrackSlowBooster.class),
SLOW_JUNCTION(Module.TRACKS_WOOD, 1, 0, "slow.junction", 8, TrackSlowJunction.class),
SLOW_SWITCH(Module.SIGNALS, 4, 0, "slow.switch", 8, TrackSlowSwitch.class),
SPEED(Module.TRACKS_HIGHSPEED, 2, 0, "speed", 16, TrackSpeed.class),
SPEED_BOOST(Module.TRACKS_HIGHSPEED, 2, 1, "speed.boost", 8, TrackSpeedBoost.class),
SPEED_TRANSITION(Module.TRACKS_HIGHSPEED, 4, 1, "speed.transition", 8, TrackSpeedTransition.class),
SPEED_SWITCH(Module.SIGNALS, 4, 0, "speed.switch", 8, TrackSpeedSwitch.class),
BOARDING_TRAIN(Module.TRAIN, 4, 1, "boarding.train", 8, TrackBoardingTrain.class),
HOLDING_TRAIN(Module.TRAIN, 2, 1, "holding.train", 8, TrackHoldingTrain.class),
COUPLER(Module.TRACKS, 6, 1, "coupler", 8, TrackCoupler.class),
DECOUPLER(Module.TRACKS, 0, 0, "decoupler", 8, TrackCoupler.class),
REINFORCED(Module.TRACKS_REINFORCED, 2, 0, "reinforced", 16, TrackReinforced.class),
REINFORCED_BOOSTER(Module.TRACKS_REINFORCED, 2, 1, "reinforced.boost", 8, TrackReinforcedBooster.class),
REINFORCED_JUNCTION(Module.TRACKS_REINFORCED, 1, 0, "reinforced.junction", 8, TrackReinforcedJunction.class),
REINFORCED_SWITCH(Module.TRACKS_REINFORCED, 4, 0, "reinforced.switch", 8, TrackReinforcedSwitch.class),
BUFFER_STOP(Module.TRACKS, 2, 0, "buffer.stop", 8, TrackBufferStop.class),
DISPOSAL(Module.TRACKS, 2, 0, "disposal", 8, TrackDisposal.class),
DETECTOR_DIRECTION(Module.TRACKS, 4, 0, "detector.direction", 8, TrackDetectorDirection.class),
EMBARKING(Module.TRACKS, 2, 1, "embarking", 8, TrackEmbarking.class),
WYE(Module.TRACKS, 2, 0, "wye", 8, TrackWye.class),
SLOW_WYE(Module.TRACKS_WOOD, 2, 0, "slow.wye", 8, TrackSlowWye.class),
REINFORCED_WYE(Module.TRACKS_REINFORCED, 2, 0, "reinforced.wye", 8, TrackReinforcedWye.class),
SPEED_WYE(Module.TRACKS_HIGHSPEED, 2, 0, "speed.wye", 8, TrackSpeedWye.class),
LOCKDOWN(Module.TRACKS, 2, 1, "lockdown", 8, TrackLockdown.class),
LOCKDOWN_TRAIN(Module.TRAIN, 2, 1, "lockdown.train", 8, TrackLockdownTrain.class),
WHISTLE(Module.LOCOMOTIVES, 2, 1, "whistle", 8, TrackWhistle.class),
LOCOMOTIVE(Module.LOCOMOTIVES, 6, 3, "locomotive", 8, TrackLocomotive.class),
LIMITER(Module.LOCOMOTIVES, 6, 5, "limiter", 8, TrackLimiter.class),
ROUTING(Module.ROUTING, 2, 1, "routing", 8, TrackRouting.class),
LOCKING(Module.TRACKS, 16, 1, "locking", 8, TrackNextGenLocking.class),
ELECTRIC(Module.TRACKS_ELECTRIC, 2, 0, "electric", 16, TrackElectric.class),
ELECTRIC_JUNCTION(Module.TRACKS_ELECTRIC, 1, 0, "electric.junction", 8, TrackElectricJunction.class),
ELECTRIC_SWITCH(Module.TRACKS_ELECTRIC, 4, 0, "electric.switch", 8, TrackElectricSwitch.class),
ELECTRIC_WYE(Module.TRACKS_ELECTRIC, 2, 0, "electric.wye", 8, TrackElectricWye.class),
FORCE(Module.ELECTRICITY, 1, 0, "force", 1, TrackForce.class);
public static final EnumTrack[] VALUES = values();
private static final List<EnumTrack> creativeList = new ArrayList<EnumTrack>(50);
private static final Set<TrackSpec> trackSpecs = new HashSet<TrackSpec>(50);
private final Module module;
private final String tag;
public final int recipeOutput;
private final int numIcons;
private final int itemIconIndex;
private TrackSpec trackSpec;
private boolean depreciated;
private final Class<? extends TrackBaseRailcraft> trackInstance;
static {
try {
TrackRegistry.registerIconLoader(TrackTextureLoader.INSTANCE);
TrackSpec defaultSpec = new TrackSpec((short) -1, "railcraft:default", null, TrackDefault.class);
TrackRegistry.registerTrackSpec(defaultSpec);
trackSpecs.add(defaultSpec);
} catch (Error error) {
Game.logErrorAPI(Railcraft.getModId(), error, TrackRegistry.class, TrackSpec.class);
throw error;
}
creativeList.add(SWITCH);
creativeList.add(WYE);
creativeList.add(JUNCTION);
creativeList.add(CONTROL);
creativeList.add(LOCKING);
creativeList.add(DISEMBARK);
creativeList.add(EMBARKING);
creativeList.add(COUPLER);
creativeList.add(WHISTLE);
creativeList.add(LOCOMOTIVE);
creativeList.add(LIMITER);
creativeList.add(ROUTING);
creativeList.add(BUFFER_STOP);
creativeList.add(ONEWAY);
creativeList.add(DETECTOR_DIRECTION);
creativeList.add(GATED_ONEWAY);
creativeList.add(GATED);
creativeList.add(SUSPENDED);
creativeList.add(DISPOSAL);
creativeList.add(SLOW);
creativeList.add(SLOW_BOOSTER);
creativeList.add(SLOW_JUNCTION);
creativeList.add(SLOW_SWITCH);
creativeList.add(SLOW_WYE);
creativeList.add(REINFORCED);
creativeList.add(REINFORCED_BOOSTER);
creativeList.add(REINFORCED_JUNCTION);
creativeList.add(REINFORCED_SWITCH);
creativeList.add(REINFORCED_WYE);
creativeList.add(ELECTRIC);
creativeList.add(ELECTRIC_JUNCTION);
creativeList.add(ELECTRIC_SWITCH);
creativeList.add(ELECTRIC_WYE);
creativeList.add(SPEED);
creativeList.add(SPEED_BOOST);
creativeList.add(SPEED_TRANSITION);
creativeList.add(SPEED_SWITCH);
creativeList.add(SPEED_WYE);
creativeList.add(PRIMING);
creativeList.add(LAUNCHER);
DECOUPLER.depreciated = true;
LOCKDOWN.depreciated = true;
LOCKDOWN_TRAIN.depreciated = true;
BOARDING.depreciated = true;
BOARDING_TRAIN.depreciated = true;
HOLDING.depreciated = true;
HOLDING_TRAIN.depreciated = true;
}
EnumTrack(Module module, int numIcons, int itemIconIndex, String tag, int recipeOutput, Class<? extends TrackBaseRailcraft> trackInstance) {
this.module = module;
this.numIcons = numIcons;
this.itemIconIndex = itemIconIndex;
this.tag = tag;
this.recipeOutput = recipeOutput;
this.trackInstance = trackInstance;
}
public void initialize() {
ToolTip toolTip = ToolTip.buildToolTip("tile.railcraft." + MiscTools.cleanTag(getTag()) + ".tip");
List<String> tips = toolTip != null ? toolTip.convertToStrings() : null;
try {
trackSpec = new TrackSpec((short) ordinal(), getTag(), TrackTextureLoader.INSTANCE, trackInstance, tips);
} catch (Error error) {
Game.logErrorAPI("Railcraft", error, TrackSpec.class);
trackSpec = new TrackSpec((short) ordinal(), getTag(), TrackTextureLoader.INSTANCE, trackInstance);
}
try {
TrackRegistry.registerTrackSpec(trackSpec);
trackSpecs.add(trackSpec);
registerRecipe();
} catch (Error error) {
Game.logErrorAPI(Railcraft.getModId(), error, TrackRegistry.class, TrackSpec.class);
}
}
public boolean isEnabled() {
return ModuleManager.isModuleLoaded(module) && RailcraftConfig.isBlockEnabled("track") && RailcraftConfig.isSubBlockEnabled(getTag()) && !isDepreciated();
}
public boolean isDepreciated() {
return depreciated;
}
public ItemStack getItem() {
return getItem(1);
}
public ItemStack getItem(int qty) {
if (trackSpec != null)
return trackSpec.getItem(qty);
return null;
}
public TrackSpec getTrackSpec() {
return trackSpec;
}
public String getTextureTag() {
return "railcraft:tracks/track." + tag;
}
public String getTag() {
return "railcraft:track." + tag;
}
public int getNumIcons() {
return numIcons;
}
public int getItemIconIndex() {
return itemIconIndex;
}
public static EnumTrack fromId(int id) {
if (id < 0 || id >= EnumTrack.values().length)
id = 0;
return EnumTrack.values()[id];
}
public static List<EnumTrack> getCreativeList() {
return creativeList;
}
public static Collection<TrackSpec> getRailcraftTrackSpecs() {
return trackSpecs;
}
private ItemStack registerRecipe() {
if (getItem() == null)
return null;
ItemStack output = getItem(recipeOutput * 2);
Object railWood = RailcraftConfig.useOldRecipes() ? "slabWood" : RailcraftItem.rail.getRecipeObject(EnumRail.WOOD);
Object railStandard = RailcraftConfig.useOldRecipes() ? new ItemStack(Items.iron_ingot) : RailcraftItem.rail.getRecipeObject(EnumRail.STANDARD);
Object railAdvanced = RailcraftConfig.useOldRecipes() ? new ItemStack(Items.gold_ingot) : RailcraftItem.rail.getRecipeObject(EnumRail.ADVANCED);
Object railSpeed = RailcraftConfig.useOldRecipes() ? "ingotSteel" : RailcraftItem.rail.getRecipeObject(EnumRail.SPEED);
Object railReinforced = RailcraftConfig.useOldRecipes() || !EnumMachineAlpha.ROCK_CRUSHER.isEnabled() ? "ingotSteel" : RailcraftItem.rail.getRecipeObject(EnumRail.REINFORCED);
Object railElectric = RailcraftConfig.useOldRecipes() ? "ingotCopper" : RailcraftItem.rail.getRecipeObject(EnumRail.ELECTRIC);
Object woodTie = RailcraftItem.tie.getRecipeObject(EnumTie.WOOD);
Object woodRailbed = RailcraftConfig.useOldRecipes() ? "stickWood" : RailcraftItem.railbed.getRecipeObject(EnumRailbed.WOOD);
Object stoneRailbed = RailcraftConfig.useOldRecipes() ? Blocks.stone_slab : RailcraftItem.railbed.getRecipeObject(EnumRailbed.STONE);
Object reinforcedRailbed = RailcraftConfig.useOldRecipes() || !RailcraftItem.rail.isEnabled() || !EnumMachineAlpha.ROCK_CRUSHER.isEnabled() ? new ItemStack(Blocks.obsidian) : stoneRailbed;
ItemStack crowbar = ItemCrowbar.getItem();
if (crowbar != null)
crowbar.setItemDamage(-1);
switch (this) {
case LOCKING:
CraftingPlugin.addShapedRecipe(output,
"IrI",
"IbI",
"IsI",
'I', railAdvanced,
's', woodRailbed,
'r', "dustRedstone",
'b', Blocks.stone_pressure_plate);
break;
// case BOARDING_TRAIN:
// CraftingPlugin.addShapedOreRecipe(output,
// "IrI",
// "IbI",
// "IsI",
// 'I', railAdvanced,
// 's', woodRailbed,
// 'r', Items.repeater,
// 'b', Blocks.stone_pressure_plate);
// break;
case ONEWAY:
CraftingPlugin.addShapedRecipe(output,
"IbI",
"IsI",
"IpI",
'I', railStandard,
's', woodRailbed,
'b', Blocks.stone_pressure_plate,
'p', Blocks.piston);
break;
case CONTROL:
CraftingPlugin.addShapedRecipe(output,
"IrI",
"GsG",
"IrI",
'I', railStandard,
'G', railAdvanced,
's', woodRailbed,
'r', "dustRedstone");
break;
// case HOLDING:
// CraftingPlugin.addShapedOreRecipe(output,
// "IsI",
// "IbI",
// "IrI",
// 'I', railAdvanced,
// 's', woodRailbed,
// 'r', "dustRedstone",
// 'b', Blocks.stone_pressure_plate);
// break;
// case HOLDING_TRAIN:
// CraftingPlugin.addShapedOreRecipe(output,
// "IsI",
// "IbI",
// "IrI",
// 'I', railAdvanced,
// 's', woodRailbed,
// 'r', Items.repeater,
// 'b', Blocks.stone_pressure_plate);
// break;
// case LOCKDOWN:
// CraftingPlugin.addShapedOreRecipe(output,
// "IbI",
// "IrI",
// "IsI",
// 'I', railAdvanced,
// 's', woodRailbed,
// 'r', "dustRedstone",
// 'b', Blocks.stone_pressure_plate);
// break;
// case LOCKDOWN_TRAIN:
// CraftingPlugin.addShapedOreRecipe(output,
// "IbI",
// "IrI",
// "IsI",
// 'I', railAdvanced,
// 's', woodRailbed,
// 'r', Items.repeater,
// 'b', Blocks.stone_pressure_plate);
// break;
case SPEED:
CraftingPlugin.addShapedRecipe(output,
"I I",
"IsI",
"I I",
'I', railSpeed,
's', stoneRailbed);
break;
case SPEED_BOOST:
CraftingPlugin.addShapedRecipe(output,
"IrI",
"IsI",
"IrI",
'I', railSpeed,
's', stoneRailbed,
'r', "dustRedstone");
break;
case SPEED_TRANSITION:
CraftingPlugin.addShapedRecipe(output,
"IrI",
"IrI",
"IsI",
'I', railSpeed,
's', stoneRailbed,
'r', "dustRedstone");
CraftingPlugin.addShapedRecipe(output,
"IsI",
"IrI",
"IrI",
'I', railSpeed,
's', stoneRailbed,
'r', "dustRedstone");
break;
case SPEED_SWITCH:
CraftingPlugin.addShapedRecipe(output,
"IsI",
"III",
"III",
'I', railSpeed,
's', stoneRailbed);
break;
case LAUNCHER:
CraftingPlugin.addShapedRecipe(output,
"IsI",
"BPB",
"IsI",
'I', railReinforced,
'B', "blockSteel",
's', stoneRailbed,
'P', Blocks.piston);
break;
case PRIMING:
CraftingPlugin.addShapedRecipe(output,
"IpI",
"IsI",
"IfI",
'I', railReinforced,
's', stoneRailbed,
'p', Blocks.stone_pressure_plate,
'f', Items.flint_and_steel);
break;
case JUNCTION:
CraftingPlugin.addShapedRecipe(output,
"III",
"I#I",
"III",
'I', railStandard,
'#', woodRailbed);
break;
case SLOW:
CraftingPlugin.addShapedRecipe(output,
"I I",
"I#I",
"I I",
'I', railWood,
'#', woodRailbed);
break;
case SLOW_BOOSTER:
CraftingPlugin.addShapedRecipe(output,
"I I",
"G#G",
"IrI",
'G', Items.gold_ingot,
'I', railWood,
'#', woodRailbed,
'r', "dustRedstone");
break;
case SLOW_SWITCH:
CraftingPlugin.addShapedRecipe(output,
"I#I",
"III",
"III",
'I', railWood,
'#', woodRailbed);
break;
case SLOW_JUNCTION:
CraftingPlugin.addShapedRecipe(output,
"III",
"I#I",
"III",
'I', railWood,
'#', woodRailbed);
break;
case ELECTRIC:
CraftingPlugin.addShapedRecipe(output,
"I I",
"I#I",
"I I",
'I', railElectric,
'#', stoneRailbed);
break;
case ELECTRIC_SWITCH:
CraftingPlugin.addShapedRecipe(output,
"I#I",
"III",
"III",
'I', railElectric,
'#', stoneRailbed);
break;
case ELECTRIC_JUNCTION:
CraftingPlugin.addShapedRecipe(output,
"III",
"I#I",
"III",
'I', railElectric,
'#', stoneRailbed);
break;
case ELECTRIC_WYE:
CraftingPlugin.addShapedRecipe(output,
"III",
"II#",
"III",
'I', railElectric,
'#', stoneRailbed);
break;
case SWITCH:
CraftingPlugin.addShapedRecipe(output,
"I#I",
"III",
"III",
'I', railStandard,
'#', woodRailbed);
break;
case WYE:
CraftingPlugin.addShapedRecipe(output,
"III",
"II#",
"III",
'I', railStandard,
'#', woodRailbed);
break;
case SLOW_WYE:
CraftingPlugin.addShapedRecipe(output,
"III",
"II#",
"III",
'I', railWood,
'#', woodRailbed);
break;
case REINFORCED_WYE:
CraftingPlugin.addShapedRecipe(output,
"III",
"II#",
"III",
'I', railReinforced,
'#', reinforcedRailbed);
break;
case SPEED_WYE:
CraftingPlugin.addShapedRecipe(output,
"III",
"II#",
"III",
'I', railSpeed,
'#', stoneRailbed);
break;
case DISEMBARK:
CraftingPlugin.addShapedRecipe(output,
"IpI",
"I#I",
"IrI",
'I', railAdvanced,
'#', woodRailbed,
'r', "dustRedstone",
'p', Blocks.stone_pressure_plate);
break;
case EMBARKING:
CraftingPlugin.addShapedRecipe(output,
"IpI",
"I#I",
"IpI",
'I', railAdvanced,
'#', woodRailbed,
'p', Items.ender_pearl);
break;
case SUSPENDED:
CraftingPlugin.addShapedRecipe(output,
"ItI",
"ItI",
"ItI",
'I', railStandard,
't', woodTie);
break;
case DISPOSAL:
CraftingPlugin.addShapedRecipe(output,
"ItI",
"IPI",
"ItI",
'I', railStandard,
'P', RailcraftItem.plate, EnumPlate.STEEL,
't', woodTie);
break;
case BUFFER_STOP:
CraftingPlugin.addShapedRecipe(output,
"I I",
"I#I",
"IbI",
'I', railStandard,
'#', woodRailbed,
'b', "blockIron");
break;
case DETECTOR_DIRECTION:
CraftingPlugin.addShapedRecipe(output,
"IrI",
"I#I",
"IsI",
'I', railStandard,
'#', woodRailbed,
'r', "dustRedstone",
's', Blocks.stone_pressure_plate);
break;
case GATED:
CraftingPlugin.addShapedRecipe(output,
"IgI",
"I#I",
"IgI",
'I', railStandard,
'#', woodRailbed,
'g', Blocks.fence_gate);
break;
case GATED_ONEWAY:
CraftingPlugin.addShapedRecipe(output,
"IgI",
"G#G",
"IgI",
'I', railStandard,
'#', woodRailbed,
'g', Blocks.fence_gate,
'G', railAdvanced);
break;
case COUPLER:
CraftingPlugin.addShapedRecipe(output,
"IcI",
"I#I",
"IcI",
'I', railAdvanced,
'#', woodRailbed,
'c', crowbar);
break;
case WHISTLE:
CraftingPlugin.addShapedRecipe(output,
"IyI",
"I#I",
"IbI",
'I', railStandard,
'#', woodRailbed,
'y', "dyeYellow",
'b', "dyeBlack");
break;
case LOCOMOTIVE:
CraftingPlugin.addShapedRecipe(output,
"ILI",
"I#I",
"ILI",
'I', railStandard,
'#', woodRailbed,
'L', RailcraftItem.signalLamp.getRecipeObject());
break;
case LIMITER:
CraftingPlugin.addShapedRecipe(output,
"IlI",
"I#I",
"IlI",
'I', railStandard,
'#', woodRailbed,
'l', Items.repeater);
break;
case ROUTING:
CraftingPlugin.addShapedRecipe(output,
"IrI",
"I#I",
"ItI",
'I', railStandard,
'#', woodRailbed,
'r', "dustRedstone",
't', ItemTicket.getTicket());
CraftingPlugin.addShapedRecipe(output,
"IrI",
"I#I",
"ItI",
'I', railStandard,
'#', woodRailbed,
'r', "dustRedstone",
't', ItemTicketGold.getTicket());
break;
case REINFORCED:
CraftingPlugin.addShapedRecipe(output,
"I I",
"I#I",
"I I",
'I', railReinforced,
'#', reinforcedRailbed);
break;
case REINFORCED_BOOSTER:
CraftingPlugin.addShapedRecipe(output,
"I I",
"I#I",
"IrI",
'I', railReinforced,
'r', "dustRedstone",
'#', reinforcedRailbed);
break;
case REINFORCED_JUNCTION:
CraftingPlugin.addShapedRecipe(output,
"III",
"I#I",
"III",
'I', railReinforced,
'#', reinforcedRailbed);
break;
case REINFORCED_SWITCH:
CraftingPlugin.addShapedRecipe(output,
"I#I",
"III",
"III",
'I', railReinforced,
'#', reinforcedRailbed);
break;
}
return output;
}
}