Add date time mod

master
rubenwardy 2019-07-25 13:01:24 +01:00
parent 5bd40f6d62
commit 297352dcdc
6 changed files with 216 additions and 0 deletions

View File

@ -0,0 +1,80 @@
function gametime.get()
local days = minetest.get_day_count()
local years = math.floor(days / 360)
days = days - years * 360
local months = math.floor(days / 12)
days = days - months * 12
assert(days < 30)
return {
year = years + 1900,
month = months + 1,
day = days + 1,
}
end
local MONTH_NAMES = {
"January",
"February",
"March",
"April",
"May",
"June",
"July",
"August",
"September",
"October",
"November",
"December",
}
function gametime.get_formatted()
local date = gametime.get()
local month_name = MONTH_NAMES[date.month]
return ("%02d-%s-%04d"):format(date.day, month_name, date.year)
end
local _registered_on_day_change = {}
local _registered_on_month_change = {}
local _registered_on_year_change = {}
function gametime.register_on_day_change(func)
table.insert(_registered_on_day_change, func)
end
function gametime.register_on_month_change(func)
table.insert(_registered_on_month_change, func)
end
function gametime.register_on_year_change(func)
table.insert(_registered_on_year_change, func)
end
local _lastcount = minetest.get_day_count()
local function on_interval()
local cur = minetest.get_day_count()
if _lastcount == cur then
return
end
_lastcount = cur
local curdate = gametime.get()
for i=1, #_registered_on_day_change do
_registered_on_day_change[i](cur, curdate)
end
if curdate.day == 1 then
for i=1, #_registered_on_month_change do
_registered_on_month_change[i](cur, curdate)
end
if curdate.month == 1 then
for i=1, #_registered_on_year_change do
_registered_on_year_change[i](cur, curdate)
end
end
end
end
lib_utils.interval(2, on_interval)

View File

@ -0,0 +1,31 @@
local hud = hudkit()
local function update_datetime(player)
local date = gametime.get_formatted()
local tod = minetest.get_timeofday()
local hours = math.floor(tod * 24)
local minutes = math.floor(tod * 1440 - hours * 60)
local datetime = ("%s %02d:%02d"):format(date, hours, minutes)
if not hud:exists(player, "gametime:datetime") then
hud:add(player, "gametime:datetime", {
hud_elem_type = "text",
position = {x = 0.5, y = 0},
scale = {x = 100, y = 100},
text = datetime,
number = 0xFFFFFF,
offset = {x = 0, y = 20},
alignment = {x = 0, y = 0}
})
else
hud:change(player, "gametime:datetime", "text", datetime)
end
end
minetest.register_on_joinplayer(update_datetime)
lib_utils.interval(1, function()
local players = minetest.get_connected_players()
for i=1, #players do
update_datetime(players[i])
end
end)

View File

@ -0,0 +1,6 @@
gametime = {}
dofile(minetest.get_modpath("gametime") .. "/api.lua")
dofile(minetest.get_modpath("gametime") .. "/gui.lua")
minetest.settings:set("time_speed", "51.429")

View File

@ -0,0 +1,2 @@
name = gametime
depends = lib_utils, hudkit

89
mods/libs/hudkit/init.lua Normal file
View File

@ -0,0 +1,89 @@
function hudkit()
return {
players = {},
-- set = function(self, player, id, def)
-- local name = player:get_player_name()
-- local elements = self.players[name]
-- if not elements then
-- self.players[name] = {}
-- elements = self.players[name]
-- end
-- if elements[id] then
-- for key, value in pairs(def) do
-- if elements[id].def[key] ~= value then
-- end
-- end
-- else
-- self:add(self, player, id, def)
-- end
-- end,
add = function(self, player, id, def)
local name = player:get_player_name()
local elements = self.players[name]
if not elements then
self.players[name] = {}
elements = self.players[name]
end
elements[id] = {
id = player:hud_add(def),
def = def
}
return true
end,
exists = function(self, player, id)
if not player then
return false
end
local name = player:get_player_name()
local elements = self.players[name]
if not elements or not elements[id] then
return false
end
return true
end,
change = function(self, player, id, stat, value)
if not player then
return false
end
local name = player:get_player_name()
local elements = self.players[name]
if not elements or not elements[id] or not elements[id].id then
return false
end
if elements[id].def[stat] ~= value then
elements[id].def[stat] = value
player:hud_change(elements[id].id, stat, value)
end
return true
end,
remove = function(self, player, id)
local name = player:get_player_name()
local elements = self.players[name]
if not elements or not elements[id] or not elements[id].id then
return false
end
player:hud_remove(elements[id].id)
elements[id] = nil
return true
end,
}
end

View File

@ -1,5 +1,13 @@
lib_utils = {}
function lib_utils.interval(time, func, ...)
local function tick(...)
func(...)
minetest.after(time, tick, ...)
end
minetest.after(time, tick, ...)
end
function lib_utils.make_saveload(tab, storage, itemarraykey, registername, class)
assert(tab)
assert(storage)