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



  • Recently Browsing

    • No registered users viewing this page.
  • Posts

    • Reach Out To Rapid Digital: What sapp Info: +1 41 4 80 7 14 85 Email INFO: rap iddi gita lrecov ery @ exe cs. com Hello, my name is Jayson, and I’m 35 years old from the United Kingdom. My family and I recently endured an incredibly challenging experience that I wouldn’t wish on anyone. We became victims of a cryptocurrency investment fraud scheme that saw us lose a staggering $807,000 in USDT and Bitcoins. The fraudsters had created a convincing facade, and we were lured into investing, only to discover later that the platform was a complete scam. We were left devastated, not just financially, but emotionally, as we had trusted these people and believed in the legitimacy of the investment. After the initial shock wore off, we desperately searched for ways to recover the lost funds. It seemed like an impossible task, and we felt as though there was no hope. That’s when, by sheer luck, we stumbled across a post about Rapid Digital Recovery, a cryptocurrency and funds recovery organization with a proven track record in cybersecurity and fraud recovery. We decided to reach out to them, and from the first interaction, we were impressed with their professionalism and transparency. They explained the recovery process in detail and reassured us that they had the skills and expertise to track down the perpetrators and recover our funds. This gave us a renewed sense of hope, something we hadn’t felt in months. What truly stood out during our experience with Rapid Digital Recovery was their dedication to the recovery process. The team went above and beyond, using sophisticated tracking tools and cyber forensics to gather critical information. Within a matter of weeks, they had successfully located the funds and traced the scam back to the fraudsters responsible. They worked with the authorities to ensure the criminals were held accountable for their actions. To our relief, the team at Rapid Digital Recovery was able to recover every single penny we had lost. The funds were returned in full, and the sense of closure we felt was invaluable. We couldn’t have imagined such a positive outcome in the early stages of our recovery journey, and we are deeply grateful for the work they did. If you ever find yourself in a similar situation, I highly recommend contacting Rapid Digital Recovery. Their expertise, transparency, and dedication to their clients make them the go-to choice for anyone seeking to recover lost cryptocurrency or funds. They truly gave us back our financial future.  
    • This is my first time modding anything, so maybe just skill issue. I'm using Forge 54.0.12 and Temurin 21.0.5+11-LTS I wanted to create a custom keybind and to check whether it works I'd like to send a chat message. I tried using Minecraft.getInstance().player.sendSystemMessage(Component.literal("test")); but IntelliJ couldnt resolve sendSystemMessage(...). Since I saw people using it in earlier versions, I tried the same thing with 1.20.6(- 50.1.0), where it works fine, now I can't figure out if this is intentional and whether there are other options for sending chat messages. On that note, is there more documentation than https://docs.minecraftforge.net/en/1.21.x/? It seems very incomplete compared to something like the Oracle Java docs
    • Hi, i'm having this error and I wanna fix it. we try: -Reload drivers -Eliminate .minecraft -Eliminate Java -Restart launcher -Verify if minecraft is using gpu -Mods  in .minecraft is empty -Install the latest and recomended version of forge idk what i have to do, help me pls. the lastest log is: https://mclo.gs/WAMao8x  
    • Read the FAQ, Rule #2. (https://forums.minecraftforge.net/topic/125488-rules-and-frequently-asked-questions-faq/)  
  • Topics

×
×
  • Create New...

Important Information

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