Jump to content

Recommended Posts

Posted

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?

Posted

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

 

 

Posted

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

Posted

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

Posted

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.

Guest
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Announcements



×
×
  • Create New...

Important Information

By using this site, you agree to our Terms of Use.