~ubuntu-branches/ubuntu/raring/mumble/raring

« back to all changes in this revision

Viewing changes to plugins/tf2/tf2.cpp

  • Committer: Bazaar Package Importer
  • Author(s): Thorvald Natvig
  • Date: 2009-12-10 20:29:29 UTC
  • mfrom: (9.1.4 squeeze)
  • Revision ID: james.westby@ubuntu.com-20091210202929-3096zttdt0ie9kw6
Tags: 1.2.0-1
New upstream release.

Show diffs side-by-side

added added

removed removed

Lines of Context:
2
2
#include <stdlib.h>
3
3
#include <windows.h>
4
4
#include <tlhelp32.h>
 
5
#include <string>
 
6
#include <sstream>
5
7
 
6
8
#define _USE_MATH_DEFINES
7
9
#include <math.h>
8
10
 
9
11
#include "../mumble_plugin.h"
10
12
 
 
13
using namespace std;
 
14
 
11
15
HANDLE h;
12
16
BYTE *posptr;
13
17
BYTE *rotptr;
14
18
BYTE *stateptr;
 
19
BYTE *hostptr;
15
20
 
16
21
static DWORD getProcess(const wchar_t *exename) {
17
22
        PROCESSENTRY32 pe;
62
67
}
63
68
 
64
69
static void about(HWND h) {
65
 
        ::MessageBox(h, L"Reads audio position information from Team Fortress 2 (Build 3971)", L"Mumble TF2 Plugin", MB_OK);
 
70
        ::MessageBox(h, L"Reads audio position information from Team Fortress 2 (Build 4013). IP:Port context without team discriminator.", L"Mumble TF2 Plugin", MB_OK);
66
71
}
67
72
 
68
73
static bool calcout(float *pos, float *rot, float *opos, float *front, float *top) {
93
98
        return true;
94
99
}
95
100
 
 
101
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) {
 
102
        for (int i=0;i<3;i++)
 
103
                avatar_pos[i] = avatar_front[i] = avatar_top[i] = 0;
 
104
 
 
105
        float ipos[3], rot[3];
 
106
        bool ok;
 
107
        char state;
 
108
        char chHostStr[40];
 
109
        wostringstream new_identity;
 
110
        ostringstream new_context;
 
111
 
 
112
        ok = peekProc(posptr, ipos, 12) &&
 
113
             peekProc(rotptr, rot, 12) &&
 
114
             peekProc(stateptr, &state, 1) &&
 
115
             peekProc(hostptr, chHostStr, 40);
 
116
 
 
117
        if (!ok)
 
118
                return false;
 
119
        chHostStr[39] = 0;
 
120
 
 
121
        new_context << "<context>"
 
122
        << "<game>tf2</game>"
 
123
        << "<hostport>" << chHostStr << "</hostport>"
 
124
        << "</context>";
 
125
        context = new_context.str();
 
126
 
 
127
        /* TODO
 
128
        new_identity << "<identity>"
 
129
                        << "<name>" << "SAS" << "</name>"
 
130
                     << "</identity>";
 
131
        identity = new_identity.str(); */
 
132
 
 
133
        // Check to see if you are in a server
 
134
        if (state == 0 || state == 1 || state == 3)
 
135
                return true; // Deactivate plugin
 
136
 
 
137
        if (ok) {
 
138
                int res = calcout(ipos, rot, avatar_pos, avatar_front, avatar_top);
 
139
                if (res) {
 
140
                        for (int i=0;i<3;++i) {
 
141
                                camera_pos[i] = avatar_pos[i];
 
142
                                camera_front[i] = avatar_front[i];
 
143
                                camera_top[i] = avatar_top[i];
 
144
                        }
 
145
                        return res;
 
146
                }
 
147
        }
 
148
 
 
149
        return false;
 
150
}
 
151
 
