using UnityEngine.Pool; namespace DanieleMarotta.RiversongCodeShowcase { [UpdateAfter(typeof(EditingStateGameSystem))] public class BuildingAoESystem : GameSystem, IUpdatable { [InjectService] private EditingState _editingState; [InjectService] private UIState _uiState; [InjectService] private IBuildingSpatialQuery _buildingSpatialQuery; [InjectService] private IAoERenderingService _aoeRenderingService; public BuildingAoESystem(IServiceLocator serviceLocator) : base(serviceLocator) { } public void Update() { var tool = _editingState.ActiveTool; if (tool is BuildTool buildTool && buildTool.Preview.IsVisible) AddAoE(buildTool.Building, buildTool.BuildingRect); var selectedBuilding = _uiState.SelectedBuilding; if (selectedBuilding != null) AddAoE(selectedBuilding.Definition, selectedBuilding.Rect); } private void AddAoE(BuildingDefinition definition, TileRect rect) { var range = definition.Range; if (range > 0) _aoeRenderingService.Add(definition.AoELayer, rect.Inflate(range)); if (definition.IsHouse) { using var providersScope = ListPool.Get(out var providers); _buildingSpatialQuery.FindProvidersForHouse(rect, providers); foreach (var provider in providers) _aoeRenderingService.Add(provider.Definition.AoELayer, provider.Rect.Inflate(provider.Definition.Range)); } if (definition.IsStorage) { using var providersScope = ListPool.Get(out var providers); _buildingSpatialQuery.FindProvidersForStorage(rect, providers); foreach (var provider in providers) _aoeRenderingService.Add(provider.Definition.AoELayer, provider.Rect.Inflate(provider.Definition.Range)); } } } }