package net.minecraft.src;

import java.util.*;
import java.io.*;


public class mod_PCmachines extends BaseMod {
	/**
	 * Textures folder for this module, ending with slash.
	 */
	public static String imgDir = "/PowerCraft/machines/";
	
	/**
	 * List of unsmelted items (IDs as Strings)
	 */
	public static String[] optDoNotSmelt;

	/**
	 * Configuration file
	 */
	public static PCMP conf = new PCMP("/config/PC_MACHINES.properties",
			"PowerCraft machines plugin - setup file\nBlock IDs: 115-255\n\nOPT_roaster_doNotSmelt accepts IDs separated by comma\n");

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

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

	static {

		conf.put("machine_BlockHarvester", 221, PCMPType.BLOCK);
		conf.put("machine_BlockDispenser", 222, PCMPType.BLOCK);
		conf.put("machine_Roaster", 228, PCMPType.BLOCK);
		conf.put("machine_LaserGun", 230, PCMPType.BLOCK);
		conf.put("machine_XPBank", 231, PCMPType.BLOCK);
		conf.put("machine_LaserMirror", 234, PCMPType.BLOCK);
		conf.put("item_LaserMirrorPlacer", 19005, PCMPType.ITEM);
		conf.put("item_LaserPrismPlacer", 19006, PCMPType.ITEM);
		conf.put("OPT_roaster_doNotSmelt", "1", PCMPType.STRING);

		conf.apply();

		optDoNotSmelt = conf.getString("OPT_roaster_doNotSmelt").split(",");
	}

	public mod_PCmachines() {
	}

	// laser renderer is only for the inventory item
	public static int rendererLaser = 0;
	public static int rendererXPBank = 0;

	@Override
	public void load() {
		// preload
		ModLoader.getMinecraftInstance().renderEngine.getTexture(imgDir + "tiles.png");
		ModLoader.getMinecraftInstance().renderEngine.getTexture(imgDir + "mirror.png");
		ModLoader.getMinecraftInstance().renderEngine.getTexture(imgDir + "laser.png");

		rendererLaser = ModLoader.getUniqueBlockModelID(this, true);
		rendererXPBank = ModLoader.getUniqueBlockModelID(this, true);

		// these are for particle effects mostly
		harvester.blockIndexInTexture = 109;
		builder.blockIndexInTexture = 109;
		laser.blockIndexInTexture = 16;
		roaster.blockIndexInTexture = 62;
		optical.blockIndexInTexture = 64;
		xpbank.blockIndexInTexture = 37;

		ModLoader.registerTileEntity(net.minecraft.src.PCma_TileEntityBuilder.class, "FCBlockPlacer");
		ModLoader.registerTileEntity(net.minecraft.src.PCma_TileEntityRoaster.class, "FCRoaster");
		ModLoader.registerTileEntity(net.minecraft.src.PCma_TileEntityLaser.class, "PCLaser", new PCma_TileEntityLaserRenderer());
		ModLoader.registerTileEntity(net.minecraft.src.PCma_TileEntityXPBank.class, "PCXPBank");
		ModLoader.registerTileEntity(net.minecraft.src.PCma_TileEntityOptical.class, "PCLaserMirror", new PCma_TileEntityOpticalRenderer());

		ModLoader.registerBlock(harvester);
		ModLoader.registerBlock(builder);
		ModLoader.registerBlock(roaster);
		ModLoader.registerBlock(laser);
		ModLoader.registerBlock(xpbank);
		ModLoader.registerBlock(optical);

		ModLoader.addName(harvester, "Block Harvester");
		ModLoader.addName(builder, "Block Dispenser");
		ModLoader.addName(roaster, "Roaster");
		ModLoader.addName(laser, "Laser");
		ModLoader.addName(xpbank, "Experience Storage");
		ModLoader.addName(optical, "laseropticalblock");
		ModLoader.addName(mirrorPlacer, "Mirror");
		ModLoader.addName(prismPlacer, "Prism");

		prismPlacer.setIconIndex(ModLoader.addOverride("/gui/items.png", imgDir + "prismicon.png"));

		ModLoader.addRecipe(
				new ItemStack(builder, 1),
				new Object[] { "G", "D", Character.valueOf('G'), Item.ingotGold, Character.valueOf('D'), Block.dispenser });
		
		ModLoader.addRecipe(
				new ItemStack(harvester, 1),
				new Object[] { "P", "D", Character.valueOf('P'), Item.pickaxeSteel, Character.valueOf('D'), Block.dispenser });
		
		ModLoader.addRecipe(
				new ItemStack(roaster, 1),
				new Object[] { "III", "IFI", "III", Character.valueOf('I'), Item.ingotIron, Character.valueOf('F'), Item.flintAndSteel });
		
		ModLoader.addRecipe(
				new ItemStack(laser, 1),
				new Object[] { " WD", " S ", "SSS", Character.valueOf('S'), Block.stone, Character.valueOf('W'), new ItemStack(Block.planks,1,-1),
					Character.valueOf('D'), Item.diamond });
		
		ModLoader.addRecipe(
				new ItemStack(laser, 1),
				new Object[] { " WD", " S ", "SSS", Character.valueOf('S'), Block.cobblestone, Character.valueOf('W'), new ItemStack(Block.planks,1,-1),
					Character.valueOf('D'), Item.diamond });
		
		ModLoader.addRecipe(
				new ItemStack(xpbank, 1),
				new Object[] { "ODO", "OGO", "O O", Character.valueOf('O'), Block.obsidian, Character.valueOf('D'), Block.blockDiamond,
					Character.valueOf('G'), Item.ghastTear });
		
		ModLoader.addRecipe(
				new ItemStack(mirrorPlacer, 2),
				new Object[] { "GI", " I", Character.valueOf('G'), Block.thinGlass, Character.valueOf('I'), Item.ingotIron });
		
		/*ModLoader.addRecipe(
				new ItemStack(mirrorPlacer, 18),
				new Object[] { "GI", " I", Character.valueOf('G'), Block.glass, Character.valueOf('I'), Block.blockSteel });*/
		
		ModLoader.addRecipe(
				new ItemStack(prismPlacer, 1),
				new Object[] { "GG", "GG", Character.valueOf('G'), Block.glass });

		// TMI
		mod_PCcore.TMI_hideId(optical.blockID);
		
		
		PCma_CropHelper.ping();
	}

