programmer.lua 2.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. --[[
  2. Tubelib Addons 2
  3. ================
  4. Copyright (C) 2017-2020 Joachim Stolberg
  5. AGPL v3
  6. See LICENSE.txt for more information
  7. programmer.lua:
  8. ]]--
  9. -- Load support for I18n
  10. local S = tubelib_addons2.S
  11. local function join_to_string(tbl)
  12. local t = {}
  13. for key,_ in pairs(tbl) do
  14. t[#t + 1] = key .. " "
  15. end
  16. -- remove the last blank
  17. return string.sub(table.concat(t), 1, -2)
  18. end
  19. local function reset_programmer(itemstack, user, pointed_thing)
  20. user:set_attribute("tubelib_prog_numbers", nil)
  21. minetest.chat_send_player(user:get_player_name(), S("[Tubelib Programmer] programmer reset"))
  22. return itemstack
  23. end
  24. local function read_number(itemstack, user, pointed_thing)
  25. local pos = pointed_thing.under
  26. if pos then
  27. local number = tubelib.get_node_number(pos)
  28. if number then
  29. local numbers = minetest.deserialize(user:get_attribute("tubelib_prog_numbers")) or {}
  30. numbers[number] = true
  31. user:set_attribute("tubelib_prog_numbers", minetest.serialize(numbers))
  32. minetest.chat_send_player(user:get_player_name(), S("[Tubelib Programmer] number").." "..number.." "..S("read"))
  33. else
  34. minetest.chat_send_player(user:get_player_name(), S("[Tubelib Programmer] Unknown node on").." "..minetest.pos_to_string(pos))
  35. end
  36. else
  37. return reset_programmer(itemstack, user, pointed_thing)
  38. end
  39. return itemstack
  40. end
  41. local function program_numbers(itemstack, placer, pointed_thing)
  42. local pos = pointed_thing.under
  43. if pos then
  44. local meta = minetest.get_meta(pos)
  45. local node_number = tubelib.get_node_number(pos)
  46. local numbers = minetest.deserialize(placer:get_attribute("tubelib_prog_numbers")) or {}
  47. placer:set_attribute("tubelib_prog_numbers", nil)
  48. local text = join_to_string(numbers)
  49. local player_name = placer:get_player_name()
  50. if meta and meta:get_string("owner") ~= player_name then
  51. minetest.chat_send_player(player_name, S("[Tubelib Programmer] foreign or unknown node!"))
  52. return itemstack
  53. end
  54. local res = tubelib.send_request(node_number, "set_numbers", text)
  55. if res == true then
  56. minetest.chat_send_player(player_name, S("[Tubelib Programmer] node programmed!"))
  57. else
  58. minetest.chat_send_player(player_name, S("[Tubelib Programmer] Error: programmer not supported!"))
  59. end
  60. return itemstack
  61. else
  62. return reset_programmer(itemstack, placer, pointed_thing)
  63. end
  64. end
  65. minetest.register_craftitem("tubelib_addons2:programmer", {
  66. description = S("Tubelib Programmer"),
  67. inventory_image = "tubelib_addons2_programmer.png",
  68. stack_max = 1,
  69. wield_image = "tubelib_addons2_programmer_wield.png",
  70. groups = {cracky=1, book=1},
  71. -- left mouse button = program
  72. on_use = program_numbers,
  73. on_secondary_use = reset_programmer,
  74. -- right mouse button = read
  75. on_place = read_number,
  76. })
  77. minetest.register_craft({
  78. output = "tubelib_addons2:programmer",
  79. recipe = {
  80. {"", "default:steel_ingot", ""},
  81. {"", "tubelib:wlanchip", ""},
  82. {"", "dye:red", ""},
  83. },
  84. })