tsughub: btw-gloryholes

ref: 2c305a89aceb99de504672b0b1dce29d47d09aa2

View raw version
package btw.community.tsughoggr.gloryholes;

import java.util.Random;
import net.minecraft.src.Block;
import net.minecraft.src.World;
import net.minecraft.src.IBlockAccess;
import net.minecraft.src.ItemStack;
import net.minecraft.src.Item;
import net.minecraft.src.EntityLiving;
import net.minecraft.src.EntityPlayer;
import net.minecraft.src.Vec3;
import net.minecraft.src.MovingObjectPosition;
import net.minecraft.src.Material;
import net.minecraft.src.MathHelper;
import net.minecraft.src.EntityLivingBase;

import btw.BTWMod;
import btw.item.BTWItems;
import btw.block.BTWBlocks;

import btw.block.MechanicalBlock;
import btw.block.util.MechPowerUtils;
import btw.item.util.ItemUtils;
import btw.block.model.BlockModel;

/*CLIENT ONLY*/
import net.minecraft.src.Icon;
import net.minecraft.src.IconRegister;
import net.minecraft.src.RenderBlocks;

public class TSGBlockGloryhole extends Block implements MechanicalBlock{

	private Icon sideicon;
	private Icon topicon;
	private Icon sandicon;
	private Icon glassicon;
	private Icon axleicon;
	private Icon bottomicon;

	private static final int sandcookdelay = 40;
	private static final int mechcookdelay = 40;
	private static final int firecookdelay = 1200;

	public
	TSGBlockGloryhole(int id){
		super(id, Material.rock);
		setHardness(2F);
		setResistance(10F);
		setTickRandomly(true);
	}

	public boolean
	renderAsNormalBlock() {
		return false;
	}
	public boolean
	isOpaqueCube(){
		return false;
	}
	public boolean
	hasLargeCenterHardPointToFacing(IBlockAccess ba, int i, int j, int k, int face, boolean bt){
		return true;
	}
	public void
	onBlockPlacedBy(World world, int x, int y, int z, EntityLiving player, ItemStack item){
		int cfac = MathHelper.floor_double((double)(player.rotationYaw * 4.0F / 360F) + 0.5D) &3;
		int face;
		switch(cfac){
			case 0:
				face = 0;
				break;
			case 1:
				face = 3;
				break;
			case 2:
				face = 1;
				break;
			default:
				face = 2;
				break;
		}
		world.setBlockMetadataWithNotify(x,y,z,face);
	}
	public boolean
	canInputMechanicalPower(){
		return true;
	}
	public boolean
	isInputtingMechanicalPower(World world, int x, int y, int z){
		return MechPowerUtils.isBlockPoweredByAxle(world, x, y, z, this);
	}
	public boolean
	canInputAxlePowerToFacing(World world, int x, int y, int z, int face){
		int md = world.getBlockMetadata(x,y,z) & 3;
		switch(face){
			case 0:
			case 1: return false;
			case 2: return md == 1;
			case 3: return md == 0;
			case 4: return md == 3;
			case 5: return md == 2;
			default: return false;
		}
			
	}
	public void
	updateTick(World world, int i, int j, int k, Random rn){
		int md = world.getBlockMetadata(i,j,k);
		int state = md >> 2;
		switch(state){
			case 0:
			case 1:
				if(world.getBlockId(i, j+1, k) == Block.sand.blockID){
					world.setBlockMetadataWithNotify(i,j,k, (md & 3) | ((state<<2) | 8));
					world.setBlockToAir(i,j+1,k);
				} break;
			case 2:
				if(world.getBlockId(i, j-1,k) == Block.fire.blockID || world.getBlockId(i, j-1, k) == BTWBlocks.stokedFire.blockID){
					world.setBlockMetadataWithNotify(i,j,k,(md & 3) | 4 );
				} break;
			default:
				if(isInputtingMechanicalPower(world,i,j,k) && (state & 1) == 1 && (world.getBlockId(i, j-1,k) == Block.fire.blockID || world.getBlockId(i, j-1, k) == BTWBlocks.stokedFire.blockID || world.getBlockId(i,j-1,k) == 0)){
					world.setBlockMetadataWithNotify(i,j,k, (md&3) | ((state & 2)<<2));
					world.setBlock(i,j-1,k, Block.glass.blockID);
				} break;				
		}
		
		int retstate = world.getBlockMetadata(i,j,k) >> 2;
		world.scheduleBlockUpdate(i,j,k,blockID, scheduleUpdateBasedOnState(retstate) * ((world.getBlockId(i,j-1,k) == BTWBlocks.stokedFire.blockID)?1:2));
	}
	private int
	scheduleUpdateBasedOnState(int state){
		switch (state){
			case 0: return sandcookdelay;
			case 2: return firecookdelay;
			default: return mechcookdelay;
		}
	}
	public void
	RandomUpdateTick(World world, int i, int j,int k, Random rn){
		if(!world.isUpdateScheduledForBlock(i,j,k,blockID)){
			int md = world.getBlockMetadata(i,j,k);
			int state = md >> 2;
			world.scheduleBlockUpdate(i,j,k, blockID, scheduleUpdateBasedOnState(state));
		}
	}
	public void
	overpower(World world, int x, int y, int z){
		ItemUtils.ejectStackWithRandomOffset(world, x, y, z, new ItemStack(Item.brick, 5));
		ItemUtils.ejectStackWithRandomOffset(world, x, y, z, new ItemStack(Block.fenceIron));
		world.setBlockToAir(x,y,z);
	}
	public boolean
	isOutputtingMechanicalPower(World world, int x, int y, int z){
		return false;
	}
	public boolean
	canOutputMechanicalPower(){
		return false;
	}
	public boolean
	onBlockActivated(World world, int x, int y, int z, EntityLivingBase player, int face, float cx, float cy, float cz){
		int md = world.getBlockMetadata(x,y,z);
		if( (md&4) != 4 || player == null || player.getHeldItem() == null || player.getHeldItem().itemID != TSGGloryhole.ghItemBlowpipe.itemID || cy > .5F){
			return false;
		}
		else if (world.isRemote){ 
			return true;
		}
		player.getHeldItem().itemID = TSGGloryhole.ghItemBlowpipeWorkable.itemID;
		world.setBlockMetadataWithNotify(x,y,z, md & ~4);
		return true;
	}

