- Timestamp:
- Apr 14, 2011, 4:33:33 PM (13 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
code/branches/portals/src/modules/portals/PortalEndPoint.cc
r8200 r8243 1 1 #include "PortalEndPoint.h" 2 2 #include "core/XMLPort.h" 3 #include "objects/triggers/MultiTriggerContainer.h" 4 #include "portals/PortalLink.h" 5 #include "worldentities/MobileEntity.h" 6 3 7 4 8 namespace orxonox … … 8 12 std::map<unsigned int, PortalEndPoint *> PortalEndPoint::idMap_s; 9 13 10 PortalEndPoint::PortalEndPoint(BaseObject* creator) : DistanceMultiTrigger(creator), id_(0)14 PortalEndPoint::PortalEndPoint(BaseObject* creator) : StaticEntity(creator), id_(0), trigger_(new DistanceMultiTrigger(this)) 11 15 { 12 16 RegisterObject(PortalEndPoint); 17 this->trigger_->setName("portal"); 18 this->attach(trigger_); 13 19 } 14 20 15 21 PortalEndPoint::~PortalEndPoint() 16 22 { 17 23 18 24 } 19 25 … … 21 27 { 22 28 SUPER(PortalEndPoint, XMLPort, xmlelement, mode); 29 23 30 XMLPortParam(PortalEndPoint, "id", setID, getID, xmlelement, mode); 31 XMLPortParam(PortalEndPoint, "design", setTemplate, getTemplate, xmlelement, mode); 32 XMLPortParamExtern(PortalEndPoint, DistanceMultiTrigger, this->trigger_, "distance", setDistance, getDistance, xmlelement, mode); 33 XMLPortParamLoadOnly(PortalEndPoint, "eventTemplate", setEventTemplate, xmlelement, mode); 34 XMLPortParamLoadOnly(PortalEndPoint, "target", setTargets, xmlelement, mode).defaultValues("Pawn"); 24 35 25 36 if(mode == XMLPort::LoadObject) … … 29 40 } 30 41 31 void PortalEndPoint:: tick(float dt)42 void PortalEndPoint::XMLEventPort(Element& xmlelement, XMLPort::Mode mode) 32 43 { 33 SUPER(PortalEndPoint, tick, dt); 44 SUPER(PortalEndPoint, XMLEventPort, xmlelement, mode); 45 46 XMLPortEventSink(PortalEndPoint, BaseObject, "execute", execute, xmlelement, mode); 34 47 } 35 48 36 void PortalEndPoint::jumpOut(WorldEntity* entity) 49 bool PortalEndPoint::execute(bool bTriggered, BaseObject* trigger) 50 { 51 MultiTriggerContainer * cont = orxonox_cast<MultiTriggerContainer *>(trigger); 52 if(cont == 0) 53 return true; 54 55 DistanceMultiTrigger * originatingTrigger = orxonox_cast<DistanceMultiTrigger *>(cont->getOriginator()); 56 if(originatingTrigger == 0) 57 { 58 COUT(1) << "originator no DistanceMultiTrigger\n" << std::endl; 59 return true; 60 } 61 62 if(this->getAttachedObjects().find(orxonox_cast<WorldEntity *>(originatingTrigger)) == this->getAttachedObjects().end()) // only necessary if events have the same name 63 return true; 64 65 MobileEntity * entity = orxonox_cast<MobileEntity *>(cont->getData()); 66 if(entity == 0) 67 return true; 68 69 if(bTriggered) 70 { 71 if(this->recentlyJumpedOut_.find(entity) == this->recentlyJumpedOut_.end()) // only enter the portal if not recently jumped out of it 72 { 73 PortalLink::use(entity, this); 74 } 75 } 76 else 77 { 78 this->recentlyJumpedOut_.erase(entity); 79 } 80 81 return true; 82 } 83 84 void PortalEndPoint::jumpOut(MobileEntity* entity) 37 85 { 38 86 this->recentlyJumpedOut_.insert(entity); 39 entity->setPosition(this->getPosition()); 87 entity->setPosition(this->getWorldPosition()); 88 entity->rotate(this->getWorldOrientation()); 89 entity->setVelocity(this->getWorldOrientation() * entity->getVelocity()); 40 90 } 41 91 42 bool PortalEndPoint::hasRecentlyJumpedOut(WorldEntity* entity)43 {44 if(this->recentlyJumpedOut_.find(entity) == this->recentlyJumpedOut_.end())45 {46 return false;47 }48 else49 return true;50 }51 92 52 93 }
Note: See TracChangeset
for help on using the changeset viewer.