Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

Ignore:
Timestamp:
Sep 20, 2008, 12:51:16 AM (16 years ago)
Author:
scheusso
Message:

client-based object selection (in gamestate transmission) should now work

File:
1 edited

Legend:

Unmodified
Added
Removed
  • code/branches/network/src/network/GamestateManager.cc

    r1769 r1800  
    6161
    6262  bool GamestateManager::update(){
    63     cleanup();
     63//     cleanup();
    6464    return getSnapshot();
    6565  }
     
    9292    reference = new packet::Gamestate();
    9393    reference->collectData(++id_);
    94     COUT(4) << "inserting gamestate: " << reference << std::endl;
    95     gamestateMap.insert(std::pair<int, packet::Gamestate*>(id_, reference));
    96     gamestateUsed[id_]=0;
     94    //COUT(4) << "inserting gamestate: " << reference << std::endl;
     95    //gamestateMap_.insert(std::pair<int, packet::Gamestate*>(id_, reference));
     96//     gamestateUsed[id_]=0;
    9797    return true;
    9898  }
     
    104104   *
    105105   */
    106   void GamestateManager::cleanup(){
     106/*  void GamestateManager::cleanup(){
    107107    std::map<int,int>::iterator it = gamestateUsed.begin();
    108108    while(it!=gamestateUsed.end()){
     
    124124      it++;
    125125    }
    126   }
     126  }*/
    127127
    128128  packet::Gamestate *GamestateManager::popGameState(int clientID) {
     
    131131    packet::Gamestate *gs;
    132132    int gID = ClientInformation::findClient(clientID)->getGamestateID();
    133     //COUT(4) << "G.St.Man: popgamestate: sending gstate_id: " << id_ << " diffed from: " << gID << std::endl;
     133    gs = reference->doSelection(clientID);
     134//     gs = new packet::Gamestate(*reference);
     135    // save the (undiffed) gamestate in the clients gamestate map
     136    gamestateMap_[clientID].insert(std::pair<int, packet::Gamestate*>(gs->getID(), gs));
    134137    //chose wheather the next gamestate is the first or not
     138    packet::Gamestate *client=NULL;
    135139    if(gID != GAMESTATEID_INITIAL){
    136       packet::Gamestate *client=NULL;
    137       std::map<int, packet::Gamestate*>::iterator it = gamestateMap.find(gID);
    138       if(it!=gamestateMap.end())
    139         client = it->second;
    140       if(client)
    141         gs = reference->diff(client);
    142       else
    143         gs = new packet::Gamestate(*reference);
    144     } else {
    145       COUT(4) << "we got a GAMESTATEID_INITIAL for clientID: " << clientID << std::endl;
    146       gs = new packet::Gamestate(*reference);
     140      std::map<unsigned int, std::map<int, packet::Gamestate*> >::iterator clientMap = gamestateMap_.find(clientID);
     141      if(clientMap!=gamestateMap_.end()){
     142        std::map<int, packet::Gamestate*>::iterator it = clientMap->second.find(gID);
     143        if(it!=clientMap->second.end())
     144          client = it->second;
     145      }
     146    }
     147    if(client){
     148//       COUT(3) << "diffing" << std::endl;
     149      gs = gs->diff(client);
     150    }
     151    else{
     152//       COUT(3) << "not diffing" << std::endl;
     153      gs = new packet::Gamestate(*gs);
    147154    }
    148155    assert(gs->compressData());
     
    153160  bool GamestateManager::ack(int gamestateID, int clientID) {
    154161    ClientInformation *temp = ClientInformation::findClient(clientID);
    155     if(temp==0)
    156       return false;
     162    assert(temp);
    157163    int curid = temp->getGamestateID();
    158164   
    159165    if(gamestateID == 0){
    160166      temp->setGamestateID(GAMESTATEID_INITIAL);
    161       if(curid!=GAMESTATEID_INITIAL){
    162         assert(gamestateUsed.find(curid)!=gamestateUsed.end());
    163         --(gamestateUsed.find(curid)->second);
    164       }
    165167      return true;
    166168    }
    167     //if(curid > gamestateID)
     169   
    168170    assert(curid<gamestateID);
    169       // the network packets got messed up
    170       //return true;
    171171    COUT(4) << "acking gamestate " << gamestateID << " for clientid: " << clientID << " curid: " << curid << std::endl;
    172     // decrease usage of gamestate and save it
    173 //     deleteUnusedGameState(curid);
    174     //increase gamestateused
    175     std::map<int, int>::iterator it = gamestateUsed.find(curid);
    176     if(curid!=GAMESTATEID_INITIAL){
    177       if(it!=gamestateUsed.end())
    178         --(it->second);
    179     }
    180     it = gamestateUsed.find(gamestateID);
    181     if(it!=gamestateUsed.end()){
    182       ++(it->second);
    183       temp->setGamestateID(gamestateID);
    184     }
     172    std::map<int, packet::Gamestate*>::iterator it, tempit;
     173    for(it = gamestateMap_[clientID].begin(); it!=gamestateMap_[clientID].end() && it->first<gamestateID; it++){
     174      delete it->second;
     175      tempit=it++;
     176      gamestateMap_[clientID].erase(tempit);
     177    }
     178    temp->setGamestateID(gamestateID);
    185179    return true;
    186180  }
    187181
    188182  void GamestateManager::removeClient(ClientInformation* client){
    189     if(!client)
    190       return;
    191     if(client->getGamestateID()>=0)
    192       gamestateUsed[client->getGamestateID()]--;
     183    assert(client);
     184    std::map<unsigned int, std::map<int, packet::Gamestate*> >::iterator clientMap = gamestateMap_.find(client->getID());
     185    // first delete all remained gamestates
     186    std::map<int, packet::Gamestate*>::iterator it;
     187    for(it=clientMap->second.begin(); it!=clientMap->second.end(); it++)
     188      delete it->second;
     189    // now delete the clients gamestatemap
     190    gamestateMap_.erase(clientMap);
    193191  }
    194192 
Note: See TracChangeset for help on using the changeset viewer.