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
RevLine 
[1751]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
[3214]29#include "Host.h"
30
[2773]31#include <cassert>
[3214]32#include <string>
[1666]33
[3214]34#include "core/ObjectList.h"
[7284]35#include "core/command/ConsoleCommand.h"
[2087]36#include "ChatListener.h"
[1666]37
[2171]38namespace orxonox {
[1666]39
[7284]40  static const std::string __CC_printRTT_name = "printRTT";
[1907]41
[7284]42  SetConsoleCommand("chat", &Host::Chat);
43  SetConsoleCommand(__CC_printRTT_name, &Host::printRTT);
44
[7163]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;
[2087]49
[7163]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);
[7284]57    ModifyConsoleCommand(__CC_printRTT_name).setObject(this);
[7163]58    this->bIsActive_ = false;
59  }
[1666]60
61
[7163]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 ));
[7284]69    ModifyConsoleCommand(__CC_printRTT_name).setObject(0);
[7163]70  }
[1666]71
[7163]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  }
[1666]91
[7284]92  void Host::Chat(const std::string& message)
[7163]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);
[7284]98//      return true;
[7163]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      }
[7284]111//      return result;
[7163]112    }
113  }
[1666]114
[7163]115  bool Host::Broadcast(const std::string& message)
[3095]116  {
[7163]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    }
[3095]136  }
[1666]137
[7163]138  bool Host::incomingChat(const std::string& message, unsigned int playerID)
[3058]139  {
140    for (ObjectList<ChatListener>::iterator it = ObjectList<ChatListener>::begin(); it != ObjectList<ChatListener>::end(); ++it)
[7163]141      it->incomingChat(message, playerID);
[7284]142
[7163]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;
[3058]153  }
[2087]154
[7163]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  }
[2087]164
[2171]165}//namespace orxonox
Note: See TracBrowser for help on using the repository browser.