package net.minecraft.src;

import net.minecraft.client.Minecraft;

import java.io.*;


public class mod_PCtransport extends BaseMod {
	/**
	 * Textures folder for this module, ending with slash.
	 */
	public static String imgDir = "/PowerCraft/transport/";

	/**
	 * List of unsmelted items (IDs as Strings)
	 */
	public static PCMP conf = new PCMP("/config/PC_TRANSPORT.properties", "PowerCraft transport plugin - setup file\nBlock IDs: 115-255\n");

	@Override
	public String getPriorities() {
		return "after:mod_PCmachines";
	}

	@Override
	public String getVersion() {
		return mod_PCcore.VERSION;
	}

	static {
		// renaming of the config files.
		String oldName = "./config/FC_TRANSPORT.properties";
		String newName = "./config/PC_TRANSPORT.properties";
		if ((new File(oldName)).exists()) {
			File f = new File(oldName);
			f.renameTo(new File(newName));
		}

		conf.put("conveyor", 212, PCMPType.BLOCK);
		conf.put("conveyorEjector", 213, PCMPType.BLOCK);
		conf.put("conveyorDetector", 214, PCMPType.BLOCK);
		conf.put("conveyorFilter", 215, PCMPType.BLOCK);
		conf.put("conveyorBrake", 216, PCMPType.BLOCK);
		conf.put("machine_AutomaticWorkbench", 217, PCMPType.BLOCK);
		conf.put("conveyorRedirector", 218, PCMPType.BLOCK);
		conf.put("conveyorItemElevator", 219, PCMPType.BLOCK);
		conf.put("conveyorSpeedBelt", 220, PCMPType.BLOCK);
		conf.put("IronFrameBlock", 233, PCMPType.BLOCK);
		conf.put("Teleporter", 235, PCMPType.BLOCK);
		conf.put("OPT_separateWoodTypes", true, PCMPType.BOOL);

		conf.apply();
	}

	public mod_PCtransport() {
	}

	public static int ironFrameRenderer = 0;
	public static int teleporterRenderer = 0;

