Added Hunger

This commit is contained in:
IamPyu 2024-12-15 16:07:33 -06:00
parent 8ec337bb2b
commit dc7337a7aa
9 changed files with 124 additions and 4 deletions

View File

@ -62,6 +62,11 @@ PyuTest.DAMAGE_TYPES = {
type = "lightning"
}
end,
starvation = function ()
return custom_damage{
type = "starvation"
}
end
}
PyuTest.mt_damage_to_pyutest_damage = function(reason)
@ -112,6 +117,8 @@ core.register_on_dieplayer(function(player, reason)
message = string.format("%s froze to death", playername)
elseif newreason.type == "lightning" then
message = string.format("%s was struck by lightning", playername)
elseif newreason.type == "starvation" then
message = string.format("%s starved to death", playername)
end
elseif reason.type == "node_damage" then
local desc = core.registered_nodes[reason.node].description or "a block"

View File

@ -49,15 +49,18 @@ PyuTest.make_sword = function(nsname, desc, texture, damage, durability, atkspee
})
end
PyuTest.make_food = function(nsname, desc, wield_image, health_fill, cook_into, extra_code)
PyuTest.make_item(nsname, desc .. string.format("\nHeals %d health", health_fill), {
PyuTest.make_food = function(nsname, desc, wield_image, hunger_fill, cook_into, extra_code)
PyuTest.make_item(nsname, desc .. string.format("\nHeals %d health", hunger_fill), {
food = 1
}, wield_image, {
on_use = function(itemstack, user, pt)
if user == nil then return end
core.sound_play({ name = "eat", gain = 1 }, { pos = user:get_pos(), start_time = 1.2 })
core.do_item_eat(health_fill, "", itemstack, user, pt)
PyuTest.hunger_add(user:get_player_name(), hunger_fill)
if extra_code then extra_code() end
itemstack:take_item()
return itemstack
end,
})

View File

@ -1 +1,2 @@
name = pyutest_tools
depends = pyutest_hunger

View File

@ -0,0 +1,103 @@
PyuTest.HUNGER_MAX = 20
local storage = core.get_mod_storage()
local hungers = core.deserialize(storage:get("player_hungers")) or {}
PyuTest.hunger_multiplier = function(player, x)
hungers[player].multiplier = x
end
PyuTest.hunger_get = function (player)
return hungers[player].hunger
end
PyuTest.hunger_set = function (player, hunger)
hungers[player].hunger = hunger
end
PyuTest.hunger_add = function (player, points)
if hungers[player].hunger == PyuTest.HUNGER_MAX and points >= 0 then
return
end
if hungers[player].hunger <= 0 and points < 0 then
return
end
local p = hungers[player].hunger + points
if p > PyuTest.HUNGER_MAX then
p = PyuTest.HUNGER_MAX
end
hungers[player].hunger = p
end
local timers = {}
core.register_globalstep(function (dtime)
for i, p in pairs(core.get_connected_players()) do
local name = p:get_player_name()
if hungers[name].hunger < 0 then
hungers[name].hunger = 0
end
if timers[name] == nil then
timers[name] = {
hunger = 0,
damage = 0,
health = 0,
}
end
timers[name].hunger = timers[name].hunger + ((3 * hungers[name].multiplier) * dtime)
timers[name].damage = timers[name].damage + 5 * dtime
timers[name].health = timers[name].health + 8 * dtime
if timers[name].hunger > 50 then
PyuTest.hunger_add(name, -2)
timers[name].hunger = 0
end
if timers[name].damage > 20 and hungers[name].hunger == 0 then
PyuTest.deal_damage(p, 3, PyuTest.DAMAGE_TYPES.starvation())
timers[name].damage = 0
end
if timers[name].health > 30 and hungers[name].hunger == 20 then
PyuTest.deal_damage(p, -2)
timers[name].health = 0
end
hb.change_hudbar(p, "hunger", hungers[name].hunger, PyuTest.HUNGER_MAX)
end
end)
core.register_on_joinplayer(function(player)
local name = player:get_player_name()
if hungers[name] == nil then
hungers[name] = {
hunger = PyuTest.HUNGER_MAX,
multiplier = 1
}
end
hb.init_hudbar(player, "hunger", hungers[name].hunger, PyuTest.HUNGER_MAX)
end)
core.register_on_respawnplayer(function (player)
local name = player:get_player_name()
hungers[name].hunger = PyuTest.HUNGER_MAX
end)
local function save_data()
storage:set_string("player_hungers", core.serialize(hungers))
end
core.register_on_shutdown(save_data)
PyuTest.register_interval(save_data, 10)
hb.register_hudbar("hunger", 0xFFFFFF, Translate("Hunger"), {
icon = "pyutest-hunger.png",
bar = "pyutest-hunger-bg.png",
bgicon = "pyutest-hunger-bg.png"
}, 0, PyuTest.HUNGER_MAX, false)

View File

View File

@ -46,11 +46,16 @@ core.register_item(":", {
-- player effects (TODO)
core.register_globalstep(function ()
for _, v in pairs(core.get_connected_players()) do
local name = v:get_player_name()
local speed_multiplier = 1
local sprint_addition = 0.35
if v:get_player_control().aux1 then
if v:get_player_control().aux1 and PyuTest.hunger_get(name) > 6 then
speed_multiplier = speed_multiplier + sprint_addition
PyuTest.hunger_multiplier(name, 4)
else
PyuTest.hunger_multiplier(name, 1)
end
v:set_physics_override({

View File

@ -0,0 +1 @@
depends = pyutest_hunger

Binary file not shown.

After

Width:  |  Height:  |  Size: 80 B

BIN
textures/pyutest-hunger.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 201 B