int main(int argc, char **argv) { RegisterExecutablePlatform(ExePlatformClientExport); set_exception_handler(); LogFile->write(EQEMuLog::Status, "Client Files Export Utility"); if(!EQEmuConfig::LoadConfig()) { LogFile->write(EQEMuLog::Error, "Unable to load configuration file."); return 1; } const EQEmuConfig *config = EQEmuConfig::get(); if(!load_log_settings(config->LogSettingsFile.c_str())) { LogFile->write(EQEMuLog::Error, "Warning: unable to read %s.", config->LogSettingsFile.c_str()); } SharedDatabase database; LogFile->write(EQEMuLog::Status, "Connecting to database..."); if(!database.Connect(config->DatabaseHost.c_str(), config->DatabaseUsername.c_str(), config->DatabasePassword.c_str(), config->DatabaseDB.c_str(), config->DatabasePort)) { LogFile->write(EQEMuLog::Error, "Unable to connect to the database, cannot continue without a " "database connection"); return 1; } ExportSpells(&database); ExportSkillCaps(&database); ExportBaseData(&database); return 0; }
int main(int argc, char *argv[]) { if(!load_log_settings("log.ini")) _log(COLLECT__MESSAGE, "Warning: Unable to read %s", "log.ini"); else _log(COLLECT__MESSAGE, "Log settings loaded from %s", "log.ini"); if(!PyRepString::LoadStringFile("strings.txt")) _log(COLLECT__ERROR, "Unable to open ./strings.txt, I need it to decode string table elements!"); EVECollectDispatcher dispatch; dispatch.lookResolver.LoadIntFile("intres.txt"); dispatch.lookResolver.LoadStringFile("strres.txt"); return(EVE_NIDS_main(&dispatch, argc, argv)); }
int main( int argc, char* argv[] ) { #if defined( MSVC ) && !defined( NDEBUG ) // Under Visual Studio setup memory leak detection _CrtSetDbgFlag( _CRTDBG_LEAK_CHECK_DF | _CrtSetDbgFlag( _CRTDBG_REPORT_FLAG ) ); #endif /* defined( MSVC ) && !defined( NDEBUG ) */ printf("Copyright (C) 2006-2011 EVEmu Team. http://evemu.org/\n"); printf("This program is free software; you can redistribute it and/or modify it under\n"); printf("the terms of the GNU Lesser General Public License as published by the Free \n"); printf("Software Foundation; either version 2 of the License, or (at your option) any\n"); printf("later version.\n"); printf("\n"); printf("This program is distributed in the hope that it will be useful, but WITHOUT\n"); printf("ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS\n"); printf("FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more\n"); printf("details.\n"); printf("\n"); sLog.Log("main", "EVEmu "EVEMU_VERSION ); sLog.Log("server init", "\n" "\tSupported Client: %s\n" "\tVersion %.2f\n" "\tBuild %d\n" "\tMachoNet %u", EVEProjectVersion, EVEVersionNumber, EVEBuildVersion, MachoNetVersion ); //it is important to do this before doing much of anything, in case they use it. Timer::SetCurrentTime(); // Load server configuration sLog.Log("server init", "Loading server configuration..."); if( !sConfig.ParseFile( CONFIG_FILE ) ) { sLog.Error( "server init", "Loading server configuration '%s' failed.", CONFIG_FILE ); return 1; } // Load server log settings ( will be removed ) if( load_log_settings( sConfig.files.logSettings.c_str() ) ) sLog.Success( "server init", "Log settings loaded from %s", sConfig.files.logSettings.c_str() ); else sLog.Warning( "server init", "Unable to read %s (this file is optional)", sConfig.files.logSettings.c_str() ); // open up the log file if specified ( will be removed ) if( !sConfig.files.log.empty() ) { if( log_open_logfile( sConfig.files.log.c_str() ) ) sLog.Success( "server init", "Opened log file %s", sConfig.files.log.c_str() ); else sLog.Warning( "server init", "Unable to open log file '%s', only logging to the screen now.", sConfig.files.log.c_str() ); } //connect to the database... DBerror err; if( !sDatabase.Open( err, sConfig.database.host.c_str(), sConfig.database.username.c_str(), sConfig.database.password.c_str(), sConfig.database.db.c_str(), sConfig.database.port ) ) { sLog.Error( "server init", "Unable to connect to the database: %s", err.c_str() ); return 1; } _sDgmTypeAttrMgr = new dgmtypeattributemgr(); // needs to be after db init as its using it _sDgmTypeAttrMgr = new dgmtypeattributemgr(); // needs to be after db init as its using it //Start up the TCP server EVETCPServer tcps; char errbuf[ TCPCONN_ERRBUF_SIZE ]; if( tcps.Open( sConfig.net.port, errbuf ) ) { sLog.Success( "server init", "TCP listener started on port %u.", sConfig.net.port ); } else { sLog.Error( "server init", "Failed to start TCP listener on port %u: %s.", sConfig.net.port, errbuf ); return 1; } //make the item factory ItemFactory item_factory( sEntityList ); //now, the service manager... PyServiceMgr services( 888444, sEntityList, item_factory ); //setup the command dispatcher CommandDispatcher command_dispatcher( services ); RegisterAllCommands( command_dispatcher ); /* * Service creation and registration. * */ sLog.Log("server init", "Creating services."); services.RegisterService(new ClientStatsMgr(&services)); services.RegisterService(new AgentMgrService(&services)); services.RegisterService(new MissionMgrService(&services)); services.RegisterService(new AccountService(&services)); services.RegisterService(new UserService(&services)); services.RegisterService(new AlertService(&services)); services.RegisterService(new AuthService(&services)); services.RegisterService(new BillMgrService(&services)); services.RegisterService(new BookmarkService(&services)); services.RegisterService(new BrowserLockDownService(&services)); services.RegisterService(new CertificateMgrService(&services)); services.RegisterService(new CharacterService(&services)); services.RegisterService(new CharMgrService(&services)); services.RegisterService(new ConfigService(&services)); services.RegisterService(new LanguageService(&services)); services.RegisterService(new CorpMgrService(&services)); services.RegisterService(new CorpStationMgrService(&services)); services.RegisterService(new CorporationService(&services)); services.RegisterService(new CorpRegistryService(&services)); services.RegisterService(new ContractProxyService(&services)); services.RegisterService(new LPService(&services)); services.RegisterService(new DogmaIMService(&services)); services.RegisterService(new InvBrokerService(&services)); services.RegisterService(services.lsc_service = new LSCService(&services, &command_dispatcher)); services.RegisterService(services.cache_service = new ObjCacheService(&services, sConfig.files.cacheDir.c_str())); services.RegisterService(new LookupService(&services)); services.RegisterService(new VoiceMgrService(&services)); services.RegisterService(new ShipService(&services)); services.RegisterService(new InsuranceService(&services)); services.RegisterService(new BeyonceService(&services)); services.RegisterService(new MapService(&services)); services.RegisterService(new OnlineStatusService(&services)); services.RegisterService(new Standing2Service(&services)); services.RegisterService(new WarRegistryService(&services)); services.RegisterService(new FactionWarMgrService(&services)); services.RegisterService(new StationService(&services)); services.RegisterService(new StationSvcService(&services)); services.RegisterService(new JumpCloneService(&services)); services.RegisterService(new KeeperService(&services)); services.RegisterService(new DungeonService(&services)); services.RegisterService(new SkillMgrService(&services)); services.RegisterService(new TutorialService(&services)); services.RegisterService(new PetitionerService(&services)); services.RegisterService(new SlashService(&services, &command_dispatcher)); services.RegisterService(new MarketProxyService(&services)); services.RegisterService(new ContractMgrService(&services)); services.RegisterService(new ReprocessingService(&services)); services.RegisterService(new FactoryService(&services)); services.RegisterService(new RamProxyService(&services)); services.RegisterService(new PosMgrService(&services)); services.RegisterService(new NetService(&services)); services.RegisterService(new TradeService(&services)); services.RegisterService(new CharUnboundMgrService(&services)); services.RegisterService(new PaperDollService(&services)); services.RegisterService(new PhotoUploadService(&services)); services.RegisterService(new AggressionMgrService(&services)); services.RegisterService(new SovereigntyMgrService(&services)); sLog.Log("server init", "Priming cached objects."); services.cache_service->PrimeCache(); sLog.Log("server init", "finished priming"); // start up the image server ImageServer::get().Run(); services.serviceDB().SetServerOnlineStatus(true); sLog.Log("server init", "Init done."); /* * THE MAIN LOOP * * Everything except IO should happen in this loop, in this thread context. * */ /* program events system */ SetupSignals(); uint32 start; uint32 etime; uint32 last_time = GetTickCount(); EVETCPConnection* tcpc; while( RunLoops == true ) { Timer::SetCurrentTime(); start = GetTickCount(); //check for timeouts in other threads //timeout_manager.CheckTimeouts(); while( ( tcpc = tcps.PopConnection() ) ) { Client* c = new Client( services, &tcpc ); sEntityList.Add( &c ); } sEntityList.Process(); services.Process(); /* UPDATE */ last_time = GetTickCount(); etime = last_time - start; // do the stuff for thread sleeping if( MAIN_LOOP_DELAY > etime ) Sleep( MAIN_LOOP_DELAY - etime ); } sLog.Log("server shutdown", "Main loop stopped" ); tcps.Close(); sLog.Log("server shutdown", "TCP listener stopped." ); services.serviceDB().SetServerOnlineStatus(false); sLog.Log("server shutdown", "Cleanup db cache" ); delete _sDgmTypeAttrMgr; log_close_logfile(); // win crap. //_CrtDumpMemoryLeaks(); return 0; }
int main(int argc, char** argv) { RegisterExecutablePlatform(ExePlatformWorld); set_exception_handler(); /* Database Version Check */ uint32 Database_Version = CURRENT_BINARY_DATABASE_VERSION; if (argc >= 2) { if (strcasecmp(argv[1], "db_version") == 0) { std::cout << "Binary Database Version: " << Database_Version << std::endl; return 0; } } // Load server configuration _log(WORLD__INIT, "Loading server configuration.."); if (!WorldConfig::LoadConfig()) { _log(WORLD__INIT_ERR, "Loading server configuration failed."); return 1; } const WorldConfig *Config=WorldConfig::get(); if(!load_log_settings(Config->LogSettingsFile.c_str())) _log(WORLD__INIT, "Warning: Unable to read %s", Config->LogSettingsFile.c_str()); else _log(WORLD__INIT, "Log settings loaded from %s", Config->LogSettingsFile.c_str()); _log(WORLD__INIT, "CURRENT_VERSION: %s", CURRENT_VERSION); #ifdef _DEBUG _CrtSetDbgFlag( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF); #endif if (signal(SIGINT, CatchSignal) == SIG_ERR) { _log(WORLD__INIT_ERR, "Could not set signal handler"); return 1; } if (signal(SIGTERM, CatchSignal) == SIG_ERR) { _log(WORLD__INIT_ERR, "Could not set signal handler"); return 1; } #ifndef WIN32 if (signal(SIGPIPE, SIG_IGN) == SIG_ERR) { _log(WORLD__INIT_ERR, "Could not set signal handler"); return 1; } #endif // add login server config to list if (Config->LoginCount == 0) { if (Config->LoginHost.length()) { loginserverlist.Add(Config->LoginHost.c_str(), Config->LoginPort, Config->LoginAccount.c_str(), Config->LoginPassword.c_str()); _log(WORLD__INIT, "Added loginserver %s:%i", Config->LoginHost.c_str(), Config->LoginPort); } } else { LinkedList<LoginConfig*> loginlist=Config->loginlist; LinkedListIterator<LoginConfig*> iterator(loginlist); iterator.Reset(); while(iterator.MoreElements()) { loginserverlist.Add(iterator.GetData()->LoginHost.c_str(), iterator.GetData()->LoginPort, iterator.GetData()->LoginAccount.c_str(), iterator.GetData()->LoginPassword.c_str()); _log(WORLD__INIT, "Added loginserver %s:%i", iterator.GetData()->LoginHost.c_str(), iterator.GetData()->LoginPort); iterator.Advance(); } } _log(WORLD__INIT, "Connecting to MySQL..."); if (!database.Connect( Config->DatabaseHost.c_str(), Config->DatabaseUsername.c_str(), Config->DatabasePassword.c_str(), Config->DatabaseDB.c_str(), Config->DatabasePort)) { _log(WORLD__INIT_ERR, "Cannot continue without a database connection."); return 1; } guild_mgr.SetDatabase(&database); if (argc >= 2) { char tmp[2]; if (strcasecmp(argv[1], "help") == 0 || strcasecmp(argv[1], "?") == 0 || strcasecmp(argv[1], "/?") == 0 || strcasecmp(argv[1], "-?") == 0 || strcasecmp(argv[1], "-h") == 0 || strcasecmp(argv[1], "-help") == 0) { std::cout << "Worldserver command line commands:" << std::endl; std::cout << "adduser username password flag - adds a user account" << std::endl; std::cout << "flag username flag - sets GM flag on the account" << std::endl; std::cout << "startzone zoneshortname - sets the starting zone" << std::endl; std::cout << "-holdzones - reboots lost zones" << std::endl; return 0; } else if (strcasecmp(argv[1], "-holdzones") == 0) { std::cout << "Reboot Zones mode ON" << std::endl; holdzones = true; } else if (database.GetVariable("disablecommandline", tmp, 2)) { if (strlen(tmp) == 1) { if (tmp[0] == '1') { std::cerr << "Command line disabled in database... exiting" << std::endl; return 1; } } } else if (strcasecmp(argv[1], "adduser") == 0) { if (argc == 5) { if (Seperator::IsNumber(argv[4])) { if (atoi(argv[4]) >= 0 && atoi(argv[4]) <= 255) { if (database.CreateAccount(argv[2], argv[3], atoi(argv[4])) == 0) { std::cerr << "database.CreateAccount failed." << std::endl; return 1; } else { std::cout << "Account created: Username='******', Password='******', status=" << argv[4] << std::endl; return 0; } } } } std::cout << "Usage: world adduser username password flag" << std::endl; std::cout << "flag = 0, 1 or 2" << std::endl; return 0; } else if (strcasecmp(argv[1], "flag") == 0) { if (argc == 4) { if (Seperator::IsNumber(argv[3])) { if (atoi(argv[3]) >= 0 && atoi(argv[3]) <= 255) { if (database.SetAccountStatus(argv[2], atoi(argv[3]))){ std::cout << "Account flagged: Username='******', status=" << argv[3] << std::endl; return 0; } else { std::cerr << "database.SetAccountStatus failed." << std::endl; return 1; } } } } std::cout << "Usage: world flag username flag" << std::endl; std::cout << "flag = 0-200" << std::endl; return 0; } else if (strcasecmp(argv[1], "startzone") == 0) { if (argc == 3) { if (strlen(argv[2]) < 3) { std::cerr << "Error: zone name too short" << std::endl; return 1; } else if (strlen(argv[2]) > 15) { std::cerr << "Error: zone name too long" << std::endl; return 1; } else { if (database.SetVariable("startzone", argv[2])) { std::cout << "Starting zone changed: '" << argv[2] << "'" << std::endl; return 0; } else { std::cerr << "database.SetVariable failed." << std::endl; return 1; } } } std::cout << "Usage: world startzone zoneshortname" << std::endl; return 0; } else { std::cerr << "Error, unknown command line option" << std::endl; return 1; } } if(Config->WorldHTTPEnabled) { _log(WORLD__INIT, "Starting HTTP world service..."); http_server.Start(Config->WorldHTTPPort, Config->WorldHTTPMimeFile.c_str()); } else { _log(WORLD__INIT, "HTTP world service disabled."); } _log(WORLD__INIT, "Checking Database Conversions.."); database.CheckDatabaseConversions(); _log(WORLD__INIT, "Loading variables.."); database.LoadVariables(); _log(WORLD__INIT, "Loading zones.."); database.LoadZoneNames(); _log(WORLD__INIT, "Clearing groups.."); database.ClearGroup(); _log(WORLD__INIT, "Clearing raids.."); database.ClearRaid(); database.ClearRaidDetails(); database.ClearRaidLeader(); _log(WORLD__INIT, "Loading items.."); if (!database.LoadItems()) _log(WORLD__INIT_ERR, "Error: Could not load item data. But ignoring"); _log(WORLD__INIT, "Loading skill caps.."); if (!database.LoadSkillCaps()) _log(WORLD__INIT_ERR, "Error: Could not load skill cap data. But ignoring"); _log(WORLD__INIT, "Loading guilds.."); guild_mgr.LoadGuilds(); //rules: { char tmp[64]; if (database.GetVariable("RuleSet", tmp, sizeof(tmp)-1)) { _log(WORLD__INIT, "Loading rule set '%s'", tmp); if(!RuleManager::Instance()->LoadRules(&database, tmp)) { _log(WORLD__INIT_ERR, "Failed to load ruleset '%s', falling back to defaults.", tmp); } } else { if(!RuleManager::Instance()->LoadRules(&database, "default")) { _log(WORLD__INIT, "No rule set configured, using default rules"); } else { _log(WORLD__INIT, "Loaded default rule set 'default'", tmp); } } } if(RuleB(World, ClearTempMerchantlist)){ _log(WORLD__INIT, "Clearing temporary merchant lists.."); database.ClearMerchantTemp(); } _log(WORLD__INIT, "Loading EQ time of day.."); if (!zoneserver_list.worldclock.loadFile(Config->EQTimeFile.c_str())) _log(WORLD__INIT_ERR, "Unable to load %s", Config->EQTimeFile.c_str()); _log(WORLD__INIT, "Loading launcher list.."); launcher_list.LoadList(); char tmp[20]; tmp[0] = '\0'; database.GetVariable("holdzones",tmp, 20); if ((strcasecmp(tmp, "1") == 0)) { holdzones = true; } _log(WORLD__INIT, "Reboot zone modes %s",holdzones ? "ON" : "OFF"); _log(WORLD__INIT, "Deleted %i stale player corpses from database", database.DeleteStalePlayerCorpses()); if (RuleB(World, DeleteStaleCorpeBackups) == true) { _log(WORLD__INIT, "Deleted %i stale player backups from database", database.DeleteStalePlayerBackups()); } _log(WORLD__INIT, "Loading adventures..."); if(!adventure_manager.LoadAdventureTemplates()) { _log(WORLD__INIT_ERR, "Unable to load adventure templates."); } if(!adventure_manager.LoadAdventureEntries()) { _log(WORLD__INIT_ERR, "Unable to load adventure templates."); } adventure_manager.Load(); adventure_manager.LoadLeaderboardInfo(); _log(WORLD__INIT, "Purging expired instances"); database.PurgeExpiredInstances(); Timer PurgeInstanceTimer(450000); PurgeInstanceTimer.Start(450000); _log(WORLD__INIT, "Loading char create info..."); database.LoadCharacterCreateAllocations(); database.LoadCharacterCreateCombos(); char errbuf[TCPConnection_ErrorBufferSize]; if (tcps.Open(Config->WorldTCPPort, errbuf)) { _log(WORLD__INIT,"Zone (TCP) listener started."); } else { _log(WORLD__INIT_ERR,"Failed to start zone (TCP) listener on port %d:",Config->WorldTCPPort); _log(WORLD__INIT_ERR," %s",errbuf); return 1; } if (eqsf.Open()) { _log(WORLD__INIT,"Client (UDP) listener started."); } else { _log(WORLD__INIT_ERR,"Failed to start client (UDP) listener (port 9000)"); return 1; } //register all the patches we have avaliable with the stream identifier. EQStreamIdentifier stream_identifier; RegisterAllPatches(stream_identifier); zoneserver_list.shutdowntimer = new Timer(60000); zoneserver_list.shutdowntimer->Disable(); zoneserver_list.reminder = new Timer(20000); zoneserver_list.reminder->Disable(); Timer InterserverTimer(INTERSERVER_TIMER); // does MySQL pings and auto-reconnect InterserverTimer.Trigger(); uint8 ReconnectCounter = 100; EQStream* eqs; EmuTCPConnection* tcpc; EQStreamInterface *eqsi; while(RunLoops) { Timer::SetCurrentTime(); //check the factory for any new incoming streams. while ((eqs = eqsf.Pop())) { //pull the stream out of the factory and give it to the stream identifier //which will figure out what patch they are running, and set up the dynamic //structures and opcodes for that patch. struct in_addr in; in.s_addr = eqs->GetRemoteIP(); _log(WORLD__CLIENT, "New connection from %s:%d", inet_ntoa(in),ntohs(eqs->GetRemotePort())); stream_identifier.AddStream(eqs); //takes the stream } //give the stream identifier a chance to do its work.... stream_identifier.Process(); //check the stream identifier for any now-identified streams while((eqsi = stream_identifier.PopIdentified())) { //now that we know what patch they are running, start up their client object struct in_addr in; in.s_addr = eqsi->GetRemoteIP(); if (RuleB(World, UseBannedIPsTable)){ //Lieka: Check to see if we have the responsibility for blocking IPs. _log(WORLD__CLIENT, "Checking inbound connection %s against BannedIPs table", inet_ntoa(in)); if (!database.CheckBannedIPs(inet_ntoa(in))){ //Lieka: Check inbound IP against banned IP table. _log(WORLD__CLIENT, "Connection %s PASSED banned IPs check. Processing connection.", inet_ntoa(in)); Client* client = new Client(eqsi); // @merth: client->zoneattempt=0; client_list.Add(client); } else { _log(WORLD__CLIENT, "Connection from %s FAILED banned IPs check. Closing connection.", inet_ntoa(in)); eqsi->Close(); //Lieka: If the inbound IP is on the banned table, close the EQStream. } } if (!RuleB(World, UseBannedIPsTable)){ _log(WORLD__CLIENT, "New connection from %s:%d, processing connection", inet_ntoa(in), ntohs(eqsi->GetRemotePort())); Client* client = new Client(eqsi); // @merth: client->zoneattempt=0; client_list.Add(client); } } client_list.Process(); while ((tcpc = tcps.NewQueuePop())) { struct in_addr in; in.s_addr = tcpc->GetrIP(); _log(WORLD__ZONE, "New TCP connection from %s:%d", inet_ntoa(in),tcpc->GetrPort()); console_list.Add(new Console(tcpc)); } if(PurgeInstanceTimer.Check()) { database.PurgeExpiredInstances(); } //check for timeouts in other threads timeout_manager.CheckTimeouts(); loginserverlist.Process(); console_list.Process(); zoneserver_list.Process(); launcher_list.Process(); UCSLink.Process(); QSLink.Process(); LFPGroupList.Process(); adventure_manager.Process(); if (InterserverTimer.Check()) { InterserverTimer.Start(); database.ping(); // AsyncLoadVariables(dbasync, &database); ReconnectCounter++; if (ReconnectCounter >= 12) { // only create thread to reconnect every 10 minutes. previously we were creating a new thread every 10 seconds ReconnectCounter = 0; if (loginserverlist.AllConnected() == false) { #ifdef _WINDOWS _beginthread(AutoInitLoginServer, 0, nullptr); #else pthread_t thread; pthread_create(&thread, nullptr, &AutoInitLoginServer, nullptr); #endif } } } if (numclients == 0) { Sleep(50); continue; } Sleep(20); } _log(WORLD__SHUTDOWN,"World main loop completed."); _log(WORLD__SHUTDOWN,"Shutting down console connections (if any)."); console_list.KillAll(); _log(WORLD__SHUTDOWN,"Shutting down zone connections (if any)."); zoneserver_list.KillAll(); _log(WORLD__SHUTDOWN,"Zone (TCP) listener stopped."); tcps.Close(); _log(WORLD__SHUTDOWN,"Client (UDP) listener stopped."); eqsf.Close(); _log(WORLD__SHUTDOWN,"Signaling HTTP service to stop..."); http_server.Stop(); CheckEQEMuErrorAndPause(); return 0; }
int main( int argc, char* argv[] ) { #if defined( HAVE_CRTDBG_H ) && !defined( NDEBUG ) // Under Visual Studio setup memory leak detection _CrtSetDbgFlag( _CRTDBG_LEAK_CHECK_DF | _CrtSetDbgFlag( _CRTDBG_REPORT_FLAG ) ); #endif /* defined( HAVE_CRTDBG_H ) && !defined( NDEBUG ) */ printf("Copyright (C) 2006-2011 EVEmu Team. http://evemu.org/\n"); printf("This program is free software; you can redistribute it and/or modify it under\n"); printf("the terms of the GNU Lesser General Public License as published by the Free \n"); printf("Software Foundation; either version 2 of the License, or (at your option) any\n"); printf("later version.\n"); printf("\n"); printf("This program is distributed in the hope that it will be useful, but WITHOUT\n"); printf("ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS\n"); printf("FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more\n"); printf("details.\n"); printf("\n"); // Load server configuration if( !sConfig.ParseFile( CONFIG_FILE ) ) { printf("ERROR: Loading server configuration '%s' failed.", CONFIG_FILE ); //sLog.Error( "server init", "Loading server configuration '%s' failed.", CONFIG_FILE ); std::cout << std::endl << "press any key to exit..."; std::cin.get(); return 1; } sLog.InitializeLogging(sConfig.files.logDir); sLog.Log("server init", "Loading server configuration..."); sLog.Log("", "" ); sLog.Log("SERVER VERSION", "EVEmu " EVEMU_VERSION ); sLog.Log("", "" ); sLog.Log("SOURCE", "get at " EVEMU_REPOSITORY ); sLog.Log("", "" ); sLog.Log("SERVER INIT", "\n" "\tSupported Client: %s\n" "\tVersion %.2f\n" "\tBuild %d\n" "\tMachoNet %u", EVEProjectVersion, EVEVersionNumber, EVEBuildVersion, MachoNetVersion ); //it is important to do this before doing much of anything, in case they use it. Timer::SetCurrentTime(); // Load server log settings ( will be removed ) if( load_log_settings( sConfig.files.logSettings.c_str() ) ) sLog.Success( "server init", "Log settings loaded from %s", sConfig.files.logSettings.c_str() ); else sLog.Warning( "server init", "Unable to read %s (this file is optional)", sConfig.files.logSettings.c_str() ); // open up the log file if specified ( will be removed ) if( !sConfig.files.logDir.empty() ) { std::string logFile = sConfig.files.logDir + "eve-server.log"; if( log_open_logfile( logFile.c_str() ) ) sLog.Success( "server init", "Found log directory %s", sConfig.files.logDir.c_str() ); else sLog.Warning( "server init", "Unable to find log directory '%s', only logging to the screen now.", sConfig.files.logDir.c_str() ); } //connect to the database... DBerror err; if( !sDatabase.Open( err, sConfig.database.host.c_str(), sConfig.database.username.c_str(), sConfig.database.password.c_str(), sConfig.database.db.c_str(), sConfig.database.port ) ) { sLog.Error( "server init", "Unable to connect to the database: %s", err.c_str() ); std::cout << std::endl << "press any key to exit..."; std::cin.get(); return 1; } _sDgmTypeAttrMgr = new dgmtypeattributemgr(); // needs to be after db init as its using it //Start up the TCP server EVETCPServer tcps; char errbuf[ TCPCONN_ERRBUF_SIZE ]; if( tcps.Open( sConfig.net.port, errbuf ) ) { sLog.Success( "server init", "TCP listener started on port %u.", sConfig.net.port ); } else { sLog.Error( "server init", "Failed to start TCP listener on port %u: %s.", sConfig.net.port, errbuf ); std::cout << std::endl << "press any key to exit..."; std::cin.get(); return 1; } //make the item factory ItemFactory item_factory( sEntityList ); sLog.Log("server init", "starting item factory"); //now, the service manager... PyServiceMgr services( 888444, sEntityList, item_factory ); sLog.Log("server init", "starting service manager"); //setup the command dispatcher CommandDispatcher command_dispatcher( services ); RegisterAllCommands( command_dispatcher ); /* * Service creation and registration. * */ sLog.Log("server init", "Creating services."); // Please keep the services list clean so it's easyier to find something services.RegisterService(new AccountService(&services)); services.RegisterService(new AgentMgrService(&services)); services.RegisterService(new AggressionMgrService(&services)); services.RegisterService(new AlertService(&services)); services.RegisterService(new AuthService(&services)); services.RegisterService(new BillMgrService(&services)); services.RegisterService(new BeyonceService(&services)); services.RegisterService(new BookmarkService(&services)); services.RegisterService(new BrowserLockdownService(&services)); services.RegisterService(new BulkMgrService(&services)); services.RegisterService(new CertificateMgrService(&services)); services.RegisterService(new CharFittingMgrService(&services)); services.RegisterService(new CharUnboundMgrService(&services)); services.RegisterService(new CharMgrService(&services)); services.RegisterService(new ClientStatLogger(&services)); services.RegisterService(new ClientStatsMgr(&services)); services.RegisterService(new ConfigService(&services)); services.RegisterService(new CorpBookmarkMgrService(&services)); services.RegisterService(new CorpMgrService(&services)); services.RegisterService(new CorporationService(&services)); services.RegisterService(new CorpRegistryService(&services)); services.RegisterService(new CorpStationMgrService(&services)); services.RegisterService(new ContractMgrService(&services)); services.RegisterService(new ContractProxyService(&services)); services.RegisterService(new DevToolsProviderService(&services)); services.RegisterService(new DogmaIMService(&services)); services.RegisterService(new DogmaService(&services)); services.RegisterService(new DungeonExplorationMgrService(&services)); services.RegisterService(new DungeonService(&services)); services.RegisterService(new FactionWarMgrService(&services)); services.RegisterService(new FactoryService(&services)); services.RegisterService(new FleetProxyService(&services)); services.RegisterService(new HoloscreenMgrService(&services)); services.RegisterService(new InfoGatheringMgr(&services)); services.RegisterService(new InsuranceService(&services)); services.RegisterService(new InvBrokerService(&services)); services.RegisterService(new JumpCloneService(&services)); services.RegisterService(new KeeperService(&services)); services.RegisterService(new LanguageService(&services)); services.RegisterService(new LocalizationServerService(&services)); services.RegisterService(new LookupService(&services)); services.RegisterService(new LPService(&services)); services.RegisterService(services.lsc_service = new LSCService(&services, &command_dispatcher)); services.RegisterService(new MailMgrService(&services)); services.RegisterService(new MailingListMgrService(&services)); services.RegisterService(new MapService(&services)); services.RegisterService(new MarketProxyService(&services)); services.RegisterService(new MissionMgrService(&services)); services.RegisterService(new NetService(&services)); services.RegisterService(new NotificationMgrService(&services)); services.RegisterService(services.cache_service = new ObjCacheService(&services, sConfig.files.cacheDir.c_str())); services.RegisterService(new OnlineStatusService(&services)); services.RegisterService(new PaperDollService(&services)); services.RegisterService(new PetitionerService(&services)); services.RegisterService(new PhotoUploadService(&services)); services.RegisterService(new PlanetMgrService(&services)); services.RegisterService(new PosMgrService(&services)); services.RegisterService(new RamProxyService(&services)); services.RegisterService(new RepairService(&services)); services.RegisterService(new ReprocessingService(&services)); services.RegisterService(new ShipService(&services)); services.RegisterService(new SkillMgrService(&services)); services.RegisterService(new SlashService(&services, &command_dispatcher)); services.RegisterService(new SovereigntyMgrService(&services)); services.RegisterService(new Standing2Service(&services)); services.RegisterService(new StationService(&services)); services.RegisterService(new StationSvcService(&services)); services.RegisterService(new TutorialService(&services)); services.RegisterService(new UserService(&services)); services.RegisterService(new VoiceMgrService(&services)); services.RegisterService(new WarRegistryService(&services)); sLog.Log("server init", "Priming cached objects."); services.cache_service->PrimeCache(); sLog.Log("server init", "finished priming"); // start up the image server sImageServer.Run(); sLog.Log("server init", "started image server"); // start up the api server sAPIServer.CreateServices( services ); sAPIServer.Run(); sLog.Log("server init", "started API server"); // start up the image server sLog.Log("server init", "Loading Dynamic Database Table Objects..."); // Create In-Memory Database Objects for Critical Systems, such as ModuleManager: sLog.Log("server init", "---> sDGM_Effects_Table: Loading..."); sDGM_Effects_Table.Initialize(); sLog.Log("server init", "---> sDGM_Type_Effects_Table: Loading..."); sDGM_Type_Effects_Table.Initialize(); sLog.Log("server init", "---> sDGM_Skill_Bonus_Modifiers_Table: Loading..."); sDGM_Skill_Bonus_Modifiers_Table.Initialize(); //sLog.Log("server init", "---> sDGM_Ship_Bonus_Modifiers_Table: Loading..."); //sDGM_Ship_Bonus_Modifiers_Table.Initialize(); sLog.Log("server init", "---> sDGM_Types_to_Wrecks_Table: Loading..."); sDGM_Types_to_Wrecks_Table.Initialize(); sLog.Log("server init", "Init done."); ///////////////////////////////////////////////////////////////////////////////////// // !!! DO NOT PUT ANY INITIALIZATION CODE OR CALLS BELOW THIS LINE !!! ///////////////////////////////////////////////////////////////////////////////////// services.serviceDB().SetServerOnlineStatus(true); sLog.Success("server init", "SERVER IS NOW [ONLINE]"); sLog.Log("INFO", "(press Ctrl+C to start controlled server shutdown)"); /* * THE MAIN LOOP * * Everything except IO should happen in this loop, in this thread context. * */ /* program events system */ SetupSignals(); uint32 start; uint32 etime; uint32 last_time = GetTickCount(); EVETCPConnection* tcpc; while( RunLoops == true ) { Timer::SetCurrentTime(); start = GetTickCount(); //check for timeouts in other threads //timeout_manager.CheckTimeouts(); while( ( tcpc = tcps.PopConnection() ) ) { Client* c = new Client( services, &tcpc ); sEntityList.Add( &c ); } sEntityList.Process(); services.Process(); /* UPDATE */ last_time = GetTickCount(); etime = last_time - start; // do the stuff for thread sleeping if( MAIN_LOOP_DELAY > etime ) Sleep( MAIN_LOOP_DELAY - etime ); } sLog.Log("server shutdown", "Main loop stopped" ); // Shutting down EVE Client TCP listener tcps.Close(); sLog.Log("server shutdown", "TCP listener stopped." ); // Shutting down API Server: sAPIServer.Stop(); sLog.Log("server shutdown", "Image Server TCP listener stopped." ); // Shutting down Image Server: sImageServer.Stop(); sLog.Log("server shutdown", "API Server TCP listener stopped." ); services.serviceDB().SetServerOnlineStatus(false); sLog.Log("server shutdown", "SERVER IS NOW [OFFLINE]"); sLog.Log("server shutdown", "Cleanup db cache" ); delete _sDgmTypeAttrMgr; log_close_logfile(); //std::cout << std::endl << "press the ENTER key to exit..."; std::cin.get(); // Shut down the Item system ensuring ALL items get saved to the database: sLog.Log("server shutdown", "Shutting down Item Factory." ); return 0; }
int main() { RegisterExecutablePlatform(ExePlatformQueryServ); set_exception_handler(); Timer LFGuildExpireTimer(60000); Timer InterserverTimer(INTERSERVER_TIMER); // does auto-reconnect _log(QUERYSERV__INIT, "Starting EQEmu QueryServ."); if (!queryservconfig::LoadConfig()) { _log(QUERYSERV__INIT, "Loading server configuration failed."); return 1; } Config = queryservconfig::get(); if(!load_log_settings(Config->LogSettingsFile.c_str())) _log(QUERYSERV__INIT, "Warning: Unable to read %s", Config->LogSettingsFile.c_str()); else _log(QUERYSERV__INIT, "Log settings loaded from %s", Config->LogSettingsFile.c_str()); WorldShortName = Config->ShortName; _log(QUERYSERV__INIT, "Connecting to MySQL..."); if (!database.Connect( Config->QSDatabaseHost.c_str(), Config->QSDatabaseUsername.c_str(), Config->QSDatabasePassword.c_str(), Config->QSDatabaseDB.c_str(), Config->QSDatabasePort)) { _log(WORLD__INIT_ERR, "Cannot continue without a database connection."); return 1; } if (signal(SIGINT, CatchSignal) == SIG_ERR) { _log(QUERYSERV__ERROR, "Could not set signal handler"); return 1; } if (signal(SIGTERM, CatchSignal) == SIG_ERR) { _log(QUERYSERV__ERROR, "Could not set signal handler"); return 1; } worldserver = new WorldServer; worldserver->Connect(); lfguildmanager.LoadDatabase(); while(RunLoops) { Timer::SetCurrentTime(); if(LFGuildExpireTimer.Check()) lfguildmanager.ExpireEntries(); if (InterserverTimer.Check()) { if (worldserver->TryReconnect() && (!worldserver->Connected())) worldserver->AsyncConnect(); } worldserver->Process(); timeout_manager.CheckTimeouts(); Sleep(100); } }
int main() { RegisterExecutablePlatform(ExePlatformUCS); set_exception_handler(); // Check every minute for unused channels we can delete // Timer ChannelListProcessTimer(60000); Timer InterserverTimer(INTERSERVER_TIMER); // does auto-reconnect _log(UCS__INIT, "Starting EQEmu Universal Chat Server."); if (!ucsconfig::LoadConfig()) { _log(UCS__INIT, "Loading server configuration failed."); return 1; } Config = ucsconfig::get(); if(!load_log_settings(Config->LogSettingsFile.c_str())) _log(UCS__INIT, "Warning: Unable to read %s", Config->LogSettingsFile.c_str()); else _log(UCS__INIT, "Log settings loaded from %s", Config->LogSettingsFile.c_str()); WorldShortName = Config->ShortName; _log(UCS__INIT, "Connecting to MySQL..."); if (!database.Connect( Config->DatabaseHost.c_str(), Config->DatabaseUsername.c_str(), Config->DatabasePassword.c_str(), Config->DatabaseDB.c_str(), Config->DatabasePort)) { _log(WORLD__INIT_ERR, "Cannot continue without a database connection."); return 1; } char tmp[64]; if (database.GetVariable("RuleSet", tmp, sizeof(tmp)-1)) { _log(WORLD__INIT, "Loading rule set '%s'", tmp); if(!RuleManager::Instance()->LoadRules(&database, tmp)) { _log(UCS__ERROR, "Failed to load ruleset '%s', falling back to defaults.", tmp); } } else { if(!RuleManager::Instance()->LoadRules(&database, "default")) { _log(UCS__INIT, "No rule set configured, using default rules"); } else { _log(UCS__INIT, "Loaded default rule set 'default'", tmp); } } database.ExpireMail(); if(Config->ChatPort != Config->MailPort) { _log(UCS__ERROR, "MailPort and CharPort must be the same in eqemu_config.xml for UCS."); exit(1); } CL = new Clientlist(Config->ChatPort); ChannelList = new ChatChannelList(); database.LoadChatChannels(); if (signal(SIGINT, CatchSignal) == SIG_ERR) { _log(UCS__ERROR, "Could not set signal handler"); return 1; } if (signal(SIGTERM, CatchSignal) == SIG_ERR) { _log(UCS__ERROR, "Could not set signal handler"); return 1; } worldserver = new WorldServer; worldserver->Connect(); while(RunLoops) { Timer::SetCurrentTime(); CL->Process(); if(ChannelListProcessTimer.Check()) ChannelList->Process(); if (InterserverTimer.Check()) { if (worldserver->TryReconnect() && (!worldserver->Connected())) worldserver->AsyncConnect(); } worldserver->Process(); timeout_manager.CheckTimeouts(); Sleep(100); } ChannelList->RemoveAllChannels(); CL->CloseAllConnections(); }
int main(int argc, char **argv) { RegisterExecutablePlatform(ExePlatformSharedMemory); set_exception_handler(); LogFile->write(EQEMuLog::Status, "Shared Memory Loader Program"); if(!EQEmuConfig::LoadConfig()) { LogFile->write(EQEMuLog::Error, "Unable to load configuration file."); return 0; } const EQEmuConfig *config = EQEmuConfig::get(); if(!load_log_settings(config->LogSettingsFile.c_str())) { LogFile->write(EQEMuLog::Error, "Warning: unable to read %s.", config->LogSettingsFile.c_str()); } SharedDatabase database; LogFile->write(EQEMuLog::Status, "Connecting to database..."); if(!database.Connect(config->DatabaseHost.c_str(), config->DatabaseUsername.c_str(), config->DatabasePassword.c_str(), config->DatabaseDB.c_str(), config->DatabasePort)) { LogFile->write(EQEMuLog::Error, "Unable to connect to the database, cannot continue without a " "database connection"); return 0; } bool load_all = true; bool load_items = true; bool load_factions = true; bool load_loot = true; bool load_skill_caps = true; bool load_spells = true; if(argc > 1) { load_all = false; load_items = false; load_factions = false; load_loot = false; load_skill_caps = false; load_spells = false; for(int i = 1; i < argc; ++i) { switch(argv[i][0]) { case 'a': if(strcasecmp("all", argv[i]) == 0) { load_all = true; } break; case 'i': if(strcasecmp("items", argv[i]) == 0) { load_items = true; } break; case 'f': if(strcasecmp("factions", argv[i]) == 0) { load_factions = true; } break; case 'l': if(strcasecmp("loot", argv[i]) == 0) { load_loot = true; } break; case 's': if(strcasecmp("skill_caps", argv[i]) == 0) { load_skill_caps = true; } else if(strcasecmp("spells", argv[i]) == 0) { load_spells = true; } break; } } } if(load_all || load_items) { LogFile->write(EQEMuLog::Status, "Loading items..."); try { LoadItems(&database); } catch(std::exception &ex) { LogFile->write(EQEMuLog::Error, "%s", ex.what()); return 0; } } if(load_all || load_factions) { LogFile->write(EQEMuLog::Status, "Loading factions..."); try { LoadFactions(&database); } catch(std::exception &ex) { LogFile->write(EQEMuLog::Error, "%s", ex.what()); return 0; } } if(load_all || load_loot) { LogFile->write(EQEMuLog::Status, "Loading loot..."); try { LoadLoot(&database); } catch(std::exception &ex) { LogFile->write(EQEMuLog::Error, "%s", ex.what()); return 0; } } if(load_all || load_skill_caps) { LogFile->write(EQEMuLog::Status, "Loading skill caps..."); try { LoadSkillCaps(&database); } catch(std::exception &ex) { LogFile->write(EQEMuLog::Error, "%s", ex.what()); return 0; } } if(load_all || load_spells) { LogFile->write(EQEMuLog::Status, "Loading spells..."); try { LoadSpells(&database); } catch(std::exception &ex) { LogFile->write(EQEMuLog::Error, "%s", ex.what()); return 0; } } return 0; }