Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: code/branches/output/src/libraries/network/Client.cc @ 8825

Last change on this file since 8825 was 8807, checked in by landauf, 14 years ago

Replaced COUT with orxout in network library. Tried to set levels and contexts in a more or less useful way, but not really optimized. Used contexts network, packets, and master_server.
Please use endl instead of \n in the future (@smerkli) ;)

  • Property svn:eol-style set to native
File size: 6.0 KB
RevLine 
[1502]1/*
2 *   ORXONOX - the hottest 3D action shooter ever to exist
3 *                    > www.orxonox.net <
4 *
5 *
6 *   License notice:
7 *
8 *   This program is free software; you can redistribute it and/or
9 *   modify it under the terms of the GNU General Public License
10 *   as published by the Free Software Foundation; either version 2
11 *   of the License, or (at your option) any later version.
12 *
13 *   This program is distributed in the hope that it will be useful,
14 *   but WITHOUT ANY WARRANTY; without even the implied warranty of
15 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16 *   GNU General Public License for more details.
17 *
18 *   You should have received a copy of the GNU General Public License
19 *   along with this program; if not, write to the Free Software
20 *   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
21 *
22 *   Author:
[3084]23 *      Oliver Scheuss
[1502]24 *   Co-authors:
25 *      ...
26 *
27 */
28
29//
30// C++ Implementation: Client
31//
32// Description:
33//
34//
35// Author:  Oliver Scheuss, (C) 2007
36//
37// Copyright: See COPYING file that comes with this distribution
38//
39//
40
[3214]41#include "Client.h"
42
[2087]43#include <cassert>
44
[5929]45#include "util/Clock.h"
[8788]46#include "util/Output.h"
[7284]47#include "util/ScopedSingletonManager.h"
[2662]48#include "synchronisable/Synchronisable.h"
[3214]49#include "packet/Chat.h"
50#include "packet/Gamestate.h"
[3084]51#include "FunctionCallManager.h"
[5929]52#include "core/CoreIncludes.h"
[7163]53#include "core/CommandLineParser.h"
[5929]54#include "core/Game.h"
[2087]55
[2171]56namespace orxonox
[1502]57{
[1752]58
[7163]59  ManageScopedSingleton( Client, ScopeID::Root, true );
[1752]60
[1502]61  /**
62  * Constructor for the Client class
63  * initializes the address and the port to default localhost:NETWORK_PORT
64  */
[3214]65  Client::Client():
66      isSynched_(false),
[6417]67      gameStateFailure_(false),
68      timeSinceLastUpdate_(0)
[3214]69  {
[7163]70    this->setDestination( CommandLineParser::getValue("dest").getString(), CommandLineParser::getValue("port") );
[1502]71  }
72
[7163]73  Client::~Client()
[3214]74  {
75    if ( ClientConnection::isConnected() )
[1502]76      closeConnection();
77  }
[1752]78
[1502]79  /**
80  * Establish the Connection to the Server
81  * @return true/false
82  */
[7163]83  bool Client::establishConnection()
84  {
[1502]85    Synchronisable::setClient(true);
[7163]86    if( ClientConnection::establishConnection() )
87    {
88      Host::setActive(true);
[7801]89      GamestateManager::addPeer(NETWORK_PEER_ID_SERVER);
[7163]90      return true;
91    }
92    else
93      return false;
[1502]94  }
95
96  /**
97  * closes the Connection to the Server
98  * @return true/false
99  */
[7163]100  bool Client::closeConnection()
101  {
102    Host::setActive(false);
[7801]103    GamestateManager::removePeer(NETWORK_PEER_ID_SERVER);
[3214]104    return ClientConnection::closeConnection();
[1502]105  }
[7284]106
[7163]107  void Client::setDestination(const std::string& serverAddress, unsigned int port)
108  {
109    ClientConnection::setServerAddress(serverAddress);
110    ClientConnection::setPort(port);
111  }
[1502]112
[7801]113  void Client::queuePacket(ENetPacket *packet, int clientID, uint8_t channelID)
[7163]114  {
[7801]115    ClientConnection::addPacket(packet, channelID);
[1735]116  }
[1752]117
[7163]118  bool Client::processChat(const std::string& message, unsigned int playerID)
119  {
[8807]120//    orxout(message) << "Player " << playerID << ": " << message << endl;
[1907]121    return true;
[1534]122  }
[6417]123
[7163]124  void Client::printRTT()
125  {
[8807]126    orxout(message) << "Round trip time to server is " << ClientConnection::getRTT() << " ms" << endl;
[5961]127  }
[2087]128
[1502]129  /**
[1907]130   * This function implements the method of sending a chat message to the server
[2087]131   * @param message message to be sent
[1907]132   * @return result(true/false)
133   */
[7163]134  bool Client::chat(const std::string& message)
135  {
[1907]136    packet::Chat *m = new packet::Chat(message, Host::getPlayerID());
[7801]137    return m->send(static_cast<Host*>(this));
[1502]138  }
139
[1907]140
[1502]141  /**
[1907]142   * Processes incoming packets, sends a gamestate to the server and does the cleanup
[2087]143   * @param time
[1907]144   */
[7163]145  void Client::update(const Clock& time)
146  {
[3084]147    //this steers our network frequency
148    timeSinceLastUpdate_+=time.getDeltaTime();
[3214]149    if(timeSinceLastUpdate_>=NETWORK_PERIOD)
150    {
[3084]151      timeSinceLastUpdate_ -= static_cast<unsigned int>( timeSinceLastUpdate_ / NETWORK_PERIOD ) * NETWORK_PERIOD;
[3214]152      if ( isConnected() && isSynched_ )
153      {
[8807]154        orxout(verbose, context::network) << "popping partial gamestate: " << endl;
[7801]155//         packet::Gamestate *gs = GamestateClient::getGamestate();
[8327]156        if( GamestateManager::update() )
[7801]157        {
[8327]158          std::vector<packet::Gamestate*> gamestates = GamestateManager::getGamestates();
159          std::vector<packet::Gamestate*>::iterator it;
160          for( it = gamestates.begin(); it != gamestates.end(); ++it )
161          {
162            (*it)->send( static_cast<Host*>(this) );
163          }
[7801]164        }
[3084]165        //assert(gs); <--- there might be the case that no data has to be sent, so its commented out now
[7801]166//         if(gs){
[8807]167//           orxout(verbose, context::network) << "client tick: sending gs " << gs << endl;
[7801]168//           if( !gs->send() )
[8807]169//             orxout(internal_warning, context::network) << "Problem adding partial gamestate to queue" << endl;
[7801]170//         // gs gets automatically deleted by enet callback
171//         }
172        FunctionCallManager::sendCalls(static_cast<Host*>(this));
[1751]173      }
[1502]174    }
[7801]175//     sendPackets(); // flush the enet queue
[6417]176
[3214]177    Connection::processQueue();
[7801]178    if(GamestateManager::processGamestates())
[1769]179    {
[7495]180      FunctionCallManager::processBufferedFunctionCalls();
[1502]181      if(!isSynched_)
182        isSynched_=true;
[1907]183    }
[7801]184//     GamestateManager::cleanup();;
185//     Connection::sendPackets();
[3084]186
[1502]187    return;
188  }
[6417]189
[5929]190  void Client::connectionClosed()
191  {
192    ObjectList<Synchronisable>::iterator it;
193    for(it = ObjectList<Synchronisable>::begin(); it; )
194    {
195      if( it->getSyncMode() != 0x0 )
196        (it++)->destroy();
197      else
198      {
199        ++it;
200      }
201    }
202    Game::getInstance().popState();
203    Game::getInstance().popState();
204  }
[7801]205 
206  void Client::processPacket(packet::Packet* packet)
207  {
208    if( packet->isReliable() )
209    {
[8327]210      if( this->getLastReceivedGamestateID(packet->getPeerID()) >= packet->getRequiredGamestateID() )
[7801]211        packet->process(static_cast<Host*>(this));
212      else
213        this->packetQueue_.push_back(packet);
214    }
215    else
216      packet->process(static_cast<Host*>(this));
217  }
[1502]218
[7163]219
220
[7801]221
[1502]222}
Note: See TracBrowser for help on using the repository browser.