From cf9cd1c239ad7d2b20a693841d9e5350abb2d7df Mon Sep 17 00:00:00 2001 From: SIELA1915 Date: Sat, 16 Jan 2016 17:31:54 +0100 Subject: [PATCH] Changed icons for Unix and name. --- code/ryzom/client/src/commands.cpp | 8422 ++++++++--------- code/ryzom/client/unix/khanat_128x128.png | Bin 0 -> 19082 bytes code/ryzom/client/unix/khanat_16x16.png | Bin 0 -> 1484 bytes code/ryzom/client/unix/khanat_22x22.png | Bin 0 -> 2111 bytes code/ryzom/client/unix/khanat_24x24.png | Bin 0 -> 2361 bytes code/ryzom/client/unix/khanat_256x256.png | Bin 0 -> 40094 bytes code/ryzom/client/unix/khanat_32x32.png | Bin 0 -> 3404 bytes code/ryzom/client/unix/khanat_48x48.png | Bin 0 -> 5660 bytes code/ryzom/client/unix/khanat_64x64.png | Bin 0 -> 8468 bytes code/ryzom/client/unix/khanat_client.png | Bin 0 -> 5660 bytes code/ryzom/client/unix/khanat_logo_color.png | Bin 0 -> 63092 bytes .../ryzom/client/unix/ryzom_client.desktop.in | 8 +- 12 files changed, 4210 insertions(+), 4220 deletions(-) create mode 100644 code/ryzom/client/unix/khanat_128x128.png create mode 100644 code/ryzom/client/unix/khanat_16x16.png create mode 100644 code/ryzom/client/unix/khanat_22x22.png create mode 100644 code/ryzom/client/unix/khanat_24x24.png create mode 100644 code/ryzom/client/unix/khanat_256x256.png create mode 100644 code/ryzom/client/unix/khanat_32x32.png create mode 100644 code/ryzom/client/unix/khanat_48x48.png create mode 100644 code/ryzom/client/unix/khanat_64x64.png create mode 100644 code/ryzom/client/unix/khanat_client.png create mode 100644 code/ryzom/client/unix/khanat_logo_color.png diff --git a/code/ryzom/client/src/commands.cpp b/code/ryzom/client/src/commands.cpp index 572e2e620..512679758 100644 --- a/code/ryzom/client/src/commands.cpp +++ b/code/ryzom/client/src/commands.cpp @@ -145,11 +145,11 @@ static std::vector ShapeAddedByCommand; // list of shapes added with // Function to release all things allocated for commands. void releaseCommands() { - if(LDPrim) - { - delete LDPrim; - LDPrim = 0; - } + if(LDPrim) + { + delete LDPrim; + LDPrim = 0; + } } ////////////// @@ -159,181 +159,181 @@ void releaseCommands() // 'follow' : To Follow the target. NLMISC_COMMAND(follow, "Follow the target", "") { - // switch - if(UserEntity->follow()) - UserEntity->disableFollow(); - else - // enable follow, reseting the camera rotation - UserEntity->enableFollow(true); - return true; + // switch + if(UserEntity->follow()) + UserEntity->disableFollow(); + else + // enable follow, reseting the camera rotation + UserEntity->enableFollow(true); + return true; } NLMISC_COMMAND(where, "Ask information on the position", "") { - // Check parameters. - if(args.size() == 0) - { // Create the message and send. - const string msgName = "COMMAND:WHERE"; - CBitMemStream out; - if(GenericMsgHeaderMngr.pushNameToStream(msgName, out)) - { - NetMngr.push(out); + // Check parameters. + if(args.size() == 0) + { // Create the message and send. + const string msgName = "COMMAND:WHERE"; + CBitMemStream out; + if(GenericMsgHeaderMngr.pushNameToStream(msgName, out)) + { + NetMngr.push(out); + } + else + nlwarning("command 'where': unknown message named '%s'", msgName.c_str()); + return true; } - else - nlwarning("command 'where': unknown message named '%s'", msgName.c_str()); - return true; - } - return false; + return false; } NLMISC_COMMAND(who, "Display all players currently in region","[]") { - // Check parameters. - if(args.size() > 1) - return false; + // Check parameters. + if(args.size() > 1) + return false; - CBitMemStream out; - if(!GenericMsgHeaderMngr.pushNameToStream("DEBUG:WHO", out)) - { - nlwarning("Unknown message name DEBUG:WHO"); - return false; - } + CBitMemStream out; + if(!GenericMsgHeaderMngr.pushNameToStream("DEBUG:WHO", out)) + { + nlwarning("Unknown message name DEBUG:WHO"); + return false; + } - string opt; - if ( args.size() == 1 ) - { - opt = args[0]; - } - out.serial(opt); - NetMngr.push(out); - return true; + string opt; + if ( args.size() == 1 ) + { + opt = args[0]; + } + out.serial(opt); + NetMngr.push(out); + return true; } NLMISC_COMMAND(afk, "Set the player as 'away from keyboard'","[]") { - string customText; - if( args.size() > 0 ) - { - customText = args[0]; - } - for(uint i = 1; i < args.size(); ++i ) - { - customText += " "; - customText += args[i]; - } + string customText; + if( args.size() > 0 ) + { + customText = args[0]; + } + for(uint i = 1; i < args.size(); ++i ) + { + customText += " "; + customText += args[i]; + } - if (UserEntity != NULL) - UserEntity->setAFK(true,customText); - /* - CBitMemStream out; - if(!GenericMsgHeaderMngr.pushNameToStream("DEBUG:AFK", out)) - { - nlwarning("Unknown message name DEBUG:AFK"); - return false; - } - NetMngr.push(out); - */ - return true; + if (UserEntity != NULL) + UserEntity->setAFK(true,customText); +/* + CBitMemStream out; + if(!GenericMsgHeaderMngr.pushNameToStream("DEBUG:AFK", out)) + { + nlwarning("Unknown message name DEBUG:AFK"); + return false; + } + NetMngr.push(out); +*/ + return true; } bool randomCheckCharset(std::string const& str) { - std::string::const_iterator it, itEnd = str.end(); - for (it=str.begin(); it!=itEnd; ++it) - if (*it<'0' || *it>'9') - return false; - return true; + std::string::const_iterator it, itEnd = str.end(); + for (it=str.begin(); it!=itEnd; ++it) + if (*it<'0' || *it>'9') + return false; + return true; } // returns true if a<=b bool randomLexicographicLess(std::string a, std::string b) { - // Remove leading zeros - while (a.length()>1 && a[0]=='0') - a = a.substr(1); - while (b.length()>1 && b[0]=='0') - b = b.substr(1); - // Longest is the biggest - if (a.length()>b.length()) - return false; - if (a.length()1 && a[0]=='0') + a = a.substr(1); + while (b.length()>1 && b[0]=='0') + b = b.substr(1); + // Longest is the biggest + if (a.length()>b.length()) + return false; + if (a.length()0) return false; - if (!negative && max<0) return false; - // Check number is not too big nor too small with a lexicographic compare - std::string smin = NLMISC::toString(std::max(min,-min)); - std::string smax = NLMISC::toString(std::max(max,-max)); - bool tooSmall = false, tooBig = false; - if (min>=0 && randomLexicographicLess(sAbsVal, smin)) - tooSmall = true; - if (min<0 && randomLexicographicLess(smin, sAbsVal)) - tooSmall = true; - if (max>=0 && randomLexicographicLess(smax, sAbsVal)) - tooBig = true; - if (max<0 && randomLexicographicLess(sAbsVal, smax)) - tooBig = true; - if (!tooSmall && !tooBig) - { - NLMISC::fromString(str, val); - return true; - } - else - return false; + bool negative = str[0]=='-'; + std::string sAbsVal = str.substr(negative?1:0); + // Check we have only numerical characters + if (!randomCheckCharset(sAbsVal)) + return false; + // Check sign + if (negative && min>0) return false; + if (!negative && max<0) return false; + // Check number is not too big nor too small with a lexicographic compare + std::string smin = NLMISC::toString(std::max(min,-min)); + std::string smax = NLMISC::toString(std::max(max,-max)); + bool tooSmall = false, tooBig = false; + if (min>=0 && randomLexicographicLess(sAbsVal, smin)) + tooSmall = true; + if (min<0 && randomLexicographicLess(smin, sAbsVal)) + tooSmall = true; + if (max>=0 && randomLexicographicLess(smax, sAbsVal)) + tooBig = true; + if (max<0 && randomLexicographicLess(sAbsVal, smax)) + tooBig = true; + if (!tooSmall && !tooBig) + { + NLMISC::fromString(str, val); + return true; + } + else + return false; } NLMISC_COMMAND(random, "Roll a dice and say the result around","[] ") { - // Check parameters. - if (args.size()<1 || args.size()>2) - return false; + // Check parameters. + if (args.size()<1 || args.size()>2) + return false; - sint16 min = 1; - sint16 max; - if (!randomFromString(args[0], max)) - { - CInterfaceManager *pIM = CInterfaceManager::getInstance(); - ucstring msg = CI18N::get("uiRandomBadParameter"); - strFindReplace(msg, "%s", args[0] ); - pIM->displaySystemInfo(msg); - return false; - } - if (args.size()==2) - { - if (!randomFromString(args[1], min)) + sint16 min = 1; + sint16 max; + if (!randomFromString(args[0], max)) { - CInterfaceManager *pIM = CInterfaceManager::getInstance(); - ucstring msg = CI18N::get("uiRandomBadParameter"); - strFindReplace(msg, "%s", args[0] ); - pIM->displaySystemInfo(msg); - return false; + CInterfaceManager *pIM = CInterfaceManager::getInstance(); + ucstring msg = CI18N::get("uiRandomBadParameter"); + strFindReplace(msg, "%s", args[0] ); + pIM->displaySystemInfo(msg); + return false; } - } - if (min>max) - std::swap(min, max); + if (args.size()==2) + { + if (!randomFromString(args[1], min)) + { + CInterfaceManager *pIM = CInterfaceManager::getInstance(); + ucstring msg = CI18N::get("uiRandomBadParameter"); + strFindReplace(msg, "%s", args[0] ); + pIM->displaySystemInfo(msg); + return false; + } + } + if (min>max) + std::swap(min, max); - if (UserEntity != NULL) - UserEntity->rollDice(min, max); + if (UserEntity != NULL) + UserEntity->rollDice(min, max); - return true; + return true; } //----------------------------------------------- @@ -341,59 +341,59 @@ NLMISC_COMMAND(random, "Roll a dice and say the result around","[] ") //----------------------------------------------- NLMISC_COMMAND(dumpShapePos, "Dump Last Added Shape Pos.", "") { -#if FINAL_VERSION - if (!hasPrivilegeDEV() && - !hasPrivilegeSGM() && - !hasPrivilegeGM() && - !hasPrivilegeVG() && - !hasPrivilegeSG() && - !hasPrivilegeG() && - !hasPrivilegeEM() && - !hasPrivilegeEG()) - return true; -#endif // FINAL_VERSION + #if FINAL_VERSION + if (!hasPrivilegeDEV() && + !hasPrivilegeSGM() && + !hasPrivilegeGM() && + !hasPrivilegeVG() && + !hasPrivilegeSG() && + !hasPrivilegeG() && + !hasPrivilegeEM() && + !hasPrivilegeEG()) + return true; + #endif // FINAL_VERSION - if (ShapeAddedByCommand.empty()) - { - nlwarning("No shape created yet"); - return false; - } + if (ShapeAddedByCommand.empty()) + { + nlwarning("No shape created yet"); + return false; + } - CInterfaceManager *IM = CInterfaceManager::getInstance(); - CVector pos = ShapeAddedByCommand.back().getPos(); - IM->displaySystemInfo(ucstring(toString("Shape Pos = %f, %f, %f", pos.x, pos.y, pos.z))); - return true; + CInterfaceManager *IM = CInterfaceManager::getInstance(); + CVector pos = ShapeAddedByCommand.back().getPos(); + IM->displaySystemInfo(ucstring(toString("Shape Pos = %f, %f, %f", pos.x, pos.y, pos.z))); + return true; } //----------------------------------------------- // 'clearShape' : Remove all shapes added with the 'shape' command //----------------------------------------------- NLMISC_COMMAND(clearShape, "Remove all shapes added with the 'shape' command.", "") { -#if FINAL_VERSION - /*if (!hasPrivilegeDEV() && - !hasPrivilegeSGM() && - !hasPrivilegeGM() && - !hasPrivilegeVG() && - !hasPrivilegeSG() && - !hasPrivilegeG() && - !hasPrivilegeEM() && - !hasPrivilegeEG()) - return true;*/ -#endif // FINAL_VERSION + #if FINAL_VERSION + /*if (!hasPrivilegeDEV() && + !hasPrivilegeSGM() && + !hasPrivilegeGM() && + !hasPrivilegeVG() && + !hasPrivilegeSG() && + !hasPrivilegeG() && + !hasPrivilegeEM() && + !hasPrivilegeEG()) + return true;*/ + #endif // FINAL_VERSION - if (ShapeAddedByCommand.empty()) - { - nlwarning("No shape created yet"); - return false; - } + if (ShapeAddedByCommand.empty()) + { + nlwarning("No shape created yet"); + return false; + } - if (!Scene) return false; - for(uint k = 0; k < ShapeAddedByCommand.size(); ++k) - { - Scene->deleteInstance(ShapeAddedByCommand[k]); - } - ShapeAddedByCommand.clear(); - return true; + if (!Scene) return false; + for(uint k = 0; k < ShapeAddedByCommand.size(); ++k) + { + Scene->deleteInstance(ShapeAddedByCommand[k]); + } + ShapeAddedByCommand.clear(); + return true; } //----------------------------------------------------- @@ -401,43 +401,43 @@ NLMISC_COMMAND(clearShape, "Remove all shapes added with the 'shape' command.", //----------------------------------------------------- NLMISC_COMMAND(setShapeX, "Set X position for last created shape.", "") { -#if FINAL_VERSION - /*if (!hasPrivilegeDEV() && - !hasPrivilegeSGM() && - !hasPrivilegeGM() && - !hasPrivilegeVG() && - !hasPrivilegeSG() && - !hasPrivilegeG() && - !hasPrivilegeEM() && - !hasPrivilegeEG()) - return true;*/ -#endif // FINAL_VERSION + #if FINAL_VERSION + /*if (!hasPrivilegeDEV() && + !hasPrivilegeSGM() && + !hasPrivilegeGM() && + !hasPrivilegeVG() && + !hasPrivilegeSG() && + !hasPrivilegeG() && + !hasPrivilegeEM() && + !hasPrivilegeEG()) + return true;*/ + #endif // FINAL_VERSION - if (args.size() != 1) return false; - if (ShapeAddedByCommand.empty()) - { - nlwarning("No shape created yet"); - return false; - } - float coord; - bool valid_coord; - if (args[0][0] == '+') - valid_coord = fromString(args[0].substr(1), coord); - else - valid_coord = fromString(args[0], coord); + if (args.size() != 1) return false; + if (ShapeAddedByCommand.empty()) + { + nlwarning("No shape created yet"); + return false; + } + float coord; + bool valid_coord; + if (args[0][0] == '+') + valid_coord = fromString(args[0].substr(1), coord); + else + valid_coord = fromString(args[0], coord); - if (!valid_coord) - { - nlwarning("Can't get position"); - return false; - } - CVector pos = ShapeAddedByCommand.back().getPos(); - if (args[0][0] == '+') - pos.x += coord; - else - pos.x = coord; - ShapeAddedByCommand.back().setPos(pos); - return true; + if (!valid_coord) + { + nlwarning("Can't get position"); + return false; + } + CVector pos = ShapeAddedByCommand.back().getPos(); + if (args[0][0] == '+') + pos.x += coord; + else + pos.x = coord; + ShapeAddedByCommand.back().setPos(pos); + return true; } //----------------------------------------------------- @@ -445,43 +445,43 @@ NLMISC_COMMAND(setShapeX, "Set X position for last created shape.", "") { -#if FINAL_VERSION - /*if (!hasPrivilegeDEV() && - !hasPrivilegeSGM() && - !hasPrivilegeGM() && - !hasPrivilegeVG() && - !hasPrivilegeSG() && - !hasPrivilegeG() && - !hasPrivilegeEM() && - !hasPrivilegeEG()) - return true;*/ -#endif // FINAL_VERSION + #if FINAL_VERSION + /*if (!hasPrivilegeDEV() && + !hasPrivilegeSGM() && + !hasPrivilegeGM() && + !hasPrivilegeVG() && + !hasPrivilegeSG() && + !hasPrivilegeG() && + !hasPrivilegeEM() && + !hasPrivilegeEG()) + return true;*/ + #endif // FINAL_VERSION - if (args.size() != 1) return false; - if (ShapeAddedByCommand.empty()) - { - nlwarning("No shape created yet"); - return false; - } - float coord; - bool valid_coord; - if (args[0][0] == '+') - valid_coord = fromString(args[0].substr(1), coord); - else - valid_coord = fromString(args[0], coord); + if (args.size() != 1) return false; + if (ShapeAddedByCommand.empty()) + { + nlwarning("No shape created yet"); + return false; + } + float coord; + bool valid_coord; + if (args[0][0] == '+') + valid_coord = fromString(args[0].substr(1), coord); + else + valid_coord = fromString(args[0], coord); - if (!valid_coord) - { - nlwarning("Can't get position"); - return false; - } - CVector pos = ShapeAddedByCommand.back().getPos(); - if (args[0][0] == '+') - pos.y += coord; - else - pos.y = coord; - ShapeAddedByCommand.back().setPos(pos); - return true; + if (!valid_coord) + { + nlwarning("Can't get position"); + return false; + } + CVector pos = ShapeAddedByCommand.back().getPos(); + if (args[0][0] == '+') + pos.y += coord; + else + pos.y = coord; + ShapeAddedByCommand.back().setPos(pos); + return true; } //----------------------------------------------------- @@ -489,43 +489,43 @@ NLMISC_COMMAND(setShapeY, "Set Y position for last created shape.", "") { -#if FINAL_VERSION - /*if (!hasPrivilegeDEV() && - !hasPrivilegeSGM() && - !hasPrivilegeGM() && - !hasPrivilegeVG() && - !hasPrivilegeSG() && - !hasPrivilegeG() && - !hasPrivilegeEM() && - !hasPrivilegeEG()) - return true;*/ -#endif // FINAL_VERSION + #if FINAL_VERSION + /*if (!hasPrivilegeDEV() && + !hasPrivilegeSGM() && + !hasPrivilegeGM() && + !hasPrivilegeVG() && + !hasPrivilegeSG() && + !hasPrivilegeG() && + !hasPrivilegeEM() && + !hasPrivilegeEG()) + return true;*/ + #endif // FINAL_VERSION - if (args.size() != 1) return false; - if (ShapeAddedByCommand.empty()) - { - nlwarning("No shape created yet"); - return false; - } - float coord; - bool valid_coord; - if (args[0][0] == '+') - valid_coord = fromString(args[0].substr(1), coord); - else - valid_coord = fromString(args[0], coord); + if (args.size() != 1) return false; + if (ShapeAddedByCommand.empty()) + { + nlwarning("No shape created yet"); + return false; + } + float coord; + bool valid_coord; + if (args[0][0] == '+') + valid_coord = fromString(args[0].substr(1), coord); + else + valid_coord = fromString(args[0], coord); - if (!valid_coord) - { - nlwarning("Can't get position"); - return false; - } - CVector pos = ShapeAddedByCommand.back().getPos(); - if (args[0][0] == '+') - pos.z += coord; - else - pos.z = coord; - ShapeAddedByCommand.back().setPos(pos); - return true; + if (!valid_coord) + { + nlwarning("Can't get position"); + return false; + } + CVector pos = ShapeAddedByCommand.back().getPos(); + if (args[0][0] == '+') + pos.z += coord; + else + pos.z = coord; + ShapeAddedByCommand.back().setPos(pos); + return true; } @@ -534,41 +534,41 @@ NLMISC_COMMAND(setShapeZ, "Set Z position for last created shape.", "") { -#if FINAL_VERSION - /*if (!hasPrivilegeDEV() && - !hasPrivilegeSGM() && - !hasPrivilegeGM() && - !hasPrivilegeVG() && - !hasPrivilegeSG() && - !hasPrivilegeG() && - !hasPrivilegeEM() && - !hasPrivilegeEG()) - return true;*/ -#endif // FINAL_VERSION + #if FINAL_VERSION + /*if (!hasPrivilegeDEV() && + !hasPrivilegeSGM() && + !hasPrivilegeGM() && + !hasPrivilegeVG() && + !hasPrivilegeSG() && + !hasPrivilegeG() && + !hasPrivilegeEM() && + !hasPrivilegeEG()) + return true;*/ + #endif // FINAL_VERSION - if (args.size() != 1) return false; - if (ShapeAddedByCommand.empty()) - { - nlwarning("No shape created yet"); - return false; - } - float angle; - if (!fromString(args[0], angle)) - { - nlwarning("Can't get angle"); - return false; - } + if (args.size() != 1) return false; + if (ShapeAddedByCommand.empty()) + { + nlwarning("No shape created yet"); + return false; + } + float angle; + if (!fromString(args[0], angle)) + { + nlwarning("Can't get angle"); + return false; + } - CMatrix dir; - dir.identity(); - CVector vangle = CVector(sin(angle), cos(angle), 0.f); - CVector vi = vangle^CVector(0.f, 0.f, 1.f); - CVector vk = vi^vangle; - dir.setRot(vi, vangle, vk, true); - // Set Orientation : User Direction should be normalized. - ShapeAddedByCommand.back().setRotQuat(dir.getRot()); + CMatrix dir; + dir.identity(); + CVector vangle = CVector(sin(angle), cos(angle), 0.f); + CVector vi = vangle^CVector(0.f, 0.f, 1.f); + CVector vk = vi^vangle; + dir.setRot(vi, vangle, vk, true); + // Set Orientation : User Direction should be normalized. + ShapeAddedByCommand.back().setRotQuat(dir.getRot()); - return true; + return true; } @@ -577,156 +577,156 @@ NLMISC_COMMAND(setShapeDir, "Set direction angle for last created shape.", "") { -#if FINAL_VERSION - /* if (!hasPrivilegeDEV() && - !hasPrivilegeSGM() && - !hasPrivilegeGM() && - !hasPrivilegeVG() && - !hasPrivilegeSG() && - !hasPrivilegeG() && - !hasPrivilegeEM() && - !hasPrivilegeEG()) - return true;*/ -#endif // FINAL_VERSION + #if FINAL_VERSION +/* if (!hasPrivilegeDEV() && + !hasPrivilegeSGM() && + !hasPrivilegeGM() && + !hasPrivilegeVG() && + !hasPrivilegeSG() && + !hasPrivilegeG() && + !hasPrivilegeEM() && + !hasPrivilegeEG()) + return true;*/ + #endif // FINAL_VERSION - if(args.size() < 1) - { - nlwarning("Command 'shape': need at least 1 parameter, try '/help shape' for more details."); - return false; - } - if (!Scene) - { - nlwarning("No scene available"); - return false; - } - UInstance instance = Scene->createInstance(args[0]); - if(!instance.empty()) - { - ShapeAddedByCommand.push_back(instance); - // Set the position - instance.setPos(UserEntity->pos()); - instance.setClusterSystem(UserEntity->getClusterSystem()); // for simplicity, assume it is in the same - // cluster system than the user - // Compute the direction Matrix - CMatrix dir; - dir.identity(); - CVector vi = UserEntity->dir()^CVector(0.f, 0.f, 1.f); - CVector vk = vi^UserEntity->dir(); - dir.setRot(vi, UserEntity->dir(), vk, true); - // Set Orientation : User Direction should be normalized. - instance.setRotQuat(dir.getRot()); - // if the shape is a particle system, additionnal parameters are user params - UParticleSystemInstance psi; - psi.cast (instance); - if (!psi.empty()) + if(args.size() < 1) { - // set each user param that is present - for(uint k = 0; k < 4; ++k) - { - if (args.size() >= (k + 2)) - { - float uparam; - if (fromString(args[k + 1], uparam)) - { - psi.setUserParam(k, uparam); - } - else - { - nlwarning("Cant read param %d", k); - } - } - } + nlwarning("Command 'shape': need at least 1 parameter, try '/help shape' for more details."); + return false; + } + if (!Scene) + { + nlwarning("No scene available"); + return false; + } + UInstance instance = Scene->createInstance(args[0]); + if(!instance.empty()) + { + ShapeAddedByCommand.push_back(instance); + // Set the position + instance.setPos(UserEntity->pos()); + instance.setClusterSystem(UserEntity->getClusterSystem()); // for simplicity, assume it is in the same + // cluster system than the user + // Compute the direction Matrix + CMatrix dir; + dir.identity(); + CVector vi = UserEntity->dir()^CVector(0.f, 0.f, 1.f); + CVector vk = vi^UserEntity->dir(); + dir.setRot(vi, UserEntity->dir(), vk, true); + // Set Orientation : User Direction should be normalized. + instance.setRotQuat(dir.getRot()); + // if the shape is a particle system, additionnal parameters are user params + UParticleSystemInstance psi; + psi.cast (instance); + if (!psi.empty()) + { + // set each user param that is present + for(uint k = 0; k < 4; ++k) + { + if (args.size() >= (k + 2)) + { + float uparam; + if (fromString(args[k + 1], uparam)) + { + psi.setUserParam(k, uparam); + } + else + { + nlwarning("Cant read param %d", k); + } + } + } + } + } + else + { + nlwarning("Command 'shape': cannot find the shape %s.", args[0].c_str()); } - } - else - { - nlwarning("Command 'shape': cannot find the shape %s.", args[0].c_str()); - } - // Command Well Done - return true; + // Command Well Done + return true; } NLMISC_COMMAND(bugReport, "Call the bug report tool with dump", "") { - const char *brname[] = { "bug_report.exe", "bug_report_r.exe", "bug_report_rd.exe", "bug_report_df.exe", "bug_report_d.exe" }; + const char *brname[] = { "bug_report.exe", "bug_report_r.exe", "bug_report_rd.exe", "bug_report_df.exe", "bug_report_d.exe" }; - string brn; + string brn; - for (uint i = 0; i < sizeof(brname)/sizeof(brname[0]); i++) - { - if (CFile::fileExists (brname[i])) + for (uint i = 0; i < sizeof(brname)/sizeof(brname[0]); i++) { - brn = brname[i]; - break; + if (CFile::fileExists (brname[i])) + { + brn = brname[i]; + break; + } } - } - if (brn.empty()) - { - log.displayNL("bug_report*.exe not found"); - return false; - } + if (brn.empty()) + { + log.displayNL("bug_report*.exe not found"); + return false; + } - string sys; + string sys; - sys = "Language "+CI18N::getCurrentLanguageName().toString() +" "; + sys = "Language "+CI18N::getCurrentLanguageName().toString() +" "; - if (args.size()>0) - { - uint8 quality; - fromString(args[0], quality); - if (quality == 0) - quality = 80; + if (args.size()>0) + { + uint8 quality; + fromString(args[0], quality); + if (quality == 0) + quality = 80; - CBitmap btm; - Driver->getBuffer(btm); - string filename = CFile::findNewFile (getLogDirectory() + "screenshot.jpg"); - COFile fs(filename); - btm.writeJPG(fs, quality); - sys += "AttachedFile "+filename+" "; - } + CBitmap btm; + Driver->getBuffer(btm); + string filename = CFile::findNewFile (getLogDirectory() + "screenshot.jpg"); + COFile fs(filename); + btm.writeJPG(fs, quality); + sys += "AttachedFile "+filename+" "; + } - sys += NLMISC::toString("ClientVersion %s ", getVersion().c_str()); + sys += NLMISC::toString("ClientVersion %s ", getVersion().c_str()); - // for now, set the same version than client one - sys += NLMISC::toString("ShardVersion %s ", getVersion().c_str()); + // for now, set the same version than client one + sys += NLMISC::toString("ShardVersion %s ", getVersion().c_str()); - if (ClientCfg.Local) - sys += "ShardName OFFLINE "; + if (ClientCfg.Local) + sys += "ShardName OFFLINE "; - FILE *fp = fopen (std::string(getLogDirectory() + "bug_report.txt").c_str(), "wb"); - if (fp != NULL) - { - string res = addSlashR(getDebugInformation()); + FILE *fp = fopen (std::string(getLogDirectory() + "bug_report.txt").c_str(), "wb"); + if (fp != NULL) + { + string res = addSlashR(getDebugInformation()); - // must put \r\n each line - fprintf(fp, "%s", res.c_str()); + // must put \r\n each line + fprintf(fp, "%s", res.c_str()); - // // must put \r\n each line - // fprintf (fp, "UserId: %u\r\n", NetMngr.getUserId()); - // fprintf (fp, "Player Name: '%s'.\r\n", UserEntity->getName().toString().c_str()); - // fprintf (fp, "UserPosition: %.2f %.2f %.2f\r\n", UserEntity->pos().x, UserEntity->pos().y, UserEntity->pos().z); - // fprintf (fp, "ViewPosition: %.2f %.2f %.2f\r\n", View.viewPos().x, View.viewPos().y, View.viewPos().z); - // time_t ts; time( &ts ); - // fprintf (fp, "LocalTime: %s\r\n", NLMISC::IDisplayer::dateToHumanString( ts ) ); - // fprintf (fp, "ServerTick: %u\r\n", NetMngr.getCurrentServerTick()); - // fprintf (fp, "ConnectState: %s\r\n", NetMngr.getConnectionStateCStr()); - // fprintf (fp, "LocalAddress: %s\r\n", NetMngr.getAddress().asString().c_str()); +// // must put \r\n each line +// fprintf (fp, "UserId: %u\r\n", NetMngr.getUserId()); +// fprintf (fp, "Player Name: '%s'.\r\n", UserEntity->getName().toString().c_str()); +// fprintf (fp, "UserPosition: %.2f %.2f %.2f\r\n", UserEntity->pos().x, UserEntity->pos().y, UserEntity->pos().z); +// fprintf (fp, "ViewPosition: %.2f %.2f %.2f\r\n", View.viewPos().x, View.viewPos().y, View.viewPos().z); +// time_t ts; time( &ts ); +// fprintf (fp, "LocalTime: %s\r\n", NLMISC::IDisplayer::dateToHumanString( ts ) ); +// fprintf (fp, "ServerTick: %u\r\n", NetMngr.getCurrentServerTick()); +// fprintf (fp, "ConnectState: %s\r\n", NetMngr.getConnectionStateCStr()); +// fprintf (fp, "LocalAddress: %s\r\n", NetMngr.getAddress().asString().c_str()); - fclose (fp); + fclose (fp); - sys += "DumpFilename bug_report.txt "; - } + sys += "DumpFilename bug_report.txt "; + } - nlinfo ("Calling for bug report : '%s %s'", brn.c_str(), sys.c_str()); + nlinfo ("Calling for bug report : '%s %s'", brn.c_str(), sys.c_str()); - launchProgram(brn, sys); + launchProgram(brn, sys); - // give some cpu to the launched application - nlSleep (3000); + // give some cpu to the launched application + nlSleep (3000); - return true; + return true; } // @@ -738,39 +738,39 @@ NLMISC_COMMAND(bugReport, "Call the bug report tool with dump", " NLMISC_COMMAND(a, "Execute an admin command on you"," ") { - if(args.size() == 0) - return false; + if(args.size() == 0) + return false; - CBitMemStream out; - if (!GenericMsgHeaderMngr.pushNameToStream("COMMAND:ADMIN", out)) - return false; + CBitMemStream out; + if (!GenericMsgHeaderMngr.pushNameToStream("COMMAND:ADMIN", out)) + return false; - string cmd, arg; - cmd = args[0]; - for (uint i = 1; i < args.size(); i++) - { - // temporary fix for utf-8 - // servers commands are not decoded so convert them to ansi - std::string tmp = ucstring::makeFromUtf8(args[i]).toString(); - - if (!arg.empty()) - arg += ' '; - if (tmp.find(' ') != std::string::npos) + string cmd, arg; + cmd = args[0]; + for (uint i = 1; i < args.size(); i++) { - arg += "\"" + tmp + "\""; - } - else - { - arg += tmp; - } - } - bool onTarget = false; - out.serial (onTarget); - out.serial (cmd); - out.serial (arg); - NetMngr.push (out); + // temporary fix for utf-8 + // servers commands are not decoded so convert them to ansi + std::string tmp = ucstring::makeFromUtf8(args[i]).toString(); - return true; + if (!arg.empty()) + arg += ' '; + if (tmp.find(' ') != std::string::npos) + { + arg += "\"" + tmp + "\""; + } + else + { + arg += tmp; + } + } + bool onTarget = false; + out.serial (onTarget); + out.serial (cmd); + out.serial (arg); + NetMngr.push (out); + + return true; } // @@ -782,39 +782,39 @@ NLMISC_COMMAND(a, "Execute an admin command on you"," ") NLMISC_COMMAND(b, "Execute an admin command on your target"," ") { - if(args.size() == 0) - return false; + if(args.size() == 0) + return false; - CBitMemStream out; - if (!GenericMsgHeaderMngr.pushNameToStream("COMMAND:ADMIN", out)) - return false; + CBitMemStream out; + if (!GenericMsgHeaderMngr.pushNameToStream("COMMAND:ADMIN", out)) + return false; - string cmd, arg; - cmd = args[0]; - for (uint i = 1; i < args.size(); i++) - { - // temporary fix for utf-8 - // servers commands are not decoded so convert them to ansi - std::string tmp = ucstring::makeFromUtf8(args[i]).toString(); - - if (!arg.empty()) - arg += ' '; - if (tmp.find(' ') != std::string::npos) + string cmd, arg; + cmd = args[0]; + for (uint i = 1; i < args.size(); i++) { - arg += "\"" + tmp + "\""; - } - else - { - arg += tmp; - } - } - bool onTarget = true; - out.serial (onTarget); - out.serial (cmd); - out.serial (arg); - NetMngr.push (out); + // temporary fix for utf-8 + // servers commands are not decoded so convert them to ansi + std::string tmp = ucstring::makeFromUtf8(args[i]).toString(); - return true; + if (!arg.empty()) + arg += ' '; + if (tmp.find(' ') != std::string::npos) + { + arg += "\"" + tmp + "\""; + } + else + { + arg += tmp; + } + } + bool onTarget = true; + out.serial (onTarget); + out.serial (cmd); + out.serial (arg); + NetMngr.push (out); + + return true; } // @@ -827,484 +827,484 @@ NLMISC_COMMAND(b, "Execute an admin command on your target"," ") NLMISC_COMMAND(c, "Execute an admin command on character name"," ") { - if(args.size() < 2) - return false; + if(args.size() < 2) + return false; - CBitMemStream out; - if (!GenericMsgHeaderMngr.pushNameToStream("COMMAND:ADMIN_OFFLINE", out)) - return false; + CBitMemStream out; + if (!GenericMsgHeaderMngr.pushNameToStream("COMMAND:ADMIN_OFFLINE", out)) + return false; - string characterName, cmd, arg; + string characterName, cmd, arg; - characterName = args[0]; - cmd = args[1]; - for (uint i = 2; i < args.size(); i++) - { - // temporary fix for utf-8 - // servers commands are not decoded so convert them to ansi - std::string tmp = ucstring::makeFromUtf8(args[i]).toString(); - - if (!arg.empty()) - arg += ' '; - if (tmp.find(' ') != std::string::npos) + characterName = args[0]; + cmd = args[1]; + for (uint i = 2; i < args.size(); i++) { - arg += "\"" + tmp + "\""; - } - else - { - arg += tmp; - } - } - out.serial (characterName); - out.serial (cmd); - out.serial (arg); - NetMngr.push (out); + // temporary fix for utf-8 + // servers commands are not decoded so convert them to ansi + std::string tmp = ucstring::makeFromUtf8(args[i]).toString(); - return true; + if (!arg.empty()) + arg += ' '; + if (tmp.find(' ') != std::string::npos) + { + arg += "\"" + tmp + "\""; + } + else + { + arg += tmp; + } + } + out.serial (characterName); + out.serial (cmd); + out.serial (arg); + NetMngr.push (out); + + return true; } NLMISC_COMMAND(boxes, "Show/Hide selection boxes", "[ : 0 to Hide, anything else to Show. Invert the current state if nothing specified.]") { #if FINAL_VERSION - if (!ClientCfg.ExtendedCommands) return false; + if (!ClientCfg.ExtendedCommands) return false; - if( !ClientCfg.Local && !hasPrivilegeDEV() && !hasPrivilegeSGM() && !hasPrivilegeGM() ) - return true; + if( !ClientCfg.Local && !hasPrivilegeDEV() && !hasPrivilegeSGM() && !hasPrivilegeGM() ) + return true; #endif // FINAL_VERSION - // Invert Current State - if(args.size() == 0) - { - // Invert the current value. - ClientCfg.DrawBoxes = !ClientCfg.DrawBoxes; - return true; - } - // Set Current State - else if(args.size() == 1) - { - // Invert the current value. - fromString(args[0], ClientCfg.DrawBoxes); - return true; - } - // Bad parameters. - else - return false; + // Invert Current State + if(args.size() == 0) + { + // Invert the current value. + ClientCfg.DrawBoxes = !ClientCfg.DrawBoxes; + return true; + } + // Set Current State + else if(args.size() == 1) + { + // Invert the current value. + fromString(args[0], ClientCfg.DrawBoxes); + return true; + } + // Bad parameters. + else + return false; } NLMISC_COMMAND(dump, "Command to create a file with the current state of the client", "[]") { - if(args.size() > 1) - return false; + if(args.size() > 1) + return false; - string dumpName; - if(args.size() == 1) - dumpName = args[0]; - else - dumpName = "default"; + string dumpName; + if(args.size() == 1) + dumpName = args[0]; + else + dumpName = "default"; - dump(dumpName); - return true; + dump(dumpName); + return true; } NLMISC_COMMAND(verbose, "Enable/Disable some Debug Information", "none or magic") { - // Check parameters. - if(args.size() != 1) - { - // Help - CInterfaceManager *IM = CInterfaceManager::getInstance(); - IM->displaySystemInfo(ucstring("This command need 1 parameter :")); - IM->displaySystemInfo(ucstring(" :")); - IM->displaySystemInfo(ucstring("- none(to remove all verboses)")); - IM->displaySystemInfo(ucstring("- magic(to add debug infos about magic)")); - IM->displaySystemInfo(ucstring("- anim (to add debug infos about animation)")); - } - else - { - std::string type = NLMISC::toLower(args[0]); - if (type == "none") - Verbose = VerboseNone; - else if(type == "magic") - Verbose |= VerboseMagic; - else if(type == "anim") - Verbose |= VerboseAnim; - else + // Check parameters. + if(args.size() != 1) { - CInterfaceManager *IM = CInterfaceManager::getInstance(); - IM->displaySystemInfo(ucstring("This command need 1 parameter :")); - IM->displaySystemInfo(ucstring(" :")); - IM->displaySystemInfo(ucstring("- none(to remove all verboses)")); - IM->displaySystemInfo(ucstring("- magic(to add debug infos about magic)")); - IM->displaySystemInfo(ucstring("- anim (to add debug infos about animation)")); + // Help + CInterfaceManager *IM = CInterfaceManager::getInstance(); + IM->displaySystemInfo(ucstring("This command need 1 parameter :")); + IM->displaySystemInfo(ucstring(" :")); + IM->displaySystemInfo(ucstring("- none(to remove all verboses)")); + IM->displaySystemInfo(ucstring("- magic(to add debug infos about magic)")); + IM->displaySystemInfo(ucstring("- anim (to add debug infos about animation)")); } - } - return true; + else + { + std::string type = NLMISC::toLower(args[0]); + if (type == "none") + Verbose = VerboseNone; + else if(type == "magic") + Verbose |= VerboseMagic; + else if(type == "anim") + Verbose |= VerboseAnim; + else + { + CInterfaceManager *IM = CInterfaceManager::getInstance(); + IM->displaySystemInfo(ucstring("This command need 1 parameter :")); + IM->displaySystemInfo(ucstring(" :")); + IM->displaySystemInfo(ucstring("- none(to remove all verboses)")); + IM->displaySystemInfo(ucstring("- magic(to add debug infos about magic)")); + IM->displaySystemInfo(ucstring("- anim (to add debug infos about animation)")); + } + } + return true; } NLMISC_COMMAND(verboseAnimSelection, "Enable/Disable the animation log for the current selection", "") { - // Check parameters. - if(args.size() != 0) - return false; + // Check parameters. + if(args.size() != 0) + return false; - VerboseAnimSelection = !VerboseAnimSelection; - if(VerboseAnimSelection) - nlinfo("Enable VerboseAnimSelection"); - else - nlinfo("Disable VerboseAnimSelection"); + VerboseAnimSelection = !VerboseAnimSelection; + if(VerboseAnimSelection) + nlinfo("Enable VerboseAnimSelection"); + else + nlinfo("Disable VerboseAnimSelection"); - return true; + return true; } NLMISC_COMMAND(verboseAnimUser, "Enable/Disable the animation log for the user", "") { - // Check parameters. - if(args.size() != 0) - return false; + // Check parameters. + if(args.size() != 0) + return false; - VerboseAnimUser = !VerboseAnimUser; - if(VerboseAnimUser) - nlinfo("Enable VerboseAnimUser"); - else - nlinfo("Disable VerboseAnimUser"); + VerboseAnimUser = !VerboseAnimUser; + if(VerboseAnimUser) + nlinfo("Enable VerboseAnimUser"); + else + nlinfo("Disable VerboseAnimUser"); - return true; + return true; } NLMISC_COMMAND(verboseDatabase, "Enable/Disable the log for the database", "") { - // Check parameters. - if(args.size() != 0) - return false; + // Check parameters. + if(args.size() != 0) + return false; - bool v = NLMISC::ICDBNode::isDatabaseVerbose(); - NLMISC::ICDBNode::setVerboseDatabase( !v ); + bool v = NLMISC::ICDBNode::isDatabaseVerbose(); + NLMISC::ICDBNode::setVerboseDatabase( !v ); - if( !v ) - nlinfo("Enable VerboseDatabase"); - else - nlinfo("Disable VerboseDatabase"); + if( !v ) + nlinfo("Enable VerboseDatabase"); + else + nlinfo("Disable VerboseDatabase"); - return true; + return true; } NLMISC_COMMAND(verbosePropertiesLoggingMode, "Set logging mode", "") { - // Check parameters. - if(args.size() != 0) - return false; + // Check parameters. + if(args.size() != 0) + return false; - CNetworkConnection::LoggingMode = !CNetworkConnection::LoggingMode; - if(CNetworkConnection::LoggingMode) - nlinfo("Enable LoggingMode"); - else - nlinfo("Disable LoggingMode"); + CNetworkConnection::LoggingMode = !CNetworkConnection::LoggingMode; + if(CNetworkConnection::LoggingMode) + nlinfo("Enable LoggingMode"); + else + nlinfo("Disable LoggingMode"); - return true; + return true; } NLMISC_COMMAND(logEntities, "Write the position and orientation af all entities in the vision in the file 'entities.txt'", "") { - // Check parameters - if(args.size() != 0) - return false; + // Check parameters + if(args.size() != 0) + return false; - // Log entities - EntitiesMngr.writeEntities(); + // Log entities + EntitiesMngr.writeEntities(); - // Command well done. - return true; + // Command well done. + return true; } NLMISC_COMMAND(log, "Add/Del Positive/Negative Filters for logs", "Log System , Type , Filter ") { - // check args, if there s not the right number of parameter, return bad - if(args.size() < 2 || args.size() > 3) - return false; + // check args, if there s not the right number of parameter, return bad + if(args.size() < 2 || args.size() > 3) + return false; - CLog *logSys; - // Debug log system. - if (string(args[0].c_str()) == "debug") - logSys = DebugLog; - // Info log system. - else if(string(args[0].c_str()) == "info") - logSys = InfoLog; - // Warning log system. - else if(string(args[0].c_str()) == "warning") - logSys = WarningLog; - // Assert log system. - else if(string(args[0].c_str()) == "assert") - logSys = AssertLog; - // Unknown Log System -> return false. - else - return false; + CLog *logSys; + // Debug log system. + if (string(args[0].c_str()) == "debug") + logSys = DebugLog; + // Info log system. + else if(string(args[0].c_str()) == "info") + logSys = InfoLog; + // Warning log system. + else if(string(args[0].c_str()) == "warning") + logSys = WarningLog; + // Assert log system. + else if(string(args[0].c_str()) == "assert") + logSys = AssertLog; + // Unknown Log System -> return false. + else + return false; - // Add a positive filter. - if (string(args[1].c_str()) == "pos") - logSys->addPositiveFilter(args[2].c_str()); - // Add a negative filter. - else if(string(args[1].c_str()) == "neg") - logSys->addNegativeFilter(args[2].c_str()); - // Removes a filter by name (in both filters). - else if(string(args[1].c_str()) == "del") - logSys->removeFilter(args[2].c_str()); - // Reset both filters. - else if(string(args[1].c_str()) == "reset") - logSys->resetFilters(); - // Unknown Filter -> return false. - else - return false; + // Add a positive filter. + if (string(args[1].c_str()) == "pos") + logSys->addPositiveFilter(args[2].c_str()); + // Add a negative filter. + else if(string(args[1].c_str()) == "neg") + logSys->addNegativeFilter(args[2].c_str()); + // Removes a filter by name (in both filters). + else if(string(args[1].c_str()) == "del") + logSys->removeFilter(args[2].c_str()); + // Reset both filters. + else if(string(args[1].c_str()) == "reset") + logSys->resetFilters(); + // Unknown Filter -> return false. + else + return false; - // Command well done. - return true; + // Command well done. + return true; } NLMISC_COMMAND(execScript, "Execute a script file (.cmd)","") { - int size = (int)args.size(); - if (size != 1) - return false; + int size = (int)args.size(); + if (size != 1) + return false; - CIFile iFile; + CIFile iFile; - if (iFile.open(CPath::lookup(args[0], false))) - { - char line[512]; - char *buffer; - // Read line by line and execute each line - - sint inComment= 0; - bool eof = false; - while (!eof) + if (iFile.open(CPath::lookup(args[0], false))) { - buffer = &line[0]; - uint read = 0; - for(;;) - { - if (read == 512 -1) - { - *buffer = '\0'; - break; - } + char line[512]; + char *buffer; + // Read line by line and execute each line - try + sint inComment= 0; + bool eof = false; + while (!eof) { - // read one byte - iFile.serialBuffer ((uint8 *)buffer, 1); - } - catch (const EFile &) - { - *buffer = '\0'; - eof = true; - break; - } + buffer = &line[0]; + uint read = 0; + for(;;) + { + if (read == 512 -1) + { + *buffer = '\0'; + break; + } - if (*buffer == '\n') - { - *buffer = '\0'; - break; - } + try + { + // read one byte + iFile.serialBuffer ((uint8 *)buffer, 1); + } + catch (const EFile &) + { + *buffer = '\0'; + eof = true; + break; + } - // skip '\r' char - if (*buffer != '\r') - { - buffer++; - read++; - } - } + if (*buffer == '\n') + { + *buffer = '\0'; + break; + } - // execute line - if (strlen(line) > 0) - { - // if not a single comment - if(strncmp(line, "//", 2)!=0) - { - if(strncmp(line, "/*", 2)==0) - inComment++; - if(inComment<=0) - { - ucstring ucline(line); - CInterfaceManager::parseTokens(ucline); - ICommand::execute(ucline.toUtf8(), g_log); - } - if(strncmp(line, "*/", 2)==0) - inComment--; - } - } + // skip '\r' char + if (*buffer != '\r') + { + buffer++; + read++; + } + } - // end? - if (iFile.eof()) - eof = true; + // execute line + if (strlen(line) > 0) + { + // if not a single comment + if(strncmp(line, "//", 2)!=0) + { + if(strncmp(line, "/*", 2)==0) + inComment++; + if(inComment<=0) + { + ucstring ucline(line); + CInterfaceManager::parseTokens(ucline); + ICommand::execute(ucline.toUtf8(), g_log); + } + if(strncmp(line, "*/", 2)==0) + inComment--; + } + } + + // end? + if (iFile.eof()) + eof = true; + } + iFile.close(); + } + else + { + CInterfaceManager::getInstance()->displaySystemInfo(ucstring("Cannot open file")); } - iFile.close(); - } - else - { - CInterfaceManager::getInstance()->displaySystemInfo(ucstring("Cannot open file")); - } - return true; + return true; } NLMISC_COMMAND(db, "Modify Database"," ") { - CInterfaceManager *pIM = CInterfaceManager::getInstance(); - int size = (int)args.size(); - if (size == 2) - { + CInterfaceManager *pIM = CInterfaceManager::getInstance(); + int size = (int)args.size(); + if (size == 2) + { #if !FINAL_VERSION - // check if 2nd arg is a sheet name - if (args[1].empty()) return false; - sint64 value; - if (isalpha(args[1][0])) - { - CSheetId sheet(args[1]); - value = (sint64) sheet.asInt(); - } - else - { - // Convert the string into an sint64. - fromString(args[1], value); - } + // check if 2nd arg is a sheet name + if (args[1].empty()) return false; + sint64 value; + if (isalpha(args[1][0])) + { + CSheetId sheet(args[1]); + value = (sint64) sheet.asInt(); + } + else + { + // Convert the string into an sint64. + fromString(args[1], value); + } - // Set the property. - CCDBNodeLeaf *node= NLGUI::CDBManager::getInstance()->getDbProp(args[0], false); - if(node) - node->setValue64(value); - else - pIM->displaySystemInfo(toString("DB '%s' does not exist.", args[0].c_str())); + // Set the property. + CCDBNodeLeaf *node= NLGUI::CDBManager::getInstance()->getDbProp(args[0], false); + if(node) + node->setValue64(value); + else + pIM->displaySystemInfo(toString("DB '%s' does not exist.", args[0].c_str())); #else - pIM->displaySystemInfo(ucstring("Can't write to DB when in Final Version.")); + pIM->displaySystemInfo(ucstring("Can't write to DB when in Final Version.")); #endif - } - else if (size == 1) - { - CCDBNodeLeaf *node= NLGUI::CDBManager::getInstance()->getDbProp(args[0], false); - if(node) - { - sint64 prop = node->getValue64(); - string str = toString(prop); - pIM->displaySystemInfo(ucstring(str)); - nlinfo("%s", str.c_str()); } - else - pIM->displaySystemInfo(toString("DB '%s' does not exist.", args[0].c_str())); - return true; - } - else - return false; + else if (size == 1) + { + CCDBNodeLeaf *node= NLGUI::CDBManager::getInstance()->getDbProp(args[0], false); + if(node) + { + sint64 prop = node->getValue64(); + string str = toString(prop); + pIM->displaySystemInfo(ucstring(str)); + nlinfo("%s", str.c_str()); + } + else + pIM->displaySystemInfo(toString("DB '%s' does not exist.", args[0].c_str())); + return true; + } + else + return false; - return true; + return true; } static bool talkInChan(uint32 nb,std::vectorargs) { - uint32 maxChans = CChatGroup::MaxDynChanPerPlayer; - if (nb>=maxChans) - { - return false; - } - if(args.size()>0) - { - std::string tmp=""; - std::vector::const_iterator first(args.begin()),last(args.end()); - - for(;first!=last;++first) + uint32 maxChans = CChatGroup::MaxDynChanPerPlayer; + if (nb>=maxChans) { - tmp = tmp + (*first); - tmp = tmp+" "; + return false; } + if(args.size()>0) + { + std::string tmp=""; + std::vector::const_iterator first(args.begin()),last(args.end()); - ucstring uctmp; - uctmp.fromUtf8(tmp); - PeopleInterraction.talkInDynamicChannel(nb, uctmp); - return true; - } - else - { - ChatMngr.updateChatModeAndButton(CChatGroup::dyn_chat, nb); - } - return false; + for(;first!=last;++first) + { + tmp = tmp + (*first); + tmp = tmp+" "; + } + + ucstring uctmp; + uctmp.fromUtf8(tmp); + PeopleInterraction.talkInDynamicChannel(nb, uctmp); + return true; + } + else + { + ChatMngr.updateChatModeAndButton(CChatGroup::dyn_chat, nb); + } + return false; } NLMISC_COMMAND(0,"talk in 0th dynamic chat channel"," ") { - return talkInChan(0,args); + return talkInChan(0,args); } NLMISC_COMMAND(1,"talk in first dynamic chat channel"," ") { - return talkInChan(1,args); + return talkInChan(1,args); } NLMISC_COMMAND(2,"talk in 2nd dynamic chat channel"," ") { - return talkInChan(2,args); + return talkInChan(2,args); } NLMISC_COMMAND(3,"talk in 3rd dynamic chat channel"," ") { - return talkInChan(3,args); + return talkInChan(3,args); } NLMISC_COMMAND(4,"talk in 4th dynamic chat channel"," ") { - return talkInChan(4,args); + return talkInChan(4,args); } NLMISC_COMMAND(5,"talk in 5th dynamic chat channel"," ") { - return talkInChan(5,args); + return talkInChan(5,args); } NLMISC_COMMAND(6,"talk in 6th dynamic chat channel"," ") { - return talkInChan(6,args); + return talkInChan(6,args); } NLMISC_COMMAND(7,"talk in 7th dynamic chat channel"," ") { - return talkInChan(7,args); + return talkInChan(7,args); } NLMISC_COMMAND(setItemName, "set name of items, sbrick, etc.."," ") { - if (args.size() < 2) return false; - CSheetId id(args[0]); - ucstring name; - name.fromUtf8(args[1]); - ucstring desc; - ucstring desc2; - if (args.size() > 2) - desc.fromUtf8(args[2]); - if (args.size() > 2) - desc2.fromUtf8(args[3]); + if (args.size() < 2) return false; + CSheetId id(args[0]); + ucstring name; + name.fromUtf8(args[1]); + ucstring desc; + ucstring desc2; + if (args.size() > 2) + desc.fromUtf8(args[2]); + if (args.size() > 2) + desc2.fromUtf8(args[3]); - STRING_MANAGER::CStringManagerClient *pSMC = STRING_MANAGER::CStringManagerClient::instance(); - if (pSMC) - pSMC->replaceSBrickName(id, name, desc, desc2); - else - return false; - return true; + STRING_MANAGER::CStringManagerClient *pSMC = STRING_MANAGER::CStringManagerClient::instance(); + if (pSMC) + pSMC->replaceSBrickName(id, name, desc, desc2); + else + return false; + return true; } NLMISC_COMMAND(setMissingDynstringText, "set text of missing dynamic string"," ") { - if (args.size() < 2) return false; - ucstring name; - name.fromUtf8(args[0]); - ucstring text; - text.fromUtf8(args[1]); + if (args.size() < 2) return false; + ucstring name; + name.fromUtf8(args[0]); + ucstring text; + text.fromUtf8(args[1]); - STRING_MANAGER::CStringManagerClient *pSMC = STRING_MANAGER::CStringManagerClient::instance(); - if (pSMC) - pSMC->replaceDynString(name, text); - else - return false; - return true; + STRING_MANAGER::CStringManagerClient *pSMC = STRING_MANAGER::CStringManagerClient::instance(); + if (pSMC) + pSMC->replaceDynString(name, text); + else + return false; + return true; } @@ -1323,573 +1323,561 @@ NLMISC_COMMAND(setMissingDynstringText, "set text of missing dynamic string"," < NLMISC_COMMAND(ah, "Launch an action handler", " ") { -<<<<<<< local - if (args.size() == 0) - return false; - - if (!ClientCfg.AllowDebugLua && toLower(args[0]) == "lua") -||||||| base - if (args.size() == 0) - return false; - - if (!ClientCfg.AllowDebugLua && strlwr(args[0]) == "lua") -======= if (args.size() == 0) return false; if (!ClientCfg.AllowDebugLua && toLower(args[0]) == "lua") ->>>>>>> other { return false; // not allowed!! } - CInterfaceManager *pIM = CInterfaceManager::getInstance(); - if (args.size() == 1) - { - CAHManager::getInstance()->runActionHandler(args[0], NULL); - } - else - { - CAHManager::getInstance()->runActionHandler(args[0], NULL, args[1]); - } + CInterfaceManager *pIM = CInterfaceManager::getInstance(); + if (args.size() == 1) + { + CAHManager::getInstance()->runActionHandler(args[0], NULL); + } + else + { + CAHManager::getInstance()->runActionHandler(args[0], NULL, args[1]); + } - return true; + return true; } static void setDynString(uint32 strID, const std::string &value) { - STRING_MANAGER::CStringManagerClient *pSMC = STRING_MANAGER::CStringManagerClient::instance(); - pSMC->receiveString(strID, ucstring(value)); - CBitMemStream bm; - if (bm.isReading()) bm.invert(); - bm.serial(strID); - bm.serial(strID); - bm.invert(); - bm.seek(0, NLMISC::IStream::begin); - pSMC->receiveDynString(bm); + STRING_MANAGER::CStringManagerClient *pSMC = STRING_MANAGER::CStringManagerClient::instance(); + pSMC->receiveString(strID, ucstring(value)); + CBitMemStream bm; + if (bm.isReading()) bm.invert(); + bm.serial(strID); + bm.serial(strID); + bm.invert(); + bm.seek(0, NLMISC::IStream::begin); + pSMC->receiveDynString(bm); } // for debug purposes, insert a string in the NLMISC_COMMAND(setDynString, "set a dynamic string"," ") { - if (args.size() != 2) return false; - uint32 strID; - fromString(args[0], strID); - setDynString(strID, args[1]); - return true; + if (args.size() != 2) return false; + uint32 strID; + fromString(args[0], strID); + setDynString(strID, args[1]); + return true; } class CAnimProgress : public IProgressCallback { public: - // Update the progress bar - virtual void progress (float value) - { - // can't do anything if no driver - if(Driver == NULL) - return; - // Get croped value - value = getCropedValue (value); - // Set matrix - Driver->setMatrixMode2D11(); - // Display a progress bar background - Driver->drawQuad (PROGRESS_BAR_LEFT, 0.5f-PROGRESS_BAR_HEIGHT/2.0f, PROGRESS_BAR_LEFT+ PROGRESS_BAR_WIDTH, 0.5f+PROGRESS_BAR_HEIGHT/2.0f, - PROGRESS_BAR_BG_COLOR); - // Display a progress bar - Driver->drawQuad (PROGRESS_BAR_LEFT, 0.5f-PROGRESS_BAR_HEIGHT/2.0f, PROGRESS_BAR_LEFT+value*PROGRESS_BAR_WIDTH, 0.5f+PROGRESS_BAR_HEIGHT/2.0f, - PROGRESS_BAR_COLOR); - if(TextContext != NULL) - { - // Init the Pen. - TextContext->setKeep800x600Ratio(false); - TextContext->setColor(CRGBA(255,255,255)); - TextContext->setFontSize(20); - TextContext->setHotSpot(UTextContext::MiddleMiddle); + // Update the progress bar + virtual void progress (float value) + { + // can't do anything if no driver + if(Driver == NULL) + return; + // Get croped value + value = getCropedValue (value); + // Set matrix + Driver->setMatrixMode2D11(); + // Display a progress bar background + Driver->drawQuad (PROGRESS_BAR_LEFT, 0.5f-PROGRESS_BAR_HEIGHT/2.0f, PROGRESS_BAR_LEFT+ PROGRESS_BAR_WIDTH, 0.5f+PROGRESS_BAR_HEIGHT/2.0f, + PROGRESS_BAR_BG_COLOR); + // Display a progress bar + Driver->drawQuad (PROGRESS_BAR_LEFT, 0.5f-PROGRESS_BAR_HEIGHT/2.0f, PROGRESS_BAR_LEFT+value*PROGRESS_BAR_WIDTH, 0.5f+PROGRESS_BAR_HEIGHT/2.0f, + PROGRESS_BAR_COLOR); + if(TextContext != NULL) + { + // Init the Pen. + TextContext->setKeep800x600Ratio(false); + TextContext->setColor(CRGBA(255,255,255)); + TextContext->setFontSize(20); + TextContext->setHotSpot(UTextContext::MiddleMiddle); - // Display the Text. - TextContext->printfAt(0.5f, 0.5f, _ProgressMessage.c_str()); - } - // Display to screen. - Driver->swapBuffers(); - } - // New message - void newMessage(const std::string &message) {_ProgressMessage = message;} + // Display the Text. + TextContext->printfAt(0.5f, 0.5f, _ProgressMessage.c_str()); + } + // Display to screen. + Driver->swapBuffers(); + } + // New message + void newMessage(const std::string &message) {_ProgressMessage = message;} private: - std::string _ProgressMessage; + std::string _ProgressMessage; }; NLMISC_COMMAND(reloadSearchPaths, "reload the search paths","") { - if (!args.empty()) return false; - CPath::memoryUncompress(); - CAnimProgress progress; - // remove all objects that may depend on an animation - CProjectileManager::getInstance().reset(); + if (!args.empty()) return false; + CPath::memoryUncompress(); + CAnimProgress progress; + // remove all objects that may depend on an animation + CProjectileManager::getInstance().reset(); - // Pathes - progress.newMessage("Reloading pathes"); - progress.progress(0.0f); - progress.pushCropedValues(0.0f, 1.0f); - // + // Pathes + progress.newMessage("Reloading pathes"); + progress.progress(0.0f); + progress.pushCropedValues(0.0f, 1.0f); + // - addSearchPaths(progress); - CPath::memoryCompress(); - return true; + addSearchPaths(progress); + CPath::memoryCompress(); + return true; } NLMISC_COMMAND(reloadAnim, "reload animations","") { - CPath::memoryUncompress(); - CAnimProgress dummy; - // remove all objects that may depend on an animation - CProjectileManager::getInstance().reset(); + CPath::memoryUncompress(); + CAnimProgress dummy; + // remove all objects that may depend on an animation + CProjectileManager::getInstance().reset(); - // Pathes - dummy.newMessage("Pathes"); - dummy.progress(0.0f); - dummy.pushCropedValues(0.0f, 0.5f); + // Pathes + dummy.newMessage("Pathes"); + dummy.progress(0.0f); + dummy.pushCropedValues(0.0f, 0.5f); - addSearchPaths(dummy); + addSearchPaths(dummy); - if (ClientCfg.UpdatePackedSheet) - { - for(uint i = 0; i < ClientCfg.UpdatePackedSheetPath.size(); i++) + if (ClientCfg.UpdatePackedSheet) { - dummy.progress((float)i/(float)ClientCfg.UpdatePackedSheetPath.size()); - dummy.pushCropedValues ((float)i/(float)ClientCfg.UpdatePackedSheetPath.size(), (float)(i+1)/(float)ClientCfg.UpdatePackedSheetPath.size()); - CPath::addSearchPath(ClientCfg.UpdatePackedSheetPath[i], true, false, &dummy); - dummy.popCropedValues(); + for(uint i = 0; i < ClientCfg.UpdatePackedSheetPath.size(); i++) + { + dummy.progress((float)i/(float)ClientCfg.UpdatePackedSheetPath.size()); + dummy.pushCropedValues ((float)i/(float)ClientCfg.UpdatePackedSheetPath.size(), (float)(i+1)/(float)ClientCfg.UpdatePackedSheetPath.size()); + CPath::addSearchPath(ClientCfg.UpdatePackedSheetPath[i], true, false, &dummy); + dummy.popCropedValues(); + } } - } - dummy.popCropedValues(); - // Animations - dummy.newMessage("Anims"); - dummy.progress(0.5f); - dummy.pushCropedValues(0.5f, 1.0f); - EAM->load(dummy, true); - dummy.popCropedValues(); - // Reload Animations - EntitiesMngr.reloadAnims(); - CPath::memoryCompress(); - return true; + dummy.popCropedValues(); + // Animations + dummy.newMessage("Anims"); + dummy.progress(0.5f); + dummy.pushCropedValues(0.5f, 1.0f); + EAM->load(dummy, true); + dummy.popCropedValues(); + // Reload Animations + EntitiesMngr.reloadAnims(); + CPath::memoryCompress(); + return true; } NLMISC_COMMAND(reloadAttack, "reload attack", "") { - if (!args.empty()) return false; - // remove all objects that may depend on an animation - ClientSheetsStrings.memoryUncompress(); - CProjectileManager::getInstance().reset(); - EntitiesMngr.removeAllAttachedFX(); - FXMngr.reset(); - // - std::vector exts; - //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - // replace attack list of creature in place (so pointers on character sheets remains valid) - CSheetManager sheetManager; - exts; - // exts.push_back("creature"); - exts.push_back("race_stats"); - NLMISC::IProgressCallback progress; - sheetManager.loadAllSheet(progress, true, false, false, true, &exts); - // - const CSheetManager::TEntitySheetMap &sm = SheetMngr.getSheets(); - for(CSheetManager::TEntitySheetMap::const_iterator it = sm.begin(); it != sm.end(); ++it) - { - if (it->second.EntitySheet && it->second.EntitySheet->Type == CEntitySheet::FAUNA) + if (!args.empty()) return false; + // remove all objects that may depend on an animation + ClientSheetsStrings.memoryUncompress(); + CProjectileManager::getInstance().reset(); + EntitiesMngr.removeAllAttachedFX(); + FXMngr.reset(); + // + std::vector exts; + //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + // replace attack list of creature in place (so pointers on character sheets remains valid) + CSheetManager sheetManager; + exts; + // exts.push_back("creature"); + exts.push_back("race_stats"); + NLMISC::IProgressCallback progress; + sheetManager.loadAllSheet(progress, true, false, false, true, &exts); + // + const CSheetManager::TEntitySheetMap &sm = SheetMngr.getSheets(); + for(CSheetManager::TEntitySheetMap::const_iterator it = sm.begin(); it != sm.end(); ++it) { - // find matching sheet in new sheetManager - const CEntitySheet *other = sheetManager.get(it->first); - if (other) - { - // replace data in place - ((CCharacterSheet &) *it->second.EntitySheet).AttackLists = ((const CCharacterSheet &) *other).AttackLists; - } + if (it->second.EntitySheet && it->second.EntitySheet->Type == CEntitySheet::FAUNA) + { + // find matching sheet in new sheetManager + const CEntitySheet *other = sheetManager.get(it->first); + if (other) + { + // replace data in place + ((CCharacterSheet &) *it->second.EntitySheet).AttackLists = ((const CCharacterSheet &) *other).AttackLists; + } + } + else if(it->second.EntitySheet && it->second.EntitySheet->Type == CEntitySheet::RACE_STATS) + { + // find matching sheet in new sheetManager + const CEntitySheet *other = sheetManager.get(it->first); + if (other) + { + // replace data in place + ((CRaceStatsSheet &) *it->second.EntitySheet).AttackLists = ((const CRaceStatsSheet &) *other).AttackLists; + } + } } - else if(it->second.EntitySheet && it->second.EntitySheet->Type == CEntitySheet::RACE_STATS) - { - // find matching sheet in new sheetManager - const CEntitySheet *other = sheetManager.get(it->first); - if (other) - { - // replace data in place - ((CRaceStatsSheet &) *it->second.EntitySheet).AttackLists = ((const CRaceStatsSheet &) *other).AttackLists; - } - } - } - //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - CAttackListManager::getInstance().release(); - // form to reload all sheets of interest - exts.clear(); - exts.push_back("attack_list"); - exts.push_back("animation_fx_set"); - exts.push_back("id_to_string_array"); - CDummyProgress dp; - SheetMngr.loadAllSheet(dp, true, false, true, true, &exts); - CAttackListManager::getInstance().init(); - // - ClientSheetsStrings.memoryCompress(); - return true; + //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + CAttackListManager::getInstance().release(); + // form to reload all sheets of interest + exts.clear(); + exts.push_back("attack_list"); + exts.push_back("animation_fx_set"); + exts.push_back("id_to_string_array"); + CDummyProgress dp; + SheetMngr.loadAllSheet(dp, true, false, true, true, &exts); + CAttackListManager::getInstance().init(); + // + ClientSheetsStrings.memoryCompress(); + return true; } NLMISC_COMMAND(reloadSky, "reload new style sky", "") { - if (!args.empty()) return false; - ContinentMngr.reloadSky(); - return false; + if (!args.empty()) return false; + ContinentMngr.reloadSky(); + return false; } NLMISC_COMMAND(missionReward, "debug"," ") { - if (args.size() == 1) - { - uint8 index; - fromString(args[0], index); - CBitMemStream out; - if(GenericMsgHeaderMngr.pushNameToStream("BOTCHAT:COMPLETE_MISSION", out)) + if (args.size() == 1) { - out.serial(index); - NetMngr.push(out); + uint8 index; + fromString(args[0], index); + CBitMemStream out; + if(GenericMsgHeaderMngr.pushNameToStream("BOTCHAT:COMPLETE_MISSION", out)) + { + out.serial(index); + NetMngr.push(out); + } + else + nlwarning(" : unknown message name : BOTCHAT:COMPLETE_MISSION"); + return true; } - else - nlwarning(" : unknown message name : BOTCHAT:COMPLETE_MISSION"); - return true; - } - return false; + return false; } NLMISC_COMMAND(missionProgress, "debug"," ") { - if (args.size() == 1) - { - uint8 index; - fromString(args[0], index); - CBitMemStream out; - if(GenericMsgHeaderMngr.pushNameToStream("BOTCHAT:PROGRESS_MISSION", out)) + if (args.size() == 1) { - out.serial(index); - NetMngr.push(out); + uint8 index; + fromString(args[0], index); + CBitMemStream out; + if(GenericMsgHeaderMngr.pushNameToStream("BOTCHAT:PROGRESS_MISSION", out)) + { + out.serial(index); + NetMngr.push(out); + } + else + nlwarning(" : unknown message name : BOTCHAT:PROGRESS_MISSION"); + return true; } - else - nlwarning(" : unknown message name : BOTCHAT:PROGRESS_MISSION"); - return true; - } - return false; + return false; } /* - NLMISC_COMMAND( displayDBModifs, "display server database modification in the chat window"," ") - { - if ( VerboseDatabase ) - CInterfaceManager::getInstance()->getChatOutput()->addTextChild(ucstring("the database is already in verbose mode"),CRGBA(255,255,255,255)); - else - { - CInterfaceManager::getInstance()->getChatOutput()->addTextChild(ucstring("database is now in verbose mode"),CRGBA(255,255,255,255)); - VerboseDatabase = true; - } - return true; - } +NLMISC_COMMAND( displayDBModifs, "display server database modification in the chat window"," ") +{ + if ( VerboseDatabase ) + CInterfaceManager::getInstance()->getChatOutput()->addTextChild(ucstring("the database is already in verbose mode"),CRGBA(255,255,255,255)); + else + { + CInterfaceManager::getInstance()->getChatOutput()->addTextChild(ucstring("database is now in verbose mode"),CRGBA(255,255,255,255)); + VerboseDatabase = true; + } + return true; +} - NLMISC_COMMAND( hideDBModifs, "stop displaying server database modification in the chat window"," ") - { - if ( !VerboseDatabase ) - CInterfaceManager::getInstance()->getChatOutput()->addTextChild(ucstring("the database is already not in verbose mode"),CRGBA(255,255,255,255)); - else - { - CInterfaceManager::getInstance()->getChatOutput()->addTextChild(ucstring("database is not in verbose mode anymore"),CRGBA(255,255,255,255)); - VerboseDatabase = false; - } - return true; - } +NLMISC_COMMAND( hideDBModifs, "stop displaying server database modification in the chat window"," ") +{ + if ( !VerboseDatabase ) + CInterfaceManager::getInstance()->getChatOutput()->addTextChild(ucstring("the database is already not in verbose mode"),CRGBA(255,255,255,255)); + else + { + CInterfaceManager::getInstance()->getChatOutput()->addTextChild(ucstring("database is not in verbose mode anymore"),CRGBA(255,255,255,255)); + VerboseDatabase = false; + } + return true; +} */ /* - NLMISC_COMMAND(save_sentences, "save sentences"," ") - { - CSentenceDisplayer::saveSentences(); - return true; - } +NLMISC_COMMAND(save_sentences, "save sentences"," ") +{ + CSentenceDisplayer::saveSentences(); + return true; +} */ NLMISC_COMMAND(getSheetId, "get_sheet_id","") { - if (args.size() != 1) - return false; - CSheetId id(args[0]); + if (args.size() != 1) + return false; + CSheetId id(args[0]); - CInterfaceManager::getInstance()->displaySystemInfo(ucstring(toString(id.asInt()))); - return true; + CInterfaceManager::getInstance()->displaySystemInfo(ucstring(toString(id.asInt()))); + return true; } NLMISC_COMMAND(getSheetName, "get_sheet_name","") { - if (args.size() != 1) - return false; - uint32 nId; - fromString(args[0], nId); - CSheetId id( nId ); + if (args.size() != 1) + return false; + uint32 nId; + fromString(args[0], nId); + CSheetId id( nId ); - string name = id.toString(); + string name = id.toString(); - CInterfaceManager::getInstance()->displaySystemInfo(ucstring(name)); - return true; + CInterfaceManager::getInstance()->displaySystemInfo(ucstring(name)); + return true; } NLMISC_COMMAND(forgetAll, "forget all bricks", "") { - // Check parameters. - if(args.size() != 0) - { - return false; - } - char buf[100]; - for (uint i = 0;i<20;i++) - { - sprintf(buf,"SERVER:BRICK_FAMILY:%d:BRICKS",i); - CCDBNodeLeaf * node= NLGUI::CDBManager::getInstance()->getDbProp(buf); - node->setValue64(0); - } - return true; + // Check parameters. + if(args.size() != 0) + { + return false; + } + char buf[100]; + for (uint i = 0;i<20;i++) + { + sprintf(buf,"SERVER:BRICK_FAMILY:%d:BRICKS",i); + CCDBNodeLeaf * node= NLGUI::CDBManager::getInstance()->getDbProp(buf); + node->setValue64(0); + } + return true; } NLMISC_COMMAND(usePreprogMagic, "use the specified magic preprog sentence", "") { - // Check parameters. - if(args.size() != 1) - { - return false; - } + // Check parameters. + if(args.size() != 1) + { + return false; + } - // Create the message for the server to execute a phrase. - const string msgName = "SENTENCE:EXECUTE"; - CBitMemStream out; - if(GenericMsgHeaderMngr.pushNameToStream("SENTENCE:EXECUTE", out)) - { - uint8 phrase; - fromString(args[0], phrase); - out.serial(phrase); + // Create the message for the server to execute a phrase. + const string msgName = "SENTENCE:EXECUTE"; + CBitMemStream out; + if(GenericMsgHeaderMngr.pushNameToStream("SENTENCE:EXECUTE", out)) + { + uint8 phrase; + fromString(args[0], phrase); + out.serial(phrase); - BRICK_TYPE::EBrickType type = BRICK_TYPE::MAGIC; - out.serialEnum( type ); + BRICK_TYPE::EBrickType type = BRICK_TYPE::MAGIC; + out.serialEnum( type ); - NetMngr.push(out); - } - else - nlwarning("mainLoop : unknown message name : '%s'", msgName.c_str()); + NetMngr.push(out); + } + else + nlwarning("mainLoop : unknown message name : '%s'", msgName.c_str()); - return true; + return true; } NLMISC_COMMAND(usePreprogCombat, "use the specified combat preprog sentence", "") { - // Check parameters. - if(args.size() != 1) - { - return false; - } + // Check parameters. + if(args.size() != 1) + { + return false; + } - // Create the message for the server to execute a phrase. - const string msgName = "SENTENCE:EXECUTE"; - CBitMemStream out; - if(GenericMsgHeaderMngr.pushNameToStream("SENTENCE:EXECUTE", out)) - { - uint8 phrase; - fromString(args[0], phrase); - out.serial(phrase); + // Create the message for the server to execute a phrase. + const string msgName = "SENTENCE:EXECUTE"; + CBitMemStream out; + if(GenericMsgHeaderMngr.pushNameToStream("SENTENCE:EXECUTE", out)) + { + uint8 phrase; + fromString(args[0], phrase); + out.serial(phrase); - BRICK_TYPE::EBrickType type = BRICK_TYPE::COMBAT; - out.serialEnum( type ); + BRICK_TYPE::EBrickType type = BRICK_TYPE::COMBAT; + out.serialEnum( type ); - NetMngr.push(out); - } - else - nlwarning("mainLoop : unknown message name : '%s'", msgName.c_str()); + NetMngr.push(out); + } + else + nlwarning("mainLoop : unknown message name : '%s'", msgName.c_str()); - return true; + return true; } NLMISC_COMMAND(engage, "engage target in combat", "") { - // Create the message for the server to execute a phrase. - const string msgName = "COMBAT:ENGAGE"; - CBitMemStream out; - if(GenericMsgHeaderMngr.pushNameToStream(msgName, out)) - { - NetMngr.push(out); - } - else - nlwarning("mainLoop : unknown message name : '%s'", msgName.c_str()); + // Create the message for the server to execute a phrase. + const string msgName = "COMBAT:ENGAGE"; + CBitMemStream out; + if(GenericMsgHeaderMngr.pushNameToStream(msgName, out)) + { + NetMngr.push(out); + } + else + nlwarning("mainLoop : unknown message name : '%s'", msgName.c_str()); - return true; + return true; } NLMISC_COMMAND(defaultAttack, "use default attack on target", "") { - // Default attack on the current selection. - UserEntity->attack(); + // Default attack on the current selection. + UserEntity->attack(); - // Well Done. - return true; + // Well Done. + return true; } NLMISC_COMMAND(disengage, "disengage from combat", "") { - // Disengage from combat. - UserEntity->disengage(); + // Disengage from combat. + UserEntity->disengage(); - // Well Done. - return true; + // Well Done. + return true; } NLMISC_COMMAND(leaveTeam, "leave team", "") { - // Create the message for the server to execute a phrase. - const string msgName = "TEAM:LEAVE"; - CBitMemStream out; - if(GenericMsgHeaderMngr.pushNameToStream(msgName, out)) - { - NetMngr.push(out); - } - else - nlwarning("mainLoop : unknown message name : '%s'", msgName.c_str()); + // Create the message for the server to execute a phrase. + const string msgName = "TEAM:LEAVE"; + CBitMemStream out; + if(GenericMsgHeaderMngr.pushNameToStream(msgName, out)) + { + NetMngr.push(out); + } + else + nlwarning("mainLoop : unknown message name : '%s'", msgName.c_str()); - return true; + return true; } NLMISC_COMMAND(joinTeam, "join the specified team", "") { - // Create the message for the server to execute a phrase. - const string msgName = "TEAM:JOIN"; - CBitMemStream out; - if(GenericMsgHeaderMngr.pushNameToStream(msgName, out)) - { - NetMngr.push(out); - } - else - nlwarning("mainLoop : unknown message name : '%s'", msgName.c_str()); + // Create the message for the server to execute a phrase. + const string msgName = "TEAM:JOIN"; + CBitMemStream out; + if(GenericMsgHeaderMngr.pushNameToStream(msgName, out)) + { + NetMngr.push(out); + } + else + nlwarning("mainLoop : unknown message name : '%s'", msgName.c_str()); - return true; + return true; } NLMISC_COMMAND(joinTeamProposal, "propose to current target to join the team", "") { - // Create the message for the server to execute a phrase. - const string msgName = "TEAM:JOIN_PROPOSAL"; - CBitMemStream out; - if(GenericMsgHeaderMngr.pushNameToStream(msgName, out)) - { - NetMngr.push(out); - } - else - nlwarning("mainLoop : unknown message name : '%s'", msgName.c_str()); + // Create the message for the server to execute a phrase. + const string msgName = "TEAM:JOIN_PROPOSAL"; + CBitMemStream out; + if(GenericMsgHeaderMngr.pushNameToStream(msgName, out)) + { + NetMngr.push(out); + } + else + nlwarning("mainLoop : unknown message name : '%s'", msgName.c_str()); - return true; + return true; } NLMISC_COMMAND(joinTeamDecline, "decline a join team proposal", "") { - // Create the message for the server to execute a phrase. - const string msgName = "TEAM:JOIN_PROPOSAL_DECLINE"; - CBitMemStream out; - if(GenericMsgHeaderMngr.pushNameToStream(msgName, out)) - { - NetMngr.push(out); - } - else - nlwarning("mainLoop : unknown message name : '%s'", msgName.c_str()); + // Create the message for the server to execute a phrase. + const string msgName = "TEAM:JOIN_PROPOSAL_DECLINE"; + CBitMemStream out; + if(GenericMsgHeaderMngr.pushNameToStream(msgName, out)) + { + NetMngr.push(out); + } + else + nlwarning("mainLoop : unknown message name : '%s'", msgName.c_str()); - return true; + return true; } NLMISC_COMMAND(kickTeammate, "kick someone from your team", "") { - // Create the message for the server to execute a phrase. - const string msgName = "TEAM:KICK"; - CBitMemStream out; - if(GenericMsgHeaderMngr.pushNameToStream(msgName, out)) - { - NetMngr.push(out); - } - else - nlwarning("mainLoop : unknown message name : '%s'", msgName.c_str()); + // Create the message for the server to execute a phrase. + const string msgName = "TEAM:KICK"; + CBitMemStream out; + if(GenericMsgHeaderMngr.pushNameToStream(msgName, out)) + { + NetMngr.push(out); + } + else + nlwarning("mainLoop : unknown message name : '%s'", msgName.c_str()); - return true; + return true; } NLMISC_COMMAND(cancelCurrentSentence, "cancel the sentence being executed", "") { - // no parameter needed + // no parameter needed - // Create the message for the server to cancel the phrase being executed - const string msgName = "SENTENCE:CANCEL_CURRENT"; - CBitMemStream out; - if(GenericMsgHeaderMngr.pushNameToStream(msgName, out)) - { - NetMngr.push(out); - } - else - nlwarning("command : unknown message name : '%s'", msgName.c_str()); + // Create the message for the server to cancel the phrase being executed + const string msgName = "SENTENCE:CANCEL_CURRENT"; + CBitMemStream out; + if(GenericMsgHeaderMngr.pushNameToStream(msgName, out)) + { + NetMngr.push(out); + } + else + nlwarning("command : unknown message name : '%s'", msgName.c_str()); - return true; + return true; } NLMISC_COMMAND(cancelAllPhrases, "cancel all the phrases being executed", "") { - // no parameter needed + // no parameter needed - UserEntity->cancelAllPhrases(); + UserEntity->cancelAllPhrases(); - return true; + return true; } /* - NLMISC_COMMAND(drop,"drop an item to the ground","") - { - if( args.size() < 1 ) - { - return false; - } +NLMISC_COMMAND(drop,"drop an item to the ground","") +{ + if( args.size() < 1 ) + { + return false; + } - uint32 id; - fromString(args[0], id); - CEntityId itemId(RYZOMID::object,id); + uint32 id; + fromString(args[0], id); + CEntityId itemId(RYZOMID::object,id); - sint32 x = (sint32)UserEntity->pos().x * 1000; - sint32 y = (sint32)UserEntity->pos().y * 1000; - sint32 z = (sint32)UserEntity->pos().z * 1000; + sint32 x = (sint32)UserEntity->pos().x * 1000; + sint32 y = (sint32)UserEntity->pos().y * 1000; + sint32 z = (sint32)UserEntity->pos().z * 1000; - CBitMemStream bms; - string msgType = "ITEM:DROP"; - if( GenericMsgHeaderMngr.pushNameToStream(msgType,bms) ) - { - bms.serial( itemId ); - bms.serial( x ); - bms.serial( y ); - bms.serial( z ); - NetMngr.push( bms ); - nldebug(" sending 'ITEM:DROP' message to server"); - } - else - { - nlwarning(" unknown message name : ITEM:DROP"); - }* + CBitMemStream bms; + string msgType = "ITEM:DROP"; + if( GenericMsgHeaderMngr.pushNameToStream(msgType,bms) ) + { + bms.serial( itemId ); + bms.serial( x ); + bms.serial( y ); + bms.serial( z ); + NetMngr.push( bms ); + nldebug(" sending 'ITEM:DROP' message to server"); + } + else + { + nlwarning(" unknown message name : ITEM:DROP"); + }* - return true; - } + return true; +} */ NLMISC_COMMAND(pos, "Change the position of the user (in local only)", " OR 1 name of 'tp.teleport_list'. or a bot name") { - CVectorD newPos; + CVectorD newPos; // Named destination. if(args.size() == 1) @@ -1912,1854 +1900,1853 @@ NLMISC_COMMAND(pos, "Change the position of the user (in local only)", " cause crash - */ + /* + CANNOT USE ProgressBar here, because it does pumpEvents(), and + ICommand::execute() is typically called from a pumpEvents() too... + => cause crash + */ - // Fade out the Game Sound - if(SoundMngr) - SoundMngr->fadeOutGameSound(ClientCfg.SoundTPFade); + // Fade out the Game Sound + if(SoundMngr) + SoundMngr->fadeOutGameSound(ClientCfg.SoundTPFade); - // Remove the selection. - UserEntity->selection(CLFECOMMON::INVALID_SLOT); - // Remove the target. - UserEntity->targetSlot(CLFECOMMON::INVALID_SLOT); - // Change the position of the entity and in Pacs. - UserEntity->pos(newPos); - // Select the closest continent from the new position. - CDummyProgress progress; - ContinentMngr.select(newPos, progress); - // Teleport the User. - UserEntity->tp(newPos); + // Remove the selection. + UserEntity->selection(CLFECOMMON::INVALID_SLOT); + // Remove the target. + UserEntity->targetSlot(CLFECOMMON::INVALID_SLOT); + // Change the position of the entity and in Pacs. + UserEntity->pos(newPos); + // Select the closest continent from the new position. + CDummyProgress progress; + ContinentMngr.select(newPos, progress); + // Teleport the User. + UserEntity->tp(newPos); - // First frame (for sound fade in) - extern bool FirstFrame; - FirstFrame = true; + // First frame (for sound fade in) + extern bool FirstFrame; + FirstFrame = true; - return true; + return true; } NLMISC_COMMAND(removeEntity, "Remove an entity", "") { - if (args.size() != 1) return false; - uint slot; - fromString(args[0], slot); - EntitiesMngr.remove(slot, true); - return true; + if (args.size() != 1) return false; + uint slot; + fromString(args[0], slot); + EntitiesMngr.remove(slot, true); + return true; } NLMISC_COMMAND(entity, "Create an entity on the user or just remove it if Form not valid", "
[posx posy posz] [relativeToPlayer]") { - CInterfaceManager *IM = CInterfaceManager::getInstance (); + CInterfaceManager *IM = CInterfaceManager::getInstance (); - // Check parameters. - if(args.size() != 2 && args.size() != 5 && args.size() != 6) - return false; + // Check parameters. + if(args.size() != 2 && args.size() != 5 && args.size() != 6) + return false; - // read pos. - CVector entityPos; - if(args.size()>=5) - { - fromString(args[2], entityPos.x); - fromString(args[3], entityPos.y); - fromString(args[4], entityPos.z); - // if want pos local to UserEntity - if(args.size()==6) + // read pos. + CVector entityPos; + if(args.size()>=5) { - sint32 tmp; - fromString(args[5], tmp); - if (tmp != 0) - { - CMatrix mat; - mat.setRot(CVector::I, UserEntity->front(), CVector::K); - mat.normalize(CMatrix::YZX); - mat.setPos(UserEntity->pos()); - entityPos= mat * entityPos; - } + fromString(args[2], entityPos.x); + fromString(args[3], entityPos.y); + fromString(args[4], entityPos.z); + // if want pos local to UserEntity + if(args.size()==6) + { + sint32 tmp; + fromString(args[5], tmp); + if (tmp != 0) + { + CMatrix mat; + mat.setRot(CVector::I, UserEntity->front(), CVector::K); + mat.normalize(CMatrix::YZX); + mat.setPos(UserEntity->pos()); + entityPos= mat * entityPos; + } + } + } + else + { + entityPos= UserEntity->pos()+UserEntity->front()*2.0; } - } - else - { - entityPos= UserEntity->pos()+UserEntity->front()*2.0; - } - // Try to create the sheet with the parameter as a string. - CSheetId sheetId; - if(!sheetId.buildSheetId(args[1])) - { - // Try to create the sheet with the parameter as an int. - uint32 nSheetId; - fromString(args[1], nSheetId); - sheetId = CSheetId(nSheetId); - if(sheetId == CSheetId::Unknown) + // Try to create the sheet with the parameter as a string. + CSheetId sheetId; + if(!sheetId.buildSheetId(args[1])) { - nlwarning("Command 'entity': '%s' is not a valid form", args[1].c_str()); - return false; + // Try to create the sheet with the parameter as an int. + uint32 nSheetId; + fromString(args[1], nSheetId); + sheetId = CSheetId(nSheetId); + if(sheetId == CSheetId::Unknown) + { + nlwarning("Command 'entity': '%s' is not a valid form", args[1].c_str()); + return false; + } } - } - // The slot where the new entity will be. - CLFECOMMON::TCLEntityId slot; - fromString(args[0], slot); + // The slot where the new entity will be. + CLFECOMMON::TCLEntityId slot; + fromString(args[0], slot); - // Debug Infos - nldebug("Command 'entity' : AddNewEntity with form %s in the slot %d", args[1].c_str(), slot); - // Remove the old entity. - EntitiesMngr.remove(slot, false); - // Create the new entity. + // Debug Infos + nldebug("Command 'entity' : AddNewEntity with form %s in the slot %d", args[1].c_str(), slot); + // Remove the old entity. + EntitiesMngr.remove(slot, false); + // Create the new entity. - TNewEntityInfo emptyEntityInfo; - emptyEntityInfo.reset(); - CEntityCL *entity = EntitiesMngr.create(slot, sheetId.asInt(), emptyEntityInfo); - if(entity) - { - sint64 *prop = 0; - CCDBNodeLeaf *node = 0; - // Set The property 'CLFECOMMON::PROPERTY_POSITION'. - node = NLGUI::CDBManager::getInstance()->getDbProp("SERVER:Entities:E"+toString("%d", slot)+":P"+toString("%d", CLFECOMMON::PROPERTY_POSX), false); - if(node) + TNewEntityInfo emptyEntityInfo; + emptyEntityInfo.reset(); + CEntityCL *entity = EntitiesMngr.create(slot, sheetId.asInt(), emptyEntityInfo); + if(entity) { - sint64 x = (sint64)(entityPos.x*1000.0); - sint64 y = (sint64)(entityPos.y*1000.0); - sint64 z = (sint64)(entityPos.z*1000.0); - node->setValue64(x); - node = NLGUI::CDBManager::getInstance()->getDbProp("SERVER:Entities:E"+toString("%d", slot)+":P"+toString("%d", CLFECOMMON::PROPERTY_POSY), false); - if(node) - { - node->setValue64(y); - node = NLGUI::CDBManager::getInstance()->getDbProp("SERVER:Entities:E"+toString("%d", slot)+":P"+toString("%d", CLFECOMMON::PROPERTY_POSZ), false); - if(node) - node->setValue64(z); - } + sint64 *prop = 0; + CCDBNodeLeaf *node = 0; + // Set The property 'CLFECOMMON::PROPERTY_POSITION'. + node = NLGUI::CDBManager::getInstance()->getDbProp("SERVER:Entities:E"+toString("%d", slot)+":P"+toString("%d", CLFECOMMON::PROPERTY_POSX), false); + if(node) + { + sint64 x = (sint64)(entityPos.x*1000.0); + sint64 y = (sint64)(entityPos.y*1000.0); + sint64 z = (sint64)(entityPos.z*1000.0); + node->setValue64(x); + node = NLGUI::CDBManager::getInstance()->getDbProp("SERVER:Entities:E"+toString("%d", slot)+":P"+toString("%d", CLFECOMMON::PROPERTY_POSY), false); + if(node) + { + node->setValue64(y); + node = NLGUI::CDBManager::getInstance()->getDbProp("SERVER:Entities:E"+toString("%d", slot)+":P"+toString("%d", CLFECOMMON::PROPERTY_POSZ), false); + if(node) + node->setValue64(z); + } + } + // Set The property 'PROPERTY_ORIENTATION'. + node = NLGUI::CDBManager::getInstance()->getDbProp("SERVER:Entities:E"+toString("%d", slot)+":P"+toString("%d", CLFECOMMON::PROPERTY_ORIENTATION), false); + if(node) + { + float dir = (float)atan2(UserEntity->front().y, UserEntity->front().x); + prop = (sint64 *)(&dir); + node->setValue64(*prop); + } + // Set Mode + node = NLGUI::CDBManager::getInstance()->getDbProp("SERVER:Entities:E"+toString("%d", slot)+":P"+toString("%d", CLFECOMMON::PROPERTY_MODE), false); + if(node) + { + MBEHAV::EMode m = MBEHAV::NORMAL; + prop = (sint64 *)&m; + node->setValue64(*prop); + EntitiesMngr.updateVisualProperty(0, slot, CLFECOMMON::PROPERTY_MODE); + } + // Set Visual Properties + if(dynamic_cast(entity)) + { + SPropVisualA visualA; + visualA.PropertySubData.Sex = ClientCfg.Sex; + SPropVisualB visualB; + // Initialize the Visual Property C (Default parameters). + SPropVisualC visualC; + visualC.PropertySubData.CharacterHeight = 7; + visualC.PropertySubData.ArmsWidth = 7; + visualC.PropertySubData.LegsWidth = 7; + visualC.PropertySubData.TorsoWidth = 7; + visualC.PropertySubData.BreastSize = 7; + // Set The Database + prop = (sint64 *)&visualB; + NLGUI::CDBManager::getInstance()->getDbProp("SERVER:Entities:E"+toString("%d", slot)+":P"+toString("%d", CLFECOMMON::PROPERTY_VPB))->setValue64(*prop); + prop = (sint64 *)&visualC; + NLGUI::CDBManager::getInstance()->getDbProp("SERVER:Entities:E"+toString("%d", slot)+":P"+toString("%d", CLFECOMMON::PROPERTY_VPC))->setValue64(*prop); + prop = (sint64 *)&visualA; + NLGUI::CDBManager::getInstance()->getDbProp("SERVER:Entities:E"+toString("%d", slot)+":P"+toString("%d", CLFECOMMON::PROPERTY_VPA))->setValue64(*prop); + // Apply Changes. + EntitiesMngr.updateVisualProperty(0, slot, CLFECOMMON::PROPERTY_VPA); + } + // Forage Source special + if(dynamic_cast(entity)) + { + sint64 barVal; + barVal= 32; barVal<<= 7; + barVal+= 32; barVal<<= 7; + barVal+= 10; barVal<<= 7; + barVal+= 127; + NLGUI::CDBManager::getInstance()->getDbProp("SERVER:Entities:E"+toString("%d", slot)+":P"+toString("%d", CLFECOMMON::PROPERTY_BARS))->setValue64(barVal); + EntitiesMngr.updateVisualProperty(0, slot, CLFECOMMON::PROPERTY_BARS); + // must also update position, else don't work + EntitiesMngr.updateVisualProperty(0, slot, CLFECOMMON::PROPERTY_POSITION); + } + else + if (dynamic_cast(entity)) // FX cl special + { + // must also update position, else don't work + EntitiesMngr.updateVisualProperty(0, slot, CLFECOMMON::PROPERTY_POSITION); + } + // + nlinfo("entity: slot: %d \"%s\", \"%f\", \"%f\", \"%f\" ", + slot,args[1].c_str(), + entityPos.x, entityPos.y, entityPos.z); } - // Set The property 'PROPERTY_ORIENTATION'. - node = NLGUI::CDBManager::getInstance()->getDbProp("SERVER:Entities:E"+toString("%d", slot)+":P"+toString("%d", CLFECOMMON::PROPERTY_ORIENTATION), false); - if(node) - { - float dir = (float)atan2(UserEntity->front().y, UserEntity->front().x); - prop = (sint64 *)(&dir); - node->setValue64(*prop); - } - // Set Mode - node = NLGUI::CDBManager::getInstance()->getDbProp("SERVER:Entities:E"+toString("%d", slot)+":P"+toString("%d", CLFECOMMON::PROPERTY_MODE), false); - if(node) - { - MBEHAV::EMode m = MBEHAV::NORMAL; - prop = (sint64 *)&m; - node->setValue64(*prop); - EntitiesMngr.updateVisualProperty(0, slot, CLFECOMMON::PROPERTY_MODE); - } - // Set Visual Properties - if(dynamic_cast(entity)) - { - SPropVisualA visualA; - visualA.PropertySubData.Sex = ClientCfg.Sex; - SPropVisualB visualB; - // Initialize the Visual Property C (Default parameters). - SPropVisualC visualC; - visualC.PropertySubData.CharacterHeight = 7; - visualC.PropertySubData.ArmsWidth = 7; - visualC.PropertySubData.LegsWidth = 7; - visualC.PropertySubData.TorsoWidth = 7; - visualC.PropertySubData.BreastSize = 7; - // Set The Database - prop = (sint64 *)&visualB; - NLGUI::CDBManager::getInstance()->getDbProp("SERVER:Entities:E"+toString("%d", slot)+":P"+toString("%d", CLFECOMMON::PROPERTY_VPB))->setValue64(*prop); - prop = (sint64 *)&visualC; - NLGUI::CDBManager::getInstance()->getDbProp("SERVER:Entities:E"+toString("%d", slot)+":P"+toString("%d", CLFECOMMON::PROPERTY_VPC))->setValue64(*prop); - prop = (sint64 *)&visualA; - NLGUI::CDBManager::getInstance()->getDbProp("SERVER:Entities:E"+toString("%d", slot)+":P"+toString("%d", CLFECOMMON::PROPERTY_VPA))->setValue64(*prop); - // Apply Changes. - EntitiesMngr.updateVisualProperty(0, slot, CLFECOMMON::PROPERTY_VPA); - } - // Forage Source special - if(dynamic_cast(entity)) - { - sint64 barVal; - barVal= 32; barVal<<= 7; - barVal+= 32; barVal<<= 7; - barVal+= 10; barVal<<= 7; - barVal+= 127; - NLGUI::CDBManager::getInstance()->getDbProp("SERVER:Entities:E"+toString("%d", slot)+":P"+toString("%d", CLFECOMMON::PROPERTY_BARS))->setValue64(barVal); - EntitiesMngr.updateVisualProperty(0, slot, CLFECOMMON::PROPERTY_BARS); - // must also update position, else don't work - EntitiesMngr.updateVisualProperty(0, slot, CLFECOMMON::PROPERTY_POSITION); - } - else - if (dynamic_cast(entity)) // FX cl special - { - // must also update position, else don't work - EntitiesMngr.updateVisualProperty(0, slot, CLFECOMMON::PROPERTY_POSITION); - } - // - nlinfo("entity: slot: %d \"%s\", \"%f\", \"%f\", \"%f\" ", - slot,args[1].c_str(), - entityPos.x, entityPos.y, entityPos.z); - } - else - nldebug("command 'entity' : entity in slot %d removed", slot); + else + nldebug("command 'entity' : entity in slot %d removed", slot); - // Command well done. - return true; + // Command well done. + return true; } NLMISC_COMMAND(primPoint, "add a primitive point", "") { - if(args.size() != 2) - return false; + if(args.size() != 2) + return false; - if(LDPrim == 0) - { - LDPrim = new NLLIGO::CPrimitives; - if(LDPrim == 0) + if(LDPrim == 0) { - nlwarning("primPoint: LDPrim == 0"); - return false; + LDPrim = new NLLIGO::CPrimitives; + if(LDPrim == 0) + { + nlwarning("primPoint: LDPrim == 0"); + return false; + } } - } - if(LDPrim->RootNode == 0) - { - nlwarning("primPoint: LDPrim.RootNode == 0"); - return true; - } - - NLLIGO::CPropertyString *str = 0; - NLLIGO::CPrimPoint *point = 0; - - point = new NLLIGO::CPrimPoint; - if(point == 0) - { - nlwarning("primPoint: point == 0"); - return true; - } - point->Point.x = (float)UserEntity->pos().x; - point->Point.y = (float)UserEntity->pos().y; - point->Point.z = (float)UserEntity->pos().z; - - str = new NLLIGO::CPropertyString; - if(str == 0) - { - nlwarning("primPoint: str == 0 (1)"); - return true; - } - point->addPropertyByName("class", str); - str->String = "reference_point"; - - str = new NLLIGO::CPropertyString; - if(str == 0) - { - nlwarning("primPoint: str == 0 (2)"); - return true; - } - point->addPropertyByName("name", str); - str->String = args[1]; - - // Add the point to the primitive. - LDPrim->RootNode->insertChild(point); - - // Open the file. - NLMISC::COFile file; - if(file.open(args[0])) - { - // Create the XML stream - NLMISC::COXml output; - // Init - if(output.init(&file, "1.0")) + if(LDPrim->RootNode == 0) { - LDPrim->write(output.getDocument(), args[0].c_str()); - // Flush the stream, write all the output file - output.flush(); + nlwarning("primPoint: LDPrim.RootNode == 0"); + return true; } - else - nlwarning("primPoint: "); - // Close the File. - file.close(); - } - else - nlwarning("primPoint: cannot open/create the file '%s'", args[0].c_str()); - return true; + NLLIGO::CPropertyString *str = 0; + NLLIGO::CPrimPoint *point = 0; + + point = new NLLIGO::CPrimPoint; + if(point == 0) + { + nlwarning("primPoint: point == 0"); + return true; + } + point->Point.x = (float)UserEntity->pos().x; + point->Point.y = (float)UserEntity->pos().y; + point->Point.z = (float)UserEntity->pos().z; + + str = new NLLIGO::CPropertyString; + if(str == 0) + { + nlwarning("primPoint: str == 0 (1)"); + return true; + } + point->addPropertyByName("class", str); + str->String = "reference_point"; + + str = new NLLIGO::CPropertyString; + if(str == 0) + { + nlwarning("primPoint: str == 0 (2)"); + return true; + } + point->addPropertyByName("name", str); + str->String = args[1]; + + // Add the point to the primitive. + LDPrim->RootNode->insertChild(point); + + // Open the file. + NLMISC::COFile file; + if(file.open(args[0])) + { + // Create the XML stream + NLMISC::COXml output; + // Init + if(output.init(&file, "1.0")) + { + LDPrim->write(output.getDocument(), args[0].c_str()); + // Flush the stream, write all the output file + output.flush(); + } + else + nlwarning("primPoint: "); + // Close the File. + file.close(); + } + else + nlwarning("primPoint: cannot open/create the file '%s'", args[0].c_str()); + + return true; } #ifdef ENABLE_INCOMING_MSG_RECORDER NLMISC_COMMAND(record, "Start Recording", "") { - CInterfaceManager *IM = CInterfaceManager::getInstance (); + CInterfaceManager *IM = CInterfaceManager::getInstance (); - // Check parameters. - if(args.size() != 1) - return false; + // Check parameters. + if(args.size() != 1) + return false; - // Warning when already recording. - if(NetMngr.isRecording()) - { - IM->displaySystemInfo(ucstring("Already Recording. Stop the current Record first")); - return true; - } + // Warning when already recording. + if(NetMngr.isRecording()) + { + IM->displaySystemInfo(ucstring("Already Recording. Stop the current Record first")); + return true; + } - // Save entities and DB. - dump(args[0]); + // Save entities and DB. + dump(args[0]); - // On/Off record. - if(!ClientCfg.Local) - NetMngr.setRecordingMode(true, args[0]+"_net.rec"); - return true; + // On/Off record. + if(!ClientCfg.Local) + NetMngr.setRecordingMode(true, args[0]+"_net.rec"); + return true; } NLMISC_COMMAND(replay, "replay", "") { - // Check parameters. - if(args.size() != 1) - return false; + // Check parameters. + if(args.size() != 1) + return false; - // Load entities and DB. - loadDump(args[0]); + // Load entities and DB. + loadDump(args[0]); - // On/Off record. - if(ClientCfg.Local) - NetMngr.setReplayingMode(!NetMngr.isReplaying(), args[0]+"_net.rec"); - return true; + // On/Off record. + if(ClientCfg.Local) + NetMngr.setReplayingMode(!NetMngr.isReplaying(), args[0]+"_net.rec"); + return true; } NLMISC_COMMAND(stopRecord, "Stop Recording", "") { - // Check parameters. - if(args.size() != 0) - return false; + // Check parameters. + if(args.size() != 0) + return false; - // On/Off record. - if(!ClientCfg.Local) - NetMngr.setRecordingMode(false); - return true; + // On/Off record. + if(!ClientCfg.Local) + NetMngr.setRecordingMode(false); + return true; } #endif // ENABLE_INCOMING_MSG_RECORDER NLMISC_COMMAND(loadDump, "Command to load a dump file", "[]") { - if(args.size() > 1) - return false; + if(args.size() > 1) + return false; - string dumpName; - if(args.size() == 1) - dumpName = args[0]; - else - dumpName = "default"; + string dumpName; + if(args.size() == 1) + dumpName = args[0]; + else + dumpName = "default"; - loadDump(dumpName); - return true; + loadDump(dumpName); + return true; } NLMISC_COMMAND(sheet2idx, "Return the index of a sheet", " ") { - CInterfaceManager *IM = CInterfaceManager::getInstance (); + CInterfaceManager *IM = CInterfaceManager::getInstance (); - if(args.size() != 2) - return false; + if(args.size() != 2) + return false; - string result; - NLMISC::CSheetId sheetId; + string result; + NLMISC::CSheetId sheetId; - if(sheetId.buildSheetId(args[0])) - { - uint slot; - fromString(args[1], slot); - uint32 idx = CVisualSlotManager::getInstance()->sheet2Index(sheetId, (SLOTTYPE::EVisualSlot)slot); - result = NLMISC::toString("Index = %d", idx); - } - else - result = NLMISC::toString("sheet '%s' not valid", args[0].c_str()); + if(sheetId.buildSheetId(args[0])) + { + uint slot; + fromString(args[1], slot); + uint32 idx = CVisualSlotManager::getInstance()->sheet2Index(sheetId, (SLOTTYPE::EVisualSlot)slot); + result = NLMISC::toString("Index = %d", idx); + } + else + result = NLMISC::toString("sheet '%s' not valid", args[0].c_str()); - IM->displaySystemInfo(ucstring(result)); - nlinfo("'sheet2idx': %s", result.c_str()); - return true; + IM->displaySystemInfo(ucstring(result)); + nlinfo("'sheet2idx': %s", result.c_str()); + return true; } NLMISC_COMMAND(watchEntity, "Choose the entity to watch", "") { - if(args.size() != 1) - return false; + if(args.size() != 1) + return false; - // Set the new debug entity slot. - fromString(args[0], WatchedEntitySlot); - return true; + // Set the new debug entity slot. + fromString(args[0], WatchedEntitySlot); + return true; } NLMISC_COMMAND(dynstr, "display a dyn string value", "") { - if (args.size() != 1) - return false; + if (args.size() != 1) + return false; - uint dynId; - fromString(args[0], dynId); + uint dynId; + fromString(args[0], dynId); - ucstring result; - STRING_MANAGER::CStringManagerClient::instance()->getDynString(dynId, result); + ucstring result; + STRING_MANAGER::CStringManagerClient::instance()->getDynString(dynId, result); - CInterfaceManager::getInstance()->displaySystemInfo(result); - return true; + CInterfaceManager::getInstance()->displaySystemInfo(result); + return true; } NLMISC_COMMAND(serverstr, "display a server string value", "") { - if (args.size() != 1) - return false; + if (args.size() != 1) + return false; - uint dynId; - fromString(args[0], dynId); + uint dynId; + fromString(args[0], dynId); - ucstring result; - STRING_MANAGER::CStringManagerClient::instance()->getString(dynId, result); + ucstring result; + STRING_MANAGER::CStringManagerClient::instance()->getString(dynId, result); - CInterfaceManager::getInstance()->displaySystemInfo(result); - return true; + CInterfaceManager::getInstance()->displaySystemInfo(result); + return true; } NLMISC_COMMAND(cmd, "Send a command to a server"," ") { - // Check parameters. - if(args.size() < 2) - return false; + // Check parameters. + if(args.size() < 2) + return false; - CBitMemStream out; - if(GenericMsgHeaderMngr.pushNameToStream("DEBUG:CMD", out)) - { - bool addentity = false; - string dest = args[0]; - string cmd = args[1]; - string arg; - for (uint i = 2; i < args.size(); i++) + CBitMemStream out; + if(GenericMsgHeaderMngr.pushNameToStream("DEBUG:CMD", out)) { - arg += args[i] + " "; + bool addentity = false; + string dest = args[0]; + string cmd = args[1]; + string arg; + for (uint i = 2; i < args.size(); i++) + { + arg += args[i] + " "; + } + out.serial(addentity); + out.serial(dest); + out.serial(cmd); + out.serial(arg); + NetMngr.push(out); } - out.serial(addentity); - out.serial(dest); - out.serial(cmd); - out.serial(arg); - NetMngr.push(out); - } - else - nlwarning("mainLoop : unknown message name DEBUG:CMD"); - return true; + else + nlwarning("mainLoop : unknown message name DEBUG:CMD"); + return true; } NLMISC_COMMAND(cmde, "Send a command to a server with entityid"," ") { - // Check parameters. - if(args.size() < 2) - return false; + // Check parameters. + if(args.size() < 2) + return false; - CBitMemStream out; - if(GenericMsgHeaderMngr.pushNameToStream("DEBUG:CMD", out)) - { - bool addentity = true; - string dest = args[0]; - string cmd = args[1]; - string arg; - for (uint i = 2; i < args.size(); i++) + CBitMemStream out; + if(GenericMsgHeaderMngr.pushNameToStream("DEBUG:CMD", out)) { - arg += args[i] + " "; + bool addentity = true; + string dest = args[0]; + string cmd = args[1]; + string arg; + for (uint i = 2; i < args.size(); i++) + { + arg += args[i] + " "; + } + out.serial(addentity); + out.serial(dest); + out.serial(cmd); + out.serial(arg); + NetMngr.push(out); } - out.serial(addentity); - out.serial(dest); - out.serial(cmd); - out.serial(arg); - NetMngr.push(out); - } - else - nlwarning("mainLoop : unknown message name DEBUG:CMD"); - return true; + else + nlwarning("mainLoop : unknown message name DEBUG:CMD"); + return true; } NLMISC_COMMAND(askservices, "Ask the server all services up", "") { - CBitMemStream out; - if(GenericMsgHeaderMngr.pushNameToStream("DEBUG:SERVICES", out)) - { - // Add the message to the send list. - NetMngr.push(out); - nlinfo("command 'services': 'DEBUG:SERVICES' sent"); - } - else - nlwarning("command 'services': unknown message named 'DEBUG:SERVICES'"); + CBitMemStream out; + if(GenericMsgHeaderMngr.pushNameToStream("DEBUG:SERVICES", out)) + { + // Add the message to the send list. + NetMngr.push(out); + nlinfo("command 'services': 'DEBUG:SERVICES' sent"); + } + else + nlwarning("command 'services': unknown message named 'DEBUG:SERVICES'"); - return true; + return true; } NLMISC_COMMAND(mode, "Change the mode for an entity in a slot", " [dt(tick)]") { - // Check parameters. - if(args.size() < 2) - { - // Help - CInterfaceManager::getInstance()->displaySystemInfo(ucstring("This command need 2 paramters :")); - CInterfaceManager::getInstance()->displaySystemInfo(ucstring(" : the slot number of the entity to change")); - CInterfaceManager::getInstance()->displaySystemInfo(ucstring(" : the mode wanted for the entity, one of the following number :")); - for(uint i = 0; idisplaySystemInfo(ucstring(NLMISC::toString(" %d - %s", i, MBEHAV::modeToString((MBEHAV::EMode)i).c_str()))); - } - // Right parameters number - else - { - // Compute parameters - CLFECOMMON::TCLEntityId slot; - fromString(args[0], slot); - MBEHAV::EMode mod = MBEHAV::stringToMode(args[1]); - if(mod==MBEHAV::UNKNOWN_MODE) + // Check parameters. + if(args.size() < 2) { - sint32 nMode; - fromString(args[1], nMode); - mod = (MBEHAV::EMode)nMode; + // Help + CInterfaceManager::getInstance()->displaySystemInfo(ucstring("This command need 2 paramters :")); + CInterfaceManager::getInstance()->displaySystemInfo(ucstring(" : the slot number of the entity to change")); + CInterfaceManager::getInstance()->displaySystemInfo(ucstring(" : the mode wanted for the entity, one of the following number :")); + for(uint i = 0; idisplaySystemInfo(ucstring(NLMISC::toString(" %d - %s", i, MBEHAV::modeToString((MBEHAV::EMode)i).c_str()))); + } + // Right parameters number + else + { + // Compute parameters + CLFECOMMON::TCLEntityId slot; + fromString(args[0], slot); + MBEHAV::EMode mod = MBEHAV::stringToMode(args[1]); + if(mod==MBEHAV::UNKNOWN_MODE) + { + sint32 nMode; + fromString(args[1], nMode); + mod = (MBEHAV::EMode)nMode; + } + + // Compute the position. + CEntityCL *entity = EntitiesMngr.entity(slot); + if(entity) + { + // Write the behaviour in the DB. + IngameDbMngr.setProp("Entities:E" + toString(slot) + ":P" + toString(CLFECOMMON::PROPERTY_MODE), mod); + // Update the behaviour. + sint32 dt= 10; + if(args.size() > 2) + fromString(args[2], dt); + entity->updateVisualProperty(NetMngr.getCurrentServerTick()+dt, CLFECOMMON::PROPERTY_MODE); + } + // Invalid slot. + else + CInterfaceManager::getInstance()->displaySystemInfo(ucstring("There is no entity in the given slot")); } - // Compute the position. - CEntityCL *entity = EntitiesMngr.entity(slot); - if(entity) - { - // Write the behaviour in the DB. - IngameDbMngr.setProp("Entities:E" + toString(slot) + ":P" + toString(CLFECOMMON::PROPERTY_MODE), mod); - // Update the behaviour. - sint32 dt= 10; - if(args.size() > 2) - fromString(args[2], dt); - entity->updateVisualProperty(NetMngr.getCurrentServerTick()+dt, CLFECOMMON::PROPERTY_MODE); - } - // Invalid slot. - else - CInterfaceManager::getInstance()->displaySystemInfo(ucstring("There is no entity in the given slot")); - } - - // Command well done. - return true; + // Command well done. + return true; } NLMISC_COMMAND(behaviour, "Change the behaviour for an entity in a slot", " [] [] [] [dt(tick)]") { - // Check parameters. - if(args.size() < 2 || args.size() > 6) - { - // Help - CInterfaceManager::getInstance()->displaySystemInfo(ucstring("This command need 2 to 6 paramters :")); - CInterfaceManager::getInstance()->displaySystemInfo(ucstring(" : the slot number of the entity to change")); - CInterfaceManager::getInstance()->displaySystemInfo(ucstring(" : the behaviour to play for the entity, one of the following number :")); - for(uint i = 0; idisplaySystemInfo(ucstring(NLMISC::toString(" %d - %s", i, MBEHAV::behaviourToString((MBEHAV::EBehaviour)i).c_str()))); - CInterfaceManager::getInstance()->displaySystemInfo(ucstring(NLMISC::toString(" %d-%d - Emotes", MBEHAV::EMOTE_BEGIN, MBEHAV::EMOTE_END))); - } - else - { - // Compute parameters - CLFECOMMON::TCLEntityId slot; - fromString(args[0], slot); - MBEHAV::EBehaviour beh = MBEHAV::stringToBehaviour(args[1]); - if(beh==MBEHAV::UNKNOWN_BEHAVIOUR) + // Check parameters. + if(args.size() < 2 || args.size() > 6) { - sint32 temp; - fromString(args[1], temp); - beh= (MBEHAV::EBehaviour)temp; + // Help + CInterfaceManager::getInstance()->displaySystemInfo(ucstring("This command need 2 to 6 paramters :")); + CInterfaceManager::getInstance()->displaySystemInfo(ucstring(" : the slot number of the entity to change")); + CInterfaceManager::getInstance()->displaySystemInfo(ucstring(" : the behaviour to play for the entity, one of the following number :")); + for(uint i = 0; idisplaySystemInfo(ucstring(NLMISC::toString(" %d - %s", i, MBEHAV::behaviourToString((MBEHAV::EBehaviour)i).c_str()))); + CInterfaceManager::getInstance()->displaySystemInfo(ucstring(NLMISC::toString(" %d-%d - Emotes", MBEHAV::EMOTE_BEGIN, MBEHAV::EMOTE_END))); + } + else + { + // Compute parameters + CLFECOMMON::TCLEntityId slot; + fromString(args[0], slot); + MBEHAV::EBehaviour beh = MBEHAV::stringToBehaviour(args[1]); + if(beh==MBEHAV::UNKNOWN_BEHAVIOUR) + { + sint32 temp; + fromString(args[1], temp); + beh= (MBEHAV::EBehaviour)temp; + } + + // Make the behaviour + MBEHAV::CBehaviour behaviour(beh); + // Get the Power + if ( (beh == MBEHAV::PROSPECTING) || (beh == MBEHAV::PROSPECTING_END) ) + { + if(args.size() > 2) + { + uint16 range; + fromString(args[2], range); + behaviour.ForageProspection.Range = range; // 0..127 + } + if(args.size() > 3) + { + uint16 angle; + fromString(args[3], angle); + behaviour.ForageProspection.Angle = angle; // 0..3 + } + if(args.size() > 4) + { + uint16 level; + fromString(args[4], level); + behaviour.ForageProspection.Level = level; // 0..4 + } + } + else + { + if(args.size() > 2) + { + uint16 impactIntensity; + fromString(args[2], impactIntensity); + behaviour.Combat.ImpactIntensity = impactIntensity; + } + if(args.size() > 3) + { + uint16 impactIntensity; + fromString(args[3], impactIntensity); + behaviour.Combat.ImpactIntensity = impactIntensity; + } + if(args.size() > 4) + fromString(args[4], behaviour.DeltaHP); + } + // get the dt + sint32 dt= 10; + if(args.size() > 5) + fromString(args[5], dt); + + // Compute the position. + CEntityCL *entity = EntitiesMngr.entity(slot); + if(entity) + { + // Write the behaviour in the DB. + IngameDbMngr.setProp("Entities:E" + toString(slot) + ":P" + toString(CLFECOMMON::PROPERTY_BEHAVIOUR), behaviour); + // Update the behaviour. + entity->updateVisualProperty(NetMngr.getCurrentServerTick()+dt, CLFECOMMON::PROPERTY_BEHAVIOUR); + } + else + CInterfaceManager::getInstance()->displaySystemInfo(ucstring("There is no entity in the given slot")); } - // Make the behaviour - MBEHAV::CBehaviour behaviour(beh); - // Get the Power - if ( (beh == MBEHAV::PROSPECTING) || (beh == MBEHAV::PROSPECTING_END) ) - { - if(args.size() > 2) - { - uint16 range; - fromString(args[2], range); - behaviour.ForageProspection.Range = range; // 0..127 - } - if(args.size() > 3) - { - uint16 angle; - fromString(args[3], angle); - behaviour.ForageProspection.Angle = angle; // 0..3 - } - if(args.size() > 4) - { - uint16 level; - fromString(args[4], level); - behaviour.ForageProspection.Level = level; // 0..4 - } - } - else - { - if(args.size() > 2) - { - uint16 impactIntensity; - fromString(args[2], impactIntensity); - behaviour.Combat.ImpactIntensity = impactIntensity; - } - if(args.size() > 3) - { - uint16 impactIntensity; - fromString(args[3], impactIntensity); - behaviour.Combat.ImpactIntensity = impactIntensity; - } - if(args.size() > 4) - fromString(args[4], behaviour.DeltaHP); - } - // get the dt - sint32 dt= 10; - if(args.size() > 5) - fromString(args[5], dt); - - // Compute the position. - CEntityCL *entity = EntitiesMngr.entity(slot); - if(entity) - { - // Write the behaviour in the DB. - IngameDbMngr.setProp("Entities:E" + toString(slot) + ":P" + toString(CLFECOMMON::PROPERTY_BEHAVIOUR), behaviour); - // Update the behaviour. - entity->updateVisualProperty(NetMngr.getCurrentServerTick()+dt, CLFECOMMON::PROPERTY_BEHAVIOUR); - } - else - CInterfaceManager::getInstance()->displaySystemInfo(ucstring("There is no entity in the given slot")); - } - - // Command well done. - return true; + // Command well done. + return true; } /* - NLMISC_COMMAND(magic, "Cast a spell", "\n" - " : the one who cast the spell\n" - " : 0->GOOD 1->Bad 2->NEUTRAL\n" - " : 0->success 1->Fail 2->Fumble\n" - " : \n" - " : \n" - " : 0->not resisted, any other->resisted.\n") - { - CInterfaceManager *IM = CInterfaceManager::getInstance (); +NLMISC_COMMAND(magic, "Cast a spell", "\n" +" : the one who cast the spell\n" +" : 0->GOOD 1->Bad 2->NEUTRAL\n" +" : 0->success 1->Fail 2->Fumble\n" +" : \n" +" : \n" +" : 0->not resisted, any other->resisted.\n") +{ + CInterfaceManager *IM = CInterfaceManager::getInstance (); - // Check parameters. - if(args.size() != 6) - { - // Help - // CInterfaceManager::getInstance()->displaySystemInfo(ucstring("This command need 2 or 3 paramters :")); - // CInterfaceManager::getInstance()->displaySystemInfo(ucstring(" : the slot number of the entity to change")); - // CInterfaceManager::getInstance()->displaySystemInfo(ucstring(" : the behaviour to play for the entity, one of the following number :")); - // for(uint i = 0; idisplaySystemInfo(ucstring(NLMISC::toString(" %d - %s", i, MBEHAV::behaviourToString((MBEHAV::EBehaviour)i)))); - // CInterfaceManager::getInstance()->displaySystemInfo(ucstring(NLMISC::toString(" %d-%d - Emotes", MBEHAV::EMOTE_BEGIN, MBEHAV::EMOTE_END))); - } - else - { - // Compute parameters - CLFECOMMON::TCLEntityId slot; - fromString(args[0], slot); - // Magic Type (good bad neutral) - uint type; - fromString(args[1], type); - type %= 3; - MBEHAV::EBehaviour behTmp = (MBEHAV::EBehaviour)(MBEHAV::CASTING_GOOD+type); - MBEHAV::CBehaviour castingBeh(behTmp); - // Result - MBEHAV::CBehaviour behaviour; - uint result; - fromString(args[2], result); - result %= %3; - if (type==0) - behaviour.Behaviour = (MBEHAV::EBehaviour)(MBEHAV::END_CASTING_GOOD_SUCCESS + result); - else if(type==1) - behaviour.Behaviour = (MBEHAV::EBehaviour)(MBEHAV::END_CASTING_BAD_SUCCESS + result); - else - behaviour.Behaviour = (MBEHAV::EBehaviour)(MBEHAV::END_CASTING_NEUTRAL_SUCCESS + result); - uint16 spellPower, impactIntensity; - // Spell Power - fromString(args[3], spellPower); - behaviour.Magic.SpellPower = spellPower; - // Impact Intensity - fromString(args[4], impactIntensity); - behaviour.Magic.ImpactIntensity = impactIntensity; - // Resist - bool targetResists; - fromString(args[5], targetResists); - behaviour.Magic.TargetResists = targetResists; - // Get the entity - CEntityCL *entity = EntitiesMngr.entity(slot); - if(entity) - { - // Write the behaviour in the DB. - IngameDbMngr.setProp("Entities:E" + toString(slot) + ":P" + toString(CLFECOMMON::PROPERTY_BEHAVIOUR), castingBeh); - // Update the behaviour. - entity->updateVisualProperty(NetMngr.getCurrentServerTick()+10, CLFECOMMON::PROPERTY_BEHAVIOUR); - // Write the behaviour in the DB. - IngameDbMngr.setProp("Entities:E" + toString(slot) + ":P" + toString(CLFECOMMON::PROPERTY_BEHAVIOUR), behaviour); - // Update the behaviour. - entity->updateVisualProperty(NetMngr.getCurrentServerTick()+50, CLFECOMMON::PROPERTY_BEHAVIOUR); - } - else - CInterfaceManager::getInstance()->displaySystemInfo(ucstring("There is no entity in the given slot")); - } + // Check parameters. + if(args.size() != 6) + { + // Help +// CInterfaceManager::getInstance()->displaySystemInfo(ucstring("This command need 2 or 3 paramters :")); +// CInterfaceManager::getInstance()->displaySystemInfo(ucstring(" : the slot number of the entity to change")); +// CInterfaceManager::getInstance()->displaySystemInfo(ucstring(" : the behaviour to play for the entity, one of the following number :")); +// for(uint i = 0; idisplaySystemInfo(ucstring(NLMISC::toString(" %d - %s", i, MBEHAV::behaviourToString((MBEHAV::EBehaviour)i)))); +// CInterfaceManager::getInstance()->displaySystemInfo(ucstring(NLMISC::toString(" %d-%d - Emotes", MBEHAV::EMOTE_BEGIN, MBEHAV::EMOTE_END))); + } + else + { + // Compute parameters + CLFECOMMON::TCLEntityId slot; + fromString(args[0], slot); + // Magic Type (good bad neutral) + uint type; + fromString(args[1], type); + type %= 3; + MBEHAV::EBehaviour behTmp = (MBEHAV::EBehaviour)(MBEHAV::CASTING_GOOD+type); + MBEHAV::CBehaviour castingBeh(behTmp); + // Result + MBEHAV::CBehaviour behaviour; + uint result; + fromString(args[2], result); + result %= %3; + if (type==0) + behaviour.Behaviour = (MBEHAV::EBehaviour)(MBEHAV::END_CASTING_GOOD_SUCCESS + result); + else if(type==1) + behaviour.Behaviour = (MBEHAV::EBehaviour)(MBEHAV::END_CASTING_BAD_SUCCESS + result); + else + behaviour.Behaviour = (MBEHAV::EBehaviour)(MBEHAV::END_CASTING_NEUTRAL_SUCCESS + result); + uint16 spellPower, impactIntensity; + // Spell Power + fromString(args[3], spellPower); + behaviour.Magic.SpellPower = spellPower; + // Impact Intensity + fromString(args[4], impactIntensity); + behaviour.Magic.ImpactIntensity = impactIntensity; + // Resist + bool targetResists; + fromString(args[5], targetResists); + behaviour.Magic.TargetResists = targetResists; + // Get the entity + CEntityCL *entity = EntitiesMngr.entity(slot); + if(entity) + { + // Write the behaviour in the DB. + IngameDbMngr.setProp("Entities:E" + toString(slot) + ":P" + toString(CLFECOMMON::PROPERTY_BEHAVIOUR), castingBeh); + // Update the behaviour. + entity->updateVisualProperty(NetMngr.getCurrentServerTick()+10, CLFECOMMON::PROPERTY_BEHAVIOUR); + // Write the behaviour in the DB. + IngameDbMngr.setProp("Entities:E" + toString(slot) + ":P" + toString(CLFECOMMON::PROPERTY_BEHAVIOUR), behaviour); + // Update the behaviour. + entity->updateVisualProperty(NetMngr.getCurrentServerTick()+50, CLFECOMMON::PROPERTY_BEHAVIOUR); + } + else + CInterfaceManager::getInstance()->displaySystemInfo(ucstring("There is no entity in the given slot")); + } - // Command well done. - return true; - } + // Command well done. + return true; +} */ NLMISC_COMMAND(spell, "Cast a spell", "\n" - " : the one who cast the spell\n" - " : 0->OFF 1->CUR 2->MIX\n" - " : 0->Fail 1->Fumble 2->Success 3->Link\n" - " : 0->Resist 1->Not Resist\n" - " : \n" - " : [0, 5]\n") + " : the one who cast the spell\n" + " : 0->OFF 1->CUR 2->MIX\n" + " : 0->Fail 1->Fumble 2->Success 3->Link\n" + " : 0->Resist 1->Not Resist\n" + " : \n" + " : [0, 5]\n") { - // Check parameters. - if(args.size() != 6) - { - // Help - // CInterfaceManager::getInstance()->displaySystemInfo(ucstring("This command need 2 or 3 paramters :")); - // CInterfaceManager::getInstance()->displaySystemInfo(ucstring(" : the slot number of the entity to change")); - // CInterfaceManager::getInstance()->displaySystemInfo(ucstring(" : the behaviour to play for the entity, one of the following number :")); - // for(uint i = 0; idisplaySystemInfo(ucstring(NLMISC::toString(" %d - %s", i, MBEHAV::behaviourToString((MBEHAV::EBehaviour)i)))); - // CInterfaceManager::getInstance()->displaySystemInfo(ucstring(NLMISC::toString(" %d-%d - Emotes", MBEHAV::EMOTE_BEGIN, MBEHAV::EMOTE_END))); - } - else - { - // Compute parameters - CLFECOMMON::TCLEntityId slot; - fromString(args[0], slot); - // Magic Type (good bad neutral) - uint type; - fromString(args[1], type); - type %= 3; - MBEHAV::EBehaviour behTmp = (MBEHAV::EBehaviour)(MBEHAV::CAST_OFF+type); - MBEHAV::CBehaviour castingBeh(behTmp); - // Result - MBEHAV::CBehaviour behaviour; - uint result; - fromString(args[2], result); - result %= 4; - behaviour.Behaviour = (MBEHAV::EBehaviour)(MBEHAV::CAST_OFF_FAIL+type*4+result); - // Spell Power - uint16 spellMode; - fromString(args[3], spellMode); - behaviour.Spell.SpellMode = spellMode; - // Impact Intensity - uint16 spellId; - fromString(args[4], spellId); - behaviour.Spell.SpellId = spellId; - // Resist - uint16 spellIntensity; - fromString(args[5], spellIntensity); - behaviour.Spell.SpellIntensity = spellIntensity; - // Get the entity - CEntityCL *entity = EntitiesMngr.entity(slot); - if(entity) + // Check parameters. + if(args.size() != 6) { - uint64 beha = castingBeh; - sint64 beha2 = *((sint64 *)(&beha)); - // Write the behaviour in the DB. - IngameDbMngr.setProp("Entities:E" + toString(slot) + ":P" + toString(CLFECOMMON::PROPERTY_BEHAVIOUR), beha2); - // Update the behaviour. - entity->updateVisualProperty(NetMngr.getCurrentServerTick()+10, CLFECOMMON::PROPERTY_BEHAVIOUR); - beha = behaviour; - beha2 = *((sint64 *)(&beha)); - // Write the behaviour in the DB. - IngameDbMngr.setProp("Entities:E" + toString(slot) + ":P" + toString(CLFECOMMON::PROPERTY_BEHAVIOUR), beha2); - // Update the behaviour. - entity->updateVisualProperty(NetMngr.getCurrentServerTick()+50, CLFECOMMON::PROPERTY_BEHAVIOUR); + // Help + // CInterfaceManager::getInstance()->displaySystemInfo(ucstring("This command need 2 or 3 paramters :")); + // CInterfaceManager::getInstance()->displaySystemInfo(ucstring(" : the slot number of the entity to change")); + // CInterfaceManager::getInstance()->displaySystemInfo(ucstring(" : the behaviour to play for the entity, one of the following number :")); + // for(uint i = 0; idisplaySystemInfo(ucstring(NLMISC::toString(" %d - %s", i, MBEHAV::behaviourToString((MBEHAV::EBehaviour)i)))); + // CInterfaceManager::getInstance()->displaySystemInfo(ucstring(NLMISC::toString(" %d-%d - Emotes", MBEHAV::EMOTE_BEGIN, MBEHAV::EMOTE_END))); + } + else + { + // Compute parameters + CLFECOMMON::TCLEntityId slot; + fromString(args[0], slot); + // Magic Type (good bad neutral) + uint type; + fromString(args[1], type); + type %= 3; + MBEHAV::EBehaviour behTmp = (MBEHAV::EBehaviour)(MBEHAV::CAST_OFF+type); + MBEHAV::CBehaviour castingBeh(behTmp); + // Result + MBEHAV::CBehaviour behaviour; + uint result; + fromString(args[2], result); + result %= 4; + behaviour.Behaviour = (MBEHAV::EBehaviour)(MBEHAV::CAST_OFF_FAIL+type*4+result); + // Spell Power + uint16 spellMode; + fromString(args[3], spellMode); + behaviour.Spell.SpellMode = spellMode; + // Impact Intensity + uint16 spellId; + fromString(args[4], spellId); + behaviour.Spell.SpellId = spellId; + // Resist + uint16 spellIntensity; + fromString(args[5], spellIntensity); + behaviour.Spell.SpellIntensity = spellIntensity; + // Get the entity + CEntityCL *entity = EntitiesMngr.entity(slot); + if(entity) + { + uint64 beha = castingBeh; + sint64 beha2 = *((sint64 *)(&beha)); + // Write the behaviour in the DB. + IngameDbMngr.setProp("Entities:E" + toString(slot) + ":P" + toString(CLFECOMMON::PROPERTY_BEHAVIOUR), beha2); + // Update the behaviour. + entity->updateVisualProperty(NetMngr.getCurrentServerTick()+10, CLFECOMMON::PROPERTY_BEHAVIOUR); + beha = behaviour; + beha2 = *((sint64 *)(&beha)); + // Write the behaviour in the DB. + IngameDbMngr.setProp("Entities:E" + toString(slot) + ":P" + toString(CLFECOMMON::PROPERTY_BEHAVIOUR), beha2); + // Update the behaviour. + entity->updateVisualProperty(NetMngr.getCurrentServerTick()+50, CLFECOMMON::PROPERTY_BEHAVIOUR); + } + else + CInterfaceManager::getInstance()->displaySystemInfo(ucstring("There is no entity in the given slot")); } - else - CInterfaceManager::getInstance()->displaySystemInfo(ucstring("There is no entity in the given slot")); - } - // Command well done. - return true; + // Command well done. + return true; } NLMISC_COMMAND(settarget, "Set a target for an entity. Do not set the target slot to remove the target", " []") { - CLFECOMMON::TCLEntityId targetSlot = CLFECOMMON::INVALID_SLOT; + CLFECOMMON::TCLEntityId targetSlot = CLFECOMMON::INVALID_SLOT; - // Check parameters. - switch(args.size()) - { - // Set the target for the entity. - case 2: - fromString(args[1], targetSlot); + // Check parameters. + switch(args.size()) + { + // Set the target for the entity. + case 2: + fromString(args[1], targetSlot); - // Remove the target for the entity. - case 1: - { - uint entitySlot; - fromString(args[0], entitySlot); - CEntityCL *entity = EntitiesMngr.entity(entitySlot); - if(entity) - entity->targetSlot(targetSlot); - else - nlwarning("command 'settarget': there is no entity in the slot %d", entitySlot); - } - break; + // Remove the target for the entity. + case 1: + { + uint entitySlot; + fromString(args[0], entitySlot); + CEntityCL *entity = EntitiesMngr.entity(entitySlot); + if(entity) + entity->targetSlot(targetSlot); + else + nlwarning("command 'settarget': there is no entity in the slot %d", entitySlot); + } + break; - // Bad command. - default: - return false; - } + // Bad command. + default: + return false; + } - // Well done. - return true; + // Well done. + return true; } NLMISC_COMMAND(particle, "Create a particule at the user position (play FireWorkA_with_sound.ps by default)", "[]") { - string fn; + string fn; - // Check parameters. - if(args.size() == 0) - { - fn = "FireWorkA_with_sound.ps"; - } - else if(args.size() == 1) - { - fn = args[0]; - } - else - return false; + // Check parameters. + if(args.size() == 0) + { + fn = "FireWorkA_with_sound.ps"; + } + else if(args.size() == 1) + { + fn = args[0]; + } + else + return false; - UInstance fx = Scene->createInstance(fn); + UInstance fx = Scene->createInstance(fn); - // not found - if(fx.empty()) - { - log.displayNL ("Can't create instance '%s'", fn.c_str()); - return false; - } + // not found + if(fx.empty()) + { + log.displayNL ("Can't create instance '%s'", fn.c_str()); + return false; + } - fx.setPos(UserEntity->pos()); - fx.setClusterSystem(UserEntity->skeleton()->getClusterSystem()); + fx.setPos(UserEntity->pos()); + fx.setClusterSystem(UserEntity->skeleton()->getClusterSystem()); - // Command well done. - return true; + // Command well done. + return true; } NLMISC_COMMAND(move, "Move an entity", "Slot: [1-254]") { - // Check parameters. - if(args.size() != 1) - return false; + // Check parameters. + if(args.size() != 1) + return false; - CLFECOMMON::TCLEntityId slot; - fromString(args[0], slot); + CLFECOMMON::TCLEntityId slot; + fromString(args[0], slot); - // Compute the position. - CEntityCL *entity = EntitiesMngr.entity(slot); - if(entity) - { - sint64 x = (sint64)((entity->pos().x+UserEntity->front().x*10.0)*1000.0); - sint64 y = (sint64)((entity->pos().y+UserEntity->front().y*10.0)*1000.0); - sint64 z = (sint64)((entity->pos().z+UserEntity->front().z*10.0)*1000.0); - // Write the position in the DB. - IngameDbMngr.setProp("Entities:E" + toString(slot) + ":P0", x); - IngameDbMngr.setProp("Entities:E" + toString(slot) + ":P1", y); - IngameDbMngr.setProp("Entities:E" + toString(slot) + ":P2", z); - // Update the position. - EntitiesMngr.updateVisualProperty(NetMngr.getCurrentServerTick()+30, slot, 0); + // Compute the position. + CEntityCL *entity = EntitiesMngr.entity(slot); + if(entity) + { + sint64 x = (sint64)((entity->pos().x+UserEntity->front().x*10.0)*1000.0); + sint64 y = (sint64)((entity->pos().y+UserEntity->front().y*10.0)*1000.0); + sint64 z = (sint64)((entity->pos().z+UserEntity->front().z*10.0)*1000.0); + // Write the position in the DB. + IngameDbMngr.setProp("Entities:E" + toString(slot) + ":P0", x); + IngameDbMngr.setProp("Entities:E" + toString(slot) + ":P1", y); + IngameDbMngr.setProp("Entities:E" + toString(slot) + ":P2", z); + // Update the position. + EntitiesMngr.updateVisualProperty(NetMngr.getCurrentServerTick()+30, slot, 0); - x = (sint64)((entity->pos().x)*1000.0); - y = (sint64)((entity->pos().y)*1000.0); - z = (sint64)((entity->pos().z)*1000.0); - // Write the position in the DB. - IngameDbMngr.setProp("Entities:E" + toString(slot) + ":P0", x); - IngameDbMngr.setProp("Entities:E" + toString(slot) + ":P1", y); - IngameDbMngr.setProp("Entities:E" + toString(slot) + ":P2", z); - // Update the position. - EntitiesMngr.updateVisualProperty(NetMngr.getCurrentServerTick()+60, slot, 0); - } - else - nlwarning("command 'move' : there is no entity allocated in slot %d", slot); + x = (sint64)((entity->pos().x)*1000.0); + y = (sint64)((entity->pos().y)*1000.0); + z = (sint64)((entity->pos().z)*1000.0); + // Write the position in the DB. + IngameDbMngr.setProp("Entities:E" + toString(slot) + ":P0", x); + IngameDbMngr.setProp("Entities:E" + toString(slot) + ":P1", y); + IngameDbMngr.setProp("Entities:E" + toString(slot) + ":P2", z); + // Update the position. + EntitiesMngr.updateVisualProperty(NetMngr.getCurrentServerTick()+60, slot, 0); + } + else + nlwarning("command 'move' : there is no entity allocated in slot %d", slot); - // Command well done. - return true; + // Command well done. + return true; } NLMISC_COMMAND(moveRel, "Move an entity, specifying delta pos from current", "Slot: [1-254] dx(m) dy(m) [dt(tick)] [predictedIV(tick)]") { - // Check parameters. - if(args.size() <3) - return false; + // Check parameters. + if(args.size() <3) + return false; - CLFECOMMON::TCLEntityId slot; - fromString(args[0], slot); + CLFECOMMON::TCLEntityId slot; + fromString(args[0], slot); - // Compute the position. - CEntityCL *entity = EntitiesMngr.entity(slot); - if(entity) - { - float dx, dy; - fromString(args[1], dx); - fromString(args[2], dy); - sint32 dt= 10; - if(args.size()>=4) - fromString(args[3], dt); - sint32 pi= 0; - if(args.size()>=5) - fromString(args[4], pi); - sint64 x = (sint64)((entity->pos().x+dx)*1000.0); - sint64 y = (sint64)((entity->pos().y+dy)*1000.0); - sint64 z = (sint64)((entity->pos().z+0)*1000.0); - // Write the position in the DB. - IngameDbMngr.setProp("Entities:E" + toString(slot) + ":P0", x); - IngameDbMngr.setProp("Entities:E" + toString(slot) + ":P1", y); - IngameDbMngr.setProp("Entities:E" + toString(slot) + ":P2", z); - // Update the position. - EntitiesMngr.updateVisualProperty(NetMngr.getCurrentServerTick()+dt, slot, 0, pi); - } - else - nlwarning("command 'move' : there is no entity allocated in slot %d", slot); + // Compute the position. + CEntityCL *entity = EntitiesMngr.entity(slot); + if(entity) + { + float dx, dy; + fromString(args[1], dx); + fromString(args[2], dy); + sint32 dt= 10; + if(args.size()>=4) + fromString(args[3], dt); + sint32 pi= 0; + if(args.size()>=5) + fromString(args[4], pi); + sint64 x = (sint64)((entity->pos().x+dx)*1000.0); + sint64 y = (sint64)((entity->pos().y+dy)*1000.0); + sint64 z = (sint64)((entity->pos().z+0)*1000.0); + // Write the position in the DB. + IngameDbMngr.setProp("Entities:E" + toString(slot) + ":P0", x); + IngameDbMngr.setProp("Entities:E" + toString(slot) + ":P1", y); + IngameDbMngr.setProp("Entities:E" + toString(slot) + ":P2", z); + // Update the position. + EntitiesMngr.updateVisualProperty(NetMngr.getCurrentServerTick()+dt, slot, 0, pi); + } + else + nlwarning("command 'move' : there is no entity allocated in slot %d", slot); - // Command well done. - return true; + // Command well done. + return true; } NLMISC_COMMAND(orient, "Orient an entity", "Slot: [1-254] orient(degree) [dt(tick)]") { - // Check parameters. - if(args.size() < 2) - return false; + // Check parameters. + if(args.size() < 2) + return false; - CLFECOMMON::TCLEntityId slot; - fromString(args[0], slot); + CLFECOMMON::TCLEntityId slot; + fromString(args[0], slot); - // Compute the position. - CEntityCL *entity = EntitiesMngr.entity(slot); - if(entity) - { - sint32 rot; - fromString(args[1], rot); - sint32 dt= 10; - if(args.size()> 2) - fromString(args[2], dt); - // Write the position in the DB. - float fRot= (float)(rot*Pi/180.f); - uint64 val= *(uint32*)(&fRot); - IngameDbMngr.setProp("Entities:E" + toString(slot) + ":P"+toString(CLFECOMMON::PROPERTY_ORIENTATION), val); - // Update the position. - EntitiesMngr.updateVisualProperty(NetMngr.getCurrentServerTick()+dt, slot, CLFECOMMON::PROPERTY_ORIENTATION); - } - else - nlwarning("command 'move' : there is no entity allocated in slot %d", slot); + // Compute the position. + CEntityCL *entity = EntitiesMngr.entity(slot); + if(entity) + { + sint32 rot; + fromString(args[1], rot); + sint32 dt= 10; + if(args.size()> 2) + fromString(args[2], dt); + // Write the position in the DB. + float fRot= (float)(rot*Pi/180.f); + uint64 val= *(uint32*)(&fRot); + IngameDbMngr.setProp("Entities:E" + toString(slot) + ":P"+toString(CLFECOMMON::PROPERTY_ORIENTATION), val); + // Update the position. + EntitiesMngr.updateVisualProperty(NetMngr.getCurrentServerTick()+dt, slot, CLFECOMMON::PROPERTY_ORIENTATION); + } + else + nlwarning("command 'move' : there is no entity allocated in slot %d", slot); - // Command well done. - return true; + // Command well done. + return true; } NLMISC_COMMAND(moveTo, "Move an entity to another one", ":[1-254], :[0-254] default 0") { - sint64 x, y, z; + sint64 x, y, z; - // Check parameters. - if(args.size() == 1) - { - x = (sint64)(UserEntity->pos().x*1000.0); - y = (sint64)(UserEntity->pos().y*1000.0); - z = (sint64)(UserEntity->pos().z*1000.0); - } - else if(args.size() == 2) - { - CLFECOMMON::TCLEntityId slotDest; - fromString(args[1], slotDest); - // Compute the position. - CEntityCL *entity = EntitiesMngr.entity(slotDest); - if(entity) + // Check parameters. + if(args.size() == 1) { - x = (sint64)(entity->pos().x*1000.0); - y = (sint64)(entity->pos().y*1000.0); - z = (sint64)(entity->pos().z*1000.0); + x = (sint64)(UserEntity->pos().x*1000.0); + y = (sint64)(UserEntity->pos().y*1000.0); + z = (sint64)(UserEntity->pos().z*1000.0); } - else + else if(args.size() == 2) { - // Command is correct but not all the parameters are valid. - nlwarning("command 'move_to' : there is no entity allocated for the dest in slot %d", slotDest); - return true; + CLFECOMMON::TCLEntityId slotDest; + fromString(args[1], slotDest); + // Compute the position. + CEntityCL *entity = EntitiesMngr.entity(slotDest); + if(entity) + { + x = (sint64)(entity->pos().x*1000.0); + y = (sint64)(entity->pos().y*1000.0); + z = (sint64)(entity->pos().z*1000.0); + } + else + { + // Command is correct but not all the parameters are valid. + nlwarning("command 'move_to' : there is no entity allocated for the dest in slot %d", slotDest); + return true; + } } - } - // Wrong number of parameters. - else - return false; + // Wrong number of parameters. + else + return false; - CLFECOMMON::TCLEntityId slot; - fromString(args[0], slot); - // Write the position in the DB. - IngameDbMngr.setProp("Entities:E" + toString(slot) + ":P0", x); - IngameDbMngr.setProp("Entities:E" + toString(slot) + ":P1", y); - IngameDbMngr.setProp("Entities:E" + toString(slot) + ":P2", z); - // Update the position. - EntitiesMngr.updateVisualProperty(NetMngr.getCurrentServerTick()+30, slot, 0); + CLFECOMMON::TCLEntityId slot; + fromString(args[0], slot); + // Write the position in the DB. + IngameDbMngr.setProp("Entities:E" + toString(slot) + ":P0", x); + IngameDbMngr.setProp("Entities:E" + toString(slot) + ":P1", y); + IngameDbMngr.setProp("Entities:E" + toString(slot) + ":P2", z); + // Update the position. + EntitiesMngr.updateVisualProperty(NetMngr.getCurrentServerTick()+30, slot, 0); - // Command well done. - return true; + // Command well done. + return true; } NLMISC_COMMAND(setMode, "Set The Mode for an Entity without to add a stage for it", " ") { - // Check parameters. - if(args.size() != 2) - return false; + // Check parameters. + if(args.size() != 2) + return false; - // Get the Slot and the Mode. - CLFECOMMON::TCLEntityId slot; - fromString(args[0], slot); - sint32 nMode; - fromString(args[1], nMode); - MBEHAV::EMode mod = (MBEHAV::EMode)nMode; + // Get the Slot and the Mode. + CLFECOMMON::TCLEntityId slot; + fromString(args[0], slot); + sint32 nMode; + fromString(args[1], nMode); + MBEHAV::EMode mod = (MBEHAV::EMode)nMode; - // Compute the position. - CEntityCL *entity = EntitiesMngr.entity(slot); - if(entity) - entity->mode(mod); - else - nlwarning("command 'setMode' : there is no entity allocated in slot '%d'", slot); + // Compute the position. + CEntityCL *entity = EntitiesMngr.entity(slot); + if(entity) + entity->mode(mod); + else + nlwarning("command 'setMode' : there is no entity allocated in slot '%d'", slot); - // Command well done. - return true; + // Command well done. + return true; } NLMISC_COMMAND(paintTarget, "Modify the target color", - "\n" - " color for the target (0-7)\n") + "\n" + " color for the target (0-7)\n") { - // Check parameters - if(args.size() != 1) - return false; - // Get the entity slot - CLFECOMMON::TCLEntityId slot = UserEntity->selection(); - if(slot == CLFECOMMON::INVALID_SLOT) - return true; - // - SPropVisualA vA; - SPropVisualB vB; - SPropVisualC vC; - const string propNameA = toString("SERVER:Entities:E%d:P%d", slot, CLFECOMMON::PROPERTY_VPA); - const string propNameB = toString("SERVER:Entities:E%d:P%d", slot, CLFECOMMON::PROPERTY_VPB); - const string propNameC = toString("SERVER:Entities:E%d:P%d", slot, CLFECOMMON::PROPERTY_VPC); - vA.PropertyA = NLGUI::CDBManager::getInstance()->getDbProp(propNameA)->getValue64(); - vB.PropertyB = NLGUI::CDBManager::getInstance()->getDbProp(propNameB)->getValue64(); - vC.PropertyC = NLGUI::CDBManager::getInstance()->getDbProp(propNameC)->getValue64(); + // Check parameters + if(args.size() != 1) + return false; + // Get the entity slot + CLFECOMMON::TCLEntityId slot = UserEntity->selection(); + if(slot == CLFECOMMON::INVALID_SLOT) + return true; + // + SPropVisualA vA; + SPropVisualB vB; + SPropVisualC vC; + const string propNameA = toString("SERVER:Entities:E%d:P%d", slot, CLFECOMMON::PROPERTY_VPA); + const string propNameB = toString("SERVER:Entities:E%d:P%d", slot, CLFECOMMON::PROPERTY_VPB); + const string propNameC = toString("SERVER:Entities:E%d:P%d", slot, CLFECOMMON::PROPERTY_VPC); + vA.PropertyA = NLGUI::CDBManager::getInstance()->getDbProp(propNameA)->getValue64(); + vB.PropertyB = NLGUI::CDBManager::getInstance()->getDbProp(propNameB)->getValue64(); + vC.PropertyC = NLGUI::CDBManager::getInstance()->getDbProp(propNameC)->getValue64(); - // Get the visual item index - uint value; - fromString(args[0], value); - // Change color - vA.PropertySubData.JacketColor = value; - vA.PropertySubData.TrouserColor = value; - vA.PropertySubData.ArmColor = value; - vA.PropertySubData.HatColor = value; - vB.PropertySubData.HandsColor = value; - vB.PropertySubData.FeetColor = value; + // Get the visual item index + uint value; + fromString(args[0], value); + // Change color + vA.PropertySubData.JacketColor = value; + vA.PropertySubData.TrouserColor = value; + vA.PropertySubData.ArmColor = value; + vA.PropertySubData.HatColor = value; + vB.PropertySubData.HandsColor = value; + vB.PropertySubData.FeetColor = value; - // Set the database. - NLGUI::CDBManager::getInstance()->getDbProp(propNameA)->setValue64((sint64)vA.PropertyA); - NLGUI::CDBManager::getInstance()->getDbProp(propNameB)->setValue64((sint64)vB.PropertyB); - NLGUI::CDBManager::getInstance()->getDbProp(propNameC)->setValue64((sint64)vC.PropertyC); - // Force to update properties. - EntitiesMngr.updateVisualProperty(0, slot, CLFECOMMON::PROPERTY_VPA); + // Set the database. + NLGUI::CDBManager::getInstance()->getDbProp(propNameA)->setValue64((sint64)vA.PropertyA); + NLGUI::CDBManager::getInstance()->getDbProp(propNameB)->setValue64((sint64)vB.PropertyB); + NLGUI::CDBManager::getInstance()->getDbProp(propNameC)->setValue64((sint64)vC.PropertyC); + // Force to update properties. + EntitiesMngr.updateVisualProperty(0, slot, CLFECOMMON::PROPERTY_VPA); - // Done. - return true; + // Done. + return true; } NLMISC_COMMAND(playAnim, "Try to play the animation to the target", "") { - // Check parameters - if(args.size() != 1) - return false; + // Check parameters + if(args.size() != 1) + return false; - CLFECOMMON::TCLEntityId slot = UserEntity->selection(); - if(slot == CLFECOMMON::INVALID_SLOT) - return true; - if(EAM == 0) - return true; - NL3D::UAnimationSet *animset = EAM->getAnimationSet(); - if(animset == 0) - return true; - uint animId = animset->getAnimationIdByName(args[0]); - if(animId == UAnimationSet::NotFound) - { - nlwarning("anim not found %s", args[0].c_str()); - return true; - } - CEntityCL *selection = EntitiesMngr.entity(slot); - CCharacterCL *character = dynamic_cast(selection); - if(character) - character->setAnim(CAnimationStateSheet::Idle, (TAnimStateKey)CAnimation::UnknownAnim, animId); - return true; + CLFECOMMON::TCLEntityId slot = UserEntity->selection(); + if(slot == CLFECOMMON::INVALID_SLOT) + return true; + if(EAM == 0) + return true; + NL3D::UAnimationSet *animset = EAM->getAnimationSet(); + if(animset == 0) + return true; + uint animId = animset->getAnimationIdByName(args[0]); + if(animId == UAnimationSet::NotFound) + { + nlwarning("anim not found %s", args[0].c_str()); + return true; + } + CEntityCL *selection = EntitiesMngr.entity(slot); + CCharacterCL *character = dynamic_cast(selection); + if(character) + character->setAnim(CAnimationStateSheet::Idle, (TAnimStateKey)CAnimation::UnknownAnim, animId); + return true; } NLMISC_COMMAND(vP, "Modify the Visual Property", - "\n" - " of the entity to change.\n" - " the property to change :\n" - " 0->CHEST (0~511)\n" - " 1->LEG (0~255)\n" - " 2->ARM (0~255)\n" - " 3->HEAD (0~127)\n" - " 4->WEAPON_R (0~2047)\n" - " 5->WEAPON_L (0~255)\n" - " 6->FEET (0~511)\n" - " 7->HAND (0~511)\n" - " 8->EYES COLOR (0~7)\n" - " 9->SEX (0: Male, 1: Female)\n" - " 10->TATOO (0~31)\n" - " 11->CHEST COLOR (0~7)\n" - " 12->LEG COLOR (0~7)\n" - " 13->ARM COLOR (0~7)\n" - " 14->HAIR COLOR (0~7)\n" - " 15->HAND COLOR (0~7)\n" - " 16->FEET COLOR (0~7)\n" - " 17->MORPH 1 (0~7)\n" - " 18->MORPH 2 (0~7)\n" - " 19->MORPH 3 (0~7)\n" - " 20->MORPH 4 (0~7)\n" - " 21->MORPH 5 (0~7)\n" - " 22->MORPH 6 (0~7)\n" - " 23->MORPH 7 (0~7)\n" - " 24->CHARACTER HEIGHT (0~15)\n" - " 25->TORSO WIDTH (0~15)\n" - " 26->ARMS WIDTH (0~15)\n" - " 27->LEGS WIDTH (0~15)\n" - " 28->BREASTS SIZE (0~15)\n" - " for the property.\n") +"\n" +" of the entity to change.\n" +" the property to change :\n" +" 0->CHEST (0~511)\n" +" 1->LEG (0~255)\n" +" 2->ARM (0~255)\n" +" 3->HEAD (0~127)\n" +" 4->WEAPON_R (0~2047)\n" +" 5->WEAPON_L (0~255)\n" +" 6->FEET (0~511)\n" +" 7->HAND (0~511)\n" +" 8->EYES COLOR (0~7)\n" +" 9->SEX (0: Male, 1: Female)\n" +" 10->TATOO (0~31)\n" +" 11->CHEST COLOR (0~7)\n" +" 12->LEG COLOR (0~7)\n" +" 13->ARM COLOR (0~7)\n" +" 14->HAIR COLOR (0~7)\n" +" 15->HAND COLOR (0~7)\n" +" 16->FEET COLOR (0~7)\n" +" 17->MORPH 1 (0~7)\n" +" 18->MORPH 2 (0~7)\n" +" 19->MORPH 3 (0~7)\n" +" 20->MORPH 4 (0~7)\n" +" 21->MORPH 5 (0~7)\n" +" 22->MORPH 6 (0~7)\n" +" 23->MORPH 7 (0~7)\n" +" 24->CHARACTER HEIGHT (0~15)\n" +" 25->TORSO WIDTH (0~15)\n" +" 26->ARMS WIDTH (0~15)\n" +" 27->LEGS WIDTH (0~15)\n" +" 28->BREASTS SIZE (0~15)\n" +" for the property.\n") { - // Check parameters - if(args.size() != 3) - return false; + // Check parameters + if(args.size() != 3) + return false; - // Get the database entry. - SPropVisualA vA; - SPropVisualB vB; - SPropVisualC vC; - uint slot; - fromString(args[0], slot); - const string propNameA = toString("SERVER:Entities:E%d:P%d", slot, CLFECOMMON::PROPERTY_VPA); - const string propNameB = toString("SERVER:Entities:E%d:P%d", slot, CLFECOMMON::PROPERTY_VPB); - const string propNameC = toString("SERVER:Entities:E%d:P%d", slot, CLFECOMMON::PROPERTY_VPC); - vA.PropertyA = NLGUI::CDBManager::getInstance()->getDbProp(propNameA)->getValue64(); - vB.PropertyB = NLGUI::CDBManager::getInstance()->getDbProp(propNameB)->getValue64(); - vC.PropertyC = NLGUI::CDBManager::getInstance()->getDbProp(propNameC)->getValue64(); - // Get the visual item index - uint value; - fromString(args[2], value); - // Get the visual slot to change. - uint type; - fromString(args[1], type); - // if .sitem visual slot, try translate .sitem to VSIndex - if(type<=7) - { - SLOTTYPE::EVisualSlot vslot= SLOTTYPE::HIDDEN_SLOT; - switch(type) + // Get the database entry. + SPropVisualA vA; + SPropVisualB vB; + SPropVisualC vC; + uint slot; + fromString(args[0], slot); + const string propNameA = toString("SERVER:Entities:E%d:P%d", slot, CLFECOMMON::PROPERTY_VPA); + const string propNameB = toString("SERVER:Entities:E%d:P%d", slot, CLFECOMMON::PROPERTY_VPB); + const string propNameC = toString("SERVER:Entities:E%d:P%d", slot, CLFECOMMON::PROPERTY_VPC); + vA.PropertyA = NLGUI::CDBManager::getInstance()->getDbProp(propNameA)->getValue64(); + vB.PropertyB = NLGUI::CDBManager::getInstance()->getDbProp(propNameB)->getValue64(); + vC.PropertyC = NLGUI::CDBManager::getInstance()->getDbProp(propNameC)->getValue64(); + // Get the visual item index + uint value; + fromString(args[2], value); + // Get the visual slot to change. + uint type; + fromString(args[1], type); + // if .sitem visual slot, try translate .sitem to VSIndex + if(type<=7) { - case 0: vslot= SLOTTYPE::CHEST_SLOT; break; - case 1: vslot= SLOTTYPE::LEGS_SLOT; break; - case 2: vslot= SLOTTYPE::ARMS_SLOT; break; - case 3: vslot= SLOTTYPE::HEAD_SLOT; break; - case 4: vslot= SLOTTYPE::RIGHT_HAND_SLOT; break; - case 5: vslot= SLOTTYPE::LEFT_HAND_SLOT; break; - case 6: vslot= SLOTTYPE::FEET_SLOT; break; - case 7: vslot= SLOTTYPE::HANDS_SLOT; break; - default: break; + SLOTTYPE::EVisualSlot vslot= SLOTTYPE::HIDDEN_SLOT; + switch(type) + { + case 0: vslot= SLOTTYPE::CHEST_SLOT; break; + case 1: vslot= SLOTTYPE::LEGS_SLOT; break; + case 2: vslot= SLOTTYPE::ARMS_SLOT; break; + case 3: vslot= SLOTTYPE::HEAD_SLOT; break; + case 4: vslot= SLOTTYPE::RIGHT_HAND_SLOT; break; + case 5: vslot= SLOTTYPE::LEFT_HAND_SLOT; break; + case 6: vslot= SLOTTYPE::FEET_SLOT; break; + case 7: vslot= SLOTTYPE::HANDS_SLOT; break; + default: break; + } + if(vslot!=SLOTTYPE::HIDDEN_SLOT && value==0) + { + sint vsIndex= SheetMngr.getVSIndex(args[2], vslot); + // succed! + if(vsIndex!=-1) + value= vsIndex; + } } - if(vslot!=SLOTTYPE::HIDDEN_SLOT && value==0) + // setup + switch(type) { - sint vsIndex= SheetMngr.getVSIndex(args[2], vslot); - // succed! - if(vsIndex!=-1) - value= vsIndex; + case 0: + vA.PropertySubData.JacketModel = value; + break; + case 1: + vA.PropertySubData.TrouserModel = value; + break; + case 2: + vA.PropertySubData.ArmModel = value; + break; + case 3: + vA.PropertySubData.HatModel = value; + break; + case 4: + vA.PropertySubData.WeaponRightHand = value; + break; + case 5: + vA.PropertySubData.WeaponLeftHand = value; + break; + case 6: + vB.PropertySubData.FeetModel = value; + break; + case 7: + vB.PropertySubData.HandsModel = value; + break; + case 8: + vC.PropertySubData.EyesColor = value; + break; + case 9: + vA.PropertySubData.Sex = value; + break; + case 10: + vC.PropertySubData.Tattoo = value; + break; + case 11: + vA.PropertySubData.JacketColor = value; + break; + case 12: + vA.PropertySubData.TrouserColor = value; + break; + case 13: + vA.PropertySubData.ArmColor = value; + break; + case 14: + vA.PropertySubData.HatColor = value; + break; + case 15: + vB.PropertySubData.HandsColor = value; + break; + case 16: + vB.PropertySubData.FeetColor = value; + break; + case 17: + vC.PropertySubData.MorphTarget1 = value; + break; + case 18: + vC.PropertySubData.MorphTarget2 = value; + break; + case 19: + vC.PropertySubData.MorphTarget3 = value; + break; + case 20: + vC.PropertySubData.MorphTarget4 = value; + break; + case 21: + vC.PropertySubData.MorphTarget5 = value; + break; + case 22: + vC.PropertySubData.MorphTarget6 = value; + break; + case 23: + vC.PropertySubData.MorphTarget7 = value; + break; + case 24: + vC.PropertySubData.CharacterHeight = value; + break; + case 25: + vC.PropertySubData.TorsoWidth = value; + break; + case 26: + vC.PropertySubData.ArmsWidth = value; + break; + case 27: + vC.PropertySubData.LegsWidth = value; + break; + case 28: + vC.PropertySubData.BreastSize = value; + break; + + default: + nlwarning("command 'vP': type not valid"); + return false; + break; } - } - // setup - switch(type) - { - case 0: - vA.PropertySubData.JacketModel = value; - break; - case 1: - vA.PropertySubData.TrouserModel = value; - break; - case 2: - vA.PropertySubData.ArmModel = value; - break; - case 3: - vA.PropertySubData.HatModel = value; - break; - case 4: - vA.PropertySubData.WeaponRightHand = value; - break; - case 5: - vA.PropertySubData.WeaponLeftHand = value; - break; - case 6: - vB.PropertySubData.FeetModel = value; - break; - case 7: - vB.PropertySubData.HandsModel = value; - break; - case 8: - vC.PropertySubData.EyesColor = value; - break; - case 9: - vA.PropertySubData.Sex = value; - break; - case 10: - vC.PropertySubData.Tattoo = value; - break; - case 11: - vA.PropertySubData.JacketColor = value; - break; - case 12: - vA.PropertySubData.TrouserColor = value; - break; - case 13: - vA.PropertySubData.ArmColor = value; - break; - case 14: - vA.PropertySubData.HatColor = value; - break; - case 15: - vB.PropertySubData.HandsColor = value; - break; - case 16: - vB.PropertySubData.FeetColor = value; - break; - case 17: - vC.PropertySubData.MorphTarget1 = value; - break; - case 18: - vC.PropertySubData.MorphTarget2 = value; - break; - case 19: - vC.PropertySubData.MorphTarget3 = value; - break; - case 20: - vC.PropertySubData.MorphTarget4 = value; - break; - case 21: - vC.PropertySubData.MorphTarget5 = value; - break; - case 22: - vC.PropertySubData.MorphTarget6 = value; - break; - case 23: - vC.PropertySubData.MorphTarget7 = value; - break; - case 24: - vC.PropertySubData.CharacterHeight = value; - break; - case 25: - vC.PropertySubData.TorsoWidth = value; - break; - case 26: - vC.PropertySubData.ArmsWidth = value; - break; - case 27: - vC.PropertySubData.LegsWidth = value; - break; - case 28: - vC.PropertySubData.BreastSize = value; - break; - default: - nlwarning("command 'vP': type not valid"); - return false; - break; - } + // Set the database. + NLGUI::CDBManager::getInstance()->getDbProp(propNameA)->setValue64((sint64)vA.PropertyA); + NLGUI::CDBManager::getInstance()->getDbProp(propNameB)->setValue64((sint64)vB.PropertyB); + NLGUI::CDBManager::getInstance()->getDbProp(propNameC)->setValue64((sint64)vC.PropertyC); + // Force to update properties. + EntitiesMngr.updateVisualProperty(0, slot, CLFECOMMON::PROPERTY_VPA); - // Set the database. - NLGUI::CDBManager::getInstance()->getDbProp(propNameA)->setValue64((sint64)vA.PropertyA); - NLGUI::CDBManager::getInstance()->getDbProp(propNameB)->setValue64((sint64)vB.PropertyB); - NLGUI::CDBManager::getInstance()->getDbProp(propNameC)->setValue64((sint64)vC.PropertyC); - // Force to update properties. - EntitiesMngr.updateVisualProperty(0, slot, CLFECOMMON::PROPERTY_VPA); - - // Done. - return true; + // Done. + return true; } NLMISC_COMMAND(altLook, "Modify the Alternative Look Property", - "\n" - " of the entity to change.\n" - "\n" - "\n" - "\n" - "\n" - "\n" - "\n" - "\n" - "[]\n" - "[]\n" - "[]\n") + "\n" + " of the entity to change.\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "[]\n" + "[]\n" + "[]\n") { - // Check parameters - if(args.size() < 8 || args.size() > 11) - return false; + // Check parameters + if(args.size() < 8 || args.size() > 11) + return false; - // Get the database entry. - uint slot; - fromString(args[0], slot); - const string propName = toString("SERVER:Entities:E%d:P%d", slot, CLFECOMMON::PROPERTY_VPA); - // Get the old value (not useful since we change the whole property). - SAltLookProp altLookProp; - altLookProp.Summary = NLGUI::CDBManager::getInstance()->getDbProp(propName)->getValue64(); - uint32 colorTop, colorBot, weaponRightHand, weaponLeftHand, seed, colorHair, hat; - fromString(args[1], colorTop); - fromString(args[2], colorBot); - fromString(args[3], weaponRightHand); - fromString(args[4], weaponLeftHand); - fromString(args[5], seed); - fromString(args[6], colorHair); - fromString(args[7], hat); - altLookProp.Element.ColorTop = colorTop; - altLookProp.Element.ColorBot = colorBot; - altLookProp.Element.WeaponRightHand = weaponRightHand; - altLookProp.Element.WeaponLeftHand = weaponLeftHand; - altLookProp.Element.Seed = seed; - altLookProp.Element.ColorHair = colorHair; - altLookProp.Element.Hat = hat; - // New colours - if(args.size() == 11) - { - uint32 colorGlove, colorBoot, colorArm; - fromString(args[8], colorGlove); - fromString(args[9], colorBoot); - fromString(args[10], colorArm); - altLookProp.Element.ColorGlove = colorGlove; - altLookProp.Element.ColorBoot = colorBoot; - altLookProp.Element.ColorArm = colorArm; - } - // Old Colours - else - { - altLookProp.Element.ColorGlove = altLookProp.Element.ColorTop; - altLookProp.Element.ColorArm = altLookProp.Element.ColorTop; - altLookProp.Element.ColorBoot = altLookProp.Element.ColorBot; - } + // Get the database entry. + uint slot; + fromString(args[0], slot); + const string propName = toString("SERVER:Entities:E%d:P%d", slot, CLFECOMMON::PROPERTY_VPA); + // Get the old value (not useful since we change the whole property). + SAltLookProp altLookProp; + altLookProp.Summary = NLGUI::CDBManager::getInstance()->getDbProp(propName)->getValue64(); + uint32 colorTop, colorBot, weaponRightHand, weaponLeftHand, seed, colorHair, hat; + fromString(args[1], colorTop); + fromString(args[2], colorBot); + fromString(args[3], weaponRightHand); + fromString(args[4], weaponLeftHand); + fromString(args[5], seed); + fromString(args[6], colorHair); + fromString(args[7], hat); + altLookProp.Element.ColorTop = colorTop; + altLookProp.Element.ColorBot = colorBot; + altLookProp.Element.WeaponRightHand = weaponRightHand; + altLookProp.Element.WeaponLeftHand = weaponLeftHand; + altLookProp.Element.Seed = seed; + altLookProp.Element.ColorHair = colorHair; + altLookProp.Element.Hat = hat; + // New colours + if(args.size() == 11) + { + uint32 colorGlove, colorBoot, colorArm; + fromString(args[8], colorGlove); + fromString(args[9], colorBoot); + fromString(args[10], colorArm); + altLookProp.Element.ColorGlove = colorGlove; + altLookProp.Element.ColorBoot = colorBoot; + altLookProp.Element.ColorArm = colorArm; + } + // Old Colours + else + { + altLookProp.Element.ColorGlove = altLookProp.Element.ColorTop; + altLookProp.Element.ColorArm = altLookProp.Element.ColorTop; + altLookProp.Element.ColorBoot = altLookProp.Element.ColorBot; + } - // Set the database. - NLGUI::CDBManager::getInstance()->getDbProp(propName)->setValue64((sint64)altLookProp.Summary); - // Force to update properties. - EntitiesMngr.updateVisualProperty(0, slot, CLFECOMMON::PROPERTY_VPA); + // Set the database. + NLGUI::CDBManager::getInstance()->getDbProp(propName)->setValue64((sint64)altLookProp.Summary); + // Force to update properties. + EntitiesMngr.updateVisualProperty(0, slot, CLFECOMMON::PROPERTY_VPA); - // Done. - return true; + // Done. + return true; } NLMISC_COMMAND(color, "Command to color an entity", - "\n" - ": whole number (if <0 slot will be the current selection)\n" - ": whole number\n" - ": whole number\n" - ": whole number\n" - "[]: whole number\n" - " default=the whole body\n" - " 0=CHEST\n" - " 1=LEG\n" - " 2=HEAD\n" - " 3=ARMS\n" - " 4=HANDS\n" - " 5=FEET\n") +"\n" +": whole number (if <0 slot will be the current selection)\n" +": whole number\n" +": whole number\n" +": whole number\n" +"[]: whole number\n" +" default=the whole body\n" +" 0=CHEST\n" +" 1=LEG\n" +" 2=HEAD\n" +" 3=ARMS\n" +" 4=HANDS\n" +" 5=FEET\n") { - // Check parameters. - if(args.size() != 4 && args.size() != 5) - return false; + // Check parameters. + if(args.size() != 4 && args.size() != 5) + return false; - // Witch part to dye ? - sint part = -1; - if(args.size() == 5) - fromString(args[4], part); + // Witch part to dye ? + sint part = -1; + if(args.size() == 5) + fromString(args[4], part); - // Get the entity slot to dye. - sint slotTmp; - fromString(args[0], slotTmp); - CLFECOMMON::TCLEntityId slot; - if(slotTmp >= 0) - slot = (CLFECOMMON::TCLEntityId)slotTmp; - else - slot = (CLFECOMMON::TCLEntityId)UserEntity->selection(); + // Get the entity slot to dye. + sint slotTmp; + fromString(args[0], slotTmp); + CLFECOMMON::TCLEntityId slot; + if(slotTmp >= 0) + slot = (CLFECOMMON::TCLEntityId)slotTmp; + else + slot = (CLFECOMMON::TCLEntityId)UserEntity->selection(); - CEntityCL *entity = EntitiesMngr.entity(slot); - if(entity) - { - sint color, hair, eyes; - fromString(args[1], color); - fromString(args[2], hair); - fromString(args[3], eyes); - entity->changeColors(color, hair, eyes, part); - } - else - nlwarning("command 'changeColors': there is no entity allocated in slot '%d'", slot); + CEntityCL *entity = EntitiesMngr.entity(slot); + if(entity) + { + sint color, hair, eyes; + fromString(args[1], color); + fromString(args[2], hair); + fromString(args[3], eyes); + entity->changeColors(color, hair, eyes, part); + } + else + nlwarning("command 'changeColors': there is no entity allocated in slot '%d'", slot); - // Command well done. - return true; + // Command well done. + return true; } NLMISC_COMMAND(saveIntCfg, "save the interface config file","") { - CInterfaceManager::getInstance()->saveConfig ("save/interface.icfg"); - return true; + CInterfaceManager::getInstance()->saveConfig ("save/interface.icfg"); + return true; } NLMISC_COMMAND(loadIntCfg, "load the interface config file","") { - CInterfaceManager *im = CInterfaceManager::getInstance(); - im->loadConfig ("save/interface.icfg"); - // reset the compass target - CGroupCompas *gc = dynamic_cast(CWidgetManager::getInstance()->getElementFromId("ui:interface:compass")); - if (gc && gc->isSavedTargetValid()) - { - gc->setTarget(gc->getSavedTarget()); - } - return true; + CInterfaceManager *im = CInterfaceManager::getInstance(); + im->loadConfig ("save/interface.icfg"); + // reset the compass target + CGroupCompas *gc = dynamic_cast(CWidgetManager::getInstance()->getElementFromId("ui:interface:compass")); + if (gc && gc->isSavedTargetValid()) + { + gc->setTarget(gc->getSavedTarget()); + } + return true; } NLMISC_COMMAND(harvestDeposit, "harvest a deposit", "") { - // no parameter needed + // no parameter needed - // Create the message for the server - /* CBitMemStream out; + // Create the message for the server +/* CBitMemStream out; if(GenericMsgHeaderMngr.pushNameToStream("HARVEST:DEPOSIT", out)) { - uint16 skill = SKILLS::digging; + uint16 skill = SKILLS::digging; - out.serial(skill); + out.serial(skill); - NetMngr.push(out); + NetMngr.push(out); - // open the interface - // CWidgetManager::getInstance()->getWindowFromId("ui:interface:harvest")->setActive(true); + // open the interface + // CWidgetManager::getInstance()->getWindowFromId("ui:interface:harvest")->setActive(true); } else - nlwarning("command : unknown message name : 'HARVEST:DEPOSIT'"); - */ - return true; + nlwarning("command : unknown message name : 'HARVEST:DEPOSIT'"); +*/ + return true; } NLMISC_COMMAND(training, "start a training action", "") { - // no parameter needed + // no parameter needed - // Create the message for the server - CBitMemStream out; - if(GenericMsgHeaderMngr.pushNameToStream("TRAINING", out)) - { - NetMngr.push(out); - } - else - nlwarning("command : unknown message name : 'TRAINING'"); + // Create the message for the server + CBitMemStream out; + if(GenericMsgHeaderMngr.pushNameToStream("TRAINING", out)) + { + NetMngr.push(out); + } + else + nlwarning("command : unknown message name : 'TRAINING'"); - return true; + return true; } NLMISC_COMMAND(testMount, "Set the entity to mount"," ") { - CLFECOMMON::TCLEntityId slot; - CLFECOMMON::TCLEntityId mount = CLFECOMMON::INVALID_SLOT; + CLFECOMMON::TCLEntityId slot; + CLFECOMMON::TCLEntityId mount = CLFECOMMON::INVALID_SLOT; - switch(args.size()) - { - case 2: - fromString(args[1], mount); - case 1: - fromString(args[0], slot); - break; + switch(args.size()) + { + case 2: + fromString(args[1], mount); + case 1: + fromString(args[0], slot); + break; - default: - return false; - break; - } + default: + return false; + break; + } - // Set the database. - string propName = toString("SERVER:Entities:E%d:P%d", mount, CLFECOMMON::PROPERTY_RIDER_ENTITY_ID); - NLGUI::CDBManager::getInstance()->getDbProp(propName)->setValue64(slot); - // Force to update properties. - EntitiesMngr.updateVisualProperty(0, mount, CLFECOMMON::PROPERTY_RIDER_ENTITY_ID); - // Set the database. - propName = toString("SERVER:Entities:E%d:P%d", slot, CLFECOMMON::PROPERTY_ENTITY_MOUNTED_ID); - NLGUI::CDBManager::getInstance()->getDbProp(propName)->setValue64(mount); - // Force to update properties. - EntitiesMngr.updateVisualProperty(0, slot, CLFECOMMON::PROPERTY_ENTITY_MOUNTED_ID); - return true; + // Set the database. + string propName = toString("SERVER:Entities:E%d:P%d", mount, CLFECOMMON::PROPERTY_RIDER_ENTITY_ID); + NLGUI::CDBManager::getInstance()->getDbProp(propName)->setValue64(slot); + // Force to update properties. + EntitiesMngr.updateVisualProperty(0, mount, CLFECOMMON::PROPERTY_RIDER_ENTITY_ID); + // Set the database. + propName = toString("SERVER:Entities:E%d:P%d", slot, CLFECOMMON::PROPERTY_ENTITY_MOUNTED_ID); + NLGUI::CDBManager::getInstance()->getDbProp(propName)->setValue64(mount); + // Force to update properties. + EntitiesMngr.updateVisualProperty(0, slot, CLFECOMMON::PROPERTY_ENTITY_MOUNTED_ID); + return true; } NLMISC_COMMAND(mount, "Set the entity to mount"," []") { - CLFECOMMON::TCLEntityId slot; - CLFECOMMON::TCLEntityId mount = CLFECOMMON::INVALID_SLOT; + CLFECOMMON::TCLEntityId slot; + CLFECOMMON::TCLEntityId mount = CLFECOMMON::INVALID_SLOT; - switch(args.size()) - { - case 2: - fromString(args[1], mount); - case 1: - fromString(args[0], slot); - break; + switch(args.size()) + { + case 2: + fromString(args[1], mount); + case 1: + fromString(args[0], slot); + break; - default: - return false; - break; - } + default: + return false; + break; + } - // Set the database. - string propName = toString("SERVER:Entities:E%d:P%d", slot, CLFECOMMON::PROPERTY_ENTITY_MOUNTED_ID); - NLGUI::CDBManager::getInstance()->getDbProp(propName)->setValue64(mount); - // Force to update properties. - EntitiesMngr.updateVisualProperty(0, slot, CLFECOMMON::PROPERTY_ENTITY_MOUNTED_ID); + // Set the database. + string propName = toString("SERVER:Entities:E%d:P%d", slot, CLFECOMMON::PROPERTY_ENTITY_MOUNTED_ID); + NLGUI::CDBManager::getInstance()->getDbProp(propName)->setValue64(mount); + // Force to update properties. + EntitiesMngr.updateVisualProperty(0, slot, CLFECOMMON::PROPERTY_ENTITY_MOUNTED_ID); - // Command well done - return true; + // Command well done + return true; } NLMISC_COMMAND(rider, "Set the rider"," []") { - CLFECOMMON::TCLEntityId slot; - CLFECOMMON::TCLEntityId rider = CLFECOMMON::INVALID_SLOT; + CLFECOMMON::TCLEntityId slot; + CLFECOMMON::TCLEntityId rider = CLFECOMMON::INVALID_SLOT; - switch(args.size()) - { - case 2: - fromString(args[1], rider); - case 1: - fromString(args[0], slot); - break; + switch(args.size()) + { + case 2: + fromString(args[1], rider); + case 1: + fromString(args[0], slot); + break; - default: - return false; - break; - } + default: + return false; + break; + } - // Set the database. - string propName = toString("SERVER:Entities:E%d:P%d", slot, CLFECOMMON::PROPERTY_RIDER_ENTITY_ID); - NLGUI::CDBManager::getInstance()->getDbProp(propName)->setValue64(rider); - // Force to update properties. - EntitiesMngr.updateVisualProperty(0, slot, CLFECOMMON::PROPERTY_RIDER_ENTITY_ID); + // Set the database. + string propName = toString("SERVER:Entities:E%d:P%d", slot, CLFECOMMON::PROPERTY_RIDER_ENTITY_ID); + NLGUI::CDBManager::getInstance()->getDbProp(propName)->setValue64(rider); + // Force to update properties. + EntitiesMngr.updateVisualProperty(0, slot, CLFECOMMON::PROPERTY_RIDER_ENTITY_ID); - // Command well done - return true; + // Command well done + return true; } NLMISC_COMMAND(disbandConvoy, "disband current beasts convoy", "") { - // no parameter needed + // no parameter needed - // Create the message for the server - CBitMemStream out; - if(GenericMsgHeaderMngr.pushNameToStream("ANIMALS:DISBAND_CONVOY", out)) - { - NetMngr.push(out); - } - else - nlwarning("command : unknown message name : 'ANIMALS:DISBAND_CONVOY'"); + // Create the message for the server + CBitMemStream out; + if(GenericMsgHeaderMngr.pushNameToStream("ANIMALS:DISBAND_CONVOY", out)) + { + NetMngr.push(out); + } + else + nlwarning("command : unknown message name : 'ANIMALS:DISBAND_CONVOY'"); - return true; + return true; } NLMISC_COMMAND(learnAllBrick, "learn all bricks (only in local mode)", "") { - CInterfaceManager *pIM= CInterfaceManager::getInstance(); - uint i=0; - for(;;) - { - CCDBNodeLeaf * node= NLGUI::CDBManager::getInstance()->getDbProp(toString("SERVER:BRICK_FAMILY:%d:BRICKS", i), false); - if(node) - node->setValue64(SINT64_CONSTANT(0xFFFFFFFFFFFFFFFF)); - else - break; - i++; - } - return true; + CInterfaceManager *pIM= CInterfaceManager::getInstance(); + uint i=0; + for(;;) + { + CCDBNodeLeaf * node= NLGUI::CDBManager::getInstance()->getDbProp(toString("SERVER:BRICK_FAMILY:%d:BRICKS", i), false); + if(node) + node->setValue64(SINT64_CONSTANT(0xFFFFFFFFFFFFFFFF)); + else + break; + i++; + } + return true; } NLMISC_COMMAND(learnBrick, "learn a specified brick (only in local mode)", "") { - CInterfaceManager *pIM= CInterfaceManager::getInstance(); - CSBrickManager *pBM= CSBrickManager::getInstance(); + CInterfaceManager *pIM= CInterfaceManager::getInstance(); + CSBrickManager *pBM= CSBrickManager::getInstance(); - if(args.size()<1) - return false; + if(args.size()<1) + return false; - // translate to brick sheet id - CSheetId brickSheetId; - uint testId; - fromString(args[0], testId); - if(testId!=0) - { - brickSheetId= CSheetId(testId); - } - else - { - string str= args[0]; - if(str.find(".sbrick")==string::npos) - str+= ".sbrick"; - brickSheetId.buildSheetId(str); - } + // translate to brick sheet id + CSheetId brickSheetId; + uint testId; + fromString(args[0], testId); + if(testId!=0) + { + brickSheetId= CSheetId(testId); + } + else + { + string str= args[0]; + if(str.find(".sbrick")==string::npos) + str+= ".sbrick"; + brickSheetId.buildSheetId(str); + } - // get the brick sheet - CSBrickSheet *brick= pBM->getBrick(brickSheetId); - if(!brick) - { - pIM->displaySystemInfo(toString("brick '%s' not found", args[0].c_str())); - return false; - } + // get the brick sheet + CSBrickSheet *brick= pBM->getBrick(brickSheetId); + if(!brick) + { + pIM->displaySystemInfo(toString("brick '%s' not found", args[0].c_str())); + return false; + } - // force learn it. - CCDBNodeLeaf * node= pBM->getKnownBrickBitFieldDB(brick->BrickFamily); - if(node) - { - uint64 flags= node->getValue64(); - flags|= uint64(1)<<(brick->IndexInFamily-1); - node->setValue64(flags); - } - return true; + // force learn it. + CCDBNodeLeaf * node= pBM->getKnownBrickBitFieldDB(brick->BrickFamily); + if(node) + { + uint64 flags= node->getValue64(); + flags|= uint64(1)<<(brick->IndexInFamily-1); + node->setValue64(flags); + } + return true; } NLMISC_COMMAND(learnPhrase, "learn all bricks of a specified phrase (only in local mode)", "") { - CInterfaceManager *pIM= CInterfaceManager::getInstance(); - CSBrickManager *pBM= CSBrickManager::getInstance(); - CSPhraseManager *pPM= CSPhraseManager::getInstance(); + CInterfaceManager *pIM= CInterfaceManager::getInstance(); + CSBrickManager *pBM= CSBrickManager::getInstance(); + CSPhraseManager *pPM= CSPhraseManager::getInstance(); - if(args.size()<1) - return false; + if(args.size()<1) + return false; - // translate to brick sheet id - CSheetId phraseSheetId; - uint testId; - fromString(args[0], testId); - if(testId!=0) - { - phraseSheetId= CSheetId(testId); - } - else - { - string str= args[0]; - if(str.find(".sphrase")==string::npos) - str+= ".sphrase"; - phraseSheetId.buildSheetId(str); - } - - // get the brick sheet - CSPhraseCom phrase; - pPM->buildPhraseFromSheet(phrase, phraseSheetId.asInt()); - if(phrase.empty()) - { - pIM->displaySystemInfo(toString("phrase '%s' not found", args[0].c_str())); - return false; - } - - // For all bricks of this phrase - for(uint i=0;igetBrick(phrase.Bricks[i]); - if(brick) + // translate to brick sheet id + CSheetId phraseSheetId; + uint testId; + fromString(args[0], testId); + if(testId!=0) { - // force learn it. - CCDBNodeLeaf * node= pBM->getKnownBrickBitFieldDB(brick->BrickFamily); - if(node) - { - uint64 flags= node->getValue64(); - flags|= uint64(1)<<(brick->IndexInFamily-1); - node->setValue64(flags); - } + phraseSheetId= CSheetId(testId); + } + else + { + string str= args[0]; + if(str.find(".sphrase")==string::npos) + str+= ".sphrase"; + phraseSheetId.buildSheetId(str); } - } - return true; + // get the brick sheet + CSPhraseCom phrase; + pPM->buildPhraseFromSheet(phrase, phraseSheetId.asInt()); + if(phrase.empty()) + { + pIM->displaySystemInfo(toString("phrase '%s' not found", args[0].c_str())); + return false; + } + + // For all bricks of this phrase + for(uint i=0;igetBrick(phrase.Bricks[i]); + if(brick) + { + // force learn it. + CCDBNodeLeaf * node= pBM->getKnownBrickBitFieldDB(brick->BrickFamily); + if(node) + { + uint64 flags= node->getValue64(); + flags|= uint64(1)<<(brick->IndexInFamily-1); + node->setValue64(flags); + } + } + } + + return true; } /*NLMISC_COMMAND(xp, "To gain XP in a given Skill"," []") - { - // Check parameters. - if( args.size() < 2 || args.size() > 3 ) - return false; +{ + // Check parameters. + if( args.size() < 2 || args.size() > 3 ) + return false; - CBitMemStream out; - if(GenericMsgHeaderMngr.pushNameToStream("CHEAT:XP", out)) - { - uint32 xp; - fromString(args[0], xp); - string skill = args[1]; - string speciality; - if( args.size() == 3 ) - speciality = args[2]; - out.serial( xp ); - out.serial( skill ); - out.serial( speciality ); - // Add the message to the send list. - NetMngr.push(out); - // send CHEAT:XP - nlinfo("command 'xp': CHEAT:XP pushed"); - } - else - nlwarning("command 'xp': unknown message named 'CHEAT:XP'"); + CBitMemStream out; + if(GenericMsgHeaderMngr.pushNameToStream("CHEAT:XP", out)) + { + uint32 xp; + fromString(args[0], xp); + string skill = args[1]; + string speciality; + if( args.size() == 3 ) + speciality = args[2]; + out.serial( xp ); + out.serial( skill ); + out.serial( speciality ); + // Add the message to the send list. + NetMngr.push(out); + // send CHEAT:XP + nlinfo("command 'xp': CHEAT:XP pushed"); + } + else + nlwarning("command 'xp': unknown message named 'CHEAT:XP'"); - // Done. - return true; - }*/ + // Done. + return true; +}*/ NLMISC_COMMAND(money, "To earn Money (only in local mode)"," [] [] []") { - if (args.size() != 1) return false; - uint64 money; - fromString(args[0], money); - CInterfaceManager *im = CInterfaceManager::getInstance(); - NLGUI::CDBManager::getInstance()->getDbProp("SERVER:INVENTORY:MONEY")->setValue64(money); - return true; - /* - sint32 a = 0; - sint32 b = 0; - sint32 c = 0; - sint32 d = 0; + if (args.size() != 1) return false; + uint64 money; + fromString(args[0], money); + CInterfaceManager *im = CInterfaceManager::getInstance(); + NLGUI::CDBManager::getInstance()->getDbProp("SERVER:INVENTORY:MONEY")->setValue64(money); + return true; +/* + sint32 a = 0; + sint32 b = 0; + sint32 c = 0; + sint32 d = 0; - // Check parameters. - switch(args.size()) - { - case 4: - fromString(args[3], d); - case 3: - fromString(args[2], c); - case 2: - fromString(args[1], b); - case 1: - fromString(args[0], a); - break; - default: - return false; - } + // Check parameters. + switch(args.size()) + { + case 4: + fromString(args[3], d); + case 3: + fromString(args[2], c); + case 2: + fromString(args[1], b); + case 1: + fromString(args[0], a); + break; + default: + return false; + } - CInterfaceManager *im = CInterfaceManager::getInstance(); - string ls = im->getDefine("money_1"); - string ms = im->getDefine("money_2"); - string bs = im->getDefine("money_3"); - string vbs = im->getDefine("money_4"); - NLGUI::CDBManager::getInstance()->getDbProp(ls + ":QUANTITY")->setValue32(a); - NLGUI::CDBManager::getInstance()->getDbProp(ms + ":QUANTITY")->setValue32(b); - NLGUI::CDBManager::getInstance()->getDbProp(bs + ":QUANTITY")->setValue32(c); - NLGUI::CDBManager::getInstance()->getDbProp(vbs + ":QUANTITY")->setValue32(d); - return true; - */ + CInterfaceManager *im = CInterfaceManager::getInstance(); + string ls = im->getDefine("money_1"); + string ms = im->getDefine("money_2"); + string bs = im->getDefine("money_3"); + string vbs = im->getDefine("money_4"); + NLGUI::CDBManager::getInstance()->getDbProp(ls + ":QUANTITY")->setValue32(a); + NLGUI::CDBManager::getInstance()->getDbProp(ms + ":QUANTITY")->setValue32(b); + NLGUI::CDBManager::getInstance()->getDbProp(bs + ":QUANTITY")->setValue32(c); + NLGUI::CDBManager::getInstance()->getDbProp(vbs + ":QUANTITY")->setValue32(d); + return true; +*/ } /* - NLMISC_COMMAND( createPerso, "create a new character", "Parameters:\n-Character name\n-Race( Fyros, Tryker...)\n-gender(Male, Female)\n-Role( MeleeFighter, RangeFighter, AttackCaster, BufferCaster, HealerCaster...)\n-Level (1-25 (but more accepted)>" ) - { - // Check parameters. - if(args.size() < 5) return false; +NLMISC_COMMAND( createPerso, "create a new character", "Parameters:\n-Character name\n-Race( Fyros, Tryker...)\n-gender(Male, Female)\n-Role( MeleeFighter, RangeFighter, AttackCaster, BufferCaster, HealerCaster...)\n-Level (1-25 (but more accepted)>" ) +{ + // Check parameters. + if(args.size() < 5) return false; - // read params - string characterName = args[0]; - EGSPD::CPeople::TPeople race = EGSPD::CPeople::fromString( args[1] ); - if( race == EGSPD::CPeople::EndPeople ) return false; + // read params + string characterName = args[0]; + EGSPD::CPeople::TPeople race = EGSPD::CPeople::fromString( args[1] ); + if( race == EGSPD::CPeople::EndPeople ) return false; - GSGENDER::EGender gender = GSGENDER::stringToEnum( args[2] ); - if( gender == GSGENDER::unknown ) return false; + GSGENDER::EGender gender = GSGENDER::stringToEnum( args[2] ); + if( gender == GSGENDER::unknown ) return false; - ROLES::ERole role = ROLES::toRoleId( args[3] ); - if( role == ROLES::role_unknown ) return false; + ROLES::ERole role = ROLES::toRoleId( args[3] ); + if( role == ROLES::role_unknown ) return false; - uint16 level; - fromString(args[4], level); + uint16 level; + fromString(args[4], level); - CBitMemStream bms; - string msgType = "CHEAT:CREATE_CHARACTER"; - if( GenericMsgHeaderMngr.pushNameToStream(msgType,bms) ) - { - bms.serial( characterName ); - bms.serialEnum( race ); - bms.serialEnum( gender ); - bms.serialEnum( role ); - bms.serial( level ); - NetMngr.push( bms ); - nldebug(" sending 'CHEAT:CREATE_CHARACTER' message to server"); - } - else - { - nlwarning(" unknown message name : CHEAT:CREATE_CHARACTER"); - } - return true; - } + CBitMemStream bms; + string msgType = "CHEAT:CREATE_CHARACTER"; + if( GenericMsgHeaderMngr.pushNameToStream(msgType,bms) ) + { + bms.serial( characterName ); + bms.serialEnum( race ); + bms.serialEnum( gender ); + bms.serialEnum( role ); + bms.serial( level ); + NetMngr.push( bms ); + nldebug(" sending 'CHEAT:CREATE_CHARACTER' message to server"); + } + else + { + nlwarning(" unknown message name : CHEAT:CREATE_CHARACTER"); + } + return true; +} */ /* - NLMISC_COMMAND( add_role, "add role to character", "" ) - { - // Check parameters. - if(args.size() < 2) return false; +NLMISC_COMMAND( add_role, "add role to character", "" ) +{ + // Check parameters. + if(args.size() < 2) return false; - ROLES::ERole role = ROLES::toRoleId( args[0] ); - if( role == ROLES::role_unknown ) return false; + ROLES::ERole role = ROLES::toRoleId( args[0] ); + if( role == ROLES::role_unknown ) return false; - uint16 level; - fromString(args[1], level); + uint16 level; + fromString(args[1], level); - CBitMemStream bms; - string msgType = "CHEAT:ADD_ROLE"; - if( GenericMsgHeaderMngr.pushNameToStream(msgType,bms) ) - { - bms.serialEnum( role ); - bms.serial( level ); - NetMngr.push( bms ); - nldebug(" sending 'CHEAT:ADD_ROLE' message to server"); - } - else - { - nlwarning(" unknown message name : CHEAT:ADD_ROLE"); - } - return true; - } + CBitMemStream bms; + string msgType = "CHEAT:ADD_ROLE"; + if( GenericMsgHeaderMngr.pushNameToStream(msgType,bms) ) + { + bms.serialEnum( role ); + bms.serial( level ); + NetMngr.push( bms ); + nldebug(" sending 'CHEAT:ADD_ROLE' message to server"); + } + else + { + nlwarning(" unknown message name : CHEAT:ADD_ROLE"); + } + return true; +} */ NLMISC_COMMAND(test, "", "") { - sint64 x, y, z; - CLFECOMMON::TCLEntityId entSlot = UserEntity->selection(); - CEntityCL *entPtr = EntitiesMngr.entity(entSlot); - if(entPtr) - { - if(entPtr->skeleton()) + sint64 x, y, z; + CLFECOMMON::TCLEntityId entSlot = UserEntity->selection(); + CEntityCL *entPtr = EntitiesMngr.entity(entSlot); + if(entPtr) { - if(entPtr->skeleton()->getLastClippedState()) - { - NLMISC::CMatrix mat = entPtr->skeleton()->getLastWorldMatrixComputed(); - NLMISC::CVectorD newPos = entPtr->pos() + mat.getJ()*0.5f; - x = (sint64)(newPos.x*1000.0); - y = (sint64)(newPos.y*1000.0); - z = (sint64)(newPos.z*1000.0); - IngameDbMngr.setProp("Entities:E" + toString("%d", entSlot) + ":P" + toString("%d", CLFECOMMON::PROPERTY_POSX), x); - IngameDbMngr.setProp("Entities:E" + toString("%d", entSlot) + ":P" + toString("%d", CLFECOMMON::PROPERTY_POSY), y); - IngameDbMngr.setProp("Entities:E" + toString("%d", entSlot) + ":P" + toString("%d", CLFECOMMON::PROPERTY_POSZ), z); - entPtr->updateVisualProperty(NetMngr.getCurrentServerTick(), CLFECOMMON::PROPERTY_POSITION); + if(entPtr->skeleton()) + { + if(entPtr->skeleton()->getLastClippedState()) + { + NLMISC::CMatrix mat = entPtr->skeleton()->getLastWorldMatrixComputed(); + NLMISC::CVectorD newPos = entPtr->pos() + mat.getJ()*0.5f; + x = (sint64)(newPos.x*1000.0); + y = (sint64)(newPos.y*1000.0); + z = (sint64)(newPos.z*1000.0); + IngameDbMngr.setProp("Entities:E" + toString("%d", entSlot) + ":P" + toString("%d", CLFECOMMON::PROPERTY_POSX), x); + IngameDbMngr.setProp("Entities:E" + toString("%d", entSlot) + ":P" + toString("%d", CLFECOMMON::PROPERTY_POSY), y); + IngameDbMngr.setProp("Entities:E" + toString("%d", entSlot) + ":P" + toString("%d", CLFECOMMON::PROPERTY_POSZ), z); + entPtr->updateVisualProperty(NetMngr.getCurrentServerTick(), CLFECOMMON::PROPERTY_POSITION); - x = (sint64)(entPtr->pos().x*1000.0); - y = (sint64)(entPtr->pos().y*1000.0); - z = (sint64)(entPtr->pos().z*1000.0); - IngameDbMngr.setProp("Entities:E" + toString("%d", entSlot) + ":P" + toString("%d", CLFECOMMON::PROPERTY_POSX), x); - IngameDbMngr.setProp("Entities:E" + toString("%d", entSlot) + ":P" + toString("%d", CLFECOMMON::PROPERTY_POSY), y); - IngameDbMngr.setProp("Entities:E" + toString("%d", entSlot) + ":P" + toString("%d", CLFECOMMON::PROPERTY_POSZ), z); - entPtr->updateVisualProperty(NetMngr.getCurrentServerTick()+5, CLFECOMMON::PROPERTY_POSITION); - } + x = (sint64)(entPtr->pos().x*1000.0); + y = (sint64)(entPtr->pos().y*1000.0); + z = (sint64)(entPtr->pos().z*1000.0); + IngameDbMngr.setProp("Entities:E" + toString("%d", entSlot) + ":P" + toString("%d", CLFECOMMON::PROPERTY_POSX), x); + IngameDbMngr.setProp("Entities:E" + toString("%d", entSlot) + ":P" + toString("%d", CLFECOMMON::PROPERTY_POSY), y); + IngameDbMngr.setProp("Entities:E" + toString("%d", entSlot) + ":P" + toString("%d", CLFECOMMON::PROPERTY_POSZ), z); + entPtr->updateVisualProperty(NetMngr.getCurrentServerTick()+5, CLFECOMMON::PROPERTY_POSITION); + } + } } - } - return true; + return true; } @@ -3768,57 +3755,57 @@ NLMISC_COMMAND(test, "", "") /// commandName : Name of the command. /// variableName : Variable Name to change. //----------------------------------------------- -#define DIST_TO_COMMAND(commandName, variableName) \ - /* Check Parameters */ \ - if(args.size() != 2) \ - { \ - nlwarning("Command '" #commandName "': need 2 parameters, try '/help " #commandName "' for more details."); \ - return false; \ - } \ - \ - /* Try to create the sheet with the parameter as a string. */ \ - CSheetId sheetId; \ - if(!sheetId.buildSheetId(args[0])) \ - { \ - /* Try to create the sheet with the parameter as an int. */ \ - uint32 nSheetId; \ - fromString(args[0], nSheetId); \ - sheetId = CSheetId(nSheetId); \ - if(sheetId == CSheetId::Unknown) \ - { \ - nlwarning("Command '" #commandName "': '%s' is not a valid form.", args[0].c_str()); \ - return false; \ - } \ - } \ - \ - /* Get the new distance. */ \ - float dist; \ - fromString(args[1], dist); \ - if(dist < 0) \ - { \ - nlwarning("Command '" #commandName "': distance < 0, this is not good."); \ - return false; \ - } \ - \ - CCharacterSheet *ch = dynamic_cast(SheetMngr.get(sheetId)); \ - if(ch == 0) \ - { \ - nlwarning("Command '" #commandName "': cannot find the character for the given sheet."); \ - return false; \ - } \ - \ - /* Set the new distance for this sheet. */ \ - ch->variableName = dist; \ - \ - /* Well Done */ \ - return true; \ +#define DIST_TO_COMMAND(commandName, variableName) \ + /* Check Parameters */ \ + if(args.size() != 2) \ + { \ + nlwarning("Command '" #commandName "': need 2 parameters, try '/help " #commandName "' for more details."); \ + return false; \ + } \ + \ + /* Try to create the sheet with the parameter as a string. */ \ + CSheetId sheetId; \ + if(!sheetId.buildSheetId(args[0])) \ + { \ + /* Try to create the sheet with the parameter as an int. */ \ + uint32 nSheetId; \ + fromString(args[0], nSheetId); \ + sheetId = CSheetId(nSheetId); \ + if(sheetId == CSheetId::Unknown) \ + { \ + nlwarning("Command '" #commandName "': '%s' is not a valid form.", args[0].c_str()); \ + return false; \ + } \ + } \ + \ + /* Get the new distance. */ \ + float dist; \ + fromString(args[1], dist); \ + if(dist < 0) \ + { \ + nlwarning("Command '" #commandName "': distance < 0, this is not good."); \ + return false; \ + } \ + \ + CCharacterSheet *ch = dynamic_cast(SheetMngr.get(sheetId)); \ + if(ch == 0) \ + { \ + nlwarning("Command '" #commandName "': cannot find the character for the given sheet."); \ + return false; \ + } \ + \ + /* Set the new distance for this sheet. */ \ + ch->variableName = dist; \ + \ + /* Well Done */ \ + return true; \ //----------------------------------------------- // 'dist2front' : Change the distance to the front for a given sheet. //----------------------------------------------- NLMISC_COMMAND(dist2front, "Change the distance to the front for a given sheet.", " ") { -DIST_TO_COMMAND(dist2front, DistToFront); + DIST_TO_COMMAND(dist2front, DistToFront); } //----------------------------------------------- @@ -3826,7 +3813,7 @@ DIST_TO_COMMAND(dist2front, DistToFront); //----------------------------------------------- NLMISC_COMMAND(dist2back, "Change the distance to the back for a given sheet.", " ") { -DIST_TO_COMMAND(dist2back, DistToBack); + DIST_TO_COMMAND(dist2back, DistToBack); } //----------------------------------------------- @@ -3834,7 +3821,7 @@ DIST_TO_COMMAND(dist2back, DistToBack); //----------------------------------------------- NLMISC_COMMAND(dist2side, "Change the distance to the side for a given sheet.", " ") { -DIST_TO_COMMAND(dist2side, DistToSide); + DIST_TO_COMMAND(dist2side, DistToSide); } @@ -3842,660 +3829,660 @@ DIST_TO_COMMAND(dist2side, DistToSide); // Change the parent of an entity. 'parent slot' not defined remove the current parent. NLMISC_COMMAND(parent, "Change the parent of an entity.", " []") { -CLFECOMMON::TCLEntityId parentSlot = CLFECOMMON::INVALID_SLOT; + CLFECOMMON::TCLEntityId parentSlot = CLFECOMMON::INVALID_SLOT; -// Check parameters. -switch(args.size()) - { -// Set the target for the entity. - case 2: -fromString(args[1], parentSlot); + // Check parameters. + switch(args.size()) + { + // Set the target for the entity. + case 2: + fromString(args[1], parentSlot); -// Remove the target for the entity. - case 1: - { -uint entitySlot; -fromString(args[0], entitySlot); -CEntityCL *entity = EntitiesMngr.entity(entitySlot); -if(entity) - { -entity->parent(parentSlot); -entity->pos(CVectorD::Null); -} - else - nlwarning("command 'parent': there is no entity in the slot %d", entitySlot); -} -break; + // Remove the target for the entity. + case 1: + { + uint entitySlot; + fromString(args[0], entitySlot); + CEntityCL *entity = EntitiesMngr.entity(entitySlot); + if(entity) + { + entity->parent(parentSlot); + entity->pos(CVectorD::Null); + } + else + nlwarning("command 'parent': there is no entity in the slot %d", entitySlot); + } + break; -// Bad command. - default: -return false; -} + // Bad command. + default: + return false; + } -// Well done. -return true; + // Well done. + return true; } NLMISC_COMMAND(displayInventoryCounter, "display the Inventory counter to compare with db counter", "") { -CInterfaceManager *pIM= CInterfaceManager::getInstance(); + CInterfaceManager *pIM= CInterfaceManager::getInstance(); -uint srvVal= NLGUI::CDBManager::getInstance()->getDbProp("SERVER:INVENTORY:COUNTER")->getValue32(); -uint locVal= pIM->getLocalSyncActionCounter() ; -srvVal&= pIM->getLocalSyncActionCounterMask(); -locVal&= pIM->getLocalSyncActionCounterMask(); + uint srvVal= NLGUI::CDBManager::getInstance()->getDbProp("SERVER:INVENTORY:COUNTER")->getValue32(); + uint locVal= pIM->getLocalSyncActionCounter() ; + srvVal&= pIM->getLocalSyncActionCounterMask(); + locVal&= pIM->getLocalSyncActionCounterMask(); -pIM->displaySystemInfo(ucstring( "ServerCounter: " + toString(srvVal) + "/ LocalCounter: " + toString(locVal)) ); + pIM->displaySystemInfo(ucstring( "ServerCounter: " + toString(srvVal) + "/ LocalCounter: " + toString(locVal)) ); -// Well done. -return true; + // Well done. + return true; } NLMISC_COMMAND(displayActionCounter, "display the action counters", "") { -CInterfaceManager *pIM= CInterfaceManager::getInstance(); -CSPhraseManager *pPM= CSPhraseManager::getInstance(); + CInterfaceManager *pIM= CInterfaceManager::getInstance(); + CSPhraseManager *pPM= CSPhraseManager::getInstance(); -// next -uint srvVal= NLGUI::CDBManager::getInstance()->getDbProp(PHRASE_DB_COUNTER_NEXT)->getValue32(); -uint locVal= pPM->getPhraseNextExecuteCounter() ; -srvVal&= PHRASE_EXECUTE_COUNTER_MASK; -locVal&= PHRASE_EXECUTE_COUNTER_MASK; + // next + uint srvVal= NLGUI::CDBManager::getInstance()->getDbProp(PHRASE_DB_COUNTER_NEXT)->getValue32(); + uint locVal= pPM->getPhraseNextExecuteCounter() ; + srvVal&= PHRASE_EXECUTE_COUNTER_MASK; + locVal&= PHRASE_EXECUTE_COUNTER_MASK; -pIM->displaySystemInfo(ucstring( "NextCounter: " + toString(srvVal) + "/ LocalCounter: " + toString(locVal)) ); + pIM->displaySystemInfo(ucstring( "NextCounter: " + toString(srvVal) + "/ LocalCounter: " + toString(locVal)) ); -// cycle -srvVal= NLGUI::CDBManager::getInstance()->getDbProp(PHRASE_DB_COUNTER_CYCLE)->getValue32(); -locVal= pPM->getPhraseCycleExecuteCounter() ; -srvVal&= PHRASE_EXECUTE_COUNTER_MASK; -locVal&= PHRASE_EXECUTE_COUNTER_MASK; + // cycle + srvVal= NLGUI::CDBManager::getInstance()->getDbProp(PHRASE_DB_COUNTER_CYCLE)->getValue32(); + locVal= pPM->getPhraseCycleExecuteCounter() ; + srvVal&= PHRASE_EXECUTE_COUNTER_MASK; + locVal&= PHRASE_EXECUTE_COUNTER_MASK; -pIM->displaySystemInfo(ucstring( "CycleCounter: " + toString(srvVal) + "/ LocalCounter: " + toString(locVal)) ); + pIM->displaySystemInfo(ucstring( "CycleCounter: " + toString(srvVal) + "/ LocalCounter: " + toString(locVal)) ); -return true; + return true; } NLMISC_COMMAND (url, "launch a browser to the specified url", "") { - if (args.size () != 1) - return false; + if (args.size () != 1) + return false; - return openURL(args[0].c_str()); + return openURL(args[0].c_str()); } NLMISC_COMMAND( reconnect, "Reconnect to the same shard (self Far TP)", "") { - // If the server is up, the egs will begin the quit sequence (shortened only if we are in edition or animation mode). - // If the server is down or frozen, a second /reconnect will be necessary to make the client reconnect - // but if you reconnect before letting the EGS save the character file, the previous saved file will be loaded. - switch ( LoginSM.getCurrentState() ) - { - case CLoginStateMachine::st_ingame: - LoginSM.pushEvent( CLoginStateMachine::ev_connect ); - break; - case CLoginStateMachine::st_leave_shard: - FarTP.onServerQuitOk(); - break; - default: - log.displayNL( "Can't reconnect from LoginSM state %u", (uint)LoginSM.getCurrentState() ); - } + // If the server is up, the egs will begin the quit sequence (shortened only if we are in edition or animation mode). + // If the server is down or frozen, a second /reconnect will be necessary to make the client reconnect + // but if you reconnect before letting the EGS save the character file, the previous saved file will be loaded. + switch ( LoginSM.getCurrentState() ) + { + case CLoginStateMachine::st_ingame: + LoginSM.pushEvent( CLoginStateMachine::ev_connect ); + break; + case CLoginStateMachine::st_leave_shard: + FarTP.onServerQuitOk(); + break; + default: + log.displayNL( "Can't reconnect from LoginSM state %u", (uint)LoginSM.getCurrentState() ); + } - return true; + return true; } struct CItemSheetSort { - const CItemSheet *IS; - CSheetId ID; - ITEMFAMILY::EItemFamily Family; + const CItemSheet *IS; + CSheetId ID; + ITEMFAMILY::EItemFamily Family; }; static inline bool operator < (const CItemSheetSort &lhs, const CItemSheetSort &rhs) { - return lhs.Family < rhs.Family; + return lhs.Family < rhs.Family; } NLMISC_COMMAND(dumpItems, "Sort items by category & display their sheet ids", "") { - std::vector isVect; - const CSheetManager::TEntitySheetMap &sheets = SheetMngr.getSheets(); - for(CSheetManager::TEntitySheetMap::const_iterator it = sheets.begin(); it != sheets.end(); ++it) - { - const CEntitySheet *es = it->second.EntitySheet; - if (es && es->type() == CEntitySheet::ITEM) + std::vector isVect; + const CSheetManager::TEntitySheetMap &sheets = SheetMngr.getSheets(); + for(CSheetManager::TEntitySheetMap::const_iterator it = sheets.begin(); it != sheets.end(); ++it) { - CItemSheetSort iss; - iss.IS = static_cast(es); - iss.ID = it->first; - iss.Family = iss.IS->Family; - isVect.push_back(iss); + const CEntitySheet *es = it->second.EntitySheet; + if (es && es->type() == CEntitySheet::ITEM) + { + CItemSheetSort iss; + iss.IS = static_cast(es); + iss.ID = it->first; + iss.Family = iss.IS->Family; + isVect.push_back(iss); + } } - } - // - // sort items - std::sort(isVect.begin(), isVect.end()); - // - for(std::vector::iterator itemIt = isVect.begin(); itemIt != isVect.end(); ++itemIt) - { - std::string info; - info = "FAMILY: "; - info += ITEMFAMILY::toString(itemIt->Family); - info += "; Name = "; - info += itemIt->IS->Id.toString(); - info += "; Sheet ID = "; - info += toString(itemIt->ID.asInt()); - nlwarning(info.c_str()); - } - return true; + // + // sort items + std::sort(isVect.begin(), isVect.end()); + // + for(std::vector::iterator itemIt = isVect.begin(); itemIt != isVect.end(); ++itemIt) + { + std::string info; + info = "FAMILY: "; + info += ITEMFAMILY::toString(itemIt->Family); + info += "; Name = "; + info += itemIt->IS->Id.toString(); + info += "; Sheet ID = "; + info += toString(itemIt->ID.asInt()); + nlwarning(info.c_str()); + } + return true; } NLMISC_COMMAND(dumpVisualSlots, "dump the visual slots", "") { - if (!args.empty()) return false; - SheetMngr.dumpVisualSlots(); - SheetMngr.dumpVisualSlotsIndex(); - return true; + if (!args.empty()) return false; + SheetMngr.dumpVisualSlots(); + SheetMngr.dumpVisualSlotsIndex(); + return true; } NLMISC_COMMAND(skillToInt, "Convert a skill to an int", "") { - if (args.size() != 1) return false; - CInterfaceManager *im = CInterfaceManager::getInstance(); - im->displaySystemInfo(ucstring(toString((uint) SKILLS::toSkill(args[0])))); - return true; + if (args.size() != 1) return false; + CInterfaceManager *im = CInterfaceManager::getInstance(); + im->displaySystemInfo(ucstring(toString((uint) SKILLS::toSkill(args[0])))); + return true; } NLMISC_COMMAND(browse, "Browse a HTML document with the internal help web browser.", "") { - if (args.size() != 1) return false; - CInterfaceManager *im = CInterfaceManager::getInstance(); - CAHManager::getInstance()->runActionHandler("browse", NULL, "name=ui:interface:help_browser:content:html|url="+args[0]); - return true; + if (args.size() != 1) return false; + CInterfaceManager *im = CInterfaceManager::getInstance(); + CAHManager::getInstance()->runActionHandler("browse", NULL, "name=ui:interface:help_browser:content:html|url="+args[0]); + return true; } NLMISC_COMMAND(openRingWindow, "Browse the main page in the ring web browser.", "") { - CInterfaceManager *im = CInterfaceManager::getInstance(); - CAHManager::getInstance()->runActionHandler("browse", NULL, "name=ui:interface:r2ed_web_admin:content:admin_web_page|url="+RingMainURL); - return true; + CInterfaceManager *im = CInterfaceManager::getInstance(); + CAHManager::getInstance()->runActionHandler("browse", NULL, "name=ui:interface:r2ed_web_admin:content:admin_web_page|url="+RingMainURL); + return true; } NLMISC_COMMAND(browseRingAdmin, "Browse a HTML document with the ring web browser.", "") { - if (args.size() != 1) return false; - CInterfaceManager *im = CInterfaceManager::getInstance(); - CAHManager::getInstance()->runActionHandler("browse", NULL, "name=ui:interface:r2ed_web_admin:content:admin_web_page|url="+args[0]); - return true; + if (args.size() != 1) return false; + CInterfaceManager *im = CInterfaceManager::getInstance(); + CAHManager::getInstance()->runActionHandler("browse", NULL, "name=ui:interface:r2ed_web_admin:content:admin_web_page|url="+args[0]); + return true; } NLMISC_COMMAND(GUCreate, "create a guild", "") { - if (args.size() != 1) return false; - const string msgName = "GUILD:CREATE"; - CBitMemStream out; - if(GenericMsgHeaderMngr.pushNameToStream(msgName, out)) - { - string buf = args[0]; - out.serial( buf ); - NetMngr.push(out); - } - return true; + if (args.size() != 1) return false; + const string msgName = "GUILD:CREATE"; + CBitMemStream out; + if(GenericMsgHeaderMngr.pushNameToStream(msgName, out)) + { + string buf = args[0]; + out.serial( buf ); + NetMngr.push(out); + } + return true; } NLMISC_COMMAND(GUQuit, "quit a guild", "") { - if (args.size() != 0) return false; - const string msgName = "GUILD:QUIT"; - CBitMemStream out; - if(GenericMsgHeaderMngr.pushNameToStream(msgName, out)) - { - NetMngr.push(out); - } - return true; + if (args.size() != 0) return false; + const string msgName = "GUILD:QUIT"; + CBitMemStream out; + if(GenericMsgHeaderMngr.pushNameToStream(msgName, out)) + { + NetMngr.push(out); + } + return true; } NLMISC_COMMAND(GULeaveLeadership, "abandon leadership of a guild", "") { - if (args.size() != 0) return false; - const string msgName = "GUILD:ABANDON_LEADERSHIP"; - CBitMemStream out; - if(GenericMsgHeaderMngr.pushNameToStream(msgName, out)) - { - NetMngr.push(out); - } - return true; + if (args.size() != 0) return false; + const string msgName = "GUILD:ABANDON_LEADERSHIP"; + CBitMemStream out; + if(GenericMsgHeaderMngr.pushNameToStream(msgName, out)) + { + NetMngr.push(out); + } + return true; } NLMISC_COMMAND(GULeaveOfficerTitle, "abandon officer title", "") { - if (args.size() != 0) return false; - const string msgName = "GUILD:ABANDON_OFFICER_TITLE"; - CBitMemStream out; - if(GenericMsgHeaderMngr.pushNameToStream(msgName, out)) - { - NetMngr.push(out); - } - return true; + if (args.size() != 0) return false; + const string msgName = "GUILD:ABANDON_OFFICER_TITLE"; + CBitMemStream out; + if(GenericMsgHeaderMngr.pushNameToStream(msgName, out)) + { + NetMngr.push(out); + } + return true; } NLMISC_COMMAND(GUNameOfficer, "name an officer", "") { - if (args.size() != 1) return false; - const string msgName = "GUILD:NAME_OFFICER"; - CBitMemStream out; - if(GenericMsgHeaderMngr.pushNameToStream(msgName, out)) - { - string buf = args[0]; - out.serial( buf ); - NetMngr.push(out); - } - return true; + if (args.size() != 1) return false; + const string msgName = "GUILD:NAME_OFFICER"; + CBitMemStream out; + if(GenericMsgHeaderMngr.pushNameToStream(msgName, out)) + { + string buf = args[0]; + out.serial( buf ); + NetMngr.push(out); + } + return true; } NLMISC_COMMAND(GUDismissOfficer, "dismiss an officer", "") { - if (args.size() != 1) return false; - const string msgName = "GUILD:DISMISS_OFFICER"; - CBitMemStream out; - if(GenericMsgHeaderMngr.pushNameToStream(msgName, out)) - { - string buf = args[0]; - out.serial( buf ); - NetMngr.push(out); - } - return true; + if (args.size() != 1) return false; + const string msgName = "GUILD:DISMISS_OFFICER"; + CBitMemStream out; + if(GenericMsgHeaderMngr.pushNameToStream(msgName, out)) + { + string buf = args[0]; + out.serial( buf ); + NetMngr.push(out); + } + return true; } NLMISC_COMMAND(GUKick, "kick a member", "") { - if (args.size() != 1) return false; - const string msgName = "GUILD:KICK_MEMBER"; - CBitMemStream out; - if(GenericMsgHeaderMngr.pushNameToStream(msgName, out)) - { - string buf = args[0]; - out.serial( buf ); - NetMngr.push(out); - } - return true; + if (args.size() != 1) return false; + const string msgName = "GUILD:KICK_MEMBER"; + CBitMemStream out; + if(GenericMsgHeaderMngr.pushNameToStream(msgName, out)) + { + string buf = args[0]; + out.serial( buf ); + NetMngr.push(out); + } + return true; } NLMISC_COMMAND(GUAccept, "accept an invitation", "") { - CAHManager::getInstance()->runActionHandler("accept_guild_invitation",NULL); - return true; + CAHManager::getInstance()->runActionHandler("accept_guild_invitation",NULL); + return true; } NLMISC_COMMAND(GURefuse, "refuse an invitation", "") { - CAHManager::getInstance()->runActionHandler("refuse_guild_invitation",NULL); - return true; + CAHManager::getInstance()->runActionHandler("refuse_guild_invitation",NULL); + return true; } NLMISC_COMMAND(GUFriend, "invite a player to become a friend of the guild", "") { - if (args.size() != 1) return false; - const string msgName = "GUILD:FRIEND_INVITATION"; - CBitMemStream out; - if(GenericMsgHeaderMngr.pushNameToStream(msgName, out)) - { - string buf = args[0]; - out.serial( buf ); - NetMngr.push(out); - } - return true; + if (args.size() != 1) return false; + const string msgName = "GUILD:FRIEND_INVITATION"; + CBitMemStream out; + if(GenericMsgHeaderMngr.pushNameToStream(msgName, out)) + { + string buf = args[0]; + out.serial( buf ); + NetMngr.push(out); + } + return true; } NLMISC_COMMAND(GUFriendAccept, "accept to be a friend of a guild that invited you", "") { - if (args.size() != 0) return false; - const string msgName = "GUILD:ACCEPT_FRIEND_INVITATION"; - CBitMemStream out; - if(GenericMsgHeaderMngr.pushNameToStream(msgName, out)) - { - NetMngr.push(out); - } - return true; + if (args.size() != 0) return false; + const string msgName = "GUILD:ACCEPT_FRIEND_INVITATION"; + CBitMemStream out; + if(GenericMsgHeaderMngr.pushNameToStream(msgName, out)) + { + NetMngr.push(out); + } + return true; } NLMISC_COMMAND(GUFriendRefuse, "refuse to be a friend of a guild that invited you", "") { - if (args.size() != 0) return false; - const string msgName = "GUILD:REFUSE_FRIEND_INVITATION"; - CBitMemStream out; - if(GenericMsgHeaderMngr.pushNameToStream(msgName, out)) - { - NetMngr.push(out); - } - return true; + if (args.size() != 0) return false; + const string msgName = "GUILD:REFUSE_FRIEND_INVITATION"; + CBitMemStream out; + if(GenericMsgHeaderMngr.pushNameToStream(msgName, out)) + { + NetMngr.push(out); + } + return true; } NLMISC_COMMAND(GUSetSuccessor, "set the successor of the guild leader", "") { - if (args.size() != 1) return false; - const string msgName = "GUILD:SET_SUCCESSOR"; - CBitMemStream out; - if(GenericMsgHeaderMngr.pushNameToStream(msgName, out)) - { - string buf = args[0]; - out.serial( buf ); - NetMngr.push(out); - } - return true; + if (args.size() != 1) return false; + const string msgName = "GUILD:SET_SUCCESSOR"; + CBitMemStream out; + if(GenericMsgHeaderMngr.pushNameToStream(msgName, out)) + { + string buf = args[0]; + out.serial( buf ); + NetMngr.push(out); + } + return true; } NLMISC_COMMAND(GUInfos, "get information on a guild", "") { - if (args.size() != 1) return false; - const string msgName = "GUILD:GET_INFOS"; - CBitMemStream out; - if(GenericMsgHeaderMngr.pushNameToStream(msgName, out)) - { - string buf = args[0]; - out.serial( buf ); - NetMngr.push(out); - } - return true; + if (args.size() != 1) return false; + const string msgName = "GUILD:GET_INFOS"; + CBitMemStream out; + if(GenericMsgHeaderMngr.pushNameToStream(msgName, out)) + { + string buf = args[0]; + out.serial( buf ); + NetMngr.push(out); + } + return true; } NLMISC_COMMAND(GUJournal, "get the guild journal", "") { - if (args.size() != 0) return false; - const string msgName = "GUILD:GET_LOG"; - CBitMemStream out; - if(GenericMsgHeaderMngr.pushNameToStream(msgName, out)) - { - NetMngr.push(out); - } - return true; + if (args.size() != 0) return false; + const string msgName = "GUILD:GET_LOG"; + CBitMemStream out; + if(GenericMsgHeaderMngr.pushNameToStream(msgName, out)) + { + NetMngr.push(out); + } + return true; } NLMISC_COMMAND(buildingTeleport, "teleport to a building", "building index") { - if (args.size() != 1) return false; - uint16 index; - fromString(args[0], index); - const string msgName = "GUILD:TELEPORT"; - CBitMemStream out; - if(GenericMsgHeaderMngr.pushNameToStream(msgName, out)) - { - out.serial(index); - NetMngr.push(out); - } - return true; + if (args.size() != 1) return false; + uint16 index; + fromString(args[0], index); + const string msgName = "GUILD:TELEPORT"; + CBitMemStream out; + if(GenericMsgHeaderMngr.pushNameToStream(msgName, out)) + { + out.serial(index); + NetMngr.push(out); + } + return true; } NLMISC_COMMAND(logFaberMpCompatibles, "log all MP compatibles for faber the item", "sheetid") { - if (args.size() != 1) return false; - uint32 sheetId; - fromString(args[0], sheetId); - CSBrickManager *pBM= CSBrickManager::getInstance(); + if (args.size() != 1) return false; + uint32 sheetId; + fromString(args[0], sheetId); + CSBrickManager *pBM= CSBrickManager::getInstance(); - // get the faber plan - CSBrickSheet *brick= pBM->getBrick(CSheetId(sheetId)); - // get the origin of the item built - CItemSheet *itemBuilt= NULL; - if(brick) - itemBuilt= dynamic_cast(SheetMngr.get(brick->FaberPlan.ItemBuilt)); - if(brick && itemBuilt) - { - - // build array of MP sheetId - std::vector mps; - mps.reserve(100); - const CSheetManager::TEntitySheetMap &sheetMap= SheetMngr.getSheets(); - CSheetManager::TEntitySheetMap::const_iterator it; - for(it= sheetMap.begin(); it!=sheetMap.end(); it++) + // get the faber plan + CSBrickSheet *brick= pBM->getBrick(CSheetId(sheetId)); + // get the origin of the item built + CItemSheet *itemBuilt= NULL; + if(brick) + itemBuilt= dynamic_cast(SheetMngr.get(brick->FaberPlan.ItemBuilt)); + if(brick && itemBuilt) { - CItemSheet *mp= const_cast( dynamic_cast(it->second.EntitySheet) ); - if(mp && mp->Family == ITEMFAMILY::RAW_MATERIAL) - mps.push_back(mp); - } - // header - uint numMpSlots= (uint)brick->FaberPlan.ItemPartMps.size(); - nlinfo("********** FABERLOG **********"); - nlinfo(" ItemBuilt Origin: %s", ITEM_ORIGIN::enumToString(itemBuilt->ItemOrigin).c_str() ); - nlinfo(" NumMPSlot: %d", numMpSlots); - - // Parse All Slots. - for(uint i=0;iFaberPlan.ItemPartMps[i]; - nlinfo(" MPSlot %d", i); - nlinfo(" Quantity: %d", mpSlot.Quantity); - nlinfo(" TypeReq: %s", RM_FABER_TYPE::toString(mpSlot.FaberTypeFilter).c_str() ); - nlinfo(" List Of Compatibles MPs:"); - - for(uint i=0;icanBuildItemPart(mpSlot.FaberTypeFilter, itemBuilt->ItemOrigin)) - ok= false; - - if(ok) + // build array of MP sheetId + std::vector mps; + mps.reserve(100); + const CSheetManager::TEntitySheetMap &sheetMap= SheetMngr.getSheets(); + CSheetManager::TEntitySheetMap::const_iterator it; + for(it= sheetMap.begin(); it!=sheetMap.end(); it++) { - nlinfo(" %s", itemSheet->Id.toString().c_str() ); + CItemSheet *mp= const_cast( dynamic_cast(it->second.EntitySheet) ); + if(mp && mp->Family == ITEMFAMILY::RAW_MATERIAL) + mps.push_back(mp); } - } + // header + uint numMpSlots= (uint)brick->FaberPlan.ItemPartMps.size(); + nlinfo("********** FABERLOG **********"); + nlinfo(" ItemBuilt Origin: %s", ITEM_ORIGIN::enumToString(itemBuilt->ItemOrigin).c_str() ); + nlinfo(" NumMPSlot: %d", numMpSlots); + + // Parse All Slots. + for(uint i=0;iFaberPlan.ItemPartMps[i]; + nlinfo(" MPSlot %d", i); + nlinfo(" Quantity: %d", mpSlot.Quantity); + nlinfo(" TypeReq: %s", RM_FABER_TYPE::toString(mpSlot.FaberTypeFilter).c_str() ); + nlinfo(" List Of Compatibles MPs:"); + + for(uint i=0;icanBuildItemPart(mpSlot.FaberTypeFilter, itemBuilt->ItemOrigin)) + ok= false; + + if(ok) + { + nlinfo(" %s", itemSheet->Id.toString().c_str() ); + } + } + + } } - } - return true; + return true; } NLMISC_COMMAND(debugItemInfo, "simulate a ItemInfo received from server", "itemSlotId version [enchant]") { - CItemInfos itemInfo; + CItemInfos itemInfo; - if (args.size() < 2 || args.size() > 3) return false; - bool enchant= false; - if(args.size()==3) - fromString(args[2], enchant); + if (args.size() < 2 || args.size() > 3) return false; + bool enchant= false; + if(args.size()==3) + fromString(args[2], enchant); - fromString(args[0], itemInfo.slotId); - fromString(args[1], itemInfo.versionInfo); + fromString(args[0], itemInfo.slotId); + fromString(args[1], itemInfo.versionInfo); - itemInfo.CurrentDamage= 10; - itemInfo.MaxDamage= 15; - itemInfo.DodgeModifier= 5; - itemInfo.ParryModifier= -10; - itemInfo.AdversaryDodgeModifier= 666; - itemInfo.AdversaryParryModifier= 333; - itemInfo.HpBuff= 12; - itemInfo.SapBuff= -14; - itemInfo.StaBuff= 0; - itemInfo.FocusBuff= 1; - itemInfo.MagicProtection[0]= PROTECTION_TYPE::Electricity; - itemInfo.MagicProtectionFactor[0]= 43; - itemInfo.MagicProtection[1]= PROTECTION_TYPE::Shockwave; - itemInfo.MagicProtectionFactor[1]= 21; - itemInfo.MagicProtection[2]= PROTECTION_TYPE::Rot; - itemInfo.MagicProtectionFactor[2]= 100; - itemInfo.DesertMagicResistance= 133; - itemInfo.ForestMagicResistance= 500; - itemInfo.PrimaryRootMagicResistance= 341; - itemInfo.Hp= 66; - itemInfo.HpMax= 100; - itemInfo.Range= 169; - itemInfo.SapLoadCurrent= 6; - itemInfo.SapLoadMax= 30; - itemInfo.HitRate= 8; - itemInfo.ProtectionFactor= 0.25; - itemInfo.MaxSlashingProtection= 38; - itemInfo.MaxPiercingProtection= 48; - itemInfo.MaxBluntProtection= 58; - itemInfo.WearEquipmentMalus= 0.31f; + itemInfo.CurrentDamage= 10; + itemInfo.MaxDamage= 15; + itemInfo.DodgeModifier= 5; + itemInfo.ParryModifier= -10; + itemInfo.AdversaryDodgeModifier= 666; + itemInfo.AdversaryParryModifier= 333; + itemInfo.HpBuff= 12; + itemInfo.SapBuff= -14; + itemInfo.StaBuff= 0; + itemInfo.FocusBuff= 1; + itemInfo.MagicProtection[0]= PROTECTION_TYPE::Electricity; + itemInfo.MagicProtectionFactor[0]= 43; + itemInfo.MagicProtection[1]= PROTECTION_TYPE::Shockwave; + itemInfo.MagicProtectionFactor[1]= 21; + itemInfo.MagicProtection[2]= PROTECTION_TYPE::Rot; + itemInfo.MagicProtectionFactor[2]= 100; + itemInfo.DesertMagicResistance= 133; + itemInfo.ForestMagicResistance= 500; + itemInfo.PrimaryRootMagicResistance= 341; + itemInfo.Hp= 66; + itemInfo.HpMax= 100; + itemInfo.Range= 169; + itemInfo.SapLoadCurrent= 6; + itemInfo.SapLoadMax= 30; + itemInfo.HitRate= 8; + itemInfo.ProtectionFactor= 0.25; + itemInfo.MaxSlashingProtection= 38; + itemInfo.MaxPiercingProtection= 48; + itemInfo.MaxBluntProtection= 58; + itemInfo.WearEquipmentMalus= 0.31f; - if(enchant) - { - itemInfo.Enchantment.Name="pipoSort"; - itemInfo.Enchantment.Bricks.resize(3); - itemInfo.Enchantment.Bricks[0]= CSheetId("bmpa01.sbrick"); - itemInfo.Enchantment.Bricks[1]= CSheetId("bmlchea01.sbrick"); - itemInfo.Enchantment.Bricks[2]= CSheetId("bmlchmh00005.sbrick"); - } + if(enchant) + { + itemInfo.Enchantment.Name="pipoSort"; + itemInfo.Enchantment.Bricks.resize(3); + itemInfo.Enchantment.Bricks[0]= CSheetId("bmpa01.sbrick"); + itemInfo.Enchantment.Bricks[1]= CSheetId("bmlchea01.sbrick"); + itemInfo.Enchantment.Bricks[2]= CSheetId("bmlchmh00005.sbrick"); + } - switch(rand()%4) - { - case 0: - break; - case 1: - { - itemInfo.CastingSpeedFactor[1]= 1.0f; - itemInfo.MagicPowerFactor[1]= 0.2f; - } - break; - case 2: - { - itemInfo.CastingSpeedFactor[0]= 0.4f; - itemInfo.MagicPowerFactor[0]= 0.2f; - itemInfo.CastingSpeedFactor[2]= 0.8f; - itemInfo.MagicPowerFactor[2]= 0.3f; - } - break; - case 3: - { - itemInfo.CastingSpeedFactor[0]= 0.3f; - itemInfo.MagicPowerFactor[0]= 0.3f; - itemInfo.CastingSpeedFactor[1]= 0.3f; - itemInfo.MagicPowerFactor[1]= 0.3f; - itemInfo.CastingSpeedFactor[2]= 0.3f; - itemInfo.MagicPowerFactor[2]= 0.3f; - itemInfo.CastingSpeedFactor[3]= 0.3f; - itemInfo.MagicPowerFactor[3]= 0.3f; - } - break; - }; + switch(rand()%4) + { + case 0: + break; + case 1: + { + itemInfo.CastingSpeedFactor[1]= 1.0f; + itemInfo.MagicPowerFactor[1]= 0.2f; + } + break; + case 2: + { + itemInfo.CastingSpeedFactor[0]= 0.4f; + itemInfo.MagicPowerFactor[0]= 0.2f; + itemInfo.CastingSpeedFactor[2]= 0.8f; + itemInfo.MagicPowerFactor[2]= 0.3f; + } + break; + case 3: + { + itemInfo.CastingSpeedFactor[0]= 0.3f; + itemInfo.MagicPowerFactor[0]= 0.3f; + itemInfo.CastingSpeedFactor[1]= 0.3f; + itemInfo.MagicPowerFactor[1]= 0.3f; + itemInfo.CastingSpeedFactor[2]= 0.3f; + itemInfo.MagicPowerFactor[2]= 0.3f; + itemInfo.CastingSpeedFactor[3]= 0.3f; + itemInfo.MagicPowerFactor[3]= 0.3f; + } + break; + }; - getInventory().onReceiveItemInfo(itemInfo); + getInventory().onReceiveItemInfo(itemInfo); - return true; + return true; } NLMISC_COMMAND(debugItemInfoWaiters, "log ItemInfoWaiters", "") { - getInventory().debugItemInfoWaiters(); + getInventory().debugItemInfoWaiters(); - return true; + return true; } NLMISC_COMMAND(debugInfoWindows, "log info windows sheetId", "") { - CInterfaceHelp::debugOpenedInfoWindows(); + CInterfaceHelp::debugOpenedInfoWindows(); - return true; + return true; } NLMISC_COMMAND(getSkillValue, "get a skill value by its name", "skill_name") { - if (args.size() != 1) return false; - CInterfaceManager *pIM= CInterfaceManager::getInstance(); - uint skillId= (uint) SKILLS::toSkill(args[0]); - CCDBNodeLeaf *node= NLGUI::CDBManager::getInstance()->getDbProp(toString("SERVER:CHARACTER_INFO:SKILLS:%d:SKILL", skillId), false); - if(node) - { - pIM->displaySystemInfo(ucstring(toString(node->getValue32()))); - } + if (args.size() != 1) return false; + CInterfaceManager *pIM= CInterfaceManager::getInstance(); + uint skillId= (uint) SKILLS::toSkill(args[0]); + CCDBNodeLeaf *node= NLGUI::CDBManager::getInstance()->getDbProp(toString("SERVER:CHARACTER_INFO:SKILLS:%d:SKILL", skillId), false); + if(node) + { + pIM->displaySystemInfo(ucstring(toString(node->getValue32()))); + } - return true; + return true; } NLMISC_COMMAND(setSkillValue, "set a skill value by its name", "skill_name value") { - if (args.size() != 2) return false; - CInterfaceManager *pIM= CInterfaceManager::getInstance(); - uint skillId= (uint) SKILLS::toSkill(args[0]); - CCDBNodeLeaf *node= NLGUI::CDBManager::getInstance()->getDbProp(toString("SERVER:CHARACTER_INFO:SKILLS:%d:SKILL", skillId), false); - if(node) - { - sint32 value; - fromString(args[1], value); - node->setValue32(value); - } + if (args.size() != 2) return false; + CInterfaceManager *pIM= CInterfaceManager::getInstance(); + uint skillId= (uint) SKILLS::toSkill(args[0]); + CCDBNodeLeaf *node= NLGUI::CDBManager::getInstance()->getDbProp(toString("SERVER:CHARACTER_INFO:SKILLS:%d:SKILL", skillId), false); + if(node) + { + sint32 value; + fromString(args[1], value); + node->setValue32(value); + } - return true; + return true; } NLMISC_COMMAND(getBaseSkillValue, "get a baseskill value by its name", "skill_name") { - if (args.size() != 1) return false; - CInterfaceManager *pIM= CInterfaceManager::getInstance(); - uint skillId= (uint) SKILLS::toSkill(args[0]); - CCDBNodeLeaf *node= NLGUI::CDBManager::getInstance()->getDbProp(toString("SERVER:CHARACTER_INFO:SKILLS:%d:BaseSKILL", skillId), false); - if(node) - { - pIM->displaySystemInfo(ucstring(toString(node->getValue32()))); - } + if (args.size() != 1) return false; + CInterfaceManager *pIM= CInterfaceManager::getInstance(); + uint skillId= (uint) SKILLS::toSkill(args[0]); + CCDBNodeLeaf *node= NLGUI::CDBManager::getInstance()->getDbProp(toString("SERVER:CHARACTER_INFO:SKILLS:%d:BaseSKILL", skillId), false); + if(node) + { + pIM->displaySystemInfo(ucstring(toString(node->getValue32()))); + } - return true; + return true; } NLMISC_COMMAND(setBaseSkillValue, "set a baseskill value by its name", "skill_name value") { - if (args.size() != 2) return false; - CInterfaceManager *pIM= CInterfaceManager::getInstance(); - uint skillId= (uint) SKILLS::toSkill(args[0]); - CCDBNodeLeaf *node= NLGUI::CDBManager::getInstance()->getDbProp(toString("SERVER:CHARACTER_INFO:SKILLS:%d:BaseSKILL", skillId), false); - if(node) - { - sint32 value; - fromString(args[1], value); - node->setValue32(value); - } + if (args.size() != 2) return false; + CInterfaceManager *pIM= CInterfaceManager::getInstance(); + uint skillId= (uint) SKILLS::toSkill(args[0]); + CCDBNodeLeaf *node= NLGUI::CDBManager::getInstance()->getDbProp(toString("SERVER:CHARACTER_INFO:SKILLS:%d:BaseSKILL", skillId), false); + if(node) + { + sint32 value; + fromString(args[1], value); + node->setValue32(value); + } - return true; + return true; } NLMISC_COMMAND(setAllSkillValue, "set all Skill and baseskill to the given value", "value") { - if (args.size() != 1) return false; - CInterfaceManager *pIM= CInterfaceManager::getInstance(); - uint value; - fromString(args[0], value); - for(uint i=0;igetDbProp(toString("SERVER:CHARACTER_INFO:SKILLS:%d:BaseSKILL", i), false); - if(node) - node->setValue32(value); - node= NLGUI::CDBManager::getInstance()->getDbProp(toString("SERVER:CHARACTER_INFO:SKILLS:%d:SKILL", i), false); - if(node) - node->setValue32(value); - } + if (args.size() != 1) return false; + CInterfaceManager *pIM= CInterfaceManager::getInstance(); + uint value; + fromString(args[0], value); + for(uint i=0;igetDbProp(toString("SERVER:CHARACTER_INFO:SKILLS:%d:BaseSKILL", i), false); + if(node) + node->setValue32(value); + node= NLGUI::CDBManager::getInstance()->getDbProp(toString("SERVER:CHARACTER_INFO:SKILLS:%d:SKILL", i), false); + if(node) + node->setValue32(value); + } - return true; + return true; } NLMISC_COMMAND(setEntityName, "set a entity name id", "entitySlot nameId") { - if (args.size() != 2) return false; - uint slot; - fromString(args[0], slot); + if (args.size() != 2) return false; + uint slot; + fromString(args[0], slot); - CCharacterCL *entity= dynamic_cast(EntitiesMngr.entity(slot)); - if(entity) - { - uint32 nameId; - fromString(args[1], nameId); - entity->debugSetNameId(nameId); - } - return true; + CCharacterCL *entity= dynamic_cast(EntitiesMngr.entity(slot)); + if(entity) + { + uint32 nameId; + fromString(args[1], nameId); + entity->debugSetNameId(nameId); + } + return true; } NLMISC_COMMAND(reloadWeather, "reload the weather sheets", "") { - if (!args.empty()) return false; - ContinentMngr.reloadWeather(); - return true; + if (!args.empty()) return false; + ContinentMngr.reloadWeather(); + return true; } @@ -4503,54 +4490,54 @@ NLMISC_COMMAND(reloadWeather, "reload the weather sheets", "") template bool reloadSheets(string filter, string wildcardFilter) { - CSheetManager sheetManager; - std::vector filters; - filters.push_back(filter); - ClientSheetsStrings.memoryUncompress(); - NLMISC::IProgressCallback progress; - sheetManager.loadAllSheetNoPackedSheet(progress, filters, wildcardFilter); - ClientSheetsStrings.memoryCompress(); - // copy sheets into current sheet manager (because numerous ptr are kept on the previous sheets in various places) - const CSheetManager::TEntitySheetMap &sheetMap= sheetManager.getSheets(); - CSheetManager::TEntitySheetMap::const_iterator it; - for(it=sheetMap.begin();it!=sheetMap.end();it++) - { - T *dest = dynamic_cast(SheetMngr.get(it->first)); - if (dest) + CSheetManager sheetManager; + std::vector filters; + filters.push_back(filter); + ClientSheetsStrings.memoryUncompress(); + NLMISC::IProgressCallback progress; + sheetManager.loadAllSheetNoPackedSheet(progress, filters, wildcardFilter); + ClientSheetsStrings.memoryCompress(); + // copy sheets into current sheet manager (because numerous ptr are kept on the previous sheets in various places) + const CSheetManager::TEntitySheetMap &sheetMap= sheetManager.getSheets(); + CSheetManager::TEntitySheetMap::const_iterator it; + for(it=sheetMap.begin();it!=sheetMap.end();it++) { - const T *src = dynamic_cast(it->second.EntitySheet); - if (src) - { - *dest = *src; - } + T *dest = dynamic_cast(SheetMngr.get(it->first)); + if (dest) + { + const T *src = dynamic_cast(it->second.EntitySheet); + if (src) + { + *dest = *src; + } + } } - } - return true; + return true; } std::string extendWildcard(const std::string &in) { - string out; - // append * at begin if not present (or if enp - if(in.empty() || in[0]!='*') - out= '*'; - out+= in; - // append .* at end if no . found - if(in.find('.')==string::npos) - out+= ".*"; - return out; + string out; + // append * at begin if not present (or if enp + if(in.empty() || in[0]!='*') + out= '*'; + out+= in; + // append .* at end if no . found + if(in.find('.')==string::npos) + out+= ".*"; + return out; } // macros to reload Sheets #define CMD_RELOAD_SHEET(_cmd_name, _filter, _type) \ - NLMISC_COMMAND(_cmd_name, #_cmd_name, "") \ - { \ - if (args.size()>1) return false; \ - string wildcardFilter; \ - if (args.size()>=1) \ - wildcardFilter= extendWildcard(args[0]); \ - return reloadSheets<_type>(_filter, wildcardFilter); \ - } +NLMISC_COMMAND(_cmd_name, #_cmd_name, "") \ +{ \ + if (args.size()>1) return false; \ + string wildcardFilter; \ + if (args.size()>=1) \ + wildcardFilter= extendWildcard(args[0]); \ + return reloadSheets<_type>(_filter, wildcardFilter); \ +} // Important ones CMD_RELOAD_SHEET(reloadCreature, "creature", CCharacterSheet) CMD_RELOAD_SHEET(reloadSbrick, "sbrick", CSBrickSheet) @@ -4558,474 +4545,474 @@ CMD_RELOAD_SHEET(reloadSphrase, "sphrase", CSPhraseSheet) CMD_RELOAD_SHEET(reloadSitem, "sitem", CItemSheet) // Not tested ones /* - CMD_RELOAD_SHEET(reloadPlayer, "player", CPlayerSheet) - CMD_RELOAD_SHEET(reloadFx, "fx", CFXSheet) - CMD_RELOAD_SHEET(reloadBuilding, "building", CBuildingSheet) - CMD_RELOAD_SHEET(reloadDeath_impact, "death_impact", CPactSheet) - CMD_RELOAD_SHEET(reloadMission, "mission", CMissionSheet) - CMD_RELOAD_SHEET(reloadRace_stats, "race_stats", CRaceStatsSheet) - CMD_RELOAD_SHEET(reloadLight_cycle, "light_cycle", CLightCycleSheet) - CMD_RELOAD_SHEET(reloadContinent, "continent", CContinentSheet) - CMD_RELOAD_SHEET(reloadWorld, "world", CWorldSheet) - CMD_RELOAD_SHEET(reloadMission_icon, "mission_icon", CMissionIconSheet) - CMD_RELOAD_SHEET(reloadSkill_tree, "skill_tree", CSkillsTreeSheet) - CMD_RELOAD_SHEET(reloadTitles, "titles", CUnblockTitlesSheet) - CMD_RELOAD_SHEET(reloadSucces_chances_table, "succes_chances_table", CSuccessTableSheet) - CMD_RELOAD_SHEET(reloadAutomaton_list, "automaton_list", CAutomatonListSheet) - CMD_RELOAD_SHEET(reloadAnimset_list, "animset_list", CAnimationSetListSheet) - CMD_RELOAD_SHEET(reloadAnimation_fx, "animation_fx", CAnimationFXSheet) - CMD_RELOAD_SHEET(reloadEmot, "emot", CEmotListSheet) - CMD_RELOAD_SHEET(reloadForage_source, "forage_source", CForageSourceSheet) - CMD_RELOAD_SHEET(reloadText_emotes, "text_emotes", CTextEmotListSheet) +CMD_RELOAD_SHEET(reloadPlayer, "player", CPlayerSheet) +CMD_RELOAD_SHEET(reloadFx, "fx", CFXSheet) +CMD_RELOAD_SHEET(reloadBuilding, "building", CBuildingSheet) +CMD_RELOAD_SHEET(reloadDeath_impact, "death_impact", CPactSheet) +CMD_RELOAD_SHEET(reloadMission, "mission", CMissionSheet) +CMD_RELOAD_SHEET(reloadRace_stats, "race_stats", CRaceStatsSheet) +CMD_RELOAD_SHEET(reloadLight_cycle, "light_cycle", CLightCycleSheet) +CMD_RELOAD_SHEET(reloadContinent, "continent", CContinentSheet) +CMD_RELOAD_SHEET(reloadWorld, "world", CWorldSheet) +CMD_RELOAD_SHEET(reloadMission_icon, "mission_icon", CMissionIconSheet) +CMD_RELOAD_SHEET(reloadSkill_tree, "skill_tree", CSkillsTreeSheet) +CMD_RELOAD_SHEET(reloadTitles, "titles", CUnblockTitlesSheet) +CMD_RELOAD_SHEET(reloadSucces_chances_table, "succes_chances_table", CSuccessTableSheet) +CMD_RELOAD_SHEET(reloadAutomaton_list, "automaton_list", CAutomatonListSheet) +CMD_RELOAD_SHEET(reloadAnimset_list, "animset_list", CAnimationSetListSheet) +CMD_RELOAD_SHEET(reloadAnimation_fx, "animation_fx", CAnimationFXSheet) +CMD_RELOAD_SHEET(reloadEmot, "emot", CEmotListSheet) +CMD_RELOAD_SHEET(reloadForage_source, "forage_source", CForageSourceSheet) +CMD_RELOAD_SHEET(reloadText_emotes, "text_emotes", CTextEmotListSheet) */ NLMISC_COMMAND(vprop, "Flush the Visual Property (local only). you must write to the DB before (but if you give the value in the 3rd arg)", "slot propId [val]") { - if(args.size()!=2 && args.size()!=3) return false; - uint slot; - fromString(args[0], slot); - uint propId; - fromString(args[1], propId); + if(args.size()!=2 && args.size()!=3) return false; + uint slot; + fromString(args[0], slot); + uint propId; + fromString(args[1], propId); - // set value in the DB? - if(args.size()==3) - { - sint64 val= 0; - fromString(args[2], val); - CInterfaceManager *pIM= CInterfaceManager::getInstance(); - CCDBNodeLeaf *node= NLGUI::CDBManager::getInstance()->getDbProp(toString("SERVER:Entities:E%d:P%d", slot, propId), false); - if(node) - node->setValue64(val); - } + // set value in the DB? + if(args.size()==3) + { + sint64 val= 0; + fromString(args[2], val); + CInterfaceManager *pIM= CInterfaceManager::getInstance(); + CCDBNodeLeaf *node= NLGUI::CDBManager::getInstance()->getDbProp(toString("SERVER:Entities:E%d:P%d", slot, propId), false); + if(node) + node->setValue64(val); + } - EntitiesMngr.updateVisualProperty(0, slot, propId); + EntitiesMngr.updateVisualProperty(0, slot, propId); - return true; + return true; } NLMISC_COMMAND(dataSetId, "Set the UID of an entity", "slot uid") { - if(args.size()!=2) return false; - uint slot; - fromString(args[0], slot); - uint uid; - fromString(args[1], uid); + if(args.size()!=2) return false; + uint slot; + fromString(args[0], slot); + uint uid; + fromString(args[1], uid); - CEntityCL *entity= EntitiesMngr.entity(slot); - if(!entity) - return false; + CEntityCL *entity= EntitiesMngr.entity(slot); + if(!entity) + return false; - entity->dataSetId(uid); + entity->dataSetId(uid); - return true; + return true; } NLMISC_COMMAND(forceDisplayFXBBoxes, "Force to display bboxes of all fxs", "0=off, 1=off") { - if (args.size() != 1) return false; - bool on; - fromString(args[0], on); - UParticleSystemInstance::forceDisplayBBox(on); - return true; + if (args.size() != 1) return false; + bool on; + fromString(args[0], on); + UParticleSystemInstance::forceDisplayBBox(on); + return true; } NLMISC_COMMAND(dumpVillages, "Dump villages loading zones in a bitmap", "filename>") { - if (args.size() != 1) return false; - ContinentMngr.cur()->dumpVillagesLoadingZones(args[0]); - return true; + if (args.size() != 1) return false; + ContinentMngr.cur()->dumpVillagesLoadingZones(args[0]); + return true; } NLMISC_COMMAND(dumpFogDayMap, "Dump fog day map", "filename>") { - if (args.size() != 1) return false; - ContinentMngr.cur()->dumpFogMap(CFogMapBuild::Day, args[0]); - return true; + if (args.size() != 1) return false; + ContinentMngr.cur()->dumpFogMap(CFogMapBuild::Day, args[0]); + return true; } NLMISC_COMMAND(dumpFogDepthMap, "Dump fog depth map", "filename>") { - if (args.size() != 1) return false; - ContinentMngr.cur()->dumpFogMap(CFogMapBuild::Depth, args[0]); - return true; + if (args.size() != 1) return false; + ContinentMngr.cur()->dumpFogMap(CFogMapBuild::Depth, args[0]); + return true; } NLMISC_COMMAND(dumpFogDistMap, "Dump fog depth map", "filename>") { - if (args.size() != 1) return false; - ContinentMngr.cur()->dumpFogMap(CFogMapBuild::Distance, args[0]); - return true; + if (args.size() != 1) return false; + ContinentMngr.cur()->dumpFogMap(CFogMapBuild::Distance, args[0]); + return true; } NLMISC_COMMAND(dumpRainMap, "Dump fog rain map", "filename>") { - if (args.size() != 1) return false; - CRGBA colorLookup[256]; - for(uint8 k = 1; k < 255; ++k) - { - colorLookup[k] = CRGBA(k, k, k, 1); - } - colorLookup[0] = CRGBA::Red; - colorLookup[255] = CRGBA::Blue; - ContinentMngr.cur()->dumpFogMap(CFogMapBuild::NoPrecipitation, args[0], CContinent::ChannelR, colorLookup); - return true; + if (args.size() != 1) return false; + CRGBA colorLookup[256]; + for(uint8 k = 1; k < 255; ++k) + { + colorLookup[k] = CRGBA(k, k, k, 1); + } + colorLookup[0] = CRGBA::Red; + colorLookup[255] = CRGBA::Blue; + ContinentMngr.cur()->dumpFogMap(CFogMapBuild::NoPrecipitation, args[0], CContinent::ChannelR, colorLookup); + return true; } NLMISC_COMMAND(stick_log, "", "") { - if(args.size()!=1) - return false; - CLFECOMMON::TCLEntityId slot; - fromString(args[0], slot); + if(args.size()!=1) + return false; + CLFECOMMON::TCLEntityId slot; + fromString(args[0], slot); - // Compute the position. - CEntityCL *entity = EntitiesMngr.entity(slot); - if(!entity) - return false; + // Compute the position. + CEntityCL *entity = EntitiesMngr.entity(slot); + if(!entity) + return false; - USkeleton *skel= entity->skeleton(); - if(skel) - { - CInterfaceManager *pIM= CInterfaceManager::getInstance(); - nlinfo("Skel Log: %s", skel->getShapeName().c_str()); - - std::vector sticks; - skel->getStickedObjects(sticks); - - nlinfo("StickedModels: %d", sticks.size()); - pIM->displaySystemInfo(ucstring(toString("StickedModels: %d", sticks.size()))); - - for(uint i=0;iskeleton(); + if(skel) { - UInstance inst; - inst.cast(sticks[i]); - if(!inst.empty()) - { - string str= toString(" %d: %X. %s", i, inst.getObjectPtr(), inst.getShapeName().c_str()); - nlinfo(str.c_str()); - pIM->displaySystemInfo(str); - } - else - { - string str= toString(" %d: %X. NOT a TransformShape", i, sticks[i].getObjectPtr()); - nlinfo(str.c_str()); - pIM->displaySystemInfo(str); - } - } - } + CInterfaceManager *pIM= CInterfaceManager::getInstance(); + nlinfo("Skel Log: %s", skel->getShapeName().c_str()); - return true; + std::vector sticks; + skel->getStickedObjects(sticks); + + nlinfo("StickedModels: %d", sticks.size()); + pIM->displaySystemInfo(ucstring(toString("StickedModels: %d", sticks.size()))); + + for(uint i=0;idisplaySystemInfo(str); + } + else + { + string str= toString(" %d: %X. NOT a TransformShape", i, sticks[i].getObjectPtr()); + nlinfo(str.c_str()); + pIM->displaySystemInfo(str); + } + } + } + + return true; } NLMISC_COMMAND(print_sys, "", " ") { - if(args.size()<1) - return false; - string cat= args[0]; - string str; - for (uint i = 1; i < args.size(); i++) - { - str += args[i] + " "; - } + if(args.size()<1) + return false; + string cat= args[0]; + string str; + for (uint i = 1; i < args.size(); i++) + { + str += args[i] + " "; + } - CInterfaceManager *pIM= CInterfaceManager::getInstance(); - pIM->displaySystemInfo(str, cat); + CInterfaceManager *pIM= CInterfaceManager::getInstance(); + pIM->displaySystemInfo(str, cat); - return true; + return true; } NLMISC_COMMAND(fillAllInfoVersion, "", "") { - if(args.size()!=1) - return false; + if(args.size()!=1) + return false; - uint i,j; - uint ver; - fromString(args[0], ver); - CInventoryManager &im= getInventory(); + uint i,j; + uint ver; + fromString(args[0], ver); + CInventoryManager &im= getInventory(); - // BAG - for(i=0;igetDbProp(toString("SERVER:EXCHANGE:GIVE:%d:INFO_VERSION", i), false); - if(node) - node->setValue32(ver); - node= NLGUI::CDBManager::getInstance()->getDbProp(toString("SERVER:EXCHANGE:RECEIVE:%d:INFO_VERSION", i), false); - if(node) - node->setValue32(ver); - } + // EXCHANGE + CInterfaceManager *pIM= CInterfaceManager::getInstance(); + for(i=0;igetDbProp(toString("SERVER:EXCHANGE:GIVE:%d:INFO_VERSION", i), false); + if(node) + node->setValue32(ver); + node= NLGUI::CDBManager::getInstance()->getDbProp(toString("SERVER:EXCHANGE:RECEIVE:%d:INFO_VERSION", i), false); + if(node) + node->setValue32(ver); + } - return true; + return true; } NLMISC_COMMAND(fullFillInventory, "", "dbstring sheetName") { - if(args.size()!=2) - return false; + if(args.size()!=2) + return false; - // read value - sint64 value; - if (isalpha(args[1][0])) - { - CSheetId sheet(args[1]); - value = (sint64) sheet.asInt(); - } - else - { - // Convert the string into an sint64. - fromString(args[1], value); - } - - // read db dest - CInterfaceManager *pIM= CInterfaceManager::getInstance(); - CCDBNodeBranch *nb= NLGUI::CDBManager::getInstance()->getDbBranch(args[0]); - if(!nb) - return false; - - uint num= nb->getNbNodes(); - for(uint i=0;igetDbProp(args[0]+":"+toString(i)+":SHEET", false); - if(nl) + // read value + sint64 value; + if (isalpha(args[1][0])) { - nl->setValue64(value); - nl= NLGUI::CDBManager::getInstance()->getDbProp(args[0]+":"+toString(i)+":QUALITY", false); - if(nl) - nl->setValue64(i); - nl= NLGUI::CDBManager::getInstance()->getDbProp(args[0]+":"+toString(i)+":PREREQUISIT_VALID", false); - if(nl) - nl->setValue64(1); + CSheetId sheet(args[1]); + value = (sint64) sheet.asInt(); + } + else + { + // Convert the string into an sint64. + fromString(args[1], value); } - } - return true; + // read db dest + CInterfaceManager *pIM= CInterfaceManager::getInstance(); + CCDBNodeBranch *nb= NLGUI::CDBManager::getInstance()->getDbBranch(args[0]); + if(!nb) + return false; + + uint num= nb->getNbNodes(); + for(uint i=0;igetDbProp(args[0]+":"+toString(i)+":SHEET", false); + if(nl) + { + nl->setValue64(value); + nl= NLGUI::CDBManager::getInstance()->getDbProp(args[0]+":"+toString(i)+":QUALITY", false); + if(nl) + nl->setValue64(i); + nl= NLGUI::CDBManager::getInstance()->getDbProp(args[0]+":"+toString(i)+":PREREQUISIT_VALID", false); + if(nl) + nl->setValue64(1); + } + } + + return true; } NLMISC_COMMAND(fillAllItemPreReq, "", "dbstring value") { - if(args.size()!=2) - return false; + if(args.size()!=2) + return false; - // read value - sint32 value; - fromString(args[1], value); - string dbBase= args[0]; + // read value + sint32 value; + fromString(args[1], value); + string dbBase= args[0]; - // write prop for all elements of the branch - uint index= 0; - for(;;) - { - CInterfaceManager *pIM= CInterfaceManager::getInstance(); - CCDBNodeLeaf *node= NLGUI::CDBManager::getInstance()->getDbProp(toString("%s:%d:PREREQUISIT_VALID", dbBase.c_str(), index), false); - if(!node) - break; - node->setValue32(value); - index++; - } + // write prop for all elements of the branch + uint index= 0; + for(;;) + { + CInterfaceManager *pIM= CInterfaceManager::getInstance(); + CCDBNodeLeaf *node= NLGUI::CDBManager::getInstance()->getDbProp(toString("%s:%d:PREREQUISIT_VALID", dbBase.c_str(), index), false); + if(!node) + break; + node->setValue32(value); + index++; + } - return true; + return true; } NLMISC_COMMAND(eventMusic, "", "music") { - if(args.size()<1 && args.size()>3) - return false; + if(args.size()<1 && args.size()>3) + return false; - string fileName= args[0].c_str(); - bool loop= false; - if(args.size() > 1) - fromString(args[1], loop); - uint fadeTime= 1000; - if(args.size() > 2) - fromString(args[2], fadeTime); + string fileName= args[0].c_str(); + bool loop= false; + if(args.size() > 1) + fromString(args[1], loop); + uint fadeTime= 1000; + if(args.size() > 2) + fromString(args[2], fadeTime); - if(SoundMngr) - SoundMngr->playEventMusic(fileName, fadeTime, loop); + if(SoundMngr) + SoundMngr->playEventMusic(fileName, fadeTime, loop); - return true; + return true; } NLMISC_COMMAND(setLightHour, "force the light hour, (negative value to reset to auto)", "") { - if( args.size()!=1 ) - return false; + if( args.size()!=1 ) + return false; - float hour; - fromString(args[0], hour); - if( hour < LightCycleManager.getLightDesc().NumHours ) - { - // check for privileges if this is the final build -#if FINAL_VERSION - // test that user has privilege - if (hasPrivilegeDEV() || - hasPrivilegeSGM() || - hasPrivilegeGM() || - hasPrivilegeVG() || - hasPrivilegeSG() || - hasPrivilegeG() || - hasPrivilegeEM() || - hasPrivilegeEG()) -#endif + float hour; + fromString(args[0], hour); + if( hour < LightCycleManager.getLightDesc().NumHours ) { - ForcedDayNightCycleHour = hour; - return true; + // check for privileges if this is the final build + #if FINAL_VERSION + // test that user has privilege + if (hasPrivilegeDEV() || + hasPrivilegeSGM() || + hasPrivilegeGM() || + hasPrivilegeVG() || + hasPrivilegeSG() || + hasPrivilegeG() || + hasPrivilegeEM() || + hasPrivilegeEG()) + #endif + { + ForcedDayNightCycleHour = hour; + return true; + } } - } - return false; + return false; } NLMISC_COMMAND(jobAnim, "set the job anim specialisation of an entity", "eid number") { - if(args.size()!=2) - return false; + if(args.size()!=2) + return false; - uint eid; - fromString(args[0], eid); - uint jas; - fromString(args[1], jas); - CCharacterCL *ent= dynamic_cast(EntitiesMngr.entity(eid)); - if(ent) - { - ent->setAnimJobSpecialisation(jas); - } + uint eid; + fromString(args[0], eid); + uint jas; + fromString(args[1], jas); + CCharacterCL *ent= dynamic_cast(EntitiesMngr.entity(eid)); + if(ent) + { + ent->setAnimJobSpecialisation(jas); + } - return true; + return true; } NLMISC_COMMAND(startLogStageChange, "start to log the change of stages of watched entity", "") { - // stop first any log - EntitiesMngr.stopLogStageChange(); + // stop first any log + EntitiesMngr.stopLogStageChange(); - // start the log - EntitiesMngr.startLogStageChange(NetMngr.getCurrentClientTick(), T1); + // start the log + EntitiesMngr.startLogStageChange(NetMngr.getCurrentClientTick(), T1); - return true; + return true; } NLMISC_COMMAND(stopLogStageChange, "stop to log the change of watched entity stages", "") { - EntitiesMngr.stopLogStageChange(); - return true; + EntitiesMngr.stopLogStageChange(); + return true; } NLMISC_COMMAND(testReceiveMissionInfo, "emulate a dummy receive of mission info", "") { - CBotChatManager::getInstance()->debugLocalReceiveMissionInfo(); - return true; + CBotChatManager::getInstance()->debugLocalReceiveMissionInfo(); + return true; } // command to dump the ui, no indentation full name NLMISC_COMMAND(dumpUIIndent, "Debug only : Dump the ui hierarchy in the output debug window", "") { - CInterfaceManager *im = CInterfaceManager::getInstance(); - im->dumpUI(true); - return true; + CInterfaceManager *im = CInterfaceManager::getInstance(); + im->dumpUI(true); + return true; } // command to dump the ui, no indentation full name NLMISC_COMMAND(dumpUIFull, "Debug only : Dump the ui hierarchy in the output debug window", "") { - CInterfaceManager *im = CInterfaceManager::getInstance(); - im->dumpUI(false); - return true; + CInterfaceManager *im = CInterfaceManager::getInstance(); + im->dumpUI(false); + return true; } // command to dump coordinates of a UI, for debug NLMISC_COMMAND(dumpUICoords, "Debug only : dump all coords info of an UI", "uiid") { - if(args.size()!=1) - return false; + if(args.size()!=1) + return false; - CInterfaceManager *pIM = CInterfaceManager::getInstance(); - CInterfaceElement *el= CWidgetManager::getInstance()->getElementFromId(args[0]); - if(!el) - { - pIM->displaySystemInfo(toString("dumpUICoords: '%s' does not exist", args[0].c_str())); - } - else - { - pIM->displaySystemInfo(toString("dumpUICoords: **** '%s'", args[0].c_str())); - pIM->displaySystemInfo(toString(" active= %d", uint(el->getActive()) )); - pIM->displaySystemInfo(toString(" x= %d", el->getX() )); - pIM->displaySystemInfo(toString(" y= %d", el->getY() )); - pIM->displaySystemInfo(toString(" w= %d", el->getW() )); - pIM->displaySystemInfo(toString(" h= %d", el->getH() )); - pIM->displaySystemInfo(toString(" xreal= %d", el->getXReal() )); - pIM->displaySystemInfo(toString(" yreal= %d", el->getYReal() )); - pIM->displaySystemInfo(toString(" wreal= %d", el->getWReal() )); - pIM->displaySystemInfo(toString(" hreal= %d", el->getHReal() )); - pIM->displaySystemInfo(toString(" parent= '%s'", el->getParent()?el->getParent()->getId().c_str():"")); - pIM->displaySystemInfo(toString(" parentpos= '%s'", el->getParentPos()?el->getParentPos()->getId().c_str():"")); - pIM->displaySystemInfo(toString(" parentsize= '%s'", el->getParentSize()?el->getParentSize()->getId().c_str():"")); - - // SizeRef - string sr; - switch(el->getSizeRef()) + CInterfaceManager *pIM = CInterfaceManager::getInstance(); + CInterfaceElement *el= CWidgetManager::getInstance()->getElementFromId(args[0]); + if(!el) { - case 1: sr= "w"; break; - case 2: sr= "h"; break; - case 3: sr= "wh"; break; - default:break; + pIM->displaySystemInfo(toString("dumpUICoords: '%s' does not exist", args[0].c_str())); } - pIM->displaySystemInfo(toString(" sizeref= '%s'", sr.c_str())); + else + { + pIM->displaySystemInfo(toString("dumpUICoords: **** '%s'", args[0].c_str())); + pIM->displaySystemInfo(toString(" active= %d", uint(el->getActive()) )); + pIM->displaySystemInfo(toString(" x= %d", el->getX() )); + pIM->displaySystemInfo(toString(" y= %d", el->getY() )); + pIM->displaySystemInfo(toString(" w= %d", el->getW() )); + pIM->displaySystemInfo(toString(" h= %d", el->getH() )); + pIM->displaySystemInfo(toString(" xreal= %d", el->getXReal() )); + pIM->displaySystemInfo(toString(" yreal= %d", el->getYReal() )); + pIM->displaySystemInfo(toString(" wreal= %d", el->getWReal() )); + pIM->displaySystemInfo(toString(" hreal= %d", el->getHReal() )); + pIM->displaySystemInfo(toString(" parent= '%s'", el->getParent()?el->getParent()->getId().c_str():"")); + pIM->displaySystemInfo(toString(" parentpos= '%s'", el->getParentPos()?el->getParentPos()->getId().c_str():"")); + pIM->displaySystemInfo(toString(" parentsize= '%s'", el->getParentSize()?el->getParentSize()->getId().c_str():"")); - // PosRef - string pr; - THotSpot hsParent= el->getParentPosRef(); - THotSpot hsSelf= el->getPosRef(); - // parent - if(hsParent & Hotspot_Bx) pr+= "B"; - else if(hsParent & Hotspot_Mx) pr+= "M"; - else if(hsParent & Hotspot_Tx) pr+= "T"; - else pr+= "?"; - if(hsParent & Hotspot_xL) pr+= "L"; - else if(hsParent & Hotspot_xM) pr+= "M"; - else if(hsParent & Hotspot_xR) pr+= "R"; - else pr+= "?"; - pr+=" "; - // self - if(hsSelf & Hotspot_Bx) pr+= "B"; - else if(hsSelf & Hotspot_Mx) pr+= "M"; - else if(hsSelf & Hotspot_Tx) pr+= "T"; - else pr+= "?"; - if(hsSelf & Hotspot_xL) pr+= "L"; - else if(hsSelf & Hotspot_xM) pr+= "M"; - else if(hsSelf & Hotspot_xR) pr+= "R"; - else pr+= "?"; - pIM->displaySystemInfo(toString(" posref= '%s'", pr.c_str())); + // SizeRef + string sr; + switch(el->getSizeRef()) + { + case 1: sr= "w"; break; + case 2: sr= "h"; break; + case 3: sr= "wh"; break; + default:break; + } + pIM->displaySystemInfo(toString(" sizeref= '%s'", sr.c_str())); - pIM->displaySystemInfo(string("dumpUICoords: **** END")); - } + // PosRef + string pr; + THotSpot hsParent= el->getParentPosRef(); + THotSpot hsSelf= el->getPosRef(); + // parent + if(hsParent & Hotspot_Bx) pr+= "B"; + else if(hsParent & Hotspot_Mx) pr+= "M"; + else if(hsParent & Hotspot_Tx) pr+= "T"; + else pr+= "?"; + if(hsParent & Hotspot_xL) pr+= "L"; + else if(hsParent & Hotspot_xM) pr+= "M"; + else if(hsParent & Hotspot_xR) pr+= "R"; + else pr+= "?"; + pr+=" "; + // self + if(hsSelf & Hotspot_Bx) pr+= "B"; + else if(hsSelf & Hotspot_Mx) pr+= "M"; + else if(hsSelf & Hotspot_Tx) pr+= "T"; + else pr+= "?"; + if(hsSelf & Hotspot_xL) pr+= "L"; + else if(hsSelf & Hotspot_xM) pr+= "M"; + else if(hsSelf & Hotspot_xR) pr+= "R"; + else pr+= "?"; + pIM->displaySystemInfo(toString(" posref= '%s'", pr.c_str())); - return true; + pIM->displaySystemInfo(string("dumpUICoords: **** END")); + } + + return true; } // Command to clear the dump of done Files opened and Async File Manager done files (for debug) NLMISC_COMMAND(clearDumpFiles, "clear the CAsyncFileManager and CIFile Debug list of opened files", "") { - CIFile::clearDump(); - CAsyncFileManager::getInstance().clearDump(); + CIFile::clearDump(); + CAsyncFileManager::getInstance().clearDump(); - return true; + return true; } #endif // FINAL_VERSION @@ -5044,25 +5031,25 @@ NLMISC_COMMAND(clearDumpFiles, "clear the CAsyncFileManager and CIFile Debug lis NLMISC_COMMAND(reloadFogMaps, "Force to reload all the fog maps", "<>") { - if (!args.empty()) return false; - ContinentMngr.cur()->reloadFogMap(); - return true; + if (!args.empty()) return false; + ContinentMngr.cur()->reloadFogMap(); + return true; } // dump the names of all loaded sounds NLMISC_COMMAND(dumpSounds, "Dump names of all loaded sound", "<>") { - if (!args.empty()) return false; - std::vector sounds; - extern CSoundManager *SoundMngr; - if (!SoundMngr) return false; - if (!SoundMngr->getMixer()) return false; - SoundMngr->getMixer()->getSoundNames(sounds); - for(uint k = 0; k < sounds.size(); ++k) - { - nlinfo(sounds[k].toString()/*NLMISC::CStringMapper::unmap(sounds[k])*/.c_str()); - } - return true; + if (!args.empty()) return false; + std::vector sounds; + extern CSoundManager *SoundMngr; + if (!SoundMngr) return false; + if (!SoundMngr->getMixer()) return false; + SoundMngr->getMixer()->getSoundNames(sounds); + for(uint k = 0; k < sounds.size(); ++k) + { + nlinfo(sounds[k].toString()/*NLMISC::CStringMapper::unmap(sounds[k])*/.c_str()); + } + return true; } // *************************************************************************** @@ -5072,104 +5059,104 @@ const char *LUADebugNotEnabledMsg= "Lua Commands are available only if you add ' NLMISC_COMMAND(luaReload, "reload all .lua script files", "") { - CInterfaceManager *pIM= CInterfaceManager::getInstance(); - if(ClientCfg.AllowDebugLua) - { - CWidgetManager::getInstance()->getParser()->reloadAllLuaFileScripts(); - return true; - } - else - { - pIM->displaySystemInfo( LuaHelperStuff::formatLuaErrorSysInfo(LUADebugNotEnabledMsg)); - return false; - } + CInterfaceManager *pIM= CInterfaceManager::getInstance(); + if(ClientCfg.AllowDebugLua) + { + CWidgetManager::getInstance()->getParser()->reloadAllLuaFileScripts(); + return true; + } + else + { + pIM->displaySystemInfo( LuaHelperStuff::formatLuaErrorSysInfo(LUADebugNotEnabledMsg)); + return false; + } } NLMISC_COMMAND(luaScript, "Execute a lua script", "direct_script_code") { - CInterfaceManager *pIM= CInterfaceManager::getInstance(); - if(ClientCfg.AllowDebugLua) - { - if(args.size()<1) - return false; - - // Concat list of string in one script - string script; - for(uint i=0;idisplaySystemInfo( LuaHelperStuff::formatLuaErrorSysInfo(LUADebugNotEnabledMsg)); + return false; } - - // not smallScript because suppose var can change a lot - CLuaManager::getInstance().executeLuaScript(script, false); - - return true; - } - else - { - pIM->displaySystemInfo( LuaHelperStuff::formatLuaErrorSysInfo(LUADebugNotEnabledMsg)); - return false; - } } NLMISC_COMMAND(luaInfo, "Dump some information on LUA state", "detaillevel from 0 to 2") { - CInterfaceManager *pIM= CInterfaceManager::getInstance(); - if(ClientCfg.AllowDebugLua) - { - if(args.size()!=1) - return false; + CInterfaceManager *pIM= CInterfaceManager::getInstance(); + if(ClientCfg.AllowDebugLua) + { + if(args.size()!=1) + return false; - uint detail; - fromString(args[0], detail); + uint detail; + fromString(args[0], detail); - pIM->dumpLuaState(detail); - return true; - } - else - { - pIM->displaySystemInfo( LuaHelperStuff::formatLuaErrorSysInfo(LUADebugNotEnabledMsg)); - return false; - } + pIM->dumpLuaState(detail); + return true; + } + else + { + pIM->displaySystemInfo( LuaHelperStuff::formatLuaErrorSysInfo(LUADebugNotEnabledMsg)); + return false; + } } NLMISC_COMMAND(luaObject, "Dump the content of a lua object", " [maxDepth = 20, 0 for no limits]") { - if (args.empty()) return false; - if (args.size() > 2) return false; - CInterfaceManager *pIM= CInterfaceManager::getInstance(); - if (!ClientCfg.AllowDebugLua) - { - pIM->displaySystemInfo( LuaHelperStuff::formatLuaErrorSysInfo(LUADebugNotEnabledMsg)); - return false; - } - CLuaState *luaState = CLuaManager::getInstance().getLuaState(); - if (!luaState) return false; - CLuaStackChecker lsc(luaState); - // get the table - static const char *inspectedTable = "_____inspected_table"; - try - { - // make a reference to the table to be inspected (is this this a primitive type, just make a copy) - luaState->executeScript(std::string(inspectedTable) + " = " + args[0]); - } - catch(const ELuaError &e) - { - CLuaIHMRyzom::debugInfo(e.what()); - return false; - } - luaState->pushGlobalTable(); - CLuaObject env; - env.pop(*luaState); - uint maxDepth; - if (args.size() > 1) - fromString(args[1], maxDepth); - else - maxDepth = 20; - //CLuaIHM::debugInfo(env[inspectedTable].toStringRecurse(0, maxDepth)); - env[inspectedTable].dump(); - env.eraseValue(inspectedTable); - return true; + if (args.empty()) return false; + if (args.size() > 2) return false; + CInterfaceManager *pIM= CInterfaceManager::getInstance(); + if (!ClientCfg.AllowDebugLua) + { + pIM->displaySystemInfo( LuaHelperStuff::formatLuaErrorSysInfo(LUADebugNotEnabledMsg)); + return false; + } + CLuaState *luaState = CLuaManager::getInstance().getLuaState(); + if (!luaState) return false; + CLuaStackChecker lsc(luaState); + // get the table + static const char *inspectedTable = "_____inspected_table"; + try + { + // make a reference to the table to be inspected (is this this a primitive type, just make a copy) + luaState->executeScript(std::string(inspectedTable) + " = " + args[0]); + } + catch(const ELuaError &e) + { + CLuaIHMRyzom::debugInfo(e.what()); + return false; + } + luaState->pushGlobalTable(); + CLuaObject env; + env.pop(*luaState); + uint maxDepth; + if (args.size() > 1) + fromString(args[1], maxDepth); + else + maxDepth = 20; + //CLuaIHM::debugInfo(env[inspectedTable].toStringRecurse(0, maxDepth)); + env[inspectedTable].dump(); + env.eraseValue(inspectedTable); + return true; } @@ -5179,17 +5166,17 @@ NLMISC_COMMAND(luaObject, "Dump the content of a lua object", "
[max #if !FINAL_VERSION NLMISC_COMMAND(luaGC, "Force a garbage collector of lua", "") { - CInterfaceManager *pIM= CInterfaceManager::getInstance(); - if(ClientCfg.AllowDebugLua) - { - CLuaManager::getInstance().forceGarbageCollect(); - return true; - } - else - { - pIM->displaySystemInfo( LuaHelperStuff::formatLuaErrorSysInfo(LUADebugNotEnabledMsg)); - return false; - } + CInterfaceManager *pIM= CInterfaceManager::getInstance(); + if(ClientCfg.AllowDebugLua) + { + CLuaManager::getInstance().forceGarbageCollect(); + return true; + } + else + { + pIM->displaySystemInfo( LuaHelperStuff::formatLuaErrorSysInfo(LUADebugNotEnabledMsg)); + return false; + } } #endif @@ -5203,241 +5190,241 @@ std::map CUserCommand::CommandMap; // release memory void CUserCommand::release() { - std::map::iterator it = CommandMap.begin(); - while( it != CommandMap.end() ) - delete (*it++).second; - CommandMap.clear(); + std::map::iterator it = CommandMap.begin(); + while( it != CommandMap.end() ) + delete (*it++).second; + CommandMap.clear(); } // *************************************************************************** CUserCommand::CUserCommand(const string &commandName, const ucstring &help, const ucstring &argsHelp) - : ICommand("user", commandName.c_str(), toString(help).c_str(), toString(argsHelp).c_str()) + : ICommand("user", commandName.c_str(), toString(help).c_str(), toString(argsHelp).c_str()) { - CommandName = commandName; + CommandName = commandName; } // *************************************************************************** void CUserCommand::addMode (const string &action, uint numArg, bool infiniteAgr, const std::vector &keywords) { - CMode *mode; - if (!infiniteAgr) - mode = &(FixedArgModes[numArg]); - else - mode = &InfiniteMode; - mode->Action = action; - mode->KeywordsCount = numArg; - mode->Keywords = keywords; + CMode *mode; + if (!infiniteAgr) + mode = &(FixedArgModes[numArg]); + else + mode = &InfiniteMode; + mode->Action = action; + mode->KeywordsCount = numArg; + mode->Keywords = keywords; } // *************************************************************************** bool CUserCommand::execute(const std::string &/* rawCommandString */, const std::vector &args, NLMISC::CLog &/* log */, bool /* quiet */, bool /* human */) { - CInterfaceManager *pIM = CInterfaceManager::getInstance(); + CInterfaceManager *pIM = CInterfaceManager::getInstance(); - // Find the good keyword table - CMode *mode = NULL; - if (FixedArgModes.find ((uint)args.size()) != FixedArgModes.end()) - mode = &(FixedArgModes[(uint)args.size()]); - else - if (!InfiniteMode.Keywords.empty() && (args.size() >= InfiniteMode.KeywordsCount)) - mode = &InfiniteMode; + // Find the good keyword table + CMode *mode = NULL; + if (FixedArgModes.find ((uint)args.size()) != FixedArgModes.end()) + mode = &(FixedArgModes[(uint)args.size()]); + else + if (!InfiniteMode.Keywords.empty() && (args.size() >= InfiniteMode.KeywordsCount)) + mode = &InfiniteMode; - if (mode) - { - // Build the final string - static string finalArgs; - finalArgs = ""; - uint i; - uint index = 0; - const vector &keywords = mode->Keywords; - for (i=0; i= args.size()) + // Build the final string + static string finalArgs; + finalArgs = ""; + uint i; + uint index = 0; + const vector &keywords = mode->Keywords; + for (i=0; idisplaySystemInfo (ucstring(CommandName+" : ")+CI18N::get ("uiCommandWrongArgumentCount")); - return false; - } - else - { - if (keywords[i] == "$") - finalArgs += /*ucstring(*/args[index++]/*).toUtf8()*/; - else - { - while (index 0) ? " " : ""; - // If arg contains spaces then put it in quotes - if (string::npos != args[index].find(" ")) - { - finalArgs += "\"" + args[index++] + "\""; - } - else - { - finalArgs += args[index++]; - } + if ((uint)index >= args.size()) + { + // Not enough arguments + pIM->displaySystemInfo (ucstring(CommandName+" : ")+CI18N::get ("uiCommandWrongArgumentCount")); + return false; + } + else + { + if (keywords[i] == "$") + finalArgs += /*ucstring(*/args[index++]/*).toUtf8()*/; + else + { + while (index 0) ? " " : ""; + // If arg contains spaces then put it in quotes + if (string::npos != args[index].find(" ")) + { + finalArgs += "\"" + args[index++] + "\""; + } + else + { + finalArgs += args[index++]; + } + } + } + } + } + else + { + finalArgs += keywords[i]; } - } } - } - else - { - finalArgs += keywords[i]; - } - } - // Run the action handler - CAHManager::getInstance()->runActionHandler (mode->Action, CWidgetManager::getInstance()->getOldCaptureKeyboard(), finalArgs); - } - else - { - // Not enough argument - pIM->displaySystemInfo (ucstring(CommandName+" : ")+CI18N::get ("uiCommandWrongArgumentCount")); - return false; - } - return true; + // Run the action handler + CAHManager::getInstance()->runActionHandler (mode->Action, CWidgetManager::getInstance()->getOldCaptureKeyboard(), finalArgs); + } + else + { + // Not enough argument + pIM->displaySystemInfo (ucstring(CommandName+" : ")+CI18N::get ("uiCommandWrongArgumentCount")); + return false; + } + return true; } // *************************************************************************** void CUserCommand::createCommand (const char *name, const char *action, const char *ptrParams) { - // Parse the params - std::vector keywords; + // Parse the params + std::vector keywords; - // Get the help and the argument help - uint countArgument = 0; - bool infiniteArgument = false; - string params = ptrParams; - string::size_type pos = 0; - while (pos < params.size()) - { - // Token ? - string::size_type last; - switch (params[pos]) + // Get the help and the argument help + uint countArgument = 0; + bool infiniteArgument = false; + string params = ptrParams; + string::size_type pos = 0; + while (pos < params.size()) { - case '|': - case '=': - case '$': - case '+': - if ((params[pos] == '$') || (params[pos] == '+')) - countArgument++; - if (params[pos] == '+') - infiniteArgument = true; - last = pos+1; - break; - default: - last = params.find_first_of ("|=$+", pos); - if (last == string::npos) - last = params.size(); - break; - } - - // Add a keyword - keywords.push_back (params.substr (pos, last-pos)); - pos = last; - } - - // Find action name - ucstring help; - const CBaseAction *ab = Actions.getBaseAction (::CAction::CName (action, ptrParams)); - if (ab) - help = CI18N::get(ab->LocalizedName); - - // Build a argument help - ucstring argsHelp; - - if (ab) - { - // Look for each arguments - uint i; - for (i=0; iParameters.size(); j++) - { - // Argument found - if (ab->Parameters[j].Name == keywords[i-2]) - { - // Add the string - if (!argsHelp.empty()) - argsHelp += " "; - argsHelp += ucstring("<") + CI18N::get(ab->Parameters[j].LocalizedName) + ucstring(">"); - bFound = true; - } - } - // Not found ? Warning - if (!bFound) - { - nlwarning ("Argument %s not found in command %s using action %s", keywords[i-2].c_str(), name, action); - } + case '|': + case '=': + case '$': + case '+': + if ((params[pos] == '$') || (params[pos] == '+')) + countArgument++; + if (params[pos] == '+') + infiniteArgument = true; + last = pos+1; + break; + default: + last = params.find_first_of ("|=$+", pos); + if (last == string::npos) + last = params.size(); + break; } - } + + // Add a keyword + keywords.push_back (params.substr (pos, last-pos)); + pos = last; } - } - // Ugly : never deleted, but who cares ? - // Command exist ? - CUserCommand *currentCommand; - if (CommandMap.find (name) != CommandMap.end()) - currentCommand = CommandMap[name]; - else - { - currentCommand = new CUserCommand (name, help, argsHelp); - CommandMap[name] = currentCommand; - } + // Find action name + ucstring help; + const CBaseAction *ab = Actions.getBaseAction (::CAction::CName (action, ptrParams)); + if (ab) + help = CI18N::get(ab->LocalizedName); - // Add keywords - currentCommand->addMode (action, countArgument, infiniteArgument, keywords); + // Build a argument help + ucstring argsHelp; + + if (ab) + { + // Look for each arguments + uint i; + for (i=0; iParameters.size(); j++) + { + // Argument found + if (ab->Parameters[j].Name == keywords[i-2]) + { + // Add the string + if (!argsHelp.empty()) + argsHelp += " "; + argsHelp += ucstring("<") + CI18N::get(ab->Parameters[j].LocalizedName) + ucstring(">"); + bFound = true; + } + } + // Not found ? Warning + if (!bFound) + { + nlwarning ("Argument %s not found in command %s using action %s", keywords[i-2].c_str(), name, action); + } + } + } + } + } + + // Ugly : never deleted, but who cares ? + // Command exist ? + CUserCommand *currentCommand; + if (CommandMap.find (name) != CommandMap.end()) + currentCommand = CommandMap[name]; + else + { + currentCommand = new CUserCommand (name, help, argsHelp); + CommandMap[name] = currentCommand; + } + + // Add keywords + currentCommand->addMode (action, countArgument, infiniteArgument, keywords); } NLMISC_COMMAND(doAssert, "Create an assert", "") { - nlassert(0); - return true; + nlassert(0); + return true; } NLMISC_COMMAND(dumpPosAsPrim, "ld helper : add current position to pos.primitive with the given comment", "") { - if (!EntitiesMngr.entity(0)) return false; - std::string comment; - for(uint k = 0; k < args.size(); ++k) - { - if (k != 0) comment += " "; - comment += args[k]; - } - std::string srcFile; - const std::string path = "save/pos.primitive"; - if (CFile::fileExists(path)) - { - try + if (!EntitiesMngr.entity(0)) return false; + std::string comment; + for(uint k = 0; k < args.size(); ++k) { - uint32 fileSize = CFile::getFileSize(path); - srcFile.resize(fileSize); - CIFile stream; - stream.open(path); - stream.serialBuffer((uint8 *) &srcFile[0], fileSize); + if (k != 0) comment += " "; + comment += args[k]; } - catch(const NLMISC::EStream &e) + std::string srcFile; + const std::string path = "save/pos.primitive"; + if (CFile::fileExists(path)) { - nlinfo(e.what()); - srcFile.clear(); + try + { + uint32 fileSize = CFile::getFileSize(path); + srcFile.resize(fileSize); + CIFile stream; + stream.open(path); + stream.serialBuffer((uint8 *) &srcFile[0], fileSize); + } + catch(const NLMISC::EStream &e) + { + nlinfo(e.what()); + srcFile.clear(); + } } - } - std::string newPrim = - NLMISC::toString(" \n\ + std::string newPrim = + NLMISC::toString(" \n\ \n\ \n\ class \n\ @@ -5449,236 +5436,236 @@ NLMISC_COMMAND(dumpPosAsPrim, "ld helper : add current position to pos.primitive \n\ \n", (float) EntitiesMngr.entity(0)->pos().x, (float) EntitiesMngr.entity(0)->pos().y, (float) EntitiesMngr.entity(0)->pos().z, comment.c_str()); - // try to append result to current file - const std::string LAST_CHILD_MARKER = ""; - std::string::size_type insertPos = srcFile.rfind(LAST_CHILD_MARKER); - if (insertPos != std::string::npos) - { - insertPos += LAST_CHILD_MARKER.size(); - srcFile.insert(insertPos, "\n" + newPrim); - } - else - { - srcFile.clear(); - } - if (srcFile.empty()) - { - srcFile = " \n\ + // try to append result to current file + const std::string LAST_CHILD_MARKER = ""; + std::string::size_type insertPos = srcFile.rfind(LAST_CHILD_MARKER); + if (insertPos != std::string::npos) + { + insertPos += LAST_CHILD_MARKER.size(); + srcFile.insert(insertPos, "\n" + newPrim); + } + else + { + srcFile.clear(); + } + if (srcFile.empty()) + { + srcFile = " \n\ \n\ \n" - + newPrim - + " \n\ + + newPrim + + " \n\ \n"; - } + } - // write result - try - { - COFile stream; - stream.open(path); - stream.serialBuffer((uint8 *) &srcFile[0], (uint)srcFile.size()); - } - catch(const NLMISC::EStream &e) - { - nlinfo(e.what()); - } - return true; + // write result + try + { + COFile stream; + stream.open(path); + stream.serialBuffer((uint8 *) &srcFile[0], (uint)srcFile.size()); + } + catch(const NLMISC::EStream &e) + { + nlinfo(e.what()); + } + return true; } NLMISC_COMMAND(clear, "clear content of current char window", "") { - if (args.size() > 1) return false; - CInterfaceManager *im = CInterfaceManager::getInstance(); - im->flushDebugWindow(); - CChatWindow *cw; - if (args.size() == 1) - { - cw = getChatWndMgr().getChatWindowFromCaller(dynamic_cast(CWidgetManager::getInstance()->getElementFromId(args[0]))); - } - else - { - // if no chat window (or enclosed control) id is given then see if a chat window called this command - cw = CChatWindow::getChatWindowLaunchingCommand(); - } - if (cw && cw->getContainer()) - { - CGroupList *gl = dynamic_cast(cw->getContainer()->getGroup("text_list")); - if (gl) + if (args.size() > 1) return false; + CInterfaceManager *im = CInterfaceManager::getInstance(); + im->flushDebugWindow(); + CChatWindow *cw; + if (args.size() == 1) { - gl->deleteAllChildren(); + cw = getChatWndMgr().getChatWindowFromCaller(dynamic_cast(CWidgetManager::getInstance()->getElementFromId(args[0]))); } - } - return true; + else + { + // if no chat window (or enclosed control) id is given then see if a chat window called this command + cw = CChatWindow::getChatWindowLaunchingCommand(); + } + if (cw && cw->getContainer()) + { + CGroupList *gl = dynamic_cast(cw->getContainer()->getGroup("text_list")); + if (gl) + { + gl->deleteAllChildren(); + } + } + return true; } NLMISC_COMMAND(dumpAllLoadedZones, "dump all loaded zones", "") { - if (!args.empty()) return false; - if (Landscape) - { - std::vector loadedZones; - Landscape->getAllZoneLoaded(loadedZones); - for(uint k = 0; k < loadedZones.size(); ++k) + if (!args.empty()) return false; + if (Landscape) { - nlwarning(loadedZones[k].c_str()); + std::vector loadedZones; + Landscape->getAllZoneLoaded(loadedZones); + for(uint k = 0; k < loadedZones.size(); ++k) + { + nlwarning(loadedZones[k].c_str()); + } } - } - else - { - nlwarning("Landscape has no loaded zones "); - } - return true; + else + { + nlwarning("Landscape has no loaded zones "); + } + return true; } NLMISC_COMMAND(tickToDate, "convert a tick value into a readable ryzom time", "") { - if (args.size() != 1) return false; - CRyzomTime rt; - uint32 tick; - fromString(args[0], tick); - rt.updateRyzomClock(tick); - CInterfaceManager *im = CInterfaceManager::getInstance(); - float ryTime = rt.getRyzomTime(); - std::string readableDate = toString("Day = %d, hour = %d:%d", rt.getRyzomDay(), (int) floorf(ryTime), (int) floorf(60.f * fmodf(ryTime, 1.f))); - im->displaySystemInfo(ucstring(readableDate)); - return true; + if (args.size() != 1) return false; + CRyzomTime rt; + uint32 tick; + fromString(args[0], tick); + rt.updateRyzomClock(tick); + CInterfaceManager *im = CInterfaceManager::getInstance(); + float ryTime = rt.getRyzomTime(); + std::string readableDate = toString("Day = %d, hour = %d:%d", rt.getRyzomDay(), (int) floorf(ryTime), (int) floorf(60.f * fmodf(ryTime, 1.f))); + im->displaySystemInfo(ucstring(readableDate)); + return true; } NLMISC_COMMAND(dumpShapeMaxDist, "dump max dist for shapes", "") { - /* - std::set shapeSet; - typedef CHashMultiMap TShapeMap; - TShapeMap shapes; - const CSheetManager::TEntitySheetMap &sheets = SheetMngr.getSheets(); - std::vector equipList; - for (CSheetManager::TEntitySheetMap::const_iterator it = sheets.begin(); it != sheets.end(); ++it) - { - CCharacterSheet *cs = dynamic_cast(SheetMngr.get(it->first)); - if (cs) - { - equipList.clear(); - cs->getWholeEquipmentList(equipList); - for (uint k = 0; k < equipList.size(); ++k) - { - std::string item = toLower(equipList[k]->getItem()); - if (!item.empty()) - { +/* + std::set shapeSet; + typedef CHashMultiMap TShapeMap; + TShapeMap shapes; + const CSheetManager::TEntitySheetMap &sheets = SheetMngr.getSheets(); + std::vector equipList; + for (CSheetManager::TEntitySheetMap::const_iterator it = sheets.begin(); it != sheets.end(); ++it) + { + CCharacterSheet *cs = dynamic_cast(SheetMngr.get(it->first)); + if (cs) + { + equipList.clear(); + cs->getWholeEquipmentList(equipList); + for (uint k = 0; k < equipList.size(); ++k) + { + std::string item = toLower(equipList[k]->getItem()); + if (!item.empty()) + { - string ext = CFile::getExtension(item); - if (ext == "shape") - { - if (!shapeSet.count(item)) - { - UInstance inst = Scene->createInstance(item); - if (!inst.empty()) - { - shapes.insert(make_pair(inst.getDistMax(), item)); - Scene->deleteInstance(inst); - } - shapeSet.insert(item); - } - } - } - } - } - } - for (TShapeMap::iterator it = shapes.begin(); it != shapes.end(); ++it) - { - nlwarning("Dist = %f, shape = %s", it->first, it->second.c_str()); - } - */ - return true; + string ext = CFile::getExtension(item); + if (ext == "shape") + { + if (!shapeSet.count(item)) + { + UInstance inst = Scene->createInstance(item); + if (!inst.empty()) + { + shapes.insert(make_pair(inst.getDistMax(), item)); + Scene->deleteInstance(inst); + } + shapeSet.insert(item); + } + } + } + } + } + } + for (TShapeMap::iterator it = shapes.begin(); it != shapes.end(); ++it) + { + nlwarning("Dist = %f, shape = %s", it->first, it->second.c_str()); + } +*/ + return true; } NLMISC_COMMAND(dumpContinentCorners, "dump max dist for shapes", "") { - if (!args.empty()) return false; - if (!ContinentMngr.cur()) return false; + if (!args.empty()) return false; + if (!ContinentMngr.cur()) return false; - CVector2f posMin; - CVector2f posMax; - getPosFromZoneName(ContinentMngr.cur()->ZoneMin, posMin); - getPosFromZoneName(ContinentMngr.cur()->ZoneMax, posMax); - if (posMin.x > posMax.x) std::swap(posMin.x, posMax.x); - if (posMin.y > posMax.y) std::swap(posMin.y, posMax.y); - posMax.x += 160.f; - posMax.y += 160.f; - nlwarning("min = (%f, %f), max = (%f, %f)", posMin.x, posMin.y, posMax.x, posMax.y); - return true; + CVector2f posMin; + CVector2f posMax; + getPosFromZoneName(ContinentMngr.cur()->ZoneMin, posMin); + getPosFromZoneName(ContinentMngr.cur()->ZoneMax, posMax); + if (posMin.x > posMax.x) std::swap(posMin.x, posMax.x); + if (posMin.y > posMax.y) std::swap(posMin.y, posMax.y); + posMax.x += 160.f; + posMax.y += 160.f; + nlwarning("min = (%f, %f), max = (%f, %f)", posMin.x, posMin.y, posMax.x, posMax.y); + return true; } #if !FINAL_VERSION NLMISC_COMMAND(setMission, "locally set a mission text for test", "") { - if (!ClientCfg.Local) return false; - if (args.size() != 2) return false; - uint index; - fromString(args[0], index); - CInterfaceManager *im = CInterfaceManager::getInstance(); - static sint32 strID = 10000; // any abitrary string id will do in local - if (index >= 30) return false; - if (index < 15) - { - NLGUI::CDBManager::getInstance()->getDbProp(toString("SERVER:MISSIONS:%d:TITLE", (int) index))->setValue32(strID); - NLGUI::CDBManager::getInstance()->getDbProp(toString("SERVER:MISSIONS:%d:FINISHED", (int) index))->setValue32(0); - } - else - { - NLGUI::CDBManager::getInstance()->getDbProp(toString("SERVER:GROUP:MISSIONS:%d:TITLE", (int) index - 15))->setValue32(strID); - NLGUI::CDBManager::getInstance()->getDbProp(toString("SERVER:GROUP:MISSIONS:%d:FINISHED", (int) index - 15))->setValue32(0); - } - setDynString(strID++, args[1]); - return true; + if (!ClientCfg.Local) return false; + if (args.size() != 2) return false; + uint index; + fromString(args[0], index); + CInterfaceManager *im = CInterfaceManager::getInstance(); + static sint32 strID = 10000; // any abitrary string id will do in local + if (index >= 30) return false; + if (index < 15) + { + NLGUI::CDBManager::getInstance()->getDbProp(toString("SERVER:MISSIONS:%d:TITLE", (int) index))->setValue32(strID); + NLGUI::CDBManager::getInstance()->getDbProp(toString("SERVER:MISSIONS:%d:FINISHED", (int) index))->setValue32(0); + } + else + { + NLGUI::CDBManager::getInstance()->getDbProp(toString("SERVER:GROUP:MISSIONS:%d:TITLE", (int) index - 15))->setValue32(strID); + NLGUI::CDBManager::getInstance()->getDbProp(toString("SERVER:GROUP:MISSIONS:%d:FINISHED", (int) index - 15))->setValue32(0); + } + setDynString(strID++, args[1]); + return true; } static bool setMissionStep(uint missionIndex, uint stepIndex, uint32 strID) { - CInterfaceManager *im = CInterfaceManager::getInstance(); - if (stepIndex >= 30) return false; - if (stepIndex >= 20) return false; - if (missionIndex < 15) - { - NLGUI::CDBManager::getInstance()->getDbProp(toString("SERVER:MISSIONS:%d:GOALS:%d:TEXT", (int) missionIndex, (int) stepIndex))->setValue32(strID); - } - else - { - NLGUI::CDBManager::getInstance()->getDbProp(toString("SERVER:GROUP:MISSIONS:%d:GOALS:%d:TEXT", (int) (missionIndex - 15), (int) stepIndex))->setValue32(strID); - } - return true; + CInterfaceManager *im = CInterfaceManager::getInstance(); + if (stepIndex >= 30) return false; + if (stepIndex >= 20) return false; + if (missionIndex < 15) + { + NLGUI::CDBManager::getInstance()->getDbProp(toString("SERVER:MISSIONS:%d:GOALS:%d:TEXT", (int) missionIndex, (int) stepIndex))->setValue32(strID); + } + else + { + NLGUI::CDBManager::getInstance()->getDbProp(toString("SERVER:GROUP:MISSIONS:%d:GOALS:%d:TEXT", (int) (missionIndex - 15), (int) stepIndex))->setValue32(strID); + } + return true; } // add a new step in a mission, the mission must already exist NLMISC_COMMAND(setMissionStep, "locally set a mission step for test", "") { - if (!ClientCfg.Local) return false; - if (args.size() != 3) return false; - uint missionIndex; - fromString(args[0], missionIndex); - uint stepIndex; - fromString(args[1], stepIndex); + if (!ClientCfg.Local) return false; + if (args.size() != 3) return false; + uint missionIndex; + fromString(args[0], missionIndex); + uint stepIndex; + fromString(args[1], stepIndex); - static sint32 strID = 20000; // any abitrary string id will do in local - if (!setMissionStep(missionIndex, stepIndex, strID)) return false; - setDynString(strID++, args[2]); - return true; + static sint32 strID = 20000; // any abitrary string id will do in local + if (!setMissionStep(missionIndex, stepIndex, strID)) return false; + setDynString(strID++, args[2]); + return true; } // add a newstepin a mission, the mission must already exist NLMISC_COMMAND(clearMissionStep, "locally set a mission step for test", "") { - if (!ClientCfg.Local) return false; - if (args.size() != 2) return false; - uint missionIndex; - fromString(args[0], missionIndex); - uint stepIndex; - fromString(args[1], stepIndex); - return setMissionStep(missionIndex, stepIndex, 0); + if (!ClientCfg.Local) return false; + if (args.size() != 2) return false; + uint missionIndex; + fromString(args[0], missionIndex); + uint stepIndex; + fromString(args[1], stepIndex); + return setMissionStep(missionIndex, stepIndex, 0); } @@ -5688,17 +5675,17 @@ NLMISC_COMMAND(clearMissionStep, "locally set a mission step for test", "= 30) return false; - CInterfaceManager *im = CInterfaceManager::getInstance(); - if (index < 15) - { - NLGUI::CDBManager::getInstance()->getDbProp(toString("SERVER:MISSIONS:%d:TITLE", (int) index))->setValue32(0); - } - else - { - NLGUI::CDBManager::getInstance()->getDbProp(toString("SERVER:GROUP:MISSIONS:%d:TITLE", (int) index - 15))->setValue32(0); - } - return true; + if (index >= 30) return false; + CInterfaceManager *im = CInterfaceManager::getInstance(); + if (index < 15) + { + NLGUI::CDBManager::getInstance()->getDbProp(toString("SERVER:MISSIONS:%d:TITLE", (int) index))->setValue32(0); + } + else + { + NLGUI::CDBManager::getInstance()->getDbProp(toString("SERVER:GROUP:MISSIONS:%d:TITLE", (int) index - 15))->setValue32(0); + } + return true; } #endif @@ -5706,11 +5693,11 @@ static bool debugSetMissionState(uint index, sint32 /* state */) #if !FINAL_VERSION NLMISC_COMMAND(clearMission, "clear the content of a mission", "") { - if (!ClientCfg.Local) return false; - if (args.size() != 1) return false; - uint index; - fromString(args[0], index); - return debugSetMissionState(index, 0); + if (!ClientCfg.Local) return false; + if (args.size() != 1) return false; + uint index; + fromString(args[0], index); + return debugSetMissionState(index, 0); } #endif @@ -5718,22 +5705,22 @@ NLMISC_COMMAND(clearMission, "clear the content of a mission", "" #if !FINAL_VERSION NLMISC_COMMAND(finishMission, "clear the content of a mission", "") { - if (!ClientCfg.Local) return false; - if (args.size() != 1) return false; - uint index; - fromString(args[0], index); - return debugSetMissionState(index, 1); + if (!ClientCfg.Local) return false; + if (args.size() != 1) return false; + uint index; + fromString(args[0], index); + return debugSetMissionState(index, 1); } #endif #if !FINAL_VERSION NLMISC_COMMAND(failMission, "clear the content of a mission", "") { - if (!ClientCfg.Local) return false; - if (args.size() != 1) return false; - uint index; - fromString(args[0], index); - return debugSetMissionState(index, 2); + if (!ClientCfg.Local) return false; + if (args.size() != 1) return false; + uint index; + fromString(args[0], index); + return debugSetMissionState(index, 2); } #endif @@ -5744,142 +5731,145 @@ NLMISC_COMMAND(failMission, "clear the content of a mission", "") NLMISC_COMMAND(em, "emote command", "") { - if (args.size() < 1) return false; + if (args.size() < 1) return false; - CInterfaceManager *pIM = CInterfaceManager::getInstance(); - if( pIM ) - { - string emotePhrase; - if( args.size() > 0 ) + CInterfaceManager *pIM = CInterfaceManager::getInstance(); + if( pIM ) { - emotePhrase = args[0]; + string emotePhrase; + if( args.size() > 0 ) + { + emotePhrase = args[0]; + } + for(uint i = 1; i < args.size(); ++i ) + { + emotePhrase += " "; + emotePhrase += args[i]; + } + CAHManager::getInstance()->runActionHandler("emote", NULL, "nb=0|behav=255|custom_phrase="+emotePhrase); + return true; } - for(uint i = 1; i < args.size(); ++i ) - { - emotePhrase += " "; - emotePhrase += args[i]; - } - CAHManager::getInstance()->runActionHandler("emote", NULL, "nb=0|behav=255|custom_phrase="+emotePhrase); - return true; - } - return false; -} - -NLMISC_COMMAND(emote, "emote command (1)", "") -{ - if (args.size() < 1) return false; - - CInterfaceManager *pIM = CInterfaceManager::getInstance(); - if( pIM ) - { - string emotePhrase; - if( args.size() > 0 ) - { - emotePhrase = args[0]; - } - for(uint i = 1; i < args.size(); ++i ) - { - emotePhrase += " "; - emotePhrase += args[i]; - } - CAHManager::getInstance()->runActionHandler("emote", NULL, "nb=0|behav=255|custom_phrase="+emotePhrase); - return true; - } - return false; -} - -NLMISC_COMMAND(m, "emote command", "") -{ - if (args.size() < 1) return false; - - CInterfaceManager *pIM = CInterfaceManager::getInstance(); - if( pIM ) - { - string emotePhrase; - if( args.size() > 0 ) - { - emotePhrase = args[0]; - } - for(uint i = 1; i < args.size(); ++i ) - { - emotePhrase += " "; - emotePhrase += args[i]; - } - CAHManager::getInstance()->runActionHandler("emote", NULL, "nb=0|behav=255|custom_phrase="+emotePhrase); - return true; - } - return false; + return false; } NLMISC_COMMAND(me, "emote command", "") { - if (args.size() < 1) return false; + if (args.size() < 1) return false; - CInterfaceManager *pIM = CInterfaceManager::getInstance(); - if( pIM ) - { - string emotePhrase; - if( args.size() > 0 ) + CInterfaceManager *pIM = CInterfaceManager::getInstance(); + if( pIM ) { - emotePhrase = args[0]; + string emotePhrase; + if( args.size() > 0 ) + { + emotePhrase = args[0]; + } + for(uint i = 1; i < args.size(); ++i ) + { + emotePhrase += " "; + emotePhrase += args[i]; + } + CAHManager::getInstance()->runActionHandler("emote", NULL, "nb=0|behav=255|custom_phrase="+emotePhrase); + return true; } - for(uint i = 1; i < args.size(); ++i ) - { - emotePhrase += " "; - emotePhrase += args[i]; - } - CAHManager::getInstance()->runActionHandler("emote", NULL, "nb=0|behav=255|custom_phrase="+emotePhrase); - return true; - } - return false; + return false; } +NLMISC_COMMAND(emote, "emote command", "") +{ + if (args.size() < 1) return false; + + CInterfaceManager *pIM = CInterfaceManager::getInstance(); + if( pIM ) + { + string emotePhrase; + if( args.size() > 0 ) + { + emotePhrase = args[0]; + } + for(uint i = 1; i < args.size(); ++i ) + { + emotePhrase += " "; + emotePhrase += args[i]; + } + CAHManager::getInstance()->runActionHandler("emote", NULL, "nb=0|behav=255|custom_phrase="+emotePhrase); + return true; + } + return false; +} + +NLMISC_COMMAND(m, "emote command", "") +{ + if (args.size() < 1) return false; + + CInterfaceManager *pIM = CInterfaceManager::getInstance(); + if( pIM ) + { + string emotePhrase; + if( args.size() > 0 ) + { + emotePhrase = args[0]; + } + for(uint i = 1; i < args.size(); ++i ) + { + emotePhrase += " "; + emotePhrase += args[i]; + } + CAHManager::getInstance()->runActionHandler("emote", NULL, "nb=0|behav=255|custom_phrase="+emotePhrase); + return true; + } + return false; +} + + NLMISC_COMMAND(guildmotd, "Set or see the guild message of the day","") { - CBitMemStream out; - if (!GenericMsgHeaderMngr.pushNameToStream("COMMAND:GUILDMOTD", out)) - return false; + CBitMemStream out; + if (!GenericMsgHeaderMngr.pushNameToStream("COMMAND:GUILDMOTD", out)) + return false; - string gmotd; - if( args.size() > 0 ) - { - gmotd = args[0]; - } - for(uint i = 1; i < args.size(); ++i ) - { - gmotd += " "; - gmotd += args[i]; - } + string gmotd; + if( args.size() > 0 ) + { + gmotd = args[0]; + } + for(uint i = 1; i < args.size(); ++i ) + { + gmotd += " "; + gmotd += args[i]; + } - out.serial (gmotd); - NetMngr.push (out); + out.serial (gmotd); + NetMngr.push (out); - return true; + return true; } NLMISC_COMMAND(time, "Shows information about the current time", "") { - const uint8 size = 50; - char cs_local[size]; - char cs_utc[size]; - time_t date; - time(&date); - struct tm *tm; - tm = localtime(&date); - strftime(cs_local, size, "%X", tm); - tm = gmtime(&date); - strftime(cs_utc, size, "%X", tm); + const uint8 size = 50; + char cs_local[size]; + char cs_utc[size]; + time_t date; + time(&date); + struct tm *tm; + tm = localtime(&date); + strftime(cs_local, size, "%X", tm); + tm = gmtime(&date); + strftime(cs_utc, size, "%X", tm); - ucstring msg = CI18N::get("uiCurrentLocalAndUtcTime"); - strFindReplace(msg, "%local", cs_local); - strFindReplace(msg, "%utc", cs_utc); - CInterfaceManager::getInstance()->displaySystemInfo(msg, "AROUND"); - return true; + ucstring msg = CI18N::get("uiCurrentLocalAndUtcTime"); + strFindReplace(msg, "%local", cs_local); + strFindReplace(msg, "%utc", cs_utc); + CInterfaceManager::getInstance()->displaySystemInfo(msg, "AROUND"); + return true; } -NLMISC_COMMAND(easteregg_siela1915.khanat, "Miscellaneous", "") - { - CInterfaceManager::getInstance()->displaySystemInfo("Siela1915 blesses you..."); +NLMISC_COMMAND(easteregg_siela1915_khanat, "Miscellaneous", "") +{ + string stext = "Siela1915 blesses you..."; + ucstring ucstext = ucstring(stext); + CInterfaceManager::getInstance()->displaySystemInfo(ucstext, "AROUND"); return true; - } +} diff --git a/code/ryzom/client/unix/khanat_128x128.png b/code/ryzom/client/unix/khanat_128x128.png new file mode 100644 index 0000000000000000000000000000000000000000..b3a682194c48249d7c37ee478cbc1688fa9b9a99 GIT binary patch literal 19082 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 literal 0 HcmV?d00001 diff --git a/code/ryzom/client/unix/khanat_24x24.png b/code/ryzom/client/unix/khanat_24x24.png new file mode 100644 index 0000000000000000000000000000000000000000..5dba76dad8bd577d55b88190c20a1bb2fa5588bc GIT binary patch literal 2361 zcmZvedpy(s7ssdErrae&mXvavDaFj(Z(**}gfz=#n2imSTNJvvL{Yhf+Cp+^M3gAG zUnVJ~M8#;Edrcv~t@?hyzuWuqc;C+FbuQ2I{^xVv31KZNq96hQ07PwVEL^y|9B&E> za@X-FqZRJPM|80^161}a&Tub4f{h0e0Fe2@n|xtcQ;u>4JyT#QBlXATll_ln5mosr*tvxo4gktOEKaAq5+$pd6e)=J;?wke>EI zZ5#8Kap&HQR02sP0u&66ii*;XI-rdY4*)|93=F_Jx?o*hEv`a~ z7#&JNleI#LyMG7yD~^R95fhFjkg)hr5HBv;7au_~Qc>Y0`g{DT6G!+vQ7G{b6_*c8 zMiamgZ5{Ccb0T5=|0(Z3ym()JyZxg2oeaip4b(i`4^6^{yW#O6a2^phG?<7%6a08w zFz|mX{;3qk3kh`$$NF(uc|>ps4E#T~KYAFLhx>2%zkB=3%55%Ogq!KFhk}d9^&n9I zfRK=_g{hm3XqtN*!EJb(F(;1IT%X6XKGY?(SSPVbALx4nVd+`@w)j|L&Y-Pa;Gl{v zAolk4K47 zhut=&?FV`bniylmcm}g@Np?KJMRcID;s>=)wroKjaO6b^f^Xb*OUofwD?MVrek8}? zV{;euGG1aRY1{tI3dMV1UBqLQsrsS&i096?nO>;Sk-R~QRbZhWk>g|iLd}QP2~$ZP1D;|G z_3WNBi#wK|w~{t_8JfVNNM_F*HSo%hIYyU`(X_WSQ!ikyc~eHSvL~O+-uM!Xm9M0l z%=R75Gf@*5^`6a1nZuO#w;oV`I%Lm}uupZJ*e3^su&67$B}L;}U`5W0itX+_OHd7~ zL^ToEGMzK#UE2^#XNu|v1$oatS+5HqNA*0h0|Clv3(Pg!FmF|*P1TLcGAmqM!4xMi zlzPQ^iy7Ma2DC?~vS2~Qp53P1$$Du__IvVjzoCYZWa9At6ua4J@w3+ z-k}osR-`&WX7`C?wwd|pJm;srM6tW>3y1j=x153HjKX9j;9e!SYO zxjMK$U_AK2xVE}-wgX>i;2Pt5yzKU+jF@|^Cq||sW5TViJBYoqrVu$7tB63lVNYnI zXi+7tqBdGtRu&`?{JllQu)Gh{u^t|{eOTWq+k}zR9W>B^#vqZSDfNg~q$*V1GOOzV z4JKX%UzvVBQ8_I5)HLTheaBD!Xu_ThM`^j^Fb&W4)NI;bsaF)S7Cr=)Kc7!|>{#F} z$t{AVTaJ~p6e_&X9He{B!}+(dQ_E^d4R-^p!`nuwZpaC}w5+KqM@Y~Gh0If5O4HkP zOCg&PVyzh28QauM%F^CDSM8E)Os)tkg;}2cYMgfpiw2>;4_B){*R49~~V! zskEeowMk_TU~6@T;@#9`=cM?I@5VX~##oL^qT#0=!_CK+6OQ_gYvQ_U5==Zw4u-a8B1 z0u9AEoIAu6bY_|yQhQ>>D;N%o_#U+UDdorg3sdaiMsMwU_RO7h_}U%g3>n$&op0-a z0u1H;tYxQ{7S3*W%eCOa>5xkS-IG19FKOL7qd{wE?-D?MRIbtTP>Zq5)BIcx>s?Ac zz9vzGWgFS0b)58=Kdvb3myxbUq9m7mDR7HcjHHjQjz}tQ+YZr{H!bVRfuIgKz+b<2G+9IFZFY{)M5%*y;Np9+4Rd(UdilOrLLKx_%M26DL^ zB>i-uc$X@DZ7qLCXAcgC*MySD^A}Z`aM9z`MbFcZL*1iQ53wH9B$=kaBiDO;AU8Ic zB%njFi*=jw62-q;c>8Pmo^jU8Roz%T<|9TBXC7&@9@6Sx@flW*KT zkD9z3pCS0I+}xKhYrAjWycs*pc4;&ZVlK!( zzP`?s>^*&}SfRo}U>5OQ$R}CTN$OeuPu*RF3L`Y4Ce{W_9BW0B>hE5TBka7+x0dkD zEy-Dj_IlpGtgJs|%-2DKmY`IBu4~*kqpd5yZ~9$h>INWeb>Wlx88tNTf5z4lVNq#z GBI#eF{4$CF literal 0 HcmV?d00001 diff --git a/code/ryzom/client/unix/khanat_256x256.png b/code/ryzom/client/unix/khanat_256x256.png new file mode 100644 index 0000000000000000000000000000000000000000..97647d96176bde688c4891f6043384fc021c6737 GIT binary patch literal 40094 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 DFHBth literal 0 HcmV?d00001 diff --git a/code/ryzom/client/unix/khanat_32x32.png b/code/ryzom/client/unix/khanat_32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..42716b532bd6beb9af0777ee181dce10b7f23cbf GIT binary patch literal 3404 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 literal 0 HcmV?d00001 diff --git a/code/ryzom/client/unix/khanat_64x64.png b/code/ryzom/client/unix/khanat_64x64.png new file mode 100644 index 0000000000000000000000000000000000000000..67dec3e2d7d8c9102d5bd8af6f9e7c126c2e5905 GIT binary patch literal 8468 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 literal 0 HcmV?d00001 diff --git a/code/ryzom/client/unix/khanat_logo_color.png b/code/ryzom/client/unix/khanat_logo_color.png new file mode 100644 index 0000000000000000000000000000000000000000..edb9b0e72b9a2c9b6c9f11d385d1d00772a7134a GIT binary patch literal 63092 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 KZ@uY6J^p{N