Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

Ignore:
Timestamp:
May 6, 2010, 4:01:25 PM (14 years ago)
Author:
dafrick
Message:

Resolved bug in DistanceMultiTrigger, that caused a segfault, when an object in range of the trigger was destroyed.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • code/trunk/src/modules/objects/triggers/DistanceMultiTrigger.cc

    r6857 r6860  
    8686
    8787        // Check for objects that were in range but no longer are. Iterate through all objects, that are in range.
    88         for(std::set<WorldEntity*>::iterator it = this->range_.begin(); it != this->range_.end(); )
     88        for(std::map<WorldEntity*, WeakPtr<WorldEntity>* >::iterator it = this->range_.begin(); it != this->range_.end(); )
    8989        {
    90             Vector3 distanceVec = (*it)->getWorldPosition() - this->getWorldPosition();
     90            WorldEntity* entity = it->second->get();
     91            WorldEntity* key = it->first;
     92            if(entity == NULL)
     93            {
     94                it++;
     95                this->removeFromRange(key);
     96                continue;
     97            }
     98           
     99            Vector3 distanceVec = entity->getWorldPosition() - this->getWorldPosition();
    91100            // If the object is no longer in range.
    92101            if (distanceVec.length() > this->distance_)
    93102            {
    94                 WorldEntity* temp = *(it++);
    95                 if(!this->removeFromRange(temp))
     103                if(!this->removeFromRange(entity))
    96104                    continue;
    97105
     
    103111                MultiTriggerState* state = new MultiTriggerState;
    104112                state->bTriggered = false;
    105                 state->originator = temp;
     113                state->originator = entity;
    106114                queue->push(state);
    107115            }
     
    113121        for(ClassTreeMaskObjectIterator it = targetMask.begin(); it != targetMask.end(); ++it)
    114122        {
    115             WorldEntity* entity = orxonox_cast<WorldEntity*>(*it);
    116             if (entity == NULL || this->inRange(entity)) //If the object is no WorldEntity or is already in range.
     123            WorldEntity* entity = static_cast<WorldEntity*>(*it);
     124            if (entity == NULL) //If the object is no WorldEntity or is already in range.
    117125                continue;
    118126
Note: See TracChangeset for help on using the changeset viewer.