Inventory: show error on invalid list names (#11368)

This commit is contained in:
SmallJoker 2021-06-20 17:21:50 +02:00 committed by GitHub
parent b10091be9b
commit 2db6b07de1
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 15 additions and 12 deletions

View File

@ -298,6 +298,7 @@ public:
void serialize(std::ostream &os, bool incremental = false) const; void serialize(std::ostream &os, bool incremental = false) const;
void deSerialize(std::istream &is); void deSerialize(std::istream &is);
// Adds a new list or clears and resizes an existing one
InventoryList * addList(const std::string &name, u32 size); InventoryList * addList(const std::string &name, u32 size);
InventoryList * getList(const std::string &name); InventoryList * getList(const std::string &name);
const InventoryList * getList(const std::string &name) const; const InventoryList * getList(const std::string &name) const;

View File

@ -1350,26 +1350,28 @@ void read_inventory_list(lua_State *L, int tableindex,
{ {
if(tableindex < 0) if(tableindex < 0)
tableindex = lua_gettop(L) + 1 + tableindex; tableindex = lua_gettop(L) + 1 + tableindex;
// If nil, delete list // If nil, delete list
if(lua_isnil(L, tableindex)){ if(lua_isnil(L, tableindex)){
inv->deleteList(name); inv->deleteList(name);
return; return;
} }
// Otherwise set list
// Get Lua-specified items to insert into the list
std::vector<ItemStack> items = read_items(L, tableindex,srv); std::vector<ItemStack> items = read_items(L, tableindex,srv);
int listsize = (forcesize != -1) ? forcesize : items.size(); size_t listsize = (forcesize > 0) ? forcesize : items.size();
// Create or clear list
InventoryList *invlist = inv->addList(name, listsize); InventoryList *invlist = inv->addList(name, listsize);
int index = 0; if (!invlist) {
for(std::vector<ItemStack>::const_iterator luaL_error(L, "inventory list: cannot create list named '%s'", name);
i = items.begin(); i != items.end(); ++i){ return;
if(forcesize != -1 && index == forcesize)
break;
invlist->changeItem(index, *i);
index++;
} }
while(forcesize != -1 && index < forcesize){
invlist->deleteItem(index); for (size_t i = 0; i < items.size(); ++i) {
index++; if (i == listsize)
break; // Truncate provided list of items
invlist->changeItem(i, items[i]);
} }
} }