public static void Interact(IntPtr hProcess, uint obj)
{
//this is where we get our pointer as of WoW 2.4.2
s_curMgrPointer = Memory.ReadUInt(hProcess, Memory.ReadUInt(hProcess, 0xD495B0) + 0x2218);
//read interact from object vtable
uint interact = Memory.ReadUInt(hProcess, (Memory.ReadUInt(hProcess, obj) + (34 * 4)));
//allocate memory
uint CodeCave = Memory.AllocateMemory(hProcess, 0x1000);
byte[] bInject = { 0x8B, 0x15, 0xEF, 0xBE, 0xAD, 0xDE, 0x64, 0xA1, 0x2C, 0x00, 0x00, 0x00, 0x8B, 0x00, 0x83, 0xC0, 0x10, 0x89, 0x10, 0x8B, 0x0D, 0xEF, 0xBE, 0xAD, 0xDE, 0xE8, 0, 0, 0, 0, 0xC3};
//inject memory
Memory.WriteMemory(hProcess, CodeCave, bInject);
//patch relatives
Memory.WriteMemory(hProcess, (CodeCave + 2), s_curMgrPointer);
Memory.WriteMemory(hProcess, (CodeCave + 21), (CodeCave + 0x100));
Memory.WriteMemory(hProcess, (CodeCave + 26), (interact - (CodeCave + 30)));
//write object with which we wish to interact to memory
Memory.WriteMemory(hProcess, (CodeCave + 0x100), obj);
//Execute injected code
IntPtr hThread = Memory.CreateRemoteThread(hProcess, CodeCave, 0);
//wait for code to execute
Memory.WaitForSingleObject(hThread);
//uint ec = Memory.GetExitCodeThread(hThread);
//clean up
Memory.CloseHandle(hThread);
Memory.VirtualFreeEx(hProcess, CodeCave, 0x1000, Memory.MEM_DECOMMIT);
}