public void Load() { _recv = OnPluginRecv; _send = OnPluginSend; _getPacketLength = PacketsTable.GetPacketLength; _getPlayerPosition = GetPlayerPosition; _castSpell = GameActions.CastSpell; _getStaticImage = GetStaticImage; _getUoFilePath = GetUOFilePath; IntPtr assptr = SDL2EX.SDL_LoadObject(_path); Log.Message(LogTypes.Trace, $"assembly: {assptr}"); if (assptr == IntPtr.Zero) { Log.Message(LogTypes.Error, "Invalid assemlby."); return; } Log.Message(LogTypes.Trace, $"Searching for 'Install' entry point - {assptr}"); IntPtr installPtr = SDL2EX.SDL_LoadFunction(assptr, "Install"); Log.Message(LogTypes.Trace, $"Entry point: {installPtr}"); if (installPtr == IntPtr.Zero) { Log.Message(LogTypes.Error, "Invalid entry point."); return; } //IntPtr headerPtr = Marshal.AllocHGlobal(4 + 8 * 18); // 256 ? //Marshal.WriteInt32(headerPtr, (int)FileManager.ClientVersion); //Marshal.WriteIntPtr(headerPtr, Marshal.GetFunctionPointerForDelegate(_recv)); //Marshal.WriteIntPtr(headerPtr, Marshal.GetFunctionPointerForDelegate(_send)); //Marshal.WriteIntPtr(headerPtr, Marshal.GetFunctionPointerForDelegate(_getPacketLength)); //Marshal.WriteIntPtr(headerPtr, Marshal.GetFunctionPointerForDelegate(_getPlayerPosition)); //Marshal.WriteIntPtr(headerPtr, Marshal.GetFunctionPointerForDelegate(_castSpell)); //Marshal.WriteIntPtr(headerPtr, Marshal.GetFunctionPointerForDelegate(_getStaticImage)); //Marshal.WriteIntPtr(headerPtr, SDL.SDL_GL_GetCurrentWindow()); //Marshal.WriteIntPtr(headerPtr, Marshal.GetFunctionPointerForDelegate(_getUoFilePath)); SDL.SDL_SysWMinfo info = new SDL.SDL_SysWMinfo(); SDL.SDL_VERSION(out info.version); SDL.SDL_GetWindowWMInfo(SDL.SDL_GL_GetCurrentWindow(), ref info); IntPtr hwnd = IntPtr.Zero; if (info.subsystem == SDL.SDL_SYSWM_TYPE.SDL_SYSWM_WINDOWS) { hwnd = info.info.win.window; } PluginHeader header = new PluginHeader { ClientVersion = (int)FileManager.ClientVersion, Recv = Marshal.GetFunctionPointerForDelegate(_recv), Send = Marshal.GetFunctionPointerForDelegate(_send), GetPacketLength = Marshal.GetFunctionPointerForDelegate(_getPacketLength), GetPlayerPosition = Marshal.GetFunctionPointerForDelegate(_getPlayerPosition), CastSpell = Marshal.GetFunctionPointerForDelegate(_castSpell), GetStaticImage = Marshal.GetFunctionPointerForDelegate(_getStaticImage), HWND = hwnd, GetUOFilePath = Marshal.GetFunctionPointerForDelegate(_getUoFilePath) }; void *func = &header; Marshal.GetDelegateForFunctionPointer <OnInstall>(installPtr)(ref func); if (header.OnRecv != IntPtr.Zero) { _onRecv = Marshal.GetDelegateForFunctionPointer <OnPacketSendRecv>(header.OnRecv); } if (header.OnSend != IntPtr.Zero) { _onSend = Marshal.GetDelegateForFunctionPointer <OnPacketSendRecv>(header.OnSend); } if (header.OnHotkeyPressed != IntPtr.Zero) { _onHotkeyPressed = Marshal.GetDelegateForFunctionPointer <OnHotkey>(header.OnHotkeyPressed); } if (header.OnMouse != IntPtr.Zero) { _onMouse = Marshal.GetDelegateForFunctionPointer <OnMouse>(header.OnMouse); } if (header.OnPlayerPositionChanged != IntPtr.Zero) { _onUpdatePlayerPosition = Marshal.GetDelegateForFunctionPointer <OnUpdatePlayerPosition>(header.OnPlayerPositionChanged); } if (header.OnClientClosing != IntPtr.Zero) { _onClientClose = Marshal.GetDelegateForFunctionPointer <OnClientClose>(header.OnClientClosing); } if (header.OnInitialize != IntPtr.Zero) { _onInitialize = Marshal.GetDelegateForFunctionPointer <OnInitialize>(header.OnInitialize); } if (header.OnConnected != IntPtr.Zero) { _onConnected = Marshal.GetDelegateForFunctionPointer <OnConnected>(header.OnConnected); } if (header.OnDisconnected != IntPtr.Zero) { _onDisconnected = Marshal.GetDelegateForFunctionPointer <OnDisconnected>(header.OnDisconnected); } if (header.OnFocusGained != IntPtr.Zero) { _onFocusGained = Marshal.GetDelegateForFunctionPointer <OnFocusGained>(header.OnFocusGained); } if (header.OnFocusLost != IntPtr.Zero) { _onFocusLost = Marshal.GetDelegateForFunctionPointer <OnFocusLost>(header.OnFocusLost); } IsValid = true; //Marshal.FreeHGlobal(headerPtr); _onInitialize?.Invoke(); }
public void Load() { _recv = OnPluginRecv; _send = OnPluginSend; _getPacketLength = PacketsTable.GetPacketLength; _getPlayerPosition = GetPlayerPosition; _castSpell = GameActions.CastSpell; _getStaticImage = GetStaticImage; _getUoFilePath = GetUOFilePath; _requestMove = RequestMove; _setTitle = SetWindowTitle; //IntPtr headerPtr = Marshal.AllocHGlobal(4 + 8 * 18); // 256 ? //Marshal.WriteInt32(headerPtr, (int)FileManager.ClientVersion); //Marshal.WriteIntPtr(headerPtr, Marshal.GetFunctionPointerForDelegate(_recv)); //Marshal.WriteIntPtr(headerPtr, Marshal.GetFunctionPointerForDelegate(_send)); //Marshal.WriteIntPtr(headerPtr, Marshal.GetFunctionPointerForDelegate(_getPacketLength)); //Marshal.WriteIntPtr(headerPtr, Marshal.GetFunctionPointerForDelegate(_getPlayerPosition)); //Marshal.WriteIntPtr(headerPtr, Marshal.GetFunctionPointerForDelegate(_castSpell)); //Marshal.WriteIntPtr(headerPtr, Marshal.GetFunctionPointerForDelegate(_getStaticImage)); //Marshal.WriteIntPtr(headerPtr, SDL.SDL_GL_GetCurrentWindow()); //Marshal.WriteIntPtr(headerPtr, Marshal.GetFunctionPointerForDelegate(_getUoFilePath)); SDL.SDL_SysWMinfo info = new SDL.SDL_SysWMinfo(); SDL.SDL_VERSION(out info.version); SDL.SDL_GetWindowWMInfo(SDL.SDL_GL_GetCurrentWindow(), ref info); IntPtr hwnd = IntPtr.Zero; if (info.subsystem == SDL.SDL_SYSWM_TYPE.SDL_SYSWM_WINDOWS) { hwnd = info.info.win.window; } PluginHeader header = new PluginHeader { ClientVersion = (int)FileManager.ClientVersion, Recv = Marshal.GetFunctionPointerForDelegate(_recv), Send = Marshal.GetFunctionPointerForDelegate(_send), GetPacketLength = Marshal.GetFunctionPointerForDelegate(_getPacketLength), GetPlayerPosition = Marshal.GetFunctionPointerForDelegate(_getPlayerPosition), CastSpell = Marshal.GetFunctionPointerForDelegate(_castSpell), GetStaticImage = Marshal.GetFunctionPointerForDelegate(_getStaticImage), HWND = hwnd, GetUOFilePath = Marshal.GetFunctionPointerForDelegate(_getUoFilePath), RequestMove = Marshal.GetFunctionPointerForDelegate(_requestMove), SetTitle = Marshal.GetFunctionPointerForDelegate(_setTitle) }; void *func = &header; try { IntPtr assptr = SDL2EX.SDL_LoadObject(_path); Log.Message(LogTypes.Trace, $"assembly: {assptr}"); if (assptr == IntPtr.Zero) { throw new Exception("Invalid Assembly, Attempting managed load."); } Log.Message(LogTypes.Trace, $"Searching for 'Install' entry point - {assptr}"); IntPtr installPtr = SDL2EX.SDL_LoadFunction(assptr, "Install"); Log.Message(LogTypes.Trace, $"Entry point: {installPtr}"); if (installPtr == IntPtr.Zero) { throw new Exception("Invalid Entry Point, Attempting managed load."); } Marshal.GetDelegateForFunctionPointer <OnInstall>(installPtr)(ref func); } catch { try { var asm = Assembly.LoadFile(_path); var type = asm.GetType("Assistant.Engine"); if (type == null) { Log.Message(LogTypes.Error, $"Unable to find Plugin Type, API requires the public class Engine in namespace Assistant."); return; } var meth = type.GetMethod("Install", BindingFlags.Public | BindingFlags.Static); if (meth == null) { Log.Message(LogTypes.Error, $"Engine class missing public static Install method Needs 'public static unsafe void Install(PluginHeader *plugin)' "); return; } meth.Invoke(null, new object[] { (IntPtr)func }); } catch (Exception err) { Log.Message(LogTypes.Error, $"Invalid plugin specified. {err} {err.StackTrace}"); return; } } if (header.OnRecv != IntPtr.Zero) { _onRecv = Marshal.GetDelegateForFunctionPointer <OnPacketSendRecv>(header.OnRecv); } if (header.OnSend != IntPtr.Zero) { _onSend = Marshal.GetDelegateForFunctionPointer <OnPacketSendRecv>(header.OnSend); } if (header.OnHotkeyPressed != IntPtr.Zero) { _onHotkeyPressed = Marshal.GetDelegateForFunctionPointer <OnHotkey>(header.OnHotkeyPressed); } if (header.OnMouse != IntPtr.Zero) { _onMouse = Marshal.GetDelegateForFunctionPointer <OnMouse>(header.OnMouse); } if (header.OnPlayerPositionChanged != IntPtr.Zero) { _onUpdatePlayerPosition = Marshal.GetDelegateForFunctionPointer <OnUpdatePlayerPosition>(header.OnPlayerPositionChanged); } if (header.OnClientClosing != IntPtr.Zero) { _onClientClose = Marshal.GetDelegateForFunctionPointer <OnClientClose>(header.OnClientClosing); } if (header.OnInitialize != IntPtr.Zero) { _onInitialize = Marshal.GetDelegateForFunctionPointer <OnInitialize>(header.OnInitialize); } if (header.OnConnected != IntPtr.Zero) { _onConnected = Marshal.GetDelegateForFunctionPointer <OnConnected>(header.OnConnected); } if (header.OnDisconnected != IntPtr.Zero) { _onDisconnected = Marshal.GetDelegateForFunctionPointer <OnDisconnected>(header.OnDisconnected); } if (header.OnFocusGained != IntPtr.Zero) { _onFocusGained = Marshal.GetDelegateForFunctionPointer <OnFocusGained>(header.OnFocusGained); } if (header.OnFocusLost != IntPtr.Zero) { _onFocusLost = Marshal.GetDelegateForFunctionPointer <OnFocusLost>(header.OnFocusLost); } if (header.Tick != IntPtr.Zero) { _tick = Marshal.GetDelegateForFunctionPointer <OnTick>(header.Tick); } IsValid = true; //Marshal.FreeHGlobal(headerPtr); _onInitialize?.Invoke(); }