97 lines
2.9 KiB
Lua
97 lines
2.9 KiB
Lua
|
--[[
|
||
|
|
||
|
Tubelib Addons 2
|
||
|
================
|
||
|
|
||
|
Copyright (C) 2017-2020 Joachim Stolberg
|
||
|
|
||
|
AGPL v3
|
||
|
See LICENSE.txt for more information
|
||
|
|
||
|
programmer.lua:
|
||
|
|
||
|
]]--
|
||
|
|
||
|
-- Load support for I18n
|
||
|
local S = tubelib_addons2.S
|
||
|
|
||
|
local function join_to_string(tbl)
|
||
|
local t = {}
|
||
|
for key,_ in pairs(tbl) do
|
||
|
t[#t + 1] = key .. " "
|
||
|
end
|
||
|
-- remove the last blank
|
||
|
return string.sub(table.concat(t), 1, -2)
|
||
|
end
|
||
|
|
||
|
local function reset_programmer(itemstack, user, pointed_thing)
|
||
|
user:set_attribute("tubelib_prog_numbers", nil)
|
||
|
minetest.chat_send_player(user:get_player_name(), S("[Tubelib Programmer] programmer reset"))
|
||
|
return itemstack
|
||
|
end
|
||
|
|
||
|
local function read_number(itemstack, user, pointed_thing)
|
||
|
local pos = pointed_thing.under
|
||
|
if pos then
|
||
|
local number = tubelib.get_node_number(pos)
|
||
|
if number then
|
||
|
local numbers = minetest.deserialize(user:get_attribute("tubelib_prog_numbers")) or {}
|
||
|
numbers[number] = true
|
||
|
user:set_attribute("tubelib_prog_numbers", minetest.serialize(numbers))
|
||
|
minetest.chat_send_player(user:get_player_name(), S("[Tubelib Programmer] number").." "..number.." "..S("read"))
|
||
|
else
|
||
|
minetest.chat_send_player(user:get_player_name(), S("[Tubelib Programmer] Unknown node on").." "..minetest.pos_to_string(pos))
|
||
|
end
|
||
|
else
|
||
|
return reset_programmer(itemstack, user, pointed_thing)
|
||
|
end
|
||
|
return itemstack
|
||
|
end
|
||
|
|
||
|
local function program_numbers(itemstack, placer, pointed_thing)
|
||
|
local pos = pointed_thing.under
|
||
|
if pos then
|
||
|
local meta = minetest.get_meta(pos)
|
||
|
local node_number = tubelib.get_node_number(pos)
|
||
|
local numbers = minetest.deserialize(placer:get_attribute("tubelib_prog_numbers")) or {}
|
||
|
placer:set_attribute("tubelib_prog_numbers", nil)
|
||
|
local text = join_to_string(numbers)
|
||
|
local player_name = placer:get_player_name()
|
||
|
if meta and meta:get_string("owner") ~= player_name then
|
||
|
minetest.chat_send_player(player_name, S("[Tubelib Programmer] foreign or unknown node!"))
|
||
|
return itemstack
|
||
|
end
|
||
|
local res = tubelib.send_request(node_number, "set_numbers", text)
|
||
|
if res == true then
|
||
|
minetest.chat_send_player(player_name, S("[Tubelib Programmer] node programmed!"))
|
||
|
else
|
||
|
minetest.chat_send_player(player_name, S("[Tubelib Programmer] Error: programmer not supported!"))
|
||
|
end
|
||
|
return itemstack
|
||
|
else
|
||
|
return reset_programmer(itemstack, placer, pointed_thing)
|
||
|
end
|
||
|
end
|
||
|
|
||
|
minetest.register_craftitem("tubelib_addons2:programmer", {
|
||
|
description = S("Tubelib Programmer"),
|
||
|
inventory_image = "tubelib_addons2_programmer.png",
|
||
|
stack_max = 1,
|
||
|
wield_image = "tubelib_addons2_programmer_wield.png",
|
||
|
groups = {cracky=1, book=1},
|
||
|
-- left mouse button = program
|
||
|
on_use = program_numbers,
|
||
|
on_secondary_use = reset_programmer,
|
||
|
-- right mouse button = read
|
||
|
on_place = read_number,
|
||
|
})
|
||
|
|
||
|
minetest.register_craft({
|
||
|
output = "tubelib_addons2:programmer",
|
||
|
recipe = {
|
||
|
{"", "default:steel_ingot", ""},
|
||
|
{"", "tubelib:wlanchip", ""},
|
||
|
{"", "dye:red", ""},
|
||
|
},
|
||
|
})
|