package net.minecraft.src;

import org.lwjgl.opengl.GL11;

public class mod_PCwireless extends PC_Module {

	/**
	 * Get images directory (ending with slash)
	 * 
	 * @return the directory
	 */
	public static String getImgDir() {
		return "/PowerCraft/wireless/";
	}

	/**
	 * Get terrain file path (png)
	 * 
	 * @return the file path
	 */
	public static String getTerrainFile() {
		return getImgDir() + "tiles.png";
	}

	@Override
	public String getModuleName() {
		return "WIRELESS";
	}


	// *** PROPERTIES ***

	private static final String pk_tx = "id.block.transmitter";
	private static final String pk_rx = "id.block.receiver";
	private static final String pk_sensor = "id.block.sensor";
	private static final String pk_remote = "id.item.portable_transmitter";

	/** Configuration file */
	public static PC_PropertyManager conf;
	static {
		conf = new PC_PropertyManager("/config/PowerCraft/module_wireless.cfg", "PowerCraft WIRELESS module\nconfiguration file");

		conf.putBlock(pk_tx, 153);
		conf.putBlock(pk_rx, 154);
		conf.putBlock(pk_sensor, 229);
		conf.putItem(pk_remote, 19000);

		conf.apply();
	}



	// *** MODULE INIT ***



	@Override
	public void preInit() {}

	@Override
	public void registerEntities() {}

	@Override
	public void registerTileEntities() {
		ModLoader.registerTileEntity(net.minecraft.src.PCwi_TileEntitySensor.class, "FCSensorRanged");
	}

	@Override
	public void registerBlockRenderers() {
		rendererRadio = ModLoader.getUniqueBlockModelID(this, true);
		rendererSensor = ModLoader.getUniqueBlockModelID(this, true);
	}

	@Override
	public void registerBlocks() {
		ModLoader.registerBlock(sensor);
		ModLoader.registerBlock(radioTx);
		ModLoader.registerBlock(radioRx);

		Item.itemsList[sensor.blockID] = null;
		Item.itemsList[sensor.blockID] = new PCwi_ItemBlockSensor(sensor.blockID - 256, sensor).setItemName("PCwiSensorRanged");
	}

	@Override
	public void registerTextures() {
		portableTx.setIconIndex(ModLoader.addOverride("/gui/items.png", getImgDir() + "portable.png"));
	}

	@Override
	public void preloadTextures() {
		mc.renderEngine.getTexture(getImgDir() + "tiles.png");
		mc.renderEngine.getTexture(getImgDir() + "radiogui.png");
	}

	@Override
	public void addNames() {
		ModLoader.addName(radioTx, "Redstone Radio Transmitter");
		ModLoader.addName(radioRx, "Redstone Radio Receiver");
		ModLoader.addName(portableTx, "Radio Remote");
		ModLoader.addName(sensor, "Motion Detector");
		ModLoader.addLocalization("tile.PCwiSensorRanged.item.name", "Item Motion Detector");
		ModLoader.addLocalization("tile.PCwiSensorRanged.living.name", "Mob Motion Detector");
		ModLoader.addLocalization("tile.PCwiSensorRanged.player.name", "Player Motion Detector");
	}

	@Override
	public void addRecipes() {
		//@formatter:off
		
		ModLoader.addRecipe(
				new ItemStack(radioTx),
				new Object[] { " I ", "RIR", "SSS",
					Character.valueOf('I'), Item.ingotGold, Character.valueOf('R'), Item.redstone, Character.valueOf('S'), Block.stone });

		ModLoader.addRecipe(
				new ItemStack(radioRx),
				new Object[] { " I ", "RIR", "SSS",
					Character.valueOf('I'), Item.ingotIron, Character.valueOf('R'), Item.redstone, Character.valueOf('S'), Block.stone });

		ModLoader.addRecipe(
				new ItemStack(portableTx),
				new Object[] { "T", "B",
					Character.valueOf('B'), Block.button, Character.valueOf('T'), radioTx });

		ModLoader.addRecipe(
				new ItemStack(sensor, 1, 1),
				new Object[] { "R", "I", "S",
					Character.valueOf('I'), Item.ingotIron, Character.valueOf('R'), Item.redstone, Character.valueOf('S'), Block.stone });


		ModLoader.addRecipe(
				new ItemStack(sensor, 1, 0),
				new Object[] { "R", "I", "W",
					Character.valueOf('I'), Item.ingotIron, Character.valueOf('R'), Item.redstone, Character.valueOf('W'), Block.planks });

		ModLoader.addRecipe(
				new ItemStack(sensor, 1, 2),
				new Object[] { "R", "I", "O",
					Character.valueOf('I'), Item.ingotIron, Character.valueOf('R'), Item.redstone, Character.valueOf('O'), Block.obsidian });
		
		//@formatter:on
	}

