Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: code/trunk/src/modules/notifications/NotificationDispatcher.cc @ 7488

Last change on this file since 7488 was 7488, checked in by dafrick, 14 years ago

Some more documentation.
Making NotificationManager Root scope, cleaning up, especially in Notification (now it's just a data structure anymore).

  • Property svn:eol-style set to native
File size: 5.5 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/PlayerTrigger.h"
44#include "worldentities/pawns/Pawn.h"
45
46#include "Notification.h"
47#include "NotificationManager.h"
48
49namespace orxonox
50{
51
52    CreateUnloadableFactory(NotificationDispatcher);
53
54    registerMemberNetworkFunction(NotificationDispatcher, dispatch);
55
56    /**
57    @brief
58        Default constructor. Initializes the object.
59    */
60    NotificationDispatcher::NotificationDispatcher(BaseObject* creator) : BaseObject(creator), Synchronisable(creator)
61    {
62        RegisterObject(NotificationDispatcher);
63
64        this->sender_ = NotificationManager::NONE;
65        this->registerVariables();
66    }
67
68    /**
69    @brief
70        Destructor.
71    */
72    NotificationDispatcher::~NotificationDispatcher()
73    {
74
75    }
76
77    /**
78    @brief
79        Method for creating a NotificationDispatcher object through XML.
80    */
81    void NotificationDispatcher::XMLPort(Element& xmlelement, XMLPort::Mode mode)
82    {
83        SUPER(NotificationDispatcher, XMLPort, xmlelement, mode);
84
85        XMLPortParam(NotificationDispatcher, "sender", getSender, setSender, xmlelement, mode);
86       
87        XMLPortEventSink(NotificationDispatcher, BaseObject, "trigger", trigger, xmlelement, mode); //TODO: Change BaseObject to MultiTrigger as soon as MultiTrigger is the base of all triggers.
88    }
89
90    void NotificationDispatcher::XMLEventPort(Element& xmlelement, XMLPort::Mode mode)
91    {
92        SUPER(NotificationDispatcher, XMLEventPort, xmlelement, mode);
93
94        XMLPortEventState(NotificationDispatcher, BaseObject, "trigger", trigger, xmlelement, mode);
95    }
96
97    /**
98    @brief
99        Registers variables for synchronisation.
100    */
101    void NotificationDispatcher::registerVariables(void)
102    {
103        registerVariable(this->sender_, VariableDirection::ToClient);
104    }
105
106    /**
107    @brief
108        Dispatches a Notification with a message supplied by the createNotificationMessage() method, which can be overloaded.
109    @param clientId
110        The id of the client the notification should be dispatched to.
111    */
112    void NotificationDispatcher::dispatch(unsigned int clientId)
113    {
114        if(GameMode::isStandalone() || Host::getPlayerID() == clientId || this->getSyncMode() == 0x0)
115        {
116            const std::string message = this->createNotificationMessage();
117            NotificationManager::sendNotification(message, clientId, this->getSender());
118        }
119        else if(GameMode::isServer())
120        {
121            //TODO: This may fail if the object has not been synchronized, yet.
122            callMemberNetworkFunction(NotificationDispatcher, dispatch, this->getObjectID(), clientId, clientId);
123        }
124    }
125
126    /**
127    @brief
128        Is called when the NotificationDispatcher is triggered.
129    @param triggered
130        Whether it has been triggered or untriggered. The NotificationDispatcher only reacts to the first kind of events.
131    @param trigger
132        The object that caused the event to be fired.
133    @return
134        Returns true if the NotificationDispatcher was successfully triggered.
135    */
136    bool NotificationDispatcher::trigger(bool triggered, BaseObject* trigger)
137    {
138        if(!triggered || !this->isActive()) // If the NotificationDispatcher is inactive it cannot be executed.
139            return false;
140
141        COUT(4) << "NotificationDispatcher (&" << this << ") triggered." << std::endl;
142
143        PlayerTrigger* pTrigger = orxonox_cast<PlayerTrigger*>(trigger);
144        Pawn* pawn = NULL;
145
146        // If the trigger is a PlayerTrigger.
147        if(pTrigger != NULL)
148        {
149            if(!pTrigger->isForPlayer())  // The PlayerTrigger is not exclusively for Pawns which means we cannot extract one.
150                return false;
151            else
152                pawn = pTrigger->getTriggeringPlayer();
153        }
154        else
155            return false;
156
157        if(pawn == NULL)
158        {
159            COUT(4) << "The NotificationDispatcher was triggered by an entity other than a Pawn. (" << trigger->getIdentifier()->getName() << ")" << std::endl;
160            return false;
161        }
162
163        // Extract the PlayerInfo from the Pawn.
164        PlayerInfo* player = pawn->getPlayer();
165
166        if(player == NULL)
167        {
168            COUT(3) << "The PlayerInfo* is NULL." << std::endl;
169            return false;
170        }
171
172        this->dispatch(player->getClientID());
173
174        return true;
175    }
176
177}
Note: See TracBrowser for help on using the repository browser.