159 lines
5.9 KiB
C#
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}");
|
|
}
|
|
}
|
|
}
|