示例#1
0
        public void Examine(FormattedMessage message, bool inDetailsRange)
        {
            if (!inDetailsRange)
            {
                return;
            }

            var gam = EntitySystem.Get <AtmosphereSystem>().GetGridAtmosphere(Owner.Transform.GridID);

            var tile = gam?.GetTile(Owner.Transform.GridPosition).Air;

            if (tile == null)
            {
                return;
            }

            message.AddText($"Pressure: {tile.Pressure}\n");
            message.AddText($"Temperature: {tile.Temperature}\n");

            for (int i = 0; i < Atmospherics.TotalNumberOfGases; i++)
            {
                var gas = Atmospherics.GetGas(i);

                if (tile.Gases[i] <= Atmospherics.GasMinMoles)
                {
                    continue;
                }

                message.AddText(gas.Name);
                message.AddText($"\n Moles: {tile.Gases[i]}\n");
            }
        }
示例#2
0
        public override void Initialize()
        {
            base.Initialize();
            SubscribeNetworkEvent <GasOverlayMessage>(HandleGasOverlayMessage);
            _mapManager.OnGridRemoved += OnGridRemoved;

            for (var i = 0; i < Atmospherics.TotalNumberOfGases; i++)
            {
                var overlay = Atmospherics.GetOverlay(i);
                switch (overlay)
                {
                case SpriteSpecifier.Rsi animated:
                    var rsi     = _resourceCache.GetResource <RSIResource>(animated.RsiPath).RSI;
                    var stateId = animated.RsiState;

                    if (!rsi.TryGetState(stateId, out var state))
                    {
                        continue;
                    }

                    _frames[i]       = state.GetFrames(RSI.State.Direction.South);
                    _frameDelays[i]  = state.GetDelays();
                    _frameCounter[i] = 0;
                    break;

                case SpriteSpecifier.Texture texture:
                    _frames[i]      = new[] { texture.Frame0() };
                    _frameDelays[i] = Array.Empty <float>();
                    break;

                case null:
                    _frames[i]      = Array.Empty <Texture>();
                    _frameDelays[i] = Array.Empty <float>();
                    break;
                }
            }

            var fire = _resourceCache.GetResource <RSIResource>(FireRsiPath).RSI;

            for (var i = 0; i < FireStates; i++)
            {
                if (!fire.TryGetState((i + 1).ToString(), out var state))
                {
                    throw new ArgumentOutOfRangeException($"Fire RSI doesn't have state \"{i}\"!");
                }

                _fireFrames[i]       = state.GetFrames(RSI.State.Direction.South);
                _fireFrameDelays[i]  = state.GetDelays();
                _fireFrameCounter[i] = 0;
            }

            var overlayManager = IoCManager.Resolve <IOverlayManager>();

            if (!overlayManager.HasOverlay(nameof(GasTileOverlay)))
            {
                overlayManager.AddOverlay(new GasTileOverlay());
            }
        }
        private void Revalidate()
        {
            var mapMan    = IoCManager.Resolve <IMapManager>();
            var entityMan = IoCManager.Resolve <IEntityManager>();
            var list      = new List <GasData>();

            foreach (var(gridId, indices) in _invalid)
            {
                if (!mapMan.GridExists(gridId))
                {
                    _invalid.Remove(gridId);
                    return;
                }
                var grid = entityMan.GetEntity(mapMan.GetGrid(gridId).GridEntityId);
                if (!grid.TryGetComponent(out GridAtmosphereComponent gam))
                {
                    continue;
                }

                foreach (var index in indices)
                {
                    var tile = gam.GetTile(index);

                    if (tile?.Air == null)
                    {
                        continue;
                    }

                    list.Clear();

                    for (var i = 0; i < Atmospherics.TotalNumberOfGases; i++)
                    {
                        var gas     = Atmospherics.GetGas(i);
                        var overlay = gas.GasOverlay;
                        if (overlay == null)
                        {
                            continue;
                        }
                        var moles = tile.Air.Gases[i];
                        if (moles == 0f || moles < gas.GasMolesVisible)
                        {
                            continue;
                        }
                        list.Add(new GasData(i, MathF.Max(MathF.Min(1, moles / gas.GasMolesVisibleMax), 0f)));
                    }

                    if (list.Count == 0)
                    {
                        continue;
                    }

                    SetTileOverlay(gridId, index, list.ToArray(), tile.Hotspot.State, tile.Hotspot.Temperature);
                }

                indices.Clear();
            }
        }
