summaryrefslogtreecommitdiff
path: root/bags.lua
diff options
context:
space:
mode:
authorBadToad2000 <jameson.miller@outlook.com>2016-02-28 23:34:13 -0600
committerBadToad2000 <jameson.miller@outlook.com>2016-02-28 23:34:13 -0600
commit3cdfdd14a5ac1de36f41981a6ed69b0f9f2fd90d (patch)
tree655b49802a2393277ac9472e3fa2919da4701d7b /bags.lua
parentbdf9b61779b454e687b81e2dc3df7edc8a52e68b (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.lua33
1 files changed, 29 insertions, 4 deletions
diff --git a/bags.lua b/bags.lua
index 3b86544..0dd391b 100644
--- a/bags.lua
+++ b/bags.lua
@@ -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