Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: code/branches/3DPacman_FS19/src/libraries/network/Host.cc

Last change on this file was 12027, checked in by merholzl, 6 years ago

Merged Masterserver, refresh button had to be removed

  • Property svn:eol-style set to native
File size: 4.3 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/object/ObjectList.h"
36#include "core/command/ConsoleCommandIncludes.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  uint32_t            Host::clientID_s = 0;
47  std::vector<Host*>  Host::instances_s;
48
49  /**
50  * @brief Constructor: assures that only one reference will be created and sets the pointer
51  */
52  Host::Host()
53  {
54    Host::instances_s.push_back(this);
55
56    ModifyConsoleCommand(__CC_printRTT_group, __CC_printRTT_name).setObject(this);
57
58    this->bIsActive_ = false;
59  }
60
61
62  /**
63  * @brief Destructor: resets the instance pointer to nullptr
64  */
65  Host::~Host()
66  {
67    assert(std::find( instances_s.begin(), instances_s.end(), this ) != instances_s.end());
68    Host::instances_s.erase(std::find( instances_s.begin(), instances_s.end(), this ));
69    ModifyConsoleCommand(__CC_printRTT_group, __CC_printRTT_name).setObject(nullptr);
70  }
71
72  /**
73  * This function is used to add an enetpacket to be sent to another peer
74  * @param packet Packet to be added
75  * @param clientID ID of the client the packet should be sent to
76  * @param channelID ID of the channel.
77  * @return success?
78  */
79  void Host::addPacket(ENetPacket *packet, int clientID, uint8_t channelID)
80  {
81    for (Host* host : instances_s)
82    {
83      if (host->isActive())
84      {
85        host->queuePacket(packet, clientID, channelID);
86      }
87    }
88  }
89
90  /**
91   * @brief Sends a chat message through the network.
92   * @param message message to be sent
93   * @param sourceID the ID of the sender
94   * @param targetID the ID of the receiver
95   */
96  void Host::sendChat(const std::string& message, unsigned int sourceID, unsigned int targetID)
97  {
98    for (Host* host : instances_s)
99    {
100      if (host->isActive())
101      {
102        host->doSendChat(message, sourceID, targetID);
103      }
104    }
105  }
106
107  /**
108   * @brief Gets called if a packet::Chat packet is received. Passes the message to the listeners.
109   */
110  void Host::doReceiveChat(const std::string& message, unsigned int sourceID, unsigned int targetID)
111  {
112    for (NetworkChatListener* listener : ObjectList<NetworkChatListener>())
113    {
114      listener->incomingChat(message, sourceID);
115    }
116  }
117
118
119  bool Host::isServer()
120  {
121    for (Host* host : Host::instances_s)
122    {
123      if (host->isActive())
124      {
125        if (host->isServer_())
126        {
127          return true;
128        }
129      }
130    }
131    return false;
132  }
133
134  /**
135   * Singleton implementation. Return the first active instance.
136   */
137  Host* Host::getActiveInstance()
138  {
139    std::vector<Host*>::iterator it = Host::instances_s.begin();
140    while (it != Host::instances_s.end())
141    {
142      if ((*it)->isActive())
143      {
144        return *it;
145      }
146      else
147      {
148        ++it;
149      }
150    }
151    return nullptr;
152  }
153
154
155  //////////////////////////////////////////////////////////////////////////
156  // NetworkChatListener                                                  //
157  //////////////////////////////////////////////////////////////////////////
158
159  RegisterAbstractClass(NetworkChatListener).inheritsFrom<Listable>();
160
161  NetworkChatListener::NetworkChatListener()
162  {
163      RegisterObject(NetworkChatListener);
164  }
165
166}//namespace orxonox
Note: See TracBrowser for help on using the repository browser.