TKLR43RQKXB47J2YVVSJ7CAZAJZYOKXSDUXAUOVQMFUN73KZVUVQC
UBKE7KXKA35CBKZLD366TUQXK72GYT7RLPEMMLCR4XC3TLMXD7EQC
CD5FF75KTOBTMVMTMCKMR6F5DFKOF26I5K43ITNHGBI3ZAZHA4RAC
IDXWT3DH3C3X7PP4VVKUZTCGDALW6NH7KREI4E2VFQVMCBJKDMTAC
CG73LGDDWA4UBELKXPUJBNDMGVO3JRE2A6QUNURTJVEEZAJJM6FAC
HUULCHM5GFGZ7GKLCULFHC333LQ3LBI62VKII3YL5O4C5CDGCT4AC
DTKCWM4J7PFNWAAES3RZHQGDA6PTDNX4TZVOXAKF5V7LCZBI3XUAC
L4TF5YRRHYUPEAF72DU2GO3PBK5CXXHPYZB5SX3NRCUN6AQELH2QC
S5OSCH7CRN2YEKVTCTJXNLYR2B3PEGCCBUGTN2M6QOCKBNJR62NAC
E6EFTMXHFWSSFW2JIKT2FM62L2GDNKLZ5B5ZVI4QGIZCZFFAMWWQC
RJXFDWT7OWTX3DQ7SBJFK6M66AQ2LGGIO32QD6G7VTJJS7U2R7XQC
EF6FXKYIVJCURLSC2CLS27FCTECIIIU2EEPI352ZTCIKYKW5VOBQC
K4SCXQID5U75KMYJAUGB5DSKWIFGXTRA2B7PIVWR3XMHPJLWZXXAC
JC4YSSPLLFZVYO7TPBHS6RGGEYAW3I3LF36QK7A3WDDDTM6P3LJAC
62S5AKAC5VGAT4KZYRO4R6XIHO4CCD3RAUHQSW47VEGVEBNZGTGAC
XRWOXKR3MD3O73SH33CWRUYMTS6KVWGN6U2AIKNVNGHN37MY7UYQC
2TVWIUIFZHSTFHGWEXASRH7GPNVPMWGGQVJZ2TKQ5LZK4GPJPQ2AC
R475KN7MR3OG7EBLVNOO7QRIKXDGY2PIDXXV3HW4KBD5QM7B5OJQC
FQZF2IY4T2F7KEVSHMFID35WNAU55CRRDF6XEXZB7PYZH26UGYPQC
YI7M5RWLKUG256YXK6CGZKUPDCNHREU2PGV344L2IV24FF5PHG3AC
ROTMK5LNNK7T5YXVOMUODVMCQWIHPZYOME4WDIAMZJ4VXD7SOEBAC
CXWTEVMUJI7NXVWZKXTQOOIVCMPCXUEB3Q3SGIYYHDVRA3JHNBBAC
JLT7KOJ5QGXMRLXQXOHDTF62W3EGPX7XTHNEYAKGMJKK3V4QUPGQC
HXTSBPAP75A7EC4RKWYQMVPPHPNZFPHUORBZWDHGEB6MPAGI7G7AC
V5E2JXXCUIBCDKY3KGP6BPAKKYMGDWSUIODFQHTUFULY7447S5DAC
3JTZIZGE6WPLZCIWXXLG3SQA2LVSVP26P7U52YBMBTY2VCC6LBLAC
CXQW7UICWDJFL3M44O2XVH6JNCRDGRBMPMYR2LEGFJCANPG4YASAC
VPXUP5WZTVC3OVD73TNKPK43IAGFXGUGCEJT56JM4IT4APYQXUHAC
// Copyright (c) Rotorz Limited. All rights reserved.
// Licensed under the MIT license. See LICENSE file in the project root.
using System;
using UnityEngine;
namespace TypeReferences {
/// <summary>
/// Indicates how selectable classes should be collated in drop-down menu.
/// </summary>
public enum ClassGrouping {
/// <summary>
/// No grouping, just show type names in a list; for instance, "Some.Nested.Namespace.SpecialClass".
/// </summary>
None,
/// <summary>
/// Group classes by namespace and show foldout menus for nested namespaces; for
/// instance, "Some > Nested > Namespace > SpecialClass".
/// </summary>
ByNamespace,
/// <summary>
/// Group classes by namespace; for instance, "Some.Nested.Namespace > SpecialClass".
/// </summary>
ByNamespaceFlat,
/// <summary>
/// Group classes in the same way as Unity does for its component menu. This
/// grouping method must only be used for <see cref="MonoBehaviour"/> types.
/// </summary>
ByAddComponentMenu,
}
/// <summary>
/// Base class for class selection constraints that can be applied when selecting
/// a <see cref="ClassTypeReference"/> with the Unity inspector.
/// </summary>
public abstract class ClassTypeConstraintAttribute : PropertyAttribute {
private ClassGrouping _grouping = ClassGrouping.ByNamespaceFlat;
private bool _allowAbstract = false;
/// <summary>
/// Gets or sets grouping of selectable classes. Defaults to <see cref="ClassGrouping.ByNamespaceFlat"/>
/// unless explicitly specified.
/// </summary>
public ClassGrouping Grouping {
get { return _grouping; }
set { _grouping = value; }
}
/// <summary>
/// Gets or sets whether abstract classes can be selected from drop-down.
/// Defaults to a value of <c>false</c> unless explicitly specified.
/// </summary>
public bool AllowAbstract {
get { return _allowAbstract; }
set { _allowAbstract = value; }
}
/// <summary>
/// Determines whether the specified <see cref="Type"/> satisfies filter constraint.
/// </summary>
/// <param name="type">Type to test.</param>
/// <returns>
/// A <see cref="bool"/> value indicating if the type specified by <paramref name="type"/>
/// satisfies this constraint and should thus be selectable.
/// </returns>
public virtual bool IsConstraintSatisfied(Type type) {
return AllowAbstract || (!type.IsAbstract && !type.ContainsGenericParameters);
}
}
/// <summary>
/// Constraint that allows selection of classes that extend a specific class when
/// selecting a <see cref="ClassTypeReference"/> with the Unity inspector.
/// </summary>
[AttributeUsage(AttributeTargets.Field, AllowMultiple = false)]
public sealed class ClassExtendsAttribute : ClassTypeConstraintAttribute {
/// <summary>
/// Initializes a new instance of the <see cref="ClassExtendsAttribute"/> class.
/// </summary>
public ClassExtendsAttribute() {
}
/// <summary>
/// Initializes a new instance of the <see cref="ClassExtendsAttribute"/> class.
/// </summary>
/// <param name="baseType">Type of class that selectable classes must derive from.</param>
public ClassExtendsAttribute(Type baseType) {
BaseType = baseType;
}
/// <summary>
/// Gets the type of class that selectable classes must derive from.
/// </summary>
public Type BaseType { get; private set; }
/// <inheritdoc/>
public override bool IsConstraintSatisfied(Type type) {
return base.IsConstraintSatisfied(type)
&& BaseType.IsAssignableFrom(type) && type != BaseType;
}
}
/// <summary>
/// Constraint that allows selection of classes that implement a specific interface
/// when selecting a <see cref="ClassTypeReference"/> with the Unity inspector.
/// </summary>
[AttributeUsage(AttributeTargets.Field, AllowMultiple = false)]
public sealed class ClassImplementsAttribute : ClassTypeConstraintAttribute {
/// <summary>
/// Initializes a new instance of the <see cref="ClassImplementsAttribute"/> class.
/// </summary>
public ClassImplementsAttribute() {
}
/// <summary>
/// Initializes a new instance of the <see cref="ClassImplementsAttribute"/> class.
/// </summary>
/// <param name="interfaceType">Type of interface that selectable classes must implement.</param>
public ClassImplementsAttribute(Type interfaceType) {
InterfaceType = interfaceType;
}
/// <summary>
/// Gets the type of interface that selectable classes must implement.
/// </summary>
public Type InterfaceType { get; private set; }
/// <inheritdoc/>
public override bool IsConstraintSatisfied(Type type) {
if (base.IsConstraintSatisfied(type)) {
foreach (var interfaceType in type.GetInterfaces())
if (interfaceType == InterfaceType)
return true;
}
return false;
}
}
}
fileFormatVersion: 2
guid: 264b275c28ca9ab47b1e70d0cb885f43
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
// Copyright (c) Rotorz Limited. All rights reserved.
// Licensed under the MIT license. See LICENSE file in the project root.
using System;
using UnityEngine;
namespace TypeReferences {
/// <summary>
/// Reference to a class <see cref="System.Type"/> with support for Unity serialization.
/// </summary>
[Serializable]
public sealed class ClassTypeReference : ISerializationCallbackReceiver {
public static string GetClassRef(Type type) {
return type != null
? type.FullName + ", " + type.Assembly.GetName().Name
: "";
}
/// <summary>
/// Initializes a new instance of the <see cref="ClassTypeReference"/> class.
/// </summary>
public ClassTypeReference() {
}
/// <summary>
/// Initializes a new instance of the <see cref="ClassTypeReference"/> class.
/// </summary>
/// <param name="assemblyQualifiedClassName">Assembly qualified class name.</param>
public ClassTypeReference(string assemblyQualifiedClassName) {
Type = !string.IsNullOrEmpty(assemblyQualifiedClassName)
? Type.GetType(assemblyQualifiedClassName)
: null;
}
/// <summary>
/// Initializes a new instance of the <see cref="ClassTypeReference"/> class.
/// </summary>
/// <param name="type">Class type.</param>
/// <exception cref="System.ArgumentException">
/// If <paramref name="type"/> is not a class type.
/// </exception>
public ClassTypeReference(Type type) {
Type = type;
}
[SerializeField]
private string _classRef;
#region ISerializationCallbackReceiver Members
void ISerializationCallbackReceiver.OnAfterDeserialize() {
if (!string.IsNullOrEmpty(_classRef)) {
_type = System.Type.GetType(_classRef);
if (_type == null)
Debug.LogWarning(string.Format("'{0}' was referenced but class type was not found.", _classRef));
}
else {
_type = null;
}
}
void ISerializationCallbackReceiver.OnBeforeSerialize() {
}
#endregion
private Type _type;
/// <summary>
/// Gets or sets type of class reference.
/// </summary>
/// <exception cref="System.ArgumentException">
/// If <paramref name="value"/> is not a class type.
/// </exception>
public Type Type {
get { return _type; }
set {
if (value != null && !value.IsClass)
throw new ArgumentException(string.Format("'{0}' is not a class type.", value.FullName), "value");
_type = value;
_classRef = GetClassRef(value);
}
}
public static implicit operator string(ClassTypeReference typeReference) {
return typeReference._classRef;
}
public static implicit operator Type(ClassTypeReference typeReference) {
return typeReference.Type;
}
public static implicit operator ClassTypeReference(Type type) {
return new ClassTypeReference(type);
}
public override string ToString() {
return Type != null ? Type.FullName : "(None)";
}
}
}
fileFormatVersion: 2
guid: bbeadb5396d227843b94f9b779273d08
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
// Copyright (c) Rotorz Limited. All rights reserved.
// Licensed under the MIT license. See LICENSE file in the project root.
using System;
using System.Collections.Generic;
using System.Reflection;
using UnityEditor;
using UnityEngine;
namespace TypeReferences {
/// <summary>
/// Custom property drawer for <see cref="ClassTypeReference"/> properties.
/// </summary>
[CustomPropertyDrawer(typeof(ClassTypeReference))]
[CustomPropertyDrawer(typeof(ClassTypeConstraintAttribute), true)]
public sealed class ClassTypeReferencePropertyDrawer : PropertyDrawer {
#region Type Filtering
/// <summary>
/// Gets or sets a function that returns a collection of types that are
/// to be excluded from drop-down. A value of <c>null</c> specifies that
/// no types are to be excluded.
/// </summary>
/// <remarks>
/// <para>This property must be set immediately before presenting a class
/// type reference property field using <see cref="EditorGUI.PropertyField"/>
/// or <see cref="EditorGUILayout.PropertyField"/> since the value of this
/// property is reset to <c>null</c> each time the control is drawn.</para>
/// <para>Since filtering makes extensive use of <see cref="ICollection{Type}.Contains"/>
/// it is recommended to use a collection that is optimized for fast
/// lookups such as <see cref="HashSet{Type}"/> for better performance.</para>
/// </remarks>
/// <example>
/// <para>Exclude a specific type from being selected:</para>
/// <code language="csharp"><![CDATA[
/// private SerializedProperty _someClassTypeReferenceProperty;
///
/// public override void OnInspectorGUI() {
/// serializedObject.Update();
///
/// ClassTypeReferencePropertyDrawer.ExcludedTypeCollectionGetter = GetExcludedTypeCollection;
/// EditorGUILayout.PropertyField(_someClassTypeReferenceProperty);
///
/// serializedObject.ApplyModifiedProperties();
/// }
///
/// private ICollection<Type> GetExcludedTypeCollection() {
/// var set = new HashSet<Type>();
/// set.Add(typeof(SpecialClassToHideInDropdown));
/// return set;
/// }
/// ]]></code>
/// </example>
public static Func<ICollection<Type>> ExcludedTypeCollectionGetter { get; set; }
private static List<Type> GetFilteredTypes(ClassTypeConstraintAttribute filter) {
var types = new List<Type>();
var excludedTypes = (ExcludedTypeCollectionGetter != null ? ExcludedTypeCollectionGetter() : null);
var assembly = Assembly.GetExecutingAssembly();
FilterTypes(assembly, filter, excludedTypes, types);
foreach (var referencedAssembly in assembly.GetReferencedAssemblies())
FilterTypes(Assembly.Load(referencedAssembly), filter, excludedTypes, types);
types.Sort((a, b) => a.FullName.CompareTo(b.FullName));
return types;
}
private static void FilterTypes(Assembly assembly, ClassTypeConstraintAttribute filter, ICollection<Type> excludedTypes, List<Type> output) {
foreach (var type in assembly.GetTypes()) {
if (!type.IsVisible || !type.IsClass)
continue;
if (filter != null && !filter.IsConstraintSatisfied(type))
continue;
if (excludedTypes != null && excludedTypes.Contains(type))
continue;
output.Add(type);
}
}
#endregion
#region Type Utility
private static Dictionary<string, Type> s_TypeMap = new();
private static Type ResolveType(string classRef) {
if (!s_TypeMap.TryGetValue(classRef, out Type type)) {
type = !string.IsNullOrEmpty(classRef) ? Type.GetType(classRef) : null;
s_TypeMap[classRef] = type;
}
return type;
}
#endregion
#region Control Drawing / Event Handling
private static readonly int s_ControlHint = typeof(ClassTypeReferencePropertyDrawer).GetHashCode();
private static GUIContent s_TempContent = new();
private static string DrawTypeSelectionControl(Rect position, GUIContent label, string classRef, ClassTypeConstraintAttribute filter) {
if (label != null && label != GUIContent.none)
position = EditorGUI.PrefixLabel(position, label);
int controlID = GUIUtility.GetControlID(s_ControlHint, FocusType.Keyboard, position);
bool triggerDropDown = false;
switch (Event.current.GetTypeForControl(controlID)) {
case EventType.ExecuteCommand:
if (Event.current.commandName == "TypeReferenceUpdated") {
if (s_SelectionControlID == controlID) {
if (classRef != s_SelectedClassRef) {
classRef = s_SelectedClassRef;
GUI.changed = true;
}
s_SelectionControlID = 0;
s_SelectedClassRef = null;
}
}
break;
case EventType.MouseDown:
if (GUI.enabled && position.Contains(Event.current.mousePosition)) {
GUIUtility.keyboardControl = controlID;
triggerDropDown = true;
Event.current.Use();
}
break;
case EventType.KeyDown:
if (GUI.enabled && GUIUtility.keyboardControl == controlID) {
if (Event.current.keyCode == KeyCode.Return || Event.current.keyCode == KeyCode.Space) {
triggerDropDown = true;
Event.current.Use();
}
}
break;
case EventType.Repaint:
// Remove assembly name from content of popup control.
var classRefParts = classRef.Split(',');
s_TempContent.text = classRefParts[0].Trim();
if (s_TempContent.text == "")
s_TempContent.text = "(None)";
else if (ResolveType(classRef) == null)
s_TempContent.text += " {Missing}";
EditorStyles.popup.Draw(position, s_TempContent, controlID);
break;
}
if (triggerDropDown) {
s_SelectionControlID = controlID;
s_SelectedClassRef = classRef;
var filteredTypes = GetFilteredTypes(filter);
DisplayDropDown(position, filteredTypes, ResolveType(classRef), filter.Grouping);
}
return classRef;
}
private static void DrawTypeSelectionControl(Rect position, SerializedProperty property, GUIContent label, ClassTypeConstraintAttribute filter) {
try {
bool restoreShowMixedValue = EditorGUI.showMixedValue;
EditorGUI.showMixedValue = property.hasMultipleDifferentValues;
property.stringValue = DrawTypeSelectionControl(position, label, property.stringValue, filter);
EditorGUI.showMixedValue = restoreShowMixedValue;
}
finally {
ExcludedTypeCollectionGetter = null;
}
}
private static void DisplayDropDown(Rect position, List<Type> types, Type selectedType, ClassGrouping grouping) {
var menu = new GenericMenu();
menu.AddItem(new GUIContent("(None)"), selectedType == null, s_OnSelectedTypeName, null);
menu.AddSeparator("");
for (int i = 0; i < types.Count; ++i) {
var type = types[i];
string menuLabel = FormatGroupedTypeName(type, grouping);
if (string.IsNullOrEmpty(menuLabel))
continue;
var content = new GUIContent(menuLabel);
menu.AddItem(content, type == selectedType, s_OnSelectedTypeName, type);
}
menu.DropDown(position);
}
private static string FormatGroupedTypeName(Type type, ClassGrouping grouping) {
string name = type.FullName;
switch (grouping) {
default:
case ClassGrouping.None:
return name;
case ClassGrouping.ByNamespace:
return name.Replace('.', '/');
case ClassGrouping.ByNamespaceFlat:
int lastPeriodIndex = name.LastIndexOf('.');
if (lastPeriodIndex != -1)
name = name[..lastPeriodIndex] + "/" + name[(lastPeriodIndex + 1)..];
return name;
case ClassGrouping.ByAddComponentMenu:
var addComponentMenuAttributes = type.GetCustomAttributes(typeof(AddComponentMenu), false);
if (addComponentMenuAttributes.Length == 1)
return ((AddComponentMenu)addComponentMenuAttributes[0]).componentMenu;
return "Scripts/" + type.FullName.Replace('.', '/');
}
}
private static int s_SelectionControlID;
private static string s_SelectedClassRef;
private static readonly GenericMenu.MenuFunction2 s_OnSelectedTypeName = OnSelectedTypeName;
private static void OnSelectedTypeName(object userData) {
var selectedType = userData as Type;
s_SelectedClassRef = ClassTypeReference.GetClassRef(selectedType);
var typeReferenceUpdatedEvent = EditorGUIUtility.CommandEvent("TypeReferenceUpdated");
EditorWindow.focusedWindow.SendEvent(typeReferenceUpdatedEvent);
}
#endregion
public override float GetPropertyHeight(SerializedProperty property, GUIContent label) {
return EditorStyles.popup.CalcHeight(GUIContent.none, 0);
}
public override void OnGUI(Rect position, SerializedProperty property, GUIContent label) {
DrawTypeSelectionControl(position, property.FindPropertyRelative("_classRef"), label, attribute as ClassTypeConstraintAttribute);
}
}
}
fileFormatVersion: 2
guid: 6a936c5e8011ef24db75cefabc58683a
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
public void Populate() {
foreach (var pair in Effects) {
pair.Populate();
}
}
public void Clear() {
}
if (EffectType == null || EffectType.Type == null) {
Effect = null;
}
else if (Effect == null || EffectType.Type != Effect.GetType()) {
Effect = (IEffect)Activator.CreateInstance(EffectType.Type);
}
}
public sealed class RemovePainEffect : RemoveResourceEffect<Pain, PainUnit> { }
public sealed class RemoveFatigueEffect : RemoveResourceEffect<Fatigue, FatigueUnit> { }
public sealed class RemoveBlueTagEffect : RemoveResourceEffect<BlueTag, BlueTagUnit> { }
public sealed class RemoveRedTagEffect : RemoveResourceEffect<RedTag, RedTagUnit> { }
public sealed class RemoveGreenTagEffect : RemoveResourceEffect<GreenTag, GreenTagUnit> { }
[Serializable] public sealed class RemovePainEffect : RemoveResourceEffect<Pain, PainUnit> { }
[Serializable] public sealed class RemoveFatigueEffect : RemoveResourceEffect<Fatigue, FatigueUnit> { }
[Serializable] public sealed class RemoveBlueTagEffect : RemoveResourceEffect<BlueTag, BlueTagUnit> { }
[Serializable] public sealed class RemoveRedTagEffect : RemoveResourceEffect<RedTag, RedTagUnit> { }
[Serializable] public sealed class RemoveGreenTagEffect : RemoveResourceEffect<GreenTag, GreenTagUnit> { }
public class CountPainEffect : CountResourceEffect<Pain, PainUnit> { }
public class CountFatigueEffect : CountResourceEffect<Fatigue, FatigueUnit> { }
public class CountBlueTagEffect : CountResourceEffect<BlueTag, BlueTagUnit> { }
public class CountRedTagEffect : CountResourceEffect<RedTag, RedTagUnit> { }
public class CountGreenTagEffect : CountResourceEffect<GreenTag, GreenTagUnit> { }
[Serializable] public sealed class CountPainEffect : CountResourceEffect<Pain, PainUnit> { }
[Serializable] public sealed class CountFatigueEffect : CountResourceEffect<Fatigue, FatigueUnit> { }
[Serializable] public sealed class CountBlueTagEffect : CountResourceEffect<BlueTag, BlueTagUnit> { }
[Serializable] public sealed class CountRedTagEffect : CountResourceEffect<RedTag, RedTagUnit> { }
[Serializable] public sealed class CountGreenTagEffect : CountResourceEffect<GreenTag, GreenTagUnit> { }
public sealed class ApplyPainEffect : ApplyResourceEffect<Pain, PainUnit> { }
public sealed class ApplyFatigueEffect : ApplyResourceEffect<Fatigue, FatigueUnit> { }
public sealed class ApplyBlueTagEffect : ApplyResourceEffect<BlueTag, BlueTagUnit> { }
public sealed class ApplyRedTagEffect : ApplyResourceEffect<RedTag, RedTagUnit> { }
public sealed class ApplyGreenTagEffect : ApplyResourceEffect<GreenTag, GreenTagUnit> { }
[Serializable] public sealed class ApplyPainEffect : ApplyResourceEffect<Pain, PainUnit> { }
[Serializable] public sealed class ApplyFatigueEffect : ApplyResourceEffect<Fatigue, FatigueUnit> { }
[Serializable] public sealed class ApplyBlueTagEffect : ApplyResourceEffect<BlueTag, BlueTagUnit> { }
[Serializable] public sealed class ApplyRedTagEffect : ApplyResourceEffect<RedTag, RedTagUnit> { }
[Serializable] public sealed class ApplyGreenTagEffect : ApplyResourceEffect<GreenTag, GreenTagUnit> { }
public sealed class AddPainEffect : AddResourceEffect<Pain, PainUnit> { }
public sealed class AddFatigueEffect : AddResourceEffect<Fatigue, FatigueUnit> { }
public sealed class AddBlueTagEffect : AddResourceEffect<BlueTag, BlueTagUnit> { }
public sealed class AddRedTagEffect : AddResourceEffect<RedTag, RedTagUnit> { }
public sealed class AddGreenTagEffect : AddResourceEffect<GreenTag, GreenTagUnit> { }
[Serializable] public sealed class AddPainEffect : AddResourceEffect<Pain, PainUnit> { }
[Serializable] public sealed class AddFatigueEffect : AddResourceEffect<Fatigue, FatigueUnit> { }
[Serializable] public sealed class AddBlueTagEffect : AddResourceEffect<BlueTag, BlueTagUnit> { }
[Serializable] public sealed class AddRedTagEffect : AddResourceEffect<RedTag, RedTagUnit> { }
[Serializable] public sealed class AddGreenTagEffect : AddResourceEffect<GreenTag, GreenTagUnit> { }
public sealed class AccumulatePainByPainTagEffect : AccumulatePainByResource<Pain, PainUnit> { }
public sealed class AccumulatePainByFatigueTagEffect : AccumulatePainByResource<Fatigue, FatigueUnit> { }
public sealed class AccumulatePainByBlueTagEffect : AccumulatePainByResource<BlueTag, BlueTagUnit> { }
public sealed class AccumulatePainByRedTagEffect : AccumulatePainByResource<RedTag, RedTagUnit> { }
public sealed class AccumulatePainByGreenTagEffect : AccumulatePainByResource<GreenTag, GreenTagUnit> { }
[Serializable] public sealed class AccumulatePainByPainTagEffect : AccumulatePainByResource<Pain, PainUnit> { }
[Serializable] public sealed class AccumulatePainByFatigueTagEffect : AccumulatePainByResource<Fatigue, FatigueUnit> { }
[Serializable] public sealed class AccumulatePainByBlueTagEffect : AccumulatePainByResource<BlueTag, BlueTagUnit> { }
[Serializable] public sealed class AccumulatePainByRedTagEffect : AccumulatePainByResource<RedTag, RedTagUnit> { }
[Serializable] public sealed class AccumulatePainByGreenTagEffect : AccumulatePainByResource<GreenTag, GreenTagUnit> { }
public sealed class AccumulateFatigueByPainTagEffect : AccumulateFatigueByResource<Pain, PainUnit> { }
public sealed class AccumulateFatigueByFatigueTagEffect : AccumulateFatigueByResource<Fatigue, FatigueUnit> { }
public sealed class AccumulateFatigueByBlueTagEffect : AccumulateFatigueByResource<BlueTag, BlueTagUnit> { }
public sealed class AccumulateFatigueByRedTagEffect : AccumulateFatigueByResource<RedTag, RedTagUnit> { }
public sealed class AccumulateFatigueByGreenTagEffect : AccumulateFatigueByResource<GreenTag, GreenTagUnit> { }
[Serializable] public sealed class AccumulateFatigueByPainTagEffect : AccumulateFatigueByResource<Pain, PainUnit> { }
[Serializable] public sealed class AccumulateFatigueByFatigueTagEffect : AccumulateFatigueByResource<Fatigue, FatigueUnit> { }
[Serializable] public sealed class AccumulateFatigueByBlueTagEffect : AccumulateFatigueByResource<BlueTag, BlueTagUnit> { }
[Serializable] public sealed class AccumulateFatigueByRedTagEffect : AccumulateFatigueByResource<RedTag, RedTagUnit> { }
[Serializable] public sealed class AccumulateFatigueByGreenTagEffect : AccumulateFatigueByResource<GreenTag, GreenTagUnit> { }
public sealed class AccumulateBlueTagByPainTagEffect : AccumulateBlueTagByResource<Pain, PainUnit> { }
public sealed class AccumulateBlueTagByFatigueTagEffect : AccumulateBlueTagByResource<Fatigue, FatigueUnit> { }
public sealed class AccumulateBlueTagByBlueTagEffect : AccumulateBlueTagByResource<BlueTag, BlueTagUnit> { }
public sealed class AccumulateBlueTagByRedTagEffect : AccumulateBlueTagByResource<RedTag, RedTagUnit> { }
public sealed class AccumulateBlueTagByGreenTagEffect : AccumulateBlueTagByResource<GreenTag, GreenTagUnit> { }
[Serializable] public sealed class AccumulateBlueTagByPainTagEffect : AccumulateBlueTagByResource<Pain, PainUnit> { }
[Serializable] public sealed class AccumulateBlueTagByFatigueTagEffect : AccumulateBlueTagByResource<Fatigue, FatigueUnit> { }
[Serializable] public sealed class AccumulateBlueTagByBlueTagEffect : AccumulateBlueTagByResource<BlueTag, BlueTagUnit> { }
[Serializable] public sealed class AccumulateBlueTagByRedTagEffect : AccumulateBlueTagByResource<RedTag, RedTagUnit> { }
[Serializable] public sealed class AccumulateBlueTagByGreenTagEffect : AccumulateBlueTagByResource<GreenTag, GreenTagUnit> { }
public sealed class AccumulateRedTagByPainTagEffect : AccumulateRedTagByResource<Pain, PainUnit> { }
public sealed class AccumulateRedTagByFatigueEffect : AccumulateRedTagByResource<Fatigue, FatigueUnit> { }
public sealed class AccumulateRedTagByBlueTagEffect : AccumulateRedTagByResource<BlueTag, BlueTagUnit> { }
public sealed class AccumulateRedTagByRedTagEffect : AccumulateRedTagByResource<RedTag, RedTagUnit> { }
public sealed class AccumulateRedTagByGreenTagEffect : AccumulateRedTagByResource<GreenTag, GreenTagUnit> { }
[Serializable] public sealed class AccumulateRedTagByPainTagEffect : AccumulateRedTagByResource<Pain, PainUnit> { }
[Serializable] public sealed class AccumulateRedTagByFatigueEffect : AccumulateRedTagByResource<Fatigue, FatigueUnit> { }
[Serializable] public sealed class AccumulateRedTagByBlueTagEffect : AccumulateRedTagByResource<BlueTag, BlueTagUnit> { }
[Serializable] public sealed class AccumulateRedTagByRedTagEffect : AccumulateRedTagByResource<RedTag, RedTagUnit> { }
[Serializable] public sealed class AccumulateRedTagByGreenTagEffect : AccumulateRedTagByResource<GreenTag, GreenTagUnit> { }
public sealed class AccumulateGreenTagByPainTagEffect : AccumulateGreeTagByResource<Pain, PainUnit> { }
public sealed class AccumulateGreenTagByFatigueEffect : AccumulateGreeTagByResource<Fatigue, FatigueUnit> { }
public sealed class AccumulateGreenTagByBlueTagEffect : AccumulateGreeTagByResource<BlueTag, BlueTagUnit> { }
public sealed class AccumulateGreenTagByRedTagEffect : AccumulateGreeTagByResource<RedTag, RedTagUnit> { }
public sealed class AccumulateGreenTagByGreenTagEffect : AccumulateGreeTagByResource<GreenTag, GreenTagUnit> { }
[Serializable] public sealed class AccumulateGreenTagByPainTagEffect : AccumulateGreeTagByResource<Pain, PainUnit> { }
[Serializable] public sealed class AccumulateGreenTagByFatigueEffect : AccumulateGreeTagByResource<Fatigue, FatigueUnit> { }
[Serializable] public sealed class AccumulateGreenTagByBlueTagEffect : AccumulateGreeTagByResource<BlueTag, BlueTagUnit> { }
[Serializable] public sealed class AccumulateGreenTagByRedTagEffect : AccumulateGreeTagByResource<RedTag, RedTagUnit> { }
[Serializable] public sealed class AccumulateGreenTagByGreenTagEffect : AccumulateGreeTagByResource<GreenTag, GreenTagUnit> { }
- _mode:
_classRef: TagFighter.Effects.DelayedEffect, Assembly-CSharp
Mode:
rid: 7043444486337986593
EffectType:
_classRef: TagFighter.Effects.CountResource.CountBlueTagEffect, Assembly-CSharp
- Mode:
rid: 7043444504695668742
rid: 7043444400329588761
- _mode:
_classRef: TagFighter.Effects.DelayedEffect, Assembly-CSharp
Mode:
rid: 7043444486337986590
EffectType:
_classRef: TagFighter.Effects.AccumulatePainByResource.AccumulatePainByBlueTagEffect,
Assembly-CSharp
rid: 7043444504695668745
- Mode:
rid: 7043444504695668747
rid: 7043444400329588764
- _mode:
_classRef: TagFighter.Effects.DelayedEffect, Assembly-CSharp
Mode:
rid: 7043444486337986591
EffectType:
_classRef: TagFighter.Effects.AddResource.AddBlueTagEffect, Assembly-CSharp
rid: 7043444504695668746
- Mode:
rid: 7043444504695668748
rid: 7043444486337986570
- _mode:
_classRef: TagFighter.Effects.ReleaseEffect, Assembly-CSharp
Mode:
rid: 7043444486337986594
EffectType:
_classRef: TagFighter.Effects.AeoEffect, Assembly-CSharp
rid: 7043444504695668749
- Mode:
rid: 7043444504695668743
- rid: 7043444400329588761
- rid: 7043444504695668742
type: {class: DelayedEffect, ns: TagFighter.Effects, asm: Assembly-CSharp}
- rid: 7043444504695668743
type: {class: ReleaseEffect, ns: TagFighter.Effects, asm: Assembly-CSharp}
- rid: 7043444504695668744
type: {class: AoeEffect, ns: TagFighter.Effects, asm: Assembly-CSharp}
data:
_areaOfEffect:
length: 15
width: 15
shape: 1
- rid: 7043444504695668745
- rid: 7043444486337986570
type: {class: AddBlueTagEffect, ns: TagFighter.Effects.AddResource, asm: Assembly-CSharp}
data:
Multiplicative: 1
Flat:
_value: 0
MultiplicativeBeforeFlat: 0
- rid: 7043444486337986578
type: {class: AeoEffect, ns: TagFighter.Effects, asm: Assembly-CSharp}
data:
_areaOfEffect:
length: 15
width: 15
shape: 1
- rid: 7043444486337986590
- rid: 7043444504695668747
Effects:
- _mode:
_classRef: TagFighter.Effects.ImmediateEffect, Assembly-CSharp
Mode:
rid: 7043444486337986571
EffectType:
_classRef: TagFighter.Effects.CountResource.CountBlueTagEffect, Assembly-CSharp
Effect:
rid: 7043444486337986572
Effects: []
RefIds:
- rid: 7043444486337986571
type: {class: ImmediateEffect, ns: TagFighter.Effects, asm: Assembly-CSharp}
data:
_areaOfEffect:
length: 15
width: 15
shape: 1
- rid: 7043444486337986572
type: {class: CountBlueTagEffect, ns: TagFighter.Effects.CountResource, asm: Assembly-CSharp}
data:
FriendOrFoeOff: 0
RefIds: []