Jump to content

Drowning Issue


bradleyshrader

Recommended Posts

So, recently I have been trying to create a fluid. I have tracked down many of the bugs, after some serious searching I might add, and I have eliminated nearly all of them. There are only two more things that I have noticed: one bug, and one is just more of a complaint. The complaint is that the screen overlay is blue, and my liquid is yellow. Is there a way to change the overlay (fairly) easily?

 

Now on to the bug: When swimming in my fluid, each time the player's head reaches another block, it refreshes the Oxygen meter, so it's impossible to drown in the fluid.

 

Side Note: I also noticed that

FluidRegistry.getFluid("LINSEED_OIL") == null?
always returns true in the code below. What's happening there? Threading issue?

 

Info on the fluid:

 

Most of this is copied from Build Craft's GitHub. Since the block class is verbatim at the moment, I'll just provide the github link: https://github.com/BuildCraft/BuildCraft/blob/master/common/buildcraft/energy/BlockBuildcraftFluid.java

 

Fluid f = new Fluid("LINSEED_OIL").setDensity(800).setViscosity(1500);
FluidRegistry.registerFluid(f);
linseedOil = FluidRegistry.getFluid("LINSEED_OIL") == null? f:FluidRegistry.getFluid("LINSEED_OIL");

if(linseedOil.getBlockID() == -1){
if(linseedOilID > 0){
	linseedOilBlock = new LinseedOilBlock(linseedOilID, linseedOil, Material.water).setUnlocalizedName("linseedOilBlock");
}
} else {
linseedOilBlock = Block.blocksList[linseedOil.getBlockID()];
}

Link to comment
Share on other sites

Fluid f = new Fluid("LINSEED_OIL").setDensity(800).setViscosity(1500);
FluidRegistry.registerFluid(f);
linseedOil = FluidRegistry.getFluid("LINSEED_OIL") == null? f:FluidRegistry.getFluid("LINSEED_OIL");

I am not much into fluids, so I might not be of great help.

What are trying to do with the last line ? isn't the f instance enough ?

 

The screen overlay color comes from your block material I think. Each block material has its own MapColor instance.

In BlockFluid, I know of two methods dealing with rendering color:

    public int getBlockColor()

    public int colorMultiplier(IBlockAccess par1IBlockAccess, int par2, int par3, int par4)

 

Drowning is calculated in EntityLivingBase, here are the lines:

boolean flag = this instanceof EntityPlayer && ((EntityPlayer)this).capabilities.disableDamage;
if (this.isEntityAlive() && this.isInsideOfMaterial(Material.water))
        {
            if (!this.canBreatheUnderwater() && !this.isPotionActive(Potion.waterBreathing.id) && !flag)
            {
                this.setAir(this.decreaseAirSupply(this.getAir()));

                if (this.getAir() == -20)
                {
                    this.setAir(0);

                    for (int i = 0; i < 8; ++i)
                    {
                        float f = this.rand.nextFloat() - this.rand.nextFloat();
                        float f1 = this.rand.nextFloat() - this.rand.nextFloat();
                        float f2 = this.rand.nextFloat() - this.rand.nextFloat();
                        this.worldObj.spawnParticle("bubble", this.posX + (double)f, this.posY + (double)f1, this.posZ + (double)f2, this.motionX, this.motionY, this.motionZ);
                    }

                    this.attackEntityFrom(DamageSource.drown, 2.0F);

It is worth noting that your block material should be water. (no drowning in lava ! :P)

Your fluid height is calculated with

/**
     * Returns the percentage of the fluid block that is air, based on the given flow decay of the fluid.
     */
    public static float getFluidHeightPercent(int par0)
    {
        if (par0 >= 
        {
            par0 = 0;
        }

        return (float)(par0 + 1) / 9.0F;
    }

in BlockFluid.

Link to comment
Share on other sites

I'll see what I can find out about the fluid height. Also, the Fluid f is a local variable stored only within the load method. I made the call to FluidRegistry to check if the fluid was being properly registered (and because BuildCraft does it), then I save the registered fluid into a static global field.

 

Also, worth noting is that forge fluids do not extend any vanilla classes (other than block of course)

 

Edit: also, the player DOES drown when they're inside the fluid, and it IS set to water. The problem is that it has an "air pocket" between each block that lets the player breathe for a second every time their head reaches a new block.

Link to comment
Share on other sites

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.



×
×
  • Create New...

Important Information

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