예제 #1
0
        /// <summary>
        /// Invokes a preregistered function through the ScriptModuleComms class
        /// </summary>
        /// <param name="fname">The name of the function to invoke</param>
        /// <param name="fname">List of parameters</param>
        /// <returns>string result of the invocation</returns>
        protected object modInvoke(string fname, params object[] parms)
        {
            if (!m_MODFunctionsEnabled)
            {
                MODShoutError("Module command functions not enabled");
                return("");
            }

//            m_log.DebugFormat(
//                "[MOD API]: Invoking dynamic function {0}, args '{1}' with {2} return type",
//                fname,
//                string.Join(",", Array.ConvertAll<object, string>(parms, o => o.ToString())),
//                ((MethodInfo)MethodBase.GetCurrentMethod()).ReturnType);

            Type[] signature = m_comms.LookupTypeSignature(fname);
            if (signature.Length != parms.Length)
            {
                MODError(String.Format("wrong number of parameters to function {0}", fname));
            }

            object[] convertedParms = new object[parms.Length];
            for (int i = 0; i < parms.Length; i++)
            {
                convertedParms[i] = ConvertFromLSL(parms[i], signature[i], fname);
            }

            // now call the function, the contract with the function is that it will always return
            // non-null but don't trust it completely
            try
            {
                object result = m_comms.InvokeOperation(m_host.UUID, m_item.ItemID, fname, convertedParms);
                if (result != null)
                {
                    return(result);
                }

                Type returntype = m_comms.LookupReturnType(fname);
                if (returntype == typeof(void))
                {
                    return(null);
                }

                MODError(String.Format("Invocation of {0} failed; null return value", fname));
            }
            catch (Exception e)
            {
                MODError(String.Format("Invocation of {0} failed; {1}", fname, e.Message));
            }

            return(null);
        }
예제 #2
0
        /// <summary>
        /// Invokes a preregistered function through the ScriptModuleComms class
        /// </summary>
        /// <param name="fname">The name of the function to invoke</param>
        /// <param name="fname">List of parameters</param>
        /// <returns>string result of the invocation</returns>
        protected object modInvoke(string fname, params object[] parms)
        {
            if (!m_MODFunctionsEnabled)
            {
                MODShoutError("Module command functions not enabled");
                return("");
            }

            Type[] signature = m_comms.LookupTypeSignature(fname);
            if (signature.Length != parms.Length)
            {
                MODError(String.Format("wrong number of parameters to function {0}", fname));
            }

            object[] convertedParms = new object[parms.Length];
            for (int i = 0; i < parms.Length; i++)
            {
                convertedParms[i] = ConvertFromLSL(parms[i], signature[i], fname);
            }

            // now call the function, the contract with the function is that it will always return
            // non-null but don't trust it completely
            try
            {
                object result = m_comms.InvokeOperation(m_host.UUID, m_item.ItemID, fname, convertedParms);
                if (result != null)
                {
                    return(result);
                }

                MODError(String.Format("Invocation of {0} failed; null return value", fname));
            }
            catch (Exception e)
            {
                MODError(String.Format("Invocation of {0} failed; {1}", fname, e.Message));
            }

            return(null);
        }