Changeset 8068 in orxonox.OLD for trunk/src/lib/network
- Timestamp:
- Jun 1, 2006, 2:28:16 PM (19 years ago)
- Location:
- trunk/src/lib/network
- Files:
-
- 11 edited
- 2 copied
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/lib/network/Makefile.am
r7954 r8068 23 23 network_log.cc \ 24 24 zip.cc \ 25 player_stats.cc \ 25 26 \ 26 27 synchronizeable_var/synchronizeable_var.cc \ … … 56 57 network_log.h \ 57 58 zip.h \ 59 player_stats.h \ 58 60 \ 59 61 synchronizeable_var/synchronizeable_var.h \ -
trunk/src/lib/network/connection_monitor.cc
r7954 r8068 61 61 * @param stateId packet's state id 62 62 */ 63 void ConnectionMonitor::processUnzippedOutgoingPacket( byte * data, int length, int stateId ) 64 { 65 int tick = SDL_GetTicks(); 66 63 void ConnectionMonitor::processUnzippedOutgoingPacket( int tick, byte * data, int length, int stateId ) 64 { 67 65 nOutgoingPackets++; 68 66 … … 77 75 78 76 // count zero bytes 79 int nZeroBytes = 0;80 81 for ( int i = 0; i < length; i++ )82 if ( data[i] == '\0' )83 nZeroBytes++;77 //int nZeroBytes = 0; 78 79 //for ( int i = 0; i < length; i++ ) 80 // if ( data[i] == '\0' ) 81 // nZeroBytes++; 84 82 85 83 //NETPRINTF(n)( "ZEROBYTES: %d (%f%%)\n", nZeroBytes, ((float)100)*nZeroBytes/length ); … … 93 91 * @param ackedState state which was acked by this packet 94 92 */ 95 void ConnectionMonitor::processUnzippedIncomingPacket( byte * data, int length, int stateId, int ackedState ) 96 { 97 int tick = SDL_GetTicks(); 98 93 void ConnectionMonitor::processUnzippedIncomingPacket( int tick, byte * data, int length, int stateId, int ackedState ) 94 { 99 95 nIncomingPackets++; 100 96 … … 149 145 for ( std::map<int,int>::iterator it = packetHistory.begin(); it != packetHistory.end(); it++ ) 150 146 { 151 res += it->second; 147 if ( it != packetHistory.begin() ) 148 res += it->second; 152 149 } 153 150 … … 155 152 res = 0.0f; 156 153 else 157 res /= (float)( (tick - packetHistory.begin()->first)*( 1 + 1/((float)(packetHistory.size()-1)) ));154 res /= (float)(tick - packetHistory.begin()->first); 158 155 159 156 res *= 1000.0f; … … 169 166 * @param stateId packet's state id 170 167 */ 171 void ConnectionMonitor::processZippedOutgoingPacket( byte * data, int length, int stateId ) 172 { 173 int tick = SDL_GetTicks(); 174 168 void ConnectionMonitor::processZippedOutgoingPacket( int tick, byte * data, int length, int stateId ) 169 { 175 170 nZOutgoingPackets++; 176 171 … … 196 191 * @param ackedState state which was acked by this packet 197 192 */ 198 void ConnectionMonitor::processZippedIncomingPacket( byte * data, int length, int stateId, int ackedState ) 199 { 200 int tick = SDL_GetTicks(); 201 193 void ConnectionMonitor::processZippedIncomingPacket( int tick, byte * data, int length ) 194 { 202 195 nZIncomingPackets++; 203 196 … … 233 226 void ConnectionMonitor::printStatis( ) 234 227 { 235 NETPRINT(n)("========= NETWORKSTATS FOR USER %d=========\n", userId);236 NETPRINT(n)("PING = %d\n", ping );228 NETPRINT(n)("============NETWORKSTATS FOR USER %d============\n", userId); 229 NETPRINT(n)("PING = %d\n", ping ); 237 230 NETPRINT(n)("BANDWIDTH: UP: %f (%f) DOWN %f (%f)\n", outgoingZippedBandWidth, outgoingUnzippedBandWidth, incomingZippedBandWidth, incomingUnzippedBandWidth); 238 NETPRINT(n)("=========================================="); 239 } 240 241 231 NETPRINT(n)("PACKETS: RECIEVED %d; SENT %d\n", nIncomingPackets, nOutgoingPackets ); 232 NETPRINT(n)("================================================\n"); 233 } 234 235 -
trunk/src/lib/network/connection_monitor.h
r7954 r8068 22 22 virtual ~ConnectionMonitor(); 23 23 24 void processUnzippedOutgoingPacket( byte * data, int length, int stateId );25 void processUnzippedIncomingPacket( byte * data, int length, int stateId, int ackedState );24 void processUnzippedOutgoingPacket( int tick, byte * data, int length, int stateId ); 25 void processUnzippedIncomingPacket( int tick, byte * data, int length, int stateId, int ackedState ); 26 26 27 void processZippedOutgoingPacket( byte * data, int length, int stateId );28 void processZippedIncomingPacket( byte * data, int length, int stateId, int ackedState);27 void processZippedOutgoingPacket( int tick, byte * data, int length, int stateId ); 28 void processZippedIncomingPacket( int tick, byte * data, int length ); 29 29 30 30 void calculatePing(); -
trunk/src/lib/network/message_manager.cc
r7954 r8068 309 309 { 310 310 if ( 311 recieverType == RT_ALL || 311 recieverType == RT_ALL_ME || 312 recieverType == RT_ALL_NOT_ME || 312 313 recieverType == RT_USER && it->first == reciever || 313 314 recieverType == RT_NOT_USER && it->first != reciever … … 324 325 325 326 it->second.messages.push_back( msg ); 326 } 327 } 328 } 329 330 327 328 if ( recieverType == RT_ALL_ME ) 329 incomingMessabeBuffer.push_back( msg ); 330 } 331 } 332 } 333 334 -
trunk/src/lib/network/message_manager.h
r7954 r8068 29 29 { 30 30 TESTMESSAGEID = 1, 31 MSGID_ YOU_ARE31 MSGID_DELETESYNCHRONIZEABLE 32 32 }; 33 33 … … 36 36 enum RecieverType 37 37 { 38 RT_ALL = 1, //!< message is sent to all users 39 RT_USER, //!< message is only sent to reciever 40 RT_NOT_USER //!< message is sent to all but reciever 38 RT_ALL_NOT_ME = 1, //!< message is sent to all users 39 RT_ALL_ME, //!< message is sent to all users 40 RT_USER, //!< message is only sent to reciever 41 RT_NOT_USER //!< message is sent to all but reciever 41 42 }; 42 43 -
trunk/src/lib/network/network_game_manager.cc
r7954 r8068 34 34 #include "game_world.h" 35 35 36 #include "game_rules.h" 37 #include "network_game_rules.h" 38 36 39 #include "network_game_manager.h" 37 40 … … 55 58 this->setSynchronized(true); 56 59 57 MessageManager::getInstance()->registerMessageHandler( MSGID_YOU_ARE, youAreHandler, NULL ); 60 MessageManager::getInstance()->registerMessageHandler( MSGID_DELETESYNCHRONIZEABLE, delSynchronizeableHandler, NULL ); 61 62 this->gameState = 0; 63 registerVar( new SynchronizeableInt( &gameState, &gameState, "gameState" ) ); 58 64 } 59 65 … … 63 69 NetworkGameManager::~NetworkGameManager() 64 70 { 65 #if 066 for ( int i = 0; i<outBuffer.size(); i++)67 {68 if ( outBuffer[i].buffer )69 delete outBuffer[i].buffer;70 }71 #endif72 73 }74 75 #if 076 int NetworkGameManager::writeBytes(const byte* data, int length, int sender)77 {78 int i = 0;79 byte b;80 81 while ( i<length )82 {83 b = data[i++];84 85 /**************** Commands only processed by servers ****************/86 if ( isServer() )87 {88 if ( b == NET_REQUEST_CREATE )89 {90 if ( !handleRequestCreate( i, data, length, sender ) )91 return i;92 continue;93 }94 else if ( b == NET_REQUEST_REMOVE )95 {96 if ( !handleRequestRemove( i, data, length, sender ) )97 return i;98 continue;99 }100 else if ( b == NET_REQUEST_PNODE_PATH )101 {102 if ( !handleRequestPNodePath( i, data, length, sender ) )103 return i;104 continue;105 }106 }107 else108 {109 /**************** Commands only processed by clients ****************/110 if ( b == NET_CREATE_ENTITY )111 {112 PRINTF(0)("CREATE_ENTITY\n");113 if ( !handleCreateEntity( i, data, length, sender ) )114 return i;115 continue;116 }117 else if ( b == NET_REMOVE_ENTITY )118 {119 if ( !handleRemoveEntity( i, data, length, sender ) )120 return i;121 continue;122 }123 else if ( b == NET_CREATE_ENTITY_LIST )124 {125 if ( !handleCreateEntityList( i, data, length, sender ) )126 return i;127 continue;128 }129 else if ( b == NET_REMOVE_ENTITY_LIST )130 {131 if ( !handleRemoveEntityList( i, data, length, sender ) )132 return i;133 continue;134 }135 else if ( b == NET_YOU_ARE_ENTITY )136 {137 if ( !handleYouAreEntity( i, data, length, sender ) )138 return i;139 continue;140 }141 }142 143 /**************** Commands processed by servers and clients ****************/144 if ( b == NET_REQUEST_ENTITY_LIST )145 {146 sendEntityList( sender );147 continue;148 }149 150 151 PRINTF(1)("Network is asynchronous: couldn't decode the command sent by %i\n", sender);152 PRINTF(1)("Probably this is because the network protocol has different \n");153 PRINTF(1)("versions or there occured an error in the sending algorithm\n");154 PRINTF(1)("Data is not in the right format! i=%d\n", i);155 return i;156 }157 158 return i;159 }160 #endif161 162 #if 0163 int NetworkGameManager::readBytes(byte* data, int maxLength, int * reciever)164 {165 if ( !isServer() && !hasRequestedWorld )166 {167 assert( maxLength >= 1 );168 data[0] = NET_REQUEST_ENTITY_LIST;169 hasRequestedWorld = true;170 return 1;171 }172 173 for ( int i = 0; i<outBuffer.size(); i++ )174 {175 *reciever = i;176 if ( outBuffer[i].length>0 )177 {178 int nbytes = outBuffer[i].length;179 outBuffer[i].length = 0;180 181 if ( nbytes > maxLength )182 {183 PRINTF(1)("OutBuffer.length (%d) > (%d) networkStreamBuffer.maxLength\n", nbytes, maxLength);184 return 0;185 }186 187 memcpy(data, outBuffer[i].buffer, nbytes);188 return nbytes;189 }190 }191 192 return 0;193 }194 #endif195 196 #if 0197 void NetworkGameManager::writeDebug() const198 {199 }200 201 void NetworkGameManager::readDebug() const202 {203 }204 #endif205 206 207 /*!208 * Checks whether this is connected to a server or a client209 * and afterwards creates the needed entity210 * @param classID: The ID of the class of which an entity should be created211 */212 int NetworkGameManager::createEntity( ClassID classID, int owner )213 {214 if ( this->isServer())215 {216 int res = this->executeCreateEntity( classID, SharedNetworkData::getInstance()->getNewUniqueID(), owner );217 218 if ( res < 0 )219 {220 PRINTF(1)("Cannot create entity! There are no more uniqueIDs left!\n");221 return -1;222 }223 224 return res;225 }226 else227 {228 #if 0229 this->requestCreateEntity( classID );230 #endif231 return -1;232 }233 71 } 234 72 235 73 236 /* !237 * Checks whether this is connected to a server or a client238 * and afterwards creates the needed entity239 * @ param classID: The ID of the class of which an entity should be created74 /** 75 * insert new player into game 76 * @param userId 77 * @return 240 78 */ 241 BaseObject* NetworkGameManager::createEntity(const TiXmlElement* element)79 bool NetworkGameManager::signalNewPlayer( int userId ) 242 80 { 243 if ( this->isServer() ) 244 { 245 if ( SharedNetworkData::getInstance()->getNewUniqueID() < 0 ) 246 { 247 PRINTF(1)("Cannot create entity! There are no more uniqueIDs left!\n"); 248 return NULL; 249 } 250 251 BaseObject * b = Factory::fabricate( element ); 252 253 if ( !b ) 254 { 255 PRINTF(1)("Could not fabricate Object with className %s\n", element->Value() ); 256 return NULL; 257 } 258 259 260 if ( b->isA(CL_SYNCHRONIZEABLE) ) 261 { 262 Synchronizeable * s = dynamic_cast<Synchronizeable*>(b); 263 s->setUniqueID( SharedNetworkData::getInstance()->getNewUniqueID() ); 264 s->setOwner( 0 ); 265 // all entities created via this function are added automaticaly to the synchronizeable list 266 s->setSynchronized(true); 267 return b; 268 } 269 else 270 { 271 PRINTF(1)("Class %s is not a synchronizeable!\n", b->getClassName() ); 272 delete b; 273 } 274 275 } 276 else 277 278 { 279 PRINTF(1)("This node is not a server and cannot create id %x\n", element->Value()); 280 } 281 return NULL; 81 assert( SharedNetworkData::getInstance()->isGameServer() ); 82 assert( State::getGameRules() ); 83 assert( State::getGameRules()->isA( CL_NETWORK_GAME_RULES ) ); 84 85 NetworkGameRules & rules = *(dynamic_cast<NetworkGameRules*>(State::getGameRules())); 86 87 int team = rules.getTeamForNewUser(); 88 ClassID playableClassId = rules.getPlayableClassId( team ); 89 std::string playableModel = rules.getPlayableModelFileName( team, playableClassId ); 90 91 BaseObject * bo = Factory::fabricate( playableClassId ); 92 93 assert( bo != NULL ); 94 assert( bo->isA( CL_PLAYABLE ) ); 95 96 Playable & playable = *(dynamic_cast<Playable*>(bo)); 97 98 playable.loadModel( playableModel ); 99 playable.setOwner( userId ); 100 playable.setUniqueID( SharedNetworkData::getInstance()->getNewUniqueID() ); 101 playable.setSynchronized( true ); 102 103 PlayerStats * stats = rules.getNewPlayerStats( userId ); 104 105 stats->setUniqueID( SharedNetworkData::getInstance()->getNewUniqueID() ); 106 stats->setSynchronized( true ); 107 stats->setOwner( getHostID() ); 108 109 stats->setTeamId( team ); 110 stats->setPlayableClassId( playableClassId ); 111 stats->setPlayableUniqueId( playable.getUniqueID() ); 112 stats->setModelFileName( playableModel ); 282 113 } 283 114 284 115 285 /* !286 * Checks whether this is connected to a server or a client287 * and afterwards removes the specified entity288 * @ param uniqueID: The ID of the entity object which should be removed116 /** 117 * remove player from game 118 * @param userID 119 * @return 289 120 */ 290 void NetworkGameManager::removeEntity(int uniqueID)121 bool NetworkGameManager::signalLeftPlayer(int userID) 291 122 { 292 if ( this->isServer() ) 293 { 294 this->executeRemoveEntity( uniqueID ); 295 } 296 else 297 { 298 #if 0 299 this->requestRemoveEntity( uniqueID ); 300 #endif 301 } 302 } 303 304 305 #if 0 306 /*! 307 * Creates the needed entity on the server if possible 308 * @param classID: The ID of the class of which an entity should be created 309 */ 310 void NetworkGameManager::requestCreateEntity(ClassID classID) 311 { 312 for ( int i = 0; i<outBuffer.size(); i++) 313 { 314 if ( !this->networkStream->isUserIdActive( i ) ) 315 continue; 316 317 if ( !writeToClientBuffer( outBuffer[i], (byte)NET_REQUEST_CREATE ) ) 318 return; 319 if ( !writeToClientBuffer( outBuffer[i], (int)classID ) ) 320 return; 321 } 322 } 323 #endif 324 325 #if 0 326 /*! 327 * Removes the specified entity on the server 328 * @param uniqueID: The ID of the entity object which should be removed 329 */ 330 void NetworkGameManager::requestRemoveEntity(int uniqueID) 331 { 332 for ( int i = 0; i<outBuffer.size(); i++) 333 { 334 if ( !this->networkStream->isUserIdActive( i ) ) 335 continue; 336 337 if ( !writeToClientBuffer( outBuffer[i], (byte)NET_REQUEST_REMOVE ) ) 338 return; 339 if ( !writeToClientBuffer( outBuffer[i], uniqueID ) ) 340 return; 341 } 342 } 343 #endif 344 345 /*! 346 * Creates the needed entity if possible 347 * This function is called if this is a server 348 * @param classID: The ID of the class of which an entity should be created 349 */ 350 int NetworkGameManager::executeCreateEntity(ClassID classID, int uniqueID, int owner) 351 { 352 #if 0 353 for ( int i = 0; i<outBuffer.size(); i++) 354 { 355 if ( !this->networkStream->isUserIdActive( i ) ) 356 continue; 357 358 if ( !writeToClientBuffer( outBuffer[i], (byte)NET_CREATE_ENTITY ) ) 359 return -1; 360 if ( !writeToClientBuffer( outBuffer[i], (int)classID ) ) 361 return -1; 362 if ( !writeToClientBuffer( outBuffer[i], uniqueID ) ) 363 return -1; 364 if ( !writeToClientBuffer( outBuffer[i], owner ) ) 365 return -1; 366 } 367 #endif 368 PRINTF(0)("ExecuteCreateEntity: server side: classID: %x, uniqueID: %i, owner: %i\n", classID, uniqueID, owner); 369 doCreateEntity( classID, uniqueID, owner ); 370 371 return uniqueID; 372 } 373 374 /*! 375 * Removes the specified entity 376 * This function is called if this is a server 377 * @param uniqueID: The ID of the entity object which should be removed 378 */ 379 void NetworkGameManager::executeRemoveEntity(int uniqueID) 380 { 381 #if 0 382 for ( int i = 0; i<outBuffer.size(); i++) 383 { 384 if ( !this->networkStream->isUserIdActive( i ) ) 385 continue; 386 387 if ( !writeToClientBuffer( outBuffer[i], (byte)NET_REMOVE_ENTITY ) ) 388 return; 389 if ( !writeToClientBuffer( outBuffer[i], uniqueID ) ) 390 return; 391 } 392 #endif 393 394 doRemoveEntity(uniqueID); 395 } 396 397 /*! 398 * Checks whether it is possible to create an entity of a given class 399 * @return: true if the entity can be created, false otherwise 400 */ 401 bool NetworkGameManager::canCreateEntity(ClassID classID) 402 { 403 return true; 404 } 405 406 #if 0 407 /*! 408 * Sends the Entities to the new connected client 409 * @param userID: The ID of the user 410 */ 411 void NetworkGameManager::sendEntityList( int userID ) 412 { 413 if ( !isServer() ) 414 return; 415 416 if ( userID >= outBuffer.size() ) 417 resizeBufferVector( userID ); 418 419 SynchronizeableList::const_iterator it, e; 420 421 it = this->networkStream->getSyncBegin(); 422 e = this->networkStream->getSyncEnd(); 423 424 // send the packet header 425 if ( !writeToClientBuffer( outBuffer[userID], (byte)NET_CREATE_ENTITY_LIST ) ) 426 return; 427 428 // send the number of entities: -2 because you must not send network_game_manager and handshake 429 if ( !writeToClientBuffer( outBuffer[userID], networkStream->getSyncCount() ) ) 430 return; 431 432 //PRINTF(0)("SendEntityList: n = %d\n", networkStream->getSyncCount()-2 ); 433 434 // first send the NullParent 435 if ( !writeToClientBuffer( outBuffer[userID], (int)PNode::getNullParent()->getLeafClassID()) ) 436 return; 437 if ( !writeToClientBuffer( outBuffer[userID], (int)PNode::getNullParent()->getUniqueID()) ) 438 return; 439 if ( !writeToClientBuffer( outBuffer[userID], (int)PNode::getNullParent()->getOwner()) ) 440 return; 441 442 // now send the rest of the entities 443 while ( it != e ) 444 { 445 if( (*it)->beSynchronized() && (*it) != PNode::getNullParent()) 446 { 447 PRINTF(0)("SENDING ENTITY %s classid: %x, uniqueid %d\n", (*it)->getClassName(), (*it)->getLeafClassID(), (*it)->getUniqueID() ); 448 if ( !writeToClientBuffer( outBuffer[userID], (int)((*it)->getLeafClassID()) ) ) 449 return; 450 451 if ( !writeToClientBuffer( outBuffer[userID], (int)((*it)->getUniqueID()) ) ) 452 return; 453 454 if ( !writeToClientBuffer( outBuffer[userID], (int)((*it)->getOwner()) ) ) 455 return; 456 } 457 it++; 458 } 459 460 signalNewPlayer( userID ); 461 } 462 #endif 463 464 465 466 bool NetworkGameManager::signalNewPlayer(int userId) 467 { 468 /* create new playable for Player*/ 469 PRINTF(0)("Request for creation: %i\n", userId); 470 int uniqueId = this->createEntity(CL_SPACE_SHIP, userId); 471 PRINTF(0)("Request for creation: userid: %i, uniqueid: %i\n", userId, uniqueId); 472 this->sendYouAre(uniqueId, userId); 123 delete PlayerStats::getStats( userID )->getPlayable(); 124 delete PlayerStats::getStats( userID ); 473 125 } 474 126 475 127 476 128 477 bool NetworkGameManager::signalLeftPlayer(int userID) 129 /** 130 * handler for remove synchronizeable messages 131 * @param messageId 132 * @param data 133 * @param dataLength 134 * @param someData 135 * @param userId 136 * @return true on successfull handling else handler will be called again 137 */ 138 bool NetworkGameManager::delSynchronizeableHandler( MessageId messageId, byte * data, int dataLength, void * someData, int userId ) 478 139 { 479 const std::list<BaseObject*>* playableList = ClassList::getList(CL_PLAYABLE); 140 if ( getInstance()->isServer() ) 141 { 142 PRINTF(2)("Recieved DeleteSynchronizeable message from client %d!\n", userId); 143 return true; 144 } 480 145 481 i f ( !playableList )482 return false;146 int uniqueId = 0; 147 int len = Converter::byteArrayToInt( data, &uniqueId ); 483 148 484 std::list<BaseObject*>::const_iterator it = playableList->begin(); 485 486 for(; it != playableList->end(); it++) 149 if ( len != dataLength ) 487 150 { 488 if( dynamic_cast<Synchronizeable*>(*it)->getOwner() == userID ) 151 PRINTF(2)("Recieved DeleteSynchronizeable message with incorrect size (%d) from client %d!\n", dataLength, userId); 152 return true; 153 } 154 155 const std::list<BaseObject*> * list = ClassList::getList( CL_SYNCHRONIZEABLE ); 156 157 for ( std::list<BaseObject*>::const_iterator it = list->begin(); it != list->end(); it++ ) 158 { 159 if ( dynamic_cast<Synchronizeable*>(*it)->getUniqueID() == uniqueId ) 489 160 { 490 PRINTF(0)("remove playable from %i\n", userID); 491 this->removeEntity(dynamic_cast<Synchronizeable*>(*it)->getUniqueID()); 161 delete dynamic_cast<Synchronizeable*>(*it); 492 162 return true; 493 163 } 494 164 } 495 return false;496 }497 498 #if 0499 /**500 * Creates a buffer for user n501 * @param n The ID of the user502 */503 void NetworkGameManager::resizeBufferVector( int n )504 {505 for ( int i = outBuffer.size(); i<=n; i++)506 {507 clientBuffer outBuf;508 509 outBuf.length = 0;510 511 outBuf.maxLength = 5*1024;512 513 outBuf.buffer = new byte[5*1014];514 515 outBuffer.push_back(outBuf);516 }517 }518 #endif519 520 /**521 * Creates the entity on this host522 * @param classID: ClassID of the entity to create523 * @param uniqueID: Unique ID to assign to the synchronizeable524 * @param owner: owner of this synchronizealbe525 */526 BaseObject* NetworkGameManager::doCreateEntity( ClassID classID, int uniqueID, int owner )527 {528 PRINTF(0)("Creating Entity via Factory: classid: %x, uniqueID: %i, owner: %i\n", classID, uniqueID, owner);529 530 BaseObject * b;531 /* These are some small exeptions in creation: Not all objects can/should be created via Factory */532 /* Exception 1: NullParent */533 if( classID == CL_NULL_PARENT)534 {535 b = (BaseObject*)PNode::getNullParent();536 }537 else538 b = Factory::fabricate( classID );539 540 if ( !b )541 {542 PRINTF(1)("Could not fabricate Object with classID %x\n", classID);543 return NULL;544 }545 546 if ( b->isA(CL_SYNCHRONIZEABLE) )547 {548 Synchronizeable * s = dynamic_cast<Synchronizeable*>(b);549 s->setUniqueID( uniqueID );550 s->setOwner( owner );551 s->setSynchronized(true);552 //this->networkStream->connectSynchronizeable( *s );553 554 PRINTF(0)("Fabricated %s with id %d\n", s->getClassName(), s->getUniqueID());555 556 //TODO HACK: hack to prevent collision557 if ( b->isA(CL_WORLD_ENTITY) && !b->isA(CL_PLAYABLE) )558 {559 if ( SharedNetworkData::getInstance()->getHostID()!=0 )560 {561 static Vector pos = Vector(1000.0, 1000.0, 1000.0);562 PNode *p = dynamic_cast<PNode*>(b);563 p->setAbsCoor(pos);564 p->updateNode(0);565 pos += Vector(1000.0, 1000.0, 1000.0);566 }567 }568 ///TODO HACK this is only for network multiplayer games.569 if( b->isA(CL_PLAYABLE))570 {571 Playable* ss = dynamic_cast<Playable*>(b);572 if( owner%2 == 0)573 {574 575 ss->loadModel("models/ships/reap_0.obj");576 ss->toList(OM_GROUP_00);577 ss->setAbsCoor(213.37, 57.71, -47.98);578 ss->setAbsDir(Quaternion(0.16, 0.98, -0.10));579 }580 else581 {582 ss->loadModel( "models/ships/fighter.obj" );583 ss->toList(OM_GROUP_01);584 ss->setAbsCoor(-314.450, 40.701, 83.554);585 }586 }587 588 return b;589 }590 else591 {592 PRINTF(1)("Class with ID %x is not a synchronizeable!", (int)classID);593 delete b;594 }595 return NULL;596 165 } 597 166 598 167 /** 599 * Removes a entity on this host600 * @param uniqueI D: unique ID assigned with the entity to remove168 * removes synchronizeable (also on clients) 169 * @param uniqueId uniqueid to delete 601 170 */ 602 void NetworkGameManager:: doRemoveEntity( int uniqueID)171 void NetworkGameManager::removeSynchronizeable( int uniqueId ) 603 172 { 604 SynchronizeableList::const_iterator it,e;605 it = this->networkStream->getSyncBegin();606 e = this->networkStream->getSyncEnd();607 608 while ( it != e )609 {610 if ( (*it)->getUniqueID() == uniqueID )611 {612 assert((*it)->isA(CL_WORLD_ENTITY));613 dynamic_cast<WorldEntity*>(*it)->leaveWorld();614 dynamic_cast<WorldEntity*>(*it)->toList(OM_DEAD);615 break;616 }617 it++;618 }619 }620 621 #if 0622 /**623 * Copies length bytes to the clientBuffer with error checking624 * @param clientBuffer: the clientBuffer to write to625 * @param data: buffer to the data626 * @param length: length of data627 * @return false on error true else628 */629 bool NetworkGameManager::writeToClientBuffer( clientBuffer &cb, byte * data, int length )630 {631 if ( length > cb.maxLength-cb.length )632 {633 PRINTF(1)("No space left in clientBuffer\n");634 return false;635 }636 637 memcpy( cb.buffer+cb.length, data, length );638 return true;639 }640 #endif641 642 #if 0643 /**644 * Reads data from clientBuffer with error checking645 * @param clientBuffer: the clientBuffer to read from646 * @param data: pointer to the buffer647 * @param length:648 * @return649 */650 bool NetworkGameManager::readFromClientBuffer( clientBuffer &cb, byte * data, int length )651 {652 if ( cb.length < length )653 {654 PRINTF(0)("There is not enough data in clientBuffer\n");655 return 0;656 }657 658 memcpy( data, cb.buffer+cb.length-length, length );659 return true;660 }661 #endif662 663 /**664 * Tells this client that he has to control this entity665 * @param uniqueID: the entity's uniqeID666 */667 void NetworkGameManager::doYouAre( int uniqueID )668 {669 670 SynchronizeableList::const_iterator it = this->networkStream->getSyncBegin();671 672 Playable *p = NULL;673 Synchronizeable *s = NULL;674 675 for ( ; it !=networkStream->getSyncEnd(); it++ )676 {677 if ( (*it)->getUniqueID()==uniqueID )678 {679 if ( (*it)->isA( CL_SYNCHRONIZEABLE ) )680 {681 s = dynamic_cast<Synchronizeable*>(*it);682 }683 if ( (*it)->isA( CL_PLAYABLE ) )684 {685 p = dynamic_cast<Playable*>(*it);686 break;687 } else688 {689 PRINTF(1)("UniqueID %d is not a Playable\n", uniqueID);690 }691 }692 }693 694 Player* player = State::getPlayer();695 assert(p != NULL);696 assert(s != NULL);697 assert(player != NULL);698 699 PRINTF(0)("uniqueID = %d\n", s->getUniqueID());700 701 player->setPlayable(p);702 703 704 }705 706 /**707 * Tells a remote client that he has to control this entity708 * @param uniqueID: the entity's uniqeID709 * @param userID: the users ID710 */711 void NetworkGameManager::sendYouAre( int uniqueID, int userID )712 {713 if ( !isServer() )714 return;715 716 173 byte buf[INTSIZE]; 717 174 718 Converter::intToByteArray( uniqueID, buf,INTSIZE );175 assert( Converter::intToByteArray( uniqueId, buf, INTSIZE ) == INTSIZE ); 719 176 720 MessageManager::getInstance()->sendMessage( MSGID_YOU_ARE, buf, INTSIZE, RT_USER, userID, MP_HIGHBANDWIDTH); 721 } 722 723 bool NetworkGameManager::handleRequestCreate( int & i, const byte * data, int length, int sender ) 724 { 725 if ( INTSIZE > length-i ) 726 { 727 PRINTF(1)("Cannot read classID from buffer! Not enough data left!\n"); 728 return false; 729 } 730 int classID; 731 i += Converter::byteArrayToInt( &data[i], &classID ); 732 733 createEntity( (ClassID)classID ); 734 735 return true; 736 } 737 738 bool NetworkGameManager::handleRequestRemove( int & i, const byte * data, int length, int sender ) 739 { 740 if ( INTSIZE > length-i ) 741 { 742 PRINTF(1)("Cannot read uniqueID from buffer! Not enough data left!\n"); 743 return false; 744 } 745 int uniqueID; 746 i += Converter::byteArrayToInt( &data[i], &uniqueID ); 747 748 removeEntity( uniqueID ); 749 750 return true; 751 } 752 753 bool NetworkGameManager::handleCreateEntity( int & i, const byte * data, int length, int sender ) 754 { 755 if ( INTSIZE > length-i ) 756 { 757 PRINTF(1)("Cannot read classID from buffer! Not enough data left!\n"); 758 return false; 759 } 760 int classID; 761 i += Converter::byteArrayToInt( &data[i], &classID ); 762 763 if ( INTSIZE > length-i ) 764 { 765 PRINTF(1)("Cannot read uniqueID from buffer! Not enough data left!\n"); 766 return false; 767 } 768 int uniqueID; 769 i += Converter::byteArrayToInt( &data[i], &uniqueID ); 770 771 if ( INTSIZE > length-i ) 772 { 773 PRINTF(1)("Cannot read owner from buffer! Not enough data left!\n"); 774 return false; 775 } 776 int owner; 777 i += Converter::byteArrayToInt( &data[i], &owner ); 778 779 PRINTF(0)("handleCreateEntity: client side: classID: %x, uniqueID: %i, owner: %i\n", classID, uniqueID, owner); 780 doCreateEntity( (ClassID)classID, uniqueID, owner ); 781 782 return true; 783 } 784 785 bool NetworkGameManager::handleRemoveEntity( int & i, const byte * data, int length, int sender ) 786 { 787 if ( INTSIZE > length-i ) 788 { 789 PRINTF(1)("Cannot read uniqueID from buffer! Not enough data left!\n"); 790 return false; 791 } 792 int uniqueID; 793 i += Converter::byteArrayToInt( &data[i], &uniqueID ); 794 795 doRemoveEntity( uniqueID ); 796 797 return true; 798 } 799 800 bool NetworkGameManager::handleCreateEntityList( int & i, const byte * data, int length, int sender ) 801 { 802 if ( INTSIZE > length-i ) 803 { 804 PRINTF(1)("Cannot read n from buffer! Not enough data left!\n"); 805 return false; 806 } 807 808 PRINTF(0)("HandleCreateEntityList: data[i..i+3] = %d %d %d %d\n", data[i], data[i+1], data[i+2], data[i+3]); 809 810 int n; 811 i += Converter::byteArrayToInt( &data[i], &n ); 812 813 814 PRINTF(0)("HandleCreateEntityList: n = %d\n", n); 815 816 int classID, uniqueID, owner; 817 818 for ( int j = 0; j<n; j++ ) 819 { 820 821 if ( INTSIZE > length-i ) 822 { 823 PRINTF(1)("Cannot read classID from buffer! Not enough data left!\n"); 824 return false; 825 } 826 i += Converter::byteArrayToInt( &data[i], &classID ); 827 828 if ( INTSIZE > length-i ) 829 { 830 PRINTF(1)("Cannot read uniqueID from buffer! Not enough data left!\n"); 831 return false; 832 } 833 i += Converter::byteArrayToInt( &data[i], &uniqueID ); 834 835 if ( INTSIZE > length-i ) 836 { 837 PRINTF(1)("Cannot read owner from buffer! Not enough data left!\n"); 838 return false; 839 } 840 i += Converter::byteArrayToInt( &data[i], &owner ); 841 842 if ( classID != CL_NETWORK_GAME_MANAGER && classID != CL_HANDSHAKE ) 843 { 844 BaseObject* b = doCreateEntity( (ClassID)classID, uniqueID, owner ); 845 } 846 847 } 848 849 return true; 850 } 851 852 bool NetworkGameManager::handleRemoveEntityList( int & i, const byte * data, int length, int sender ) 853 { 854 if ( INTSIZE > length-i ) 855 { 856 PRINTF(1)("Cannot read n from buffer! Not enough data left!\n"); 857 return false; 858 } 859 int n; 860 i += Converter::byteArrayToInt( &data[i], &n ); 861 862 int uniqueID; 863 864 for ( int j = 0; j<n; j++ ) 865 { 866 867 if ( INTSIZE > length-i ) 868 { 869 PRINTF(1)("Cannot read uniqueID from buffer! Not enough data left!\n"); 870 return false; 871 } 872 i += Converter::byteArrayToInt( &data[i], &uniqueID ); 873 874 doRemoveEntity( uniqueID ); 875 } 876 877 return true; 878 } 879 880 bool NetworkGameManager::handleYouAreEntity( int & i, const byte * data, int length, int sender ) 881 { 882 if ( INTSIZE > length-i ) 883 { 884 PRINTF(1)("Cannot read uniqueID from buffer! Not enough data left!\n"); 885 return false; 886 } 887 888 int uniqueID; 889 i += Converter::byteArrayToInt( &data[i], &uniqueID ); 890 891 doYouAre( uniqueID ); 892 893 return true; 894 } 895 896 /** 897 * handles the network signal NET_REQUEST_PNODE_PATH 898 * @param i byte offset in the buffer 899 * @param data data array 900 * @param length length of the data arary 901 * @param sender the sender id 902 * @return true if process terminated sucessfully 903 */ 904 bool NetworkGameManager::handleRequestPNodePath(int& i, const byte* data, int length, int sender) 905 { 906 if( INTSIZE > length-i ) 907 { 908 PRINTF(1)("Cannot read n from buffer! Not enough data left!\n"); 909 return false; 910 } 911 PRINTF(0)("HandleRequestPNodePath: data[i..i+3] = %d %d %d %d\n", data[i], data[i+1], data[i+2], data[i+3]); 912 913 int uniqueID1, uniqueID2; 914 if( INTSIZE > length-i ) 915 { 916 PRINTF(1)("Cannot read uniqueID from buffer! Not enough data left!\n"); 917 return false; 918 } 919 i += Converter::byteArrayToInt( &data[i], &uniqueID1 ); 920 921 if( INTSIZE > length-i ) 922 { 923 PRINTF(1)("Cannot read uniqueID from buffer! Not enough data left!\n"); 924 return false; 925 } 926 i += Converter::byteArrayToInt( &data[i], &uniqueID2 ); 927 928 929 PRINTF(0)("HandleRequestPNodePath: got a request for path from uid %i to uid %i\n", uniqueID1, uniqueID2); 930 931 return true; 932 } 933 934 bool NetworkGameManager::youAreHandler( MessageId messageId, byte * data, int dataLength, void * someData, int userId ) 935 { 936 assert( dataLength == INTSIZE ); 937 int uniqueId; 938 939 Converter::byteArrayToInt( data, &uniqueId ); 940 941 SynchronizeableList::const_iterator it = NetworkGameManager::getInstance()->networkStream->getSyncBegin(); 942 943 Playable *p = NULL; 944 Synchronizeable *s = NULL; 945 946 for ( ; it !=NetworkGameManager::getInstance()->networkStream->getSyncEnd(); it++ ) 947 { 948 if ( (*it)->getUniqueID()==uniqueId ) 949 { 950 break; 951 } 952 } 953 954 if ( it == NetworkGameManager::getInstance()->networkStream->getSyncEnd() ) 955 return false; 956 957 NetworkGameManager::getInstance()->doYouAre( uniqueId ); 958 959 return true; 960 } 961 962 #if 0 963 bool NetworkGameManager::writeToClientBuffer( clientBuffer & cb, byte b ) 964 { 965 if ( cb.maxLength-cb.length < 1 ) 966 { 967 PRINTF(1)("Cannot write to clientBuffer! Not enough space for 1 byte\n"); 968 return false; 969 } 970 971 cb.buffer[cb.length++] = b; 972 973 return true; 177 MessageManager::getInstance()->sendMessage( MSGID_DELETESYNCHRONIZEABLE, buf, INTSIZE, RT_ALL_NOT_ME, 0, MP_HIGHBANDWIDTH ); 974 178 } 975 179 976 180 977 bool NetworkGameManager::writeToClientBuffer( clientBuffer & cb, int i )978 {979 int n = Converter::intToByteArray( i, cb.buffer+cb.length, cb.maxLength-cb.length );980 cb.length += n;981 982 if ( n <= 0 )983 {984 PRINTF(1)("Cannot write to clientBuffer! Not enough space for 1 int\n");985 return false;986 }987 988 return true;989 }990 #endif991 181 992 182 183 184 -
trunk/src/lib/network/network_game_manager.h
r7954 r8068 47 47 public: 48 48 virtual ~NetworkGameManager(); 49 49 50 50 static NetworkGameManager* NetworkGameManager::getInstance() 51 51 { if (!NetworkGameManager::singletonRef) NetworkGameManager::singletonRef = new NetworkGameManager(); return NetworkGameManager::singletonRef; } 52 52 53 #if 054 virtual int writeBytes(const byte* data, int length, int sender);55 virtual int readBytes(byte* data, int maxLength, int * reciever);56 virtual void writeDebug() const;57 virtual void readDebug() const;58 #endif59 53 60 int createEntity( ClassID classID, int owner = 0);61 BaseObject* createEntity(const TiXmlElement* element);62 void removeEntity( int uniqueID );63 void sendYouAre( int uniqueID, int userID);54 bool signalNewPlayer( int userId ); 55 bool signalLeftPlayer( int userID ); 56 57 void removeSynchronizeable( int uniqueId ); 64 58 65 #if 0 66 void sendEntityList(int userID); 67 #endif 68 69 bool signalNewPlayer(int userId); 70 bool signalLeftPlayer(int userID); 71 59 inline void setGameState( int gameState ){ this->gameState = gameState; } 60 inline int getGameState(){ return this->gameState; } 72 61 73 62 private: 74 63 NetworkGameManager(); 75 64 76 static bool youAreHandler(MessageId messageId, byte * data, int dataLength, void * someData, int userId );65 static bool delSynchronizeableHandler( MessageId messageId, byte * data, int dataLength, void * someData, int userId ); 77 66 78 79 /* some network signal handlers */80 bool handleRequestCreate( int& i, const byte* data, int length, int sender );81 bool handleRequestRemove( int& i, const byte* data, int length, int sender );82 bool handleCreateEntity( int& i, const byte* data, int length, int sender );83 bool handleRemoveEntity( int& i, const byte* data, int length, int sender );84 bool handleCreateEntityList( int& i, const byte* data, int length, int sender );85 bool handleRemoveEntityList( int& i, const byte* data, int length, int sender );86 bool handleYouAreEntity( int& i, const byte* data, int length, int sender );87 bool handleRequestPNodePath(int& i, const byte* data, int length, int sender);88 bool handleSendPNodePath(int& i, const byte* data, int length, int sender);89 90 91 /* some network handlers helper functions */92 // void requestCreateEntity(ClassID classID);93 int executeCreateEntity(ClassID classID, int uniqueID = 0, int owner = 0);94 BaseObject* doCreateEntity(ClassID classID, int uniqueID, int owner);95 96 // void requestRemoveEntity(int uniqueID);97 void executeRemoveEntity(int uniqueID);98 void doRemoveEntity(int uniqueID);99 100 void doYouAre( int uniqueID );101 102 // void requestPNodePath(const PNode* node1, const PNode* node2);103 void executeRequestPNodePath(const PNode* node2, const PNode* node2);104 void doRequestPNodePath(const PNode* node1, const PNode* node2);105 106 bool canCreateEntity(ClassID classID);107 #if 0108 void resizeBufferVector(int n);109 110 111 bool writeToClientBuffer( clientBuffer &cb, byte*data, int length );112 bool writeToClientBuffer( clientBuffer &cb, byte b );113 bool writeToClientBuffer( clientBuffer &cb, int i );114 bool readFromClientBuffer( clientBuffer &cb, byte*data, int length );115 #endif116 117 private:118 #if 0119 std::vector<clientBuffer> outBuffer;120 //clientBuffer allOutBuffer;121 #endif122 67 static NetworkGameManager* singletonRef; 68 69 int gameState; 123 70 }; 124 71 -
trunk/src/lib/network/network_stream.cc
r7954 r8068 177 177 void NetworkStream::processData() 178 178 { 179 int tick = SDL_GetTicks(); 180 179 181 currentState++; 180 182 … … 207 209 // order of up/downstream is important!!!! 208 210 // don't change it 209 handleDownstream( );210 handleUpstream( );211 handleDownstream( tick ); 212 handleUpstream( tick ); 211 213 212 214 } … … 277 279 PRINTF(0)("Client is gone: %d (%s)\n", it->second.userId, reason.c_str()); 278 280 279 assert(false);281 //assert(false); 280 282 281 283 it->second.socket->disconnectServer(); … … 391 393 * handle upstream network traffic 392 394 */ 393 void NetworkStream::handleUpstream( )395 void NetworkStream::handleUpstream( int tick ) 394 396 { 395 397 int offset; 396 398 int n; 397 399 398 for ( PeerList:: iterator peer = peers.begin(); peer != peers.end(); peer++ )400 for ( PeerList::reverse_iterator peer = peers.rbegin(); peer != peers.rend(); peer++ ) 399 401 { 400 402 offset = INTSIZE; //make already space for length … … 496 498 writeToNewDict( buf, offset ); 497 499 498 peer->second.connectionMonitor->processUnzippedOutgoingPacket( buf, offset, currentState );499 peer->second.connectionMonitor->processZippedOutgoingPacket( compBuf, compLength, currentState );500 peer->second.connectionMonitor->processUnzippedOutgoingPacket( tick, buf, offset, currentState ); 501 peer->second.connectionMonitor->processZippedOutgoingPacket( tick, compBuf, compLength, currentState ); 500 502 501 503 //NETPRINTF(n)("send packet: %d userId = %d\n", offset, peer->second.userId); … … 506 508 * handle downstream network traffic 507 509 */ 508 void NetworkStream::handleDownstream( )510 void NetworkStream::handleDownstream( int tick ) 509 511 { 510 512 int offset = 0; … … 527 529 while ( 0 < (compLength = peer->second.socket->readPacket( compBuf, UDP_PACKET_SIZE )) ) 528 530 { 529 //TODO tell monitor about zipped packet. because dropped packets dont count to bandwidth 531 peer->second.connectionMonitor->processZippedIncomingPacket( tick, compBuf, compLength ); 532 530 533 //PRINTF(0)("GGGGGOOOOOOOOOOTTTTTTTT: %d\n", compLength); 531 534 packetLength = Zip::getInstance()->unZip( compBuf, compLength, buf, UDP_PACKET_SIZE ); … … 547 550 //NETPRINTF(n)("ackedstate: %d\n", ackedState); 548 551 offset = 4*INTSIZE; 552 553 peer->second.connectionMonitor->processUnzippedIncomingPacket( tick, buf, offset, state, ackedState ); 549 554 550 555 //NETPRINTF(n)("got packet: %d, %d\n", length, packetLength); … … 672 677 } 673 678 674 peer->second.connectionMonitor->processZippedIncomingPacket( compBuf, compLength, state, ackedState );675 peer->second.connectionMonitor->processUnzippedIncomingPacket( buf, offset, state, ackedState );676 677 679 assert( peer->second.lastAckedState <= ackedState ); 678 680 peer->second.lastAckedState = ackedState; -
trunk/src/lib/network/network_stream.h
r7954 r8068 79 79 void updateConnectionList(); 80 80 void handleHandshakes(); 81 void handleUpstream( );82 void handleDownstream( );81 void handleUpstream( int tick ); 82 void handleDownstream(int tick ); 83 83 void handleNewClient( int userId ); 84 84 void cleanUpOldSyncList(); -
trunk/src/lib/network/synchronizeable.cc
r7954 r8068 21 21 #include "netdefs.h" 22 22 #include "network_log.h" 23 #include "network_game_manager.h" 23 24 24 25 #include "state.h" … … 36 37 { 37 38 this->setClassID(CL_SYNCHRONIZEABLE, "Synchronizeable"); 38 this->owner = -1;39 this->owner = 0; 39 40 this->hostID = SharedNetworkData::getInstance()->getHostID(); 40 41 this->setIsServer(this->hostID == 0); … … 68 69 if ( this->networkStream ) 69 70 this->networkStream->disconnectSynchronizeable(*this); 71 72 if ( this->isServer() && this->beSynchronized() && this->getUniqueID() > 0 ) 73 NetworkGameManager::getInstance()->removeSynchronizeable( this->getUniqueID() ); 70 74 } 71 75 … … 175 179 this->isServer() && (*it)->checkPermission( PERMISSION_SERVER ) || 176 180 this->owner == this->hostID && (*it)->checkPermission( PERMISSION_OWNER ) || 181 this->isServer() && this->owner != userId && (*it)->checkPermission( PERMISSION_OWNER ) || 177 182 (*it)->checkPermission( PERMISSION_ALL ) 178 183 ); … … 289 294 (*it)->checkPermission( PERMISSION_SERVER ) && networkStream->isUserServer( userId ) || 290 295 (*it)->checkPermission( PERMISSION_OWNER ) && this->owner == userId || 296 networkStream->isUserServer( userId ) && this->owner != getHostID() && (*it)->checkPermission( PERMISSION_OWNER ) || 291 297 (*it)->checkPermission( PERMISSION_ALL ) 292 298 ) … … 331 337 void Synchronizeable::registerVar( SynchronizeableVar * var ) 332 338 { 333 PRINTF(0)("ADDING VAR: %s\n", var->getName().c_str());339 //PRINTF(0)("ADDING VAR: %s\n", var->getName().c_str()); 334 340 syncVarList.push_back( var ); 335 341 } … … 343 349 int Synchronizeable::registerVarId( SynchronizeableVar * var ) 344 350 { 345 PRINTF(0)("ADDING VAR: %s\n", var->getName().c_str());351 //PRINTF(0)("ADDING VAR: %s\n", var->getName().c_str()); 346 352 syncVarList.push_back( var ); 347 353 var->setWatched( true ); -
trunk/src/lib/network/synchronizeable.h
r7954 r8068 61 61 virtual void handleSentState( int userId, int stateId, int fromStateId ); 62 62 virtual void handleRecvState( int userId, int stateId, int fromStateId ); 63 63 64 64 void registerVar( SynchronizeableVar * var ); 65 65 int registerVarId( SynchronizeableVar * var );
Note: See TracChangeset
for help on using the changeset viewer.