29
29
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
39
#define _USE_MATH_DEFINES
42
#include "../mumble_plugin.h"
32
#include "../mumble_plugin_win32.h"
44
34
using namespace std;
52
static DWORD getProcess(const wchar_t *exename) {
56
pe.dwSize = sizeof(pe);
57
HANDLE hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
58
if (hSnap != INVALID_HANDLE_VALUE) {
59
BOOL ok = Process32First(hSnap, &pe);
62
if (wcscmp(pe.szExeFile, exename)==0) {
63
pid = pe.th32ProcessID;
66
ok = Process32Next(hSnap, &pe);
73
static BYTE *getModuleAddr(DWORD pid, const wchar_t *modname) {
76
me.dwSize = sizeof(me);
77
HANDLE hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, pid);
78
if (hSnap != INVALID_HANDLE_VALUE) {
79
BOOL ok = Module32First(hSnap, &me);
82
if (wcscmp(me.szModule, modname)==0) {
83
addr = me.modBaseAddr;
86
ok = Module32Next(hSnap, &me);
94
static bool peekProc(VOID *base, VOID *dest, SIZE_T len) {
96
BOOL ok=ReadProcessMemory(h, base, dest, len, &r);
97
return (ok && (r == len));
100
static void about(HWND h) {
101
::MessageBox(h, L"Reads audio position information from Day of Defeat: Source (Build 4069). IP:Port context support.", L"Mumble DODS Plugin", MB_OK);
104
41
static bool calcout(float *pos, float *rot, float *opos, float *front, float *top) {
132
static int fetch(float *avatar_pos, float *avatar_front, float *avatar_top, float *camera_pos, float *camera_front, float *camera_top, string &context, wstring &identity) {
69
static int fetch(float *avatar_pos, float *avatar_front, float *avatar_top, float *camera_pos, float *camera_front, float *camera_top, string &context, wstring &) {
133
70
for (int i=0;i<3;i++)
134
71
avatar_pos[i] = avatar_front[i] = avatar_top[i] = camera_pos[i] = camera_front[i] = camera_top[i] = 0.0f;
153
90
sHost.assign(chHostStr);
154
91
if (sHost.find(':')==string::npos)
92
sHost.append(":27015");
156
new_context << "<context>"
157
<< "<game>dods</game>"
158
<< "<hostport>" << sHost << "</hostport>"
94
new_context << "<context>"
95
<< "<game>dods</game>"
96
<< "<hostport>" << sHost << "</hostport>"
160
98
context = new_context.str();
185
static int trylock() {
123
static int trylock(const std::multimap<std::wstring, unsigned long long int> &pids) {
188
124
posptr = rotptr = NULL;
190
DWORD pid=getProcess(L"hl2.exe");
193
BYTE *mod=getModuleAddr(pid, L"client.dll");
196
BYTE *mod_engine=getModuleAddr(pid, L"engine.dll");
126
if (! initialize(pids, L"hl2.exe", L"client.dll"))
129
BYTE *mod_engine=getModuleAddr(L"engine.dll");
200
h=OpenProcess(PROCESS_VM_READ, false, pid);
204
133
// Check if we really have DODS running
206
135
position tuple: client.dll+0x3f62a0 (x,y,z, float)
213
142
// Remember addresses for later
214
posptr = mod_engine + 0x555BB4;
215
rotptr = mod_engine + 0x3CDC30;
216
stateptr = mod + 0x3E7BDC;
217
hostptr = mod_engine + 0x3C91A4;
143
posptr = pModule + 0x4183F8;
144
rotptr = pModule + 0x4183B8;
145
stateptr = pModule + 0x404C24;
146
hostptr = mod_engine + 0x3D3E94;
221
if (!peekProc(mod + 0x3FBE49, sMagic, 17) || strncmp("DODSpectatorGUI@@", sMagic, 17)!=0)
150
if (!peekProc(pModule + 0x418ED1, sMagic, 17) || strncmp("DODSpectatorGUI@@", sMagic, 17)!=0)
224
153
// Check if we can get meaningful data from it
227
156
wstring sidentity;
230
if (fetch(apos, afront, atop, cpos, cfront, ctop, scontext, sidentity))
159
if (fetch(apos, afront, atop, cpos, cfront, ctop, scontext, sidentity)) {
233
// If it failed clean up
239
static void unlock() {
247
167
static const std::wstring longdesc() {
248
return std::wstring(L"Supports DODS build 4069. No identity support yet.");
168
return std::wstring(L"Supports DODS build 4426. No identity support yet.");
251
static std::wstring description(L"Day of Defeat: Source (Build 4069)");
171
static std::wstring description(L"Day of Defeat: Source (Build 4426)");
252
172
static std::wstring shortname(L"Day of Defeat: Source");
174
static int trylock1() {
175
return trylock(std::multimap<std::wstring, unsigned long long int>());
254
178
static MumblePlugin dodsplug = {
255
179
MUMBLE_PLUGIN_MAGIC,
190
static MumblePlugin2 dodsplug2 = {
191
MUMBLE_PLUGIN_MAGIC_2,
192
MUMBLE_PLUGIN_VERSION,
266
196
extern "C" __declspec(dllexport) MumblePlugin *getMumblePlugin() {
267
197
return &dodsplug;
200
extern "C" __declspec(dllexport) MumblePlugin2 *getMumblePlugin2() {