using System; using Colosseum.Abnormalities; using Colosseum.AI; using Colosseum.Combat; using Colosseum.Enemy; using Colosseum.Player; using Unity.Behavior; using Unity.Properties; using UnityEngine; using Action = Unity.Behavior.Action; /// /// 충전 차단에 실패하여 패턴이 완료되었을 때, 전체 플레이어에게 범위 효과를 적용합니다. /// 기존 BossCombatBehaviorContext.ExecuteSignatureFailure()의 BT 노드 이관 버전입니다. /// [Serializable, GeneratePropertyBag] [NodeDescription( name: "Signature Failure Effects", story: "패턴 완료 범위 효과 적용", category: "Action", id: "c3d4e5f6-1111-2222-3333-777788889999")] public partial class SignatureFailureEffectsAction : Action { private BossCombatBehaviorContext combatBehaviorContext; protected override Status OnStart() { combatBehaviorContext = GameObject.GetComponent(); if (combatBehaviorContext == null) { Debug.LogWarning("[SignatureFailureEffects] BossCombatBehaviorContext를 찾을 수 없습니다."); return Status.Failure; } ApplyFailureEffects(); return Status.Success; } private void ApplyFailureEffects() { float failureDamage = combatBehaviorContext.SignatureFailureDamage; AbnormalityData failureAbnormality = combatBehaviorContext.SignatureFailureAbnormality; float knockbackRadius = combatBehaviorContext.SignatureFailureKnockbackRadius; float downRadius = combatBehaviorContext.SignatureFailureDownRadius; float knockbackSpeed = combatBehaviorContext.SignatureFailureKnockbackSpeed; float knockbackDuration = combatBehaviorContext.SignatureFailureKnockbackDuration; float downDuration = combatBehaviorContext.SignatureFailureDownDuration; PlayerNetworkController[] players = UnityEngine.Object.FindObjectsByType(FindObjectsSortMode.None); for (int i = 0; i < players.Length; i++) { PlayerNetworkController player = players[i]; if (player == null || player.IsDead || !player.gameObject.activeInHierarchy) continue; GameObject target = player.gameObject; if (!combatBehaviorContext.IsValidHostileTarget(target)) continue; player.TakeDamage(failureDamage, GameObject); if (failureAbnormality != null) { AbnormalityManager targetAbnormalityManager = target.GetComponent(); targetAbnormalityManager?.ApplyAbnormality(failureAbnormality, GameObject); } HitReactionController hitReactionController = target.GetComponent(); if (hitReactionController == null) continue; float distance = Vector3.Distance(GameObject.transform.position, target.transform.position); if (distance <= downRadius) { hitReactionController.ApplyDown(downDuration); continue; } if (distance > knockbackRadius) continue; Vector3 knockbackDirection = target.transform.position - GameObject.transform.position; knockbackDirection.y = 0f; if (knockbackDirection.sqrMagnitude < 0.0001f) { knockbackDirection = GameObject.transform.forward; } hitReactionController.ApplyKnockback(knockbackDirection.normalized * knockbackSpeed, knockbackDuration); } CombatBalanceTracker.RecordBossEvent("집행 개시 실패"); } }