diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/game-server/monster.cpp | 13 | ||||
-rw-r--r-- | src/game-server/monster.h | 11 | ||||
-rw-r--r-- | src/scripting/lua.cpp | 9 |
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 } }; |