Rename hbhunger to mcl_hunger

This commit is contained in:
Wuzzy 2017-02-16 14:19:34 +01:00
parent 1e759365ca
commit c000f8c2a4
19 changed files with 515 additions and 560 deletions

View file

@ -0,0 +1,52 @@
# Hunger for MineClone 2 [`mcl_hunger`]
* Forked from `hbhunger`, version: 0.5.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.”.
## 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 20
* 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!)
## 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.
### Examples
* Eating an apple (from Minetest Game) increases your satiation by 2;
* eating a bread (from Minetest Game) increases your satiation by 4.
## 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 `hbhunger` for MineClone 2. `hbhunger` in turn was forked from the “Better HUD
(and hunger)” mod by BlockMen (2013-2015), most code comes from this mod.
### Textures
* `hbhunger_icon.png`—PilzAdam ([WTFPL](http://www.wtfpl.net/txt/copying/)), modified by BlockMen
* `hbhunger_bgicon.png`—PilzAdam (WTFPL), modified by BlockMen
* `hbhunger_bar.png—Wuzzy` (WTFPL)
* `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: WTFPL, by BlockMen and Wuzzy

View file

@ -0,0 +1,51 @@
0.1.0
-----
Initial release
0.2.0
-----
- Change “saturation” to “satiation”
- Rename global table to “hbhunger” to avoid collisions
- General cleanup
0.3.0
-----
- Play simple eating sound when something is eaten
0.3.1
-----
- Add Ethereal orange
- Fix exhaus variable
0.3.2
-----
- Fix another crash
0.4.0
-----
- Generic eating functionality, items using the minetest.item_eat are automatically supported
- Change health bar and icon when poisoned
- Special support for red and brown mushroom from Minetest Game [flowers]
- Special support for [pizza]
- Special support for beans from Farming Redo [farming]
- Fix crash when poisoned player leaves server
- Changed license to LGPL v2.1
0.4.1
-----
- Add foods from Not So Simple Mobs [nssm]
0.5.0
-----
- Fix custom sound not working
- Add Portuguese translation
0.5.1
-----
- Fix incompability problem with pipeworks mod
0.5.2
-----
- Fix mod not working with both intllib and mod security enabled
- Add missing screenshot
- Rewrite README and use Markdown format

View file

@ -0,0 +1,32 @@
hudbars
intllib?
mcl_core?
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?

View file

@ -0,0 +1 @@
Adds a simple hunger meachanic with satiation, food poisoning and different healing.

View file

@ -0,0 +1,470 @@
-- Keep these for backwards compatibility
function mcl_hunger.save_hunger(player)
mcl_hunger.set_hunger_raw(player)
end
function mcl_hunger.load_hunger(player)
mcl_hunger.get_hunger_raw(player)
end
-- wrapper for minetest.item_eat (this way we make sure other mods can't break this one)
local org_eat = core.do_item_eat
core.do_item_eat = function(hp_change, replace_with_item, itemstack, user, pointed_thing)
local old_itemstack = itemstack
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)
if result then
return result
end
end
return itemstack
end
-- food functions
local food = mcl_hunger.food
function mcl_hunger.register_food(name, hunger_change, replace_with_item, poisen, heal, sound)
food[name] = {}
food[name].saturation = hunger_change -- hunger points added
food[name].replace = replace_with_item -- what item is given back after eating
food[name].poisen = poisen -- time its poisening
food[name].healing = heal -- amount of HP
food[name].sound = sound -- special sound that is played when eating
end
function mcl_hunger.eat(hp_change, replace_with_item, itemstack, user, pointed_thing)
local item = itemstack:get_name()
local def = food[item]
if not def then
def = {}
if type(hp_change) ~= "number" then
hp_change = 1
core.log("error", "Wrong on_use() definition for item '" .. item .. "'")
end
def.saturation = hp_change
def.replace = replace_with_item
end
local func = mcl_hunger.item_eat(def.saturation, def.replace, def.poisen, def.healing, def.sound)
return func(itemstack, user, pointed_thing)
end
-- Poison player
local function poisenp(tick, time, time_left, player)
-- First check if player is still there
if not player:is_player() then
return
end
time_left = time_left + tick
if time_left < time then
minetest.after(tick, poisenp, tick, time, time_left, player)
else
mcl_hunger.poisonings[player:get_player_name()] = mcl_hunger.poisonings[player:get_player_name()] - 1
if mcl_hunger.poisonings[player:get_player_name()] <= 0 then
-- Reset HUD bar color
hb.change_hudbar(player, "health", nil, nil, "hudbars_icon_health.png", nil, "hudbars_bar_health.png")
end
end
if player:get_hp()-1 > 0 then
player:set_hp(player:get_hp()-1)
end
end
function mcl_hunger.item_eat(hunger_change, replace_with_item, poisen, heal, sound)
return function(itemstack, user, pointed_thing)
if itemstack:take_item() ~= nil and user ~= nil then
local name = user:get_player_name()
local h = tonumber(mcl_hunger.hunger[name])
local hp = user:get_hp()
minetest.sound_play({name = sound or "mcl_hunger_eat_generic", gain = 1}, {pos=user:getpos(), max_hear_distance = 16})
-- Saturation
if h < 20 and hunger_change then
h = h + hunger_change
if h > 20 then h = 20 end
mcl_hunger.hunger[name] = h
mcl_hunger.set_hunger_raw(user)
end
-- Healing
if hp < 20 and heal then
hp = hp + heal
if hp > 20 then hp = 20 end
user:set_hp(hp)
end
-- Poison
if poisen then
-- Set poison bar
hb.change_hudbar(user, "health", nil, nil, "hbhunger_icon_health_poison.png", nil, "hbhunger_bar_health_poison.png")
mcl_hunger.poisonings[name] = mcl_hunger.poisonings[name] + 1
poisenp(1, poisen, 0, user)
end
--sound:eat
itemstack:add_item(replace_with_item)
end
return itemstack
end
end
if minetest.get_modpath("default") ~= nil then
mcl_hunger.register_food("default:apple", 2)
end
if minetest.get_modpath("flowers") ~= nil then
mcl_hunger.register_food("flowers:mushroom_brown", 1)
mcl_hunger.register_food("flowers:mushroom_red", 1, "", 3)
end
if minetest.get_modpath("farming") ~= nil then
mcl_hunger.register_food("farming:bread", 4)
end
if minetest.get_modpath("mobs") ~= nil then
if mobs.mod ~= nil and mobs.mod == "redo" then
mcl_hunger.register_food("mobs:cheese", 4)
mcl_hunger.register_food("mobs:meat", 8)
mcl_hunger.register_food("mobs:meat_raw", 4)
mcl_hunger.register_food("mobs:rat_cooked", 4)
mcl_hunger.register_food("mobs:honey", 2)
mcl_hunger.register_food("mobs:pork_raw", 3, "", 3)
mcl_hunger.register_food("mobs:pork_cooked", 8)
mcl_hunger.register_food("mobs:chicken_cooked", 6)
mcl_hunger.register_food("mobs:chicken_raw", 2, "", 3)
mcl_hunger.register_food("mobs:chicken_egg_fried", 2)
if minetest.get_modpath("bucket") then
mcl_hunger.register_food("mobs:bucket_milk", 3, "bucket:bucket_empty")
end
else
mcl_hunger.register_food("mobs:meat", 6)
mcl_hunger.register_food("mobs:meat_raw", 3)
mcl_hunger.register_food("mobs:rat_cooked", 5)
end
end
if minetest.get_modpath("moretrees") ~= nil then
mcl_hunger.register_food("moretrees:coconut_milk", 1)
mcl_hunger.register_food("moretrees:raw_coconut", 2)
mcl_hunger.register_food("moretrees:acorn_muffin", 3)
mcl_hunger.register_food("moretrees:spruce_nuts", 1)
mcl_hunger.register_food("moretrees:pine_nuts", 1)
mcl_hunger.register_food("moretrees:fir_nuts", 1)
end
if minetest.get_modpath("dwarves") ~= nil then
mcl_hunger.register_food("dwarves:beer", 2)
mcl_hunger.register_food("dwarves:apple_cider", 1)
mcl_hunger.register_food("dwarves:midus", 2)
mcl_hunger.register_food("dwarves:tequila", 2)
mcl_hunger.register_food("dwarves:tequila_with_lime", 2)
mcl_hunger.register_food("dwarves:sake", 2)
end
if minetest.get_modpath("animalmaterials") ~= nil then
mcl_hunger.register_food("animalmaterials:milk", 2)
mcl_hunger.register_food("animalmaterials:meat_raw", 3)
mcl_hunger.register_food("animalmaterials:meat_pork", 3)
mcl_hunger.register_food("animalmaterials:meat_beef", 3)
mcl_hunger.register_food("animalmaterials:meat_chicken", 3)
mcl_hunger.register_food("animalmaterials:meat_lamb", 3)
mcl_hunger.register_food("animalmaterials:meat_venison", 3)
mcl_hunger.register_food("animalmaterials:meat_undead", 3, "", 3)
mcl_hunger.register_food("animalmaterials:meat_toxic", 3, "", 5)
mcl_hunger.register_food("animalmaterials:meat_ostrich", 3)
mcl_hunger.register_food("animalmaterials:fish_bluewhite", 2)
mcl_hunger.register_food("animalmaterials:fish_clownfish", 2)
end
if minetest.get_modpath("fishing") ~= nil then
mcl_hunger.register_food("fishing:fish_raw", 2)
mcl_hunger.register_food("fishing:fish_cooked", 5)
mcl_hunger.register_food("fishing:sushi", 6)
mcl_hunger.register_food("fishing:shark", 4)
mcl_hunger.register_food("fishing:shark_cooked", 8)
mcl_hunger.register_food("fishing:pike", 4)
mcl_hunger.register_food("fishing:pike_cooked", 8)
end
if minetest.get_modpath("glooptest") ~= nil then
mcl_hunger.register_food("glooptest:kalite_lump", 1)
end
if minetest.get_modpath("bushes") ~= nil then
mcl_hunger.register_food("bushes:sugar", 1)
mcl_hunger.register_food("bushes:strawberry", 2)
mcl_hunger.register_food("bushes:berry_pie_raw", 3)
mcl_hunger.register_food("bushes:berry_pie_cooked", 4)
mcl_hunger.register_food("bushes:basket_pies", 15)
end
if minetest.get_modpath("bushes_classic") then
-- bushes_classic mod, as found in the plantlife modpack
local berries = {
"strawberry",
"blackberry",
"blueberry",
"raspberry",
"gooseberry",
"mixed_berry"}
for _, berry in ipairs(berries) do
if berry ~= "mixed_berry" then
mcl_hunger.register_food("bushes:"..berry, 1)
end
mcl_hunger.register_food("bushes:"..berry.."_pie_raw", 2)
mcl_hunger.register_food("bushes:"..berry.."_pie_cooked", 5)
mcl_hunger.register_food("bushes:basket_"..berry, 15)
end
end
if minetest.get_modpath("mushroom") ~= nil then
mcl_hunger.register_food("mushroom:brown", 1)
mcl_hunger.register_food("mushroom:red", 1, "", 3)
-- mushroom potions: red = strong poison, brown = light restorative
if minetest.get_modpath("vessels") then
mcl_hunger.register_food("mushroom:brown_essence", 1, "vessels:glass_bottle", nil, 4)
mcl_hunger.register_food("mushroom:poison", 1, "vessels:glass_bottle", 10)
end
end
if minetest.get_modpath("docfarming") ~= nil then
mcl_hunger.register_food("docfarming:carrot", 3)
mcl_hunger.register_food("docfarming:cucumber", 2)
mcl_hunger.register_food("docfarming:corn", 3)
mcl_hunger.register_food("docfarming:potato", 4)
mcl_hunger.register_food("docfarming:bakedpotato", 5)
mcl_hunger.register_food("docfarming:raspberry", 3)
end
if minetest.get_modpath("farming_plus") ~= nil then
mcl_hunger.register_food("farming_plus:carrot_item", 3)
mcl_hunger.register_food("farming_plus:banana", 2)
mcl_hunger.register_food("farming_plus:orange_item", 2)
mcl_hunger.register_food("farming:pumpkin_bread", 4)
mcl_hunger.register_food("farming_plus:strawberry_item", 2)
mcl_hunger.register_food("farming_plus:tomato_item", 2)
mcl_hunger.register_food("farming_plus:potato_item", 4)
mcl_hunger.register_food("farming_plus:rhubarb_item", 2)
end
if minetest.get_modpath("mtfoods") ~= nil then
mcl_hunger.register_food("mtfoods:dandelion_milk", 1)
mcl_hunger.register_food("mtfoods:sugar", 1)
mcl_hunger.register_food("mtfoods:short_bread", 4)
mcl_hunger.register_food("mtfoods:cream", 1)
mcl_hunger.register_food("mtfoods:chocolate", 2)
mcl_hunger.register_food("mtfoods:cupcake", 2)
mcl_hunger.register_food("mtfoods:strawberry_shortcake", 2)
mcl_hunger.register_food("mtfoods:cake", 3)
mcl_hunger.register_food("mtfoods:chocolate_cake", 3)
mcl_hunger.register_food("mtfoods:carrot_cake", 3)
mcl_hunger.register_food("mtfoods:pie_crust", 3)
mcl_hunger.register_food("mtfoods:apple_pie", 3)
mcl_hunger.register_food("mtfoods:rhubarb_pie", 2)
mcl_hunger.register_food("mtfoods:banana_pie", 3)
mcl_hunger.register_food("mtfoods:pumpkin_pie", 3)
mcl_hunger.register_food("mtfoods:cookies", 2)
mcl_hunger.register_food("mtfoods:mlt_burger", 5)
mcl_hunger.register_food("mtfoods:potato_slices", 2)
mcl_hunger.register_food("mtfoods:potato_chips", 3)
--mtfoods:medicine
mcl_hunger.register_food("mtfoods:casserole", 3)
mcl_hunger.register_food("mtfoods:glass_flute", 2)
mcl_hunger.register_food("mtfoods:orange_juice", 2)
mcl_hunger.register_food("mtfoods:apple_juice", 2)
mcl_hunger.register_food("mtfoods:apple_cider", 2)
mcl_hunger.register_food("mtfoods:cider_rack", 2)
end
if minetest.get_modpath("fruit") ~= nil then
mcl_hunger.register_food("fruit:apple", 2)
mcl_hunger.register_food("fruit:pear", 2)
mcl_hunger.register_food("fruit:bananna", 3)
mcl_hunger.register_food("fruit:orange", 2)
end
if minetest.get_modpath("mush45") ~= nil then
mcl_hunger.register_food("mush45:meal", 4)
end
if minetest.get_modpath("seaplants") ~= nil then
mcl_hunger.register_food("seaplants:kelpgreen", 1)
mcl_hunger.register_food("seaplants:kelpbrown", 1)
mcl_hunger.register_food("seaplants:seagrassgreen", 1)
mcl_hunger.register_food("seaplants:seagrassred", 1)
mcl_hunger.register_food("seaplants:seasaladmix", 6)
mcl_hunger.register_food("seaplants:kelpgreensalad", 1)
mcl_hunger.register_food("seaplants:kelpbrownsalad", 1)
mcl_hunger.register_food("seaplants:seagrassgreensalad", 1)
mcl_hunger.register_food("seaplants:seagrassgreensalad", 1)
end
if minetest.get_modpath("mobfcooking") ~= nil then
mcl_hunger.register_food("mobfcooking:cooked_pork", 6)
mcl_hunger.register_food("mobfcooking:cooked_ostrich", 6)
mcl_hunger.register_food("mobfcooking:cooked_beef", 6)
mcl_hunger.register_food("mobfcooking:cooked_chicken", 6)
mcl_hunger.register_food("mobfcooking:cooked_lamb", 6)
mcl_hunger.register_food("mobfcooking:cooked_venison", 6)
mcl_hunger.register_food("mobfcooking:cooked_fish", 6)
end
if minetest.get_modpath("creatures") ~= nil then
mcl_hunger.register_food("creatures:meat", 6)
mcl_hunger.register_food("creatures:flesh", 3)
mcl_hunger.register_food("creatures:rotten_flesh", 3, "", 3)
end
if minetest.get_modpath("ethereal") then
mcl_hunger.register_food("ethereal:strawberry", 1)
mcl_hunger.register_food("ethereal:banana", 4)
mcl_hunger.register_food("ethereal:pine_nuts", 1)
mcl_hunger.register_food("ethereal:bamboo_sprout", 0, "", 3)
mcl_hunger.register_food("ethereal:fern_tubers", 1)
mcl_hunger.register_food("ethereal:banana_bread", 7)
mcl_hunger.register_food("ethereal:mushroom_plant", 2)
mcl_hunger.register_food("ethereal:coconut_slice", 2)
mcl_hunger.register_food("ethereal:golden_apple", 4, "", nil, 10)
mcl_hunger.register_food("ethereal:wild_onion_plant", 2)
mcl_hunger.register_food("ethereal:mushroom_soup", 4, "ethereal:bowl")
mcl_hunger.register_food("ethereal:mushroom_soup_cooked", 6, "ethereal:bowl")
mcl_hunger.register_food("ethereal:hearty_stew", 6, "ethereal:bowl", 3)
mcl_hunger.register_food("ethereal:hearty_stew_cooked", 10, "ethereal:bowl")
if minetest.get_modpath("bucket") then
mcl_hunger.register_food("ethereal:bucket_cactus", 2, "bucket:bucket_empty")
end
mcl_hunger.register_food("ethereal:fish_raw", 2)
mcl_hunger.register_food("ethereal:fish_cooked", 5)
mcl_hunger.register_food("ethereal:seaweed", 1)
mcl_hunger.register_food("ethereal:yellowleaves", 1, "", nil, 1)
mcl_hunger.register_food("ethereal:sashimi", 4)
mcl_hunger.register_food("ethereal:orange", 2)
end
if minetest.get_modpath("farming") and farming.mod == "redo" then
mcl_hunger.register_food("farming:bread", 6)
mcl_hunger.register_food("farming:potato", 1)
mcl_hunger.register_food("farming:baked_potato", 6)
mcl_hunger.register_food("farming:cucumber", 4)
mcl_hunger.register_food("farming:tomato", 4)
mcl_hunger.register_food("farming:carrot", 3)
mcl_hunger.register_food("farming:carrot_gold", 6, "", nil, 8)
mcl_hunger.register_food("farming:corn", 3)
mcl_hunger.register_food("farming:corn_cob", 5)
mcl_hunger.register_food("farming:melon_slice", 2)
mcl_hunger.register_food("farming:pumpkin_slice", 1)
mcl_hunger.register_food("farming:pumpkin_bread", 9)
mcl_hunger.register_food("farming:coffee_cup", 2, "farming:drinking_cup")
mcl_hunger.register_food("farming:coffee_cup_hot", 3, "farming:drinking_cup", nil, 2)
mcl_hunger.register_food("farming:cookie", 2)
mcl_hunger.register_food("farming:chocolate_dark", 3)
mcl_hunger.register_food("farming:donut", 4)
mcl_hunger.register_food("farming:donut_chocolate", 6)
mcl_hunger.register_food("farming:donut_apple", 6)
mcl_hunger.register_food("farming:raspberries", 1)
mcl_hunger.register_food("farming:blueberries", 1)
mcl_hunger.register_food("farming:muffin_blueberry", 4)
if minetest.get_modpath("vessels") then
mcl_hunger.register_food("farming:smoothie_raspberry", 2, "vessels:drinking_glass")
end
mcl_hunger.register_food("farming:rhubarb", 1)
mcl_hunger.register_food("farming:rhubarb_pie", 6)
mcl_hunger.register_food("farming:beans", 1)
end
if minetest.get_modpath("kpgmobs") ~= nil then
mcl_hunger.register_food("kpgmobs:uley", 3)
mcl_hunger.register_food("kpgmobs:meat", 6)
mcl_hunger.register_food("kpgmobs:rat_cooked", 5)
mcl_hunger.register_food("kpgmobs:med_cooked", 4)
if minetest.get_modpath("bucket") then
mcl_hunger.register_food("kpgmobs:bucket_milk", 4, "bucket:bucket_empty")
end
end
if minetest.get_modpath("jkfarming") ~= nil then
mcl_hunger.register_food("jkfarming:carrot", 3)
mcl_hunger.register_food("jkfarming:corn", 3)
mcl_hunger.register_food("jkfarming:melon_part", 2)
mcl_hunger.register_food("jkfarming:cake", 3)
end
if minetest.get_modpath("jkanimals") ~= nil then
mcl_hunger.register_food("jkanimals:meat", 6)
end
if minetest.get_modpath("jkwine") ~= nil then
mcl_hunger.register_food("jkwine:grapes", 2)
mcl_hunger.register_food("jkwine:winebottle", 1)
end
if minetest.get_modpath("cooking") ~= nil then
mcl_hunger.register_food("cooking:meat_beef_cooked", 4)
mcl_hunger.register_food("cooking:fish_bluewhite_cooked", 3)
mcl_hunger.register_food("cooking:fish_clownfish_cooked", 1)
mcl_hunger.register_food("cooking:meat_chicken_cooked", 2)
mcl_hunger.register_food("cooking:meat_cooked", 2)
mcl_hunger.register_food("cooking:meat_pork_cooked", 3)
mcl_hunger.register_food("cooking:meat_toxic_cooked", -3)
mcl_hunger.register_food("cooking:meat_venison_cooked", 3)
mcl_hunger.register_food("cooking:meat_undead_cooked", 1)
end
-- ferns mod of plantlife_modpack
if minetest.get_modpath("ferns") ~= nil then
mcl_hunger.register_food("ferns:fiddlehead", 1, "", 1)
mcl_hunger.register_food("ferns:fiddlehead_roasted", 3)
mcl_hunger.register_food("ferns:ferntuber_roasted", 3)
mcl_hunger.register_food("ferns:horsetail_01", 1)
end
if minetest.get_modpath("pizza") ~= nil then
mcl_hunger.register_food("pizza:pizza", 30, "", nil, 30)
mcl_hunger.register_food("pizza:pizzaslice", 5, "", nil, 5)
end
if minetest.get_modpath("nssm") then
mcl_hunger.register_food("nssm:werewolf_leg", 3)
mcl_hunger.register_food("nssm:heron_leg", 2)
mcl_hunger.register_food("nssm:chichibios_heron_leg", 4)
mcl_hunger.register_food("nssm:crocodile_tail", 3)
mcl_hunger.register_food("nssm:duck_legs", 1)
mcl_hunger.register_food("nssm:ant_leg", 1)
mcl_hunger.register_food("nssm:spider_leg", 1)
mcl_hunger.register_food("nssm:tentacle", 2)
mcl_hunger.register_food("nssm:worm_flesh", 2, "", 2) -- poisonous
mcl_hunger.register_food("nssm:amphibian_heart", 1)
mcl_hunger.register_food("nssm:raw_scrausics_wing", 1)
-- superfoods
mcl_hunger.register_food("nssm:phoenix_nuggets", 20, "", nil, 20)
mcl_hunger.register_food("nssm:phoenix_tear", 20, "", nil, 20)
end
-- player-action based hunger changes
function mcl_hunger.handle_node_actions(pos, oldnode, player, ext)
-- is_fake_player comes from the pipeworks, we are not interested in those
if not player or not player:is_player() or player.is_fake_player == true then
return
end
local name = player:get_player_name()
local exhaus = mcl_hunger.exhaustion[name]
if exhaus == nil then return end
local new = mcl_hunger.EXHAUST_PLACE
-- placenode event
if not ext then
new = mcl_hunger.EXHAUST_DIG
end
-- assume its send by main timer when movement detected
if not pos and not oldnode then
new = mcl_hunger.EXHAUST_MOVE
end
exhaus = exhaus + new
if exhaus > mcl_hunger.EXHAUST_LVL then
exhaus = 0
local h = tonumber(mcl_hunger.hunger[name])
h = h - 1
if h < 0 then h = 0 end
mcl_hunger.hunger[name] = h
mcl_hunger.set_hunger_raw(player)
end
mcl_hunger.exhaustion[name] = exhaus
end
minetest.register_on_placenode(mcl_hunger.handle_node_actions)
minetest.register_on_dignode(mcl_hunger.handle_node_actions)

View file

@ -0,0 +1,169 @@
local S
if (minetest.get_modpath("intllib")) then
S = intllib.Getter()
else
S = function ( s ) return s end
end
if minetest.setting_getbool("enable_damage") then
mcl_hunger = {}
mcl_hunger.food = {}
-- HUD statbar values
mcl_hunger.hunger = {}
mcl_hunger.hunger_out = {}
-- Count number of poisonings a player has at once
mcl_hunger.poisonings = {}
-- HUD item ids
local hunger_hud = {}
mcl_hunger.HUD_TICK = 0.1
--Some hunger settings
mcl_hunger.exhaustion = {} -- Exhaustion is experimental!
mcl_hunger.HUNGER_TICK = 800 -- time in seconds after that 1 hunger point is taken
mcl_hunger.EXHAUST_DIG = 3 -- exhaustion increased this value after digged node
mcl_hunger.EXHAUST_PLACE = 1 -- exhaustion increased this value after placed
mcl_hunger.EXHAUST_MOVE = 0.3 -- exhaustion increased this value if player movement detected
mcl_hunger.EXHAUST_LVL = 160 -- at what exhaustion player satiation gets lowerd
--load custom settings
local set = io.open(minetest.get_modpath("mcl_hunger").."/mcl_hunger.conf", "r")
if set then
dofile(minetest.get_modpath("mcl_hunger").."/mcl_hunger.conf")
set:close()
end
local function custom_hud(player)
hb.init_hudbar(player, "satiation", mcl_hunger.get_hunger_raw(player))
end
dofile(minetest.get_modpath("mcl_hunger").."/hunger.lua")
-- register satiation hudbar
hb.register_hudbar("satiation", 0xFFFFFF, S("Satiation"), { icon = "hbhunger_icon.png", bgicon = "hbhunger_bgicon.png", bar = "hbhunger_bar.png" }, 20, 20, false)
-- update hud elemtens if value has changed
local function update_hud(player)
local name = player:get_player_name()
--hunger
local h_out = tonumber(mcl_hunger.hunger_out[name])
local h = tonumber(mcl_hunger.hunger[name])
if h_out ~= h then
mcl_hunger.hunger_out[name] = h
hb.change_hudbar(player, "satiation", h)
end
end
mcl_hunger.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
mcl_hunger.set_hunger_raw = function(player)
local inv = player:get_inventory()
local name = player:get_player_name()
local value = mcl_hunger.hunger[name]
if not inv or not value then return nil end
if value > 20 then value = 20 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)
local name = player:get_player_name()
local inv = player:get_inventory()
inv:set_size("hunger",1)
mcl_hunger.hunger[name] = mcl_hunger.get_hunger_raw(player)
mcl_hunger.hunger_out[name] = mcl_hunger.hunger[name]
mcl_hunger.exhaustion[name] = 0
mcl_hunger.poisonings[name] = 0
custom_hud(player)
mcl_hunger.set_hunger_raw(player)
end)
minetest.register_on_respawnplayer(function(player)
-- reset hunger (and save)
local name = player:get_player_name()
mcl_hunger.hunger[name] = 20
mcl_hunger.set_hunger_raw(player)
mcl_hunger.exhaustion[name] = 0
end)
local main_timer = 0
local timer = 0 -- Half second timer
local timer2 = 0
local timerMult = 1 -- Cycles from 0 to 7, each time when timer hits half a second
minetest.register_globalstep(function(dtime)
main_timer = main_timer + dtime
timer = timer + dtime
timer2 = timer2 + dtime
if main_timer > mcl_hunger.HUD_TICK or timer > 0.5 or timer2 > mcl_hunger.HUNGER_TICK then
if main_timer > mcl_hunger.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(mcl_hunger.hunger[name])
local hp = player:get_hp()
if timer > 0.5 then
-- Quick heal (every 0.5s)
if h >= 20 and hp > 0 then
player:set_hp(hp+1)
-- Slow heal, and hunger damage (every 4s)
elseif timerMult == 0 then
if h >= 18 and hp > 0 then
player:set_hp(hp+1)
elseif h == 0 then
-- Damage hungry player down to 1 HP
if hp-1 >= 0 then
player:set_hp(hp-1)
end
end
end
-- lower satiation by 1 point after xx seconds
if timer2 > mcl_hunger.HUNGER_TICK then
if h > 0 then
h = h-1
mcl_hunger.hunger[name] = h
mcl_hunger.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
mcl_hunger.handle_node_actions(nil, nil, player)
end
end
end
end
if timer > 0.5 then
timer = 0
timerMult = timerMult + 1
if timerMult > 7 then
timerMult = 0
end
end
if timer2 > mcl_hunger.HUNGER_TICK then timer2 = 0 end
end)
end

View file

@ -0,0 +1 @@
Satiation = Sättigung

View file

@ -0,0 +1 @@
Satiation = Saciedade

View file

@ -0,0 +1 @@
Satiation

View file

@ -0,0 +1 @@
name = mcl_hunger

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.3 KiB

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 80 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 151 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 267 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 409 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 526 B