#include "lua_api/l_internal.h"
#include "common/c_converter.h"
#include "common/c_content.h"
+#include "common/c_packer.h"
#include "itemdef.h"
#include "nodedef.h"
#include "server.h"
return 1;
}
+// get_short_description(self)
+int LuaItemStack::l_get_short_description(lua_State *L)
+{
+ NO_MAP_LOCK_REQUIRED;
+ LuaItemStack *o = checkobject(L, 1);
+ std::string desc = o->m_stack.getShortDescription(getGameDef(L)->idef());
+ lua_pushstring(L, desc.c_str());
+ return 1;
+}
+
// clear(self) -> true
int LuaItemStack::l_clear(lua_State *L)
{
NO_MAP_LOCK_REQUIRED;
LuaItemStack *o = checkobject(L, 1);
const ItemStack &item = o->m_stack;
- if (item.empty()) {
+ if(item.empty())
+ {
lua_pushnil(L);
- } else {
+ }
+ else
+ {
lua_newtable(L);
lua_pushstring(L, item.name.c_str());
lua_setfield(L, -2, "name");
lua_getfield(L, -1, "registered_items");
luaL_checktype(L, -1, LUA_TTABLE);
lua_getfield(L, -1, item.name.c_str());
- if (lua_isnil(L, -1)) {
+ if(lua_isnil(L, -1))
+ {
lua_pop(L, 1);
lua_getfield(L, -1, "unknown");
}
NO_MAP_LOCK_REQUIRED;
LuaItemStack *o = checkobject(L, 1);
ItemStack &item = o->m_stack;
- const ToolCapabilities &prop = item.getToolCapabilities(getGameDef(L)->idef());
+ const ToolCapabilities &prop =
+ item.getToolCapabilities(getGameDef(L)->idef());
push_tool_capabilities(L, prop);
return 1;
}
ItemStack newitem = read_item(L, 2, getGameDef(L)->idef());
ItemStack restitem;
bool fits = item.itemFits(newitem, &restitem, getGameDef(L)->idef());
- lua_pushboolean(L, fits); // first return value
- create(L, restitem); // second return value
+ lua_pushboolean(L, fits); // first return value
+ create(L, restitem); // second return value
return 2;
}
LuaItemStack *o = checkobject(L, 1);
ItemStack &item = o->m_stack;
u32 takecount = 1;
- if (!lua_isnone(L, 2))
+ if(!lua_isnone(L, 2))
takecount = luaL_checkinteger(L, 2);
ItemStack taken = item.takeItem(takecount);
create(L, taken);
LuaItemStack *o = checkobject(L, 1);
ItemStack &item = o->m_stack;
u32 peekcount = 1;
- if (!lua_isnone(L, 2))
+ if(!lua_isnone(L, 2))
peekcount = lua_tointeger(L, 2);
ItemStack peekaboo = item.peekItem(peekcount);
create(L, peekaboo);
return 1;
}
-LuaItemStack::LuaItemStack(const ItemStack &item) : m_stack(item)
+LuaItemStack::LuaItemStack(const ItemStack &item):
+ m_stack(item)
{
}
-const ItemStack &LuaItemStack::getItem() const
+const ItemStack& LuaItemStack::getItem() const
{
return m_stack;
}
-ItemStack &LuaItemStack::getItem()
+ItemStack& LuaItemStack::getItem()
{
return m_stack;
}
lua_setmetatable(L, -2);
return 1;
}
+
// Not callable from Lua
int LuaItemStack::create(lua_State *L, const ItemStack &item)
{
return *(LuaItemStack **)luaL_checkudata(L, narg, className);
}
+void *LuaItemStack::packIn(lua_State *L, int idx)
+{
+ LuaItemStack *o = checkobject(L, idx);
+ return new ItemStack(o->getItem());
+}
+
+void LuaItemStack::packOut(lua_State *L, void *ptr)
+{
+ ItemStack *stack = reinterpret_cast<ItemStack*>(ptr);
+ if (L)
+ create(L, *stack);
+ delete stack;
+}
+
void LuaItemStack::Register(lua_State *L)
{
lua_newtable(L);
lua_pushcfunction(L, mt_tostring);
lua_settable(L, metatable);
- lua_pop(L, 1); // drop metatable
+ lua_pop(L, 1); // drop metatable
- luaL_openlib(L, 0, methods, 0); // fill methodtable
- lua_pop(L, 1); // drop methodtable
+ luaL_register(L, nullptr, methods); // fill methodtable
+ lua_pop(L, 1); // drop methodtable
// Can be created from Lua (ItemStack(itemstack or itemstring or table or nil))
lua_register(L, className, create_object);
+
+ script_register_packer(L, className, packIn, packOut);
}
const char LuaItemStack::className[] = "ItemStack";
-const luaL_Reg LuaItemStack::methods[] = {luamethod(LuaItemStack, is_empty),
- luamethod(LuaItemStack, get_name), luamethod(LuaItemStack, set_name),
- luamethod(LuaItemStack, get_count), luamethod(LuaItemStack, set_count),
- luamethod(LuaItemStack, get_wear), luamethod(LuaItemStack, set_wear),
- luamethod(LuaItemStack, get_meta), luamethod(LuaItemStack, get_metadata),
- luamethod(LuaItemStack, set_metadata),
- luamethod(LuaItemStack, get_description), luamethod(LuaItemStack, clear),
- luamethod(LuaItemStack, replace), luamethod(LuaItemStack, to_string),
- luamethod(LuaItemStack, to_table), luamethod(LuaItemStack, get_stack_max),
- luamethod(LuaItemStack, get_free_space),
- luamethod(LuaItemStack, is_known),
- luamethod(LuaItemStack, get_definition),
- luamethod(LuaItemStack, get_tool_capabilities),
- luamethod(LuaItemStack, add_wear), luamethod(LuaItemStack, add_item),
- luamethod(LuaItemStack, item_fits), luamethod(LuaItemStack, take_item),
- luamethod(LuaItemStack, peek_item), {0, 0}};
+const luaL_Reg LuaItemStack::methods[] = {
+ luamethod(LuaItemStack, is_empty),
+ luamethod(LuaItemStack, get_name),
+ luamethod(LuaItemStack, set_name),
+ luamethod(LuaItemStack, get_count),
+ luamethod(LuaItemStack, set_count),
+ luamethod(LuaItemStack, get_wear),
+ luamethod(LuaItemStack, set_wear),
+ luamethod(LuaItemStack, get_meta),
+ luamethod(LuaItemStack, get_metadata),
+ luamethod(LuaItemStack, set_metadata),
+ luamethod(LuaItemStack, get_description),
+ luamethod(LuaItemStack, get_short_description),
+ luamethod(LuaItemStack, clear),
+ luamethod(LuaItemStack, replace),
+ luamethod(LuaItemStack, to_string),
+ luamethod(LuaItemStack, to_table),
+ luamethod(LuaItemStack, get_stack_max),
+ luamethod(LuaItemStack, get_free_space),
+ luamethod(LuaItemStack, is_known),
+ luamethod(LuaItemStack, get_definition),
+ luamethod(LuaItemStack, get_tool_capabilities),
+ luamethod(LuaItemStack, add_wear),
+ luamethod(LuaItemStack, add_item),
+ luamethod(LuaItemStack, item_fits),
+ luamethod(LuaItemStack, take_item),
+ luamethod(LuaItemStack, peek_item),
+ {0,0}
+};
/*
ItemDefinition
int table = 1;
// Get the writable item and node definition managers from the server
- IWritableItemDefManager *idef = getGameDef(L)->getWritableItemDefManager();
- NodeDefManager *ndef = getGameDef(L)->getWritableNodeDefManager();
+ IWritableItemDefManager *idef =
+ getGameDef(L)->getWritableItemDefManager();
+ NodeDefManager *ndef =
+ getGameDef(L)->getWritableNodeDefManager();
// Check if name is defined
std::string name;
lua_getfield(L, table, "name");
- if (lua_isstring(L, -1)) {
+ if(lua_isstring(L, -1)){
name = readParam<std::string>(L, -1);
} else {
throw LuaError("register_item_raw: name is not defined or not a string");
// Default to having client-side placement prediction for nodes
// ("" in item definition sets it off)
- if (def.node_placement_prediction == "__default") {
- if (def.type == ITEM_NODE)
+ if(def.node_placement_prediction == "__default"){
+ if(def.type == ITEM_NODE)
def.node_placement_prediction = name;
else
def.node_placement_prediction = "";
// Read the node definition (content features) and register it
if (def.type == ITEM_NODE) {
- ContentFeatures f = read_content_features(L, table);
+ ContentFeatures f;
+ read_content_features(L, f, table);
// when a mod reregisters ignore, only texture changes and such should
// be done
if (f.name == "ignore")
return 0;
+ // This would break everything
+ if (f.name.empty())
+ throw LuaError("Cannot register node with empty name");
content_t id = ndef->set(f.name, f);
if (id > MAX_REGISTERED_CONTENT) {
- throw LuaError("Number of registerable nodes (" +
- itos(MAX_REGISTERED_CONTENT + 1) +
- ") exceeded (" + name + ")");
+ throw LuaError("Number of registerable nodes ("
+ + itos(MAX_REGISTERED_CONTENT+1)
+ + ") exceeded (" + name + ")");
}
+
}
-
+
return 0; /* number of results */
}
NO_MAP_LOCK_REQUIRED;
std::string name = luaL_checkstring(L, 1);
- IWritableItemDefManager *idef = getGameDef(L)->getWritableItemDefManager();
+ IWritableItemDefManager *idef =
+ getGameDef(L)->getWritableItemDefManager();
// Unregister the node
if (idef->get(name).type == ITEM_NODE) {
- NodeDefManager *ndef = getGameDef(L)->getWritableNodeDefManager();
+ NodeDefManager *ndef =
+ getGameDef(L)->getWritableNodeDefManager();
ndef->removeNode(name);
}
std::string convert_to = luaL_checkstring(L, 2);
// Get the writable item definition manager from the server
- IWritableItemDefManager *idef = getGameDef(L)->getWritableItemDefManager();
+ IWritableItemDefManager *idef =
+ getGameDef(L)->getWritableItemDefManager();
idef->registerAlias(name, convert_to);
NO_MAP_LOCK_REQUIRED;
std::string name = luaL_checkstring(L, 1);
- const IItemDefManager *idef = getGameDef(L)->getItemDefManager();
- const NodeDefManager *ndef = getGameDef(L)->getNodeDefManager();
+ const IItemDefManager *idef = getGameDef(L)->idef();
+ const NodeDefManager *ndef = getGameDef(L)->ndef();
// If this is called at mod load time, NodeDefManager isn't aware of
// aliases yet, so we need to handle them manually
content_t content_id;
if (alias_name != name) {
if (!ndef->getId(alias_name, content_id))
- throw LuaError("Unknown node: " + alias_name + " (from alias " +
- name + ")");
+ throw LuaError("Unknown node: " + alias_name +
+ " (from alias " + name + ")");
} else if (!ndef->getId(name, content_id)) {
throw LuaError("Unknown node: " + name);
}
NO_MAP_LOCK_REQUIRED;
content_t c = luaL_checkint(L, 1);
- const NodeDefManager *ndef = getGameDef(L)->getNodeDefManager();
+ const NodeDefManager *ndef = getGameDef(L)->ndef();
const char *name = ndef->get(c).name.c_str();
lua_pushstring(L, name);
API_FCT(get_content_id);
API_FCT(get_name_from_content_id);
}
+
+void ModApiItemMod::InitializeAsync(lua_State *L, int top)
+{
+ // all read-only functions
+ API_FCT(get_content_id);
+ API_FCT(get_name_from_content_id);
+}