init.lua 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. local players = {}
  2. local player_positions = {}
  3. local last_wielded = {}
  4. function round(num)
  5. return math.floor(num + 0.5)
  6. end
  7. minetest.register_on_joinplayer(function(player)
  8. local player_name = player:get_player_name()
  9. table.insert(players, player_name)
  10. last_wielded[player_name] = player:get_wielded_item():get_name()
  11. local pos = player:getpos()
  12. local rounded_pos = {x=round(pos.x),y=round(pos.y)+1,z=round(pos.z)}
  13. local wielded_item = player:get_wielded_item():get_name()
  14. if wielded_item ~= "default:torch" and wielded_item ~= "walking_light:pick_mese" then
  15. -- Neuberechnung des Lichts erzwingen
  16. minetest.env:add_node(rounded_pos,{type="node",name="default:cobble"})
  17. minetest.env:add_node(rounded_pos,{type="node",name="air"})
  18. end
  19. player_positions[player_name] = {}
  20. player_positions[player_name]["x"] = rounded_pos.x;
  21. player_positions[player_name]["y"] = rounded_pos.y;
  22. player_positions[player_name]["z"] = rounded_pos.z;
  23. end)
  24. minetest.register_on_leaveplayer(function(player)
  25. local player_name = player:get_player_name()
  26. for i,v in ipairs(players) do
  27. if v == player_name then
  28. table.remove(players, i)
  29. last_wielded[player_name] = nil
  30. -- Neuberechnung des Lichts erzwingen
  31. local pos = player:getpos()
  32. local rounded_pos = {x=round(pos.x),y=round(pos.y)+1,z=round(pos.z)}
  33. minetest.env:add_node(rounded_pos,{type="node",name="default:cobble"})
  34. minetest.env:add_node(rounded_pos,{type="node",name="air"})
  35. player_positions[player_name]["x"] = nil
  36. player_positions[player_name]["y"] = nil
  37. player_positions[player_name]["z"] = nil
  38. player_positions[player_name]["m"] = nil
  39. player_positions[player_name] = nil
  40. end
  41. end
  42. end)
  43. minetest.register_globalstep(function(dtime)
  44. for i,player_name in ipairs(players) do
  45. local player = minetest.env:get_player_by_name(player_name)
  46. local wielded_item = player:get_wielded_item():get_name()
  47. if wielded_item == "default:torch" or wielded_item == "walking_light:pick_mese" then
  48. -- Fackel ist in der Hand
  49. local pos = player:getpos()
  50. local rounded_pos = {x=round(pos.x),y=round(pos.y)+1,z=round(pos.z)}
  51. if (last_wielded[player_name] ~= "default:torch" and last_wielded[player_name] ~= "walking_light:pick_mese") or (player_positions[player_name]["x"] ~= rounded_pos.x or player_positions[player_name]["y"] ~= rounded_pos.y or player_positions[player_name]["z"] ~= rounded_pos.z) then
  52. -- Fackel gerade in die Hand genommen oder zu neuem Node bewegt
  53. local is_air = minetest.env:get_node_or_nil(rounded_pos)
  54. if is_air == nil or (is_air ~= nil and (is_air.name == "air" or is_air.name == "walking_light:light")) then
  55. -- wenn an aktueller Position "air" ist, Fackellicht setzen
  56. minetest.env:add_node(rounded_pos,{type="node",name="walking_light:light"})
  57. end
  58. if (player_positions[player_name]["x"] ~= rounded_pos.x or player_positions[player_name]["y"] ~= rounded_pos.y or player_positions[player_name]["z"] ~= rounded_pos.z) then
  59. -- wenn Position geänder, dann altes Licht löschen
  60. local old_pos = {x=player_positions[player_name]["x"], y=player_positions[player_name]["y"], z=player_positions[player_name]["z"]}
  61. -- Neuberechnung des Lichts erzwingen
  62. local is_light = minetest.env:get_node_or_nil(old_pos)
  63. if is_light ~= nil and is_light.name == "walking_light:light" then
  64. minetest.env:add_node(old_pos,{type="node",name="default:cobble"})
  65. minetest.env:add_node(old_pos,{type="node",name="air"})
  66. end
  67. end
  68. -- gemerkte Position ist nun die gerundete neue Position
  69. player_positions[player_name]["x"] = rounded_pos.x
  70. player_positions[player_name]["y"] = rounded_pos.y
  71. player_positions[player_name]["z"] = rounded_pos.z
  72. end
  73. last_wielded[player_name] = wielded_item;
  74. elseif last_wielded[player_name] == "default:torch" or last_wielded[player_name] == "walking_light:pick_mese" then
  75. -- Fackel nicht in der Hand, aber beim letzten Durchgang war die Fackel noch in der Hand
  76. local pos = player:getpos()
  77. local rounded_pos = {x=round(pos.x),y=round(pos.y)+1,z=round(pos.z)}
  78. repeat
  79. local is_light = minetest.env:get_node_or_nil(rounded_pos)
  80. if is_light ~= nil and is_light.name == "walking_light:light" then
  81. -- minetest.env:remove_node(rounded_pos)
  82. -- Erzwinge Neuberechnung des Lichts
  83. minetest.env:add_node(rounded_pos,{type="node",name="default:cobble"})
  84. minetest.env:add_node(rounded_pos,{type="node",name="air"})
  85. end
  86. until minetest.env:get_node_or_nil(rounded_pos) ~= "walking_light:light"
  87. local old_pos = {x=player_positions[player_name]["x"], y=player_positions[player_name]["y"], z=player_positions[player_name]["z"]}
  88. repeat
  89. is_light = minetest.env:get_node_or_nil(old_pos)
  90. if is_light ~= nil and is_light.name == "walking_light:light" then
  91. -- minetest.env:remove_node(old_pos)
  92. -- Erzwinge Neuberechnung des Lichts
  93. minetest.env:add_node(old_pos,{type="node",name="default:cobble"})
  94. minetest.env:add_node(old_pos,{type="node",name="air"})
  95. end
  96. until minetest.env:get_node_or_nil(old_pos) ~= "walking_light:light"
  97. last_wielded[player_name] = wielded_item
  98. end
  99. end
  100. end)
  101. minetest.register_node("walking_light:light", {
  102. drawtype = "glasslike",
  103. tile_images = {"walking_light.png"},
  104. -- tile_images = {"walking_light_debug.png"},
  105. inventory_image = minetest.inventorycube("walking_light.png"),
  106. paramtype = "light",
  107. walkable = false,
  108. is_ground_content = true,
  109. light_propagates = true,
  110. sunlight_propagates = true,
  111. light_source = 14,
  112. selection_box = {
  113. type = "fixed",
  114. fixed = {0, 0, 0, 0, 0, 0},
  115. },
  116. })
  117. minetest.register_tool("walking_light:pick_mese", {
  118. description = "Mese Pickaxe with light",
  119. inventory_image = "walking_light_mesepick.png",
  120. wield_image = "default_tool_mesepick.png",
  121. tool_capabilities = {
  122. full_punch_interval = 1.0,
  123. max_drop_level=3,
  124. groupcaps={
  125. cracky={times={[1]=2.0, [2]=1.0, [3]=0.5}, uses=20, maxlevel=3},
  126. crumbly={times={[1]=2.0, [2]=1.0, [3]=0.5}, uses=20, maxlevel=3},
  127. snappy={times={[1]=2.0, [2]=1.0, [3]=0.5}, uses=20, maxlevel=3}
  128. }
  129. },
  130. })
  131. minetest.register_craft({
  132. output = 'walking_light:pick_mese',
  133. recipe = {
  134. {'default:torch'},
  135. {'default:pick_mese'},
  136. }
  137. })