diff options
Diffstat (limited to 'src/scripting/lua.cpp')
-rw-r--r-- | src/scripting/lua.cpp | 111 |
1 files changed, 81 insertions, 30 deletions
diff --git a/src/scripting/lua.cpp b/src/scripting/lua.cpp index 3d59ab98..c6a75d90 100644 --- a/src/scripting/lua.cpp +++ b/src/scripting/lua.cpp @@ -46,6 +46,8 @@ extern "C" { #include "game-server/postman.h" #include "game-server/quest.h" #include "game-server/state.h" +#include "game-server/statuseffect.h" +#include "game-server/statusmanager.h" #include "game-server/trigger.h" #include "net/messageout.h" #include "scripting/luautil.h" @@ -210,6 +212,27 @@ static int on_get_special_recharge_cost(lua_State *s) return 0; } +static int get_item_class(lua_State *s) +{ + const char *name = luaL_checkstring(s, 1); + LuaItemClass::push(s, itemManager->getItemByName(name)); + return 1; +} + +static int get_monster_class(lua_State *s) +{ + const char *name = luaL_checkstring(s, 1); + LuaMonsterClass::push(s, monsterManager->getMonsterByName(name)); + return 1; +} + +static int get_status_effect(lua_State *s) +{ + const char *name = luaL_checkstring(s, 1); + LuaStatusEffect::push(s, StatusManager::getStatusByName(name)); + return 1; +} + /** * mana.npc_message(NPC*, Character*, string): void * Callback for sending a NPC_MESSAGE. @@ -1507,6 +1530,23 @@ static int posY(lua_State *s) return 0; } +static int monster_class_on_update(lua_State *s) +{ + MonsterClass *monsterClass = LuaMonsterClass::check(s, 1); + luaL_checktype(s, 2, LUA_TFUNCTION); + monsterClass->setUpdateCallback(getScript(s)); + return 0; +} + +static int monster_class_on(lua_State *s) +{ + MonsterClass *monsterClass = LuaMonsterClass::check(s, 1); + const char *event = luaL_checkstring(s, 2); + luaL_checktype(s, 3, LUA_TFUNCTION); + monsterClass->setEventCallback(event, getScript(s)); + return 0; +} + /** * mana.monster_create(int id || string name, int x, int y): Monster* * Callback for creating a monster on the current map. @@ -1620,32 +1660,6 @@ static int monster_remove(lua_State *s) } /** - * mana.monster_load_script(Monster*, string script_filename): void - * loads a LUA script for the given monster. - */ -static int monster_load_script(lua_State *s) -{ - Monster *m = getMonster(s, 1); - if (!m) - { - raiseScriptError(s, "monster_load_script called " - "for a nonexistent monster."); - return 0; - } - - const char *scriptName = luaL_checkstring(s, 2); - if (scriptName[0] == 0) - { - raiseScriptError(s, "monster_load_script called " - "with empty script file name."); - return 0; - } - - m->loadScript(scriptName); - return 0; -} - -/** * mana.chr_get_chest(Character*, string): nil or string * Callback for getting a quest variable. Starts a recovery and returns * immediatly, if the variable is not known yet. @@ -1959,9 +1973,8 @@ static int chr_get_post(lua_State *s) /** * mana.being_register(Being*): void - * Makes the server call the lua functions deathEvent - * and removeEvent when the being dies or is removed - * from the map. + * Makes the server call the on_being_death and on_being_remove callbacks + * when the being dies or is removed from the map. */ static int being_register(lua_State *s) { @@ -2453,6 +2466,15 @@ static int is_walkable(lua_State *s) return 1; } +static int item_class_on(lua_State *s) +{ + ItemClass *itemClass = LuaItemClass::check(s, 1); + const char *event = luaL_checkstring(s, 2); + luaL_checktype(s, 3, LUA_TFUNCTION); + itemClass->setEventCallback(event, getScript(s)); + return 0; +} + /** * mana.drop_item(int x, int y, int id || string name[, int number]): bool * Creates an item stack on the floor. @@ -2651,6 +2673,14 @@ static int map_object_get_type(lua_State *s) return 1; } +static int status_effect_on_tick(lua_State *s) +{ + StatusEffect *statusEffect = LuaStatusEffect::check(s, 1); + luaL_checktype(s, 2, LUA_TFUNCTION); + statusEffect->setTickCallback(getScript(s)); + return 0; +} + /** * mana.announce(text [, sender]) * Does a global announce @@ -2719,6 +2749,9 @@ LuaScript::LuaScript(): { "on_craft", &on_craft }, { "on_use_special", &on_use_special }, { "on_get_special_recharge_cost", &on_get_special_recharge_cost }, + { "get_item_class", &get_item_class }, + { "get_monster_class", &get_monster_class }, + { "get_status_effect", &get_status_effect }, { "npc_create", &npc_create }, { "npc_message", &npc_message }, { "npc_choice", &npc_choice }, @@ -2761,7 +2794,6 @@ LuaScript::LuaScript(): { "monster_get_name", &monster_get_name }, { "monster_change_anger", &monster_change_anger }, { "monster_remove", &monster_remove }, - { "monster_load_script", &monster_load_script }, { "being_apply_status", &being_apply_status }, { "being_remove_status", &being_remove_status }, { "being_has_status", &being_has_status }, @@ -2809,6 +2841,11 @@ LuaScript::LuaScript(): luaL_register(mState, "mana", callbacks); lua_pop(mState, 1); // pop the 'mana' table + static luaL_Reg const members_ItemClass[] = { + { "on", &item_class_on }, + { NULL, NULL } + }; + static luaL_Reg const members_MapObject[] = { { "property", &map_object_get_property }, { "bounds", &map_object_get_bounds }, @@ -2817,7 +2854,21 @@ LuaScript::LuaScript(): { NULL, NULL } }; + static luaL_Reg const members_MonsterClass[] = { + { "on_update", &monster_class_on_update }, + { "on", &monster_class_on }, + { NULL, NULL } + }; + + static luaL_Reg const members_StatusEffect[] = { + { "on_tick", &status_effect_on_tick }, + { NULL, NULL } + }; + + LuaItemClass::registerType(mState, "ItemClass", members_ItemClass); LuaMapObject::registerType(mState, "MapObject", members_MapObject); + LuaMonsterClass::registerType(mState, "MonsterClass", members_MonsterClass); + LuaStatusEffect::registerType(mState, "StatusEffect", members_StatusEffect); // Make script object available to callback functions. lua_pushlightuserdata(mState, const_cast<char *>(®istryKey)); |