Example #1
0
        internal bool DoPhysicsBlockchange(int b, ExtBlock block, bool overRide = false,
                                           PhysicsArgs data = default(PhysicsArgs), bool addUndo = true)
        {
            if (blocks == null || b < 0 || b >= blocks.Length)
            {
                return(false);
            }
            ExtBlock old;

            old.BlockID = blocks[b];
            old.ExtID   = old.BlockID == Block.custom_block ? GetExtTile(b) : Block.Air;

            try
            {
                if (!overRide)
                {
                    if (Props[old.Index].OPBlock || (Props[block.Index].OPBlock && data.Raw != 0))
                    {
                        return(false);
                    }
                }

                if (old.BlockID == Block.Sponge && physics > 0 && block.BlockID != Block.Sponge)
                {
                    OtherPhysics.DoSpongeRemoved(this, b, false);
                }

                if (old.BlockID == Block.LavaSponge && physics > 0 && block.BlockID != Block.LavaSponge)
                {
                    OtherPhysics.DoSpongeRemoved(this, b, true);
                }

                if (addUndo)
                {
                    UndoPos uP = default(UndoPos);
                    uP.index = b;
                    uP.SetData(old, block);

                    if (UndoBuffer.Count < ServerConfig.PhysicsUndo)
                    {
                        UndoBuffer.Add(uP);
                    }
                    else
                    {
                        if (currentUndo >= ServerConfig.PhysicsUndo)
                        {
                            currentUndo = 0;
                        }
                        UndoBuffer[currentUndo] = uP;
                    }
                    currentUndo++;
                }

                blocks[b] = block.BlockID;
                Changed   = true;
                if (block.BlockID == Block.custom_block)
                {
                    ushort x, y, z;
                    IntToPos(b, out x, out y, out z);
                    SetExtTileNoCheck(x, y, z, block.ExtID);
                }
                else if (old.BlockID == Block.custom_block)
                {
                    ushort x, y, z;
                    IntToPos(b, out x, out y, out z);
                    RevertExtTileNoCheck(x, y, z);
                }
                if (physics > 0 && (ActivatesPhysics(block) || data.Raw != 0))
                {
                    AddCheck(b, false, data);
                }

                // Save bandwidth sending identical looking blocks, like air/op_air changes.
                return(!old.VisuallyEquals(block));
            } catch {
                blocks[b] = block.BlockID;
                return(false);
            }
        }
Example #2
0
        public bool DoPhysicsBlockchange(int b, BlockID block, bool overRide = false,
                                         PhysicsArgs data = default(PhysicsArgs), bool addUndo = true)
        {
            if (blocks == null || b < 0 || b >= blocks.Length)
            {
                return(false);
            }
            BlockID old = blocks[b];

            #if TEN_BIT_BLOCKS
            BlockID extended = Block.ExtendedBase[old];
            if (extended > 0)
            {
                old = (BlockID)(extended | GetExtTile(b));
            }
            #else
            if (old == Block.custom_block)
            {
                old = (BlockID)(Block.Extended | GetExtTile(b));
            }
            #endif

            try
            {
                if (!overRide)
                {
                    if (Props[old].OPBlock || (Props[block].OPBlock && data.Raw != 0))
                    {
                        return(false);
                    }
                }

                if (old == Block.Sponge && physics > 0 && block != Block.Sponge)
                {
                    OtherPhysics.DoSpongeRemoved(this, b, false);
                }
                if (old == Block.LavaSponge && physics > 0 && block != Block.LavaSponge)
                {
                    OtherPhysics.DoSpongeRemoved(this, b, true);
                }

                if (addUndo)
                {
                    UndoPos uP = default(UndoPos);
                    uP.Index = b;
                    uP.SetData(old, block);

                    if (UndoBuffer.Count < Server.Config.PhysicsUndo)
                    {
                        UndoBuffer.Add(uP);
                    }
                    else
                    {
                        if (currentUndo >= Server.Config.PhysicsUndo)
                        {
                            currentUndo = 0;
                        }
                        UndoBuffer[currentUndo] = uP;
                    }
                    currentUndo++;
                }

                Changed = true;
                if (block >= Block.Extended)
                {
                    #if TEN_BIT_BLOCKS
                    blocks[b] = Block.ExtendedClass[block >> Block.ExtendedShift];
                    #else
                    blocks[b] = Block.custom_block;
                    #endif
                    ushort x, y, z;
                    IntToPos(b, out x, out y, out z);
                    FastSetExtTile(x, y, z, (BlockRaw)block);
                }
                else
                {
                    blocks[b] = (BlockRaw)block;
                    if (old >= Block.Extended)
                    {
                        ushort x, y, z;
                        IntToPos(b, out x, out y, out z);
                        FastRevertExtTile(x, y, z);
                    }
                }
                if (physics > 0 && (ActivatesPhysics(block) || data.Raw != 0))
                {
                    AddCheck(b, false, data);
                }

                // Save bandwidth not sending identical looking blocks, like air/op_air changes.
                return(!Block.VisuallyEquals(old, block));
            } catch {
                return(false);
            }
        }
Example #3
0
        internal bool DoPhysicsBlockchange(int b, byte block, bool overRide = false,
                                           PhysicsArgs data = default(PhysicsArgs),
                                           byte extBlock    = 0, bool addUndo = true)
        {
            if (b < 0 || b >= blocks.Length || blocks == null)
            {
                return(false);
            }
            byte old    = blocks[b];
            byte oldExt = old == Block.custom_block ? GetExtTile(b) : (byte)0;

            try
            {
                if (!overRide)
                {
                    if (Block.Props[old].OPBlock || (Block.Props[block].OPBlock && data.Raw != 0))
                    {
                        return(false);
                    }
                }

                if (b == Block.sponge && physics > 0 && block != Block.sponge)
                {
                    OtherPhysics.DoSpongeRemoved(this, b);
                }

                if (b == Block.lava_sponge && physics > 0 && block != Block.lava_sponge)
                {
                    OtherPhysics.DoSpongeRemoved(this, b, true);
                }

                if (addUndo)
                {
                    UndoPos uP = default(UndoPos);
                    uP.index = b;
                    uP.SetData(old, oldExt, block, extBlock);

                    if (UndoBuffer.Count < Server.physUndo)
                    {
                        UndoBuffer.Add(uP);
                    }
                    else
                    {
                        if (currentUndo >= Server.physUndo)
                        {
                            currentUndo = 0;
                        }
                        UndoBuffer[currentUndo] = uP;
                    }
                    currentUndo++;
                }

                blocks[b] = block;
                changed   = true;
                if (block == Block.custom_block)
                {
                    ushort x, y, z;
                    IntToPos(b, out x, out y, out z);
                    SetExtTileNoCheck(x, y, z, extBlock);
                }
                else if (old == Block.custom_block)
                {
                    ushort x, y, z;
                    IntToPos(b, out x, out y, out z);
                    RevertExtTileNoCheck(x, y, z);
                }
                if (physics > 0 && (ActivatesPhysics(block, extBlock) || data.Raw != 0))
                {
                    AddCheck(b, false, data);
                }

                // Save bandwidth sending identical looking blocks, like air/op_air changes.
                bool diffBlock = Block.Convert(old) != Block.Convert(block);
                if (!diffBlock && old == Block.custom_block)
                {
                    diffBlock = oldExt != extBlock;
                }
                return(diffBlock);
            } catch {
                blocks[b] = block;
                return(false);
            }
        }