static void ActivateTDoor(Level lvl, int index) { byte block = lvl.blocks[index]; if (block != Block.custom_block) { if (!Block.Props[block].IsTDoor) { return; } PhysicsArgs args = ActivateablePhysics.GetTDoorArgs(block, false); lvl.AddUpdate(index, Block.air, false, args); } else { block = lvl.GetExtTile(index); if (!lvl.CustomBlockProps[block].IsTDoor) { return; } PhysicsArgs args = ActivateablePhysics.GetTDoorArgs(block, true); lvl.AddUpdate(index, Block.air, false, args); } }
public static void DoLeaf(Level lvl, ref PhysInfo C) { if (lvl.physics > 1) //Adv physics kills flowers and mushroos in water/lava { ActivateablePhysics.CheckNeighbours(lvl, C.X, C.Y, C.Z); } // Just immediately remove from physics list if (!lvl.Config.LeafDecay) { lvl.leaves.Clear(); C.Data.Data = PhysicsArgs.RemoveFromChecks; return; } // Delay checking for decay for a random amount of time if (C.Data.Data < 5) { Random rand = lvl.physRandom; if (rand.Next(10) == 0) { C.Data.Data++; } return; } // Perform actual leaf decay, then remove from physics list if (DoLeafDecay(lvl, ref C)) { lvl.AddUpdate(C.Index, Block.Air, default(PhysicsArgs)); } C.Data.Data = PhysicsArgs.RemoveFromChecks; }
public static void DoAir(Level lvl, ref PhysInfo C) { if (C.Data.Type1 == PhysicsArgs.Custom) { DoorPhysics.Do(lvl, ref C); return; } ushort x = C.X, y = C.Y, z = C.Z; ActivateablePhysics.CheckNeighbours(lvl, x, y, z); ActivateablePhysics.CheckAt(lvl, x, (ushort)(y - 1), z); //Edge of map water if (lvl.Config.EdgeWater && (y < lvl.Config.EdgeLevel && y >= (lvl.Config.EdgeLevel + lvl.Config.SidesOffset))) { if (x == 0 || x == lvl.Width - 1 || z == 0 || z == lvl.Length - 1) { BlockID horizon = lvl.Config.HorizonBlock; lvl.AddUpdate(C.Index, horizon == Block.Invalid ? Block.Water : horizon); } } if (!C.Data.HasWait) { C.Data.Data = PhysicsArgs.RemoveFromChecks; } }
public static void DoLeaf(Level lvl, ref PhysInfo C) { // Decaying disabled? Then just remove from the physics list if (!lvl.Config.LeafDecay) { C.Data.Data = PhysicsArgs.RemoveFromChecks; return; } // Delay checking for leaf decay for a random amount of time if (C.Data.Data < 5) { Random rand = lvl.physRandom; if (rand.Next(10) == 0) { C.Data.Data++; } return; } // Perform actual leaf decay, then remove from physics list if (DoLeafDecay(lvl, ref C)) { lvl.AddUpdate(C.Index, Block.Air, default(PhysicsArgs)); if (lvl.physics > 1) { ActivateablePhysics.CheckNeighbours(lvl, C.X, C.Y, C.Z); } } C.Data.Data = PhysicsArgs.RemoveFromChecks; }
public static void DoAir(Level lvl, ref Check C) { ushort x, y, z; lvl.IntToPos(C.b, out x, out y, out z); ActivateablePhysics.CheckNeighbours(lvl, x, y, z); ActivateablePhysics.CheckAt(lvl, lvl.PosToInt(x, (ushort)(y - 1), z)); //Edge of map water if (lvl.Config.EdgeWater && (y < lvl.Config.EdgeLevel && y >= (lvl.Config.EdgeLevel + lvl.Config.SidesOffset))) { if (x == 0 || x == lvl.Width - 1 || z == 0 || z == lvl.Length - 1) { ExtBlock block = ExtBlock.FromRaw((byte)lvl.Config.HorizonBlock); PhysicsArgs args = default(PhysicsArgs); args.ExtBlock = block.BlockID == Block.custom_block; lvl.AddUpdate(C.b, block.RawID, false, args); } } if (!C.data.HasWait) { C.data.Data = PhysicsArgs.RemoveFromChecks; } }
public static void DoLeaf(Level lvl, ref Check C) { if (lvl.physics > 1) //Adv physics kills flowers and mushroos in water/lava { ushort x, y, z; lvl.IntToPos(C.b, out x, out y, out z); ActivateablePhysics.CheckNeighbours(lvl, x, y, z); } // Just immediately remove from physics list if (!lvl.Config.LeafDecay) { lvl.leaves.Clear(); C.data.Data = PhysicsArgs.RemoveFromChecks; return; } // Delay checking for decay for a random amount of time if (C.data.Data < 5) { Random rand = lvl.physRandom; if (rand.Next(10) == 0) { C.data.Data++; } return; } // Perform actual leaf decay, then remove from physics list if (DoLeafDecay(lvl, ref C)) { lvl.AddUpdate(C.b, Block.Air); } C.data.Data = PhysicsArgs.RemoveFromChecks; }
static void ActivateTDoor(Level lvl, ushort x, ushort y, ushort z) { int index; BlockID block = lvl.GetBlock(x, y, z, out index); if (lvl.Props[block].IsTDoor) { PhysicsArgs args = ActivateablePhysics.GetTDoorArgs(block); lvl.AddUpdate(index, Block.Air, args); } }
public static void DoOther(Level lvl, ref PhysInfo C) { if (lvl.physics <= 1) { C.Data.Data = PhysicsArgs.RemoveFromChecks; return; } //Adv physics kills flowers and mushroos in water/lava ActivateablePhysics.CheckNeighbours(lvl, C.X, C.Y, C.Z); C.Data.Data = PhysicsArgs.RemoveFromChecks; }
public static void DoOther(Level lvl, ref Check C) { if (lvl.physics <= 1) { C.data.Data = PhysicsArgs.RemoveFromChecks; return; } ushort x, y, z; lvl.IntToPos(C.b, out x, out y, out z); //Adv physics kills flowers and mushroos in water/lava ActivateablePhysics.CheckNeighbours(lvl, x, y, z); C.data.Data = PhysicsArgs.RemoveFromChecks; }
// Change anys door blocks nearby into air forms static void Door(Level lvl, ref PhysInfo C) { ushort x = C.X, y = C.Y, z = C.Z; BlockID block = (BlockID)(C.Data.Value2 | (C.Data.ExtBlock << Block.ExtendedShift)); bool instant = block == Block.Door_Air || block == Block.Door_AirActivatable; ActivateablePhysics.DoDoors(lvl, (ushort)(x + 1), y, z, instant); ActivateablePhysics.DoDoors(lvl, (ushort)(x - 1), y, z, instant); ActivateablePhysics.DoDoors(lvl, x, y, (ushort)(z + 1), instant); ActivateablePhysics.DoDoors(lvl, x, y, (ushort)(z - 1), instant); ActivateablePhysics.DoDoors(lvl, x, (ushort)(y - 1), z, instant); ActivateablePhysics.DoDoors(lvl, x, (ushort)(y + 1), z, instant); if (block == Block.Door_Green && lvl.physics != 5) { ActivateablePhysics.DoNeighbours(lvl, x, y, z); } }
public static void DoShrub(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.physics > 1) //Adv physics kills flowers and mushroos in water/lava { ActivateablePhysics.CheckNeighbours(lvl, x, y, z); } if (!lvl.Config.GrowTrees) { C.data.Data = PhysicsArgs.RemoveFromChecks; return; } if (C.data.Data < 20) { if (rand.Next(20) == 0) { C.data.Data++; } return; } lvl.SetTile(x, y, z, Block.Air); Tree tree = Tree.Find(lvl.Config.TreeType); if (tree == null) { tree = new NormalTree(); } tree.SetData(rand, tree.DefaultSize(rand)); tree.Generate(x, y, z, (xT, yT, zT, bT) => { if (!lvl.IsAirAt(xT, yT, zT)) { return; } lvl.Blockchange(xT, yT, zT, (ExtBlock)bT); }); C.data.Data = PhysicsArgs.RemoveFromChecks; }
// Change anys door blocks nearby into air forms public static void Door(Level lvl, ref Check C) { ushort x, y, z; lvl.IntToPos(C.b, out x, out y, out z); byte block = C.data.Value2; bool instant = !C.data.ExtBlock && (block == Block.Door_Air || block == Block.Door_AirActivatable); ActivateablePhysics.DoDoors(lvl, (ushort)(x + 1), y, z, instant); ActivateablePhysics.DoDoors(lvl, (ushort)(x - 1), y, z, instant); ActivateablePhysics.DoDoors(lvl, x, y, (ushort)(z + 1), instant); ActivateablePhysics.DoDoors(lvl, x, y, (ushort)(z - 1), instant); ActivateablePhysics.DoDoors(lvl, x, (ushort)(y - 1), z, instant); ActivateablePhysics.DoDoors(lvl, x, (ushort)(y + 1), z, instant); if (block == Block.Door_Green && lvl.physics != 5) { ActivateablePhysics.DoNeighbours(lvl, C.b, x, y, z); } }
public static void DoFalling(Level lvl, ref PhysInfo C) { ushort x = C.X, y = C.Y, z = C.Z; int index = C.Index; bool movedDown = false; ushort yCur = y; do { index = lvl.IntOffset(index, 0, -1, 0); yCur--;// Get block below each loop BlockID cur = lvl.GetBlock(x, yCur, z); if (cur == Block.Invalid) { break; } bool hitBlock = false; switch (cur) { case Block.Air: case Block.Water: case Block.Lava: movedDown = true; break; //Adv physics crushes plants with sand case Block.Sapling: case Block.Dandelion: case Block.Rose: case Block.Mushroom: case Block.RedMushroom: if (lvl.physics > 1) { movedDown = true; } break; default: hitBlock = true; break; } if (hitBlock || lvl.physics > 1) { break; } } while (true); if (movedDown) { lvl.AddUpdate(C.Index, Block.Air, default(PhysicsArgs)); if (lvl.physics > 1) { lvl.AddUpdate(index, C.Block); } else { lvl.AddUpdate(lvl.IntOffset(index, 0, 1, 0), C.Block); } ActivateablePhysics.CheckNeighbours(lvl, x, y, z); } C.Data.Data = PhysicsArgs.RemoveFromChecks; }
public static void DoFalling(Level lvl, ref Check C) { ushort x, y, z; lvl.IntToPos(C.b, out x, out y, out z); int index = C.b; bool movedDown = false; byte block = lvl.blocks[C.b]; do { index = lvl.IntOffset(index, 0, -1, 0); //Get block below each loop if (lvl.GetTile(index) == Block.Invalid) { break; } bool hitBlock = false; switch (lvl.blocks[index]) { case Block.Air: case Block.Water: case Block.Lava: movedDown = true; break; //Adv physics crushes plants with sand case Block.Sapling: case Block.Dandelion: case Block.Rose: case Block.Mushroom: case Block.RedMushroom: if (lvl.physics > 1) { movedDown = true; } break; default: hitBlock = true; break; } if (hitBlock || lvl.physics > 1) { break; } } while (true); if (movedDown) { lvl.AddUpdate(C.b, Block.Air); if (lvl.physics > 1) { lvl.AddUpdate(index, block); } else { lvl.AddUpdate(lvl.IntOffset(index, 0, 1, 0), block); } ActivateablePhysics.CheckNeighbours(lvl, x, y, z); } C.data.Data = PhysicsArgs.RemoveFromChecks; }