int main (int argc, char *argv[]) { syslog_open("nntpswitchd", LOG_PID, LOG_NEWS); init_options(argc, argv); init_sighandlers(); initproctitle(argc, argv); if ((master = memmap(sizeof (MASTER))) == NULL) die("Can't allocate master memory"); info("Server starting up.."); run_daemon(); syslog_close(); return 0; }
//! Die Hauptfunktion zum Testen // int main(int argc, char *argv[]) { int res; rlimit rlp; res = getrlimit(RLIMIT_CORE, &rlp); std::cout<<"max core size: "<<rlp.rlim_cur<<std::endl; std::cout<<"current core size: "<<rlp.rlim_max<<std::endl; rlp.rlim_cur = 20000; res = getrlimit(RLIMIT_CORE, &rlp); if (res < 0) { std::cout<<"err: "<<errno<<std::endl; perror("setrlimit: RLIMIT_CORE"); exit(-2); } importmaps = false; //di::postgres::enable_trace_query = true; // get more info for unspecified exceptions std::set_terminate(__gnu_cxx::__verbose_terminate_handler); // save starting time time_t starttime; time(&starttime); std::stringstream ss; ss << starttime; configOptions["starttime"] = ss.str(); //Initialize Logging Options InitLogOptions(); Logger::writeMessage("basic", "\nStarte Illarion !"); // initialize randomizer initRandom(); // initialize signalhandlers if (! init_sighandlers()) { return 1; } // deactivate savethread // unsigned long int thisonlinetime = 0; checkArguments(argc, argv); // set up logfiles etc. and check if everything works if (! setup_files()) { return 1; } Logger::writeMessage("basic", "main: server requires clientversion: " + configOptions["clientversion"], false); Logger::writeMessage("basic", "main: listen port: " + configOptions["port"], false); Logger::writeMessage("basic", "main: data directory: " + configOptions["datadir"], false); // initialise DB Manager Database::ConnectionManager::Login login; Database::ConnectionManager::Server server; login.database = configOptions["postgres_db"]; login.user = configOptions["postgres_user"]; login.password = configOptions["postgres_pwd"]; server.host = configOptions["postgres_host"]; server.port = configOptions["postgres_port"]; Database::ConnectionManager::getInstance().setupManager(login, server); Database::SchemaHelper::setSchemata(configOptions["postgres_schema_server"], configOptions["postgres_schema_account"]); //Welt anlegen World *world = World::create(configOptions["datadir"] , starttime); //Laden der Daten fr die Welt (Items, Scripte, Tabellen etc.) loadData(); if (!importmaps) { world->Load("Illarion"); } else { configOptions["disable_login"] = "******"; world->load_from_editor(configOptions["datadir"] + std::string("map/import/oberwelt_0")); } std::cout<<"Creation the PlayerManager"<<std::endl; PlayerManager::get()->activate(); std::cout<<"PlayerManager activated"<<std::endl; PlayerManager::TPLAYERVECTOR &newplayers = PlayerManager::get()->getLogInPlayers(); timespec stime; stime.tv_sec = 0; stime.tv_nsec = 25000000; //25ms //NPC's erschaffen world->initNPC(); //run both reload scripts to initialize semi-dynamic data try { boost::shared_ptr<LuaReloadScript> tmpScript(new LuaReloadScript("server.reload_defs")); if (!tmpScript->onReload()) { std::cerr << "server.reload_defs.onReload returned false" << std::endl; } } catch (ScriptException &e) { std::cerr << "reload_defs: " << e.what() << std::endl; } try { boost::shared_ptr<LuaReloadScript> tmpScript(new LuaReloadScript("server.reload_tables")); if (!tmpScript->onReload()) { std::cerr << "server.reload_tables.onReload returned false" << std::endl; }; } catch (ScriptException &e) { std::cerr << "reload_tables: " << e.what() << std::endl; } Logger::writeMessage("basic","Scheduler wird Initialisiert \n",false); //Scheduler Initialisieren world->initScheduler(); int new_players_processed; running = true; // die OnlinePlayer-Liste aktualisieren (-> auf 0) world->saveAllPlayerNamesToFile(configOptions["datadir"] + std::string(ONLINEPLFILE)); while (running) { // Ausgaben auf std::cout in die Datei schreiben std::cout.flush(); // make sure we don't block the server with processing new players... new_players_processed = 0; // process new players from connection thread while (!newplayers.empty() && new_players_processed < MAXPLAYERSPROCESSED) { new_players_processed++; Player *newPlayer = newplayers.non_block_pop_front(); if (newPlayer) { login_save(newPlayer); if (newPlayer->isMonitoringClient()) { world->monitoringClientList->clientConnect(newPlayer); } else { try { std::cout<<"login sucessully from: "<<newPlayer->name<<" "<<newPlayer->id<<std::endl; world->Players.push_back(newPlayer); newPlayer->login(); try { std::cout<<"calling onlogin"<<std::endl; loginScript->onLogin(newPlayer); } catch (ScriptException &e) { std::cerr<<"Login Script: Failed to load scripts/login.lua !"<<std::endl; } world->updatePlayerList(); } catch (Player::LogoutException &e) { std::cout<<"got logout Exception during login!"<<std::endl; boost::shared_ptr<BasicServerCommand> cmd(new LogOutTC(e.getReason())); newPlayer->Connection->shutdownSend(cmd); //newPlayer->Connection->closeConnection(); PlayerManager::get()->getLogOutPlayers().non_block_push_back(newPlayer); } } } else { std::cout<<"try to get new player but was NULL!"<<std::endl; } } // get new players // Eingaben der Player abarbeiten und die Karte altern world->turntheworld(); nanosleep(&stime, NULL); } Logger::writeMessage("basic","Beende Illarion!"); std::cout<<"Server Shutdown:"<<std::endl; scriptVariables->save(); std::cout<<"Scriptvariables saved!"<<std::endl; world->forceLogoutOfAllPlayers(); //saving all players which where forced logged out. PlayerManager::get()->saveAll(); world->takeMonsterAndNPCFromMap(); Logger::writeMessage("basic","Statistik aktualisieren"); Logger::writeMessage("basic","OnlinePlayer-Liste aktualisieren (-> auf 0)"); world->saveAllPlayerNamesToFile(configOptions["datadir"] + std::string(ONLINEPLFILE)); Logger::writeMessage("basic","Karten speichern"); world->Save("Illarion"); Logger::writeMessage("basic","InitialConnection beenden"); Logger::writeMessage("basic", "Die in loadItems(..) angelegten Tabellen loeschen"); delete CommonItems; CommonItems = NULL; delete ItemNames; ItemNames = NULL; delete WeaponItems; WeaponItems = NULL; delete ArmorItems; ArmorItems = NULL; delete ContainerItems; ContainerItems = NULL; delete TilesModItems; TilesModItems = NULL; delete Tiles; Tiles = NULL; delete world; world = NULL; reset_sighandlers(); time(&starttime); Logger::writeMessage("basic","main: Ende "); return EXIT_SUCCESS; }