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:
authorTuck Therebelos <snares@users.sourceforge.net>2010-01-07 14:56:08 +0300
committerTuck Therebelos <snares@users.sourceforge.net>2010-01-07 14:56:08 +0300
commit58081c648c6c376302ec1d34d9c7aaf500692ec3 (patch)
tree7cd1ce6cc76be92801f4df8c99535ffe5e7ed476 /plugins/bf1942
parentb5b6ba260464a52d58d94d2fe3001504f3d54f5d (diff)
Update licenses; add UT3, 2004, 1942 plugins; update some Source plugins
Diffstat (limited to 'plugins/bf1942')
-rw-r--r--plugins/bf1942/bf1942.cpp230
-rw-r--r--plugins/bf1942/bf1942.pro7
2 files changed, 237 insertions, 0 deletions
diff --git a/plugins/bf1942/bf1942.cpp b/plugins/bf1942/bf1942.cpp
new file mode 100644
index 000000000..3d6a37fc5
--- /dev/null
+++ b/plugins/bf1942/bf1942.cpp
@@ -0,0 +1,230 @@
+/* Copyright (C) 2009-2010, Snares <snares@users.sourceforge.net>
+ Copyright (C) 2005-2010, Thorvald Natvig <thorvald@natvig.com>
+
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+
+ - Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+ - Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+ - Neither the name of the Mumble Developers nor the names of its
+ contributors may be used to endorse or promote products derived from this
+ software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR
+ CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <windows.h>
+#include <tlhelp32.h>
+#include <math.h>
+
+#include "../mumble_plugin.h"
+
+HANDLE h;
+
+BYTE *faceptr;
+BYTE *topptr;
+BYTE *stateptr;
+//BYTE *contextptr;
+
+static DWORD getProcess(const wchar_t *exename) {
+ PROCESSENTRY32 pe;
+ DWORD pid = 0;
+
+ pe.dwSize = sizeof(pe);
+ HANDLE hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
+ if (hSnap != INVALID_HANDLE_VALUE) {
+ BOOL ok = Process32First(hSnap, &pe);
+
+ while (ok) {
+ if (wcscmp(pe.szExeFile, exename)==0) {
+ pid = pe.th32ProcessID;
+ break;
+ }
+ ok = Process32Next(hSnap, &pe);
+ }
+ CloseHandle(hSnap);
+ }
+ return pid;
+}
+
+static BYTE *getModuleAddr(DWORD pid, const wchar_t *modname) {
+ MODULEENTRY32 me;
+ BYTE *addr = NULL;
+ me.dwSize = sizeof(me);
+ HANDLE hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, pid);
+ if (hSnap != INVALID_HANDLE_VALUE) {
+ BOOL ok = Module32First(hSnap, &me);
+
+ while (ok) {
+ if (wcscmp(me.szModule, modname)==0) {
+ addr = me.modBaseAddr;
+ break;
+ }
+ ok = Module32Next(hSnap, &me);
+ }
+ CloseHandle(hSnap);
+ }
+ return addr;
+}
+
+static bool peekProc(VOID *base, VOID *dest, SIZE_T len) {
+ SIZE_T r;
+ BOOL ok=ReadProcessMemory(h, base, dest, len, &r);
+ return (ok && (r == len));
+}
+
+static DWORD peekProc(VOID *base) {
+ DWORD v = 0;
+ peekProc(base, reinterpret_cast<BYTE *>(&v), sizeof(DWORD));
+ return v;
+}
+
+static BYTE *peekProcPtr(VOID *base) {
+ DWORD v = peekProc(base);
+ return reinterpret_cast<BYTE *>(v);
+}
+
+static void about(HWND h) {
+ ::MessageBox(h, L"Reads audio position information from Battlefield 1942 v1.61b.", L"Mumble BF2 Plugin", MB_OK);
+}
+
+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]=0.0f;
+
+ //char ccontext[128];
+ char state;
+ //char spawn;
+ bool ok;
+
+ /*
+ state value is:
+ 0 when not in a server
+ 32 when in a server
+ */
+ ok = peekProc(stateptr, &state, 1); // Magical state value
+ if (! ok)
+ return false;
+
+ if (state == 0)
+ return false; // Unlink plugin
+
+ //ok = peekProc((BYTE *) 0x0097634D, &spawn, 1);
+ //if (! ok)
+ // return false;
+
+ //if (spawn == 0)
+ // return true; //Center PA
+
+ //peekProc(contextptr, ccontext, 128);
+
+ ok = peekProc((BYTE *) 0x00976274, avatar_pos, 12) &&
+ peekProc(faceptr, avatar_front, 12) &&
+ peekProc(topptr, avatar_top, 12);
+
+ if (! ok)
+ return false;
+
+ /*
+ Get context string; in this plugin this will be an
+ ip:port (char 256 bytes) string
+ */
+ //ccontext[127] = 0;
+ //context = std::string(ccontext);
+
+ for (int i=0;i<3;i++) {
+ camera_pos[i] = avatar_pos[i];
+ camera_front[i] = avatar_front[i];
+ camera_top[i] = avatar_top[i];
+ }
+
+ return ok;
+}
+
+static int trylock() {
+ h = NULL;
+ faceptr = topptr = NULL;
+
+ DWORD pid=getProcess(L"BF1942.exe");
+ if (!pid)
+ return false;
+ BYTE *mod=getModuleAddr(pid, L"binkw32.dll");
+ if (!mod)
+ return false;
+
+ h=OpenProcess(PROCESS_VM_READ, false, pid);
+ if (!h)
+ return false;
+
+ BYTE *ptr1 = peekProcPtr((BYTE *) 0x009A9468);
+ BYTE *ptr2 = peekProcPtr(ptr1 + 0x98);
+
+ faceptr = ptr2 + 0x5C;
+ topptr = ptr2 + 0x4C;
+ stateptr = mod + 0x52FB1;
+
+ //BYTE *ctxtp1 = peekProcPtr((BYTE *) 0x);
+ //BYTE *ctxtp2 = peekProcPtr(ctxtp1 + 0x);
+
+ //contextptr = ctxtp2 + 0x;
+
+ float apos[3], afront[3], atop[3], cpos[3], cfront[3], ctop[3];
+ std::string context;
+ std::wstring identity;
+
+ if (fetch(apos, afront, atop, cpos, cfront, ctop, context, identity))
+ return true;
+
+ CloseHandle(h);
+ h = NULL;
+ return false;
+}
+
+static void unlock() {
+ if (h) {
+ CloseHandle(h);
+ h = NULL;
+ }
+ return;
+}
+
+static const std::wstring longdesc() {
+ return std::wstring(L"Supports Battlefield 1942 v1.61b. No identity or context support yet.");
+}
+
+static std::wstring description(L"Battlefield 1942 v1.61b");
+static std::wstring shortname(L"Battlefield 1942");
+
+static MumblePlugin bf1942plug = {
+ MUMBLE_PLUGIN_MAGIC,
+ description,
+ shortname,
+ about,
+ NULL,
+ trylock,
+ unlock,
+ longdesc,
+ fetch
+};
+
+extern "C" __declspec(dllexport) MumblePlugin *getMumblePlugin() {
+ return &bf1942plug;
+}
diff --git a/plugins/bf1942/bf1942.pro b/plugins/bf1942/bf1942.pro
new file mode 100644
index 000000000..8743b8dc2
--- /dev/null
+++ b/plugins/bf1942/bf1942.pro
@@ -0,0 +1,7 @@
+include(../plugins.pri)
+
+TARGET = bf1942
+SOURCES = bf1942.cpp
+LIBS += -luser32
+
+