示例#4
0
    public void OnEnable()
    {
        Atmospherics a = target as Atmospherics;

        if (!a)
        {
            return;
        }

        string path = AssetDatabase.GetAssetPath(a.lookupTexture);

        if (path == "")
        {
            changed = true;
        }
    }
示例#5
0
        private bool TryRefreshTile(GridAtmosphereComponent gam, GasOverlayData oldTile, MapIndices indices, out GasOverlayData overlayData)
        {
            var tile = gam.GetTile(indices);

            if (tile == null)
            {
                overlayData = default;
                return(false);
            }

            var tileData = new List <GasData>();

            for (byte i = 0; i < Atmospherics.TotalNumberOfGases; i++)
            {
                var gas     = Atmospherics.GetGas(i);
                var overlay = Atmospherics.GetOverlay(i);
                if (overlay == null || tile?.Air == null)
                {
                    continue;
                }

                var moles = tile.Air.Gases[i];

                if (moles < gas.GasMolesVisible)
                {
                    continue;
                }

                var data = new GasData(i, (byte)(MathHelper.Clamp01(moles / gas.GasMolesVisibleMax) * 255));
                tileData.Add(data);
            }

            overlayData = new GasOverlayData(tile !.Hotspot.State, tile.Hotspot.Temperature, tileData.Count == 0 ? null : tileData.ToArray());

            if (overlayData.Equals(oldTile))
            {
                return(false);
            }

            return(true);
        }
示例#6
0
        private void UpdateUserInterface()
        {
            string?error = null;

            // Check if the player is still holding the gas analyzer => if not, don't update
            foreach (var session in _userInterface.SubscribedSessions)
            {
                if (session.AttachedEntity == null)
                {
                    return;
                }

                if (!session.AttachedEntity.TryGetComponent(out IHandsComponent handsComponent))
                {
                    return;
                }

                var activeHandEntity = handsComponent?.GetActiveHand?.Owner;
                if (activeHandEntity == null || !activeHandEntity.TryGetComponent(out GasAnalyzerComponent gasAnalyzer))
                {
                    return;
                }
            }

            var pos = Owner.Transform.GridPosition;

            if (!_checkPlayer && _position.HasValue)
            {
                // Check if position is out of range => don't update
                if (!_position.Value.InRange(_mapManager, pos, SharedInteractionSystem.InteractionRange))
                {
                    return;
                }

                pos = _position.Value;
            }

            var gam  = EntitySystem.Get <AtmosphereSystem>().GetGridAtmosphere(pos.GridID);
            var tile = gam?.GetTile(pos).Air;

            if (tile == null)
            {
                error = "No Atmosphere!";
                _userInterface.SetState(
                    new GasAnalyzerBoundUserInterfaceState(
                        0,
                        0,
                        null,
                        error));
                return;
            }

            var gases = new List <GasEntry>();

            for (int i = 0; i < Atmospherics.TotalNumberOfGases; i++)
            {
                var gas = Atmospherics.GetGas(i);

                if (tile.Gases[i] <= Atmospherics.GasMinMoles)
                {
                    continue;
                }

                gases.Add(new GasEntry(gas.Name, tile.Gases[i], gas.Color));
            }

            _userInterface.SetState(
                new GasAnalyzerBoundUserInterfaceState(
                    tile.Pressure,
                    tile.Temperature,
                    gases.ToArray(),
                    error));
        }