/* * 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.carts; import cpw.mods.fml.common.registry.EntityRegistry; import mods.railcraft.api.carts.locomotive.LocomotiveRenderType; import mods.railcraft.common.blocks.machine.beta.EnumMachineBeta; import mods.railcraft.common.core.Railcraft; import mods.railcraft.common.core.RailcraftConfig; import mods.railcraft.common.plugins.forge.RailcraftRegistry; import mods.railcraft.common.util.misc.EntityIDs; import mods.railcraft.common.util.misc.EnumColor; import mods.railcraft.common.util.misc.Game; import mods.railcraft.common.util.misc.MiscTools; import net.minecraft.entity.EntityList; import net.minecraft.entity.item.EntityMinecart; import net.minecraft.entity.item.EntityMinecartHopper; import net.minecraft.init.Blocks; import net.minecraft.init.Items; import net.minecraft.item.ItemStack; import net.minecraft.world.World; import java.lang.reflect.Constructor; import java.util.Locale; public enum EnumCart implements ICartType { BASIC(0, EntityCartBasic.class, null), CHEST(0, EntityCartChest.class, new ItemStack(Blocks.chest)), FURNACE(0, EntityCartFurnace.class, new ItemStack(Blocks.furnace)), TNT_WOOD(0, EntityCartTNTWood.class, new ItemStack(Blocks.tnt)), TANK(0, EntityCartTank.class, null), CARGO(0, EntityCartCargo.class, new ItemStack(Blocks.trapped_chest)), ANCHOR(0, EntityCartAnchor.class, null), WORK(0, EntityCartWork.class, new ItemStack(Blocks.crafting_table)), TRACK_RELAYER(1, EntityCartTrackRelayer.class, null), UNDERCUTTER(1, EntityCartUndercutter.class, null), PUMPKIN(3, EntityCartPumpkin.class, new ItemStack(Blocks.pumpkin)), GIFT(3, EntityCartGift.class, null), ANCHOR_PERSONAL(0, EntityCartAnchorPersonal.class, null), ANCHOR_ADMIN(3, EntityCartAnchorAdmin.class, null), TNT(0, EntityCartTNT.class, new ItemStack(Blocks.tnt)), LOCO_STEAM_SOLID(1, EntityLocomotiveSteamSolid.class, null), LOCO_STEAM_MAGIC(1, EntityLocomotiveSteamMagic.class, null), LOCO_ELECTRIC(1, EntityLocomotiveElectric.class, null), LOCO_CREATIVE(3, EntityLocomotiveCreative.class, null), BORE(1, EntityTunnelBore.class, null), ENERGY_BATBOX(0, EntityCartEnergyBatBox.class, null), ENERGY_CESU(0, EntityCartEnergyCESU.class, null), ENERGY_MFE(0, EntityCartEnergyMFE.class, null), ENERGY_MFSU(1, EntityCartEnergyMFSU.class, null), HOPPER(0, EntityMinecartHopper.class, new ItemStack(Blocks.hopper)), TRACK_LAYER(1, EntityCartTrackLayer.class, null), TRACK_REMOVER(1, EntityCartTrackRemover.class, null), COMMAND_BLOCK(3, EntityCartCommand.class, null), REDSTONE_FLUX(0, EntityCartRF.class, null); public static final EnumCart[] VALUES = values(); private final Class<? extends EntityMinecart> type; private final byte id; private final byte rarity; private ItemStack contents; private ItemStack cartItem; EnumCart(int rarity, Class<? extends EntityMinecart> type, ItemStack contents) { int entityId = -1; try { entityId = (byte) EntityIDs.class.getField("CART_" + name()).getInt(null); } catch (Exception ex) { throw new RuntimeException(ex); } this.id = (byte) entityId; this.rarity = (byte) rarity; this.type = type; this.contents = contents; } @Override public byte getId() { return id; } @Override public String getTag() { return "railcraft.cart." + name().toLowerCase(Locale.ENGLISH).replace('_', '.'); } @Override public Class<? extends EntityMinecart> getCartClass() { return type; } public void setContents(ItemStack stack) { contents = stack.copy(); } @Override public ItemStack getContents() { switch (this) { case TANK: if (EnumMachineBeta.TANK_IRON_GAUGE.isAvaliable()) return EnumMachineBeta.TANK_IRON_GAUGE.getItem(); default: { if (contents == null) return null; return contents.copy(); } } } @Override public EntityMinecart makeCart(ItemStack stack, World world, double i, double j, double k) { try { Constructor<? extends EntityMinecart> con = type.getConstructor(World.class, double.class, double.class, double.class); EntityMinecart entity = con.newInstance(world, i, j, k); if (entity instanceof IRailcraftCart) ((IRailcraftCart) entity).initEntityFromItem(stack); return entity; } catch (Throwable ex) { Game.logThrowable("Failed to create cart entity!", ex); } return new EntityCartBasic(world, i, j, k); } /** * @return the cartItem */ @Override public ItemStack getCartItem() { if (cartItem == null) return null; return cartItem.copy(); } /** * @param cartItem the cartItem to set */ public void setCartItem(ItemStack cartItem) { this.cartItem = cartItem.copy(); } private ItemCart defineItem() { switch (this) { case BORE: return new ItemTunnelBore(); case LOCO_STEAM_SOLID: return new ItemLocomotive(this, LocomotiveRenderType.STEAM_SOLID, EnumColor.LIGHT_GRAY, EnumColor.GRAY); case LOCO_STEAM_MAGIC: return new ItemLocomotive(this, LocomotiveRenderType.STEAM_MAGIC, EnumColor.LIGHT_GRAY, EnumColor.GRAY); case LOCO_ELECTRIC: return new ItemLocomotive(this, LocomotiveRenderType.ELECTRIC, EnumColor.YELLOW, EnumColor.BLACK); case LOCO_CREATIVE: return new ItemLocomotive(this, LocomotiveRenderType.ELECTRIC, EnumColor.BLACK, EnumColor.MAGENTA); case ANCHOR: case ANCHOR_ADMIN: case ANCHOR_PERSONAL: return new ItemCartAnchor(this); default: return new ItemCart(this); } } @SuppressWarnings("unchecked") public void registerEntity() { if (id < 0) return; EntityRegistry.registerModEntity(type, MiscTools.cleanTag(getTag()), id, Railcraft.getMod(), 256, 3, true); // Legacy stuff EntityList.stringToClassMapping.put("Railcraft." + getTag(), type); if (this == LOCO_STEAM_SOLID) EntityList.stringToClassMapping.put("Railcraft.railcraft.cart.loco.steam", type); } public boolean setup() { String tag = getTag(); boolean cartEnabled = RailcraftConfig.isCartEnabled(tag); if (cartEnabled) { registerEntity(); ItemCart item = defineItem(); item.setUnlocalizedName(tag); item.setRarity(rarity); RailcraftRegistry.register(item); ItemStack stack = new ItemStack(item); setCartItem(stack); return true; } return false; } @Override public boolean isEnabled() { String tag = getTag(); return RailcraftConfig.isCartEnabled(tag); } public static ICartType fromClass(Class<? extends EntityMinecart> cls) { for (EnumCart cart : VALUES) { if (cls.equals(cart.type)) return cart; } return BASIC; } public static ICartType fromCart(EntityMinecart cart) { return fromClass(cart.getClass()); } public static ICartType getCartType(ItemStack cart) { if (cart == null) return null; if (cart.getItem() == Items.minecart) return EnumCart.BASIC; if (cart.getItem() == Items.chest_minecart) return EnumCart.CHEST; if (cart.getItem() == Items.tnt_minecart) return EnumCart.TNT; if (cart.getItem() == Items.furnace_minecart) return EnumCart.FURNACE; if (cart.getItem() == Items.hopper_minecart) return EnumCart.HOPPER; if (cart.getItem() instanceof ItemCart) return ((ItemCart) cart.getItem()).getCartType(); return null; } }