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
+}