	@Override
	public void postInit() {
		PC_Utils.TMI_rangeDamage(sensor.blockID, 0, 2);
	}


	public static int rendererRadio = 0;
	public static int rendererSensor = 0;

	//@formatter:off
	
	/** Radio transmitter block */
	public static Block radioTx = new PCwi_BlockRadioDevice(conf.getInteger(pk_tx), 0, 16, 0)
			.setBlockName("PCwiRadioTx")
			.setHardness(0.2F);

	/** Radio receiver block */
	public static Block radioRx = new PCwi_BlockRadioDevice(conf.getInteger(pk_rx), 1, 17, 1)
			.setBlockName("PCwiRadioRx")
			.setHardness(0.2F);

	/** Entity sensor block (metadata subtypes) */
	public static PCwi_BlockSensor sensor = (PCwi_BlockSensor) (new PCwi_BlockSensor(conf.getInteger(pk_sensor))
			.setBlockName("PCwiSensorRanged")
			.setHardness(0.2F));

	/** Portable transmitter */
	public static Item portableTx = (new PCwi_ItemRadioPortableTx(conf.getInteger(pk_remote))).setMaxStackSize(1)
			.setItemName("PCwiRadioPortableTx");
	
	//@formatter:on



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

			tessellator.draw();
			tessellator.startDrawingQuads();

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

			renderengine.bindTexture(renderengine.getTexture(getTerrainFile()));

			float f = block.getBlockBrightness(iblockaccess, i, j, k);
			tessellator.setColorOpaque_F(f, f, f);

			boolean active = ((PCwi_TileEntitySensor) renderblocks.blockAccess.getBlockTileEntity(i, j, k)).active;
			int meta = renderblocks.blockAccess.getBlockMetadata(i, j, k);

			sensor.txswap = false;
			sensor.setShapeAndTextureForRenderer(1, active, meta);
			renderblocks.renderStandardBlock(sensor, i, j, k);
			sensor.setShapeAndTextureForRenderer(2, active, meta);
			renderblocks.renderStandardBlock(sensor, i, j, k);
			sensor.setShapeAndTextureForRenderer(0, active, meta);
			renderblocks.renderStandardBlock(sensor, i, j, k);
			sensor.txswap = true;

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

			RenderBlocks.cfgGrassFix = gf;

			tessellator.draw();

			tessellator.startDrawingQuads();

