Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

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

Last change on this file since 9420 was 8829, checked in by landauf, 13 years ago

enhanced chat system. chat related code is now separated into network-side code (located in Host, Client, Server) and client-side code (located in ChatManager).
note that there are now two chat related listeners: NetworkChatListener, which is used to send chat from the network to ChatManager, and ChatListener, which is used to send online and offline chat from ChatManager to the actual chat interfaces (ChatOverlay, ChatInputHandler, …).
the "chat" console command now supports a second argument which is the clientID of the receiver. this allows private messages (or gameplay messages directed to only one specific player).

  • Property svn:eol-style set to native
File size: 6.3 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  void Client::printRTT()
119  {
[8807]120    orxout(message) << "Round trip time to server is " << ClientConnection::getRTT() << " ms" << endl;
[5961]121  }
[2087]122
[1502]123  /**
[8829]124   * @brief Sends a chat message to the server.
[2087]125   * @param message message to be sent
[8829]126   * @param sourceID the ID of the sender
127   * @param targetID the ID of the receiver
[1907]128   */
[8829]129  void Client::doSendChat(const std::string& message, unsigned int sourceID, unsigned int targetID)
[7163]130  {
[8829]131    // send the message to the server
132    packet::Chat* packet = new packet::Chat(message, sourceID, targetID);
133    packet->send(static_cast<Host*>(this));
[1502]134  }
135
[8829]136  /**
137   * @brief Gets called if a packet::Chat packet is received. Calls the parent function which passes the message to the listeners.
138   */
139  void Client::doReceiveChat(const std::string& message, unsigned int sourceID, unsigned int targetID)
140  {
141    // call the parent function which passes the message to the listeners
142    Host::doReceiveChat(message, sourceID, targetID);
143  }
[1907]144
[1502]145  /**
[1907]146   * Processes incoming packets, sends a gamestate to the server and does the cleanup
[2087]147   * @param time
[1907]148   */
[7163]149  void Client::update(const Clock& time)
150  {
[3084]151    //this steers our network frequency
152    timeSinceLastUpdate_+=time.getDeltaTime();
[3214]153    if(timeSinceLastUpdate_>=NETWORK_PERIOD)
154    {
[3084]155      timeSinceLastUpdate_ -= static_cast<unsigned int>( timeSinceLastUpdate_ / NETWORK_PERIOD ) * NETWORK_PERIOD;
[3214]156      if ( isConnected() && isSynched_ )
157      {
[8807]158        orxout(verbose, context::network) << "popping partial gamestate: " << endl;
[7801]159//         packet::Gamestate *gs = GamestateClient::getGamestate();
[8327]160        if( GamestateManager::update() )
[7801]161        {
[8327]162          std::vector<packet::Gamestate*> gamestates = GamestateManager::getGamestates();
163          std::vector<packet::Gamestate*>::iterator it;
164          for( it = gamestates.begin(); it != gamestates.end(); ++it )
165          {
166            (*it)->send( static_cast<Host*>(this) );
167          }
[7801]168        }
[3084]169        //assert(gs); <--- there might be the case that no data has to be sent, so its commented out now
[7801]170//         if(gs){
[8807]171//           orxout(verbose, context::network) << "client tick: sending gs " << gs << endl;
[7801]172//           if( !gs->send() )
[8807]173//             orxout(internal_warning, context::network) << "Problem adding partial gamestate to queue" << endl;
[7801]174//         // gs gets automatically deleted by enet callback
175//         }
176        FunctionCallManager::sendCalls(static_cast<Host*>(this));
[1751]177      }
[1502]178    }
[7801]179//     sendPackets(); // flush the enet queue
[6417]180
[3214]181    Connection::processQueue();
[7801]182    if(GamestateManager::processGamestates())
[1769]183    {
[7495]184      FunctionCallManager::processBufferedFunctionCalls();
[1502]185      if(!isSynched_)
186        isSynched_=true;
[1907]187    }
[7801]188//     GamestateManager::cleanup();;
189//     Connection::sendPackets();
[3084]190
[1502]191    return;
192  }
[6417]193
[5929]194  void Client::connectionClosed()
195  {
196    ObjectList<Synchronisable>::iterator it;
197    for(it = ObjectList<Synchronisable>::begin(); it; )
198    {
199      if( it->getSyncMode() != 0x0 )
200        (it++)->destroy();
201      else
202      {
203        ++it;
204      }
205    }
206    Game::getInstance().popState();
207    Game::getInstance().popState();
208  }
[8829]209
[7801]210  void Client::processPacket(packet::Packet* packet)
211  {
212    if( packet->isReliable() )
213    {
[8327]214      if( this->getLastReceivedGamestateID(packet->getPeerID()) >= packet->getRequiredGamestateID() )
[7801]215        packet->process(static_cast<Host*>(this));
216      else
217        this->packetQueue_.push_back(packet);
218    }
219    else
220      packet->process(static_cast<Host*>(this));
221  }
[1502]222}
Note: See TracBrowser for help on using the repository browser.