Exemplo n.º 1
0
 public static void Save(BehaviorSource behaviorSource)
 {
     BinarySerialization.fieldIndex             = 0;
     BinarySerialization.taskSerializationData  = new TaskSerializationData();
     BinarySerialization.fieldSerializationData = BinarySerialization.taskSerializationData.fieldSerializationData;
     if (behaviorSource.Variables != null)
     {
         for (int i = 0; i < behaviorSource.Variables.Count; i++)
         {
             BinarySerialization.taskSerializationData.variableStartIndex.Add(BinarySerialization.fieldSerializationData.startIndex.Count);
             BinarySerialization.SaveSharedVariable(behaviorSource.Variables[i], string.Empty);
         }
     }
     if (!object.ReferenceEquals(behaviorSource.EntryTask, null))
     {
         BinarySerialization.SaveTask(behaviorSource.EntryTask, -1);
     }
     if (!object.ReferenceEquals(behaviorSource.RootTask, null))
     {
         BinarySerialization.SaveTask(behaviorSource.RootTask, 0);
     }
     if (behaviorSource.DetachedTasks != null)
     {
         for (int j = 0; j < behaviorSource.DetachedTasks.Count; j++)
         {
             BinarySerialization.SaveTask(behaviorSource.DetachedTasks[j], -1);
         }
     }
     behaviorSource.TaskData = BinarySerialization.taskSerializationData;
     if (behaviorSource.Owner != null)
     {
         EditorUtility.SetDirty(behaviorSource.Owner.GetObject());
     }
 }
Exemplo n.º 2
0
        private static TaskNode DeserializeNode(JToken token, TaskSerializationData data, BehaviourGraphView view)
        {
            var obj = token as JObject;

            var type     = TaskUtility.GetTypeWithinAssembly(obj.Value <string>("Type"));
            var nData    = obj.Value <JObject>("NodeData");
            var position = nData.GetValue("Offset").ToObject <Vector2>(NodeSerializer.Serializer);

            var node = view.CreateNode(type, position);

            var name    = obj.Value <string>("Name");
            var id      = obj.Value <int>("ID");
            var instant = obj.Value <bool>("Instant");

            node.title = name;

            node.Data = DeserializeObject(obj, type, view, data.fieldSerializationData.unityObjects, node) as Task;
            node.Data.FriendlyName = name;
            node.Data.IsInstant    = instant;
            node.Data.ID           = id;

            var children = obj.GetValue("Children");

            if (children is JArray array)
            {
                foreach (var entry in array)
                {
                    var child = DeserializeNode(entry, data, view);
                    view.Connect(child, node);
                }
            }

            return(node);
        }
Exemplo n.º 3
0
        public static void Save(BehaviorSource behaviorSource)
        {
            behaviorSource.CheckForSerialization(false, null);
            SerializeJSON.taskSerializationData  = new TaskSerializationData();
            SerializeJSON.fieldSerializationData = SerializeJSON.taskSerializationData.fieldSerializationData;
            Dictionary <string, object> dictionary = new Dictionary <string, object>();

            if (behaviorSource.EntryTask != null)
            {
                dictionary.Add("EntryTask", SerializeJSON.SerializeTask(behaviorSource.EntryTask, true, ref SerializeJSON.fieldSerializationData.unityObjects));
            }
            if (behaviorSource.RootTask != null)
            {
                dictionary.Add("RootTask", SerializeJSON.SerializeTask(behaviorSource.RootTask, true, ref SerializeJSON.fieldSerializationData.unityObjects));
            }
            if (behaviorSource.DetachedTasks != null && behaviorSource.DetachedTasks.Count > 0)
            {
                Dictionary <string, object>[] array = new Dictionary <string, object> [behaviorSource.DetachedTasks.Count];
                for (int i = 0; i < behaviorSource.DetachedTasks.Count; i++)
                {
                    array[i] = SerializeJSON.SerializeTask(behaviorSource.DetachedTasks[i], true, ref SerializeJSON.fieldSerializationData.unityObjects);
                }
                dictionary.Add("DetachedTasks", array);
            }
            if (behaviorSource.Variables != null && behaviorSource.Variables.Count > 0)
            {
                dictionary.Add("Variables", SerializeJSON.SerializeVariables(behaviorSource.Variables, ref SerializeJSON.fieldSerializationData.unityObjects));
            }
            SerializeJSON.taskSerializationData.JSONSerialization = MiniJSON.Serialize(dictionary);
            behaviorSource.TaskData = SerializeJSON.taskSerializationData;
            if (behaviorSource.Owner != null)
            {
                EditorUtility.SetDirty(behaviorSource.Owner.GetObject());
            }
        }
