init.lua 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. local radius = 8
  2. local height = 4
  3. local freq = 3
  4. local kpos = {}
  5. local enable_kpos = false
  6. minetest.register_on_joinplayer(function(player)
  7. local inv = player:get_inventory()
  8. for i = 1, inv:get_size("main") do
  9. local stack = inv:get_stack("main", i)
  10. local itemname = stack:get_name()
  11. if not minetest.registered_items[itemname] or
  12. minetest.registered_items[itemname].name == "air" then
  13. inv:set_stack("main", i, "")
  14. end
  15. end
  16. end)
  17. local vnew = vector.new
  18. local function clean()
  19. local players = minetest.get_connected_players()
  20. for i = 1, #players do
  21. local player = players[i]
  22. local pos = player:get_pos()
  23. for x = -radius, radius do
  24. for y = -height, height do
  25. for z = -radius, radius do
  26. local pos_scan = vnew(pos.x + x, pos.y + y, pos.z + z)
  27. local nodename = minetest.get_node(pos_scan).name
  28. if enable_kpos then
  29. local hash = minetest.hash_node_position(pos_scan)
  30. if not kpos[hash] then
  31. local nodename = minetest.get_node(pos_scan).name
  32. if not minetest.registered_nodes[nodename] then
  33. minetest.remove_node(pos_scan)
  34. end
  35. kpos[hash] = true
  36. end
  37. else
  38. if not minetest.registered_nodes[nodename] then
  39. minetest.remove_node(pos_scan)
  40. end
  41. end
  42. local objs = minetest.get_objects_inside_radius(pos_scan, 0.5)
  43. if #objs > 0 then
  44. for j = 1, #objs do
  45. local obj = objs[j]
  46. if not obj:is_player() then
  47. local entname = obj:get_entity_name()
  48. if not minetest.registered_entities[entname] then
  49. obj:remove()
  50. end
  51. end
  52. end
  53. end
  54. end
  55. end
  56. end
  57. end
  58. minetest.after(freq, clean)
  59. end
  60. minetest.after(freq, clean)