Add bossbars

This commit is contained in:
Elias Fleckenstein 2021-04-06 14:50:34 +02:00
parent a348909ba3
commit f350fa6272
8 changed files with 142 additions and 10 deletions

@ -410,7 +410,7 @@ function mcl_util.get_color(colorstr)
local mc_color = mcl_colors[colorstr:upper()] local mc_color = mcl_colors[colorstr:upper()]
if mc_color then if mc_color then
colorstr = mc_color colorstr = mc_color
elseif #colorstr ~= 7 or colorstr:sub(1, 1) ~= "#"then elseif #colorstr ~= 7 or colorstr:sub(1, 1) ~= "#" then
return return
end end
local hex = tonumber(colorstr:sub(2, 7), 16) local hex = tonumber(colorstr:sub(2, 7), 16)

@ -3526,14 +3526,6 @@ local mob_step = function(self, dtime)
-- end rotation -- end rotation
-- knockback timer
if self.pause_timer > 0 then
self.pause_timer = self.pause_timer - dtime
return
end
-- run custom function (defined in mob lua file) -- run custom function (defined in mob lua file)
if self.do_custom then if self.do_custom then
@ -3543,6 +3535,14 @@ local mob_step = function(self, dtime)
end end
end end
-- knockback timer
if self.pause_timer > 0 then
self.pause_timer = self.pause_timer - dtime
return
end
-- attack timer -- attack timer
self.timer = self.timer + dtime self.timer = self.timer + dtime

@ -59,6 +59,9 @@ mobs:register_mob("mobs_mc:enderdragon", {
run_start = 0, run_end = 20, run_start = 0, run_end = 20,
}, },
ignores_nametag = true, ignores_nametag = true,
do_custom = function(self)
mcl_bossbars.update_boss(self, "Ender Dragon", "light_purple")
end,
on_die = function(self, pos) on_die = function(self, pos)
if not self._respawned then if not self._respawned then
mcl_experience.throw_experience(pos, 11500) -- 500 + 11500 = 12000 mcl_experience.throw_experience(pos, 11500) -- 500 + 11500 = 12000

@ -73,6 +73,7 @@ mobs:register_mob("mobs_mc:wither", {
self.object:set_properties({textures={self.base_texture}}) self.object:set_properties({textures={self.base_texture}})
self.armor = {undead = 80, fleshy = 80} self.armor = {undead = 80, fleshy = 80}
end end
mcl_bossbars.update_boss(self, "Wither", "dark_purple")
end, end,
on_spawn = function(self) on_spawn = function(self)
minetest.sound_play("mobs_mc_wither_spawn", {object=self.object, gain=1.0, max_hear_distance=64}) minetest.sound_play("mobs_mc_wither_spawn", {object=self.object, gain=1.0, max_hear_distance=64})

@ -0,0 +1,124 @@
mcl_bossbars = {
bars = {},
huds = {},
colors = {"light_purple", "blue", "red", "green", "yellow", "dark_purple", "white"},
}
function mcl_bossbars.recalculate_colors()
local sorted = {}
local colors = mcl_bossbars.colors
local color_count = #colors
local frame_count = color_count * 2
for i, color in ipairs(colors) do
local idx = i * 2 - 1
local image = "mcl_bossbars.png"
.. "^[transformR270"
.. "^[verticalframe:" .. frame_count .. ":" .. (idx - 1)
.. "^(mcl_bossbars_empty.png"
.. "^[lowpart:%d:mcl_bossbars.png"
.. "^[transformR270"
.. "^[verticalframe:" .. frame_count .. ":" .. idx .. ")"
local _, hex = mcl_util.get_color(color)
sorted[color] = {
image = image,
hex = hex,
}
end
mcl_bossbars.colors_sorted = sorted
end
function mcl_bossbars.update_bar(player, text, color, percentage)
local cdef = mcl_bossbars.colors_sorted[color]
table.insert(mcl_bossbars.bars[player:get_player_name()], {color = cdef.hex, text = text, image = string.format(cdef.image, percentage)})
end
function mcl_bossbars.update_boss(luaentity, name, color)
local object = luaentity.object
local text = luaentity.nametag
if not text or text == "" then
text = name
end
local percentage = math.floor(luaentity.health / luaentity.hp_max * 100)
for _, obj in pairs(minetest.get_objects_inside_radius(object:get_pos(), 128)) do
if obj:is_player() then
mcl_bossbars.update_bar(obj, text, color, percentage)
end
end
end
minetest.register_on_joinplayer(function(player)
local name = player:get_player_name()
mcl_bossbars.huds[name] = {}
mcl_bossbars.bars[name] = {}
end)
minetest.register_on_leaveplayer(function(player)
local name = player:get_player_name()
mcl_bossbars.huds[name] = nil
mcl_bossbars.bars[name] = nil
end)
minetest.register_globalstep(function()
for _, player in pairs(minetest.get_connected_players()) do
local name = player:get_player_name()
local bars = mcl_bossbars.bars[name]
local huds = mcl_bossbars.huds[name]
local huds_new = {}
local i = 0
while #huds > 0 or #bars > 0 do
local bar = table.remove(bars, 1)
local hud = table.remove(huds, 1)
if bar and not hud then
hud = {
color = bar.color,
image = bar.image,
text = bar.text,
text_id = player:hud_add({
hud_elem_type = "text",
text = bar.text,
number = bar.color,
position = {x = 0.5, y = 0},
alignment = {x = 0, y = 1},
offset = {x = 0, y = i * 40},
}),
image_id = player:hud_add({
hud_elem_type = "image",
text = bar.image,
position = {x = 0.5, y = 0},
alignment = {x = 0, y = 1},
offset = {x = 0, y = i * 40 + 25},
scale = {x = 3, y = 3},
}),
}
elseif hud and not bar then
player:hud_remove(hud.text_id)
player:hud_remove(hud.image_id)
hud = nil
else
if bar.text ~= hud.text then
player:hud_change(hud.text_id, "text", bar.text)
hud.text = bar.text
end
if bar.color ~= hud.color then
player:hud_change(hud.text_id, "number", bar.color)
hud.color = bar.color
end
if bar.image ~= hud.image then
player:hud_change(hud.image_id, "text", bar.image)
hud.image = bar.image
end
end
table.insert(huds_new, hud)
i = i + 1
end
mcl_bossbars.huds[name] = huds_new
end
end)
mcl_bossbars.recalculate_colors()

@ -0,0 +1,4 @@
name = mcl_bossbars
author = Fleckenstein
description = Show enderdragon & wither boss bars. Also allows custom bars.
depends = mcl_util, mcl_colors

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.3 KiB