diff options
Diffstat (limited to 'src/scripting/lua.cpp')
-rw-r--r-- | src/scripting/lua.cpp | 90 |
1 files changed, 63 insertions, 27 deletions
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); |