using System.Collections.Generic; using Cielonos.MainGame.Characters; using SLSUtilities.General; using UnityEngine; namespace Cielonos.MainGame.Inventory.Collections { public partial class FutureWand : MainWeaponBase { private bool _isHoldingAttack; public CharacterBase currentTarget; private NormalArea _activeSpinArea; private Transform Muzzle => viewObjects["Wand"].functionalParts["Muzzle"].transform; public override void OnEquipped() { base.OnEquipped(); RegisterFunctionsToAnimSc(); viewObjects["Wand"].SetFadeAnim(0.5f); // 订阅玩家受击事件,在受击时中断施法并召回 SpinArea player.eventSm.onGetHit.TryAdd(nameof(FutureWand), new PrioritizedAction(OnPlayerGetHit)); } public override void OnUnequipped() { // 注销受击事件,避免内存泄漏 player.eventSm.onGetHit.Remove(nameof(FutureWand)); RecallActiveSpinArea(); base.OnUnequipped(); } public override void OnSwitchIn() { if(!player.inputSc.IsMoving) PlayTargetedAnimation("Equip"); } public override void OnSwitchOut() { base.OnSwitchOut(); RecallActiveSpinArea(); } public override void OnPrimaryPress() { if (!_isHoldingAttack && player.inputSc.IsHoldingSpecialA) { PlayTargetedAnimation("HoldAttackStart", currentTarget); _isHoldingAttack = true; return; } if (functionSm["LightAttack"].IsAvailable() && fullBodyFuncAnimSm.CheckPlayability()) { comboSm.main.NextCombo("L"); functionSm["LightAttack"].Execute(); currentTarget = CombatManager.EnemySm.GetNearestEnemy(25f); PlayTargetedAnimation("Attack" + comboSm.main.GetCurrentNodeName(), currentTarget, 5f); } } public override void OnPrimaryRelease() { if (_isHoldingAttack) { string animName = player.animationSc.fullBodyFuncAnimSm.currentRuntimeFuncAnim?.animationName; if(animName == "HoldAttackLoop" || animName == "HoldAttackStart") { PlayTargetedAnimation("HoldAttackEnd"); } RecallActiveSpinArea(); } _isHoldingAttack = false; } public override void OnSecondaryPress() { if (_isHoldingAttack) return; if (functionSm["HeavyAttack"].IsAvailable() && fullBodyFuncAnimSm.CheckPlayability()) { comboSm.main.NextCombo("R"); functionSm["HeavyAttack"].Execute(); currentTarget = CombatManager.EnemySm.GetNearestEnemy(25f); PlayTargetedAnimation("Attack" + comboSm.main.GetCurrentNodeName(), currentTarget, 5f); } } } public partial class FutureWand { private void RecallActiveSpinArea() { if (_activeSpinArea?.moveSm is BoomerangMoveSubmodule boomerangSm) { boomerangSm.TriggerReturn(20, 10, float.MaxValue, 0); } } private void OnPlayerGetHit(AttackAreaBase attackArea) { if (_isHoldingAttack) { string animName = player.animationSc.fullBodyFuncAnimSm.currentRuntimeFuncAnim?.animationName; if (animName == "HoldAttackLoop" || animName == "HoldAttackStart") { PlayTargetedAnimation("HoldAttackEnd"); } _isHoldingAttack = false; } RecallActiveSpinArea(); } } }