diff --git a/installer/Plugins.wxs b/installer/Plugins.wxs index bcc3ab3c5..2af919bbb 100644 --- a/installer/Plugins.wxs +++ b/installer/Plugins.wxs @@ -104,6 +104,9 @@ + + + @@ -152,6 +155,7 @@ + diff --git a/plugins/ut99/ut99.cpp b/plugins/ut99/ut99.cpp index 8ce103e1e..36c5ca034 100644 --- a/plugins/ut99/ut99.cpp +++ b/plugins/ut99/ut99.cpp @@ -1,12 +1,11 @@ -/* - Copyright (C) 2005-2010, Thorvald Natvig +/* Copyright (C) 2005-2010, Thorvald Natvig Copyright (C) 2012, Moritz Schneeweiss All rights reserved. - + Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions - are met: + are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. @@ -28,7 +27,7 @@ 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 "../mumble_plugin_win32.h" @@ -36,6 +35,15 @@ BYTE* posptr; BYTE* frtptr; BYTE* topptr; +static void wcsToMultibyteStdString(wchar_t *wcs, std::string &str) { + const int size = WideCharToMultiByte(CP_UTF8, 0, wcs, -1, NULL, 0, NULL, NULL); + if (size == 0) return; + + str.resize(size); + + WideCharToMultiByte(CP_UTF8, 0, wcs, -1, &str[0], size, NULL, NULL); +} + static bool cross(float *a, float *b, float *c) { if (a == 0 || b == 0 || c == 0) return false; @@ -79,33 +87,36 @@ static bool correctFront(float *front, float *top) { return true; } -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) { +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 state; + char state; bool ok; - // Create containers to stuff our raw data into, so we can convert it to Mumble's coordinate system + + ok = peekProc((BYTE *) pModule+0x290557, state); // Magical state value + if (! ok) + return false; + + if (state != 8) { + context.clear(); + return true; // This results in all vectors beeing zero which tells Mumble to ignore them. + } + + // Create containers to stuff our raw data into, so we can convert it to Mumble's coordinate system float pos_corrector[3]; float front_corrector[3]; float top_corrector[3]; - peekProc((BYTE *) pModule+0x290557, &state, 2); // Magical state value - if (!ok) - return false; - - if (state == 0) - return true; // This results in all vectors beeing zero which tells Mumble to ignore them. - - // Peekproc and assign game addresses to our containers, so we can retrieve positional data - ok = peekProc((BYTE *) posptr, &pos_corrector, 12) && - peekProc((BYTE *) frtptr, &front_corrector, 12) && - peekProc((BYTE *) topptr, &top_corrector, 12); + // Peekproc and assign game addresses to our containers, so we can retrieve positional data + ok = peekProc((BYTE *) posptr, pos_corrector) && + peekProc((BYTE *) frtptr, front_corrector) && + peekProc((BYTE *) topptr, top_corrector); if (! ok) return false; - // Convert to left-handed coordinate system + // Convert to left-handed coordinate system avatar_pos[0] = -pos_corrector[0]; avatar_pos[1] = pos_corrector[2]; @@ -136,20 +147,24 @@ static int fetch(float *avatar_pos, float *avatar_front, float *avatar_top, floa BYTE *cptr1 = peekProc ((BYTE *) cptr0 + 0x73C); BYTE *cptr2 = peekProc ((BYTE *) cptr1 + 0x244); - const int C_LENGHT = 30; - char servername [C_LENGHT*2+1]; - ok = peekProc((BYTE *) cptr2, servername); - servername[C_LENGHT*2] = '\0'; + wchar_t wservername[60]; - std::stringstream _contextss; - for (int i = 0; i < 2*C_LENGHT+1; i = i+2) { - if (!servername[i] == '\0') - _contextss << servername[i]; - else break; - } + ok = peekProc((BYTE *) cptr2, wservername); + if (! ok) + return false; - context = _contextss.str(); + wservername[sizeof(wservername) - 1] = '\0'; + + std::string servername; + wcsToMultibyteStdString(wservername, servername); + + std::ostringstream contextss; + contextss << "{" + << "\"servername\":\"" << servername << "\"" + << "}"; + + context = contextss.str(); return true; } @@ -213,4 +228,4 @@ extern "C" __declspec(dllexport) MumblePlugin *getMumblePlugin() { extern "C" __declspec(dllexport) MumblePlugin2 *getMumblePlugin2() { return &ut99plug2; -} \ No newline at end of file +}