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

159 lines
5.9 KiB
C#

using System;
using Framework;
using Gameplay.Common;
using Gameplay.Unit;
using Gameplay.Level;
namespace Gameplay.Area
{
public class AreaEventHandler : IEventHandler
{
private readonly AreaManager _areaManager;
public AreaEventHandler(AreaManager areaManager)
{
_areaManager = areaManager;
}
public void RegisterEvents()
{
EventManager.Instance.Register(EventManager.EventName.INFIGHT_UNIT_READY, (Action<GameUnit>)OnUnitReady);
EventManager.Instance.Register(EventManager.EventName.INFIGHT_UNIT_REMOVE, (Action<GameUnit>)OnUnitRemove);
EventManager.Instance.Register(EventManager.EventName.INFIGHT_UNIT_CELLINDEX_CHANGE, (Action<GameUnit>)OnUnitCellChange);
EventManager.Instance.Register(EventManager.EventName.LevelUnitSelect, (Action<GameUnit>)OnSelectCharacter);
EventManager.Instance.Register(EventManager.EventName.LevelUnitUnSelect, (Action<GameUnit>)OnUnSelectCharacter);
EventManager.Instance.Register(EventManager.EventName.INFIGHT_ENTER_UNITCONTAINER, (Action<GameUnit>)_OnEnterUnitContainer);
EventManager.Instance.Register(EventManager.EventName.INFIGHT_EXIT_UNITCONTAINER, (Action<EDExitUnitContainer>)_OnExitUnitContainer);
EventManager.Instance.Register(EventManager.EventName.INFIGHT_SKILL_END_PAUSE, OnSkillPauseEnd);
}
public void UnregisterEvents()
{
EventManager.Instance.Unregister(EventManager.EventName.INFIGHT_UNIT_READY, (Action<GameUnit>)OnUnitReady);
EventManager.Instance.Unregister(EventManager.EventName.INFIGHT_UNIT_REMOVE, (Action<GameUnit>)OnUnitRemove);
EventManager.Instance.Unregister(EventManager.EventName.INFIGHT_UNIT_CELLINDEX_CHANGE, (Action<GameUnit>)OnUnitCellChange);
EventManager.Instance.Unregister(EventManager.EventName.LevelUnitSelect, (Action<GameUnit>)OnSelectCharacter);
EventManager.Instance.Unregister(EventManager.EventName.LevelUnitUnSelect, (Action<GameUnit>)OnUnSelectCharacter);
EventManager.Instance.Unregister(EventManager.EventName.INFIGHT_ENTER_UNITCONTAINER, (Action<GameUnit>)_OnEnterUnitContainer);
EventManager.Instance.Unregister(EventManager.EventName.INFIGHT_EXIT_UNITCONTAINER, (Action<EDExitUnitContainer>)_OnExitUnitContainer);
EventManager.Instance.Unregister(EventManager.EventName.INFIGHT_SKILL_END_PAUSE, OnSkillPauseEnd);
}
public void Dispose()
{
UnregisterEvents();
}
private void OnUnitReady(GameUnit unit)
{
var bornCellIndex = unit.transData.cellIndex;
if (AreaManager.ENABLE_LOG)
Log($"Unit: {unit.GetID()} Ready at: {bornCellIndex}");
var getUnits = _areaManager.GetUnitsByCellIndex(bornCellIndex);
if (getUnits.Contains(unit))
{
return;
}
_areaManager._AddUnitToCellIndex(bornCellIndex, unit);
}
private void OnUnitRemove(GameUnit unit)
{
var cellIndex = unit.transData.cellIndex;
if (AreaManager.ENABLE_LOG)
Log($"Unit: {unit.GetID()} Remove at: {cellIndex}");
_areaManager._OnUnitRemove(unit);
}
private void OnUnitCellChange(GameUnit unit)
{
var lastCellIndex = unit.transData.lastCellIndex;
var newCellIndex = unit.transData.cellIndex;
if (lastCellIndex != -1)
{
if (_areaManager._cellIndex2Units.TryGetValue(lastCellIndex, out var unitList))
{
unitList.Remove(unit);
}
}
_areaManager._AddUnitToCellIndex(newCellIndex, unit);
if (AreaManager.ENABLE_LOG)
Log($"Unit CellIndexChange:{unit.GetID()} from:{lastCellIndex} to {newCellIndex}");
}
private void OnSelectCharacter(GameUnit c)
{
if (!LevelManager.Instance.CurrentLevel.IsInBattle())
{
return;
}
_areaManager.attackArea.SetOwner(c);
_areaManager.moveAreaView.Show(c);
}
private void OnUnSelectCharacter(GameUnit c)
{
if (!LevelManager.Instance.CurrentLevel.IsInBattle())
{
return;
}
_areaManager.attackArea.HideArea();
_areaManager.moveAreaView.Hide();
}
private void _OnEnterUnitContainer(GameUnit unit)
{
var cellIndex = unit.transData.cellIndex;
var unitList = _areaManager._cellIndex2Units[cellIndex];
unitList.Remove(unit);
if (AreaManager.ENABLE_LOG)
Log($"Unit: {unit.GetID()} Enter UnitContainer at:{cellIndex}");
}
private void _OnExitUnitContainer(EDExitUnitContainer ed)
{
var unit = ed.unit;
var bornCellIndex = unit.transData.cellIndex;
if (AreaManager.ENABLE_LOG)
Log($"Unit: {unit.GetID()} Exit UnitContainer at:{bornCellIndex}");
var getUnits = _areaManager.GetUnitsByCellIndex(bornCellIndex);
if (getUnits.Contains(unit))
{
return;
}
_areaManager._AddUnitToCellIndex(bornCellIndex, unit);
}
private void OnSkillPauseEnd()
{
if (_areaManager.attackArea == null)
{
DebugUtil.LogError("AttackArea为空");
return;
}
_areaManager.attackArea.CancelForce();
}
private void Log(string str)
{
if (!AreaManager.ENABLE_LOG) return;
DebugUtil.Log($"[AreaManager] {str}");
}
}
}