summaryrefslogtreecommitdiff
path: root/src/game-server/monster.cpp
diff options
context:
space:
mode:
authorGuillaume Melquiond <guillaume.melquiond@gmail.com>2007-08-29 14:17:22 +0000
committerGuillaume Melquiond <guillaume.melquiond@gmail.com>2007-08-29 14:17:22 +0000
commit26b3e1094d85ef89c90376688000836c8ee43979 (patch)
treef934d936d7c8319e742e946a6bb5f37ab7289b30 /src/game-server/monster.cpp
parentb82bf7df7053a78d51706a5a017d61f564e4677e (diff)
downloadmanaserv-26b3e1094d85ef89c90376688000836c8ee43979.tar.gz
manaserv-26b3e1094d85ef89c90376688000836c8ee43979.tar.bz2
manaserv-26b3e1094d85ef89c90376688000836c8ee43979.tar.xz
manaserv-26b3e1094d85ef89c90376688000836c8ee43979.zip
Replaced event system. Fixed race condition between quest variable recovery and character removal.
Diffstat (limited to 'src/game-server/monster.cpp')
-rw-r--r--src/game-server/monster.cpp34
1 files changed, 24 insertions, 10 deletions
diff --git a/src/game-server/monster.cpp b/src/game-server/monster.cpp
index e859c9f9..c8a34578 100644
--- a/src/game-server/monster.cpp
+++ b/src/game-server/monster.cpp
@@ -42,10 +42,23 @@ ItemClass *MonsterClass::getRandomDrop() const
return NULL;
}
+struct MonsterTargetEventDispatch: EventDispatch
+{
+ MonsterTargetEventDispatch()
+ {
+ typedef EventListenerFactory< Monster, &Monster::mTargetListener > Factory;
+ removed = &Factory::create< Thing, &Monster::forgetTarget >::function;
+ died = &Factory::create< Thing, &Monster::forgetTarget, Being >::function;
+ }
+};
+
+static MonsterTargetEventDispatch monsterTargetEventDispatch;
+
Monster::Monster(MonsterClass *specy):
Being(OBJECT_MONSTER, 65535),
mSpecy(specy),
mCountDown(0),
+ mTargetListener(&monsterTargetEventDispatch),
mAttackTime(0),
mAttackPreDelay(5),
mAttackAftDelay(10)
@@ -69,11 +82,11 @@ Monster::Monster(MonsterClass *specy):
Monster::~Monster()
{
- // deactivate death listeners
- std::map<Being *, int>::iterator i;
- for (i = mAnger.begin(); i != mAnger.end(); i++)
+ // Remove death listeners.
+ for (std::map<Being *, int>::iterator i = mAnger.begin(),
+ i_end = mAnger.end(); i != i_end; ++i)
{
- i->first->removeDeathListener(this);
+ i->first->removeListener(&mTargetListener);
}
}
@@ -228,10 +241,11 @@ int Monster::calculatePositionPriority(Point position, int targetPriority)
}
}
-void Monster::died(Being *being)
+void Monster::forgetTarget(Thing *t)
{
- mAnger.erase(being);
- mDeathListeners.remove((DeathListener *)being);
+ Being *b = static_cast< Being * >(t);
+ mAnger.erase(b);
+ b->removeListener(&mTargetListener);
}
int Monster::damage(Object *source, Damage const &damage)
@@ -245,7 +259,7 @@ int Monster::damage(Object *source, Damage const &damage)
if (ib.second)
{
- s->addDeathListener(this);
+ s->addListener(&mTargetListener);
}
else
{
@@ -255,10 +269,10 @@ int Monster::damage(Object *source, Damage const &damage)
return HPLoss;
}
-void Monster::die()
+void Monster::died()
{
+ Being::died();
mCountDown = 50; // Sets remove time to 5 seconds
- Being::die();
if (ItemClass *drop = mSpecy->getRandomDrop())
{
Item *item = new Item(drop, 1);