void Awake() { SpriteRenderer = GetComponent <SpriteRenderer>(); OnMouse = new OnMouse(); MainCamera = Camera.main; gameControl = GameObject.Find("GameControll"); }
private void OnMouseWheel(object sender, MouseWheelEventArgs e) { mMouseState.X = e.X; mMouseState.Y = e.Y; mMouseState.Delta = e.Delta; mMouseState.IsScrolled = true; OnMouse?.Invoke(this, mMouseState); mMouseState.IsScrolled = false; }
internal static unsafe void InitializePlugin(PluginHeader *plugin) { _onConnected = OnConnected; _onDisconnected = OnDisconnected; _onReceive = OnPacketReceive; _onSend = OnPacketSend; _onPlayerPositionChanged = OnPlayerPositionChanged; _onClientClosing = OnClientClosing; _onHotkeyPressed = OnHotkeyPressed; _onMouse = OnMouse; _onTick = OnTick; WindowHandle = plugin->HWND; plugin->OnConnected = Marshal.GetFunctionPointerForDelegate(_onConnected); plugin->OnDisconnected = Marshal.GetFunctionPointerForDelegate(_onDisconnected); plugin->OnRecv = Marshal.GetFunctionPointerForDelegate(_onReceive); plugin->OnSend = Marshal.GetFunctionPointerForDelegate(_onSend); plugin->OnPlayerPositionChanged = Marshal.GetFunctionPointerForDelegate(_onPlayerPositionChanged); plugin->OnClientClosing = Marshal.GetFunctionPointerForDelegate(_onClientClosing); plugin->OnHotkeyPressed = Marshal.GetFunctionPointerForDelegate(_onHotkeyPressed); plugin->OnMouse = Marshal.GetFunctionPointerForDelegate(_onMouse); plugin->Tick = Marshal.GetFunctionPointerForDelegate(_onTick); _getPacketLength = Marshal.GetDelegateForFunctionPointer <OnGetPacketLength>(plugin->GetPacketLength); _getUOFilePath = Marshal.GetDelegateForFunctionPointer <OnGetUOFilePath>(plugin->GetUOFilePath); _sendToClient = Marshal.GetDelegateForFunctionPointer <OnPacketSendRecv>(plugin->Recv); _sendToServer = Marshal.GetDelegateForFunctionPointer <OnPacketSendRecv>(plugin->Send); _requestMove = Marshal.GetDelegateForFunctionPointer <RequestMove>(plugin->RequestMove); _setTitle = Marshal.GetDelegateForFunctionPointer <OnSetTitle>(plugin->SetTitle); ClientPath = _getUOFilePath(); ClientVersion = new Version((byte)(plugin->ClientVersion >> 24), (byte)(plugin->ClientVersion >> 16), (byte)(plugin->ClientVersion >> 8), (byte)plugin->ClientVersion); if (!Path.IsPathRooted(ClientPath)) { ClientPath = Path.GetFullPath(ClientPath); } Art.Initialize(ClientPath); Hues.Initialize(ClientPath); Cliloc.Initialize(ClientPath); Skills.Initialize(ClientPath); Speech.Initialize(ClientPath); TileData.Initialize(ClientPath); Statics.Initialize(ClientPath); MapInfo.Initialize(ClientPath); ClassicAssembly = AppDomain.CurrentDomain.GetAssemblies() .FirstOrDefault(a => a.FullName.StartsWith("ClassicUO,")); InitializeExtensions(); }
private void OnMouseMove(object sender, MouseMoveEventArgs e) { mMouseState.X = e.X; mMouseState.Y = e.Y; mMouseState.XDelta = e.XDelta; mMouseState.YDelta = e.YDelta; mMouseState.IsMoved = true; OnMouse?.Invoke(this, mMouseState); mMouseState.IsMoved = false; }
private void OnMouseUp(object sender, MouseButtonEventArgs e) { mMouseState.X = e.X; mMouseState.Y = e.Y; mMouseState.Button = e.Button; mMouseState.IsPressed = e.IsPressed; mMouseState.ButtonDown[e.Button] = false; OnMouse?.Invoke(this, mMouseState); mMouseState.IsPressed = false; }
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); }
private void OnUpdateFrame(object sender, FrameEventArgs e) { Dispatcher.ExecuteNextAction(); mElapsedTime = mTimer.Elapsed.TotalSeconds; if (mElapsedTime < mWaitTime) { return; } OnMouse?.Invoke(this, mMouseState); OnKeyboard?.Invoke(this, mKeyboardState); GL.Enable(EnableCap.Texture2D); GL.Enable(EnableCap.ScissorTest); GL.Enable(EnableCap.Blend); GL.BlendFunc(BlendingFactor.SrcAlpha, BlendingFactor.OneMinusSrcAlpha); mRoot.Update(); }
internal static unsafe void InitializePlugin(PluginHeader *plugin) { _onConnected = OnConnected; _onDisconnected = OnDisconnected; _onReceive = OnPacketReceive; _onSend = OnPacketSend; _onPlayerPositionChanged = OnPlayerPositionChanged; _onClientClosing = OnClientClosing; _onHotkeyPressed = OnHotkeyPressed; _onMouse = OnMouse; _hWnd = plugin->HWND; plugin->OnConnected = Marshal.GetFunctionPointerForDelegate(_onConnected); plugin->OnDisconnected = Marshal.GetFunctionPointerForDelegate(_onDisconnected); plugin->OnRecv = Marshal.GetFunctionPointerForDelegate(_onReceive); plugin->OnSend = Marshal.GetFunctionPointerForDelegate(_onSend); plugin->OnPlayerPositionChanged = Marshal.GetFunctionPointerForDelegate(_onPlayerPositionChanged); plugin->OnClientClosing = Marshal.GetFunctionPointerForDelegate(_onClientClosing); plugin->OnHotkeyPressed = Marshal.GetFunctionPointerForDelegate(_onHotkeyPressed); plugin->OnMouse = Marshal.GetFunctionPointerForDelegate(_onMouse); _getPacketLength = Marshal.GetDelegateForFunctionPointer <OnGetPacketLength>(plugin->GetPacketLength); _getUOFilePath = Marshal.GetDelegateForFunctionPointer <OnGetUOFilePath>(plugin->GetUOFilePath); _sendToClient = Marshal.GetDelegateForFunctionPointer <OnPacketSendRecv>(plugin->Recv); _sendToServer = Marshal.GetDelegateForFunctionPointer <OnPacketSendRecv>(plugin->Send); _requestMove = Marshal.GetDelegateForFunctionPointer <RequestMove>(plugin->RequestMove); ClientPath = _getUOFilePath(); if (!Path.IsPathRooted(ClientPath)) { ClientPath = Path.GetFullPath(ClientPath); } Art.Initialize(ClientPath); Hues.Initialize(ClientPath); Cliloc.Initialize(ClientPath); Skills.Initialize(ClientPath); Speech.Initialize(ClientPath); TileData.Initialize(ClientPath); }
internal static bool InstallHooks(PluginHeader *header) { _sendToClient = Marshal.GetDelegateForFunctionPointer <OnPacketSendRecv>(header->Recv); _sendToServer = Marshal.GetDelegateForFunctionPointer <OnPacketSendRecv>(header->Send); _getPacketLength = Marshal.GetDelegateForFunctionPointer <OnGetPacketLength>(header->GetPacketLength); _getPlayerPosition = Marshal.GetDelegateForFunctionPointer <OnGetPlayerPosition>(header->GetPlayerPosition); _castSpell = Marshal.GetDelegateForFunctionPointer <OnCastSpell>(header->CastSpell); _getStaticImage = Marshal.GetDelegateForFunctionPointer <OnGetStaticImage>(header->GetStaticImage); _requestMove = Marshal.GetDelegateForFunctionPointer <RequestMove>(header->RequestMove); ClientWindow = header->HWND; _onTick = Tick; _recv = OnRecv; _send = OnSend; _onHotkeyPressed = OnHotKeyHandler; _onMouse = OnMouseHandler; _onUpdatePlayerPosition = OnPlayerPositionChanged; _onClientClose = OnClientClosing; _onInitialize = OnInitialize; _onConnected = OnConnected; _onDisconnected = OnDisconnected; // _onFocusGained = OnFocusGained; // _onFocusLost = OnFocusLost; 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 ); header->Tick = Marshal.GetFunctionPointerForDelegate(_onTick); return(true); }
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(); }
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(); }
private void Update() { OnVerticalAxis?.Invoke(GetVertical); OnMouse?.Invoke(GetMouseVertical, GetMouseHorizontal); }
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(); }
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(); }