From eb5ea25d54d5943e0d9d0e4f9f1c8bfd316a0ed5 Mon Sep 17 00:00:00 2001 From: LoneWolfHT Date: Tue, 13 Oct 2020 16:22:19 -0700 Subject: [PATCH] Improve initial_stuff --- mods/ctf/ctf_classes/items.lua | 4 +- mods/other/give_initial_stuff/init.lua | 61 +++++++++++++++++++++++--- 2 files changed, 57 insertions(+), 8 deletions(-) diff --git a/mods/ctf/ctf_classes/items.lua b/mods/ctf/ctf_classes/items.lua index 520ae63..8432eaa 100644 --- a/mods/ctf/ctf_classes/items.lua +++ b/mods/ctf/ctf_classes/items.lua @@ -8,7 +8,7 @@ local function stack_list_to_map(stacks) return map end --- Returns true if the item shouldn't be allowed to be dropped etc +-- Returns true if the item shouldn't be allowed to be dropped etc local function is_class_blacklisted(player, itemname) local class = ctf_classes.get(player) local items = stack_list_to_map(class.properties.item_blacklist) @@ -58,6 +58,8 @@ ctf_classes.register_on_changed(function(player, old, new) for i = 1, #items do give_initial_stuff.give_item(inv, ItemStack(items[i])) end + + give_initial_stuff(player, "replace_tools") end end) diff --git a/mods/other/give_initial_stuff/init.lua b/mods/other/give_initial_stuff/init.lua index 992bd69..13ef57f 100644 --- a/mods/other/give_initial_stuff/init.lua +++ b/mods/other/give_initial_stuff/init.lua @@ -1,7 +1,43 @@ give_initial_stuff = {} +local tools = {"default:sword_", "default:pick_", "default:axe_", "default:shovel_"} +local tool_materials = {"stone", "steel", "bronze", "mese", "diamond"} + -- Add item to inv. Split item if count > stack_max using recursion function give_initial_stuff.give_item(inv, item) + -- Remove any lower tier tools of the same type as the item + for _, tool in pairs(tools) do + if item:get_name():find(tool) then -- Find what tool the new item is + -- Get the 'tier' of the new item + local newtier = table.indexof(tool_materials, item:get_name():sub(tool:len() + 1)) + + for tier, mat in ipairs(tool_materials) do + if tier < newtier then + inv:remove_item("main", tool..mat) -- Will do nothing if tool doesn't exist + elseif inv:contains_item("main", tool..mat) then + return -- A higher tier tool is already in inventory + end + end + end + end + + -- Don't duplicate stacks + if inv:contains_item("main", item:get_name()) then + local safeguard = 1 + -- Do a fast refill of stack if needed + while not inv:contains_item("main", item:get_name().." "..item:get_stack_max()-5) do + safeguard = safeguard + 1 + inv:add_item("main", item:get_name().." 5") + + if safeguard >= 500 then + minetest.log("error", "[give_initial_stuff] Something went wrong when filling stack "..dump(item:get_name())) + break + end + end + + return + end + inv:add_item("main", item:take_item(item:get_stack_max())) -- If item isn't empty, add the leftovers again @@ -11,21 +47,32 @@ function give_initial_stuff.give_item(inv, item) end setmetatable(give_initial_stuff, { - __call = function(self, player) + __call = function(self, player, mode) minetest.log("action", "Giving initial stuff to player " .. player:get_player_name()) local inv = player:get_inventory() - inv:set_list("main", {}) - inv:set_list("craft", {}) - inv:set_size("craft", 1) - inv:set_size("craftresult", 0) - inv:set_size("hand", 0) + if mode ~= "replace_tools" then + inv:set_list("main", {}) + inv:set_list("craft", {}) + + inv:set_size("craft", 1) + inv:set_size("craftresult", 0) + inv:set_size("hand", 0) + end local items = give_initial_stuff.get_stuff(player) for _, item in pairs(items) do - give_initial_stuff.give_item(inv, ItemStack(item)) + if mode == "replace_tools" then + for _, tool in pairs(tools) do + if item:find(tool) then + give_initial_stuff.give_item(inv, ItemStack(item)) + end + end + else + give_initial_stuff.give_item(inv, ItemStack(item)) + end end end })