From 297352dcdc1f70a5a6e088b8cc1d4abdf1f84fa7 Mon Sep 17 00:00:00 2001 From: rubenwardy Date: Thu, 25 Jul 2019 13:01:24 +0100 Subject: [PATCH] Add date time mod --- mods/capitalism/gametime/api.lua | 80 +++++++++++++++++++++++++++ mods/capitalism/gametime/gui.lua | 31 +++++++++++ mods/capitalism/gametime/init.lua | 6 +++ mods/capitalism/gametime/mod.conf | 2 + mods/libs/hudkit/init.lua | 89 +++++++++++++++++++++++++++++++ mods/libs/lib_utils/init.lua | 8 +++ 6 files changed, 216 insertions(+) create mode 100644 mods/capitalism/gametime/api.lua create mode 100644 mods/capitalism/gametime/gui.lua create mode 100644 mods/capitalism/gametime/init.lua create mode 100644 mods/capitalism/gametime/mod.conf create mode 100644 mods/libs/hudkit/init.lua diff --git a/mods/capitalism/gametime/api.lua b/mods/capitalism/gametime/api.lua new file mode 100644 index 0000000..34d34e3 --- /dev/null +++ b/mods/capitalism/gametime/api.lua @@ -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) diff --git a/mods/capitalism/gametime/gui.lua b/mods/capitalism/gametime/gui.lua new file mode 100644 index 0000000..8f4fb0d --- /dev/null +++ b/mods/capitalism/gametime/gui.lua @@ -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) diff --git a/mods/capitalism/gametime/init.lua b/mods/capitalism/gametime/init.lua new file mode 100644 index 0000000..af12068 --- /dev/null +++ b/mods/capitalism/gametime/init.lua @@ -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") diff --git a/mods/capitalism/gametime/mod.conf b/mods/capitalism/gametime/mod.conf new file mode 100644 index 0000000..927638d --- /dev/null +++ b/mods/capitalism/gametime/mod.conf @@ -0,0 +1,2 @@ +name = gametime +depends = lib_utils, hudkit diff --git a/mods/libs/hudkit/init.lua b/mods/libs/hudkit/init.lua new file mode 100644 index 0000000..b530191 --- /dev/null +++ b/mods/libs/hudkit/init.lua @@ -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 diff --git a/mods/libs/lib_utils/init.lua b/mods/libs/lib_utils/init.lua index dc1c3c5..80dad33 100644 --- a/mods/libs/lib_utils/init.lua +++ b/mods/libs/lib_utils/init.lua @@ -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)