Changeset 332 for code/branches/merger/src/network/GameStateManager.cc
- Timestamp:
- Nov 28, 2007, 5:20:23 PM (16 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
code/branches/merger/src/network/GameStateManager.cc
r278 r332 22 22 } 23 23 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 */ 29 GameState 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 */ 72 bool 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 25 108 26 109 } 27 110 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){ 117 void removeObject(orxonox::Iterator<Synchronisable> &it){ 118 orxonox::Iterator<Synchronisable> temp=it; 119 ++it; 120 delete *temp; 121 // return it; 30 122 } 31 123 124 32 125 } 126 127
Note: See TracChangeset
for help on using the changeset viewer.