aboutsummaryrefslogtreecommitdiff
path: root/src/script/lua_api/l_item.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/script/lua_api/l_item.cpp')
-rw-r--r--src/script/lua_api/l_item.cpp95
1 files changed, 35 insertions, 60 deletions
diff --git a/src/script/lua_api/l_item.cpp b/src/script/lua_api/l_item.cpp
index bf73e78c1..c555e90fd 100644
--- a/src/script/lua_api/l_item.cpp
+++ b/src/script/lua_api/l_item.cpp
@@ -41,7 +41,7 @@ int LuaItemStack::gc_object(lua_State *L)
// __tostring metamethod
int LuaItemStack::mt_tostring(lua_State *L)
{
- LuaItemStack *o = checkobject(L, 1);
+ LuaItemStack *o = checkObject<LuaItemStack>(L, 1);
std::string itemstring = o->m_stack.getItemString(false);
lua_pushfstring(L, "ItemStack(\"%s\")", itemstring.c_str());
return 1;
@@ -51,7 +51,7 @@ int LuaItemStack::mt_tostring(lua_State *L)
int LuaItemStack::l_is_empty(lua_State *L)
{
NO_MAP_LOCK_REQUIRED;
- LuaItemStack *o = checkobject(L, 1);
+ LuaItemStack *o = checkObject<LuaItemStack>(L, 1);
ItemStack &item = o->m_stack;
lua_pushboolean(L, item.empty());
return 1;
@@ -61,7 +61,7 @@ int LuaItemStack::l_is_empty(lua_State *L)
int LuaItemStack::l_get_name(lua_State *L)
{
NO_MAP_LOCK_REQUIRED;
- LuaItemStack *o = checkobject(L, 1);
+ LuaItemStack *o = checkObject<LuaItemStack>(L, 1);
ItemStack &item = o->m_stack;
lua_pushstring(L, item.name.c_str());
return 1;
@@ -71,7 +71,7 @@ int LuaItemStack::l_get_name(lua_State *L)
int LuaItemStack::l_set_name(lua_State *L)
{
NO_MAP_LOCK_REQUIRED;
- LuaItemStack *o = checkobject(L, 1);
+ LuaItemStack *o = checkObject<LuaItemStack>(L, 1);
ItemStack &item = o->m_stack;
bool status = true;
@@ -89,7 +89,7 @@ int LuaItemStack::l_set_name(lua_State *L)
int LuaItemStack::l_get_count(lua_State *L)
{
NO_MAP_LOCK_REQUIRED;
- LuaItemStack *o = checkobject(L, 1);
+ LuaItemStack *o = checkObject<LuaItemStack>(L, 1);
ItemStack &item = o->m_stack;
lua_pushinteger(L, item.count);
return 1;
@@ -99,7 +99,7 @@ int LuaItemStack::l_get_count(lua_State *L)
int LuaItemStack::l_set_count(lua_State *L)
{
NO_MAP_LOCK_REQUIRED;
- LuaItemStack *o = checkobject(L, 1);
+ LuaItemStack *o = checkObject<LuaItemStack>(L, 1);
ItemStack &item = o->m_stack;
bool status;
@@ -120,7 +120,7 @@ int LuaItemStack::l_set_count(lua_State *L)
int LuaItemStack::l_get_wear(lua_State *L)
{
NO_MAP_LOCK_REQUIRED;
- LuaItemStack *o = checkobject(L, 1);
+ LuaItemStack *o = checkObject<LuaItemStack>(L, 1);
ItemStack &item = o->m_stack;
lua_pushinteger(L, item.wear);
return 1;
@@ -130,7 +130,7 @@ int LuaItemStack::l_get_wear(lua_State *L)
int LuaItemStack::l_set_wear(lua_State *L)
{
NO_MAP_LOCK_REQUIRED;
- LuaItemStack *o = checkobject(L, 1);
+ LuaItemStack *o = checkObject<LuaItemStack>(L, 1);
ItemStack &item = o->m_stack;
bool status;
@@ -151,7 +151,7 @@ int LuaItemStack::l_set_wear(lua_State *L)
int LuaItemStack::l_get_meta(lua_State *L)
{
NO_MAP_LOCK_REQUIRED;
- LuaItemStack *o = checkobject(L, 1);
+ LuaItemStack *o = checkObject<LuaItemStack>(L, 1);
ItemStackMetaRef::create(L, o);
return 1;
}
@@ -161,7 +161,7 @@ int LuaItemStack::l_get_meta(lua_State *L)
int LuaItemStack::l_get_metadata(lua_State *L)
{
NO_MAP_LOCK_REQUIRED;
- LuaItemStack *o = checkobject(L, 1);
+ LuaItemStack *o = checkObject<LuaItemStack>(L, 1);
ItemStack &item = o->m_stack;
const std::string &value = item.metadata.getString("");
lua_pushlstring(L, value.c_str(), value.size());
@@ -173,7 +173,7 @@ int LuaItemStack::l_get_metadata(lua_State *L)
int LuaItemStack::l_set_metadata(lua_State *L)
{
NO_MAP_LOCK_REQUIRED;
- LuaItemStack *o = checkobject(L, 1);
+ LuaItemStack *o = checkObject<LuaItemStack>(L, 1);
ItemStack &item = o->m_stack;
size_t len = 0;
@@ -188,7 +188,7 @@ int LuaItemStack::l_set_metadata(lua_State *L)
int LuaItemStack::l_get_description(lua_State *L)
{
NO_MAP_LOCK_REQUIRED;
- LuaItemStack *o = checkobject(L, 1);
+ LuaItemStack *o = checkObject<LuaItemStack>(L, 1);
std::string desc = o->m_stack.getDescription(getGameDef(L)->idef());
lua_pushstring(L, desc.c_str());
return 1;
@@ -198,7 +198,7 @@ int LuaItemStack::l_get_description(lua_State *L)
int LuaItemStack::l_get_short_description(lua_State *L)
{
NO_MAP_LOCK_REQUIRED;
- LuaItemStack *o = checkobject(L, 1);
+ LuaItemStack *o = checkObject<LuaItemStack>(L, 1);
std::string desc = o->m_stack.getShortDescription(getGameDef(L)->idef());
lua_pushstring(L, desc.c_str());
return 1;
@@ -208,7 +208,7 @@ int LuaItemStack::l_get_short_description(lua_State *L)
int LuaItemStack::l_clear(lua_State *L)
{
NO_MAP_LOCK_REQUIRED;
- LuaItemStack *o = checkobject(L, 1);
+ LuaItemStack *o = checkObject<LuaItemStack>(L, 1);
o->m_stack.clear();
lua_pushboolean(L, true);
return 1;
@@ -218,7 +218,7 @@ int LuaItemStack::l_clear(lua_State *L)
int LuaItemStack::l_replace(lua_State *L)
{
NO_MAP_LOCK_REQUIRED;
- LuaItemStack *o = checkobject(L, 1);
+ LuaItemStack *o = checkObject<LuaItemStack>(L, 1);
o->m_stack = read_item(L, 2, getGameDef(L)->idef());
lua_pushboolean(L, true);
return 1;
@@ -228,7 +228,7 @@ int LuaItemStack::l_replace(lua_State *L)
int LuaItemStack::l_to_string(lua_State *L)
{
NO_MAP_LOCK_REQUIRED;
- LuaItemStack *o = checkobject(L, 1);
+ LuaItemStack *o = checkObject<LuaItemStack>(L, 1);
std::string itemstring = o->m_stack.getItemString();
lua_pushstring(L, itemstring.c_str());
return 1;
@@ -238,7 +238,7 @@ int LuaItemStack::l_to_string(lua_State *L)
int LuaItemStack::l_to_table(lua_State *L)
{
NO_MAP_LOCK_REQUIRED;
- LuaItemStack *o = checkobject(L, 1);
+ LuaItemStack *o = checkObject<LuaItemStack>(L, 1);
const ItemStack &item = o->m_stack;
if(item.empty())
{
@@ -278,7 +278,7 @@ int LuaItemStack::l_to_table(lua_State *L)
int LuaItemStack::l_get_stack_max(lua_State *L)
{
NO_MAP_LOCK_REQUIRED;
- LuaItemStack *o = checkobject(L, 1);
+ LuaItemStack *o = checkObject<LuaItemStack>(L, 1);
ItemStack &item = o->m_stack;
lua_pushinteger(L, item.getStackMax(getGameDef(L)->idef()));
return 1;
@@ -288,7 +288,7 @@ int LuaItemStack::l_get_stack_max(lua_State *L)
int LuaItemStack::l_get_free_space(lua_State *L)
{
NO_MAP_LOCK_REQUIRED;
- LuaItemStack *o = checkobject(L, 1);
+ LuaItemStack *o = checkObject<LuaItemStack>(L, 1);
ItemStack &item = o->m_stack;
lua_pushinteger(L, item.freeSpace(getGameDef(L)->idef()));
return 1;
@@ -299,7 +299,7 @@ int LuaItemStack::l_get_free_space(lua_State *L)
int LuaItemStack::l_is_known(lua_State *L)
{
NO_MAP_LOCK_REQUIRED;
- LuaItemStack *o = checkobject(L, 1);
+ LuaItemStack *o = checkObject<LuaItemStack>(L, 1);
ItemStack &item = o->m_stack;
bool is_known = item.isKnown(getGameDef(L)->idef());
lua_pushboolean(L, is_known);
@@ -312,7 +312,7 @@ int LuaItemStack::l_is_known(lua_State *L)
int LuaItemStack::l_get_definition(lua_State *L)
{
NO_MAP_LOCK_REQUIRED;
- LuaItemStack *o = checkobject(L, 1);
+ LuaItemStack *o = checkObject<LuaItemStack>(L, 1);
ItemStack &item = o->m_stack;
// Get registered_items[name]
@@ -334,7 +334,7 @@ int LuaItemStack::l_get_definition(lua_State *L)
int LuaItemStack::l_get_tool_capabilities(lua_State *L)
{
NO_MAP_LOCK_REQUIRED;
- LuaItemStack *o = checkobject(L, 1);
+ LuaItemStack *o = checkObject<LuaItemStack>(L, 1);
ItemStack &item = o->m_stack;
const ToolCapabilities &prop =
item.getToolCapabilities(getGameDef(L)->idef());
@@ -349,7 +349,7 @@ int LuaItemStack::l_get_tool_capabilities(lua_State *L)
int LuaItemStack::l_add_wear(lua_State *L)
{
NO_MAP_LOCK_REQUIRED;
- LuaItemStack *o = checkobject(L, 1);
+ LuaItemStack *o = checkObject<LuaItemStack>(L, 1);
ItemStack &item = o->m_stack;
int amount = lua_tointeger(L, 2);
bool result = item.addWear(amount, getGameDef(L)->idef());
@@ -367,7 +367,7 @@ int LuaItemStack::l_add_wear(lua_State *L)
int LuaItemStack::l_add_wear_by_uses(lua_State *L)
{
NO_MAP_LOCK_REQUIRED;
- LuaItemStack *o = checkobject(L, 1);
+ LuaItemStack *o = checkObject<LuaItemStack>(L, 1);
ItemStack &item = o->m_stack;
u32 max_uses = readParam<int>(L, 2);
u32 add_wear = calculateResultWear(max_uses, item.wear);
@@ -381,7 +381,7 @@ int LuaItemStack::l_add_wear_by_uses(lua_State *L)
int LuaItemStack::l_add_item(lua_State *L)
{
NO_MAP_LOCK_REQUIRED;
- LuaItemStack *o = checkobject(L, 1);
+ LuaItemStack *o = checkObject<LuaItemStack>(L, 1);
ItemStack &item = o->m_stack;
ItemStack newitem = read_item(L, -1, getGameDef(L)->idef());
ItemStack leftover = item.addItem(newitem, getGameDef(L)->idef());
@@ -395,7 +395,7 @@ int LuaItemStack::l_add_item(lua_State *L)
int LuaItemStack::l_item_fits(lua_State *L)
{
NO_MAP_LOCK_REQUIRED;
- LuaItemStack *o = checkobject(L, 1);
+ LuaItemStack *o = checkObject<LuaItemStack>(L, 1);
ItemStack &item = o->m_stack;
ItemStack newitem = read_item(L, 2, getGameDef(L)->idef());
ItemStack restitem;
@@ -409,7 +409,7 @@ int LuaItemStack::l_item_fits(lua_State *L)
int LuaItemStack::l_take_item(lua_State *L)
{
NO_MAP_LOCK_REQUIRED;
- LuaItemStack *o = checkobject(L, 1);
+ LuaItemStack *o = checkObject<LuaItemStack>(L, 1);
ItemStack &item = o->m_stack;
u32 takecount = 1;
if(!lua_isnone(L, 2))
@@ -423,7 +423,7 @@ int LuaItemStack::l_take_item(lua_State *L)
int LuaItemStack::l_peek_item(lua_State *L)
{
NO_MAP_LOCK_REQUIRED;
- LuaItemStack *o = checkobject(L, 1);
+ LuaItemStack *o = checkObject<LuaItemStack>(L, 1);
ItemStack &item = o->m_stack;
u32 peekcount = 1;
if(!lua_isnone(L, 2))
@@ -464,14 +464,9 @@ int LuaItemStack::create(lua_State *L, const ItemStack &item)
return 1;
}
-LuaItemStack *LuaItemStack::checkobject(lua_State *L, int narg)
-{
- return *(LuaItemStack **)luaL_checkudata(L, narg, className);
-}
-
void *LuaItemStack::packIn(lua_State *L, int idx)
{
- LuaItemStack *o = checkobject(L, idx);
+ LuaItemStack *o = checkObject<LuaItemStack>(L, idx);
return new ItemStack(o->getItem());
}
@@ -485,32 +480,12 @@ void LuaItemStack::packOut(lua_State *L, void *ptr)
void LuaItemStack::Register(lua_State *L)
{
- lua_newtable(L);
- int methodtable = lua_gettop(L);
- luaL_newmetatable(L, className);
- int metatable = lua_gettop(L);
-
- // hide metatable from Lua getmetatable()
- lua_pushliteral(L, "__metatable");
- lua_pushvalue(L, methodtable);
- lua_settable(L, metatable);
-
- lua_pushliteral(L, "__index");
- lua_pushvalue(L, methodtable);
- lua_settable(L, metatable);
-
- lua_pushliteral(L, "__gc");
- lua_pushcfunction(L, gc_object);
- lua_settable(L, metatable);
-
- lua_pushliteral(L, "__tostring");
- lua_pushcfunction(L, mt_tostring);
- lua_settable(L, metatable);
-
- lua_pop(L, 1); // drop metatable
-
- luaL_register(L, nullptr, methods); // fill methodtable
- lua_pop(L, 1); // drop methodtable
+ static const luaL_Reg metamethods[] = {
+ {"__tostring", mt_tostring},
+ {"__gc", gc_object},
+ {0, 0}
+ };
+ registerClass(L, className, methods, metamethods);
// Can be created from Lua (ItemStack(itemstack or itemstring or table or nil))
lua_register(L, className, create_object);