code.lua 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. local box = {
  2. type = 'fixed',
  3. fixed = {-.4, -.5, -.4, .4, -.4, .4}, -- Right, Bottom, Back, Left, Top, Front
  4. }
  5. local function code_formspec_answer(pos)
  6. local meta = minetest.get_meta(pos)
  7. local num = math.random(800000,900000)
  8. meta:set_string('num', num)
  9. local formspec =
  10. 'formspec_version[3]'..
  11. 'size[8,8]'..
  12. 'background[0,0;8,8;tasks_code_entry_bg.png]'..
  13. 'hypertext[.75,.75;6.5,2.25;nil;<global halign=center valign=middle><style color=black size=50>'..num..'<style>]'
  14. return formspec
  15. end
  16. local code_formspec_question =
  17. 'formspec_version[3]'..
  18. 'size[8,8]'..
  19. 'background[0,0;8,8;tasks_code_entry_bg.png]'..
  20. 'hypertext[.75,.75;6.5,1.25;nil;<global halign=center valign=middle><style color=black size=50>Enter Code:<style>]'..
  21. 'style_type[field;border=false;font=mono;font_size=50;textcolor=black]'..
  22. 'field[.75,1.8;6.5,1;number;;]'..
  23. 'style_type[button;border=false;bgimg=blank.png]'..
  24. 'style_type[button:hovered;bgimg=tasks_code_btn_sel.png]'..
  25. 'button_exit[2.58,6.44;1,1;save;]'..
  26. 'button_exit[.58,6.44;1,1;quit;]'
  27. minetest.register_node('tasks:code_0', {
  28. description = 'code node',
  29. drawtype = 'mesh',
  30. param = 'light',
  31. paramtype2 = 'wallmounted',
  32. mesh = 'tasks_wall_panel.obj',
  33. tiles = {'task_screen.png'},
  34. groups = {breakable=1, tasks=1},
  35. light_source = 14,
  36. selection_box = box,
  37. collision_box = box,
  38. on_construct = function(pos)
  39. local meta = minetest.get_meta(pos)
  40. meta:set_int('time_min', 240)
  41. meta:set_int('time_max', 600)
  42. meta:set_int('xp', 1)
  43. meta:set_int('level', 0)
  44. meta:set_string('infotext', '')
  45. meta:set_string('info_working', '')
  46. meta:set_string('info_repair', 'Awaiting code entry')
  47. end,
  48. on_rightclick = function(pos, node, clicker)
  49. local timer = minetest.get_node_timer(pos)
  50. local meta = minetest.get_meta(pos)
  51. local min = meta:get_int('time_min') or 30
  52. local max = meta:get_int('time_max') or 60
  53. local random_number = math.random(min,max)
  54. timer:start(random_number)
  55. minetest.chat_send_player(clicker:get_player_name(), 'No code required now.')
  56. end,
  57. on_timer = function(pos)
  58. local node = minetest.get_node(pos)
  59. local meta = minetest.get_meta(pos)
  60. local infotext = meta:get_string('info_repair')
  61. minetest.swap_node(pos, {name = 'tasks:code_1', param2 = node.param2})
  62. meta:set_string('infotext', infotext)
  63. end,
  64. })
  65. minetest.register_node('tasks:code_1', {
  66. description = 'code node',
  67. drawtype = 'mesh',
  68. param = 'light',
  69. paramtype2 = 'wallmounted',
  70. mesh = 'tasks_wall_panel.obj',
  71. tiles = {'task_screen_1.png'},
  72. groups = {breakable=1, not_in_creative_inventory=1, tasks=1},
  73. light_source = 2,
  74. selection_box = box,
  75. collision_box = box,
  76. drop = 'tasks:code_0',
  77. on_rightclick = function(pos, node, clicker)
  78. local name = clicker:get_player_name()
  79. local map_id = lobby.game[name]
  80. local sabotage_level = lobby.sabotage_level[map_id] or 5
  81. local meta = minetest.get_meta(pos)
  82. local level = meta:get_int('level') or 0
  83. if level < sabotage_level then
  84. tasks.player_config[name] = pos
  85. minetest.show_formspec(name, 'tasks:code', code_formspec_answer(pos))
  86. minetest.after(2, function()
  87. minetest.show_formspec(name, 'tasks:code', code_formspec_question)
  88. end)
  89. end
  90. end
  91. })
  92. minetest.register_on_player_receive_fields(function(player, formname, fields)
  93. local name = player:get_player_name()
  94. if formname == 'tasks:code' then
  95. if fields.save or fields.number then
  96. local pos = tasks.player_config[name]
  97. local meta = minetest.get_meta(pos)
  98. local answer = meta:get_string('num')
  99. if answer == fields.number then
  100. local node = minetest.get_node(pos)
  101. local infotext = meta:get_string('info_working')
  102. tasks.add_xp(pos, node, player, 'tasks:code_0')
  103. meta:set_string('infotext', infotext)
  104. else
  105. minetest.chat_send_player(name, 'Try again!')
  106. end
  107. end
  108. end
  109. end)