init.lua 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. illumination = {}
  2. illumination.playerLights = {}
  3. local lightPoint = {
  4. drawtype = "airlike",
  5. paramtype = "light",
  6. groups = {not_in_creative_inventory=1},
  7. sunlight_propagates = true,
  8. can_dig = false,
  9. walkable = false,
  10. buildable_to = true,
  11. light_source = 4,
  12. selection_box = {
  13. type = "fixed",
  14. fixed = {0, 0, 0, 0, 0, 0}},
  15. }
  16. minetest.register_node("illumination:light_faint", lightPoint)
  17. lightPoint.light_source = 8
  18. minetest.register_node("illumination:light_dim", lightPoint)
  19. lightPoint.light_source = 12
  20. minetest.register_node("illumination:light_mid", lightPoint)
  21. lightPoint.light_source = 15
  22. minetest.register_node("illumination:light_full", lightPoint)
  23. minetest.register_abm({ --This should clean up nodes that don't get deleted for some reason
  24. nodenames={"illumination:light_faint","illumination:light_dim","illumination:light_mid","illumination:light_full"},
  25. interval=1,
  26. chance=1,
  27. action = function(pos)
  28. local canExist = false
  29. for _, player in ipairs(minetest.get_connected_players()) do
  30. if illumination.playerLights[player:get_player_name()] then
  31. local pos1 = illumination.playerLights[player:get_player_name()].pos
  32. if pos1 then
  33. if vector.equals(pos1,pos) then
  34. canExist = true
  35. end
  36. end
  37. end
  38. end
  39. if not canExist then
  40. minetest.remove_node(pos)
  41. end
  42. end
  43. })
  44. minetest.register_on_joinplayer(function(player)
  45. illumination.playerLights[player:get_player_name()] = {
  46. bright = 0,
  47. pos = vector.new(player:get_pos())
  48. }
  49. end)
  50. minetest.register_on_leaveplayer(function(player, _)
  51. local player_name = player:get_player_name()
  52. local remainingPlayers = {}
  53. for _, online in pairs(minetest.get_connected_players()) do
  54. if online:get_player_name() ~= player_name then
  55. remainingPlayers[online:get_player_name()] = illumination.playerLights[online:get_player_name()]
  56. end
  57. end
  58. illumination.playerLights = remainingPlayers
  59. end)
  60. local function canLight(nodeName)
  61. return (nodeName == "air" or nodeName == "illumination:light_faint" or nodeName == "illumination:light_dim" or nodeName == "illumination:light_mid" or nodeName == "illumination:light_full")
  62. end
  63. minetest.register_globalstep(function(dtime)
  64. for _, player in ipairs(minetest.get_connected_players()) do
  65. if illumination.playerLights[player:get_player_name()] then
  66. local light = 0
  67. if minetest.registered_nodes[player:get_wielded_item():get_name()] then
  68. light = minetest.registered_nodes[player:get_wielded_item():get_name()].light_source
  69. end
  70. local pos = player:get_pos()
  71. pos.x = math.floor(pos.x + 0.5)
  72. pos.y = math.floor(pos.y + 0.5)
  73. pos.z = math.floor(pos.z + 0.5)
  74. if not canLight(minetest.get_node(pos).name) then
  75. if canLight(minetest.get_node({x=pos.x, y=pos.y+1, z=pos.z}).name) then
  76. pos = {x=pos.x, y=pos.y+1, z=pos.z}
  77. elseif canLight(minetest.get_node({x=pos.x, y=pos.y+2, z=pos.z}).name) then
  78. pos = {x=pos.x, y=pos.y+2, z=pos.z}
  79. elseif canLight(minetest.get_node({x=pos.x, y=pos.y-1, z=pos.z}).name) then
  80. pos = {x=pos.x, y=pos.y-1, z=pos.z}
  81. elseif canLight(minetest.get_node({x=pos.x+1, y=pos.y, z=pos.z}).name) then
  82. pos = {x=pos.x+1, y=pos.y, z=pos.z}
  83. elseif canLight(minetest.get_node({x=pos.x, y=pos.y, z=pos.z+1}).name) then
  84. pos = {x=pos.x, y=pos.y, z=pos.z+1}
  85. elseif canLight(minetest.get_node({x=pos.x-1, y=pos.y, z=pos.z}).name) then
  86. pos = {x=pos.x-1, y=pos.y, z=pos.z}
  87. elseif canLight(minetest.get_node({x=pos.x, y=pos.y, z=pos.z-1}).name) then
  88. pos = {x=pos.x, y=pos.y, z=pos.z-1}
  89. elseif canLight(minetest.get_node({x=pos.x+1, y=pos.y+1, z=pos.z}).name) then
  90. pos = {x=pos.x+1, y=pos.y+1, z=pos.z}
  91. elseif canLight(minetest.get_node({x=pos.x-1, y=pos.y+1, z=pos.z}).name) then
  92. pos = {x=pos.x-1, y=pos.y+1, z=pos.z}
  93. elseif canLight(minetest.get_node({x=pos.x, y=pos.y+1, z=pos.z+1}).name) then
  94. pos = {x=pos.x, y=pos.y+1, z=pos.z+1}
  95. elseif canLight(minetest.get_node({x=pos.x, y=pos.y+1, z=pos.z-1}).name) then
  96. pos = {x=pos.x, y=pos.y+1, z=pos.z-1}
  97. end
  98. end
  99. local pos1 = illumination.playerLights[player:get_player_name()].pos
  100. local lightLast = illumination.playerLights[player:get_player_name()].bright
  101. illumination.playerLights[player:get_player_name()] = {}
  102. if canLight(minetest.get_node(pos).name) then
  103. illumination.playerLights[player:get_player_name()].bright = light
  104. illumination.playerLights[player:get_player_name()].pos = pos
  105. local nodeName = "air"
  106. if light > 2 then
  107. nodeName = "illumination:light_faint"
  108. end
  109. if light > 7 then
  110. nodeName = "illumination:light_dim"
  111. end
  112. if light > 10 then
  113. nodeName = "illumination:light_mid"
  114. end
  115. if light > 13 then
  116. nodeName = "illumination:light_full"
  117. end
  118. if nodeName then
  119. minetest.set_node(pos, {name=nodeName})
  120. end
  121. end
  122. if pos1 then
  123. if canLight(minetest.get_node(pos1).name) then
  124. if not vector.equals(pos, pos1) then
  125. minetest.remove_node(pos1)
  126. end
  127. end
  128. end
  129. end
  130. end
  131. end)