[Orxonox-commit 2792] r7495 - in code/trunk/src: libraries/network libraries/network/packet orxonox/worldentities

scheusso at orxonox.net scheusso at orxonox.net
Tue Sep 28 21:48:32 CEST 2010


Author: scheusso
Date: 2010-09-28 21:48:32 +0200 (Tue, 28 Sep 2010)
New Revision: 7495

Modified:
   code/trunk/src/libraries/network/Client.cc
   code/trunk/src/libraries/network/FunctionCall.cc
   code/trunk/src/libraries/network/FunctionCall.h
   code/trunk/src/libraries/network/FunctionCallManager.cc
   code/trunk/src/libraries/network/FunctionCallManager.h
   code/trunk/src/libraries/network/NetworkFunction.h
   code/trunk/src/libraries/network/packet/FunctionCalls.cc
   code/trunk/src/orxonox/worldentities/ControllableEntity.cc
Log:
buffering incoming function calls for non-existing objects works now


Modified: code/trunk/src/libraries/network/Client.cc
===================================================================
--- code/trunk/src/libraries/network/Client.cc	2010-09-28 15:31:59 UTC (rev 7494)
+++ code/trunk/src/libraries/network/Client.cc	2010-09-28 19:48:32 UTC (rev 7495)
@@ -174,6 +174,7 @@
     Connection::processQueue();
     if(gamestate->processGamestates())
     {
+      FunctionCallManager::processBufferedFunctionCalls();
       if(!isSynched_)
         isSynched_=true;
     }

