[Orxonox-commit 3086] r7780 - in code/branches/network5/src: libraries/network libraries/network/packet orxonox/gametypes

scheusso at orxonox.net scheusso at orxonox.net
Sun Dec 19 21:41:57 CET 2010


Author: scheusso
Date: 2010-12-19 21:41:57 +0100 (Sun, 19 Dec 2010)
New Revision: 7780

Modified:
   code/branches/network5/src/libraries/network/Client.h
   code/branches/network5/src/libraries/network/Connection.cc
   code/branches/network5/src/libraries/network/GamestateManager.cc
   code/branches/network5/src/libraries/network/GamestateManager.h
   code/branches/network5/src/libraries/network/Server.cc
   code/branches/network5/src/libraries/network/Server.h
   code/branches/network5/src/libraries/network/packet/FunctionCalls.cc
   code/branches/network5/src/libraries/network/packet/Packet.cc
   code/branches/network5/src/orxonox/gametypes/Gametype.cc
Log:
some fixes
reactivating acking and gamestate diffing


Modified: code/branches/network5/src/libraries/network/Client.h
===================================================================
--- code/branches/network5/src/libraries/network/Client.h	2010-12-19 18:37:18 UTC (rev 7779)
+++ code/branches/network5/src/libraries/network/Client.h	2010-12-19 20:41:57 UTC (rev 7780)
@@ -79,6 +79,7 @@
     void setDestination( const std::string& serverAddress, unsigned int port ); // tolua_export
     bool closeConnection();
     void queuePacket(ENetPacket* packet, int clientID, uint8_t channelID);
+    virtual bool sendPacket( packet::Packet* packet ){ return packet->send( static_cast<Host*>(this) ); }
     bool processChat(const std::string& message, unsigned int playerID);
     virtual bool chat(const std::string& message);
     virtual bool broadcast(const std::string& message) { return false; }

