diff --git a/abms.lua b/abms.lua index 07e1600..0b56ce2 100644 --- a/abms.lua +++ b/abms.lua @@ -68,6 +68,12 @@ minetest.register_globalstep(function(dtime) return end + local out = io.open(fun_caves.world..'/fun_caves_data.txt','w') + if out then + out:write(minetest.serialize(fun_caves.db)) + out.close() + end + -- Promote mobs based on spawn position local is_fortress = fun_caves.is_fortress for _, mob in pairs(minetest.luaentities) do @@ -183,11 +189,7 @@ minetest.register_globalstep(function(dtime) -- ... from hunger (even less often). if dps_count % hunger_delay == 0 then - if hunger_mod then - hunger.update_hunger(player, hunger.players[player_name].lvl - 4) - else - player:set_hp(player:get_hp() - 1) - end + fun_caves.hunger_change(player, -1) end end end diff --git a/init.lua b/init.lua index 4af7c53..8dabe98 100644 --- a/init.lua +++ b/init.lua @@ -33,9 +33,17 @@ local inp = io.open(fun_caves.world..'/fun_caves_data.txt','r') if inp then local d = inp:read('*a') fun_caves.db = minetest.deserialize(d) -else + inp.close() +end +if not fun_caves.db then fun_caves.db = {} end +if not fun_caves.db.teleport_data then + fun_caves.db.teleport_data = {} +end +if not fun_caves.db.hunger then + fun_caves.db.hunger = {} +end -- whether to use biomes and heightmap @@ -106,3 +114,66 @@ if mobs and mobs.mod == "redo" then end --fun_caves.print_recipes() + + +local hunger_mod = minetest.get_modpath("hunger") +fun_caves.hunger_id = {} + +function fun_caves.hunger_change(player, change) + local name = player:get_player_name() + if hunger_mod then + if change < 0 then + hunger.update_hunger(player, hunger.players[name].lvl + change * 4) + end + return + end + + local hp = player:get_hp() + if change < 0 or hp >= 20 then + fun_caves.db.hunger[name] = math.min(20, math.max(0, fun_caves.db.hunger[name] + change)) + player:hud_change(fun_caves.hunger_id[name], 'number', fun_caves.db.hunger[name]) + if fun_caves.db.hunger[name] == 0 then + player:set_hp(player:get_hp() - 1) + end + end +end + +if not hunger_mod then + minetest.register_on_joinplayer(function(player) + local name = player:get_player_name() + + if not fun_caves.db.hunger[name] then + fun_caves.db.hunger[name] = 20 + end + + local hunger_bar = { + hud_elem_type = 'statbar', + position = {x=0.52, y=0.883}, + name = "hunger", + text = "farming_bread.png", + number = fun_caves.db.hunger[name], + direction = 0, + size = { x=24, y=24 }, + } + + fun_caves.hunger_id[name] = player:hud_add(hunger_bar) + end) + + minetest.register_on_item_eat(function(hp_change, replace_with_item, itemstack, user, pointed_thing) + if hp_change > 0 then + fun_caves.hunger_change(user, hp_change) + end + end) + + minetest.register_on_dieplayer(function(player) + local name = player:get_player_name() + local pos = vector.round(player:getpos()) + + if not hunger_mod then + fun_caves.db.hunger[name] = 20 + player:hud_change(fun_caves.hunger_id[name], 'number', 20) + end + + minetest.chat_send_player(name, 'Your bones will lie at ('..pos.x..','..pos.y..','..pos.z..'), in ignominy, unless you collect them.') + end) +end diff --git a/mobs.lua b/mobs.lua index 0361e4a..0e310b8 100644 --- a/mobs.lua +++ b/mobs.lua @@ -81,15 +81,15 @@ end -- Try to standardize creature stats based on (log of) mass. local mob_stats = { - {name = 'dmobs:badger', hp = 12, damage = 1, armor = 100, reach = 1}, - {name = 'dmobs:dragon', hp = 40, damage = 6, armor = 50, reach = 3}, - {name = 'dmobs:elephant', hp = 38, damage = 5, armor = 75, reach = 3}, - {name = 'dmobs:fox', hp = 8, damage = 1, armor = 100, reach = 1}, - {name = 'dmobs:hedgehog', hp = 2, damage = 1, armor = 100, reach = 1}, - {name = 'dmobs:ogre', hp = 26, damage = 3, armor = 75, reach = 3}, - {name = 'dmobs:orc', hp = 22, damage = 2, armor = 100, reach = 2}, - {name = 'dmobs:owl', hp = 6, damage = 1, armor = 100, reach = 1}, - {name = 'dmobs:panda', hp = 22, damage = 2, armor = 100, reach = 2}, + {name = 'dmobs:badger', hp = 12, damage = 1, armor = 100, reach = 1, meat = true}, + {name = 'dmobs:dragon', hp = 40, damage = 6, armor = 50, reach = 3, meat = true}, + {name = 'dmobs:elephant', hp = 38, damage = 5, armor = 75, reach = 3, meat = true}, + {name = 'dmobs:fox', hp = 8, damage = 1, armor = 100, reach = 1, meat = true}, + {name = 'dmobs:hedgehog', hp = 2, damage = 1, armor = 100, reach = 1, meat = true}, + {name = 'dmobs:ogre', hp = 26, damage = 3, armor = 75, reach = 3, meat = true}, + {name = 'dmobs:orc', hp = 22, damage = 2, armor = 100, reach = 2, meat = true}, + {name = 'dmobs:owl', hp = 6, damage = 1, armor = 100, reach = 1, meat = true}, + {name = 'dmobs:panda', hp = 22, damage = 2, armor = 100, reach = 2, meat = true}, {name = 'kpgmobs:deer', hp = 20, damage = 2, armor = 100, reach = 2}, {name = 'kpgmobs:horse2', hp = 30, damage = 3, armor = 100, reach = 2}, {name = 'kpgmobs:horse3', hp = 30, damage = 3, armor = 100, reach = 2}, @@ -161,6 +161,9 @@ for _, mob in pairs(mob_stats) do if mob.reach then minetest.registered_entities[mob.name].reach = mob.reach end + if mob.meat then + minetest.registered_entities[mob.name].drops[#minetest.registered_entities[mob.name].drops+1] = {name = "mobs:meat_raw", chance = 1, min = 1, max = mob.damage ^ 2} + end end end diff --git a/tesseract.lua b/tesseract.lua index cd52f95..28e22c2 100644 --- a/tesseract.lua +++ b/tesseract.lua @@ -8,12 +8,6 @@ local function teleporter(user, area, power) local name = user:get_player_name() local pos = user:getpos() - if not fun_caves.db then - fun_caves.db = {} - end - if not fun_caves.db.teleport_data then - fun_caves.db.teleport_data = {} - end if not fun_caves.db.teleport_data[name] then fun_caves.db.teleport_data[name] = {} end