summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/game-server/monster.cpp13
-rw-r--r--src/game-server/monster.h11
-rw-r--r--src/scripting/lua.cpp9
3 files changed, 33 insertions, 0 deletions
diff --git a/src/game-server/monster.cpp b/src/game-server/monster.cpp
index 34920b91..ec9db792 100644
--- a/src/game-server/monster.cpp
+++ b/src/game-server/monster.cpp
@@ -430,6 +430,19 @@ int Monster::damage(Actor *source, const Damage &damage)
KILLSTEAL_PROTECTION_TIME);
}
}
+
+ if (mSpecy->getDamageCallback().isValid())
+ {
+ Script *script = ScriptManager::currentState();
+ script->setMap(getMap());
+ script->prepare(mSpecy->getDamageCallback());
+ script->push(this);
+ script->push(source);
+ script->push(HPLoss);
+ // TODO: add exact damage parameters as well
+ script->execute();
+ }
+
return HPLoss;
}
diff --git a/src/game-server/monster.h b/src/game-server/monster.h
index 3b58fa60..afa93e71 100644
--- a/src/game-server/monster.h
+++ b/src/game-server/monster.h
@@ -202,12 +202,18 @@ class MonsterClass
void setUpdateCallback(Script *script)
{ script->assignCallback(mUpdateCallback); }
+ void setDamageCallback(Script *script)
+ { script->assignCallback(mDamageCallback); }
+
void setEventCallback(const std::string &event, Script *script)
{ script->assignCallback(mEventCallbacks[event]); }
Script::Ref getUpdateCallback() const
{ return mUpdateCallback; }
+ Script::Ref getDamageCallback() const
+ { return mDamageCallback; }
+
Script::Ref getEventCallback(const std::string &event) const
{ return mEventCallbacks.value(event); }
@@ -237,6 +243,11 @@ class MonsterClass
Script::Ref mUpdateCallback;
/**
+ * A reference to the script that is called when a mob takes damage.
+ */
+ Script::Ref mDamageCallback;
+
+ /**
* Named event callbacks. Currently only used for custom attack
* callbacks.
*/
diff --git a/src/scripting/lua.cpp b/src/scripting/lua.cpp
index 1900f5ac..ca4a3272 100644
--- a/src/scripting/lua.cpp
+++ b/src/scripting/lua.cpp
@@ -1267,6 +1267,14 @@ static int monster_class_on_update(lua_State *s)
return 0;
}
+static int monster_class_on_damage(lua_State *s)
+{
+ MonsterClass *monsterClass = LuaMonsterClass::check(s, 1);
+ luaL_checktype(s, 2, LUA_TFUNCTION);
+ monsterClass->setDamageCallback(getScript(s));
+ return 0;
+}
+
static int monster_class_on(lua_State *s)
{
MonsterClass *monsterClass = LuaMonsterClass::check(s, 1);
@@ -2492,6 +2500,7 @@ LuaScript::LuaScript():
static luaL_Reg const members_MonsterClass[] = {
{ "on_update", &monster_class_on_update },
+ { "on_damage", &monster_class_on_damage },
{ "on", &monster_class_on },
{ NULL, NULL }
};