diff --git a/mods/jewels/init.lua b/mods/jewels/init.lua index 33eda22..8f51606 100644 --- a/mods/jewels/init.lua +++ b/mods/jewels/init.lua @@ -15,6 +15,7 @@ function jewels.register_jewel(toolname, new_toolname, def) -- registers a new tool with different stats local data = { + name = new_toolname, -- the new name of the tool overlay = def.overlay or "jewels_jeweled_handle.png", -- overlay image stats = { digspeed = def.stats.digspeed, -- negative digs faster @@ -26,9 +27,12 @@ function jewels.register_jewel(toolname, new_toolname, def) } } - jewels.registered_jewels[toolname] = data + if not jewels.registered_jewels[toolname] then + jewels.registered_jewels[toolname] = {} + end + table.insert(jewels.registered_jewels[toolname], data) - local tooldef = minetest.registered_tools[toolname] + local tooldef = minetest.deserialize(minetest.serialize(minetest.registered_tools[toolname])) local new_tool_invimage = "" if tooldef.inventory_image then @@ -40,7 +44,7 @@ function jewels.register_jewel(toolname, new_toolname, def) new_tool_wieldimage = tooldef.wield_image .. "^" .. data.overlay end - local new_tooldef = tooldef + local new_tooldef = tooldef local desc = new_tooldef.description or "" desc = "Jeweled " .. desc @@ -95,6 +99,24 @@ function jewels.register_jewel(toolname, new_toolname, def) minetest.register_tool(new_toolname, new_tooldef) end +function jewels.can_jewel(toolname) + for name, _ in pairs(jewels.registered_jewels) do + if name == toolname then + return true + end + end + + return false +end + +function jewels.get_jeweled(toolname) + for name, jables in pairs(jewels.registered_jewels) do + if name == toolname then + return util.choice_element(jables) + end + end +end + minetest.register_craftitem( "jewels:jewel", { @@ -124,8 +146,37 @@ minetest.register_node( can_dig = function(pos, player) local meta = minetest.get_meta(pos) local inv = meta:get_inventory() + return inv:is_empty("main") end, + on_punch = function(pos, node, player, pointed_thing) + local itemstack = player:get_wielded_item() + + if itemstack:get_name() == "jewels:jewel" then + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + + local itemname = inv:get_stack("main", 1):get_name() + + if jewels.can_jewel(itemname) then + inv:set_stack("main", 1, ItemStack(jewels.get_jeweled(itemname))) + + itemstack:take_item() + end + end + + player:set_wielded_item(itemstack) + end, + }) + +minetest.register_craft( + { + output = "jewels:bench", + recipe = { + {"group:planks", "jewels:jewel", "group:planks"}, + {"default:ingot_carbonsteel", "group:planks", "default:ingot_carbonsteel"}, + {"group:planks", "group:planks", "group:planks"} + } }) local form_bench = default.ui.get_page("core_2part") @@ -133,7 +184,8 @@ form_bench = form_bench .. "list[current_name;main;2.25,1.75;1,1;]" form_bench = form_bench .. "listring[current_name;main]" form_bench = form_bench .. default.ui.get_itemslot_bg(2.25, 1.75, 1, 1) -form_bench = form_bench .. "label[3.25,2;Place unjeweled tool here, then rightclick on bench]" +form_bench = form_bench .. "label[3.25,1.75;1. Place unjeweled tool here]" +form_bench = form_bench .. "label[3.25,2.25;2. Hold a jewel and punch the bench]" form_bench = form_bench .. "list[current_player;main;0.25,4.75;8,4;]" form_bench = form_bench .. "listring[current_player;main]" diff --git a/mods/jewels/textures/jewels_bench_sides.png b/mods/jewels/textures/jewels_bench_sides.png index b79b0fb..975d279 100644 Binary files a/mods/jewels/textures/jewels_bench_sides.png and b/mods/jewels/textures/jewels_bench_sides.png differ diff --git a/mods/util/init.lua b/mods/util/init.lua index 5d4de34..f10f84c 100644 --- a/mods/util/init.lua +++ b/mods/util/init.lua @@ -141,7 +141,11 @@ function util.choice(tab, pr) if #choices <= 0 then return end - return choices[pr:next(1, #choices)] + if pr then + return choices[pr:next(1, #choices)] + else + return choices[math.random(1, #choices)] + end end function util.choice_element(tab, pr) @@ -155,6 +159,10 @@ function util.choice_element(tab, pr) if #choices <= 0 then return end - return choices[pr:next(1, #choices)] + if pr then + return choices[pr:next(1, #choices)] + else + return choices[math.random(1, #choices)] + end end