Files
BH3/Assets/Plugins/Assembly-CSharp-firstpass/BehaviorDesigner/Runtime/TaskReferences.cs
2025-08-13 09:26:42 +08:00

203 lines
5.6 KiB
C#

using System;
using System.Collections;
using System.Collections.Generic;
using System.Reflection;
using BehaviorDesigner.Runtime.Tasks;
using UnityEngine;
namespace BehaviorDesigner.Runtime
{
public class TaskReferences : MonoBehaviour
{
public static void CheckReferences(BehaviorSource behaviorSource)
{
if (behaviorSource.RootTask != null)
{
CheckReferences(behaviorSource, behaviorSource.RootTask);
}
if (behaviorSource.DetachedTasks != null)
{
for (int i = 0; i < behaviorSource.DetachedTasks.Count; i++)
{
CheckReferences(behaviorSource, behaviorSource.DetachedTasks[i]);
}
}
}
private static void CheckReferences(BehaviorSource behaviorSource, Task task)
{
FieldInfo[] allFields = TaskUtility.GetAllFields(task.GetType());
for (int i = 0; i < allFields.Length; i++)
{
if (!allFields[i].FieldType.IsArray && (allFields[i].FieldType.Equals(typeof(Task)) || allFields[i].FieldType.IsSubclassOf(typeof(Task))))
{
Task task2 = allFields[i].GetValue(task) as Task;
if (task2 != null)
{
Task task3 = FindReferencedTask(behaviorSource, task2);
if (task3 != null)
{
allFields[i].SetValue(task, task3);
}
}
}
else
{
if (!allFields[i].FieldType.IsArray || (!allFields[i].FieldType.GetElementType().Equals(typeof(Task)) && !allFields[i].FieldType.GetElementType().IsSubclassOf(typeof(Task))))
{
continue;
}
Task[] array = allFields[i].GetValue(task) as Task[];
if (array == null)
{
continue;
}
IList list = Activator.CreateInstance(typeof(List<>).MakeGenericType(allFields[i].FieldType.GetElementType())) as IList;
for (int j = 0; j < array.Length; j++)
{
Task task4 = FindReferencedTask(behaviorSource, array[j]);
if (task4 != null)
{
list.Add(task4);
}
}
Array array2 = Array.CreateInstance(allFields[i].FieldType.GetElementType(), list.Count);
list.CopyTo(array2, 0);
allFields[i].SetValue(task, array2);
}
}
if (!task.GetType().IsSubclassOf(typeof(ParentTask)))
{
return;
}
ParentTask parentTask = task as ParentTask;
if (parentTask.Children != null)
{
for (int k = 0; k < parentTask.Children.Count; k++)
{
CheckReferences(behaviorSource, parentTask.Children[k]);
}
}
}
private static Task FindReferencedTask(BehaviorSource behaviorSource, Task referencedTask)
{
int iD = referencedTask.ID;
Task result;
if (behaviorSource.RootTask != null && (result = FindReferencedTask(behaviorSource.RootTask, iD)) != null)
{
return result;
}
if (behaviorSource.DetachedTasks != null)
{
for (int i = 0; i < behaviorSource.DetachedTasks.Count; i++)
{
if ((result = FindReferencedTask(behaviorSource.DetachedTasks[i], iD)) != null)
{
return result;
}
}
}
return null;
}
private static Task FindReferencedTask(Task task, int referencedTaskID)
{
if (task.ID == referencedTaskID)
{
return task;
}
if (task.GetType().IsSubclassOf(typeof(ParentTask)))
{
ParentTask parentTask = task as ParentTask;
if (parentTask.Children != null)
{
for (int i = 0; i < parentTask.Children.Count; i++)
{
Task result;
if ((result = FindReferencedTask(parentTask.Children[i], referencedTaskID)) != null)
{
return result;
}
}
}
}
return null;
}
public static void CheckReferences(Behavior behavior, List<Task> taskList)
{
for (int i = 0; i < taskList.Count; i++)
{
CheckReferences(behavior, taskList[i], taskList);
}
}
private static void CheckReferences(Behavior behavior, Task task, List<Task> taskList)
{
if (TaskUtility.CompareType(task.GetType(), "BehaviorDesigner.Runtime.Tasks.ConditionalEvaluator"))
{
FieldInfo field = task.GetType().GetField("conditionalTask");
object value = field.GetValue(task);
if (value != null)
{
task = value as Task;
}
}
FieldInfo[] allFields = TaskUtility.GetAllFields(task.GetType());
for (int i = 0; i < allFields.Length; i++)
{
if (!allFields[i].FieldType.IsArray && (allFields[i].FieldType.Equals(typeof(Task)) || allFields[i].FieldType.IsSubclassOf(typeof(Task))))
{
Task task2 = allFields[i].GetValue(task) as Task;
if (task2 != null && !task2.Owner.Equals(behavior))
{
Task task3 = FindReferencedTask(task2, taskList);
if (task3 != null)
{
allFields[i].SetValue(task, task3);
}
}
}
else
{
if (!allFields[i].FieldType.IsArray || (!allFields[i].FieldType.GetElementType().Equals(typeof(Task)) && !allFields[i].FieldType.GetElementType().IsSubclassOf(typeof(Task))))
{
continue;
}
Task[] array = allFields[i].GetValue(task) as Task[];
if (array == null)
{
continue;
}
IList list = Activator.CreateInstance(typeof(List<>).MakeGenericType(allFields[i].FieldType.GetElementType())) as IList;
for (int j = 0; j < array.Length; j++)
{
Task task4 = FindReferencedTask(array[j], taskList);
if (task4 != null)
{
list.Add(task4);
}
}
Array array2 = Array.CreateInstance(allFields[i].FieldType.GetElementType(), list.Count);
list.CopyTo(array2, 0);
allFields[i].SetValue(task, array2);
}
}
}
private static Task FindReferencedTask(Task referencedTask, List<Task> taskList)
{
int referenceID = referencedTask.ReferenceID;
for (int i = 0; i < taskList.Count; i++)
{
if (taskList[i].ReferenceID == referenceID)
{
return taskList[i];
}
}
return null;
}
}
}