summaryrefslogtreecommitdiff
path: root/init.lua
blob: 81b6f3f3909d8e6c57e779009cb7f8acb8b03e6e (plain)
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
hud = {}

-- HUD statbar values
hud.health = {}
hud.air = {}

-- HUD item ids
local health_hud = {}
local health_hud_text = {}
local health_hud_icon = {}
local air_hud = {}
local air_hud_text = {}
local air_hud_icon = {}

-- default settings

HUD_SCALEABLE = false
HUD_BARLENGTH = 160

 -- statbar positions
HUD_HEALTH_POS = {x=0.5,y=0.9}
HUD_HEALTH_OFFSET = {x=-175, y=2}
HUD_AIR_POS = {x=0.5,y=0.9}
HUD_AIR_OFFSET = {x=15,y=2}

-- dirty way to check for new statbars
if dump(minetest.hud_replace_builtin) ~= "nil" then
	HUD_SCALEABLE = true
	HUD_HEALTH_POS = {x=0.5,y=1}
	HUD_HEALTH_OFFSET = {x=-175, y=-70}
	HUD_AIR_POS = {x=0.5,y=1}
	HUD_AIR_OFFSET = {x=15,y=-70}
end

HUD_TICK = 0.1

function hud.value_to_barlength(value, max)
	return math.ceil((value/max) * HUD_BARLENGTH)
end

--load custom settings
local set = io.open(minetest.get_modpath("hudbars").."/hud.conf", "r")
if set then 
	dofile(minetest.get_modpath("hudbars").."/hud.conf")
	set:close()
end

local function hide_builtin(player)
	 player:hud_set_flags({crosshair = true, hotbar = true, healthbar = false, wielditem = true, breathbar = false})
end


local function custom_hud(player)
 local name = player:get_player_name()

 if minetest.setting_getbool("enable_damage") then
 --health
	health_hud_icon[name] = player:hud_add({
		hud_elem_type = "image",
		position = HUD_HEALTH_POS,
		scale = { x = 1, y = 1 },
		text = "hudbars_icon_health.png",
		alignment = {x=-1,y=1},
		offset = { x = HUD_HEALTH_OFFSET.x - 3, y = HUD_HEALTH_OFFSET.y },
	})
	player:hud_add({
		hud_elem_type = "image",
		position = HUD_HEALTH_POS,
		scale = { x = 1, y = 1 },
		text = "hudbars_bar_background.png",
		alignment = {x=1,y=1},
		offset = { x = HUD_HEALTH_OFFSET.x - 1, y = HUD_HEALTH_OFFSET.y - 1 },
	})
	health_hud[name] = player:hud_add({
		hud_elem_type = "statbar",
		position = HUD_HEALTH_POS,
		text = "hudbars_bar_health.png",
		number = hud.value_to_barlength(player:get_hp(), 20),
		alignment = {x=-1,y=-1},
		offset = HUD_HEALTH_OFFSET,
	})
	health_hud_text[name] = player:hud_add({
		hud_elem_type = "text",
		position = HUD_HEALTH_POS,
		text = tostring(string.format("Health: %d/%d", player:get_hp(), 20)),
		alignment = {x=1,y=1},
		number = 0xFFFFFF,
		direction = 0,
		offset = { x = HUD_HEALTH_OFFSET.x + 2,  y = HUD_HEALTH_OFFSET.y },
	})

 --air
	air_hud_icon[name] = player:hud_add({
		hud_elem_type = "image",
		position = HUD_AIR_POS,
		scale = { x = 1, y = 1 },
		text = "hudbars_icon_breath.png",
		alignment = {x=-1,y=1},
		offset = { x = HUD_AIR_OFFSET.x - 3, y = HUD_AIR_OFFSET.y },
	})
	player:hud_add({
		hud_elem_type = "image",
		position = HUD_AIR_POS,
		scale = { x = 1, y = 1 },
		text = "hudbars_bar_background.png",
		alignment = {x=1,y=1},
		offset = { x = HUD_AIR_OFFSET.x - 1, y = HUD_AIR_OFFSET.y - 1 },
	})
	air_hud[name] = player:hud_add({
		hud_elem_type = "statbar",
		position = HUD_AIR_POS,
		text = "hudbars_bar_breath.png",
		number = hud.value_to_barlength(math.min(player:get_breath(), 10), 10),
		alignment = {x=-1,y=-1},
		offset = HUD_AIR_OFFSET,
	})
	air_hud_text[name] = player:hud_add({
		hud_elem_type = "text",
		position = HUD_AIR_POS,
		text = tostring(string.format("Breath: %d/%d", math.min(player:get_breath(), 10), 10)),
		alignment = {x=1,y=1},
		number = 0x000000,
		direction = 0,
		offset = { x = HUD_AIR_OFFSET.x + 2,  y = HUD_AIR_OFFSET.y },
	})

 end
end


-- update hud elemtens if value has changed
local function update_hud(player)
	local name = player:get_player_name()
 --air
	local air = tonumber(hud.air[name])
	if player:get_breath() ~= air then
		air = player:get_breath()
		hud.air[name] = air
		player:hud_change(air_hud[name], "number", hud.value_to_barlength(math.min(air, 10), 10))
		player:hud_change(air_hud_text[name], "text",
			tostring(string.format("Breath: %d/%d", math.min(player:get_breath(), 10), 10))
		)
	end
 --health
	local hp = tonumber(hud.health[name])
	if player:get_hp() ~= hp then
		hp = player:get_hp()
		hud.health[name] = hp
		player:hud_change(health_hud[name], "number", hud.value_to_barlength(hp, 20))
		player:hud_change(health_hud_text[name], "text",
			tostring(string.format("Health: %d/%d", hp, 20))
		)
	end
end

minetest.register_on_joinplayer(function(player)
	local name = player:get_player_name()
	local inv = player:get_inventory()
	hud.health[name] = player:get_hp()
	local air = player:get_breath()
	hud.air[name] = air
	minetest.after(0.5, function()
		hide_builtin(player)
		custom_hud(player)
	end)
end)

local main_timer = 0
local timer = 0
local timer2 = 0
minetest.after(2.5, function()
	minetest.register_globalstep(function(dtime)
	 main_timer = main_timer + dtime
	 timer = timer + dtime
	 timer2 = timer2 + dtime
		if main_timer > HUD_TICK or timer > 4 then
		 if main_timer > HUD_TICK then main_timer = 0 end
		 for _,player in ipairs(minetest.get_connected_players()) do
			local name = player:get_player_name()

			-- only proceed if damage is enabled
			if minetest.setting_getbool("enable_damage") then
			 local hp = player:get_hp()

			 -- update all hud elements
			 update_hud(player)
			
			end
		 end
		
		end
		if timer > 4 then timer = 0 end
	end)
end)