Пример #1
0
    private void Awake()
    {
        initialOffset     = Vector3Int.CeilToInt(gameObject.transform.position);
        reactionManager   = GetComponent <ReactionManager>();
        metaDataLayer     = GetComponent <MetaDataLayer>();
        MatrixMove        = GetComponentInParent <MatrixMove>();
        tileChangeManager = GetComponentInParent <TileChangeManager>();


        OnEarthquake.AddListener((worldPos, magnitude) =>
        {
            var cellPos = metaTileMap.WorldToCell(worldPos);

            var bounds =
                new BoundsInt(cellPos - new Vector3Int(magnitude, magnitude, 0), new Vector3Int(magnitude * 2, magnitude * 2, 1));

            foreach (var pos in bounds.allPositionsWithin)
            {
                foreach (var player in Get <PlayerScript>(pos, true))
                {
                    if (player.IsGhost)
                    {
                        continue;
                    }
                    player.registerTile.ServerSlip(true);
                }
                //maybe shake items somehow, too
            }
        });
    }
Пример #2
0
        public override void OnStartServer()
        {
            metaDataLayer = GetComponent <MetaDataLayer>();
            metaTileMap   = GetComponentInParent <MetaTileMap>();

            InitializeRooms();
        }
Пример #3
0
    private void Awake()
    {
        tileChangeManager = GetComponentInParent <TileChangeManager>();
        metaDataLayer     = GetComponent <MetaDataLayer>();

        hotspots = new Dictionary <Vector3Int, MetaDataNode>();
    }
Пример #4
0
    void Awake()
    {
        tileChangeManager = transform.GetComponentInParent <TileChangeManager>();
        metaDataLayer     = transform.GetComponentInParent <MetaDataLayer>();
        metaTileMap       = transform.GetComponentInParent <MetaTileMap>();

        Layer  = GetComponent <Layer>();
        matrix = GetComponentInParent <Matrix>();

        tileChangeManager.OnFloorOrPlatingRemoved.RemoveAllListeners();
        tileChangeManager.OnFloorOrPlatingRemoved.AddListener(cellPos =>
        {         //Poke items when both floor and plating are gone
            //As they might want to change matrix
            if (!metaTileMap.HasTile(cellPos, LayerType.Floors, true) &&
                !metaTileMap.HasTile(cellPos, LayerType.Base, true) &&
                metaTileMap.HasTile(cellPos, LayerType.Objects, true)
                )
            {
                foreach (var customNetTransform in matrix.Get <CustomNetTransform>(cellPos, true))
                {
                    customNetTransform.CheckMatrixSwitch();
                }
            }
        });
    }
 public virtual void Awake()
 {
     metaDataLayer    = GetComponentInChildren <MetaDataLayer>();
     metaTileMap      = GetComponentInChildren <MetaTileMap>();
     subsystemManager = GetComponent <SubsystemManager>();
     subsystemManager.Register(this);
 }
Пример #6
0
        public void Awake()
        {
            metaDataLayer = GetComponentInChildren <MetaDataLayer>();
            metaTileMap   = GetComponentInChildren <MetaTileMap>();

            GetComponent <SystemManager>().Register(this);
        }
Пример #7
0
        private void CheckRelease()
        {
            if (Opened)
            {
                MetaDataLayer metaDataLayer = MatrixManager.AtPoint(Vector3Int.RoundToInt(transform.position), true)
                                              .MetaDataLayer;

                Vector3Int   position = transform.localPosition.RoundToInt();
                MetaDataNode node     = metaDataLayer.Get(position, false);

                float deltaPressure = Mathf.Min(GasMix.Pressure, ReleasePressure) - node.GasMix.Pressure;

                if (deltaPressure > 0)
                {
                    float ratio = deltaPressure / GasMix.Pressure * Time.deltaTime;

                    node.GasMix += GasMix * ratio;

                    GasMix *= (1 - ratio);

                    metaDataLayer.UpdateSystemsAt(position);

                    Volume      = GasMix.Volume;
                    Temperature = GasMix.Temperature;

                    foreach (Gas gas in Gas.All)
                    {
                        Gases[gas] = GasMix.Gases[gas];
                    }
                }
            }
        }
