260 lines
7.7 KiB
Lua
260 lines
7.7 KiB
Lua
max_search_distance = 8
|
|
min_search_distance = 2
|
|
search_item = 'default:stone'
|
|
|
|
-- All type detector
|
|
|
|
minetest.register_node("mineral_detector:detector", {
|
|
description = "Mineral Detector",
|
|
tile_images = {"mineral_detector.png", "default_steel_block.png"},
|
|
inventory_image = "mineral_detector.png",
|
|
is_ground_content = true,
|
|
groups = {cracky=1, level=2},
|
|
drop = 'mineral_detector:detector 1',
|
|
metadata_name = "generic",
|
|
on_construct = function(pos)
|
|
--local n = minetest.get_node(pos)
|
|
local meta = minetest.get_meta(pos)
|
|
meta:set_string("formspec", "field[text;;${text}]")
|
|
end,
|
|
on_receive_fields = function(pos, formname, fields, sender)
|
|
local meta = minetest.get_meta(pos)
|
|
fields.text = fields.text or ""
|
|
if fields.text == "" then
|
|
return
|
|
end
|
|
meta:set_string("search_item", fields.text)
|
|
UpdateDetectorAll(pos, tonumber(meta:get_string("search_distance")), meta:get_string("search_item"))
|
|
end
|
|
})
|
|
|
|
minetest.register_craft({
|
|
output = 'mineral_detector:detector 1',
|
|
recipe = {
|
|
{'default:steelblock', 'default:steelblock', 'default:steelblock'},
|
|
{'default:steelblock', 'default:coalblock', 'default:steelblock'},
|
|
{'default:steelblock', 'default:coalblock', 'default:steelblock'},
|
|
}
|
|
})
|
|
|
|
function UpdateDetectorAll(pos, search_distance, search_item)
|
|
local found = 0
|
|
|
|
for p_x=(pos.x-search_distance), (pos.x+search_distance) do
|
|
for p_y=(pos.y-search_distance), (pos.y+search_distance) do
|
|
for p_z=(pos.z-search_distance), (pos.z+search_distance) do
|
|
local search_n = minetest.env:get_node({x=p_x, y=p_y, z=p_z})
|
|
|
|
if search_n.name == search_item then
|
|
found = found + 1
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
info_text = ("Range: " .. tostring(search_distance) .. " | Found " .. search_item .. " x " .. found)
|
|
|
|
local newmeta = minetest.env:get_meta(pos)
|
|
newmeta:set_string("infotext",info_text)
|
|
newmeta:set_string("search_distance", tostring(search_distance))
|
|
newmeta:set_string("search_item", search_item)
|
|
end
|
|
|
|
function UpdateMaterializerAll(pos, search_item)
|
|
info_text = ("Now producing "..search_item)
|
|
local newmeta = minetest.get_meta(pos)
|
|
newmeta:set_string("infotext",info_text)
|
|
newmeta:set_string("search_item", search_item)
|
|
end
|
|
|
|
function UpdateSensorAll(pos, search_item)
|
|
local found = 0
|
|
local dist = 10000
|
|
|
|
for dx=-10,10 do
|
|
for dy=-10,10 do
|
|
for dz=-10,10 do
|
|
local search_n = minetest.env:get_node({x=pos.x+dx, y=pos.y+dy, z=pos.z+dz})
|
|
if search_n.name == search_item then
|
|
found = 1
|
|
dist = math.min(dist, math.max(math.abs(dx),math.abs(dy),math.abs(dz)))
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
if found > 0 then
|
|
info_text = ("Found " .. search_item .. " @ Distance " .. tostring(dist))
|
|
else
|
|
info_text = (search_item .. " is not found nearby")
|
|
end
|
|
|
|
local newmeta = minetest.get_meta(pos)
|
|
newmeta:set_string("infotext",info_text)
|
|
newmeta:set_string("search_item", search_item)
|
|
end
|
|
|
|
minetest.register_on_punchnode(function(pos, node, puncher)
|
|
if string.match(node.name, "mineral_detector:detector") ~= nil then
|
|
|
|
local meta = minetest.env:get_meta(pos)
|
|
local search_distance = tonumber(meta:get_string("search_distance"))
|
|
local search_item = meta:get_string("search_item")
|
|
|
|
if search_distance < max_search_distance then
|
|
search_distance = search_distance + 1
|
|
else
|
|
search_distance = min_search_distance
|
|
end
|
|
|
|
if string.match(node.name, "mineral_detector:detector") ~= nil then
|
|
UpdateDetectorAll(pos, search_distance, search_item)
|
|
end
|
|
end
|
|
end)
|
|
|
|
minetest.register_on_placenode(
|
|
function(pos, newnode, placer)
|
|
if string.match(newnode.name, "mineral_detector:") ~= nil then
|
|
if newnode.name == "mineral_detector:detector" then
|
|
UpdateDetectorAll(pos, min_search_distance, search_item)
|
|
end
|
|
if newnode.name == "mineral_detector:materializer" or newnode.name == "mineral_detector:materializer2" then
|
|
UpdateMaterializerAll(pos, search_item)
|
|
end
|
|
if newnode.name == "mineral_detector:sensor" then
|
|
UpdateSensorAll(pos, search_item)
|
|
end
|
|
end
|
|
end
|
|
)
|
|
|
|
-- Materializer
|
|
|
|
minetest.register_node("mineral_detector:materializer", {
|
|
description = "Item Materializer",
|
|
tile_images = {"mineral_materializer.png", "default_steel_block.png"},
|
|
inventory_image = "mineral_materializer.png",
|
|
is_ground_content = true,
|
|
groups = {cracky=1, level=2},
|
|
drop = 'mineral_detector:materializer 1',
|
|
metadata_name = "generic",
|
|
on_construct = function(pos)
|
|
--local n = minetest.get_node(pos)
|
|
local meta = minetest.get_meta(pos)
|
|
meta:set_string("formspec", "field[text;;${text}]")
|
|
end,
|
|
on_receive_fields = function(pos, formname, fields, sender)
|
|
local meta = minetest.get_meta(pos)
|
|
fields.text = fields.text or ""
|
|
if fields.text == "" then
|
|
return
|
|
end
|
|
UpdateMaterializerAll(pos, fields.text);
|
|
end
|
|
})
|
|
|
|
minetest.register_craft({
|
|
output = 'mineral_detector:materializer 1',
|
|
recipe = {
|
|
{'default:diamondblock', 'default:obsidian', 'default:diamondblock'},
|
|
{'default:diamondblock', 'default:mese', 'default:diamondblock'},
|
|
{'default:diamondblock', 'default:diamondblock', 'default:diamondblock'},
|
|
}
|
|
})
|
|
|
|
minetest.register_abm({
|
|
nodenames = {'mineral_detector:materializer'},
|
|
interval = 10000.0,
|
|
chance = 1.0,
|
|
action = function(pos)
|
|
local meta = minetest.get_meta(pos)
|
|
pos.y = pos.y+1
|
|
if minetest.registered_nodes[meta:get_string("search_item")] ~= nil then
|
|
minetest.add_node(pos,{name=meta:get_string("search_item")})
|
|
end
|
|
end,
|
|
})
|
|
|
|
-- Materializer MKII
|
|
|
|
minetest.register_node("mineral_detector:materializer2", {
|
|
description = "Item Materializer MKII",
|
|
tile_images = {"mineral_materializer2.png", "default_steel_block.png"},
|
|
inventory_image = "mineral_materializer2.png",
|
|
is_ground_content = true,
|
|
groups = {cracky=1, level=2},
|
|
drop = 'mineral_detector:materializer2 1',
|
|
metadata_name = "generic",
|
|
on_construct = function(pos)
|
|
--local n = minetest.get_node(pos)
|
|
local meta = minetest.get_meta(pos)
|
|
meta:set_string("formspec", "field[text;;${text}]")
|
|
end,
|
|
on_receive_fields = function(pos, formname, fields, sender)
|
|
local meta = minetest.get_meta(pos)
|
|
fields.text = fields.text or ""
|
|
if fields.text == "" then
|
|
return
|
|
end
|
|
UpdateMaterializerAll(pos, fields.text);
|
|
end
|
|
})
|
|
|
|
minetest.register_craft({
|
|
output = 'mineral_detector:materializer2 1',
|
|
recipe = {
|
|
{'mineral_detector:materializer', 'mineral_detector:materializer', 'mineral_detector:materializer'},
|
|
{'mineral_detector:materializer', 'mineral_detector:materializer', 'mineral_detector:materializer'},
|
|
{'mineral_detector:materializer', 'mineral_detector:materializer', 'mineral_detector:materializer'},
|
|
}
|
|
})
|
|
|
|
minetest.register_abm({
|
|
nodenames = {'mineral_detector:materializer2'},
|
|
interval = 1000.0,
|
|
chance = 1.0,
|
|
action = function(pos)
|
|
local meta = minetest.get_meta(pos)
|
|
pos.y = pos.y+1
|
|
if minetest.registered_nodes[meta:get_string("search_item")] ~= nil then
|
|
minetest.add_node(pos,{name=meta:get_string("search_item")})
|
|
end
|
|
end,
|
|
})
|
|
|
|
-- Mineral Sensor --
|
|
--
|
|
minetest.register_node("mineral_detector:sensor", {
|
|
description = "Mineral Sensor",
|
|
tile_images = {"mineral_sensor.png", "default_steel_block.png"},
|
|
inventory_image = "mineral_sensor.png",
|
|
is_ground_content = true,
|
|
groups = {cracky=1, level=2},
|
|
drop = 'mineral_detector:sensor 1',
|
|
metadata_name = "generic",
|
|
on_construct = function(pos)
|
|
--local n = minetest.get_node(pos)
|
|
local meta = minetest.get_meta(pos)
|
|
meta:set_string("formspec", "field[text;;${text}]")
|
|
end,
|
|
on_receive_fields = function(pos, formname, fields, sender)
|
|
local meta = minetest.get_meta(pos)
|
|
fields.text = fields.text or ""
|
|
if fields.text == "" then
|
|
return
|
|
end
|
|
meta:set_string("search_item", fields.text)
|
|
UpdateSensorAll(pos, meta:get_string("search_item"))
|
|
end
|
|
})
|
|
|
|
minetest.register_craft({
|
|
output = 'mineral_detector:sensor 1',
|
|
recipe = {
|
|
{'default:mese', 'default:steelblock', 'default:mese'},
|
|
{'default:mese', 'default:copperblock', 'default:mese'},
|
|
{'default:mese', 'default:steelblock', 'default:mese'},
|
|
}
|
|
})
|