Files

72 lines
3.0 KiB
C#
Raw Permalink Normal View History

2026-07-18 03:16:20 -04:00
using System;
using System.Collections.Generic;
using Cielonos.MainGame.Characters;
using SLSUtilities.General;
using SoftCircuits.Collections;
using UnityEngine;
namespace Cielonos.MainGame
{
public partial class AttackAreaBase
{
/// <summary>
/// 统一管理 AttackArea 生命周期内的事件,避免事件数据散落在不同子模块中。
/// </summary>
public class EventSubmodule : AttackAreaSubmoduleBase
{
/// <summary>
/// 每次有效命中都会执行的通用命中事件,适合处理 Buff、印记、装备联动等命中后逻辑。
/// </summary>
public readonly List<Action<CharacterBase, Vector3>> onHit =
new List<Action<CharacterBase, Vector3>>();
/// <summary>
/// 只在指定 hitIndex 命中时执行的事件,用于多段攻击中某一段具有特殊效果的情况。
/// </summary>
public readonly SortedList<int, Action<CharacterBase, Vector3>> onIndexedHit =
new SortedList<int, Action<CharacterBase, Vector3>>();
/// <summary>
/// 成功触发 Breakthrough 时执行的事件,使用 key + priority 支持同一区域内多来源的有序处理。
/// </summary>
public readonly OrderedDictionary<string, PrioritizedAction<CharacterBase, Vector3>> onBreakthrough =
new OrderedDictionary<string, PrioritizedAction<CharacterBase, Vector3>>();
/// <summary>
/// 单次攻击结算完成后执行的事件,传入完整 Attack.Result适合根据 Outcome 播放反馈或触发后续机制。
/// </summary>
public readonly OrderedDictionary<string, PrioritizedAction<CharacterBase, Attack.Result>> onAttackFinished =
new OrderedDictionary<string, PrioritizedAction<CharacterBase, Attack.Result>>();
public EventSubmodule(AttackAreaBase owner) : base(owner)
{
}
public void InvokeHitEvents(CharacterBase target, Vector3 hitPosition, int hitIndex, bool canTriggerHitEvent)
{
if (!canTriggerHitEvent) return;
foreach (Action<CharacterBase, Vector3> hitEvent in onHit)
{
hitEvent.Invoke(target, hitPosition);
}
if (onIndexedHit.TryGetValue(hitIndex, out Action<CharacterBase, Vector3> action))
{
action.Invoke(target, hitPosition);
}
}
public void InvokeBreakthrough(CharacterBase target, Vector3 hitPosition)
{
onBreakthrough.Invoke(target, hitPosition);
}
public void InvokeAttackFinished(CharacterBase target, Attack.Result attackResult)
{
if (target == null || attackResult == null || attackResult.isReactionOnlyCheck) return;
onAttackFinished.Invoke(target, attackResult);
}
}
}
}