minetest-micupack-cd2025/slmodules/autosievesensor.lua
Michal Cieslakiewicz 03814af39e slmodules: fix missing files in commit.
Signed-off-by: Michal Cieslakiewicz <michal.cieslakiewicz@wp.pl>
2019-02-27 14:52:34 +01:00

185 lines
5.2 KiB
Lua

--[[
=======================================================
SmartLine Modules
by Micu (c) 2018, 2019
AutoSieve Sensor
This node is a sensor pad for Techpack Automated Gravel
Sieve. Although AutoSieve can interact with Tubelib
machinery like any other Techpack machine, it does
not have Tubelib ID, so it cannot be controlled or
monitored. Sensor pad node should be placed UNDER
AutoSieve. It gets standard ID and its working
principle is identical to Furnace Monitor.
Sensor states are read through standard Tubelib status
query (for example $get_status(...) function in
SaferLua Controller). Item count is also supported
($get_counter(...) command returns number of sieve
items processed).
Device checks attached node only when status is
requested so it does not consume CPU resources when
idle.
Placement: place directly under Automated Gravel Sieve.
Status:
"fault" - there is no AutoSieve above sensor node
"stopped" - AutoSieve is not working
"running" - AutoSieve is running
"defect" - AutoSieve is broken and needs to be
repaired
Note: there is no "standby" state.
Punch node to see current status.
License: LGPLv2.1+
=======================================================
]]--
--[[
-------
Helpers
-------
]]--
-- get AutoSieve status as tubelib text string:
-- not an AutoSieve node = "fault"
-- AutoSieve not working = "stopped"
-- AutoSieve processing gravel = "running"
-- AutoSieve broken due to aging = "defect"
-- (pos is sensor node position)
local function get_tubelib_autosieve_state(pos)
local sievepos = vector.add(pos, { x = 0, y = 1, z = 0 })
local node = minetest.get_node(sievepos)
-- (we won't fire regexp cannon on mere 4 strings...)
if node.name == "gravelsieve:auto_sieve0" or
node.name == "gravelsieve:auto_sieve1" or
node.name == "gravelsieve:auto_sieve2" or
node.name == "gravelsieve:auto_sieve3" then
if minetest.get_node_timer(sievepos):is_started() then
return tubelib.StateStrings[tubelib.RUNNING]
else
return tubelib.StateStrings[tubelib.STOPPED]
end
elseif node.name == "gravelsieve:sieve_defect" then
return tubelib.StateStrings[tubelib.DEFECT]
end
return tubelib.StateStrings[tubelib.FAULT]
end
-- get AutoSieve item counter
-- (pos is sensor node position)
local function get_tubelib_autosieve_counter(pos)
local sievepos = vector.add(pos, { x = 0, y = 1, z = 0 })
local node = minetest.get_node(sievepos)
if node.name == "gravelsieve:auto_sieve0" or
node.name == "gravelsieve:auto_sieve1" or
node.name == "gravelsieve:auto_sieve2" or
node.name == "gravelsieve:auto_sieve3" or
node.name == "gravelsieve:sieve_defect" then
local meta = minetest.get_meta(sievepos)
return meta:get_int("gravel_cnt") or 0
end
return -1
end
--[[
-----------------
Node registration
-----------------
]]--
minetest.register_node("slmodules:autosievesensor", {
description = "SmartLine AutoSieve Sensor",
tiles = {
-- up, down, right, left, back, front
"slmodules_autosievesensor_top.png",
"slmodules_default_plate.png",
"slmodules_autosievesensor_side.png",
"slmodules_autosievesensor_side.png",
"slmodules_autosievesensor_side.png",
"slmodules_autosievesensor_side.png",
},
after_place_node = function(pos, placer, itemstack, pointed_thing)
local meta = minetest.get_meta(pos)
local number = tubelib.add_node(pos, "slmodules:autosievesensor")
meta:set_string("number", number)
meta:set_string("infotext", "AutoSieve Sensor " .. number)
meta:set_string("owner", placer:get_player_name())
end,
can_dig = function(pos, player)
if minetest.is_protected(pos, player:get_player_name()) then
return false
end
return true
end,
after_dig_node = function(pos, oldnode, oldmetadata, digger)
tubelib.remove_node(pos)
end,
on_punch = function(pos, node, puncher, pointed_thing)
local meta = minetest.get_meta(pos)
local player_name = puncher:get_player_name()
if meta:get_string("owner") ~= player_name then
return false
end
local state = get_tubelib_autosieve_state(pos)
local msgclr = { ["fault"] = "#FFBFBF",
["defect"] = "#FFBFBF",
["stopped"] = "#BFBFFF",
["running"] = "#BFFFBF" }
minetest.chat_send_player(player_name,
minetest.colorize("#FFFF00", "[AutoSieveSensor:" ..
meta:get_string("number") .. "]") .. " Status is " ..
minetest.colorize(msgclr[state],
"\"" .. state .. "\""))
return true
end,
on_rotate = screwdriver.disallow,
paramtype = "light",
sunlight_propagates = true,
paramtype2 = "facedir",
groups = { choppy = 2, cracky = 2, crumbly = 2 },
is_ground_content = false,
sounds = default.node_sound_metal_defaults(),
})
tubelib.register_node("slmodules:autosievesensor", {}, {
on_recv_message = function(pos, topic, payload)
if topic == "state" then
return get_tubelib_autosieve_state(pos)
elseif topic == "counter" then
return get_tubelib_autosieve_counter(pos)
else
return "unsupported"
end
end,
})
--[[
--------
Crafting
--------
]]--
minetest.register_craft({
output = "slmodules:autosievesensor",
type = "shaped",
recipe = {
{ "default:copperblock", "default:steel_ingot", "default:copperblock" },
{ "dye:blue", "default:mese_crystal", "tubelib:wlanchip" },
{ "group:wood", "default:steel_ingot", "group:wood" },
},
})