--[[ TechAge ======= Copyright (C) 2017-2020 Joachim Stolberg GPL v3 See LICENSE.txt for more information Number programmer ]]-- -- for lazy programmers local M = minetest.get_meta local S = techage.S local function join_to_string(tbl) local t = {} for key,_ in pairs(tbl) do t[#t + 1] = key end return table.concat(t, " ") end local function reset_programmer(itemstack, user, pointed_thing) user:set_attribute("techage_prog_numbers", nil) minetest.chat_send_player(user:get_player_name(), S("[TechAge Programmer] programmer reset")) return itemstack end local function read_number(itemstack, user, pointed_thing) local pos = pointed_thing.under if pos then local number = techage.get_node_number(pos) if number then local numbers = minetest.deserialize(user:get_attribute("techage_prog_numbers")) or {} techage.add_to_set(numbers, number) user:set_attribute("techage_prog_numbers", minetest.serialize(numbers)) minetest.chat_send_player(user:get_player_name(), S("[TechAge Programmer] number").." "..number.." read") else minetest.chat_send_player(user:get_player_name(), S("[TechAge 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 = M(pos) local numbers = minetest.deserialize(placer:get_attribute("techage_prog_numbers")) or {} placer:set_attribute("techage_prog_numbers", nil) local player_name = placer:get_player_name() if meta and meta:get_string("owner") ~= player_name then minetest.chat_send_player(player_name, S("[TechAge Programmer] foreign or unknown node!")) return itemstack end local text = table.concat(numbers, " ") local ndef = minetest.registered_nodes[minetest.get_node(pos).name] if ndef and ndef.techage_set_numbers then local res = ndef.techage_set_numbers(pos, text, player_name) if res == true then minetest.chat_send_player(player_name, S("[TechAge Programmer] node programmed!")) else minetest.chat_send_player(player_name, S("[TechAge Programmer] Error: invalid numbers!")) end else minetest.chat_send_player(player_name, S("[TechAge Programmer] Error: programmer not supported!")) end return itemstack else return reset_programmer(itemstack, placer, pointed_thing) end end minetest.register_craftitem("techage:programmer", { description = S("TechAge Programmer (right = read number, left = write numbers)"), inventory_image = "techage_programmer.png", stack_max = 1, wield_image = "techage_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 = "techage:programmer", recipe = { {"", "default:steel_ingot", ""}, {"", "techage:ta4_wlanchip", ""}, {"", "dye:red", ""}, }, })