NLDClient-yudde/ProjectNLD/Assets/Code/Scripts/Gameplay/Area/Ready/ReadyAreaManager.cs

281 lines
9.2 KiB
C#

using System.Collections.Generic;
using Framework;
using Gameplay.Character;
using Gameplay.Fight.Capture;
using Gameplay.Level;
using Gameplay.Unit;
using Gameplay.Utils;
using Gameplay.Vehicle.Impl;
using UnityEngine;
namespace Gameplay.Area.Ready
{
public class ReadyAreaManager
{
public Map _map;
private EReadyAreaStatus _areaStatus;
private List<int> _mapReadyCellIndexs;
public List<int> mapReadyCellIndexs => _mapReadyCellIndexs;
private List<int> _vehicleAroundCellIndexs;
private int _lastVehicleCellIndex;
public bool isShow { get; private set; }
public Color areaColor { get; private set; }
private NormalVehicle _followVehicle;
public bool isVehicleBuffActive;
private bool _lastVehicleBuffActive;
public ReadyAreaManager(Map map)
{
_map = map;
isShow = false;
// TODO: 这里应该从配置中读取
areaColor = ColorEx.FromStr("#FF960072");
_InitReadyAreaFromLevel();
}
public void Init()
{
EventManager.Instance.Register<CaptureInst>(EventManager.EventName.INFIGHT_CAPTURE_FINSIHED, _OnCaptureArea);
}
public void Dispose()
{
EventManager.Instance.Unregister<CaptureInst>(EventManager.EventName.INFIGHT_CAPTURE_FINSIHED, _OnCaptureArea);
}
private void _InitReadyAreaFromLevel()
{
_mapReadyCellIndexs = new List<int>();
var levelData = LevelManager.Instance.CurrentLevel.GetLevelData();
var areaId = levelData.preparingRegionId;
var area = _map.MapData.GetRegion(areaId);
if (area == null)
{
DebugUtil.LogError("读取准备区域失败");
return;
}
var cellIndexs = area.positions;
foreach (var cellIndex in cellIndexs)
{
if (_mapReadyCellIndexs.Contains(cellIndex))
{
continue;
}
_mapReadyCellIndexs.Add(cellIndex);
}
}
private void _OnCaptureArea(CaptureInst inst)
{
if (_mapReadyCellIndexs.Contains(inst.cellIndex))
{
return;
}
_mapReadyCellIndexs.Add(inst.cellIndex);
}
private void _UpdateWithVehicle()
{
// 需要更新载具周边区域
if (_followVehicle == null)
{
return;
}
var currentVehicleCellIndex = _followVehicle.transData.cellIndex;
if (currentVehicleCellIndex == _lastVehicleCellIndex)
{
return;
}
_lastVehicleCellIndex = currentVehicleCellIndex;
for (int i = 0; i < _vehicleAroundCellIndexs.Count; i++)
{
var oldIndex = _vehicleAroundCellIndexs[i];
if (_areaStatus == EReadyAreaStatus.Both)
{
if (_mapReadyCellIndexs.Contains(oldIndex))
{
continue;
}
}
_map.SetBlockColor(oldIndex, false, areaColor);
}
_vehicleAroundCellIndexs = AreaManager.instance.GetCellIndexsAround(_lastVehicleCellIndex, _followVehicle.aroundReadyRange);
_map.SetBlocksColor(_vehicleAroundCellIndexs, true, areaColor);
}
private void _UpdateOnlyMap()
{
if (isVehicleBuffActive)
{
_UpdateWithVehicle();
}
else
{
if (_lastVehicleBuffActive != isVehicleBuffActive)
{
_lastVehicleBuffActive = isVehicleBuffActive;
// 移除载具区域显示
for (int i = 0; i < _vehicleAroundCellIndexs.Count; i++)
{
var oldIndex = _vehicleAroundCellIndexs[i];
if (_mapReadyCellIndexs.Contains(oldIndex))
{
continue;
}
_map.SetBlockColor(oldIndex, false, areaColor);
}
}
}
}
public void LogicUpdate(float dt)
{
if (!isShow) return;
switch (_areaStatus)
{
case EReadyAreaStatus.FromMap:
_UpdateOnlyMap();
break;
case EReadyAreaStatus.Both:
case EReadyAreaStatus.AroundVehicle:
_UpdateWithVehicle();
break;
}
}
public bool CheckIsInReadyArea(int cellIndex)
{
switch (_areaStatus)
{
case EReadyAreaStatus.FromMap:
if (_mapReadyCellIndexs.Contains(cellIndex))
{
return true;
}
if (isVehicleBuffActive)
{
if (_vehicleAroundCellIndexs.Contains(cellIndex))
{
return true;
}
}
break;
case EReadyAreaStatus.AroundVehicle:
if (_followVehicle == null)
{
return false;
}
if (_vehicleAroundCellIndexs.Contains(cellIndex))
{
return true;
}
break;
case EReadyAreaStatus.Both:
if (_mapReadyCellIndexs.Contains(cellIndex))
{
return true;
}
if (_followVehicle == null)
{
return false;
}
if (_vehicleAroundCellIndexs.Contains(cellIndex))
{
return true;
}
break;
}
return false;
}
public void ShowReadyArea(EReadyAreaStatus showStatus = EReadyAreaStatus.FromMap)
{
if (isShow)
{
if (_areaStatus == showStatus)
{
// 重复的调用
}
else
{
// 需要切换显示状态
HideReadyArea();
}
}
isShow = true;
_areaStatus = showStatus;
switch (_areaStatus)
{
case EReadyAreaStatus.FromMap:
_map.SetBlocksColor(_mapReadyCellIndexs, true, areaColor);
if (isVehicleBuffActive)
{
_lastVehicleBuffActive = true;
_GetCurrentVehicle();
_map.SetBlocksColor(_vehicleAroundCellIndexs, true, areaColor);
}
_lastVehicleBuffActive = false;
break;
case EReadyAreaStatus.AroundVehicle:
_GetCurrentVehicle();
_map.SetBlocksColor(_vehicleAroundCellIndexs, true, areaColor);
break;
case EReadyAreaStatus.Both:
_map.SetBlocksColor(_mapReadyCellIndexs, true, areaColor);
_GetCurrentVehicle();
_map.SetBlocksColor(_vehicleAroundCellIndexs, true, areaColor);
break;
}
}
private void _GetCurrentVehicle()
{
_followVehicle = GameUnitManager.instance.vehicleManager.GetVehicleByTroop(ETroopsId.Self);
if (_followVehicle == null)
{
DebugUtil.LogError("没有找到己方载具");
_vehicleAroundCellIndexs = new List<int>();
return;
}
_lastVehicleCellIndex = _followVehicle.transData.cellIndex;
_vehicleAroundCellIndexs = AreaManager.instance.GetCellIndexsAround(_lastVehicleCellIndex, _followVehicle.aroundReadyRange);
}
public void HideReadyArea()
{
if (!isShow)
{
return;
}
isShow = false;
switch (_areaStatus)
{
case EReadyAreaStatus.FromMap:
_map.SetBlocksColor(_mapReadyCellIndexs, false, areaColor);
if (isVehicleBuffActive)
{
_map.SetBlocksColor(_vehicleAroundCellIndexs, false, areaColor);
}
break;
case EReadyAreaStatus.AroundVehicle:
_map.SetBlocksColor(_vehicleAroundCellIndexs, false, areaColor);
break;
case EReadyAreaStatus.Both:
_map.SetBlocksColor(_mapReadyCellIndexs, false, areaColor);
_map.SetBlocksColor(_vehicleAroundCellIndexs, false, areaColor);
break;
}
}
}
}