Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: orxonox.OLD/branches/proxy/src/world_entities/spawning_point.cc @ 9368

Last change on this file since 9368 was 9365, checked in by patrick, 18 years ago

ip synchronization now seems to work smoothly on my system here. but not on the laptop

File size: 6.1 KB
Line 
1
2/*
3   orxonox - the future of 3D-vertical-scrollers
4
5   Copyright (C) 2004 orx
6
7   This program is free software; you can redistribute it and/or modify
8   it under the terms of the GNU General Public License as published by
9   the Free Software Foundation; either version 2, or (at your option)
10   any later version.
11
12### File Specific:
13   main-programmer: Patrick Boenzli
14   co-programmer:
15*/
16
17#include "spawning_point.h"
18
19#include "util/loading/load_param.h"
20#include "util/loading/factory.h"
21
22#include "world_entity.h"
23
24#include "class_list.h"
25
26#include "compiler.h"
27
28#include "state.h"
29#include "game_rules.h"
30
31#include "shared_network_data.h"
32
33CREATE_FACTORY( SpawningPoint, CL_SPAWNING_POINT );
34
35/**
36 *  constructor
37 */
38SpawningPoint::SpawningPoint( const TiXmlElement * root )
39{
40  this->setAbsCoor( 0, 0, 0 );
41
42  this->init();
43
44  if (root != NULL)
45    this->loadParams(root);
46}
47
48void SpawningPoint::init()
49{
50  this->setClassID(CL_SPAWNING_POINT, "SpawningPoint");
51  PRINTF(0)("Created SpawningPoint\n");
52
53  this->teamId = -1;
54  this->localTimer = 0.0f;
55
56  this->toList( OM_DEAD_TICK );
57
58  MessageManager::getInstance()->registerMessageHandler( MSGID_RESPAWN, respawnMessageHandler, NULL );
59
60  this->setSynchronized( true );
61}
62
63
64/**
65 *  deconstructor
66 */
67SpawningPoint::~SpawningPoint ()
68{}
69
70
71/**
72 * loads the WorldEntity Specific Parameters.
73 * @param root: the XML-Element to load the Data From
74 */
75void SpawningPoint::loadParams(const TiXmlElement* root)
76{
77  /* let the world entity its stuff first */
78  WorldEntity::loadParams(root);
79
80  /* load teamId */
81  LoadParam(root, "teamId", this, SpawningPoint, setTeamId)
82      .describe("sets teamId");
83}
84
85
86
87/**
88 * pushes a world entity to the spawning queue
89 *  @param entity WorldEntity to be added
90 */
91void SpawningPoint::pushEntity(Playable* entity, float delay)
92{
93  QueueEntry qe;
94  qe.entity = entity;
95  qe.respawnTime = this->localTimer + delay;
96
97  queue.push_back( qe );
98}
99
100
101/**
102 *  spawn the entity
103 */
104void SpawningPoint::spawn(Playable* entity)
105{
106  const std::list<BaseObject*> * list = ClassList::getList( CL_PLAYABLE );
107
108  bool found = false;
109
110  if ( !list )
111    return;
112
113  for ( std::list<BaseObject*>::const_iterator it = list->begin(); it != list->end(); it++ )
114  {
115    if ( *it == entity )
116    {
117      found = true;
118      break;
119    }
120  }
121
122  if ( !found )
123    return;
124
125  PRINTF(0)("Spawningpoint spawns Entity (%s)\n", entity->getClassName());
126
127
128  entity->setAbsCoor( this->getAbsCoor() );
129  entity->setAbsDir( this->getAbsDir() );
130
131  //TODO set camera (not smooth)
132
133  if ( State::getGameRules() )
134  {
135    (State::getGameRules())->registerSpawn( entity );
136  }
137
138  entity->respawn();
139}
140
141
142/**
143 *  this method is called every frame
144 * @param time: the time in seconds that has passed since the last tick
145 *
146 * Handle all stuff that should update with time inside this method (movement, animation, etc.)
147 */
148void SpawningPoint::tick(float dt)
149{
150  this->localTimer += dt;
151  std::list<QueueEntry>::iterator it = this->queue.begin();
152  for( ; it != this->queue.end(); )
153  {
154    //PRINTF(0)("%f <= %f\n", it->respawnTime, this->localTimer);
155    if( it->respawnTime <= this->localTimer)
156    {
157      //spawn the player
158      this->spawn(it->entity);
159
160      const std::list<BaseObject*> * list = ClassList::getList( CL_PLAYABLE );
161
162      bool found = false;
163
164      if ( !list )
165        return;
166
167      for ( std::list<BaseObject*>::const_iterator it2 = list->begin(); it2 != list->end(); it2++ )
168      {
169        if ( *it2 == it->entity )
170        {
171          found = true;
172          break;
173        }
174      }
175
176      if ( found && SharedNetworkData::getInstance()->isMasterServer() )
177        this->sendRespawnMessage( it->entity->getUniqueID() );
178
179      std::list<QueueEntry>::iterator delit = it;
180      it++;
181
182      queue.erase( delit );
183
184      continue;
185    }
186
187    it++;
188  }
189
190}
191
192
193/**
194 *  the entity is drawn onto the screen with this function
195 *
196 * This is a central function of an entity: call it to let the entity painted to the screen.
197 * Just override this function with whatever you want to be drawn.
198 */
199void SpawningPoint::draw()
200{
201}
202
203void SpawningPoint::sendRespawnMessage( int uniqueId )
204{
205#warning this bye array is not been deleted according to valginrd
206  byte * buf = new byte[2*INTSIZE];
207
208  assert( Converter::intToByteArray( this->getUniqueID(), buf, INTSIZE ) == INTSIZE );
209  assert( Converter::intToByteArray( uniqueId, buf + INTSIZE, INTSIZE ) == INTSIZE );
210
211  MessageManager::getInstance()->sendMessage( MSGID_RESPAWN, buf, 2*INTSIZE, RT_ALL_NOT_ME, 0, MP_HIGHBANDWIDTH );
212}
213
214bool SpawningPoint::respawnMessageHandler( MessageId messageId, byte * data, int dataLength, void * someData, int userId )
215{
216  if ( SharedNetworkData::getInstance()->isMasterServer() )
217  {
218    PRINTF(2)("server received spawn message!\n");
219    return true;
220  }
221
222  int spUniqueId;
223  int uniqueId;
224
225  if ( dataLength != 2*INTSIZE )
226  {
227    PRINTF(2)("spawn message has wrong size: %d\n", dataLength );
228    return true;
229  }
230
231  assert( Converter::byteArrayToInt( data, &spUniqueId ) == INTSIZE );
232  assert( Converter::byteArrayToInt( data+INTSIZE, &uniqueId ) == INTSIZE );
233
234  PRINTF(0)("SPAWNMESSAGE %d\n", uniqueId);
235
236  SpawningPoint * sp = NULL;
237  Playable      * playable = NULL;
238
239  const std::list<BaseObject*> * list = ClassList::getList( CL_SPAWNING_POINT );
240
241  if ( list )
242  {
243    for ( std::list<BaseObject*>::const_iterator it = list->begin(); it != list->end(); it++ )
244    {
245      PRINTF(0)("%d:%d\n", dynamic_cast<SpawningPoint*>(*it)->getUniqueID(), spUniqueId);
246      if ( dynamic_cast<SpawningPoint*>(*it)->getUniqueID() == spUniqueId )
247      {
248        sp = dynamic_cast<SpawningPoint*>(*it);
249        break;
250      }
251    }
252  }
253
254  if ( !sp )
255  {
256    PRINTF(0)("could not find spawning point\n");
257    return false;
258  }
259
260  list = ClassList::getList( CL_PLAYABLE );
261
262  if ( list )
263  {
264    for ( std::list<BaseObject*>::const_iterator it = list->begin(); it != list->end(); it++ )
265    {
266      if ( dynamic_cast<Playable*>(*it)->getUniqueID() == uniqueId )
267      {
268        playable = dynamic_cast<Playable*>(*it);
269        break;
270      }
271    }
272  }
273
274  if ( !playable )
275  {
276    PRINTF(0)("could not find playable\n");
277    return false;
278  }
279
280  sp->spawn( playable );
281
282  return true;
283}
284
Note: See TracBrowser for help on using the repository browser.