Exemplo n.º 1
0
        /// <summary>
        /// Loads ParserTargets from other assemblies in GameData/
        /// </summary>
        private static void LoadExternalParserTargets(ConfigNode node, String calling, String configName = "Default",
                                                      Boolean getChilds = true)
        {
            // Look for types in other assemblies with the ExternalParserTarget attribute and the parentNodeName equal to this node's name
            try
            {
                foreach (Type type in ModTypes)
                {
                    try
                    {
                        ParserTargetExternal[] attributes =
                            (ParserTargetExternal[])type.GetCustomAttributes(typeof(ParserTargetExternal), false);
                        if (attributes.Length == 0)
                        {
                            continue;
                        }

                        ParserTargetExternal external = attributes[0];
                        if (node.name != external.ParentNodeName)
                        {
                            continue;
                        }

                        if (calling != external.ModName)
                        {
                            continue;
                        }

                        String nodeName = external.ConfigNodeName ?? type.Name;

                        // Get settings data
                        ParserOptions.Data data = ParserOptions.Options[configName];

                        if (!node.HasNode(nodeName))
                        {
                            continue;
                        }

                        try
                        {
                            data.LogCallback("Parsing ParserTarget " + nodeName + " in node " +
                                             external.ParentNodeName + " from Assembly " + type.Assembly.FullName);
                            ConfigNode nodeToLoad = node.GetNode(nodeName);
                            Object     obj        = CreateObjectFromConfigNode(type, nodeToLoad, configName, getChilds);
                        }
                        catch (MissingMethodException missingMethod)
                        {
                            data.LogCallback("Failed to load ParserTargetExternal " + nodeName +
                                             " because it does not have a parameterless constructor");
                            data.ErrorCallback(missingMethod);
                        }
                        catch (Exception exception)
                        {
                            data.LogCallback("Failed to load ParserTargetExternal " + nodeName + " from node " +
                                             external.ParentNodeName);
                            data.ErrorCallback(exception);
                        }
                    }
                    catch (TypeLoadException)
                    {
                        // ignored
                    }
                }
            }
            catch (ReflectionTypeLoadException)
            {
            }
        }