From f350fa6272a341d7ba28aab0aa75e7ba9bbd5b43 Mon Sep 17 00:00:00 2001 From: Elias Fleckenstein Date: Tue, 6 Apr 2021 14:50:34 +0200 Subject: [PATCH] Add bossbars --- mods/CORE/mcl_util/init.lua | 2 +- mods/ENTITIES/mcl_mobs/api.lua | 16 +-- mods/ENTITIES/mobs_mc/ender_dragon.lua | 3 + mods/ENTITIES/mobs_mc/wither.lua | 3 +- mods/HUD/mcl_bossbars/init.lua | 124 ++++++++++++++++++ mods/HUD/mcl_bossbars/mod.conf | 4 + .../mcl_bossbars/textures/mcl_bossbars.png | Bin 0 -> 3689 bytes .../textures/mcl_bossbars_empty.png | Bin 0 -> 3369 bytes 8 files changed, 142 insertions(+), 10 deletions(-) create mode 100644 mods/HUD/mcl_bossbars/init.lua create mode 100644 mods/HUD/mcl_bossbars/mod.conf create mode 100644 mods/HUD/mcl_bossbars/textures/mcl_bossbars.png create mode 100644 mods/HUD/mcl_bossbars/textures/mcl_bossbars_empty.png diff --git a/mods/CORE/mcl_util/init.lua b/mods/CORE/mcl_util/init.lua index a43c3d5d0..ac913de39 100644 --- a/mods/CORE/mcl_util/init.lua +++ b/mods/CORE/mcl_util/init.lua @@ -410,7 +410,7 @@ function mcl_util.get_color(colorstr) local mc_color = mcl_colors[colorstr:upper()] if mc_color then colorstr = mc_color - elseif #colorstr ~= 7 or colorstr:sub(1, 1) ~= "#"then + elseif #colorstr ~= 7 or colorstr:sub(1, 1) ~= "#" then return end local hex = tonumber(colorstr:sub(2, 7), 16) diff --git a/mods/ENTITIES/mcl_mobs/api.lua b/mods/ENTITIES/mcl_mobs/api.lua index 6e932ed5e..e599f2127 100644 --- a/mods/ENTITIES/mcl_mobs/api.lua +++ b/mods/ENTITIES/mcl_mobs/api.lua @@ -3526,14 +3526,6 @@ local mob_step = function(self, dtime) -- 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) if self.do_custom then @@ -3543,6 +3535,14 @@ local mob_step = function(self, dtime) end end + -- knockback timer + if self.pause_timer > 0 then + + self.pause_timer = self.pause_timer - dtime + + return + end + -- attack timer self.timer = self.timer + dtime diff --git a/mods/ENTITIES/mobs_mc/ender_dragon.lua b/mods/ENTITIES/mobs_mc/ender_dragon.lua index ddaea360f..509409a2e 100644 --- a/mods/ENTITIES/mobs_mc/ender_dragon.lua +++ b/mods/ENTITIES/mobs_mc/ender_dragon.lua @@ -59,6 +59,9 @@ mobs:register_mob("mobs_mc:enderdragon", { run_start = 0, run_end = 20, }, ignores_nametag = true, + do_custom = function(self) + mcl_bossbars.update_boss(self, "Ender Dragon", "light_purple") + end, on_die = function(self, pos) if not self._respawned then mcl_experience.throw_experience(pos, 11500) -- 500 + 11500 = 12000 diff --git a/mods/ENTITIES/mobs_mc/wither.lua b/mods/ENTITIES/mobs_mc/wither.lua index caf5a248d..8e7f7eb95 100644 --- a/mods/ENTITIES/mobs_mc/wither.lua +++ b/mods/ENTITIES/mobs_mc/wither.lua @@ -73,6 +73,7 @@ mobs:register_mob("mobs_mc:wither", { self.object:set_properties({textures={self.base_texture}}) self.armor = {undead = 80, fleshy = 80} end + mcl_bossbars.update_boss(self, "Wither", "dark_purple") end, on_spawn = function(self) minetest.sound_play("mobs_mc_wither_spawn", {object=self.object, gain=1.0, max_hear_distance=64}) @@ -115,4 +116,4 @@ mobs:register_arrow("mobs_mc:wither_skull", { --Spawn egg mobs:register_egg("mobs_mc:wither", S("Wither"), "mobs_mc_spawn_icon_wither.png", 0, true) -mcl_wip.register_wip_item("mobs_mc:wither") \ No newline at end of file +mcl_wip.register_wip_item("mobs_mc:wither") diff --git a/mods/HUD/mcl_bossbars/init.lua b/mods/HUD/mcl_bossbars/init.lua new file mode 100644 index 000000000..38dbbe376 --- /dev/null +++ b/mods/HUD/mcl_bossbars/init.lua @@ -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() diff --git a/mods/HUD/mcl_bossbars/mod.conf b/mods/HUD/mcl_bossbars/mod.conf new file mode 100644 index 000000000..64cbd4c9f --- /dev/null +++ b/mods/HUD/mcl_bossbars/mod.conf @@ -0,0 +1,4 @@ +name = mcl_bossbars +author = Fleckenstein +description = Show enderdragon & wither boss bars. Also allows custom bars. +depends = mcl_util, mcl_colors diff --git a/mods/HUD/mcl_bossbars/textures/mcl_bossbars.png b/mods/HUD/mcl_bossbars/textures/mcl_bossbars.png new file mode 100644 index 0000000000000000000000000000000000000000..55bf36dc288f271d12228a67a6a39c98c6ca18e9 GIT binary patch literal 3689 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 literal 0 HcmV?d00001 diff --git a/mods/HUD/mcl_bossbars/textures/mcl_bossbars_empty.png b/mods/HUD/mcl_bossbars/textures/mcl_bossbars_empty.png new file mode 100644 index 0000000000000000000000000000000000000000..1e50b6afc2a8dddc0748ae7763a5975ef6956b24 GIT binary patch literal 3369 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 OKWLz1tX-$+g83JoSwWZp literal 0 HcmV?d00001