示例#1
0
        public override void OnNeighborBlockChanged(int x, int y, int z, int neighborX, int neighborY, int neighborZ)
        {
            int   cellValue = base.SubsystemTerrain.Terrain.GetCellValue(x, y, z);
            int   num       = Terrain.ExtractContents(cellValue);
            Block obj       = BlocksManager.Blocks[num];
            int   data      = Terrain.ExtractData(cellValue);

            if (obj is TrapdoorBlock)
            {
                int    rotation     = TrapdoorBlock.GetRotation(data);
                bool   upsideDown   = TrapdoorBlock.GetUpsideDown(data);
                bool   flag         = false;
                Point3 point        = CellFace.FaceToPoint3(rotation);
                int    cellContents = base.SubsystemTerrain.Terrain.GetCellContents(x - point.X, y - point.Y, z - point.Z);
                flag |= !BlocksManager.Blocks[cellContents].IsTransparent;
                if (upsideDown)
                {
                    int cellContents2 = base.SubsystemTerrain.Terrain.GetCellContents(x, y + 1, z);
                    flag |= !BlocksManager.Blocks[cellContents2].IsTransparent;
                    int cellContents3 = base.SubsystemTerrain.Terrain.GetCellContents(x - point.X, y - point.Y + 1, z - point.Z);
                    flag |= !BlocksManager.Blocks[cellContents3].IsTransparent;
                }
                else
                {
                    int cellContents4 = base.SubsystemTerrain.Terrain.GetCellContents(x, y - 1, z);
                    flag |= !BlocksManager.Blocks[cellContents4].IsTransparent;
                    int cellContents5 = base.SubsystemTerrain.Terrain.GetCellContents(x - point.X, y - point.Y - 1, z - point.Z);
                    flag |= !BlocksManager.Blocks[cellContents5].IsTransparent;
                }
                if (!flag)
                {
                    base.SubsystemTerrain.DestroyCell(0, x, y, z, 0, noDrop: false, noParticleSystem: false);
                }
            }
        }
        public bool IsCollapseSupportBlock(int value)
        {
            int num = Terrain.ExtractContents(value);

            if (num != 0)
            {
                int   data  = Terrain.ExtractData(value);
                Block block = BlocksManager.Blocks[num];
                if (block is TrapdoorBlock)
                {
                    if (TrapdoorBlock.GetUpsideDown(data))
                    {
                        return(!TrapdoorBlock.GetOpen(data));
                    }
                    return(false);
                }
                if (block.BlockIndex == 238)
                {
                    return(true);
                }
                if (block.IsFaceTransparent(base.SubsystemTerrain, 4, value))
                {
                    return(block is SoilBlock);
                }
                return(true);
            }
            return(false);
        }
示例#3
0
        public override bool OnInteract(TerrainRaycastResult raycastResult, ComponentMiner componentMiner)
        {
            CellFace cellFace  = raycastResult.CellFace;
            int      cellValue = base.SubsystemTerrain.Terrain.GetCellValue(cellFace.X, cellFace.Y, cellFace.Z);
            int      num       = Terrain.ExtractContents(cellValue);
            int      data      = Terrain.ExtractData(cellValue);

            if (num == 83 || !IsTrapdoorElectricallyConnected(cellFace.X, cellFace.Y, cellFace.Z))
            {
                bool open = TrapdoorBlock.GetOpen(data);
                return(OpenCloseTrapdoor(cellFace.X, cellFace.Y, cellFace.Z, !open));
            }
            return(true);
        }
示例#4
0
        public bool OpenCloseTrapdoor(int x, int y, int z, bool open)
        {
            int cellValue = base.SubsystemTerrain.Terrain.GetCellValue(x, y, z);
            int num       = Terrain.ExtractContents(cellValue);

            if (BlocksManager.Blocks[num] is TrapdoorBlock)
            {
                int data  = TrapdoorBlock.SetOpen(Terrain.ExtractData(cellValue), open);
                int value = Terrain.ReplaceData(cellValue, data);
                base.SubsystemTerrain.ChangeCell(x, y, z, value);
                string name = open ? "Audio/Doors/DoorOpen" : "Audio/Doors/DoorClose";
                base.SubsystemTerrain.Project.FindSubsystem <SubsystemAudio>(throwOnError: true).PlaySound(name, 0.7f, m_random.Float(-0.1f, 0.1f), new Vector3(x, y, z), 4f, autoDelay: true);
                return(true);
            }
            return(false);
        }
        public static bool IsCollapseDestructibleBlock(int value)
        {
            int   num   = Terrain.ExtractContents(value);
            Block block = BlocksManager.Blocks[num];

            if (block is TrapdoorBlock)
            {
                int data = Terrain.ExtractData(value);
                if (TrapdoorBlock.GetUpsideDown(data) && TrapdoorBlock.GetOpen(data))
                {
                    return(false);
                }
            }
            else if (block is FluidBlock)
            {
                return(false);
            }
            return(true);
        }
示例#6
0
        public bool IsTrapdoorElectricallyConnected(int x, int y, int z)
        {
            int cellValue = base.SubsystemTerrain.Terrain.GetCellValue(x, y, z);
            int num       = Terrain.ExtractContents(cellValue);
            int data      = Terrain.ExtractData(cellValue);

            if (BlocksManager.Blocks[num] is TrapdoorBlock)
            {
                ElectricElement electricElement = m_subsystemElectricity.GetElectricElement(x, y, z, TrapdoorBlock.GetMountingFace(data));
                if (electricElement != null && electricElement.Connections.Count > 0)
                {
                    return(true);
                }
            }
            return(false);
        }