public static BehaviorXml ExportBehavior(BehaviorBase behavior) { if (behavior == null) { return(null); } var details = new BehaviorXml { Effect = behavior.Effect }; var type = behavior.GetType(); var attribute = type.GetCustomAttribute <BehaviorAttribute>(); if (attribute == null) { throw new Exception($"Invalid behavior: {behavior.GetType()}"); } details.Type = (uint)attribute.Template; var properties = new List <ParameterXml>(); foreach (var property in type.GetProperties()) { if (property.Name == "Effect") { continue; } var info = property.GetCustomAttribute <ParameterAttribute>(); if (info == null) { continue; } var propertyDetails = new ParameterXml { Name = info.Name }; if (property.PropertyType == typeof(BehaviorBase)) { propertyDetails.Behavior = true; propertyDetails.Next = ExportBehavior(property.GetValue(behavior) as BehaviorBase); } else if (property.PropertyType == typeof(bool)) { propertyDetails.Value = (bool)property.GetValue(behavior) ? 1 : 0; } else { propertyDetails.Value = (float)Convert.ChangeType( property.GetValue(behavior) ?? 0f, typeof(float) ); } properties.Add(propertyDetails); } details.Parameters = properties.ToArray(); behavior.Export(details); return(details); }