			renderengine.bindTexture(renderengine.getTexture("/terrain.png"));
			return true;
		}

		if (renderType == rendererRadio) {
			Tessellator tessellator = Tessellator.instance;

			tessellator.draw();
			tessellator.startDrawingQuads();

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

			renderengine.bindTexture(renderengine.getTexture(getImgDir() + "tiles.png"));

			float f = block.getBlockBrightness(iblockaccess, i, j, k);
			tessellator.setColorOpaque_F(f, f, f);

			int meta = renderblocks.blockAccess.getBlockMetadata(i, j, k);

			renderblocks.renderStandardBlock(block, i, j, k);

			RenderBlocks.cfgGrassFix = gf;

			tessellator.draw();

			tessellator.startDrawingQuads();
			renderAntenna(block, meta, i, j, k);
			tessellator.draw();
			tessellator.startDrawingQuads();

			renderengine.bindTexture(renderengine.getTexture("/terrain.png"));
			return true;
		}
		return false;
	}

	public void renderAntenna(Block block, int i, double d, double d1, double d2) {
		Tessellator tessellator = Tessellator.instance;
		// crossed squares
		int j = ((PCwi_BlockRadioDevice) block).getAntennaTexture(i);

		int k = (j & 0xf) << 4;
		int l = j & 0xf0;
		double d3 = k / 256F;
		double d4 = (k + 15.99F) / 256F;
		double d5 = l / 256F;
		double d6 = (l + 15.99F) / 256F;
		double d7 = (d + 0.5D) - 0.45000000000000001D;
		double d8 = d + 0.5D + 0.45000000000000001D;
		double d9 = (d2 + 0.5D) - 0.45000000000000001D;
		double d10 = d2 + 0.5D + 0.45000000000000001D;
		tessellator.addVertexWithUV(d7, d1 + 1.0D, d9, d3, d5);
		tessellator.addVertexWithUV(d7, d1 + 0.0D, d9, d3, d6);
		tessellator.addVertexWithUV(d8, d1 + 0.0D, d10, d4, d6);
		tessellator.addVertexWithUV(d8, d1 + 1.0D, d10, d4, d5);
		tessellator.addVertexWithUV(d8, d1 + 1.0D, d10, d3, d5);
		tessellator.addVertexWithUV(d8, d1 + 0.0D, d10, d3, d6);
		tessellator.addVertexWithUV(d7, d1 + 0.0D, d9, d4, d6);
		tessellator.addVertexWithUV(d7, d1 + 1.0D, d9, d4, d5);
		tessellator.addVertexWithUV(d7, d1 + 1.0D, d10, d3, d5);
		tessellator.addVertexWithUV(d7, d1 + 0.0D, d10, d3, d6);
		tessellator.addVertexWithUV(d8, d1 + 0.0D, d9, d4, d6);
		tessellator.addVertexWithUV(d8, d1 + 1.0D, d9, d4, d5);
		tessellator.addVertexWithUV(d8, d1 + 1.0D, d9, d3, d5);
		tessellator.addVertexWithUV(d8, d1 + 0.0D, d9, d3, d6);
		tessellator.addVertexWithUV(d7, d1 + 0.0D, d10, d4, d6);
		tessellator.addVertexWithUV(d7, d1 + 1.0D, d10, d4, d5);
	}

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

		if (rtype == rendererRadio) {
			renderengine.bindTexture(renderengine.getTexture(getImgDir() + "tiles.png"));

			block.setBlockBoundsForItemRender();
			GL11.glTranslatef(-0.5F, -0.5F, -0.5F);
			tessellator.startDrawingQuads();
			tessellator.setNormal(0.0F, -1F, 0.0F);
			renderblocks.renderBottomFace(block, 0.0D, 0.0D, 0.0D, 6);
			tessellator.draw();
			tessellator.startDrawingQuads();
			tessellator.setNormal(0.0F, 1.0F, 0.0F);
			renderblocks.renderTopFace(block, 0.0D, 0.0D, 0.0D, 6);
			tessellator.draw();
			tessellator.startDrawingQuads();
			tessellator.setNormal(0.0F, 0.0F, -1F);
			renderblocks.renderEastFace(block, 0.0D, 0.0D, 0.0D, 18);
			tessellator.draw();
			tessellator.startDrawingQuads();
			tessellator.setNormal(0.0F, 0.0F, 1.0F);
			renderblocks.renderWestFace(block, 0.0D, 0.0D, 0.0D, 18);
			tessellator.draw();
			tessellator.startDrawingQuads();
			tessellator.setNormal(-1F, 0.0F, 0.0F);
			renderblocks.renderNorthFace(block, 0.0D, 0.0D, 0.0D, 18);
			tessellator.draw();
			tessellator.startDrawingQuads();
			tessellator.setNormal(1.0F, 0.0F, 0.0F);
			renderblocks.renderSouthFace(block, 0.0D, 0.0D, 0.0D, 18);
			tessellator.draw();
			GL11.glTranslatef(0.5F, 0.5F, 0.5F);

			tessellator.startDrawingQuads();
			tessellator.setNormal(0.0F, -1F, 0.0F);
			renderAntenna(block, 1, -0.5D, -0.5D, -0.5D);
			tessellator.draw();

			renderengine.bindTexture(renderengine.getTexture("/terrain.png"));

			return;
		}

		if (rtype == rendererSensor) {
			renderengine.bindTexture(renderengine.getTexture(getImgDir() + "tiles.png"));

			sensor.txswap = false;
			sensor.setShapeAndTextureForRenderer(1, true, i);
			PC_Renderer.renderInvBox(renderblocks, sensor, i);
			sensor.setShapeAndTextureForRenderer(2, true, i);
			PC_Renderer.renderInvBox(renderblocks, sensor, i);
			sensor.setShapeAndTextureForRenderer(0, true, i);
			PC_Renderer.renderInvBox(renderblocks, sensor, i);
			sensor.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F);
			sensor.txswap = true;

			renderengine.bindTexture(renderengine.getTexture("/terrain.png"));

			return;
		}
	}
}
