Files
UltimateFishing/Assets/Scripts/Assembly-CSharp/vp_Activity.cs
2026-02-21 16:45:37 +08:00

327 lines
6.1 KiB
C#

using System;
using System.Collections.Generic;
using System.Reflection;
using UnityEngine;
public class vp_Activity : vp_Event
{
public delegate void Callback();
public delegate bool Condition();
public Callback StartCallbacks;
public Callback StopCallbacks;
public Condition StartConditions;
public Condition StopConditions;
public Callback FailStartCallbacks;
public Callback FailStopCallbacks;
protected vp_Timer.Handle m_ForceStopTimer = new vp_Timer.Handle();
protected object m_Argument;
protected bool m_Active;
public float NextAllowedStartTime;
public float NextAllowedStopTime;
private float m_MinPause;
private float m_MinDuration;
private float m_MaxDuration = -1f;
public float MinPause
{
get
{
return m_MinPause;
}
set
{
m_MinPause = Mathf.Max(0f, value);
}
}
public float MinDuration
{
get
{
return m_MinDuration;
}
set
{
m_MinDuration = Mathf.Max(0.001f, value);
if (m_MaxDuration != -1f && m_MinDuration > m_MaxDuration)
{
m_MinDuration = m_MaxDuration;
Debug.LogWarning("Warning: (vp_Activity) Tried to set MinDuration longer than MaxDuration for '" + base.EventName + "'. Capping at MaxDuration.");
}
}
}
public float AutoDuration
{
get
{
return m_MaxDuration;
}
set
{
if (value == -1f)
{
m_MaxDuration = value;
return;
}
m_MaxDuration = Mathf.Max(0.001f, value);
if (m_MaxDuration < m_MinDuration)
{
m_MaxDuration = m_MinDuration;
Debug.LogWarning("Warning: (vp_Activity) Tried to set MaxDuration shorter than MinDuration for '" + base.EventName + "'. Capping at MinDuration.");
}
}
}
public object Argument
{
get
{
if (m_ArgumentType == null)
{
Debug.LogError(string.Concat("Error: (", this, ") Tried to fetch argument from '", base.EventName, "' but this activity takes no parameters."));
return null;
}
return m_Argument;
}
set
{
if (m_ArgumentType == null)
{
Debug.LogError(string.Concat("Error: (", this, ") Tried to set argument for '", base.EventName, "' but this activity takes no parameters."));
}
else
{
m_Argument = value;
}
}
}
public bool Active
{
get
{
return m_Active;
}
set
{
if (value && !m_Active)
{
m_Active = true;
StartCallbacks();
NextAllowedStopTime = Time.time + m_MinDuration;
if (m_MaxDuration > 0f)
{
vp_Timer.In(m_MaxDuration, delegate
{
Stop();
}, m_ForceStopTimer);
}
}
else if (!value && m_Active)
{
m_Active = false;
StopCallbacks();
NextAllowedStartTime = Time.time + m_MinPause;
m_Argument = null;
}
}
}
public vp_Activity(string name)
: base(name)
{
InitFields();
}
protected static void Empty()
{
}
protected static bool AlwaysOK()
{
return true;
}
protected override void InitFields()
{
m_DelegateTypes = new Type[6]
{
typeof(Callback),
typeof(Callback),
typeof(Condition),
typeof(Condition),
typeof(Callback),
typeof(Callback)
};
m_Fields = new FieldInfo[6]
{
GetType().GetField("StartCallbacks"),
GetType().GetField("StopCallbacks"),
GetType().GetField("StartConditions"),
GetType().GetField("StopConditions"),
GetType().GetField("FailStartCallbacks"),
GetType().GetField("FailStopCallbacks")
};
StoreInvokerFieldNames();
m_DefaultMethods = new MethodInfo[6]
{
GetType().GetMethod("Empty"),
GetType().GetMethod("Empty"),
GetType().GetMethod("AlwaysOK"),
GetType().GetMethod("AlwaysOK"),
GetType().GetMethod("Empty"),
GetType().GetMethod("Empty")
};
Prefixes = new Dictionary<string, int>
{
{ "OnStart_", 0 },
{ "OnStop_", 1 },
{ "CanStart_", 2 },
{ "CanStop_", 3 },
{ "OnFailStart_", 4 },
{ "OnFailStop_", 5 }
};
StartCallbacks = Empty;
StopCallbacks = Empty;
StartConditions = AlwaysOK;
StopConditions = AlwaysOK;
FailStartCallbacks = Empty;
FailStopCallbacks = Empty;
}
public override void Register(object t, string m, int v)
{
AddExternalMethodToField(t, m_Fields[v], m, m_DelegateTypes[v]);
Refresh();
}
public override void Unregister(object t)
{
RemoveExternalMethodFromField(t, m_Fields[0]);
RemoveExternalMethodFromField(t, m_Fields[1]);
RemoveExternalMethodFromField(t, m_Fields[2]);
RemoveExternalMethodFromField(t, m_Fields[3]);
RemoveExternalMethodFromField(t, m_Fields[4]);
RemoveExternalMethodFromField(t, m_Fields[5]);
Refresh();
}
public bool TryStart(bool startIfAllowed = true)
{
if (m_Active)
{
return false;
}
if (Time.time < NextAllowedStartTime)
{
m_Argument = null;
return false;
}
Delegate[] invocationList = StartConditions.GetInvocationList();
for (int i = 0; i < invocationList.Length; i++)
{
Condition condition = (Condition)invocationList[i];
if (!condition())
{
m_Argument = null;
if (startIfAllowed)
{
FailStartCallbacks();
}
return false;
}
}
if (startIfAllowed)
{
Active = true;
}
return true;
}
public bool TryStop(bool stopIfAllowed = true)
{
if (!m_Active)
{
return false;
}
if (Time.time < NextAllowedStopTime)
{
return false;
}
Delegate[] invocationList = StopConditions.GetInvocationList();
for (int i = 0; i < invocationList.Length; i++)
{
Condition condition = (Condition)invocationList[i];
if (!condition())
{
if (stopIfAllowed)
{
FailStopCallbacks();
}
return false;
}
}
if (stopIfAllowed)
{
Active = false;
}
return true;
}
public void Start(float forcedActiveDuration = 0f)
{
Active = true;
if (forcedActiveDuration > 0f)
{
NextAllowedStopTime = Time.time + forcedActiveDuration;
}
}
public void Stop(float forcedPauseDuration = 0f)
{
Active = false;
if (forcedPauseDuration > 0f)
{
NextAllowedStartTime = Time.time + forcedPauseDuration;
}
}
public void Disallow(float duration)
{
NextAllowedStartTime = Time.time + duration;
}
}
public class vp_Activity<V> : vp_Activity
{
public vp_Activity(string name)
: base(name)
{
}
public bool TryStart<T>(T argument)
{
if (m_Active)
{
return false;
}
m_Argument = argument;
return TryStart();
}
}