chute.lua 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. -- internationalization boilerplate
  2. local MP = minetest.get_modpath(minetest.get_current_modname())
  3. local S, NS = dofile(MP.."/intllib.lua")
  4. local function get_chute_formspec(pos)
  5. local spos = hopper.get_string_pos(pos)
  6. local formspec =
  7. "size[8,7]"
  8. .. hopper.formspec_bg
  9. .. "list[nodemeta:" .. spos .. ";main;3,0.3;2,2;]"
  10. .. hopper.get_eject_button_texts(pos, 7, 0.8)
  11. .. "list[current_player;main;0,2.85;8,1;]"
  12. .. "list[current_player;main;0,4.08;8,3;8]"
  13. .. "listring[nodemeta:" .. spos .. ";main]"
  14. .. "listring[current_player;main]"
  15. return formspec
  16. end
  17. minetest.register_node("hopper:chute", {
  18. description = S("Hopper Chute"),
  19. _doc_items_longdesc = hopper.doc.chute_long_desc,
  20. _doc_items_usagehelp = hopper.doc.chute_usage,
  21. drop = "hopper:chute",
  22. groups = {cracky = 3},
  23. sounds = hopper.metal_sounds,
  24. drawtype = "nodebox",
  25. paramtype = "light",
  26. paramtype2 = "facedir",
  27. tiles = {
  28. "hopper_bottom_" .. hopper.config.texture_resolution .. ".png^hopper_chute_arrow_" .. hopper.config.texture_resolution .. ".png",
  29. "hopper_bottom_" .. hopper.config.texture_resolution .. ".png^(hopper_chute_arrow_" .. hopper.config.texture_resolution .. ".png^[transformR180)",
  30. "hopper_bottom_" .. hopper.config.texture_resolution .. ".png^(hopper_chute_arrow_" .. hopper.config.texture_resolution .. ".png^[transformR270)",
  31. "hopper_bottom_" .. hopper.config.texture_resolution .. ".png^(hopper_chute_arrow_" .. hopper.config.texture_resolution .. ".png^[transformR90)",
  32. "hopper_top_" .. hopper.config.texture_resolution .. ".png",
  33. "hopper_bottom_" .. hopper.config.texture_resolution .. ".png"
  34. },
  35. node_box = {
  36. type = "fixed",
  37. fixed = {
  38. {-0.3, -0.3, -0.3, 0.3, 0.3, 0.3},
  39. {-0.2, -0.2, 0.3, 0.2, 0.2, 0.7},
  40. },
  41. },
  42. on_construct = function(pos)
  43. local inv = minetest.get_meta(pos):get_inventory()
  44. inv:set_size("main", 2*2)
  45. end,
  46. on_place = function(itemstack, placer, pointed_thing, node_name)
  47. local pos = pointed_thing.under
  48. local pos2 = pointed_thing.above
  49. local x = pos.x - pos2.x
  50. local z = pos.z - pos2.z
  51. if not placer then
  52. return itemstack
  53. end
  54. local pos = pointed_thing.above
  55. if minetest.is_protected(pos, placer:get_player_name()) then
  56. return itemstack
  57. end
  58. local returned_stack, success = minetest.item_place_node(itemstack, placer, pointed_thing)
  59. if success then
  60. local meta = minetest.get_meta(pos2)
  61. meta:set_string("placer", placer:get_player_name())
  62. end
  63. return returned_stack
  64. end,
  65. can_dig = function(pos,player)
  66. local inv = minetest.get_meta(pos):get_inventory()
  67. return inv:is_empty("main")
  68. end,
  69. on_rightclick = function(pos, node, clicker, itemstack)
  70. if minetest.is_protected(pos, clicker:get_player_name()) and not minetest.check_player_privs(clicker, "protection_bypass") then
  71. return
  72. end
  73. minetest.show_formspec(clicker:get_player_name(),
  74. "hopper_formspec:"..minetest.pos_to_string(pos), get_chute_formspec(pos))
  75. end,
  76. allow_metadata_inventory_put = function(pos, listname, index, stack, player)
  77. return stack:get_count()
  78. end,
  79. on_metadata_inventory_put = function(pos, listname, index, stack, player)
  80. minetest.log("action", S("@1 moves stuff to chute at @2",
  81. player:get_player_name(), minetest.pos_to_string(pos)))
  82. local timer = minetest.get_node_timer(pos)
  83. if not timer:is_started() then
  84. timer:start(1)
  85. end
  86. end,
  87. on_timer = function(pos, elapsed)
  88. local meta = minetest.get_meta(pos);
  89. local inv = meta:get_inventory()
  90. local node = minetest.get_node(pos)
  91. local dir = minetest.facedir_to_dir(node.param2)
  92. local destination_pos = vector.add(pos, dir)
  93. local output_direction
  94. if dir.y == 0 then
  95. output_direction = "horizontal"
  96. end
  97. local destination_node = minetest.get_node(destination_pos)
  98. local registered_inventories = hopper.get_registered_inventories_for(destination_node.name)
  99. if registered_inventories ~= nil then
  100. if output_direction == "horizontal" then
  101. hopper.send_item_to(pos, destination_pos, destination_node, registered_inventories["side"])
  102. else
  103. hopper.send_item_to(pos, destination_pos, destination_node, registered_inventories["bottom"])
  104. end
  105. else
  106. hopper.send_item_to(pos, destination_pos, destination_node)
  107. end
  108. if not inv:is_empty("main") then
  109. minetest.get_node_timer(pos):start(1)
  110. end
  111. end,
  112. })