Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: code/trunk/src/libraries/network/GamestateClient.cc @ 6021

Last change on this file since 6021 was 5929, checked in by rgrieder, 15 years ago

Merged core5 branch back to the trunk.
Key features include clean level unloading and an extended XML event system.

Two important notes:
Delete your keybindings.ini files! * or you will still get parser errors when loading the key bindings.
Delete build_dir/lib/modules/libgamestates.module! * or orxonox won't start.
Best thing to do is to delete the build folder ;)

  • Property svn:eol-style set to native
File size: 5.2 KB
Line 
1/*
2 *   ORXONOX - the hottest 3D action shooter ever to exist
3 *                    > www.orxonox.net <
4 *
5 *
6 *   License notice:
7 *
8 *   This program is free software; you can redistribute it and/or
9 *   modify it under the terms of the GNU General Public License
10 *   as published by the Free Software Foundation; either version 2
11 *   of the License, or (at your option) any later version.
12 *
13 *   This program is distributed in the hope that it will be useful,
14 *   but WITHOUT ANY WARRANTY; without even the implied warranty of
15 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16 *   GNU General Public License for more details.
17 *
18 *   You should have received a copy of the GNU General Public License
19 *   along with this program; if not, write to the Free Software
20 *   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
21 *
22 *   Author:
23 *      Oliver Scheuss
24 *   Co-authors:
25 *      Dumeni Manatschal
26 *
27 */
28
29#include "GamestateClient.h"
30
31#include "util/Debug.h"
32#include "core/ObjectList.h"
33#include "synchronisable/Synchronisable.h"
34#include "synchronisable/NetworkCallbackManager.h"
35#include "packet/Acknowledgement.h"
36#include "packet/Gamestate.h"
37
38
39namespace orxonox
40{
41  struct _NetworkExport GameStateItem{
42    packet::Gamestate *state;
43    unsigned int id;
44  };
45
46  GamestateClient::GamestateClient() {
47    COUT(5) << "this: " << this << std::endl;
48    last_diff_=0;
49    last_gamestate_=GAMESTATEID_INITIAL-1;
50    tempGamestate_=NULL;
51  }
52
53  GamestateClient::~GamestateClient() {
54      std::map<unsigned int, packet::Gamestate *>::iterator it;
55      for ( it = this->gamestateMap_.begin(); it != this->gamestateMap_.end(); ++it )
56          delete (*it).second;
57      if( this->tempGamestate_ )
58          delete this->tempGamestate_;
59  }
60
61  bool GamestateClient::ack(unsigned int gamestateID, unsigned int clientID){
62    return true;
63  }
64
65  bool GamestateClient::add(packet::Gamestate *gs, unsigned int clientID){
66    if(tempGamestate_!=NULL){
67      //delete the obsolete gamestate
68      if(tempGamestate_->getID()>gs->getID())
69        return false;
70      delete tempGamestate_;
71    }
72    tempGamestate_=gs;
73    return true;
74  }
75
76  bool GamestateClient::processGamestates(){
77    if(tempGamestate_==NULL)
78      return false;
79    bool isDiffed = tempGamestate_->isDiffed();
80    int id = GAMESTATEID_INITIAL;
81    packet::Gamestate *processed = processGamestate(tempGamestate_);
82    assert(processed);
83   
84    //now call the queued callbacks
85    NetworkCallbackManager::callCallbacks();
86   
87    if (!processed){
88      sendAck(0);
89      return false;
90    }
91    //successfully loaded data from gamestate. now save gamestate for diff and delete the old gs
92    tempGamestate_=NULL;
93    gamestateMap_[processed->getID()]=processed;
94    if(isDiffed)
95      last_diff_ = processed->getBaseID();
96    id = processed->getID();
97    sendAck(id);
98    return true;
99  }
100
101
102  /**
103  * This function removes a Synchronisable out of the universe
104  * @param it iterator of the list pointing to the object
105  * @return iterator pointing to the next object in the list
106  */
107  void GamestateClient::removeObject(ObjectList<Synchronisable>::iterator &it) {
108    ObjectList<Synchronisable>::iterator temp=it;
109    ++it;
110    temp->destroy(); // or delete?
111  }
112
113  packet::Gamestate *GamestateClient::getGamestate(){
114    packet::Gamestate *gs = new packet::Gamestate();
115    if(!gs->collectData(0,0x2)){
116      delete gs;
117      return 0;
118    }
119    return gs;
120  }
121
122  void GamestateClient::cleanup(){
123    std::map<unsigned int, packet::Gamestate*>::iterator temp, it = gamestateMap_.begin();
124    while(it!=gamestateMap_.end()){
125      if(it->first>=last_diff_)
126        break;
127      // otherwise delete that stuff
128      delete (*it).second;
129      temp=it++;
130      gamestateMap_.erase(temp);
131    }
132    tempGamestate_=NULL;
133  }
134
135  void GamestateClient::printGamestateMap(){
136    std::map<unsigned int, packet::Gamestate*>::iterator it;
137    COUT(4) << "gamestates: ";
138    for(it=gamestateMap_.begin(); it!=gamestateMap_.end(); it++){
139      COUT(4) << it->first << ":" << it->second << "|";
140    }
141    COUT(4) << std::endl;
142
143  }
144
145  bool GamestateClient::sendAck(unsigned int gamestateID){
146    packet::Acknowledgement *ack = new packet::Acknowledgement(gamestateID, 0);
147    if(!ack->send()){
148      COUT(3) << "could not ack gamestate: " << gamestateID << std::endl;
149      return false;
150    }
151    else{
152      COUT(5) << "acked a gamestate: " << gamestateID << std::endl;
153      return true;
154    }
155  }
156
157  packet::Gamestate *GamestateClient::processGamestate(packet::Gamestate *gs){
158    if(gs->isCompressed())
159    {
160      bool b = gs->decompressData();
161      assert(b);
162    }
163    if(gs->isDiffed()){
164      packet::Gamestate *base = gamestateMap_[gs->getBaseID()];
165      if(!base){
166        COUT(3) << "could not find base gamestate id: " << gs->getBaseID() << endl;
167        delete gs;
168        return 0;
169      }
170//       assert(base); //TODO: fix this
171      packet::Gamestate *undiffed = gs->undiff(base);
172      delete gs;
173      gs=undiffed;
174      COUT(5) << "successfully undiffed gamestate id: " << undiffed->getID() << std::endl;
175    }
176    if(gs->spreadData(0x2))
177      return gs;
178    else
179    {
180      COUT(3) << "could not spread gamestate" << endl;
181      return NULL;
182    }
183  }
184
185}
186
Note: See TracBrowser for help on using the repository browser.