Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

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

Last change on this file since 8807 was 8807, checked in by landauf, 13 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
Line 
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:
23 *      Oliver Scheuss
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
41#include "Client.h"
42
43#include <cassert>
44
45#include "util/Clock.h"
46#include "util/Output.h"
47#include "util/ScopedSingletonManager.h"
48#include "synchronisable/Synchronisable.h"
49#include "packet/Chat.h"
50#include "packet/Gamestate.h"
51#include "FunctionCallManager.h"
52#include "core/CoreIncludes.h"
53#include "core/CommandLineParser.h"
54#include "core/Game.h"
55
56namespace orxonox
57{
58
59  ManageScopedSingleton( Client, ScopeID::Root, true );
60
61  /**
62  * Constructor for the Client class
63  * initializes the address and the port to default localhost:NETWORK_PORT
64  */
65  Client::Client():
66      isSynched_(false),
67      gameStateFailure_(false),
68      timeSinceLastUpdate_(0)
69  {
70    this->setDestination( CommandLineParser::getValue("dest").getString(), CommandLineParser::getValue("port") );
71  }
72
73  Client::~Client()
74  {
75    if ( ClientConnection::isConnected() )
76      closeConnection();
77  }
78
79  /**
80  * Establish the Connection to the Server
81  * @return true/false
82  */
83  bool Client::establishConnection()
84  {
85    Synchronisable::setClient(true);
86    if( ClientConnection::establishConnection() )
87    {
88      Host::setActive(true);
89      GamestateManager::addPeer(NETWORK_PEER_ID_SERVER);
90      return true;
91    }
92    else
93      return false;
94  }
95
96  /**
97  * closes the Connection to the Server
98  * @return true/false
99  */
100  bool Client::closeConnection()
101  {
102    Host::setActive(false);
103    GamestateManager::removePeer(NETWORK_PEER_ID_SERVER);
104    return ClientConnection::closeConnection();
105  }
106
107  void Client::setDestination(const std::string& serverAddress, unsigned int port)
108  {
109    ClientConnection::setServerAddress(serverAddress);
110    ClientConnection::setPort(port);
111  }
112
113  void Client::queuePacket(ENetPacket *packet, int clientID, uint8_t channelID)
114  {
115    ClientConnection::addPacket(packet, channelID);
116  }
117
118  bool Client::processChat(const std::string& message, unsigned int playerID)
119  {
120//    orxout(message) << "Player " << playerID << ": " << message << endl;
121    return true;
122  }
123
124  void Client::printRTT()
125  {
126    orxout(message) << "Round trip time to server is " << ClientConnection::getRTT() << " ms" << endl;
127  }
128
129  /**
130   * This function implements the method of sending a chat message to the server
131   * @param message message to be sent
132   * @return result(true/false)
133   */
134  bool Client::chat(const std::string& message)
135  {
136    packet::Chat *m = new packet::Chat(message, Host::getPlayerID());
137    return m->send(static_cast<Host*>(this));
138  }
139
140
141  /**
142   * Processes incoming packets, sends a gamestate to the server and does the cleanup
143   * @param time
144   */
145  void Client::update(const Clock& time)
146  {
147    //this steers our network frequency
148    timeSinceLastUpdate_+=time.getDeltaTime();
149    if(timeSinceLastUpdate_>=NETWORK_PERIOD)
150    {
151      timeSinceLastUpdate_ -= static_cast<unsigned int>( timeSinceLastUpdate_ / NETWORK_PERIOD ) * NETWORK_PERIOD;
152      if ( isConnected() && isSynched_ )
153      {
154        orxout(verbose, context::network) << "popping partial gamestate: " << endl;
155//         packet::Gamestate *gs = GamestateClient::getGamestate();
156        if( GamestateManager::update() )
157        {
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          }
164        }
165        //assert(gs); <--- there might be the case that no data has to be sent, so its commented out now
166//         if(gs){
167//           orxout(verbose, context::network) << "client tick: sending gs " << gs << endl;
168//           if( !gs->send() )
169//             orxout(internal_warning, context::network) << "Problem adding partial gamestate to queue" << endl;
170//         // gs gets automatically deleted by enet callback
171//         }
172        FunctionCallManager::sendCalls(static_cast<Host*>(this));
173      }
174    }
175//     sendPackets(); // flush the enet queue
176
177    Connection::processQueue();
178    if(GamestateManager::processGamestates())
179    {
180      FunctionCallManager::processBufferedFunctionCalls();
181      if(!isSynched_)
182        isSynched_=true;
183    }
184//     GamestateManager::cleanup();;
185//     Connection::sendPackets();
186
187    return;
188  }
189
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  }
205 
206  void Client::processPacket(packet::Packet* packet)
207  {
208    if( packet->isReliable() )
209    {
210      if( this->getLastReceivedGamestateID(packet->getPeerID()) >= packet->getRequiredGamestateID() )
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  }
218
219
220
221
222}
Note: See TracBrowser for help on using the repository browser.