Exemple #1
0
 internal protected virtual void TriggerOnFocusGained(Component sender)
 {
     if (OnFocusGained != null)
     {
         OnFocusGained.Invoke(new EventArgs(sender));
     }
 }
Exemple #2
0
        public unsafe bool Install(PluginHeader *header)
        {
            _sendToClient =
                (OnPacketSendRecv)Marshal.GetDelegateForFunctionPointer(header->Recv, typeof(OnPacketSendRecv));
            _sendToServer =
                (OnPacketSendRecv)Marshal.GetDelegateForFunctionPointer(header->Send, typeof(OnPacketSendRecv));
            _getPacketLength =
                (OnGetPacketLength)Marshal.GetDelegateForFunctionPointer(header->GetPacketLength,
                                                                         typeof(OnGetPacketLength));
            _getPlayerPosition =
                (OnGetPlayerPosition)Marshal.GetDelegateForFunctionPointer(header->GetPlayerPosition,
                                                                           typeof(OnGetPlayerPosition));
            _castSpell      = (OnCastSpell)Marshal.GetDelegateForFunctionPointer(header->CastSpell, typeof(OnCastSpell));
            _getStaticImage =
                (OnGetStaticImage)Marshal.GetDelegateForFunctionPointer(header->GetStaticImage,
                                                                        typeof(OnGetStaticImage));
            _requestMove =
                (RequestMove)Marshal.GetDelegateForFunctionPointer(header->RequestMove, typeof(RequestMove));
            _setTitle   = (OnSetTitle)Marshal.GetDelegateForFunctionPointer(header->SetTitle, typeof(OnSetTitle));
            _uoFilePath =
                (OnGetUOFilePath)Marshal.GetDelegateForFunctionPointer(header->GetUOFilePath, typeof(OnGetUOFilePath));
            m_ClientVersion = new Version((byte)(header->ClientVersion >> 24), (byte)(header->ClientVersion >> 16),
                                          (byte)(header->ClientVersion >> 8), (byte)header->ClientVersion).ToString();
            m_ClientRunning                 = true;
            m_ClientWindow                  = header->HWND;
            _tick                           = Tick;
            _recv                           = OnRecv;
            _send                           = OnSend;
            _onHotkeyPressed                = OnHotKeyHandler;
            _onMouse                        = OnMouseHandler;
            _onUpdatePlayerPosition         = OnPlayerPositionChanged;
            _onClientClose                  = OnClientClosing;
            _onInitialize                   = OnInitialize;
            _onConnected                    = OnConnected;
            _onDisconnected                 = OnDisconnected;
            _onFocusGained                  = OnFocusGained;
            _onFocusLost                    = OnFocusLost;
            header->Tick                    = Marshal.GetFunctionPointerForDelegate(_tick);
            header->OnRecv                  = Marshal.GetFunctionPointerForDelegate(_recv);
            header->OnSend                  = Marshal.GetFunctionPointerForDelegate(_send);
            header->OnHotkeyPressed         = Marshal.GetFunctionPointerForDelegate(_onHotkeyPressed);
            header->OnMouse                 = Marshal.GetFunctionPointerForDelegate(_onMouse);
            header->OnPlayerPositionChanged = Marshal.GetFunctionPointerForDelegate(_onUpdatePlayerPosition);
            header->OnClientClosing         = Marshal.GetFunctionPointerForDelegate(_onClientClose);
            header->OnInitialize            = Marshal.GetFunctionPointerForDelegate(_onInitialize);
            header->OnConnected             = Marshal.GetFunctionPointerForDelegate(_onConnected);
            header->OnDisconnected          = Marshal.GetFunctionPointerForDelegate(_onDisconnected);
            header->OnFocusGained           = Marshal.GetFunctionPointerForDelegate(_onFocusGained);
            header->OnFocusLost             = Marshal.GetFunctionPointerForDelegate(_onFocusLost);

            return(true);
        }
Exemple #3
0
        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;

            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
            };

            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);
            }


            IsValid = true;

            _onInitialize?.Invoke();
        }
Exemple #4
0
        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();
        }
Exemple #5
0
        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();
        }
Exemple #6
0
        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();
        }