Пример #8
0
        public void SpillContent(Tuple <ReagentMix, GasMix> ToSpill)
        {
            if (pipeNode == null && MonoPipe == null)
            {
                return;
            }

            Vector3Int ZeroedLocation = Vector3Int.zero;

            if (pipeNode != null)
            {
                ZeroedLocation = pipeNode.NodeLocation;
            }
            else
            {
                ZeroedLocation = MonoPipe.MatrixPos;
            }

            ZeroedLocation.z = 0;
            var tileWorldPosition = MatrixManager.LocalToWorld(ZeroedLocation, matrix).RoundToInt();

            MatrixManager.ReagentReact(ToSpill.Item1, tileWorldPosition);
            MetaDataLayer metaDataLayer = MatrixManager.AtPoint(tileWorldPosition, true).MetaDataLayer;

            if (pipeNode != null)
            {
                pipeNode.IsOn.GasMix += ToSpill.Item2;
            }
            else
            {
                matrix.GetMetaDataNode(ZeroedLocation).GasMix += ToSpill.Item2;
            }
            metaDataLayer.UpdateSystemsAt(ZeroedLocation, SystemType.AtmosSystem);
        }
Пример #9
0
        private static void DrawGizmo2(MetaDataLayer scr, GizmoType gizmoType)
        {
            if (!DrawGizmos || !rooms)
            {
                return;
            }

            Vector3Int start = Vector3Int.RoundToInt(Camera.current.ScreenToWorldPoint(Vector3.one * -32) - scr.transform.position);             // bottom left
            Vector3Int end   =
                Vector3Int.RoundToInt(Camera.current.ScreenToWorldPoint(new Vector3(Camera.current.pixelWidth + 32, Camera.current.pixelHeight + 32)) -
                                      scr.transform.position);

            start.z = 0;
            end.z   = 1;

            if (end.y - start.y > 100)
            {
                // avoid being zoomed out too much (creates too many objects)
                return;
            }

            Gizmos.matrix = scr.transform.localToWorldMatrix;

            Color blue = Color.blue;

            blue.a = 0.5f;

            Color red = Color.red;

            red.a = 0.5f;

            Color green = Color.green;

            green.a = 0.5f;

            foreach (Vector3Int position in new BoundsInt(start, end - start).allPositionsWithin)
            {
                MetaDataNode node = scr.Get(position, false);
                if (node != null)
                {
                    if (node.Room == 0)
                    {
                        Gizmos.color = green;
                    }

                    if (node.Room > 0)
                    {
                        Gizmos.color = blue;
                    }

                    if (node.Room < 0)
                    {
                        Gizmos.color = red;
                    }

                    Gizmos.DrawCube(position + new Vector3(0.5f, 0.5f, 0), Vector3.one);
                }
            }
        }
Пример #10
0
 void Awake()
 {
     tileChangeManager = transform.root.GetComponent <TileChangeManager>();
     tileTrigger       = transform.root.GetComponent <TileTrigger>();
     metaDataLayer     = transform.parent.GetComponent <MetaDataLayer>();
     metaTileMap       = transform.parent.GetComponent <MetaTileMap>();
     Layer             = GetComponent <Layer>();
 }
Пример #11
0
        private void ReleaseContentsInstantly()
        {
            MetaDataLayer metaDataLayer = MatrixManager.AtPoint(WorldPosition, true).MetaDataLayer;
            MetaDataNode  node          = metaDataLayer.Get(LocalPosition, false);

            GasMix.TransferGas(node.GasMix, GasMix, GasMix.Moles);
            metaDataLayer.UpdateSystemsAt(LocalPosition, SystemType.AtmosSystem);
        }
Пример #12
0
 private void Awake()
 {
     playerSprites = GetComponent <UserControlledSprites>();
     playerScript  = GetComponent <PlayerScript>();
     //initially we are upright and don't rotate with the matrix
     rotateWithMatrix = false;
     metaDataLayer    = transform.GetComponentInParent <MetaDataLayer>();
 }
Пример #13
0
    void Awake()
    {
        tileChangeManager = transform.GetComponentInParent <TileChangeManager>();
        metaDataLayer     = transform.GetComponentInParent <MetaDataLayer>();
        metaTileMap       = transform.GetComponentInParent <MetaTileMap>();

        Layer = GetComponent <Layer>();
    }
