Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: code/trunk/src/libraries/network/Host.cc @ 7536

Last change on this file since 7536 was 7284, checked in by landauf, 14 years ago

merged consolecommands3 branch back to trunk.

note: the console command interface has changed completely, but the documentation is not yet up to date. just copy an existing command and change it to your needs, it's pretty self-explanatory. also the include files related to console commands are now located in core/command/. in the game it should work exactly like before, except for some changes in the auto-completion.

  • 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  bool Host::addPacket(ENetPacket *packet, int clientID)
79  {
80    bool result = true;
81    for( std::vector<Host*>::iterator it = instances_s.begin(); it!=instances_s.end(); ++it )
82    {
83      if( (*it)->isActive() )
84      {
85        if( !(*it)->queuePacket(packet, clientID) )
86          result = false;
87      }
88    }
89    return result;
90  }
91
92  void Host::Chat(const std::string& message)
93  {
94    if(instances_s.size()==0)
95    {
96      for (ObjectList<ChatListener>::iterator it = ObjectList<ChatListener>::begin(); it != ObjectList<ChatListener>::end(); ++it)
97        it->incomingChat(message, 0);
98//      return true;
99    }
100    else
101    {
102      bool result = true;
103      for( std::vector<Host*>::iterator it = instances_s.begin(); it!=instances_s.end(); ++it )
104      {
105        if( (*it)->isActive() )
106        {
107          if( !(*it)->chat(message) )
108            result = false;
109        }
110      }
111//      return result;
112    }
113  }
114
115  bool Host::Broadcast(const std::string& message)
116  {
117    if(instances_s.size()==0)
118    {
119      for (ObjectList<ChatListener>::iterator it = ObjectList<ChatListener>::begin(); it != ObjectList<ChatListener>::end(); ++it)
120        it->incomingChat(message, CLIENTID_UNKNOWN);
121      return true;
122    }
123    else
124    {
125      bool result = true;
126      for( std::vector<Host*>::iterator it = instances_s.begin(); it!=instances_s.end(); ++it )
127      {
128        if( (*it)->isActive() )
129        {
130          if( !(*it)->broadcast(message) )
131            result = false;
132        }
133      }
134      return result;
135    }
136  }
137
138  bool Host::incomingChat(const std::string& message, unsigned int playerID)
139  {
140    for (ObjectList<ChatListener>::iterator it = ObjectList<ChatListener>::begin(); it != ObjectList<ChatListener>::end(); ++it)
141      it->incomingChat(message, playerID);
142
143    bool result = true;
144    for( std::vector<Host*>::iterator it = instances_s.begin(); it!=instances_s.end(); ++it )
145    {
146      if( (*it)->isActive() )
147      {
148        if( !(*it)->processChat(message, playerID) )
149          result = false;
150      }
151    }
152    return result;
153  }
154
155  bool Host::isServer()
156  {
157    for (std::vector<Host*>::iterator it=instances_s.begin(); it!=instances_s.end(); ++it )
158    {
159      if( (*it)->isServer_() )
160        return true;
161    }
162    return false;
163  }
164
165}//namespace orxonox
Note: See TracBrowser for help on using the repository browser.