ref: 2c305a89aceb99de504672b0b1dce29d47d09aa2
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;
}
}