diff options
author | BadToad2000 <jameson.miller@outlook.com> | 2016-02-28 23:34:13 -0600 |
---|---|---|
committer | BadToad2000 <jameson.miller@outlook.com> | 2016-02-28 23:34:13 -0600 |
commit | 3cdfdd14a5ac1de36f41981a6ed69b0f9f2fd90d (patch) | |
tree | 655b49802a2393277ac9472e3fa2919da4701d7b /bags.lua | |
parent | bdf9b61779b454e687b81e2dc3df7edc8a52e68b (diff) |
When attempting to replace a bag with a smaller bag, ensure the items beyond the last index of the smaller bag are not lost.
If there is sufficient space in the smaller bag, move the items to the front.
Otherwise disallow the replacement.
Diffstat (limited to 'bags.lua')
-rw-r--r-- | bags.lua | 33 |
1 files changed, 29 insertions, 4 deletions
@@ -144,11 +144,36 @@ minetest.register_on_joinplayer(function(player) player:get_inventory():set_stack(listname, index, nil) end, allow_put = function(inv, listname, index, stack, player) - if stack:get_definition().groups.bagslots then - return 1 - else - return 0 + local new_slots = stack:get_definition().groups.bagslots + if new_slots then + local player_inv = player:get_inventory() + local old_slots = player_inv:get_size(listname.."contents") + + if new_slots >= old_slots then + return 1 + else + -- using a smaller bag, make sure it fits + local old_list = player_inv:get_list(listname.."contents") + local new_list = {} + local slots_used = 0 + local use_new_list = false + + for i, v in ipairs(old_list) do + if v and not v:is_empty() then + slots_used = slots_used + 1 + use_new_list = i > new_slots + new_list[slots_used] = v + end + end + if new_slots >= slots_used then + if use_new_list then + player_inv:set_list(listname.."contents", new_list) + end + return 1 + end + end end + return 0 end, allow_take = function(inv, listname, index, stack, player) if player:get_inventory():is_empty(listname.."contents") then |