Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

Changeset 8147 in orxonox.OLD


Ignore:
Timestamp:
Jun 5, 2006, 12:09:15 PM (18 years ago)
Author:
bensch
Message:

orxonox/trunk: merged the network branche back here
merged with command:
svn merge -r8070:HEAD https://svn.orxonox.net/orxonox/branches/network .
no conflicts

Location:
trunk
Files:
17 edited

Legend:

Unmodified
Added
Removed
  • trunk/configure.ac

    r8145 r8147  
    5757#----------------#
    5858DATA_DIR=$datadir
    59 echo \$\{prefix\}
    6059if test $DATA_DIR = \$\{prefix\}/share ; then
    6160        echo "not given"
     
    109108fi
    110109
    111 if test $DEBUD_LEVEL > 3 ; then
    112   CPPFLAGS="${CPPFLAGS} -g"
     110if test ${DEBUG_LEVEL} -gt 3 ; then
     111  CPPFLAGS="${CPPFLAGS} -g -Wall"
    113112fi
    114113AC_DEFINE_UNQUOTED(DEBUG_LEVEL, ${DEBUG_LEVEL}, [in which debug mode we are])
     
    293292echo "mingw-WINDOWS detected"
    294293
    295 CPPFLAGS="-I/usr/include -I/mingw/include $CPPFLAGS"
     294CPPFLAGS="-I/usr/include -I/mingw/include ${CPPFLAGS}"
    296295
    297296    mingw="yes"
     
    424423  SDL_VERSION=`sdl-config --version`
    425424  echo $SDL_VERSION
    426    CPPFLAGS="$CPPFLAGS `sdl-config --cflags`"
     425   CPPFLAGS="${CPPFLAGS} `sdl-config --cflags`"
    427426
    428427  AX_CHECK_REQUIRED_HEADER_LIB([SDL.h SDL/SDL.h], [SDL], [main],,, [http://www.libsdl.org])
     
    440439 osX="yes"
    441440
    442  CPPFLAGS="-I/sw/include -I/sw/include $CPPFLAGS"
     441 CPPFLAGS="-I/sw/include -I/sw/include ${CPPFLAGS}"
    443442 LDFLAGS="$LDFLAGS -L/sw/lib"
    444443# checking gl header
  • trunk/src/lib/network/message_manager.h

    r8068 r8147  
    2929{
    3030  TESTMESSAGEID = 1,
    31   MSGID_DELETESYNCHRONIZEABLE
     31  MSGID_DELETESYNCHRONIZEABLE,
     32  MSGID_PREFEREDTEAM
    3233};
    3334
  • trunk/src/lib/network/network_game_manager.cc

    r8068 r8147  
    5959 
    6060  MessageManager::getInstance()->registerMessageHandler( MSGID_DELETESYNCHRONIZEABLE, delSynchronizeableHandler, NULL );
     61  MessageManager::getInstance()->registerMessageHandler( MSGID_PREFEREDTEAM, preferedTeamHandler, NULL );
    6162 
    6263  this->gameState = 0;
     
    8687 
    8788  int team = rules.getTeamForNewUser();
    88   ClassID playableClassId = rules.getPlayableClassId( team );
    89   std::string playableModel = rules.getPlayableModelFileName( team, playableClassId );
     89  ClassID playableClassId = rules.getPlayableClassId( userId, team );
     90  std::string playableModel = rules.getPlayableModelFileName( userId, team, playableClassId );
    9091 
    9192  BaseObject * bo = Factory::fabricate( playableClassId );
     
    159160    if ( dynamic_cast<Synchronizeable*>(*it)->getUniqueID() == uniqueId )
    160161    {
     162      if ( (*it)->isA(CL_PLAYABLE) )
     163      {
     164        getInstance()->playablesToDelete.push_back( dynamic_cast<Playable*>(*it) );
     165        return true;
     166      }
     167       
    161168      delete dynamic_cast<Synchronizeable*>(*it);
    162169      return true;
     
    180187
    181188
    182 
    183 
    184 
     189/**
     190 * handler for MSGID_PREFEREDTEAM message
     191 * @param messageId
     192 * @param data
     193 * @param dataLength
     194 * @param someData
     195 * @param userId
     196 * @return
     197 */
     198bool NetworkGameManager::preferedTeamHandler( MessageId messageId, byte * data, int dataLength, void * someData, int userId )
     199{
     200  assert( NetworkGameManager::getInstance()->isServer() );
     201 
     202  int teamId = 0;
     203  int len = Converter::byteArrayToInt( data, &teamId );
     204 
     205  if ( len != dataLength )
     206  {
     207    PRINTF(2)("Recieved DeleteSynchronizeable message with incorrect size (%d) from client %d!\n", dataLength, userId);
     208    return true;
     209  }
     210 
     211  NetworkGameManager::getInstance()->setPreferedTeam( userId, teamId );
     212}
     213
     214void NetworkGameManager::setPreferedTeam( int userId, int teamId )
     215{
     216  if ( !PlayerStats::getStats( userId ) )
     217    return;
     218 
     219  PlayerStats & stats = *(PlayerStats::getStats( userId ));
     220 
     221  stats.setPreferedTeamId( teamId );
     222 
     223}
     224
     225/**
     226 * set prefered team for this host
     227 * @param teamId
     228 */
     229void NetworkGameManager::prefereTeam( int teamId )
     230{
     231  if ( isServer() )
     232    setPreferedTeam( getHostID(), teamId );
     233  else
     234  {
     235    byte buf[INTSIZE];
     236   
     237    assert( Converter::intToByteArray( teamId, buf, INTSIZE) == INTSIZE );
     238   
     239    MessageManager::getInstance()->sendMessage( MSGID_PREFEREDTEAM, buf, INTSIZE, RT_USER, 0, MP_HIGHBANDWIDTH );
     240  }
     241}
     242
     243/**
     244 * this function will be called periodically by networkManager
     245 * @param ds time elapsed since last call of tick
     246 */
     247void NetworkGameManager::tick( float ds )
     248{
     249  //delete playables if they are not assigned to local player anymore
     250  for ( std::list<Playable*>::iterator it = playablesToDelete.begin(); it != playablesToDelete.end();  )
     251  {
     252    if ( State::getPlayer()->getPlayable() != *it )
     253    {
     254      PRINTF(0)("Delete unused playable: %s owner: %d\n", (*it)->getClassName(), (*it)->getOwner() );
     255      std::list<Playable*>::iterator delit = it;
     256      it++;
     257      delete *delit;
     258      playablesToDelete.erase( delit );
     259      continue;
     260    }
     261    it++;
     262  }
     263}
     264
     265
     266
     267
  • trunk/src/lib/network/network_game_manager.h

    r8068 r8147  
    1212/* include base_object.h since all classes are derived from this one */
    1313#include "synchronizeable.h"
     14#include "playable.h"
    1415#include "message_manager.h"
    1516
     
    5657   
    5758    void removeSynchronizeable( int uniqueId );
     59   
     60    void prefereTeam( int teamId );
    5861
    5962    inline void setGameState( int gameState ){ this->gameState = gameState; }
    6063    inline int getGameState(){ return this->gameState; }
     64   
     65    void tick( float ds );
    6166
    6267  private:
     
    6469   
    6570    static bool delSynchronizeableHandler( MessageId messageId, byte * data, int dataLength, void * someData, int userId );
     71    static bool preferedTeamHandler( MessageId messageId, byte * data, int dataLength, void * someData, int userId );
     72   
     73    void setPreferedTeam( int userId, int teamId );
    6674
    6775    static NetworkGameManager*    singletonRef;
    6876   
    6977    int                           gameState;
     78   
     79    std::list<Playable*>          playablesToDelete;
    7080};
    7181
  • trunk/src/lib/network/network_manager.cc

    r7954 r8147  
    3030#include "preferences.h"
    3131#include "network_log.h"
     32#include "network_game_manager.h"
    3233
    3334
     
    149150        static_cast<NetworkStream*>(*stream)->processData();
    150151  }
     152 
     153  NetworkGameManager::getInstance()->tick( this->elapsedTime );
    151154}
    152155
  • trunk/src/lib/network/player_stats.cc

    r8068 r8147  
    8686   
    8787    PRINTF(0)("uniqueID changed %d %d\n", userId, getHostID());
    88    
    89     if ( userId == getHostID() )
    90       State::getPlayer()->setPlayable( getPlayable() );
    9188  }
    9289}
     
    10097{
    10198  const std::list<BaseObject*> * list = ClassList::getList( CL_PLAYER_STATS );
     99 
     100  if ( !list )
     101    return NULL;
    102102 
    103103  for ( std::list<BaseObject*>::const_iterator it = list->begin(); it != list->end(); it++ )
     
    121121  const std::list<BaseObject*> * list = ClassList::getList( CL_PLAYABLE );
    122122 
     123  if ( !list )
     124  {
     125    this->playableUniqueId = uniqueId;
     126    return;
     127  }
     128 
    123129  this->playable = NULL;
    124130  for ( std::list<BaseObject*>::const_iterator it = list->begin(); it != list->end(); it++ )
     
    130136    }
    131137  }
     138 
     139  if ( this->playable && userId == getHostID() )
     140    State::getPlayer()->setPlayable( this->playable );
    132141 
    133142  this->playableUniqueId = uniqueId;
  • trunk/src/lib/network/synchronizeable.cc

    r8068 r8147  
    108108
    109109  for ( SyncVarList::iterator it = syncVarList.begin(); it != syncVarList.end(); it++ )
     110  {
     111    //PRINTF(0)("SIZE = %d %s\n", (*it)->getSize(), (*it)->getName().c_str());
    110112    neededSize += (*it)->getSize();
     113  }
    111114
    112115  if ( !( neededSize <= maxLength ) )
     
    183186                    );
    184187   
    185     if ( ( hasPermission && (*it)->getPriority() >= priorityTH ) || sizeIter == stateFrom->sizeList.end() )
     188    if ( ( sizeIter != stateFrom->sizeList.end() && *sizeIter != (*it)->getSize() ) || ( hasPermission && (*it)->getPriority() >= priorityTH ) || sizeIter == stateFrom->sizeList.end() )
    186189    {
    187190      n = (*it)->writeToBuf( stateTo->data+i, stateTo->dataLength - i );
     
    209212  sentStates[userId].push_back( stateTo );
    210213 
    211   assert( i == neededSize );
     214  if ( i != neededSize )
     215  {
     216    PRINTF(0)("strange error: (%s) %d != %d\n", this->getClassName(), i, neededSize);
     217    assert(false);
     218  }
    212219
    213220  //write diff to data
  • trunk/src/lib/network/synchronizeable_var/synchronizeable_string.cc

    r7954 r8147  
    4848 
    4949  assert( res > 0 );
     50  assert( res == vPtrIn->length()+INTSIZE );
    5051 
    5152  return res;
  • trunk/src/util/multiplayer_team_deathmatch.cc

    r8068 r8147  
    3737
    3838#include "network_game_manager.h"
     39
     40#include "event_handler.h"
     41
     42#include "glgui.h"
     43
     44#include "story_entity.h"
    3945
    4046
     
    5965  this->currentGameState = GAMESTATE_PRE_GAME;
    6066  this->gameStateTimer = 10.0f;
     67 
     68  this->box = NULL;
    6169
    6270  this->deathScreen = new ImagePlane();
     
    138146void MultiplayerTeamDeathmatch::tick(float dt)
    139147{
     148  //on client side hostId is -1 until hanshake finished
     149  if ( SharedNetworkData::getInstance()->getHostID() < 0 )
     150    return;
     151 
     152  if ( currentGameState == GAMESTATE_PRE_GAME )
     153  {
     154    if ( PlayerStats::getStats( SharedNetworkData::getInstance()->getHostID() )
     155         && PlayerStats::getStats( SharedNetworkData::getInstance()->getHostID() )->getPreferedTeamId() == TEAM_NOTEAM
     156         && box == NULL
     157       )
     158    {
     159      EventHandler::getInstance()->pushState( ES_MENU );
     160     
     161      OrxGui::GLGuiHandler::getInstance()->activateCursor();
     162     
     163      box = new OrxGui::GLGuiBox();
     164      box->setAbsCoor2D( 300, 100 );
     165     
     166      OrxGui::GLGuiPushButton * buttonSpectator = new OrxGui::GLGuiPushButton("Spectator");
     167      box->pack( buttonSpectator );
     168      buttonSpectator->connect(SIGNAL(buttonSpectator, released), this, SLOT(MultiplayerTeamDeathmatch, onButtonSpectator));
     169     
     170      OrxGui::GLGuiPushButton * buttonRandom = new OrxGui::GLGuiPushButton("Random");
     171      box->pack( buttonRandom );
     172      buttonRandom->connect(SIGNAL(buttonRandom, released), this, SLOT(MultiplayerTeamDeathmatch, onButtonRandom));
     173     
     174      OrxGui::GLGuiPushButton * buttonTeam0 = new OrxGui::GLGuiPushButton("Blue Team");
     175      box->pack( buttonTeam0 );
     176      buttonTeam0->connect(SIGNAL(buttonTeam0, released), this, SLOT(MultiplayerTeamDeathmatch, onButtonTeam0));
     177     
     178      OrxGui::GLGuiPushButton * buttonTeam1 = new OrxGui::GLGuiPushButton("Red Team");
     179      box->pack( buttonTeam1 );
     180      buttonTeam1->connect(SIGNAL(buttonTeam1, released), this, SLOT(MultiplayerTeamDeathmatch, onButtonTeam1));
     181     
     182      OrxGui::GLGuiPushButton * buttonExit = new OrxGui::GLGuiPushButton("Exit");
     183      box->pack( buttonExit );
     184      buttonExit->connect(SIGNAL(buttonExit, released), this, SLOT(MultiplayerTeamDeathmatch, onButtonExit));
     185     
     186      box->showAll();
     187    }
     188  }
     189
     190  if ( box != NULL
     191       && PlayerStats::getStats( SharedNetworkData::getInstance()->getHostID() )
     192       && PlayerStats::getStats( SharedNetworkData::getInstance()->getHostID() )->getPreferedTeamId() != TEAM_NOTEAM
     193     )
     194  {
     195    delete box;
     196    box = NULL;
     197     
     198    OrxGui::GLGuiHandler::getInstance()->deactivateCursor( true );
     199     
     200    EventHandler::getInstance()->popState();
     201  }
     202 
     203  if ( box != NULL )
     204  {
     205    OrxGui::GLGuiHandler::getInstance()->tick( dt );
     206  }
     207 
     208  assignPlayable();
     209 
    140210  if ( !SharedNetworkData::getInstance()->isGameServer() )
    141211    return;
    142212 
    143213  gameStateTimer -= dt;
    144   PRINTF(0)("TICK %f\n", gameStateTimer);
     214  //PRINTF(0)("TICK %f\n", gameStateTimer);
    145215 
    146216  if ( currentGameState != GAMESTATE_GAME && gameStateTimer < 0 )
     
    210280 * @return group id
    211281 */
    212 int MultiplayerTeamDeathmatch::getTeamForNewUser( )
     282int MultiplayerTeamDeathmatch::getTeamForNewUser()
    213283{
    214284  return TEAM_NOTEAM;
    215285}
    216286
    217 ClassID MultiplayerTeamDeathmatch::getPlayableClassId( int team )
    218 {
    219   return CL_SPECTATOR;
    220 }
    221 
    222 std::string MultiplayerTeamDeathmatch::getPlayableModelFileName( int team, ClassID classId )
    223 {
    224   return "";
     287ClassID MultiplayerTeamDeathmatch::getPlayableClassId( int userId, int team )
     288{
     289  if ( team == TEAM_NOTEAM || team == TEAM_SPECTATOR )
     290    return CL_SPECTATOR;
     291 
     292  if ( team == 0 || team == 1 )
     293    return CL_SPACE_SHIP;
     294 
     295  assert( false );
     296}
     297
     298std::string MultiplayerTeamDeathmatch::getPlayableModelFileName( int userId, int team, ClassID classId )
     299{
     300  if ( team == 0 )
     301    return "models/ships/reap_#.obj";
     302  else if ( team == 1 )
     303    return "models/ships/fighter.obj";
     304  else
     305    return "";
    225306}
    226307
     
    334415    if ( stats.getTeamId() != stats.getPreferedTeamId() )
    335416    {
    336       if ( stats.getPreferedTeamId() == TEAM_SPECTATOR || ( stats.getPreferedTeamId() <= 0 && stats.getPreferedTeamId() < numTeams ) )
     417      if ( stats.getPreferedTeamId() == TEAM_SPECTATOR || ( stats.getPreferedTeamId() >= 0 && stats.getPreferedTeamId() < numTeams ) )
    337418      {
    338419        teamChange( stats.getUserId() );
     
    350431      if ( stats.getPreferedTeamId() == TEAM_RANDOM )
    351432      {
    352         stats.setPreferedTeamId( getTeamForNewUser() );
     433        stats.setPreferedTeamId( getRandomTeam() );
    353434        teamChange( stats.getUserId() );
    354435      }
     
    362443  PlayerStats & stats = *(PlayerStats::getStats( userId ));
    363444 
    364   assert(false);
    365 }
    366 
    367 
    368 
    369 
    370 
    371 
     445  stats.setTeamId( stats.getPreferedTeamId() );
     446 
     447  Playable * oldPlayable = stats.getPlayable();
     448 
     449 
     450  ClassID playableClassId = getPlayableClassId( userId, stats.getPreferedTeamId() );
     451  std::string playableModel = getPlayableModelFileName( userId, stats.getPreferedTeamId(), playableClassId );
     452 
     453  BaseObject * bo = Factory::fabricate( playableClassId );
     454 
     455  assert( bo != NULL );
     456  assert( bo->isA( CL_PLAYABLE ) );
     457 
     458  Playable & playable = *(dynamic_cast<Playable*>(bo));
     459 
     460  playable.loadModel( playableModel );
     461  playable.setOwner( userId );
     462  playable.setUniqueID( SharedNetworkData::getInstance()->getNewUniqueID() );
     463  playable.setSynchronized( true );
     464 
     465  stats.setTeamId( stats.getPreferedTeamId() );
     466  stats.setPlayableClassId( playableClassId );
     467  stats.setPlayableUniqueId( playable.getUniqueID() );
     468  stats.setModelFileName( playableModel );
     469 
     470  if ( oldPlayable )
     471  {
     472    //if ( userId == SharedNetworkData::getInstance()->getHostID() )
     473    //  State::getPlayer()->setPlayable( NULL );
     474    delete oldPlayable;
     475  }
     476}
     477
     478void MultiplayerTeamDeathmatch::onButtonExit( )
     479{
     480  State::getCurrentStoryEntity()->stop();
     481}
     482
     483void MultiplayerTeamDeathmatch::onButtonRandom( )
     484{
     485  NetworkGameManager::getInstance()->prefereTeam( TEAM_RANDOM );
     486}
     487
     488void MultiplayerTeamDeathmatch::onButtonTeam0( )
     489{
     490  NetworkGameManager::getInstance()->prefereTeam( 0 );
     491}
     492
     493void MultiplayerTeamDeathmatch::onButtonTeam1( )
     494{
     495  NetworkGameManager::getInstance()->prefereTeam( 1 );
     496}
     497
     498void MultiplayerTeamDeathmatch::onButtonSpectator( )
     499{
     500  NetworkGameManager::getInstance()->prefereTeam( TEAM_SPECTATOR );
     501}
     502
     503void MultiplayerTeamDeathmatch::assignPlayable( )
     504{
     505  if ( PlayerStats::getStats( SharedNetworkData::getInstance()->getHostID() ) )
     506    PlayerStats::getStats( SharedNetworkData::getInstance()->getHostID() )->getPlayable();
     507}
     508
     509
     510
     511
     512
     513
  • trunk/src/util/multiplayer_team_deathmatch.h

    r8068 r8147  
    1212#include "network_game_rules.h"
    1313
     14#include "glgui_box.h"
    1415
    1516class TiXmlElement;
     
    3637
    3738    virtual int getTeamForNewUser();
    38     virtual ClassID getPlayableClassId( int team );
    39     virtual std::string getPlayableModelFileName( int team, ClassID classId );
     39    virtual ClassID getPlayableClassId( int userId, int team );
     40    virtual std::string getPlayableModelFileName( int userId, int team, ClassID classId );
    4041
    4142    virtual void onPlayerSpawn();
     
    7374    float              gameStateTimer;             //!< if less than 0 -> change game state
    7475
     76    OrxGui::GLGuiBox* box;
     77
     78
    7579    void calculateTeamScore();
    7680    void nextGameState();
    7781    void handleTeamChanges();
    7882    void teamChange( int userId );
     83    void assignPlayable();
     84   
     85    void onButtonSpectator();
     86    void onButtonRandom();
     87    void onButtonTeam0();
     88    void onButtonTeam1();
     89    void onButtonExit();
    7990};
    8091
  • trunk/src/util/network_game_rules.cc

    r8068 r8147  
    3838}
    3939
    40 std::string NetworkGameRules::getPlayableModelFileName( int team, ClassID classId )
     40std::string NetworkGameRules::getPlayableModelFileName( int uesrId, int team, ClassID classId )
    4141{
    4242  return "models/ships/reap_#.obj";
    4343}
    4444
    45 ClassID NetworkGameRules::getPlayableClassId( int team )
     45ClassID NetworkGameRules::getPlayableClassId( int userId, int team )
    4646{
    4747  return CL_SPACE_SHIP;
  • trunk/src/util/network_game_rules.h

    r8068 r8147  
    2121   
    2222    virtual int getTeamForNewUser();
    23     virtual ClassID getPlayableClassId( int team );
    24     virtual std::string getPlayableModelFileName( int team, ClassID classId );
     23    virtual ClassID getPlayableClassId( int userId, int team );
     24    virtual std::string getPlayableModelFileName( int userId, int team, ClassID classId );
    2525   
    2626    virtual PlayerStats * getNewPlayerStats( int userId ){ return new PlayerStats( userId ); }
  • trunk/src/world_entities/playable.cc

    r8055 r8147  
    7979  // this->setPlayer(NULL);
    8080  // IN ITS DESTRUCTOR.
     81 
    8182  assert(this->currentPlayer == NULL);
    8283}
     
    281282 */
    282283void  Playable::detachCamera()
    283 {}
     284{
     285}
    284286
    285287
  • trunk/src/world_entities/player.cc

    r8145 r8147  
    8181      return true;
    8282  }
     83 
     84  if ( playable == NULL )
     85    this->playable = NULL;
    8386
    8487  return true;
  • trunk/src/world_entities/spectator.cc

    r8068 r8147  
    7171{
    7272  this->mouseDir =  rot;
    73   this->rotY = Quaternion( rot.getHeading(), Vector( 0, 1, 0) );
    74   this->rotAxis = Quaternion( rot.getAttitude(), Vector( 0, 0, 1 ) );
     73  this->angleY = rot.getHeading();
     74  this->angleX = rot.getAttitude();
    7575}
    7676
     
    104104    yMouse *= time / 10;
    105105   
    106     this->rotY *= Quaternion(-M_PI/4.0*this->xMouse, Vector(0,1,0));
    107     this->rotAxis *= Quaternion(-M_PI/4.0*this->yMouse, Vector(0,0,1) );
    108 
    109     this->mouseDir = rotY * rotAxis;
    110     //this->mouseDir *= Quaternion(-M_PI/4.0*this->yMouse, Vector(0,0,1));
     106    angleX -= xMouse;
     107    angleY -= yMouse;
     108   
     109    if ( angleY > 2.05 )
     110      angleY = 2.05;
     111   
     112    if ( angleY < -1.15 )
     113      angleY = -1.15;
     114   
     115    this->mouseDir = Quaternion( angleX, Vector( 0, 1, 0 ) ) * Quaternion( angleY, Vector( 0, 0, 1 ) );
     116   
    111117    xMouse = yMouse = 0;
    112118  }
    113119 
    114120  this->setAbsDir( this->mouseDir );
     121 
     122  Vector velocity;
     123 
     124  if ( this->bForward )
     125  {
     126    velocity += this->getAbsDirX();
     127  }
     128 
     129  if ( this->bBackward )
     130  {
     131    velocity -= this->getAbsDirX();
     132  }
     133 
     134  if ( this->bRight )
     135  {
     136    velocity += this->getAbsDirZ();
     137  }
     138 
     139  if ( this->bLeft )
     140  {
     141    velocity -= this->getAbsDirZ();
     142  }
     143 
     144  velocity *= 100;
     145 
     146  this->shiftCoor( velocity*time );
    115147}
    116148
  • trunk/src/world_entities/spectator.h

    r8068 r8147  
    3535    Quaternion            mouseDir;           //!< the direction where the player wants to fly
    3636
    37     Quaternion            rotY;
    38     Quaternion            rotAxis;
     37    //Quaternion            rotY;
     38    //Quaternion            rotAxis;
     39    float                 angleX;
     40    float                 angleY;
    3941};
    4042
  • trunk/src/world_entities/weapons/weapon_manager.cc

    r7350 r8147  
    5555{
    5656  // crosshair being a PNode it must not be deleted (this is because PNodes delete themselves.)
    57   //delete this->crosshair;
     57  // rennerc: crosshair seems not to delete itselve
     58  delete this->crosshair;
    5859}
    5960
Note: See TracChangeset for help on using the changeset viewer.