Beispiel #1
0
 /// <summary>
 /// Calls a script through the scripting system on an object, returning a typed result
 /// </summary>
 public static T CallOnForResult <T>(string script, object instance, ScriptExecutionContext context, params object[] args)
 {
     return(TypeUtils.CoerceValue <T>(Instance.CallScript(script, instance, context, args)));
 }
Beispiel #2
0
 /// <summary>
 /// Calls a script through the scripting system on an object
 /// </summary>
 public static void CallOn(string script, object instance, ScriptExecutionContext context, params object[] args)
 {
     Instance.CallScript(script, instance, context, args);
 }
Beispiel #3
0
 /// <summary>
 /// Calls a script through the scripting system on an object, returning a result
 /// </summary>
 public static object CallOnForResult(string script, object instance, ScriptExecutionContext context, params object[] args)
 {
     return(Instance.CallScript(script, instance, context, args));
 }
Beispiel #4
0
        private static object CallScriptMethod(MethodInfo scriptMethod, object instance, ScriptExecutionContext context, object[] args)
        {
            //get script attribute
            CCScriptAttribute scriptAttribute = null;
            var scriptAttributes = scriptMethod.GetCustomAttributes(typeof(CCScriptAttribute), false);

            if (scriptAttributes != null && scriptAttributes.Length > 0)
            {
                scriptAttribute = (CCScriptAttribute)scriptAttributes[0];
            }

            //attempt to resolve instance
            if (!scriptMethod.IsStatic && instance == null)
            {
                if (scriptAttribute != null && scriptAttribute.AutoResolveInstance)
                {
                    var property = scriptMethod.DeclaringType.GetProperty("Instance", BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static);
                    if (property != null)
                    {
                        instance = property.GetValue(null);
                    }
                    else
                    {
                        var field = scriptMethod.DeclaringType.GetField("Instance", BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static);
                        if (field != null)
                        {
                            instance = field.GetValue(null);
                        }
                    }
                }

                if (instance == null)
                {
                    throw new NoInstanceForNonStaticMethodException();
                }
            }

            var scriptParameters = scriptMethod.GetParameters();

            //trim and coerce arguments
            object[] trimmedArgs;
            if (scriptParameters == null || scriptParameters.Length == 0)
            {
                //cheap path: pass empty array
                trimmedArgs = new object[] { };
            }
            else if ((scriptAttribute != null && scriptAttribute.NeverPassExecutionContext) || !(scriptParameters != null && scriptParameters.Length > 0 && scriptParameters[0].ParameterType.IsAssignableFrom(typeof(ScriptExecutionContext))))
            {
                //do not pass ScriptExecutionContext
                trimmedArgs = CoerceAndTrimArguments(args, scriptParameters, null);

                //display warning if we had to trim
                if (scriptParameters.Length != args.Length)
                {
                    Debug.LogWarning($"[{nameof(ScriptingModule)}] Argument coercion warning: {GetCallableName(scriptMethod)} expected {scriptParameters.Length} arguments but was passed {args.Length}");
                }
            }
            else
            {
                //pass all args including ScriptExecutionContext
                if (scriptParameters.Length == 1)
                {
                    trimmedArgs = new object[] { context };
                }
                else
                {
                    trimmedArgs = CoerceAndTrimArguments(args, scriptParameters, context);
                }

                //display warning if we had to trim
                if (scriptParameters.Length != args.Length + 1)
                {
                    Debug.LogWarning($"[{nameof(ScriptingModule)}] Argument coercion warning: {GetCallableName(scriptMethod)} expected 1+{scriptParameters.Length-1} arguments but was passed 1+{args.Length}");
                }
            }

            return(scriptMethod.Invoke(instance, trimmedArgs));
        }