mapgen.lua 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. local metric_mapgen_events_count
  2. if minetest.get_modpath("monitoring") then
  3. metric_mapgen_events_count = monitoring.gauge(
  4. "jumpdrive_mapgen_events_count",
  5. "number of events in the mapgen cache"
  6. )
  7. end
  8. local events = {} -- list of {minp, maxp, time}
  9. jumpdrive.mapgen = {}
  10. jumpdrive.mapgen.reset = function()
  11. events = {}
  12. end
  13. -- update last mapgen event time
  14. minetest.register_on_generated(function(minp, maxp, seed)
  15. table.insert(events, {
  16. minp = minp,
  17. maxp = maxp,
  18. time = minetest.get_us_time()
  19. })
  20. end)
  21. -- cleanup
  22. local timer = 0
  23. minetest.register_globalstep(function(dtime)
  24. timer = timer + dtime
  25. if timer < 5 then return end
  26. timer=0
  27. local time = minetest.get_us_time()
  28. local delay_seconds = 20
  29. local copied_events = events
  30. events = {}
  31. local count = 0
  32. for _, event in ipairs(copied_events) do
  33. if event.time > (time - (delay_seconds * 1000000)) then
  34. -- still recent
  35. table.insert(events, event)
  36. count = count + 1
  37. end
  38. end
  39. if metric_mapgen_events_count then
  40. metric_mapgen_events_count.set(count)
  41. end
  42. end)
  43. -- true = mapgen recently active in that area
  44. jumpdrive.check_mapgen = function(pos)
  45. for _, event in ipairs(events) do
  46. if vector.distance(pos, event.minp) < 200 then
  47. return true
  48. end
  49. end
  50. return false
  51. end