skybox_merger.lua 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. local default_sky = {
  2. sky_data = {
  3. base_color = nil,
  4. type = "regular",
  5. textures = nil,
  6. clouds = true,
  7. sky_color = {
  8. day_sky = "#8cbafa",
  9. day_horizon = "#9bc1f0",
  10. dawn_sky = "#b4bafa",
  11. dawn_horizon = "#bac1f0",
  12. night_sky = "#006aff",
  13. night_horizon = "#4090ff",
  14. indoors = "#646464",
  15. fog_tint_type = "default"
  16. }
  17. },
  18. cloud_data = {
  19. density = 0.4,
  20. color = "#fff0f0e5",
  21. ambient = "#000000",
  22. height = 120,
  23. thickness = 16,
  24. speed = {x=0, z=-2}
  25. },
  26. sun_data = {
  27. visible = true,
  28. texture = "sun.png",
  29. tonemap = "sun_tonemap.png",
  30. sunrise = "sunrisebg.png",
  31. sunrise_visible = true,
  32. scale = 1
  33. },
  34. moon_data = {
  35. visible = true,
  36. texture = "moon.png",
  37. tonemap = "moon_tonemap.png",
  38. scale = 1
  39. },
  40. star_data = {
  41. visible = true,
  42. count = 1000,
  43. star_color = "#ebebff69",
  44. scale = 1
  45. }
  46. }
  47. local skybox = {}
  48. local layers = {}
  49. -- from https://stackoverflow.com/a/29133654
  50. -- merges two tables together
  51. -- if in conflict, b will override values of a
  52. local function merge_tables(a, b)
  53. if type(a) == "table" and type(b) == "table" then
  54. for k,v in pairs(b) do
  55. if type(v)=="table" and type(a[k] or false)=="table" then
  56. merge_tables(a[k],v)
  57. else a[k]=v end
  58. end
  59. end
  60. return a
  61. end
  62. local function set_skybox(playername, sky)
  63. local player = minetest.get_player_by_name(playername)
  64. if player == nil or not player.get_stars then return end
  65. player:set_sky(sky.sky_data)
  66. player:set_clouds(sky.cloud_data)
  67. player:set_moon(sky.moon_data)
  68. player:set_sun(sky.sun_data)
  69. player:set_stars(sky.star_data)
  70. end
  71. function skybox.update(playername)
  72. local p_layers = layers[playername]
  73. local sky = table.copy(default_sky)
  74. if p_layers == nil then p_layers = {} end
  75. local numbered_layers = {}
  76. for layer, values in pairs(p_layers) do
  77. table.insert(numbered_layers, values)
  78. end
  79. table.sort(numbered_layers, function(left, right)
  80. if left.priority == nil then left.priority = 1 end
  81. if right.priority == nil then right.priority = 1 end
  82. return left.priority < right.priority
  83. end)
  84. for i = 1, #numbered_layers do
  85. sky = merge_tables(sky, numbered_layers[i])
  86. end
  87. set_skybox(playername, sky)
  88. end
  89. function skybox.add(playername, name, sky)
  90. if layers[playername] == nil then layers[playername] = {} end
  91. layers[playername][name] = sky
  92. end
  93. function skybox.remove(playername, name)
  94. if layers[playername] == nil or layers[playername][name] == nil then return end
  95. layers[playername][name] = nil
  96. end
  97. minetest.register_on_leaveplayer(function(player)
  98. local playername = player:get_player_name()
  99. layers[playername] = nil
  100. end)
  101. return skybox