63 lines
2.1 KiB
C#
63 lines
2.1 KiB
C#
using System;
|
|
using Cysharp.Threading.Tasks;
|
|
using UnityEngine.Pool;
|
|
|
|
namespace DanieleMarotta.RiversongCodeShowcase
|
|
{
|
|
public class RawResourcesRemovalSystem : GameSystem, IInitializable, IDisposable
|
|
{
|
|
[InjectService]
|
|
private ISignalBus _signalBus;
|
|
|
|
[InjectService]
|
|
private World _world;
|
|
|
|
[InjectService]
|
|
private GameConfig _config;
|
|
|
|
public RawResourcesRemovalSystem(IServiceLocator serviceLocator) : base(serviceLocator)
|
|
{
|
|
}
|
|
|
|
public UniTask InitializeAsync()
|
|
{
|
|
_signalBus.Subscribe<BuildingPlacementAnimationStartedSignal>(OnBuildingPlacementAnimationStarted);
|
|
_signalBus.Subscribe<RoadTileUpdatedSignal>(OnRoadTileUpdated);
|
|
_signalBus.Subscribe<DoDeleteToolSignal>(OnDoDeleteTool);
|
|
|
|
return UniTask.CompletedTask;
|
|
}
|
|
|
|
public void Dispose()
|
|
{
|
|
_signalBus.Unsubscribe<BuildingPlacementAnimationStartedSignal>(OnBuildingPlacementAnimationStarted);
|
|
_signalBus.Unsubscribe<RoadTileUpdatedSignal>(OnRoadTileUpdated);
|
|
_signalBus.Unsubscribe<DoDeleteToolSignal>(OnDoDeleteTool);
|
|
}
|
|
|
|
private void OnBuildingPlacementAnimationStarted(BuildingPlacementAnimationStartedSignal signal)
|
|
{
|
|
RemoveResourceNodesAt(signal.Rect);
|
|
}
|
|
|
|
private void OnRoadTileUpdated(RoadTileUpdatedSignal signal)
|
|
{
|
|
RemoveResourceNodesAt(TileRect.OneTile(signal.Tile));
|
|
}
|
|
|
|
private void OnDoDeleteTool(DoDeleteToolSignal signal)
|
|
{
|
|
RemoveResourceNodesAt(signal.Rect);
|
|
}
|
|
|
|
private void RemoveResourceNodesAt(TileRect rect)
|
|
{
|
|
using var _ = ListPool<ResourceNode>.Get(out var deletedResourceNodes);
|
|
|
|
_world.RawResources.DeleteResourceNodes(rect, _config.GeneralSettings.BaseElevation, deletedResourceNodes);
|
|
if (deletedResourceNodes.Count == 0) return;
|
|
|
|
_signalBus.Raise(new RawResourcesRemovedSignal(deletedResourceNodes, RawResourcesRemovedSignal.RemovalReason.PlayerAction));
|
|
}
|
|
}
|
|
} |