-
Notifications
You must be signed in to change notification settings - Fork 2k
/
init.lua
232 lines (217 loc) · 6.8 KB
/
init.lua
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
local player_font_huds = {}
local font_states = {
{0, "Normal font"},
{1, "Bold font"},
{2, "Italic font"},
{3, "Bold and italic font"},
{4, "Monospace font"},
{5, "Bold and monospace font"},
{7, "ZOMG all the font styles"},
}
local font_default_def = {
type = "text",
position = {x = 0.5, y = 0.5},
scale = {x = 2, y = 2},
alignment = { x = 0, y = 0 },
number = 0xFFFFFF,
}
local function add_font_hud(player, state)
local def = table.copy(font_default_def)
local statetbl = font_states[state]
def.offset = {x = 0, y = 32 * state}
def.style = statetbl[1]
def.text = statetbl[2]
return player:hud_add(def)
end
local font_etime = 0
local font_state = 0
minetest.register_globalstep(function(dtime)
font_etime = font_etime + dtime
if font_etime < 1 then
return
end
font_etime = 0
for _, player in ipairs(minetest.get_connected_players()) do
local huds = player_font_huds[player:get_player_name()]
if huds then
for i, hud_id in ipairs(huds) do
local statetbl = font_states[(font_state + i) % #font_states + 1]
player:hud_change(hud_id, "style", statetbl[1])
player:hud_change(hud_id, "text", statetbl[2])
end
end
end
font_state = font_state + 1
end)
minetest.register_chatcommand("hudfonts", {
params = "[<HUD elements>]",
description = "Show/Hide some text on the HUD with various font options",
func = function(name, param)
local player = minetest.get_player_by_name(name)
local param = tonumber(param) or 0
param = math.min(math.max(param, 1), #font_states)
if player_font_huds[name] == nil then
player_font_huds[name] = {}
for i = 1, param do
table.insert(player_font_huds[name], add_font_hud(player, i))
end
minetest.chat_send_player(name, ("%d text HUD element(s) added."):format(param))
else
local huds = player_font_huds[name]
if huds then
for _, hud_id in ipairs(huds) do
player:hud_remove(hud_id)
end
minetest.chat_send_player(name, "All text HUD elements removed.")
end
player_font_huds[name] = nil
end
return true
end,
})
-- Testing waypoint capabilities
local player_waypoints = {}
minetest.register_chatcommand("hudwaypoints", {
params = "[ add | add_change | remove ]",
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)",
func = function(name, params)
local player = minetest.get_player_by_name(name)
if not player then
return false, "No player."
end
if params == "remove" then
if player_waypoints[name] then
for i=1, #player_waypoints[name] do
player:hud_remove(player_waypoints[name][i])
end
player_waypoints[name] = {}
end
return true, "All waypoint HUD elements removed."
end
if not (params == "add_change" or params == "add" or params == "") then
-- Incorrect syntax
return false
end
local regular = player:hud_add {
type = "waypoint",
name = "regular waypoint",
text = "m",
number = 0xFFFFFF,
world_pos = vector.add(player:get_pos(), {x = 0, y = 1.5, z = 0})
}
local reduced_precision = player:hud_add {
type = "waypoint",
name = "imprecise waypoint",
text = "m (0.1 steps, precision = 10)",
precision = 10,
number = 0xFFFFFF,
world_pos = vector.add(player:get_pos(), {x = 0, y = 1, z = 0})
}
local hidden_distance = player:hud_add {
type = "waypoint",
name = "waypoint with hidden distance",
text = "this text is hidden as well (precision = 0)",
precision = 0,
number = 0xFFFFFF,
world_pos = vector.add(player:get_pos(), {x = 0, y = 0.5, z = 0})
}
local function change(chplayer)
if not (chplayer and chplayer:is_player()) then
return
end
if regular then
chplayer:hud_change(regular, "world_pos", vector.add(player:get_pos(), {x = 0, y = 3, z = 0}))
chplayer:hud_change(regular, "number", 0xFF0000)
end
if reduced_precision then
chplayer:hud_change(reduced_precision, "precision", 2)
chplayer:hud_change(reduced_precision, "text", "m (0.5 steps, precision = 2)")
chplayer:hud_change(reduced_precision, "number", 0xFFFF00)
end
if hidden_distance then
chplayer:hud_change(hidden_distance, "number", 0x0000FF)
end
minetest.chat_send_player(chplayer:get_player_name(), "Waypoints changed.")
end
if params == "add_change" then
-- change immediate
change(player)
else
minetest.after(0.5, change, player)
end
local image_waypoint = player:hud_add {
type = "image_waypoint",
text = "testhud_waypoint.png",
world_pos = player:get_pos(),
-- 20% of screen width, 3x image height
scale = {x = -20, y = 3},
offset = {x = 0, y = -32}
}
if not player_waypoints[name] then
player_waypoints[name] = {}
end
if regular then
table.insert(player_waypoints[name], regular)
end
if reduced_precision then
table.insert(player_waypoints[name], reduced_precision)
end
if hidden_distance then
table.insert(player_waypoints[name], hidden_distance)
end
if image_waypoint then
table.insert(player_waypoints[name], image_waypoint)
end
regular = regular or "error"
reduced_precision = reduced_precision or "error"
hidden_distance = hidden_distance or "error"
image_waypoint = image_waypoint or "error"
return true, "Waypoints added. IDs: regular: " .. regular .. ", reduced precision: " .. reduced_precision ..
", hidden distance: " .. hidden_distance .. ", image waypoint: " .. image_waypoint
end
})
minetest.register_on_joinplayer(function(player)
player:set_properties({zoom_fov = 15})
end)
minetest.register_chatcommand("zoomfov", {
params = "[<FOV>]",
description = "Set or display your zoom_fov",
func = function(name, param)
local player = minetest.get_player_by_name(name)
if not player then
return false, "No player."
end
if param == "" then
local fov = player:get_properties().zoom_fov
return true, "zoom_fov = "..tostring(fov)
end
local fov = tonumber(param)
if not fov then
return false, "Missing or incorrect zoom_fov parameter!"
end
player:set_properties({zoom_fov = fov})
fov = player:get_properties().zoom_fov
return true, "zoom_fov = "..tostring(fov)
end,
})
minetest.register_on_leaveplayer(function(player)
player_font_huds[player:get_player_name()] = nil
player_waypoints[player:get_player_name()] = nil
end)
minetest.register_chatcommand("hudprint", {
description = "Writes all used Lua HUD elements into chat.",
func = function(name, params)
local player = minetest.get_player_by_name(name)
if not player then
return false, "No player."
end
local s = "HUD elements:"
for k, elem in pairs(player:hud_get_all()) do
local ename = dump(elem.name)
local etype = dump(elem.type)
local epos = "{x="..elem.position.x..", y="..elem.position.y.."}"
s = s.."\n["..k.."] type = "..etype.." | name = "..ename.." | pos = ".. epos
end
return true, s
end
})