Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

Ignore:
Timestamp:
Nov 28, 2007, 5:20:23 PM (16 years ago)
Author:
nicolasc
Message:

merge network

File:
1 edited

Legend:

Unmodified
Added
Removed
  • code/branches/merger/src/network/GameStateManager.cc

    r278 r332  
    2222}
    2323
    24 GameState GameStateManager::getSnapshot(){
     24/**
     25 * This function goes through the whole list of synchronisables and
     26 * saves all the synchronisables to a flat "list".
     27 * @return struct of type gamestate containing the size of the whole gamestate and a pointer linking to the flat list
     28 */
     29GameState GameStateManager::getSnapshot(int id)
     30{
     31  //the size of the gamestate
     32  int totalsize=0;
     33  //the size of one specific synchronisable
     34  int tempsize=0;
     35  // get the start of the Synchronisable list
     36  orxonox::Iterator<Synchronisable> it;
     37  // struct for return value of Synchronisable::getData()
     38  syncData sync;
     39 
     40  GameState retval; //return value
     41  retval.id=id;
     42  // reserve a little memory and increase it later on
     43  retval.data = (unsigned char*)malloc(1);
     44 
     45  // offset of memory functions
     46  int offset=0;
     47  // go through all Synchronisables
     48  for(it = orxonox::ObjectList<Synchronisable>::start(); it != 0; ++it){
     49    //get size of the synchronisable
     50    tempsize=it->getSize();
     51    // add place for data and 3 ints (length,classid,objectid)
     52    totalsize+=tempsize+3*sizeof(int);
     53    // allocate additional space
     54    retval.data = (unsigned char *)realloc((void *)retval.data, totalsize);
     55   
     56    // run Synchronisable::getData with offset and additional place for 3 ints in between (for ids and length)
     57    sync=it->getData(retval.data+offset+3*sizeof(int));
     58    *(retval.data+offset)=sync.length;
     59    *(retval.data+offset+sizeof(int))=sync.objectID;
     60    *(retval.data+offset+2*sizeof(int))=sync.classID;
     61    // increase data pointer
     62    offset+=tempsize+3*sizeof(int);
     63  }
     64  retval.size=totalsize;
     65  return retval;
     66}
     67
     68/**
     69 * This function loads a Snapshort of the gamestate into the universe
     70 * @param state a GameState struct containing the size of the gamestate and a pointer linking to a flat list (returned by getSnapshot)
     71 */
     72bool GameStateManager::loadSnapshot(GameState state)
     73{
     74  unsigned char *data=state.data;
     75  // get the start of the Synchronisable list
     76  orxonox::Iterator<Synchronisable> it=orxonox::ObjectList<Synchronisable>::start();
     77  syncData sync;
     78  // loop as long as we have some data ;)
     79  while(data < state.data+state.size){
     80    // prepare the syncData struct
     81    sync.length = *(int *)data;
     82    data+=sizeof(int);
     83    sync.objectID = *(int *)data;
     84    data+=sizeof(int);
     85    sync.classID = *(int *)data;
     86    data+=sizeof(int);
     87    sync.data = data;
     88    data+=sync.length;
     89   
     90    if(it->objectID!=sync.objectID){
     91      // bad luck ;)
     92      // delete the synchronisable (obviously seems to be deleted on the server)
     93      while(it != 0 && it->objectID!=sync.objectID){
     94        removeObject(it);
     95      }
     96      if(it==0){  // add the new object
     97       
     98      }
     99    } else {
     100      // we have our object
     101      if(! it->updateData(sync))
     102        std::cout << "We couldn't update objectID: " \
     103          << sync.objectID << "; classID: " << sync.classID << std::endl;
     104    }
     105   
     106  }
     107 
    25108 
    26109}
    27110
    28 bool GameStateManager::loadSnapshot(GameState state){
    29  
     111/**
     112 * This function removes a Synchronisable out of the universe
     113 * @param it iterator of the list pointing to the object
     114 * @return iterator pointing to the next object in the list
     115 */
     116// orxonox::Iterator<Synchronisable> removeObject(orxonox::Iterator<Synchronisable> it){
     117void removeObject(orxonox::Iterator<Synchronisable> &it){
     118  orxonox::Iterator<Synchronisable> temp=it;
     119  ++it;
     120  delete  *temp;
     121//   return it;
    30122}
    31123
     124
    32125}
     126
     127
Note: See TracChangeset for help on using the changeset viewer.