skybox: fix up sun/sunrise showing up.
[insidethebox.git] / mods / skybox / init.lua
blob3570a28c4c23f8b7baf07ef945801f389d362822
2 --[[
4 Copyright (C) 2017 - Auke Kok <sofar@foo-projects.org>
6 "skybox" is free software; you can redistribute it and/or modify
7 it under the terms of the GNU Lesser General Public License as
8 published by the Free Software Foundation; either version 2.1
9 of the license, or (at your option) any later version.
11 ]]--
13 local S = minetest.get_translator("skybox")
15 -- Builtin sky box textures and color/shadings, clouds
18 local skies = {
19 {"DarkStormy", "#1f2226", 0.5, { density = 0.5, color = "#aaaaaae0", ambient = "#000000",
20 height = 96, thickness = 32, speed = {x = 6, y = -6},}},
21 {"CloudyLightRays", "#5f5f5e", 0.9, { density = 0.4, color = "#efe3d5d0", ambient = "#000000",
22 height = 104, thickness = 24, speed = {x = 4, y = 0},}},
23 {"FullMoon", "#24292c", 0.2, { density = 0.25, color = "#ffffff80", ambient = "#404040",
24 height = 140, thickness = 8, speed = {x = -2, y = 2},}},
25 {"SunSet", "#72624d", 0.4, { density = 0.2, color = "#f8d8e8e0", ambient = "#000000",
26 height = 120, thickness = 16, speed = {x = 0, y = -2},}},
27 {"ThickCloudsWater", "#a57850", 0.8, { density = 0.35, color = "#ebe4ddfb", ambient = "#000000",
28 height = 104, thickness = 32, speed = {x = 4, y = 3},}},
29 {"TropicalSunnyDay", "#f1f4ee", 1.0, { density = 0.25, color = "#fffffffb", ambient = "#000000",
30 height = 120, thickness = 8, speed = {x = -2, y = 0},}},
34 -- API
37 skybox = {}
39 skybox.set = function(player, number)
40 if not player then
41 return
42 end
43 if number == 0 then
44 skybox.clear(player)
45 else
46 local sky = skies[number]
47 if not sky then
48 return
49 end
50 player:override_day_night_ratio(sky[3])
51 local textures = {
52 sky[1] .. "Up.jpg",
53 sky[1] .. "Down.jpg",
54 sky[1] .. "Front.jpg",
55 sky[1] .. "Back.jpg",
56 sky[1] .. "Left.jpg",
57 sky[1] .. "Right.jpg",
59 if player.get_sky_color ~= nil then
60 player:set_sky({
61 base_color = sky[2],
62 type = "skybox",
63 textures = textures,
64 clouds = true
66 else
67 player:set_sky(sky[2], "skybox", textures, true)
68 end
69 player:set_clouds(sky[4])
70 -- FIXME extend list with 5/6/7 for these instead
71 player:set_sun({visible = false, sunrise_visible = false})
72 player:set_stars({visible = false})
73 player:set_moon({visible = false})
74 end
75 end
77 skybox.clear = function(player)
78 if not player then
79 return
80 end
81 player:override_day_night_ratio(nil)
82 if player.get_sky_color ~= nil then
83 player:set_sky({base_color = "white", type = "regular"})
84 else
85 player:set_sky("white", "regular")
86 end
87 player:set_clouds({
88 density = 0.4,
89 color = "#fff0f0e5",
90 ambient = "#000000",
91 height = 120,
92 thickness = 16,
93 speed = {x = 0, y = -2},
95 player:set_sun({visible = false, sunrise_visible = false})
96 player:set_stars({visible = false})
97 player:set_moon({visible = false})
98 end
100 minetest.register_privilege("skybox", {
101 description = S("Change sky box for yourself"),
104 minetest.register_chatcommand("skybox", {
105 params = S("<skybox> or <number> or \"off\" or empty to list skyboxes"),
106 description = S("Change your sky box set"),
107 privs = {skybox = true},
108 func = function(name, param)
109 local player = minetest.get_player_by_name(name)
110 if not player then
111 return
113 if param == nil or param == "" then
114 minetest.chat_send_player(name, S("Available sky boxes:"))
115 for _, v in ipairs(skies) do
116 minetest.chat_send_player(name, v[1])
118 return
119 elseif tonumber(param) ~= nil and tonumber(param) >= 1 and tonumber(param) <= #skies then
120 skybox.set(player, tonumber(param))
121 return
122 elseif param == "off" or param == "0" then
123 skybox.clear(player)
124 return
126 for k, v in ipairs(skies) do
127 if v[1] == param then
128 skybox.set(player, k)
129 return
132 minetest.chat_send_player(name, S("Could not find that sky box."))
136 minetest.register_node("skybox:skybox", {
137 description = S("Skybox changer").."\n"..S("Left/right-click to change the skybox"),
138 tiles = {
139 "ThickCloudsWaterUp.jpg^[resize:16x16",
140 "ThickCloudsWaterDown.jpg^[resize:16x16",
141 "ThickCloudsWaterFront.jpg^[resize:16x16",
142 "ThickCloudsWaterBack.jpg^[resize:16x16",
143 "ThickCloudsWaterLeft.jpg^[resize:16x16",
144 "ThickCloudsWaterRight.jpg^[resize:16x16",
146 groups = {node = 1, unbreakable = 1, trigger = 1},
147 sounds = sounds.wood,
148 on_punch = function(pos, node, puncher, pointed_thing)
149 local name = puncher:get_player_name()
150 if not puncher or not boxes.players_editing_boxes[name] then
151 return
153 local meta = minetest.get_meta(pos)
154 local s = meta:get_int("skybox") + 1
155 if s > #skies then
156 s = 0
158 minetest.chat_send_player(name, S("skybox = @1", s))
159 meta:set_int("skybox", s)
160 end,
161 on_rightclick = function(pos, node, puncher, itemstack, pointed_thing)
162 local name = puncher:get_player_name()
163 if not puncher or not boxes.players_editing_boxes[name] then
164 return
166 local meta = minetest.get_meta(pos)
167 local s = meta:get_int("skybox") - 1
168 if s < 0 then
169 s = #skies
171 minetest.chat_send_player(name, S("skybox = @1", s))
172 meta:set_int("skybox", s)
173 end,
174 on_trigger = function(pos)
175 local box = boxes.find_box(pos)
176 if not box then
177 return
179 local p = minetest.get_player_by_name(box.name)
180 if not p then
181 return
183 local meta = minetest.get_meta(pos)
184 local s = meta:get_int("skybox")
185 skybox.set(p, s)
186 end,
187 on_untrigger = function(pos)
188 local box = boxes.find_box(pos)
189 if not box then
190 return
192 local p = minetest.get_player_by_name(box.name)
193 if not p then
194 return
196 skybox.set(p, box.skybox or 0)
197 end,
198 on_reveal = function(name, pos)
199 local meta = minetest.get_meta(pos)
200 local s = meta:get_int("skybox")
201 local t = "default"
202 if skies[s] then
203 t = skies[s][1]
205 minetest.chat_send_player(name, minetest.colorize( "#4444ff",
206 S("> skybox = @1", t)))
207 end,