summaryrefslogtreecommitdiffstats
path: root/src/game-server/entity.cpp
blob: 671ef5e6eb2d2a993c55363171bcd6c05e8d3e91 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
/*
 *  The Mana Server
 *  Copyright (C) 2007-2010  The Mana World Development Team
 *
 *  This file is part of The Mana Server.
 *
 *  The Mana Server is free software; you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation; either version 2 of the License, or
 *  any later version.
 *
 *  The Mana Server is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with The Mana Server.  If not, see <http://www.gnu.org/licenses/>.
 */

#include <cassert>

#include "game-server/entity.h"

#include "game-server/eventlistener.h"

Entity::~Entity()
{
    /* As another object will stop listening and call removeListener when it is
       deleted, the following assertion ensures that all the calls to
       removeListener have been performed will this object was still alive. It
       is not strictly necessary, as there are cases where no removal is
       performed (e.g. ~SpawnArea). But this is rather exceptional, so keep the
       assertion to catch all the other forgotten calls to removeListener. */
    assert(mListeners.empty());
}

void Entity::addListener(const EventListener *l)
{
    mListeners.insert(l);
}

void Entity::removeListener(const EventListener *l)
{
    mListeners.erase(l);
}

void Entity::inserted()
{
    for (Listeners::iterator i = mListeners.begin(),
         i_end = mListeners.end(); i != i_end;)
    {
        const EventListener &l = **i;
        ++i; // In case the listener removes itself from the list on the fly.
        if (l.dispatch->inserted) l.dispatch->inserted(&l, this);
    }
}

void Entity::removed()
{
    for (Listeners::iterator i = mListeners.begin(),
         i_end = mListeners.end(); i != i_end;)
    {
        const EventListener &l = **i;
        ++i; // In case the listener removes itself from the list on the fly.
        if (l.dispatch->removed) l.dispatch->removed(&l, this);
    }
}