summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorErik Schilling <ablu.erikschilling@googlemail.com>2011-08-04 13:03:30 +0200
committerYohann Ferreira <yohann_dot_ferreira_at_orange_dot_efer>2011-08-04 20:13:14 +0200
commitebf0672a47c1d5c649bd6f6040d9112e1ba26382 (patch)
treea2a442e9ba061db2107578177633388f8285f29a
parentd11e7d49edb8374767d69859fe9ed542722013fe (diff)
downloadmanaserv-ebf0672a47c1d5c649bd6f6040d9112e1ba26382.tar.gz
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.lua2
-rw-r--r--src/scripting/lua.cpp90
2 files changed, 64 insertions, 28 deletions
diff --git a/example/serverdata/scripts/maps/desert.lua b/example/serverdata/scripts/maps/desert.lua
index 23b9535..b2eb9a4 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 69c8431..d1bb2b3 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);