	// registering blocks and items

	/** block harvester machine */
	public static Block harvester = new PCma_BlockHarvester(conf.getInt("machine_BlockHarvester")).setHardness(0.7F).setResistance(10.0F)
			.setBlockName("PCmaHarvester").setStepSound(Block.soundStoneFootstep);

	/** block placing machine */
	public static Block builder = new PCma_BlockBuilder(conf.getInt("machine_BlockDispenser")).setHardness(0.7F).setResistance(10.0F)
			.setBlockName("PCmaDispenser").setStepSound(Block.soundStoneFootstep);

	/** instant furnace */
	public static Block roaster = new PCma_BlockRoaster(conf.getInt("machine_Roaster")).setHardness(0.7F).setResistance(10.0F)
			.setBlockName("PCmaRoaster").setStepSound(Block.soundStoneFootstep);

	/** laser device, tileentity subtypes */
	public static PCma_BlockLaser laser = (PCma_BlockLaser) (new PCma_BlockLaser(conf.getInt("machine_LaserGun"))).setHardness(0.7F)
			.setResistance(10.0F).setBlockName("PCmaLaserBlock").setStepSound(Block.soundStoneFootstep);

	/** mirror or prism, tileentity subtypes */
	public static Block optical = new PCma_BlockOptical(conf.getInt("machine_LaserMirror")).setHardness(1.0F).setResistance(4.0F)
			.setBlockName("PCmaLaserMirror").setStepSound(Block.soundStoneFootstep);

	/** XP storage block */
	public static PCma_BlockXPBank xpbank = (PCma_BlockXPBank) (new PCma_BlockXPBank(conf.getInt("machine_XPBank"))).setHardness(6.0F)
			.setResistance(100.0F).setBlockName("PCmaXPBank").setLightValue(0.5F).setStepSound(Block.soundStoneFootstep);

	/** item for placing mirrors */
	public static Item mirrorPlacer = new PCma_ItemMirrorPlacer(conf.getInt("item_LaserMirrorPlacer")).setIconCoord(10, 2).setItemName(
			"PCmaLaserMirrorPlacer");

	/** item fro placing prisms */
	public static Item prismPlacer = new PCma_ItemPrismPlacer(conf.getInt("item_LaserPrismPlacer")).setIconCoord(11, 6).setItemName(
			"PCmaLaserPrismPlacer");

	/**
	 * Dispense some items as thrown objects rather than EntityItem.
	 */
	@Override
	public boolean dispenseEntity(World world, double d, double d1, double d2, int i1, int j1, ItemStack itemstack) {
		if (itemstack.itemID == Item.bucketEmpty.shiftedIndex) {
			PCma_EntityThrownBucket entity = new PCma_EntityThrownBucket(world, d, d1, d2);
			entity.setThrowableHeading(i1, 0.1D, j1, 1.1F, 6F);
			world.spawnEntityInWorld(entity);
			world.playAuxSFX(1002, (int) Math.round(d), (int) Math.round(d1), (int) Math.round(d2), 0);
			return true;
		}

		if ((itemstack.getItem() instanceof ItemFood || itemstack.getItem() == Item.bone || itemstack.getItem() == Item.wheat || itemstack.getItem() == Item.seeds)
				&& itemstack.getItem() != Item.fishRaw) {
			PCma_EntityThrownFood entity = new PCma_EntityThrownFood(world, d, d1, d2, itemstack.getItem());
			entity.setThrowableHeading(i1, 0.1D, j1, 1.1F, 6F);
			world.spawnEntityInWorld(entity);
			world.playAuxSFX(1002, (int) Math.round(d), (int) Math.round(d1), (int) Math.round(d2), 0);
			return true;
		}

		return false;
	}