	@Override
	public void load() {

		ironFrameRenderer = ModLoader.getUniqueBlockModelID(this, true);
		teleporterRenderer = ModLoader.getUniqueBlockModelID(this, true);

		Minecraft mc = ModLoader.getMinecraftInstance();
		mc.renderEngine.getTexture(imgDir + "tiles.png");
		mc.renderEngine.getTexture(imgDir + "gui_act.png");
		mc.renderEngine.getTexture(imgDir + "gui_separator.png");

		conveyorBelt.blockIndexInTexture = 1;
		ejectionBelt.blockIndexInTexture = 1;
		detectionBelt.blockIndexInTexture = 1;
		separationBelt.blockIndexInTexture = 1;
		brakeBelt.blockIndexInTexture = 1;
		automaticWorkbench.blockIndexInTexture = 62;
		redirectionBelt.blockIndexInTexture = 1;
		itemElevator.blockIndexInTexture = 23;
		speedyBelt.blockIndexInTexture = 1;
		teleporter.blockIndexInTexture = 14;

		ModLoader.registerTileEntity(net.minecraft.src.PCtr_TileEntitySeparationBelt.class, "FCConveyorFilter");
		ModLoader.registerTileEntity(net.minecraft.src.PCtr_TileEntityAutomaticWorkbench.class, "FCConveyorACT");
		ModLoader.registerTileEntity(net.minecraft.src.PCtr_TileEntityTeleporter.class, "PCteleporter");

		ModLoader.registerBlock(conveyorBelt);
		ModLoader.registerBlock(ejectionBelt);
		ModLoader.registerBlock(detectionBelt);
		ModLoader.registerBlock(separationBelt);
		ModLoader.registerBlock(brakeBelt);
		ModLoader.registerBlock(automaticWorkbench);
		ModLoader.registerBlock(redirectionBelt);
		ModLoader.registerBlock(itemElevator);
		ModLoader.registerBlock(speedyBelt);
		ModLoader.registerBlock(ironFrame);
		ModLoader.registerBlock(teleporter);

		ModLoader.addName(conveyorBelt, "Conveyor Belt");
		ModLoader.addName(speedyBelt, "Speedy Conveyor Belt");
		ModLoader.addName(ejectionBelt, "Item Ejection Belt");
		ModLoader.addName(detectionBelt, "Item Detector Belt");
		ModLoader.addName(separationBelt, "Conveyor Item Separator");
		ModLoader.addName(brakeBelt, "Brake Conveyor");
		ModLoader.addName(automaticWorkbench, "Automatic Workbench");
		ModLoader.addName(redirectionBelt, "Item Redirection Belt");
		ModLoader.addName(ironFrame, "Iron Frame");
		ModLoader.addName(teleporter, "Teleporter");

		ModLoader.addLocalization("tile.PCconveyorItemElevator.up.name", "Item Elevator (up)");
		ModLoader.addLocalization("tile.PCconveyorItemElevator.down.name", "Item Descender (down)");

		Item.itemsList[itemElevator.blockID] = null;
		// replace with the builder item
		Item.itemsList[itemElevator.blockID] = new PCtr_ItemBlockElevator(itemElevator.blockID - 256).setItemName("PCconveyorItemElevator");

		ModLoader.addRecipe(
				new ItemStack(conveyorBelt, 16),
				new Object[] { "XXX", "YRY",
					Character.valueOf('X'), Item.leather, Character.valueOf('Y'), Item.ingotIron, Character.valueOf('R'), Item.redstone });
		
		ModLoader.addRecipe(
				new ItemStack(conveyorBelt, 4),
				new Object[] { "XXX", "YRY",
					Character.valueOf('X'), Item.paper, Character.valueOf('Y'), Item.ingotIron, Character.valueOf('R'), Item.redstone });
		
		ModLoader.addRecipe(
				new ItemStack(speedyBelt, 16),
				new Object[] { "XXX", "YRY",
					Character.valueOf('X'), Item.leather, Character.valueOf('Y'), Item.ingotGold, Character.valueOf('R'), Item.redstone });
		
		ModLoader.addRecipe(
				new ItemStack(speedyBelt, 4),
				new Object[] { "XXX", "YRY",
					Character.valueOf('X'), Item.paper, Character.valueOf('Y'), Item.ingotGold, Character.valueOf('R'), Item.redstone });

		ModLoader.addRecipe(
				new ItemStack(ejectionBelt, 1),
				new Object[] { "X", "Y", "Z",
					Character.valueOf('X'), Item.bow, Character.valueOf('Y'), conveyorBelt, Character.valueOf('Z'), Item.redstone });

		ModLoader.addRecipe(
				new ItemStack(detectionBelt, 1),
				new Object[] { "X", "Y", "Z",
					Character.valueOf('X'), Block.pressurePlatePlanks, Character.valueOf('Y'), conveyorBelt, Character.valueOf('Z'), Item.redstone });
		
		ModLoader.addRecipe(
				new ItemStack(detectionBelt, 1),
				new Object[] { "X", "Y", "Z",
					Character.valueOf('X'), Block.pressurePlateStone, Character.valueOf('Y'), conveyorBelt, Character.valueOf('Z'), Item.redstone });
		
		ModLoader.addRecipe(
				new ItemStack(separationBelt, 1),
				new Object[] { "X", "Y", "Z",
					Character.valueOf('X'), Item.diamond, Character.valueOf('Y'), conveyorBelt, Character.valueOf('Z'), Item.redstone });
		
		ModLoader.addRecipe(
				new ItemStack(brakeBelt, 1),
				new Object[] { "X", "Y", "Z",
					Character.valueOf('X'), Item.ingotIron, Character.valueOf('Y'), conveyorBelt, Character.valueOf('Z'), Item.redstone });
		
		ModLoader.addRecipe(
				new ItemStack(automaticWorkbench, 1),
				new Object[] { "X", "Y", "Z",
					Character.valueOf('X'), Item.diamond, Character.valueOf('Y'), Block.workbench, Character.valueOf('Z'), ejectionBelt });
		
		ModLoader.addRecipe(
				new ItemStack(redirectionBelt, 1),
				new Object[] { "X", "Y", Character.valueOf('X'), conveyorBelt, Character.valueOf('Y'), Item.redstone });
		
		ModLoader.addRecipe(
				new ItemStack(itemElevator, 6, 0),
				new Object[] { "XGX", "X X", "XGX", Character.valueOf('X'), conveyorBelt, Character.valueOf('G'), Item.ingotGold });
		
		ModLoader.addRecipe(
				new ItemStack(itemElevator, 6, 1),				
				new Object[] { "XGX", "XRX", "XGX",
					Character.valueOf('X'), conveyorBelt, Character.valueOf('G'), Item.ingotGold, Character.valueOf('R'), Item.redstone });
		
		
		
		ModLoader.addRecipe(
				new ItemStack(ironFrame, 16, 0),
				new Object[] { "XXX", "X X", "XXX", Character.valueOf('X'), Item.ingotIron });
		
		/*ModLoader.addRecipe(
				new ItemStack(ironFrame, 10, 0),
				new Object[] { "X X", " X ", "X X", Character.valueOf('X'), Item.ingotIron });*/
		
		ModLoader.addRecipe(
				new ItemStack(teleporter, 1, 0),
				new Object[] { " P ", "PVP", "SSS",
					Character.valueOf('V'), new ItemStack(Item.dyePowder, 1, 5), Character.valueOf('P'), mod_PCmachines.prismPlacer, 
					Character.valueOf('S'), Item.ingotIron });
	}

