Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: code/branches/portals2/src/modules/portals/PortalEndPoint.cc @ 8511

Last change on this file since 8511 was 8511, checked in by anbueche, 13 years ago

added reenter delay, added comments

  • Property svn:executable set to *
File size: 4.0 KB
Line 
1#include "PortalEndPoint.h"
2#include "core/XMLPort.h"
3#include "objects/triggers/MultiTriggerContainer.h"
4#include "portals/PortalLink.h"
5#include "worldentities/MobileEntity.h"
6
7
8namespace orxonox
9{
10    CreateFactory(PortalEndPoint);
11   
12    /*static*/ const std::string PortalEndPoint::EVENTFUNCTIONNAME = "execute";
13
14    std::map<unsigned int, PortalEndPoint *> PortalEndPoint::idMap_s;
15
16    PortalEndPoint::PortalEndPoint(BaseObject* creator) : StaticEntity(creator), id_(0), trigger_(new DistanceMultiTrigger(this)), reenterDelay_(0)
17    {
18        RegisterObject(PortalEndPoint);
19        this->trigger_->setName("portal");
20        this->attach(trigger_);
21    }
22   
23    PortalEndPoint::~PortalEndPoint()
24    {
25   
26    }
27
28    void PortalEndPoint::XMLPort(Element& xmlelement, XMLPort::Mode mode)
29    {
30        SUPER(PortalEndPoint, XMLPort, xmlelement, mode);
31       
32        XMLPortParam(PortalEndPoint, "id", setID, getID, xmlelement, mode);
33        XMLPortParam(PortalEndPoint, "design", setTemplate, getTemplate, xmlelement, mode);
34        XMLPortParam(PortalEndPoint, "reenterDelay", setReenterDelay, getReenterDelay, xmlelement, mode);
35        XMLPortParamExtern(PortalEndPoint, DistanceMultiTrigger, this->trigger_, "distance", setDistance, getDistance, xmlelement, mode);
36        XMLPortParamLoadOnly(PortalEndPoint, "target", setTarget, xmlelement, mode).defaultValues("Pawn");
37       
38        // Add the DistanceMultiTrigger as event source.
39        this->addEventSource(this->trigger_, EVENTFUNCTIONNAME);
40       
41        if(mode == XMLPort::LoadObject)
42        {
43            PortalEndPoint::idMap_s[this->id_] = this;
44        }
45    }
46
47    void PortalEndPoint::XMLEventPort(Element& xmlelement, XMLPort::Mode mode)
48    {
49        SUPER(PortalEndPoint, XMLEventPort, xmlelement, mode);
50       
51        XMLPortEventSink(PortalEndPoint, BaseObject, EVENTFUNCTIONNAME, execute, xmlelement, mode);
52    }
53
54    bool PortalEndPoint::execute(bool bTriggered, BaseObject* trigger)
55    {
56        if(!this->isActive())
57            return true;
58       
59        MultiTriggerContainer * cont = orxonox_cast<MultiTriggerContainer *>(trigger);
60        if(cont == 0)
61            return true;
62       
63        DistanceMultiTrigger * originatingTrigger = orxonox_cast<DistanceMultiTrigger *>(cont->getOriginator());
64        if(originatingTrigger == 0)
65        {
66            // COUT(1) << "originator no DistanceMultiTrigger\n" << std::endl;
67            return true;
68        }
69       
70        MobileEntity * entity = orxonox_cast<MobileEntity *>(cont->getData());
71        if(entity == 0)
72            return true;
73       
74        if(bTriggered)
75        {
76            if(this->letsEnter(entity))  // only enter the portal if not just (this very moment) jumped out of it, or if the reenterDelay expired
77            {
78                PortalLink::use(entity, this);
79            }
80        }
81        else
82        {
83            this->recentlyJumpedOut_.erase(entity);
84        }
85       
86        return true;
87    }
88
89    bool PortalEndPoint::letsEnter(MobileEntity* entity)
90    {
91        // not allowed to enter if reenterDelay hasn't expired yet
92        std::map<MobileEntity *, time_t>::const_iterator time = this->jumpOutTimes_.find(entity);
93        if(time != this->jumpOutTimes_.end() && std::difftime(std::time(0),time->second) < this->reenterDelay_)
94            return false;
95
96        // not allowed to enter if jumped out of this portal and not left its activation radius yet
97        std::set<MobileEntity *>::const_iterator recent = this->recentlyJumpedOut_.find(entity);
98        if(recent != this->recentlyJumpedOut_.end())
99            return false;
100       
101        return true;
102    }
103
104    void PortalEndPoint::jumpOut(MobileEntity* entity)
105    {
106        this->jumpOutTimes_[entity] = std::time(0);
107        this->recentlyJumpedOut_.insert(entity);
108       
109        entity->setPosition(this->getWorldPosition());
110        entity->rotate(this->getWorldOrientation());
111        entity->setVelocity(this->getWorldOrientation() * entity->getVelocity());
112        entity->setVelocity(entity->getVelocity() * 1.5);
113    }
114
115}
Note: See TracBrowser for help on using the repository browser.