From 8a8ec483d4fbb5f96b670fae62fcef7e08e96cc2 Mon Sep 17 00:00:00 2001 From: MoNTE48 Date: Sun, 23 Feb 2020 18:51:35 +0100 Subject: [PATCH] Update Hunger --- builtin/game/hunger.lua | 76 ++++++++++++++++++++++++----------------- 1 file changed, 44 insertions(+), 32 deletions(-) diff --git a/builtin/game/hunger.lua b/builtin/game/hunger.lua index 18773bed..1419dc4d 100644 --- a/builtin/game/hunger.lua +++ b/builtin/game/hunger.lua @@ -2,7 +2,7 @@ --Copyright (C) BlockMen (2013-2015) --Copyright (C) Auke Kok (2016) --Copyright (C) Minetest Mods Team (2016-2019) ---Copyright (C) MultiCraft Development Team (2016-2019) +--Copyright (C) MultiCraft Development Team (2016-2020) --This program is free software; you can redistribute it and/or modify --it under the terms of the GNU Lesser General Public License as published by @@ -52,19 +52,19 @@ hunger.settings = { } local settings = hunger.settings +local min, max = math.min, math.max +local vlength = vector.length + local attribute = { saturation = "hunger:level", poisoned = "hunger:poisoned", - exhaustion = "hunger:exhaustion", + exhaustion = "hunger:exhaustion" } local function is_player(player) return ( - player and - not player.is_fake_player and - player.get_attribute and -- check for pipeworks fake player - player.is_player and - player:is_player()) + minetest.is_player(player) and + not player.is_fake_player) end local function get_int_attribute(player, key) @@ -83,12 +83,13 @@ end function hunger.set_saturation(player, level) player:set_attribute(attribute.saturation, level) - hud.change_item(player, "hunger", {number = math.min(settings.visual_max, level)}) + hud.change_item(player, "hunger", {number = min(settings.visual_max, level)}) end hunger.registered_on_update_saturations = {} function hunger.register_on_update_saturation(fun) - table.insert(hunger.registered_on_update_saturations, fun) + local saturations = hunger.registered_on_update_saturations + saturations[#saturations+1] = fun end function hunger.update_saturation(player, level) @@ -118,8 +119,8 @@ function hunger.change_saturation(player, change) return false end local level = hunger.get_saturation(player) + change or 0 - level = math.max(level, 0) - level = math.min(level, settings.level_max) + level = max(level, 0) + level = min(level, settings.level_max) hunger.update_saturation(player, level) return true end @@ -158,7 +159,8 @@ end hunger.registered_on_poisons = {} function hunger.register_on_poison(fun) - table.insert(hunger.registered_on_poisons, fun) + local poison = hunger.registered_on_poisons + poison[#poison+1] = fun end function hunger.poison(player, ticks, interval) @@ -184,7 +186,7 @@ hunger.exhaustion_reasons = { jump = "jump", move = "move", place = "place", - punch = "punch", + punch = "punch" } function hunger.get_exhaustion(player) @@ -197,7 +199,8 @@ end hunger.registered_on_exhaust_players = {} function hunger.register_on_exhaust_player(fun) - table.insert(hunger.registered_on_exhaust_players, fun) + local exhaust = hunger.registered_on_exhaust_players + exhaust[#exhaust+1] = fun end function hunger.exhaust_player(player, change, cause) @@ -213,7 +216,6 @@ function hunger.exhaust_player(player, change, cause) end local exhaustion = hunger.get_exhaustion(player) or 0 - exhaustion = exhaustion + change if exhaustion >= settings.exhaust_lvl then @@ -226,13 +228,15 @@ end --- END EXHAUSTION API --- -- Time based hunger functions +local connected_players = core.get_connected_players + local function move_tick() - for _, player in pairs(core.get_connected_players()) do + for _, player in pairs(connected_players()) do local controls = player:get_player_control() local is_moving = controls.up or controls.down or controls.left or controls.right local velocity = player:get_player_velocity() velocity.y = 0 - local horizontal_speed = vector.length(velocity) + local horizontal_speed = vlength(velocity) local has_velocity = horizontal_speed > 0.05 if controls.jump then @@ -245,8 +249,8 @@ local function move_tick() end local function hunger_tick() - -- lower saturation by 1 point after settings.tick second(s) - for _, player in pairs(core.get_connected_players()) do + -- lower saturation by 1 point after settings.tick seconds + for _, player in pairs(connected_players()) do local saturation = hunger.get_saturation(player) or 0 if saturation > settings.tick_min then hunger.update_saturation(player, saturation - 1) @@ -256,7 +260,7 @@ end local function health_tick() -- heal or damage player, depending on saturation - for _, player in pairs(core.get_connected_players()) do + for _, player in pairs(connected_players()) do local air = player:get_breath() or 0 local hp = player:get_hp() or 0 local saturation = hunger.get_saturation(player) or 0 @@ -348,6 +352,8 @@ function core.do_item_eat(hp_change, replace_with_item, poison, itemstack, playe return itemstack end +local visual_max, level_max = settings.visual_max, settings.level_max + hud.register("hunger", { hud_elem_type = "statbar", position = {x = 0.5, y = 1}, @@ -356,32 +362,38 @@ hud.register("hunger", { size = {x = 24, y = 24}, text = "hunger_statbar_fg.png", background = "hunger_statbar_bg.png", - number = 20 + number = visual_max }) core.register_on_joinplayer(function(player) - core.after(0.5, function() - local level = hunger.get_saturation(player) or settings.level_max - hunger.set_saturation(player, level) - -- reset poisoned - player:set_attribute(attribute.poisoned, "no") - end) + local level = hunger.get_saturation(player) or level_max + + -- reset poisoned + player:set_attribute(attribute.poisoned, "no") + player:set_attribute(attribute.saturation, level) + + if level and (level < visual_max) then + core.after(1, function() + hud.change_item(player, "hunger", {number = min(visual_max, level)}) + end) + end end) core.register_globalstep(hunger_globaltimer) +local exhaust = hunger.exhaust_player core.register_on_placenode(function(_, _, player) - hunger.exhaust_player(player, settings.exhaust_place, hunger.exhaustion_reasons.place) + exhaust(player, settings.exhaust_place, hunger.exhaustion_reasons.place) end) core.register_on_dignode(function(_, _, player) - hunger.exhaust_player(player, settings.exhaust_dig, hunger.exhaustion_reasons.dig) + exhaust(player, settings.exhaust_dig, hunger.exhaustion_reasons.dig) end) core.register_on_craft(function(_, player) - hunger.exhaust_player(player, settings.exhaust_craft, hunger.exhaustion_reasons.craft) + exhaust(player, settings.exhaust_craft, hunger.exhaustion_reasons.craft) end) core.register_on_punchplayer(function(_, hitter) - hunger.exhaust_player(hitter, settings.exhaust_punch, hunger.exhaustion_reasons.punch) + exhaust(hitter, settings.exhaust_punch, hunger.exhaustion_reasons.punch) end) core.register_on_respawnplayer(function(player) - hunger.update_saturation(player, settings.level_max) + exhaust(player, settings.level_max) end)