diff --git a/mods/CORE/pyutest/damage.lua b/mods/CORE/pyutest/damage.lua index 991f438..840f6b7 100644 --- a/mods/CORE/pyutest/damage.lua +++ b/mods/CORE/pyutest/damage.lua @@ -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" diff --git a/mods/ITEMS/pyutest_tools/api.lua b/mods/ITEMS/pyutest_tools/api.lua index e98544f..e49e15b 100644 --- a/mods/ITEMS/pyutest_tools/api.lua +++ b/mods/ITEMS/pyutest_tools/api.lua @@ -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, }) diff --git a/mods/ITEMS/pyutest_tools/mod.conf b/mods/ITEMS/pyutest_tools/mod.conf index 093b2b9..cb107db 100644 --- a/mods/ITEMS/pyutest_tools/mod.conf +++ b/mods/ITEMS/pyutest_tools/mod.conf @@ -1 +1,2 @@ name = pyutest_tools +depends = pyutest_hunger diff --git a/mods/PLAYER/pyutest_hunger/init.lua b/mods/PLAYER/pyutest_hunger/init.lua new file mode 100644 index 0000000..bce33e6 --- /dev/null +++ b/mods/PLAYER/pyutest_hunger/init.lua @@ -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) diff --git a/mods/PLAYER/pyutest_hunger/mod.conf b/mods/PLAYER/pyutest_hunger/mod.conf new file mode 100644 index 0000000..e69de29 diff --git a/mods/PLAYER/pyutest_player/init.lua b/mods/PLAYER/pyutest_player/init.lua index 3ed5721..3aef2da 100644 --- a/mods/PLAYER/pyutest_player/init.lua +++ b/mods/PLAYER/pyutest_player/init.lua @@ -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({ diff --git a/mods/PLAYER/pyutest_player/mod.conf b/mods/PLAYER/pyutest_player/mod.conf index e69de29..755e169 100644 --- a/mods/PLAYER/pyutest_player/mod.conf +++ b/mods/PLAYER/pyutest_player/mod.conf @@ -0,0 +1 @@ +depends = pyutest_hunger diff --git a/textures/pyutest-hunger-bg.png b/textures/pyutest-hunger-bg.png new file mode 100644 index 0000000..488506a Binary files /dev/null and b/textures/pyutest-hunger-bg.png differ diff --git a/textures/pyutest-hunger.png b/textures/pyutest-hunger.png new file mode 100644 index 0000000..fde48c8 Binary files /dev/null and b/textures/pyutest-hunger.png differ