Changeset 9347 in orxonox.OLD for branches/proxy/src/lib/network/synchronizeable.cc
- Timestamp:
- Jul 20, 2006, 11:43:27 AM (19 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/proxy/src/lib/network/synchronizeable.cc
r9110 r9347 38 38 this->setClassID(CL_SYNCHRONIZEABLE, "Synchronizeable"); 39 39 this->owner = 0; 40 this->setIsServer(SharedNetworkData::getInstance()->getHostID() == 0);40 // this->setIsServer(SharedNetworkData::getInstance()->getHostID() == 0); 41 41 this->uniqueID = NET_UID_UNASSIGNED; 42 42 this->networkStream = NULL; 43 43 this->bSynchronize = false; 44 44 45 45 if( State::isOnline()) 46 46 { … … 54 54 assert( syncVarList.size() == 0 ); 55 55 mLeafClassId = this->registerVarId( new SynchronizeableInt( (int*)&this->getLeafClassID(), (int*)&this->getLeafClassID(), "leafClassId" ) ); 56 56 57 57 this->registerVar( new SynchronizeableInt( &this->owner, &this->owner, "owner" ) ); 58 58 this->registerVar( new SynchronizeableString( &this->objectName, &this->objectName, "objectName" ) ); … … 69 69 { 70 70 this->networkStream->disconnectSynchronizeable(*this); 71 72 if ( this->isServer() && this->beSynchronized() && this->getUniqueID() > 0 && !this->isA( CL_MESSAGE_MANAGER ) )71 72 if ( SharedNetworkData::getInstance()->isMasterServer() && this->beSynchronized() && this->getUniqueID() > 0 && !this->isA( CL_MESSAGE_MANAGER ) ) 73 73 NetworkGameManager::getInstance()->removeSynchronizeable( this->getUniqueID() ); 74 74 } 75 75 76 76 for ( SyncVarList::iterator it = syncVarList.begin(); it != syncVarList.end(); it++ ) 77 77 { … … 79 79 } 80 80 syncVarList.clear(); 81 81 82 82 for ( UserStateHistory::iterator it = recvStates.begin(); it != recvStates.end(); it++ ) 83 83 { … … 93 93 94 94 } 95 95 96 96 for ( UserStateHistory::iterator it = sentStates.begin(); it != sentStates.end(); it++ ) 97 97 { … … 105 105 delete *it2; 106 106 } 107 108 } 109 } 110 111 /** 112 * Sets the server flag to a given value 113 * @param isServer: the boolean value which the server flag is to set to 114 */ 115 void Synchronizeable::setIsServer(bool isServer) 116 { 117 if( isServer ) 118 this->state = this->state | STATE_SERVER; 119 else 120 this->state = this->state & (~STATE_SERVER); 121 } 122 123 124 /** 125 * Determines if the server flag is set 126 * @return true, if the server flag is true, false else 127 */ 128 bool Synchronizeable::isServer() 129 { 130 return (this->state & STATE_SERVER) >0; 107 } 131 108 } 132 109 … … 169 146 (*it2)->data = NULL; 170 147 } 171 148 172 149 delete *it2; 173 150 } … … 181 158 while ( it != sentStates[userId].end() && (*it)->stateId != fromStateId ) 182 159 it++; 183 184 // if ( getLeafClassID() == CL_SPACE_SHIP )185 // {186 // PRINTF(0)("getStateDiff:SpaceShip from: %d stateId: %d\n", (it == sentStates[userId].end())?-1:fromStateId, stateId);187 // }188 160 189 161 if ( it == sentStates[userId].end() ) … … 196 168 197 169 stateFrom = initialEntry; 198 170 199 171 sentStates[userId].push_back( stateFrom ); 200 172 } … … 205 177 206 178 sentStates[userId].push_back( stateTo ); 207 179 208 180 stateTo->stateId = stateId; 209 181 stateTo->dataLength = neededSize; … … 214 186 int i = 0; 215 187 int n; 216 188 217 189 bool hasPermission; 218 190 bool sizeChanged = false; … … 222 194 { 223 195 hasPermission = ( 224 this->isServer() && (*it)->checkPermission( PERMISSION_SERVER ) ||196 SharedNetworkData::getInstance()->isMasterServer() && (*it)->checkPermission( PERMISSION_MASTER_SERVER ) || 225 197 this->owner == SharedNetworkData::getInstance()->getHostID() && (*it)->checkPermission( PERMISSION_OWNER ) || 226 this->isServer() && this->owner != userId && (*it)->checkPermission( PERMISSION_OWNER ) ||227 (*it)->checkPermission( PERMISSION_ALL ) 198 SharedNetworkData::getInstance()->isMasterServer() && this->owner != userId && (*it)->checkPermission( PERMISSION_OWNER ) || 199 (*it)->checkPermission( PERMISSION_ALL ) 228 200 ); 229 230 if ( sizeIter == stateFrom->sizeList.end() || *sizeIter != (*it)->getSize() ) 201 202 if ( sizeIter == stateFrom->sizeList.end() || *sizeIter != (*it)->getSize() ) 231 203 sizeChanged = true; 232 204 233 205 if ( ( hasPermission && (*it)->getPriority() >= priorityTH ) || sizeChanged ) 234 206 { … … 303 275 it++; 304 276 305 277 306 278 // if ( getLeafClassID() == CL_SPACE_SHIP ) 307 279 // { … … 318 290 319 291 stateFrom = initialEntry; 320 292 321 293 recvStates[userId].push_back( stateFrom ); 322 294 } 323 295 else 324 296 stateFrom = (*it); 325 297 326 298 //apply diff 327 299 for ( int i = 0; i<length; i++ ) … … 331 303 else 332 304 stateTo->data[i] = data[i]; 333 334 } 335 305 306 } 307 336 308 //add state to state history 337 309 recvStates[userId].push_back( stateTo ); 338 310 339 311 int i = 0; 340 312 int n = 0; 341 313 std::list<int> changes; 342 314 343 315 for ( SyncVarList::iterator it = syncVarList.begin(); it != syncVarList.end(); it++ ) 344 316 { 345 317 if ( 346 (*it)->checkPermission( PERMISSION_ SERVER ) && networkStream->isUserServer( userId ) ||318 (*it)->checkPermission( PERMISSION_MASTER_SERVER ) && networkStream->isUserMasterServer( userId ) || 347 319 (*it)->checkPermission( PERMISSION_OWNER ) && this->owner == userId || 348 networkStream->isUser Server( userId ) && this->owner != SharedNetworkData::getInstance()->getHostID() && (*it)->checkPermission( PERMISSION_OWNER ) ||349 (*it)->checkPermission( PERMISSION_ALL ) 320 networkStream->isUserMasterServer( userId ) && this->owner != SharedNetworkData::getInstance()->getHostID() && (*it)->checkPermission( PERMISSION_OWNER ) || 321 (*it)->checkPermission( PERMISSION_ALL ) 350 322 ) 351 323 { … … 361 333 else 362 334 { 363 // PRINTF(0)("DONT SET VAR BECAUSE OF PERMISSION: %s %d %d %d %d %d %d\n", (*it)->getName().c_str(), (*it)->checkPermission( PERMISSION_ SERVER ), (*it)->checkPermission( PERMISSION_OWNER ), (*it)->checkPermission( PERMISSION_ALL ), networkStream->isUserServer( userId ), this->owner, userId );335 // PRINTF(0)("DONT SET VAR BECAUSE OF PERMISSION: %s %d %d %d %d %d %d\n", (*it)->getName().c_str(), (*it)->checkPermission( PERMISSION_MASTER_SERVER ), (*it)->checkPermission( PERMISSION_OWNER ), (*it)->checkPermission( PERMISSION_ALL ), networkStream->isUserServer( userId ), this->owner, userId ); 364 336 n = (*it)->getSizeFromBuf( stateTo->data + i, stateTo->dataLength - i ); 365 337 //NETPRINTF(0)("%s::setvar %s %d\n", getClassName(), (*it)->getName().c_str(), n); … … 370 342 371 343 this->varChangeHandler( changes ); 372 344 373 345 return i; 374 346 } … … 423 395 (*it)->data = NULL; 424 396 } 425 397 426 398 delete *it; 427 399 } 428 400 recvStates[userId].clear(); 429 401 } 430 402 431 403 if ( sentStates.size() > userId ) 432 404 { 433 405 434 406 for ( std::list<StateHistoryEntry*>::iterator it = sentStates[userId].begin(); it != sentStates[userId].end(); it++ ) 435 407 { … … 439 411 (*it)->data = NULL; 440 412 } 441 413 442 414 delete *it; 443 415 } … … 448 420 /** 449 421 * this function is called after recieving a state. 450 * @param userId 451 * @param stateId 452 * @param fromStateId 422 * @param userId 423 * @param stateId 424 * @param fromStateId 453 425 */ 454 426 void Synchronizeable::handleRecvState( int userId, int stateId, int fromStateId ) … … 457 429 if ( recvStates.size() <= userId ) 458 430 recvStates.resize( userId+1 ); 459 431 460 432 //remove old states 461 433 StateHistory::iterator it = recvStates[userId].begin(); … … 485 457 StateHistory::iterator delIt = it; 486 458 it ++; 487 459 488 460 if ( (*delIt)->data ) 489 461 { … … 493 465 delete *delIt; 494 466 recvStates[userId].erase( delIt ); 495 467 496 468 continue; 497 469 } 498 470 it++; 499 471 } 500 472 501 473 StateHistory::iterator fromState = recvStates[userId].end(); 502 474 StateHistory::iterator toState = recvStates[userId].end(); 503 475 504 476 for ( it = recvStates[userId].begin(); it != recvStates[userId].end(); it++ ) 505 477 { … … 508 480 if ( (*it)->stateId == fromStateId ) 509 481 fromState = it; 510 482 511 483 if ( fromState != recvStates[userId].end() && toState != recvStates[userId].end() ) 512 484 break; 513 485 } 514 486 515 487 // setStateDiff was not called and i know fromStateId 516 488 if ( fromState != recvStates[userId].end() && toState == recvStates[userId].end() ) 517 489 { 518 490 StateHistoryEntry * entry = new StateHistoryEntry; 519 491 520 492 entry->dataLength = (*fromState)->dataLength; 521 493 if ( entry->dataLength > 0 ) 522 494 { 523 495 entry->data = new byte[entry->dataLength]; 524 496 525 497 assert( (*fromState)->data ); 526 498 memcpy( entry->data, (*fromState)->data, entry->dataLength ); … … 528 500 else 529 501 entry->data = NULL; 530 502 531 503 entry->sizeList = (*fromState)->sizeList; 532 504 entry->stateId = stateId; 533 505 534 506 recvStates[userId].push_back(entry); 535 507 } … … 538 510 /** 539 511 * this function is called after sending a state 540 * @param userId 541 * @param stateId 542 * @param fromStateId 512 * @param userId 513 * @param stateId 514 * @param fromStateId 543 515 */ 544 516 void Synchronizeable::handleSentState( int userId, int stateId, int fromStateId ) … … 557 529 StateHistory::iterator delIt = it; 558 530 it ++; 559 531 560 532 if ( (*delIt)->data ) 561 533 { … … 565 537 delete *delIt; 566 538 sentStates[userId].erase( delIt ); 567 539 568 540 continue; 569 541 } … … 571 543 } 572 544 573 545 574 546 StateHistory::iterator fromState = sentStates[userId].end(); 575 547 StateHistory::iterator toState = sentStates[userId].end(); 576 548 577 549 for ( it = sentStates[userId].begin(); it != sentStates[userId].end(); it++ ) 578 550 { … … 581 553 if ( (*it)->stateId == fromStateId ) 582 554 fromState = it; 583 555 584 556 if ( fromState != sentStates[userId].end() && toState != sentStates[userId].end() ) 585 557 break; 586 558 } 587 559 588 560 589 561 // getStateDiff was not called and i know fromStateId 590 562 if ( fromState != sentStates[userId].end() && toState == sentStates[userId].end() ) 591 563 { 592 564 StateHistoryEntry * entry = new StateHistoryEntry; 593 565 594 566 entry->dataLength = (*fromState)->dataLength; 595 567 if ( entry->dataLength > 0 ) 596 568 { 597 569 entry->data = new byte[entry->dataLength]; 598 570 599 571 assert( (*fromState)->data ); 600 572 memcpy( entry->data, (*fromState)->data, entry->dataLength ); … … 602 574 else 603 575 entry->data = NULL; 604 576 605 577 entry->sizeList = (*fromState)->sizeList; 606 578 entry->stateId = stateId; 607 579 608 580 sentStates[userId].push_back(entry); 609 581 } 610 611 } 612 613 614 582 583 } 584 585 586
Note: See TracChangeset
for help on using the changeset viewer.