123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236 |
- --Simple head-up display for current position, time and server lag.
- -- Origin:
- --ver 0.2.1 minetest_time
- --------------------------------------------------------------------------------
- --------------------------------------------------------------------------------
- -------Minetest Time--kazea's code tweaked by cg72 with help from crazyR--------
- ----------------Zeno` simplified some math and additional tweaks ---------------
- --------------------------------------------------------------------------------
- poshud = {
- -- Position of hud
- posx = tonumber(minetest.settings:get("poshud.hud.offsetx") or 0.8),
- posy = tonumber(minetest.settings:get("poshud.hud.offsety") or 0.95),
- enable_mapblock = minetest.settings:get_bool("poshud.mapblock.enable")
- }
- --settings
- colour = 0xFFFFFF --text colour in hex format default is white
- enable_star = true
- --------------------------------------------------------------------------------
- --------------------------------------------------------------------------------
- -- hud id map (playername -> hud-id)
- local player_hud = {}
- -- hud enabled map (playername -> bool)
- local player_hud_enabled = {}
- local function generatehud(player)
- local name = player:get_player_name()
- if player_hud[name] then
- -- already set up
- return
- end
- local hud = {}
- hud.id = player:hud_add({
- hud_elem_type = "text",
- name = "poshud",
- position = {x=poshud.posx, y=poshud.posy},
- offset = {x=8, y=-8},
- text = "Initializing...",
- scale = {x=100,y=100},
- alignment = {x=1,y=0},
- number = colour, --0xFFFFFF,
- })
- player_hud[name] = hud
- end
- local function updatehud(player, text)
- local name = player:get_player_name()
- if player_hud_enabled[name]==false then
- -- check if the player enabled the hud
- return
- end
- if not player_hud[name] then
- generatehud(player)
- end
- local hud = player_hud[name]
- if hud and text ~= hud.text then
- player:hud_change(hud.id, "text", text)
- hud.text = text
- end
- end
- local function removehud(player)
- local name = player:get_player_name()
- if player_hud[name] then
- player:hud_remove(player_hud[name].id)
- player_hud[name] = nil
- end
- end
- minetest.register_on_leaveplayer(function(player)
- minetest.after(1,removehud,player)
- end)
- --------------------------------------------------------------------------------
- --------------------------------------------------------------------------------
- -- hud enabled/disable
- minetest.register_chatcommand("poshud", {
- params = "on|off",
- description = "Turn poshud on or off",
- func = function(name, param)
- local player = minetest.get_player_by_name(name)
- if param == "on" then
- player_hud_enabled[name] = true
- generatehud(player)
- elseif param == "off" then
- player_hud_enabled[name] = false
- removehud(player)
- else
- return true, "Usage: poshud [on|off]"
- end
- end
- })
- --------------------------------------------------------------------------------
- --------------------------------------------------------------------------------
- -- time
- -- from https://gitlab.com/Rochambeau/mthudclock/blob/master/init.lua
- local function floormod ( x, y )
- return (math.floor(x) % y);
- end
- local function get_time()
- local secs = (60*60*24*minetest.get_timeofday());
- local s = floormod(secs, 60);
- local m = floormod(secs/60, 60);
- local h = floormod(secs/3600, 60);
- return ("%02d:%02d"):format(h, m);
- end
- -- rotating star
- local star={"\\", "|", "/", "-"}
- -- New lagometry algorithm:
- -- Make a list of N samples
- -- Every sample is time from last step, therefore "lag"
- -- Since time distance between samples is not equal, every sample needs
- -- to be weighted by... time, which is itself. This results in:
- -- avg_lag = sum(xi^2) / sum(xi)
- -- Results of sums are cached for performance (subtract old sample, add new sample)
- local l_time = 0
- local l_N = 2048
- local l_samples = {}
- local l_ctr = 0
- local l_sumsq = 0
- local l_sum = 0
- local l_max = 0.1
- local h_text = "Initializing..."
- local h_int = 2
- local h_tmr = 0
- local starc = 0
- minetest.register_globalstep(function (dtime)
- -- make a lag sample
-
- local news = os.clock() - l_time
- if l_time == 0 then
- news = 0.1
- end
- l_time = os.clock()
-
- local olds = l_samples[l_ctr+1] or 0
- l_sumsq = l_sumsq - olds*olds + news*news
- l_sum = l_sum - olds + news
-
- l_samples[l_ctr+1] = news
- l_max = math.max(l_max, news)
-
- l_ctr = (l_ctr + 1) % l_N
-
- if l_ctr == 0 then
- -- recalculate from scratch
- l_sumsq = 0
- l_sum = 0
- l_max = 0
- for i=1,l_N do
- local sample = l_samples[i]
- l_sumsq = l_sumsq + sample*sample
- l_sum = l_sum + sample
- l_max = math.max(l_max, sample)
- end
- end
-
- -- update hud text when necessary
- if h_tmr <= 0 then
- local l_avg = l_sumsq / l_sum
- -- Update hud text that is the same for all players
- local s_lag = string.format("Lag: %.2f avg: %.2f peak: %.2f", news, l_avg, l_max)
- local s_time = "Time: "..get_time()
-
- local s_rwt = ""
- if advtrains and advtrains.lines and advtrains.lines.rwt then
- s_rwt = "\nRailway Time: "..advtrains.lines.rwt.to_string(advtrains.lines.rwt.now(), true)
- end
-
- local s_star = ""
- if enable_star then
- s_star = star[starc+1]
- starc = (starc + 1) % 4
- end
-
- h_text = s_time .. " " .. s_star .. s_rwt .. "\n" .. s_lag
-
- h_tmr = h_int
- else
- h_tmr = h_tmr - news
- end
-
- for _,player in ipairs(minetest.get_connected_players()) do
- local posi = player:get_pos()
- local x = math.floor(posi.x+0.5)
- local y = math.floor(posi.y+0.5)
- local z = math.floor(posi.z+0.5)
- local posistr = x.." ".. y .." ".. z
- -- resulting hud string
- local hud_display = h_text .. "\nPos: " .. posistr
- if poshud.enable_mapblock then
- -- append if enabled
- local mapblockstr = math.floor(x / 16) .. " "
- .. math.floor(y / 16) .. " "
- .. math.floor(z / 16)
- hud_display = hud_display .. "\nMapblock: " .. mapblockstr
- end
- updatehud(player, hud_display)
- end
- end);
|