96
152
static int trylock() {
97
153
 
98
154
        h = NULL;
104
160
        BYTE *mod=getModuleAddr(pid, L"client.dll");
105
161
        if (!mod)
106
162
                return false;
 
163
        BYTE *mod_engine=getModuleAddr(pid, L"engine.dll");
 
164
        if (!mod_engine)
 
165
                return false;
 
166
 
107
167
        h=OpenProcess(PROCESS_VM_READ, false, pid);
108
168
        if (!h)
109
169
                return false;
110
170
 
111
171
        // Check if we really have TF2 running
112
172
        /*
113
 
                position tuple:         client.dll+0x4b3830  (x,y,z, float)
114
 
                orientation tuple:      client.dll+0x4b37f0  (v,h float)
115
 
                ID string:                      client.dll+0x4ab30b = "teamJet@@" (9 characters, text)
116
 
                spawn state:        client.dll+0x49ab9c  (0 when at main menu, 1 when spectator, 3 when at team selection menu, and 6 or 9 when on a team (depending on the team side and gamemode), byte)
 
173
                position tuple:         client.dll+0x5753d8  (x,y,z, float)
 
174
                orientation tuple:      client.dll+0x4b691c  (v,h float)
 
175
                ID string:                      client.dll+0x4eb30b = "teamJet@@" (9 characters, text)
 
176
                spawn state:        client.dll+0x49db9c  (0 when at main menu, 1 when spectator, 3 when at team selection menu, and 6 or 9 when on a team (depending on the team side and gamemode), byte)
 
177
                host string:            engine.dll+0x3c8124  (ip:port zero-terminated string; localhost:27015 if create a server ingame)
 
178
                        note that memory addresses in this comment are for example only; the real ones are defined below
117
179
        */
 
180
 
 
181
        // Remember addresses for later
 
182
        posptr = mod + 0x52A6A4;
 
183
        rotptr = mod + 0x4D6B78;
 
184
        stateptr = mod + 0x4BDBF4;
 
185
        hostptr = mod_engine + 0x3C91A4;
 
186
 
 
187
        // Gamecheck
118
188
        char sMagic[9];
119
 
        if (!peekProc(mod + 0x4ab30b, sMagic, 9) || strncmp("teamJet@@", sMagic, 9)!=0)
 
189
        if (!peekProc(mod + 0x4CE38B, sMagic, 9) || strncmp("teamJet@@", sMagic, 9)!=0)
120
190
                return false;
121
191
 
122
 
        // Remember addresses for later
123
 
        posptr = mod + 0x4b3830;
124
 
        rotptr = mod + 0x4b37f0;
125
 
        stateptr = mod + 0x49ab9c;
126
 
 
127
 
        float pos[3];
128
 
        float rot[3];
129
 
        float opos[3], top[3], front[3];
130
 
 
131
 
        bool ok = peekProc(posptr, pos, 12) &&
132
 
                  peekProc(rotptr, rot, 12);
133
 
 
134
 
        if (ok)
135
 
                return calcout(pos, rot, opos, top, front);
 
192
        // Check if we can get meaningful data from it
 
193
        float apos[3], afront[3], atop[3];
 
194
        float cpos[3], cfront[3], ctop[3];
 
195
        wstring sidentity;
 
196
        string scontext;
 
197
 
 
198
        if (fetch(apos, afront, atop, cpos, cfront, ctop, scontext, sidentity))
 
199
                return true;
 
200
 
136
201
        // If it failed clean up
137
202
        CloseHandle(h);
138
203
        h = NULL;
147
212
        return;
148
213
}
149
214
 
150
 
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) {
151
 
        for (int i=0;i<3;i++)
152
 
                avatar_pos[i] = avatar_front[i] = avatar_top[i] = 0;
153
 
 
154
 
        float ipos[3], rot[3];
155
 
        bool ok;
156
 
        char state;
157
 
 
158
 
        ok = peekProc(posptr, ipos, 12) &&
159
 
             peekProc(rotptr, rot, 12) &&
160
 
             peekProc(stateptr, &state, 1);
161
 
        if (!ok)
162
 
                return false;
163
 
 
164
 
        // Check to see if you are in a server
165
 
        if (state == 0 || state == 1 || state == 3)
166
 
                return true; // Deactivate plugin
167
 
 
168
 
        if (ok) {
169
 
                int res = calcout(ipos, rot, avatar_pos, avatar_front, avatar_top);
170
 
                if (res) {
171
 
                        for (int i=0;i<3;++i) {
172
 
                                camera_pos[i] = avatar_pos[i];
173
 
                                camera_front[i] = avatar_front[i];
174
 
                                camera_top[i] = avatar_top[i];
175
 
                        }
176
 
                        return res;
177
 
                }
178
 
        }
179
 
 
180
 
        return false;
181
 
}
182
 
 
183
215
static const std::wstring longdesc() {
184
 
        return std::wstring(L"Supports TF2 build 3971. No identity or context support yet.");
 
216
        return std::wstring(L"Supports TF2 build 4013. No identity or context support yet.");
185
217
}
186
218
 
187
 
static std::wstring description(L"Team Fortress 2 (Build 3971)");
 
219
static std::wstring description(L"Team Fortress 2 (Build 4013)");
188
220
static std::wstring shortname(L"Team Fortress 2");
189
221
 
190
222
static MumblePlugin tf2plug = {