Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: code/branches/tutoriallevel2/src/modules/notifications/NotificationDispatcher.cc @ 8374

Last change on this file since 8374 was 8374, checked in by dafrick, 13 years ago

Changes in notifications module structure. Notifications can now be sent through the NotificationListener, meaning, they can be sent from anywhere within orxonox (and the modules of course).

  • Property svn:eol-style set to native
File size: 5.4 KB
Line 
1/*
2 *   ORXONOX - the hottest 3D action shooter ever to exist
3 *                    > www.orxonox.net <
4 *
5 *
6 *   License notice:
7 *
8 *   This program is free software; you can redistribute it and/or
9 *   modify it under the terms of the GNU General Public License
10 *   as published by the Free Software Foundation; either version 2
11 *   of the License, or (at your option) any later version.
12 *
13 *   This program is distributed in the hope that it will be useful,
14 *   but WITHOUT ANY WARRANTY; without even the implied warranty of
15 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See thes
16 *   GNU General Public License for more details.
17 *
18 *   You should have received a copy of the GNU General Public License
19 *   along with this program; if not, write to the Free Software
20 *   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
21 *
22 *   Author:
23 *      Damian 'Mozork' Frick
24 *   Co-authors:
25 *      ...
26 *
27 */
28
29/**
30    @file NotificationDispatcher.cc
31    @brief Implementation of the NotificationDispatcher class.
32*/
33
34#include "NotificationDispatcher.h"
35
36#include "core/CoreIncludes.h"
37#include "core/EventIncludes.h"
38#include "core/XMLPort.h"
39#include "network/NetworkFunction.h"
40#include "network/Host.h"
41
42#include "infos/PlayerInfo.h"
43#include "interfaces/NotificationListener.h"
44#include "interfaces/PlayerTrigger.h"
45#include "worldentities/pawns/Pawn.h"
46
47namespace orxonox
48{
49
50    CreateUnloadableFactory(NotificationDispatcher);
51
52    registerMemberNetworkFunction(NotificationDispatcher, dispatch);
53
54    /**
55    @brief
56        Default constructor. Initializes the object.
57    */
58    NotificationDispatcher::NotificationDispatcher(BaseObject* creator) : BaseObject(creator), Synchronisable(creator)
59    {
60        RegisterObject(NotificationDispatcher);
61
62        this->sender_ = NotificationListener::NONE;
63        this->registerVariables();
64    }
65
66    /**
67    @brief
68        Destructor.
69    */
70    NotificationDispatcher::~NotificationDispatcher()
71    {
72
73    }
74
75    /**
76    @brief
77        Method for creating a NotificationDispatcher object through XML.
78    */
79    void NotificationDispatcher::XMLPort(Element& xmlelement, XMLPort::Mode mode)
80    {
81        SUPER(NotificationDispatcher, XMLPort, xmlelement, mode);
82
83        XMLPortParam(NotificationDispatcher, "sender", getSender, setSender, xmlelement, mode);
84       
85        XMLPortEventSink(NotificationDispatcher, BaseObject, "trigger", trigger, xmlelement, mode); //TODO: Change BaseObject to MultiTrigger as soon as MultiTrigger is the base of all triggers.
86    }
87
88    void NotificationDispatcher::XMLEventPort(Element& xmlelement, XMLPort::Mode mode)
89    {
90        SUPER(NotificationDispatcher, XMLEventPort, xmlelement, mode);
91
92        XMLPortEventState(NotificationDispatcher, BaseObject, "trigger", trigger, xmlelement, mode);
93    }
94
95    /**
96    @brief
97        Registers variables for synchronisation.
98    */
99    void NotificationDispatcher::registerVariables(void)
100    {
101        registerVariable(this->sender_, VariableDirection::ToClient);
102    }
103
104    /**
105    @brief
106        Dispatches a Notification with a message supplied by the createNotificationMessage() method, which can be overloaded.
107    @param clientId
108        The id of the client the notification should be dispatched to.
109    */
110    void NotificationDispatcher::dispatch(unsigned int clientId)
111    {
112        if(GameMode::isStandalone() || Host::getPlayerID() == clientId || this->getSyncMode() == 0x0)
113        {
114            const std::string message = this->createNotificationMessage();
115            NotificationListener::sendNotification(message, clientId, this->getSender());
116        }
117        else if(GameMode::isServer())
118        {
119            callMemberNetworkFunction(NotificationDispatcher, dispatch, this->getObjectID(), clientId, clientId);
120        }
121    }
122
123    /**
124    @brief
125        Is called when the NotificationDispatcher is triggered.
126    @param triggered
127        Whether it has been triggered or untriggered. The NotificationDispatcher only reacts to the first kind of events.
128    @param trigger
129        The object that caused the event to be fired.
130    @return
131        Returns true if the NotificationDispatcher was successfully triggered.
132    */
133    bool NotificationDispatcher::trigger(bool triggered, BaseObject* trigger)
134    {
135        if(!triggered || !this->isActive()) // If the NotificationDispatcher is inactive it cannot be executed.
136            return false;
137
138        COUT(4) << "NotificationDispatcher (&" << this << ") triggered." << std::endl;
139
140        PlayerTrigger* pTrigger = orxonox_cast<PlayerTrigger*>(trigger);
141        Pawn* pawn = NULL;
142
143        // If the trigger is a PlayerTrigger.
144        if(pTrigger != NULL)
145        {
146            if(!pTrigger->isForPlayer())  // The PlayerTrigger is not exclusively for Pawns which means we cannot extract one.
147                return false;
148            else
149                pawn = pTrigger->getTriggeringPlayer();
150        }
151        else
152            return false;
153
154        if(pawn == NULL)
155        {
156            COUT(4) << "The NotificationDispatcher was triggered by an entity other than a Pawn. (" << trigger->getIdentifier()->getName() << ")" << std::endl;
157            return false;
158        }
159
160        // Extract the PlayerInfo from the Pawn.
161        PlayerInfo* player = pawn->getPlayer();
162
163        if(player == NULL)
164        {
165            COUT(3) << "The PlayerInfo* is NULL." << std::endl;
166            return false;
167        }
168
169        this->dispatch(player->getClientID());
170
171        return true;
172    }
173
174}
Note: See TracBrowser for help on using the repository browser.