	@SuppressWarnings({ "unchecked", "rawtypes" })
	@Override
	public void addRenderer(Map map) {
		map.put(PCma_EntityThrownBucket.class, new PCma_RenderThrownItem());
		map.put(PCma_EntityThrownFood.class, new PCma_RenderThrownItem());
	}

	@Override
	public boolean renderWorldBlock(RenderBlocks renderblocks, IBlockAccess iblockaccess, int i, int j, int k, Block block, int renderType) {


		if (renderType == rendererXPBank) {

			boolean gf = RenderBlocks.cfgGrassFix;
			RenderBlocks.cfgGrassFix = false;
			
			// XP bank inner thingy
			xpbank.rendering = true;
			mod_PCcore.instance.renderWorldBlock(renderblocks, iblockaccess, i, j, k, block, mod_PCcore.swapTerrainRenderer);
			xpbank.rendering = false;
			block.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F);

			// obsidian body
			Block.obsidian.setBlockBounds(0.0F, 0.3F, 0.0F, 1.0F, 0.7F, 1.0F);
			renderblocks.renderStandardBlock(Block.obsidian, i, j, k);

			// legs
			Block.obsidian.setBlockBounds(0.0F, 0.0F, 0.0F, 0.15F, 0.3F, 0.15F);
			renderblocks.renderStandardBlock(Block.obsidian, i, j, k);
			Block.obsidian.setBlockBounds(0.85F, 0.0F, 0.0F, 1.0F, 0.3F, 0.15F);
			renderblocks.renderStandardBlock(Block.obsidian, i, j, k);
			Block.obsidian.setBlockBounds(0.0F, 0.0F, 0.85F, 0.15F, 0.3F, 1.0F);
			renderblocks.renderStandardBlock(Block.obsidian, i, j, k);
			Block.obsidian.setBlockBounds(0.85F, 0.0F, 0.85F, 1.0F, 0.3F, 1.0F);
			renderblocks.renderStandardBlock(Block.obsidian, i, j, k);

			// reset
			Block.obsidian.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F);
			
			RenderBlocks.cfgGrassFix = gf;

			return true;
		}

		return false;
	}

	@Override
	public void renderInvBlock(RenderBlocks renderblocks, Block block, int i, int rtype) {
		/**
		 * Laser is rendered like this in inventory, but block is rendered by SpecialTileEntityRnderer
		 */
		if (rtype == rendererLaser) {
			mod_PCcore.instance.renderInvBlock(renderblocks, block, i, mod_PCcore.swapTerrainRenderer);
			block.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F);

			// cobble body
			Block.cobblestone.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 0.2F, 1.0F);
			mod_PCcore.renderInvBox(renderblocks, Block.cobblestone, 0);
			Block.cobblestone.setBlockBounds(0.4F, 0.2F, 0.4F, 0.6F, 0.3F, 0.6F);
			mod_PCcore.renderInvBox(renderblocks, Block.cobblestone, 0);
			// reset
			Block.cobblestone.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F);

			return;
		}

		if (rtype == rendererXPBank) {
			mod_PCcore.instance.renderInvBlock(renderblocks, block, i, mod_PCcore.swapTerrainRenderer);
			block.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F);

			// obsidian body
			Block.obsidian.setBlockBounds(0.0F, 0.3F, 0.0F, 1.0F, 0.8F, 1.0F);
			mod_PCcore.renderInvBox(renderblocks, Block.obsidian, 0);

			// legs
			Block.obsidian.setBlockBounds(0.0F, 0.0F, 0.0F, 0.2F, 0.3F, 0.2F);
			mod_PCcore.renderInvBox(renderblocks, Block.obsidian, 0);
			Block.obsidian.setBlockBounds(0.8F, 0.0F, 0.0F, 1.0F, 0.3F, 0.2F);
			mod_PCcore.renderInvBox(renderblocks, Block.obsidian, 0);
			Block.obsidian.setBlockBounds(0.0F, 0.0F, 0.8F, 0.2F, 0.3F, 1.0F);
			mod_PCcore.renderInvBox(renderblocks, Block.obsidian, 0);
			Block.obsidian.setBlockBounds(0.8F, 0.0F, 0.8F, 1.0F, 0.3F, 1.0F);
			mod_PCcore.renderInvBox(renderblocks, Block.obsidian, 0);

			// reset
			Block.obsidian.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F);

			return;
		}
	}

}
