Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

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

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

Merging presentation branch back into trunk.
There are many new features and also a lot of other changes and bugfixes, if you want to know, digg through the svn log.
Not everything is yet working as it should, but it should be fairly stable. If you habe any bug reports, just send me an email.

  • Property svn:eol-style set to native
File size: 5.3 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            // TODO: Make the type configurable.
116            NotificationListener::sendNotification(message, this->getSender(), notificationMessageType::info, notificationSendMode::network, clientId);
117        }
118        else if(GameMode::isServer())
119        {
120            callMemberNetworkFunction(NotificationDispatcher, dispatch, this->getObjectID(), clientId, clientId);
121        }
122    }
123
124    /**
125    @brief
126        Is called when the NotificationDispatcher is triggered.
127    @param triggered
128        Whether it has been triggered or untriggered. The NotificationDispatcher only reacts to the first kind of events.
129    @param trigger
130        The object that caused the event to be fired.
131    @return
132        Returns true if the NotificationDispatcher was successfully triggered.
133    */
134    bool NotificationDispatcher::trigger(bool triggered, BaseObject* trigger)
135    {
136        if(!triggered || !this->isActive()) // If the NotificationDispatcher is inactive it cannot be executed.
137            return false;
138
139        COUT(4) << "NotificationDispatcher (&" << this << ") triggered." << std::endl;
140
141        PlayerTrigger* pTrigger = orxonox_cast<PlayerTrigger*>(trigger);
142        PlayerInfo* player = NULL;
143
144        // If the trigger is a PlayerTrigger.
145        if(pTrigger != NULL)
146        {
147            if(!pTrigger->isForPlayer())  // The PlayerTrigger is not exclusively for Pawns which means we cannot extract one.
148                return false;
149            else
150                player = pTrigger->getTriggeringPlayer();
151        }
152        else
153            return false;
154
155        if(player == NULL)
156        {
157            COUT(4) << "The NotificationDispatcher was triggered by an entity other than a Pawn. (" << trigger->getIdentifier()->getName() << ")" << std::endl;
158            return false;
159        }
160
161        this->dispatch(player->getClientID());
162
163        return true;
164    }
165
166}
Note: See TracBrowser for help on using the repository browser.