Check for inventory existence before serializing, and do not create it again if it already exists.

master
orwell96 2018-06-19 19:49:24 +02:00
parent eab240bdce
commit 08ac0f9c05
2 changed files with 24 additions and 17 deletions

View File

@ -281,7 +281,10 @@ advtrains.avt_save = function(remove_players_from_wagons)
local _,proto = advtrains.get_wagon_prototype(wdata)
if proto.has_inventory then
local inv=minetest.get_inventory({type="detached", name="advtrains_wgn_"..id})
wdata.ser_inv=advtrains.serialize_inventory(inv)
if inv then -- inventory is not initialized when wagon was never loaded
-- TOOD: What happens with unloading rails when they don't find the inventory?
wdata.ser_inv=advtrains.serialize_inventory(inv)
end
end
-- TODO apply save-keys here too
end

View File

@ -77,23 +77,27 @@ function wagon:set_id(wid)
if self.has_inventory then
--to be used later
local inv=minetest.create_detached_inventory("advtrains_wgn_"..self.id, {
allow_move = function(inv, from_list, from_index, to_list, to_index, count, player)
return invcallback(wid, player:get_player_name(), count, 0)
end,
allow_put = function(inv, listname, index, stack, player)
return invcallback(wid, player:get_player_name(), stack:get_count(), 0)
end,
allow_take = function(inv, listname, index, stack, player)
return invcallback(wid, player:get_player_name(), stack:get_count(), 0)
local inv=minetest.get_inventory({type="detached", name="advtrains_wgn_"..self.id})
-- create inventory, if not yet created
if not inv then
inv=minetest.create_detached_inventory("advtrains_wgn_"..self.id, {
allow_move = function(inv, from_list, from_index, to_list, to_index, count, player)
return invcallback(wid, player:get_player_name(), count, 0)
end,
allow_put = function(inv, listname, index, stack, player)
return invcallback(wid, player:get_player_name(), stack:get_count(), 0)
end,
allow_take = function(inv, listname, index, stack, player)
return invcallback(wid, player:get_player_name(), stack:get_count(), 0)
end
})
if data.ser_inv then
advtrains.deserialize_inventory(data.ser_inv, inv)
end
})
if data.ser_inv then
advtrains.deserialize_inventory(data.ser_inv, inv)
end
if self.inventory_list_sizes then
for lst, siz in pairs(self.inventory_list_sizes) do
inv:set_size(lst, siz)
if self.inventory_list_sizes then
for lst, siz in pairs(self.inventory_list_sizes) do
inv:set_size(lst, siz)
end
end
end
end