1 local player_font_huds = {}
7 {3, "Bold and italic font"},
9 {5, "Bold and monospace font"},
10 {7, "ZOMG all the font styles"},
14 local font_default_def = {
15 hud_elem_type = "text",
16 position = {x = 0.5, y = 0.5},
17 scale = {x = 2, y = 2},
18 alignment = { x = 0, y = 0 },
22 local function add_font_hud(player, state)
23 local def = table.copy(font_default_def)
24 local statetbl = font_states[state]
25 def.offset = {x = 0, y = 32 * state}
26 def.style = statetbl[1]
27 def.text = statetbl[2]
28 return player:hud_add(def)
34 minetest.register_globalstep(function(dtime)
35 font_etime = font_etime + dtime
36 if font_etime < 1 then
40 for _, player in ipairs(minetest.get_connected_players()) do
41 local huds = player_font_huds[player:get_player_name()]
43 for i, hud_id in ipairs(huds) do
44 local statetbl = font_states[(font_state + i) % #font_states + 1]
45 player:hud_change(hud_id, "style", statetbl[1])
46 player:hud_change(hud_id, "text", statetbl[2])
50 font_state = font_state + 1
53 minetest.register_chatcommand("hudfonts", {
54 params = "[<HUD elements>]",
55 description = "Show/Hide some text on the HUD with various font options",
56 func = function(name, param)
57 local player = minetest.get_player_by_name(name)
58 local param = tonumber(param) or 0
59 param = math.min(math.max(param, 1), #font_states)
60 if player_font_huds[name] == nil then
61 player_font_huds[name] = {}
63 table.insert(player_font_huds[name], add_font_hud(player, i))
65 minetest.chat_send_player(name, ("%d text HUD element(s) added."):format(param))
67 local huds = player_font_huds[name]
69 for _, hud_id in ipairs(huds) do
70 player:hud_remove(hud_id)
72 minetest.chat_send_player(name, "All text HUD elements removed.")
74 player_font_huds[name] = nil
80 -- Testing waypoint capabilities
82 local player_waypoints = {}
83 minetest.register_chatcommand("hudwaypoints", {
84 params = "[ add | add_change | remove ]",
85 description = "Create HUD waypoints at your position for testing (add: Add waypoints and change them after 0.5s (default). add_change: Add waypoints and change immediately. remove: Remove all waypoints)",
86 func = function(name, params)
87 local player = minetest.get_player_by_name(name)
89 return false, "No player."
91 if params == "remove" then
92 if player_waypoints[name] then
93 for i=1, #player_waypoints[name] do
94 player:hud_remove(player_waypoints[name][i])
96 player_waypoints[name] = {}
98 return true, "All waypoint HUD elements removed."
100 if not (params == "add_change" or params == "add" or params == "") then
104 local regular = player:hud_add {
105 hud_elem_type = "waypoint",
106 name = "regular waypoint",
109 world_pos = vector.add(player:get_pos(), {x = 0, y = 1.5, z = 0})
111 local reduced_precision = player:hud_add {
112 hud_elem_type = "waypoint",
113 name = "imprecise waypoint",
114 text = "m (0.1 steps, precision = 10)",
117 world_pos = vector.add(player:get_pos(), {x = 0, y = 1, z = 0})
119 local hidden_distance = player:hud_add {
120 hud_elem_type = "waypoint",
121 name = "waypoint with hidden distance",
122 text = "this text is hidden as well (precision = 0)",
125 world_pos = vector.add(player:get_pos(), {x = 0, y = 0.5, z = 0})
127 local function change(chplayer)
128 if not (chplayer and chplayer:is_player()) then
132 chplayer:hud_change(regular, "world_pos", vector.add(player:get_pos(), {x = 0, y = 3, z = 0}))
133 chplayer:hud_change(regular, "number", 0xFF0000)
135 if reduced_precision then
136 chplayer:hud_change(reduced_precision, "precision", 2)
137 chplayer:hud_change(reduced_precision, "text", "m (0.5 steps, precision = 2)")
138 chplayer:hud_change(reduced_precision, "number", 0xFFFF00)
140 if hidden_distance then
141 chplayer:hud_change(hidden_distance, "number", 0x0000FF)
143 minetest.chat_send_player(chplayer:get_player_name(), "Waypoints changed.")
145 if params == "add_change" then
149 minetest.after(0.5, change, player)
151 local image_waypoint = player:hud_add {
152 hud_elem_type = "image_waypoint",
153 text = "testhud_waypoint.png",
154 world_pos = player:get_pos(),
155 scale = {x = 3, y = 3},
156 offset = {x = 0, y = -32}
158 if not player_waypoints[name] then
159 player_waypoints[name] = {}
162 table.insert(player_waypoints[name], regular)
164 if reduced_precision then
165 table.insert(player_waypoints[name], reduced_precision)
167 if hidden_distance then
168 table.insert(player_waypoints[name], hidden_distance)
170 if image_waypoint then
171 table.insert(player_waypoints[name], image_waypoint)
173 regular = regular or "error"
174 reduced_precision = reduced_precision or "error"
175 hidden_distance = hidden_distance or "error"
176 image_waypoint = image_waypoint or "error"
177 return true, "Waypoints added. IDs: regular: " .. regular .. ", reduced precision: " .. reduced_precision ..
178 ", hidden distance: " .. hidden_distance .. ", image waypoint: " .. image_waypoint
182 minetest.register_on_joinplayer(function(player)
183 player:set_properties({zoom_fov = 15})
186 minetest.register_chatcommand("zoomfov", {
188 description = "Set or display your zoom_fov",
189 func = function(name, param)
190 local player = minetest.get_player_by_name(name)
192 return false, "No player."
195 local fov = player:get_properties().zoom_fov
196 return true, "zoom_fov = "..tostring(fov)
198 local fov = tonumber(param)
200 return false, "Missing or incorrect zoom_fov parameter!"
202 player:set_properties({zoom_fov = fov})
203 fov = player:get_properties().zoom_fov
204 return true, "zoom_fov = "..tostring(fov)
208 minetest.register_on_leaveplayer(function(player)
209 player_font_huds[player:get_player_name()] = nil
210 player_waypoints[player:get_player_name()] = nil