Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mumble-voip/mumble.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authordavidebeatrici <davidebeatrici@gmail.com>2016-09-12 22:47:28 +0300
committerdavidebeatrici <davidebeatrici@gmail.com>2016-09-12 22:47:28 +0300
commit04dacb11cf0a88948083960cce911ba7ce42f11d (patch)
tree487930cebebdfeb547e9a6289f2da327ba6a5936 /plugins/wow_x64
parentf064a8d03653b631dd55333f895ce164a2c908d8 (diff)
plugins/wow: Total revamp and support for the x64 executable.
Diffstat (limited to 'plugins/wow_x64')
-rw-r--r--plugins/wow_x64/wow_x64.cpp190
-rw-r--r--plugins/wow_x64/wow_x64.pro10
2 files changed, 200 insertions, 0 deletions
diff --git a/plugins/wow_x64/wow_x64.cpp b/plugins/wow_x64/wow_x64.cpp
new file mode 100644
index 000000000..51ae4f91f
--- /dev/null
+++ b/plugins/wow_x64/wow_x64.cpp
@@ -0,0 +1,190 @@
+// Copyright 2005-2016 The Mumble Developers. All rights reserved.
+// Use of this source code is governed by a BSD-style license
+// that can be found in the LICENSE file at the root of the
+// Mumble source tree or at <https://www.mumble.info/LICENSE>.
+
+#include "../mumble_plugin_win32_64bit.h" // Include standard plugin header.
+#include "../mumble_plugin_utils.h" // Include plugin header for special functions, like "escape".
+
+static int fetch(float *avatar_pos, float *avatar_front, float *avatar_top, float *camera_pos, float *camera_front, float *camera_top, std::string &context, std::wstring &identity) {
+ for (int i=0;i<3;i++) {
+ avatar_pos[i] = avatar_front[i] = avatar_top[i] = camera_pos[i] = camera_front[i] = camera_top[i] = 0.0f;
+ }
+
+ // To update visit http://www.ownedcore.com/forums/world-of-warcraft/world-of-warcraft-bots-programs/wow-memory-editing
+ // and look for a thread called "[WoW] [Version] Release Info Dump Thread".
+ // http://www.ownedcore.com/forums/world-of-warcraft/world-of-warcraft-bots-programs/wow-memory-editing/578228-wow-7-0-3-22522-release-info-dump-thread-post3584506.html#post3584506
+
+ // Avatar pointer
+ procptr64_t avatar_offset = peekProc<procptr64_t>(pModule + 0x169BCB0); // "LocalPlayer" in the thread.
+ if (!avatar_offset) return false;
+
+ // Camera pointer
+ procptr64_t camera_base = peekProc<procptr64_t>(pModule + 0x179A518); // "CameraStruct" in the thread.
+ if (!camera_base) return false;
+ procptr64_t camera_offset = peekProc<procptr64_t>(camera_base + 0x3338); // "CameraOffset" in the thread.
+ if (!camera_offset) return false;
+
+ // Realm pointer
+ procptr64_t realm_offset = peekProc<procptr64_t>(pModule + 0x1825C68); // Not available in the thread.
+ if (!realm_offset) return false;
+
+ // Memory addresses
+ procptr64_t state_address = 0x173C66E; // "GameState" in the thread.
+ procptr64_t avatar_pos_address = 0x15A8; // "UnitOrigin" in the thread.
+ procptr64_t camera_pos_address = 0x10; // "CameraOrigin" in the thread.
+ procptr64_t camera_front_address = 0x1C; // "CameraMatrix" in the thread.
+ procptr64_t camera_top_address = 0x34; // "CameraMatrix" + 0x18.
+ procptr64_t avatar_heading_address = 0x15B8; // "UnitAngle" in the thread.
+ procptr64_t realm_address = 0x430; // Not available in the thread.
+ procptr64_t player_address = 0x1825FC0; // Not available in the thread.
+
+ // Boolean value to check if game addresses retrieval is successful
+ bool ok;
+ // Create containers to stuff our raw data into, so we can convert it to Mumble's coordinate system
+ float avatar_pos_corrector[3], camera_pos_corrector[3], avatar_heading, camera_front_corrector[3], camera_top_corrector[3];
+ // Char values for extra features
+ char state, player[50], realm[50];
+
+ // Peekproc and assign game addresses to our containers, so we can retrieve positional data
+ ok = peekProc(pModule + state_address, &state, 1) && // Magical state value: 1 when in-game, 0 when not.
+ peekProc(avatar_offset + avatar_pos_address, avatar_pos_corrector, 12) && // Avatar Position values (Z, -X and Y).
+ peekProc(camera_offset + camera_pos_address, camera_pos_corrector, 12) && // Camera Position values (Z, -X and Y).
+ peekProc(avatar_offset + avatar_heading_address, avatar_heading) && // Avatar heading.
+ peekProc(camera_offset + camera_front_address, camera_front_corrector, 12) && // Camera Front Vector values (Z, -X and Y).
+ peekProc(camera_offset + camera_top_address, camera_top_corrector, 12) && // Camera Top Vector values (Z, -X and Y).
+ peekProc(realm_offset + realm_address, realm) && // Realm name.
+ peekProc(pModule + player_address, player); // Player nickname.
+
+ // This prevents the plugin from linking to the game in case something goes wrong during values retrieval from memory addresses.
+ if (! ok)
+ return false;
+
+ // State
+ if (state != 1) { // If not in-game
+ context.clear(); // Clear context
+ identity.clear(); // Clear identity
+ // Set vectors values to 0.
+ for (int i=0;i<3;i++)
+ avatar_pos[i] = avatar_front[i] = avatar_top[i] = camera_pos[i] = camera_front[i] = camera_top[i] = 0.0f;
+
+ return true; // This tells Mumble to ignore all vectors.
+ }
+
+ // Begin context
+ std::ostringstream ocontext;
+
+ // Realm
+ realm[sizeof(realm)-1] = 0; // NUL terminate queried C strings. We do this to ensure the strings from the game are NUL terminated. They should be already, but we can't take any chances.
+ escape(realm);
+ if (strcmp(realm, "") != 0) { // Set Realm string only if not empty
+ ocontext << " {\"Realm\": \"" << realm << "\"}"; // Set context with Realm's name
+ }
+
+ context = ocontext.str();
+ // End context
+
+ // Begin identity
+ std::wostringstream oidentity;
+ oidentity << "{";
+
+ // Player
+ player[sizeof(player)-1] = 0; // NUL terminate queried C strings. We do this to ensure the strings from the game are NUL terminated. They should be already, but we can't take any chances.
+ escape(player);
+ if (strcmp(player, "") != 0) {
+ oidentity << std::endl;
+ oidentity << "\"Player\": \"" << player << "\""; // Set player nickname in identity.
+ } else {
+ oidentity << std::endl << "\"Player\": null";
+ }
+
+ oidentity << std::endl << "}";
+ identity = oidentity.str();
+ // End identity
+
+ /*
+ Mumble | Game
+ X | Z
+ Y | -X
+ Z | Y
+ */
+ avatar_pos[0] = -avatar_pos_corrector[1];
+ avatar_pos[1] = avatar_pos_corrector[2];
+ avatar_pos[2] = avatar_pos_corrector[0];
+
+ camera_pos[0] = -camera_pos_corrector[1];
+ camera_pos[1] = camera_pos_corrector[2];
+ camera_pos[2] = camera_pos_corrector[0];
+
+ avatar_front[0] = -sin(avatar_heading);
+ avatar_front[1] = 0.0f;
+ avatar_front[2] = cos(avatar_heading);
+
+ avatar_top[2] = -1; // Dummy top vector, you can't tilt your head sideways in WoW.
+
+ camera_front[0] = -camera_front_corrector[1];
+ camera_front[1] = camera_front_corrector[2];
+ camera_front[2] = camera_front_corrector[0];
+
+ camera_top[0] = -camera_top_corrector[1];
+ camera_top[1] = camera_top_corrector[2];
+ camera_top[2] = camera_top_corrector[0];
+
+ return true;
+}
+
+static int trylock(const std::multimap<std::wstring, unsigned long long int> &pids) {
+
+ if (! initialize(pids, L"Wow-64.exe")) { // Retrieve game executable's memory address
+ return false;
+ }
+
+ // Check if we can get meaningful data from it
+ float apos[3], afront[3], atop[3], cpos[3], cfront[3], ctop[3];
+ std::wstring sidentity;
+ std::string scontext;
+
+ if (fetch(apos, afront, atop, cpos, cfront, ctop, scontext, sidentity)) {
+ return true;
+ } else {
+ generic_unlock();
+ return false;
+ }
+}
+
+static const std::wstring longdesc() {
+ return std::wstring(L"Supports World of Warcraft (x64) with context and identity support."); // Plugin long description
+}
+
+static std::wstring description(L"World of Warcraft (x64) version 7.0.3.22566"); // Plugin short description
+static std::wstring shortname(L"World of Warcraft"); // Plugin short name
+
+static int trylock1() {
+ return trylock(std::multimap<std::wstring, unsigned long long int>());
+}
+
+static MumblePlugin wowplug = {
+ MUMBLE_PLUGIN_MAGIC,
+ description,
+ shortname,
+ NULL,
+ NULL,
+ trylock1,
+ generic_unlock,
+ longdesc,
+ fetch
+};
+
+static MumblePlugin2 wowplug2 = {
+ MUMBLE_PLUGIN_MAGIC_2,
+ MUMBLE_PLUGIN_VERSION,
+ trylock
+};
+
+extern "C" MUMBLE_PLUGIN_EXPORT MumblePlugin *getMumblePlugin() {
+ return &wowplug;
+}
+
+extern "C" MUMBLE_PLUGIN_EXPORT MumblePlugin2 *getMumblePlugin2() {
+ return &wowplug2;
+}
diff --git a/plugins/wow_x64/wow_x64.pro b/plugins/wow_x64/wow_x64.pro
new file mode 100644
index 000000000..59c2c0eeb
--- /dev/null
+++ b/plugins/wow_x64/wow_x64.pro
@@ -0,0 +1,10 @@
+# Copyright 2005-2016 The Mumble Developers. All rights reserved.
+# Use of this source code is governed by a BSD-style license
+# that can be found in the LICENSE file at the root of the
+# Mumble source tree or at <https://www.mumble.info/LICENSE>.
+
+include(../plugins.pri)
+
+TARGET = wow_x64
+SOURCES = wow_x64.cpp
+LIBS += -luser32