	/* render Code */
	public void
	registerIcons(IconRegister var1){
		sideicon = var1.registerIcon("btw:loose_brick");
		topicon = var1.registerIcon("anvil");
		sandicon = var1.registerIcon("sand");
		axleicon = var1.registerIcon("planks_oak");
		glassicon = var1.registerIcon("ice");
		bottomicon = var1.registerIcon("btw:dragon_vessel_top");
	}
	public Icon
	getIcon(int sid, int md){
		switch(sid){
			case 0: return bottomicon;
			case 1: return topicon;
			default: return sideicon;
		}
	}
	public boolean
	renderBlock(RenderBlocks rb, int x, int y, int z){
		BlockModel models[] = new BlockModel[6];
		int md = rb.blockAccess.getBlockMetadata(x,y,z); /*1 sand, 1 glass, 11 rotate*/
		int face = (md&3) + 2;
		models[0] = new BlockModel();
		models[1] = new BlockModel();
		models[2] = new BlockModel();
		models[3] = new BlockModel();
		models[4] = new BlockModel();
		models[5] = new BlockModel();
		models[0].addBox(0D, 0D, 0D, 1D, 0.01D, 1D); /*Flat Vessel Texture as bottom*/

		models[1].addBox(0D, 0.01D, 0D, 0.2D, 1D, .2D);
		models[1].addBox(0D, 0.01D, 0.2D, 0.2D, 1D, 0.8D);
		models[1].addBox(0D, 0.01D, 0.8D, 0.2D, 1D, 1D);
		models[1].addBox(0.2D, 0.01D, 0.8D, 0.8D, 1D, 1D);
		models[1].addBox(0.8D, 0.01D, 0.8D, 1D, 1D, 1D);
		models[1].addBox(0.8D, 0.01D, 0D, 1D, 1D, 0.2D);
		models[1].addBox(0.8D, 0.01D, 0.2D, 1D, 1D, 0.8D);
		models[1].addBox(0.2D, 0.01D, 0D, 0.8D, 0.2D, 0.2D);
		models[1].addBox(0.2D, 0.8D, 0D, 0.8D, 1D, 0.2D); /* Main block cube*/

		models[2].addBox(0.2D, 0.8D, 0.2D, 0.8D, 1D, 0.3D);
		models[2].addBox(0.2D, 0.8D, 0.3D, 0.3D, 1D, 0.8D);
		models[2].addBox(0.7D, 0.8D, 0.3D, 0.8D, 1D, 0.8D);
		models[2].addBox(0.3D, 0.8D, 0.7D, 0.7D, 1D, 0.8D);
		models[2].addBox(0.3D, 0.7D, 0.3D, 0.7D, 0.8D, 0.4D);
		models[2].addBox(0.3D, 0.7D, 0.4D, 0.4D, 0.8D, 0.7D);
		models[2].addBox(0.6D, 0.7D, 0.3D, 0.7D, 0.8D, 0.7D);
		models[2].addBox(0.3D, 0.7D, 0.6D, 0.6D, 0.8D, 0.7D);
		models[2].addBox(0.2D, 0.48D, 0.2D, 0.8D, 0.52D, 0.8D); /*Hopper and shelf*/
		models[3].addBox(0.2D, 0.52D, 0.2D, 0.2D + (double)(0.6D * ((md & 0x8) >> 3)), 0.7D, 0.2D + (double)(0.6D * ((md & 0x8) >> 3))); /*Sand*/
		models[4].addBox(0.2D, 0.2D, 0.2D, 0.2D + (double)(0.6D * ((md & 0x4) >> 2)), 0.44D, 0.2D + (double)(0.6D * ((md & 0x4) >> 2))); /*Glass*/
		models[5].addBox(0.5D - 0.12D, 0.5D - 0.12D, 1D, 0.5D + 0.12D, 0.5D + 0.12D, 1.05D); /*Axle on back*/
		for(int i=0;i<6;++i){
			models[i].rotateAroundYToFacing(face);
		}

		models[0].renderAsBlockWithTexture(rb, this ,x,y,z, bottomicon);
		models[1].renderAsBlockWithTexture(rb,this,x,y,z,sideicon);
		models[2].renderAsBlockWithTexture(rb,this,x,y,z,topicon);
		models[3].renderAsBlockWithTexture(rb,this,x,y,z,sandicon);
		models[4].renderAsBlockWithTexture(rb,this,x,y,z,glassicon);
		models[5].renderAsBlockWithTexture(rb,this,x,y,z,axleicon);
		return true;
	}
	public void
	renderBlockAsItem(RenderBlocks rb, int md, float cd){

		BlockModel models[] = new BlockModel[4];
		models[0] = new BlockModel();
		models[1] = new BlockModel();
		models[2] = new BlockModel();
		models[3] = new BlockModel();

		models[0].addBox(0D, 0D, 0D, 1D, 0.01D, 1D); /*Flat Vessel Texture as bottom*/
		models[1].addBox(0D, 0.01D, 0D, 0.2D, 1D, 1D);
		models[1].addBox(0.2D, 0.01D, 0.8D, 1D, 1D, 1D);
		models[1].addBox(0.8D, 0.01D, 0D, 1D, 1D, 0.8D);
		models[1].addBox(0.2D, 0.01D, 0D, 0.8D, 0.2D, 0.2D);
		models[1].addBox(0.2D, 0.8D, 0D, 0.8D, 1D, 0.2D); /* Main block cube*/
		models[2].addBox(0.2D, 0.8D, 0.2D, 0.8D, 1D, 0.3D);
		models[2].addBox(0.2D, 0.8D, 0.3D, 0.3D, 1D, 0.8D);
		models[2].addBox(0.7D, 0.8D, 0.3D, 0.8D, 1D, 0.8D);
		models[2].addBox(0.3D, 0.8D, 0.7D, 0.7D, 1D, 0.8D);
		models[2].addBox(0.3D, 0.7D, 0.3D, 0.7D, 0.8D, 0.4D);
		models[2].addBox(0.3D, 0.7D, 0.4D, 0.4D, 0.8D, 0.7D);
		models[2].addBox(0.6D, 0.7D, 0.3D, 0.7D, 0.8D, 0.7D);
		models[2].addBox(0.3D, 0.7D, 0.6D, 0.6D, 0.8D, 0.7D);
		models[2].addBox(0.2D, 0.48D, 0.2D, 0.8D, 0.52D, 0.8D); /*Hopper and shelf*/
		models[3].addBox(0.5D - 0.125D, 0.5D - 0.125D, 1D, 0.5D + 0.125D, 0.5D + 0.125D, 1.01D); /*Axle on back*/


		models[0].renderAsItemBlock(rb, this ,md);
		models[1].renderAsItemBlock(rb,this,md );
		models[2].renderAsItemBlock(rb,this,md );
		models[3].renderAsItemBlock(rb,this,md );	
	}
	public MovingObjectPosition
	collisionRayTrace( World world, int i, int j, int k, Vec3 startRay, Vec3 endRay ){

		BlockModel model;
		int md = world.getBlockMetadata(i,j,k); /*1 sand, 1 glass, 11 rotate*/
		int face = (md&3) + 2;

		model = new BlockModel();
		model.addBox(0D, 0D, 0D, 1D, 0.01D, 1D); /*Flat Vessel Texture as bottom*/
		model.addBox(0D, 0.01D, 0D, 0.2D, 1D, 1D);
		model.addBox(0.2D, 0.01D, 0.8D, 1D, 1D, 1D);
		model.addBox(0.8D, 0.01D, 0D, 1D, 1D, 0.8D);
		model.addBox(0.2D, 0.01D, 0D, 0.8D, 0.2D, 0.2D);
		model.addBox(0.2D, 0.8D, 0D, 0.8D, 1D, 0.2D); /* Main block cube*/
		model.addBox(0.2D, 0.8D, 0.2D, 0.8D, 1D, 0.3D);
		model.addBox(0.2D, 0.8D, 0.3D, 0.3D, 1D, 0.8D);
		model.addBox(0.7D, 0.8D, 0.3D, 0.8D, 1D, 0.8D);
		model.addBox(0.3D, 0.8D, 0.7D, 0.7D, 1D, 0.8D);
		model.addBox(0.3D, 0.7D, 0.3D, 0.7D, 0.8D, 0.4D);
		model.addBox(0.3D, 0.7D, 0.4D, 0.4D, 0.8D, 0.7D);
		model.addBox(0.6D, 0.7D, 0.3D, 0.7D, 0.8D, 0.7D);
		model.addBox(0.3D, 0.7D, 0.6D, 0.6D, 0.8D, 0.7D);
		model.addBox(0.2D, 0.48D, 0.2D, 0.8D, 0.52D, 0.8D); /*Hopper and shelf*/
		model.addBox(0.2D, 0.52D, 0.2D, 0.2D + (double)(0.8D * ((md & 0x8) >> 3)), 0.7D, 0.2D + (double)(0.8D * ((md & 0x8) >> 3))); /*Sand*/
		model.addBox(0.2D, 0.2D, 0.2D, 0.2D + (double)(0.8D * ((md & 0x4) >> 2)), 0.44D, 0.2D + (double)(0.8D * ((md & 0x4) >> 2))); /*Glass*/
		model.addBox(0.5D - 0.125D, 0.5D - 0.125D, 1D, 0.5D + 0.125D, 0.5D + 0.125D, 1.01D); /*Axle on back*/


		model.rotateAroundYToFacing(face);
		return model.collisionRayTrace(world,i,j,k, startRay, endRay);
	
	}
	@Override
	public boolean
	shouldSideBeRendered(IBlockAccess ba, int x, int y, int z, int side){
		return true;
	}
}