diff options
author | Erik Schilling <ablu.erikschilling@googlemail.com> | 2011-08-04 13:03:30 +0200 |
---|---|---|
committer | Yohann Ferreira <yohann_dot_ferreira_at_orange_dot_efer> | 2011-08-04 20:13:14 +0200 |
commit | ebf0672a47c1d5c649bd6f6040d9112e1ba26382 (patch) | |
tree | a2a442e9ba061db2107578177633388f8285f29a | |
parent | d11e7d49edb8374767d69859fe9ed542722013fe (diff) | |
download | manaserv-ebf0672a47c1d5c649bd6f6040d9112e1ba26382.tar.gz manaserv-ebf0672a47c1d5c649bd6f6040d9112e1ba26382.tar.bz2 manaserv-ebf0672a47c1d5c649bd6f6040d9112e1ba26382.tar.xz manaserv-ebf0672a47c1d5c649bd6f6040d9112e1ba26382.zip |
Allowed names of items and monsters in scripts - part 1.
You can now use either the name or the id of the item in the LUA
functions chr_inv_change, monster_create, item_drop.
Part of: Mana-Mantis #318.
Reviewed-by: Bertram.
-rw-r--r-- | example/serverdata/scripts/maps/desert.lua | 2 | ||||
-rw-r--r-- | src/scripting/lua.cpp | 90 |
2 files changed, 64 insertions, 28 deletions
diff --git a/example/serverdata/scripts/maps/desert.lua b/example/serverdata/scripts/maps/desert.lua index 23b95350..b2eb9a46 100644 --- a/example/serverdata/scripts/maps/desert.lua +++ b/example/serverdata/scripts/maps/desert.lua @@ -98,6 +98,6 @@ function Tamer(npc, ch, list) end end - local m1 = mana.monster_create(1, mana.posX(ch), mana.posY(ch)) + local m1 = mana.monster_create("Maggot", mana.posX(ch), mana.posY(ch)) schedule_in(0.5, function() mana.being_say(m1, "Roaaarrrr!!!") end) end diff --git a/src/scripting/lua.cpp b/src/scripting/lua.cpp index 69c84311..d1bb2b35 100644 --- a/src/scripting/lua.cpp +++ b/src/scripting/lua.cpp @@ -343,7 +343,8 @@ static int chr_warp(lua_State *s) } /** - * mana.chr_inv_change(Character*, (int id, int nb)...): bool success + * mana.chr_inv_change(Character*, (int id || string name, + * int nb)...): bool success * Callback for inserting/removing items in inventory. * The function can be called several times in a row, but it is better to * perform all the changes at once, so as to reduce bandwidth. Removals @@ -368,21 +369,40 @@ static int chr_inv_change(lua_State *s) Inventory inv(q, true); for (int i = 0; i < nb_items; ++i) { - if (!lua_isnumber(s, i * 2 + 2) || !lua_isnumber(s, i * 2 + 3)) + if (!(lua_isnumber(s, i * 2 + 2) || lua_isstring(s, i * 2 + 2)) || + !lua_isnumber(s, i * 2 + 3)) { - raiseScriptError(s, "chr_inv_change called " - "with incorrect parameters."); + raiseScriptError(s, "chr_inv_change called with " + "incorrect parameters."); return 0; } - int id = lua_tointeger(s, i * 2 + 2); int nb = lua_tointeger(s, i * 2 + 3); - if (id == 0) + ItemClass *ic; + int id; + if (lua_isnumber(s, i * 2 + 2)) { - LOG_WARN("chr_inv_change called with id 0! " - "Currency is now handled through attributes!"); + int id = lua_tointeger(s, i * 2 + 2); + if (id == 0) + { + LOG_WARN("chr_inv_change called with id 0! " + "Currency is now handled through attributes!"); + continue; + } + ic = itemManager->getItem(id); } - else if (nb < 0) + else + { + ic = itemManager->getItemByName(lua_tostring(s, i * 2 + 2)); + } + + if (!ic) + { + raiseScriptError(s, "chr_inv_change called with an unknown item."); + continue; + } + id = ic->getDatabaseID(); + if (nb < 0) { nb = inv.remove(id, -nb); if (nb) @@ -394,13 +414,6 @@ static int chr_inv_change(lua_State *s) } else { - ItemClass *ic = itemManager->getItem(id); - if (!ic) - { - raiseScriptError(s, "chr_inv_change called " - "with an unknown item."); - continue; - } nb = inv.insert(id, nb); if (nb) { @@ -1005,12 +1018,11 @@ static int posY(lua_State *s) } /** - * mana.monster_create(int type, int x, int y): Monster* + * mana.monster_create(int id || string name, int x, int y): Monster* * Callback for creating a monster on the current map. */ static int monster_create(lua_State *s) { - const int monsterId = luaL_checkint(s, 1); const int x = luaL_checkint(s, 2); const int y = luaL_checkint(s, 3); @@ -1024,12 +1036,31 @@ static int monster_create(lua_State *s) return 0; } - MonsterClass *spec = monsterManager->getMonster(monsterId); - if (!spec) + MonsterClass *spec; + if (lua_isnumber(s, 1)) { - raiseScriptError(s, "monster_create called " - "with invalid monster Id: %d", monsterId); - return 0; + int monsterId = luaL_checkint(s, 1); + spec = monsterManager->getMonster(monsterId); + if (!spec) + { + raiseScriptError(s, "monster_create called with invalid " + "monster ID: %d", monsterId); + //LOG_WARN("LuaMonster_Create invalid monster ID: " << monsterId); + return 0; + } + } + else + { + std::string monsterName = lua_tostring(s, 1); + spec = monsterManager->getMonsterByName(monsterName); + if (!spec) + { + raiseScriptError(s, "monster_create called with " + "invalid monster name: %s", monsterName.c_str()); + //LOG_WARN("LuaMonster_Create invalid monster name: " + // << monsterName); + return 0; + } } Monster *q = new Monster(spec); @@ -1900,20 +1931,25 @@ static int is_walkable(lua_State *s) } /** - * mana.drop_item(int x, int y, int id[, int number]): void + * mana.drop_item(int x, int y, int id || string name[, int number]): void * Creates an item stack on the floor. */ static int item_drop(lua_State *s) { const int x = luaL_checkint(s, 1); const int y = luaL_checkint(s, 2); - const int type = luaL_checkint(s, 3); const int number = luaL_optint(s, 4, 1); - ItemClass *ic = itemManager->getItem(type); + ItemClass *ic; + if (lua_isnumber(s, 3)) + ic = itemManager->getItem(lua_tointeger(s, 3)); + else + ic = itemManager->getItemByName(lua_tostring(s, 3)); + if (!ic) { - raiseScriptError(s, "item_drop called with unknown item ID"); + raiseScriptError(s, "item_drop called with unknown item id or name."); + return 0; } Item *i = new Item(ic, number); |