From 6731db14e580ddccace186f5a8ac03dad0661e0c Mon Sep 17 00:00:00 2001
From: Gábriel <38207624+gabriel1379@users.noreply.github.com>
Date: Sun, 07 Jul 2024 18:53:15 +0200
Subject: [PATCH] Add compressor recipes for nether racks (#644)

---
 technic/tools/prospector.lua |   79 ++++++++++++++++++++++++++-------------
 1 files changed, 52 insertions(+), 27 deletions(-)

diff --git a/technic/tools/prospector.lua b/technic/tools/prospector.lua
index b28f1d8..14e518c 100644
--- a/technic/tools/prospector.lua
+++ b/technic/tools/prospector.lua
@@ -2,14 +2,16 @@
 
 technic.register_power_tool("technic:prospector", 300000)
 
-local function get_metadata(toolstack)
-	local m = minetest.deserialize(toolstack:get_metadata())
-	if not m then m = {} end
-	if not m.charge then m.charge = 0 end
-	if not m.target then m.target = "" end
-	if not m.look_depth then m.look_depth = 7 end
-	if not m.look_radius then m.look_radius = 1 end
-	return m
+-- Helper function to consolidate ItemStackMetaRef access and initialize
+local function meta_to_table(meta)
+	local t = {}
+	local mt = meta:to_table()
+
+	t.charge = tonumber(mt.fields["technic:charge"]) or 0
+	t.target = mt.fields.target or ""
+	t.look_depth = tonumber(mt.fields.look_depth) or 7
+	t.look_radius = tonumber(mt.fields.look_radius) or 1
+	return t
 end
 
 minetest.register_tool("technic:prospector", {
@@ -20,7 +22,8 @@
 	on_use = function(toolstack, user, pointed_thing)
 		if not user or not user:is_player() or user.is_fake_player then return end
 		if pointed_thing.type ~= "node" then return end
-		local toolmeta = get_metadata(toolstack)
+		local meta = technic.get_stack_meta(toolstack)
+		local toolmeta = meta_to_table(meta)
 		local look_diameter = toolmeta.look_radius * 2 + 1
 		local charge_to_take = toolmeta.look_depth * (toolmeta.look_depth + 1) * look_diameter * look_diameter
 		if toolmeta.charge < charge_to_take then return end
@@ -30,9 +33,10 @@
 		end
 		if not technic.creative_mode then
 			toolmeta.charge = toolmeta.charge - charge_to_take
-			toolstack:set_metadata(minetest.serialize(toolmeta))
+			meta:set_int("technic:charge", toolmeta.charge)
 			technic.set_RE_wear(toolstack, toolmeta.charge, technic.power_tools[toolstack:get_name()])
 		end
+		-- What in the heaven's name is this evil sorcery ?
 		local start_pos = pointed_thing.under
 		local forward = minetest.facedir_to_dir(minetest.dir_to_facedir(user:get_look_dir(), true))
 		local right = forward.x ~= 0 and { x=0, y=1, z=0 } or (forward.y ~= 0 and { x=0, y=0, z=1 } or { x=1, y=0, z=0 })
@@ -42,18 +46,42 @@
 		for f = 0, toolmeta.look_depth-1 do
 			for r = 0, look_diameter-1 do
 				for u = 0, look_diameter-1 do
-					if minetest.get_node(vector.add(vector.add(vector.add(base_pos, vector.multiply(forward, f)), vector.multiply(right, r)), vector.multiply(up, u))).name == toolmeta.target then found = true end
+					if minetest.get_node(
+							vector.add(
+								vector.add(
+									vector.add(base_pos,
+										vector.multiply(forward, f)),
+									vector.multiply(right, r)),
+								vector.multiply(up, u))
+							).name == toolmeta.target then
+						found = true
+						break
+					end
 				end
+				if found then break end
 			end
+			if found then break end
 		end
-		if math.random() < 0.02 then found = not found end
-		minetest.chat_send_player(user:get_player_name(), minetest.registered_nodes[toolmeta.target].description.." is "..(found and "present" or "absent").." in "..look_diameter.."x"..look_diameter.."x"..toolmeta.look_depth.." region")
-		minetest.sound_play("technic_prospector_"..(found and "hit" or "miss"), { pos = vector.add(user:getpos(), { x = 0, y = 1, z = 0 }), gain = 1.0, max_hear_distance = 10 })
+		if math.random() < 0.02 then
+			found = not found
+		end
+
+		local ndef = minetest.registered_nodes[toolmeta.target]
+		minetest.chat_send_player(user:get_player_name(),
+			ndef.description.." is "..(found and "present" or "absent")..
+			" in "..look_diameter.."x"..look_diameter.."x"..toolmeta.look_depth.." region")
+
+		minetest.sound_play("technic_prospector_"..(found and "hit" or "miss"), {
+			pos = vector.add(user:get_pos(), { x = 0, y = 1, z = 0 }),
+			gain = 1.0,
+			max_hear_distance = 10
+		})
 		return toolstack
 	end,
 	on_place = function(toolstack, user, pointed_thing)
 		if not user or not user:is_player() or user.is_fake_player then return end
-		local toolmeta = get_metadata(toolstack)
+		local meta = technic.get_stack_meta(toolstack)
+		local toolmeta = meta_to_table(meta)
 		local pointed
 		if pointed_thing.type == "node" then
 			local pname = minetest.get_node(pointed_thing.under).name
@@ -93,7 +121,7 @@
 			"label[0,7.5;Accuracy:]"..
 			"label[0,8;98%]")
 		return
-	end, 
+	end,
 })
 
 minetest.register_on_player_receive_fields(function(user, formname, fields)
@@ -101,28 +129,25 @@
 	if not user or not user:is_player() or user.is_fake_player then return end
 	local toolstack = user:get_wielded_item()
 	if toolstack:get_name() ~= "technic:prospector" then return true end
-	local toolmeta = get_metadata(toolstack)
+	local meta = technic.get_stack_meta(toolstack)
 	for field, value in pairs(fields) do
 		if field:sub(1, 7) == "target_" then
-			toolmeta.target = field:sub(8)
-		end
-		if field:sub(1, 12) == "look_radius_" then
-			toolmeta.look_radius = field:sub(13)
-		end
-		if field:sub(1, 11) == "look_depth_" then
-			toolmeta.look_depth = field:sub(12)
+			meta:set_string("target", field:sub(8))
+		elseif field:sub(1, 12) == "look_radius_" then
+			meta:set_string("look_radius", field:sub(13))
+		elseif field:sub(1, 11) == "look_depth_" then
+			meta:set_string("look_depth", field:sub(12))
 		end
 	end
-	toolstack:set_metadata(minetest.serialize(toolmeta))
 	user:set_wielded_item(toolstack)
 	return true
 end)
- 
+
 minetest.register_craft({
 	output = "technic:prospector",
 	recipe = {
 		{"moreores:pick_silver", "moreores:mithril_block", "pipeworks:teleport_tube_1"},
-		{"technic:brass_ingot", "technic:control_logic_unit", "technic:brass_ingot"},
+		{"basic_materials:brass_ingot", "technic:control_logic_unit", "basic_materials:brass_ingot"},
 		{"", "technic:blue_energy_crystal", ""},
 	}
 })

--
Gitblit v1.8.0