using System; using System.Collections.Generic; using Cielonos.MainGame.Characters; using Cielonos.MainGame.FunctionalAnimation; using Sirenix.OdinInspector; using SLSFramework.WwiseAssistance; using SLSUtilities.FunctionalAnimation; using UnityEngine; using UnityEngine.Serialization; namespace Cielonos.MainGame.Inventory { public abstract partial class ItemBase : SerializedMonoBehaviour { public Player player => MainGameManager.Instance.player; protected PlayerAnimationSubcontroller animationSc => player.animationSc; protected FunctionalAnimationSubmodule fullBodyFuncAnimSm => animationSc.fullBodyFuncAnimSm; public ItemViewObject viewObject; [Title("Data")] public List fullBodyFuncAnims = new List(); [HideInInspector] private List registeredFunctionNames = new List(); public VFXData vfxData; public ComboData comboData; public AttackData attackData; public FunctionData functionData; public AmmoData ammoData; public BlockData blockData; [Title("Audio")] public AudioContainer audioContainer; [Title("Submodules")] public ComboSubmodule comboSm; public FunctionSubmodule functionSm; public AmmoSubmodule ammoSm; [Title("Subcontrollers")] public FeedbackSubcontroller feedbackSc; protected virtual void Update() { functionSm.Update(player.selfTimeSm.DeltaTime); } } public partial class ItemBase { public virtual void Initialize() { vfxData.Initialize(player); comboSm = new ComboSubmodule(this, comboData); functionSm = new FunctionSubmodule(this, functionData); ammoSm = new AmmoSubmodule(this, ammoData); } } public partial class ItemBase { protected RuntimeFuncAnim PlayTargetedAnimation(string animationName, CharacterBase target = null, float adsorptionMinDistance = 1f, bool autoRotate = true, FunctionalAnimationSubmodule funcAnimSm = null, float animationSpeedMultiplier = 1f, float transitionDuration = 0.1f, bool isNormalizedTransition = false) { funcAnimSm ??= fullBodyFuncAnimSm; if (funcAnimSm.Play(animationName, animationSpeedMultiplier, transitionDuration, isNormalizedTransition)) { float actionCoolDownTime = fullBodyFuncAnimSm.currentData.Interval(IntervalType.ActionDisruption).StartTime / fullBodyFuncAnimSm.currentPlaySpeedMultiplier; comboSm?.SuspendThenSetup(actionCoolDownTime); //GameManager.Player.eventController.GeneralAttackEvents.InvokeAllEvents(); if (target != null) { if(autoRotate) player.landMovementSc.TurnToTarget(target); funcAnimSm.currentRuntimeFuncAnim.AddUpdateUntilEvent(new SetRootAdsorptionAdjustment(target, adsorptionMinDistance)); } return funcAnimSm.currentRuntimeFuncAnim; } return null; } } public partial class ItemBase { public void RegisterFullBodyFuncAnims() { foreach (FuncAnimData funcAnim in fullBodyFuncAnims) { player.animationSc.fullBodyFuncAnimSm.Add(funcAnim); } } protected virtual void RegisterFunctionsToAnimSc(params Action[] functions) { foreach (Action function in functions) { string functionName = function.Method.Name; if (!player.animationSc.registeredFunctions.TryAdd(functionName, anim => function())) { Debug.LogWarning($"Function {functionName} is already registered."); } else { registeredFunctionNames.Add(functionName); } } } protected virtual void RegisterFunctionsToAnimSc(params Action[] functions) { foreach (Action function in functions) { string functionName = function.Method.Name; if (!player.animationSc.registeredFunctions.TryAdd(functionName, function)) { Debug.LogWarning($"Function {functionName} is already registered."); } else { registeredFunctionNames.Add(functionName); } } } protected void RemoveAllRegisteredFunctions() { foreach (string functionName in registeredFunctionNames) { if (!player.animationSc.registeredFunctions.Remove(functionName)) { Debug.LogWarning($"Function {functionName} is not found."); } } registeredFunctionNames.Clear(); } protected virtual void RemoveFunctionsFromAnimSc(params Action[] functions) { foreach (Action function in functions) { string functionName = function.Method.Name; if (!player.animationSc.registeredFunctions.Remove(functionName)) { Debug.LogWarning($"Function {functionName} is not found."); } } } } }