private void OnTileChanged(TileChangedEvent ev) { // Only if a atmos-holding tile has been added or removed. // Also, these calls are surprisingly slow. // TODO: Make tiledefmanager cache the IsSpace property, and turn this lookup-through-two-interfaces into // TODO: a simple array lookup, as tile IDs are likely contiguous, and there's at most 2^16 possibilities anyway. if (!((ev.OldTile.IsSpace(_tileDefinitionManager) && !ev.NewTile.IsSpace(_tileDefinitionManager)) || (!ev.OldTile.IsSpace(_tileDefinitionManager) && ev.NewTile.IsSpace(_tileDefinitionManager))) || _atmosphereSystem.HasAtmosphere(ev.Entity)) { return; } if (!TryComp <PhysicsComponent>(ev.Entity, out var physics)) { return; } // We can't actually count how many tiles there are efficiently, so instead estimate with the mass. if (physics.Mass / ShuttleSystem.TileMassMultiplier >= 7.0f) { AddComp <GridAtmosphereComponent>(ev.Entity); Logger.InfoS("atmos", $"Giving grid {ev.Entity} GridAtmosphereComponent."); } // It's not super important to remove it should the grid become too small again. // If explosions ever gain the ability to outright shatter grids, do rethink this. }