Exemplo n.º 4
0
        public static void Deserialize(TaskSerializationData data, BehaviourGraphView view)
        {
            if (string.IsNullOrEmpty(data.JSONSerialization))
            {
                return;
            }

            var obj = JObject.Parse(data.JSONSerialization);

            var entry = DeserializeNode(obj.GetValue("EntryTask"), data, view);
            var root  = DeserializeNode(obj.GetValue("RootTask"), data, view);

            DeserializeVariables(obj.GetValue("Variables"), view);

            view.Connect(root, entry);
        }
Exemplo n.º 5
0
        public static TaskSerializationData Serialize(BehaviourGraph graph)
        {
            var data = new TaskSerializationData();

            var entry = graph.NodesData.FirstOrDefault(x => x.Type == typeof(EntryTask));

            if (entry == null)
            {
                Debug.LogWarning($"Graph {AssetDatabase.GetAssetPath(graph)} has no Entry node and will be left empty");
                return(data);
            }

            var nodes = graph.GetLinked(entry);
            var root  = nodes.FirstOrDefault();

            var objects = new List <UnityEngine.Object>();

            var node = new JObject
            {
                { "EntryTask", SerializeNode(graph, entry, objects, false) },
                { "RootTask", SerializeNode(graph, root, objects) },
                { "Variables", SerializeVariables(graph) }
            };

            var sb = new StringBuilder();

            Serializer.Serialize(new StringWriter(sb), node);

            data.JSONSerialization      = sb.ToString();
            data.Version                = "1.5.7";
            data.fieldSerializationData = new FieldSerializationData {
                unityObjects = objects
            };

            return(data);
        }
Exemplo n.º 6
0
    public static void Load(TaskSerializationData taskData, BehaviorSource behaviorSource)
    {
        behaviorSource.EntryTask     = null;
        behaviorSource.RootTask      = null;
        behaviorSource.DetachedTasks = null;
        behaviorSource.Variables     = null;
        FieldSerializationData fieldSerializationData;

        if (taskData == null || (fieldSerializationData = taskData.fieldSerializationData).byteData == null || fieldSerializationData.byteData.Count == 0)
        {
            return;
        }
        fieldSerializationData.byteDataArray = fieldSerializationData.byteData.ToArray();
        taskIDs = null;
        if (taskData.variableStartIndex != null)
        {
            List <SharedVariable>    list       = new List <SharedVariable>();
            Dictionary <string, int> dictionary = ObjectPool.Get <Dictionary <string, int> >();
            for (int i = 0; i < taskData.variableStartIndex.Count; i++)
            {
                int num = taskData.variableStartIndex[i];
                int num2;
                if (i + 1 < taskData.variableStartIndex.Count)
                {
                    num2 = taskData.variableStartIndex[i + 1];
                }
                else if (taskData.startIndex != null && taskData.startIndex.Count > 0)
                {
                    num2 = taskData.startIndex[0];
                }
                else
                {
                    num2 = fieldSerializationData.startIndex.Count;
                }
                dictionary.Clear();
                for (int j = num; j < num2; j++)
                {
                    dictionary.Add(fieldSerializationData.typeName[j], fieldSerializationData.startIndex[j]);
                }
                SharedVariable sharedVariable = BytesToSharedVariable(fieldSerializationData, dictionary, fieldSerializationData.byteDataArray, taskData.variableStartIndex[i], behaviorSource, false, string.Empty);
                if (sharedVariable != null)
                {
                    list.Add(sharedVariable);
                }
            }
            ObjectPool.Return(dictionary);
            behaviorSource.Variables = list;
        }
        List <Task> list2 = new List <Task>();

        if (taskData.types != null)
        {
            for (int k = 0; k < taskData.types.Count; k++)
            {
                LoadTask(taskData, fieldSerializationData, ref list2, ref behaviorSource);
            }
        }
        if (taskData.parentIndex.Count != list2.Count)
        {
            Debug.LogError("Deserialization Error: parent index count does not match task list count");
            return;
        }
        for (int l = 0; l < taskData.parentIndex.Count; l++)
        {
            if (taskData.parentIndex[l] == -1)
            {
                if (behaviorSource.EntryTask == null)
                {
                    behaviorSource.EntryTask = list2[l];
                }
                else
                {
                    if (behaviorSource.DetachedTasks == null)
                    {
                        behaviorSource.DetachedTasks = new List <Task>();
                    }
                    behaviorSource.DetachedTasks.Add(list2[l]);
                }
            }
            else if (taskData.parentIndex[l] == 0)
            {
                behaviorSource.RootTask = list2[l];
            }
            else if (taskData.parentIndex[l] != -1)
            {
                ParentTask parentTask = list2[taskData.parentIndex[l]] as ParentTask;
                if (parentTask != null)
                {
                    int index = (parentTask.Children != null) ? parentTask.Children.Count : 0;
                    parentTask.AddChild(list2[l], index);
                }
            }
        }
        if (taskIDs != null)
        {
            foreach (ObjectFieldMap current in taskIDs.Keys)
            {
                List <int> list3     = BinaryDeserialization.taskIDs[current];
                Type       fieldType = current.fieldInfo.FieldType;
                if (typeof(IList).IsAssignableFrom(fieldType))
                {
                    if (fieldType.IsArray)
                    {
                        Type  elementType = fieldType.GetElementType();
                        Array array       = Array.CreateInstance(elementType, list3.Count);
                        for (int m = 0; m < array.Length; m++)
                        {
                            array.SetValue(list2[list3[m]], m);
                        }
                        current.fieldInfo.SetValue(current.obj, array);
                    }
                    else
                    {
                        Type  type  = fieldType.GetGenericArguments()[0];
                        IList list4 = TaskUtility.CreateInstance(typeof(List <>).MakeGenericType(new Type[]
                        {
                            type
                        })) as IList;
                        for (int n = 0; n < list3.Count; n++)
                        {
                            list4.Add(list2[list3[n]]);
                        }
                        current.fieldInfo.SetValue(current.obj, list4);
                    }
                }
                else
                {
                    current.fieldInfo.SetValue(current.obj, list2[list3[0]]);
                }
            }
        }
    }
