1
0
Fork 0
mirror of https://github.com/luanti-org/luanti.git synced 2025-06-27 16:36:03 +00:00

Fix the documentation of InvRef:get_lists() and clean up code (#12150)

This commit is contained in:
DS 2022-03-29 18:06:16 +02:00 committed by GitHub
parent 0f25fa7af6
commit 8d387433b1
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
10 changed files with 56 additions and 96 deletions

View file

@ -1351,17 +1351,22 @@ void push_tool_capabilities(lua_State *L,
}
/******************************************************************************/
void push_inventory_list(lua_State *L, Inventory *inv, const char *name)
void push_inventory_list(lua_State *L, const InventoryList &invlist)
{
InventoryList *invlist = inv->getList(name);
if(invlist == NULL){
lua_pushnil(L);
return;
push_items(L, invlist.getItems());
}
/******************************************************************************/
void push_inventory_lists(lua_State *L, const Inventory &inv)
{
const auto &lists = inv.getLists();
lua_createtable(L, 0, lists.size());
for(const InventoryList *list : lists) {
const std::string &name = list->getName();
lua_pushlstring(L, name.c_str(), name.size());
push_inventory_list(L, *list);
lua_rawset(L, -3);
}
std::vector<ItemStack> items;
for(u32 i=0; i<invlist->getSize(); i++)
items.push_back(invlist->getItem(i));
push_items(L, items);
}
/******************************************************************************/

View file

@ -55,6 +55,7 @@ struct ObjectProperties;
struct SimpleSoundSpec;
struct ServerSoundParams;
class Inventory;
class InventoryList;
struct NodeBox;
struct ContentFeatures;
struct TileDef;
@ -120,8 +121,9 @@ void push_object_properties (lua_State *L,
ObjectProperties *prop);
void push_inventory_list (lua_State *L,
Inventory *inv,
const char *name);
const InventoryList &invlist);
void push_inventory_lists (lua_State *L,
const Inventory &inv);
void read_inventory_list (lua_State *L, int tableindex,
Inventory *inv, const char *name,
Server *srv, int forcesize=-1);

View file

@ -281,15 +281,7 @@ bool ScriptApiClient::on_inventory_open(Inventory *inventory)
lua_getglobal(L, "core");
lua_getfield(L, -1, "registered_on_inventory_open");
std::vector<const InventoryList*> lists = inventory->getLists();
std::vector<const InventoryList*>::iterator iter = lists.begin();
lua_createtable(L, 0, lists.size());
for (; iter != lists.end(); iter++) {
const char* name = (*iter)->getName().c_str();
lua_pushstring(L, name);
push_inventory_list(L, inventory, name);
lua_rawset(L, -3);
}
push_inventory_lists(L, *inventory);
try {
runCallbacks(1, RUN_CALLBACKS_MODE_OR);

View file

@ -214,11 +214,16 @@ int InvRef::l_get_list(lua_State *L)
InvRef *ref = checkobject(L, 1);
const char *listname = luaL_checkstring(L, 2);
Inventory *inv = getinv(L, ref);
if(inv){
push_inventory_list(L, inv, listname);
} else {
if (!inv) {
lua_pushnil(L);
return 1;
}
InventoryList *invlist = inv->getList(listname);
if (!invlist) {
lua_pushnil(L);
return 1;
}
push_inventory_list(L, *invlist);
return 1;
}
@ -242,7 +247,7 @@ int InvRef::l_set_list(lua_State *L)
return 0;
}
// get_lists(self) -> list of InventoryLists
// get_lists(self) -> table that maps listnames to InventoryLists
int InvRef::l_get_lists(lua_State *L)
{
NO_MAP_LOCK_REQUIRED;
@ -251,15 +256,7 @@ int InvRef::l_get_lists(lua_State *L)
if (!inv) {
return 0;
}
std::vector<const InventoryList*> lists = inv->getLists();
std::vector<const InventoryList*>::iterator iter = lists.begin();
lua_createtable(L, 0, lists.size());
for (; iter != lists.end(); iter++) {
const char* name = (*iter)->getName().c_str();
lua_pushstring(L, name);
push_inventory_list(L, inv, name);
lua_rawset(L, -3);
}
push_inventory_lists(L, *inv);
return 1;
}

View file

@ -127,18 +127,14 @@ void NodeMetaRef::handleToTable(lua_State *L, Metadata *_meta)
// fields
MetaDataRef::handleToTable(L, _meta);
NodeMetadata *meta = (NodeMetadata*) _meta;
NodeMetadata *meta = (NodeMetadata *) _meta;
// inventory
lua_newtable(L);
Inventory *inv = meta->getInventory();
if (inv) {
std::vector<const InventoryList *> lists = inv->getLists();
for(std::vector<const InventoryList *>::const_iterator
i = lists.begin(); i != lists.end(); ++i) {
push_inventory_list(L, inv, (*i)->getName().c_str());
lua_setfield(L, -2, (*i)->getName().c_str());
}
push_inventory_lists(L, *inv);
} else {
lua_newtable(L);
}
lua_setfield(L, -2, "inventory");
}