cherenkov.lua 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. -- LUALOCALS < ---------------------------------------------------------
  2. local math, minetest, nodecore, pairs, vector
  3. = math, minetest, nodecore, pairs, vector
  4. local math_random
  5. = math.random
  6. -- LUALOCALS > ---------------------------------------------------------
  7. local modname = minetest.get_current_modname()
  8. local particle = modname .. "_base.png^[mask:" .. modname .. "_dot_mask.png^[opacity:32"
  9. local function check(pos, player)
  10. local p = player:get_pos();
  11. p = {
  12. x = p.x + nodecore.boxmuller() * 2,
  13. y = p.y + nodecore.boxmuller() * 2,
  14. z = p.z + nodecore.boxmuller() * 2,
  15. }
  16. local light = nodecore.get_node_light(p)
  17. if (not light) or (light >= math_random(4, 8)) then return end
  18. local rel = vector.subtract(p, pos)
  19. local dsqr = vector.dot(rel, rel)
  20. if math_random() * 128 < dsqr then return end
  21. local pname = player:get_player_name()
  22. minetest.after(math_random(), function()
  23. minetest.add_particle({
  24. pos = p,
  25. velocity = vector.multiply(vector.normalize(rel), 4),
  26. texture = particle,
  27. exptime = 0.25,
  28. playername = pname,
  29. glow = 8
  30. })
  31. end)
  32. return check(pos, player)
  33. end
  34. nodecore.register_limited_abm({
  35. label = "lux react",
  36. interval = 1,
  37. chance = 2,
  38. nodenames = {"group:lux_emit"},
  39. action = function(pos)
  40. for _, player in pairs(minetest.get_connected_players()) do
  41. check(pos, player)
  42. end
  43. end
  44. })