Posted September 19, 201411 yr I am trying to render transparent gas but the blocks are either not transparent or fully tansparent, not inbetween like I want As you can see here, the block is not transparent but the item has the half transparency in it. package aerosteam.gases; import java.util.Random; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import aerosteam.AeroSteam; import aerosteam.blocks.BlocksAS; import aerosteam.proxy.ClientProxy; import net.minecraft.block.Block; import net.minecraft.block.material.Material; import net.minecraft.client.renderer.texture.IIconRegister; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.Blocks; import net.minecraft.item.ItemStack; import net.minecraft.potion.Potion; import net.minecraft.potion.PotionEffect; import net.minecraft.util.AxisAlignedBB; import net.minecraft.util.DamageSource; import net.minecraft.util.IIcon; import net.minecraft.util.Vec3; import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; import net.minecraftforge.fluids.BlockFluidClassic; import net.minecraftforge.fluids.FluidStack; public class Gases extends Block { protected float density=100; protected float viscosity=1000; protected int tickRate=10; protected boolean stuck = false; protected boolean toxic = false; protected int toxLevel = 100; protected boolean lethal = false; protected boolean harm = false; protected boolean decay = true; protected boolean flammable = false; protected boolean burning = false; protected boolean source = false; protected boolean corrosive = false; protected String texture = "Gas"; protected int harmLevel = 1; protected int decayRate = 0; public Gases() { super(Material.iron); this.setCreativeTab(AeroSteam.aeroTab); System.out.println("gas added"); this.setTickRandomly(true); this.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F); } public Gases setDensity(float density) { this.density = density; if (this.density<0) this.density = 0; if (this.density>200) this.density = 200; return this; } public float getDensity() { return this.density; } public Gases setViscosity(float viscosity) { this.viscosity = viscosity; if (this.viscosity<100) this.viscosity = 100; if (this.viscosity>10000) this.viscosity = 10000; return this; } public Gases setTexture(String text) { this.texture = text; return this; } public float getViscosity() { return this.viscosity; } public Gases setToxicityLevel(int level) { this.toxLevel = level; if (this.toxLevel<1) this.toxLevel = 1; if (this.toxLevel>20) this.toxLevel = 20; return this; } public int getToxicLevel() { return this.toxLevel; } public Gases setHarmLevel(int level) { this.harmLevel = level; if (this.harmLevel<1) this.harmLevel = 1; if (this.harmLevel>20) this.harmLevel = 20; return this; } public int getHarmLevel() { return this.harmLevel; } public Gases setDecayRate(int rate) { this.decayRate = rate; if (this.decayRate<0) this.decayRate = 0; if (this.decayRate>10) this.decayRate = 10; return this; } public int getDecayRate() { return this.decayRate; } public Gases setToxic(boolean bool) { this.toxic = bool; return this; } public boolean getToxicity() { return this.toxic; } public Gases setDecay(boolean bool) { this.decay = bool; return this; } public boolean getDecay() { return this.decay; } public Gases setFlammable(boolean bool) { this.flammable = bool; return this; } public boolean getFlammable() { return this.flammable; } public Gases setLethal(boolean bool) { this.lethal = bool; return this; } public boolean getLethality() { return this.lethal; } public Gases setHarm(boolean bool) { this.harm = bool; return this; } public boolean getHarmfull() { return this.harm; } public Gases setBurn(boolean bool) { this.burning = bool; return this; } public boolean getBurn() { return this.burning; } @Override public boolean isFlammable(IBlockAccess world, int x, int y, int z, ForgeDirection face) { return true; } @Override public void onBlockAdded(World world, int x, int y, int z) { //world.setBlockMetadataWithNotify(x, y, z, RndInt(0,15), 2); world.scheduleBlockUpdate(x, y, z, this, (int) (this.viscosity/10)); } @Override public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase entityplayer,ItemStack itemstack){ world.setBlockMetadataWithNotify(x, y, z, 15, 2); world.scheduleBlockUpdate(x, y, z, this, (int) (this.viscosity/10)); } public int RndInt(int min, int max){ Random generator = new Random(); int rnd = generator.nextInt(max-min+1) + min; return rnd; } //will react hwen player is in the block public void onEntityCollidedWithBlock(World world, int x, int y, int z, Entity entity) { //System.out.println("collide"); if(this.harm){ entity.attackEntityFrom(DamageSource.generic, this.harmLevel); } if(this.toxic){ if (entity instanceof EntityPlayer){ EntityPlayer player = (EntityPlayer) entity; if (this.lethal){ player.addPotionEffect(new PotionEffect(Potion.wither.getId(),this.getToxicLevel())); }else{ player.addPotionEffect(new PotionEffect(Potion.poison.getId(),this.getToxicLevel())); } }else{ entity.attackEntityFrom(DamageSource.wither, this.toxLevel); } } } //Makes block pass through public AxisAlignedBB getCollisionBoundingBoxFromPool(World world, int i, int j, int k) { return null; } //makes block impossible to hit public boolean canCollideCheck(int meta, boolean fullHit) { return fullHit && meta == 0; } @Override public void onNeighborBlockChange(World world, int x, int y, int z, Block block) { System.out.println("neighbour changed" + block.tickRate(world)); world.scheduleBlockUpdate(x, y, z, this, (int) (this.viscosity/10)); //this.stuck=world.getBlock(x, y+1, z) != Blocks.air; //block.updateTick(world, x, y, z, world.rand); } @Override public void updateTick(World world, int x, int y, int z, Random random) { System.out.println("update tick"); if (canMove(world,x,y,z)){ ForgeDirection dir = rndMove(); if (dirFree(world,x,y,z,dir)){ int meta = world.getBlockMetadata(x, y, z); int newmeta=meta-boolToInt(this.decay); //this.stuck=true; if(y < 250){ Block target = world.getBlock(x+dir.offsetX, y+dir.offsetY, z+dir.offsetZ); if (target == this){ int tmeta = world.getBlockMetadata(x+dir.offsetX, y+dir.offsetY, z+dir.offsetZ); int smeta = world.getBlockMetadata(x, y, z); if (smeta>(15-tmeta)) smeta=15-tmeta; int addmeta=RndInt(0,smeta); if (addmeta!=smeta){ world.setBlockMetadataWithNotify(x+dir.offsetX, y+dir.offsetY, z+dir.offsetZ, tmeta+addmeta, 2); world.setBlockMetadataWithNotify(x, y, z, smeta-addmeta, 2); world.scheduleBlockUpdate(x, y, z, this, (int) (this.viscosity/10)); world.scheduleBlockUpdate(x+dir.offsetX, y+dir.offsetY, z+dir.offsetZ, this, (int) (this.viscosity/10)); }else{ world.setBlockMetadataWithNotify(x+dir.offsetX, y+dir.offsetY, z+dir.offsetZ, tmeta+smeta, 2); world.setBlock(x, y, z, Blocks.air); world.scheduleBlockUpdate(x+dir.offsetX, y+dir.offsetY, z+dir.offsetZ, this, (int) (this.viscosity/10)); } }else if (target==Blocks.air){ Block source = world.getBlock(x, y, z); if (meta>1){ int halfmeta=meta/2+meta%2; System.out.println("meta: " + meta); System.out.println("halfmeta: " + halfmeta); world.setBlock(x+dir.offsetX, y+dir.offsetY, z+dir.offsetZ, source, halfmeta, 2); world.setBlockMetadataWithNotify(x, y, z, halfmeta, 2); world.scheduleBlockUpdate(x, y, z, this, (int) (this.viscosity/10)); }else{ if (meta==1){ world.setBlock(x+dir.offsetX, y+dir.offsetY, z+dir.offsetZ, source, 0, 2); world.setBlock(x, y, z, Blocks.air); }else{ if (RndInt(1,10)<=this.decayRate){ world.setBlock(x, y, z, Blocks.air); }else{ world.setBlock(x+dir.offsetX, y+dir.offsetY, z+dir.offsetZ, source, 0, 2); world.setBlock(x, y, z, Blocks.air); } } } } world.scheduleBlockUpdate(x, y, z, this, (int) (this.viscosity/10)); }else{ world.setBlock(x, y, z, Blocks.air); } }else world.scheduleBlockUpdate(x, y, z, this, (int) (this.viscosity)); } } //Can the block move in any direction? private boolean canMove(World world, int x, int y, int z){ for (ForgeDirection dir: ForgeDirection.VALID_DIRECTIONS){ Block check = world.getBlock(x+dir.offsetX, y+dir.offsetY, z+dir.offsetZ); if (check == Blocks.air){ return true; }else if (check==this){ int meta = world.getBlockMetadata(x+dir.offsetX, y+dir.offsetY, z+dir.offsetZ); if (meta < 15) return true; } } return false; } //Is the direction free to move into somehow? private boolean dirFree(World world, int x, int y, int z, ForgeDirection dir){ Block block = world.getBlock(x+dir.offsetX, y+dir.offsetY, z+dir.offsetZ); if (block==Blocks.air){ return true; }else if(block==this){ int meta = world.getBlockMetadata(x+dir.offsetX, y+dir.offsetY, z+dir.offsetZ); if (meta < 15) return true; } return false; } private int boolToInt(boolean bool){ return bool?1:0; } //generate random direction based on density private ForgeDirection rndMove(){ int rnd = RndInt(0,100); int relDens = (int) (this.density-100); int rndUp = 84+relDens*16/100; int rndDown = 16+relDens*83/100; if (rnd>rndUp){ return ForgeDirection.UP; }else if (rnd < rndDown){ return ForgeDirection.DOWN; }else{ return ForgeDirection.getOrientation(RndInt(2,5)); } } //Rendering stuff @Override public boolean renderAsNormalBlock() { return false; } @Override public boolean isOpaqueCube() { return false; } @Override public int getRenderType() { return ClientProxy.gasRenderType; } @Override public boolean canRenderInPass(int pass) { //Set the static var in the client proxy ClientProxy.renderPass = pass; //the block can render in both passes, so return true always return true; } @Override public boolean shouldSideBeRendered(IBlockAccess world, int x, int y, int z, int side) { Block block = world.getBlock(x, y, z); return block == Blocks.air; } @Override public int getRenderBlockPass() { return 1; } @SideOnly(Side.CLIENT) public IIcon getIcon(int side, int metadata) { return this.blockIcon; } @SideOnly(Side.CLIENT) public void registerBlockIcons(IIconRegister icon) { this.blockIcon = icon.registerIcon(AeroSteam.MODID + ":" + this.texture); } private boolean isFlameSource(Block block){ if (block==BlocksAS.deviceTorch) return true; return false; } /* @Override public void velocityToAddToEntity(World world, int x, int y, int z, Entity entity, Vec3 vec) { if (densityDir > 0) return; Vec3 vec_flow = this.getFlowVector(world, x, y, z); vec.xCoord += vec_flow.xCoord * (quantaPerBlock * 4); vec.yCoord += vec_flow.yCoord * (quantaPerBlock * 4); vec.zCoord += vec_flow.zCoord * (quantaPerBlock * 4); }*/ } and block render code package aerosteam.gases; import aerosteam.proxy.ClientProxy; import cpw.mods.fml.client.registry.ISimpleBlockRenderingHandler; import net.minecraft.block.Block; import net.minecraft.client.renderer.RenderBlocks; import net.minecraft.client.renderer.Tessellator; import net.minecraft.init.Blocks; import net.minecraft.util.IIcon; import net.minecraft.world.IBlockAccess; import net.minecraftforge.common.util.ForgeDirection; import net.minecraftforge.fluids.BlockFluidBase; public class RenderBlockGases implements ISimpleBlockRenderingHandler{ public static RenderBlockGases instance = new RenderBlockGases(); @Override public boolean renderWorldBlock(IBlockAccess world, int x, int y, int z, Block block, int modelId, RenderBlocks renderer) { //System.out.println("Blockrender Reached"); if (!(block instanceof Gases)) { return false; } if(!shouldRender(world,x,y,z,block)){ return false; } Tessellator tessellator = Tessellator.instance; Gases gas = (Gases) block; int meta = world.getBlockMetadata(x, y, z)+1; float height = (meta / 16.0F); float density = gas.getDensity() ; float bottom = 0; float top = 1; if (density > 100F){ top = height; }else if (density < 100F){ bottom = 1-height; }else { //System.out.println("equal"); top=1-(1-height)/2; bottom=(1-height)/2; //System.out.println("top:"); //System.out.println("bottom:"); } top=1F; bottom=0F; block.setBlockBounds(0.0F, bottom, 0.0F, 1.0F, top, 1.0F); renderer.renderFaceYNeg(block, x, y, z, block.getIcon(0, 0)); renderer.renderStandardBlock(block, x, y, z); return true; } private boolean renderDir(IBlockAccess world,int x, int y, int z, Block block){ return !(block == world.getBlock(x, y, z)); } private boolean shouldRender(IBlockAccess world,int x, int y, int z, Block block){ for (ForgeDirection dir: ForgeDirection.VALID_DIRECTIONS){ Block check = world.getBlock(x+dir.offsetX, y+dir.offsetY, z+dir.offsetZ); int meta = world.getBlockMetadata(x+dir.offsetX, y+dir.offsetY, z+dir.offsetZ); if (check == Blocks.air || (check == block && meta < 15)) return true; } return false; } @Override public void renderInventoryBlock(Block block, int metadata, int modelId, RenderBlocks renderer) { // TODO Auto-generated method stub } @Override public boolean shouldRender3DInInventory(int modelId) { // TODO Auto-generated method stub return false; } @Override public int getRenderId() { return ClientProxy.gasRenderType; } } This is the code I have and public int getRenderBlockPass() { return 1; } I know this si supposed to be 1 if you want alpha, unless I am mistaken, where am I being an idiot?
September 19, 201411 yr Hi This link might help, although it sounds like you've got the basics already http://greyminecraftcoder.blogspot.com.au/2013/07/rendering-transparent-blocks.html Are you sure you need an IBSRH? If your block is just a cube, you can probably get the effect you want just by changing the block bounds based on the metadata, similar to how the vanilla water works. Anyway you should override both Block.getRenderBlockPass() and Block.canRenderInPass(pass) to make it render as alpha (i.e. canRenderInPass is true for pass == 1 only) . getRenderBlockPass is actually poorly named, it should better be getHighestRenderPass(). -TGG
September 19, 201411 yr Author I have locked there acctually care to define what "IBSRH" is? But both of those functions are overriden and canRenderInPass = true constantly and getRenderBlockPass = 1 aswell which is what confuses me
September 19, 201411 yr I have locked there acctually care to define what "IBSRH" is? But both of those functions are overriden and canRenderInPass = true constantly and getRenderBlockPass = 1 aswell which is what confuses me canRenderInPass(pass) should _not_ always return true -- you only want it to be able to render in pass 1 (not pass 0). Use this: @Override public boolean canRenderInPass(int pass) { return pass == 1; } I like to make mods, just like you. Here's one worth checking out
September 19, 201411 yr IBSRh is the ISimpleBlockRenderingHandler you are using. What about making your texture transparent (using paint.net you can set the transparency as you want)? Check out my blog! http://www.whov.altervista.org
September 19, 201411 yr Author IBSRh is the ISimpleBlockRenderingHandler you are using. What about making your texture transparent (using paint.net you can set the transparency as you want)? I have photoshop and it is transperent, but it doesn't show up as transparent. I have locked there acctually care to define what "IBSRH" is? But both of those functions are overriden and canRenderInPass = true constantly and getRenderBlockPass = 1 aswell which is what confuses me canRenderInPass(pass) should _not_ always return true -- you only want it to be able to render in pass 1 (not pass 0). Use this: @Override public boolean canRenderInPass(int pass) { return pass == 1; } This pisses me off, mostly that it was so simple =_= It worked, thank you!
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.