From 7a29d8580d0d85b6ca2bfa942cd1a65240727637 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Sun, 2 Jul 2017 19:34:09 +0200 Subject: [PATCH] Add mod: show_wielded_item --- mods/HUD/show_wielded_item/README.md | 19 ++++ mods/HUD/show_wielded_item/depends.txt | 1 + mods/HUD/show_wielded_item/description.txt | 1 + mods/HUD/show_wielded_item/init.lua | 108 ++++++++++++++++++++ mods/HUD/show_wielded_item/mod.conf | 1 + mods/HUD/show_wielded_item/screenshot.png | Bin 0 -> 11859 bytes mods/HUD/show_wielded_item/settingtypes.txt | 5 + 7 files changed, 135 insertions(+) create mode 100644 mods/HUD/show_wielded_item/README.md create mode 100644 mods/HUD/show_wielded_item/depends.txt create mode 100644 mods/HUD/show_wielded_item/description.txt create mode 100644 mods/HUD/show_wielded_item/init.lua create mode 100644 mods/HUD/show_wielded_item/mod.conf create mode 100644 mods/HUD/show_wielded_item/screenshot.png create mode 100644 mods/HUD/show_wielded_item/settingtypes.txt diff --git a/mods/HUD/show_wielded_item/README.md b/mods/HUD/show_wielded_item/README.md new file mode 100644 index 0000000000..bba27b6ed5 --- /dev/null +++ b/mods/HUD/show_wielded_item/README.md @@ -0,0 +1,19 @@ +# Show Wielded Item [`show_wielded_item`] +This Minetest mod displays the name of the wielded item above the hotbar and +statbars. + +This mod is compatible with the HUD Bars [`hudbars`] mod. +Compability with other HUD-related mods is possible, but not guaranteed. + +Version: 1.0.0 + +## Credits +Released by Wuzzy. +The original mod code was taken from the file “`item_names.lua`” +found in the Unified Inventory mod maintained by VanessaE. This code +has been later modified. +Original author: 4aiman + +## License +This mod is licensed under GNU LGPLv2 or later +(see ). diff --git a/mods/HUD/show_wielded_item/depends.txt b/mods/HUD/show_wielded_item/depends.txt new file mode 100644 index 0000000000..3e1d5c2018 --- /dev/null +++ b/mods/HUD/show_wielded_item/depends.txt @@ -0,0 +1 @@ +hudbars? diff --git a/mods/HUD/show_wielded_item/description.txt b/mods/HUD/show_wielded_item/description.txt new file mode 100644 index 0000000000..361cab6ce2 --- /dev/null +++ b/mods/HUD/show_wielded_item/description.txt @@ -0,0 +1 @@ +Displays the name of the wielded item. diff --git a/mods/HUD/show_wielded_item/init.lua b/mods/HUD/show_wielded_item/init.lua new file mode 100644 index 0000000000..410aeb3603 --- /dev/null +++ b/mods/HUD/show_wielded_item/init.lua @@ -0,0 +1,108 @@ +-- Based on 4itemnames mod by 4aiman + +local wield = {} +local wieldindex = {} +local huds = {} +local dtimes = {} +local dlimit = 3 -- HUD element will be hidden after this many seconds + +local hudbars_mod = minetest.get_modpath("hudbars") + +local function set_hud(player) + if not player:is_player() then return end + local player_name = player:get_player_name() + -- Fixed offset in config file + local fixed = tonumber(minetest.settings:get("show_wielded_item_y_offset")) + local off + if fixed and fixed ~= -1 then + -- Manual offset + off = {x=0, y=-fixed} + else + -- Default offset + off = {x=0, y=-101} + + if hudbars_mod then + -- Tweak offset if hudbars mod was found + + local rows = math.floor((#hb.get_hudbar_identifiers()-1) / 2) + 1 + local vmargin = tonumber(minetest.settings:get("hudbars_vmargin")) or 24 + off.y = -76 - vmargin*rows + end + + -- Dirty trick to avoid collision with Minetest's status text (e.g. “Volume changed to 0%”) + if off.y >= -167 and off.y <= -156 then + off.y = -181 + end + end + + huds[player_name] = player:hud_add({ + hud_elem_type = "text", + position = {x=0.5, y=1}, + offset = off, + alignment = {x=0, y=0}, + number = 0xFFFFFF , + text = "", + }) +end + +minetest.register_on_joinplayer(function(player) + set_hud(player) + + local name = player:get_player_name() + wield[name] = player:get_wielded_item():get_name() + wieldindex[name] = player:get_wield_index() +end) + +minetest.register_on_leaveplayer(function(player) + local name = player:get_player_name() + wield[name] = nil + wieldindex[name] = nil +end) + +minetest.register_globalstep(function(dtime) + for _, player in pairs(minetest.get_connected_players()) do + local player_name = player:get_player_name() + local wstack = player:get_wielded_item() + local wname = wstack:get_name() + local windex = player:get_wield_index() + + if dtimes[player_name] and dtimes[player_name] < dlimit then + dtimes[player_name] = dtimes[player_name] + dtime + if dtimes[player_name] > dlimit and huds[player_name] then + player:hud_change(huds[player_name], 'text', "") + end + end + + -- Update HUD when wielded item or wielded index changed + if wname ~= wield[player_name] or windex ~= wieldindex[player_name] then + wieldindex[player_name] = windex + wield[player_name] = wname + dtimes[player_name] = 0 + + if huds[player_name] then + + local def = minetest.registered_items[wname] + local meta = wstack:get_meta() + + --[[ Get description. Order of preference: + * description from metadata + * description from item definition + * itemstring ]] + local desc = meta:get_string("description") + if (desc == nil or desc == "") and def then + desc = def.description + end + if desc == nil or desc == "" then + desc = wname + end + -- Cut off item description after first newline + local firstnewline = string.find(desc, "\n") + if firstnewline then + desc = string.sub(desc, 1, firstnewline-1) + end + player:hud_change(huds[player_name], 'text', desc) + end + end + end +end) + diff --git a/mods/HUD/show_wielded_item/mod.conf b/mods/HUD/show_wielded_item/mod.conf new file mode 100644 index 0000000000..fdedae0f7e --- /dev/null +++ b/mods/HUD/show_wielded_item/mod.conf @@ -0,0 +1 @@ +name = show_wielded_item diff --git a/mods/HUD/show_wielded_item/screenshot.png b/mods/HUD/show_wielded_item/screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..50c2c626051b8ba80d67b178defc0401bf264814 GIT binary patch literal 11859 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