Exemplo n.º 7
0
    private static void LoadTask(TaskSerializationData taskSerializationData, FieldSerializationData fieldSerializationData, ref List <Task> taskList, ref BehaviorSource behaviorSource)
    {
        int  count = taskList.Count;
        Type type  = TaskUtility.GetTypeWithinAssembly(taskSerializationData.types[count]);

        if (type == null)
        {
            bool flag = false;
            for (int i = 0; i < taskSerializationData.parentIndex.Count; i++)
            {
                if (count == taskSerializationData.parentIndex[i])
                {
                    flag = true;
                    break;
                }
            }
            if (flag)
            {
                type = typeof(UnknownParentTask);
            }
            else
            {
                type = typeof(UnknownTask);
            }
        }
        Task task = TaskUtility.CreateInstance(type) as Task;

        task.Owner = (behaviorSource.Owner.GetObject() as Behavior);
        taskList.Add(task);
        int num = taskSerializationData.startIndex[count];
        int num2;

        if (count + 1 < taskSerializationData.startIndex.Count)
        {
            num2 = taskSerializationData.startIndex[count + 1];
        }
        else
        {
            num2 = fieldSerializationData.startIndex.Count;
        }
        Dictionary <string, int> dictionary = ObjectPool.Get <Dictionary <string, int> >();

        dictionary.Clear();
        for (int j = num; j < num2; j++)
        {
            dictionary.Add(fieldSerializationData.typeName[j], fieldSerializationData.startIndex[j]);
        }
        task.ID           = (int)LoadField(fieldSerializationData, dictionary, typeof(int), "ID", null, null, null);
        task.FriendlyName = (string)LoadField(fieldSerializationData, dictionary, typeof(string), "FriendlyName", null, null, null);
        task.IsInstant    = (bool)LoadField(fieldSerializationData, dictionary, typeof(bool), "IsInstant", null, null, null);
        LoadNodeData(fieldSerializationData, dictionary, taskList[count]);
        if (task.GetType().Equals(typeof(UnknownTask)) || task.GetType().Equals(typeof(UnknownParentTask)))
        {
            if (!task.FriendlyName.Contains("Unknown "))
            {
                task.FriendlyName = string.Format("Unknown {0}", task.FriendlyName);
            }
            if (!task.NodeData.Comment.Contains("Loaded from an unknown type. Was a task renamed or deleted?"))
            {
                task.NodeData.Comment = string.Format("Loaded from an unknown type. Was a task renamed or deleted?{0}", (!task.NodeData.Comment.Equals(string.Empty)) ? string.Format("\0{0}", task.NodeData.Comment) : string.Empty);
            }
        }
        LoadFields(fieldSerializationData, dictionary, taskList[count], string.Empty, behaviorSource);
        ObjectPool.Return(dictionary);
    }
    public static void LoadTask(TaskSerializationData taskSerializationData, FieldSerializationData fieldSerializationData, ref List <Task> taskList, ref BehaviorSource behaviorSource)
    {
        int count = taskList.Count;
        int num   = taskSerializationData.startIndex[count];
        int num2;

        if (count + 1 < taskSerializationData.startIndex.Count)
        {
            num2 = taskSerializationData.startIndex[count + 1];
        }
        else
        {
            num2 = fieldSerializationData.startIndex.Count;
        }
        Dictionary <int, int> dictionary = ObjectPool.Get <Dictionary <int, int> >();

        dictionary.Clear();
        for (int i = num; i < num2; i++)
        {
            if (!dictionary.ContainsKey(fieldSerializationData.fieldNameHash[i]))
            {
                dictionary.Add(fieldSerializationData.fieldNameHash[i], fieldSerializationData.startIndex[i]);
            }
        }
        Type type = TaskUtility.GetTypeWithinAssembly(taskSerializationData.types[count]);

        if (type == null)
        {
            bool flag = false;
            for (int j = 0; j < taskSerializationData.parentIndex.Count; j++)
            {
                if (count == taskSerializationData.parentIndex[j])
                {
                    flag = true;
                    break;
                }
            }
            if (flag)
            {
                type = typeof(UnknownParentTask);
            }
            else
            {
                type = typeof(UnknownTask);
            }
        }
        Task task = TaskUtility.CreateInstance(type) as Task;

        if (task is UnknownTask)
        {
            UnknownTask unknownTask = task as UnknownTask;
            for (int k = num; k < num2; k++)
            {
                unknownTask.fieldNameHash.Add(fieldSerializationData.fieldNameHash[k]);
                unknownTask.startIndex.Add(fieldSerializationData.startIndex[k] - fieldSerializationData.startIndex[num]);
            }
            for (int l = fieldSerializationData.startIndex[num]; l <= fieldSerializationData.startIndex[num2 - 1]; l++)
            {
                unknownTask.dataPosition.Add(fieldSerializationData.dataPosition[l] - fieldSerializationData.dataPosition[fieldSerializationData.startIndex[num]]);
            }
            if (count + 1 < taskSerializationData.startIndex.Count && taskSerializationData.startIndex[count + 1] < fieldSerializationData.dataPosition.Count)
            {
                num2 = fieldSerializationData.dataPosition[taskSerializationData.startIndex[count + 1]];
            }
            else
            {
                num2 = fieldSerializationData.byteData.Count;
            }
            for (int m = fieldSerializationData.dataPosition[fieldSerializationData.startIndex[num]]; m < num2; m++)
            {
                unknownTask.byteData.Add(fieldSerializationData.byteData[m]);
            }
            unknownTask.unityObjects = fieldSerializationData.unityObjects;
        }
        task.Owner = (behaviorSource.Owner.GetObject() as Behavior);
        taskList.Add(task);
        task.ID           = (int)BinaryDeserialization.LoadField(fieldSerializationData, dictionary, typeof(int), "ID", 0, null, null, null);
        task.FriendlyName = (string)BinaryDeserialization.LoadField(fieldSerializationData, dictionary, typeof(string), "FriendlyName", 0, null, null, null);
        task.IsInstant    = (bool)BinaryDeserialization.LoadField(fieldSerializationData, dictionary, typeof(bool), "IsInstant", 0, null, null, null);
        object obj;

        if ((obj = BinaryDeserialization.LoadField(fieldSerializationData, dictionary, typeof(bool), "Disabled", 0, null, null, null)) != null)
        {
            task.Disabled = (bool)obj;
        }
        BinaryDeserialization.LoadNodeData(fieldSerializationData, dictionary, taskList[count]);
        if (task.GetType().Equals(typeof(UnknownTask)) || task.GetType().Equals(typeof(UnknownParentTask)))
        {
            if (!task.FriendlyName.Contains("Unknown "))
            {
                task.FriendlyName = string.Format("Unknown {0}", task.FriendlyName);
            }
            task.NodeData.Comment = "Unknown Task. Right click and Replace to locate new task.";
        }
        BinaryDeserialization.LoadFields(fieldSerializationData, dictionary, taskList[count], 0, behaviorSource);
        ObjectPool.Return <Dictionary <int, int> >(dictionary);
    }