Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: code/branches/output/src/libraries/network/Host.cc @ 8849

Last change on this file since 8849 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: 4.4 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 <scheusso [at] ee.ethz.ch>, (C) 2008
24 *   Co-authors:
25 *      ...
26 *
27 */
28
29#include "Host.h"
30
31#include <cassert>
32#include <string>
33
34#include "core/CoreIncludes.h"
35#include "core/ObjectList.h"
36#include "core/command/ConsoleCommand.h"
37#include "NetworkChatListener.h"
38
39namespace orxonox {
40
41  static const std::string __CC_printRTT_group = "Stats";
42  static const std::string __CC_printRTT_name = "printRTT";
43
44  SetConsoleCommand(__CC_printRTT_group, __CC_printRTT_name, &Host::printRTT);
45
46  // Host*               Host::instance_=0;
47  uint32_t            Host::clientID_s=0;
48//   uint32_t            Host::shipID_s=-1;
49  std::vector<Host*>  Host::instances_s;
50
51  /**
52  * @brief Constructor: assures that only one reference will be created and sets the pointer
53  */
54  Host::Host()
55  {
56  //   assert(instance_==0);
57    instances_s.push_back(this);
58    ModifyConsoleCommand(__CC_printRTT_group, __CC_printRTT_name).setObject(this);
59    this->bIsActive_ = false;
60  }
61
62
63  /**
64  * @brief Destructor: resets the instance pointer to 0
65  */
66  Host::~Host()
67  {
68    assert( std::find( instances_s.begin(), instances_s.end(), this )!=instances_s.end() );
69    instances_s.erase(std::find( instances_s.begin(), instances_s.end(), this ));
70    ModifyConsoleCommand(__CC_printRTT_group, __CC_printRTT_name).setObject(0);
71  }
72
73  /**
74  * This function is used to add an enetpacket to be sent to another peer
75  * @param packet Packet to be added
76  * @param clientID ID of the client the packet should be sent to
77  * @param channelID ID of the channel.
78  * @return success?
79  */
80  void Host::addPacket(ENetPacket *packet, int clientID, uint8_t channelID)
81  {
82    for( std::vector<Host*>::iterator it = instances_s.begin(); it!=instances_s.end(); ++it )
83    {
84      if( (*it)->isActive() )
85      {
86        (*it)->queuePacket(packet, clientID, channelID);
87      }
88    }
89  }
90
91  /**
92   * @brief Sends a chat message through the network.
93   * @param message message to be sent
94   * @param sourceID the ID of the sender
95   * @param targetID the ID of the receiver
96   */
97  void Host::sendChat(const std::string& message, unsigned int sourceID, unsigned int targetID)
98  {
99    for( std::vector<Host*>::iterator it = instances_s.begin(); it!=instances_s.end(); ++it )
100      if( (*it)->isActive() )
101        (*it)->doSendChat(message, sourceID, targetID);
102  }
103
104  /**
105   * @brief Gets called if a packet::Chat packet is received. Passes the message to the listeners.
106   */
107  void Host::doReceiveChat(const std::string& message, unsigned int sourceID, unsigned int targetID)
108  {
109    for (ObjectList<NetworkChatListener>::iterator it = ObjectList<NetworkChatListener>::begin(); it != ObjectList<NetworkChatListener>::end(); ++it)
110      it->incomingChat(message, sourceID);
111  }
112
113
114  bool Host::isServer()
115  {
116    for (std::vector<Host*>::iterator it=instances_s.begin(); it!=instances_s.end(); ++it )
117    {
118      if( (*it)->isActive() )
119      {
120        if( (*it)->isServer_() )
121          return true;
122      }
123    }
124    return false;
125  }
126
127  Host* Host::getActiveInstance()
128  {
129    std::vector<Host*>::iterator it = Host::instances_s.begin();
130    while( it != Host::instances_s.end() )
131    {
132      if( (*it)->isActive() )
133        return *it;
134      else
135        ++it;
136    }
137    return 0;
138  }
139
140
141  //////////////////////////////////////////////////////////////////////////
142  // NetworkChatListener                                                  //
143  //////////////////////////////////////////////////////////////////////////
144
145  NetworkChatListener::NetworkChatListener()
146  {
147      RegisterRootObject(NetworkChatListener);
148  }
149
150}//namespace orxonox
Note: See TracBrowser for help on using the repository browser.