/* core/gameconnection.cc This file is part of the Osirion project and is distributed under the terms of the GNU General Public License version 2 */ #include #include #include "sys/sys.h" #include "core/cvar.h" #include "core/gameconnection.h" #include "core/net.h" namespace core { GameConnection* GameConnection::connection_instance = 0; GameConnection::GameConnection(std::string const &connectionstr) { connection_instance = this; connection_network = 0; connection_running = false; unsigned int port = DEFAULTPORT; std::string host(connectionstr); size_t found = host.find(':'); if (found != std::string::npos) { std::istringstream str(host.substr(found+1)); if (str >> port) { host.erase(found, std::string::npos); } else { con_print << "Invalid hostname '" << host << "'\n"; abort(); return; } } connection_network = new NetConnection(); connection_network->connect(host, port); if (!connection_network->connected()) { abort(); return; } connection_frametime = 0; connection_running = true; } GameConnection::~GameConnection() { if (connection_network) { connection_network->disconnect(); delete connection_network; } connection_instance = 0; } void GameConnection::abort() { connection_running = false; } void GameConnection::forward(std::string const &cmdline) { if (!connection_network->connected()) return; std::string netmessage("cmd "); netmessage.append(cmdline); netmessage += '\n'; connection_network->send(netmessage); } void GameConnection::frame(float seconds) { if (!running()) return; if (!connection_network->connected()) { abort(); return; } update_clientstate(seconds); connection_network->frame(seconds); connection_frametime += seconds; float f = 0; if (core::Cvar::net_framerate->value()) { f = 0.5f / core::Cvar::net_framerate->value(); if (connection_frametime < f) { return; } } if ((connection_network->state() == NetConnection::Connected) && localcontrol() && localcontrol()->dirty()) { std::ostringstream netmsg; netmsg << "cup " << localcontrol()->id() << " "; localcontrol()->serialize_client_update(netmsg); netmsg << "\n"; connection_network->send(netmsg.str()); localcontrol()->entity_dirty = false; //con_debug << netmsg.str(); } if (localplayer()->dirty()) { localplayer()->update_info(); std::ostringstream osstream; osstream << "pif "; localplayer()->serialize_client_update(osstream); osstream << '\n'; connection_network->send(osstream.str()); localplayer()->player_dirty = false; } connection_network->transmit(); connection_frametime = 0; } }