Beispiel #1
0
        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);
            }
        }
Beispiel #2
0
        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;
            }
        }
Beispiel #4
0
        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;
        }
Beispiel #5
0
        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;
            }
        }
Beispiel #6
0
        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;
        }
Beispiel #7
0
        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);
            }
        }
Beispiel #8
0
        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;
        }
Beispiel #9
0
        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;
        }
Beispiel #10
0
        // 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);
            }
        }
Beispiel #11
0
        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;
        }
Beispiel #12
0
        // 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);
            }
        }
Beispiel #13
0
        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;
        }
Beispiel #14
0
        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;
        }