Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: orxonox.OLD/branches/network/src/story_entities/multi_player_world_data.cc @ 7569

Last change on this file since 7569 was 7569, checked in by rennerc, 18 years ago

fixed bug

File size: 8.4 KB
Line 
1/*
2   orxonox - the future of 3D-vertical-scrollers
3
4   Copyright (C) 2004 orx
5
6   This program is free software; you can redistribute it and/or modify
7   it under the terms of the GNU General Public License as published by
8   the Free Software Foundation; either version 2, or (at your option)
9   any later version.
10
11### File Specific:
12   main-programmer: Patrick Boenzli
13*/
14
15#define DEBUG_SPECIAL_MODULE DEBUG_MODULE_WORLD
16
17
18#include "multi_player_world_data.h"
19
20#include "util/loading/resource_manager.h"
21#include "state.h"
22#include "class_list.h"
23#include "substring.h"
24
25#include "util/loading/game_loader.h"
26#include "cd_engine.h"
27
28#include "p_node.h"
29#include "world_entity.h"
30#include "player.h"
31#include "camera.h"
32#include "environment.h"
33#include "terrain.h"
34#include "test_entity.h"
35#include "terrain.h"
36#include "md2Model.h"
37#include "world_entities/projectiles/projectile.h"
38#include "npcs/npc_test1.h"
39#include "playable.h"
40
41#include "util/loading/factory.h"
42#include "fast_factory.h"
43#include "util/loading/load_param.h"
44
45#include "network_manager.h"
46#include "network_game_manager.h"
47
48
49#include "glmenu_imagescreen.h"
50
51
52
53using namespace std;
54
55
56/**
57 * constructor of the GameWorldDataData
58 */
59MultiPlayerWorldData::MultiPlayerWorldData()
60    : GameWorldData()
61{
62  this->toggle = false;
63}
64
65
66/**
67 * destructor for the GameWorldDataData
68 */
69MultiPlayerWorldData::~MultiPlayerWorldData()
70{}
71
72
73/**
74 *  initialize the GameWorldDataData
75 */
76ErrorMessage MultiPlayerWorldData::init()
77{
78  /* call underlying function */
79  GameWorldData::init();
80}
81
82
83/**
84 *  loads the GUI data
85 * @param root reference to the xml root element
86 */
87ErrorMessage MultiPlayerWorldData::loadGUI(const TiXmlElement* root)
88{
89  /* call underlying function */
90  GameWorldData::loadGUI(root);
91}
92
93
94/**
95 *  unloads the GUI data
96 */
97ErrorMessage MultiPlayerWorldData::unloadGUI()
98{
99  /* call underlying function */
100  GameWorldData::unloadGUI();
101}
102
103
104/**
105 *  overloads the GameWorld::loadWorldEntities(...) class since the network WorldEntity loading is different
106 * @param root reference to the xml root parameter
107 */
108ErrorMessage MultiPlayerWorldData::loadWorldEntities(const TiXmlElement* root)
109{
110  /* load the spawning points */
111  const TiXmlElement* element = root->FirstChildElement("SpawningPoints");
112  if( element == NULL)
113  {
114    PRINTF(1)("NetworkWorld is missing 'SpawningPoints'\n");
115  }
116  else
117  {
118    element = element->FirstChildElement();
119    // load Players/Objects/Whatever
120    PRINTF(4)("Loading Spawning Points\n");
121    while( element != NULL)
122    {
123      BaseObject* created = Factory::fabricate(element);
124      if( created != NULL )
125        printf("Created a Spawning Point %s: %s\n", created->getClassName(), created->getName());
126
127      element = element->NextSiblingElement();
128      glmis->step();
129    }
130    PRINTF(4)("Done loading Spawning Points\n");
131  }
132
133  /* load the WorldEntities */
134  element = root->FirstChildElement("WorldEntities");
135  if( element == NULL)
136  {
137    PRINTF(1)("NetworkWorld is missing 'WorldEntities'\n");
138  }
139  else
140  {
141    element = element->FirstChildElement();
142
143    if( NetworkManager::getInstance()->isGameServer() )
144    {
145      while( element != NULL)
146      {
147        /* pass the entity to the NetworkGameManager to be created */
148        BaseObject* created = NetworkGameManager::getInstance()->createEntity(element);
149        if( created != NULL )
150          PRINTF(1)("Created a %s: %s (0x%8x) from %s\n", created->getClassName(), created->getName(), created->getLeafClassID(), element->Value());
151        else
152          PRINTF(1)("NetworkWorld: could not create this entity\n");
153
154        if( element->Value() != NULL && !strcmp( element->Value(), "SkyBox"))
155          this->sky = dynamic_cast<WorldEntity*>(created);
156        if( element->Value() != NULL && !strcmp( element->Value(), "Terrain"))
157        {
158          this->terrain = dynamic_cast<Terrain*>(created);
159          CDEngine::getInstance()->setTerrain(terrain);
160        }
161
162        element = element->NextSiblingElement();
163
164
165        glmis->step();
166        PRINTF(4)("Done loading NetworkWorldEntities\n");
167      }
168    }
169    else
170    {
171      while( element != NULL)
172      {
173        PRINTF(0)("load: %s\n", element->Value());
174        if( !strcmp(element->Value(), "Terrain") || !strcmp(element->Value(), "Building")  )
175        {
176
177          /* pass the entity to the NetworkGameManager to be created */
178          BaseObject* created = Factory::fabricate(element);
179
180          if( created != NULL )
181            PRINTF(1)("Created a %s: %s (0x%8x) from %s\n", created->getClassName(), created->getName(), created->getLeafClassID(), element->Value());
182          else
183            PRINTF(1)("NetworkWorld: could not create this entity\n");
184
185          if( element->Value() != NULL && !strcmp( element->Value(), "SkyBox"))
186            this->sky = dynamic_cast<WorldEntity*>(created);
187          if( element->Value() != NULL && !strcmp( element->Value(), "Terrain"))
188          {
189            this->terrain = dynamic_cast<Terrain*>(created);
190            CDEngine::getInstance()->setTerrain(terrain);
191          }
192
193          glmis->step();
194          PRINTF(4)("Done loading NetworkWorldEntities\n");
195        }
196        element = element->NextSiblingElement();
197      }
198    }
199
200
201    if( NetworkManager::getInstance()->isGameServer())
202    {
203      this->localPlayer = new Player();
204
205      Playable* playable;
206      const std::list<BaseObject*>* playableList = ClassList::getList(CL_PLAYABLE);
207      assert( playableList != NULL);
208
209      if (playableList != NULL)
210      {
211        playable = dynamic_cast<Playable*>(playableList->front());
212        this->localPlayer->setPlayable(playable);
213        playable->toList(OM_GROUP_00);
214        playable->setAbsCoor(213.37, 57.71, -47.98);
215        playable->setPlayDirection(Quaternion(M_PI, Vector(0.0, 1.0, 0.0)));
216      }
217    }
218    else
219    {
220      /* create a Player */
221      this->localPlayer = new Player();
222    }
223
224
225    /* init the pnode tree */
226    PNode::getNullParent()->init();
227  }
228    // Fill the EntityLists. Tick then Draw:
229  this->tickLists.push_back(OM_DEAD_TICK);
230  this->tickLists.push_back(OM_ENVIRON);
231  this->tickLists.push_back(OM_COMMON);
232  this->tickLists.push_back(OM_GROUP_00);
233  this->tickLists.push_back(OM_GROUP_00_PROJ);
234  this->tickLists.push_back(OM_GROUP_01);
235  this->tickLists.push_back(OM_GROUP_01_PROJ);
236
237  this->drawLists.push_back(OM_ENVIRON_NOTICK);
238  this->drawLists.push_back(OM_ENVIRON);
239  this->drawLists.push_back(OM_COMMON);
240  this->drawLists.push_back(OM_GROUP_00);
241  this->drawLists.push_back(OM_GROUP_00_PROJ);
242  this->drawLists.push_back(OM_GROUP_01);
243  this->drawLists.push_back(OM_GROUP_01_PROJ);
244 
245  State::setPlayer(this->localPlayer);
246}
247
248
249/**
250 *  unloads the world entities from the xml file
251 */
252ErrorMessage MultiPlayerWorldData::unloadWorldEntities()
253{
254  /* call underlying function */
255  GameWorldData::unloadWorldEntities();
256}
257
258
259/**
260 *  loads the scene data
261 * @param root reference to the xml root element
262 */
263ErrorMessage MultiPlayerWorldData::loadScene(const TiXmlElement* root)
264{
265  /* call underlying function */
266  GameWorldData::loadScene(root);
267}
268
269
270/**
271 *  unloads the scene data
272 */
273ErrorMessage MultiPlayerWorldData::unloadScene()
274{
275  /* call underlying function */
276  GameWorldData::unloadScene();
277}
278
279
280/**
281 * some debug output
282 */
283void MultiPlayerWorldData::debug()
284{
285  PRINT(0)("==================================================\n");
286  Playable* playable;
287  const std::list<BaseObject*>* playableList = ClassList::getList(CL_PLAYABLE);
288  assert(playableList != NULL);
289  std::list<BaseObject*>::const_iterator entity;
290
291
292
293  for (entity = playableList->begin(); entity != playableList->end(); entity++)
294  {
295    Playable* p = dynamic_cast<Playable*>(*entity);
296    PRINTF(0)("Got a playable, class: %s, name: %s, uid: %i\n", (*entity)->getClassName(), (*entity)->getName(), p->getUniqueID());
297  }
298
299
300  if( this->toggle)
301  {
302    playable = dynamic_cast<Playable*>(playableList->front());
303    this->localPlayer->setPlayable(playable);
304    this->toggle = !this->toggle;
305  }
306  else
307  {
308    playable = dynamic_cast<Playable*>(playableList->back());
309    this->localPlayer->setPlayable(playable);
310    this->toggle = !this->toggle;
311  }
312
313
314  Playable* pl = this->localPlayer->getPlayable();
315  PRINTF(0)("The current regisered playable is hid: %i\n", pl->getUniqueID());
316
317
318  PNode* cam = State::getCameraTargetNode();
319  PRINT(0)("Camera has target - class: %s, name: %s, uid: %i\n", cam->getClassName(), cam->getName(), cam->getUniqueID());
320
321  PRINT(0)("==================================================\n");
322
323}
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
Note: See TracBrowser for help on using the repository browser.