static void DoWaterUniformFlow(Level lvl, ref Check C) { Random rand = lvl.physRandom; lvl.liquids.Remove(C.b); ushort x, y, z; lvl.IntToPos(C.b, out x, out y, out z); if (!lvl.CheckSpongeWater(x, y, z)) { byte block = lvl.blocks[C.b]; if (y < lvl.Height - 1) { CheckFallingBlocks(lvl, C.b + lvl.Width * lvl.Length); } LiquidPhysics.PhysWater(lvl, (ushort)(x + 1), y, z, block); LiquidPhysics.PhysWater(lvl, (ushort)(x - 1), y, z, block); LiquidPhysics.PhysWater(lvl, x, y, (ushort)(z + 1), block); LiquidPhysics.PhysWater(lvl, x, y, (ushort)(z - 1), block); LiquidPhysics.PhysWater(lvl, x, (ushort)(y - 1), z, block); } else //was placed near sponge { lvl.AddUpdate(C.b, Block.air); } if (!C.data.HasWait) { C.data.Data = PhysicsArgs.RemoveFromChecks; } }
static void DoWaterUniformFlow(Level lvl, ref PhysInfo C) { ushort x = C.X, y = C.Y, z = C.Z; if (!lvl.CheckSpongeWater(x, y, z)) { BlockID block = C.Block; if (y < lvl.Height - 1) { CheckFallingBlocks(lvl, C.Index + lvl.Width * lvl.Length); } LiquidPhysics.PhysWater(lvl, (ushort)(x + 1), y, z, block); LiquidPhysics.PhysWater(lvl, (ushort)(x - 1), y, z, block); LiquidPhysics.PhysWater(lvl, x, y, (ushort)(z + 1), block); LiquidPhysics.PhysWater(lvl, x, y, (ushort)(z - 1), block); LiquidPhysics.PhysWater(lvl, x, (ushort)(y - 1), z, block); } else //was placed near sponge { lvl.AddUpdate(C.Index, Block.Air, default(PhysicsArgs)); } if (!C.Data.HasWait) { C.Data.Data = PhysicsArgs.RemoveFromChecks; } }
public static void DoWaterfall(Level lvl, ref PhysInfo C) { ushort x = C.X, y = C.Y, z = C.Z; int index; BlockID below = lvl.GetBlock(x, (ushort)(y - 1), z, out index); switch (below) { case Block.Air: lvl.AddUpdate(index, Block.WaterDown, default(PhysicsArgs)); if (!C.Data.HasWait) { C.Data.Data = PhysicsArgs.RemoveFromChecks; } break; case Block.Air_FloodDown: case Block.StillLava: case Block.StillWater: case Block.WaterDown: break; default: BlockID block = C.Block; LiquidPhysics.PhysWater(lvl, (ushort)(x + 1), y, z, block); LiquidPhysics.PhysWater(lvl, (ushort)(x - 1), y, z, block); LiquidPhysics.PhysWater(lvl, x, y, (ushort)(z + 1), block); LiquidPhysics.PhysWater(lvl, x, y, (ushort)(z - 1), block); if (!C.Data.HasWait) { C.Data.Data = PhysicsArgs.RemoveFromChecks; } break; } }
public static void DoGeyser(Level lvl, ref Check C) { C.data.Data++; ushort x, y, z; lvl.IntToPos(C.b, out x, out y, out z); byte below = lvl.GetTile(x, (ushort)(y - 1), z); if (below == Block.air) { lvl.AddUpdate(lvl.PosToInt(x, (ushort)(y - 1), z), Block.geyser); } else if (below != Block.geyser) { byte block = lvl.blocks[C.b]; LiquidPhysics.PhysWater(lvl, (ushort)(x + 1), y, z, block); LiquidPhysics.PhysWater(lvl, (ushort)(x - 1), y, z, block); LiquidPhysics.PhysWater(lvl, x, y, (ushort)(z + 1), block); LiquidPhysics.PhysWater(lvl, x, y, (ushort)(z - 1), block); } if (lvl.physics <= 1 || C.data.Data <= 10) { return; } C.data.Data = 0; bool flowUp = false; GeyserFlow(lvl, x - 1, y, z, ref flowUp); GeyserFlow(lvl, x + 1, y, z, ref flowUp); GeyserFlow(lvl, x, y - 1, z, ref flowUp); GeyserFlow(lvl, x, y, z - 1, ref flowUp); GeyserFlow(lvl, x, y, z + 1, ref flowUp); if (flowUp) { GeyserFlow(lvl, x, y + 1, z, ref flowUp); } }
public static void DoGeyser(Level lvl, ref PhysInfo C) { C.Data.Data++; ushort x = C.X, y = C.Y, z = C.Z; int index; BlockID below = lvl.GetBlock(x, (ushort)(y - 1), z, out index); if (below == Block.Air) { lvl.AddUpdate(index, Block.Geyser, default(PhysicsArgs)); } else if (below != Block.Geyser) { BlockID block = C.Block; LiquidPhysics.PhysWater(lvl, (ushort)(x + 1), y, z, block); LiquidPhysics.PhysWater(lvl, (ushort)(x - 1), y, z, block); LiquidPhysics.PhysWater(lvl, x, y, (ushort)(z + 1), block); LiquidPhysics.PhysWater(lvl, x, y, (ushort)(z - 1), block); } if (lvl.physics <= 1 || C.Data.Data <= 10) { return; } C.Data.Data = 0; bool flowUp = false; GeyserFlow(lvl, x - 1, y, z, ref flowUp); GeyserFlow(lvl, x + 1, y, z, ref flowUp); GeyserFlow(lvl, x, y - 1, z, ref flowUp); GeyserFlow(lvl, x, y, z - 1, ref flowUp); GeyserFlow(lvl, x, y, z + 1, ref flowUp); if (flowUp) { GeyserFlow(lvl, x, y + 1, z, ref flowUp); } }
public static void DoWaterfall(Level lvl, ref Check C) { Random rand = lvl.physRandom; ushort x, y, z; lvl.IntToPos(C.b, out x, out y, out z); byte below = lvl.GetTile(x, (ushort)(y - 1), z); switch (below) { case Block.air: lvl.AddUpdate(lvl.PosToInt(x, (ushort)(y - 1), z), Block.WaterDown); if (!C.data.HasWait) { C.data.Data = PhysicsArgs.RemoveFromChecks; } break; case Block.air_flood_down: case Block.lavastill: case Block.waterstill: case Block.WaterDown: break; default: byte block = lvl.blocks[C.b]; LiquidPhysics.PhysWater(lvl, (ushort)(x + 1), y, z, block); LiquidPhysics.PhysWater(lvl, (ushort)(x - 1), y, z, block); LiquidPhysics.PhysWater(lvl, x, y, (ushort)(z + 1), block); LiquidPhysics.PhysWater(lvl, x, y, (ushort)(z - 1), block); if (!C.data.HasWait) { C.data.Data = PhysicsArgs.RemoveFromChecks; } break; } }
static void DoWaterRandowFlow(Level lvl, ref Check C) { Random rand = lvl.physRandom; bool[] blocked = null; ushort x, y, z; lvl.IntToPos(C.b, out x, out y, out z); if (!lvl.CheckSpongeWater(x, y, z)) { if (!lvl.liquids.TryGetValue(C.b, out blocked)) { blocked = new bool[5]; lvl.liquids.Add(C.b, blocked); } byte block = lvl.blocks[C.b]; if (y < lvl.Height - 1) { CheckFallingBlocks(lvl, C.b + lvl.Width * lvl.Length); } if (!blocked[0] && rand.Next(4) == 0) { LiquidPhysics.PhysWater(lvl, (ushort)(x + 1), y, z, block); blocked[0] = true; } if (!blocked[1] && rand.Next(4) == 0) { LiquidPhysics.PhysWater(lvl, (ushort)(x - 1), y, z, block); blocked[1] = true; } if (!blocked[2] && rand.Next(4) == 0) { LiquidPhysics.PhysWater(lvl, x, y, (ushort)(z + 1), block); blocked[2] = true; } if (!blocked[3] && rand.Next(4) == 0) { LiquidPhysics.PhysWater(lvl, x, y, (ushort)(z - 1), block); blocked[3] = true; } if (!blocked[4] && rand.Next(4) == 0) { LiquidPhysics.PhysWater(lvl, x, (ushort)(y - 1), z, block); blocked[4] = true; } if (!blocked[0] && WaterBlocked(lvl, (ushort)(x + 1), y, z)) { blocked[0] = true; } if (!blocked[1] && WaterBlocked(lvl, (ushort)(x - 1), y, z)) { blocked[1] = true; } if (!blocked[2] && WaterBlocked(lvl, x, y, (ushort)(z + 1))) { blocked[2] = true; } if (!blocked[3] && WaterBlocked(lvl, x, y, (ushort)(z - 1))) { blocked[3] = true; } if (!blocked[4] && WaterBlocked(lvl, x, (ushort)(y - 1), z)) { blocked[4] = true; } } else //was placed near sponge { lvl.liquids.TryGetValue(C.b, out blocked); lvl.AddUpdate(C.b, Block.air); if (!C.data.HasWait) { C.data.Data = PhysicsArgs.RemoveFromChecks; } } if (!C.data.HasWait && blocked != null) { if (blocked[0] && blocked[1] && blocked[2] && blocked[3] && blocked[4]) { lvl.liquids.Remove(C.b); C.data.Data = PhysicsArgs.RemoveFromChecks; } } }
static void DoWaterRandowFlow(Level lvl, ref PhysInfo C) { Random rand = lvl.physRandom; ushort x = C.X, y = C.Y, z = C.Z; if (!lvl.CheckSpongeWater(x, y, z)) { byte data = C.Data.Data; BlockID block = C.Block; if (y < lvl.Height - 1) { CheckFallingBlocks(lvl, C.Index + lvl.Width * lvl.Length); } if ((data & flowed_xMax) == 0 && rand.Next(4) == 0) { LiquidPhysics.PhysWater(lvl, (ushort)(x + 1), y, z, block); data |= flowed_xMax; } if ((data & flowed_xMin) == 0 && rand.Next(4) == 0) { LiquidPhysics.PhysWater(lvl, (ushort)(x - 1), y, z, block); data |= flowed_xMin; } if ((data & flowed_zMax) == 0 && rand.Next(4) == 0) { LiquidPhysics.PhysWater(lvl, x, y, (ushort)(z + 1), block); data |= flowed_zMax; } if ((data & flowed_zMin) == 0 && rand.Next(4) == 0) { LiquidPhysics.PhysWater(lvl, x, y, (ushort)(z - 1), block); data |= flowed_zMin; } if ((data & flowed_yMin) == 0 && rand.Next(4) == 0) { LiquidPhysics.PhysWater(lvl, x, (ushort)(y - 1), z, block); data |= flowed_yMin; } if ((data & flowed_xMax) == 0 && WaterBlocked(lvl, (ushort)(x + 1), y, z)) { data |= flowed_xMax; } if ((data & flowed_xMin) == 0 && WaterBlocked(lvl, (ushort)(x - 1), y, z)) { data |= flowed_xMin; } if ((data & flowed_zMax) == 0 && WaterBlocked(lvl, x, y, (ushort)(z + 1))) { data |= flowed_zMax; } if ((data & flowed_zMin) == 0 && WaterBlocked(lvl, x, y, (ushort)(z - 1))) { data |= flowed_zMin; } if ((data & flowed_yMin) == 0 && WaterBlocked(lvl, x, (ushort)(y - 1), z)) { data |= flowed_yMin; } // Have we spread now (or been blocked from spreading) in all directions? C.Data.Data = data; if (!C.Data.HasWait && (data & 0x1F) == 0x1F) { C.Data.Data = PhysicsArgs.RemoveFromChecks; } } else //was placed near sponge { lvl.AddUpdate(C.Index, Block.Air, default(PhysicsArgs)); if (!C.Data.HasWait) { C.Data.Data = PhysicsArgs.RemoveFromChecks; } } }
static void DoWaterRandowFlow(Level lvl, ref Check C) { Random rand = lvl.physRandom; ushort x, y, z; lvl.IntToPos(C.b, out x, out y, out z); if (!lvl.CheckSpongeWater(x, y, z)) { byte data = C.data.Data; byte block = lvl.blocks[C.b]; if (y < lvl.Height - 1) { CheckFallingBlocks(lvl, C.b + lvl.Width * lvl.Length); } if ((data & flowed_xMax) == 0 && rand.Next(4) == 0) { LiquidPhysics.PhysWater(lvl, (ushort)(x + 1), y, z, block); data |= flowed_xMax; } if ((data & flowed_xMin) == 0 && rand.Next(4) == 0) { LiquidPhysics.PhysWater(lvl, (ushort)(x - 1), y, z, block); data |= flowed_xMin; } if ((data & flowed_zMax) == 0 && rand.Next(4) == 0) { LiquidPhysics.PhysWater(lvl, x, y, (ushort)(z + 1), block); data |= flowed_zMax; } if ((data & flowed_zMin) == 0 && rand.Next(4) == 0) { LiquidPhysics.PhysWater(lvl, x, y, (ushort)(z - 1), block); data |= flowed_zMin; } if ((data & flowed_yMin) == 0 && rand.Next(4) == 0) { LiquidPhysics.PhysWater(lvl, x, (ushort)(y - 1), z, block); data |= flowed_yMin; } if ((data & flowed_xMax) == 0 && WaterBlocked(lvl, (ushort)(x + 1), y, z)) { data |= flowed_xMax; } if ((data & flowed_xMin) == 0 && WaterBlocked(lvl, (ushort)(x - 1), y, z)) { data |= flowed_xMin; } if ((data & flowed_zMax) == 0 && WaterBlocked(lvl, x, y, (ushort)(z + 1))) { data |= flowed_zMax; } if ((data & flowed_zMin) == 0 && WaterBlocked(lvl, x, y, (ushort)(z - 1))) { data |= flowed_zMin; } if ((data & flowed_yMin) == 0 && WaterBlocked(lvl, x, (ushort)(y - 1), z)) { data |= flowed_yMin; } // Have we spread now (or been blocked from spreading) in all directions? C.data.Data = data; if (!C.data.HasWait && (data & 0x1F) == 0x1F) { C.data.Data = PhysicsArgs.RemoveFromChecks; } } else //was placed near sponge { lvl.AddUpdate(C.b, Block.Air); if (!C.data.HasWait) { C.data.Data = PhysicsArgs.RemoveFromChecks; } } }