Changeset 1502 for code/trunk/src/network/GameStateManager.cc
- Timestamp:
- Jun 1, 2008, 3:54:20 PM (17 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
code/trunk/src/network/GameStateManager.cc
r1360 r1502 68 68 printGameStates(); 69 69 return; 70 } 71 72 void GameStateManager::addGameState(GameStateCompressed *gs, int clientID){ 73 if(!gs) 74 return; 75 std::map<int, GameStateCompressed*>::iterator it = gameStateQueue.find(clientID); 76 if(it!=gameStateQueue.end()){ 77 // delete obsolete gamestate 78 delete[] it->second->data; 79 delete it->second; 80 } 81 gameStateQueue[clientID] = gs; 82 return; 83 } 84 85 void GameStateManager::processGameStates(){ 86 std::map<int, GameStateCompressed*>::iterator it; 87 // now push only the most recent gamestates we received (ignore obsolete ones) 88 for(it = gameStateQueue.begin(); it!=gameStateQueue.end(); it++){ 89 pushGameState(it->second, it->first); 90 } 91 // now clear the queue 92 gameStateQueue.clear(); 70 93 } 71 94 … … 117 140 client = it->second; 118 141 GameState *server = reference; 119 COUT( 3) << "client: " << client << " server: " << server << " gamestatemap: " << &gameStateMap<< std::endl;142 COUT(4) << "client: " << client << " server: " << server << " gamestatemap: " << &gameStateMap << " size: " << server->size << std::endl; 120 143 if(client) 121 144 return encode(client, server); … … 170 193 } 171 194 //retval->data = (unsigned char*)malloc(size); 195 if(size==0) 196 return NULL; 172 197 retval->data = new unsigned char[size]; 173 198 if(!retval->data){ … … 237 262 data+=sizeof(int); 238 263 sync.classID = *(int*)data; 264 if(sync.classID == 0) // TODO: remove this 265 COUT(3) << "received a classid 0" << std::endl; 239 266 data+=sizeof(int); 240 267 sync.data = data; … … 246 273 247 274 if(!it){ 248 // the object does not exist yet275 // the objectaber ich glaub die does not exist yet 249 276 COUT(4) << "loadsnapshot: creating new object " << std::endl; 250 277 //COUT(4) << "loadSnapshot:\tclassid: " << sync.classID << ", name: " << ID((unsigned int) sync.classID)->getName() << std::endl; … … 314 341 } 315 342 316 GameState *GameStateManager::diff(GameState *a , GameState *b) {317 unsigned char *ap = a ->data, *bp = b->data;343 GameState *GameStateManager::diff(GameState *alt, GameState *neu) { 344 unsigned char *ap = alt->data, *bp = neu->data; 318 345 int of=0; // pointers offset 319 346 int dest_length=0; 320 if(a->size>=b->size) 321 dest_length=a->size; 322 else 323 dest_length=b->size; 347 /*if(alt->size>neu->size) 348 dest_length=alt->size; 349 else*/ 350 dest_length=neu->size; 351 if(dest_length==0) 352 return NULL; 324 353 //unsigned char *dp = (unsigned char *)malloc(dest_length*sizeof(unsigned char)); 325 354 unsigned char *dp = new unsigned char[dest_length*sizeof(unsigned char)]; 326 while(of<a ->size && of<b->size){355 while(of<alt->size && of<neu->size){ 327 356 *(dp+of)=*(ap+of)^*(bp+of); // do the xor 328 357 ++of; 329 358 } 330 if(a ->size!=b->size){ // do we have to fill up ?359 if(alt->size!=neu->size){ // do we have to fill up ? 331 360 unsigned char n=0; 332 if(a ->size<b->size){361 if(alt->size<neu->size){ 333 362 while(of<dest_length){ 334 363 *(dp+of)=n^*(bp+of); 335 364 of++; 336 365 } 337 } else{366 } /*else{ 338 367 while(of<dest_length){ 339 368 *(dp+of)=*(ap+of)^n; 340 369 of++; 341 370 } 342 } 371 }*/ 343 372 } 344 373 345 374 GameState *r = new GameState; 346 r->id = b->id;375 r->id = neu->id; 347 376 r->size = dest_length; 348 377 r->diffed = true; 349 r->base_id = a ->id;378 r->base_id = alt->id; 350 379 r->data = dp; 351 380 r->complete = true; … … 362 391 //COUT(4) << "size: " << size << ", buffer: " << buffer << std::endl; 363 392 //unsigned char* dest = (unsigned char*)malloc( buffer ); 393 if(buffer==0) 394 return NULL; 364 395 unsigned char *dest = new unsigned char[buffer]; 365 396 //COUT(4) << "dest: " << dest << std::endl; … … 404 435 bufsize = normsize; 405 436 // unsigned char* dest = (unsigned char*)malloc( bufsize ); 437 if(bufsize==0) 438 return NULL; 406 439 unsigned char *dest = new unsigned char[bufsize]; 407 440 int retval; … … 436 469 return; 437 470 int curid = temp->getGamestateID(); 471 472 if(gamestateID == GAMESTATEID_INITIAL){ 473 temp->setGameStateID(GAMESTATEID_INITIAL); 474 if(curid!=GAMESTATEID_INITIAL) 475 --(gameStateUsed.find(curid)->second); 476 return; 477 } 438 478 if(curid > gamestateID) 439 479 // the network packets got messed up … … 446 486 --(gameStateUsed.find(curid)->second); 447 487 ++(gameStateUsed.find(gamestateID)->second); 448 temp->setGame stateID(gamestateID);488 temp->setGameStateID(gamestateID); 449 489 /* 450 490 GameState *old = clientGameState[clientID];
Note: See TracChangeset
for help on using the changeset viewer.