From 19cd10abd779b6099d6f1ac58f5e69ff50b86571 Mon Sep 17 00:00:00 2001 From: Christian Walther Date: Wed, 27 Apr 2011 20:52:15 +0200 Subject: [PATCH 01/21] Wrap uses of the missing CyPythonIDE with #ifdef HAVE_CYPYTHONIDE to make things compile, like in H-uru/Plasma. --- .../Plasma20/Sources/Plasma/Apps/plClient/plClient.cpp | 2 +- .../Plasma/FeatureLib/pfConsole/pfConsoleCommands.cpp | 2 ++ .../Plasma/FeatureLib/pfPython/cyPythonInterface.cpp | 10 +++++----- .../Plasma/FeatureLib/pfPython/cyPythonInterface.h | 6 +++--- 4 files changed, 11 insertions(+), 9 deletions(-) diff --git a/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/Apps/plClient/plClient.cpp b/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/Apps/plClient/plClient.cpp index e82b92aa..a11902a5 100644 --- a/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/Apps/plClient/plClient.cpp +++ b/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/Apps/plClient/plClient.cpp @@ -1619,7 +1619,7 @@ void plClient::ShutdownDLLs() hsBool plClient::MainLoop() { -#ifndef PLASMA_EXTERNAL_RELEASE +#if defined(HAVE_CYPYTHONIDE) && !defined(PLASMA_EXTERNAL_RELEASE) if (PythonInterface::UsePythonDebugger()) { PythonInterface::PythonDebugger()->Update(); diff --git a/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/FeatureLib/pfConsole/pfConsoleCommands.cpp b/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/FeatureLib/pfConsole/pfConsoleCommands.cpp index 63607d7c..1274e06d 100644 --- a/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/FeatureLib/pfConsole/pfConsoleCommands.cpp +++ b/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/FeatureLib/pfConsole/pfConsoleCommands.cpp @@ -7024,6 +7024,7 @@ PF_CONSOLE_CMD( Python, // Group name } #ifndef LIMIT_CONSOLE_COMMANDS +#ifdef HAVE_CYPYTHONIDE PF_CONSOLE_CMD( Python, UsePythonDebugger, "", @@ -7031,6 +7032,7 @@ PF_CONSOLE_CMD( Python, { PythonInterface::UsePythonDebugger(true); } +#endif #include "../pfMessage/pfBackdoorMsg.h" diff --git a/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/FeatureLib/pfPython/cyPythonInterface.cpp b/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/FeatureLib/pfPython/cyPythonInterface.cpp index 878c179a..f965014c 100644 --- a/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/FeatureLib/pfPython/cyPythonInterface.cpp +++ b/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/FeatureLib/pfPython/cyPythonInterface.cpp @@ -180,7 +180,7 @@ PyObject* PythonInterface::dbgOut = nil; PyObject* PythonInterface::dbgSlice = nil; // time slice function for the debug window plStatusLog* PythonInterface::dbgLog = nil; // output logfile -#ifndef PLASMA_EXTERNAL_RELEASE +#if defined(HAVE_CYPYTHONIDE) && !defined(PLASMA_EXTERNAL_RELEASE) bool PythonInterface::usePythonDebugger = false; plCyDebServer PythonInterface::debugServer; bool PythonInterface::requestedExit = false; @@ -189,7 +189,7 @@ bool PythonInterface::requestedExit = false; // stupid Windows.h and who started including that! #undef DrawText -#ifndef PLASMA_EXTERNAL_RELEASE +#if defined(HAVE_CYPYTHONIDE) && !defined(PLASMA_EXTERNAL_RELEASE) // Special includes for debugging #include @@ -840,7 +840,7 @@ void PythonInterface::initPython() Py_SetProgramName("plasma"); Py_Initialize(); -#ifndef PLASMA_EXTERNAL_RELEASE +#if defined(HAVE_CYPYTHONIDE) && !defined(PLASMA_EXTERNAL_RELEASE) if (usePythonDebugger) { debugServer.SetCallbackClass(&debServerCallback); @@ -1512,7 +1512,7 @@ void PythonInterface::finiPython() initialized--; if ( initialized < 1 && Py_IsInitialized() != 0 && IsInShutdown ) { -#ifndef PLASMA_EXTERNAL_RELEASE +#if defined(HAVE_CYPYTHONIDE) && !defined(PLASMA_EXTERNAL_RELEASE) if (usePythonDebugger) debugServer.Disconnect(); #endif @@ -1659,7 +1659,7 @@ int PythonInterface::getOutputAndReset(std::string *output) pyOutputRedirector::ClearData(stdOut); // tell python debugger -#ifndef PLASMA_EXTERNAL_RELEASE +#if defined(HAVE_CYPYTHONIDE) && !defined(PLASMA_EXTERNAL_RELEASE) if (UsePythonDebugger()) PythonInterface::PythonDebugger()->StdOut(strVal); #endif diff --git a/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/FeatureLib/pfPython/cyPythonInterface.h b/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/FeatureLib/pfPython/cyPythonInterface.h index 28751ad6..138a81ae 100644 --- a/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/FeatureLib/pfPython/cyPythonInterface.h +++ b/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/FeatureLib/pfPython/cyPythonInterface.h @@ -34,7 +34,7 @@ You can contact Cyan Worlds, Inc. by email legal@cyan.com #include "hsStlUtils.h" #include -#ifndef PLASMA_EXTERNAL_RELEASE +#if defined(HAVE_CYPYTHONIDE) && !defined(PLASMA_EXTERNAL_RELEASE) #include "../../Apps/CyPythonIDE/plCyDebug/plCyDebServer.h" #endif @@ -66,7 +66,7 @@ private: static PyObject* dbgSlice; // time slice function for the debug window static plStatusLog* dbgLog; -#ifndef PLASMA_EXTERNAL_RELEASE +#if defined(HAVE_CYPYTHONIDE) && !defined(PLASMA_EXTERNAL_RELEASE) static bool usePythonDebugger; static bool requestedExit; static plCyDebServer debugServer; @@ -212,7 +212,7 @@ public: // static pyKey* GetpyKeyFromPython(PyObject* pkey); -#ifndef PLASMA_EXTERNAL_RELEASE +#if defined(HAVE_CYPYTHONIDE) && !defined(PLASMA_EXTERNAL_RELEASE) static bool UsePythonDebugger() { return usePythonDebugger; } static void UsePythonDebugger(bool use) { usePythonDebugger = use; } From 196657fa60fdf465cce0b8dceafb1deec7edef61 Mon Sep 17 00:00:00 2001 From: CyanWorlds Date: Wed, 18 Jan 2012 13:46:47 -0800 Subject: [PATCH 02/21] Added Donate button to the login screen Added fixes from Christian Walther for the Python SDL tuples Added plLocalizationEditor source and project --- .../plLocalizationEditor.vcproj | 171 ++++++++ .../Plasma/Apps/plClient/res/plClient.rc | 5 +- .../Plasma/Apps/plClient/res/resource.h | 1 + .../Sources/Plasma/Apps/plClient/winmain.cpp | 6 + .../Tools/plLocalizationEditor/plAddDlgs.cpp | 413 ++++++++++++++++++ .../Tools/plLocalizationEditor/plAddDlgs.h | 84 ++++ .../Tools/plLocalizationEditor/plEditDlg.cpp | 316 ++++++++++++++ .../Tools/plLocalizationEditor/plEditDlg.h | 72 +++ .../plLocalizationEditor/plLocTreeView.cpp | 213 +++++++++ .../plLocalizationEditor/plLocTreeView.h | 65 +++ .../plLocalizationEditor.cpp | 394 +++++++++++++++++ .../Tools/plLocalizationEditor/res/icon1.ico | Bin 0 -> 2998 bytes .../res/plLocalizationEditor.rc | 268 ++++++++++++ .../Tools/plLocalizationEditor/res/resource.h | 51 +++ 14 files changed, 2057 insertions(+), 2 deletions(-) create mode 100644 MOULOpenSourceClientPlugin/Plasma20/MsDevProjects/Tools/plLocalizationEditor/plLocalizationEditor.vcproj create mode 100644 MOULOpenSourceClientPlugin/Plasma20/Sources/Tools/plLocalizationEditor/plAddDlgs.cpp create mode 100644 MOULOpenSourceClientPlugin/Plasma20/Sources/Tools/plLocalizationEditor/plAddDlgs.h create mode 100644 MOULOpenSourceClientPlugin/Plasma20/Sources/Tools/plLocalizationEditor/plEditDlg.cpp create mode 100644 MOULOpenSourceClientPlugin/Plasma20/Sources/Tools/plLocalizationEditor/plEditDlg.h create mode 100644 MOULOpenSourceClientPlugin/Plasma20/Sources/Tools/plLocalizationEditor/plLocTreeView.cpp create mode 100644 MOULOpenSourceClientPlugin/Plasma20/Sources/Tools/plLocalizationEditor/plLocTreeView.h create mode 100644 MOULOpenSourceClientPlugin/Plasma20/Sources/Tools/plLocalizationEditor/plLocalizationEditor.cpp create mode 100644 MOULOpenSourceClientPlugin/Plasma20/Sources/Tools/plLocalizationEditor/res/icon1.ico create mode 100644 MOULOpenSourceClientPlugin/Plasma20/Sources/Tools/plLocalizationEditor/res/plLocalizationEditor.rc create mode 100644 MOULOpenSourceClientPlugin/Plasma20/Sources/Tools/plLocalizationEditor/res/resource.h diff --git a/MOULOpenSourceClientPlugin/Plasma20/MsDevProjects/Tools/plLocalizationEditor/plLocalizationEditor.vcproj b/MOULOpenSourceClientPlugin/Plasma20/MsDevProjects/Tools/plLocalizationEditor/plLocalizationEditor.vcproj new file mode 100644 index 00000000..a3020c9e --- /dev/null +++ b/MOULOpenSourceClientPlugin/Plasma20/MsDevProjects/Tools/plLocalizationEditor/plLocalizationEditor.vcproj @@ -0,0 +1,171 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/Apps/plClient/res/plClient.rc b/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/Apps/plClient/res/plClient.rc index 8d834c1f..0bdae2c1 100644 --- a/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/Apps/plClient/res/plClient.rc +++ b/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/Apps/plClient/res/plClient.rc @@ -199,8 +199,9 @@ BEGIN RTEXT "Product String",IDC_PRODUCTSTRING,88,86,194,8 CONTROL "",IDC_STATIC,"Static",SS_BLACKFRAME | SS_SUNKEN,7,49, 288,152 - PUSHBUTTON "Need an account?",IDC_URULOGIN_GAMETAPLINK,95,175,110, - 14,BS_FLAT + PUSHBUTTON "Need an account?",IDC_URULOGIN_GAMETAPLINK,32,174,95,14, + BS_FLAT + PUSHBUTTON "Donate",IDC_URULOGIN_GAMETAPLINK2,175,174,95,14,BS_FLAT END IDD_URULOGIN_EULA DIALOGEX 0, 0, 300, 318 diff --git a/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/Apps/plClient/res/resource.h b/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/Apps/plClient/res/resource.h index 63f30b0b..315a022f 100644 --- a/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/Apps/plClient/res/resource.h +++ b/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/Apps/plClient/res/resource.h @@ -87,6 +87,7 @@ #define IDC_BUTTON1 1030 #define IDC_URULOGIN_GAMETAPLINK 1030 #define IDC_AUTH_MESSAGE 1031 +#define IDC_URULOGIN_GAMETAPLINK2 1031 #define IDC_PRODUCTSTRING 1033 #define IDC_STATUS_TEXT 1034 #define IDC_HOTKEY1 1035 diff --git a/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/Apps/plClient/winmain.cpp b/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/Apps/plClient/winmain.cpp index 9fb486d6..a97c8f59 100644 --- a/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/Apps/plClient/winmain.cpp +++ b/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/Apps/plClient/winmain.cpp @@ -1419,6 +1419,12 @@ BOOL CALLBACK UruLoginDialogProc( HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM return TRUE; } + else if (HIWORD(wParam) == BN_CLICKED && LOWORD(wParam) == IDC_URULOGIN_GAMETAPLINK2) + { + ShellExecute(NULL, "open", "http://www.mystonline.com/donate", NULL, NULL, SW_SHOWNORMAL); + + return TRUE; + } break; } diff --git a/MOULOpenSourceClientPlugin/Plasma20/Sources/Tools/plLocalizationEditor/plAddDlgs.cpp b/MOULOpenSourceClientPlugin/Plasma20/Sources/Tools/plLocalizationEditor/plAddDlgs.cpp new file mode 100644 index 00000000..dacc732e --- /dev/null +++ b/MOULOpenSourceClientPlugin/Plasma20/Sources/Tools/plLocalizationEditor/plAddDlgs.cpp @@ -0,0 +1,413 @@ +/*==LICENSE==* + +CyanWorlds.com Engine - MMOG client, server and tools +Copyright (C) 2011 Cyan Worlds, Inc. + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . + +Additional permissions under GNU GPL version 3 section 7 + +If you modify this Program, or any covered work, by linking or +combining it with any of RAD Game Tools Bink SDK, Autodesk 3ds Max SDK, +NVIDIA PhysX SDK, Microsoft DirectX SDK, OpenSSL library, Independent +JPEG Group JPEG library, Microsoft Windows Media SDK, or Apple QuickTime SDK +(or a modified version of those libraries), +containing parts covered by the terms of the Bink SDK EULA, 3ds Max EULA, +PhysX SDK EULA, DirectX SDK EULA, OpenSSL and SSLeay licenses, IJG +JPEG Library README, Windows Media SDK EULA, or QuickTime SDK EULA, the +licensors of this Program grant you additional +permission to convey the resulting work. Corresponding Source for a +non-source form of such a combination shall include the source code for +the parts of OpenSSL and IJG JPEG Library used as well as that of the covered +work. + +You can contact Cyan Worlds, Inc. by email legal@cyan.com + or by snail mail at: + Cyan Worlds, Inc. + 14617 N Newport Hwy + Mead, WA 99021 + +*==LICENSE==*/ +// basic classes for encapsulating the add dialogs + +#include "res/resource.h" +#include "plAddDlgs.h" +#include "plEditDlg.h" + +#include "hsUtils.h" +#include "../plResMgr/plLocalization.h" +#include "../pfLocalizationMgr/pfLocalizationDataMgr.h" + +#include +#include + +extern HINSTANCE gInstance; + +// very simple subclass for edit controls (and combo boxes) so that they only accept alphanumeric values +class AlphaNumericEditCtrl +{ + int fCtrlID; + HWND fOwner, fEditBox; + LONG_PTR fPrevProc; + +public: + AlphaNumericEditCtrl() : fCtrlID(0), fOwner(NULL), fEditBox(NULL), fPrevProc(NULL) {} + ~AlphaNumericEditCtrl() {} + + void Setup(int ctrlID, HWND owner, bool comboBox); + static LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam); +}; + +std::map editBoxMap; + +// basic setup of the edit control +void AlphaNumericEditCtrl::Setup(int ctrlID, HWND owner, bool comboBox) +{ + fCtrlID = ctrlID; + fOwner = owner; + + // if we're a combo box, we need to subclass the edit control, not the combo box + if (comboBox) + { + COMBOBOXINFO cbinfo; + cbinfo.cbSize = sizeof(COMBOBOXINFO); + GetComboBoxInfo(GetDlgItem(fOwner, fCtrlID), &cbinfo); + fEditBox = cbinfo.hwndItem; + } + else + fEditBox = GetDlgItem(fOwner, fCtrlID); + + // subclass the edit box so we can filter input (don't ask me why we have to double cast the + // function pointer to get rid of the compiler warning) + fPrevProc = SetWindowLongPtr(fEditBox, GWLP_WNDPROC, (LONG)(LONG_PTR)AlphaNumericEditCtrl::WndProc); + + editBoxMap[fCtrlID] = *this; +} + +// Message handler for our edit box +LRESULT CALLBACK AlphaNumericEditCtrl::WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) +{ + int ctrlID = GetDlgCtrlID(hWnd); + if (editBoxMap.find(ctrlID) == editBoxMap.end()) // control ID doesn't exist, so it's probably a combo boxes' edit ctrl + ctrlID = GetDlgCtrlID(GetParent(hWnd)); // so grab the parent's ID number instead + switch (message) + { + case WM_CHAR: + { + AlphaNumericEditCtrl editBox = editBoxMap[ctrlID]; + char theChar = (char)wParam; + + // we only accept 0-9, a-z, A-Z, or backspace + if ((theChar < '0' || theChar > '9') && (theChar < 'a' || theChar > 'z') && (theChar < 'A' || theChar >'Z') && !(theChar == VK_BACK)) + { + MessageBeep(-1); // alert the user + return FALSE; // and make sure the default handler doesn't get it + } + } + } + // Any messages we don't process must be passed onto the original window function + return CallWindowProc((WNDPROC)editBoxMap[ctrlID].fPrevProc, hWnd, message, wParam, lParam); +} + +// plAddElementDlg - dialog for adding a single element +BOOL CALLBACK plAddElementDlg::IDlgProc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam) +{ + static plAddElementDlg* pthis = NULL; + + switch (msg) + { + case WM_INITDIALOG: + pthis = (plAddElementDlg*)lParam; + if (!pthis->IInitDlg(hDlg)) + EndDialog(hDlg, 0); + return FALSE; + + case WM_COMMAND: + if (HIWORD(wParam) == BN_CLICKED && LOWORD(wParam) == IDOK) + { + EndDialog(hDlg, 1); + return TRUE; + } + else if (HIWORD(wParam) == BN_CLICKED && LOWORD(wParam) == IDCANCEL) + { + EndDialog(hDlg, 0); + return TRUE; + } + else if (HIWORD(wParam) == CBN_SELCHANGE && LOWORD(wParam) == IDC_PARENTAGE) + { + wchar_t buff[256]; + // we do this whole get sel, get item because get text won't return the updated text + int index = (int)SendMessage(GetDlgItem(hDlg, IDC_PARENTAGE), CB_GETCURSEL, (WPARAM)0, (LPARAM)0); + SendMessage(GetDlgItem(hDlg, IDC_PARENTAGE), CB_GETLBTEXT, (WPARAM)index, (LPARAM)buff); + + pthis->fAgeName = buff; + pthis->fAgeChanged = true; + pthis->IUpdateDlg(hDlg); + } + else if (HIWORD(wParam) == CBN_EDITCHANGE && LOWORD(wParam) == IDC_PARENTAGE) + { + wchar_t buff[256]; + GetDlgItemTextW(hDlg, IDC_PARENTAGE, buff, 256); + + pthis->fAgeName = buff; + pthis->fAgeChanged = true; + pthis->IUpdateDlg(hDlg, false); + } + else if (HIWORD(wParam) == CBN_SELCHANGE && LOWORD(wParam) == IDC_PARENTSET) + { + wchar_t buff[256]; + // we do this whole get sel, get item because get text won't return the updated text + int index = (int)SendMessage(GetDlgItem(hDlg, IDC_PARENTSET), CB_GETCURSEL, (WPARAM)0, (LPARAM)0); + SendMessage(GetDlgItem(hDlg, IDC_PARENTSET), CB_GETLBTEXT, (WPARAM)index, (LPARAM)buff); + + pthis->fSetName = buff; + pthis->IUpdateDlg(hDlg); + } + else if (HIWORD(wParam) == CBN_EDITCHANGE && LOWORD(wParam) == IDC_PARENTSET) + { + wchar_t buff[256]; + GetDlgItemTextW(hDlg, IDC_PARENTSET, buff, 256); + + pthis->fSetName = buff; + pthis->IUpdateDlg(hDlg, false); + } + else if (HIWORD(wParam) == EN_UPDATE && LOWORD(wParam) == IDC_ELEMENTNAME) + { + wchar_t buff[256]; + GetDlgItemTextW(hDlg, IDC_ELEMENTNAME, buff, 256); + pthis->fElementName = buff; + + pthis->IUpdateDlg(hDlg); + } + break; + + case WM_SYSCOMMAND: + switch (wParam) + { + case SC_CLOSE: + EndDialog(hDlg, 0); + return TRUE; + } + break; + } + return FALSE; +} + +bool plAddElementDlg::IInitDlg(HWND hDlg) +{ + HWND listCtrl = GetDlgItem(hDlg, IDC_PARENTAGE); + std::vector ageNames = pfLocalizationDataMgr::Instance().GetAgeList(); + + // add the age names to the list + for (int i = 0; i < ageNames.size(); i++) + SendMessage(listCtrl, CB_ADDSTRING, (WPARAM)0, (LPARAM)ageNames[i].c_str()); + + // select the age we were given + SendMessage(listCtrl, CB_SELECTSTRING, (WPARAM)-1, (LPARAM)fAgeName.c_str()); + + AlphaNumericEditCtrl ageCtrl, setCtrl, subCtrl; + ageCtrl.Setup(IDC_PARENTAGE, hDlg, true); + setCtrl.Setup(IDC_PARENTSET, hDlg, true); + subCtrl.Setup(IDC_ELEMENTNAME, hDlg, false); + + fAgeChanged = true; + + IUpdateDlg(hDlg); + return true; +} + +void plAddElementDlg::IUpdateDlg(HWND hDlg, bool setFocus) +{ + std::wstring pathStr = L"Path: " + fAgeName + L"." + fSetName + L"." + fElementName; + SetDlgItemTextW(hDlg, IDC_PATH, pathStr.c_str()); + + if (fAgeChanged) // we only update this if the age changed (saves time and prevents weird bugs, like typing backwards) + { + // now add the sets + HWND listCtrl = GetDlgItem(hDlg, IDC_PARENTSET); + SendMessage(listCtrl, CB_RESETCONTENT, (WPARAM)0, (LPARAM)0); + std::vector setNames = pfLocalizationDataMgr::Instance().GetSetList(fAgeName); + + // add the set names to the list + for (int i = 0; i < setNames.size(); i++) + SendMessage(listCtrl, CB_ADDSTRING, (WPARAM)0, (LPARAM)setNames[i].c_str()); + + // select the set we currently have + int ret = (int)SendMessage(listCtrl, CB_SELECTSTRING, (WPARAM)-1, (LPARAM)fSetName.c_str()); + if (ret == CB_ERR) // couldn't find the string, so just set it as the current string in the edit box + SetDlgItemTextW(hDlg, IDC_PARENTSET, fSetName.c_str()); + + fAgeChanged = false; + } + + if (fSetName != L"" && setFocus) + SetFocus(GetDlgItem(hDlg, IDC_ELEMENTNAME)); + + if (fSetName != L"" && fElementName != L"") + EnableWindow(GetDlgItem(hDlg, IDOK), TRUE); + else + EnableWindow(GetDlgItem(hDlg, IDOK), FALSE); +} + +plAddElementDlg::plAddElementDlg(std::wstring parentPath) +{ + // throw away vars + std::wstring element, lang; + + SplitLocalizationPath(parentPath, fAgeName, fSetName, element, lang); +} + +bool plAddElementDlg::DoPick(HWND parent) +{ + INT_PTR ret = DialogBoxParam(gInstance, MAKEINTRESOURCE(IDD_ADDELEMENT), + parent, IDlgProc, (LPARAM)this); + + editBoxMap.clear(); + + return (ret != 0); +} + +// plAddLocalizationDlg - dialog for adding a single localization +BOOL CALLBACK plAddLocalizationDlg::IDlgProc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam) +{ + static plAddLocalizationDlg* pthis = NULL; + + switch (msg) + { + case WM_INITDIALOG: + pthis = (plAddLocalizationDlg*)lParam; + if (!pthis->IInitDlg(hDlg)) + EndDialog(hDlg, 0); + return FALSE; + + case WM_COMMAND: + if (HIWORD(wParam) == BN_CLICKED && LOWORD(wParam) == IDOK) + { + EndDialog(hDlg, 1); + return TRUE; + } + else if (HIWORD(wParam) == BN_CLICKED && LOWORD(wParam) == IDCANCEL) + { + EndDialog(hDlg, 0); + return TRUE; + } + else if (HIWORD(wParam) == CBN_SELCHANGE && LOWORD(wParam) == IDC_LANGUAGE) + { + wchar_t buff[256]; + // we do this whole get sel, get item because get text won't return the updated text + int index = (int)SendMessage(GetDlgItem(hDlg, IDC_LANGUAGE), CB_GETCURSEL, (WPARAM)0, (LPARAM)0); + SendMessage(GetDlgItem(hDlg, IDC_LANGUAGE), CB_GETLBTEXT, (WPARAM)index, (LPARAM)buff); + + pthis->fLanguageName = buff; + pthis->IUpdateDlg(hDlg); + } + break; + + case WM_SYSCOMMAND: + switch (wParam) + { + case SC_CLOSE: + EndDialog(hDlg, 0); + return TRUE; + } + break; + } + return FALSE; +} + +std::vector IGetAllLanguageNames() +{ + int numLocales = plLocalization::GetNumLocales(); + std::vector retVal; + + for (int curLocale = 0; curLocale <= numLocales; curLocale++) + { + char *name = plLocalization::GetLanguageName((plLocalization::Language)curLocale); + wchar_t *wName = hsStringToWString(name); + retVal.push_back(wName); + delete [] wName; + } + + return retVal; +} + +bool plAddLocalizationDlg::IInitDlg(HWND hDlg) +{ + std::wstring pathStr = L"Path: " + fAgeName + L"." + fSetName + L"." + fElementName; + SetDlgItemTextW(hDlg, IDC_PATH, pathStr.c_str()); + + std::vector existingLanguages; + existingLanguages = pfLocalizationDataMgr::Instance().GetLanguages(fAgeName, fSetName, fElementName); + + std::vector missingLanguages = IGetAllLanguageNames(); + for (int i = 0; i < existingLanguages.size(); i++) // remove all languages we already have + { + for (int j = 0; j < missingLanguages.size(); j++) + { + if (missingLanguages[j] == existingLanguages[i]) + { + missingLanguages.erase(missingLanguages.begin() + j); + j--; + } + } + } + + HWND listCtrl = GetDlgItem(hDlg, IDC_LANGUAGE); + // see if any languages are missing + if (missingLanguages.size() == 0) + { + // none are missing, so disable the control + EnableWindow(listCtrl, FALSE); + IUpdateDlg(hDlg); + return true; + } + + // add the missing languages to the list + for (i = 0; i < missingLanguages.size(); i++) + SendMessage(listCtrl, CB_ADDSTRING, (WPARAM)0, (LPARAM)missingLanguages[i].c_str()); + + // select the first language in the list + SendMessage(listCtrl, CB_SETCURSEL, (WPARAM)0, (LPARAM)0); + // and put it's value into the internal variable + wchar_t buff[256]; + GetDlgItemText(hDlg, IDC_LANGUAGE, buff, 256); + fLanguageName = buff; + + IUpdateDlg(hDlg); + return true; +} + +void plAddLocalizationDlg::IUpdateDlg(HWND hDlg) +{ + if (fLanguageName != L"") + EnableWindow(GetDlgItem(hDlg, IDOK), TRUE); + else + EnableWindow(GetDlgItem(hDlg, IDOK), FALSE); +} + +plAddLocalizationDlg::plAddLocalizationDlg(std::wstring parentPath) +{ + // throw away vars + std::wstring lang; + + SplitLocalizationPath(parentPath, fAgeName, fSetName, fElementName, lang); +} + +bool plAddLocalizationDlg::DoPick(HWND parent) +{ + INT_PTR ret = DialogBoxParam(gInstance, MAKEINTRESOURCE(IDD_ADDLOCALIZATION), + parent, IDlgProc, (LPARAM)this); + + return (ret != 0); +} diff --git a/MOULOpenSourceClientPlugin/Plasma20/Sources/Tools/plLocalizationEditor/plAddDlgs.h b/MOULOpenSourceClientPlugin/Plasma20/Sources/Tools/plLocalizationEditor/plAddDlgs.h new file mode 100644 index 00000000..8cbc87de --- /dev/null +++ b/MOULOpenSourceClientPlugin/Plasma20/Sources/Tools/plLocalizationEditor/plAddDlgs.h @@ -0,0 +1,84 @@ +/*==LICENSE==* + +CyanWorlds.com Engine - MMOG client, server and tools +Copyright (C) 2011 Cyan Worlds, Inc. + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . + +Additional permissions under GNU GPL version 3 section 7 + +If you modify this Program, or any covered work, by linking or +combining it with any of RAD Game Tools Bink SDK, Autodesk 3ds Max SDK, +NVIDIA PhysX SDK, Microsoft DirectX SDK, OpenSSL library, Independent +JPEG Group JPEG library, Microsoft Windows Media SDK, or Apple QuickTime SDK +(or a modified version of those libraries), +containing parts covered by the terms of the Bink SDK EULA, 3ds Max EULA, +PhysX SDK EULA, DirectX SDK EULA, OpenSSL and SSLeay licenses, IJG +JPEG Library README, Windows Media SDK EULA, or QuickTime SDK EULA, the +licensors of this Program grant you additional +permission to convey the resulting work. Corresponding Source for a +non-source form of such a combination shall include the source code for +the parts of OpenSSL and IJG JPEG Library used as well as that of the covered +work. + +You can contact Cyan Worlds, Inc. by email legal@cyan.com + or by snail mail at: + Cyan Worlds, Inc. + 14617 N Newport Hwy + Mead, WA 99021 + +*==LICENSE==*/ +// basic classes for encapsulating the add dialogs +#ifndef __plAddDlgs_h__ +#define __plAddDlgs_h__ + +#include +#define WIN32_LEAN_AND_MEAN +#include +#include + +class plAddElementDlg +{ +protected: + static BOOL CALLBACK IDlgProc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam); + + bool IInitDlg(HWND hDlg); + void IUpdateDlg(HWND hDlg, bool setFocus = true); + + std::wstring fAgeName, fSetName, fElementName; + bool fAgeChanged; +public: + plAddElementDlg(std::wstring parentPath); + + bool DoPick(HWND parent); // returns true if [Ok] clicked, false otherwise. + std::wstring GetValue() {return fAgeName + L"." + fSetName + L"." + fElementName;} +}; + +class plAddLocalizationDlg +{ +protected: + static BOOL CALLBACK IDlgProc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam); + + bool IInitDlg(HWND hDlg); + void IUpdateDlg(HWND hDlg); + + std::wstring fAgeName, fSetName, fElementName, fLanguageName; +public: + plAddLocalizationDlg(std::wstring parentPath); + + bool DoPick(HWND parent); // returns true if [Ok] clicked, false otherwise. + std::wstring GetValue() {return fLanguageName;} +}; + +#endif diff --git a/MOULOpenSourceClientPlugin/Plasma20/Sources/Tools/plLocalizationEditor/plEditDlg.cpp b/MOULOpenSourceClientPlugin/Plasma20/Sources/Tools/plLocalizationEditor/plEditDlg.cpp new file mode 100644 index 00000000..79f23b3a --- /dev/null +++ b/MOULOpenSourceClientPlugin/Plasma20/Sources/Tools/plLocalizationEditor/plEditDlg.cpp @@ -0,0 +1,316 @@ +/*==LICENSE==* + +CyanWorlds.com Engine - MMOG client, server and tools +Copyright (C) 2011 Cyan Worlds, Inc. + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . + +Additional permissions under GNU GPL version 3 section 7 + +If you modify this Program, or any covered work, by linking or +combining it with any of RAD Game Tools Bink SDK, Autodesk 3ds Max SDK, +NVIDIA PhysX SDK, Microsoft DirectX SDK, OpenSSL library, Independent +JPEG Group JPEG library, Microsoft Windows Media SDK, or Apple QuickTime SDK +(or a modified version of those libraries), +containing parts covered by the terms of the Bink SDK EULA, 3ds Max EULA, +PhysX SDK EULA, DirectX SDK EULA, OpenSSL and SSLeay licenses, IJG +JPEG Library README, Windows Media SDK EULA, or QuickTime SDK EULA, the +licensors of this Program grant you additional +permission to convey the resulting work. Corresponding Source for a +non-source form of such a combination shall include the source code for +the parts of OpenSSL and IJG JPEG Library used as well as that of the covered +work. + +You can contact Cyan Worlds, Inc. by email legal@cyan.com + or by snail mail at: + Cyan Worlds, Inc. + 14617 N Newport Hwy + Mead, WA 99021 + +*==LICENSE==*/ +// Basic edit dialog stuff +#include "plEditDlg.h" +#include "res/resource.h" +#include "plLocTreeView.h" +#include "plAddDlgs.h" + +#include "hsUtils.h" +#include "../pfLocalizationMgr/pfLocalizationDataMgr.h" + +#include + +HWND gEditDlg = NULL; +extern HINSTANCE gInstance; +extern HWND gTreeView; + +// global data for this dialog +std::wstring gCurrentPath = L""; + +// split a subtitle path up into its component parts +void SplitLocalizationPath(std::wstring path, std::wstring &ageName, std::wstring &setName, std::wstring &locName, std::wstring &locLanguage) +{ + ageName = setName = locName = locLanguage = L""; + + std::wstring::size_type lastPos = 0, curPos = 0; + // separate the age name out + curPos = path.find(L"."); + if (curPos == std::wstring::npos) + { + ageName = path; + return; + } + ageName = path.substr(0, curPos); + path = path.substr(curPos + 1, path.length()); + + // separate the set name out + curPos = path.find(L"."); + if (curPos == std::wstring::npos) + { + setName = path; + return; + } + setName = path.substr(0, curPos); + path = path.substr(curPos + 1, path.length()); + + // separate the element out + curPos = path.find(L"."); + if (curPos == std::wstring::npos) + { + locName = path; + return; + } + locName = path.substr(0, curPos); + path = path.substr(curPos + 1, path.length()); + + // what's left is the language + locLanguage = path; +} + +// saves the current localization text to the data manager +void SaveLocalizationText() +{ + if (gCurrentPath == L"") + return; // no path to save + + UInt32 textLen = (UInt32)SendMessage(GetDlgItem(gEditDlg, IDC_LOCALIZATIONTEXT), WM_GETTEXTLENGTH, (WPARAM)0, (LPARAM)0); + wchar_t *buffer = new wchar_t[textLen + 2]; + GetDlgItemTextW(gEditDlg, IDC_LOCALIZATIONTEXT, buffer, textLen + 1); + buffer[textLen + 1] = 0; + std::wstring plainTextData = buffer; + delete [] buffer; + std::wstring ageName, setName, elementName, elementLanguage; + SplitLocalizationPath(gCurrentPath, ageName, setName, elementName, elementLanguage); + + std::wstring name = ageName + L"." + setName + L"." + elementName; + pfLocalizationDataMgr::Instance().SetElementPlainTextData(name, elementLanguage, plainTextData); +} + +// Reset all controls to their default values (except for static controls) +void ResetDlgDefaults() +{ + SetDlgItemTextW(gEditDlg, IDC_LOCALIZATIONTEXT, L""); +} + +// Enable/disable all edit controls (some won't enable/disable unless an audio file is loaded and the subtitle is timed) +void EnableDlg(BOOL enable) +{ + if (!enable) + ResetDlgDefaults(); // reset controls to defaults + + EnableWindow(GetDlgItem(gEditDlg, IDC_LOCALIZATIONTEXT), enable); +} + +// updates the edit dialog based on the path specified +void UpdateEditDlg(std::wstring locPath) +{ + if (locPath == gCurrentPath) + return; + + gCurrentPath = locPath; + + std::wstring itemText = L"Text ("; + itemText += locPath + L"):"; + SetDlgItemTextW(gEditDlg, IDC_LOCPATH, itemText.c_str()); + + std::wstring ageName = L"", setName = L"", elementName = L"", elementLanguage = L""; + SplitLocalizationPath(locPath, ageName, setName, elementName, elementLanguage); + + // now make sure they've drilled down deep enough to enable the dialog + if (elementLanguage == L"") // not deep enough + EnableDlg(FALSE); + else + { + EnableDlg(TRUE); + std::wstring key = ageName + L"." + setName + L"." + elementName; + std::wstring elementText = pfLocalizationDataMgr::Instance().GetElementPlainTextData(key, elementLanguage); + SetDlgItemTextW(gEditDlg, IDC_LOCALIZATIONTEXT, elementText.c_str()); + } + + // now to setup the add/delete buttons + if (elementLanguage != L"") // they have selected a language + { + SetDlgItemText(gEditDlg, IDC_ADD, L"Add Localization"); + EnableWindow(GetDlgItem(gEditDlg, IDC_ADD), TRUE); + SetDlgItemText(gEditDlg, IDC_DELETE, L"Delete Localization"); + if (elementLanguage != L"English") // don't allow them to delete the default language + EnableWindow(GetDlgItem(gEditDlg, IDC_DELETE), TRUE); + else + EnableWindow(GetDlgItem(gEditDlg, IDC_DELETE), FALSE); + } + else // they have selected something else + { + SetDlgItemText(gEditDlg, IDC_ADD, L"Add Element"); + EnableWindow(GetDlgItem(gEditDlg, IDC_ADD), TRUE); + SetDlgItemText(gEditDlg, IDC_DELETE, L"Delete Element"); + if (elementName != L"") // the have selected an individual element + { + std::vector elementNames = pfLocalizationDataMgr::Instance().GetElementList(ageName, setName); + if (elementNames.size() > 1) // they can't delete the only subtitle in a set + EnableWindow(GetDlgItem(gEditDlg, IDC_DELETE), TRUE); + else + EnableWindow(GetDlgItem(gEditDlg, IDC_DELETE), FALSE); + } + else + EnableWindow(GetDlgItem(gEditDlg, IDC_DELETE), FALSE); + } +} + +BOOL HandleCommandMessage(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) +{ + int wmID, wmEvent; + wmID = LOWORD(wParam); + wmEvent = HIWORD(wParam); + + switch (wmEvent) + { + case BN_CLICKED: + switch (wmID) + { + case IDC_ADD: + { + SaveLocalizationText(); // save any current changes to the database + + std::wstring buttonText; + wchar_t buff[256]; + GetDlgItemText(gEditDlg, IDC_ADD, buff, 256); + buttonText = buff; + + if (buttonText == L"Add Element") + { + plAddElementDlg dlg(gCurrentPath); + if (dlg.DoPick(gEditDlg)) + { + std::wstring path = dlg.GetValue(); // path is age.set.name + if (!pfLocalizationDataMgr::Instance().AddElement(path)) + MessageBox(gEditDlg, L"Couldn't add new element because one already exists with that name!", L"Error", MB_ICONERROR | MB_OK); + else + { + gCurrentPath = L""; + plLocTreeView::ClearTreeView(gTreeView); + plLocTreeView::FillTreeViewFromData(gTreeView, path); + UpdateEditDlg(path); + } + } + } + else if (buttonText == L"Add Localization") + { + plAddLocalizationDlg dlg(gCurrentPath); + if (dlg.DoPick(gEditDlg)) + { + std::wstring newLanguage = dlg.GetValue(); + std::wstring ageName, setName, elementName, elementLanguage; + SplitLocalizationPath(gCurrentPath, ageName, setName, elementName, elementLanguage); + std::wstring key = ageName + L"." + setName + L"." + elementName; + if (!pfLocalizationDataMgr::Instance().AddLocalization(key, newLanguage)) + MessageBox(gEditDlg, L"Couldn't add additional localization!", L"Error", MB_ICONERROR | MB_OK); + else + { + std::wstring path = key + L"." + newLanguage; // select the new language + gCurrentPath = L""; + plLocTreeView::ClearTreeView(gTreeView); + plLocTreeView::FillTreeViewFromData(gTreeView, path); + UpdateEditDlg(path); + } + } + } + return FALSE; + } + case IDC_DELETE: + { + SaveLocalizationText(); // save any current changes to the database + + std::wstring messageText = L"Are you sure that you want to delete " + gCurrentPath + L"?"; + int res = MessageBoxW(gEditDlg, messageText.c_str(), L"Delete", MB_ICONQUESTION | MB_YESNO); + if (res == IDYES) + { + std::wstring buttonText; + wchar_t buff[256]; + GetDlgItemText(gEditDlg, IDC_DELETE, buff, 256); + buttonText = buff; + + if (buttonText == L"Delete Element") + { + if (!pfLocalizationDataMgr::Instance().DeleteElement(gCurrentPath)) + MessageBox(gEditDlg, L"Couldn't delete element!", L"Error", MB_ICONERROR | MB_OK); + else + { + std::wstring path = gCurrentPath; + gCurrentPath = L""; + plLocTreeView::ClearTreeView(gTreeView); + plLocTreeView::FillTreeViewFromData(gTreeView, path); + UpdateEditDlg(path); + } + } + else if (buttonText == L"Delete Localization") + { + std::wstring ageName, setName, elementName, elementLanguage; + SplitLocalizationPath(gCurrentPath, ageName, setName, elementName, elementLanguage); + std::wstring key = ageName + L"." + setName + L"." + elementName; + if (!pfLocalizationDataMgr::Instance().DeleteLocalization(key, elementLanguage)) + MessageBox(gEditDlg, L"Couldn't delete localization!", L"Error", MB_ICONERROR | MB_OK); + else + { + std::wstring path = gCurrentPath; + gCurrentPath = L""; + plLocTreeView::ClearTreeView(gTreeView); + plLocTreeView::FillTreeViewFromData(gTreeView, path); + UpdateEditDlg(path); + } + } + } + } + return FALSE; + } + } + return (BOOL)DefWindowProc(hWnd, msg, wParam, lParam); +} + +// our dialog's window procedure +BOOL CALLBACK EditDlgProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) +{ + switch(msg) + { + case WM_INITDIALOG: + { + gEditDlg = hWnd; + EnableDlg(FALSE); + } + break; + + case WM_COMMAND: + return HandleCommandMessage(hWnd, msg, wParam, lParam); + } + + return FALSE; +} diff --git a/MOULOpenSourceClientPlugin/Plasma20/Sources/Tools/plLocalizationEditor/plEditDlg.h b/MOULOpenSourceClientPlugin/Plasma20/Sources/Tools/plLocalizationEditor/plEditDlg.h new file mode 100644 index 00000000..52cf8cf1 --- /dev/null +++ b/MOULOpenSourceClientPlugin/Plasma20/Sources/Tools/plLocalizationEditor/plEditDlg.h @@ -0,0 +1,72 @@ +/*==LICENSE==* + +CyanWorlds.com Engine - MMOG client, server and tools +Copyright (C) 2011 Cyan Worlds, Inc. + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . + +Additional permissions under GNU GPL version 3 section 7 + +If you modify this Program, or any covered work, by linking or +combining it with any of RAD Game Tools Bink SDK, Autodesk 3ds Max SDK, +NVIDIA PhysX SDK, Microsoft DirectX SDK, OpenSSL library, Independent +JPEG Group JPEG library, Microsoft Windows Media SDK, or Apple QuickTime SDK +(or a modified version of those libraries), +containing parts covered by the terms of the Bink SDK EULA, 3ds Max EULA, +PhysX SDK EULA, DirectX SDK EULA, OpenSSL and SSLeay licenses, IJG +JPEG Library README, Windows Media SDK EULA, or QuickTime SDK EULA, the +licensors of this Program grant you additional +permission to convey the resulting work. Corresponding Source for a +non-source form of such a combination shall include the source code for +the parts of OpenSSL and IJG JPEG Library used as well as that of the covered +work. + +You can contact Cyan Worlds, Inc. by email legal@cyan.com + or by snail mail at: + Cyan Worlds, Inc. + 14617 N Newport Hwy + Mead, WA 99021 + +*==LICENSE==*/ +// Basic edit dialog stuff +#ifndef _pfEditDlg_h +#define _pfEditDlg_h + +#define WIN32_LEAN_AND_MEAN +#include +#include +#include + +// Little trick to show a wait cursor while something is working +class plWaitCursor +{ + HCURSOR fOrig; +public: + plWaitCursor() + { + fOrig = SetCursor(LoadCursor(NULL, IDC_WAIT)); + } + + ~plWaitCursor() + { + SetCursor(fOrig); + } +}; + +void SplitLocalizationPath(std::wstring path, std::wstring &ageName, std::wstring &setName, std::wstring &locName, std::wstring &locLanguage); +void SaveLocalizationText(); +void UpdateEditDlg(std::wstring subtitlePath); +BOOL CALLBACK EditDlgProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam); + +#endif diff --git a/MOULOpenSourceClientPlugin/Plasma20/Sources/Tools/plLocalizationEditor/plLocTreeView.cpp b/MOULOpenSourceClientPlugin/Plasma20/Sources/Tools/plLocalizationEditor/plLocTreeView.cpp new file mode 100644 index 00000000..caf03da8 --- /dev/null +++ b/MOULOpenSourceClientPlugin/Plasma20/Sources/Tools/plLocalizationEditor/plLocTreeView.cpp @@ -0,0 +1,213 @@ +/*==LICENSE==* + +CyanWorlds.com Engine - MMOG client, server and tools +Copyright (C) 2011 Cyan Worlds, Inc. + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . + +Additional permissions under GNU GPL version 3 section 7 + +If you modify this Program, or any covered work, by linking or +combining it with any of RAD Game Tools Bink SDK, Autodesk 3ds Max SDK, +NVIDIA PhysX SDK, Microsoft DirectX SDK, OpenSSL library, Independent +JPEG Group JPEG library, Microsoft Windows Media SDK, or Apple QuickTime SDK +(or a modified version of those libraries), +containing parts covered by the terms of the Bink SDK EULA, 3ds Max EULA, +PhysX SDK EULA, DirectX SDK EULA, OpenSSL and SSLeay licenses, IJG +JPEG Library README, Windows Media SDK EULA, or QuickTime SDK EULA, the +licensors of this Program grant you additional +permission to convey the resulting work. Corresponding Source for a +non-source form of such a combination shall include the source code for +the parts of OpenSSL and IJG JPEG Library used as well as that of the covered +work. + +You can contact Cyan Worlds, Inc. by email legal@cyan.com + or by snail mail at: + Cyan Worlds, Inc. + 14617 N Newport Hwy + Mead, WA 99021 + +*==LICENSE==*/ +#include "plLocTreeView.h" +#include "plEditDlg.h" + +#define WIN32_LEAN_AND_MEAN +#include +#include +#include +#include +#include "res\resource.h" + +#include +#include + +#include "hsUtils.h" +#include "../pfLocalizationMgr/pfLocalizationDataMgr.h" + +extern HINSTANCE gInstance; + +std::wstring plLocTreeView::fPath = L""; + +HTREEITEM AddLeaf(HWND hTree, HTREEITEM hParent, std::wstring text, bool sort = true) +{ + TVITEM tvi = {0}; + tvi.mask = TVIF_TEXT | TVIF_PARAM; + tvi.pszText = (wchar_t*)text.c_str(); + tvi.cchTextMax = (int)text.length(); + tvi.lParam = NULL; + + TVINSERTSTRUCT tvins = {0}; + tvins.item = tvi; + tvins.hParent = hParent; + if (sort) + tvins.hInsertAfter = TVI_SORT; + else + tvins.hInsertAfter = TVI_LAST; + + return TreeView_InsertItem(hTree, &tvins); +} + +void plLocTreeView::FillTreeViewFromData(HWND treeCtrl, std::wstring selectionPath) +{ + std::wstring targetAge, targetSet, targetElement, targetLang; + SplitLocalizationPath(selectionPath, targetAge, targetSet, targetElement, targetLang); + bool ageMatched = false; + bool setMatched = false; + bool elementMatched = false; + + std::vector ages = pfLocalizationDataMgr::Instance().GetAgeList(); + for (int curAge = 0; curAge < ages.size(); curAge++) + { + // add the age to the tree + HTREEITEM ageItem = AddLeaf(treeCtrl, NULL, ages[curAge]); + + if (ages[curAge] == targetAge) + { + TreeView_SelectItem(treeCtrl, ageItem); + TreeView_EnsureVisible(treeCtrl, ageItem); + ageMatched = true; + } + else + ageMatched = false; + + std::vector sets = pfLocalizationDataMgr::Instance().GetSetList(ages[curAge]); + for (int curSet = 0; curSet < sets.size(); curSet++) + { + std::vector elements = pfLocalizationDataMgr::Instance().GetElementList(ages[curAge], sets[curSet]); + + HTREEITEM setItem = AddLeaf(treeCtrl, ageItem, sets[curSet]); + + if ((sets[curSet] == targetSet) && ageMatched) + { + TreeView_SelectItem(treeCtrl, setItem); + TreeView_EnsureVisible(treeCtrl, setItem); + setMatched = true; + } + else + setMatched = false; + + for (int curElement = 0; curElement < elements.size(); curElement++) + { + HTREEITEM subItem = AddLeaf(treeCtrl, setItem, elements[curElement]); + + if (elements[curElement] == targetElement && setMatched) + { + TreeView_SelectItem(treeCtrl, subItem); + TreeView_EnsureVisible(treeCtrl, subItem); + elementMatched = true; + + if (targetLang.empty()) + targetLang = L"English"; + } + else + elementMatched = false; + + std::vector languages = pfLocalizationDataMgr::Instance().GetLanguages(ages[curAge], sets[curSet], elements[curElement]); + for (int curLang = 0; curLang < languages.size(); curLang++) + { + HTREEITEM langItem = AddLeaf(treeCtrl, subItem, languages[curLang]); + + if (languages[curLang] == targetLang && elementMatched) + { + TreeView_SelectItem(treeCtrl, langItem); + TreeView_EnsureVisible(treeCtrl, langItem); + } + } + } + } + } +} + +void plLocTreeView::ClearTreeView(HWND treeCtrl) +{ + TreeView_DeleteAllItems(treeCtrl); +} + +void plLocTreeView::SelectionChanged(HWND treeCtrl) +{ + HTREEITEM hItem = TreeView_GetSelection(treeCtrl); + std::vector path; + fPath = L""; + + while (hItem) + { + wchar_t s[200]; + TVITEM tvi = {0}; + tvi.hItem = hItem; + tvi.mask = TVIF_TEXT; + tvi.pszText = s; + tvi.cchTextMax = 200; + TreeView_GetItem(treeCtrl, &tvi); + path.push_back(tvi.pszText); + hItem = TreeView_GetParent(treeCtrl, hItem); + } + + while (!path.empty()) + { + fPath += path.back(); + + path.pop_back(); + if (!path.empty()) + fPath += L"."; + } +} + +void plLocTreeView::SelectionDblClicked(HWND treeCtrl) +{ + HTREEITEM hItem = TreeView_GetSelection(treeCtrl); + std::vector path; + fPath = L""; + + while (hItem) + { + wchar_t s[200]; + TVITEM tvi = {0}; + tvi.hItem = hItem; + tvi.mask = TVIF_TEXT; + tvi.pszText = s; + tvi.cchTextMax = 200; + TreeView_GetItem(treeCtrl, &tvi); + path.push_back(tvi.pszText); + hItem = TreeView_GetParent(treeCtrl, hItem); + } + + while (!path.empty()) + { + fPath += path.back(); + + path.pop_back(); + if (!path.empty()) + fPath += L"."; + } +} diff --git a/MOULOpenSourceClientPlugin/Plasma20/Sources/Tools/plLocalizationEditor/plLocTreeView.h b/MOULOpenSourceClientPlugin/Plasma20/Sources/Tools/plLocalizationEditor/plLocTreeView.h new file mode 100644 index 00000000..f3227bdd --- /dev/null +++ b/MOULOpenSourceClientPlugin/Plasma20/Sources/Tools/plLocalizationEditor/plLocTreeView.h @@ -0,0 +1,65 @@ +/*==LICENSE==* + +CyanWorlds.com Engine - MMOG client, server and tools +Copyright (C) 2011 Cyan Worlds, Inc. + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . + +Additional permissions under GNU GPL version 3 section 7 + +If you modify this Program, or any covered work, by linking or +combining it with any of RAD Game Tools Bink SDK, Autodesk 3ds Max SDK, +NVIDIA PhysX SDK, Microsoft DirectX SDK, OpenSSL library, Independent +JPEG Group JPEG library, Microsoft Windows Media SDK, or Apple QuickTime SDK +(or a modified version of those libraries), +containing parts covered by the terms of the Bink SDK EULA, 3ds Max EULA, +PhysX SDK EULA, DirectX SDK EULA, OpenSSL and SSLeay licenses, IJG +JPEG Library README, Windows Media SDK EULA, or QuickTime SDK EULA, the +licensors of this Program grant you additional +permission to convey the resulting work. Corresponding Source for a +non-source form of such a combination shall include the source code for +the parts of OpenSSL and IJG JPEG Library used as well as that of the covered +work. + +You can contact Cyan Worlds, Inc. by email legal@cyan.com + or by snail mail at: + Cyan Worlds, Inc. + 14617 N Newport Hwy + Mead, WA 99021 + +*==LICENSE==*/ +#ifndef _plLocTreeView_h +#define _plLocTreeView_h + +#define WIN32_LEAN_AND_MEAN +#include +#include +#include + +class plLocTreeView +{ +protected: + static std::wstring fPath; + +public: + static void FillTreeViewFromData(HWND treeCtrl, std::wstring selectionPath); + static void ClearTreeView(HWND treeCtrl); + + static void SelectionChanged(HWND treeCtrl); + static void SelectionDblClicked(HWND treeCtrl); + + static std::wstring GetPath() {return fPath;} +}; + +#endif //_plLocTreeView_h diff --git a/MOULOpenSourceClientPlugin/Plasma20/Sources/Tools/plLocalizationEditor/plLocalizationEditor.cpp b/MOULOpenSourceClientPlugin/Plasma20/Sources/Tools/plLocalizationEditor/plLocalizationEditor.cpp new file mode 100644 index 00000000..17dbe9a2 --- /dev/null +++ b/MOULOpenSourceClientPlugin/Plasma20/Sources/Tools/plLocalizationEditor/plLocalizationEditor.cpp @@ -0,0 +1,394 @@ +/*==LICENSE==* + +CyanWorlds.com Engine - MMOG client, server and tools +Copyright (C) 2011 Cyan Worlds, Inc. + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . + +Additional permissions under GNU GPL version 3 section 7 + +If you modify this Program, or any covered work, by linking or +combining it with any of RAD Game Tools Bink SDK, Autodesk 3ds Max SDK, +NVIDIA PhysX SDK, Microsoft DirectX SDK, OpenSSL library, Independent +JPEG Group JPEG library, Microsoft Windows Media SDK, or Apple QuickTime SDK +(or a modified version of those libraries), +containing parts covered by the terms of the Bink SDK EULA, 3ds Max EULA, +PhysX SDK EULA, DirectX SDK EULA, OpenSSL and SSLeay licenses, IJG +JPEG Library README, Windows Media SDK EULA, or QuickTime SDK EULA, the +licensors of this Program grant you additional +permission to convey the resulting work. Corresponding Source for a +non-source form of such a combination shall include the source code for +the parts of OpenSSL and IJG JPEG Library used as well as that of the covered +work. + +You can contact Cyan Worlds, Inc. by email legal@cyan.com + or by snail mail at: + Cyan Worlds, Inc. + 14617 N Newport Hwy + Mead, WA 99021 + +*==LICENSE==*/ +#define CLASSNAME L"plLocalizationEditor" +#define WINDOWNAME L"plLocalizationEditor" +#define IDC_REGTREEVIEW 1000 + +#define FILE_MENU_POS 0 // 0-based index of the file sub menu + +#include "pnAllCreatables.h" +#include "../plResMgr/plResMgrCreatable.h" + +// These are so that we don't have to link in stuff we don't have to +#include "../plMessage/plResMgrHelperMsg.h" +#include "../plMessage/plAgeLoadedMsg.h" +REGISTER_CREATABLE(plResMgrHelperMsg); +REGISTER_CREATABLE(plAgeLoadedMsg); +REGISTER_CREATABLE(plAgeLoaded2Msg); +REGISTER_CREATABLE(plAgeBeginLoadingMsg); +REGISTER_CREATABLE(plInitialAgeStateLoadedMsg); + +#include "../pfLocalizationMgr/pfLocalizationMgr.h" +#include "../pfLocalizationMgr/pfLocalizationDataMgr.h" +#include "../plResMgr/plResManager.h" + +#include "plLocTreeView.h" +#include "plEditDlg.h" + +#define WIN32_LEAN_AND_MEAN +#include +#include +#include +#include +#include +#include +#include +#include "res/resource.h" + +HINSTANCE gInstance = NULL; +HWND gMainWindow = NULL; +HWND gTreeView = NULL; // the tree view for display of localization strings +extern HWND gEditDlg; // the main edit dialog for the localization strings +std::wstring gCurPath = L""; // current data path + +LRESULT CALLBACK MainWndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam); +BOOL WinInit(HINSTANCE hInst, int nCmdShow); + +int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) +{ + MSG msg; + HACCEL accelTable = LoadAccelerators(hInst, MAKEINTRESOURCE(IDR_ACCELERATOR1)); + + if (!WinInit(hInst, nCmdShow)) + return -1; + + plResManager *rMgr = new plResManager; + hsgResMgr::Init(rMgr); + + while (GetMessage(&msg, NULL, 0, 0)) + { + if (!TranslateAccelerator(gMainWindow, accelTable, &msg)) + { + TranslateMessage(&msg); + DispatchMessage(&msg); + } + } + + pfLocalizationMgr::Shutdown(); + + hsgResMgr::Shutdown(); + + return 0; +} + +BOOL WinInit(HINSTANCE hInst, int nCmdShow) +{ + LoadLibrary(L"Riched20.dll"); // so we can use our rich edit control + gInstance = hInst; + + WNDCLASSEX wcEx; + wcEx.cbSize = sizeof(WNDCLASSEX); + wcEx.style = CS_HREDRAW | CS_VREDRAW; + wcEx.lpfnWndProc = MainWndProc; + wcEx.cbClsExtra = 0; + wcEx.cbWndExtra = 0; + wcEx.hInstance = hInst; + wcEx.hIcon = LoadIcon(hInst, MAKEINTRESOURCE(IDI_APPICON)); + wcEx.hCursor = LoadCursor(NULL, IDC_ARROW); + wcEx.hbrBackground = GetSysColorBrush(COLOR_3DFACE); + wcEx.lpszMenuName = MAKEINTRESOURCE(IDR_APPMENU); + wcEx.lpszClassName = CLASSNAME; + wcEx.hIconSm = (HICON)LoadImage(hInst, MAKEINTRESOURCE(IDI_APPICON), IMAGE_ICON, GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON), LR_DEFAULTCOLOR); + + if (!RegisterClassEx(&wcEx)) + return FALSE; + + DWORD dwStyle = WS_POPUP | WS_OVERLAPPEDWINDOW | WS_CLIPSIBLINGS | WS_CLIPCHILDREN | WS_VISIBLE; + DWORD dwExStyle = WS_EX_CONTROLPARENT; + + // Create a window + gMainWindow = CreateWindowEx(dwExStyle, CLASSNAME, WINDOWNAME, dwStyle, 10, 10, 800, 500, NULL, NULL, hInst, NULL); + if (gMainWindow == NULL) + return FALSE; + + return TRUE; +} + +void SetWindowTitle(HWND hWnd, std::wstring path) +{ + std::wstring title = L"plLocalizationEditor"; + if (path != L"") + title += L"-" + path; + + SetWindowText(hWnd, title.c_str()); +} + +BOOL CALLBACK AboutDialogProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) +{ + if(msg == WM_COMMAND) + EndDialog(hWnd, 0); + return 0; +} + +void RequestSaveOnExit() +{ + if (gCurPath == L"") // no data open + return; + + static alreadyRequested = false; // make sure we don't ask multiple times + if (alreadyRequested) + return; + alreadyRequested = true; + + SaveLocalizationText(); // make sure any changed text is saved to the manager + + int res = MessageBox(NULL, L"Do you wish to save your changes?", L"Save Changes", MB_ICONQUESTION | MB_YESNO); + if (res == IDYES) + { + // save it to a new directory + BROWSEINFO bInfo; + LPITEMIDLIST itemList; + LPMALLOC shMalloc; + wchar_t path[MAX_PATH]; + + memset(&bInfo, 0, sizeof(bInfo)); + bInfo.hwndOwner = NULL; + bInfo.pidlRoot = NULL; + bInfo.pszDisplayName = path; + bInfo.lpszTitle = L"Select a directory to save the localization data to:"; + bInfo.ulFlags = BIF_EDITBOX; + + itemList = SHBrowseForFolder(&bInfo); + if (itemList != NULL) + { + plWaitCursor waitCursor; + + SHGetPathFromIDList(itemList, path); + SHGetMalloc(&shMalloc); + shMalloc->Free(itemList); + shMalloc->Release(); + + gCurPath = path; + char *sPath = hsWStringToString(gCurPath.c_str()); + pfLocalizationDataMgr::Instance().WriteDatabaseToDisk(sPath); + delete [] sPath; + } + } +} + +LRESULT CALLBACK HandleCommand(HWND hWnd, WPARAM wParam, LPARAM lParam) +{ + switch (LOWORD(wParam)) + { + case ID_FILE_EXIT: + RequestSaveOnExit(); + PostQuitMessage(0); + break; + case ID_FILE_OPENDATADIRECTORY: + { + BROWSEINFO bInfo; + LPITEMIDLIST itemList; + LPMALLOC shMalloc; + wchar_t path[MAX_PATH]; + + memset(&bInfo, 0, sizeof(bInfo)); + bInfo.hwndOwner = hWnd; + bInfo.pidlRoot = NULL; + bInfo.pszDisplayName = path; + bInfo.lpszTitle = L"Select a localization data directory:"; + bInfo.ulFlags = BIF_EDITBOX; + + itemList = SHBrowseForFolder(&bInfo); + if (itemList != NULL) + { + plWaitCursor waitCursor; + + SHGetPathFromIDList(itemList, path); + SHGetMalloc(&shMalloc); + shMalloc->Free(itemList); + shMalloc->Release(); + + pfLocalizationMgr::Shutdown(); + + char *sPath = hsWStringToString(path); + pfLocalizationMgr::Initialize(sPath); + delete [] sPath; + + plLocTreeView::ClearTreeView(gTreeView); + plLocTreeView::FillTreeViewFromData(gTreeView, L""); + + gCurPath = path; + SetWindowTitle(hWnd, path); + + HMENU menu = GetMenu(hWnd); + HMENU fileMenu = GetSubMenu(menu, FILE_MENU_POS); + EnableMenuItem(fileMenu, ID_FILE_SAVETOCUR, MF_ENABLED); + EnableMenuItem(fileMenu, ID_FILE_SAVETONEW, MF_ENABLED); + } + } + break; + case ID_FILE_SAVETOCUR: + { + SaveLocalizationText(); // make sure any changed text is saved to the manager + + // save it to our current directory + int res = MessageBox(hWnd, L"Are you sure you want to save to the current directory? Current data will be overwritten!", L"Save to Current Directory", MB_ICONQUESTION | MB_YESNOCANCEL); + if (res == IDYES) + { + plWaitCursor waitCursor; + char *sPath = hsWStringToString(gCurPath.c_str()); + pfLocalizationDataMgr::Instance().WriteDatabaseToDisk(sPath); + delete [] sPath; + } + else if (res == IDNO) + SendMessage(hWnd, WM_COMMAND, (WPARAM)ID_FILE_SAVETONEW, (LPARAM)0); + // and if it's cancel we don't do anything + } + break; + case ID_FILE_SAVETONEW: + { + SaveLocalizationText(); // make sure any changed text is saved to the manager + + // save it to a new directory + BROWSEINFO bInfo; + LPITEMIDLIST itemList; + LPMALLOC shMalloc; + wchar_t path[MAX_PATH]; + + memset(&bInfo, 0, sizeof(bInfo)); + bInfo.hwndOwner = hWnd; + bInfo.pidlRoot = NULL; + bInfo.pszDisplayName = path; + bInfo.lpszTitle = L"Select a directory to save the localization data to:"; + bInfo.ulFlags = BIF_EDITBOX; + + itemList = SHBrowseForFolder(&bInfo); + if (itemList != NULL) + { + plWaitCursor waitCursor; + + SHGetPathFromIDList(itemList, path); + SHGetMalloc(&shMalloc); + shMalloc->Free(itemList); + shMalloc->Release(); + + gCurPath = path; + SetWindowTitle(hWnd, path); + char *sPath = hsWStringToString(gCurPath.c_str()); + pfLocalizationDataMgr::Instance().WriteDatabaseToDisk(sPath); + delete [] sPath; + } + } + break; + + case ID_HELP_ABOUT: + DialogBox(gInstance, MAKEINTRESOURCE(IDD_ABOUT), hWnd, AboutDialogProc); + break; + } + return 0; +} + +void SizeControls(HWND parent) +{ + RECT clientRect, editRect; + + GetClientRect(parent, &clientRect); + GetClientRect(gEditDlg, &editRect); + + SetWindowPos(gTreeView, NULL, 0, 0, clientRect.right - editRect.right - 4, clientRect.bottom, 0); + + OffsetRect(&editRect, clientRect.right - editRect.right, (clientRect.bottom >> 1) - (editRect.bottom >> 1)); + SetWindowPos(gEditDlg, NULL, editRect.left, editRect.top, 0, 0, SWP_NOSIZE); +} + +void InitWindowControls(HWND hWnd) +{ + RECT clientRect; + + GetClientRect(hWnd, &clientRect); + + gTreeView = CreateWindowEx(WS_EX_CLIENTEDGE, WC_TREEVIEW, L"Tree View", WS_VISIBLE | WS_CHILD | WS_BORDER | + TVS_HASLINES | TVS_HASBUTTONS | TVS_LINESATROOT | TVS_SHOWSELALWAYS, + 0, 0, 0, 0, hWnd, (HMENU)IDC_REGTREEVIEW, gInstance, NULL); + + gEditDlg = CreateDialog(gInstance, MAKEINTRESOURCE(IDD_EDITDLG), hWnd, EditDlgProc); + + SizeControls(hWnd); +} + +LRESULT CALLBACK MainWndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) +{ + switch (msg) + { + case WM_CREATE: + InitCommonControls(); + InitWindowControls(hWnd); + break; + case WM_CLOSE: + RequestSaveOnExit(); + DestroyWindow(hWnd); + break; + case WM_DESTROY: + RequestSaveOnExit(); + plLocTreeView::ClearTreeView(gTreeView); + PostQuitMessage(0); + break; + case WM_SIZING: + case WM_SIZE: + SizeControls(hWnd); + break; + case WM_GETMINMAXINFO: + { + MINMAXINFO* pmmi = (MINMAXINFO*)lParam; + pmmi->ptMinTrackSize.x = 800; + pmmi->ptMinTrackSize.y = 500; + return 0; + } + case WM_NOTIFY: + if(wParam == IDC_REGTREEVIEW) + { + SaveLocalizationText(); // save any current changes to the database + + NMHDR *hdr = (NMHDR*)lParam; + if(hdr->code == TVN_SELCHANGED) + plLocTreeView::SelectionChanged(gTreeView); + else if(hdr->code == NM_DBLCLK) + plLocTreeView::SelectionDblClicked(gTreeView); + UpdateEditDlg(plLocTreeView::GetPath()); + } + break; + case WM_COMMAND: + return HandleCommand(hWnd, wParam, lParam); + } + + return DefWindowProc(hWnd, msg, wParam, lParam); +} diff --git a/MOULOpenSourceClientPlugin/Plasma20/Sources/Tools/plLocalizationEditor/res/icon1.ico b/MOULOpenSourceClientPlugin/Plasma20/Sources/Tools/plLocalizationEditor/res/icon1.ico new file mode 100644 index 0000000000000000000000000000000000000000..13431c59e29ef15a8fcc81873bcdc5d138803c42 GIT binary patch literal 2998 zcmd6pO=ufO6o8*9vlh#;TKTVGk&A0VX>_vLOL8k4>0|=A^ZqKG~h#uViOxmB526;n~`P9CD2PK9qY~R`rwg4|d)%Z)oI$UOcX)~nCg z3ipC5L219Uy}xJNvz=bh>*lWYdi!_9`EqT))06GpoD_OHC!3-Qoz8Xv6F~Zu_0s8d zSsMhs9ldSnIvo?zmHpoK3H8)$rwi)6oa}$tMJHfH?OyJR(HPFGU10V&9-BLNN!XpJ zWEjm-?{$4K(}ndI~U=_0iLE%F8#A?z^s z3>hF@gkhe?c2BI=FOWD$FW?$eqFj> zX}NVvOJ5#~KFZ{m$1mma^XKx-k3Uf;LKKoB*;tLRMc5*2k+IPs6QZ!2JFl=S>=}j(yGGaOIFE7 z2!;rT2!;p-iwQ#nLj*$vLj;3GharL?f+2z-f+5n_;E3Re3RtB3I@|U1&4w`!I0T+tZdvu z>WqKTZF^03prUq4oNYC=QL^;7Dn)Hg?zQa`0P zDGVtLDSa@SeHHaAef8M{79fK?X-=IM|pyZWd**WUypFWE8Yl z0G5n}89^C_3>H2Jc{q~{mdy0SvY6XoP5~PX8U_u6hC#!iVX)T;h71M`gN7l4fiwv5 zFlZPw3>pSfBiLckFlZPw0Gj$4$utW!L5ds-UBRJkZWE*AWBE?*+_}SdRY&&r_T>Kk z`|{|~BYF7np*(r=M4mo9lqmi8arRCcP5B~M7f0vFGv)k|ciO zxUP4ZEskA0iQ^;*Fx;TsaC5Md<(_Ja#)=9lfAmW>UzHC`$4N!4#R_CoJ{hAyI5UYMJ?7g8tr~R4a2Z} zQ6P>>)wPPZ?0WV3M)S-cdS?avBnc|jRd@L#*IlmHC+ow-WV}OmU0tubrTVH{bEo`8 zIzpG&X9cvNR$um;{wf8=^$$F=9<-!Vb%RD@qwdz4brKkVxz#8SjXzGjO4Td(`^`qp zZMB Date: Thu, 19 Jan 2012 09:20:38 -0800 Subject: [PATCH 03/21] Christian Walther's Python SDL fixes - for real this time. --- .../pfPython/plPythonSDLModifier.cpp | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/FeatureLib/pfPython/plPythonSDLModifier.cpp b/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/FeatureLib/pfPython/plPythonSDLModifier.cpp index 0d8794cf..312420e9 100644 --- a/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/FeatureLib/pfPython/plPythonSDLModifier.cpp +++ b/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/FeatureLib/pfPython/plPythonSDLModifier.cpp @@ -208,6 +208,22 @@ void plPythonSDLModifier::SetItemIdx(const char* key, int idx, PyObject* value, return; } + if (pyTuple && pyTuple->ob_refcnt != 1) + { + // others already have references to the tuple and expect it to be immutable, must make a copy + int n = PyTuple_Size(pyTuple); + PyObject* newTuple = PyTuple_New(n); + for (int j = 0; j < n; j++) + { + PyObject* item = PyTuple_GetItem(pyTuple, j); + Py_INCREF(item); + PyTuple_SetItem(newTuple, j, item); + } + Py_DECREF(pyTuple); + pyTuple = newTuple; + it->second.obj = newTuple; + } + if (pyTuple) { if (PyTuple_Size(pyTuple) <= idx) @@ -221,6 +237,8 @@ void plPythonSDLModifier::SetItemIdx(const char* key, int idx, PyObject* value, Py_INCREF(Py_None); PyTuple_SetItem(pyTuple, j, Py_None); } + // _PyTuple_Resize may have changed pyTuple + it->second.obj = pyTuple; } } else From cbea546c61507f9d549d41354ec8993482304680 Mon Sep 17 00:00:00 2001 From: CyanWorlds Date: Tue, 7 Feb 2012 17:14:08 -0800 Subject: [PATCH 04/21] Christian's fix inability to go to a higher page in a book than the next after what has already been displayed. Fixes books on the Relto bookshelf not remembering their last open page beyond the second. --- .../Plasma/FeatureLib/pfJournalBook/pfJournalBook.cpp | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/FeatureLib/pfJournalBook/pfJournalBook.cpp b/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/FeatureLib/pfJournalBook/pfJournalBook.cpp index b60cbc83..7454922e 100644 --- a/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/FeatureLib/pfJournalBook/pfJournalBook.cpp +++ b/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/FeatureLib/pfJournalBook/pfJournalBook.cpp @@ -1742,10 +1742,8 @@ void pfJournalBook::IHandleCheckClick( UInt32 idx, pfBookData::WhichSide which ) void pfJournalBook::GoToPage( UInt32 pageNumber ) { // Put us here, but only on an even page (odd pages go on the right, y'know) - if (pageNumber < fPageStarts.Count()) - fCurrentPage = pageNumber & ~0x00000001; - else - fCurrentPage = 0; + // (no need for a range check, going past the end simply puts you on a blank page, able to go backward but not forward) + fCurrentPage = pageNumber & ~0x00000001; fVisibleLinks.Reset(); IRenderPage( fCurrentPage, pfJournalDlgProc::kTagLeftDTMap ); IRenderPage( fCurrentPage + 1, pfJournalDlgProc::kTagRightDTMap ); @@ -2602,7 +2600,7 @@ void pfJournalBook::IRenderPage( UInt32 page, UInt32 whichDTMap, hsBool suppress } } - hsAssert(page < fPageStarts.GetCount(), "UnInitialized page start!"); + hsAssert(page < fPageStarts.GetCount() || page > fLastPage, "UnInitialized page start!"); if( page <= fLastPage && page < fPageStarts.GetCount()) // Added this as a crash-prevention bandaid - MT { From 9bd019fbf33abe6a66bec2f451431600a2df5eaf Mon Sep 17 00:00:00 2001 From: Bartek Bok Date: Sun, 4 Mar 2012 11:57:45 +0100 Subject: [PATCH 05/21] plClipboard --- .../pfGameGUIMgr/pfGUIEditBoxMod.cpp | 24 ++++ .../pfGameGUIMgr/pfGUIMultiLineEditCtrl.cpp | 17 ++- .../PubUtilLib/plClipboard/plClipboard.cpp | 114 ++++++++++++++++++ .../PubUtilLib/plClipboard/plClipboard.h | 62 ++++++++++ 4 files changed, 214 insertions(+), 3 deletions(-) create mode 100644 MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/PubUtilLib/plClipboard/plClipboard.cpp create mode 100644 MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/PubUtilLib/plClipboard/plClipboard.h diff --git a/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/FeatureLib/pfGameGUIMgr/pfGUIEditBoxMod.cpp b/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/FeatureLib/pfGameGUIMgr/pfGUIEditBoxMod.cpp index dcddf468..03444783 100644 --- a/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/FeatureLib/pfGameGUIMgr/pfGUIEditBoxMod.cpp +++ b/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/FeatureLib/pfGameGUIMgr/pfGUIEditBoxMod.cpp @@ -61,6 +61,7 @@ You can contact Cyan Worlds, Inc. by email legal@cyan.com #include "plgDispatch.h" #include "hsResMgr.h" #include "../pnInputCore/plKeyMap.h" +#include "../plClipboard/plClipboard.h" #include @@ -501,6 +502,29 @@ hsBool pfGUIEditBoxMod::HandleKeyEvent( pfGameGUIMgr::EventType event, plKeyDef DoSomething(); // Query WasEscaped() to see if it was escape vs enter return true; } + else if (modifiers & pfGameGUIMgr::kCtrlDown) + { + if (key == KEY_C) + { + plClipboard::GetInstance().SetClipboardText(fBuffer); + } + else if (key == KEY_V) + { + wchar_t* contents = plClipboard::GetInstance().GetClipboardText(); + size_t len = wcslen(contents); + if (len > 0) { + wchar_t* insertTarget = fBuffer + fCursorPos; + size_t bufferTailLen = wcslen(insertTarget); + if (fCursorPos + len + bufferTailLen < fBufferSize) { + memmove(insertTarget + len, insertTarget, bufferTailLen * sizeof(wchar_t)); + memcpy(insertTarget, contents, len * sizeof(wchar_t)); + fCursorPos += len; + HandleExtendedEvent( kValueChanging ); + } + } + delete contents; + } + } else { fIgnoreNextKey = false; diff --git a/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/FeatureLib/pfGameGUIMgr/pfGUIMultiLineEditCtrl.cpp b/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/FeatureLib/pfGameGUIMgr/pfGUIMultiLineEditCtrl.cpp index 72e7863d..60b8c354 100644 --- a/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/FeatureLib/pfGameGUIMgr/pfGUIMultiLineEditCtrl.cpp +++ b/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/FeatureLib/pfGameGUIMgr/pfGUIMultiLineEditCtrl.cpp @@ -60,6 +60,7 @@ You can contact Cyan Worlds, Inc. by email legal@cyan.com #include "../plGImage/plDynamicTextMap.h" #include "plgDispatch.h" #include "hsResMgr.h" +#include "../plClipboard/plClipboard.h" //// Tiny Helper Class /////////////////////////////////////////////////////// @@ -1172,9 +1173,6 @@ hsBool pfGUIMultiLineEditCtrl::HandleKeyEvent( pfGameGUIMgr::EventType event, pl if ((fPrevCtrl || fNextCtrl) && (fLineStarts.GetCount() <= GetFirstVisibleLine())) return true; // we're ignoring if we can't actually edit our visible frame (and we're linked) - if (modifiers & pfGameGUIMgr::kCtrlDown) - return true; // we're ignoring ctrl key events - if( event == pfGameGUIMgr::kKeyDown || event == pfGameGUIMgr::kKeyRepeat ) { // Use arrow keys to do our dirty work @@ -1219,6 +1217,19 @@ hsBool pfGUIMultiLineEditCtrl::HandleKeyEvent( pfGameGUIMgr::EventType event, pl // fEscapedFlag = true; DoSomething(); // Query WasEscaped() to see if it was escape vs enter } + else if (modifiers & pfGameGUIMgr::kCtrlDown) + { + if (key == KEY_C) + { + plClipboard::GetInstance().SetClipboardText(fBuffer.AcquireArray()); + } + else if (key == KEY_V) + { + wchar_t* contents = plClipboard::GetInstance().GetClipboardText(); + InsertString(contents); + delete contents; + } + } else { fIgnoreNextKey = false; diff --git a/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/PubUtilLib/plClipboard/plClipboard.cpp b/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/PubUtilLib/plClipboard/plClipboard.cpp new file mode 100644 index 00000000..c7e26fd7 --- /dev/null +++ b/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/PubUtilLib/plClipboard/plClipboard.cpp @@ -0,0 +1,114 @@ +/*==LICENSE==* + +CyanWorlds.com Engine - MMOG client, server and tools +Copyright (C) 2011 Cyan Worlds, Inc. + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . + +Additional permissions under GNU GPL version 3 section 7 + +If you modify this Program, or any covered work, by linking or +combining it with any of RAD Game Tools Bink SDK, Autodesk 3ds Max SDK, +NVIDIA PhysX SDK, Microsoft DirectX SDK, OpenSSL library, Independent +JPEG Group JPEG library, Microsoft Windows Media SDK, or Apple QuickTime SDK +(or a modified version of those libraries), +containing parts covered by the terms of the Bink SDK EULA, 3ds Max EULA, +PhysX SDK EULA, DirectX SDK EULA, OpenSSL and SSLeay licenses, IJG +JPEG Library README, Windows Media SDK EULA, or QuickTime SDK EULA, the +licensors of this Program grant you additional +permission to convey the resulting work. Corresponding Source for a +non-source form of such a combination shall include the source code for +the parts of OpenSSL and IJG JPEG Library used as well as that of the covered +work. + +You can contact Cyan Worlds, Inc. by email legal@cyan.com +or by snail mail at: +Cyan Worlds, Inc. +14617 N Newport Hwy +Mead, WA 99021 + +*==LICENSE==*/ + +#include "HeadSpin.h" +#include "plClipboard.h" + +plClipboard& plClipboard::GetInstance() +{ + static plClipboard theInstance; + return theInstance; +} + +bool plClipboard::IsTextInClipboard() +{ +#ifdef HS_BUILD_FOR_WIN32 + return ::IsClipboardFormatAvailable(CF_UNICODETEXT); +#else + return false; +#endif +} + +wchar_t* plClipboard::GetClipboardText() +{ + if (!IsTextInClipboard()) + return nil; + +#ifdef HS_BUILD_FOR_WIN32 + if (!::OpenClipboard(NULL)) + return nil; + + HANDLE clipboardData = ::GetClipboardData(CF_UNICODETEXT); + size_t size = ::GlobalSize(clipboardData) / sizeof(wchar_t); + wchar_t* clipboardDataPtr = (wchar_t*)::GlobalLock(clipboardData); + + wchar_t* result = new wchar_t[size]; + wcsncpy(result, clipboardDataPtr, size); + + ::GlobalUnlock(clipboardData); + ::CloseClipboard(); + + return result; +#else + return plString::Null; +#endif +} + +void plClipboard::SetClipboardText(const wchar_t* text) +{ + if (text == nil) + return; +#ifdef HS_BUILD_FOR_WIN32 + size_t len = wcslen(text); + + if (len == 0) + return; + + HGLOBAL copy = ::GlobalAlloc(GMEM_MOVEABLE, (len + 1) * sizeof(wchar_t)); + if (copy == NULL) + return; + + if (!::OpenClipboard(NULL)) + return; + + ::EmptyClipboard(); + + wchar_t* target = (wchar_t*)::GlobalLock(copy); + wcsncpy(target, text, len + 1); + ::GlobalUnlock(copy); + + // Place the handle on the clipboard. + ::SetClipboardData(CF_UNICODETEXT, target); + ::CloseClipboard(); +#endif +} + diff --git a/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/PubUtilLib/plClipboard/plClipboard.h b/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/PubUtilLib/plClipboard/plClipboard.h new file mode 100644 index 00000000..410a6fa0 --- /dev/null +++ b/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/PubUtilLib/plClipboard/plClipboard.h @@ -0,0 +1,62 @@ +/*==LICENSE==* + +CyanWorlds.com Engine - MMOG client, server and tools +Copyright (C) 2011 Cyan Worlds, Inc. + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . + +Additional permissions under GNU GPL version 3 section 7 + +If you modify this Program, or any covered work, by linking or +combining it with any of RAD Game Tools Bink SDK, Autodesk 3ds Max SDK, +NVIDIA PhysX SDK, Microsoft DirectX SDK, OpenSSL library, Independent +JPEG Group JPEG library, Microsoft Windows Media SDK, or Apple QuickTime SDK +(or a modified version of those libraries), +containing parts covered by the terms of the Bink SDK EULA, 3ds Max EULA, +PhysX SDK EULA, DirectX SDK EULA, OpenSSL and SSLeay licenses, IJG +JPEG Library README, Windows Media SDK EULA, or QuickTime SDK EULA, the +licensors of this Program grant you additional +permission to convey the resulting work. Corresponding Source for a +non-source form of such a combination shall include the source code for +the parts of OpenSSL and IJG JPEG Library used as well as that of the covered +work. + +You can contact Cyan Worlds, Inc. by email legal@cyan.com + or by snail mail at: + Cyan Worlds, Inc. + 14617 N Newport Hwy + Mead, WA 99021 + +*==LICENSE==*/ + +#ifndef _plClipboard_h +#define _plClipboard_h + +//// Class Definition ///////////////////////////////////////////////////////// + +class plClipboard +{ + private: + + plClipboard() {} + plClipboard(const plClipboard& rhs) {} + + public: + bool IsTextInClipboard(); + wchar_t* GetClipboardText(); + void SetClipboardText(const wchar_t* text); + static plClipboard& GetInstance( void ); +}; + +#endif // _Clipboard_h From 568b05fe7030f0194c5897502b0f36ba83aa3f99 Mon Sep 17 00:00:00 2001 From: Christian Walther Date: Sun, 4 Mar 2012 15:17:11 +0100 Subject: [PATCH 06/21] Add & integrate project file for plClipboard. --- .../Plasma/Apps/AllClient/AllClient.sln | 20 ++- .../PubUtilLib/plClipboard/plClipboard.vcproj | 139 ++++++++++++++++++ 2 files changed, 157 insertions(+), 2 deletions(-) create mode 100644 MOULOpenSourceClientPlugin/Plasma20/MsDevProjects/Plasma/PubUtilLib/plClipboard/plClipboard.vcproj diff --git a/MOULOpenSourceClientPlugin/Plasma20/MsDevProjects/Plasma/Apps/AllClient/AllClient.sln b/MOULOpenSourceClientPlugin/Plasma20/MsDevProjects/Plasma/Apps/AllClient/AllClient.sln index 19ca25f6..79809390 100644 --- a/MOULOpenSourceClientPlugin/Plasma20/MsDevProjects/Plasma/Apps/AllClient/AllClient.sln +++ b/MOULOpenSourceClientPlugin/Plasma20/MsDevProjects/Plasma/Apps/AllClient/AllClient.sln @@ -135,6 +135,7 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "plClient", "..\plClient\plC {89316659-F4A9-4E92-8200-C36288A61B9B} = {89316659-F4A9-4E92-8200-C36288A61B9B} {1599855E-CC20-4C3A-A382-5290C40BE08E} = {1599855E-CC20-4C3A-A382-5290C40BE08E} {5C9C6E61-02D6-4BA6-A4F5-6E6AE440E477} = {5C9C6E61-02D6-4BA6-A4F5-6E6AE440E477} + {CA2D4E65-EA68-465F-843A-4AF75243B474} = {CA2D4E65-EA68-465F-843A-4AF75243B474} {8E44FB70-5EA0-4D33-B829-E4D16D7C11E3} = {8E44FB70-5EA0-4D33-B829-E4D16D7C11E3} {CA208971-6C77-47F6-AA4B-FB6ECC071132} = {CA208971-6C77-47F6-AA4B-FB6ECC071132} {7D83F872-F06C-4D42-A8F2-D77DC22C5981} = {7D83F872-F06C-4D42-A8F2-D77DC22C5981} @@ -500,6 +501,7 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "plPageOptimizer", "..\plPag {1599855E-CC20-4C3A-A382-5290C40BE08E} = {1599855E-CC20-4C3A-A382-5290C40BE08E} {A10FCF60-7425-48D7-9153-CB9D8AD94C8F} = {A10FCF60-7425-48D7-9153-CB9D8AD94C8F} {5C9C6E61-02D6-4BA6-A4F5-6E6AE440E477} = {5C9C6E61-02D6-4BA6-A4F5-6E6AE440E477} + {CA2D4E65-EA68-465F-843A-4AF75243B474} = {CA2D4E65-EA68-465F-843A-4AF75243B474} {8E44FB70-5EA0-4D33-B829-E4D16D7C11E3} = {8E44FB70-5EA0-4D33-B829-E4D16D7C11E3} {CA208971-6C77-47F6-AA4B-FB6ECC071132} = {CA208971-6C77-47F6-AA4B-FB6ECC071132} {7D83F872-F06C-4D42-A8F2-D77DC22C5981} = {7D83F872-F06C-4D42-A8F2-D77DC22C5981} @@ -596,6 +598,10 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "plClientPatcher", "..\plCli ProjectSection(ProjectDependencies) = postProject EndProjectSection EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "plClipboard", "..\..\PubUtilLib\plClipboard\plClipboard.vcproj", "{CA2D4E65-EA68-465F-843A-4AF75243B474}" + ProjectSection(ProjectDependencies) = postProject + EndProjectSection +EndProject Global GlobalSection(SolutionConfiguration) = preSolution Debug = Debug @@ -605,8 +611,6 @@ Global Release_Patcher = Release_Patcher Release_Server = Release_Server EndGlobalSection - GlobalSection(ProjectDependencies) = postSolution - EndGlobalSection GlobalSection(ProjectConfiguration) = postSolution {0736D624-C5F6-4B44-96FC-B27C2841D2F9}.Debug.ActiveCfg = Debug|Win32 {0736D624-C5F6-4B44-96FC-B27C2841D2F9}.Debug.Build.0 = Debug|Win32 @@ -1796,6 +1800,18 @@ Global {F1DC998F-6B75-48FF-8446-D59AF448678E}.Release_Patcher.Build.0 = Release_Patcher|Win32 {F1DC998F-6B75-48FF-8446-D59AF448678E}.Release_Server.ActiveCfg = Release_Patcher|Win32 {F1DC998F-6B75-48FF-8446-D59AF448678E}.Release_Server.Build.0 = Release_Patcher|Win32 + {CA2D4E65-EA68-465F-843A-4AF75243B474}.Debug.ActiveCfg = Debug|Win32 + {CA2D4E65-EA68-465F-843A-4AF75243B474}.Debug.Build.0 = Debug|Win32 + {CA2D4E65-EA68-465F-843A-4AF75243B474}.Debug_Patcher.ActiveCfg = Debug|Win32 + {CA2D4E65-EA68-465F-843A-4AF75243B474}.Debug_Patcher.Build.0 = Debug|Win32 + {CA2D4E65-EA68-465F-843A-4AF75243B474}.Debug_Server.ActiveCfg = Debug|Win32 + {CA2D4E65-EA68-465F-843A-4AF75243B474}.Debug_Server.Build.0 = Debug|Win32 + {CA2D4E65-EA68-465F-843A-4AF75243B474}.Release.ActiveCfg = Release|Win32 + {CA2D4E65-EA68-465F-843A-4AF75243B474}.Release.Build.0 = Release|Win32 + {CA2D4E65-EA68-465F-843A-4AF75243B474}.Release_Patcher.ActiveCfg = Release|Win32 + {CA2D4E65-EA68-465F-843A-4AF75243B474}.Release_Patcher.Build.0 = Release|Win32 + {CA2D4E65-EA68-465F-843A-4AF75243B474}.Release_Server.ActiveCfg = Release|Win32 + {CA2D4E65-EA68-465F-843A-4AF75243B474}.Release_Server.Build.0 = Release|Win32 EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution EndGlobalSection diff --git a/MOULOpenSourceClientPlugin/Plasma20/MsDevProjects/Plasma/PubUtilLib/plClipboard/plClipboard.vcproj b/MOULOpenSourceClientPlugin/Plasma20/MsDevProjects/Plasma/PubUtilLib/plClipboard/plClipboard.vcproj new file mode 100644 index 00000000..ef5969db --- /dev/null +++ b/MOULOpenSourceClientPlugin/Plasma20/MsDevProjects/Plasma/PubUtilLib/plClipboard/plClipboard.vcproj @@ -0,0 +1,139 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From a99ed37f23aacd8ce0eeab70a7b4a788e5ce6ec8 Mon Sep 17 00:00:00 2001 From: Bartek Bok Date: Sun, 4 Mar 2012 18:55:44 +0100 Subject: [PATCH 07/21] Missing null checks and small style fixes --- .../pfGameGUIMgr/pfGUIEditBoxMod.cpp | 25 +++++++++++-------- .../pfGameGUIMgr/pfGUIMultiLineEditCtrl.cpp | 7 ++++-- 2 files changed, 20 insertions(+), 12 deletions(-) diff --git a/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/FeatureLib/pfGameGUIMgr/pfGUIEditBoxMod.cpp b/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/FeatureLib/pfGameGUIMgr/pfGUIEditBoxMod.cpp index 03444783..66b8c3db 100644 --- a/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/FeatureLib/pfGameGUIMgr/pfGUIEditBoxMod.cpp +++ b/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/FeatureLib/pfGameGUIMgr/pfGUIEditBoxMod.cpp @@ -511,18 +511,23 @@ hsBool pfGUIEditBoxMod::HandleKeyEvent( pfGameGUIMgr::EventType event, plKeyDef else if (key == KEY_V) { wchar_t* contents = plClipboard::GetInstance().GetClipboardText(); - size_t len = wcslen(contents); - if (len > 0) { - wchar_t* insertTarget = fBuffer + fCursorPos; - size_t bufferTailLen = wcslen(insertTarget); - if (fCursorPos + len + bufferTailLen < fBufferSize) { - memmove(insertTarget + len, insertTarget, bufferTailLen * sizeof(wchar_t)); - memcpy(insertTarget, contents, len * sizeof(wchar_t)); - fCursorPos += len; - HandleExtendedEvent( kValueChanging ); + if (contents != nil) + { + size_t len = wcslen(contents); + if (len > 0) + { + wchar_t* insertTarget = fBuffer + fCursorPos; + size_t bufferTailLen = wcslen(insertTarget); + if (fCursorPos + len + bufferTailLen < fBufferSize) + { + memmove(insertTarget + len, insertTarget, bufferTailLen * sizeof(wchar_t)); + memcpy(insertTarget, contents, len * sizeof(wchar_t)); + fCursorPos += len; + HandleExtendedEvent( kValueChanging ); + } } + delete contents; } - delete contents; } } else diff --git a/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/FeatureLib/pfGameGUIMgr/pfGUIMultiLineEditCtrl.cpp b/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/FeatureLib/pfGameGUIMgr/pfGUIMultiLineEditCtrl.cpp index 60b8c354..9d5df62a 100644 --- a/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/FeatureLib/pfGameGUIMgr/pfGUIMultiLineEditCtrl.cpp +++ b/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/FeatureLib/pfGameGUIMgr/pfGUIMultiLineEditCtrl.cpp @@ -1226,8 +1226,11 @@ hsBool pfGUIMultiLineEditCtrl::HandleKeyEvent( pfGameGUIMgr::EventType event, pl else if (key == KEY_V) { wchar_t* contents = plClipboard::GetInstance().GetClipboardText(); - InsertString(contents); - delete contents; + if (contents != nil) + { + InsertString(contents); + delete contents; + } } } else From e4458717c9435c17fca71823f5c390fa976fb9b8 Mon Sep 17 00:00:00 2001 From: Bartek Bok Date: Mon, 5 Mar 2012 11:06:05 +0100 Subject: [PATCH 08/21] Fix possible WinApi misuse --- .../Sources/Plasma/PubUtilLib/plClipboard/plClipboard.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/PubUtilLib/plClipboard/plClipboard.cpp b/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/PubUtilLib/plClipboard/plClipboard.cpp index c7e26fd7..c00b06c2 100644 --- a/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/PubUtilLib/plClipboard/plClipboard.cpp +++ b/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/PubUtilLib/plClipboard/plClipboard.cpp @@ -106,8 +106,7 @@ void plClipboard::SetClipboardText(const wchar_t* text) wcsncpy(target, text, len + 1); ::GlobalUnlock(copy); - // Place the handle on the clipboard. - ::SetClipboardData(CF_UNICODETEXT, target); + ::SetClipboardData(CF_UNICODETEXT, copy); ::CloseClipboard(); #endif } From 423e0c2142bc305a2c173f52e2e128d31b217c38 Mon Sep 17 00:00:00 2001 From: Adam Johnson Date: Wed, 28 Mar 2012 16:36:37 -0400 Subject: [PATCH 09/21] Use George Bush style (2007) DST begin/end dates --- .../Sources/Plasma/FeatureLib/pfPython/cyMisc.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/FeatureLib/pfPython/cyMisc.cpp b/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/FeatureLib/pfPython/cyMisc.cpp index 02aa1f9e..efb9804e 100644 --- a/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/FeatureLib/pfPython/cyMisc.cpp +++ b/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/FeatureLib/pfPython/cyMisc.cpp @@ -649,19 +649,19 @@ UInt32 cyMisc::ConvertGMTtoDni(UInt32 gtime) plUnifiedTime utime = plUnifiedTime(); utime.SetSecs(dtime); // check for daylight savings time in New Mexico and adjust - if ( utime.GetMonth() >= 4 && utime.GetMonth() < 11 ) + if ( utime.GetMonth() >= 3 && utime.GetMonth() < 11 ) { plUnifiedTime dstStart = plUnifiedTime(); - dstStart.SetGMTime(utime.GetYear(),4,1,2,0,0); - // find first Sunday after 4/1 (first sunday of April) + dstStart.SetGMTime(utime.GetYear(),3,7,2,0,0); + // find first Sunday after 3/7 (second Sunday of March) UInt32 days_to_go = 7 - dstStart.GetDayOfWeek(); if (days_to_go == 7) days_to_go = 0; UInt32 dstStartSecs = dstStart.GetSecs() + days_to_go * kOneDay; plUnifiedTime dstEnd = plUnifiedTime(); - dstEnd.SetGMTime(utime.GetYear(),10,25,1,0,0); - // find first sunday after 10/25 (last sunday of Oct.) + dstEnd.SetGMTime(utime.GetYear(),11,1,1,0,0); + // find first sunday after 11/1 (first Sunday of November) days_to_go = 7 - dstEnd.GetDayOfWeek(); if (days_to_go == 7) days_to_go = 0; From 59b04b546fd5c3e77ec0f3f37504405b64418717 Mon Sep 17 00:00:00 2001 From: Christian Walther Date: Sat, 31 Mar 2012 20:06:55 +0200 Subject: [PATCH 10/21] Fix plUnifiedTime::SetGMTime The default value of the "dst" argument must be 0, because -1 leads to incorrect results when the given time falls into local DST. However, a "dst" argument makes no sense on a method that deals with GMT anyway, so remove it entirely. --- .../Sources/Plasma/PubUtilLib/plUnifiedTime/plUnifiedTime.cpp | 4 ++-- .../Sources/Plasma/PubUtilLib/plUnifiedTime/plUnifiedTime.h | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/PubUtilLib/plUnifiedTime/plUnifiedTime.cpp b/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/PubUtilLib/plUnifiedTime/plUnifiedTime.cpp index a7a53574..c6c360b6 100644 --- a/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/PubUtilLib/plUnifiedTime/plUnifiedTime.cpp +++ b/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/PubUtilLib/plUnifiedTime/plUnifiedTime.cpp @@ -263,9 +263,9 @@ void plUnifiedTime::ToCurrentTime() SetToUTC(); } -hsBool plUnifiedTime::SetGMTime(short year, short month, short day, short hour, short minute, short second, unsigned long usec, int dst) +hsBool plUnifiedTime::SetGMTime(short year, short month, short day, short hour, short minute, short second, unsigned long usec) { - if( !SetTime( year, month, day, hour, minute, second, usec, dst ) ) + if( !SetTime( year, month, day, hour, minute, second, usec, 0 ) ) return false; fSecs -= IGetLocalTimeZoneOffset(); diff --git a/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/PubUtilLib/plUnifiedTime/plUnifiedTime.h b/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/PubUtilLib/plUnifiedTime/plUnifiedTime.h index bfdb9435..86172eea 100644 --- a/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/PubUtilLib/plUnifiedTime/plUnifiedTime.h +++ b/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/PubUtilLib/plUnifiedTime/plUnifiedTime.h @@ -129,7 +129,7 @@ public: void SetSecsDouble(double secs); void SetMicros(const UInt32 micros) { fMicros = micros; } hsBool SetTime(short year, short month, short day, short hour, short minute, short second, unsigned long usec=0, int dst=-1); - hsBool SetGMTime(short year, short month, short day, short hour, short minute, short second, unsigned long usec=0, int dst=-1); + hsBool SetGMTime(short year, short month, short day, short hour, short minute, short second, unsigned long usec=0); hsBool SetToUTC(); void ToCurrentTime(); void ToEpoch() { fSecs = 0; fMicros = 0;} From a9cb4723d0baa4951962f86a31c19c3296a214b9 Mon Sep 17 00:00:00 2001 From: Christian Walther Date: Sat, 31 Mar 2012 20:13:58 +0200 Subject: [PATCH 11/21] Fix KI daylight saving time calculation. The previous implementation had the following bugs: - DST was truncated to end of October - DST start was off by one week in years where March 1st is a Monday - DST start was off by one second (1:59:59 -> 2:00:00 -> 3:00:01 instead of the correct 1:59:59 -> 3:00:00 -> 3:00:01) Tested against tzdata 2009g. --- .../Sources/Plasma/FeatureLib/pfPython/cyMisc.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/FeatureLib/pfPython/cyMisc.cpp b/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/FeatureLib/pfPython/cyMisc.cpp index efb9804e..beca03b2 100644 --- a/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/FeatureLib/pfPython/cyMisc.cpp +++ b/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/FeatureLib/pfPython/cyMisc.cpp @@ -649,11 +649,11 @@ UInt32 cyMisc::ConvertGMTtoDni(UInt32 gtime) plUnifiedTime utime = plUnifiedTime(); utime.SetSecs(dtime); // check for daylight savings time in New Mexico and adjust - if ( utime.GetMonth() >= 3 && utime.GetMonth() < 11 ) + if ( utime.GetMonth() >= 3 && utime.GetMonth() <= 11 ) { plUnifiedTime dstStart = plUnifiedTime(); - dstStart.SetGMTime(utime.GetYear(),3,7,2,0,0); - // find first Sunday after 3/7 (second Sunday of March) + dstStart.SetGMTime(utime.GetYear(),3,8,2,0,0); + // find first Sunday after (including) 3/8 (second Sunday of March) UInt32 days_to_go = 7 - dstStart.GetDayOfWeek(); if (days_to_go == 7) days_to_go = 0; @@ -661,13 +661,13 @@ UInt32 cyMisc::ConvertGMTtoDni(UInt32 gtime) plUnifiedTime dstEnd = plUnifiedTime(); dstEnd.SetGMTime(utime.GetYear(),11,1,1,0,0); - // find first sunday after 11/1 (first Sunday of November) + // find first sunday after (including) 11/1 (first Sunday of November) days_to_go = 7 - dstEnd.GetDayOfWeek(); if (days_to_go == 7) days_to_go = 0; UInt32 dstEndSecs = dstEnd.GetSecs() + days_to_go * kOneDay; - if ( dtime > dstStartSecs && dtime < dstEndSecs ) + if ( dtime >= dstStartSecs && dtime < dstEndSecs ) // add hour for daylight savings time dtime += kOneHour; } From 66dc3dde92b02cf5f804c88f901689c8c973eb30 Mon Sep 17 00:00:00 2001 From: Adam Johnson Date: Tue, 3 Apr 2012 12:42:37 -0400 Subject: [PATCH 12/21] Fix landing behaviors --- .../Sources/Plasma/PubUtilLib/plAvatar/plAvCallbackAction.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/PubUtilLib/plAvatar/plAvCallbackAction.cpp b/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/PubUtilLib/plAvatar/plAvCallbackAction.cpp index 7e90c022..b8320585 100644 --- a/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/PubUtilLib/plAvatar/plAvCallbackAction.cpp +++ b/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/PubUtilLib/plAvatar/plAvCallbackAction.cpp @@ -133,8 +133,10 @@ void plWalkingController::RecalcVelocity(double timeNow, double timePrev, hsBool if (fController && !fWalkingStrategy->IsOnGround()) { + // PhysX Hack + // LinearVelocity is always (0,0,0) outside the PhysController fImpactTime = fWalkingStrategy->GetAirTime(); - fImpactVelocity = fController->GetLinearVelocity(); + fImpactVelocity = fController->GetAchievedLinearVelocity(); fClearImpact = false; } else From ccefcfdb13f7eb08f0b176d844228b45b8b1216d Mon Sep 17 00:00:00 2001 From: Adam Johnson Date: Tue, 3 Apr 2012 12:55:02 -0400 Subject: [PATCH 13/21] Fix an aspect ratio assumption --- .../Sources/Plasma/FeatureLib/pfCamera/plCameraBrain.cpp | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/FeatureLib/pfCamera/plCameraBrain.cpp b/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/FeatureLib/pfCamera/plCameraBrain.cpp index 8f79f14d..8bbfb3f9 100644 --- a/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/FeatureLib/pfCamera/plCameraBrain.cpp +++ b/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/FeatureLib/pfCamera/plCameraBrain.cpp @@ -71,13 +71,6 @@ You can contact Cyan Worlds, Inc. by email legal@cyan.com #include "../plAvatar/plArmatureMod.h" #include "../plAvatar/plAvBrainHuman.h" #include "../plNetClient/plNetClientMgr.h" -//#define aspect_HDTV // maybe someday we'll be on the xbox... - -#ifdef aspect_HDTV -#define FOV_RATIO 1.78 -#else -#define FOV_RATIO 1.33333333 -#endif hsBool plCameraBrain1_FirstPerson::fDontFade = false; hsScalar plCameraBrain1::fFallAccel = 20.0f; @@ -257,7 +250,7 @@ void plCameraBrain1::IAnimateFOV(double time) dH = fFOVGoal; } - fCamera->SetFOVw( (hsScalar)(dH * FOV_RATIO) ); + fCamera->SetFOVw( (hsScalar)(dH * plVirtualCam1::GetAspectRatio()) ); fCamera->SetFOVh( dH ); } From aaabc9c333cf213f1a3032f0bc4a01bfd31968b7 Mon Sep 17 00:00:00 2001 From: Christian Walther Date: Fri, 6 Apr 2012 21:02:24 +0200 Subject: [PATCH 14/21] Add plFileEncrypt, plFileSecure, plPythonPack to AllClient.sln. --- .hgignore | 1 + .../Plasma/Apps/AllClient/AllClient.sln | 67 ++++++++++++++++++- .../Apps/plFileEncrypt/plFileEncrypt.vcproj | 9 ++- .../Apps/plFileSecure/plFileSecure.vcproj | 8 ++- 4 files changed, 79 insertions(+), 6 deletions(-) diff --git a/.hgignore b/.hgignore index db4de61e..a01b23e7 100644 --- a/.hgignore +++ b/.hgignore @@ -6,4 +6,5 @@ Release/ Debug/ syntax: regexp ^MOULOpenSourceClientPlugin/Plasma20/test/ +^MOULOpenSourceClientPlugin/Plasma20/tools/ ^MOULOpenSourceClientPlugin/StaticSDKs/ diff --git a/MOULOpenSourceClientPlugin/Plasma20/MsDevProjects/Plasma/Apps/AllClient/AllClient.sln b/MOULOpenSourceClientPlugin/Plasma20/MsDevProjects/Plasma/Apps/AllClient/AllClient.sln index 19ca25f6..df19ca3d 100644 --- a/MOULOpenSourceClientPlugin/Plasma20/MsDevProjects/Plasma/Apps/AllClient/AllClient.sln +++ b/MOULOpenSourceClientPlugin/Plasma20/MsDevProjects/Plasma/Apps/AllClient/AllClient.sln @@ -596,6 +596,35 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "plClientPatcher", "..\plCli ProjectSection(ProjectDependencies) = postProject EndProjectSection EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "plFileEncrypt", "..\plFileEncrypt\plFileEncrypt.vcproj", "{728CE37F-B032-45D1-B3B5-EF94D4B8A919}" + ProjectSection(ProjectDependencies) = postProject + {677C542F-9027-418D-9D9E-2D526E9FCD09} = {677C542F-9027-418D-9D9E-2D526E9FCD09} + {8444A94C-FD1E-47D2-B978-B42ED198F234} = {8444A94C-FD1E-47D2-B978-B42ED198F234} + {4054C94F-866A-4AA7-874B-2AFCFEF23A71} = {4054C94F-866A-4AA7-874B-2AFCFEF23A71} + {89316659-F4A9-4E92-8200-C36288A61B9B} = {89316659-F4A9-4E92-8200-C36288A61B9B} + {CA208971-6C77-47F6-AA4B-FB6ECC071132} = {CA208971-6C77-47F6-AA4B-FB6ECC071132} + {032566E8-A751-4863-89E3-CEC33703B3C1} = {032566E8-A751-4863-89E3-CEC33703B3C1} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "plFileSecure", "..\plFileSecure\plFileSecure.vcproj", "{E5F40B98-A55E-486D-9A93-8008BF153495}" + ProjectSection(ProjectDependencies) = postProject + {677C542F-9027-418D-9D9E-2D526E9FCD09} = {677C542F-9027-418D-9D9E-2D526E9FCD09} + {8444A94C-FD1E-47D2-B978-B42ED198F234} = {8444A94C-FD1E-47D2-B978-B42ED198F234} + {4054C94F-866A-4AA7-874B-2AFCFEF23A71} = {4054C94F-866A-4AA7-874B-2AFCFEF23A71} + {89316659-F4A9-4E92-8200-C36288A61B9B} = {89316659-F4A9-4E92-8200-C36288A61B9B} + {CA208971-6C77-47F6-AA4B-FB6ECC071132} = {CA208971-6C77-47F6-AA4B-FB6ECC071132} + {032566E8-A751-4863-89E3-CEC33703B3C1} = {032566E8-A751-4863-89E3-CEC33703B3C1} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "plPythonPack", "..\plPythonPack\plPythonPack.vcproj", "{84868043-5563-435A-A176-76A059653D5C}" + ProjectSection(ProjectDependencies) = postProject + {677C542F-9027-418D-9D9E-2D526E9FCD09} = {677C542F-9027-418D-9D9E-2D526E9FCD09} + {8444A94C-FD1E-47D2-B978-B42ED198F234} = {8444A94C-FD1E-47D2-B978-B42ED198F234} + {4054C94F-866A-4AA7-874B-2AFCFEF23A71} = {4054C94F-866A-4AA7-874B-2AFCFEF23A71} + {A32201A8-0255-4863-97B8-4A569C18C624} = {A32201A8-0255-4863-97B8-4A569C18C624} + {A47A0DF4-F080-42B4-BC3B-865A02387089} = {A47A0DF4-F080-42B4-BC3B-865A02387089} + EndProjectSection +EndProject Global GlobalSection(SolutionConfiguration) = preSolution Debug = Debug @@ -605,8 +634,6 @@ Global Release_Patcher = Release_Patcher Release_Server = Release_Server EndGlobalSection - GlobalSection(ProjectDependencies) = postSolution - EndGlobalSection GlobalSection(ProjectConfiguration) = postSolution {0736D624-C5F6-4B44-96FC-B27C2841D2F9}.Debug.ActiveCfg = Debug|Win32 {0736D624-C5F6-4B44-96FC-B27C2841D2F9}.Debug.Build.0 = Debug|Win32 @@ -1796,6 +1823,42 @@ Global {F1DC998F-6B75-48FF-8446-D59AF448678E}.Release_Patcher.Build.0 = Release_Patcher|Win32 {F1DC998F-6B75-48FF-8446-D59AF448678E}.Release_Server.ActiveCfg = Release_Patcher|Win32 {F1DC998F-6B75-48FF-8446-D59AF448678E}.Release_Server.Build.0 = Release_Patcher|Win32 + {728CE37F-B032-45D1-B3B5-EF94D4B8A919}.Debug.ActiveCfg = Debug|Win32 + {728CE37F-B032-45D1-B3B5-EF94D4B8A919}.Debug.Build.0 = Debug|Win32 + {728CE37F-B032-45D1-B3B5-EF94D4B8A919}.Debug_Patcher.ActiveCfg = Debug|Win32 + {728CE37F-B032-45D1-B3B5-EF94D4B8A919}.Debug_Patcher.Build.0 = Debug|Win32 + {728CE37F-B032-45D1-B3B5-EF94D4B8A919}.Debug_Server.ActiveCfg = Debug|Win32 + {728CE37F-B032-45D1-B3B5-EF94D4B8A919}.Debug_Server.Build.0 = Debug|Win32 + {728CE37F-B032-45D1-B3B5-EF94D4B8A919}.Release.ActiveCfg = Release|Win32 + {728CE37F-B032-45D1-B3B5-EF94D4B8A919}.Release.Build.0 = Release|Win32 + {728CE37F-B032-45D1-B3B5-EF94D4B8A919}.Release_Patcher.ActiveCfg = Release|Win32 + {728CE37F-B032-45D1-B3B5-EF94D4B8A919}.Release_Patcher.Build.0 = Release|Win32 + {728CE37F-B032-45D1-B3B5-EF94D4B8A919}.Release_Server.ActiveCfg = Release|Win32 + {728CE37F-B032-45D1-B3B5-EF94D4B8A919}.Release_Server.Build.0 = Release|Win32 + {E5F40B98-A55E-486D-9A93-8008BF153495}.Debug.ActiveCfg = Debug|Win32 + {E5F40B98-A55E-486D-9A93-8008BF153495}.Debug.Build.0 = Debug|Win32 + {E5F40B98-A55E-486D-9A93-8008BF153495}.Debug_Patcher.ActiveCfg = Debug|Win32 + {E5F40B98-A55E-486D-9A93-8008BF153495}.Debug_Patcher.Build.0 = Debug|Win32 + {E5F40B98-A55E-486D-9A93-8008BF153495}.Debug_Server.ActiveCfg = Debug|Win32 + {E5F40B98-A55E-486D-9A93-8008BF153495}.Debug_Server.Build.0 = Debug|Win32 + {E5F40B98-A55E-486D-9A93-8008BF153495}.Release.ActiveCfg = Release|Win32 + {E5F40B98-A55E-486D-9A93-8008BF153495}.Release.Build.0 = Release|Win32 + {E5F40B98-A55E-486D-9A93-8008BF153495}.Release_Patcher.ActiveCfg = Release|Win32 + {E5F40B98-A55E-486D-9A93-8008BF153495}.Release_Patcher.Build.0 = Release|Win32 + {E5F40B98-A55E-486D-9A93-8008BF153495}.Release_Server.ActiveCfg = Release|Win32 + {E5F40B98-A55E-486D-9A93-8008BF153495}.Release_Server.Build.0 = Release|Win32 + {84868043-5563-435A-A176-76A059653D5C}.Debug.ActiveCfg = Debug|Win32 + {84868043-5563-435A-A176-76A059653D5C}.Debug.Build.0 = Debug|Win32 + {84868043-5563-435A-A176-76A059653D5C}.Debug_Patcher.ActiveCfg = Debug|Win32 + {84868043-5563-435A-A176-76A059653D5C}.Debug_Patcher.Build.0 = Debug|Win32 + {84868043-5563-435A-A176-76A059653D5C}.Debug_Server.ActiveCfg = Debug|Win32 + {84868043-5563-435A-A176-76A059653D5C}.Debug_Server.Build.0 = Debug|Win32 + {84868043-5563-435A-A176-76A059653D5C}.Release.ActiveCfg = Release|Win32 + {84868043-5563-435A-A176-76A059653D5C}.Release.Build.0 = Release|Win32 + {84868043-5563-435A-A176-76A059653D5C}.Release_Patcher.ActiveCfg = Release|Win32 + {84868043-5563-435A-A176-76A059653D5C}.Release_Patcher.Build.0 = Release|Win32 + {84868043-5563-435A-A176-76A059653D5C}.Release_Server.ActiveCfg = Release|Win32 + {84868043-5563-435A-A176-76A059653D5C}.Release_Server.Build.0 = Release|Win32 EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution EndGlobalSection diff --git a/MOULOpenSourceClientPlugin/Plasma20/MsDevProjects/Plasma/Apps/plFileEncrypt/plFileEncrypt.vcproj b/MOULOpenSourceClientPlugin/Plasma20/MsDevProjects/Plasma/Apps/plFileEncrypt/plFileEncrypt.vcproj index 582630e9..62e079f8 100644 --- a/MOULOpenSourceClientPlugin/Plasma20/MsDevProjects/Plasma/Apps/plFileEncrypt/plFileEncrypt.vcproj +++ b/MOULOpenSourceClientPlugin/Plasma20/MsDevProjects/Plasma/Apps/plFileEncrypt/plFileEncrypt.vcproj @@ -3,6 +3,7 @@ ProjectType="Visual C++" Version="7.10" Name="plFileEncrypt" + ProjectGUID="{728CE37F-B032-45D1-B3B5-EF94D4B8A919}" SccProjectName="" SccLocalPath=""> @@ -51,7 +52,9 @@ TypeLibraryName=".\Debug/plFileEncrypt.tlb" HeaderFileName=""/> + Name="VCPostBuildEventTool" + Description="Copy to Tools directory" + CommandLine="xcopy /Y "$(TargetPath)" ..\..\..\..\tools\"/> + Name="VCPostBuildEventTool" + Description="Copy to Tools directory" + CommandLine="xcopy /Y "$(TargetPath)" ..\..\..\..\tools\"/> + Name="VCPostBuildEventTool" + Description="Copy to Tools directory" + CommandLine="xcopy /Y "$(TargetPath)" ..\..\..\..\tools\"/> + Name="VCPostBuildEventTool" + Description="Copy to Tools directory" + CommandLine="xcopy /Y "$(TargetPath)" ..\..\..\..\tools\"/> Date: Mon, 9 Apr 2012 01:29:47 +0200 Subject: [PATCH 15/21] Allow int in plNotify --- .../Plasma/FeatureLib/pfPython/plPythonFileMod.cpp | 11 ++- Sources/Plasma/FeatureLib/pfPython/pyNotify.cpp | 10 ++ Sources/Plasma/FeatureLib/pfPython/pyNotify.h | 2 + .../Plasma/FeatureLib/pfPython/pyNotifyGlue.cpp | 68 +++++++++++++++- .../Plasma/NucleusLib/pnMessage/plNotifyMsg.cpp | 87 +++++++++++++++++-- Sources/Plasma/NucleusLib/pnMessage/plNotifyMsg.h | 14 +++- 6 files changed, 175 insertions(+), 17 deletions(-) --- .../FeatureLib/pfPython/plPythonFileMod.cpp | 11 ++- .../Plasma/FeatureLib/pfPython/pyNotify.cpp | 10 +++ .../Plasma/FeatureLib/pfPython/pyNotify.h | 2 + .../FeatureLib/pfPython/pyNotifyGlue.cpp | 68 ++++++++++++++- .../NucleusLib/pnMessage/plNotifyMsg.cpp | 87 ++++++++++++++++--- .../Plasma/NucleusLib/pnMessage/plNotifyMsg.h | 14 ++- 6 files changed, 175 insertions(+), 17 deletions(-) diff --git a/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/FeatureLib/pfPython/plPythonFileMod.cpp b/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/FeatureLib/pfPython/plPythonFileMod.cpp index 5e008366..0a0c86a3 100644 --- a/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/FeatureLib/pfPython/plPythonFileMod.cpp +++ b/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/FeatureLib/pfPython/plPythonFileMod.cpp @@ -1363,12 +1363,19 @@ hsBool plPythonFileMod::MsgReceive(plMessage* msg) // depending on the data type create the data switch ( eventData->fDataType ) { - case proEventData::kNumber: - PyList_SetItem(event, 3, PyFloat_FromDouble(eventData->fNumber)); + case proEventData::kFloat: + PyList_SetItem(event, 3, PyFloat_FromDouble(eventData->fNumber.f)); break; case proEventData::kKey: PyList_SetItem(event, 3, pyKey::New(eventData->fKey)); break; + case proEventData::kInt: + PyList_SetItem(event, 3, PyInt_FromLong(eventData->fNumber.i)); + break; + default: + Py_XINCREF(Py_None); + PyList_SetItem(event, 3, Py_None); + break; } // add this event record to the main event list (lists within a list) PyList_Append(levents, event); diff --git a/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/FeatureLib/pfPython/pyNotify.cpp b/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/FeatureLib/pfPython/pyNotify.cpp index dc7ab6fa..096d67de 100644 --- a/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/FeatureLib/pfPython/pyNotify.cpp +++ b/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/FeatureLib/pfPython/pyNotify.cpp @@ -151,6 +151,16 @@ void pyNotify::AddVarNumber(const char* name, hsScalar number) fBuildMsg.AddVariableEvent(name,number); } +void pyNotify::AddVarNumber(const char* name, Int32 number) +{ + fBuildMsg.AddVariableEvent(name,number); +} + +void pyNotify::AddVarNull(const char* name) +{ + fBuildMsg.AddVariableEvent(name); +} + void pyNotify::AddVarKey(const char* name, pyKey* key) { fBuildMsg.AddVariableEvent(name, key ? key->getKey() : plKey() ); diff --git a/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/FeatureLib/pfPython/pyNotify.h b/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/FeatureLib/pfPython/pyNotify.h index 5fca6ffa..c5827e72 100644 --- a/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/FeatureLib/pfPython/pyNotify.h +++ b/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/FeatureLib/pfPython/pyNotify.h @@ -100,6 +100,8 @@ public: virtual void AddPickEvent(hsBool enabled, pyKey* other, pyKey* self, pyPoint3 hitPoint); virtual void AddControlKeyEvent( Int32 key, hsBool down ); virtual void AddVarNumber(const char* name, hsScalar number); + virtual void AddVarNumber(const char* name, Int32 number); + virtual void AddVarNull(const char* name); virtual void AddVarKey(const char* name, pyKey* key); virtual void AddFacingEvent( hsBool enabled, pyKey* other, pyKey* self, hsScalar dot); virtual void AddContainerEvent( hsBool entering, pyKey* container, pyKey* contained); diff --git a/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/FeatureLib/pfPython/pyNotifyGlue.cpp b/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/FeatureLib/pfPython/pyNotifyGlue.cpp index 13eb916f..2dc689f0 100644 --- a/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/FeatureLib/pfPython/pyNotifyGlue.cpp +++ b/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/FeatureLib/pfPython/pyNotifyGlue.cpp @@ -194,18 +194,71 @@ PYTHON_METHOD_DEFINITION(ptNotify, addControlKeyEvent, args) } PYTHON_METHOD_DEFINITION(ptNotify, addVarNumber, args) +{ + char* name; + PyObject* number = NULL; + if (!PyArg_ParseTuple(args, "s|O", &name, &number)) + { + PyErr_SetString(PyExc_TypeError, "addVarNumber expects a string and optional number"); + PYTHON_RETURN_ERROR; + } + + if (number == NULL || number == Py_None) + self->fThis->AddVarNull(name); + else if (PyInt_Check(number)) + self->fThis->AddVarNumber(name, PyInt_AsLong(number)); + else if (PyNumber_Check(number)) + { + PyObject* f = PyNumber_Float(number); + self->fThis->AddVarNumber(name, (float)PyFloat_AsDouble(f)); + Py_DECREF(f); + } + else + { + PyErr_SetString(PyExc_TypeError, "addVarNumber expects a string and optional number"); + PYTHON_RETURN_ERROR; + } + PYTHON_RETURN_NONE; +} + +PYTHON_METHOD_DEFINITION(ptNotify, addVarFloat, args) { char* name; float number; if (!PyArg_ParseTuple(args, "sf", &name, &number)) { - PyErr_SetString(PyExc_TypeError, "addVarNumber expects a string and a float"); + PyErr_SetString(PyExc_TypeError, "addVarFloat expects a string and a float"); PYTHON_RETURN_ERROR; } self->fThis->AddVarNumber(name, number); PYTHON_RETURN_NONE; } +PYTHON_METHOD_DEFINITION(ptNotify, addVarInt, args) +{ + char* name; + Int32 number; + if (!PyArg_ParseTuple(args, "sl", &name, &number)) + { + PyErr_SetString(PyExc_TypeError, "addVarInt expects a string and a integer"); + PYTHON_RETURN_ERROR; + } + self->fThis->AddVarNumber(name, number); + PYTHON_RETURN_NONE; +} + +PYTHON_METHOD_DEFINITION(ptNotify, addVarNull, args) +{ + char* name; + if (!PyArg_ParseTuple(args, "s", &name)) + { + PyErr_SetString(PyExc_TypeError, "addVarNull expects a string"); + PYTHON_RETURN_ERROR; + } + self->fThis->AddVarNull(name); + PYTHON_RETURN_NONE; +} + PYTHON_METHOD_DEFINITION(ptNotify, addVarKey, args) { char* name; @@ -337,6 +390,13 @@ PYTHON_START_METHODS_TABLE(ptNotify) PYTHON_METHOD(ptNotify, addPickEvent, "Params: enabledFlag,pickerKey,pickeeKey,hitPoint\nAdd a pick event record to the Notify message"), PYTHON_METHOD(ptNotify, addControlKeyEvent, "Params: keynumber,downFlag\nAdd a keyboard event record to the Notify message"), PYTHON_METHOD(ptNotify, addVarNumber, "Params: name,number\nAdd a number variable event record to the Notify message\n" + "Method will try to pick appropriate variable type\n" + "This event record is used to pass a number variable to another python program"), + PYTHON_METHOD(ptNotify, addVarFloat, "Params: name,number\nAdd a float variable event record to the Notify message\n" + "This event record is used to pass a number variable to another python program"), + PYTHON_METHOD(ptNotify, addVarInt, "Params: name,number\nAdd a int variable event record to the Notify message\n" + "This event record is used to pass a number variable to another python program"), + PYTHON_METHOD(ptNotify, addVarNull, "Params: name,number\nAdd a null (no data) variable event record to the Notify message\n" "This event record is used to pass a number variable to another python program"), PYTHON_METHOD(ptNotify, addVarKey, "Params: name,key\nAdd a ptKey variable event record to the Notify message\n" "This event record is used to pass a ptKey variable to another python program"), @@ -402,8 +462,10 @@ void pyNotify::AddPlasmaConstantsClasses(PyObject *m) PYTHON_ENUM_END(m, PtEventType); PYTHON_ENUM_START(PtNotifyDataType); - PYTHON_ENUM_ELEMENT(PtNotifyDataType, kNumber, proEventData::kNumber); - PYTHON_ENUM_ELEMENT(PtNotifyDataType, kKey, proEventData::kKey); + PYTHON_ENUM_ELEMENT(PtNotifyDataType, kFloat, proEventData::kFloat); + PYTHON_ENUM_ELEMENT(PtNotifyDataType, kInt, proEventData::kInt); + PYTHON_ENUM_ELEMENT(PtNotifyDataType, kNull, proEventData::kNull); + PYTHON_ENUM_ELEMENT(PtNotifyDataType, kKey, proEventData::kKey); PYTHON_ENUM_END(m, PtNotifyDataType); PYTHON_ENUM_START(PtMultiStageEventType); diff --git a/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/NucleusLib/pnMessage/plNotifyMsg.cpp b/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/NucleusLib/pnMessage/plNotifyMsg.cpp index 40f560ee..d88b3b7b 100644 --- a/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/NucleusLib/pnMessage/plNotifyMsg.cpp +++ b/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/NucleusLib/pnMessage/plNotifyMsg.cpp @@ -173,8 +173,14 @@ void plNotifyMsg::AddEvent( proEventData* ed ) proVariableEventData *evt = (proVariableEventData *)ed; switch (evt->fDataType) { - case proEventData::kNumber: - AddVariableEvent(evt->fName, evt->fNumber); + case proEventData::kFloat: + AddVariableEvent(evt->fName, evt->fNumber.f); + break; + case proEventData::kInt: + AddVariableEvent(evt->fName, evt->fNumber.i); + break; + case proEventData::kNull: + AddVariableEvent(evt->fName); break; case proEventData::kKey: AddVariableEvent(evt->fName, evt->fKey); @@ -587,10 +593,43 @@ void plNotifyMsg::AddVariableEvent( const char* name, hsScalar number ) // create the control key event record proVariableEventData* pED = TRACKED_NEW proVariableEventData; pED->fName = hsStrcpy(nil,name); -// pED->fName = (char*)name; - pED->fDataType = proEventData::kNumber; - pED->fNumber = number; - fEvents.Append(pED); // then add it to the list of event records + pED->fDataType = proEventData::kFloat; + pED->fNumber.f = number; + fEvents.Append(pED); // then add it to the list of event records +} + +///////////////////////////////////////////////////////////////////////////// +// +// Function : AddVariableEvent +// PARAMETERS : name - name of the variable +// : number - the value of the variable as a number +// +// PURPOSE : Add a variable event record to this notify message +// +void plNotifyMsg::AddVariableEvent( const char* name, Int32 number ) +{ + // create the control key event record + proVariableEventData* pED = TRACKED_NEW proVariableEventData; + pED->fName = hsStrcpy(nil,name); + pED->fDataType = proEventData::kInt; + pED->fNumber.i = number; + fEvents.Append(pED); // then add it to the list of event records +} + +///////////////////////////////////////////////////////////////////////////// +// +// Function : AddVariableEvent +// PARAMETERS : name - name of the variable +// +// PURPOSE : Add a variable event record to this notify message +// +void plNotifyMsg::AddVariableEvent( const char* name) +{ + // create the control key event record + proVariableEventData* pED = TRACKED_NEW proVariableEventData; + pED->fName = hsStrcpy(nil,name); + pED->fDataType = proEventData::kNull; + fEvents.Append(pED); // then add it to the list of event records } @@ -1284,11 +1323,39 @@ void proVariableEventData::IDestruct() fName = nil; } +void proVariableEventData::IReadNumber(hsStream * stream) { + switch (fDataType) { + case kFloat: + fNumber.f = stream->ReadSwapScalar(); + break; + case kInt: + fNumber.i = stream->ReadSwap32(); + break; + default: + stream->ReadSwap32(); //ignore + break; + } +} + +void proVariableEventData::IWriteNumber(hsStream * stream) { + switch (fDataType) { + case kFloat: + stream->WriteSwapScalar(fNumber.f); + break; + case kInt: + stream->WriteSwap32(fNumber.i); + break; + default: + stream->WriteSwap32(0); + break; + } +} + void proVariableEventData::IRead(hsStream* stream, hsResMgr* mgr) { fName = stream->ReadSafeString(); fDataType = stream->ReadSwap32(); - fNumber = stream->ReadSwapScalar(); + IReadNumber(stream); fKey = mgr->ReadKey(stream); } @@ -1296,7 +1363,7 @@ void proVariableEventData::IWrite(hsStream* stream, hsResMgr* mgr) { stream->WriteSafeString(fName); stream->WriteSwap32(fDataType); - stream->WriteSwapScalar(fNumber); + IWriteNumber(stream); mgr->WriteKey(stream, fKey); } @@ -1318,7 +1385,7 @@ void proVariableEventData::IReadVersion(hsStream* s, hsResMgr* mgr) if (contentFlags.IsBitSet(kProVariableDataType)) fDataType = s->ReadSwap32(); if (contentFlags.IsBitSet(kProVariableNumber)) - fNumber = s->ReadSwapScalar(); + IReadNumber(s); if (contentFlags.IsBitSet(kProVariableKey)) fKey = mgr->ReadKey(s); } @@ -1337,7 +1404,7 @@ void proVariableEventData::IWriteVersion(hsStream* s, hsResMgr* mgr) // kProVariableDataType s->WriteSwap32(fDataType); // kProVariableNumber - s->WriteSwapScalar(fNumber); + IWriteNumber(s); // kProVariableKey mgr->WriteKey(s, fKey); } diff --git a/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/NucleusLib/pnMessage/plNotifyMsg.h b/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/NucleusLib/pnMessage/plNotifyMsg.h index 00d77f28..747ac4ab 100644 --- a/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/NucleusLib/pnMessage/plNotifyMsg.h +++ b/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/NucleusLib/pnMessage/plNotifyMsg.h @@ -87,8 +87,10 @@ public: enum dataType { - kNumber=1, + kFloat=1, kKey, + kInt, + kNull, kNotta }; @@ -181,7 +183,10 @@ proEventType(Variable) Int32 fDataType; // type of data // Can't be a union, sadly, but it isn't that much of a waste of space... - hsScalar fNumber; // if its a number + union { + hsScalar f; + Int32 i; + } fNumber; // if its a number plKey fKey; // if its a plKey (pointer to something) @@ -193,6 +198,9 @@ protected: virtual void IReadVersion(hsStream* s, hsResMgr* mgr); virtual void IWriteVersion(hsStream* s, hsResMgr* mgr); + + virtual void IReadNumber(hsStream * stream); + virtual void IWriteNumber(hsStream * stream); }; proEventType(Facing) @@ -368,6 +376,8 @@ public: void AddPickEvent( const plKey &other, const plKey& self, hsBool enabled, hsPoint3 hitPoint ); void AddControlKeyEvent( Int32 key, hsBool down ); void AddVariableEvent( const char* name, hsScalar number ); + void AddVariableEvent( const char* name, Int32 number ); + void AddVariableEvent( const char* name ); void AddVariableEvent( const char *name, const plKey &key); void AddFacingEvent( const plKey &other, const plKey &self, hsScalar dot, hsBool enabled); void AddContainerEvent( const plKey &container, const plKey &contained, hsBool entering); From e583bf6d74322a08afb8b22d0650f2ca97d01ccc Mon Sep 17 00:00:00 2001 From: Christian Walther Date: Mon, 9 Apr 2012 09:50:40 +0200 Subject: [PATCH 16/21] Also handle Python long integers in addVarNumber. --- .../Plasma/FeatureLib/pfPython/pyNotifyGlue.cpp | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/FeatureLib/pfPython/pyNotifyGlue.cpp b/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/FeatureLib/pfPython/pyNotifyGlue.cpp index 2dc689f0..f7a46845 100644 --- a/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/FeatureLib/pfPython/pyNotifyGlue.cpp +++ b/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/FeatureLib/pfPython/pyNotifyGlue.cpp @@ -207,6 +207,21 @@ PYTHON_METHOD_DEFINITION(ptNotify, addVarNumber, args) self->fThis->AddVarNull(name); else if (PyInt_Check(number)) self->fThis->AddVarNumber(name, PyInt_AsLong(number)); + else if (PyLong_Check(number)) + { + // try as int first + Int32 i = (Int32)PyLong_AsLong(number); + if (!PyErr_Occurred()) + { + self->fThis->AddVarNumber(name, i); + } + else + { + // OverflowError, try float + PyErr_Clear(); + self->fThis->AddVarNumber(name, (float)PyLong_AsDouble(number)); + } + } else if (PyNumber_Check(number)) { PyObject* f = PyNumber_Float(number); From 8e43df15b117ce6850bf2eaefae416484f2de83e Mon Sep 17 00:00:00 2001 From: Christian Walther Date: Wed, 18 Apr 2012 20:45:52 +0200 Subject: [PATCH 17/21] More 'const', so that Rotate(vector) can be called on a const hsQuat&. --- .../Plasma20/Sources/Plasma/CoreLib/hsQuat.cpp | 4 ++-- .../Plasma20/Sources/Plasma/CoreLib/hsQuat.h | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/CoreLib/hsQuat.cpp b/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/CoreLib/hsQuat.cpp index 8c7c4353..64d6c18e 100644 --- a/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/CoreLib/hsQuat.cpp +++ b/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/CoreLib/hsQuat.cpp @@ -65,14 +65,14 @@ hsQuat::hsQuat(hsScalar rad, const hsVector3* axis) fZ = axis->fZ*s; } -hsQuat hsQuat::Inverse() +hsQuat hsQuat::Inverse() const { hsQuat q2 = Conjugate(); hsScalar msInv = 1.0f/q2.MagnitudeSquared(); return (q2 * msInv); } -hsPoint3 hsQuat::Rotate(const hsScalarTriple* v) +hsPoint3 hsQuat::Rotate(const hsScalarTriple* v) const { hsQuat qInv = Inverse(); hsQuat qVec(v->fX, v->fY, v->fZ, 0); diff --git a/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/CoreLib/hsQuat.h b/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/CoreLib/hsQuat.h index 8fe5afda..7d4cb54f 100644 --- a/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/CoreLib/hsQuat.h +++ b/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/CoreLib/hsQuat.h @@ -71,7 +71,7 @@ public: { fX = X; fY = Y; fZ = Z; fW = W; } void GetAngleAxis(hsScalar *rad, hsVector3 *axis) const; void SetAngleAxis(const hsScalar rad, const hsVector3 &axis); - hsPoint3 Rotate(const hsScalarTriple* v); + hsPoint3 Rotate(const hsScalarTriple* v) const; // Access operators hsScalar& operator[](int i) { return (&fX)[i]; } @@ -94,7 +94,7 @@ public: hsScalar MagnitudeSquared(); hsQuat Conjugate() const { return hsQuat(-fX,-fY,-fZ,fW); } - hsQuat Inverse(); + hsQuat Inverse() const; // Binary operators hsQuat operator-(const hsQuat&) const; hsQuat operator+(const hsQuat&) const; From fba99c4cb1a24bbfae6287073823ce2e56420212 Mon Sep 17 00:00:00 2001 From: Christian Walther Date: Wed, 18 Apr 2012 20:51:14 +0200 Subject: [PATCH 18/21] Convert the impact velocity to avatar-local coordinates, because that's what {Running|Ground}Impact::PreCondition() expects. Fixes landing animations depending on what direction relative to the age you jump rather than whether you land forward or straight down. --- .../Sources/Plasma/PubUtilLib/plAvatar/plAvCallbackAction.cpp | 2 ++ .../Plasma/PubUtilLib/plAvatar/plPhysicalControllerCore.h | 1 + 2 files changed, 3 insertions(+) diff --git a/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/PubUtilLib/plAvatar/plAvCallbackAction.cpp b/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/PubUtilLib/plAvatar/plAvCallbackAction.cpp index b8320585..c192f3b9 100644 --- a/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/PubUtilLib/plAvatar/plAvCallbackAction.cpp +++ b/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/PubUtilLib/plAvatar/plAvCallbackAction.cpp @@ -137,6 +137,8 @@ void plWalkingController::RecalcVelocity(double timeNow, double timePrev, hsBool // LinearVelocity is always (0,0,0) outside the PhysController fImpactTime = fWalkingStrategy->GetAirTime(); fImpactVelocity = fController->GetAchievedLinearVelocity(); + // convert orientation from subworld to avatar-local coordinates + fImpactVelocity = (hsVector3)fController->GetLocalRotation().Rotate(&fImpactVelocity); fClearImpact = false; } else diff --git a/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/PubUtilLib/plAvatar/plPhysicalControllerCore.h b/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/PubUtilLib/plAvatar/plPhysicalControllerCore.h index 4feae67a..bc96f697 100644 --- a/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/PubUtilLib/plAvatar/plPhysicalControllerCore.h +++ b/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/PubUtilLib/plAvatar/plPhysicalControllerCore.h @@ -147,6 +147,7 @@ public: virtual void CheckAndHandleAnyStateChanges(); virtual void UpdateSubstepNonPhysical(); virtual const hsPoint3& GetLocalPosition()=0; + const hsQuat& GetLocalRotation() { return fLocalRotation; } virtual void MoveActorToSim(); virtual void OverrideAchievedVelocity(hsVector3 newAchievedVel) From bf6d2a4459214d5ba2bd1bafe15a5af7e5da6c36 Mon Sep 17 00:00:00 2001 From: Bartek Bok Date: Fri, 27 Apr 2012 21:50:33 +0200 Subject: [PATCH 19/21] Always copy terminating NULL when pasting --- .../Sources/Plasma/FeatureLib/pfGameGUIMgr/pfGUIEditBoxMod.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/FeatureLib/pfGameGUIMgr/pfGUIEditBoxMod.cpp b/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/FeatureLib/pfGameGUIMgr/pfGUIEditBoxMod.cpp index 66b8c3db..10083906 100644 --- a/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/FeatureLib/pfGameGUIMgr/pfGUIEditBoxMod.cpp +++ b/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/FeatureLib/pfGameGUIMgr/pfGUIEditBoxMod.cpp @@ -517,7 +517,7 @@ hsBool pfGUIEditBoxMod::HandleKeyEvent( pfGameGUIMgr::EventType event, plKeyDef if (len > 0) { wchar_t* insertTarget = fBuffer + fCursorPos; - size_t bufferTailLen = wcslen(insertTarget); + size_t bufferTailLen = wcslen(insertTarget) + 1; //include terminating \0 if (fCursorPos + len + bufferTailLen < fBufferSize) { memmove(insertTarget + len, insertTarget, bufferTailLen * sizeof(wchar_t)); From 136c27c7f3bed150c25a17596a287493f31c39e0 Mon Sep 17 00:00:00 2001 From: CyanWorlds Date: Wed, 9 May 2012 16:56:29 -0700 Subject: [PATCH 20/21] Bump build ID to current --- .../Sources/Plasma/NucleusLib/pnProduct/Private/pnPrBuildId.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/NucleusLib/pnProduct/Private/pnPrBuildId.cpp b/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/NucleusLib/pnProduct/Private/pnPrBuildId.cpp index efb80dab..03351963 100644 --- a/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/NucleusLib/pnProduct/Private/pnPrBuildId.cpp +++ b/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/NucleusLib/pnProduct/Private/pnPrBuildId.cpp @@ -57,7 +57,7 @@ You can contact Cyan Worlds, Inc. by email legal@cyan.com // This line must NEVER be modified manually; it is automatically updated // by the build server. -#define BUILD_ID 902 +#define BUILD_ID 906 COMPILER_ASSERT(BUILD_ID != 0);