public override void Initialize() { base.Initialize(); SubscribeNetworkEvent <GasOverlayMessage>(HandleGasOverlayMessage); _mapManager.OnGridRemoved += OnGridRemoved; _atmosphereSystem = Get <AtmosphereSystem>(); for (var i = 0; i < Atmospherics.TotalNumberOfGases; i++) { var overlay = _atmosphereSystem.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 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 = _atmosphereSystem.GetGas(i); var overlay = _atmosphereSystem.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); }