Modified: code/trunk/src/libraries/network/FunctionCall.cc
===================================================================
--- code/trunk/src/libraries/network/FunctionCall.cc	2010-09-28 15:31:59 UTC (rev 7494)
+++ code/trunk/src/libraries/network/FunctionCall.cc	2010-09-28 19:48:32 UTC (rev 7495)
@@ -79,22 +79,28 @@
     switch(this->nrOfArguments_)
     {
       case 0:
-        fct->call(this->objectID_);
+        if( !fct->call(this->objectID_) )
+          return false;
         break;
       case 1:
-        fct->call(this->objectID_, this->arguments_[0]);
+        if( !fct->call(this->objectID_, this->arguments_[0]) )
+          return false;
         break;
       case 2:
-        fct->call(this->objectID_, this->arguments_[0], this->arguments_[1]);
+        if( !fct->call(this->objectID_, this->arguments_[0], this->arguments_[1]) )
+          return false;
         break;
       case 3:
-        fct->call(this->objectID_, this->arguments_[0], this->arguments_[1], this->arguments_[2]);
+        if( !fct->call(this->objectID_, this->arguments_[0], this->arguments_[1], this->arguments_[2]) )
+          return false;
         break;
       case 4:
-        fct->call(this->objectID_, this->arguments_[0], this->arguments_[1], this->arguments_[2], this->arguments_[3]);
+        if( !fct->call(this->objectID_, this->arguments_[0], this->arguments_[1], this->arguments_[2], this->arguments_[3]) )
+          return false;
         break;
       case 5:
-        fct->call(this->objectID_, this->arguments_[0], this->arguments_[1], this->arguments_[2], this->arguments_[3], this->arguments_[4]);
+        if( !fct->call(this->objectID_, this->arguments_[0], this->arguments_[1], this->arguments_[2], this->arguments_[3], this->arguments_[4]) )
+          return false;
         break;
       default:
         assert(0);

Modified: code/trunk/src/libraries/network/FunctionCall.h
===================================================================
--- code/trunk/src/libraries/network/FunctionCall.h	2010-09-28 15:31:59 UTC (rev 7494)
+++ code/trunk/src/libraries/network/FunctionCall.h	2010-09-28 19:48:32 UTC (rev 7495)
@@ -31,6 +31,7 @@
 
 #include "network/NetworkPrereqs.h"
 #include "util/UtilPrereqs.h"
+#include "util/MultiType.h"
 
 #include <cassert>
 #include <vector>

Modified: code/trunk/src/libraries/network/FunctionCallManager.cc
===================================================================
--- code/trunk/src/libraries/network/FunctionCallManager.cc	2010-09-28 15:31:59 UTC (rev 7494)
+++ code/trunk/src/libraries/network/FunctionCallManager.cc	2010-09-28 19:48:32 UTC (rev 7495)
@@ -28,66 +28,68 @@
 
 #include "FunctionCallManager.h"
 #include "packet/FunctionCalls.h"
+#include "core/GameMode.h"
 
 namespace orxonox {
 
-std::map<uint32_t, packet::FunctionCalls*> FunctionCallManager::clientMap_;
+std::map<uint32_t, packet::FunctionCalls*> FunctionCallManager::sClientMap_;
+std::vector<FunctionCall> FunctionCallManager::sIncomingFunctionCallBuffer_;
 
 // Static calls
 
 void FunctionCallManager::addCallStatic(uint32_t functionID, uint32_t clientID)
 {
-  if(clientMap_.find(clientID)==clientMap_.end())
+  if(sClientMap_.find(clientID)==sClientMap_.end())
   {
-    FunctionCallManager::clientMap_[clientID] = new packet::FunctionCalls;
-    FunctionCallManager::clientMap_[clientID]->setClientID(clientID);
+    FunctionCallManager::sClientMap_[clientID] = new packet::FunctionCalls;
+    FunctionCallManager::sClientMap_[clientID]->setClientID(clientID);
   }
-  FunctionCallManager::clientMap_[clientID]->addCallStatic(functionID);
+  FunctionCallManager::sClientMap_[clientID]->addCallStatic(functionID);
 }
 void FunctionCallManager::addCallStatic(uint32_t functionID, uint32_t clientID, const MultiType& mt1)
 {
-  if(clientMap_.find(clientID)==clientMap_.end())
+  if(sClientMap_.find(clientID)==sClientMap_.end())
   {
-    FunctionCallManager::clientMap_[clientID] = new packet::FunctionCalls;
-    FunctionCallManager::clientMap_[clientID]->setClientID(clientID);
+    FunctionCallManager::sClientMap_[clientID] = new packet::FunctionCalls;
+    FunctionCallManager::sClientMap_[clientID]->setClientID(clientID);
   }
-  FunctionCallManager:: clientMap_[clientID]->addCallStatic(functionID, &mt1);
+  FunctionCallManager:: sClientMap_[clientID]->addCallStatic(functionID, &mt1);
 }
 void FunctionCallManager::addCallStatic(uint32_t functionID, uint32_t clientID, const MultiType& mt1, const MultiType& mt2)
 {
-  if(clientMap_.find(clientID)==clientMap_.end())
+  if(sClientMap_.find(clientID)==sClientMap_.end())
   {
-    FunctionCallManager::clientMap_[clientID] = new packet::FunctionCalls;
-    FunctionCallManager::clientMap_[clientID]->setClientID(clientID);
+    FunctionCallManager::sClientMap_[clientID] = new packet::FunctionCalls;
+    FunctionCallManager::sClientMap_[clientID]->setClientID(clientID);
   }
-  FunctionCallManager:: clientMap_[clientID]->addCallStatic(functionID, &mt1, &mt2);
+  FunctionCallManager:: sClientMap_[clientID]->addCallStatic(functionID, &mt1, &mt2);
 }
 void FunctionCallManager::addCallStatic(uint32_t functionID, uint32_t clientID, const MultiType& mt1, const MultiType& mt2, const MultiType& mt3)
 {
-  if(clientMap_.find(clientID)==clientMap_.end())
+  if(sClientMap_.find(clientID)==sClientMap_.end())
   {
-    FunctionCallManager::clientMap_[clientID] = new packet::FunctionCalls;
-    FunctionCallManager::clientMap_[clientID]->setClientID(clientID);
+    FunctionCallManager::sClientMap_[clientID] = new packet::FunctionCalls;
+    FunctionCallManager::sClientMap_[clientID]->setClientID(clientID);
   }
-  FunctionCallManager:: clientMap_[clientID]->addCallStatic(functionID, &mt1, &mt2, &mt3);
+  FunctionCallManager:: sClientMap_[clientID]->addCallStatic(functionID, &mt1, &mt2, &mt3);
 }
 void FunctionCallManager::addCallStatic(uint32_t functionID, uint32_t clientID, const MultiType& mt1, const MultiType& mt2, const MultiType& mt3, const MultiType& mt4)
 {
-  if(clientMap_.find(clientID)==clientMap_.end())
+  if(sClientMap_.find(clientID)==sClientMap_.end())
   {
-    FunctionCallManager::clientMap_[clientID] = new packet::FunctionCalls;
-    FunctionCallManager::clientMap_[clientID]->setClientID(clientID);
+    FunctionCallManager::sClientMap_[clientID] = new packet::FunctionCalls;
+    FunctionCallManager::sClientMap_[clientID]->setClientID(clientID);
   }
-  FunctionCallManager:: clientMap_[clientID]->addCallStatic(functionID, &mt1, &mt2, &mt3, &mt4);
+  FunctionCallManager:: sClientMap_[clientID]->addCallStatic(functionID, &mt1, &mt2, &mt3, &mt4);
 }
 void FunctionCallManager::addCallStatic(uint32_t functionID, uint32_t clientID, const MultiType& mt1, const MultiType& mt2, const MultiType& mt3, const MultiType& mt4, const MultiType& mt5)
 {
-  if(clientMap_.find(clientID)==clientMap_.end())
+  if(sClientMap_.find(clientID)==sClientMap_.end())
   {
-    FunctionCallManager::clientMap_[clientID] = new packet::FunctionCalls;
-    FunctionCallManager::clientMap_[clientID]->setClientID(clientID);
+    FunctionCallManager::sClientMap_[clientID] = new packet::FunctionCalls;
+    FunctionCallManager::sClientMap_[clientID]->setClientID(clientID);
   }
-  FunctionCallManager:: clientMap_[clientID]->addCallStatic(functionID, &mt1, &mt2, &mt3, &mt4, &mt5);
+  FunctionCallManager:: sClientMap_[clientID]->addCallStatic(functionID, &mt1, &mt2, &mt3, &mt4, &mt5);
 }
 
 
@@ -95,57 +97,57 @@
 
 void FunctionCallManager::addCallMember(uint32_t functionID, uint32_t objectID, uint32_t clientID)
 {
-  if(clientMap_.find(clientID)==clientMap_.end())
+  if(sClientMap_.find(clientID)==sClientMap_.end())
   {
-    FunctionCallManager::clientMap_[clientID] = new packet::FunctionCalls;
-    FunctionCallManager::clientMap_[clientID]->setClientID(clientID);
+    FunctionCallManager::sClientMap_[clientID] = new packet::FunctionCalls;
+    FunctionCallManager::sClientMap_[clientID]->setClientID(clientID);
   }
-  FunctionCallManager::clientMap_[clientID]->addCallMember(functionID, objectID);
+  FunctionCallManager::sClientMap_[clientID]->addCallMember(functionID, objectID);
 }
 void FunctionCallManager::addCallMember(uint32_t functionID, uint32_t objectID, uint32_t clientID, const MultiType& mt1)
 {
-  if(clientMap_.find(clientID)==clientMap_.end())
+  if(sClientMap_.find(clientID)==sClientMap_.end())
   {
-    FunctionCallManager::clientMap_[clientID] = new packet::FunctionCalls;
-    FunctionCallManager::clientMap_[clientID]->setClientID(clientID);
+    FunctionCallManager::sClientMap_[clientID] = new packet::FunctionCalls;
+    FunctionCallManager::sClientMap_[clientID]->setClientID(clientID);
   }
-  FunctionCallManager::clientMap_[clientID]->addCallMember(functionID, objectID, &mt1);
+  FunctionCallManager::sClientMap_[clientID]->addCallMember(functionID, objectID, &mt1);
 }
 void FunctionCallManager::addCallMember(uint32_t functionID, uint32_t objectID, uint32_t clientID, const MultiType& mt1, const MultiType& mt2)
 {
-  if(clientMap_.find(clientID)==clientMap_.end())
+  if(sClientMap_.find(clientID)==sClientMap_.end())
   {
-    FunctionCallManager::clientMap_[clientID] = new packet::FunctionCalls;
-    FunctionCallManager::clientMap_[clientID]->setClientID(clientID);
+    FunctionCallManager::sClientMap_[clientID] = new packet::FunctionCalls;
+    FunctionCallManager::sClientMap_[clientID]->setClientID(clientID);
   }
-  FunctionCallManager::clientMap_[clientID]->addCallMember(functionID, objectID, &mt1, &mt2);
+  FunctionCallManager::sClientMap_[clientID]->addCallMember(functionID, objectID, &mt1, &mt2);
 }
 void FunctionCallManager::addCallMember(uint32_t functionID, uint32_t objectID, uint32_t clientID, const MultiType& mt1, const MultiType& mt2, const MultiType& mt3)
 {
-  if(clientMap_.find(clientID)==clientMap_.end())
+  if(sClientMap_.find(clientID)==sClientMap_.end())
   {
-    FunctionCallManager::clientMap_[clientID] = new packet::FunctionCalls;
-    FunctionCallManager::clientMap_[clientID]->setClientID(clientID);
+    FunctionCallManager::sClientMap_[clientID] = new packet::FunctionCalls;
+    FunctionCallManager::sClientMap_[clientID]->setClientID(clientID);
   }
-  FunctionCallManager::clientMap_[clientID]->addCallMember(functionID, objectID, &mt1, &mt2, &mt3);
+  FunctionCallManager::sClientMap_[clientID]->addCallMember(functionID, objectID, &mt1, &mt2, &mt3);
 }
 void FunctionCallManager::addCallMember(uint32_t functionID, uint32_t objectID, uint32_t clientID, const MultiType& mt1, const MultiType& mt2, const MultiType& mt3, const MultiType& mt4)
 {
-  if(clientMap_.find(clientID)==clientMap_.end())
+  if(sClientMap_.find(clientID)==sClientMap_.end())
   {
-    FunctionCallManager::clientMap_[clientID] = new packet::FunctionCalls;
-    FunctionCallManager::clientMap_[clientID]->setClientID(clientID);
+    FunctionCallManager::sClientMap_[clientID] = new packet::FunctionCalls;
+    FunctionCallManager::sClientMap_[clientID]->setClientID(clientID);
   }
-  FunctionCallManager::clientMap_[clientID]->addCallMember(functionID, objectID, &mt1, &mt2, &mt3, &mt4);
+  FunctionCallManager::sClientMap_[clientID]->addCallMember(functionID, objectID, &mt1, &mt2, &mt3, &mt4);
 }
 void FunctionCallManager::addCallMember(uint32_t functionID, uint32_t objectID, uint32_t clientID, const MultiType& mt1, const MultiType& mt2, const MultiType& mt3, const MultiType& mt4, const MultiType& mt5)
 {
-  if(clientMap_.find(clientID)==clientMap_.end())
+  if(sClientMap_.find(clientID)==sClientMap_.end())
   {
-    FunctionCallManager::clientMap_[clientID] = new packet::FunctionCalls;
-    FunctionCallManager::clientMap_[clientID]->setClientID(clientID);
+    FunctionCallManager::sClientMap_[clientID] = new packet::FunctionCalls;
+    FunctionCallManager::sClientMap_[clientID]->setClientID(clientID);
   }
-  FunctionCallManager::clientMap_[clientID]->addCallMember(functionID, objectID, &mt1, &mt2, &mt3, &mt4, &mt5);
+  FunctionCallManager::sClientMap_[clientID]->addCallMember(functionID, objectID, &mt1, &mt2, &mt3, &mt4, &mt5);
 }
 
 // Send calls
@@ -153,13 +155,31 @@
 void FunctionCallManager::sendCalls()
 {
   std::map<uint32_t, packet::FunctionCalls*>::iterator it;
-  for (it = FunctionCallManager::clientMap_.begin(); it != FunctionCallManager::clientMap_.end(); it++ )
+  for (it = FunctionCallManager::sClientMap_.begin(); it != FunctionCallManager::sClientMap_.end(); ++it )
   {
-    assert(!FunctionCallManager::clientMap_.empty());
+    assert(!FunctionCallManager::sClientMap_.empty());
     it->second->send();
   }
-  FunctionCallManager::clientMap_.clear();
+  FunctionCallManager::sClientMap_.clear();
 }
 
+void FunctionCallManager::bufferIncomingFunctionCall(const orxonox::FunctionCall& fctCall)
+{
+  if( !GameMode::isMaster() )
+    FunctionCallManager::sIncomingFunctionCallBuffer_.push_back( fctCall );
+}
 
+void FunctionCallManager::processBufferedFunctionCalls()
+{
+  std::vector<FunctionCall>::iterator it = FunctionCallManager::sIncomingFunctionCallBuffer_.begin();
+  while( it!=FunctionCallManager::sIncomingFunctionCallBuffer_.end() )
+  {
+    if( it->execute() )
+      FunctionCallManager::sIncomingFunctionCallBuffer_.erase(it);
+    else
+      ++it;
+  }
+}
+
+
 } //namespace orxonox

Modified: code/trunk/src/libraries/network/FunctionCallManager.h
===================================================================
--- code/trunk/src/libraries/network/FunctionCallManager.h	2010-09-28 15:31:59 UTC (rev 7494)
+++ code/trunk/src/libraries/network/FunctionCallManager.h	2010-09-28 19:48:32 UTC (rev 7495)
@@ -32,7 +32,9 @@
 #include "NetworkPrereqs.h"
 
 #include <map>
+#include <vector>
 #include "util/UtilPrereqs.h"
+#include "FunctionCall.h"
 
 namespace orxonox {
 /**
@@ -57,8 +59,12 @@
   static void addCallMember(uint32_t functionID, uint32_t objectID, uint32_t clientID, const MultiType& mt1, const MultiType& mt2, const MultiType& mt3, const MultiType& mt4, const MultiType& mt5);
 
   static void sendCalls();
+  
+  static void bufferIncomingFunctionCall( const FunctionCall& fctCall );
+  static void processBufferedFunctionCalls();
 
-  static std::map<uint32_t, packet::FunctionCalls*> clientMap_;
+  static std::map<uint32_t, packet::FunctionCalls*> sClientMap_;
+  static std::vector<FunctionCall>                  sIncomingFunctionCallBuffer_;
 protected:
   FunctionCallManager();
   ~FunctionCallManager();

Modified: code/trunk/src/libraries/network/NetworkFunction.h
===================================================================
--- code/trunk/src/libraries/network/NetworkFunction.h	2010-09-28 15:31:59 UTC (rev 7494)
+++ code/trunk/src/libraries/network/NetworkFunction.h	2010-09-28 19:48:32 UTC (rev 7495)
@@ -138,12 +138,12 @@
     static NetworkMemberFunctionBase* getFunction( const NetworkFunctionPointer& p ){ assert( functorMap_.find(p) != functorMap_.end() ); return functorMap_[p]; }
 
     //
-    virtual void call(uint32_t objectID)=0;
-    virtual void call(uint32_t objectID, const MultiType& mt1)=0;
-    virtual void call(uint32_t objectID, const MultiType& mt1, const MultiType& mt2)=0;
-    virtual void call(uint32_t objectID, const MultiType& mt1, const MultiType& mt2, const MultiType& mt3)=0;
-    virtual void call(uint32_t objectID, const MultiType& mt1, const MultiType& mt2, const MultiType& mt3, const MultiType& mt4)=0;
-    virtual void call(uint32_t objectID, const MultiType& mt1, const MultiType& mt2, const MultiType& mt3, const MultiType& mt4, const MultiType& mt5)=0;
+    virtual bool call(uint32_t objectID)=0;
+    virtual bool call(uint32_t objectID, const MultiType& mt1)=0;
+    virtual bool call(uint32_t objectID, const MultiType& mt1, const MultiType& mt2)=0;
+    virtual bool call(uint32_t objectID, const MultiType& mt1, const MultiType& mt2, const MultiType& mt3)=0;
+    virtual bool call(uint32_t objectID, const MultiType& mt1, const MultiType& mt2, const MultiType& mt3, const MultiType& mt4)=0;
+    virtual bool call(uint32_t objectID, const MultiType& mt1, const MultiType& mt2, const MultiType& mt3, const MultiType& mt4, const MultiType& mt5)=0;
 
   private:
     static std::map<NetworkFunctionPointer, NetworkMemberFunctionBase*> functorMap_;
@@ -155,35 +155,65 @@
   public:
     NetworkMemberFunction(const FunctorMemberPtr<T>& functor, const std::string& name, const NetworkFunctionPointer& p);
 
-    inline void call(uint32_t objectID)
+    inline bool call(uint32_t objectID)
     {
       if ( Synchronisable::getSynchronisable(objectID)!=0 )
+      {
         (*this->functor_)(orxonox_cast<T*>(Synchronisable::getSynchronisable(objectID)));
+        return true;
+      }
+      else
+        return false;
     }
-    inline void call(uint32_t objectID, const MultiType& mt1)
+    inline bool call(uint32_t objectID, const MultiType& mt1)
     {
       if ( Synchronisable::getSynchronisable(objectID)!=0 )
+      {
         (*this->functor_)(orxonox_cast<T*>(Synchronisable::getSynchronisable(objectID)), mt1);
+        return true;
+      }
+      else
+        return false;
     }
-    inline void call(uint32_t objectID, const MultiType& mt1, const MultiType& mt2)
+    inline bool call(uint32_t objectID, const MultiType& mt1, const MultiType& mt2)
     {
       if ( Synchronisable::getSynchronisable(objectID)!=0 )
+      {
         (*this->functor_)(orxonox_cast<T*>(Synchronisable::getSynchronisable(objectID)), mt1, mt2);
+        return true;
+      }
+      else
+        return false;
     }
-    inline void call(uint32_t objectID, const MultiType& mt1, const MultiType& mt2, const MultiType& mt3)
+    inline bool call(uint32_t objectID, const MultiType& mt1, const MultiType& mt2, const MultiType& mt3)
     {
       if ( Synchronisable::getSynchronisable(objectID)!=0 )
+      {
         (*this->functor_)(orxonox_cast<T*>(Synchronisable::getSynchronisable(objectID)), mt1, mt2, mt3);
+        return true;
+      }
+      else
+        return false;
     }
-    inline void call(uint32_t objectID, const MultiType& mt1, const MultiType& mt2, const MultiType& mt3, const MultiType& mt4)
+    inline bool call(uint32_t objectID, const MultiType& mt1, const MultiType& mt2, const MultiType& mt3, const MultiType& mt4)
     {
       if ( Synchronisable::getSynchronisable(objectID)!=0 )
+      {
         (*this->functor_)(orxonox_cast<T*>(Synchronisable::getSynchronisable(objectID)), mt1, mt2, mt3, mt4);
+        return true;
+      }
+      else
+        return false;
     }
-    inline void call(uint32_t objectID, const MultiType& mt1, const MultiType& mt2, const MultiType& mt3, const MultiType& mt4, const MultiType& mt5)
+    inline bool call(uint32_t objectID, const MultiType& mt1, const MultiType& mt2, const MultiType& mt3, const MultiType& mt4, const MultiType& mt5)
     {
       if ( Synchronisable::getSynchronisable(objectID)!=0 )
+      {
         (*this->functor_)(orxonox_cast<T*>(Synchronisable::getSynchronisable(objectID)), mt1, mt2, mt3, mt4, mt5);
+        return true;
+      }
+      else
+        return false;
     }
 
   private:

Modified: code/trunk/src/libraries/network/packet/FunctionCalls.cc
===================================================================
--- code/trunk/src/libraries/network/packet/FunctionCalls.cc	2010-09-28 15:31:59 UTC (rev 7494)
+++ code/trunk/src/libraries/network/packet/FunctionCalls.cc	2010-09-28 19:48:32 UTC (rev 7495)
@@ -30,6 +30,7 @@
 
 #include <cassert>
 #include "network/FunctionCall.h"
+#include "network/FunctionCallManager.h"
 
 namespace orxonox {
 namespace packet {
@@ -65,7 +66,8 @@
   {
     FunctionCall fctCall;
     fctCall.loadData(temp);
-    fctCall.execute();
+    if( !fctCall.execute() )
+      FunctionCallManager::bufferIncomingFunctionCall( fctCall );
   }
   
   delete this;

Modified: code/trunk/src/orxonox/worldentities/ControllableEntity.cc
===================================================================
--- code/trunk/src/orxonox/worldentities/ControllableEntity.cc	2010-09-28 15:31:59 UTC (rev 7494)
+++ code/trunk/src/orxonox/worldentities/ControllableEntity.cc	2010-09-28 19:48:32 UTC (rev 7495)
@@ -86,6 +86,9 @@
         this->setConfigValues();
         this->setPriority( Priority::VeryHigh );
         this->registerVariables();
+        COUT(0) << "CE creator" << endl;
+        if( GameMode::isMaster() )
+          callMemberNetworkFunction(ControllableEntity, fire, this->getObjectID(), 1, 0);
     }
 
     ControllableEntity::~ControllableEntity()
@@ -240,6 +243,7 @@
 
     void ControllableEntity::fire(unsigned int firemode)
     {
+        COUT(0) << "fire........." << endl;
         if(GameMode::isMaster())
         {
             this->fired(firemode);




More information about the Orxonox-commit mailing list