Пример #14
0
        public override void OnSpawnServer(SpawnInfo info)
        {
            metaDataLayer = MatrixManager.AtPoint(registerTile.WorldPositionServer, true).MetaDataLayer;
            metaNode      = metaDataLayer.Get(registerTile.LocalPositionServer, false);
            pipeMix       = pipeData.GetMixAndVolume.GetGasMix();

            UpdateState();
            base.OnSpawnServer(info);
        }
Пример #15
0
    private void Awake()
    {
        tileChangeManager = GetComponentInParent <TileChangeManager>();
        metaDataLayer     = GetComponent <MetaDataLayer>();
        matrix            = GetComponent <Matrix>();

        hotspots       = new Dictionary <Vector3Int, MetaDataNode>();
        winds          = new UniqueQueue <MetaDataNode>();
        tilemapDamages = GetComponentsInChildren <TilemapDamage>();
    }
Пример #16
0
        public void OnSpawnServer(SpawnInfo info)
        {
            var integrity = GetComponent <Integrity>();

            integrity.OnExposedEvent.AddListener(TriggerAlarm);
            RegisterTile  registerTile  = GetComponent <RegisterTile>();
            MetaDataLayer metaDataLayer = MatrixManager.AtPoint(registerTile.WorldPositionServer, true).MetaDataLayer;

            Controller.Open();
        }
Пример #17
0
 public override void OnSpawnServer(SpawnInfo info)
 {
     metaDataLayer = MatrixManager.AtPoint(registerTile.WorldPositionServer, true).MetaDataLayer;
     metaNode      = metaDataLayer.Get(registerTile.LocalPositionServer, false);
     if (SelfSufficient)
     {
         selfSufficientGas = GasMix.NewGasMix(GasMixes.Air);
     }
     base.OnSpawnServer(info);
 }
Пример #18
0
        private void CheckPressure()
        {
            MetaDataLayer metaDataLayer = MatrixManager.AtPoint(Vector3Int.RoundToInt(transform.position)).MetaDataLayer;

            GasMix atmos = metaDataLayer.Get(transform.localPosition.RoundToInt(), false).Atmos;

            if (atmos.Pressure < AtmosConstants.HAZARD_LOW_PRESSURE || atmos.Pressure > AtmosConstants.HAZARD_HIGH_PRESSURE)
            {
                Logger.Log("URGENT TODO: Perform atmos damage to player ", Category.Health);
                //	health.ApplyDamage(null, (int)pressureDamage * Time.deltaTime, DamageType.Brute);
            }
        }
Пример #19
0
    void Awake()
    {
        itemAtts        = GetComponent <ItemAttributes>();
        metaDataLayer   = GetComponentInParent <MetaDataLayer>();
        reactionManager = GetComponentInParent <ReactionManager>();

        leftHandOriginal  = itemAtts.inHandReferenceLeft;
        rightHandOriginal = itemAtts.inHandReferenceRight;

        leftHandFlame  = leftHandOriginal + 4;
        rightHandFlame = rightHandOriginal + 4;
    }
Пример #20
0
        public override void OnSpawnServer(SpawnInfo info)
        {
            metaDataLayer = MatrixManager.AtPoint(registerTile.WorldPositionServer, true).MetaDataLayer;
            metaNode      = metaDataLayer.Get(registerTile.LocalPositionServer, false);
            pipeMix       = selfSufficient ? GasMix.NewGasMix(GasMixes.BaseEmptyMix) : pipeData.GetMixAndVolume.GetGasMix();

            if (TryGetComponent <AcuDevice>(out var device) && device.Controller != null)
            {
                SetOperatingMode(device.Controller.DesiredMode);
            }

            base.OnSpawnServer(info);
        }
Пример #21
0
 private void Start()
 {
     metaDataLayer = GetComponentInChildren <MetaDataLayer>(true);
     metaTileMap   = GetComponent <MetaTileMap>();
     try
     {
         objects = ((ObjectLayer)metaTileMap.Layers[LayerType.Objects]).Objects;
     }
     catch
     {
         Logger.LogError("CAST ERROR: Make sure everything is in its proper layer type.", Category.Matrix);
     }
 }
