예제 #1
0
 public void AddNatives(SourceMod.IExtension myself, NativeInfo[] info)
 {
     sp_nativeinfo_s[] natives = new sp_nativeinfo_s[info.Length + 1];
     for (int i = 0; i < info.Length; i++)
     {
         natives[i] = new sp_nativeinfo_s(info[i].Name, Marshal.GetFunctionPointerForDelegate(info[i].Function));
     }
     AddNatives(myself, natives);
 }
예제 #2
0
 public void AddNatives(SourceMod.IExtension myself, Type type)
 {
     foreach (var method in type.GetMethods())
     {
         var attributes = method.GetCustomAttributes(typeof(SPMethodAttribute), false);
         foreach (SPMethodAttribute attribute in attributes)
         {
             AddNatives(myself, attribute, method);
         }
     }
 }
예제 #3
0
 public virtual void AddNatives(SourceMod.IExtension myself, sp_nativeinfo_s[] natives)
 {
     impl.AddNatives(Native, myself, natives);
 }
예제 #4
0
 public virtual bool RequestInterface(string iface_name, uint iface_vers, SourceMod.IExtension myself, IntPtr pIface)
 {
     return(impl.RequestInterface(Native, iface_name, iface_vers, myself, pIface));
 }
예제 #5
0
 public virtual bool AddInterface(SourceMod.IExtension myself, SourceMod.SMInterface iface)
 {
     return(impl.AddInterface(Native, myself, iface));
 }
예제 #6
0
 public virtual void DropCapabilityProvider(SourceMod.IExtension myself, SourceMod.IFeatureProvider provider, string name)
 {
     impl.DropCapabilityProvider(Native, myself, provider, name);
 }
예제 #7
0
 public virtual void OverrideNatives(SourceMod.IExtension myself, sp_nativeinfo_s natives)
 {
     impl.OverrideNatives(Native, myself, natives);
 }
예제 #8
0
 public virtual void RegisterLibrary(SourceMod.IExtension myself, string name)
 {
     impl.RegisterLibrary(Native, myself, name);
 }
예제 #9
0
 public virtual void AddDependency(SourceMod.IExtension myself, string filename, bool require, bool autoload)
 {
     impl.AddDependency(Native, myself, filename, require, autoload);
 }
예제 #10
0
 public virtual void LogError(SourceMod.IExtension pExt, string format)
 {
     impl.LogError(Native, pExt, format);
 }
예제 #11
0
 public virtual bool OnExtensionLoad(SourceMod.IExtension me, SourceMod.IShareSys sys, string error, uint maxlength, bool late)
 {
     return(impl.OnExtensionLoad(Native, me, sys, error, maxlength, late));
 }
예제 #12
0
 public void AddNatives(SourceMod.IExtension myself, string name, Func <IPluginContext, int[], int> func)
 {
     AddNatives(myself, new NativeInfo(name, func));
 }
예제 #13
0
 public void AddNatives(SourceMod.IExtension myself, string name, Func <IntPtr, IntPtr, int> func)
 {
     AddNatives(myself, new NativeInfo(name, func));
 }
예제 #14
0
 public void AddNatives(SourceMod.IExtension myself, NativeInfo info)
 {
     AddNatives(myself, new NativeInfo[] { info });
 }
예제 #15
0
        private void AddNatives(SourceMod.IExtension myself, SPMethodAttribute attribute, MethodInfo method)
        {
            var @params = method.GetParameters();

            AddNatives(myself, attribute.MethodName ?? method.Name, (IPluginContext pluginContext, int[] arguments) => {
                var methodParams = new object[@params.Length];
                int argumenti    = 0;
                for (int i = 0; i < @params.Length; i++)
                {
                    var param = @params[i];
                    var type  = param.ParameterType;
                    if (type == typeof(IPluginContext))
                    {
                        methodParams[i] = pluginContext;
                    }
                    else if (type == typeof(string))
                    {
                        methodParams[i] = GetString(pluginContext, arguments[argumenti]);
                        argumenti++;
                    }
                    else if (type == typeof(int))
                    {
                        methodParams[i] = arguments[argumenti];
                        argumenti++;
                    }
                    else if (type == typeof(uint))
                    {
                        methodParams[i] = (uint)arguments[argumenti];
                        argumenti++;
                    }
                    else if (type == typeof(SPBuffer))
                    {
                        methodParams[i] = new SPBuffer(pluginContext, arguments[argumenti]);
                        argumenti++;
                    }
                    else if (type == typeof(SPSizedBuffer))
                    {
                        methodParams[i] = new SPSizedBuffer(pluginContext, arguments[argumenti], (uint)arguments[argumenti + 1]);
                        argumenti      += 2;
                    }
                    else if (type == typeof(IPluginFunction))
                    {
                        var attributes = param.GetCustomAttributes(typeof(SPMethodAttribute), false);
                        if (attributes.Length > 0)
                        {
                            var attr        = attributes[0] as SPMethodAttribute;
                            methodParams[i] = pluginContext.GetFunctionByName(attr.MethodName);
                        }
                        else
                        {
                            methodParams[i] = pluginContext.GetFunctionById((uint)arguments[argumenti]);
                            argumenti++;
                        }
                    }
                    else if (type.FullName.StartsWith("System.Action") && type.IsGenericType)
                    {
                        var callback = typeof(IShareSys).GetMethods(BindingFlags.NonPublic | BindingFlags.Static).Where(m => m.Name == "Callback")
                                       .Where(m => m.GetGenericArguments().Length == param.ParameterType.GetGenericArguments().Length)
                                       .First().MakeGenericMethod(param.ParameterType.GetGenericArguments());

                        var func = pluginContext.GetFunctionById((uint)arguments[argumenti]);
                        argumenti++;
                        methodParams[i] = Delegate.CreateDelegate(param.ParameterType, func, callback);
                    }
                }
                var ret = method.Invoke(null, methodParams);
                if (method.ReturnType == typeof(int))
                {
                    return((int)ret);
                }
                else
                {
                    return(0);
                }
            });
        }
예제 #16
0
 public virtual bool UnloadExtension(SourceMod.IExtension pExt)
 {
     return(impl.UnloadExtension(Native, pExt));
 }