From 23f1f6515a2ffa791a6de147e29e4528225c4421 Mon Sep 17 00:00:00 2001 From: LeMagnesium Date: Sat, 1 Aug 2015 20:28:12 +0200 Subject: [PATCH] Added 'vacuum' feature to manage the items' graveyard - Added a refresh function to retrieve confiscated items from the items' graveyard --- mods/pclasses/api.lua | 35 ++++++++++++++++++++++++++++------- mods/pclasses/inventory.lua | 19 +++++++++++++++++++ 2 files changed, 47 insertions(+), 7 deletions(-) diff --git a/mods/pclasses/api.lua b/mods/pclasses/api.lua index a89e361e..41e3aa8c 100755 --- a/mods/pclasses/api.lua +++ b/mods/pclasses/api.lua @@ -56,6 +56,7 @@ function pclasses.api.set_player_class(pname, cname) end pclasses.data.players[pname] = cname pclasses.api.get_class_by_name(cname).on_assigned(pname) + pclasses.api.vacuum_graveyard(minetest.get_player_by_name(pname)) end return true end @@ -76,6 +77,32 @@ pclasses.api.util.does_wear_full_armor = function(pname, material, noshield) return full_armor and (inv:contains_item("armor", "shields:shield_" .. material) or noshield) end +function pclasses.api.util.can_have_item(pname, itemname) + if not pclasses.data.reserved_items[itemname] then + return true + end + for index, class in pairs(pclasses.data.reserved_items[itemname]) do + if pclasses.api.get_player_class(pname) == class then + return true + end + end + return false +end + +-- TEMPORARY CLASS SHIFT SYSTEM +-- Used to test on local servers +-- + +minetest.register_privilege("class_shifter", "Able to shift between classes") + +minetest.register_chatcommand("shift_class", { + args = "", + privs = {class_shifter = true}, + func = function(name, param) + pclasses.api.set_player_class(name, param) + end +}) + ------------------- -- Reserved items -- @@ -96,13 +123,7 @@ local function tick() for i = 1, inv:get_size("main") do local stack = inv:get_stack("main", i) if pclasses.data.reserved_items[stack:get_name()] then - local drop_stack = true - for index, class in pairs(pclasses.data.reserved_items[stack:get_name()]) do - if pclasses.api.get_player_class(name) == class then - drop_stack = false - end - end - if drop_stack then + if not pclasses.api.util.can_have_item(name, stack:get_name()) then inv:set_stack("main", i, "") local grave_inv = minetest.get_inventory({type = "detached", name = name .. "_graveyard"}) if grave_inv:room_for_item("graveyard", stack) then diff --git a/mods/pclasses/inventory.lua b/mods/pclasses/inventory.lua index 28ebdc1b..3f6f5883 100755 --- a/mods/pclasses/inventory.lua +++ b/mods/pclasses/inventory.lua @@ -48,3 +48,22 @@ unified_inventory.register_page("graveyard", { end }) +function pclasses.api.vacuum_graveyard(player) + local pname = player:get_player_name() + local grave_inv = minetest.get_inventory({type = "detached", name = pname .. "_graveyard"}) + local player_inv = minetest.get_inventory({type = "player", name = pname}) + + for i = 1,7*8 do + local stack = grave_inv:get_stack("graveyard", i) + if pclasses.api.util.can_have_item(pname, stack:get_name()) then + grave_inv:set_stack("graveyard", i, nil) + player_inv:set_stack("graveyard", i, nil) + if player_inv:room_for_item("main", stack) then + player_inv:add_item("main", stack) + else + minetest.add_item(pos, stack) + end + end + end +end +