Пример #22
0
        private void Awake()
        {
            tileChangeManager = GetComponentInParent <TileChangeManager>();
            metaDataLayer     = GetComponent <MetaDataLayer>();
            matrix            = GetComponent <Matrix>();

            hotspots           = new ConcurrentDictionary <Vector3Int, MetaDataNode>();
            winds              = new ThreadSafeList <MetaDataNode>();
            windsNodeDelegator = ProcessWindNodes;

            hotspotsToRemove = new List <Vector3Int>();
            hotspotsToAdd    = new List <Hotspot>();
            tilemapDamages   = GetComponentsInChildren <TilemapDamage>();
        }
Пример #23
0
        private void OperateAirPump()
        {
            MetaDataLayer metadata = registerObject.Matrix.MetaDataLayer;
            GasMix        tileMix  = metadata.Get(registerObject.LocalPositionServer, false).GasMix;

            // TODO: add voltage multiplier when bins are powered
            var molesToTransfer = (tileMix.Moles - (tileMix.Moles * (CHARGED_PRESSURE / gasContainer.GasMix.Pressure))) * -1;

            molesToTransfer *= 0.5f;

            GasMix.TransferGas(gasContainer.GasMix, tileMix, molesToTransfer.Clamp(0, 8));
            metadata.UpdateSystemsAt(registerObject.LocalPositionServer, SystemType.AtmosSystem);

            chargePressure = gasContainer.GasMix.Pressure;
        }
Пример #24
0
    public void OnSpawnServer(SpawnInfo info)
    {
        var integrity = GetComponent <Integrity>();

        integrity.OnExposedEvent.AddListener(SendCloseAlerts);
        AtmosManager.Instance.inGameFireAlarms.Add(this);
        RegisterTile  registerTile  = GetComponent <RegisterTile>();
        MetaDataLayer metaDataLayer = MatrixManager.AtPoint(registerTile.WorldPositionServer, true).MetaDataLayer;

        metaNode = metaDataLayer.Get(registerTile.LocalPositionServer, false);
        foreach (var firelock in FireLockList)
        {
            firelock.fireAlarm = this;
        }
    }
Пример #25
0
    private void Awake()
    {
        metaTileMap = GetComponent <MetaTileMap>();
        if (metaTileMap == null)
        {
            Logger.LogError($"MetaTileMap was null on {gameObject.name}");
        }

        networkedMatrix   = transform.parent.GetComponent <NetworkedMatrix>();
        initialOffset     = Vector3Int.CeilToInt(gameObject.transform.position);
        reactionManager   = GetComponent <ReactionManager>();
        metaDataLayer     = GetComponent <MetaDataLayer>();
        MatrixMove        = GetComponentInParent <MatrixMove>();
        tileChangeManager = GetComponentInParent <TileChangeManager>();
        underFloorLayer   = GetComponentInChildren <UnderFloorLayer>();
        tilemapsDamage    = GetComponentsInChildren <TilemapDamage>().ToList();

        if (MatrixManager.Instance.InitializingMatrixes.ContainsKey(gameObject.scene) == false)
        {
            MatrixManager.Instance.InitializingMatrixes.Add(gameObject.scene, new List <Matrix>());
        }
        MatrixManager.Instance.InitializingMatrixes[gameObject.scene].Add(this);


        OnEarthquake.AddListener((worldPos, magnitude) =>
        {
            var cellPos = metaTileMap.WorldToCell(worldPos);

            var bounds =
                new BoundsInt(cellPos - new Vector3Int(magnitude, magnitude, 0),
                              new Vector3Int(magnitude * 2, magnitude * 2, 1));

            foreach (var pos in bounds.allPositionsWithin)
            {
                foreach (var player in Get <PlayerScript>(pos, true))
                {
                    if (player.IsGhost)
                    {
                        continue;
                    }

                    player.registerTile.ServerSlip(true);
                }

                //maybe shake items somehow, too
            }
        });
    }
Пример #26
0
    private void Awake()
    {
        tileChangeManager = GetComponentInParent <TileChangeManager>();
        metaDataLayer     = GetComponent <MetaDataLayer>();
        matrix            = GetComponent <Matrix>();

        hotspots = new Dictionary <Vector3Int, MetaDataNode>();
        winds    = new UniqueQueue <MetaDataNode>();

        addFog    = new UniqueQueue <FogEffect>();
        removeFog = new UniqueQueue <FogEffect>();

        hotspotsToRemove = new List <Vector3Int>();
        hotspotsToAdd    = new List <Hotspot>();
        tilemapDamages   = GetComponentsInChildren <TilemapDamage>();
    }
