summaryrefslogtreecommitdiff
path: root/src/scripting/lua.cpp
diff options
context:
space:
mode:
authorPhilipp Sehmisch <tmw@crushnet.org>2008-05-06 18:49:04 +0000
committerPhilipp Sehmisch <tmw@crushnet.org>2008-05-06 18:49:04 +0000
commit7d559cbae9c713e15ae0c943a4d571122bf29bc6 (patch)
treed3edd6921006c28c62db25621f9ad1b44d1f0e69 /src/scripting/lua.cpp
parent832584f65adff69659181d6fc884f779a79d62a9 (diff)
downloadmanaserv-7d559cbae9c713e15ae0c943a4d571122bf29bc6.tar.gz
manaserv-7d559cbae9c713e15ae0c943a4d571122bf29bc6.tar.bz2
manaserv-7d559cbae9c713e15ae0c943a4d571122bf29bc6.tar.xz
manaserv-7d559cbae9c713e15ae0c943a4d571122bf29bc6.zip
Implemented script trigger areas which call a script function when an object steps into them.
Diffstat (limited to 'src/scripting/lua.cpp')
-rw-r--r--src/scripting/lua.cpp50
1 files changed, 50 insertions, 0 deletions
diff --git a/src/scripting/lua.cpp b/src/scripting/lua.cpp
index 46463dfc..62fd64a4 100644
--- a/src/scripting/lua.cpp
+++ b/src/scripting/lua.cpp
@@ -41,6 +41,7 @@ extern "C" {
#include "game-server/npc.hpp"
#include "game-server/quest.hpp"
#include "game-server/state.hpp"
+#include "game-server/trigger.hpp"
#include "net/messageout.hpp"
#include "scripting/script.hpp"
#include "utils/logger.h"
@@ -547,6 +548,54 @@ static int LuaChr_SetQuest(lua_State *s)
return 0;
}
+/**
+ * Creates a trigger area. Whenever an object enters this area
+ * a Lua function is called.
+ * tmw.trigger_create (x, y, width, height, function, id)
+ */
+static int LuaTrigger_Create(lua_State *s)
+{
+ //TODO: argument check
+ if (!lua_isnumber(s, 1) ||
+ !lua_isnumber(s, 2) ||
+ !lua_isnumber(s, 3) ||
+ !lua_isnumber(s, 4) ||
+ !lua_isstring(s, 5) ||
+ !lua_isnumber(s, 6))
+ {
+ raiseScriptError(s, "trigger_create called with incorrect parameters.");
+ return 0;
+ }
+
+ lua_pushlightuserdata(s, (void *)&registryKey);
+ lua_gettable(s, LUA_REGISTRYINDEX);
+ Script *script = static_cast<Script *>(lua_touserdata(s, -1));
+ int x = lua_tointeger(s, 1);
+ int y = lua_tointeger(s, 2);
+ int width = lua_tointeger(s, 3);
+ int height = lua_tointeger(s, 4);
+ std::string function = lua_tostring(s, 5);
+ int id = lua_tointeger(s, 6);
+
+ LOG_INFO("Created script trigger at "<<x<<":"<<y<<" ("<<width<<"x"<<height<<") function: "<<function<<" ("<<id<<")");
+
+ MapComposite *m = script->getMap();
+
+ if (!m)
+ {
+ raiseScriptError(s, "trigger_create called for nonexistent a map.");
+ return 0;
+ }
+
+ ScriptAction *action = new ScriptAction(script, function, id);
+ Rectangle r = { x, y, width, height };
+ TriggerArea *area = new TriggerArea(m, r, action);
+
+ bool ret = GameState::insert(area);
+ lua_pushboolean(s, ret);
+ return 1;
+}
+
LuaScript::LuaScript():
nbArgs(-1)
{
@@ -568,6 +617,7 @@ LuaScript::LuaScript():
{ "being_walk", &LuaBeing_Walk },
{ "posX", &LuaPosX },
{ "posY", &LuaPosY },
+ { "trigger_create", &LuaTrigger_Create },
{ NULL, NULL }
};
luaL_register(mState, "tmw", callbacks);