Project::OSiRiON - Git repositories
Project::OSiRiON
News . About . Screenshots . Downloads . Forum . Wiki . Tracker . Git
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'src/dedicated/server.cc')
-rw-r--r--src/dedicated/server.cc123
1 files changed, 123 insertions, 0 deletions
diff --git a/src/dedicated/server.cc b/src/dedicated/server.cc
new file mode 100644
index 0000000..a4424a0
--- /dev/null
+++ b/src/dedicated/server.cc
@@ -0,0 +1,123 @@
+/*
+ server/server.cc
+ This file is part of the Osirion project and is distributed under
+ the terms and conditions of the GNU General Public License version 2
+*/
+
+#include <iostream>
+#include <iomanip>
+
+#include "core/core.h"
+#include "core/stats.h"
+#include "core/timer.h"
+#include "server/console.h"
+#include "server/server.h"
+
+namespace server {
+
+//--- private definition ------------------------------------------
+
+/// server Application implementation
+class Server : public core::Application {
+public:
+ /// initialize the server Application
+ virtual void init(int count, char **arguments);
+
+ /// run the server Application
+ virtual void run();
+
+ /// shutdown the server Application
+ virtual void shutdown();
+
+ /// quit the server Application
+ virtual void quit(int status);
+};
+
+
+Server app;
+
+//--- public ------------------------------------------------------
+
+/// the server main loop
+void main(int count, char **arguments)
+{
+ std::cout << core::name() << " " << core::version() << std::endl;
+
+ for (int i =0; i < count; i++)
+ std::cout << arguments[i] << " ";
+ std::cout << std::endl;
+
+ app.init(count, arguments);
+ app.run();
+ app.shutdown();
+}
+
+//--- private -----------------------------------------------------
+
+void Server::init(int count, char **arguments)
+{
+ con_print << "^BInitializing server..." << std::endl;
+
+ core::Cvar::set("sv_dedicated", "1", core::Cvar::ReadOnly);
+
+ core::Application::init(count, arguments);
+
+ Console::init();
+
+ // the command line is in the buffer, execute it
+ core::CommandBuffer::exec();
+
+ std::string empty;
+ core::Application::connect(empty);
+}
+
+void Server::run()
+{
+ float server_framerate = 1.0f / 25.0f;
+
+ if (core::Cvar::sv_framerate->value())
+ server_framerate = 1.0f / core::Cvar::sv_framerate->value();
+
+ core::Timer timer;
+ timer.mark();
+
+ while(connected()) {
+ frame(timer.timestamp());
+#ifdef HAVE_CURSES
+ console()->frame();
+#endif
+ }
+}
+
+void Server::shutdown()
+{
+ con_print << "^BShutting down server..." << std::endl;
+
+ float ratio = 0;
+ if (core::Stats::network_uncompressed_bytes_sent > 0)
+ ratio = 100.0f - floorf((float)core::Stats::network_bytes_sent /
+ (float) core::Stats::network_uncompressed_bytes_sent * 100.0f);
+
+ int minutes = (int) floorf(time() / 60.0f);
+ int seconds = (int) floorf(time() - (float) minutes* 60.0f);
+
+ con_debug << "Statistics:" << std::endl;
+ con_debug << " uptime " << std::setfill(' ') << std::setw(3) << minutes << ":" << std::setfill('0') << std::setw(2) << seconds << std::endl;
+ con_debug << " bytes sent " << std::setfill(' ') << std::setw(6) << core::Stats::network_bytes_sent / 1024 << " Kb" << std::endl;
+ con_debug << " bytes received " << std::setw(6) << core::Stats::network_bytes_received / 1024 << " Kb" << std::endl;
+ con_debug << " compression " << std::setw(6) << ratio << " %" << std::endl;
+
+ core::Application::shutdown();
+
+ Console::shutdown();
+
+ quit(0);
+}
+
+void Server::quit(int status)
+{
+ core::Application::quit(status);
+}
+
+} // namespace server
+