diff options
| author | Guillaume Melquiond <guillaume.melquiond@gmail.com> | 2006-12-29 13:43:24 +0000 |
|---|---|---|
| committer | Guillaume Melquiond <guillaume.melquiond@gmail.com> | 2006-12-29 13:43:24 +0000 |
| commit | 291ad04d5b5c4ab08d85eadde116f968cd579b77 (patch) | |
| tree | e4dced5715a5d9792cfdc0455a6b3ee6d3116079 /src/main.cpp | |
| parent | 3d404e743105bb9168c89e3451cf35d7d59120b1 (diff) | |
| download | manaserv-291ad04d5b5c4ab08d85eadde116f968cd579b77.tar.gz manaserv-291ad04d5b5c4ab08d85eadde116f968cd579b77.tar.xz manaserv-291ad04d5b5c4ab08d85eadde116f968cd579b77.zip | |
Physically split the server into one tmwserv-acount program (account +
chat + database) and multiple tmwserv-game programs (selected with
respect to the maps). Cleaned the repository by moving server-specific
source files into dedicated directories.
Diffstat (limited to 'src/main.cpp')
| -rw-r--r-- | src/main.cpp | 395 |
1 files changed, 0 insertions, 395 deletions
diff --git a/src/main.cpp b/src/main.cpp deleted file mode 100644 index 08475d4..0000000 --- a/src/main.cpp +++ /dev/null @@ -1,395 +0,0 @@ -/* - * The Mana World Server - * Copyright 2004 The Mana World Development Team - * - * This file is part of The Mana World. - * - * The Mana World is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or any later version. - * - * The Mana World is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY - * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with The Mana World; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ - */ - -#include <cstdlib> -#include <getopt.h> -#include <signal.h> -#include <iostream> -#include <physfs.h> -#include <enet/enet.h> - -#if (defined __USE_UNIX98 || defined __FreeBSD__) -#include "../config.h" -#elif defined WIN32 -#include "../tmwserv_private.h" -#define PACKAGE_VERSION PRODUCT_VERSION -#endif - -#include "accounthandler.h" -#include "chatchannelmanager.h" -#include "chathandler.h" -#include "configuration.h" -#include "connectionhandler.h" -#include "gamehandler.h" -#include "messageout.h" -#include "resourcemanager.h" -#include "itemmanager.h" -#include "skill.h" -#include "state.h" -#include "storage.h" - -#include "utils/logger.h" -#include "utils/stringfilter.h" -#include "utils/timer.h" - -// Scripting -#ifdef SCRIPT_SUPPORT - -extern "C" void Init_Tmw(); - -#if defined (SQUIRREL_SUPPORT) -std::string scriptLanguage = "squirrel"; -#elif defined (RUBY_SUPPORT) -#include <ruby.h> -int rubyStatus; -std::string scriptLanguage = "ruby"; -#elif defined (LUA_SUPPORT) -std::string scriptLanguage = "lua"; -#else -#error "Scripting enabled, but no language selected" -#endif - -#else -std::string scriptLanugage = "none"; -#endif // SCRIPT_SUPPORT - -// Default options that automake should be able to override. -#define DEFAULT_LOG_FILE "tmwserv.log" -#define DEFAULT_CONFIG_FILE "tmwserv.xml" -#define DEFAULT_ITEMSDB_FILE "items.xml" -#ifndef DEFAULT_SERVER_PORT -#define DEFAULT_SERVER_PORT 9601 -// Meaning Account Handler Port is 9601 -// Chat Handler Port is 9602 (9601 + 1) -// and Game Handler Port is 9603... -#endif - -utils::Timer worldTimer(100, false); /**< Timer for world tics set to 100 ms */ -int worldTime = 0; /**< Current world time in 100ms ticks */ -bool running = true; /**< Determines if server keeps running */ - -Skill skillTree("base"); /**< Skill tree */ - -Configuration config; /**< XML config reader */ - -utils::StringFilter *stringFilter; /**< Slang's Filter */ - -/** Account message handler */ -AccountHandler *accountHandler; - -/** Communications (chat) message handler */ -ChatHandler *chatHandler; -/** Chat Channels Manager */ -ChatChannelManager *chatChannelManager; -/** Item Manager */ -ItemManager *itemManager; - -/** Core game message handler */ -GameHandler *gameHandler; - -/** Global game state */ -State *gameState; - -/** - * Initializes the server. - */ -void initialize() -{ - - // Reset to default segmentation fault handling for debugging purposes - signal(SIGSEGV, SIG_DFL); - - // Set enet to quit on exit. - atexit(enet_deinitialize); - - /* - * If the path values aren't defined, we set the default - * depending on the platform. - */ - // The config path -#if defined CONFIG_FILE - std::string configPath = CONFIG_FILE; -#else - -#if (defined __USE_UNIX98 || defined __FreeBSD__) - std::string configPath = getenv("HOME"); - configPath += "/."; - configPath += DEFAULT_CONFIG_FILE; -#else // Win32, ... - std::string configPath = DEFAULT_CONFIG_FILE; -#endif - -#endif // defined CONFIG_FILE - - // The log path -#if defined LOG_FILE - std::string logPath = LOG_FILE; -#else - -#if (defined __USE_UNIX98 || defined __FreeBSD__) - std::string logPath = getenv("HOME"); - logPath += "/."; - logPath += DEFAULT_LOG_FILE; -#else // Win32, ... - std::string logPath = DEFAULT_LOG_FILE; -#endif - -#endif // defined LOG_FILE - - // Initialize PhysicsFS - PHYSFS_init(""); - - // Initialize the logger. - using namespace utils; - Logger::instance().setLogFile(logPath); - - // write the messages to both the screen and the log file. - Logger::instance().setTeeMode(true); - - config.init(configPath); - LOG_INFO("Using Config File: " << configPath, 0); - LOG_INFO("Using Log File: " << logPath, 0); - - // --- Initialize the managers - // Initialize the slang's and double quotes filter. - stringFilter = new StringFilter(&config); - // Initialize the Chat channels manager - chatChannelManager = new ChatChannelManager(); - // Initialize the Item Manager - itemManager = new ItemManager(DEFAULT_ITEMSDB_FILE); - - // --- Initialize the global handlers - // FIXME: Make the global handlers global vars or part of a bigger - // singleton or a local variable in the event-loop - chatHandler = new ChatHandler(); - accountHandler = new AccountHandler(); - gameHandler = new GameHandler(); - - // --- Initialize enet. - if (enet_initialize() != 0) { - LOG_FATAL("An error occurred while initializing ENet", 0); - exit(2); - } - - // --- Initialize scripting subsystem. -#ifdef RUBY_SUPPORT - LOG_INFO("Script Language: " << scriptLanguage, 0); - - // Initialize ruby - ruby_init(); - ruby_init_loadpath(); - ruby_script("tmw"); - - // Initialize bindings - Init_Tmw(); - - // Run test script - rb_load_file("scripts/init.rb"); - rubyStatus = ruby_exec(); -#else - LOG_WARN("No Scripting Language Support.", 0); -#endif - -#if defined (MYSQL_SUPPORT) - LOG_INFO("Using MySQL DB Backend.", 0); -#elif defined (POSTGRESQL_SUPPORT) - LOG_INFO("Using PostGreSQL DB Backend.", 0); -#elif defined (SQLITE_SUPPORT) - LOG_INFO("Using SQLite DB Backend.", 0); -#else - LOG_WARN("No Database Backend Support.", 0); -#endif - - // Initialize configuration defaults - config.setValue("dbuser", ""); - config.setValue("dbpass", ""); - config.setValue("dbhost", ""); -} - - -/** - * Deinitializes the server. - */ -void deinitialize() -{ - delete stringFilter; - // Write configuration file - config.write(); - - // Stop world timer - worldTimer.stop(); - - // Quit ENet - enet_deinitialize(); - -#ifdef RUBY_SUPPORT - // Finish up ruby - ruby_finalize(); - ruby_cleanup(rubyStatus); -#endif - - // Destroy message handlers - delete accountHandler; - delete chatHandler; - delete gameHandler; - - // Destroy Managers - delete chatChannelManager; - delete itemManager; - - // Get rid of persistent data storage - Storage::destroy(); - - PHYSFS_deinit(); -} - - -/** - * Show command line arguments - */ -void printHelp() -{ - std::cout << "tmwserv" << std::endl << std::endl - << "Options: " << std::endl - << " -h --help : Display this help" << std::endl - << " --verbosity <n> : Set the verbosity level" << std::endl - << " --port <n> : Set the default port to listen on" << std::endl; - exit(0); -} - -/** - * Parse the command line arguments - */ -void parseOptions(int argc, char *argv[]) -{ - const char *optstring = "h"; - - const struct option long_options[] = { - { "help", no_argument, 0, 'h' }, - { "verbosity", required_argument, 0, 'v' }, - { "port", required_argument, 0, 'p' }, - { 0 } - }; - - while (optind < argc) { - int result = getopt_long(argc, argv, optstring, long_options, NULL); - - if (result == -1) { - break; - } - - switch (result) { - default: // Unknown option - case 'h': - // Print help - printHelp(); - break; - case 'v': - // Set Verbosity to level - unsigned short verbosityLevel; - verbosityLevel = atoi(optarg); - utils::Logger::instance().setVerbosity(verbosityLevel); - LOG_INFO("Setting Log Verbosity Level to " << verbosityLevel, 0); - break; - case 'p': - // Change the port to listen on. - unsigned short portToListenOn; - portToListenOn = atoi(optarg); - config.setValue("ListenOnPort", portToListenOn); - LOG_INFO("Setting Default Port to " << portToListenOn, 0); - break; - } - } -} - - -/** - * Main function, initializes and runs server. - */ -int main(int argc, char *argv[]) -{ - int elapsedWorldTicks; - - LOG_INFO("The Mana World Server v" << PACKAGE_VERSION, 0); - - // Parse Command Line Options - parseOptions(argc, argv); - - // General Initialization - initialize(); - - if (!accountHandler->startListen(int(config.getValue("ListenOnPort", DEFAULT_SERVER_PORT))) || - !chatHandler->startListen(int(config.getValue("ListenOnPort", DEFAULT_SERVER_PORT)) + 1) || - !gameHandler->startListen(int(config.getValue("ListenOnPort", DEFAULT_SERVER_PORT)) + 2)) { - LOG_ERROR("Unable to create an ENet server host.", 0); - return 3; - } - - // Create storage wrapper - Storage& store = Storage::instance("tmw"); - store.setUser(config.getValue("dbuser", "")); - store.setPassword(config.getValue("dbpass", "")); - store.close(); - store.open(); - - // Create state machine - gameState = new State; - - // Initialize world timer - worldTimer.start(); - - while (running) { - elapsedWorldTicks = worldTimer.poll(); - if (elapsedWorldTicks > 0) { - worldTime += elapsedWorldTicks; - - if (elapsedWorldTicks > 1) - { - LOG_WARN(elapsedWorldTicks -1 << " World Tick(s) skipped " - "because of insufficient time. please buy a faster " - "machine ;-)", 0); - }; - - // Print world time at 10 second intervals to show we're alive - if (worldTime % 100 == 0) { - LOG_INFO("World time: " << worldTime, 0); - } - - // Handle all messages that are in the message queues - accountHandler->process(); - chatHandler->process(); - gameHandler->process(); - // Update all active objects/beings - gameState->update(); - // Send potentially urgent outgoing messages - gameHandler->flush(); - } - worldTimer.sleep(); - } - - LOG_INFO("Received: Quit signal, closing down...", 0); - gameHandler->stopListen(); - delete gameState; - chatHandler->stopListen(); - accountHandler->stopListen(); - deinitialize(); -} |
