public void Load() { _recv = OnPluginRecv; _send = OnPluginSend; _recv_new = OnPluginRecv_new; _send_new = OnPluginSend_new; _getPacketLength = PacketsTable.GetPacketLength; _getPlayerPosition = GetPlayerPosition; _castSpell = GameActions.CastSpell; _getStaticImage = GetStaticImage; _getUoFilePath = GetUOFilePath; _requestMove = RequestMove; _setTitle = SetWindowTitle; _get_static_data = GetStaticData; _get_tile_data = GetTileData; _get_cliloc = GetCliloc; SDL.SDL_SysWMinfo info = new SDL.SDL_SysWMinfo(); SDL.SDL_VERSION(out info.version); SDL.SDL_GetWindowWMInfo(Client.Game.Window.Handle, 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)Client.Version, 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), Recv_new = Marshal.GetFunctionPointerForDelegate(_recv_new), Send_new = Marshal.GetFunctionPointerForDelegate(_send_new), SDL_Window = Client.Game.Window.Handle, GetStaticData = Marshal.GetFunctionPointerForDelegate(_get_static_data), GetTileData = Marshal.GetFunctionPointerForDelegate(_get_tile_data), GetCliloc = Marshal.GetFunctionPointerForDelegate(_get_cliloc) }; void *func = &header; if (Environment.OSVersion.Platform != PlatformID.Unix && Environment.OSVersion.Platform != PlatformID.MacOSX) { UnblockPath(Path.GetDirectoryName(PluginPath)); } try { IntPtr assptr = Native.LoadLibrary(PluginPath); Log.Trace($"assembly: {assptr}"); if (assptr == IntPtr.Zero) { throw new Exception("Invalid Assembly, Attempting managed load."); } Log.Trace($"Searching for 'Install' entry point - {assptr}"); IntPtr installPtr = Native.GetProcessAddress(assptr, "Install"); Log.Trace($"Entry point: {installPtr}"); if (installPtr == IntPtr.Zero) { throw new Exception("Invalid Entry Point, Attempting managed load."); } Marshal.GetDelegateForFunctionPointer <OnInstall>(installPtr)(func); Console.WriteLine(">>> ADDRESS {0}", header.OnInitialize); } catch { try { Assembly asm = Assembly.LoadFile(PluginPath); Type type = asm.GetType("Assistant.Engine"); if (type == null) { Log.Error ( "Unable to find Plugin Type, API requires the public class Engine in namespace Assistant." ); return; } MethodInfo meth = type.GetMethod("Install", BindingFlags.Public | BindingFlags.Static); if (meth == null) { Log.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.Error ( $"Plugin threw an error during Initialization. {err.Message} {err.StackTrace} {err.InnerException?.Message} {err.InnerException?.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); } if (header.OnRecv_new != IntPtr.Zero) { _onRecv_new = Marshal.GetDelegateForFunctionPointer <OnPacketSendRecv_new>(header.OnRecv_new); } if (header.OnSend_new != IntPtr.Zero) { _onSend_new = Marshal.GetDelegateForFunctionPointer <OnPacketSendRecv_new>(header.OnSend_new); } if (header.OnDrawCmdList != IntPtr.Zero) { _draw_cmd_list = Marshal.GetDelegateForFunctionPointer <OnDrawCmdList>(header.OnDrawCmdList); } if (header.OnWndProc != IntPtr.Zero) { _on_wnd_proc = Marshal.GetDelegateForFunctionPointer <OnWndProc>(header.OnWndProc); } IsValid = true; _onInitialize?.Invoke(); }
public void Load() { _recv = OnPluginRecv; _send = OnPluginSend; _recv_new = OnPluginRecv_new; _send_new = OnPluginSend_new; _getPacketLength = PacketsTable.GetPacketLength; _getPlayerPosition = GetPlayerPosition; _castSpell = GameActions.CastSpell; _getStaticImage = GetStaticImage; _getUoFilePath = GetUOFilePath; _requestMove = RequestMove; _setTitle = SetWindowTitle; _get_static_data = GetStaticData; _get_tile_data = GetTileData; /* * 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) Client.Version, * 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), * Recv_new = Marshal.GetFunctionPointerForDelegate(_recv_new), * Send_new = Marshal.GetFunctionPointerForDelegate(_send_new), * * SDL_Window = Client.Game.Window.Handle, * GetStaticData = Marshal.GetFunctionPointerForDelegate(_get_static_data), * GetTileData = Marshal.GetFunctionPointerForDelegate(_get_tile_data), * * }; * * void* func = &header; * * if(Environment.OSVersion.Platform != PlatformID.Unix && Environment.OSVersion.Platform != PlatformID.MacOSX) * UnblockPath(Path.GetDirectoryName(_path)); * * try * { * IntPtr assptr = Native.LoadLibrary(_path); * * Log.Trace($"assembly: {assptr}"); * * if (assptr == IntPtr.Zero) * throw new Exception("Invalid Assembly, Attempting managed load."); * * Log.Trace($"Searching for 'Install' entry point - {assptr}"); * * IntPtr installPtr = Native.GetProcessAddress(assptr, "Install"); * * Log.Trace($"Entry point: {installPtr}"); * * if (installPtr == IntPtr.Zero) * throw new Exception("Invalid Entry Point, Attempting managed load."); * * Marshal.GetDelegateForFunctionPointer<OnInstall>(installPtr)(func); * * Console.WriteLine(">>> ADDRESS {0}", header.OnInitialize); * } * catch * { * try * { * var asm = Assembly.LoadFile(_path); * var type = asm.GetType("Assistant.Engine"); * * if (type == null) * { * Log.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.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.Error( * $"Plugin threw an error during Initialization. {err.Message} {err.StackTrace} {err.InnerException?.Message} {err.InnerException?.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); * * * if (header.OnRecv_new != IntPtr.Zero) * _onRecv_new = Marshal.GetDelegateForFunctionPointer<OnPacketSendRecv_new>(header.OnRecv_new); * if (header.OnSend_new != IntPtr.Zero) * _onSend_new = Marshal.GetDelegateForFunctionPointer<OnPacketSendRecv_new>(header.OnSend_new); * * if (header.OnDrawCmdList != IntPtr.Zero) * _draw_cmd_list = Marshal.GetDelegateForFunctionPointer<OnDrawCmdList>(header.OnDrawCmdList); * if (header.OnWndProc != IntPtr.Zero) * _on_wnd_proc = Marshal.GetDelegateForFunctionPointer<OnWndProc>(header.OnWndProc); */ #if ENABLE_INTERNAL_ASSISTANT if (_path == hardcodedInternalAssistantPath) { try { Assistant.Engine.Install(null); Assistant.Engine.UOSteamClient._sendToClient = OnPluginRecv; Assistant.Engine.UOSteamClient._sendToServer = OnPluginSend; Assistant.Engine.UOSteamClient._getPacketLength = PacketsTable.GetPacketLength; Assistant.Engine.UOSteamClient._getPlayerPosition = GetPlayerPosition; Assistant.Engine.UOSteamClient._castSpell = GameActions.CastSpell; Assistant.Engine.UOSteamClient._getStaticImage = GetStaticImage; Assistant.Engine.UOSteamClient._requestMove = RequestMove; Assistant.Engine.UOSteamClient._setTitle = SetWindowTitle; Assistant.Engine.UOSteamClient._uoFilePath = GetUOFilePath; _onRecv = Assistant.Engine.UOSteamClient._recv; _onSend = Assistant.Engine.UOSteamClient._send; _onHotkeyPressed = Assistant.Engine.UOSteamClient._onHotkeyPressed; _onMouse = Assistant.Engine.UOSteamClient._onMouse; _onUpdatePlayerPosition = Assistant.Engine.UOSteamClient._onUpdatePlayerPosition; _onClientClose = Assistant.Engine.UOSteamClient._onClientClose; _onInitialize = Assistant.Engine.UOSteamClient._onInitialize; _onConnected = Assistant.Engine.UOSteamClient._onConnected; _onDisconnected = Assistant.Engine.UOSteamClient._onDisconnected; _onFocusGained = Assistant.Engine.UOSteamClient._onFocusGained; _onFocusLost = Assistant.Engine.UOSteamClient._onFocusLost; _tick = Assistant.Engine.UOSteamClient._tick; } catch (Exception err) { Log.Error( $"Plugin threw an error during Initialization. {err.Message} {err.StackTrace} {err.InnerException?.Message} {err.InnerException?.StackTrace}"); return; } } #endif IsValid = true; _onInitialize?.Invoke(); }