SSLContext* CIMServer::_getSSLContext() { PEG_METHOD_ENTER(TRC_SERVER, "CIMServer::_getSSLContext()"); static const String PROPERTY_NAME__SSL_CERT_FILEPATH = "sslCertificateFilePath"; static const String PROPERTY_NAME__SSL_KEY_FILEPATH = "sslKeyFilePath"; static const String PROPERTY_NAME__SSL_TRUST_STORE = "sslTrustStore"; static const String PROPERTY_NAME__SSL_CRL_STORE = "crlStore"; static const String PROPERTY_NAME__SSL_CLIENT_VERIFICATION = "sslClientVerificationMode"; static const String PROPERTY_NAME__SSL_AUTO_TRUST_STORE_UPDATE = "enableSSLTrustStoreAutoUpdate"; static const String PROPERTY_NAME__SSL_TRUST_STORE_USERNAME = "******"; static const String PROPERTY_NAME__HTTP_ENABLED = "enableHttpConnection"; static const String PROPERTY_NAME__SSL_CIPHER_SUITE = "sslCipherSuite"; static const String PROPERTY_NAME__SSL_COMPATIBILITY = "sslBackwardCompatibility"; String verifyClient; String trustStore; SSLContext* sslContext = 0; // // Get a config manager instance // ConfigManager* configManager = ConfigManager::getInstance(); // Note that if invalid values were set for either sslKeyFilePath, // sslCertificateFilePath, crlStore or sslTrustStore, the invalid // paths would have been detected in SecurityPropertyOwner and // terminated the server startup. This happens regardless of whether // or not HTTPS is enabled (not a great design, but that seems to // be how other properties are validated as well) // // Get the sslClientVerificationMode property from the Config // Manager. // verifyClient = configManager->getCurrentValue( PROPERTY_NAME__SSL_CLIENT_VERIFICATION); // // Get the sslTrustStore property from the Config Manager. // trustStore = configManager->getCurrentValue( PROPERTY_NAME__SSL_TRUST_STORE); if (trustStore != String::EMPTY) { trustStore = ConfigManager::getHomedPath(trustStore); } PEG_TRACE((TRC_SERVER, Tracer::LEVEL4,"Server trust store name: %s", (const char*)trustStore.getCString())); // // Get the sslTrustStoreUserName property from the Config Manager. // String trustStoreUserName; trustStoreUserName = configManager->getCurrentValue( PROPERTY_NAME__SSL_TRUST_STORE_USERNAME); if (!String::equal(verifyClient, "disabled")) { // // 'required' and 'optional' settings must have a valid truststore // if (trustStore == String::EMPTY) { MessageLoaderParms parms( "Pegasus.Server.SSLContextManager." "SSL_CLIENT_VERIFICATION_EMPTY_TRUSTSTORE", "The \"sslTrustStore\" configuration property must be set " "if \"sslClientVerificationMode\" is 'required' or " "'optional'."); PEG_METHOD_EXIT(); throw SSLException(parms); } #ifdef PEGASUS_DISABLE_LOCAL_DOMAIN_SOCKET // // ATTN: 'required' setting must have http port enabled. // If only https is enabled, and a call to shutdown the // cimserver is given, the call will hang and a forced shutdown // will ensue. This is because the CIMClient::connectLocal call // cannot specify a certificate for authentication against // the local server. This limitation is being investigated. // See Bugzilla 2995. // if (String::equal(verifyClient, "required")) { if (!ConfigManager::parseBooleanValue( configManager->getCurrentValue( PROPERTY_NAME__HTTP_ENABLED))) { MessageLoaderParms parms( "Pegasus.Server.SSLContextManager." "INVALID_CONF_HTTPS_REQUIRED", "The \"sslClientVerificationMode\" property cannot be " "set to \"required\" if HTTP is disabled, as the " "cimserver will be unable to properly shutdown. " "The recommended course of action is to change " "the property value to \"optional\"."); PEG_METHOD_EXIT(); throw SSLException(parms); } } #endif // // A truststore username must be specified if // sslClientVerificationMode is enabled and the truststore is a // single CA file. If the truststore is a directory, then the // CertificateProvider should be used to register users with // certificates. // if (trustStore != String::EMPTY) { if (!FileSystem::exists(trustStore)) { MessageLoaderParms parms( "Pegasus.Server.SSLContextManager." "COULD_NOT_ACCESS_TRUST_STORE", "Could not access the trust store." "Check the permissions of the truststore path \"$0\".", trustStore); PEG_METHOD_EXIT(); throw SSLException(parms); } if (!FileSystem::isDirectory(trustStore)) { if (trustStoreUserName == String::EMPTY) { MessageLoaderParms parms( "Pegasus.Server.SSLContextManager." "SSL_CLIENT_VERIFICATION_EMPTY_USERNAME", "The \"sslTrustStoreUserName\" property must specify a " "valid username if \"sslClientVerificationMode\" " "is 'required' or 'optional' and the truststore is " "a single CA file. To register individual " "certificates to users, you must use a truststore " "directory along with the CertificateProvider."); PEG_METHOD_EXIT(); throw SSLException(parms); } } } } #ifdef PEGASUS_ENABLE_SSL_CRL_VERIFICATION // // Get the crlStore property from the Config Manager. // String crlStore = configManager->getCurrentValue( PROPERTY_NAME__SSL_CRL_STORE); if (crlStore != String::EMPTY) { crlStore = ConfigManager::getHomedPath(crlStore); } #else String crlStore; #endif // // Get the sslCertificateFilePath property from the Config Manager. // String certPath; certPath = ConfigManager::getHomedPath( configManager->getCurrentValue(PROPERTY_NAME__SSL_CERT_FILEPATH)); // // Get the sslKeyFilePath property from the Config Manager. // String keyPath; keyPath = ConfigManager::getHomedPath( configManager->getCurrentValue(PROPERTY_NAME__SSL_KEY_FILEPATH)); String randFile; #ifdef PEGASUS_SSL_RANDOMFILE // NOTE: It is technically not necessary to set up a random file on // the server side, but it is easier to use a consistent interface // on the client and server than to optimize out the random file on // the server side. randFile = ConfigManager::getHomedPath(PEGASUS_SSLSERVER_RANDOMFILE); #endif // // Get the cipherSuite property from the Config Manager. // String cipherSuite = configManager->getCurrentValue( PROPERTY_NAME__SSL_CIPHER_SUITE); PEG_TRACE((TRC_SERVER, Tracer::LEVEL4, "Cipher suite is %s", (const char*)cipherSuite.getCString())); Boolean sslCompatibility = ConfigManager::parseBooleanValue( configManager->getCurrentValue( PROPERTY_NAME__SSL_COMPATIBILITY)); // // Create the SSLContext defined by the configuration properties // if (String::equal(verifyClient, "required")) { PEG_TRACE_CSTRING(TRC_SERVER, Tracer::LEVEL3, "SSL Client verification REQUIRED."); _sslContextMgr->createSSLContext( trustStore, certPath, keyPath, crlStore, false, randFile, cipherSuite,sslCompatibility); } else if (String::equal(verifyClient, "optional")) { PEG_TRACE_CSTRING(TRC_SERVER, Tracer::LEVEL3, "SSL Client verification OPTIONAL."); _sslContextMgr->createSSLContext( trustStore, certPath, keyPath, crlStore, true, randFile, cipherSuite,sslCompatibility); } else if (String::equal(verifyClient, "disabled") || verifyClient == String::EMPTY) { PEG_TRACE_CSTRING(TRC_SERVER, Tracer::LEVEL3, "SSL Client verification DISABLED."); _sslContextMgr->createSSLContext( String::EMPTY, certPath, keyPath, crlStore, false, randFile, cipherSuite,sslCompatibility); } sslContext = _sslContextMgr->getSSLContext(); try { sslContext->_validateCertificate(); } catch (SSLException& e) { Logger::put( Logger::STANDARD_LOG, System::CIMSERVER, Logger::WARNING, e.getMessage()); } PEG_METHOD_EXIT(); return sslContext; }
MainWindow::MainWindow() : m_workspace( NULL ), m_templatesMenu( NULL ), m_recentlyOpenedProjectsMenu( NULL ), m_toolsMenu( NULL ), m_autoSaveTimer( this ), m_viewMenu( NULL ), m_metronomeToggle( 0 ), m_session( Normal ) { setAttribute( Qt::WA_DeleteOnClose ); QWidget * main_widget = new QWidget( this ); QVBoxLayout * vbox = new QVBoxLayout( main_widget ); vbox->setSpacing( 0 ); vbox->setMargin( 0 ); QWidget * w = new QWidget( main_widget ); QHBoxLayout * hbox = new QHBoxLayout( w ); hbox->setSpacing( 0 ); hbox->setMargin( 0 ); SideBar * sideBar = new SideBar( Qt::Vertical, w ); QSplitter * splitter = new QSplitter( Qt::Horizontal, w ); splitter->setChildrenCollapsible( false ); ConfigManager* confMgr = ConfigManager::inst(); emit initProgress(tr("Preparing plugin browser")); sideBar->appendTab( new PluginBrowser( splitter ) ); emit initProgress(tr("Preparing file browsers")); sideBar->appendTab( new FileBrowser( confMgr->userProjectsDir() + "*" + confMgr->factoryProjectsDir(), "*.mmp *.mmpz *.xml *.mid", tr( "My Projects" ), embed::getIconPixmap( "project_file" ).transformed( QTransform().rotate( 90 ) ), splitter, false, true ) ); sideBar->appendTab( new FileBrowser( confMgr->userSamplesDir() + "*" + confMgr->factorySamplesDir(), "*", tr( "My Samples" ), embed::getIconPixmap( "sample_file" ).transformed( QTransform().rotate( 90 ) ), splitter, false, true ) ); sideBar->appendTab( new FileBrowser( confMgr->userPresetsDir() + "*" + confMgr->factoryPresetsDir(), "*.xpf *.cs.xml *.xiz", tr( "My Presets" ), embed::getIconPixmap( "preset_file" ).transformed( QTransform().rotate( 90 ) ), splitter , false, true ) ); sideBar->appendTab( new FileBrowser( QDir::homePath(), "*", tr( "My Home" ), embed::getIconPixmap( "home" ).transformed( QTransform().rotate( 90 ) ), splitter, false, false ) ); QStringList root_paths; QString title = tr( "Root directory" ); bool dirs_as_items = false; #ifdef LMMS_BUILD_APPLE title = tr( "Volumes" ); root_paths += "/Volumes"; #elif defined(LMMS_BUILD_WIN32) title = tr( "My Computer" ); dirs_as_items = true; #endif #if ! defined(LMMS_BUILD_APPLE) QFileInfoList drives = QDir::drives(); for( const QFileInfo & drive : drives ) { root_paths += drive.absolutePath(); } #endif sideBar->appendTab( new FileBrowser( root_paths.join( "*" ), "*", title, embed::getIconPixmap( "computer" ).transformed( QTransform().rotate( 90 ) ), splitter, dirs_as_items) ); m_workspace = new QMdiArea( splitter ); // Load background emit initProgress(tr("Loading background artwork")); QString bgArtwork = ConfigManager::inst()->backgroundArtwork(); QImage bgImage; if( !bgArtwork.isEmpty() ) { bgImage = QImage( bgArtwork ); } if( !bgImage.isNull() ) { m_workspace->setBackground( bgImage ); } else { m_workspace->setBackground( Qt::NoBrush ); } m_workspace->setOption( QMdiArea::DontMaximizeSubWindowOnActivation ); m_workspace->setHorizontalScrollBarPolicy( Qt::ScrollBarAsNeeded ); m_workspace->setVerticalScrollBarPolicy( Qt::ScrollBarAsNeeded ); hbox->addWidget( sideBar ); hbox->addWidget( splitter ); // create global-toolbar at the top of our window m_toolBar = new QWidget( main_widget ); m_toolBar->setObjectName( "mainToolbar" ); m_toolBar->setFixedHeight( 64 ); m_toolBar->move( 0, 0 ); // add layout for organizing quite complex toolbar-layouting m_toolBarLayout = new QGridLayout( m_toolBar/*, 2, 1*/ ); m_toolBarLayout->setMargin( 0 ); m_toolBarLayout->setSpacing( 0 ); vbox->addWidget( m_toolBar ); vbox->addWidget( w ); setCentralWidget( main_widget ); m_updateTimer.start( 1000 / 20, this ); // 20 fps if( ConfigManager::inst()->value( "ui", "enableautosave" ).toInt() ) { // connect auto save connect(&m_autoSaveTimer, SIGNAL(timeout()), this, SLOT(autoSave())); m_autoSaveInterval = ConfigManager::inst()->value( "ui", "saveinterval" ).toInt() < 1 ? DEFAULT_AUTO_SAVE_INTERVAL : ConfigManager::inst()->value( "ui", "saveinterval" ).toInt(); // The auto save function mustn't run until there is a project // to save or it will run over recover.mmp if you hesitate at the // recover messagebox for a minute. It is now started in main. // See autoSaveTimerReset() in MainWindow.h } connect( Engine::getSong(), SIGNAL( playbackStateChanged() ), this, SLOT( updatePlayPauseIcons() ) ); }
void SEditorColourSet::Load() { // no need for syntax highlighting if batch building if (Manager::IsBatchBuild()) return; static bool s_notifiedUser = false; wxString key; ConfigManager* cfg = Manager::Get()->GetConfigManager(_T("editor")); // read the theme name m_Name = cfg->Read(_T("/colour_sets/") + m_Name + _T("/name"), m_Name); int x = 0; for (SOptionSetsMap::iterator it = m_Sets.begin(); it != m_Sets.end(); ++it) { if (it->first == HL_NONE || it->first == HL_AUTO) continue; // look for old-style configuration key.Clear(); key << _T("/colour_sets/") << m_Name << _T("/set") << wxString::Format(_T("%d"), x++); if (cfg->Exists(key + _T("/name"))) { // old-style configuration // delete it and tell the user about it cfg->DeleteSubPath(key); if (!s_notifiedUser) { cbMessageBox(_("The way editor syntax highlighting configuration is saved, has changed.\n" "Syntax highlighting for all supported languages will revert to defaults now.\n" "We 're sorry for the inconvenience..."), _("Information"), wxICON_INFORMATION); s_notifiedUser = true; } continue; } // make sure we didn't create it accidentally cfg->DeleteSubPath(key); // new-style configuration key key.Clear(); key << _T("/colour_sets/") << m_Name << _T('/') << it->first; if (!cfg->Exists(key + _T("/name"))) { // make sure we didn't create it accidentally cfg->DeleteSubPath(key); continue; } for (unsigned int i = 0; i < it->second.m_Colours.GetCount(); ++i) { SOptionColour* opt = it->second.m_Colours.Item(i); if (!opt) continue; wxString tmpKey; tmpKey << key << _T("/style") << wxString::Format(_T("%d"), i); if (cfg->Exists(tmpKey + _T("/name"))) opt->name = cfg->Read(tmpKey + _T("/name")); else { // make sure we didn't create it accidentally cfg->DeleteSubPath(tmpKey); continue; } if (cfg->Exists(tmpKey + _T("/fore"))) opt->fore = cfg->ReadColour(tmpKey + _T("/fore"), opt->fore); if (cfg->Exists(tmpKey + _T("/back"))) opt->back = cfg->ReadColour(tmpKey + _T("/back"), opt->back); if (cfg->Exists(tmpKey + _T("/bold"))) opt->bold = cfg->ReadBool(tmpKey + _T("/bold"), opt->bold); if (cfg->Exists(tmpKey + _T("/italics"))) opt->italics = cfg->ReadBool(tmpKey + _T("/italics"), opt->italics); if (cfg->Exists(tmpKey + _T("/underlined"))) opt->underlined = cfg->ReadBool(tmpKey + _T("/underlined"), opt->underlined); if (cfg->Exists(tmpKey + _T("/isStyle"))) opt->isStyle = cfg->ReadBool(tmpKey + _T("/isStyle"), opt->isStyle); } wxString tmpkey; for (int i = 0; i <= wxSCI_KEYWORDSET_MAX; ++i) { tmpkey.Printf(_T("%s/editor/keywords/set%d"), key.c_str(), i); if (cfg->Exists(tmpkey)) it->second.m_Keywords[i] = cfg->Read(tmpkey, wxEmptyString); } tmpkey.Printf(_T("%s/editor/filemasks"), key.c_str()); if (cfg->Exists(tmpkey)) it->second.m_FileMasks = GetArrayFromString(cfg->Read(tmpkey, wxEmptyString), _T(",")); } }
void Commands::reloadInfo(Player& player, const std::string& param) { std::string tmpParam = asLowerCaseString(param); if (tmpParam == "action" || tmpParam == "actions") { g_actions->reload(); player.sendTextMessage(MESSAGE_STATUS_CONSOLE_BLUE, "Reloaded actions."); } else if (tmpParam == "config" || tmpParam == "configuration") { g_config.reload(); player.sendTextMessage(MESSAGE_STATUS_CONSOLE_BLUE, "Reloaded config."); } else if (tmpParam == "command" || tmpParam == "commands") { reload(); player.sendTextMessage(MESSAGE_STATUS_CONSOLE_BLUE, "Reloaded commands."); } else if (tmpParam == "creaturescript" || tmpParam == "creaturescripts") { g_creatureEvents->reload(); player.sendTextMessage(MESSAGE_STATUS_CONSOLE_BLUE, "Reloaded creature scripts."); } else if (tmpParam == "monster" || tmpParam == "monsters") { g_monsters.reload(); player.sendTextMessage(MESSAGE_STATUS_CONSOLE_BLUE, "Reloaded monsters."); } else if (tmpParam == "move" || tmpParam == "movement" || tmpParam == "movements" || tmpParam == "moveevents" || tmpParam == "moveevent") { g_moveEvents->reload(); player.sendTextMessage(MESSAGE_STATUS_CONSOLE_BLUE, "Reloaded movements."); } else if (tmpParam == "npc" || tmpParam == "npcs") { Npcs::reload(); player.sendTextMessage(MESSAGE_STATUS_CONSOLE_BLUE, "Reloaded npcs."); } else if (tmpParam == "raid" || tmpParam == "raids") { g_game.raids.reload(); g_game.raids.startup(); player.sendTextMessage(MESSAGE_STATUS_CONSOLE_BLUE, "Reloaded raids."); } else if (tmpParam == "spell" || tmpParam == "spells") { g_spells->reload(); g_monsters.reload(); player.sendTextMessage(MESSAGE_STATUS_CONSOLE_BLUE, "Reloaded spells."); } else if (tmpParam == "talk" || tmpParam == "talkaction" || tmpParam == "talkactions") { g_talkActions->reload(); player.sendTextMessage(MESSAGE_STATUS_CONSOLE_BLUE, "Reloaded talk actions."); } else if (tmpParam == "items") { Item::items.reload(); player.sendTextMessage(MESSAGE_STATUS_CONSOLE_BLUE, "Reloaded items."); } else if (tmpParam == "weapon" || tmpParam == "weapons") { g_weapons->reload(); g_weapons->loadDefaults(); player.sendTextMessage(MESSAGE_STATUS_CONSOLE_BLUE, "Reloaded weapons."); } else if (tmpParam == "quest" || tmpParam == "quests") { g_game.quests.reload(); player.sendTextMessage(MESSAGE_STATUS_CONSOLE_BLUE, "Reloaded quests."); } else if (tmpParam == "mount" || tmpParam == "mounts") { g_game.mounts.reload(); player.sendTextMessage(MESSAGE_STATUS_CONSOLE_BLUE, "Reloaded mounts."); } else if (tmpParam == "globalevents" || tmpParam == "globalevent") { g_globalEvents->reload(); player.sendTextMessage(MESSAGE_STATUS_CONSOLE_BLUE, "Reloaded globalevents."); } else if (tmpParam == "events") { g_events->load(); player.sendTextMessage(MESSAGE_STATUS_CONSOLE_BLUE, "Reloaded events."); } else if (tmpParam == "chat" || tmpParam == "channel" || tmpParam == "chatchannels") { g_chat->load(); player.sendTextMessage(MESSAGE_STATUS_CONSOLE_BLUE, "Reloaded chatchannels."); } else if (tmpParam == "global") { g_luaEnvironment.loadFile("data/global.lua"); player.sendTextMessage(MESSAGE_STATUS_CONSOLE_BLUE, "Reloaded global.lua."); } else { player.sendTextMessage(MESSAGE_STATUS_CONSOLE_BLUE, "Reload type not found."); } lua_gc(g_luaEnvironment.getLuaState(), LUA_GCCOLLECT, 0); }
bool EncodingDetector::DetectEncoding(const wxByte* buffer, size_t size, bool ConvertToWxString) { ConfigManager* cfgMgr = Manager::Get()->GetConfigManager(_T("editor")); wxString encname = cfgMgr->Read(_T("/default_encoding")); if (cfgMgr->ReadInt(_T("/default_encoding/use_option"), 0) == 1) { // Bypass C::B's auto-detection m_Encoding = wxFontMapper::Get()->CharsetToEncoding(encname, false); if(m_UseLog) { wxString msg; msg.Printf(_T("Warning: bypassing E::B's auto-detection!\n" "Encoding requested is: %s (ID: %d)"), wxFontMapper::Get()->GetEncodingDescription(m_Encoding).c_str(), m_Encoding); Manager::Get()->GetLogManager()->DebugLog(msg); } } else { if (!buffer) return false; if (size >= 4) { // BOM is max 4 bytes char buff[4] = {'\0'}; memcpy(buff, buffer, 4); if (memcmp(buff, "\xEF\xBB\xBF", 3) == 0) { m_UseBOM = true; m_BOMSizeInBytes = 3; m_Encoding = wxFONTENCODING_UTF8; } else if (memcmp(buff, "\x00\x00\xFE\xFF", 4) == 0) { m_UseBOM = true; m_BOMSizeInBytes = 4; m_Encoding = wxFONTENCODING_UTF32BE; } else if (memcmp(buff, "\x00\x00\xFF\xFE", 4) == 0) { // 00 00 FF FE UCS-4, unusual octet order BOM (2143) // X-ISO-10646-UCS-4-2143 can not (yet) be handled by wxWidgets m_Encoding = (wxFontEncoding)-1; } else if (memcmp(buff, "\xFF\xFE\x00\x00", 4) == 0) { m_UseBOM = true; m_BOMSizeInBytes = 4; m_Encoding = wxFONTENCODING_UTF32LE; } else if (memcmp(buff, "\xFE\xFF\x00\x00", 4) == 0) { // FE FF 00 00 UCS-4, unusual octet order BOM (3412) // X-ISO-10646-UCS-4-3412 can not (yet) be handled by wxWidgets m_Encoding = (wxFontEncoding)-1; } else if (memcmp(buff, "\xFE\xFF", 2) == 0) { m_UseBOM = true; m_BOMSizeInBytes = 2; m_Encoding = wxFONTENCODING_UTF16BE; } else if (memcmp(buff, "\xFF\xFE", 2) == 0) { m_UseBOM = true; m_BOMSizeInBytes = 2; m_Encoding = wxFONTENCODING_UTF16LE; } } if (m_UseBOM) { if(m_UseLog) { wxString msg; msg.Printf(_T("Detected encoding via BOM: %s (ID: %d)"), wxFontMapper::Get()->GetEncodingDescription(m_Encoding).c_str(), m_Encoding); Manager::Get()->GetLogManager()->DebugLog(msg); } } // Try our own detection for UTF-16 and UTF-32, the mozilla-version does not work without BOM else if ( !DetectUTF16((wxByte*)buffer, size) && !DetectUTF32((wxByte*)buffer, size) ) { // if we still have no results try mozilla's detection m_Encoding = wxFontMapper::Get()->CharsetToEncoding(DoIt((char*)buffer, size), false); if(m_Encoding == wxFONTENCODING_DEFAULT) { wxString enc_name = Manager::Get()->GetConfigManager(_T("editor"))->Read(_T("/default_encoding"), wxLocale::GetSystemEncodingName()); m_Encoding = wxFontMapper::GetEncodingFromName(enc_name); if(m_UseLog) { wxString msg; msg.Printf(_T("Text seems to be pure ASCII!\n" "We use user specified encoding: %s (ID: %d)"), wxFontMapper::Get()->GetEncodingDescription(m_Encoding).c_str(), m_Encoding); Manager::Get()->GetLogManager()->DebugLog(msg); } } if (m_Encoding < 0) { // Use user-specified one; as a fallback m_Encoding = wxFontMapper::Get()->CharsetToEncoding(encname, false); if(m_UseLog) { wxString msg; msg.Printf(_T("Warning: Using user specified encoding as fallback!\n" "Encoding fallback is: %s (ID: %d)"), wxFontMapper::Get()->GetEncodingDescription(m_Encoding).c_str(), m_Encoding); Manager::Get()->GetLogManager()->DebugLog(msg); } } m_UseBOM = false; m_BOMSizeInBytes = 0; } } if(m_UseLog) { wxString msg; msg.Printf(_T("Final encoding detected: %s (ID: %d)"), wxFontMapper::Get()->GetEncodingDescription(m_Encoding).c_str(), m_Encoding); Manager::Get()->GetLogManager()->DebugLog(msg); } if (ConvertToWxString) { ConvertToWxStr(buffer, size); } return true; } // end of DetectEncoding
uint64_t Creature::getGainedExperience(Creature* attacker) const { return (uint64_t)std::floor(getDamageRatio(attacker) * getLostExperience() * g_config.getNumber(ConfigManager::RATE_EXPERIENCE)); }
void Compiler::LoadSettings(const wxString& baseKey) { // before loading any compiler settings, keep the current settings safe // so we can compare them when saving: this way we can only save what's // different from the defaults MirrorCurrentSettings(); ConfigManager* cfg = Manager::Get()->GetConfigManager(_T("compiler")); // read settings version wxString version = cfg->Read(_T("settings_version")); bool versionMismatch = version != CompilerSettingsVersion; wxString tmp; // if using old-style keys (using integer IDs), notify user about the changes static bool saidAboutCompilerIDs = false; tmp.Printf(_T("%s/set%3.3d"), baseKey.c_str(), CompilerFactory::GetCompilerIndex(this) + 1); if (cfg->Exists(tmp + _T("/name"))) { if (!saidAboutCompilerIDs) { saidAboutCompilerIDs = true; cbMessageBox(_("Compilers now use unique names instead of integer IDs.\n" "Projects will be updated accordingly on load, mostly automatic."), _("Information"), wxICON_INFORMATION); } // at this point, we 'll be using the old style configuration to load settings } else // it's OK to use new style tmp.Printf(_T("%s/%s"), baseKey.c_str(), m_ID.c_str()); if (!cfg->Exists(tmp + _T("/name"))) return; wxString sep = wxFileName::GetPathSeparator(); m_Name = cfg->Read(tmp + _T("/name"), m_Name); m_MasterPath = cfg->Read(tmp + _T("/master_path"), m_MasterPath); m_ExtraPaths = MakeUniqueArray(GetArrayFromString(cfg->Read(tmp + _T("/extra_paths"), _T("")), _T(";")), true); m_Programs.C = cfg->Read(tmp + _T("/c_compiler"), m_Programs.C); m_Programs.CPP = cfg->Read(tmp + _T("/cpp_compiler"), m_Programs.CPP); m_Programs.LD = cfg->Read(tmp + _T("/linker"), m_Programs.LD); m_Programs.LIB = cfg->Read(tmp + _T("/lib_linker"), m_Programs.LIB); m_Programs.WINDRES = cfg->Read(tmp + _T("/res_compiler"), m_Programs.WINDRES); m_Programs.MAKE = cfg->Read(tmp + _T("/make"), m_Programs.MAKE); m_Programs.DBG = cfg->Read(tmp + _T("/debugger"), m_Programs.DBG); // set member variable containing the version string with the configurated toolchain executables, not only // with the default ones, otherwise we might have an empty version-string // Some MinGW installations do not includee "mingw32-gcc" !! SetVersionString(); SetCompilerOptions (GetArrayFromString(cfg->Read(tmp + _T("/compiler_options"), wxEmptyString))); SetLinkerOptions (GetArrayFromString(cfg->Read(tmp + _T("/linker_options"), wxEmptyString))); SetIncludeDirs (GetArrayFromString(cfg->Read(tmp + _T("/include_dirs"), wxEmptyString))); SetResourceIncludeDirs(GetArrayFromString(cfg->Read(tmp + _T("/res_include_dirs"), wxEmptyString))); SetLibDirs (GetArrayFromString(cfg->Read(tmp + _T("/library_dirs"), wxEmptyString))); SetLinkLibs (GetArrayFromString(cfg->Read(tmp + _T("/libraries"), wxEmptyString))); SetCommandsBeforeBuild(GetArrayFromString(cfg->Read(tmp + _T("/commands_before"), wxEmptyString))); SetCommandsAfterBuild (GetArrayFromString(cfg->Read(tmp + _T("/commands_after"), wxEmptyString))); for (int i = 0; i < ctCount; ++i) { wxArrayString keys = cfg->EnumerateSubPaths(tmp + _T("/macros/") + CommandTypeDescriptions[i]); for (size_t n = 0; n < keys.size(); ++n) { unsigned long index = 0; if (keys[n].Mid(4).ToULong(&index)) // skip 'tool' { while (index >= m_Commands[i].size()) m_Commands[i].push_back(CompilerTool()); CompilerTool& tool = m_Commands[i][index]; wxString key = wxString::Format(_T("%s/macros/%s/tool%lu/"), tmp.c_str(), CommandTypeDescriptions[i].c_str(), index); tool.command = cfg->Read(key + _T("command")); tool.extensions = cfg->ReadArrayString(key + _T("extensions")); tool.generatedFiles = cfg->ReadArrayString(key + _T("generatedFiles")); } } } // switches m_Switches.includeDirs = cfg->Read(tmp + _T("/switches/includes"), m_Switches.includeDirs); m_Switches.libDirs = cfg->Read(tmp + _T("/switches/libs"), m_Switches.libDirs); m_Switches.linkLibs = cfg->Read(tmp + _T("/switches/link"), m_Switches.linkLibs); m_Switches.defines = cfg->Read(tmp + _T("/switches/define"), m_Switches.defines); m_Switches.genericSwitch = cfg->Read(tmp + _T("/switches/generic"), m_Switches.genericSwitch); m_Switches.objectExtension = cfg->Read(tmp + _T("/switches/objectext"), m_Switches.objectExtension); m_Switches.needDependencies = cfg->ReadBool(tmp + _T("/switches/deps"), m_Switches.needDependencies); m_Switches.forceCompilerUseQuotes = cfg->ReadBool(tmp + _T("/switches/forceCompilerQuotes"), m_Switches.forceCompilerUseQuotes); m_Switches.forceLinkerUseQuotes = cfg->ReadBool(tmp + _T("/switches/forceLinkerQuotes"), m_Switches.forceLinkerUseQuotes); m_Switches.logging = (CompilerLoggingType)cfg->ReadInt(tmp + _T("/switches/logging"), m_Switches.logging); m_Switches.libPrefix = cfg->Read(tmp + _T("/switches/libPrefix"), m_Switches.libPrefix); m_Switches.libExtension = cfg->Read(tmp + _T("/switches/libExtension"), m_Switches.libExtension); m_Switches.linkerNeedsLibPrefix = cfg->ReadBool(tmp + _T("/switches/linkerNeedsLibPrefix"), m_Switches.linkerNeedsLibPrefix); m_Switches.linkerNeedsLibExtension = cfg->ReadBool(tmp + _T("/switches/linkerNeedsLibExtension"), m_Switches.linkerNeedsLibExtension); m_Switches.forceFwdSlashes = cfg->ReadBool(tmp + _T("/switches/forceFwdSlashes"), m_Switches.forceFwdSlashes); m_Switches.supportsPCH = cfg->ReadBool(tmp + _T("/switches/supportsPCH"), m_Switches.supportsPCH); m_Switches.PCHExtension = cfg->Read(tmp + _T("/switches/pchExtension"), m_Switches.PCHExtension); m_Switches.UseFlatObjects = cfg->ReadBool(tmp + _T("/switches/UseFlatObjects"), m_Switches.UseFlatObjects); m_Switches.UseFullSourcePaths = cfg->ReadBool(tmp + _T("/switches/UseFullSourcePaths"), m_Switches.UseFullSourcePaths); m_Switches.Use83Paths = cfg->ReadBool(tmp + _T("/switches/Use83Paths"), m_Switches.Use83Paths); // regexes // because we 're only saving changed regexes, we can't just iterate like before. // instead, we must iterate all child-keys and deduce the regex index number from // the key name wxArrayString keys = cfg->EnumerateSubPaths(tmp + _T("/regex/")); wxString group; long index = 0; for (size_t i = 0; i < keys.GetCount(); ++i) { wxString key = keys[i]; // reNNN if (!key.StartsWith(_T("re"))) continue; key.Remove(0, 2); if (!key.ToLong(&index, 10)) continue; // 'index' now holds the regex index. // read everything and either assign it to an existing regex // if the index exists, or add a new regex group.Printf(_T("%s/regex/re%3.3ld"), tmp.c_str(), index); if (!cfg->Exists(group+_T("/description"))) continue; RegExStruct rs; rs.desc = cfg->Read(group + _T("/description")); rs.lt = (CompilerLineType)cfg->ReadInt(group + _T("/type"), 0); rs.regex = cfg->Read(group + _T("/regex")); rs.msg[0 ] = cfg->ReadInt(group + _T("/msg1"), 0); rs.msg[1] = cfg->ReadInt(group + _T("/msg2"), 0); rs.msg[2] = cfg->ReadInt(group + _T("/msg3"), 0); rs.filename = cfg->ReadInt(group + _T("/filename"), 0); rs.line = cfg->ReadInt(group + _T("/line"), 0); if (index <= (long)m_RegExes.GetCount()) m_RegExes[index - 1] = rs; else m_RegExes.Add(rs); } // custom vars wxString configpath = tmp + _T("/custom_variables/"); UnsetAllVars(); wxArrayString list = cfg->EnumerateKeys(configpath); for (unsigned int i = 0; i < list.GetCount(); ++i) SetVar(list[i], cfg->Read(configpath + _T('/') + list[i]), false); if (versionMismatch) { wxString msg; msg << _("Some compiler settings defaults have changed in this version.\n" "It is recommended that you allow updating of your settings to the new defaults.\n" "Only disallow this if you don't want to lose any customizations you have done to this compiler's settings.\n\n" "Note that the only settings that are affected are those found in \"Advanced compiler options\"...\n\n" "Do you want to update your current settings to the new defaults?"); // don't ask if the compiler is not valid (i.e. not installed), just update if (!IsValid() || cbMessageBox(msg, m_Name, wxICON_QUESTION | wxYES_NO) == wxID_YES) { for (int i = 0; i < ctCount; ++i) m_Commands[i] = m_Mirror.Commands[i]; m_Switches = m_Mirror.Switches; m_Options = m_Mirror.Options; m_RegExes = m_Mirror.RegExes; } } }
void FormatterSettings::ApplyTo(astyle::ASFormatter& formatter) { ConfigManager* cfg = Manager::Get()->GetConfigManager(_T("astyle")); int style = cfg->ReadInt(_T("/style"), 0); switch (style) { case aspsAllman: // Allman (ANSI) formatter.setFormattingStyle(astyle::STYLE_ALLMAN); break; case aspsJava: // Java formatter.setFormattingStyle(astyle::STYLE_JAVA); break; case aspsKr: // K&R formatter.setFormattingStyle(astyle::STYLE_KandR); break; case aspsStroustrup: // Stroustrup formatter.setFormattingStyle(astyle::STYLE_STROUSTRUP); break; case aspsWhitesmith: // Whitesmith formatter.setFormattingStyle(astyle::STYLE_WHITESMITH); break; case aspsBanner: // Banner formatter.setFormattingStyle(astyle::STYLE_BANNER); break; case aspsGnu: // GNU formatter.setFormattingStyle(astyle::STYLE_GNU); break; case aspsLinux: // Linux formatter.setFormattingStyle(astyle::STYLE_LINUX); break; case aspsHorstmann: // Horstmann formatter.setFormattingStyle(astyle::STYLE_HORSTMANN); break; default: // Custom { bool value = cfg->ReadBool(_T("/force_tabs")); int spaceNum = cfg->ReadInt(_T("/indentation"), 4); if (cfg->ReadBool(_T("/use_tabs"))) { formatter.setTabIndentation(spaceNum, value); } else { formatter.setSpaceIndentation(spaceNum); } formatter.setClassIndent(cfg->ReadBool(_T("/indent_classes"))); formatter.setSwitchIndent(cfg->ReadBool(_T("/indent_switches"))); formatter.setCaseIndent(cfg->ReadBool(_T("/indent_case"))); formatter.setBracketIndent(cfg->ReadBool(_T("/indent_brackets"))); formatter.setBlockIndent(cfg->ReadBool(_T("/indent_blocks"))); formatter.setNamespaceIndent(cfg->ReadBool(_T("/indent_namespaces"))); formatter.setLabelIndent(cfg->ReadBool(_T("/indent_labels"))); formatter.setPreprocessorIndent(cfg->ReadBool(_T("/indent_preprocessor"))); wxString brackedFormatMode = cfg->Read(_T("/bracket_format_mode")); if (brackedFormatMode == _T("Attach")) { formatter.setBracketFormatMode(astyle::ATTACH_MODE); } else if (brackedFormatMode == _T("Break")) { formatter.setBracketFormatMode(astyle::BREAK_MODE); } else if (brackedFormatMode == _T("Linux")) { formatter.setBracketFormatMode(astyle::LINUX_MODE); } else if (brackedFormatMode == _T("Stroustrup")) { formatter.setBracketFormatMode(astyle::STROUSTRUP_MODE); } else { formatter.setBracketFormatMode(astyle::NONE_MODE); } wxString pointerAlign = cfg->Read(_T("/pointer_align")); if (pointerAlign == _T("Type")) { formatter.setPointerAlignment(astyle::ALIGN_TYPE); } else if (pointerAlign == _T("Middle")) { formatter.setPointerAlignment(astyle::ALIGN_MIDDLE); } else if (pointerAlign == _T("Name")) { formatter.setPointerAlignment(astyle::ALIGN_NAME); } else { formatter.setPointerAlignment(astyle::ALIGN_NONE); } formatter.setBreakClosingHeaderBracketsMode(cfg->ReadBool(_T("/break_closing"))); formatter.setBreakBlocksMode(cfg->ReadBool(_T("/break_blocks"))); formatter.setBreakElseIfsMode(cfg->ReadBool(_T("/break_elseifs"))); formatter.setOperatorPaddingMode(cfg->ReadBool(_T("/pad_operators"))); formatter.setParensOutsidePaddingMode(cfg->ReadBool(_T("/pad_parentheses_out"))); formatter.setParensInsidePaddingMode(cfg->ReadBool(_T("/pad_parentheses_in"))); formatter.setParensUnPaddingMode(cfg->ReadBool(_T("/unpad_parentheses"))); formatter.setSingleStatementsMode(!cfg->ReadBool(_T("/keep_complex"))); formatter.setBreakOneLineBlocksMode(!cfg->ReadBool(_T("/keep_blocks"))); formatter.setTabSpaceConversionMode(cfg->ReadBool(_T("/convert_tabs"))); formatter.setEmptyLineFill(cfg->ReadBool(_T("/fill_empty_lines"))); break; } } }
void ValueCallback::getMinMaxValues(Player* player, int32_t& min, int32_t& max, bool useCharges) const { //"onGetPlayerMinMaxValues"(...) if (m_scriptInterface->reserveScriptEnv()) { ScriptEnviroment* env = m_scriptInterface->getScriptEnv(); lua_State* L = m_scriptInterface->getLuaState(); if (!env->setCallbackId(m_scriptId, m_scriptInterface)) { return; } uint32_t cid = env->addThing(player); m_scriptInterface->pushFunction(m_scriptId); lua_pushnumber(L, cid); int32_t parameters = 1; bool isMagicFormula = false; switch (type) { case FORMULA_LEVELMAGIC: { //"onGetPlayerMinMaxValues"(cid, level, maglevel) lua_pushnumber(L, player->getLevel()); lua_pushnumber(L, player->getMagicLevel()); parameters += 2; isMagicFormula = true; break; } case FORMULA_SKILL: { //"onGetPlayerMinMaxValues"(cid, attackSkill, attackValue, attackFactor) Item* tool = player->getWeapon(); int32_t attackSkill = player->getWeaponSkill(tool); int32_t attackValue = 7; if (tool) { attackValue = tool->getAttack(); if (useCharges && tool->hasCharges() && g_config.getNumber(ConfigManager::REMOVE_WEAPON_CHARGES)) { int32_t newCharge = std::max(0, tool->getCharges() - 1); g_game.transformItem(tool, tool->getID(), newCharge); } } float attackFactor = player->getAttackFactor(); lua_pushnumber(L, attackSkill); lua_pushnumber(L, attackValue); lua_pushnumber(L, attackFactor); parameters += 3; break; } default: std::cout << "ValueCallback::getMinMaxValues - unknown callback type" << std::endl; return; break; } int size0 = lua_gettop(L); if (lua_pcall(L, parameters, 2 /*nReturnValues*/, 0) != 0) { LuaScriptInterface::reportError(NULL, LuaScriptInterface::popString(L)); } else { max = LuaScriptInterface::popNumber(L); min = LuaScriptInterface::popNumber(L); Vocation* vocation = player->getVocation(); if (isMagicFormula && vocation) { if (max > 0 && min > 0 && vocation->getHealingBaseDamage() != 1.0) { min = int32_t(min * vocation->getHealingBaseDamage()); max = int32_t(max * vocation->getHealingBaseDamage()); } else if (max < 0 && min < 0 && vocation->getMagicBaseDamage() != 1.0) { min = int32_t(min * vocation->getMagicBaseDamage()); max = int32_t(max * vocation->getMagicBaseDamage()); } } } if ((lua_gettop(L) + parameters /*nParams*/ + 1) != size0) { LuaScriptInterface::reportError(NULL, "Stack size changed!"); } env->resetCallback(); m_scriptInterface->releaseScriptEnv(); } else { std::cout << "[Error] Call stack overflow. ValueCallback::getMinMaxValues" << std::endl; return; } }
bool DatabaseManager::isDatabaseSetup() { Database* db = Database::getInstance(); std::ostringstream query; query << "SELECT `TABLE_NAME` FROM `information_schema`.`tables` WHERE `TABLE_SCHEMA` = " << db->escapeString(g_config.getString(ConfigManager::MYSQL_DB)); DBResult* result = db->storeQuery(query.str()); if (!result) { return false; } db->freeResult(result); return true; }
void PluginsConfigurationDlg::OnExport(wxCommandEvent& /*event*/) { wxListCtrl* list = XRCCTRL(*this, "lstPlugins", wxListCtrl); if (list->GetSelectedItemCount() == 0) return; ConfigManager* cfg = Manager::Get()->GetConfigManager(_T("plugins_configuration")); wxDirDialog dd(this, _("Select directory to export plugin"), cfg->Read(_T("/last_export_path")), wxDD_NEW_DIR_BUTTON); if (dd.ShowModal() != wxID_OK) return; cfg->Write(_T("/last_export_path"), dd.GetPath()); wxBusyCursor busy; wxProgressDialog pd(_("Exporting plugin(s)"), _T("A description wide enough for the dialog ;)"), list->GetSelectedItemCount(), this, wxPD_AUTO_HIDE | wxPD_APP_MODAL | wxPD_CAN_ABORT | wxPD_ELAPSED_TIME | wxPD_ESTIMATED_TIME | wxPD_REMAINING_TIME); int count = 0; long sel = -1; bool skip = false; bool confirmed = false; wxString failure; wxArrayString files; // avoid exporting different plugins from the same file twice while (true) { sel = list->GetNextItem(sel, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED); if (sel == -1) break; const PluginElement* elem = (const PluginElement*)list->GetItemData(sel); if (!elem && !elem->plugin) { failure << list->GetItemText(sel) << _T('\n'); continue; } // avoid duplicates if (files.Index(elem->fileName) != wxNOT_FOUND) continue; files.Add(elem->fileName); // normalize version wxString version = elem->info.version; version.Replace(_T("/"), _T("_"), true); version.Replace(_T("\\"), _T("_"), true); version.Replace(_T("?"), _T("_"), true); version.Replace(_T("*"), _T("_"), true); version.Replace(_T(">"), _T("_"), true); version.Replace(_T("<"), _T("_"), true); version.Replace(_T(" "), _T("_"), true); version.Replace(_T("\t"), _T("_"), true); version.Replace(_T("|"), _T("_"), true); wxFileName fname; fname.SetPath(dd.GetPath()); fname.SetName(wxFileName(elem->fileName).GetName() + _T('-') + version); fname.SetExt(_T("cbplugin")); pd.Update(++count, wxString::Format(_("Exporting \"%s\"..."), elem->info.title.c_str()), &skip); if (skip) break; wxString filename = fname.GetFullPath(); if (!confirmed && wxFileExists(filename)) { AnnoyingDialog dlg(_("Confirmation"), wxString::Format(_("%s already exists.\n" "Are you sure you want to overwrite it?"), filename.c_str()), wxART_QUESTION, AnnoyingDialog::THREE_BUTTONS, 1, true, _("&Yes"), _("Yes to &all"), _("&No")); switch (dlg.ShowModal()) { case 3: continue; break; case 2: confirmed = true; break; default: break; } } if (!Manager::Get()->GetPluginManager()->ExportPlugin(elem->plugin, filename)) failure << list->GetItemText(sel) << _T('\n'); } if (!failure.IsEmpty()) cbMessageBox(_("Failed exporting one or more plugins:\n\n") + failure, _("Warning"), wxICON_WARNING, this); }
bool DatabaseManager::optimizeTables() { Database* db = Database::getInstance(); std::ostringstream query; query << "SELECT `TABLE_NAME` FROM `information_schema`.`TABLES` WHERE `TABLE_SCHEMA` = " << db->escapeString(g_config.getString(ConfigManager::MYSQL_DB)) << " AND `DATA_FREE` > 0"; DBResult* result = db->storeQuery(query.str()); if (!result) { return false; } do { std::string tableName = result->getDataString("TABLE_NAME"); std::cout << "> Optimizing table " << tableName << "..." << std::flush; query.str(""); query << "OPTIMIZE TABLE `" << tableName << '`'; if (db->executeQuery(query.str())) { std::cout << " [success]" << std::endl; } else { std::cout << " [failed]" << std::endl; } } while (result->next()); db->freeResult(result); return true; }
void mainLoader(int argc, char* argv[], ServiceManager* services) { //dispatcher thread g_game.setGameState(GAME_STATE_STARTUP); srand((unsigned int)OTSYS_TIME()); #ifdef WIN32 SetConsoleTitle(STATUS_SERVER_NAME); #endif std::cout << STATUS_SERVER_NAME << " - Version " << STATUS_SERVER_VERSION << std::endl; std::cout << "Compilied on " << __DATE__ << " " << __TIME__ << " for arch "; #if defined(__amd64__) || defined(_M_X64) std::cout << "x64" << std::endl; #elif defined(__i386__) || defined(_M_IX86) || defined(_X86_) std::cout << "x86" << std::endl; #else std::cout << "unk" << std::endl; #endif std::cout << std::endl; std::cout << "A server developed by " << STATUS_SERVER_DEVELOPERS << std::endl; std::cout << "Visit our forum for updates, support, and resources: http://otland.net/." << std::endl; std::cout << std::endl; // read global config std::cout << ">> Loading config" << std::endl; if (!g_config.loadFile("config.lua")) { startupErrorMessage("Unable to load config.lua!"); return; } #ifdef WIN32 std::string defaultPriority = asLowerCaseString(g_config.getString(ConfigManager::DEFAULT_PRIORITY)); if (defaultPriority == "realtime") { SetPriorityClass(GetCurrentProcess(), REALTIME_PRIORITY_CLASS); } else if (defaultPriority == "high") { SetPriorityClass(GetCurrentProcess(), HIGH_PRIORITY_CLASS); } else if (defaultPriority == "higher") { SetPriorityClass(GetCurrentProcess(), ABOVE_NORMAL_PRIORITY_CLASS); } std::ostringstream mutexName; mutexName << "forgottenserver_" << g_config.getNumber(ConfigManager::LOGIN_PORT); CreateMutex(NULL, FALSE, mutexName.str().c_str()); if (GetLastError() == ERROR_ALREADY_EXISTS) { startupErrorMessage("Another instance of The Forgotten Server is already running with the same login port, please shut it down first or change ports for this one."); return; } #endif //set RSA key const char* p("14299623962416399520070177382898895550795403345466153217470516082934737582776038882967213386204600674145392845853859217990626450972452084065728686565928113"); const char* q("7630979195970404721891201847792002125535401292779123937207447574596692788513647179235335529307251350570728407373705564708871762033017096809910315212884101"); const char* d("46730330223584118622160180015036832148732986808519344675210555262940258739805766860224610646919605860206328024326703361630109888417839241959507572247284807035235569619173792292786907845791904955103601652822519121908367187885509270025388641700821735345222087940578381210879116823013776808975766851829020659073"); g_RSA.setKey(p, q, d); std::cout << ">> Establishing database connection..." << std::flush; Database* db = Database::getInstance(); if (!db->connect()) { startupErrorMessage("Failed to connect to database."); return; } std::cout << " MySQL " << db->getClientVersion() << std::endl; // run database manager std::cout << ">> Running database manager" << std::endl; DatabaseManager* dbManager = DatabaseManager::getInstance(); if (!dbManager->isDatabaseSetup()) { startupErrorMessage("The database you have specified in config.lua is empty, please import the schema to the database."); return; } for (uint32_t version = dbManager->updateDatabase(); version != 0; version = dbManager->updateDatabase()) { std::cout << "> Database has been updated to version " << version << "." << std::endl; } dbManager->checkTriggers(); dbManager->checkEncryption(); if (g_config.getBoolean(ConfigManager::OPTIMIZE_DATABASE) && !dbManager->optimizeTables()) { std::cout << "> No tables were optimized." << std::endl; } //load vocations std::cout << ">> Loading vocations" << std::endl; if (!g_vocations.loadFromXml()) { startupErrorMessage("Unable to load vocations!"); return; } //load commands std::cout << ">> Loading commands" << std::endl; if (!commands.loadFromXml()) { startupErrorMessage("Unable to load commands!"); return; } // load item data std::cout << ">> Loading items" << std::endl; if (Item::items.loadFromOtb("data/items/items.otb")) { startupErrorMessage("Unable to load items (OTB)!"); return; } if (!Item::items.loadFromXml()) { startupErrorMessage("Unable to load items (XML)!"); return; } std::cout << ">> Loading script systems" << std::endl; if (!ScriptingManager::getInstance()->loadScriptSystems()) { startupErrorMessage("Failed to load script systems"); return; } std::cout << ">> Loading monsters" << std::endl; if (!g_monsters.loadFromXml()) { startupErrorMessage("Unable to load monsters!"); return; } std::cout << ">> Loading outfits" << std::endl; Outfits* outfits = Outfits::getInstance(); if (!outfits->loadFromXml()) { startupErrorMessage("Unable to load outfits!"); return; } g_adminConfig = new AdminProtocolConfig(); std::cout << ">> Loading admin protocol config" << std::endl; if (!g_adminConfig->loadXMLConfig()) { startupErrorMessage("Unable to load admin protocol config!"); return; } std::cout << ">> Loading experience stages" << std::endl; if (!g_game.loadExperienceStages()) { startupErrorMessage("Unable to load experience stages!"); return; } std::string passwordType = asLowerCaseString(g_config.getString(ConfigManager::PASSWORDTYPE)); if (passwordType == "md5") { g_config.setNumber(ConfigManager::PASSWORD_TYPE, PASSWORD_TYPE_MD5); std::cout << ">> Using MD5 passwords" << std::endl; } else if (passwordType == "sha1") { g_config.setNumber(ConfigManager::PASSWORD_TYPE, PASSWORD_TYPE_SHA1); std::cout << ">> Using SHA1 passwords" << std::endl; } else { g_config.setNumber(ConfigManager::PASSWORD_TYPE, PASSWORD_TYPE_PLAIN); std::cout << ">> Using plaintext passwords" << std::endl; } std::cout << ">> Checking world type... " << std::flush; std::string worldType = asLowerCaseString(g_config.getString(ConfigManager::WORLD_TYPE)); if (worldType == "pvp") { g_game.setWorldType(WORLD_TYPE_PVP); } else if (worldType == "no-pvp") { g_game.setWorldType(WORLD_TYPE_NO_PVP); } else if (worldType == "pvp-enforced") { g_game.setWorldType(WORLD_TYPE_PVP_ENFORCED); } else { std::cout << std::endl; std::ostringstream ss; ss << "> ERROR: Unknown world type: " << g_config.getString(ConfigManager::WORLD_TYPE) << ", valid world types are: pvp, no-pvp and pvp-enforced."; startupErrorMessage(ss.str()); return; } std::cout << asUpperCaseString(worldType) << std::endl; std::cout << ">> Loading map" << std::endl; if (!g_game.loadMap(g_config.getString(ConfigManager::MAP_NAME))) { startupErrorMessage("Failed to load map"); return; } std::cout << ">> Initializing gamestate" << std::endl; g_game.setGameState(GAME_STATE_INIT); // Tibia protocols services->add<ProtocolGame>(g_config.getNumber(ConfigManager::GAME_PORT)); services->add<ProtocolLogin>(g_config.getNumber(ConfigManager::LOGIN_PORT)); // OT protocols services->add<ProtocolAdmin>(g_config.getNumber(ConfigManager::ADMIN_PORT)); services->add<ProtocolStatus>(g_config.getNumber(ConfigManager::STATUS_PORT)); // Legacy protocols services->add<ProtocolOldLogin>(g_config.getNumber(ConfigManager::LOGIN_PORT)); services->add<ProtocolOldGame>(g_config.getNumber(ConfigManager::LOGIN_PORT)); int32_t autoSaveEachMinutes = g_config.getNumber(ConfigManager::AUTO_SAVE_EACH_MINUTES); if (autoSaveEachMinutes > 0) { g_scheduler.addEvent(createSchedulerTask(autoSaveEachMinutes * 1000 * 60, boost::bind(&Game::autoSave, &g_game))); } if (g_config.getBoolean(ConfigManager::SERVERSAVE_ENABLED)) { int32_t serverSaveHour = g_config.getNumber(ConfigManager::SERVERSAVE_H); if (serverSaveHour >= 0 && serverSaveHour <= 24) { time_t timeNow = time(NULL); tm* timeinfo = localtime(&timeNow); if (serverSaveHour == 0) { serverSaveHour = 23; } else { serverSaveHour--; } timeinfo->tm_hour = serverSaveHour; timeinfo->tm_min = 55; timeinfo->tm_sec = 0; time_t difference = (time_t)difftime(mktime(timeinfo), timeNow); if (difference < 0) { difference += 86400; } g_scheduler.addEvent(createSchedulerTask(difference * 1000, boost::bind(&Game::prepareServerSave, &g_game))); } } Houses::getInstance().payHouses(); IOLoginData::getInstance()->updateHouseOwners(); g_npcs.reload(); if (g_config.getBoolean(ConfigManager::MARKET_ENABLED)) { g_game.checkExpiredMarketOffers(); IOMarket::getInstance()->updateStatistics(); } std::cout << ">> Loaded all modules, server starting up..." << std::endl; std::pair<uint32_t, uint32_t> IpNetMask; IpNetMask.first = inet_addr("127.0.0.1"); IpNetMask.second = 0xFFFFFFFF; serverIPs.push_back(IpNetMask); char szHostName[128]; if (gethostname(szHostName, 128) == 0) { hostent* he = gethostbyname(szHostName); if (he) { unsigned char** addr = (unsigned char**)he->h_addr_list; while (addr[0] != NULL) { IpNetMask.first = *(uint32_t*)(*addr); IpNetMask.second = 0xFFFFFFFF; serverIPs.push_back(IpNetMask); addr++; } } } std::string ip = g_config.getString(ConfigManager::IP); uint32_t resolvedIp = inet_addr(ip.c_str()); if (resolvedIp == INADDR_NONE) { struct hostent* he = gethostbyname(ip.c_str()); if (!he) { std::ostringstream ss; ss << "ERROR: Cannot resolve " << ip << "!" << std::endl; startupErrorMessage(ss.str()); return; } resolvedIp = *(uint32_t*)he->h_addr; } IpNetMask.first = resolvedIp; IpNetMask.second = 0; serverIPs.push_back(IpNetMask); #if !defined(WIN32) && !defined(__ROOT_PERMISSION__) if (getuid() == 0 || geteuid() == 0) { std::cout << "> WARNING: " << STATUS_SERVER_NAME << " has been executed as root user, it is recommended to execute is as a normal user." << std::endl; } #endif g_game.start(services); g_game.setGameState(GAME_STATE_NORMAL); g_loaderSignal.notify_all(); }
void mainLoader(int, char*[], ServiceManager* services) { //dispatcher thread g_game.setGameState(GAME_STATE_STARTUP); srand(static_cast<unsigned int>(OTSYS_TIME())); #ifdef _WIN32 SetConsoleTitle(STATUS_SERVER_NAME); #endif std::cout << STATUS_SERVER_NAME << " - Version " << STATUS_SERVER_VERSION << std::endl; std::cout << "Compiled with " << BOOST_COMPILER << std::endl; std::cout << "Compiled on " << __DATE__ << ' ' << __TIME__ << " for platform "; #if defined(__amd64__) || defined(_M_X64) std::cout << "x64" << std::endl; #elif defined(__i386__) || defined(_M_IX86) || defined(_X86_) std::cout << "x86" << std::endl; #elif defined(__arm__) std::cout << "ARM" << std::endl; #else std::cout << "unknown" << std::endl; #endif std::cout << std::endl; std::cout << "A server developed by " << STATUS_SERVER_DEVELOPERS << std::endl; std::cout << "Visit our forum for updates, support, and resources: http://otland.net/." << std::endl; std::cout << std::endl; // read global config std::cout << ">> Loading config" << std::endl; if (!g_config.load()) { startupErrorMessage("Unable to load config.lua!"); return; } #ifdef _WIN32 const std::string& defaultPriority = g_config.getString(ConfigManager::DEFAULT_PRIORITY); if (strcasecmp(defaultPriority.c_str(), "high") == 0) { SetPriorityClass(GetCurrentProcess(), HIGH_PRIORITY_CLASS); } else if (strcasecmp(defaultPriority.c_str(), "above-normal") == 0) { SetPriorityClass(GetCurrentProcess(), ABOVE_NORMAL_PRIORITY_CLASS); } #endif //set RSA key const char* p("14299623962416399520070177382898895550795403345466153217470516082934737582776038882967213386204600674145392845853859217990626450972452084065728686565928113"); const char* q("7630979195970404721891201847792002125535401292779123937207447574596692788513647179235335529307251350570728407373705564708871762033017096809910315212884101"); g_RSA.setKey(p, q); std::cout << ">> Establishing database connection..." << std::flush; Database* db = Database::getInstance(); if (!db->connect()) { startupErrorMessage("Failed to connect to database."); return; } std::cout << " MySQL " << Database::getClientVersion() << std::endl; // run database manager std::cout << ">> Running database manager" << std::endl; if (!DatabaseManager::isDatabaseSetup()) { startupErrorMessage("The database you have specified in config.lua is empty, please import the schema.sql to your database."); return; } g_databaseTasks.start(); DatabaseManager::updateDatabase(); if (g_config.getBoolean(ConfigManager::OPTIMIZE_DATABASE) && !DatabaseManager::optimizeTables()) { std::cout << "> No tables were optimized." << std::endl; } //load vocations std::cout << ">> Loading vocations" << std::endl; if (!g_vocations.loadFromXml()) { startupErrorMessage("Unable to load vocations!"); return; } // load item data std::cout << ">> Loading items" << std::endl; if (Item::items.loadFromOtb("data/items/items.otb") != ERROR_NONE) { startupErrorMessage("Unable to load items (OTB)!"); return; } if (!Item::items.loadFromXml()) { startupErrorMessage("Unable to load items (XML)!"); return; } std::cout << ">> Loading script systems" << std::endl; if (!ScriptingManager::getInstance()->loadScriptSystems()) { startupErrorMessage("Failed to load script systems"); return; } std::cout << ">> Loading monsters" << std::endl; if (!g_monsters.loadFromXml()) { startupErrorMessage("Unable to load monsters!"); return; } std::cout << ">> Loading outfits" << std::endl; Outfits* outfits = Outfits::getInstance(); if (!outfits->loadFromXml()) { startupErrorMessage("Unable to load outfits!"); return; } std::cout << ">> Checking world type... " << std::flush; std::string worldType = asLowerCaseString(g_config.getString(ConfigManager::WORLD_TYPE)); if (worldType == "pvp") { g_game.setWorldType(WORLD_TYPE_PVP); } else if (worldType == "no-pvp") { g_game.setWorldType(WORLD_TYPE_NO_PVP); } else if (worldType == "pvp-enforced") { g_game.setWorldType(WORLD_TYPE_PVP_ENFORCED); } else { std::cout << std::endl; std::ostringstream ss; ss << "> ERROR: Unknown world type: " << g_config.getString(ConfigManager::WORLD_TYPE) << ", valid world types are: pvp, no-pvp and pvp-enforced."; startupErrorMessage(ss.str()); return; } std::cout << asUpperCaseString(worldType) << std::endl; std::cout << ">> Loading map" << std::endl; if (!g_game.loadMainMap(g_config.getString(ConfigManager::MAP_NAME))) { startupErrorMessage("Failed to load map"); return; } std::cout << ">> Initializing gamestate" << std::endl; g_game.setGameState(GAME_STATE_INIT); // Game client protocols services->add<ProtocolGame>(g_config.getNumber(ConfigManager::GAME_PORT)); services->add<ProtocolLogin>(g_config.getNumber(ConfigManager::LOGIN_PORT)); // OT protocols services->add<ProtocolStatus>(g_config.getNumber(ConfigManager::STATUS_PORT)); // Legacy login protocol services->add<ProtocolOld>(g_config.getNumber(ConfigManager::LOGIN_PORT)); RentPeriod_t rentPeriod; std::string strRentPeriod = asLowerCaseString(g_config.getString(ConfigManager::HOUSE_RENT_PERIOD)); if (strRentPeriod == "yearly") { rentPeriod = RENTPERIOD_YEARLY; } else if (strRentPeriod == "weekly") { rentPeriod = RENTPERIOD_WEEKLY; } else if (strRentPeriod == "monthly") { rentPeriod = RENTPERIOD_MONTHLY; } else if (strRentPeriod == "daily") { rentPeriod = RENTPERIOD_DAILY; } else { rentPeriod = RENTPERIOD_NEVER; } g_game.map.houses.payHouses(rentPeriod); IOMarket::checkExpiredOffers(); IOMarket::getInstance()->updateStatistics(); std::cout << ">> Loaded all modules, server starting up..." << std::endl; #ifndef _WIN32 if (getuid() == 0 || geteuid() == 0) { std::cout << "> Warning: " << STATUS_SERVER_NAME << " has been executed as root user, please consider running it as a normal user." << std::endl; } #endif g_game.start(services); g_game.setGameState(GAME_STATE_NORMAL); g_loaderSignal.notify_all(); }
cbDiffConfigPanel::cbDiffConfigPanel(wxWindow* parent) { //(*Initialize(cbDiffConfigPanel) wxStaticBoxSizer* StaticBoxSizer2; wxStaticBoxSizer* StaticBoxSizer5; wxBoxSizer* BoxSizer2; wxStaticText* StaticText1; wxStaticBoxSizer* StaticBoxSizer3; wxStaticBoxSizer* StaticBoxSizer4; wxBoxSizer* BoxSizer1; wxStaticText* StaticText2; wxStaticBoxSizer* StaticBoxSizer1; Create(parent, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL, _T("wxID_ANY")); BoxSizer1 = new wxBoxSizer(wxVERTICAL); StaticBoxSizer2 = new wxStaticBoxSizer(wxHORIZONTAL, this, _("Added Lines:")); BColAdd = new wxButton(this, ID_BUTTON2, _("Colour"), wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator, _T("ID_BUTTON2")); StaticBoxSizer2->Add(BColAdd, 1, wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5); StaticText1 = new wxStaticText(this, ID_STATICTEXT1, _("Alpha:"), wxDefaultPosition, wxDefaultSize, 0, _T("ID_STATICTEXT1")); StaticBoxSizer2->Add(StaticText1, 0, wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5); SLAddAlpha = new wxSlider(this, ID_SLIDER1, 50, 0, 255, wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator, _T("ID_SLIDER1")); StaticBoxSizer2->Add(SLAddAlpha, 1, wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5); BoxSizer1->Add(StaticBoxSizer2, 0, wxALL|wxEXPAND|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5); StaticBoxSizer1 = new wxStaticBoxSizer(wxHORIZONTAL, this, _("Removed Lines:")); BColRem = new wxButton(this, ID_BUTTON1, _("Colour"), wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator, _T("ID_BUTTON1")); StaticBoxSizer1->Add(BColRem, 1, wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5); StaticText2 = new wxStaticText(this, ID_STATICTEXT2, _("Alpha:"), wxDefaultPosition, wxDefaultSize, 0, _T("ID_STATICTEXT2")); StaticBoxSizer1->Add(StaticText2, 0, wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5); SLRemAlpha = new wxSlider(this, ID_SLIDER2, 50, 0, 255, wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator, _T("ID_SLIDER2")); StaticBoxSizer1->Add(SLRemAlpha, 1, wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5); BoxSizer1->Add(StaticBoxSizer1, 0, wxALL|wxEXPAND|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5); StaticBoxSizer3 = new wxStaticBoxSizer(wxVERTICAL, this, _("Caret Line:")); CHCaret = new wxChoice(this, ID_CHOICE1, wxDefaultPosition, wxDefaultSize, 0, 0, 0, wxDefaultValidator, _T("ID_CHOICE1")); CHCaret->SetSelection( CHCaret->Append(_("Underline")) ); CHCaret->Append(_("Background")); StaticBoxSizer3->Add(CHCaret, 0, wxALL|wxEXPAND|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5); BoxSizer2 = new wxBoxSizer(wxHORIZONTAL); BColCar = new wxButton(this, ID_BUTTON3, _("Colour"), wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator, _T("ID_BUTTON3")); BoxSizer2->Add(BColCar, 1, wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5); StaticText3 = new wxStaticText(this, ID_STATICTEXT3, _("Alpha:"), wxDefaultPosition, wxDefaultSize, 0, _T("ID_STATICTEXT3")); BoxSizer2->Add(StaticText3, 0, wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5); SLCarAlpha = new wxSlider(this, ID_SLIDER3, 50, 0, 255, wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator, _T("ID_SLIDER3")); BoxSizer2->Add(SLCarAlpha, 1, wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5); StaticBoxSizer3->Add(BoxSizer2, 1, wxALL|wxEXPAND|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 0); BoxSizer1->Add(StaticBoxSizer3, 0, wxALL|wxEXPAND|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5); StaticBoxSizer4 = new wxStaticBoxSizer(wxVERTICAL, this, _("Default values:")); wxString __wxRadioBoxChoices_1[3] = { _("Tabular"), _("Unified Diff"), _("Side by side") }; RBViewing = new wxRadioBox(this, ID_RADIOBOX1, _("Displaytype:"), wxDefaultPosition, wxDefaultSize, 3, __wxRadioBoxChoices_1, 1, wxRA_VERTICAL, wxDefaultValidator, _T("ID_RADIOBOX1")); RBViewing->SetSelection(0); StaticBoxSizer4->Add(RBViewing, 0, wxALL|wxEXPAND|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5); StaticBoxSizer5 = new wxStaticBoxSizer(wxHORIZONTAL, this, _("Language:")); CHHLang = new wxChoice(this, ID_CHOICE2, wxDefaultPosition, wxDefaultSize, 0, 0, 0, wxDefaultValidator, _T("ID_CHOICE2")); StaticBoxSizer5->Add(CHHLang, 1, wxALL|wxEXPAND|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5); StaticBoxSizer4->Add(StaticBoxSizer5, 0, wxALL|wxEXPAND|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5); BoxSizer1->Add(StaticBoxSizer4, 1, wxALL|wxEXPAND|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5); SetSizer(BoxSizer1); BoxSizer1->Fit(this); BoxSizer1->SetSizeHints(this); Connect(ID_BUTTON2,wxEVT_COMMAND_BUTTON_CLICKED,(wxObjectEventFunction)&cbDiffConfigPanel::OnColAddClick); Connect(ID_BUTTON1,wxEVT_COMMAND_BUTTON_CLICKED,(wxObjectEventFunction)&cbDiffConfigPanel::OnColRemClick); Connect(ID_BUTTON3,wxEVT_COMMAND_BUTTON_CLICKED,(wxObjectEventFunction)&cbDiffConfigPanel::OnColCarClick); Connect(ID_RADIOBOX1,wxEVT_COMMAND_RADIOBOX_SELECTED,(wxObjectEventFunction)&cbDiffConfigPanel::OnViewModeChange); Connect(ID_CHOICE2,wxEVT_COMMAND_CHOICE_SELECTED,(wxObjectEventFunction)&cbDiffConfigPanel::OnHLangChange); //*) BColAdd->SetBackgroundColour(wxColour(0,255,0,50)); BColRem->SetBackgroundColour(wxColour(255,0,0,50)); CHCaret->SetSelection(0); BColCar->SetBackgroundColour(wxColour(122,122,0)); CHHLang->Append(cbDiffUtils::GetAllHighlightLanguages()); ConfigManager *cfg = Manager::Get()->GetConfigManager(_T("cbdiffsettings")); if (cfg) { BColAdd->SetBackgroundColour(cfg->ReadColour(_T("addedlines"), wxColour(0,255,0,50))); SLAddAlpha->SetValue(cfg->ReadInt(_T("addedlinesalpha"), 50)); BColRem->SetBackgroundColour(cfg->ReadColour(_T("removedlines"), wxColour(255,0,0,50))); SLRemAlpha->SetValue(cfg->ReadInt(_T("removedlinesalpha"),50)); CHCaret->SetSelection(cfg->ReadInt(_T("caretlinetype"))); BColCar->SetBackgroundColour(cfg->ReadColour(_T("caretline"), wxColor(122,122,0))); SLCarAlpha->SetValue(cfg->ReadInt(_T("caretlinealpha"), 50)); RBViewing->SetSelection(cfg->ReadInt(_T("viewmode"), 0)); if(RBViewing->GetSelection() == 1) CHHLang->Enable(false); CHHLang->SetStringSelection(cfg->Read(_T("hlang"), _("Plain Text"))); } BColAdd->SetLabel(BColAdd->GetBackgroundColour().GetAsString()); BColRem->SetLabel(BColRem->GetBackgroundColour().GetAsString()); BColCar->SetLabel(BColCar->GetBackgroundColour().GetAsString()); }
void MagicField::onStepInField(Creature* creature, bool purposeful/*= true*/) { //remove magic walls/wild growth if (id == ITEM_MAGICWALL_SAFE || id == ITEM_WILDGROWTH_SAFE || id == ITEM_MAGICWALL || id == ITEM_WILDGROWTH) { bool isBlockingVar = isBlocking(creature); bool config = g_config.getBoolean(ConfigManager::MW_DISAPPEAR_ON_WALK); if (isBlockingVar || (!isBlockingVar && config)) { g_game.internalRemoveItem(this, 1); } } else { const ItemType& it = items[getID()]; if (it.condition) { if (canOwnerHarm(creature)) { Condition* conditionCopy = it.condition->clone(); uint32_t ownerId = getOwner(); if (ownerId != 0 && purposeful) { Creature* owner = g_game.getCreatureByID(ownerId); if (owner && (owner != creature)) { if ((OTSYS_TIME() - createTime <= g_config.getNumber(ConfigManager::FIELD_OWNERSHIP_DURATION)) || owner->hasBeenAttacked(ownerId)) { conditionCopy->setParam(CONDITIONPARAM_OWNER, ownerId); } } } if (Player* player = creature->getPlayer()) { if (ConditionDamage* conditionDamage = static_cast<ConditionDamage*>(conditionCopy)) { Item* tmpItem = NULL; for (int32_t i = SLOT_FIRST; i <= SLOT_LAST; i++) { if ((tmpItem = player->getInventoryItem((slots_t)i))) { if (tmpItem->getWieldPosition() != i) { continue; } const ItemType& it = items[tmpItem->getID()]; std::map<uint16_t, int16_t>::const_iterator id = it.abilities.absorbFieldDamage.find(getID()); if (id != it.abilities.absorbFieldDamage.end()) { int32_t index = 0, length = conditionDamage->getLength(); std::list<IntervalInfo> damageList; for (; index < length; index++) { IntervalInfo info = conditionDamage->popFrontDamage(); info.value = (int32_t)std::floor((double)info.value * (100 - id->second) / 100.); damageList.push_back(info); conditionDamage->setTicks(conditionDamage->getTicks() - info.interval); } index = 0; length -= it.abilities.conditionCount; conditionDamage->clearDamageList(); for (std::list<IntervalInfo>::iterator itt = damageList.begin(); itt != damageList.end(); ++itt) { conditionDamage->addDamage(1, itt->interval, itt->value); if (++index == length) { break; } } } } } if (conditionDamage->getTotalDamage() > 0) { conditionDamage->setParam(CONDITIONPARAM_FORCEUPDATE, true); } creature->addCondition(conditionDamage); return; } } creature->addCondition(conditionCopy); } } } }
void PlaceWindow(wxTopLevelWindow *w, cbPlaceDialogMode mode, bool enforce) { if (!w) cbThrow(_T("Passed NULL pointer to PlaceWindow.")); ConfigManager *cfg = Manager::Get()->GetConfigManager(_T("app")); if (!enforce && cfg->ReadBool(_T("/dialog_placement/do_place")) == false) return; wxWindow* referenceWindow = Manager::Get()->GetAppWindow(); if (!referenceWindow) // no application window available, so this is as good as we can get referenceWindow = w; int the_mode; if (mode == pdlBest) the_mode = cfg->ReadInt(_T("/dialog_placement/dialog_position"), (int) pdlCentre); else the_mode = (int) mode; wxRect monitorRect; if (wxDisplay::GetCount() > 0) { int displayIdx = wxDisplay::GetFromWindow(referenceWindow); if (displayIdx == wxNOT_FOUND) displayIdx = 0; wxDisplay display(displayIdx); monitorRect = display.GetClientArea(); // This is needed because on Linux the client area returned for the first monitor in a twin // monitor setup with nVidia card is spanning the two monitors. // The intersection function will return just the client for the specified monitor. monitorRect = display.GetGeometry().Intersect(monitorRect); } else { int width, height; wxDisplaySize(&width, &height); monitorRect = wxRect(0, 0, width, height); } wxRect windowRect = w->GetRect(); switch(the_mode) { case pdlCentre: { windowRect.x = monitorRect.x + (monitorRect.width - windowRect.width)/2; windowRect.y = monitorRect.y + (monitorRect.height - windowRect.height)/2; } break; case pdlHead: { windowRect.x = monitorRect.x + (monitorRect.width - windowRect.width)/2; windowRect.y = monitorRect.y + (monitorRect.height - windowRect.height)/3; } break; case pdlConstrain: { int x1 = windowRect.x; int x2 = windowRect.x + windowRect.width; int y1 = windowRect.y; int y2 = windowRect.y + windowRect.height; if (windowRect.width > monitorRect.width) // cannot place without clipping, so centre it { x1 = monitorRect.x + (monitorRect.width - windowRect.width)/2; x2 = x1 + windowRect.width; } else { x2 = std::min(monitorRect.GetRight(), windowRect.GetRight()); x1 = std::max(x2 - windowRect.width, monitorRect.x); x2 = x1 + windowRect.width; } if (windowRect.height > monitorRect.height) // cannot place without clipping, so centre it { y1 = monitorRect.y + (monitorRect.height - windowRect.height)/2; y2 = y1 + windowRect.height; } else { y2 = std::min(monitorRect.GetBottom(), windowRect.GetBottom()); y1 = std::max(y2 - windowRect.height, monitorRect.y); y2 = y1 + windowRect.height; } windowRect = wxRect(x1, y1, x2-x1, y2-y1); } break; case pdlClip: { int x1 = windowRect.x; int x2 = windowRect.x + windowRect.width; int y1 = windowRect.y; int y2 = windowRect.y + windowRect.height; x1 = std::max(x1, monitorRect.x); x2 = std::min(x2, monitorRect.GetRight()); y1 = std::max(y1, monitorRect.y); y2 = std::min(y2, monitorRect.GetBottom()); windowRect = wxRect(x1, y1, x2-x1, y2-y1); } break; } w->SetSize(windowRect.x, windowRect.y, windowRect.width, windowRect.height, wxSIZE_ALLOW_MINUS_ONE); }
ReturnValue Combat::checkPVPExtraRestrictions(const Creature* attacker, const Creature* target, bool isWalkCheck) { #ifdef __MIN_PVP_LEVEL_APPLIES_TO_SUMMONS__ const Player* targetPlayer; if (g_config.getNumber(ConfigManager::MIN_PVP_LEVEL_APPLIES_TO_SUMMONS)) { targetPlayer = target->getPlayerInCharge(); } else { targetPlayer = target->getPlayer(); } #else const Player* targetPlayer = target->getPlayer(); #endif const Player* attackerPlayer = attacker->getPlayerInCharge(); if (targetPlayer && attackerPlayer) { bool stopAttack = false; bool canPassThrough = g_config.getBoolean(ConfigManager::CAN_PASS_THROUGH); if (g_game.getWorldType() == WORLD_TYPE_OPTIONAL_PVP) { if (!targetPlayer->isGuildEnemy(attackerPlayer) || (!isWalkCheck && !isInPvpZone(attacker, target))) { stopAttack = true; } if (isWalkCheck && !canPassThrough) { stopAttack = true; } } else { if (!isWalkCheck || canPassThrough) { uint32_t p_level = g_config.getNumber(ConfigManager::MIN_PVP_LEVEL); uint32_t attackerLevel = attackerPlayer->getLevel(); uint32_t targetLevel = targetPlayer->getLevel(); if ((attackerLevel >= p_level && targetLevel < p_level && isWalkCheck) || (!isWalkCheck && (attackerLevel < p_level || targetLevel < p_level))) { stopAttack = true; } } } if (stopAttack) { if (target->getPlayer()) { return RET_YOUMAYNOTATTACKTHISPERSON; } else { return RET_YOUMAYNOTATTACKTHISCREATURE; } } } return RET_NOERROR; }
void Compiler::SaveSettings(const wxString& baseKey) { ConfigManager* cfg = Manager::Get()->GetConfigManager(_T("compiler")); // save settings version cfg->Write(_T("settings_version"), CompilerSettingsVersion); wxString tmp; // delete old-style keys (using integer IDs) tmp.Printf(_T("%s/set%3.3d"), baseKey.c_str(), CompilerFactory::GetCompilerIndex(this) + 1); cfg->DeleteSubPath(tmp); tmp.Printf(_T("%s/%s"), baseKey.c_str(), m_ID.c_str()); cfg->Write(tmp + _T("/name"), m_Name); cfg->Write(tmp + _T("/parent"), m_ParentID, true); if (m_Mirror.CompilerOptions_ != m_CompilerOptions) { wxString key = GetStringFromArray(m_CompilerOptions); cfg->Write(tmp + _T("/compiler_options"), key, false); } if (m_Mirror.LinkerOptions != m_LinkerOptions) { wxString key = GetStringFromArray(m_LinkerOptions); cfg->Write(tmp + _T("/linker_options"), key, false); } if (m_Mirror.IncludeDirs != m_IncludeDirs) { wxString key = GetStringFromArray( MakeUniqueArray(m_IncludeDirs, true) ); cfg->Write(tmp + _T("/include_dirs"), key, false); } if (m_Mirror.ResIncludeDirs != m_ResIncludeDirs) { wxString key = GetStringFromArray( MakeUniqueArray(m_ResIncludeDirs, true) ); cfg->Write(tmp + _T("/res_include_dirs"), key, false); } if (m_Mirror.LibDirs != m_LibDirs) { wxString key = GetStringFromArray( MakeUniqueArray(m_LibDirs, true) ); cfg->Write(tmp + _T("/library_dirs"), key, false); } if (m_Mirror.LinkLibs != m_LinkLibs) { wxString key = GetStringFromArray(m_LinkLibs); cfg->Write(tmp + _T("/libraries"), key, false); } if (m_Mirror.CmdsBefore != m_CmdsBefore) { wxString key = GetStringFromArray(m_CmdsBefore); cfg->Write(tmp + _T("/commands_before"), key, true); } if (m_Mirror.CmdsAfter != m_CmdsAfter) { wxString key = GetStringFromArray(m_CmdsAfter); cfg->Write(tmp + _T("/commands_after"), key, true); } if (m_Mirror.MasterPath != m_MasterPath) cfg->Write(tmp + _T("/master_path"), m_MasterPath, true); if (m_Mirror.ExtraPaths != m_ExtraPaths) cfg->Write(tmp + _T("/extra_paths"), GetStringFromArray( MakeUniqueArray(m_ExtraPaths, true), _T(";") ), true); if (m_Mirror.Programs.C != m_Programs.C) cfg->Write(tmp + _T("/c_compiler"), m_Programs.C, true); if (m_Mirror.Programs.CPP != m_Programs.CPP) cfg->Write(tmp + _T("/cpp_compiler"), m_Programs.CPP, true); if (m_Mirror.Programs.LD != m_Programs.LD) cfg->Write(tmp + _T("/linker"), m_Programs.LD, true); if (m_Mirror.Programs.LIB != m_Programs.LIB) cfg->Write(tmp + _T("/lib_linker"), m_Programs.LIB, true); if (m_Mirror.Programs.WINDRES != m_Programs.WINDRES) cfg->Write(tmp + _T("/res_compiler"), m_Programs.WINDRES, true); if (m_Mirror.Programs.MAKE != m_Programs.MAKE) cfg->Write(tmp + _T("/make"), m_Programs.MAKE, true); if (m_Mirror.Programs.DBG != m_Programs.DBG) cfg->Write(tmp + _T("/debugger"), m_Programs.DBG, true); for (int i = 0; i < ctCount; ++i) { for (size_t n = 0; n < m_Commands[i].size(); ++n) { if (n >= m_Mirror.Commands[i].size() || m_Mirror.Commands[i][n] != m_Commands[i][n]) { wxString key = wxString::Format(_T("%s/macros/%s/tool%d/"), tmp.c_str(), CommandTypeDescriptions[i].c_str(), n); cfg->Write(key + _T("command"), m_Commands[i][n].command); cfg->Write(key + _T("extensions"), m_Commands[i][n].extensions); cfg->Write(key + _T("generatedFiles"), m_Commands[i][n].generatedFiles); } } } // switches if (m_Mirror.Switches.includeDirs != m_Switches.includeDirs) cfg->Write(tmp + _T("/switches/includes"), m_Switches.includeDirs, true); if (m_Mirror.Switches.libDirs != m_Switches.libDirs) cfg->Write(tmp + _T("/switches/libs"), m_Switches.libDirs, true); if (m_Mirror.Switches.linkLibs != m_Switches.linkLibs) cfg->Write(tmp + _T("/switches/link"), m_Switches.linkLibs, true); if (m_Mirror.Switches.defines != m_Switches.defines) cfg->Write(tmp + _T("/switches/define"), m_Switches.defines, true); if (m_Mirror.Switches.genericSwitch != m_Switches.genericSwitch) cfg->Write(tmp + _T("/switches/generic"), m_Switches.genericSwitch, true); if (m_Mirror.Switches.objectExtension != m_Switches.objectExtension) cfg->Write(tmp + _T("/switches/objectext"), m_Switches.objectExtension, true); if (m_Mirror.Switches.needDependencies != m_Switches.needDependencies) cfg->Write(tmp + _T("/switches/deps"), m_Switches.needDependencies); if (m_Mirror.Switches.forceCompilerUseQuotes != m_Switches.forceCompilerUseQuotes) cfg->Write(tmp + _T("/switches/forceCompilerQuotes"), m_Switches.forceCompilerUseQuotes); if (m_Mirror.Switches.forceLinkerUseQuotes != m_Switches.forceLinkerUseQuotes) cfg->Write(tmp + _T("/switches/forceLinkerQuotes"), m_Switches.forceLinkerUseQuotes); if (m_Mirror.Switches.logging != m_Switches.logging) cfg->Write(tmp + _T("/switches/logging"), m_Switches.logging); if (m_Mirror.Switches.libPrefix != m_Switches.libPrefix) cfg->Write(tmp + _T("/switches/libPrefix"), m_Switches.libPrefix, true); if (m_Mirror.Switches.libExtension != m_Switches.libExtension) cfg->Write(tmp + _T("/switches/libExtension"), m_Switches.libExtension, true); if (m_Mirror.Switches.linkerNeedsLibPrefix != m_Switches.linkerNeedsLibPrefix) cfg->Write(tmp + _T("/switches/linkerNeedsLibPrefix"), m_Switches.linkerNeedsLibPrefix); if (m_Mirror.Switches.linkerNeedsLibExtension != m_Switches.linkerNeedsLibExtension) cfg->Write(tmp + _T("/switches/linkerNeedsLibExtension"), m_Switches.linkerNeedsLibExtension); if (m_Mirror.Switches.forceFwdSlashes != m_Switches.forceFwdSlashes) cfg->Write(tmp + _T("/switches/forceFwdSlashes"), m_Switches.forceFwdSlashes); if (m_Mirror.Switches.supportsPCH != m_Switches.supportsPCH) cfg->Write(tmp + _T("/switches/supportsPCH"), m_Switches.supportsPCH); if (m_Mirror.Switches.PCHExtension != m_Switches.PCHExtension) cfg->Write(tmp + _T("/switches/pchExtension"), m_Switches.PCHExtension); if (m_Mirror.Switches.UseFlatObjects != m_Switches.UseFlatObjects) cfg->Write(tmp + _T("/switches/UseFlatObjects"), m_Switches.UseFlatObjects); if (m_Mirror.Switches.UseFullSourcePaths != m_Switches.UseFullSourcePaths) cfg->Write(tmp + _T("/switches/UseFullSourcePaths"), m_Switches.UseFullSourcePaths); if (m_Mirror.Switches.Use83Paths != m_Switches.Use83Paths) cfg->Write(tmp + _T("/switches/Use83Paths"), m_Switches.Use83Paths); // regexes cfg->DeleteSubPath(tmp + _T("/regex")); wxString group; for (size_t i = 0; i < m_RegExes.Count(); ++i) { if (i < m_Mirror.RegExes.GetCount() && m_Mirror.RegExes[i] == m_RegExes[i]) continue; group.Printf(_T("%s/regex/re%3.3d"), tmp.c_str(), i + 1); RegExStruct& rs = m_RegExes[i]; cfg->Write(group + _T("/description"), rs.desc, true); if (rs.lt != 0) cfg->Write(group + _T("/type"), rs.lt); cfg->Write(group + _T("/regex"), rs.regex, true); if (rs.msg[0] != 0) cfg->Write(group + _T("/msg1"), rs.msg[0]); if (rs.msg[1] != 0) cfg->Write(group + _T("/msg2"), rs.msg[1]); if (rs.msg[2] != 0) cfg->Write(group + _T("/msg3"), rs.msg[2]); if (rs.filename != 0) cfg->Write(group + _T("/filename"), rs.filename); if (rs.line != 0) cfg->Write(group + _T("/line"), rs.line); } // custom vars wxString configpath = tmp + _T("/custom_variables/"); cfg->DeleteSubPath(configpath); const StringHash& v = GetAllVars(); for (StringHash::const_iterator it = v.begin(); it != v.end(); ++it) cfg->Write(configpath + it->first, it->second); }
bool Combat::getMinMaxValues(Creature* creature, Creature* target, int32_t& min, int32_t& max) const { if (creature) { if (creature->getCombatValues(min, max)) { return true; } else if (Player* player = creature->getPlayer()) { if (params.valueCallback) { params.valueCallback->getMinMaxValues(player, min, max, params.useCharges); return true; } else { switch (formulaType) { case FORMULA_LEVELMAGIC: { max = (int32_t)((player->getLevel() + player->getMagicLevel() * 4) * 1. * mina + minb); min = (int32_t)((player->getLevel() + player->getMagicLevel() * 4) * 1. * maxa + maxb); Vocation* vocation = player->getVocation(); if (vocation) { if (max > 0 && min > 0 && vocation->getHealingBaseDamage() != 1.0) { min = int32_t(min * vocation->getHealingBaseDamage()); max = int32_t(max * vocation->getHealingBaseDamage()); } else if (max < 0 && min < 0 && vocation->getMagicBaseDamage() != 1.0) { min = int32_t(min * vocation->getMagicBaseDamage()); max = int32_t(max * vocation->getMagicBaseDamage()); } } return true; break; } case FORMULA_SKILL: { Item* tool = player->getWeapon(); const Weapon* weapon = g_weapons->getWeapon(tool); min = (int32_t)minb; if (weapon) { max = (int32_t)(weapon->getWeaponDamage(player, target, tool, true) * maxa + maxb); if (params.useCharges && tool->hasCharges() && g_config.getNumber(ConfigManager::REMOVE_WEAPON_CHARGES)) { int32_t newCharge = std::max((int32_t)0, ((int32_t)tool->getCharges()) - 1); g_game.transformItem(tool, tool->getID(), newCharge); } } else { max = (int32_t)maxb; } return true; break; } case FORMULA_VALUE: { min = (int32_t)mina; max = (int32_t)maxa; return true; break; } default: min = 0; max = 0; return false; break; } //std::cout << "No callback set for combat" << std::endl; } } } if (formulaType == FORMULA_VALUE) { min = (int32_t)mina; max = (int32_t)maxa; return true; } return false; }
bool IOLoginData::loadPlayer(Player* player, DBResult_ptr result) { if (!result) { return false; } Database* db = Database::getInstance(); uint32_t accno = result->getDataInt("account_id"); Account acc = loadAccount(accno); player->setGUID(result->getDataInt("id")); player->name = result->getDataString("name"); player->accountNumber = accno; player->accountType = acc.accountType; if (g_config.getBoolean(ConfigManager::FREE_PREMIUM)) { player->premiumDays = std::numeric_limits<uint16_t>::max(); } else { player->premiumDays = acc.premiumDays; } Group* group = g_game.getGroup(result->getDataInt("group_id")); if (!group) { std::cout << "[Error - IOLoginData::loadPlayer] " << player->name << " has Group ID " << result->getDataInt("group_id") << " which doesn't exist." << std::endl; return false; } player->setGroup(group); player->bankBalance = result->getNumber<uint64_t>("balance"); player->setSex(static_cast<PlayerSex_t>(result->getDataInt("sex"))); player->level = std::max<uint32_t>(1, result->getDataInt("level")); uint64_t experience = result->getNumber<uint64_t>("experience"); uint64_t currExpCount = Player::getExpForLevel(player->level); uint64_t nextExpCount = Player::getExpForLevel(player->level + 1); if (experience < currExpCount || experience > nextExpCount) { experience = currExpCount; } player->experience = experience; if (currExpCount < nextExpCount) { player->levelPercent = Player::getPercentLevel(player->experience - currExpCount, nextExpCount - currExpCount); } else { player->levelPercent = 0; } player->soul = result->getDataInt("soul"); player->capacity = result->getDataInt("cap") * 100; player->blessings = result->getDataInt("blessings"); unsigned long conditionsSize; const char* conditions = result->getDataStream("conditions", conditionsSize); PropStream propStream; propStream.init(conditions, conditionsSize); Condition* condition = Condition::createCondition(propStream); while (condition) { if (condition->unserialize(propStream)) { player->storedConditionList.push_front(condition); } else { delete condition; } condition = Condition::createCondition(propStream); } if (!player->setVocation(result->getDataInt("vocation"))) { std::cout << "[Error - IOLoginData::loadPlayer] " << player->name << " has Vocation ID " << result->getDataInt("vocation") << " which doesn't exist." << std::endl; return false; } player->mana = result->getDataInt("mana"); player->manaMax = result->getDataInt("manamax"); player->magLevel = result->getDataInt("maglevel"); uint64_t nextManaCount = player->vocation->getReqMana(player->magLevel + 1); uint64_t manaSpent = result->getNumber<uint64_t>("manaspent"); if (manaSpent > nextManaCount) { manaSpent = 0; } player->manaSpent = manaSpent; player->magLevelPercent = Player::getPercentLevel(player->manaSpent, nextManaCount); player->health = result->getDataInt("health"); player->healthMax = result->getDataInt("healthmax"); player->defaultOutfit.lookType = result->getDataInt("looktype"); player->defaultOutfit.lookHead = result->getDataInt("lookhead"); player->defaultOutfit.lookBody = result->getDataInt("lookbody"); player->defaultOutfit.lookLegs = result->getDataInt("looklegs"); player->defaultOutfit.lookFeet = result->getDataInt("lookfeet"); player->defaultOutfit.lookAddons = result->getDataInt("lookaddons"); player->currentOutfit = player->defaultOutfit; if (g_game.getWorldType() != WORLD_TYPE_PVP_ENFORCED) { const int32_t skullSeconds = result->getDataInt("skulltime") - time(nullptr); if (skullSeconds > 0) { //ensure that we round up the number of ticks player->skullTicks = (skullSeconds + 2) * 1000; int32_t skull = result->getDataInt("skull"); if (skull == SKULL_RED) { player->skull = SKULL_RED; } else if (skull == SKULL_BLACK) { player->skull = SKULL_BLACK; } } } player->loginPosition.x = result->getDataInt("posx"); player->loginPosition.y = result->getDataInt("posy"); player->loginPosition.z = result->getDataInt("posz"); player->lastLoginSaved = result->getNumber<uint64_t>("lastlogin"); player->lastLogout = result->getNumber<uint64_t>("lastlogout"); player->offlineTrainingTime = result->getDataInt("offlinetraining_time") * 1000; player->offlineTrainingSkill = result->getDataInt("offlinetraining_skill"); Town* town = Towns::getInstance().getTown(result->getDataInt("town_id")); if (!town) { std::cout << "[Error - IOLoginData::loadPlayer] " << player->name << " has Town ID " << result->getDataInt("town_id") << " which doesn't exist." << std::endl; return false; } player->town = town; const Position& loginPos = player->loginPosition; if (loginPos.x == 0 && loginPos.y == 0 && loginPos.z == 0) { player->loginPosition = player->getTemplePosition(); } player->staminaMinutes = result->getDataInt("stamina"); static const std::string skillNames[] = {"skill_fist", "skill_club", "skill_sword", "skill_axe", "skill_dist", "skill_shielding", "skill_fishing"}; static const std::string skillNameTries[] = {"skill_fist_tries", "skill_club_tries", "skill_sword_tries", "skill_axe_tries", "skill_dist_tries", "skill_shielding_tries", "skill_fishing_tries"}; static const size_t size = sizeof(skillNames) / sizeof(std::string); for (uint8_t i = 0; i < size; ++i) { uint16_t skillLevel = result->getNumber<uint16_t>(skillNames[i]); uint64_t skillTries = result->getNumber<uint64_t>(skillNameTries[i]); uint64_t nextSkillTries = player->vocation->getReqSkillTries(i, skillLevel + 1); if (skillTries > nextSkillTries) { skillTries = 0; } player->skills[i].level = skillLevel; player->skills[i].tries = skillTries; player->skills[i].percent = Player::getPercentLevel(skillTries, nextSkillTries); } std::ostringstream query; query << "SELECT `guild_id`, `rank_id`, `nick` FROM `guild_membership` WHERE `player_id` = " << player->getGUID(); if ((result = db->storeQuery(query.str()))) { uint32_t guildId = result->getDataInt("guild_id"); uint32_t playerRankId = result->getDataInt("rank_id"); player->guildNick = result->getDataString("nick"); Guild* guild = g_game.getGuild(guildId); if (!guild) { query.str(""); query << "SELECT `name` FROM `guilds` WHERE `id` = " << guildId; if ((result = db->storeQuery(query.str()))) { guild = new Guild(guildId, result->getDataString("name")); g_game.addGuild(guild); query.str(""); query << "SELECT `id`, `name`, `level` FROM `guild_ranks` WHERE `guild_id` = " << guildId << " LIMIT 3"; if ((result = db->storeQuery(query.str()))) { do { guild->addRank(result->getDataInt("id"), result->getDataString("name"), result->getDataInt("level")); } while (result->next()); } } } if (guild) { player->guild = guild; GuildRank* rank = guild->getRankById(playerRankId); if (rank) { player->guildLevel = rank->level; } else { player->guildLevel = 1; } IOGuild::getWarList(guildId, player->guildWarList); query.str(""); query << "SELECT COUNT(*) AS `members` FROM `guild_membership` WHERE `guild_id` = " << guildId; if ((result = db->storeQuery(query.str()))) { guild->setMemberCount(result->getDataInt("members")); } } } query.str(""); query << "SELECT `player_id`, `name` FROM `player_spells` WHERE `player_id` = " << player->getGUID(); if ((result = db->storeQuery(query.str()))) { do { player->learnedInstantSpellList.emplace_front(result->getDataString("name")); } while (result->next()); } //load inventory items ItemMap itemMap; query.str(""); query << "SELECT `pid`, `sid`, `itemtype`, `count`, `attributes` FROM `player_items` WHERE `player_id` = " << player->getGUID() << " ORDER BY `sid` DESC"; if ((result = db->storeQuery(query.str()))) { loadItems(itemMap, result); for (ItemMap::reverse_iterator it = itemMap.rbegin(); it != itemMap.rend(); ++it) { const std::pair<Item*, int32_t>& pair = it->second; Item* item = pair.first; int32_t pid = pair.second; if (pid >= 1 && pid <= 10) { player->__internalAddThing(pid, item); } else { ItemMap::const_iterator it2 = itemMap.find(pid); if (it2 == itemMap.end()) { continue; } Container* container = it2->second.first->getContainer(); if (container) { container->__internalAddThing(item); } } } } //load depot items itemMap.clear(); query.str(""); query << "SELECT `pid`, `sid`, `itemtype`, `count`, `attributes` FROM `player_depotitems` WHERE `player_id` = " << player->getGUID() << " ORDER BY `sid` DESC"; if ((result = db->storeQuery(query.str()))) { loadItems(itemMap, result); for (ItemMap::reverse_iterator it = itemMap.rbegin(); it != itemMap.rend(); ++it) { const std::pair<Item*, int32_t>& pair = it->second; Item* item = pair.first; int32_t pid = pair.second; if (pid >= 0 && pid < 100) { DepotChest* depotChest = player->getDepotChest(pid, true); if (depotChest) { depotChest->__internalAddThing(item); } } else { ItemMap::const_iterator it2 = itemMap.find(pid); if (it2 == itemMap.end()) { continue; } Container* container = it2->second.first->getContainer(); if (container) { container->__internalAddThing(item); } } } } //load inbox items itemMap.clear(); query.str(""); query << "SELECT `pid`, `sid`, `itemtype`, `count`, `attributes` FROM `player_inboxitems` WHERE `player_id` = " << player->getGUID() << " ORDER BY `sid` DESC"; if ((result = db->storeQuery(query.str()))) { loadItems(itemMap, result); for (ItemMap::reverse_iterator it = itemMap.rbegin(); it != itemMap.rend(); ++it) { const std::pair<Item*, int32_t>& pair = it->second; Item* item = pair.first; int32_t pid = pair.second; if (pid >= 0 && pid < 100) { player->getInbox()->__internalAddThing(item); } else { ItemMap::const_iterator it2 = itemMap.find(pid); if (it2 == itemMap.end()) { continue; } Container* container = it2->second.first->getContainer(); if (container) { container->__internalAddThing(item); } } } } //load storage map query.str(""); query << "SELECT `key`, `value` FROM `player_storage` WHERE `player_id` = " << player->getGUID(); if ((result = db->storeQuery(query.str()))) { do { player->addStorageValue(result->getDataInt("key"), result->getDataInt("value"), true); } while (result->next()); } //load vip query.str(""); query << "SELECT `player_id` FROM `account_viplist` WHERE `account_id` = " << player->getAccount(); if ((result = db->storeQuery(query.str()))) { do { player->addVIPInternal(result->getDataInt("player_id")); } while (result->next()); } player->updateBaseSpeed(); player->updateInventoryWeight(); player->updateItemsLight(true); return true; }
void Combat::combatTileEffects(const SpectatorVec& list, Creature* caster, Tile* tile, const CombatParams& params) { if (params.itemId != 0) { uint32_t itemId = params.itemId; Player* p_caster = NULL; if (caster) { if (caster->getPlayer()) { p_caster = caster->getPlayer(); } else if (caster->isPlayerSummon()) { p_caster = caster->getPlayerMaster(); } } if (p_caster) { if (p_caster->getLevel() < g_config.getNumber(ConfigManager::MIN_PVP_LEVEL)) { if (itemId == ITEM_WILDGROWTH) { if (g_config.getBoolean(ConfigManager::CAN_PASS_THROUGH) && g_config.getNumber(ConfigManager::MIN_PVP_LEVEL) > 0) { itemId = ITEM_WILDGROWTH_SAFE; } } if (itemId == ITEM_MAGICWALL) { if (g_config.getBoolean(ConfigManager::CAN_PASS_THROUGH) && g_config.getNumber(ConfigManager::MIN_PVP_LEVEL) > 0) { itemId = ITEM_MAGICWALL_SAFE; } } } if (g_game.getWorldType() == WORLD_TYPE_OPTIONAL_PVP || tile->hasFlag(TILESTATE_NOPVPZONE)) { if (itemId == ITEM_FIREFIELD) { itemId = ITEM_FIREFIELD_SAFE; } else if (itemId == ITEM_POISONFIELD) { itemId = ITEM_POISONFIELD_SAFE; } else if (itemId == ITEM_ENERGYFIELD) { itemId = ITEM_ENERGYFIELD_SAFE; } else if (itemId == ITEM_MAGICWALL) { itemId = ITEM_MAGICWALL_SAFE; } else if (itemId == ITEM_WILDGROWTH) { itemId = ITEM_WILDGROWTH_SAFE; } } } Item* item = Item::CreateItem(itemId); if (caster) { item->setOwner(caster->getID()); } ReturnValue ret = g_game.internalAddItem(tile, item); if (ret == RET_NOERROR) { g_game.startDecay(item); } else { delete item; } } if (params.tileCallback) { params.tileCallback->onTileCombat(caster, tile); } if (params.impactEffect != NM_ME_NONE) { g_game.addMagicEffect(list, tile->getPosition(), params.impactEffect); } }
bool EncodingDetector::ConvertToWxStr(const wxByte* buffer, size_t size) { LogManager* logmgr = Manager::Get()->GetLogManager(); wxString logmsg; if (!buffer || size == 0) { if(m_UseLog) { logmsg.Printf(_T("Encoding conversion has failed (buffer is empty)!")); logmgr->DebugLog(logmsg); } return false; } if (m_BOMSizeInBytes > 0) { for (int i = 0; i < m_BOMSizeInBytes; ++i) buffer++; } size_t outlen = 0; /* NOTE (Biplab#5#): FileManager returns a buffer with 4 extra NULL chars appended. But the buffer size is returned sans the NULL chars */ wxWCharBuffer wideBuff; // if possible use the special conversion-routines, they are much faster than wxCSCov (at least on linux) if ( m_Encoding == wxFONTENCODING_UTF7 ) { wxMBConvUTF7 conv; wideBuff = conv.cMB2WC((char*)buffer, size + 4 - m_BOMSizeInBytes, &outlen); } else if ( m_Encoding == wxFONTENCODING_UTF8 ) { wxMBConvUTF8 conv; wideBuff = conv.cMB2WC((char*)buffer, size + 4 - m_BOMSizeInBytes, &outlen); } else if ( m_Encoding == wxFONTENCODING_UTF16BE ) { wxMBConvUTF16BE conv; wideBuff = conv.cMB2WC((char*)buffer, size + 4 - m_BOMSizeInBytes, &outlen); } else if ( m_Encoding == wxFONTENCODING_UTF16LE ) { wxMBConvUTF16LE conv; wideBuff = conv.cMB2WC((char*)buffer, size + 4 - m_BOMSizeInBytes, &outlen); } else if ( m_Encoding == wxFONTENCODING_UTF32BE ) { wxMBConvUTF32BE conv; wideBuff = conv.cMB2WC((char*)buffer, size + 4 - m_BOMSizeInBytes, &outlen); } else if ( m_Encoding == wxFONTENCODING_UTF32LE ) { wxMBConvUTF32LE conv; wideBuff = conv.cMB2WC((char*)buffer, size + 4 - m_BOMSizeInBytes, &outlen); } else { // try wxEncodingConverter first, even it it only works for // wxFONTENCODING_ISO8859_1..15, wxFONTENCODING_CP1250..1257 and wxFONTENCODING_KOI8 // but it's much, much faster than wxCSConv (at least on linux) wxEncodingConverter conv; wchar_t* tmp = new wchar_t[size + 4 - m_BOMSizeInBytes]; if( conv.Init(m_Encoding, wxFONTENCODING_UNICODE) && conv.Convert((char*)buffer, tmp) ) { wideBuff = tmp; outlen = size + 4 - m_BOMSizeInBytes; // should be correct, because Convert has returned true } else { // try wxCSConv, if nothing else works wxCSConv conv(m_Encoding); wideBuff = conv.cMB2WC((char*)buffer, size + 4 - m_BOMSizeInBytes, &outlen); } delete [] tmp; } m_ConvStr = wxString(wideBuff); if (outlen == 0) { if(m_UseLog) { logmsg.Printf(_T("Encoding conversion using settings has failed!\n" "Encoding choosen was: %s (ID: %d)"), wxFontMapper::Get()->GetEncodingDescription(m_Encoding).c_str(), m_Encoding); logmgr->DebugLog(logmsg); } // Try system locale (if requested by the settings) ConfigManager* cfgMgr = Manager::Get()->GetConfigManager(_T("editor")); if (cfgMgr->ReadBool(_T("/default_encoding/use_system"), true)) { // Conversion has failed. Let's try with system-default encoding. if (platform::windows) { if(m_UseLog) { logmgr->DebugLog(_T("Trying system locale as fallback...")); } m_Encoding = wxLocale::GetSystemEncoding(); } else { // We can rely on the UTF-8 detection code ;-) if(m_UseLog) { logmgr->DebugLog(_T("Trying ISO-8859-1 as fallback...")); } m_Encoding = wxFONTENCODING_ISO8859_1; } wxCSConv conv_system(m_Encoding); wideBuff = conv_system.cMB2WC((char*)buffer, size + 4 - m_BOMSizeInBytes, &outlen); m_ConvStr = wxString(wideBuff); if (outlen == 0) { if(m_UseLog) { logmsg.Printf(_T("Encoding conversion using system locale fallback has failed!\n" "Last encoding choosen was: %s (ID: %d)\n" "Don't know what to do."), wxFontMapper::Get()->GetEncodingDescription(m_Encoding).c_str(), m_Encoding); logmgr->DebugLog(logmsg); } return false; } } else { return false; } } return true; }
bool Houses::payRent(Player* player, House* house, time_t time /*= 0*/) { if(rentPeriod == RENTPERIOD_NEVER){ return true; } if(time == 0){ time = std::time(NULL); } if(house->getRent() == 0 || house->getPaidUntil() > time){ return true; } Town* town = Towns::getInstance()->getTown(house->getTownId()); if(!town){ #ifdef __DEBUG_HOUSES__ std::cout << "Warning: [Houses::payHouses] town = NULL, townid = " << house->getTownId() << ", houseid = " << house->getHouseId() << std::endl; #endif return false; } bool hasEnoughMoney = false; Depot* depot = player->getDepot(town->getTownID(), true); if(depot){ if(g_config.getNumber(ConfigManager::USE_ACCBALANCE)){ if(player->getBalance() >= house->getRent()){ player->setBalance(player->getBalance() - house->getRent()); hasEnoughMoney = true; } } else{ hasEnoughMoney = g_game.removeMoney(player, depot, house->getRent(), FLAG_IGNORECAPACITY); } } if(hasEnoughMoney){ time_t paidUntil = time; switch(rentPeriod){ case RENTPERIOD_DAILY: paidUntil += 24 * 60 * 60; break; case RENTPERIOD_WEEKLY: paidUntil += 24 * 60 * 60 * 7; break; case RENTPERIOD_MONTHLY: paidUntil += 24 * 60 * 60 * 30; break; case RENTPERIOD_YEARLY: paidUntil += 24 * 60 * 60 * 365; break; case RENTPERIOD_NEVER: default: break; } house->setPaidUntil(paidUntil); } return hasEnoughMoney; }
void mainLoader(int argc, char* argv[], ServiceManager* services) { //dispatcher thread g_game.setGameState(GAME_STATE_STARTUP); srand((unsigned int)OTSYS_TIME()); #ifdef _WIN32 SetConsoleTitle(STATUS_SERVER_NAME); #endif std::cout << STATUS_SERVER_NAME << " - Version " << STATUS_SERVER_VERSION << std::endl; std::cout << "Compilied on " << __DATE__ << ' ' << __TIME__ << " for arch "; #if defined(__amd64__) || defined(_M_X64) std::cout << "x64" << std::endl; #elif defined(__i386__) || defined(_M_IX86) || defined(_X86_) std::cout << "x86" << std::endl; #elif defined(__arm__) std::cout << "ARM" << std::endl; #elif defined(__mips__) std::cout << "MIPS" << std::endl; #else std::cout << "unk" << std::endl; #endif std::cout << std::endl; std::cout << "A server developed by " << STATUS_SERVER_DEVELOPERS << std::endl; std::cout << "Visit our forum for updates, support, and resources: http://otland.net/." << std::endl; std::cout << std::endl; // read global config std::cout << ">> Loading config" << std::endl; if (!g_config.load()) { startupErrorMessage("Unable to load config.lua!"); return; } #ifdef _WIN32 std::string defaultPriority = asLowerCaseString(g_config.getString(ConfigManager::DEFAULT_PRIORITY)); if (defaultPriority == "realtime") { SetPriorityClass(GetCurrentProcess(), REALTIME_PRIORITY_CLASS); } else if (defaultPriority == "high") { SetPriorityClass(GetCurrentProcess(), HIGH_PRIORITY_CLASS); } else if (defaultPriority == "higher") { SetPriorityClass(GetCurrentProcess(), ABOVE_NORMAL_PRIORITY_CLASS); } std::ostringstream mutexName; mutexName << "forgottenserver_" << g_config.getNumber(ConfigManager::LOGIN_PORT); CreateMutex(nullptr, FALSE, mutexName.str().c_str()); if (GetLastError() == ERROR_ALREADY_EXISTS) { startupErrorMessage("Another instance of The Forgotten Server is already running with the same login port, please shut it down first or change ports for this one."); return; } #endif //set RSA key const char* p("14299623962416399520070177382898895550795403345466153217470516082934737582776038882967213386204600674145392845853859217990626450972452084065728686565928113"); const char* q("7630979195970404721891201847792002125535401292779123937207447574596692788513647179235335529307251350570728407373705564708871762033017096809910315212884101"); g_RSA.setKey(p, q); std::cout << ">> Establishing database connection..." << std::flush; Database* db = Database::getInstance(); if (!db->connect()) { startupErrorMessage("Failed to connect to database."); return; } std::cout << " MySQL " << Database::getClientVersion() << std::endl; // run database manager std::cout << ">> Running database manager" << std::endl; if (!DatabaseManager::isDatabaseSetup()) { startupErrorMessage("The database you have specified in config.lua is empty, please import the schema.sql to your database."); return; } DatabaseManager::updateDatabase(); DatabaseManager::checkEncryption(); if (g_config.getBoolean(ConfigManager::OPTIMIZE_DATABASE) && !DatabaseManager::optimizeTables()) { std::cout << "> No tables were optimized." << std::endl; } //load vocations std::cout << ">> Loading vocations" << std::endl; if (!g_vocations.loadFromXml()) { startupErrorMessage("Unable to load vocations!"); return; } //load commands std::cout << ">> Loading commands" << std::endl; if (!g_commands.loadFromXml()) { startupErrorMessage("Unable to load commands!"); return; } // load item data std::cout << ">> Loading items" << std::endl; if (Item::items.loadFromOtb("data/items/items.otb")) { startupErrorMessage("Unable to load items (OTB)!"); return; } if (!Item::items.loadFromXml()) { startupErrorMessage("Unable to load items (XML)!"); return; } std::cout << ">> Loading script systems" << std::endl; if (!ScriptingManager::getInstance()->loadScriptSystems()) { startupErrorMessage("Failed to load script systems"); return; } std::cout << ">> Loading monsters" << std::endl; if (!g_monsters.loadFromXml()) { startupErrorMessage("Unable to load monsters!"); return; } std::cout << ">> Loading outfits" << std::endl; Outfits* outfits = Outfits::getInstance(); if (!outfits->loadFromXml()) { startupErrorMessage("Unable to load outfits!"); return; } g_adminConfig = new AdminProtocolConfig(); std::cout << ">> Loading admin protocol config" << std::endl; if (!g_adminConfig->loadXMLConfig()) { startupErrorMessage("Unable to load admin protocol config!"); return; } std::cout << ">> Loading experience stages" << std::endl; if (!g_game.loadExperienceStages()) { startupErrorMessage("Unable to load experience stages!"); return; } std::string passwordType = asLowerCaseString(g_config.getString(ConfigManager::PASSWORDTYPE)); if (passwordType == "sha1") { g_config.setNumber(ConfigManager::PASSWORD_TYPE, PASSWORD_TYPE_SHA1); std::cout << ">> Using SHA1 passwords" << std::endl; } else { g_config.setNumber(ConfigManager::PASSWORD_TYPE, PASSWORD_TYPE_PLAIN); std::cout << ">> Using plaintext passwords" << std::endl; } std::cout << ">> Checking world type... " << std::flush; std::string worldType = asLowerCaseString(g_config.getString(ConfigManager::WORLD_TYPE)); if (worldType == "pvp") { g_game.setWorldType(WORLD_TYPE_PVP); } else if (worldType == "no-pvp") { g_game.setWorldType(WORLD_TYPE_NO_PVP); } else if (worldType == "pvp-enforced") { g_game.setWorldType(WORLD_TYPE_PVP_ENFORCED); } else { std::cout << std::endl; std::ostringstream ss; ss << "> ERROR: Unknown world type: " << g_config.getString(ConfigManager::WORLD_TYPE) << ", valid world types are: pvp, no-pvp and pvp-enforced."; startupErrorMessage(ss.str()); return; } std::cout << asUpperCaseString(worldType) << std::endl; std::cout << ">> Loading map" << std::endl; if (!g_game.loadMainMap(g_config.getString(ConfigManager::MAP_NAME))) { startupErrorMessage("Failed to load map"); return; } std::cout << ">> Initializing gamestate" << std::endl; g_game.setGameState(GAME_STATE_INIT); // Tibia protocols services->add<ProtocolGame>(g_config.getNumber(ConfigManager::GAME_PORT)); services->add<ProtocolLogin>(g_config.getNumber(ConfigManager::LOGIN_PORT)); // OT protocols services->add<ProtocolAdmin>(g_config.getNumber(ConfigManager::ADMIN_PORT)); services->add<ProtocolStatus>(g_config.getNumber(ConfigManager::STATUS_PORT)); // Legacy protocols services->add<ProtocolOldLogin>(g_config.getNumber(ConfigManager::LOGIN_PORT)); services->add<ProtocolOldGame>(g_config.getNumber(ConfigManager::LOGIN_PORT)); int32_t autoSaveEachMinutes = g_config.getNumber(ConfigManager::AUTO_SAVE_EACH_MINUTES); if (autoSaveEachMinutes > 0) { g_scheduler->addEvent(createSchedulerTask(autoSaveEachMinutes * 1000 * 60, std::bind(&Game::autoSave, &g_game))); } if (g_config.getBoolean(ConfigManager::SERVERSAVE_ENABLED)) { int32_t serverSaveHour = g_config.getNumber(ConfigManager::SERVERSAVE_H); if (serverSaveHour >= 0 && serverSaveHour <= 24) { time_t timeNow = time(nullptr); tm* timeinfo = localtime(&timeNow); if (serverSaveHour == 0) { serverSaveHour = 23; } else { serverSaveHour--; } timeinfo->tm_hour = serverSaveHour; timeinfo->tm_min = 55; timeinfo->tm_sec = 0; double difference = difftime(mktime(timeinfo), timeNow); if (difference < 0) { difference += 86400; } g_scheduler->addEvent(createSchedulerTask(difference * 1000, std::bind(&Game::prepareServerSave, &g_game))); } } Houses::getInstance().payHouses(); IOLoginData::updateHouseOwners(); g_game.checkExpiredMarketOffers(); IOMarket::getInstance()->updateStatistics(); std::cout << ">> Loaded all modules, server starting up..." << std::endl; #if !defined(WIN32) && !defined(__ROOT_PERMISSION__) if (getuid() == 0 || geteuid() == 0) { std::cout << "> WARNING: " << STATUS_SERVER_NAME << " has been executed as root user, it is recommended to execute is as a normal user." << std::endl; } #endif g_game.start(services); g_game.setGameState(GAME_STATE_NORMAL); g_loaderSignal.notify_all(); }
void Creature::onCreatureMove(const Creature* creature, const Tile* newTile, const Position& newPos, const Tile* oldTile, const Position& oldPos, bool teleport) { if(creature == this) { if(!oldTile->floorChange() && !oldTile->positionChange()) setLastPosition(oldPos); lastStep = OTSYS_TIME(); lastStepCost = 1; if(!teleport) { if(std::abs(newPos.x - oldPos.x) >= 1 && std::abs(newPos.y - oldPos.y) >= 1) lastStepCost = 3; } else stopEventWalk(); if(!summons.empty() && (!g_config.getBool(ConfigManager::TELEPORT_SUMMONS) || (g_config.getBool(ConfigManager::TELEPORT_PLAYER_SUMMONS) && !getPlayer()))) { std::list<Creature*>::iterator cit; std::list<Creature*> despawnList; for(cit = summons.begin(); cit != summons.end(); ++cit) { const Position pos = (*cit)->getPosition(); if((std::abs(pos.z - newPos.z) > 2) || (std::max(std::abs(( newPos.x) - pos.x), std::abs((newPos.y - 1) - pos.y)) > 30)) despawnList.push_back(*cit); } for(cit = despawnList.begin(); cit != despawnList.end(); ++cit) g_game.removeCreature((*cit), true); } if(newTile->getZone() != oldTile->getZone()) onChangeZone(getZone()); //update map cache if(isMapLoaded) { if(!teleport && oldPos.z == newPos.z) { Tile* tile = NULL; const Position& myPos = getPosition(); if(oldPos.y > newPos.y) //north { //shift y south for(int32_t y = mapWalkHeight - 1 - 1; y >= 0; --y) memcpy(localMapCache[y + 1], localMapCache[y], sizeof(localMapCache[y])); //update 0 for(int32_t x = -((mapWalkWidth - 1) / 2); x <= ((mapWalkWidth - 1) / 2); ++x) { tile = g_game.getTile(myPos.x + x, myPos.y - ((mapWalkHeight - 1) / 2), myPos.z); updateTileCache(tile, x, -((mapWalkHeight - 1) / 2)); } } else if(oldPos.y < newPos.y) // south { //shift y north for(int32_t y = 0; y <= mapWalkHeight - 1 - 1; ++y) memcpy(localMapCache[y], localMapCache[y + 1], sizeof(localMapCache[y])); //update mapWalkHeight - 1 for(int32_t x = -((mapWalkWidth - 1) / 2); x <= ((mapWalkWidth - 1) / 2); ++x) { tile = g_game.getTile(myPos.x + x, myPos.y + ((mapWalkHeight - 1) / 2), myPos.z); updateTileCache(tile, x, (mapWalkHeight - 1) / 2); } } if(oldPos.x < newPos.x) // east { //shift y west int32_t starty = 0, endy = mapWalkHeight - 1, dy = (oldPos.y - newPos.y); if(dy < 0) endy = endy + dy; else if(dy > 0) starty = starty + dy; for(int32_t y = starty; y <= endy; ++y) { for(int32_t x = 0; x <= mapWalkWidth - 1 - 1; ++x) localMapCache[y][x] = localMapCache[y][x + 1]; } //update mapWalkWidth - 1 for(int32_t y = -((mapWalkHeight - 1) / 2); y <= ((mapWalkHeight - 1) / 2); ++y) { tile = g_game.getTile(myPos.x + ((mapWalkWidth - 1) / 2), myPos.y + y, myPos.z); updateTileCache(tile, (mapWalkWidth - 1) / 2, y); } } else if(oldPos.x > newPos.x) // west { //shift y east int32_t starty = 0, endy = mapWalkHeight - 1, dy = (oldPos.y - newPos.y); if(dy < 0) endy = endy + dy; else if(dy > 0) starty = starty + dy; for(int32_t y = starty; y <= endy; ++y) { for(int32_t x = mapWalkWidth - 1 - 1; x >= 0; --x) localMapCache[y][x + 1] = localMapCache[y][x]; } //update 0 for(int32_t y = -((mapWalkHeight - 1) / 2); y <= ((mapWalkHeight - 1) / 2); ++y) { tile = g_game.getTile(myPos.x - ((mapWalkWidth - 1) / 2), myPos.y + y, myPos.z); updateTileCache(tile, -((mapWalkWidth - 1) / 2), y); } } updateTileCache(oldTile, oldPos); #ifdef __DEBUG__ validateMapCache(); #endif } else updateMapCache(); } } else if(isMapLoaded) { const Position& myPos = getPosition(); if(newPos.z == myPos.z) updateTileCache(newTile, newPos); if(oldPos.z == myPos.z) updateTileCache(oldTile, oldPos); } if(creature == followCreature || (creature == this && followCreature)) { if(hasFollowPath) { isUpdatingPath = true; Dispatcher::getInstance().addTask(createTask( boost::bind(&Game::updateCreatureWalk, &g_game, getID()))); } if(newPos.z != oldPos.z || !canSee(followCreature->getPosition())) internalCreatureDisappear(followCreature, false); } if(creature == attackedCreature || (creature == this && attackedCreature)) { if(newPos.z == oldPos.z && canSee(attackedCreature->getPosition())) { if(hasExtraSwing()) //our target is moving lets see if we can get in hit Dispatcher::getInstance().addTask(createTask( boost::bind(&Game::checkCreatureAttack, &g_game, getID()))); if(newTile->getZone() != oldTile->getZone()) onTargetChangeZone(attackedCreature->getZone()); } else internalCreatureDisappear(attackedCreature, false); } }
void SEditorColourSet::Save() { // no need for syntax highlighting if batch building if (Manager::IsBatchBuild()) return; wxString key; ConfigManager* cfg = Manager::Get()->GetConfigManager(_T("editor")); //FIXME: Commenting out the following line is no definite cure, but it hides the annoying disappearing colourset for now //NOTE (mandrav): uncommenting it doesn't seem to cause any trouble (at least now). What was the problem? cfg->DeleteSubPath(_T("/colour_sets/") + m_Name); // write the theme name cfg->Write(_T("/colour_sets/") + m_Name + _T("/name"), m_Name); for (SOptionSetsMap::iterator it = m_Sets.begin(); it != m_Sets.end(); ++it) { if (it->first == HL_NONE || it->first == HL_AUTO) continue; wxString lang = it->first; bool gsaved = false; key.Clear(); key << _T("/colour_sets/") << m_Name << _T('/') << lang; for (unsigned int i = 0; i < it->second.m_Colours.GetCount(); ++i) { SOptionColour* opt = it->second.m_Colours.Item(i); wxString tmpKey; tmpKey << key << _T("/style") << wxString::Format(_T("%d"), i); bool saved = false; if (opt->fore != opt->originalfore && opt->fore != wxNullColour) { cfg->Write(tmpKey + _T("/fore"), opt->fore); saved = true; } if (opt->back != opt->originalback && opt->back != wxNullColour) { cfg->Write(tmpKey + _T("/back"), opt->back); saved = true; } if (opt->bold != opt->originalbold) { cfg->Write(tmpKey + _T("/bold"), opt->bold); saved = true; } if (opt->italics != opt->originalitalics) { cfg->Write(tmpKey + _T("/italics"), opt->italics); saved = true; } if (opt->underlined != opt->originalunderlined) { cfg->Write(tmpKey + _T("/underlined"), opt->underlined); saved = true; } if (opt->isStyle != opt->originalisStyle) { cfg->Write(tmpKey + _T("/isStyle"), opt->isStyle); saved = true; } if (saved) { cfg->Write(tmpKey + _T("/name"), opt->name, true); gsaved = true; } } wxString tmpkey; for (int i = 0; i <= wxSCI_KEYWORDSET_MAX; ++i) { if (it->second.m_Keywords[i] != it->second.m_originalKeywords[i]) { tmpkey.Printf(_T("%s/editor/keywords/set%d"), key.c_str(), i); cfg->Write(tmpkey, it->second.m_Keywords[i]); gsaved = true; } } tmpkey.Printf(_T("%s/editor/filemasks"), key.c_str()); wxString tmparr = GetStringFromArray(it->second.m_FileMasks, _T(",")); wxString tmparrorig = GetStringFromArray(it->second.m_originalFileMasks, _T(",")); if (tmparr != tmparrorig) { cfg->Write(tmpkey, tmparr); gsaved = true; } if (gsaved) cfg->Write(key + _T("/name"), it->second.m_Langs); } }
bool Creature::onDeath() { DeathList deathList = getKillers(); bool deny = false; CreatureEventList prepareDeathEvents = getCreatureEvents(CREATURE_EVENT_PREPAREDEATH); for(CreatureEventList::iterator it = prepareDeathEvents.begin(); it != prepareDeathEvents.end(); ++it) { if(!(*it)->executePrepareDeath(this, deathList) && !deny) deny = true; } if(deny) return false; int32_t i = 0, size = deathList.size(), limit = g_config.getNumber(ConfigManager::DEATH_ASSISTS) + 1; if(limit > 0 && size > limit) size = limit; Creature* tmp = NULL; CreatureVector justifyVec; for(DeathList::iterator it = deathList.begin(); it != deathList.end(); ++it, ++i) { if(it->isNameKill()) continue; if(it == deathList.begin()) it->setLast(); if(i < size) { if(it->getKillerCreature()->getPlayer()) tmp = it->getKillerCreature(); else if(it->getKillerCreature()->getPlayerMaster()) tmp = it->getKillerCreature()->getMaster(); } if(tmp) { if(std::find(justifyVec.begin(), justifyVec.end(), tmp) == justifyVec.end()) { it->setJustify(); justifyVec.push_back(tmp); } tmp = NULL; } if(!it->getKillerCreature()->onKilledCreature(this, (*it)) && it->isLast()) return false; } for(CountMap::iterator it = damageMap.begin(); it != damageMap.end(); ++it) { if((tmp = g_game.getCreatureByID(it->first))) tmp->onTargetKilled(this); } dropCorpse(deathList); if(master) master->removeSummon(this); return true; }
std::string Item::getDescription(const ItemType& it, int32_t lookDistance, const Item* item/* = NULL*/, int32_t subType/* = -1*/, bool addArticle/* = true*/) { std::stringstream s; s << getNameDescription(it, item, subType, addArticle); if(item) subType = item->getSubType(); bool dot = true; if(it.isRune()) { s << "("; if(!it.runeSpellName.empty()) s << "\"" << it.runeSpellName << "\", "; s << "Charges:" << subType << ")"; if(it.runeLevel > 0 || it.runeMagLevel > 0 || (it.vocationString != "" && it.wieldInfo == 0)) { s << "." << std::endl << "It can only be used"; if(it.vocationString != "" && it.wieldInfo == 0) s << " by " << it.vocationString; bool begin = true; if(it.runeLevel > 0) { begin = false; s << " with level " << it.runeLevel; } if(it.runeMagLevel > 0) { begin = false; s << " " << (begin ? "with" : "and") << " magic level " << it.runeMagLevel; } if(!begin) s << " or higher"; } } else if(it.weaponType != WEAPON_NONE) { bool begin = true; if(it.weaponType == WEAPON_DIST && it.ammoType != AMMO_NONE) { begin = false; s << " (Range:" << int32_t(item ? item->getShootRange() : it.shootRange); if(it.attack || it.extraAttack || (item && (item->getAttack() || item->getExtraAttack()))) { s << ", Atk " << std::showpos << int32_t(item ? item->getAttack() : it.attack); if(it.extraAttack || (item && item->getExtraAttack())) s << " " << std::showpos << int32_t(item ? item->getExtraAttack() : it.extraAttack) << std::noshowpos; } if(it.hitChance != -1 || (item && item->getHitChance() != -1)) s << ", Hit% " << std::showpos << (item ? item->getHitChance() : it.hitChance) << std::noshowpos; } else if(it.weaponType != WEAPON_AMMO && it.weaponType != WEAPON_WAND) { if(it.attack || it.extraAttack || (item && (item->getAttack() || item->getExtraAttack()))) { begin = false; s << " (Atk:"; if(it.abilities.elementType != COMBAT_NONE && it.decayTo < 1) { s << std::max((int32_t)0, int32_t((item ? item->getAttack() : it.attack) - it.abilities.elementDamage)); if(it.extraAttack || (item && item->getExtraAttack())) s << " " << std::showpos << int32_t(item ? item->getExtraAttack() : it.extraAttack) << std::noshowpos; s << " physical + " << it.abilities.elementDamage << " " << getCombatName(it.abilities.elementType); } else { s << int32_t(item ? item->getAttack() : it.attack); if(it.extraAttack || (item && item->getExtraAttack())) s << " " << std::showpos << int32_t(item ? item->getExtraAttack() : it.extraAttack) << std::noshowpos; } } if(it.defense || it.extraDefense || (item && (item->getDefense() || item->getExtraDefense()))) { if(begin) { begin = false; s << " ("; } else s << ", "; s << "Def:" << int32_t(item ? item->getDefense() : it.defense); if(it.extraDefense || (item && item->getExtraDefense())) s << " " << std::showpos << int32_t(item ? item->getExtraDefense() : it.extraDefense) << std::noshowpos; } } for(uint16_t i = SKILL_FIRST; i <= SKILL_LAST; i++) { if(!it.abilities.skills[i]) continue; if(begin) { begin = false; s << " ("; } else s << ", "; s << getSkillName(i) << " " << std::showpos << (int32_t)it.abilities.skills[i] << std::noshowpos; } if(it.abilities.stats[STAT_MAGICLEVEL]) { if(begin) { begin = false; s << " ("; } else s << ", "; s << "magic level " << std::showpos << (int32_t)it.abilities.stats[STAT_MAGICLEVEL] << std::noshowpos; } int32_t show = it.abilities.absorb[COMBAT_FIRST]; for(uint32_t i = (COMBAT_FIRST + 1); i <= COMBAT_LAST; i++) { if(it.abilities.absorb[i] == show) continue; show = 0; break; } // TODO: update to the latest (from below) if(!show) { bool tmp = true; for(uint32_t i = COMBAT_FIRST; i <= COMBAT_LAST; i++) { if(!it.abilities.absorb[i]) continue; if(tmp) { if(begin) { begin = false; s << " ("; } else s << ", "; tmp = false; s << "protection "; } else s << ", "; s << getCombatName((CombatType_t)i) << " " << std::showpos << it.abilities.absorb[i] << std::noshowpos << "%"; } } else { if(begin) { begin = false; s << " ("; } else s << ", "; s << "protection all " << std::showpos << show << std::noshowpos << "%"; } if(it.abilities.speed) { if(begin) { begin = false; s << " ("; } else s << ", "; s << "speed " << std::showpos << (int32_t)(it.abilities.speed / 2) << std::noshowpos; } if(it.dualWield || (item && item->isDualWield())) { if(begin) { begin = false; s << " ("; } else s << ", "; s << "dual wielding"; } if(!begin) s << ")"; } else if(it.armor || (item && item->getArmor()) || it.showAttributes) { int32_t tmp = it.armor; if(item) tmp = item->getArmor(); bool begin = true; if(tmp) { s << " (Arm:" << tmp; begin = false; } for(uint16_t i = SKILL_FIRST; i <= SKILL_LAST; i++) { if(!it.abilities.skills[i]) continue; if(begin) { begin = false; s << " ("; } else s << ", "; s << getSkillName(i) << " " << std::showpos << (int32_t)it.abilities.skills[i] << std::noshowpos; } if(it.abilities.stats[STAT_MAGICLEVEL]) { if(begin) { begin = false; s << " ("; } else s << ", "; s << "magic level " << std::showpos << (int32_t)it.abilities.stats[STAT_MAGICLEVEL] << std::noshowpos; } // TODO: we should find some better way of completing this int32_t show = it.abilities.absorb[COMBAT_FIRST]; for(int32_t i = (COMBAT_FIRST + 1); i <= COMBAT_LAST; i++) { if(it.abilities.absorb[i] == show) continue; show = 0; break; } if(!show) { bool tmp = true; for(int32_t i = COMBAT_FIRST; i <= COMBAT_LAST; i++) { if(!it.abilities.absorb[i]) continue; if(tmp) { tmp = false; if(begin) { begin = false; s << " ("; } else s << ", "; s << "protection "; } else s << ", "; s << getCombatName((CombatType_t)i) << " " << std::showpos << it.abilities.absorb[i] << std::noshowpos << "%"; } } else { if(begin) { begin = false; s << " ("; } else s << ", "; s << "protection all " << std::showpos << show << std::noshowpos << "%"; } // TODO: same case as absorbs... show = it.abilities.reflect[REFLECT_CHANCE][COMBAT_FIRST]; for(int32_t i = (COMBAT_FIRST + 1); i <= COMBAT_LAST; i++) { if(it.abilities.reflect[REFLECT_CHANCE][i] == show) continue; show = 0; break; } if(!show) { bool tmp = true; for(int32_t i = COMBAT_FIRST; i <= COMBAT_LAST; i++) { if(!it.abilities.reflect[REFLECT_CHANCE][i] || !it.abilities.reflect[REFLECT_PERCENT][i]) continue; if(tmp) { tmp = false; if(begin) { begin = false; s << " ("; } else s << ", "; s << "reflect: "; } else s << ", "; s << it.abilities.reflect[REFLECT_CHANCE][i] << "% for "; if(it.abilities.reflect[REFLECT_PERCENT][i] > 99) s << "whole"; else if(it.abilities.reflect[REFLECT_PERCENT][i] >= 75) s << "huge"; else if(it.abilities.reflect[REFLECT_PERCENT][i] >= 50) s << "medium"; else if(it.abilities.reflect[REFLECT_PERCENT][i] >= 25) s << "small"; else s << "tiny"; s << getCombatName((CombatType_t)i); } if(!tmp) s << " damage"; } else { if(begin) { begin = false; s << " ("; } else s << ", "; int32_t tmp = it.abilities.reflect[REFLECT_PERCENT][COMBAT_FIRST]; for(int32_t i = (COMBAT_FIRST + 1); i <= COMBAT_LAST; i++) { if(it.abilities.reflect[REFLECT_PERCENT][i] == tmp) continue; tmp = 0; break; } s << "reflect: " << show << "% for "; if(tmp) { if(tmp > 99) s << "whole"; else if(tmp >= 75) s << "huge"; else if(tmp >= 50) s << "medium"; else if(tmp >= 25) s << "small"; else s << "tiny"; } else s << "mixed"; s << " damage"; } if(it.abilities.speed) { if(begin) { begin = false; s << " ("; } else s << ", "; s << "speed " << std::showpos << (int32_t)(it.abilities.speed / 2) << std::noshowpos; } if(!begin) s << ")"; } else if(it.isContainer()) s << " (Vol:" << (int32_t)it.maxItems << ")"; else if(it.isKey()) s << " (Key:" << (item ? (int32_t)item->getActionId() : 0) << ")"; else if(it.isFluidContainer()) { if(subType > 0) s << " of " << (items[subType].name.length() ? items[subType].name : "unknown"); else s << ". It is empty"; } else if(it.isSplash()) { s << " of "; if(subType > 0 && items[subType].name.length()) s << items[subType].name; else s << "unknown"; } else if(it.allowDistRead) { s << std::endl; if(item && !item->getText().empty()) { if(lookDistance <= 4) { if(!item->getWriter().empty()) { s << item->getWriter() << " wrote"; time_t date = item->getDate(); if(date > 0) s << " on " << formatDate(date); s << ": "; } else s << "You read: "; std::string text = item->getText(); s << text; if(!text.empty()) { char end = *text.rbegin(); if(end == '?' || end == '!' || end == '.') dot = false; } } else s << "You are too far away to read it"; } else s << "Nothing is written on it"; } else if(it.levelDoor && item && item->getActionId() >= (int32_t)it.levelDoor && item->getActionId() <= ((int32_t)it.levelDoor + g_config.getNumber(ConfigManager::MAXIMUM_DOOR_LEVEL))) s << " for level " << item->getActionId() - it.levelDoor; if(it.showCharges) s << " that has " << subType << " charge" << (subType != 1 ? "s" : "") << " left"; if(it.showDuration) { if(item && item->hasIntegerAttribute("duration")) { int32_t duration = item->getDuration() / 1000; s << " that has energy for "; if(duration >= 120) s << duration / 60 << " minutes left"; else if(duration > 60) s << "1 minute left"; else s << " less than a minute left"; } else s << " that is brand-new"; } if(dot) s << "."; if(it.wieldInfo) { s << std::endl << "It can only be wielded properly by "; if(it.wieldInfo & WIELDINFO_PREMIUM) s << "premium "; if(it.wieldInfo & WIELDINFO_VOCREQ) s << it.vocationString; else s << "players"; if(it.wieldInfo & WIELDINFO_LEVEL) s << " of level " << (int32_t)it.minReqLevel << " or higher"; if(it.wieldInfo & WIELDINFO_MAGLV) { if(it.wieldInfo & WIELDINFO_LEVEL) s << " and"; else s << " of"; s << " magic level " << (int32_t)it.minReqMagicLevel << " or higher"; } s << "."; } if(lookDistance <= 1 && it.pickupable) { std::string tmp; if(!item) tmp = getWeightDescription(it.weight, it.stackable, subType); else tmp = item->getWeightDescription(); if(!tmp.empty()) s << std::endl << tmp; } if(it.abilities.elementType != COMBAT_NONE && it.decayTo > 0) { s << std::endl << "It is temporarily enchanted with " << getCombatName(it.abilities.elementType) << " ("; s << std::max((int32_t)0, int32_t((item ? item->getAttack() : it.attack) - it.abilities.elementDamage)); if(it.extraAttack || (item && item->getExtraAttack())) s << " " << std::showpos << int32_t(item ? item->getExtraAttack() : it.extraAttack) << std::noshowpos; s << " physical + " << it.abilities.elementDamage << " " << getCombatName(it.abilities.elementType) << " damage)."; } std::string str; if(item && !item->getSpecialDescription().empty()) str = item->getSpecialDescription(); else if(!it.description.empty() && lookDistance <= 1) str = it.description; if(str.empty()) return s.str(); if(str.find("|PLAYERNAME|") != std::string::npos) { std::string tmp = "You"; if(item) { if(const Player* player = item->getHoldingPlayer()) tmp = player->getName(); } replaceString(str, "|PLAYERNAME|", tmp); } if(str.find("|TIME|") != std::string::npos || str.find("|DATE|") != std::string::npos || str.find( "|DAY|") != std::string::npos || str.find("|MONTH|") != std::string::npos || str.find( "|YEAR|") != std::string::npos || str.find("|HOUR|") != std::string::npos || str.find( "|MINUTES|") != std::string::npos || str.find("|SECONDS|") != std::string::npos || str.find("|WEEKDAY|") != std::string::npos || str.find("|YEARDAY|") != std::string::npos) { time_t now = time(NULL); tm* ts = localtime(&now); std::stringstream ss; ss << ts->tm_sec; replaceString(str, "|SECONDS|", ss.str()); ss.str(""); ss << ts->tm_min; replaceString(str, "|MINUTES|", ss.str()); ss.str(""); ss << ts->tm_hour; replaceString(str, "|HOUR|", ss.str()); ss.str(""); ss << ts->tm_mday; replaceString(str, "|DAY|", ss.str()); ss.str(""); ss << (ts->tm_mon + 1); replaceString(str, "|MONTH|", ss.str()); ss.str(""); ss << (ts->tm_year + 1900); replaceString(str, "|YEAR|", ss.str()); ss.str(""); ss << ts->tm_wday; replaceString(str, "|WEEKDAY|", ss.str()); ss.str(""); ss << ts->tm_yday; replaceString(str, "|YEARDAY|", ss.str()); ss.str(""); ss << ts->tm_hour << ":" << ts->tm_min << ":" << ts->tm_sec; replaceString(str, "|TIME|", ss.str()); ss.str(""); replaceString(str, "|DATE|", formatDateEx(now)); } s << std::endl << str; return s.str(); }
void CIMServer::_init() { // pre-initialize the hostname. System::getHostName(); _monitor.reset(new Monitor()); #if (defined(PEGASUS_OS_HPUX) || defined(PEGASUS_OS_LINUX)) \ && defined(PEGASUS_USE_RELEASE_DIRS) if (chdir(PEGASUS_CORE_DIR) != 0) { PEG_TRACE((TRC_SERVER, Tracer::LEVEL2, "chdir(\"%s\") failed with errno %d.", PEGASUS_CORE_DIR, errno)); } #endif // -- Create a repository: String repositoryRootPath = ConfigManager::getHomedPath( ConfigManager::getInstance()->getCurrentValue("repositoryDir")); #ifdef DO_NOT_CREATE_REPOSITORY_ON_STARTUP // If this code is enable, the CIMServer will fail to start // if the repository directory does not exist. If called, // the Repository will create an empty repository. // This check has been disabled to allow cimmof to call // the CIMServer to build the initial repository. if (!FileSystem::isDirectory(repositoryRootPath)) { throw NoSuchDirectory(repositoryRootPath); } #endif _repository = new CIMRepository(repositoryRootPath); // -- Create a UserManager object: #ifndef PEGASUS_PAM_AUTHENTICATION UserManager::getInstance(_repository); #endif // -- Create a SCMOClass Cache and set call back for the repository SCMOClassCache::getInstance()->setCallBack(_scmoClassCache_GetClass); // -- Create a CIMServerState object: _serverState.reset(new CIMServerState()); _providerRegistrationManager = new ProviderRegistrationManager(_repository); // -- Create queue inter-connections: _providerManager = new ProviderManagerService( _providerRegistrationManager, _repository, DefaultProviderManager::createDefaultProviderManagerCallback); // Create IndicationHandlerService: _handlerService = new IndicationHandlerService(_repository); _cimOperationRequestDispatcher = new CIMOperationRequestDispatcher( _repository, _providerRegistrationManager); // Create the control service _controlService = new ModuleController(PEGASUS_QUEUENAME_CONTROLSERVICE); // Jump this number up when there are more control providers. _controlProviders.reserveCapacity(16); // Create the Configuration control provider ProviderMessageHandler* configProvider = new ProviderMessageHandler( "CIMServerControlProvider", "ConfigSettingProvider", new ConfigSettingProvider(), 0, 0, false); _controlProviders.append(configProvider); _controlService->register_module( PEGASUS_MODULENAME_CONFIGPROVIDER, configProvider, controlProviderReceiveMessageCallback); #ifndef PEGASUS_PAM_AUTHENTICATION // Create the User/Authorization control provider ProviderMessageHandler* userAuthProvider = new ProviderMessageHandler( "CIMServerControlProvider", "UserAuthProvider", new UserAuthProvider(_repository), 0, 0, false); _controlProviders.append(userAuthProvider); _controlService->register_module( PEGASUS_MODULENAME_USERAUTHPROVIDER, userAuthProvider, controlProviderReceiveMessageCallback); #endif // Create the Provider Registration control provider ProviderMessageHandler* provRegProvider = new ProviderMessageHandler( "CIMServerControlProvider", "ProviderRegistrationProvider", new ProviderRegistrationProvider(_providerRegistrationManager), ModuleController::indicationCallback, 0, false); // Warning: The ProviderRegistrationProvider destructor deletes // _providerRegistrationManager _controlProviders.append(provRegProvider); _controlService->register_module( PEGASUS_MODULENAME_PROVREGPROVIDER, provRegProvider, controlProviderReceiveMessageCallback); // Create the Shutdown control provider ProviderMessageHandler* shutdownProvider = new ProviderMessageHandler( "CIMServerControlProvider", "ShutdownProvider", new ShutdownProvider(this), 0, 0, false); _controlProviders.append(shutdownProvider); _controlService->register_module( PEGASUS_MODULENAME_SHUTDOWNPROVIDER, shutdownProvider, controlProviderReceiveMessageCallback); // Create the namespace control provider ProviderMessageHandler* namespaceProvider = new ProviderMessageHandler( "CIMServerControlProvider", "NamespaceProvider", new NamespaceProvider(_repository), 0, 0, false); _controlProviders.append(namespaceProvider); _controlService->register_module( PEGASUS_MODULENAME_NAMESPACEPROVIDER, namespaceProvider, controlProviderReceiveMessageCallback); // // Create a SSLContextManager object // _sslContextMgr = new SSLContextManager(); #ifdef PEGASUS_HAS_SSL // Because this provider allows management of the cimserver truststore // it needs to be available regardless of the value // of sslClientVerificationMode config property. ProviderMessageHandler* certificateProvider = new ProviderMessageHandler( "CIMServerControlProvider", "CertificateProvider", new CertificateProvider(_repository, _sslContextMgr), 0, 0, false); _controlProviders.append(certificateProvider); _controlService->register_module( PEGASUS_MODULENAME_CERTIFICATEPROVIDER, certificateProvider, controlProviderReceiveMessageCallback); #endif #ifndef PEGASUS_DISABLE_PERFINST // Create the Statistical Data control provider ProviderMessageHandler* cimomstatdataProvider = new ProviderMessageHandler( "CIMServerControlProvider", "CIMOMStatDataProvider", new CIMOMStatDataProvider(), 0, 0, false); _controlProviders.append(cimomstatdataProvider); _controlService->register_module( PEGASUS_MODULENAME_CIMOMSTATDATAPROVIDER, cimomstatdataProvider, controlProviderReceiveMessageCallback); #endif #ifdef PEGASUS_ENABLE_CQL // Create the Query Capabilities control provider ProviderMessageHandler* cimquerycapprovider = new ProviderMessageHandler( "CIMServerControlProvider", "CIMQueryCapabilitiesProvider", new CIMQueryCapabilitiesProvider(), 0, 0, false); _controlProviders.append(cimquerycapprovider); _controlService->register_module( PEGASUS_MODULENAME_CIMQUERYCAPPROVIDER, cimquerycapprovider, controlProviderReceiveMessageCallback); #endif #if defined PEGASUS_ENABLE_INTEROP_PROVIDER // Create the interop control provider ProviderMessageHandler* interopProvider = new ProviderMessageHandler( "CIMServerControlProvider", "InteropProvider", new InteropProvider( _repository, _providerRegistrationManager), 0, 0, false); _controlProviders.append(interopProvider); _controlService->register_module( PEGASUS_MODULENAME_INTEROPPROVIDER, interopProvider, controlProviderReceiveMessageCallback); #endif _cimOperationResponseEncoder = new CIMOperationResponseEncoder; // // get the configured authentication and authorization flags // ConfigManager* configManager = ConfigManager::getInstance(); Boolean enableAuthentication = ConfigManager::parseBooleanValue( configManager->getCurrentValue("enableAuthentication")); MessageQueue* cimOperationProcessorQueue = 0; // // Create Authorization queue only if authentication is enabled // if ( enableAuthentication ) { _cimOperationRequestAuthorizer = new CIMOperationRequestAuthorizer( _cimOperationRequestDispatcher); cimOperationProcessorQueue = _cimOperationRequestAuthorizer; } else { _cimOperationRequestAuthorizer = 0; cimOperationProcessorQueue = _cimOperationRequestDispatcher; } _cimOperationRequestDecoder = new CIMOperationRequestDecoder( cimOperationProcessorQueue, _cimOperationResponseEncoder->getQueueId()); _cimExportRequestDispatcher = new CIMExportRequestDispatcher(); _cimExportResponseEncoder = new CIMExportResponseEncoder; _cimExportRequestDecoder = new CIMExportRequestDecoder( _cimExportRequestDispatcher, _cimExportResponseEncoder->getQueueId()); _httpAuthenticatorDelegator = new HTTPAuthenticatorDelegator( _cimOperationRequestDecoder->getQueueId(), _cimExportRequestDecoder->getQueueId(), _repository); _rsProcessor = new RsProcessor( cimOperationProcessorQueue, _repository); _httpAuthenticatorDelegator->setRsQueueId( _rsProcessor->getRsRequestDecoderQueueId()); #ifdef PEGASUS_ENABLE_PROTOCOL_WEB _webServer = new WebServer(); _httpAuthenticatorDelegator->setWebQueueId( _webServer->getQueueId()); #endif #ifdef PEGASUS_ENABLE_PROTOCOL_WSMAN _wsmProcessor = new WsmProcessor( cimOperationProcessorQueue, _repository); _httpAuthenticatorDelegator->setWsmQueueId( _wsmProcessor->getWsmRequestDecoderQueueId()); #endif // IMPORTANT-NU-20020513: Indication service must start after ExportService // otherwise HandlerService started by indicationService will never // get ExportQueue to export indications for existing subscriptions _indicationService = new IndicationService( _repository, _providerRegistrationManager); // Build the Control Provider and Service internal routing table. This must // be called after MessageQueueService initialized and ServiceQueueIds // installed. DynamicRoutingTable::buildRoutingTable(); // Enable the signal handler to shutdown gracefully on SIGHUP and SIGTERM getSigHandle()->registerHandler(PEGASUS_SIGHUP, shutdownSignalHandler); getSigHandle()->activate(PEGASUS_SIGHUP); getSigHandle()->registerHandler(PEGASUS_SIGTERM, shutdownSignalHandler); getSigHandle()->activate(PEGASUS_SIGTERM); #ifdef PEGASUS_OS_PASE getSigHandle()->registerHandler(SIGFPE, _synchronousSignalHandler); getSigHandle()->activate(SIGFPE); getSigHandle()->registerHandler(SIGILL, _synchronousSignalHandler); getSigHandle()->activate(SIGILL); getSigHandle()->registerHandler(SIGSEGV, _synchronousSignalHandler); getSigHandle()->activate(SIGSEGV); getSigHandle()->registerHandler(SIGIO, _asynchronousSignalHandler); getSigHandle()->activate(SIGIO); #endif #ifdef PEGASUS_OS_ZOS // Establish handling signal send to us on USS shutdown getSigHandle()->registerHandler(PEGASUS_SIGDANGER, shutdownSignalHandler); getSigHandle()->activate(PEGASUS_SIGDANGER); // enable process to receive SIGDANGER on USS shutdown __shutdown_registration(_SDR_NOTIFY, _SDR_REGPROCESS, _SDR_SENDSIGDANGER); #endif // // Set up an additional thread waiting for commands from the // system console // #if defined PEGASUS_OS_ZOS ZOSConsoleManager::startConsoleWatchThread(); #endif #ifdef PEGASUS_ENABLE_AUDIT_LOGGER // Register audit logger initialize callback AuditLogger::setInitializeCallback(auditLogInitializeCallback); Boolean enableAuditLog = ConfigManager::parseBooleanValue( configManager->getCurrentValue("enableAuditLog")); if (enableAuditLog) { AuditLogger::setEnabled(enableAuditLog); } #endif }