Posted August 12, 201312 yr 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()]; }
August 12, 201312 yr 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 ! ) 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.
August 12, 201312 yr Author 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.
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.