Files
Cielonos/Assets/Scripts/MainGame/Items/Base/ItemBase.cs
SoulliesOfficial 2a2aa728d5 切换主武器
2025-12-23 19:47:06 -05:00

160 lines
5.8 KiB
C#

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;
[Title("Data")]
public List<FuncAnimData> fullBodyFuncAnims = new List<FuncAnimData>();
[HideInInspector]
private List<string> registeredFunctionNames = new List<string>();
[FormerlySerializedAs("objectData")]
public ViewObjectData viewObjectData;
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;
[Title("View Objects")]
public Dictionary<string, ItemViewObject> viewObjects = new Dictionary<string, ItemViewObject>();
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<RuntimeFuncAnim>[] functions)
{
foreach (Action<RuntimeFuncAnim> 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.");
}
}
}
}
}