예제 #1
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;
            _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();
        }
예제 #2
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();
        }