	// registering blocks

	public static Block conveyorBelt = new PCtr_BlockConveyor(conf.getInt("conveyor"), PCtr_EnumConv.belt).setHardness(0.22F).setResistance(5.0F)
			.setBlockName("PCconveyorBelt").setStepSound(Block.soundMetalFootstep);

	public static Block ejectionBelt = new PCtr_BlockConveyor(conf.getInt("conveyorEjector"), PCtr_EnumConv.ejector).setHardness(0.22F)
			.setResistance(5.0F).setBlockName("PCconveyorFurnace").setStepSound(Block.soundMetalFootstep);

	public static Block detectionBelt = new PCtr_BlockConveyor(conf.getInt("conveyorDetector"), PCtr_EnumConv.detector).setHardness(0.22F)
			.setResistance(5.0F).setBlockName("PCconveyorDetector").setStepSound(Block.soundMetalFootstep);

	public static Block separationBelt = new PCtr_BlockConveyorSeparator(conf.getInt("conveyorFilter")).setHardness(0.22F).setResistance(5.0F)
			.setBlockName("PCconveyorFilter").setStepSound(Block.soundMetalFootstep);

	public static Block brakeBelt = new PCtr_BlockConveyor(conf.getInt("conveyorBrake"), PCtr_EnumConv.brake).setHardness(0.22F).setResistance(5.0F)
			.setBlockName("PCconveyorBrake").setStepSound(Block.soundMetalFootstep);

	public static Block automaticWorkbench = new PCtr_BlockAutomaticWorkbench(conf.getInt("machine_AutomaticWorkbench")).setHardness(0.7F)
			.setResistance(10.0F).setBlockName("PCconveyorACT").setStepSound(Block.soundMetalFootstep);

	public static Block redirectionBelt = new PCtr_BlockConveyor(conf.getInt("conveyorRedirector"), PCtr_EnumConv.redirector).setHardness(0.22F)
			.setResistance(5.0F).setBlockName("PCconveyorRedirector").setStepSound(Block.soundMetalFootstep);

	public static Block itemElevator = new PCtr_BlockItemElevator(conf.getInt("conveyorItemElevator"), 23).setHardness(1.0F).setResistance(8.0F)
			.setBlockName("PCconveyorItemElevator").setStepSound(Block.soundMetalFootstep);

	public static Block speedyBelt = new PCtr_BlockConveyor(conf.getInt("conveyorSpeedBelt"), PCtr_EnumConv.speedy).setHardness(0.22F)
			.setResistance(5.0F).setBlockName("PCconveyorSpeedBelt").setStepSound(Block.soundMetalFootstep);

	public static Block ironFrame = new PCtr_BlockIronFrame(conf.getInt("IronFrameBlock"), 22, Material.iron).setHardness(2.0F).setResistance(5.0F)
			.setBlockName("PCironFrame").setStepSound(Block.soundMetalFootstep);

	public static Block teleporter = new PCtr_BlockTeleporter(conf.getInt("Teleporter"), 14, Material.portal).setHardness(1.0F).setResistance(5.0F)
			.setBlockName("PCteleporter").setLightValue(0.6F).setStepSound(Block.soundMetalFootstep);

