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)OnUnitReady); EventManager.Instance.Register(EventManager.EventName.INFIGHT_UNIT_REMOVE, (Action)OnUnitRemove); EventManager.Instance.Register(EventManager.EventName.INFIGHT_UNIT_CELLINDEX_CHANGE, (Action)OnUnitCellChange); EventManager.Instance.Register(EventManager.EventName.LevelUnitSelect, (Action)OnSelectCharacter); EventManager.Instance.Register(EventManager.EventName.LevelUnitUnSelect, (Action)OnUnSelectCharacter); EventManager.Instance.Register(EventManager.EventName.INFIGHT_ENTER_UNITCONTAINER, (Action)_OnEnterUnitContainer); EventManager.Instance.Register(EventManager.EventName.INFIGHT_EXIT_UNITCONTAINER, (Action)_OnExitUnitContainer); EventManager.Instance.Register(EventManager.EventName.INFIGHT_SKILL_END_PAUSE, OnSkillPauseEnd); } public void UnregisterEvents() { EventManager.Instance.Unregister(EventManager.EventName.INFIGHT_UNIT_READY, (Action)OnUnitReady); EventManager.Instance.Unregister(EventManager.EventName.INFIGHT_UNIT_REMOVE, (Action)OnUnitRemove); EventManager.Instance.Unregister(EventManager.EventName.INFIGHT_UNIT_CELLINDEX_CHANGE, (Action)OnUnitCellChange); EventManager.Instance.Unregister(EventManager.EventName.LevelUnitSelect, (Action)OnSelectCharacter); EventManager.Instance.Unregister(EventManager.EventName.LevelUnitUnSelect, (Action)OnUnSelectCharacter); EventManager.Instance.Unregister(EventManager.EventName.INFIGHT_ENTER_UNITCONTAINER, (Action)_OnEnterUnitContainer); EventManager.Instance.Unregister(EventManager.EventName.INFIGHT_EXIT_UNITCONTAINER, (Action)_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}"); } } }