init.lua 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. local well_capacity = 20.0 --Units are amount of buckets fillable
  2. local barrel_capacity = 5.0
  3. local well_interval = 2400 --In seconds
  4. local barrel_interval = ((snowdrift and snowdrift.get_precip) and 300 or 1200)
  5. -- If you use snowdrift (and a version which provides get_precip),
  6. -- Then rain barrels fill MUCH more quickly than wells, but only in the rain.
  7. -- Otherwise, they're only twice as fast.
  8. minetest.override_item("default:water_source", {
  9. liquid_renewable = false,
  10. })
  11. minetest.override_item("default:water_flowing", {
  12. liquid_renewable = false,
  13. })
  14. local function barrel_drain(pos,_,player)
  15. local name = player:get_player_name()
  16. if minetest.is_protected(pos, name)
  17. and not minetest.check_player_privs(name, {protection_bypass=true})
  18. then return end
  19. local meta = minetest.get_meta(pos)
  20. local water = meta:get_float("water") or 0.0
  21. if not (player:get_wielded_item():get_name() == "bucket:bucket_empty") then return end
  22. if water >= 1.0 then --Code copied from buckets
  23. water = water - 1.0
  24. local item_count = player:get_wielded_item():get_count()
  25. local giving_back = "bucket:bucket_water"
  26. if item_count > 1 then
  27. -- if space in inventory add filled bucked, otherwise drop as item
  28. local inv = player:get_inventory()
  29. if inv:room_for_item("main", {name="bucket:bucket_water"}) then
  30. inv:add_item("main", "bucket:bucket_water")
  31. else
  32. local pos = player:getpos()
  33. pos.y = math.floor(pos.y + 0.5)
  34. minetest.add_item(pos, "bucket:bucket_water")
  35. end
  36. -- set to return empty buckets minus 1
  37. giving_back = "bucket:bucket_empty "..tostring(item_count-1)
  38. end
  39. player:set_wielded_item(giving_back)
  40. meta:set_float("water", water)
  41. else
  42. minetest.chat_send_player(name, "There's not enough water in this container to fill a bucket.")
  43. end
  44. end
  45. local function barrel_fill(pos,capacity)
  46. local meta = minetest.get_meta(pos)
  47. local water = meta:get_float("water") or 0.0
  48. local raise = (math.random(1,3)/2) --0.5, 1, or 1.5
  49. if (water + raise) < capacity then
  50. water = water + raise
  51. else
  52. water = capacity
  53. end
  54. meta:set_float("water", water)
  55. end
  56. minetest.register_node("rainbarrel:well", {
  57. description = "Well",
  58. drawtype = "mesh",
  59. mesh = "rainbarrel_well.obj",
  60. paramtype = "light",
  61. groups = {cracky=3},
  62. tiles = {minetest.registered_nodes["default:water_source"].tiles[1],"default_wood.png","default_stone.png","default_cobble.png"},
  63. collision_box = {type="fixed", fixed={-0.6,-0.5,-0.6,0.6,1.0,0.6}},
  64. selection_box = {type="fixed", fixed={-0.6,-0.5,-0.6,0.6,1.0,0.6}},
  65. on_timer = function(pos)
  66. barrel_fill(pos, well_capacity)
  67. minetest.get_node_timer(pos):start(well_interval)
  68. end,
  69. on_construct = function(pos)
  70. minetest.get_node_timer(pos):start(well_interval)
  71. end,
  72. on_punch = barrel_drain,
  73. })
  74. minetest.register_node("rainbarrel:barrel", {
  75. description = "Rain Barrel",
  76. drawtype = "nodebox",
  77. node_box = {type="fixed",
  78. fixed = {
  79. {-0.375,-0.5,-0.375,0.375,0.5,0.375},
  80. {-0.0625,-0.4375,-0.375,0.0625,-0.3125,-0.5}
  81. }
  82. },
  83. paramtype = "light",
  84. paramtype2 = "facedir",
  85. groups = {choppy=2,oddly_breakable_by_hand=1},
  86. tiles = {"rainbarrel_top.png","rainbarrel_top.png^[transformR180","rainbarrel_side.png","rainbarrel_side.png","rainbarrel_side.png","rainbarrel_front.png"},
  87. on_punch = barrel_drain,
  88. on_place = minetest.rotate_node,
  89. on_timer = function(pos)
  90. local canfill = (minetest.get_node_light({x=pos.x,y=pos.y+1,z=pos.z}, 0.5) == 15)
  91. if canfill and snowdrift and snowdrift.get_precip then
  92. if snowdrift.get_precip(pos) ~= "rain" then
  93. canfill = false
  94. end
  95. end
  96. if canfill then
  97. barrel_fill(pos, barrel_capacity)
  98. end
  99. minetest.get_node_timer(pos):start(barrel_interval)
  100. end,
  101. on_construct = function(pos)
  102. minetest.get_node_timer(pos):start(barrel_interval)
  103. end,
  104. })
  105. local w = "group:wood"
  106. local c = "default:cobble"
  107. local b = "bucket:bucket_empty"
  108. minetest.register_craft({
  109. output="rainbarrel:barrel",
  110. recipe={
  111. {w,"",w},
  112. {w,b,w},
  113. {w,w,w},
  114. }
  115. })
  116. minetest.register_craft({
  117. output="rainbarrel:well",
  118. recipe={
  119. {w,w,w},
  120. {c,b,c},
  121. {c,"",c},
  122. }
  123. })