summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorPhilipp Sehmisch <tmw@crushnet.org>2008-07-07 19:56:02 +0000
committerPhilipp Sehmisch <tmw@crushnet.org>2008-07-07 19:56:02 +0000
commit5996ff324d4123d1b1c6adb1c81eb16dd5e7b466 (patch)
tree92943ff0856aa4ed4accd04d9e870d96cf186a21 /src
parente5d4c719a52d03bfe9bfb4ea2fea0570842985bc (diff)
downloadmanaserv-5996ff324d4123d1b1c6adb1c81eb16dd5e7b466.tar.gz
manaserv-5996ff324d4123d1b1c6adb1c81eb16dd5e7b466.tar.bz2
manaserv-5996ff324d4123d1b1c6adb1c81eb16dd5e7b466.tar.xz
manaserv-5996ff324d4123d1b1c6adb1c81eb16dd5e7b466.zip
Implemented death listener for scripting engine.
Diffstat (limited to 'src')
-rw-r--r--src/scripting/lua.cpp41
-rw-r--r--src/scripting/script.cpp5
-rw-r--r--src/scripting/script.hpp23
3 files changed, 68 insertions, 1 deletions
diff --git a/src/scripting/lua.cpp b/src/scripting/lua.cpp
index ae9ff1b2..5a9364db 100644
--- a/src/scripting/lua.cpp
+++ b/src/scripting/lua.cpp
@@ -79,6 +79,8 @@ class LuaScript: public Script
static void getQuestCallback(Character *, std::string const &,
std::string const &, void *);
+ void processDeathEvent(Being* thing);
+
private:
lua_State *mState;
@@ -721,6 +723,33 @@ static int LuaGetBeingsInCircle(lua_State *s)
return 1;
}
+/**
+ * Makes the server call the lua function deathEvent
+ * with the being ID when the being dies.
+ * tmw.noteOnDeath (being)
+ */
+static int LuaNoteOnDeath(lua_State *s)
+{
+ if (!lua_islightuserdata(s, 1) || lua_gettop(s) != 1)
+ {
+ raiseScriptError(s, "lua_noteOnDeath called with incorrect parameters.");
+ return 0;
+ }
+
+ lua_pushlightuserdata(s, (void *)&registryKey);
+ lua_gettable(s, LUA_REGISTRYINDEX);
+ Script *t = static_cast<Script *>(lua_touserdata(s, -1));
+ Being *being = getBeing(s, 1);
+ if (!being)
+ {
+ raiseScriptError(s, "lua_noteOnDeath called for nonexistent being.");
+ return 0;
+ }
+
+ being->addListener(t->getScriptDeathListener());
+ return 0;
+}
+
LuaScript::LuaScript():
nbArgs(-1)
{
@@ -747,6 +776,7 @@ LuaScript::LuaScript():
{ "trigger_create", &LuaTrigger_Create },
{ "chatmessage", &LuaChatmessage },
{ "get_beings_in_circle", &LuaGetBeingsInCircle},
+ { "noteOnDeath", &LuaNoteOnDeath },
{ NULL, NULL }
};
luaL_register(mState, "tmw", callbacks);
@@ -835,6 +865,17 @@ void LuaScript::load(char const *prog)
}
}
+void LuaScript::processDeathEvent(Being *being)
+{
+ prepare("deathNotification");
+ push(being);
+ //TODO: get and push a list of creatures who contributed to killing the
+ // being. This might be very interesting for scripting quests.
+ execute();
+
+ being->removeListener(getScriptDeathListener());
+}
+
static Script *LuaFactory()
{
return new LuaScript();
diff --git a/src/scripting/script.cpp b/src/scripting/script.cpp
index 408bf28a..7c6318af 100644
--- a/src/scripting/script.cpp
+++ b/src/scripting/script.cpp
@@ -33,6 +33,11 @@ typedef std::map< std::string, Script::Factory > Engines;
static Engines *engines = NULL;
+Script::Script():
+ mMap(NULL),
+ mEventListener(&scriptDeathEventDispatch)
+{}
+
void Script::registerEngine(std::string const &name, Factory f)
{
if (!engines)
diff --git a/src/scripting/script.hpp b/src/scripting/script.hpp
index 6a101edf..d9a8aca7 100644
--- a/src/scripting/script.hpp
+++ b/src/scripting/script.hpp
@@ -26,6 +26,8 @@
#include <string>
+#include "game-server/eventlistener.hpp"
+
class MapComposite;
class Thing;
@@ -51,7 +53,7 @@ class Script
/**
* Constructor.
*/
- Script(): mMap(NULL) {}
+ Script();
/**
* Destructor.
@@ -124,8 +126,27 @@ class Script
MapComposite *getMap() const
{ return mMap; }
+ EventListener *getScriptDeathListener()
+ { return &mEventListener; }
+
+ virtual void processDeathEvent(Being* thing) = 0;
+
private:
MapComposite *mMap;
+ EventListener mEventListener; /**< Tracking of being deaths. */
+
+ friend struct ScriptDeathEventDispatch;
};
+struct ScriptDeathEventDispatch: EventDispatch
+{
+ ScriptDeathEventDispatch()
+ {
+ typedef EventListenerFactory< Script, &Script::mEventListener > Factory;
+ died = &Factory::create< Being, &Script::processDeathEvent >::function;
+ }
+};
+
+static ScriptDeathEventDispatch scriptDeathEventDispatch;
+
#endif