Advertisement
Guest User

Untitled

a guest
Apr 30th, 2017
59
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.01 KB | None | 0 0
  1. public unsafe class Game : IGame
  2. {
  3. public static Game Instance { get; } = new Game();
  4.  
  5.  
  6. public event EventHandler Ready;
  7.  
  8. private Game() { }
  9.  
  10. public bool IsReady { get; private set; }
  11.  
  12. private DynamicMethod getThreadLocalStorage;
  13.  
  14. private DynamicMethod jassStringHandleToString;
  15.  
  16. private DynamicMethod stringToJassStringIndex;
  17.  
  18. public void Initialize(IntPtr module, Dictionary<string, int> addresses)
  19. {
  20. this.getThreadLocalStorage = StdCall.Create(module + addresses["GAME_GetThreadLocalStorage"], typeof(IntPtr));
  21. this.jassStringHandleToString = FastCall.Create(module + addresses["GAME_JassStringHandleToString"], typeof(IntPtr), typeof(IntPtr));
  22. this.stringToJassStringIndex = FastCall.Create(module + addresses["GAME_StringToJassStringIndex"], typeof(int), typeof(IntPtr));
  23.  
  24. this.IsReady = true;
  25. this.Ready?.Invoke(this, EventArgs.Empty);
  26. }
  27.  
  28. public ThreadLocalStorage* GetThreadLocalStorage() => (ThreadLocalStorage*)(IntPtr)this.getThreadLocalStorage.Invoke(null, new object[] { });
  29.  
  30. public string JassStringHandleToString(IntPtr jassHandle) => Marshal.PtrToStringAnsi((IntPtr)this.jassStringHandleToString.Invoke(null, new object[] { jassHandle }));
  31.  
  32. public int StringToJassStringIndex(string str) => (int)this.stringToJassStringIndex.Invoke(null, new object[] { Marshal.StringToHGlobalAnsi(str) });
  33.  
  34. public IntPtr JassStringIndexToJassStringHandle(int jassStringIndex)
  35. {
  36. return (IntPtr)((int)Marshal.ReadIntPtr(Marshal.ReadIntPtr(Marshal.ReadIntPtr(Marshal.ReadIntPtr(this.GetThreadLocalStorage()->Jass, 0x0C)), 0x2874), 0x0008) + 0x10 * jassStringIndex);
  37. // the above code may be a bit confusing, but we're essentially doing the following, without needing to
  38. // find the function every patch, and avoid the convoluted class hierarchy.
  39. // return Jass->VirtualMachine->StringManager->Table[jassStringIndex];
  40. // sub_6F6B1CA0 in 1.21b
  41. // sub_6F459640 in 1.26.0.6401
  42. // TODO: Future proof this.
  43. }
  44. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement