55 lines
2.0 KiB
C#
55 lines
2.0 KiB
C#
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<Building>.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<Building>.Get(out var providers);
|
|
_buildingSpatialQuery.FindProvidersForStorage(rect, providers);
|
|
|
|
foreach (var provider in providers) _aoeRenderingService.Add(provider.Definition.AoELayer, provider.Rect.Inflate(provider.Definition.Range));
|
|
}
|
|
}
|
|
}
|
|
} |