public void Load(XmlElement e) { this.Name = e.GetAttributeValueAsString("Name", this.Name); this.DefaultState = e.GetAttributeValueAsString("DefaultState", DefaultDestinationState); this.ExpandMethods = e.GetAttributeValueAsBoolean("ExpandMethods", false); this.ExtraBehaviors = null; List <BehaviorData> list = new List <BehaviorData>(); XmlElement behaviorsElement = e["Behaviors"]; if (behaviorsElement != null) { foreach (var behaviorElement in behaviorsElement) { BehaviorData behavior = CreateBehaviorFrom(behaviorElement); if (behavior != null) { behavior.Load(behaviorElement); list.Add(behavior); } } } List <BehaviorTreeStateData> states = new List <BehaviorTreeStateData>(); foreach (var b in list) { if (b.BehaviorType == Skill.Framework.AI.BehaviorType.Composite && ((CompositeData)b).CompositeType == Skill.Framework.AI.CompositeType.State) { states.Add(b as BehaviorTreeStateData); } } // load hierarchy XmlElement hierarchy = e["Hierarchy"]; if (hierarchy != null) { foreach (var behaviorChildrenElement in hierarchy) { int behaviorId = behaviorChildrenElement.GetAttributeValueAsInt("Id", -2); BehaviorData behavior = FindById(list, behaviorId); if (behavior != null) { foreach (var containerElement in behaviorChildrenElement) { int childId = containerElement.GetAttributeValueAsInt("ChildId", -2); BehaviorData child = FindById(list, childId); if (child != null) { XmlElement parametersElement = containerElement[ParameterDataCollection.ElementName]; if (parametersElement != null) { ParameterDataCollection parameters = new ParameterDataCollection(); parameters.Load(parametersElement); behavior.Add(child, parameters); } else { behavior.Add(child); } } } } } } foreach (var b in list) { b.FixParameters(); } if (states.Count > 0) { this.States = states.ToArray(); } else { // try to load as previouse version format int rootId = e.GetAttributeValueAsInt("RootId", 0); BehaviorData root = FindById(list, rootId); if (root != null && root.BehaviorType == Skill.Framework.AI.BehaviorType.Composite && ((CompositeData)root).CompositeType == Skill.Framework.AI.CompositeType.Priority) { PrioritySelectorData ps = root as PrioritySelectorData; BehaviorTreeStateData state = new BehaviorTreeStateData(); state.Comment = ps.Comment; state.Concurrency = ps.Concurrency; state.Id = ps.Id; state.Name = ps.Name; state.Priority = ps.Priority; state.Weight = ps.Weight; foreach (var child in ps) { state.Add(child); } this.States = new BehaviorTreeStateData[] { state }; DefaultState = state.Name; } else { this.States = new BehaviorTreeStateData[] { new BehaviorTreeStateData() { Name = DefaultDestinationState } }; } } List <BehaviorData> extra = new List <BehaviorData>(); foreach (var b in list) { if (!IsInHierarchy(b)) { extra.Add(b); } } if (extra.Count > 0) { ExtraBehaviors = extra.ToArray(); } }