diff options
author | Jamie Fraser <jamie.f@mumbledog.com> | 2014-10-17 13:20:14 +0400 |
---|---|---|
committer | Mikkel Krautz <mikkel@krautz.dk> | 2014-10-18 04:01:32 +0400 |
commit | 8ab0c4a6b14976b921dbfd0d3f341b6ab8de7c92 (patch) | |
tree | 5325b0cc8f5c6757f061faad6891985c74aed24c /plugins/wow | |
parent | 78b6cc4f2636bdb2bdf7e210c898c9dbc424a6e1 (diff) |
Update WoW Plugin to build 19034
Update WoW plugin, including switching to 128-bit GUIDs, which I've
naively done with a structure containing two 64-bit integers instead.
There's probably a nicer way to do this.
Diffstat (limited to 'plugins/wow')
-rw-r--r-- | plugins/wow/wow.cpp | 79 |
1 files changed, 47 insertions, 32 deletions
diff --git a/plugins/wow/wow.cpp b/plugins/wow/wow.cpp index 1ffa362d5..c3e66454b 100644 --- a/plugins/wow/wow.cpp +++ b/plugins/wow/wow.cpp @@ -39,8 +39,13 @@ typedef long long uint64_t; #include "../mumble_plugin_win32.h" +struct guid { + uint64_t first; + uint64_t second; +}; + uint32_t p_playerBase; -uint64_t g_playerGUID; +guid g_playerGUID; /* * To update visit http://www.ownedcore.com/forums/world-of-warcraft/world-of-warcraft-bots-programs/wow-memory-editing @@ -50,10 +55,11 @@ uint64_t g_playerGUID; * call each value, to ease in upgrading. "[_]" means the value name may or may not * have an underscore in it depending on who's posting the offset. */ -static uint32_t ptr_ClientConnection=0xEC4628; // ClientConnection or CurMgrPointer -static size_t off_ObjectManager=0x462C; // objectManager or CurMgrOffset -static uint32_t ptr_WorldFrame=0xD64E5C; // Camera[_]Pointer -static size_t off_CameraOffset=0x8208; // Camera[_]Offset +static uint32_t ptr_ClientConnection=0xED38E8; // ClientConnection or CurMgrPointer +static size_t off_ObjectManager=0x62C; // objectManager or CurMgrOffset +static uint32_t ptr_WorldFrame=0xD91A90; // Camera[_]Pointer +static size_t off_CameraOffset=0x7610; // Camera[_]Offset + uint32_t getInt32(uint32_t ptr) { uint32_t result; @@ -161,25 +167,29 @@ uint32_t getPlayerBase() { uint32_t gClientConnection; uint32_t sCurMgr; uint32_t curObj; - uint64_t playerGUID; + guid playerGUID; uint32_t playerBase; uint32_t nextObj; - uint64_t GUID; + guid GUID; playerBase=0; gClientConnection=getInt32((uint32_t)pModule + ptr_ClientConnection); sCurMgr=getInt32(gClientConnection + off_ObjectManager); if (sCurMgr != 0) { - playerGUID=getInt64(sCurMgr+0xE8); // localGUID - if (playerGUID != 0) { - g_playerGUID = playerGUID; - curObj=getInt32(sCurMgr+0xCC); // firstObject + playerGUID.first=getInt64(sCurMgr+0xF8); // localGUID + playerGUID.second=getInt64(sCurMgr+0xF8 + 0x8); + if (playerGUID.second != 0) { + g_playerGUID.first = playerGUID.first; + g_playerGUID.second = playerGUID.second; + + curObj=getInt32(sCurMgr+0xD8); // firstObject while (curObj != 0) { - nextObj=getInt32(curObj + 0x34); // nextObject - GUID=getInt64(curObj + 0x28); - if (playerGUID == GUID) { + nextObj=getInt32(curObj + 0x3C); // nextObject + GUID.first=getInt64(curObj + 0x28); + GUID.second=getInt64(curObj + 0x28 + 0x8); + if (playerGUID.first == GUID.first && playerGUID.second == GUID.second) { playerBase = curObj; break; } else if (curObj == nextObj) { @@ -205,7 +215,8 @@ void getPlayerName(std::wstring &identity) { ** instead of traversing through the NameStore, and since no one's updated ** nameStorePtr yet I figured I'd try just doing it this way. */ - getWString((uint32_t)pModule +0xEC4668, identity); + getWString((uint32_t)pModule +0xED3928, identity); +// printf("Name: %ls\n", identity.data()); return; /* @@ -239,7 +250,6 @@ void getPlayerName(std::wstring &identity) { } getWString(current + nameStringOffset, identity); */ - //printf("%ls\n", identity.data()); } void getCamera(float camera_pos[3], float camera_front[3], float camera_top[3]) { @@ -278,7 +288,7 @@ typedef class WowData { std::wstring nameAvatar; bool nameAvatarValid; - uint64_t playerGUID; + guid playerGUID; uint32_t pointerPlayerObject; public: @@ -317,22 +327,26 @@ static int fetch(float *avatar_pos, float *avatar_front, float *avatar_top, floa } /* are we still looking at the right object? */ - uint64_t peekGUID, tempGUID; - peekGUID=getInt64(p_playerBase+0x30); - if (g_playerGUID != peekGUID) { + guid peekGUID, tempGUID; + peekGUID.first=getInt64(p_playerBase+0x30); + peekGUID.second=getInt64(p_playerBase+0x30+0x8); + if (g_playerGUID.first != peekGUID.first || g_playerGUID.second != peekGUID.second) { /* no? Try to resynch to the new address. Happens when walking through portals quickly (aka no or short loading screen) */ - tempGUID = g_playerGUID; + tempGUID.first = g_playerGUID.first; + tempGUID.second = g_playerGUID.second; p_playerBase=getPlayerBase(); - if (tempGUID != g_playerGUID) { + if (tempGUID.first != g_playerGUID.first || tempGUID.first != g_playerGUID.first) { /* GUID of actor changed, likely a character and/or realm change */ wow.refresh(); } - peekGUID=getInt64(p_playerBase+0x28); - if (g_playerGUID != peekGUID) { + peekGUID.first=getInt64(p_playerBase+0x28); + peekGUID.second=getInt64(p_playerBase+0x28+0x8); + if (g_playerGUID.first != peekGUID.first || g_playerGUID.second != peekGUID.second) { /* no? we are still getting the expected GUID for our avatar, but we don't have it's current position */ return true; } } + context.clear(); std::wstringstream identityStream; identityStream << wow.getNameAvatar(); @@ -347,15 +361,16 @@ static int fetch(float *avatar_pos, float *avatar_front, float *avatar_top, floa // ... which isn't a right-hand coordinate system. float pos[3]; - ok = ok && peekProc((BYTE *) p_playerBase + 0x838, pos, sizeof(float)*3); + ok = ok && peekProc((BYTE *) p_playerBase + 0xA50, pos, sizeof(float)*3); if (! ok) { - if (g_playerGUID == 0xffffffffffffffff) { + if (g_playerGUID.second == 0xffffffffffffffff) { return false; - } else if (g_playerGUID == 0) { + } else if (g_playerGUID.second == 0) { return true; } else { /* FIXME need a better way to mark PlayerBase invalid */ - g_playerGUID=0; + g_playerGUID.first=0; + g_playerGUID.second=0; return true; /* we got a good reference for an avatar, but no good position */ } } @@ -366,12 +381,12 @@ static int fetch(float *avatar_pos, float *avatar_front, float *avatar_top, floa avatar_pos[2] = pos[0]; float heading=0.0; - ok = ok && peekProc((BYTE *) p_playerBase + 0x848, &heading, sizeof(heading)); + ok = ok && peekProc((BYTE *) p_playerBase + 0xA60, &heading, sizeof(heading)); if (! ok) return false; float pitch=0.0; - ok = ok && peekProc((BYTE *) p_playerBase + 0x84C, &pitch, sizeof(pitch)); + ok = ok && peekProc((BYTE *) p_playerBase + 0xA70, &pitch, sizeof(pitch)); if (! ok) return false; @@ -427,10 +442,10 @@ static int trylock(const std::multimap<std::wstring, unsigned long long int> &pi } static const std::wstring longdesc() { - return std::wstring(L"Supports World of Warcraft 5.4.7 (18291), with identity support."); + return std::wstring(L"Supports World of Warcraft 6.0.2 (19034), with identity support."); } -static std::wstring description(L"World of Warcraft 5.4.7 (18291)"); +static std::wstring description(L"World of Warcraft 6.0.2 (19034)"); static std::wstring shortname(L"World of Warcraft"); |