From e3db263828cb96f06d848e6dc80d90f21c7f92a0 Mon Sep 17 00:00:00 2001 From: mckaygerhard Date: Mon, 24 Jul 2023 14:46:59 -0400 Subject: [PATCH] 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 * detection of original mods and bypass build-in own features * optimize loading of hubar for armor, bad initialization * real check player becouse of wrong implementation at engine --- API.md | 7 +- README.md | 130 ++++++++++++-- default_settings.lua | 37 +++- depends.txt | 32 +++- description.txt | 2 +- init.lua | 299 ++++++++++++++++++++++++++++--- locale/hudbars.de.tr | 8 + locale/hudbars.es.tr | 7 + locale/hudbars.it.tr | 5 +- locale/hudbars.ms.tr | 1 + locale/hudbars.pt.tr | 5 +- locale/hudbars.ru.tr | 5 +- locale/template.txt | 6 +- mod.conf | 3 +- screenshot.png | Bin 9556 -> 22776 bytes settingtypes.txt | 19 +- textures/hudbars_icon_breath.png | Bin 207 -> 153 bytes textures/hudbars_icon_health.png | Bin 172 -> 143 bytes 18 files changed, 494 insertions(+), 72 deletions(-) diff --git a/API.md b/API.md index f70d2e6..843e410 100644 --- a/API.md +++ b/API.md @@ -8,8 +8,6 @@ This API allows you to add, change, hide and unhide custom HUD bars for this mod To give you a *very* brief overview over this API, here is the basic workflow on how to add your own custom HUD bar: * Create images for your HUD bar -* Optionally, set `hb.hp_max` to customize maximun healt of player, implementing lua minetest api -* Optional, set `hb.breath_max` to customize maximun players breath, implementing lua minetest api * Call `hb.register_hudbar` to make the definition of the HUD bar known to this mod * Call `hb.init_hudbar` for each player for which you want to use previously defined HUD bar * Use `hb.change_hudbar` whenever you need to change the values of a HUD bar of a certain player @@ -94,11 +92,8 @@ explicitly initialized on a per-player basis. You probably want to do this in the `minetest.register_on_joinplayer`. -Take into consideration there's a rare bug on minetest engine that into this callback, -sometimes that call its lazy and do not executed well. In such case just recall again only one time. - ### `hb.init_hudbar(player, identifier, start_value, start_max, start_hidden)` -This function initializes and activates a previously registered HUD bar and assigns it to a +This function initialzes and activates a previously registered HUD bar and assigns it to a certain client/player. This has only to be done once per player and after that, you can change the values using `hb.change_hudbar`. diff --git a/README.md b/README.md index 09f00c3..98b4ad9 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # minetest HUD bars -HUD mod to display as bars and API for +HUD mod to display as bars and API for healt, armor, breath, hunger ## Information -------------- @@ -13,37 +13,125 @@ this mod will place them accordingly. ![](screenshot.png) +### Features + +* This mod adds a mechanic for hunger, using "satiation" concept +* This mod adds information bar for armor status +* Eating an apple (from Minetest Game) increases your satiation by 2 + +> 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, older engines just need intlib but its optional - #### Current version -The current version is 2.3.4.1 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. -This fork feaured real honoring to max healt and max breath and customization of, also: +It works for Minetest 0.4.16+/5.X+ or later. -It works for Minetest 0.4.17+ (maybe 0.4.16 too) or later, including lastest crap from 5.7+. - -#### 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_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 | -| hudbars_bar_type | HUD bars style | enum | progress_bar progress_bar,statbar_classic,statbar_modern | +| 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 | @@ -58,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 @@ -69,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: @@ -91,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/default_settings.lua b/default_settings.lua index dd6d4d3..75ec2e6 100644 --- a/default_settings.lua +++ b/default_settings.lua @@ -25,14 +25,14 @@ else hb.settings.start_offset_right.y = hb.load_setting("hudbars_start_statbar_offset_right_y", "number", -90) end hb.settings.vmargin = hb.load_setting("hudbars_vmargin", "number", 24) -hb.settings.tick = hb.load_setting("hudbars_tick", "number", 0.1) +hb.settings.tick = hb.load_setting("hudbars_tick", "number", 0.3) -- Experimental setting: Changing this setting is not officially supported, do NOT rely on it! hb.settings.forceload_default_hudbars = hb.load_setting("hudbars_forceload_default_hudbars", "bool", true) -- 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", true) +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 @@ -47,10 +47,33 @@ else hb.settings.sorting_reverse = { [0] = "health", [1] = "breath" } end -hb.settings.hp_player_maximun = hb.load_setting("hudbars_hp_player_maximun", "number", 20) -hb.settings.br_player_maximun = hb.load_setting("hudbars_br_player_maximun", "number", 10) +hb.settings.hp_player_maximun = hb.load_setting("hudbars_hp_player_maximun", "number", 40) +hb.settings.br_player_maximun = hb.load_setting("hudbars_br_player_maximun", "number", 20) --- expose direct api -hb.hp_max = hb.settings.hp_player_maximun -hb.breath_max = hb.settings.br_player_maximun +if minetest.has_feature("object_use_texture_alpha") then +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/depends.txt b/depends.txt index d9b8b81..afc33be 100644 --- a/depends.txt +++ b/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/description.txt b/description.txt index 726453c..3b178c7 100644 --- a/description.txt +++ b/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/init.lua b/init.lua index 5fff6b9..1e3eb83 100644 --- a/init.lua +++ b/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,8 +40,34 @@ 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 = {} +hb.hba = minetest.get_modpath("hbarmor") +hb.hbh = minetest.get_modpath("hbhunger") + function hb.load_setting(sname, stype, defaultval, valid_values) local sval if stype == "string" then @@ -70,13 +102,56 @@ end -- Load default settings dofile(minetest.get_modpath("hudbars").."/default_settings.lua") +if not hb.hbh then + + -- 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") + +end + local function player_exists(player) - return player ~= nil and player:is_player() + return player ~= nil and (type(player) == "userdata") +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.19") and not string.find(statusinfo,"0.4.18") and not string.find(statusinfo,"0.4.17.4") 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 +191,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 @@ -234,7 +306,7 @@ function hb.register_hudbar(identifier, text_color, label, textures, default_sta hud_elem_type = "image", position = pos, scale = bgscale, - text = "hudbars_bar_background.png", + text = "", alignment = {x=1,y=1}, offset = { x = offset.x - 1, y = offset.y - 1 }, z_index = 0, @@ -312,7 +384,8 @@ function hb.register_hudbar(identifier, text_color, label, textures, default_sta state.text = text state.barlength = hb.value_to_barlength(start_value, start_max) - local main_error_text = "[hudbars] Bad initial values of HUD bar identifier “"..tostring(identifier).."” for player "..name..". " + local main_error_text = + "[hudbars] Bad initial values of HUD bar identifier “"..tostring(identifier).."” for player "..name..". " if start_max < start_value then minetest.log("error", main_error_text.."start_max ("..start_max..") is smaller than start_value ("..start_value..")!") @@ -455,6 +528,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 @@ -474,7 +549,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 @@ -517,10 +593,20 @@ 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 - hb.register_hudbar("health", 0xFFFFFF, S("Health"), { bar = "hudbars_bar_health.png", icon = "hudbars_icon_health.png", bgicon = "hudbars_bgicon_health.png" }, hb.settings.hp_player_maximun, hb.settings.hp_player_maximun, false) - hb.register_hudbar("breath", 0xFFFFFF, S("Breath"), { bar = "hudbars_bar_breath.png", icon = "hudbars_icon_breath.png", bgicon = "hudbars_bgicon_breath.png" }, hb.settings.br_player_maximun, hb.settings.br_player_maximun, true) + local hicon = "hudbars_icon_health.png" + local bicon = "hudbars_icon_breath.png" + local aicon = "hbarmor_icon.png" + local sicon = "hbhunger_icon.png" + 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) + if not hb.hba then + 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" } } ) + end + if not hb.hbh then + 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 = "%02.0f", format_max_value = "%02.0f" }) + end end local function hide_builtin(player) @@ -530,27 +616,66 @@ local function hide_builtin(player) player:hud_set_flags(flags) end +if not hb.hba then + + 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 + +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 - if minetest.settings:get_bool("enable_damage") then - hide = false - else - hide = true - end + 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) + local hide_hp = not minetest.settings:get_bool("enable_damage") or true + 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, hide_hp) + 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 from others mod - 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) + + if not hb.hba then + local arm = tonumber(hbarmor.armor[name]) + if not arm then arm = 0 end + local hide_ar = hbarmor.autohide and must_hide(name, arm) + hbarmor.get_armor(player) + arm = tonumber(hbarmor.armor[name]) + hb.init_hudbar(player, "armor", arm_printable(arm), 100, hide_ar) + end + + if not hb.hbh then + hb.init_hudbar(player, "satiation", hbhunger.get_hunger_raw(player), nil, (not hb.settings.forceload_default_hudbars) ) + end end end @@ -562,16 +687,18 @@ end -- update built-in HUD bars local function update_hud(player) - if not player_exists(player) then return end + + local name = player:get_player_name() -- player checks are already made before call this function + if not name then return 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 @@ -580,10 +707,38 @@ local function update_hud(player) end --health update_health(player) + -- armor + if not hb.hba then + local larmor = hbarmor.armor[name] + local arm = tonumber(larmor) + if not arm then arm = 0; hbarmor.armor[name] = 0 end + 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 + end + -- hunger + if not hb.hbh then + 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 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 @@ -594,36 +749,122 @@ minetest.register_on_player_hpchange(function(player) end) minetest.register_on_respawnplayer(function(player) - if player_exists(player) then + if not player_exists(player) then return end + + local name = player:get_player_name() update_health(player) + if not hb.hbh then + hbhunger.hunger[name] = hbhunger.SAT_INIT + hbhunger.set_hunger_raw(player) + hbhunger.exhaustion[name] = 0 end hb.hide_hudbar(player, "breath") end) minetest.register_on_joinplayer(function(player) + if not player_exists(player) then return end + + local name = player:get_player_name() + local inv = player:get_inventory() + if not hb.hbh then + 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 + end hide_builtin(player) custom_hud(player) - hb.players[player:get_player_name()] = player + hb.players[name] = player + if not hb.hba then + hbarmor.player_active[name] = true + end + if not hb.hbh then + hbhunger.set_hunger_raw(player) + end end) minetest.register_on_leaveplayer(function(player) - hb.players[player:get_player_name()] = nil + if not player_exists(player) then return end + + local name = player:get_player_name() + hb.players[name] = nil + if not hb.hba then + hbarmor.player_active[name] = false + end end) +local modresult = "" + +if hb.hba then modresult = modresult .. " without build-in hbarmor" end +if hb.hbh then modresult = modresult .. " without build-in hbhunger" end + +minetest.log("[MOD] hudbars"..modresult.." loaded" ) + + 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 + if not hb.hba then + -- update all hud elements + for _,player in ipairs(minetest.get_connected_players()) do + if player_exists(player) then + local name = player:get_player_name() + if hbarmor.player_active[name] == true then + hbarmor.get_armor(player) + update_hud(player) + end + end + end + end + end + end + if not hb.hbh then + -- 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 + if player_exists(player) then + 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 end end if timer > 4 then timer = 0 end + if timer2 > hbhunger.HUNGER_TICK then timer2 = 0 end end) + + diff --git a/locale/hudbars.de.tr b/locale/hudbars.de.tr index 3d1e697..2c4c0c1 100644 --- a/locale/hudbars.de.tr +++ b/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/locale/hudbars.es.tr b/locale/hudbars.es.tr index bbf0279..288d2e7 100644 --- a/locale/hudbars.es.tr +++ b/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/locale/hudbars.it.tr b/locale/hudbars.it.tr index 3ada5b6..c974141 100644 --- a/locale/hudbars.it.tr +++ b/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/locale/hudbars.ms.tr b/locale/hudbars.ms.tr index eb811ab..a0f4b5a 100644 --- a/locale/hudbars.ms.tr +++ b/locale/hudbars.ms.tr @@ -2,3 +2,4 @@ Health=Kesihatan Breath=Nafas @1: @2/@3=@1: @2/@3 +Satiation=Kekenyangan diff --git a/locale/hudbars.pt.tr b/locale/hudbars.pt.tr index a818f09..e57a8b2 100644 --- a/locale/hudbars.pt.tr +++ b/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/locale/hudbars.ru.tr b/locale/hudbars.ru.tr index 2d278e3..cc39433 100644 --- a/locale/hudbars.ru.tr +++ b/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/locale/template.txt b/locale/template.txt index 37b0559..253d574 100644 --- a/locale/template.txt +++ b/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/mod.conf b/mod.conf index d6a0571..e07285d 100644 --- a/mod.conf +++ b/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/screenshot.png b/screenshot.png index 88ee3238dbaac6e7d3769e212c0ccd4eed023b96..fcc1dd167aa4d58c134c02b55ffa000145624f4f 100644 GIT binary patch literal 22776 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 TgAVF{e>kZqXo9QcEI$7~BOnZ3 diff --git a/settingtypes.txt b/settingtypes.txt index 6ce1385..4a491ad 100644 --- a/settingtypes.txt +++ b/settingtypes.txt @@ -19,7 +19,7 @@ hudbars_bar_type (HUD bars style) enum progress_bar progress_bar,statbar_classic # If enabled (default), the breath indicators in the HUD will be automatically hidden shortly # after the breath has been filled up. Otherwise, the breath will always be displayed. -hudbars_autohide_breath (Automatically hide breath indicators) bool true +hudbars_autohide_breath (Automatically hide breath indicators) bool false # This setting changes the way the HUD bars are ordered on the display. You can choose # between a zig-zag pattern (default) or a vertically stacked pattern. @@ -120,8 +120,21 @@ hudbars_tick (Default HUD bars update interval) float 0.3 0.0 4.0 [player values defaults] # set a default value for max hp healt of player, if you customized and need on older engines -hudbars_hp_player_maximun (maximun value of heal of player) int 20 +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 10 +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/textures/hudbars_icon_breath.png b/textures/hudbars_icon_breath.png index 8f49fbd52c39b7135634fa7723478db0e00a3b58..810cac9682f6906abdcde8a08dddf031f1597ded 100644 GIT binary patch delta 137 zcmX@lIFoULL_HHT0|SG$^p+AJ#S`EY;=1!jhf)`Pd79;w&XWe!*Y< zwz9Yht^Wt)TX?!ShHzX@{_+36{o(lbzdZ8cSBztNXPqrD&Ne!HGIX+}-`ZK{3Nk`1 p4lka1k*8kbwdB9%2mk*wBv?s2-Wb1N9ncI0Pgg&ebxuqPO#s#+Ic@*| delta 191 zcmV;w06_nl0nY)D7=Hu<0001_TS3$S001XYOjJeB=k=eX|3`34v()OhzWcby&D7xe zb&RZanaT0>`1}3-oyX{)vA|ixPbvTa019+cPE-4U0R569yHmYzi`XuA0000@NklM65CpVq4X6MB002ovPDHLkV1i?wPJI9X diff --git a/textures/hudbars_icon_health.png b/textures/hudbars_icon_health.png index f1c980f98c375640ffce0fbb77d787191b2651dc..d5302ec6fec6627d9de96544022d6fef7b64eb8b 100644 GIT binary patch delta 126 zcmZ3(*v~jYqMV7Dfq_9=dP@nA;tB8xadj{7dB)Dt#K`#D$K(6E<%fadj3q&S!3+-1 zZlnP@hMq2tAsp9}6BwA5En{OlcZP-S>S{rrSM`lQvRRtdCY%-B)zFxk#mszIYk?B) c1TQuQoZB@y5g;_6=DlfuBTnStRK2kR6jrr&m!w*@$VXQUMb z*=z@@VJr#q3ubV5b|VeQaq@I=4B@z*oY24|#xBOL@N~|j6s9K>@p3Mn~jI6_XY;CaNbvn%0m50k-U2~mcbQXCdSM{GHO#xZ!h`njxg HN@xNAkoPgI