chute.lua 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  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. use_texture_alpha = "clip",
  36. node_box = {
  37. type = "fixed",
  38. fixed = {
  39. {-0.3, -0.3, -0.3, 0.3, 0.3, 0.3},
  40. {-0.2, -0.2, 0.3, 0.2, 0.2, 0.7},
  41. },
  42. },
  43. on_construct = function(pos)
  44. local inv = minetest.get_meta(pos):get_inventory()
  45. inv:set_size("main", 2*2)
  46. end,
  47. on_place = function(itemstack, placer, pointed_thing, node_name)
  48. local pos = pointed_thing.under
  49. local pos2 = pointed_thing.above
  50. local x = pos.x - pos2.x
  51. local z = pos.z - pos2.z
  52. if not placer then
  53. return itemstack
  54. end
  55. local pos = pointed_thing.above
  56. if minetest.is_protected(pos, placer:get_player_name()) then
  57. return itemstack
  58. end
  59. local returned_stack, success = minetest.item_place_node(itemstack, placer, pointed_thing)
  60. if success then
  61. local meta = minetest.get_meta(pos2)
  62. meta:set_string("placer", placer:get_player_name())
  63. end
  64. return returned_stack
  65. end,
  66. can_dig = function(pos,player)
  67. local inv = minetest.get_meta(pos):get_inventory()
  68. return inv:is_empty("main")
  69. end,
  70. on_rightclick = function(pos, node, clicker, itemstack)
  71. if minetest.is_protected(pos, clicker:get_player_name()) and not minetest.check_player_privs(clicker, "protection_bypass") then
  72. return
  73. end
  74. minetest.show_formspec(clicker:get_player_name(),
  75. "hopper_formspec:"..minetest.pos_to_string(pos), get_chute_formspec(pos))
  76. end,
  77. allow_metadata_inventory_put = function(pos, listname, index, stack, player)
  78. return stack:get_count()
  79. end,
  80. on_metadata_inventory_put = function(pos, listname, index, stack, player)
  81. minetest.log("action", S("@1 moves stuff to chute at @2",
  82. player:get_player_name(), minetest.pos_to_string(pos)))
  83. local timer = minetest.get_node_timer(pos)
  84. if not timer:is_started() then
  85. timer:start(1)
  86. end
  87. end,
  88. on_timer = function(pos, elapsed)
  89. local meta = minetest.get_meta(pos);
  90. local inv = meta:get_inventory()
  91. local node = minetest.get_node(pos)
  92. local dir = minetest.facedir_to_dir(node.param2)
  93. local destination_pos = vector.add(pos, dir)
  94. local output_direction
  95. if dir.y == 0 then
  96. output_direction = "horizontal"
  97. end
  98. local destination_node = minetest.get_node(destination_pos)
  99. local registered_inventories = hopper.get_registered_inventories_for(destination_node.name)
  100. if registered_inventories ~= nil then
  101. if output_direction == "horizontal" then
  102. hopper.send_item_to(pos, destination_pos, destination_node, registered_inventories["side"])
  103. else
  104. hopper.send_item_to(pos, destination_pos, destination_node, registered_inventories["bottom"])
  105. end
  106. else
  107. hopper.send_item_to(pos, destination_pos, destination_node)
  108. end
  109. if not inv:is_empty("main") then
  110. minetest.get_node_timer(pos):start(1)
  111. end
  112. end,
  113. })