コード例 #1
0
ファイル: ScriptManager.cs プロジェクト: iniside/CryCIL
        // ReSharper disable UnusedParameter.Local
        private Exception LoadPlugins(bool initialLoad)
        // ReSharper restore UnusedParameter.Local
        {
            var pluginsDirectory = ProjectSettings.PluginsFolder;

            if (!Directory.Exists(pluginsDirectory))
            {
                return(null);
            }

            foreach (var directory in Directory.GetDirectories(pluginsDirectory))
            {
                var compilerDll = Path.Combine(directory, "Compiler.dll");
                if (File.Exists(compilerDll))
                {
                    var assembly = LoadAssembly(compilerDll);
                    if (assembly == null)
                    {
                        continue;
                    }

                    ICryMonoPlugin compiler     = null;
                    var            compilerType = assembly.GetTypes().FirstOrDefault(x => x.Implements <ICryMonoPlugin>());
                    if (compilerType != null)
                    {
                        Debug.LogAlways("        Initializing CryMono plugin: {0}...", compilerType.Name);

                        compiler = Activator.CreateInstance(compilerType) as ICryMonoPlugin;
                    }

                    if (compiler != null)
                    {
                        this.PluginTypes.Add(compiler, null);

                        var assemblyPaths = Directory.GetFiles(directory, "*.dll", SearchOption.AllDirectories);
                        var assemblies    =
                            assemblyPaths.Where(assemblyPath => assemblyPath != compilerDll)
                            .Select(this.LoadAssembly)
                            .Where(foundAssembly => foundAssembly != null)
                            .ToList();

                        try
                        {
                            this.PluginTypes[compiler] = compiler.GetTypes(assemblies);
                        }
                        catch (Exception ex)
                        {
                            return(ex);
                        }
                    }
                }
            }

            return(null);
        }
コード例 #2
0
        void ProcessWaitingScripts(bool initialLoad)
        {
            bool hasDefaultGameRules = false;

            foreach (var pluginPair in PluginTypes)
            {
                ICryMonoPlugin plugin = pluginPair.Key;

                foreach (Type type in pluginPair.Value)
                {
                    var script = FindScript(ScriptType.Any, x => x.Type == type);
                    if (script == null)
                    {
                        if (!CryScript.TryCreate(type, out script))
                        {
                            continue;
                        }
                    }

                    script.RegistrationParams = plugin.GetRegistrationParams(script.ScriptType, type);

                    if (!script.Registered)
                    {
                        if (script == null || script.RegistrationParams == null)
                        {
                            continue;
                        }

                        // Contain types that can only be registered at startup here.
                        if (initialLoad)
                        {
                            if (script.RegistrationParams is ActorRegistrationParams)
                            {
                                var registrationParams = (ActorRegistrationParams)script.RegistrationParams;

                                NativeActorMethods.RegisterActorClass(script.ScriptName, script.Type.Implements(typeof(NativeActor)), registrationParams.isAI);
                            }
                            else if (script.RegistrationParams is EntityRegistrationParams)
                            {
                                var registrationParams = (EntityRegistrationParams)script.RegistrationParams;

                                if (registrationParams.name == null)
                                {
                                    registrationParams.name = script.ScriptName;
                                }
                                if (registrationParams.category == null)
                                {
                                    registrationParams.category = "Default";
                                }

                                NativeEntityMethods.RegisterEntityClass(registrationParams);

                                script.RegistrationParams = registrationParams;
                            }
                        }

                        if (script.RegistrationParams is GameRulesRegistrationParams)
                        {
                            var registrationParams = (GameRulesRegistrationParams)script.RegistrationParams;

                            if (registrationParams.name == null)
                            {
                                registrationParams.name = script.ScriptName;
                            }

                            NativeGameRulesMethods.RegisterGameMode(registrationParams.name);

                            if (registrationParams.defaultGamemode || !hasDefaultGameRules)
                            {
                                NativeGameRulesMethods.SetDefaultGameMode(registrationParams.name);

                                hasDefaultGameRules = true;
                            }

                            script.RegistrationParams = registrationParams;
                        }
                        else if (script.RegistrationParams is FlowNodeRegistrationParams)
                        {
                            var registrationParams = (FlowNodeRegistrationParams)script.RegistrationParams;

                            if (registrationParams.name == null)
                            {
                                registrationParams.name = script.ScriptName;
                            }
                            if (registrationParams.category == null)
                            {
                                registrationParams.category = script.Type.Namespace;
                            }
                            if (registrationParams.filter == 0)
                            {
                                registrationParams.filter = FlowNodeFilter.Approved;
                            }

                            script.RegistrationParams = registrationParams;

                            script.ScriptName = registrationParams.category + ":" + registrationParams.name;
                        }
                        else if (script.RegistrationParams is EntityFlowNodeRegistrationParams)
                        {
                            var registrationParams = (EntityFlowNodeRegistrationParams)script.RegistrationParams;

                            script.ScriptName = "entity" + ":" + registrationParams.entityName;
                        }

                        script.Registered = true;
                        Scripts.Add(script);
                    }
                }
            }
        }