	@Override
	public boolean renderWorldBlock(RenderBlocks renderblocks, IBlockAccess iblockaccess, int i, int j, int k, Block block, int renderType) {
		Tessellator tessellator = Tessellator.instance;
		RenderEngine renderengine = ModLoader.getMinecraftInstance().renderEngine;

		if (renderType == ironFrameRenderer) {
			block.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F);

			tessellator.draw();
			tessellator.startDrawingQuads();
			renderengine.bindTexture(renderengine.getTexture(((PCco_ISwapTerrain) block).getTerrainFile()));

			boolean ao = renderblocks.enableAO;
			renderblocks.enableAO = false;

			boolean gf = RenderBlocks.cfgGrassFix;
			RenderBlocks.cfgGrassFix = false;

			float s = 0.1875F;

			// pillars
			block.setBlockBounds(0, 0, 0, s, 1, s);
			renderblocks.renderStandardBlock(block, i, j, k);
			block.setBlockBounds(1 - s, 0, 0, 1, 1, s);
			renderblocks.renderStandardBlock(block, i, j, k);
			block.setBlockBounds(0, 0, 1 - s, s, 1, 1);
			renderblocks.renderStandardBlock(block, i, j, k);
			block.setBlockBounds(1 - s, 0, 1 - s, 1, 1, 1);
			renderblocks.renderStandardBlock(block, i, j, k);

			// x-sticks
			block.setBlockBounds(s, 0, 0, 1 - s, s, s);
			renderblocks.renderStandardBlock(block, i, j, k);
			block.setBlockBounds(s, 0, 1 - s, 1 - s, s, 1);
			renderblocks.renderStandardBlock(block, i, j, k);
			block.setBlockBounds(s, 1 - s, 0, 1 - s, 1, s);
			renderblocks.renderStandardBlock(block, i, j, k);
			block.setBlockBounds(s, 1 - s, 1 - s, 1 - s, 1, 1);
			renderblocks.renderStandardBlock(block, i, j, k);

			// z-sticks
			block.setBlockBounds(0, 0, s, s, s, 1 - s);
			renderblocks.renderStandardBlock(block, i, j, k);
			block.setBlockBounds(0, 1 - s, s, s, 1, 1 - s);
			renderblocks.renderStandardBlock(block, i, j, k);

			block.setBlockBounds(1 - s, 0, s, 1, s, 1 - s);
			renderblocks.renderStandardBlock(block, i, j, k);
			block.setBlockBounds(1 - s, 1 - s, s, 1, 1, 1 - s);
			renderblocks.renderStandardBlock(block, i, j, k);

			RenderBlocks.cfgGrassFix = gf;
			renderblocks.enableAO = ao;

			tessellator.draw();
			tessellator.startDrawingQuads();
			renderengine.bindTexture(renderengine.getTexture("/terrain.png"));

			block.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F);

