5 Commits
1.0.1 ... 1.1.1

27 changed files with 100 additions and 84 deletions

View File

@ -14,6 +14,8 @@ possibly resulting in conflict. This utility mod can help circumvent these issue
This mod comes with two commands to print or change the current moon phase. This mod comes with two commands to print or change the current moon phase.
- Use ``/moonphase`` to view the currently active phase. - Use ``/moonphase`` to view the currently active phase.
- Use ``/set_moonphase <phase>`` to change it. ``<phase>`` has to be a full number between 1 and 8. - Use ``/set_moonphase <phase>`` to change it. ``<phase>`` has to be a full number between 1 and 8.
- Use ``/set_moonstyle <style>`` to choose a texture preset. ``classic`` will result in a quadratic moon
inspired by default Minetest. ``realistic`` will result in 256x images of the real moon.
In order to change the phase, you will need the corresponding privilege. In order to change the phase, you will need the corresponding privilege.
Use ``/grant <player> moonphase`` to grant it. Use ``/grant <player> moonphase`` to grant it.
@ -22,17 +24,23 @@ Use ``/grant <player> moonphase`` to grant it.
Just like the chat commands, this mod provides a LUA api for accessing the moon phase. Just like the chat commands, this mod provides a LUA api for accessing the moon phase.
It contains a method called ``moon_phases.get_phase()`` that will return a numeric value representing the current moon phase. It contains a method called ``moon_phases.get_phase()`` that will return a numeric value representing the current moon phase.
You can also set the phase via ``moon_phases.set_phase(phase)`` where ``phase`` is an integer between 1 and 8. You can also set the phase via ``moon_phases.set_phase(phase)`` where ``phase`` is an integer between 1 and 8.
The texture style of a specific player can be set with ``moon_phases.set_style(player, style)`` where ``style`` referes to either
``classic`` or ``realistic``.
## Configuration ## Configuration
The mod provides the option to change the length of the moon cycle. The mod provides the option to change the length of the moon cycle.
By default, the moon texture will change every four (in-game) nights. By default, the moon texture will change every four (in-game) nights.
This results in a total cycle of 32 days. This results in a total cycle of 32 days.
You can also set the default texture style for all players. You can choose between the same options as with the ``/set_moonstyle`` command.
## LICENSE ## LICENSE
All source code is licensed under GNU LESSER GENERAL PUBLIC LICENSE version 3. All source code is licensed under GNU LESSER GENERAL PUBLIC LICENSE version 3.
You can find a copy of that license in the repository. You can find a copy of that license in the repository.
## Media ## Media
All included moon textures are resized versions of graphics from *NASA's Scientific Visualization Studio* by [Ernie Wright](https://svs.gsfc.nasa.gov/cgi-bin/search.cgi?person=1059). All moon textures marked as "classic" are made by me. You can use them under a CC0 license.
All included "realistic" moon textures are resized versions of graphics from *NASA's Scientific Visualization Studio* by [Ernie Wright](https://svs.gsfc.nasa.gov/cgi-bin/search.cgi?person=1059).
These images are part of the Public Domain as CC-BY-SA 3.0. These images are part of the Public Domain as CC-BY-SA 3.0.
You can access the entire (high resolution) album on [their website](https://svs.gsfc.nasa.gov/4769#28564). See [NASA's media guidelines](https://www.nasa.gov/multimedia/guidelines/index.html) for more information on licensing. You can access the entire (high resolution) album on [their website](https://svs.gsfc.nasa.gov/4769#28564). See [NASA's media guidelines](https://www.nasa.gov/multimedia/guidelines/index.html) for more information on licensing.

View File

@ -15,7 +15,7 @@ minetest.register_chatcommand("moonphase", {
minetest.register_chatcommand("set_moonphase", { minetest.register_chatcommand("set_moonphase", {
params = "<phase>", params = "<phase>",
description = "Set moon phase to given value", description = "Set moon phase to given value",
privs = {moonphase = true}, privs = { moonphase = true },
func = function(playername, param) func = function(playername, param)
if param == nil or param == "" then if param == nil or param == "" then
minetest.chat_send_player(playername, "Provide a number between 1 and 8") minetest.chat_send_player(playername, "Provide a number between 1 and 8")
@ -29,3 +29,21 @@ minetest.register_chatcommand("set_moonphase", {
end end
end end
}) })
minetest.register_chatcommand("set_moonstyle", {
params = "<style>",
description = "Set your moon's texture style to the given preset",
func = function(playername, param)
if param == nil or param == "" then
minetest.chat_send_player(playername, "Provide a texture style. Possible styles are classic or realistic")
else
local player = minetest.get_player_by_name(playername)
local change = moon_phases.set_style(player, param)
if change then
minetest.chat_send_player(playername, "Moon texture changed successfully")
else
minetest.chat_send_player(playername, "Invalid argument. Provide a valid preset.")
end
end
end
})

View File

@ -1,48 +0,0 @@
local mod_datastorage = minetest.get_modpath("datastorage") ~= nil
local default_state = {
change_time = true,
day = 1,
phase = 1
}
local function use_datastorage()
local state = datastorage.get("moon_phases", "moon_state")
for key, val in pairs(default_state) do
if type(state[key]) == "nil" then
state[key] = val
end
end
return state
end
local storage
local function use_filesystem()
local file_name = minetest.get_worldpath() .. "/moon_phases"
minetest.register_on_shutdown(function()
local file = io.open(file_name, "w")
file:write(minetest.serialize(storage))
file:close()
end)
local file = io.open(file_name, "r")
if file ~= nil then
storage = minetest.deserialize(file:read("*a"))
file:close()
if type(storage) == "table" then
return storage
end
end
storage = default_state
return storage
end
local function get_storage()
if mod_datastorage then
return use_datastorage()
else
return use_filesystem()
end
end
return get_storage

View File

@ -1,2 +0,0 @@
skylayer?
datastorage?

View File

@ -1,3 +0,0 @@
Changes the moon to follow a cycle between eight different phases.
Expect the sky to change every four nights (or configure a custom schedule).
Requires at least Minetest 5.2.0

View File

@ -1,30 +1,39 @@
local mod_skylayer = minetest.get_modpath("skylayer") ~= nil local mod_skylayer = minetest.get_modpath("skylayer") ~= nil
local modpath = minetest.get_modpath("moon_phases"); local modpath = minetest.get_modpath("moon_phases");
local state = dofile(modpath .. "/datastorage.lua")()
local GSCYCLE = 0.5 local GSCYCLE = 0.5 -- global step cycle
local DEFAULT_LENGTH = 4 -- default cycle length
local DEFAULT_STYLE = "realistic" -- default texture style
moon_phases = {} moon_phases = {}
local state = minetest.get_mod_storage()
local function get_cycle_config() if not state:contains("day") then
local DEFAULT_LENGTH = 4 state:from_table({
local config = minetest.settings:get("moon_phases_cycle") or DEFAULT_LENGTH day = 1,
config = math.floor(tonumber(config)) phase = 1,
if (not config) or config < 0 then change_time = 1
minetest.log("warning", "[Moon Phases] Invalid cycle configuration") })
return DEFAULT_LENGTH
end
return config
end end
local PHASE_LENGTH = get_cycle_config() -- retrieve mod configuration
local PHASE_LENGTH = minetest.settings:get("moon_phases_cycle") or DEFAULT_LENGTH
local TEXTURE_STYLE = minetest.settings:get("moon_phases_style") or DEFAULT_STYLE
local function set_texture(player, texture) -- set the moon texture of a player to the given phase
local function set_texture(player, phase)
local sl = {} local sl = {}
local meta_data = player:get_meta()
local style = meta_data:get_string("moon_phases:texture_style")
if style ~= "classic" and style ~= "realistic" then
style = TEXTURE_STYLE
end
local texture = "moon_" .. phase .. "_" .. style .. ".png"
sl.name = "moon_phases:custom" sl.name = "moon_phases:custom"
sl.moon_data = { sl.moon_data = {
visible = true, visible = true,
texture = texture texture = texture,
scale = 0.8
} }
if mod_skylayer then if mod_skylayer then
skylayer.add_layer(player:get_player_name(), sl) skylayer.add_layer(player:get_player_name(), sl)
@ -33,44 +42,70 @@ local function set_texture(player, texture)
end end
end end
-- update moon textures of all online players
local function update_textures() local function update_textures()
local phase = state:get_int("phase")
for _, player in ipairs(minetest.get_connected_players()) do for _, player in ipairs(minetest.get_connected_players()) do
set_texture(player, "moon_" .. state.phase .. ".png") set_texture(player, phase)
end end
end end
-- check for day changes
local function handle_time_progression() local function handle_time_progression()
local time = minetest.get_timeofday() local time = minetest.get_timeofday()
if time >= 0.5 and state.change_time then local day = state:get_int("day")
state.day = state.day + 1 local phase = state:get_int("phase")
if state.day % PHASE_LENGTH == 0 then local change_time = state:get_int("change_time") == 1
state.phase = (state.phase % 8) + 1 if time >= 0.5 and change_time then
state.change_time = false day = day + 1
state:set_int("day", day)
if day % PHASE_LENGTH == 0 then
state:set_int("phase", (phase % 8) + 1)
state:set_int("change_time", 0)
update_textures() update_textures()
end end
elseif time < 0.5 and not state.change_time then elseif time < 0.5 and not change_time then
state.change_time = true state:set_int("change_time", 1)
end end
end end
-- return the current moon phase
function moon_phases.get_phase() function moon_phases.get_phase()
return state.phase return state:get_int("phase")
end end
-- set the current moon phase
-- @param phase int Phase between 1 and 8
function moon_phases.set_phase(phase) function moon_phases.set_phase(phase)
phase = math.floor(tonumber(phase)) phase = math.floor(tonumber(phase))
if (not phase) or phase < 0 or phase > 8 then if (not phase) or phase < 1 or phase > 8 then
return false return false
end end
state.phase = phase state:set_int("phase", phase)
update_textures() update_textures()
return true return true
end end
-- set the moon's texture style for the given player
function moon_phases.set_style(player, style)
if style ~= "classic" and style ~= "realistic" then
return false
end
local meta_data = player:get_meta()
meta_data:set_string("moon_phases:texture_style", style)
set_texture(player, state:get_int("phase"))
return true
end
-- set the moon texture of newly joined player
minetest.register_on_joinplayer(function(player) minetest.register_on_joinplayer(function(player)
set_texture(player, "moon_" .. state.phase .. ".png") local phase = state:get_int("phase")
-- phase might not have been set at server start
if phase < 1 then phase = 1 end
set_texture(player, phase)
end) end)
-- check for day changes and call handlers
local timer = 0 local timer = 0
minetest.register_globalstep(function(dtime) minetest.register_globalstep(function(dtime)
timer = timer + dtime timer = timer + dtime
@ -79,4 +114,5 @@ minetest.register_globalstep(function(dtime)
timer = 0 timer = 0
end) end)
-- include API for chat commands
dofile(modpath .. "/commands.lua") dofile(modpath .. "/commands.lua")

View File

@ -1,4 +1,10 @@
name = moon_phases name = moon_phases
title = Moon Phases title = Moon Phases
author = TestificateMods author = TestificateMods
release = 1 release = 10100
description = """
Changes the moon to follow a cycle between eight different phases.
Expect the sky to change every four nights (or configure a custom schedule).
Requires at least Minetest 5.2.0
"""
optional_depends = skylayer

BIN
screenshot.2.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 548 KiB

BIN
screenshot.3.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 608 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 548 KiB

After

Width:  |  Height:  |  Size: 700 KiB

View File

@ -1 +1,2 @@
moon_phases_cycle (Change moon phase every X days) int 4 moon_phases_cycle (Change moon phase every X days) int 4
moon_phases_style (Choose a default texture style) enum realistic classic,realistic

BIN
textures/moon_1_classic.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 610 B

View File

Before

Width:  |  Height:  |  Size: 48 KiB

After

Width:  |  Height:  |  Size: 48 KiB

BIN
textures/moon_2_classic.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 638 B

View File

Before

Width:  |  Height:  |  Size: 66 KiB

After

Width:  |  Height:  |  Size: 66 KiB

BIN
textures/moon_3_classic.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 576 B

View File

Before

Width:  |  Height:  |  Size: 78 KiB

After

Width:  |  Height:  |  Size: 78 KiB

BIN
textures/moon_4_classic.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 269 B

View File

Before

Width:  |  Height:  |  Size: 93 KiB

After

Width:  |  Height:  |  Size: 93 KiB

BIN
textures/moon_5_classic.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 545 B

View File

Before

Width:  |  Height:  |  Size: 80 KiB

After

Width:  |  Height:  |  Size: 80 KiB

BIN
textures/moon_6_classic.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 602 B

View File

Before

Width:  |  Height:  |  Size: 64 KiB

After

Width:  |  Height:  |  Size: 64 KiB

BIN
textures/moon_7_classic.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 620 B

View File

Before

Width:  |  Height:  |  Size: 45 KiB

After

Width:  |  Height:  |  Size: 45 KiB

BIN
textures/moon_8_classic.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 75 B

View File

Before

Width:  |  Height:  |  Size: 34 KiB

After

Width:  |  Height:  |  Size: 34 KiB