From eab0205c2f8f2d8a545ebc0fddcacd36c92d1772 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Tue, 23 May 2017 01:51:37 +0200 Subject: [PATCH] Disable eat delay for cake --- GROUPS.md | 1 + mods/ITEMS/mcl_cake/init.lua | 4 ++-- mods/PLAYER/mcl_hunger/hunger.lua | 11 +++++++---- 3 files changed, 10 insertions(+), 6 deletions(-) diff --git a/GROUPS.md b/GROUPS.md index 6926fb3f..07995e8a 100644 --- a/GROUPS.md +++ b/GROUPS.md @@ -45,6 +45,7 @@ Please read to learn how digging times * `soil_nether_wart=1`: Nether wart will grow on this * `disable_suffocation=1`: Disables suffocation for full solid cubes (1) * `destroys_items=1`: If an item happens to be *inside* this node, the item will be destroyed +* `no_eat_delay=1`: Only for foodstuffs. When eating this, all eating delays are ignored. #### Footnotes diff --git a/mods/ITEMS/mcl_cake/init.lua b/mods/ITEMS/mcl_cake/init.lua index fc0ac015..d5149fc2 100644 --- a/mods/ITEMS/mcl_cake/init.lua +++ b/mods/ITEMS/mcl_cake/init.lua @@ -46,7 +46,7 @@ minetest.register_node("mcl_cake:cake", { fixed = full_cake }, stack_max = 1, - groups = {handy=1, cake=7, food=2,attached_node=1, dig_by_piston=1}, + groups = {handy=1, cake=7, food=2,no_eat_delay=1, attached_node=1, dig_by_piston=1}, drop = '', on_rightclick = function(pos, node, clicker, itemstack) minetest.do_item_eat(2, ItemStack("mcl_cake:cake_6"), ItemStack("mcl_cake:cake"), clicker, {type="nothing"}) @@ -92,7 +92,7 @@ local register_slice = function(level, nodebox, desc) type = "fixed", fixed = nodebox, }, - groups = {handy=1, cake=level, food=2,attached_node=1,not_in_creative_inventory=1,dig_by_piston=1}, + groups = {handy=1, cake=level, food=2,no_eat_delay=1,attached_node=1,not_in_creative_inventory=1,dig_by_piston=1}, drop = '', on_rightclick = on_rightclick, sounds = mcl_sounds.node_sound_leaves_defaults(), diff --git a/mods/PLAYER/mcl_hunger/hunger.lua b/mods/PLAYER/mcl_hunger/hunger.lua index 0e76b0d8..911c9545 100644 --- a/mods/PLAYER/mcl_hunger/hunger.lua +++ b/mods/PLAYER/mcl_hunger/hunger.lua @@ -15,12 +15,15 @@ core.do_item_eat = function(hp_change, replace_with_item, itemstack, user, point local name = user:get_player_name() - -- Allow eating only after a delay of 2 seconds. - -- This prevents eating as an excessive speed. - -- Yes, os.time() is not a precise timer but it is good enough for our purposes. + -- Special foodstuffs like the cake may disable the eating delay + local no_eat_delay = minetest.get_item_group(itemstack:get_name(), "no_eat_delay") == 1 + + -- Allow eating only after a delay of 2 seconds. This prevents eating as an excessive speed. + -- FIXME: time() is not a precise timer, so the actual delay may be +- 1 second, depending on which fraction + -- of the second the player made the first eat. -- FIXME: In singleplayer, there's a cheat to circumvent this, simply by pausing the game between eats. -- This is because os.time() obviously does not care about the pause. A fix needs a different timer mechanism. - if (mcl_hunger.last_eat[name] < 0) or (os.difftime(os.time(), mcl_hunger.last_eat[name]) >= 2) then + if no_eat_delay or (mcl_hunger.last_eat[name] < 0) or (os.difftime(os.time(), mcl_hunger.last_eat[name]) >= 2) then itemstack = mcl_hunger.eat(hp_change, replace_with_item, itemstack, user, pointed_thing) for _, callback in pairs(core.registered_on_item_eats) do local result = callback(hp_change, replace_with_item, itemstack, user, pointed_thing, old_itemstack)