Пример #27
0
        public override void TickUpdate()
        {
            if (metaDataLayer == null)
            {
                metaDataLayer = MatrixManager.AtPoint(registerTile.WorldPositionServer, true).MetaDataLayer;
            }

            if (metaNode == null)
            {
                metaNode = metaDataLayer.Get(registerTile.LocalPositionServer, false);
            }


            base.TickUpdate();
            pipeData.mixAndVolume.EqualiseWithOutputs(pipeData.Outputs);
            CheckAtmos();
        }
Пример #28
0
        private void OnWillDestroyServer(DestructionInfo info)
        {
            var tileWorldPosition = gameObject.TileWorldPosition().To3Int();
            //release all of our gases at once when destroyed
            MetaDataLayer metaDataLayer  = MatrixManager.AtPoint(tileWorldPosition, true).MetaDataLayer;
            Vector3Int    position       = transform.localPosition.RoundToInt();
            MetaDataNode  node           = metaDataLayer.Get(position, false);
            var           shakeIntensity = (byte)Mathf.Lerp(byte.MinValue, byte.MaxValue / 2, GasMix.Pressure / MAX_EXPLOSION_EFFECT_PRESSURE);
            var           shakeDistance  = Mathf.Lerp(1, 64, GasMix.Pressure / MAX_EXPLOSION_EFFECT_PRESSURE);

            node.GasMix += GasMix;
            metaDataLayer.UpdateSystemsAt(position);
            Chat.AddLocalMsgToChat($"{name} exploded!", gameObject.TileWorldPosition());

            ObjectFactory.SpawnMetal(2, tileWorldPosition.To2Int(), parent: transform.parent);

            ExplosionUtils.PlaySoundAndShake(tileWorldPosition, shakeIntensity, (int)shakeDistance);
        }
Пример #29
0
        private void OnWillDestroyServer(DestructionInfo info)
        {
            var tileWorldPosition = gameObject.TileWorldPosition().To3Int();
            //release all of our gases at once when destroyed
            MetaDataLayer metaDataLayer  = MatrixManager.AtPoint(tileWorldPosition, true).MetaDataLayer;
            Vector3Int    position       = transform.localPosition.RoundToInt();
            MetaDataNode  node           = metaDataLayer.Get(position, false);
            var           shakeIntensity = (byte)Mathf.Lerp(byte.MinValue, byte.MaxValue / 2, GasMix.Pressure / MAX_EXPLOSION_EFFECT_PRESSURE);
            var           shakeDistance  = Mathf.Lerp(1, 64, GasMix.Pressure / MAX_EXPLOSION_EFFECT_PRESSURE);

            node.GasMix += GasMix;
            metaDataLayer.UpdateSystemsAt(position);
            Chat.AddLocalDestroyMsgToChat(gameObject.ExpensiveName(), " exploded!", gameObject.TileWorldPosition());

            Spawn.ServerPrefab("Metal", gameObject.TileWorldPosition().To3Int(), transform.parent, count: 2,
                               scatterRadius: Spawn.DefaultScatterRadius, cancelIfImpassable: true);

            ExplosionUtils.PlaySoundAndShake(tileWorldPosition, shakeIntensity, (int)shakeDistance);
        }
Пример #30
0
        public void OnSpawnServer(SpawnInfo info)
        {
            var integrity = GetComponent <Integrity>();

            integrity.OnExposedEvent.AddListener(SendCloseAlerts);
            AtmosManager.Instance.inGameFireAlarms.Add(this);
            RegisterTile  registerTile  = GetComponent <RegisterTile>();
            MetaDataLayer metaDataLayer = MatrixManager.AtPoint(registerTile.WorldPositionServer, true).MetaDataLayer;
            var           wallMount     = GetComponent <WallmountBehavior>();
            var           direction     = wallMount.CalculateFacing().CutToInt();

            metaNode = metaDataLayer.Get(registerTile.LocalPositionServer + direction, false);
            foreach (var firelock in FireLockList)
            {
                firelock.fireAlarm = this;
            }
            if (!info.SpawnItems)
            {
                hasCables = false;
                coverOpen = true;
                stateSync = FireAlarmState.OpenEmptySprite;
            }
        }