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); }
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); } } }
public virtual void AddNatives(SourceMod.IExtension myself, sp_nativeinfo_s[] natives) { impl.AddNatives(Native, myself, natives); }
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)); }
public virtual bool AddInterface(SourceMod.IExtension myself, SourceMod.SMInterface iface) { return(impl.AddInterface(Native, myself, iface)); }
public virtual void DropCapabilityProvider(SourceMod.IExtension myself, SourceMod.IFeatureProvider provider, string name) { impl.DropCapabilityProvider(Native, myself, provider, name); }
public virtual void OverrideNatives(SourceMod.IExtension myself, sp_nativeinfo_s natives) { impl.OverrideNatives(Native, myself, natives); }
public virtual void RegisterLibrary(SourceMod.IExtension myself, string name) { impl.RegisterLibrary(Native, myself, name); }
public virtual void AddDependency(SourceMod.IExtension myself, string filename, bool require, bool autoload) { impl.AddDependency(Native, myself, filename, require, autoload); }
public virtual void LogError(SourceMod.IExtension pExt, string format) { impl.LogError(Native, pExt, format); }
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)); }
public void AddNatives(SourceMod.IExtension myself, string name, Func <IPluginContext, int[], int> func) { AddNatives(myself, new NativeInfo(name, func)); }
public void AddNatives(SourceMod.IExtension myself, string name, Func <IntPtr, IntPtr, int> func) { AddNatives(myself, new NativeInfo(name, func)); }
public void AddNatives(SourceMod.IExtension myself, NativeInfo info) { AddNatives(myself, new NativeInfo[] { info }); }
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); } }); }
public virtual bool UnloadExtension(SourceMod.IExtension pExt) { return(impl.UnloadExtension(Native, pExt)); }