mesecons_converter.lua 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158
  1. --[[
  2. Tubelib Addons 2
  3. ================
  4. Copyright (C) 2017-2020 Joachim Stolberg
  5. AGPL v3
  6. See LICENSE.txt for more information
  7. mesecons_converter.lua:
  8. ]]--
  9. -- Load support for I18n
  10. local S = tubelib_addons2.S
  11. local OVER_LOAD_MAX = 5
  12. local function formspec(meta)
  13. local numbers = meta:get_string("numbers")
  14. return "size[7,5]"..
  15. "field[0.5,2;6,1;number;"..S("Destination node numbers")..";"..numbers.."]" ..
  16. "button_exit[1,3;2,1;exit;"..S("Save").."]"
  17. end
  18. local function send_message(pos, topic, payload)
  19. local meta = minetest.get_meta(pos)
  20. local owner = meta:get_string("owner")
  21. local numbers = meta:get_string("numbers")
  22. local overload_cnt = meta:get_int("overload_cnt") + 1
  23. meta:set_int("overload_cnt", overload_cnt)
  24. if overload_cnt > OVER_LOAD_MAX then
  25. local own_number = meta:get_string("own_number")
  26. meta:set_string("infotext", S("Tubelib Mesecons Converter").." "..own_number..S(": fault (overloaded)"))
  27. minetest.get_node_timer(pos):stop()
  28. return
  29. else
  30. if topic == "change" then
  31. topic = meta:get_string("state") == "on" and "off" or "on"
  32. end
  33. tubelib.send_message(numbers, owner, nil, topic, payload)
  34. end
  35. meta:set_string("state", topic)
  36. end
  37. minetest.register_node("tubelib_addons2:mesecons_converter", {
  38. description = S("Tubelib Mesecons Converter"),
  39. tiles = {
  40. -- up, down, right, left, back, front
  41. 'tubelib_front.png',
  42. 'tubelib_front.png',
  43. 'tubelib_front.png^tubelib_addon2_mesecons_converter.png',
  44. },
  45. after_place_node = function(pos, placer)
  46. local meta = minetest.get_meta(pos)
  47. local own_number = tubelib.add_node(pos, "tubelib_addons2:mesecons_converter")
  48. meta:set_string("own_number", own_number)
  49. meta:set_string("formspec", formspec(meta))
  50. meta:set_string("infotext", S("Tubelib Mesecons Converter").." "..own_number..S(": not connected"))
  51. meta:set_string("owner", placer:get_player_name())
  52. -- send_message is called 24 times after the node is placed
  53. meta:set_int("overload_cnt", -24)
  54. minetest.get_node_timer(pos):start(1)
  55. end,
  56. on_receive_fields = function(pos, formname, fields, player)
  57. local meta = minetest.get_meta(pos)
  58. local owner = meta:get_string("owner")
  59. if owner ~= player:get_player_name() then
  60. return
  61. end
  62. if tubelib.check_numbers(fields.number) then
  63. meta:set_string("numbers", fields.number)
  64. local own_number = meta:get_string("own_number")
  65. meta:set_string("infotext", S("Tubelib Mesecons Converter").." "..own_number..S(": connected with").." "..fields.number)
  66. meta:set_string("formspec", formspec(meta))
  67. end
  68. local timer = minetest.get_node_timer(pos)
  69. if not timer:is_started() then
  70. timer:start(1)
  71. end
  72. end,
  73. mesecons = {
  74. receptor = {
  75. state = mesecon.state.off,
  76. rules = mesecon.rules.default,
  77. },
  78. effector = {
  79. rules = mesecon.rules.default,
  80. action_on = function (pos, node)
  81. local meta = minetest.get_meta(pos)
  82. local own_number = meta:get_string("own_number")
  83. send_message(pos, "on", own_number)
  84. end,
  85. action_off = function (pos, node)
  86. local meta = minetest.get_meta(pos)
  87. local own_number = meta:get_string("own_number")
  88. send_message(pos, "off", own_number)
  89. end,
  90. action_change = function (pos, node)
  91. local meta = minetest.get_meta(pos)
  92. local own_number = meta:get_string("own_number")
  93. send_message(pos, "change", own_number)
  94. end,
  95. }
  96. },
  97. on_timer = function(pos,elapsed)
  98. if tubelib.data_not_corrupted(pos) then
  99. local meta = minetest.get_meta(pos)
  100. meta:set_int("overload_cnt", 0)
  101. return true
  102. end
  103. return false
  104. end,
  105. after_dig_node = function(pos)
  106. tubelib.remove_node(pos)
  107. end,
  108. paramtype = "light",
  109. sunlight_propagates = true,
  110. paramtype2 = "facedir",
  111. groups = {choppy=2, cracky=2, crumbly=2},
  112. is_ground_content = false,
  113. sounds = default.node_sound_stone_defaults(),
  114. })
  115. minetest.register_craft({
  116. output = "tubelib_addons2:mesecons_converter",
  117. recipe = {
  118. {"tubelib:button", "mesecons:wire_00000000_off"},
  119. },
  120. })
  121. tubelib.register_node("tubelib_addons2:mesecons_converter", {}, {
  122. on_recv_message = function(pos, topic, payload)
  123. if topic == "on" then
  124. mesecon.receptor_on(pos, mesecon.rules.default)
  125. elseif topic == "off" then
  126. mesecon.receptor_off(pos, mesecon.rules.default)
  127. elseif topic == "set_numbers" then
  128. local meta = minetest.get_meta(pos)
  129. local own_number = meta:get_string("own_number")
  130. meta:set_string("infotext", S("Tubelib Mesecons Converter").." "..own_number..S(": connected with").." "..payload)
  131. meta:set_string("numbers", payload)
  132. meta:set_string("formspec", formspec(meta))
  133. return true
  134. end
  135. end,
  136. })