From 1e8b30c110220cf5dea8eec84d1c1e7838db300e Mon Sep 17 00:00:00 2001 From: cx384 Date: Sun, 28 Jan 2024 17:35:31 +0100 Subject: [PATCH] Fix HUD inventory direction position --- games/devtest/mods/testhud/init.lua | 73 ++++++++++++++++++++++++++++- src/client/hud.cpp | 8 ++-- 2 files changed, 75 insertions(+), 6 deletions(-) diff --git a/games/devtest/mods/testhud/init.lua b/games/devtest/mods/testhud/init.lua index 5fdae3d38..03e8b6ab4 100644 --- a/games/devtest/mods/testhud/init.lua +++ b/games/devtest/mods/testhud/init.lua @@ -206,9 +206,78 @@ minetest.register_chatcommand("zoomfov", { end, }) +local hud_inventory_defs = { + { + type = "inventory", + position = {x=0.2, y=0.5}, + direction = 0, + text = "main", + number = 4, + item = 2, + }, + { + type = "inventory", + position = {x=0.2, y=0.5}, + direction = 2, + text = "main", + number = 4, + item = 2, + }, + { + type = "inventory", + position = {x=0.7, y=0.5}, + direction = 1, + text = "main", + number = 4, + item = 2, + }, + { + type = "inventory", + position = {x=0.7, y=0.5}, + direction = 3, + text = "main", + number = 4, + item = 2, + }, +} + +local player_hud_inventories= {} +minetest.register_chatcommand("hudinventories", { + description = "Shows some test Lua HUD elements of type inventory. (add: Adds elements (default). remove: Removes elements)", + params = "[ add | remove ]", + func = function(name, params) + local player = minetest.get_player_by_name(name) + if not player then + return false, "No player." + end + + local id_table = player_hud_inventories[name] + if not id_table then + id_table = {} + player_hud_inventories[name] = id_table + end + + if params == "remove" then + for _, id in ipairs(id_table) do + player:hud_remove(id) + end + return true, "HUD Inventories removed." + end + + -- params == "add" or default + for _, def in ipairs(hud_inventory_defs) do + table.insert(id_table, player:hud_add(def)) + end + return true, #hud_inventory_defs .." HUD Inventories added." + end +}) + + minetest.register_on_leaveplayer(function(player) - player_font_huds[player:get_player_name()] = nil - player_waypoints[player:get_player_name()] = nil + local playername = player:get_player_name() + player_font_huds[playername] = nil + player_waypoints[playername] = nil + player_hud_inventories[playername] = nil end) minetest.register_chatcommand("hudprint", { diff --git a/src/client/hud.cpp b/src/client/hud.cpp index 1618b757f..7a95e28ab 100644 --- a/src/client/hud.cpp +++ b/src/client/hud.cpp @@ -268,20 +268,20 @@ void Hud::drawItems(v2s32 upperleftpos, v2s32 screen_offset, s32 itemcount, // Draw items core::rect imgrect(0, 0, m_hotbar_imagesize, m_hotbar_imagesize); - const s32 list_size = mainlist ? mainlist->getSize() : 0; - for (s32 i = inv_offset; i < itemcount && i < list_size; i++) { + const s32 list_max = std::min(itemcount, (s32) (mainlist ? mainlist->getSize() : 0 )); + for (s32 i = inv_offset; i < list_max; i++) { s32 fullimglen = m_hotbar_imagesize + m_padding * 2; v2s32 steppos; switch (direction) { case HUD_DIR_RIGHT_LEFT: - steppos = v2s32(-(m_padding + (i - inv_offset) * fullimglen), m_padding); + steppos = v2s32(m_padding + (list_max - 1 - i - inv_offset) * fullimglen, m_padding); break; case HUD_DIR_TOP_BOTTOM: steppos = v2s32(m_padding, m_padding + (i - inv_offset) * fullimglen); break; case HUD_DIR_BOTTOM_TOP: - steppos = v2s32(m_padding, -(m_padding + (i - inv_offset) * fullimglen)); + steppos = v2s32(m_padding, m_padding + (list_max - 1 - i - inv_offset) * fullimglen); break; default: steppos = v2s32(m_padding + (i - inv_offset) * fullimglen, m_padding);