From 5e27b5b423a8655932624e4705135a2182fff86b Mon Sep 17 00:00:00 2001 From: mckaygerhard Date: Mon, 24 Jul 2023 12:38:17 -0400 Subject: [PATCH] mods - hudbars+hbarmor+hunger - fusion into a simgle loading mod * fix workaroun about ssettings not configurable * do not hardcoded hp_max from other mods, unless configured here * provide settings for hbhunger steps * provide settings for auto hide or not hbarmor * document those missing features * mark mod with version 2.3.5.0 and using redo flag --- README.md | 4 +- mods/hbarmor/README.md | 42 --- mods/hbarmor/depends.txt | 2 - mods/hbarmor/init.lua | 174 ------------ mods/hbarmor/locale/hbarmor.de.tr | 3 - mods/hbarmor/locale/hbarmor.es.tr | 3 - mods/hbarmor/locale/hbarmor.it.tr | 3 - mods/hbarmor/locale/template.txt | 5 - mods/hbarmor/mod.conf | 3 - mods/hbarmor/screenshot.png | Bin 10821 -> 0 bytes mods/hbarmor/settingtypes.txt | 7 - mods/hbarmor/textures/hbarmor_icon.png | Bin 147 -> 0 bytes mods/hbhunger/.mailmap | 2 - mods/hbhunger/README.md | 96 ------- mods/hbhunger/depends.txt | 30 --- mods/hbhunger/init.lua | 225 ---------------- mods/hbhunger/locale/hbhunger.de.tr | 7 - mods/hbhunger/locale/hbhunger.es.tr | 2 - mods/hbhunger/locale/hbhunger.it.tr | 2 - mods/hbhunger/locale/hbhunger.ms.tr | 2 - mods/hbhunger/locale/hbhunger.pt.tr | 2 - mods/hbhunger/locale/hbhunger.ru.tr | 2 - mods/hbhunger/locale/template.txt | 7 - mods/hbhunger/mod.conf | 4 - mods/hbhunger/screenshot.png | Bin 8498 -> 0 bytes mods/hbhunger/settingtypes.txt | 9 - mods/hudbars/README.md | 132 ++++++++-- mods/hudbars/default_settings.lua | 24 +- mods/hudbars/depends.txt | 32 ++- mods/hudbars/description.txt | 2 +- mods/{hbhunger => hudbars}/hunger.lua | 4 +- mods/hudbars/init.lua | 248 ++++++++++++++++-- mods/hudbars/locale/hudbars.de.tr | 8 + mods/hudbars/locale/hudbars.es.tr | 7 + .../locale/hudbars.fr.tr} | 0 mods/hudbars/locale/hudbars.it.tr | 5 +- mods/hudbars/locale/hudbars.ms.tr | 1 + mods/hudbars/locale/hudbars.pt.tr | 5 +- mods/hudbars/locale/hudbars.ru.tr | 5 +- mods/hudbars/locale/template.txt | 6 +- mods/hudbars/mod.conf | 3 +- mods/{hbhunger => hudbars}/register_foods.lua | 0 mods/hudbars/screenshot.png | Bin 9556 -> 22776 bytes mods/hudbars/settingtypes.txt | 13 + .../sounds/hbhunger_eat_generic.ogg | Bin .../textures/hbarmor_bar.png | Bin mods/hudbars/textures/hbarmor_icon.png | Bin 0 -> 2641 bytes .../textures/hbhunger_bar.png | Bin .../textures/hbhunger_bar_health_poison.png | Bin .../textures/hbhunger_icon.png | Bin .../textures/hbhunger_icon_health_poison.png | Bin 51 files changed, 445 insertions(+), 686 deletions(-) delete mode 100644 mods/hbarmor/README.md delete mode 100644 mods/hbarmor/depends.txt delete mode 100644 mods/hbarmor/init.lua delete mode 100644 mods/hbarmor/locale/hbarmor.de.tr delete mode 100644 mods/hbarmor/locale/hbarmor.es.tr delete mode 100644 mods/hbarmor/locale/hbarmor.it.tr delete mode 100644 mods/hbarmor/locale/template.txt delete mode 100644 mods/hbarmor/mod.conf delete mode 100644 mods/hbarmor/screenshot.png delete mode 100644 mods/hbarmor/settingtypes.txt delete mode 100644 mods/hbarmor/textures/hbarmor_icon.png delete mode 100644 mods/hbhunger/.mailmap delete mode 100644 mods/hbhunger/README.md delete mode 100644 mods/hbhunger/depends.txt delete mode 100644 mods/hbhunger/init.lua delete mode 100644 mods/hbhunger/locale/hbhunger.de.tr delete mode 100644 mods/hbhunger/locale/hbhunger.es.tr delete mode 100644 mods/hbhunger/locale/hbhunger.it.tr delete mode 100644 mods/hbhunger/locale/hbhunger.ms.tr delete mode 100644 mods/hbhunger/locale/hbhunger.pt.tr delete mode 100644 mods/hbhunger/locale/hbhunger.ru.tr delete mode 100644 mods/hbhunger/locale/template.txt delete mode 100644 mods/hbhunger/mod.conf delete mode 100644 mods/hbhunger/screenshot.png delete mode 100644 mods/hbhunger/settingtypes.txt rename mods/{hbhunger => hudbars}/hunger.lua (98%) rename mods/{hbhunger/locale/hbhunger.fr.tr => hudbars/locale/hudbars.fr.tr} (100%) rename mods/{hbhunger => hudbars}/register_foods.lua (100%) rename mods/{hbhunger => hudbars}/sounds/hbhunger_eat_generic.ogg (100%) rename mods/{hbarmor => hudbars}/textures/hbarmor_bar.png (100%) create mode 100644 mods/hudbars/textures/hbarmor_icon.png rename mods/{hbhunger => hudbars}/textures/hbhunger_bar.png (100%) rename mods/{hbhunger => hudbars}/textures/hbhunger_bar_health_poison.png (100%) rename mods/{hbhunger => hudbars}/textures/hbhunger_icon.png (100%) rename mods/{hbhunger => hudbars}/textures/hbhunger_icon_health_poison.png (100%) diff --git a/README.md b/README.md index 366af63..7f7a8d7 100644 --- a/README.md +++ b/README.md @@ -62,8 +62,8 @@ To download you can play this game with the following minetest engines: * Wilhelmines Marinara as `marinara` [mods/marinara](mods/marinara) https://git.minetest.io/minenux/minetest-mod-marinara forked compatible version * Wuzzy * Hudbars as `hudbars` [mods/hudbars](mods/hudbars) https://codeberg.org/minenux/minetest-mod-hudbars - * Hudbar Armor as `hbarmor` [mods/hbarmor](mods/hbarmor) https://codeberg.org/Wuzzy/minetest_hbarmor/ - * Hudbar Hunger as `hbhunger` [mods/hbhunger](mods/hbhunger) https://codeberg.org/Wuzzy/minetest_hbhunger/ + * Hudbar Armor as `hudbars` [mods/hudbars](mods/hudbars) https://codeberg.org/minenux/minetest-game-nssg/commit/39c56ecd26ef559f063bf9effa0b1c58cc6bf969 + * Hudbar Hunger as `hudbars` [mods/hbhunger](mods/hbhunger) https://codeberg.org/minenux/minetest-game-nssg/commit/39c56ecd26ef559f063bf9effa0b1c58cc6bf969 ## Licensing diff --git a/mods/hbarmor/README.md b/mods/hbarmor/README.md deleted file mode 100644 index a6af08b..0000000 --- a/mods/hbarmor/README.md +++ /dev/null @@ -1,42 +0,0 @@ -# HUD bar for `3d_armor` [`hbarmor`] - -* Version: 1.0.0 - -## Description -This mod adds a simple HUD bar which displays the current damage -of the player's armor (from the 3D Armor [`3d_armor`] mod) as a percentage (rounded). - -100% armor means the armor is in perfect shape. 0% means the armor is almost destroyed -or non-existant. Note that to reach 100%, the player must wear at least 4 different -pieces of armor in perfect shape. - -The armor bar also does not tell anything about the armor's strength, -only how worn out it already is. - -By default, the armor bar is hidden if the player wears no armor. - -## Dependencies -* HUD bars [`hudbars`], major version 2 -* 3D Armor [`3d_armor`] (tested with Minetest 5.0.0) - -## Licensing -This mod is entirly free softare. - -### Source code - -* License: MIT License (see below) -* Authors: Wuzzy, forked from the mod “Better HUD (and hunger)” [`hud`] by BlockMen (2013-2014) - -### Textures - -* `hbarmor_icon.png`—Stu ([CC BY-SA 3.0](https://creativecommons.org/licenses/by-sa/3.0/)), modified by BlockMen -* `hbarmor_bgicon.png`—Stu (CC BY-SA 3.0), modified by BlockMen -* `hbarmor_bar.png`—Wuzzy (MIT License) - -Everything else is under the MIT License: -© Copyright BlockMen (2013-2014) - -This program is free software. It comes without any warranty, to -the extent permitted by applicable law. You can redistribute it -and/or modify it under the terms of the MIT License. -See for more details. diff --git a/mods/hbarmor/depends.txt b/mods/hbarmor/depends.txt deleted file mode 100644 index 579f7fb..0000000 --- a/mods/hbarmor/depends.txt +++ /dev/null @@ -1,2 +0,0 @@ -hudbars -3d_armor diff --git a/mods/hbarmor/init.lua b/mods/hbarmor/init.lua deleted file mode 100644 index a98ed90..0000000 --- a/mods/hbarmor/init.lua +++ /dev/null @@ -1,174 +0,0 @@ --- Intllib -local S -if minetest.get_translator ~= nil then - S = minetest.get_translator("ethereal") -- 5.x translation function -else - if minetest.get_modpath("intllib") then - dofile(minetest.get_modpath("intllib") .. "/init.lua") - if intllib.make_gettext_pair then - gettext, ngettext = intllib.make_gettext_pair() -- new gettext method - else - gettext = intllib.Getter() -- old text file method - end - S = gettext - else -- boilerplate function - S = function(str, ...) - local args = {...} - return str:gsub("@%d+", function(match) - return args[tonumber(match:sub(2))] - end) - end - end -end - -local N = function(s) return s end - -if (not armor) or (not armor.def) then - minetest.log("error", "[hbarmor] Outdated 3d_armor version. Please update your version of 3d_armor!") -end - -local hbarmor = {} - --- HUD statbar values -hbarmor.armor = {} - --- Stores if player's HUD bar has been initialized so far. -hbarmor.player_active = {} - --- Time difference in seconds between updates to the HUD armor bar. --- Increase this number for slow servers. -hbarmor.tick = 0.3 - --- If true, the armor bar is hidden when the player does not wear any armor -hbarmor.autohide = false - ---load custom settings -local set = minetest.settings:get_bool("hbarmor_autohide") -if set ~= nil then - hbarmor.autohide = set -end - -set = minetest.settings:get("hbarmor_tick") -if tonumber(set) ~= nil then - hbarmor.tick = tonumber(set) -end - - -local must_hide = function(playername, arm) - return ((not armor.def[playername].count or armor.def[playername].count == 0) and arm == 0) -end - -local arm_printable = function(arm) - return math.ceil(math.floor(arm+0.5)) -end - -local function custom_hud(player) - local name = player:get_player_name() - - if minetest.settings:get_bool("enable_damage") then - local ret = hbarmor.get_armor(player) - if ret == false then - minetest.log("error", "[hbarmor] Call to hbarmor.get_armor in custom_hud returned with false!") - end - local arm = tonumber(hbarmor.armor[name]) - if not arm then arm = 0 end - local hide - if hbarmor.autohide then - hide = must_hide(name, arm) - else - hide = false - end - hb.init_hudbar(player, "armor", arm_printable(arm), nil, hide) - end -end - ---register and define armor HUD bar -local hicon = "hbarmor_icon.png" -if hb.settings.bar_type == "progress_bar" then hicon = nil end -hb.register_hudbar("armor", 0xFFFFFF, S("Armor"), { icon = hicon, bgicon = nil, bar = "hbarmor_bar.png" }, 0, 100, hbarmor.autohide, N("@1: @2%"), { order = { "label", "value" }, textdomain = "hbarmor" } ) - -function hbarmor.get_armor(player) - if not player or not armor.def then - return false - end - local name = player:get_player_name() - local def = armor.def[name] or nil - if def and def.state and def.count then - hbarmor.set_armor(name, def.state, def.count) - else - return false - end - return true -end - -function hbarmor.set_armor(player_name, ges_state, items) - local max_items = 4 - if items == 5 then - max_items = items - end - local max = max_items * 65535 - local lvl = max - ges_state - lvl = lvl/max - if ges_state == 0 and items == 0 then - lvl = 0 - end - - hbarmor.armor[player_name] = math.max(0, math.min(lvl* (items * (100 / max_items)), 100)) -end - --- update hud elemtens if value has changed -local function update_hud(player) - local name = player:get_player_name() - --armor - local arm = tonumber(hbarmor.armor[name]) - if not arm then - arm = 0 - hbarmor.armor[name] = 0 - end - if hbarmor.autohide then - -- hide armor bar completely when there is none - if must_hide(name, arm) then - hb.hide_hudbar(player, "armor") - else - hb.change_hudbar(player, "armor", arm_printable(arm)) - hb.unhide_hudbar(player, "armor") - end - else - hb.change_hudbar(player, "armor", arm_printable(arm)) - end -end - -minetest.register_on_joinplayer(function(player) - local name = player:get_player_name() - custom_hud(player) - hbarmor.player_active[name] = true -end) - -minetest.register_on_leaveplayer(function(player) - local name = player:get_player_name() - hbarmor.player_active[name] = false -end) - -local main_timer = 0 -local timer = 0 -minetest.register_globalstep(function(dtime) - main_timer = main_timer + dtime - timer = timer + dtime - if main_timer > hbarmor.tick or timer > 4 then - if minetest.settings:get_bool("enable_damage") then - if main_timer > hbarmor.tick then main_timer = 0 end - for _,player in ipairs(minetest.get_connected_players()) do - local name = player:get_player_name() - if hbarmor.player_active[name] == true then - local ret = hbarmor.get_armor(player) - if ret == false then - minetest.log("error", "[hbarmor] Call to hbarmor.get_armor in globalstep returned with false!") - end - -- update all hud elements - update_hud(player) - end - end - end - end - if timer > 4 then timer = 0 end -end) diff --git a/mods/hbarmor/locale/hbarmor.de.tr b/mods/hbarmor/locale/hbarmor.de.tr deleted file mode 100644 index 1649802..0000000 --- a/mods/hbarmor/locale/hbarmor.de.tr +++ /dev/null @@ -1,3 +0,0 @@ -# textdomain:hbarmor -Armor=Panzerung -@1: @2%=@1: @2% diff --git a/mods/hbarmor/locale/hbarmor.es.tr b/mods/hbarmor/locale/hbarmor.es.tr deleted file mode 100644 index 146b017..0000000 --- a/mods/hbarmor/locale/hbarmor.es.tr +++ /dev/null @@ -1,3 +0,0 @@ -# textdomain:hbarmor -Armor=Armadura -@1: @2%=@1:@2% diff --git a/mods/hbarmor/locale/hbarmor.it.tr b/mods/hbarmor/locale/hbarmor.it.tr deleted file mode 100644 index 54601d5..0000000 --- a/mods/hbarmor/locale/hbarmor.it.tr +++ /dev/null @@ -1,3 +0,0 @@ -# textdomain:hbarmor -Armor=Armatura -@1: @2%=@1:@2% diff --git a/mods/hbarmor/locale/template.txt b/mods/hbarmor/locale/template.txt deleted file mode 100644 index 0f22286..0000000 --- a/mods/hbarmor/locale/template.txt +++ /dev/null @@ -1,5 +0,0 @@ -# textdomain:hbarmor -Armor= - -# Format string for displaying the armor. E.g. "Armor: 100%" -@1: @2%= diff --git a/mods/hbarmor/mod.conf b/mods/hbarmor/mod.conf deleted file mode 100644 index 820500e..0000000 --- a/mods/hbarmor/mod.conf +++ /dev/null @@ -1,3 +0,0 @@ -name = hbarmor -description = Adds a HUD bar displaying the current damage of the player's armor. -depends = hudbars, 3d_armor diff --git a/mods/hbarmor/screenshot.png b/mods/hbarmor/screenshot.png deleted file mode 100644 index 907cf900de5407f5fffc0b6e7cb4d6ac082972f8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10821 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 P00000NkvXXu0mjftq_bx diff --git a/mods/hbarmor/settingtypes.txt b/mods/hbarmor/settingtypes.txt deleted file mode 100644 index 263a6f4..0000000 --- a/mods/hbarmor/settingtypes.txt +++ /dev/null @@ -1,7 +0,0 @@ -#If true, automatically hides the armor HUD bar when the player wears no -#armor. Otherwise, the armor bar shows “0%”. -hbarmor_autohide (Automatically hide armor HUD bar) bool false - -#Time difference in seconds between updates to the armor HUD bar. -#Increase this number for slow servers. -hbarmor_tick (Armor HUD bar update frequency) float 0.3 0.0 4.0 diff --git a/mods/hbarmor/textures/hbarmor_icon.png b/mods/hbarmor/textures/hbarmor_icon.png deleted file mode 100644 index f76e9c30d2665f57f0ecd678e03bf3bbbb889694..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 147 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!93?!50ihlx9oB=)|uI>ds2hW~;@!>;wuTK|H zkg+7lFPOpM*^M+H$HLRaF@)oKazX?1u?qq0Y}-O3g&U4&2?$CZIIvAe^u#RIl#PDO qLOsEaUI$)DxHwBJU|Gz3h=+|K>Ibh1n_UjbN(N6?KbLh*2~7Zn`YSsC diff --git a/mods/hbhunger/.mailmap b/mods/hbhunger/.mailmap deleted file mode 100644 index 3d78b58..0000000 --- a/mods/hbhunger/.mailmap +++ /dev/null @@ -1,2 +0,0 @@ -Wuzzy -Wuzzy diff --git a/mods/hbhunger/README.md b/mods/hbhunger/README.md deleted file mode 100644 index c8e3ffc..0000000 --- a/mods/hbhunger/README.md +++ /dev/null @@ -1,96 +0,0 @@ -# Hunger with HUD bar [`hbhunger`] - -* Version: 1.1.2 - -## Using the mod - -This mod adds a mechanic for hunger. -This mod depends on the HUD bars mod [`hudbars`], version 1.4.1 or any later version -starting with “1.” or “2.”. - -## About hunger -This mod adds a hunger mechanic to the game. Players get a new attribute called “satiation”: - -* A new player starts with 20 satiation points out of 30 -* Actions like digging, placing and walking cause exhaustion, which lower the satiation -* Every 800 seconds you lose 1 satiation point without doing anything -* At 1 or 0 satiation you will suffer damage and die in case you don't eat something -* If your satiation is 16 or higher, you will slowly regenerate health points -* Eating food will increase your satiation (Duh!) - -Important: Eating food will not directly increase your health anymore, as long as the food -item is supported by this mod (see below). - -Careful! Some foods may be poisoned. If you eat a poisoned item, you may still get a satiation -boost, but for a brief period you lose health points because of food poisoning. However, -food poisoning can never kill you. - -## Statbar mode -If you use the statbar mode of the HUD Bars mod, these things are important to know: -As with all mods using HUD Bars, the bread statbar symbols represent the rough percentage -out of 30 satiation points, in steps of 5%, so the symbols give you an estimate of your -satiation. This is different from the hunger mod by BlockMen. - -You gain health at 5.5 symbols or more, as 5.5 symbols correspond to 16 satiation points. -You *may* lose health at exactly 0.5 symbols, as 0.5 symbols correspond to 1-2 satiation points. - -## Supported food -All mods which add food through standard measures (`minetest.item_eat`) are already -supported automatically. Poisoned food needs special support. - -### Known supported food mods -* Apple and Blueberries from Minetest Game [`default`] -* Red and brown mushroom from Minetest Game [`flowers`] -* Bread from Minetest Game [`farming`] -* [`animalmaterials`] (Mob Framework (`mobf` modpack)) -* Bushes [`bushes`] -* [`bushes_classic`] -* Creatures [`creatures`] -* [`dwarves`] (beer and such) -* Docfarming [`docfarming`] -* Ethereal / Ethereal NG [`ethereal`] -* Farming Redo [`farming`] by TenPlus1 -* Farming plus [`farming_plus`] -* Ferns [`ferns`] -* Fishing [`fishing`] -* [`fruit`] -* Glooptest [`glooptest`] -* JKMod ([`jkanimals`], [`jkfarming`], [`jkwine`]) -* [`kpgmobs`] -* [`mobfcooking`] -* [`mooretrees`] -* [`mtfoods`] -* [`mushroom`] -* [`mush45`] -* Seaplants [`sea`] -* Simple mobs [`mobs`] -* Pizza [`pizza`] -* Not So Simple Mobs [`nssm`] - -### Supported mods without optional dependency (mods provide their own support) - -* Food ([`food`], [`food_basic`]) -* Sweet Foods [`food_sweet`] - -### Example - -* Eating an apple (from Minetest Game) increases your satiation by 2; - -## Licensing -This mod is free software. - -### Source code - -* License: [LGPL v2.1](https://www.gnu.org/licenses/old-licenses/lgpl-2.1.en.html) -* Author: by Wuzzy (2015-2016) -* Forked from the “Better HUD (and hunger)” mod by BlockMen (2013-2015), - most code comes from this mod. - -### Textures - -* `hbhunger_icon.png`—PilzAdam ([MIT License](https://opensource.org/licenses/MIT)), modified by BlockMen -* `hbhunger_bgicon.png`—PilzAdam (MIT License), modified by BlockMen -* `hbhunger_bar.png`—Wuzzy (MIT License) -* `hbhunger_icon_health_poison.png`—celeron55 ([CC BY-SA 3.0](https://creativecommons.org/licenses/by-sa/3.0/)), modified by BlockMen, modified again by Wuzzy -* Everything else: MIT License, by BlockMen and Wuzzy - diff --git a/mods/hbhunger/depends.txt b/mods/hbhunger/depends.txt deleted file mode 100644 index 1cc6acf..0000000 --- a/mods/hbhunger/depends.txt +++ /dev/null @@ -1,30 +0,0 @@ -hudbars -default -flowers? -animalmaterials? -bucket? -bushes? -bushes_classic? -cooking? -creatures? -docfarming? -dwarves? -ethereal? -farming? -farming_plus? -ferns? -fishing? -fruit? -glooptest? -jkanimals? -jkfarming? -jkwine? -kpgmobs? -mobfcooking? -mobs?moretrees? -mtfoods? -mush45? -mushroom? -seaplants? -pizza? -nssm? diff --git a/mods/hbhunger/init.lua b/mods/hbhunger/init.lua deleted file mode 100644 index f9c1e6b..0000000 --- a/mods/hbhunger/init.lua +++ /dev/null @@ -1,225 +0,0 @@ -local S - -if minetest.get_translator ~= nil then - S = minetest.get_translator("hbhunger") -- 5.x translation function -else - if minetest.get_modpath("intllib") then - dofile(minetest.get_modpath("intllib") .. "/init.lua") - if intllib.make_gettext_pair then - gettext, ngettext = intllib.make_gettext_pair() -- new gettext method - else - gettext = intllib.Getter() -- old text file method - end - S = gettext - else -- boilerplate function - S = function(str, ...) - local args = {...} - return str:gsub("@%d+", function(match) - return args[tonumber(match:sub(2))] - end) - end - end -end - -local N = function(s) return s end - -if minetest.settings:get_bool("enable_damage") then - -hbhunger = {} -hbhunger.food = {} - --- HUD statbar values -hbhunger.hunger = {} -hbhunger.hunger_out = {} - --- Count number of poisonings a player has at once -hbhunger.poisonings = {} - --- HUD item ids -local hunger_hud = {} - -hbhunger.HUD_TICK = 0.1 - ---Some hunger settings -hbhunger.exhaustion = {} -- Exhaustion is experimental! - -hbhunger.HUNGER_TICK = 800 -- time in seconds after that 1 hunger point is taken -hbhunger.EXHAUST_DIG = 3 -- exhaustion increased this value after digged node -hbhunger.EXHAUST_PLACE = 1 -- exhaustion increased this value after placed -hbhunger.EXHAUST_MOVE = 0.3 -- exhaustion increased this value if player movement detected -hbhunger.EXHAUST_LVL = 160 -- at what exhaustion player satiation gets lowerd -hbhunger.SAT_MAX = 30 -- maximum satiation points -hbhunger.SAT_INIT = 20 -- initial satiation points -hbhunger.SAT_HEAL = 15 -- required satiation points to start healing - -local set - -set= minetest.settings:get("hbhunger_satiation_tick") if set ~= nil then hbhunger.HUNGER_TICK = tonumber(set) end -set= minetest.settings:get("hbhunger_satiation_dig") if set ~= nil then hbhunger.HUNGER_DIG = tonumber(set) end -set= minetest.settings:get("hbhunger_satiation_place") if set ~= nil then hbhunger.HUNGER_PLACE = tonumber(set) end -set= minetest.settings:get("hbhunger_satiation_move") if set ~= nil then hbhunger.HUNGER_MOVE = tonumber(set) end -set= minetest.settings:get("hbhunger_satiation_lvl") if set ~= nil then hbhunger.HUNGER_LVL = tonumber(set) end - ---load custom settings -local set = io.open(minetest.get_modpath("hbhunger").."/hbhunger.conf", "r") -if set then - dofile(minetest.get_modpath("hbhunger").."/hbhunger.conf") - set:close() -end - -local function custom_hud(player) - hb.init_hudbar(player, "satiation", hbhunger.get_hunger_raw(player)) -end - -dofile(minetest.get_modpath("hbhunger").."/hunger.lua") -dofile(minetest.get_modpath("hbhunger").."/register_foods.lua") - --- register satiation hudbar -local sicon = "hbhunger_icon.png" -if hb.settings.bar_type == "progress_bar" then - sicon = nil -end -hb.register_hudbar("satiation", 0xFFFFFF, S("Satiation"), { icon = sicon, bgicon = nil, bar = "hbhunger_bar.png" }, hbhunger.SAT_INIT, hbhunger.SAT_MAX, false, nil, { format_value = "%02d", format_max_value = "%02d" }) - --- update hud elemtens if value has changed -local function update_hud(player) - local name = player:get_player_name() - --hunger - local h_out = tonumber(hbhunger.hunger_out[name]) - local h = tonumber(hbhunger.hunger[name]) - if h_out ~= h then - hbhunger.hunger_out[name] = h - hb.change_hudbar(player, "satiation", h) - end -end - -hbhunger.get_hunger_raw = function(player) - local inv = player:get_inventory() - if not inv then return nil end - local hgp = inv:get_stack("hunger", 1):get_count() - if hgp == 0 then - hgp = 21 - inv:set_stack("hunger", 1, ItemStack({name=":", count=hgp})) - else - hgp = hgp - end - return hgp-1 -end - -hbhunger.set_hunger_raw = function(player) - local inv = player:get_inventory() - local name = player:get_player_name() - local value = hbhunger.hunger[name] - if not inv or not value then return nil end - if value > hbhunger.SAT_MAX then value = hbhunger.SAT_MAX end - if value < 0 then value = 0 end - - inv:set_stack("hunger", 1, ItemStack({name=":", count=value+1})) - - return true -end - -minetest.register_on_joinplayer(function(player) - if minetest.is_player(player) then - local name = player:get_player_name() - local inv = player:get_inventory() - inv:set_size("hunger",1) - hbhunger.hunger[name] = hbhunger.get_hunger_raw(player) - hbhunger.hunger_out[name] = hbhunger.hunger[name] - hbhunger.exhaustion[name] = 0 - hbhunger.poisonings[name] = 0 - custom_hud(player) - hbhunger.set_hunger_raw(player) - end -end) - -minetest.register_on_respawnplayer(function(player) - local name = player:get_player_name() - if minetest.is_player(player) and name then - hbhunger.hunger[name] = hbhunger.SAT_INIT - hbhunger.set_hunger_raw(player) - hbhunger.exhaustion[name] = 0 - end -end) - -local main_timer = 0 -local timer = 0 -local timer2 = 0 -minetest.register_globalstep(function(dtime) - main_timer = main_timer + dtime - timer = timer + dtime - timer2 = timer2 + dtime - if main_timer > hbhunger.HUD_TICK or timer > 4 or timer2 > hbhunger.HUNGER_TICK then - if main_timer > hbhunger.HUD_TICK then main_timer = 0 end - for _,player in ipairs(minetest.get_connected_players()) do - local name = player:get_player_name() - - local h = tonumber(hbhunger.hunger[name]) - local hp = player:get_hp() - if timer > 4 then - -- heal player by 1 hp if not dead and satiation is > hbhunger.SAT_HEAL - if h > hbhunger.SAT_HEAL and hp > 0 and player:get_breath() > 0 then - player:set_hp(hp+1) - -- or damage player by 1 hp if satiation is < 2 - elseif h <= 1 then - if hp-1 >= 0 then player:set_hp(hp-1) end - end - end - -- lower satiation by 1 point after xx seconds - if timer2 > hbhunger.HUNGER_TICK then - if h > 0 then - h = h-1 - hbhunger.hunger[name] = h - hbhunger.set_hunger_raw(player) - end - end - - -- update all hud elements - update_hud(player) - - local controls = player:get_player_control() - -- Determine if the player is walking - if controls.up or controls.down or controls.left or controls.right then - hbhunger.handle_node_actions(nil, nil, player) - end - end - end - if timer > 4 then timer = 0 end - if timer2 > hbhunger.HUNGER_TICK then timer2 = 0 end -end) - -minetest.register_chatcommand("satiation", { - privs = {["server"]=true}, - params = S("[] "), - description = S("Set satiation of player or yourself"), - func = function(name, param) - if minetest.settings:get_bool("enable_damage") == false then - return false, S("Not possible, damage is disabled.") - end - local targetname, satiation = string.match(param, "(%S+) (%S+)") - if not targetname then - satiation = param - end - satiation = tonumber(satiation) - if not satiation then - return false, S("Invalid satiation!") - end - if not targetname then - targetname = name - end - local target = minetest.get_player_by_name(targetname) - if target == nil then - return false, S("Player @1 does not exist.", targetname) - end - if satiation > hbhunger.SAT_MAX then - satiation = hbhunger.SAT_MAX - elseif satiation < 0 then - satiation = 0 - end - hbhunger.hunger[targetname] = satiation - hbhunger.set_hunger_raw(target) - return true - end, -}) - -end diff --git a/mods/hbhunger/locale/hbhunger.de.tr b/mods/hbhunger/locale/hbhunger.de.tr deleted file mode 100644 index 988b457..0000000 --- a/mods/hbhunger/locale/hbhunger.de.tr +++ /dev/null @@ -1,7 +0,0 @@ -# textdomain:hbhunger -Satiation=Sättigung -Set satiation of player or yourself=Sättigung von Spieler oder Ihnen selbst setzen -Not possible, damage is disabled.=Nicht möglich, Schaden ist deaktiviert. -Invalid satiation!=Ungültige Sättigung! -Player @1 does not exist.=Spieler @1 existiert nicht. -[] =[] diff --git a/mods/hbhunger/locale/hbhunger.es.tr b/mods/hbhunger/locale/hbhunger.es.tr deleted file mode 100644 index 0ec642c..0000000 --- a/mods/hbhunger/locale/hbhunger.es.tr +++ /dev/null @@ -1,2 +0,0 @@ -# textdomain:hbhunger -Satiation=Saciado diff --git a/mods/hbhunger/locale/hbhunger.it.tr b/mods/hbhunger/locale/hbhunger.it.tr deleted file mode 100644 index b99dc61..0000000 --- a/mods/hbhunger/locale/hbhunger.it.tr +++ /dev/null @@ -1,2 +0,0 @@ -# textdomain:hbhunger -Satiation=Sazietà diff --git a/mods/hbhunger/locale/hbhunger.ms.tr b/mods/hbhunger/locale/hbhunger.ms.tr deleted file mode 100644 index 67f08f7..0000000 --- a/mods/hbhunger/locale/hbhunger.ms.tr +++ /dev/null @@ -1,2 +0,0 @@ -# textdomain:hbhunger -Satiation=Kekenyangan diff --git a/mods/hbhunger/locale/hbhunger.pt.tr b/mods/hbhunger/locale/hbhunger.pt.tr deleted file mode 100644 index 82be594..0000000 --- a/mods/hbhunger/locale/hbhunger.pt.tr +++ /dev/null @@ -1,2 +0,0 @@ -# textdomain:hbhunger -Satiation=Saciedade diff --git a/mods/hbhunger/locale/hbhunger.ru.tr b/mods/hbhunger/locale/hbhunger.ru.tr deleted file mode 100644 index afd6e66..0000000 --- a/mods/hbhunger/locale/hbhunger.ru.tr +++ /dev/null @@ -1,2 +0,0 @@ -# textdomain:hbhunger -Satiation=голод diff --git a/mods/hbhunger/locale/template.txt b/mods/hbhunger/locale/template.txt deleted file mode 100644 index 507e005..0000000 --- a/mods/hbhunger/locale/template.txt +++ /dev/null @@ -1,7 +0,0 @@ -# textdomain:hbhunger -Satiation= -Set satiation of player or yourself= -Not possible, damage is disabled.= -Invalid satiation!= -Player @1 does not exist.= -[] = diff --git a/mods/hbhunger/mod.conf b/mods/hbhunger/mod.conf deleted file mode 100644 index da6c465..0000000 --- a/mods/hbhunger/mod.conf +++ /dev/null @@ -1,4 +0,0 @@ -name = hbhunger -description = Adds a simple hunger meachanic with satiation, food poisoning and different healing. -depends = hudbars -optional_depends = default, flowers, animalmaterials, bucket, bushes, bushes_classic, cooking, creatures, docfarming, dwarves, ethereal, farming, farming_plus, ferns, fishing, fruit, glooptest, jkanimals, jkfarming, jkwine, kpgmobs, mobfcooking, mobs, moretrees, mtfoods, mush45, mushroom, seaplants, pizza, nssm diff --git a/mods/hbhunger/screenshot.png b/mods/hbhunger/screenshot.png deleted file mode 100644 index 5af6583667df4ff97d008c7b503a307616773244..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8498 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 Warning: Eating food will not directly increase your health anymore, as long as the food +item is supported by this mod (see below). + +> Warning: ! Some foods may be poisoned. If you eat a poisoned item, you may still get a satiation +boost, but for a brief period you lose health points because of food poisoning. However, +food poisoning can never kill you. + +## Technical info ----------------- +This mod its a simplification of hudbars+hbarmor+hbhunger for performance +it provides extra checks for security an backguard compatibility +on all minetest engines. TExture media was optimized for low end devices. + +This fusioned hudbars 2.3.4.0 and hbarmor 1.0.1 with hbhunger 1.1.2 +with aditional patches rejected by upstream that improves performance. + +#### About armor support + +This mod adds a simple HUD bar which displays the current damage +of the player's armor (from the 3D Armor [`3d_armor`] mod) as a percentage (rounded). + +100% armor means the armor is in perfect shape. 0% means the armor is almost destroyed +or non-existant. Note that to reach 100%, the player must wear at least 4 or 6 different +pieces of armor in perfect shape. + +#### About hunger supoort + +This mod adds a hunger buildin mechanic to the game. Players get a new attribute called “satiation”: + +* A new player starts with 20 satiation points out of 30 +* Actions like digging, placing and walking cause exhaustion, which lower the satiation +* Every 800 seconds you lose 1 satiation point without doing anything +* At 1 or 0 satiation you will suffer damage and die in case you don't eat something +* If your satiation is 16 or higher, you will slowly regenerate health points +* Eating food will increase your satiation (Duh!) + +All mods which add food through standard measures (`minetest.item_eat`) are already +supported automatically. Poisoned food needs special support. + +#### Dependencies + +* default +* 3d_armor +* farming + +More mod are optionally supported depending of availability + +#### Known supported food mods + +* Apple and Blueberries from Minetest Game [`default`] +* Red and brown mushroom from Minetest Game [`flowers`] +* Bread from Minetest Game [`farming`] +* [`animalmaterials`] (Mob Framework (`mobf` modpack)) +* Bushes [`bushes`] +* [`bushes_classic`] +* Creatures [`creatures`] +* [`dwarves`] (beer and such) +* Docfarming [`docfarming`] +* Ethereal / Ethereal NG [`ethereal`] +* Farming Redo [`farming`] by TenPlus1 +* Farming plus [`farming_plus`] +* Ferns [`ferns`] +* Fishing [`fishing`] +* [`fruit`] +* Glooptest [`glooptest`] +* JKMod ([`jkanimals`], [`jkfarming`], [`jkwine`]) +* [`kpgmobs`] +* [`mobfcooking`] +* [`mooretrees`] +* [`mtfoods`] +* [`mushroom`] +* [`mush45`] +* Seaplants [`sea`] +* Simple mobs [`mobs`] +* Pizza [`pizza`] +* Not So Simple Mobs [`nssm`] + +#### Statbar mode + +If you use the statbar mode of the HUD Bars mod, these things are important to know: +As with all mods using HUD Bars, the bread statbar symbols represent the rough percentage +out of 30 satiation points, in steps of 5%, so the symbols give you an estimate of your +satiation. This is different from the hunger mod by BlockMen. + > **Warning** Keep in mind if running a server with this mod, that the custom position should be displayed correctly on every screen size. -#### Dependencies - -There's no depends - #### Current version -The current version is 2.3.4.0 its a plus fork from original cos current +The current version is 2.3.5 its a plus fork from original cos current minetest most close mods developers are not so open to support already working servers. -It works for Minetest 0.4.17+ (maybe 0.4.16 too) or later. +It works for Minetest 0.4.16+/5.X+ or later. -#### Settings +#### Configurations This mod can be configured quite a bit. You can change HUD bar appearance, offsets, ordering, and more. Use the advanced settings menu in Minetest for detailed configuration. -| configuration name | Description | type | values, min/default/max | +| configuration name | Description | type | values, default/min/max | | ---------------------------- | ------------------------------------- | ---- | ------------------------ | -| hudbars_bar_type | HUD bars style | enum | progress_bar progress_bar,statbar_classic,statbar_modern | +| hudbars_hp_player_maximun | set the maximun hp of the player healt | int | 10 20 60 | +| hudbars_br_player_maximun | set the maximun player breath value | int | 10 10 30 | +| hbarmor_autohide | Automatically hide armor HUD bar | bool | false | +| hbhunger_satiation_tick | Time in seconds which 1 saturation point is taken | float | 800 | +| hbhunger_satiation_sprint_dig | exhaustion increased this value after digged node | float | 3 | +| hbhunger_satiation_sprint_place | exhaustion increased this value after placed | float | 1 | +| hbhunger_satiation_sprint_move | exhaustion increased this value if player moves | float | 0.2 | +| hbhunger_satiation_sprint_lvl | at what exhaustion player satiation gets lowerd | float | 160 | +| hudbars_bar_type | HUD bars style | enum | progress_bar (progress_bar,statbar_classic,statbar_modern) | | hudbars_autohide_breath | Automatically hide breath indicators | bool | true | -| hudbars_alignment_pattern | HUD bars alignment pattern | enum | zigzag zigzag,stack_up,stack_down | +| hudbars_alignment_pattern | HUD bars alignment pattern | enum | zigzag (zigzag,stack_up,stack_down) | | hudbars_sorting | HUD bars order | string | breath=1, health=0 | | hudbars_pos_left_x | Left HUD bar screen x position | float | 0.5 0.0 1.0 | | hudbars_pos_left_y | Left HUD bar screen y position | float | 1.0 0.0 1.0 | @@ -54,7 +146,7 @@ Use the advanced settings menu in Minetest for detailed configuration. | hudbars_start_statbar_offset_right_x | Right HUD statbar x offset | int | 25 | | hudbars_start_statbar_offset_right_y | Right HUD statbar y offset | int | -90 | | hudbars_vmargin | Vertical distance between HUD bars | int | 24 0 | -| hudbars_tick | Default HUD bars update interval | float | 0.1 0.0 4.0 | +| hudbars_tick | Default HUD bars update interval | float | 0.2 0.0 4.0 | #### API @@ -65,9 +157,12 @@ Documentation for the API of this mod can be found in [`API.md`.](API.md) #### License of source code -Author: Wuzzy (2015) +Authors: -Also: This mod was forked from the “Better HUD” [hud] mod by BlockMen. +* Wuzzy (2015) +* PICCORO Lenz McKAY (2023) + +This mod was forked from the “Better HUD” (and hunger) [hud] mod by BlockMen. Translations: @@ -87,12 +182,15 @@ and/or modify it under the terms of the MIT License. #### Licenses of textures * `hudbars_icon_health.png`—celeron55 (CC BY-SA 3.0), modified by BlockMen -* `hudbars_bgicon_health.png`—celeron55 (CC BY-SA 3.0), modified by BlockMen * `hudbars_icon_breath.png`—kaeza (MIT License), modified by BlockMen, modified again by Wuzzy -* `hudbars_bgicon_breath.png`—based on previous image, edited by Wuzzy (MIT License) * `hudbars_bar_health.png`—Wuzzy (MIT License) * `hudbars_bar_breath.png`—Wuzzy (MIT License) * `hudbars_bar_background.png`—Wuzzy (MIT License) +* `hbarmor_icon.png`—Stu ([CC BY-SA 3.0](https://creativecommons.org/licenses/by-sa/3.0/)), modified by BlockMen +* `hbarmor_bar.png`—Wuzzy (MIT License) +* `hbhunger_icon.png`—PilzAdam ([MIT License](https://opensource.org/licenses/MIT)), modified by BlockMen +* `hbhunger_bar.png`—Wuzzy (MIT License) +* `hbhunger_icon_health_poison.png`—celeron55 ([CC BY-SA 3.0](https://creativecommons.org/licenses/by-sa/3.0/)), modified by BlockMen, modified again by Wuzzy #### License references diff --git a/mods/hudbars/default_settings.lua b/mods/hudbars/default_settings.lua index f720c7e..75ec2e6 100644 --- a/mods/hudbars/default_settings.lua +++ b/mods/hudbars/default_settings.lua @@ -32,7 +32,7 @@ hb.settings.forceload_default_hudbars = hb.load_setting("hudbars_forceload_defau -- Misc. settings hb.settings.alignment_pattern = hb.load_setting("hudbars_alignment_pattern", "string", "zigzag", {"zigzag", "stack_up", "stack_down"}) -hb.settings.autohide_breath = hb.load_setting("hudbars_autohide_breath", "bool", false) +hb.settings.autohide_breath = hb.load_setting("hudbars_autohide_breath", "bool", (true and not hb.settings.forceload_default_hudbars)) local sorting = minetest.settings:get("hudbars_sorting") if sorting ~= nil then @@ -55,3 +55,25 @@ core.PLAYER_MAX_HP_DEFAULT = hb.settings.hp_player_maximun else core.PLAYER_MAX_HP = hb.settings.hp_player_maximun end + +hbarmor.autohide = (true and not hb.settings.forceload_default_hudbars) + +hbhunger.HUD_TICK = 0.2 + +hbhunger.HUNGER_TICK = 800 -- time in seconds after that 1 hunger point is taken +hbhunger.EXHAUST_DIG = 3 -- exhaustion increased this value after digged node +hbhunger.EXHAUST_PLACE = 1 -- exhaustion increased this value after placed +hbhunger.EXHAUST_MOVE = 0.2 -- exhaustion increased this value if player movement detected +hbhunger.EXHAUST_LVL = 160 -- at what exhaustion player satiation gets lowerd +hbhunger.SAT_MAX = 30 -- maximum satiation points +hbhunger.SAT_INIT = 20 -- initial satiation points +hbhunger.SAT_HEAL = 15 -- required satiation points to start healing + +local set + +set = minetest.settings:get_bool("hbarmor_autohide") if set ~= nil then hbarmor.autohide = set end +set = minetest.settings:get("hbhunger_satiation_tick") if set ~= nil then hbhunger.HUNGER_TICK = tonumber(set) end +set = minetest.settings:get("hbhunger_satiation_dig") if set ~= nil then hbhunger.HUNGER_DIG = tonumber(set) end +set = minetest.settings:get("hbhunger_satiation_place") if set ~= nil then hbhunger.HUNGER_PLACE = tonumber(set) end +set = minetest.settings:get("hbhunger_satiation_move") if set ~= nil then hbhunger.HUNGER_MOVE = tonumber(set) end +set = minetest.settings:get("hbhunger_satiation_lvl") if set ~= nil then hbhunger.HUNGER_LVL = tonumber(set) end diff --git a/mods/hudbars/depends.txt b/mods/hudbars/depends.txt index d9b8b81..afc33be 100644 --- a/mods/hudbars/depends.txt +++ b/mods/hudbars/depends.txt @@ -1 +1,31 @@ -intllib? \ No newline at end of file +default? +intllib? +3d_armor? +flowers? +animalmaterials? +bucket? +bushes? +bushes_classic? +cooking? +creatures? +docfarming? +dwarves? +ethereal? +farming? +farming_plus? +ferns? +fishing? +fruit? +glooptest? +jkanimals? +jkfarming? +jkwine? +kpgmobs? +mobfcooking? +mobs?moretrees? +mtfoods? +mush45? +mushroom? +seaplants? +pizza? +nssm? diff --git a/mods/hudbars/description.txt b/mods/hudbars/description.txt index 726453c..3b178c7 100644 --- a/mods/hudbars/description.txt +++ b/mods/hudbars/description.txt @@ -1 +1 @@ -HUD mod to display as bars and API for \ No newline at end of file +HUD mod to display as bars and API for satiaton/stamina and armor status features diff --git a/mods/hbhunger/hunger.lua b/mods/hudbars/hunger.lua similarity index 98% rename from mods/hbhunger/hunger.lua rename to mods/hudbars/hunger.lua index ed6f229..0387581 100644 --- a/mods/hbhunger/hunger.lua +++ b/mods/hudbars/hunger.lua @@ -106,13 +106,13 @@ function hbhunger.item_eat(hunger_change, replace_with_item, poisen, heal, sound hbhunger.set_hunger_raw(user) end -- we must respect the real maximun hp of the player already set - max_hp = user:get_properties().hp_max + local max_hp = user:get_properties().hp_max -- Healing if hp < max_hp then -- heal is not defines due way of hbhunger.register_food if not heal then heal = 1 end -- eating something not give you inmediate life, give you statiation to get recovery - if hp < 3 and heal > 0 then hp = hp + heal end + if hp < 6 and heal > 0 then hp = hp + heal end -- so do not hardcoded hp to 20 when eating if hp > max_hp then hp = max_hp end -- this will work only when valid then diff --git a/mods/hudbars/init.lua b/mods/hudbars/init.lua index 9fff093..9987ea9 100644 --- a/mods/hudbars/init.lua +++ b/mods/hudbars/init.lua @@ -24,7 +24,13 @@ end local N = function(s) return s end +if (not armor) or (not armor.def) then + minetest.log("error", "[hbarmor] Outdated 3d_armor version. Please update your version of 3d_armor!") +end + hb = {} +hb.version = "2.3.5.0" +hb.redo = true hb.hudtables = {} @@ -34,6 +40,29 @@ hb.hudbars_count = 0 -- table which records which HUD bar slots have been “registered” so far; used for automatic positioning hb.registered_slots = {} +-- Table which contains all players with active default HUD bars (only for internal use) +hb.players = {} + +hbarmor = {} +hbhunger = {} + +-- HUD item ids +local hunger_hud = {} + +-- Stores if player's HUD bar has been initialized so far. +hbarmor.player_active = {} + +-- HUD statbar values +hbarmor.armor = {} +hbhunger.food = {} +hbhunger.hunger = {} +hbhunger.hunger_out = {} +hbhunger.poisonings = {} +hbhunger.exhaustion = {} -- Exhaustion is experimental! + +-- If true, the armor bar is hidden when the player does not wear any armor +hbarmor.autohide = true + hb.settings = {} function hb.load_setting(sname, stype, defaultval, valid_values) @@ -70,13 +99,52 @@ end -- Load default settings dofile(minetest.get_modpath("hudbars").."/default_settings.lua") +-- due lackof global hbhunger these need to be first +hbhunger.get_hunger_raw = function(player) + local inv = player:get_inventory() + if not inv then return nil end + local hgp = inv:get_stack("hunger", 1):get_count() + if hgp == 0 then + hgp = 21 + inv:set_stack("hunger", 1, ItemStack({name=":", count=hgp})) + else + hgp = hgp + end + return hgp-1 +end + +hbhunger.set_hunger_raw = function(player) + local inv = player:get_inventory() + local name = player:get_player_name() + local value = hbhunger.hunger[name] + if not inv or not value then return nil end + if value > hbhunger.SAT_MAX then value = hbhunger.SAT_MAX end + if value < 0 then value = 0 end + + inv:set_stack("hunger", 1, ItemStack({name=":", count=value+1})) + + return true +end + +-- Load hunger management function for food and mod handling +dofile(minetest.get_modpath("hudbars").."/hunger.lua") +dofile(minetest.get_modpath("hudbars").."/register_foods.lua") + local function player_exists(player) - return player ~= nil and player:is_player() + return player ~= nil and minetest.is_player(player) +end + +local must_hide = function(playername, arm) + return ((not armor.def[playername].count or armor.def[playername].count == 0 or not hb.settings.forceload_default_hudbars) and arm == 0) +end + +local arm_printable = function(arm) + return math.ceil(math.floor(arm+0.5)) end local function checksupportmax(player) local statusinfo = minetest.get_server_status() - if string.find(statusinfo,"0.4.1") and not string.find(statusinfo,"0.4.18") and not string.find(statusinfo,"0.4.17.5") then + if string.find(statusinfo,"0.4.1") and not string.find(statusinfo,"0.4.18") and not string.find(statusinfo,"0.4.17.3") then hb.settings.hp_player_maximun = 20 hb.settings.br_player_maximun = 10 if player_exists(player) then @@ -116,9 +184,6 @@ local function make_label(format_string, format_string_config, label, start_valu return ret end --- Table which contains all players with active default HUD bars (only for internal use) -hb.players = {} - function hb.value_to_barlength(value, max) if max == 0 then return 0 @@ -456,6 +521,8 @@ function hb.hide_hudbar(player, identifier) local name = player:get_player_name() local hudtable = hb.get_hudtable(identifier) if hudtable == nil then return false end + if not hudtable.hudstate[name] then return false end + if not hudtable.hudstate[name].hidden then return false end if hudtable.hudstate[name].hidden == true then return true end if hb.settings.bar_type == "progress_bar" then if hudtable.hudids[name].icon ~= nil then @@ -475,7 +542,8 @@ function hb.unhide_hudbar(player, identifier) local name = player:get_player_name() local hudtable = hb.get_hudtable(identifier) if hudtable == nil then return false end - if hudtable.hudstate[name].hidden == false then return true end + if not hudtable.hudstate[name] then return false end + if not hudtable.hudstate[name].hidden then return false end local value = hudtable.hudstate[name].value local max = hudtable.hudstate[name].max if hb.settings.bar_type == "progress_bar" then @@ -518,16 +586,22 @@ function hb.get_hudbar_identifiers() return ids end ---register built-in HUD bars +--register built-in HUD bars and armor HUD bar if minetest.settings:get_bool("enable_damage") or hb.settings.forceload_default_hudbars then local hicon = "hudbars_icon_health.png" local bicon = "hudbars_icon_breath.png" + local aicon = "hbarmor_icon.png" + local sicon = "hbhunger_icon.png" if hb.settings.bar_type == "progress_bar" then hicon = nil bicon = nil + aicon = nil + sicon = nil end - hb.register_hudbar("health", 0xFFFFFF, S("Health"), { bar = "hudbars_bar_health.png", icon = hicon, bgicon = nil }, hb.settings.hp_player_maximun, hb.settings.hp_player_maximun, false) - hb.register_hudbar("breath", 0xFFFFFF, S("Breath"), { bar = "hudbars_bar_breath.png", icon = bicon, bgicon = nil }, hb.settings.br_player_maximun, hb.settings.br_player_maximun, true) + hb.register_hudbar("health", 0xFFFFFF, S("Health"), { bar = "hudbars_bar_health.png", icon = hicon, bgicon = nil }, hb.settings.hp_player_maximun, hb.settings.hp_player_maximun, false) + hb.register_hudbar("breath", 0xFFFFFF, S("Breath"), { bar = "hudbars_bar_breath.png", icon = bicon, bgicon = nil }, hb.settings.br_player_maximun, hb.settings.br_player_maximun, false) + hb.register_hudbar("armor", 0xFFFFFF, S("Armor"), { bar = "hbarmor_bar.png", icon = aicon, bgicon = nil }, 0, 100, hbarmor.autohide, N("@1: @2%"), { order = { "label", "value" } } ) + hb.register_hudbar("satiation", 0xFFFFFF, S("Satiation"), { bar = "hbhunger_bar.png", icon = sicon, bgicon = nil }, hbhunger.SAT_INIT, hbhunger.SAT_MAX, false, nil, { format_value = "%02d", format_max_value = "%02d" }) end local function hide_builtin(player) @@ -537,27 +611,71 @@ local function hide_builtin(player) player:hud_set_flags(flags) end +function hbarmor.get_armor(player) + if not player or not armor.def then + return false + end + local name = player:get_player_name() + local def = armor.def[name] or nil + if def and def.state and def.count then + hbarmor.set_armor(name, def.state, def.count) + else + minetest.log("error", "[hudbars] Call to hbarmor.get_armor returned with false!") + return false + end + return true +end + +function hbarmor.set_armor(player_name, ges_state, items) + local max_items = 4 + if items == 5 then max_items = items end + local max = max_items * 65535 + local lvl = max - ges_state + lvl = lvl/max + if ges_state == 0 and items == 0 then lvl = 0 end + + hbarmor.armor[player_name] = math.max(0, math.min(lvl* (items * (100 / max_items)), 100)) +end local function custom_hud(player) + local name = player:get_player_name() + if minetest.settings:get_bool("enable_damage") or hb.settings.forceload_default_hudbars then - local hide + local arm = tonumber(hbarmor.armor[name]) + if not arm then arm = 0 end + + local hbhide if minetest.settings:get_bool("enable_damage") then - hide = false + hbhide = false else - hide = true + hbhide = true end + local hahide + if hbarmor.autohide then + hahide = must_hide(name, arm) + else + hahide = false + end + local sahide = true + local hp = player:get_hp() local hp_max = hb.settings.hp_player_maximun - hb.init_hudbar(player, "health", math.min(hp, hp_max), hp_max, hide) + if player:get_properties().hp_max then player:set_properties({hp_max = hb.settings.hp_player_maximun}) end + hb.init_hudbar(player, "health", math.min(hp, hp_max), hp_max, hbhide) + local breath = player:get_breath() local breath_max = hb.settings.br_player_maximun local hide_breath - -- real honoring to configuration of max hp custom heal and breath - if player:get_properties().hp_max then player:set_properties({hp_max = hb.settings.hp_player_maximun}) end if player:get_properties().breath_max then player:set_properties({breath_max = hb.settings.br_player_maximun}) end - -- workaround bug https://github.com/minetest/minetest/issues/12350 if breath >= breath_max and hb.settings.autohide_breath == true then hide_breath = true else hide_breath = false end - hb.init_hudbar(player, "breath", math.min(breath, breath_max), breath_max, hide_breath or hide) + hb.init_hudbar(player, "breath", math.min(breath, breath_max), breath_max, hide_breath or hbhide) + + hbarmor.get_armor(player) + arm = tonumber(hbarmor.armor[name]) + hb.init_hudbar(player, "armor", arm_printable(arm), 100, hahide) + + if hb.settings.forceload_default_hudbars then sahide = false end + hb.init_hudbar(player, "satiation", hbhunger.get_hunger_raw(player), nil, sahide) end end @@ -569,16 +687,24 @@ end -- update built-in HUD bars local function update_hud(player) - if not player_exists(player) then return end + + local lplayer = player_exists(player) + if not lplayer then return end + local name = player:get_player_name() + if not name then return end + local larmor = hbarmor.armor[name] + if not larmor then return end + local arm = tonumber(larmor) + if not arm then arm = 0; hbarmor.armor[name] = 0 end + + -- loading only if need or force loading if minetest.settings:get_bool("enable_damage") then if hb.settings.forceload_default_hudbars then hb.unhide_hudbar(player, "health") end --air local breath_max = player:get_properties().breath_max or hb.settings.br_player_maximun - -- workaround bug https://github.com/minetest/minetest/issues/12350 local breath = player:get_breath() - if breath >= breath_max and hb.settings.autohide_breath == true then hb.hide_hudbar(player, "breath") else @@ -587,10 +713,31 @@ local function update_hud(player) end --health update_health(player) + -- armor + if hbarmor.autohide then + if must_hide(name, arm) then + hb.hide_hudbar(player, "armor") + else + hb.change_hudbar(player, "armor", arm_printable(arm)) + hb.unhide_hudbar(player, "armor") + end + else + hb.change_hudbar(player, "armor", arm_printable(arm)) + hb.unhide_hudbar(player, "armor") + end + -- hunger + local h_out = tonumber(hbhunger.hunger_out[name]) + local h = tonumber(hbhunger.hunger[name]) + if h_out ~= h then + hbhunger.hunger_out[name] = h + hb.change_hudbar(player, "satiation", h) + end elseif hb.settings.forceload_default_hudbars then update_health(player) hb.hide_hudbar(player, "health") hb.hide_hudbar(player, "breath") + hb.hide_hudbar(player, "armor") + hb.hide_hudbar(player, "satiation") end end @@ -602,33 +749,88 @@ end) minetest.register_on_respawnplayer(function(player) update_health(player) + local name = player:get_player_name() + hbhunger.hunger[name] = hbhunger.SAT_INIT + hbhunger.set_hunger_raw(player) + hbhunger.exhaustion[name] = 0 hb.hide_hudbar(player, "breath") end) minetest.register_on_joinplayer(function(player) + local name = player:get_player_name() + local inv = player:get_inventory() + inv:set_size("hunger",1) + hbhunger.hunger[name] = hbhunger.get_hunger_raw(player) + hbhunger.hunger_out[name] = hbhunger.hunger[name] + hbhunger.exhaustion[name] = 0 + hbhunger.poisonings[name] = 0 hide_builtin(player) custom_hud(player) - hb.players[player:get_player_name()] = player + hb.players[name] = player + hbarmor.player_active[name] = true + hbhunger.set_hunger_raw(player) end) minetest.register_on_leaveplayer(function(player) - hb.players[player:get_player_name()] = nil + local name = player:get_player_name() + hb.players[name] = nil + hbarmor.player_active[name] = false end) local main_timer = 0 local timer = 0 +local timer2 = 0 minetest.register_globalstep(function(dtime) main_timer = main_timer + dtime timer = timer + dtime + timer2 = timer2 + dtime + -- main timer are for healt and breath, separate satiation cos needs aditional timers if main_timer > hb.settings.tick or timer > 4 then if main_timer > hb.settings.tick then main_timer = 0 end -- only proceed if damage is enabled if minetest.settings:get_bool("enable_damage") or hb.settings.forceload_default_hudbars then + -- update hud for healt for _, player in pairs(hb.players) do - -- update all hud elements update_hud(player) end + -- update all hud elements + for _,player in ipairs(minetest.get_connected_players()) do + local name = player:get_player_name() + if hbarmor.player_active[name] == true then + hbarmor.get_armor(player) + update_hud(player) + end + end + + end + end + -- satiaton are internal properties, so update live (not hb) player properties + if timer > 4 or timer2 > hbhunger.HUNGER_TICK then + for _,player in ipairs(minetest.get_connected_players()) do + local name = player:get_player_name() + local h = tonumber(hbhunger.hunger[name]) + local hp = player:get_hp() + if timer > 4 then + if h > hbhunger.SAT_HEAL and hp > 0 and player:get_breath() > 0 then + player:set_hp(hp+1) -- heal player by 1 hp if not dead and satiation is > hbhunger.SAT_HEAL + elseif h <= 1 then + if hp-1 >= 0 then player:set_hp(hp-1) end -- or damage player by 1 hp if satiation is < 2 + end + end + if timer2 > hbhunger.HUNGER_TICK then + if h > 0 then + h = h-1 -- lower satiation by 1 point after xx seconds + hbhunger.hunger[name] = h + hbhunger.set_hunger_raw(player) + end + end + -- still do not update all hud elements cos we have 2 loops + local controls = player:get_player_control() + if controls.up or controls.down or controls.left or controls.right then + hbhunger.handle_node_actions(nil, nil, player) -- Determine if the player is walking + end end end if timer > 4 then timer = 0 end + if timer2 > hbhunger.HUNGER_TICK then timer2 = 0 end end) diff --git a/mods/hudbars/locale/hudbars.de.tr b/mods/hudbars/locale/hudbars.de.tr index 3d1e697..2c4c0c1 100644 --- a/mods/hudbars/locale/hudbars.de.tr +++ b/mods/hudbars/locale/hudbars.de.tr @@ -2,3 +2,11 @@ Health=Leben Breath=Atem @1: @2/@3=@1: @2/@3 +Armor=Panzerung +@1: @2%=@1: @2% +Satiation=Sättigung +Set satiation of player or yourself=Sättigung von Spieler oder Ihnen selbst setzen +Not possible, damage is disabled.=Nicht möglich, Schaden ist deaktiviert. +Invalid satiation!=Ungültige Sättigung! +Player @1 does not exist.=Spieler @1 existiert nicht. +[] =[] diff --git a/mods/hudbars/locale/hudbars.es.tr b/mods/hudbars/locale/hudbars.es.tr index bbf0279..288d2e7 100644 --- a/mods/hudbars/locale/hudbars.es.tr +++ b/mods/hudbars/locale/hudbars.es.tr @@ -2,3 +2,10 @@ Health=Salud Breath=Aliento @1: @2/@3=@1: @2/@3 +Armor=Armado +@1: @2%=@1:@2% +Satiation=Saciado +Set satiation of player or yourself=Establece la saciedad en el jugador o en si mismo +Not possible, damage is disabled.=No es posible, daño esta desactivado. +Invalid satiation!=Satisfaccion invalida! +Player @1 does not exist.=El jugador @1 no existe. diff --git a/mods/hbhunger/locale/hbhunger.fr.tr b/mods/hudbars/locale/hudbars.fr.tr similarity index 100% rename from mods/hbhunger/locale/hbhunger.fr.tr rename to mods/hudbars/locale/hudbars.fr.tr diff --git a/mods/hudbars/locale/hudbars.it.tr b/mods/hudbars/locale/hudbars.it.tr index 3ada5b6..c974141 100644 --- a/mods/hudbars/locale/hudbars.it.tr +++ b/mods/hudbars/locale/hudbars.it.tr @@ -1,6 +1,7 @@ # textdomain: hudbars Health=Salute Breath=Ossigeno - -# Default format string for progress bar-style HUD bars, e.g. “Health 5/20” @1: @2/@3=@1: @2/@3 +Armor=Armatura +@1: @2%=@1:@2% +Satiation=Sazietà diff --git a/mods/hudbars/locale/hudbars.ms.tr b/mods/hudbars/locale/hudbars.ms.tr index eb811ab..a0f4b5a 100644 --- a/mods/hudbars/locale/hudbars.ms.tr +++ b/mods/hudbars/locale/hudbars.ms.tr @@ -2,3 +2,4 @@ Health=Kesihatan Breath=Nafas @1: @2/@3=@1: @2/@3 +Satiation=Kekenyangan diff --git a/mods/hudbars/locale/hudbars.pt.tr b/mods/hudbars/locale/hudbars.pt.tr index a818f09..e57a8b2 100644 --- a/mods/hudbars/locale/hudbars.pt.tr +++ b/mods/hudbars/locale/hudbars.pt.tr @@ -1,6 +1,7 @@ # textdomain: hudbars Health=Saude Breath=Folego - -# Formato de string padrão para progresso bar-style de barras do HUD, por exemplo “Saude 5/20” @1: @2/@3=@1: @2/@3 +Armor=Armado +@1: @2%=@1: @2% +Satiation=Saciedade diff --git a/mods/hudbars/locale/hudbars.ru.tr b/mods/hudbars/locale/hudbars.ru.tr index 2d278e3..cc39433 100644 --- a/mods/hudbars/locale/hudbars.ru.tr +++ b/mods/hudbars/locale/hudbars.ru.tr @@ -1,4 +1,7 @@ # textdomain: hudbars -Health=HP +Health=Здоровье Breath=дыхание @1: @2/@3=@1: @2/@3 +Armor=Доспехи +@1: @2%=@1: @2% +Satiation=голод diff --git a/mods/hudbars/locale/template.txt b/mods/hudbars/locale/template.txt index 37b0559..253d574 100644 --- a/mods/hudbars/locale/template.txt +++ b/mods/hudbars/locale/template.txt @@ -1,6 +1,10 @@ # textdomain: hudbars Health= Breath= +Armor= -# Default format string for progress bar-style HUD bars, e.g. “Health 5/20” +# Default format string for progress bar-style HUD bars, e.g. “Health 05/20” @1: @2/@3= + +# Format string for displaying the armor. E.g. "Armor: 100%" +@1: @2%= diff --git a/mods/hudbars/mod.conf b/mods/hudbars/mod.conf index d6a0571..e07285d 100644 --- a/mods/hudbars/mod.conf +++ b/mods/hudbars/mod.conf @@ -1,2 +1,3 @@ name = hudbars -description = HUD mod to display as bars and API for +description = HUD mod to display as bars and API for with satiaton/stamina features and armor status +optional_depends = 3d_armor, default, flowers, animalmaterials, bucket, bushes, bushes_classic, cooking, creatures, docfarming, dwarves, ethereal, farming, farming_plus, ferns, fishing, fruit, glooptest, jkanimals, jkfarming, jkwine, kpgmobs, mobfcooking, mobs, moretrees, mtfoods, mush45, mushroom, seaplants, pizza, nssm diff --git a/mods/hbhunger/register_foods.lua b/mods/hudbars/register_foods.lua similarity index 100% rename from mods/hbhunger/register_foods.lua rename to mods/hudbars/register_foods.lua diff --git a/mods/hudbars/screenshot.png b/mods/hudbars/screenshot.png index 88ee3238dbaac6e7d3769e212c0ccd4eed023b96..fcc1dd167aa4d58c134c02b55ffa000145624f4f 100644 GIT binary patch literal 22776 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 TgAVF{e>kZqXo9QcEI$7~BOnZ3 diff --git a/mods/hudbars/settingtypes.txt b/mods/hudbars/settingtypes.txt index 87f1006..4a491ad 100644 --- a/mods/hudbars/settingtypes.txt +++ b/mods/hudbars/settingtypes.txt @@ -124,4 +124,17 @@ hudbars_hp_player_maximun (maximun value of heal of player) int 40 # set a default value for max breath of player, if you customized and need on older engines hudbars_br_player_maximun (maximun value of braeth of player) int 20 +#If true, automatically hides the armor HUD bar when the player wears no +#armor. Otherwise, the armor bar shows “0%”. +hbarmor_autohide (Automatically hide armor HUD bar) bool false + +hbhunger_satiation_tick (Time in seconds after which 1 saturation point is taken) float 800 + +hbhunger_satiation_sprint_dig (exhaustion increased this value after digged node) float 3 + +hbhunger_satiation_sprint_place (exhaustion increased this value after placed) float 1 + +hbhunger_satiation_sprint_move (exhaustion increased this value if player movement detected) float 0.3 + +hbhunger_satiation_sprint_lvl (at what exhaustion player satiation gets lowerd) float 160 diff --git a/mods/hbhunger/sounds/hbhunger_eat_generic.ogg b/mods/hudbars/sounds/hbhunger_eat_generic.ogg similarity index 100% rename from mods/hbhunger/sounds/hbhunger_eat_generic.ogg rename to mods/hudbars/sounds/hbhunger_eat_generic.ogg diff --git a/mods/hbarmor/textures/hbarmor_bar.png b/mods/hudbars/textures/hbarmor_bar.png similarity index 100% rename from mods/hbarmor/textures/hbarmor_bar.png rename to mods/hudbars/textures/hbarmor_bar.png diff --git a/mods/hudbars/textures/hbarmor_icon.png b/mods/hudbars/textures/hbarmor_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..c6661388af2a39ed4a0b1b4a96f4135ab9169e79 GIT binary patch literal 2641 zcmV-X3a<5uP) zaB^>EX>4U6ba`-PAZ2)IW&i+q+O1e^b_A=c{qHF55ClbZIDW2mXYhu9H(K3Eclsoq zypvifE0l%6W+TSU|NHN9|G`gSVHZVnDk*vV#1acvJY;`<%D$72`+k1{@D$5*LoL02LGmOI_htC=!r^WaKfciE+ZT7P-?c_wYaZ`v zOo(W@GHM6=79pDmB{A&J5-!EB;92)oaAjY82jm0!*Kl^iZrOwqPfRT9VSMe ztQeU)hb_xNxo|gNLbQt(Ybara49q%D2S8)syDhZWEqlFA87mLMR3<2+4fa1=?z@-2 zx!hVtHX@(zv4UM}c?~lRIlE&P0HJl^COg2l>w@2Z${(aE5R@I}3BLQ(W1dz~dnE6aGvLR=f`C?U07)FX=;|3XGfG|#CS#-zl z1G%?wbCTb}jekPU8Fc>!at_da#q9-ZqwdWyY}|~67E>R~?d4<9Qp9CTCrM6HDj4dO=*qM&bsi-4x0wR=$xK^1f;ZJ0? zj<$897$Zg~1r_tKehVgTbL?2;vKQu7!zewDW%ntq2bqKjA|a9f1;u`{oJ>SJ5mS$) z&q#BkEkTtCQINoeW9_-cIx2fJk4x^C^X~UyeLa3s)Jj^!DMadbd zgPqA^3u0|P%qB=jilrhck=fO?nY#u2Ie5Q~ojbA1_?V8{4a7W8*raW211uC8y|WBV zCO`7@_yTUA7E9U+T@q}XW0kN1tw~t?S>h#kTL4MX(37mWdRYZc0MvX)+$HkdlOa<# zEsA(uI^*gcWE1Fpl6Xp}QXm0Rv!kZ3=CFm&6cB@a6Maa0Lp~hae>B|PEWgF1cC6m2 z^xlO!8UoVLb&_a%_6*aF565d~ZRhjr@amHf-(Py}esKK_&jkc-VE-K0hmlM(7L-4Z z+J?|u^*~mHeR&BAm%46+L5kT7Qmw8PY1pPN+l;Uk)cqYgr_ZVNVsycZ_NHHM)U<)B)pQ82zBiedy#oD}W}uPgp!-YHSXOYzJ^hX*QGX+B^3SwC^D6-tmifcBk5r z!yV*ekjskHXNiNz?36&#Eun{4`l1ZZ2&hy3B59WTIDc&_e`sG<+KN}L$DY%K%JIy3>CdyY$+5(tpbbW>dxBH z@dpQs7b37w6;IqA-wBw926j%ghI3k1k8L1Wq4v#%YelstZlm|JbFW7CeiXhBg8PU9 zwl1XY40cC{0+QKQRHIV-H?($#r<3F-5ycbLkFdpY8+(VdO1XD9D~3(5!-3H6)BtxAUNs>9 z)lK&ykg2~1Wh$GIv&kT5! z2fAMLlmn$ORGedQF2P~j*W6I0eZo-;hg_!i&*kH-(f#HF zK&QEAk7#ylNHx$vh3aDeA#*WOFR0Ks#`QuYXHYy2oZlwe`vFvTx31`Q(aETu&eq>L zTRNRBG61^>1vE0KTZ*&fE@aD}vxx|L90ZN#VAgPKL!+I^j#7kAB95qF6gp;wqKva5 z0&Jj7f3QGRgf5wOM{c1fA&a7&#KuH*<)akG*8Ha!y%+3lQD`@d!nUZHMOLe6hbbdc z=Fd)Ic*HxqvYjH_K8*EQwLgU6N21Pgs=X!}>9GF~erRrT@*yE7|GD`8(wM&m`-L%o zsM*Juot?1q~8j=(jN5Qq=;KyRs!Nplu2UkH5`~Y!vaZ+@V691PJ zTEuv8+>dwn9(V5mp;2L))in-ix^1SD2{D^n6+^EGVGshM7?YW0%t=xTzT@j20lwbF zd6xgVKS!UMw-^u*iD#K%+Qb{g)0?)zd7n7KO0r6PPCRPT1&JTIu6X>$x#+UMGb3gu zJx?4V7K_14w3Vu2MI^!67hGr0jK{clUJm_V1Zie?NEqa;b9O-|hea01Qw} zR7C&)07r04!OhL+@bKXWlH33Q00DGTPE!Ct=GbNc0004EOGiWihy@);00009a7bBm z000XU000XU0RWnu7ytkO2XskIMF-~x7y=ssJ*^Fx0000iNklfos(Q28LA(5DWnTWNHkmDredD00000NkvXXu0mjf@}|`n literal 0 HcmV?d00001 diff --git a/mods/hbhunger/textures/hbhunger_bar.png b/mods/hudbars/textures/hbhunger_bar.png similarity index 100% rename from mods/hbhunger/textures/hbhunger_bar.png rename to mods/hudbars/textures/hbhunger_bar.png diff --git a/mods/hbhunger/textures/hbhunger_bar_health_poison.png b/mods/hudbars/textures/hbhunger_bar_health_poison.png similarity index 100% rename from mods/hbhunger/textures/hbhunger_bar_health_poison.png rename to mods/hudbars/textures/hbhunger_bar_health_poison.png diff --git a/mods/hbhunger/textures/hbhunger_icon.png b/mods/hudbars/textures/hbhunger_icon.png similarity index 100% rename from mods/hbhunger/textures/hbhunger_icon.png rename to mods/hudbars/textures/hbhunger_icon.png diff --git a/mods/hbhunger/textures/hbhunger_icon_health_poison.png b/mods/hudbars/textures/hbhunger_icon_health_poison.png similarity index 100% rename from mods/hbhunger/textures/hbhunger_icon_health_poison.png rename to mods/hudbars/textures/hbhunger_icon_health_poison.png