Changeset 1800 for code/branches/network/src/network/GamestateManager.cc
- Timestamp:
- Sep 20, 2008, 12:51:16 AM (16 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
code/branches/network/src/network/GamestateManager.cc
r1769 r1800 61 61 62 62 bool GamestateManager::update(){ 63 cleanup();63 // cleanup(); 64 64 return getSnapshot(); 65 65 } … … 92 92 reference = new packet::Gamestate(); 93 93 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; 97 97 return true; 98 98 } … … 104 104 * 105 105 */ 106 void GamestateManager::cleanup(){106 /* void GamestateManager::cleanup(){ 107 107 std::map<int,int>::iterator it = gamestateUsed.begin(); 108 108 while(it!=gamestateUsed.end()){ … … 124 124 it++; 125 125 } 126 } 126 }*/ 127 127 128 128 packet::Gamestate *GamestateManager::popGameState(int clientID) { … … 131 131 packet::Gamestate *gs; 132 132 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)); 134 137 //chose wheather the next gamestate is the first or not 138 packet::Gamestate *client=NULL; 135 139 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); 147 154 } 148 155 assert(gs->compressData()); … … 153 160 bool GamestateManager::ack(int gamestateID, int clientID) { 154 161 ClientInformation *temp = ClientInformation::findClient(clientID); 155 if(temp==0) 156 return false; 162 assert(temp); 157 163 int curid = temp->getGamestateID(); 158 164 159 165 if(gamestateID == 0){ 160 166 temp->setGamestateID(GAMESTATEID_INITIAL); 161 if(curid!=GAMESTATEID_INITIAL){162 assert(gamestateUsed.find(curid)!=gamestateUsed.end());163 --(gamestateUsed.find(curid)->second);164 }165 167 return true; 166 168 } 167 //if(curid > gamestateID)169 168 170 assert(curid<gamestateID); 169 // the network packets got messed up170 //return true;171 171 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); 185 179 return true; 186 180 } 187 181 188 182 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); 193 191 } 194 192
Note: See TracChangeset
for help on using the changeset viewer.