Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: orxonox.OLD/branches/presentation/src/world_entities/spawning_point.cc @ 9172

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

sync spawningpoint

File size: 5.4 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  PRINTF(0)("Spawningpoint spawns Entity (%s)\n", entity->getClassName());
107
108
109  entity->setAbsCoor( this->getAbsCoor() );
110  entity->setAbsDir( this->getAbsDir() );
111 
112  //TODO set camera (not smooth)
113 
114  if ( State::getGameRules() )
115  {
116    (State::getGameRules())->registerSpawn( entity );
117  }
118 
119  entity->respawn();
120}
121
122
123/**
124 *  this method is called every frame
125 * @param time: the time in seconds that has passed since the last tick
126 *
127 * Handle all stuff that should update with time inside this method (movement, animation, etc.)
128 */
129void SpawningPoint::tick(float dt)
130{
131  this->localTimer += dt;
132  std::list<QueueEntry>::iterator it = this->queue.begin();
133  for( ; it != this->queue.end(); )
134  {
135    //PRINTF(0)("%f <= %f\n", it->respawnTime, this->localTimer);
136    if( it->respawnTime <= this->localTimer)
137    {
138      //spawn the player
139      this->spawn(it->entity);
140     
141      if ( SharedNetworkData::getInstance()->isGameServer() )
142        this->sendRespawnMessage( it->entity->getUniqueID() );
143
144      std::list<QueueEntry>::iterator delit = it;
145      it++;
146     
147      queue.erase( delit );
148     
149      continue;
150    }
151   
152    it++;
153  }
154
155}
156
157
158/**
159 *  the entity is drawn onto the screen with this function
160 *
161 * This is a central function of an entity: call it to let the entity painted to the screen.
162 * Just override this function with whatever you want to be drawn.
163 */
164void SpawningPoint::draw()
165{
166}
167
168void SpawningPoint::sendRespawnMessage( int uniqueId )
169{
170  byte * buf = new byte[2*INTSIZE];
171 
172  assert( Converter::intToByteArray( this->getUniqueID(), buf, INTSIZE ) == INTSIZE );
173  assert( Converter::intToByteArray( uniqueId, buf + INTSIZE, INTSIZE ) == INTSIZE );
174 
175  MessageManager::getInstance()->sendMessage( MSGID_RESPAWN, buf, 2*INTSIZE, RT_ALL_NOT_ME, 0, MP_HIGHBANDWIDTH );
176}
177
178bool SpawningPoint::respawnMessageHandler( MessageId messageId, byte * data, int dataLength, void * someData, int userId )
179{
180  if ( SharedNetworkData::getInstance()->isGameServer() )
181  {
182    PRINTF(2)("server received spawn message!\n");
183    return true;
184  }
185   
186  int spUniqueId;
187  int uniqueId;
188 
189  if ( dataLength != 2*INTSIZE )
190  {
191    PRINTF(2)("spawn message has wrong size: %d\n", dataLength );
192    return true;
193  }
194 
195  assert( Converter::byteArrayToInt( data, &spUniqueId ) == INTSIZE );
196  assert( Converter::byteArrayToInt( data+INTSIZE, &uniqueId ) == INTSIZE );
197 
198  PRINTF(0)("SPAWNMESSAGE %d\n", uniqueId);
199 
200  SpawningPoint * sp = NULL;
201  Playable      * playable = NULL;
202 
203  const std::list<BaseObject*> * list = ClassList::getList( CL_SPAWNING_POINT );
204 
205  if ( list )
206  {
207    for ( std::list<BaseObject*>::const_iterator it = list->begin(); it != list->end(); it++ )
208    {
209      PRINTF(0)("%d:%d\n", dynamic_cast<SpawningPoint*>(*it)->getUniqueID(), spUniqueId);
210      if ( dynamic_cast<SpawningPoint*>(*it)->getUniqueID() == spUniqueId )
211      {
212        sp = dynamic_cast<SpawningPoint*>(*it);
213        break;
214      }
215    }
216  }
217 
218  if ( !sp )
219  {
220    PRINTF(0)("could not find spawning point\n");
221    return false;
222  }
223 
224  list = ClassList::getList( CL_PLAYABLE );
225 
226  if ( list )
227  {
228    for ( std::list<BaseObject*>::const_iterator it = list->begin(); it != list->end(); it++ )
229    {
230      if ( dynamic_cast<Playable*>(*it)->getUniqueID() == uniqueId )
231      {
232        playable = dynamic_cast<Playable*>(*it);
233        break;
234      }
235    }
236  }
237 
238  if ( !playable )
239  {
240    PRINTF(0)("could not find playable\n");
241    return false;
242  }
243 
244  sp->spawn( playable );
245 
246  return true;
247}
248
Note: See TracBrowser for help on using the repository browser.