WebCraft icon indicating copy to clipboard operation
WebCraft copied to clipboard

Fluid Elements

Open andrewgrider opened this issue 6 years ago • 1 comments

You can't walk through fluid elements, you just stand on them, and they expand till they cover the map or till they hit another block alt text

andrewgrider avatar Apr 07 '18 13:04 andrewgrider

I have made adjustments to this recently when I started working on this again. I realize this is an old issue but i thought I would share.

I have added a stepping system into fluids to track increments and prevent flooding. You can adjust the maxStep variable to how many steps/size increases you want to allow water to spread.

in physics.js replace fluids section with this:

	// Fluids
	if ( step % 5 == 0 )
	{
		// Newly spawned fluid blocks are stored so that those aren't
		// updated in the same step, creating a simulation avalanche.
		var newFluidBlocks = {};
		var maxStep = 5;
		for ( var x = 0; x < world.sx; x++ ) {
			for ( var y = 0; y < world.sy; y++ ) {
				for ( var z = 0; z < world.sz; z++ ) {
					var material = blocks[x][y][z];
	
					if ( material.fluid && newFluidBlocks[x+","+y+","+z] == null && material.step < maxStep)
					{
						console.log('spread step: '+material.step);
						if ( x > 0 && blocks[x-1][y][z] == BLOCK.AIR ) {
							world.setBlock( x - 1, y, z, material );
							newFluidBlocks[(x-1)+","+y+","+z] = true;
						}
						if ( x < world.sx - 1 && blocks[x+1][y][z] == BLOCK.AIR ) {
							world.setBlock( x + 1, y, z, material );
							newFluidBlocks[(x+1)+","+y+","+z] = true;
						}
						if ( y > 0 && blocks[x][y-1][z] == BLOCK.AIR ) {
							world.setBlock( x, y - 1, z, material );
							newFluidBlocks[x+","+(y-1)+","+z] = true;
						}
						if ( y < world.sy - 1 && blocks[x][y+1][z] == BLOCK.AIR ) {
							world.setBlock( x, y + 1, z, material );
							newFluidBlocks[x+","+(y+1)+","+z] = true;
						}

						material.step++;
					}
				}
			}
		} 
	}

In block.js update BLOCK.WATER, BLOCK.LAVA, or any other liquids you might have so they have a step option:

// Water
BLOCK.WATER = {
	id: 19,
	strike: 1,
	spawnable: true,
	breakable: false,
	transparent: true,
	selflit: false,
	gravity: true,
	fluid: true,
	step: 1,
	fire: false,
	texture: function( world, lightmap, lit, x, y, z, dir ) {
              return [ 13/16, 12/16, 14/16, 13/16 ];
        },
	
	icon: "water.png"
};

p3rlphr33k avatar Apr 07 '22 14:04 p3rlphr33k