			return true;

		} else if (renderType == teleporterRenderer) {

			tessellator.draw();

			tessellator.startDrawingQuads();

			boolean gf = RenderBlocks.cfgGrassFix;
			RenderBlocks.cfgGrassFix = false;

			if (PCtr_BlockTeleporter.isTarget(iblockaccess, i, j, k)) {
				Block.blockGold.setBlockBounds(0.125F, 0.0F, 0.125F, 0.875F, 0.125F, 0.875F);
				renderblocks.renderStandardBlock(Block.blockGold, i, j, k);
			} else {
				Block.blockSteel.setBlockBounds(0.125F, 0.0F, 0.125F, 0.875F, 0.125F, 0.875F);
				renderblocks.renderStandardBlock(Block.blockSteel, i, j, k);
			}

			Block.blockSteel.setBlockBounds(0.4375F, 0.125F, 0.4375F, 1F - 0.4375F, 0.25F, 1F - 0.4375F);
			renderblocks.renderStandardBlock(Block.blockSteel, i, j, k);

			float centr = 0.0625F * 4;
			Block.blockSteel.setBlockBounds(0.5F - centr, 0.5F - centr, 0.5F - centr, 0.5F + centr, 0.5F + centr, 0.5F + centr);
			renderblocks.renderStandardBlock(Block.blockSteel, i, j, k);

			Block.blockSteel.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F);
			Block.blockGold.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F);

			if (PCtr_BlockTeleporter.isActive(iblockaccess, i, j, k)) {
				block.setBlockBounds(0.1875F, 0.1875F, 0.1875F, 1.0F - 0.1875F, 1.0F - 0.1875F, 1.0F - 0.1875F);
				renderblocks.renderStandardBlock(block, i, j, k);
				block.setBlockBounds(0.125F, 0.0F, 0.125F, 1.0F - 0.125F, 1.0F - 0.125F, 1.0F - 0.125F);
			}

			RenderBlocks.cfgGrassFix = gf;

			tessellator.draw();

			tessellator.startDrawingQuads();

			return true;
		}

		return false;
	}

	@Override
	public void renderInvBlock(RenderBlocks renderblocks, Block block, int i, int rtype) {
		RenderEngine renderengine = ModLoader.getMinecraftInstance().renderEngine;

		if (rtype == ironFrameRenderer) {
			renderengine.bindTexture(renderengine.getTexture(((PCco_ISwapTerrain) block).getTerrainFile()));
			float s = 0.1875F;

			// pillars
			block.setBlockBounds(0, 0, 0, s, 1, s);
			mod_PCcore.renderInvBox(renderblocks, block, 0);
			block.setBlockBounds(1 - s, 0, 0, 1, 1, s);
			mod_PCcore.renderInvBox(renderblocks, block, 0);
			block.setBlockBounds(0, 0, 1 - s, s, 1, 1);
			mod_PCcore.renderInvBox(renderblocks, block, 0);
			block.setBlockBounds(1 - s, 0, 1 - s, 1, 1, 1);
			mod_PCcore.renderInvBox(renderblocks, block, 0);

			// x-sticks
			block.setBlockBounds(s, 0, 0, 1 - s, s, s);
			mod_PCcore.renderInvBox(renderblocks, block, 0);
			block.setBlockBounds(s, 0, 1 - s, 1 - s, s, 1);
			mod_PCcore.renderInvBox(renderblocks, block, 0);
			block.setBlockBounds(s, 1 - s, 0, 1 - s, 1, s);
			mod_PCcore.renderInvBox(renderblocks, block, 0);
			block.setBlockBounds(s, 1 - s, 1 - s, 1 - s, 1, 1);
			mod_PCcore.renderInvBox(renderblocks, block, 0);

			// z-sticks
			block.setBlockBounds(0, 0, s, s, s, 1 - s);
			mod_PCcore.renderInvBox(renderblocks, block, 0);
			block.setBlockBounds(0, 1 - s, s, s, 1, 1 - s);
			mod_PCcore.renderInvBox(renderblocks, block, 0);

			block.setBlockBounds(1 - s, 0, s, 1, s, 1 - s);
			mod_PCcore.renderInvBox(renderblocks, block, 0);
			block.setBlockBounds(1 - s, 1 - s, s, 1, 1, 1 - s);
			mod_PCcore.renderInvBox(renderblocks, block, 0);

			block.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F);

			return;
		} else if (rtype == teleporterRenderer) {

			Block.blockSteel.setBlockBounds(0.125F, 0.0F, 0.125F, 0.875F, 0.125F, 0.875F);
			mod_PCcore.renderInvBox(renderblocks, Block.blockSteel, 0);

			Block.blockSteel.setBlockBounds(0.4375F, 0.125F, 0.4375F, 1F - 0.4375F, 0.25F, 1F - 0.4375F);
			mod_PCcore.renderInvBox(renderblocks, Block.blockSteel, 0);

			float centr = 0.0625F * 4;
			Block.blockSteel.setBlockBounds(0.5F - centr, 0.5F - centr, 0.5F - centr, 0.5F + centr, 0.5F + centr, 0.5F + centr);
			mod_PCcore.renderInvBox(renderblocks, Block.blockSteel, 0);

			Block.blockSteel.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F);

			block.setBlockBounds(0.1875F, 0.0F, 0.1875F, 1.0F - 0.1875F, 1.0F - 0.1875F, 1.0F - 0.1875F);
			mod_PCcore.renderInvBox(renderblocks, block, 0);
			block.setBlockBounds(0.125F, 0.0F, 0.125F, 1.0F - 0.125F, 1.0F - 0.125F, 1.0F - 0.125F);

			return;
		}

	}

}