Modified: code/branches/network5/src/libraries/network/Connection.cc
===================================================================
--- code/branches/network5/src/libraries/network/Connection.cc	2010-12-19 18:37:18 UTC (rev 7779)
+++ code/branches/network5/src/libraries/network/Connection.cc	2010-12-19 20:41:57 UTC (rev 7780)
@@ -81,6 +81,7 @@
 
   void Connection::disconnectPeer(ENetPeer *peer)
   {
+    assert(peer);
     outgoingEvent outEvent = { peer, outgoingEventType::disconnectPeer, (ENetPacket*)10, 15 };
     
     this->outgoingEventsMutex_->lock();
@@ -90,6 +91,7 @@
 
   void Connection::addPacket(ENetPacket *packet, ENetPeer *peer, uint8_t channelID)
   {
+    assert(peer);
     outgoingEvent outEvent = { peer, outgoingEventType::sendPacket, packet, channelID };
     
     this->outgoingEventsMutex_->lock();
@@ -99,7 +101,7 @@
   
   void Connection::broadcastPacket(ENetPacket* packet, uint8_t channelID)
   {
-    outgoingEvent outEvent = { 0, outgoingEventType::broadcastPacket, packet, channelID };
+    outgoingEvent outEvent = { (ENetPeer*)15, outgoingEventType::broadcastPacket, packet, channelID };
     
     this->outgoingEventsMutex_->lock();
     this->outgoingEvents_.push_back(outEvent);

Modified: code/branches/network5/src/libraries/network/GamestateManager.cc
===================================================================
--- code/branches/network5/src/libraries/network/GamestateManager.cc	2010-12-19 18:37:18 UTC (rev 7779)
+++ code/branches/network5/src/libraries/network/GamestateManager.cc	2010-12-19 20:41:57 UTC (rev 7780)
@@ -109,6 +109,7 @@
     for(it = gamestateQueue.begin(); it!=gamestateQueue.end(); it++){
       bool b = processGamestate(it->second);
       assert(b);
+      sendAck( it->second->getID(), it->second->getPeerID() );
       delete it->second;
     }
     // now clear the queue
@@ -117,6 +118,21 @@
     NetworkCallbackManager::callCallbacks();
     return true;
   }
+  
+  bool GamestateManager::sendAck(unsigned int gamestateID, uint32_t peerID)
+  {
+    packet::Acknowledgement *ack = new packet::Acknowledgement(gamestateID, peerID);
+    if( !this->sendPacket(ack))
+    {
+      COUT(3) << "could not ack gamestate: " << gamestateID << std::endl;
+      return false;
+    }
+    else
+    {
+      COUT(5) << "acked a gamestate: " << gamestateID << std::endl;
+      return true;
+    }
+  }
 
 
   bool GamestateManager::getSnapshot(){
@@ -172,6 +188,9 @@
 
       peerGamestates.push_back(0);  // insert an empty gamestate* to change
       finishGamestate( peerID, peerGamestates.back(), baseGamestate, currentGamestate_ );
+      if( peerGamestates.back()==0 )
+        // nothing to send to remove pointer from vector
+        peerGamestates.pop_back();
       //FunctorMember<GamestateManager>* functor =
 //       ExecutorMember<GamestateManager>* executor = createExecutor( createFunctor(&GamestateManager::finishGamestate, this) );
 //       executor->setDefaultValues( cid, &clientGamestates.back(), client, currentGamestate_ );
@@ -235,7 +254,8 @@
   }
 
 
-  bool GamestateManager::ackGamestate(unsigned int gamestateID, unsigned int peerID) {
+  bool GamestateManager::ackGamestate(unsigned int gamestateID, unsigned int peerID)
+  {
 //     ClientInformation *temp = ClientInformation::findClient(peerID);
 //     assert(temp);
     std::map<uint32_t, peerInfo>::iterator it = this->peerMap_.find(peerID);
@@ -254,7 +274,7 @@
       return true;
     }
 
-    assert(curid==GAMESTATEID_INITIAL || curid<gamestateID);
+    assert(curid==GAMESTATEID_INITIAL || curid<=gamestateID);
     COUT(5) << "acking gamestate " << gamestateID << " for peerID: " << peerID << " curid: " << curid << std::endl;
     std::map<uint32_t, packet::Gamestate*>::iterator it2;
     for( it2=it->second.gamestates.begin(); it2!=it->second.gamestates.end(); )

Modified: code/branches/network5/src/libraries/network/GamestateManager.h
===================================================================
--- code/branches/network5/src/libraries/network/GamestateManager.h	2010-12-19 18:37:18 UTC (rev 7779)
+++ code/branches/network5/src/libraries/network/GamestateManager.h	2010-12-19 20:41:57 UTC (rev 7780)
@@ -89,6 +89,7 @@
     virtual uint32_t  getCurrentGamestateID(){ return currentGamestate_->getID(); }
     
     bool processGamestates();
+    bool sendAck(unsigned int gamestateID, uint32_t peerID);
     bool update();
     std::vector<packet::Gamestate*> getGamestates();
     void finishGamestate( unsigned int peerID, packet::Gamestate*& destgamestate, packet::Gamestate* base, packet::Gamestate* gamestate );
@@ -100,6 +101,8 @@
       { assert(peerMap_.find(peerID)!=peerMap_.end()); peerMap_[peerID].isSynched = true; }
     void removePeer( uint32_t peerID );
 //     void removeClient(ClientInformation *client);
+  protected:
+    virtual bool sendPacket( packet::Packet* packet ) = 0;
   private:
     bool processGamestate(packet::Gamestate *gs);
 

Modified: code/branches/network5/src/libraries/network/Server.cc
===================================================================
--- code/branches/network5/src/libraries/network/Server.cc	2010-12-19 18:37:18 UTC (rev 7779)
+++ code/branches/network5/src/libraries/network/Server.cc	2010-12-19 20:41:57 UTC (rev 7780)
@@ -359,6 +359,7 @@
       return;
     else
     {
+      GamestateManager::removePeer(client->getID());
       //ServerConnection::disconnectClient( client );
       //ClientConnectionListener::broadcastClientDisconnected( client->getID() ); //this is done in ClientInformation now
       delete client;

Modified: code/branches/network5/src/libraries/network/Server.h
===================================================================
--- code/branches/network5/src/libraries/network/Server.h	2010-12-19 18:37:18 UTC (rev 7779)
+++ code/branches/network5/src/libraries/network/Server.h	2010-12-19 20:41:57 UTC (rev 7780)
@@ -66,6 +66,7 @@
     void close();
     bool processChat(const std::string& message, unsigned int playerID);
     void queuePacket(ENetPacket *packet, int clientID, uint8_t channelID);
+    virtual bool sendPacket( packet::Packet* packet ){ return packet->send( static_cast<Host*>(this) ); }
     void update(const Clock& time);
     unsigned int getRTT(unsigned int clientID);
     virtual void printRTT();

Modified: code/branches/network5/src/libraries/network/packet/FunctionCalls.cc
===================================================================
--- code/branches/network5/src/libraries/network/packet/FunctionCalls.cc	2010-12-19 18:37:18 UTC (rev 7779)
+++ code/branches/network5/src/libraries/network/packet/FunctionCalls.cc	2010-12-19 20:41:57 UTC (rev 7780)
@@ -70,7 +70,7 @@
   {
     FunctionCall fctCall;
     fctCall.loadData(temp);
-    if( this->minGamestateID_ > host->getLastProcessedGamestateID(this->getPeerID()) || !fctCall.execute() )
+    if( !fctCall.execute() )
     {
       FunctionCallManager::bufferIncomingFunctionCall( fctCall, minGamestateID_, this->getPeerID() );
     }

Modified: code/branches/network5/src/libraries/network/packet/Packet.cc
===================================================================
--- code/branches/network5/src/libraries/network/packet/Packet.cc	2010-12-19 18:37:18 UTC (rev 7779)
+++ code/branches/network5/src/libraries/network/packet/Packet.cc	2010-12-19 20:41:57 UTC (rev 7780)
@@ -178,6 +178,9 @@
   uint8_t *data = packet->data;
   assert(ClientInformation::findClient(&peer->address)->getID() != static_cast<unsigned int>(-2) || !Host::isServer());
   unsigned int peerID = ClientInformation::findClient(&peer->address)->getID();
+  // HACK
+  if( peerID==static_cast<unsigned int>(-2))
+    peerID = NETWORK_PEER_ID_SERVER;
   Packet *p = 0;
 //   COUT(6) << "packet type: " << *(Type::Value *)&data[_PACKETID] << std::endl;
   switch( *(Type::Value *)(data + _PACKETID) )

Modified: code/branches/network5/src/orxonox/gametypes/Gametype.cc
===================================================================
--- code/branches/network5/src/orxonox/gametypes/Gametype.cc	2010-12-19 18:37:18 UTC (rev 7779)
+++ code/branches/network5/src/orxonox/gametypes/Gametype.cc	2010-12-19 20:41:57 UTC (rev 7780)
@@ -170,7 +170,6 @@
 
     void Gametype::playerEntered(PlayerInfo* player)
     {
-      COUT(0) << "Gametype: playerentered" << endl;
         this->players_[player].state_ = PlayerState::Joined;
     }
 
@@ -411,7 +410,6 @@
 
     void Gametype::spawnPlayer(PlayerInfo* player)
     {
-      COUT(0) << "Gametype: spawnPlayer" << endl;
         SpawnPoint* spawnpoint = this->getBestSpawnPoint(player);
         if (spawnpoint)
         {




More information about the Orxonox-commit mailing list