Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: code/branches/network5/src/libraries/network/Host.cc @ 7777

Last change on this file since 7777 was 7777, checked in by scheusso, 13 years ago

some () structural changes
some functional changes (GamestateClient replaced through GamestateManager on client)
reliable packets get buffered until a recent gamestate arrived and got processed

  • Property svn:eol-style set to native
File size: 4.5 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/ObjectList.h"
35#include "core/command/ConsoleCommand.h"
36#include "ChatListener.h"
37
38namespace orxonox {
39
40  static const std::string __CC_printRTT_name = "printRTT";
41
42  SetConsoleCommand("chat", &Host::Chat);
43  SetConsoleCommand(__CC_printRTT_name, &Host::printRTT);
44
45  // Host*               Host::instance_=0;
46  uint32_t            Host::clientID_s=0;
47//   uint32_t            Host::shipID_s=-1;
48  std::vector<Host*>  Host::instances_s;
49
50  /**
51  * @brief Constructor: assures that only one reference will be created and sets the pointer
52  */
53  Host::Host()
54  {
55  //   assert(instance_==0);
56    instances_s.push_back(this);
57    ModifyConsoleCommand(__CC_printRTT_name).setObject(this);
58    this->bIsActive_ = false;
59  }
60
61
62  /**
63  * @brief Destructor: resets the instance pointer to 0
64  */
65  Host::~Host()
66  {
67    assert( std::find( instances_s.begin(), instances_s.end(), this )!=instances_s.end() );
68    instances_s.erase(std::find( instances_s.begin(), instances_s.end(), this ));
69    ModifyConsoleCommand(__CC_printRTT_name).setObject(0);
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  * @return success?
77  */
78  void Host::addPacket(ENetPacket *packet, int clientID, uint8_t channelID)
79  {
80    for( std::vector<Host*>::iterator it = instances_s.begin(); it!=instances_s.end(); ++it )
81    {
82      if( (*it)->isActive() )
83      {
84        (*it)->queuePacket(packet, clientID, channelID);
85      }
86    }
87  }
88
89  void Host::Chat(const std::string& message)
90  {
91    if(instances_s.size()==0)
92    {
93      for (ObjectList<ChatListener>::iterator it = ObjectList<ChatListener>::begin(); it != ObjectList<ChatListener>::end(); ++it)
94        it->incomingChat(message, 0);
95//      return true;
96    }
97    else
98    {
99      bool result = true;
100      for( std::vector<Host*>::iterator it = instances_s.begin(); it!=instances_s.end(); ++it )
101      {
102        if( (*it)->isActive() )
103        {
104          if( !(*it)->chat(message) )
105            result = false;
106        }
107      }
108//      return result;
109    }
110  }
111
112  bool Host::Broadcast(const std::string& message)
113  {
114    if(instances_s.size()==0)
115    {
116      for (ObjectList<ChatListener>::iterator it = ObjectList<ChatListener>::begin(); it != ObjectList<ChatListener>::end(); ++it)
117        it->incomingChat(message, CLIENTID_UNKNOWN);
118      return true;
119    }
120    else
121    {
122      bool result = true;
123      for( std::vector<Host*>::iterator it = instances_s.begin(); it!=instances_s.end(); ++it )
124      {
125        if( (*it)->isActive() )
126        {
127          if( !(*it)->broadcast(message) )
128            result = false;
129        }
130      }
131      return result;
132    }
133  }
134
135  bool Host::incomingChat(const std::string& message, unsigned int playerID)
136  {
137    for (ObjectList<ChatListener>::iterator it = ObjectList<ChatListener>::begin(); it != ObjectList<ChatListener>::end(); ++it)
138      it->incomingChat(message, playerID);
139
140    bool result = true;
141    for( std::vector<Host*>::iterator it = instances_s.begin(); it!=instances_s.end(); ++it )
142    {
143      if( (*it)->isActive() )
144      {
145        if( !(*it)->processChat(message, playerID) )
146          result = false;
147      }
148    }
149    return result;
150  }
151
152  bool Host::isServer()
153  {
154    for (std::vector<Host*>::iterator it=instances_s.begin(); it!=instances_s.end(); ++it )
155    {
156      if( (*it)->isServer_() )
157        return true;
158    }
159    return false;
160  }
161
162}//namespace orxonox
Note: See TracBrowser for help on using the repository browser.