A Minetest mod that adds a "thirst" mechanic.
Version: 0.10.2
Code
LGPL 2.1 (see included LICENSE file)
Textures
vessels_glass_bottle_full_cc_by_sa_3.png
Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0)
modified from vessels_glass_bottle.png
Copyright (C) 2012-2016 Vanessa Ezekowitz
Copyright (C) 2016 Thomas-S
thirsty_drop_100_24_cc0.png +.xcf
thirsty_drop_100_16_cc0.png
thirsty_wooden_bowl_cc0.png +.xcf
thirsty_bronze_canteen_cc0.png +.xcf
thirsty_steel_canteen_cc0.png
thirsty_amulet_moisture_cc0.png +.xcf
thirsty_amulet_hydration_cc0.png +.xcf
Public Domain CC0 1.0 Universal
Sirrobzeroone
All other Images CC BY-SA 4.0 (see http://creativecommons.org/licenses/by-sa/4.0/)
Sounds
thirsty_breviceps_drink-drinking-liquid.ogg
https://freesound.org/people/Breviceps/sounds/445970/
Public Domain CC0 1.0 Universal
Report bugs or request help on the forum topic.
This is a mod for MineTest. It adds a thirst mechanic to the game, similar to many hunger mods (but independent of them). Players will slowly get thirstier over time, and will need to drink or suffer damage.
The point of this mod is not to make the game more realistic, or harder. The point is to have another mechanic that rewards preparation and infrastructure. Players will now have an incentive to build their base next to water (or add some water to their base), and/or take some water with them when mining or travelling.
"Thirst" is the absence of "hydration" (a term suggested by everamzah on the Minetest forums, thanks!). The overall mechanic is still called "thirst", but the visible bar is that of "hydration", meaning a full bar represents full hydration, not full thirst. Players lose hydration (or "hydro points") over time, and gain hydration when drinking.
stand in water (running or standing) to slowly drink. You may not move during drinking (or you could cross an ocean without getting thirsty).
To register additional drinkable nodes use the function:
thirsty.register_hydrate_node(node_name,also_drinkable_with_cup,regen_rate_per_second)
"node_name" - registered node name
"also_drinkable_with_cup" - optional will default to true, if true
registers as per thirsty.register_drinkable_node() with max_hydration
equal to thirsty.config.start (default 20)
"regen_rate_per_second" - optional will default to 0.5 hydration
points per second standing still in the liquid.
Example
thirsty.register_hydrate_node("default:water_source")
Use a container (e.g. from vessels
) on water to instantly
fill your hydration. Craftable wooden bowl included.
NODES
Configure nodes that can be drunk from using a cup/glass etc assuming this was
not done as part of Tier 0 or if you wish to override max_hydration to be more
than the default value (normally 20):
thirsty.register_drinkable_node(node_name,max_hydration)
"item_name" registered node name
"max_hydration" optional will default to thirsty.config.start (default 20)
max hydration can be set above 20 to encourage use of drinking fountains or
hydration/drinking infrastructure.
Example
thirsty.register_drinkable_node("thirsty:drinking_fountain",30)
ITEMS
Configure cups/glasses/bowls etc that can be used to scoop up water and then
drink from:
thirsty.augment_item_for_drinking(item_name, max_hydration)
"item_name" registered item name
"max_hydration" optional will default to thirsty.config.start (default 20)
max hydration can be set above 20 to encourage use of items to drink with.
This will overide/replace any existing code the item may have in it's item_name.on_use. So not recommended for items with custom on_use code already. Example
thirsty.augment_item_for_drinking('vessels:drinking_glass', 20)
Integrate thirsty into item custom on_use code
thirsty.on_use()
Example
minetest.register_craftitem("mod_name:empty_cup", {
description = S("Empty Cup"),
inventory_image = "mod_name_empty_cup.png",
liquids_pointable = true,
on_use = function(itemstack,player,pointed_thing)
local pos = pointed_thing.under
local node_name
if pointed_thing.type == "node" then
local node = minetest.get_node(pos)
node_name = node.name
end
if thirsty.config.node_drinkable[node_name] then
thirsty.on_use()
else
-- do something else
end
end,
})*
Pre-made drinks and craftable canteens
PREMADE DRINKS
Pre-made drinks can include anything the player may have had to craft
or cook and you wish the player to restore some hydration on_use:
thirsty.drink(player, amount, max_hydration, empty_vessel)
"player" player object see minetest player object
"amount" number of hydration points to restore
"max hydration" - optional will default to thirsty.config.start (default 20)
max hydration can be set above 20 to encourage use of items to drink with.
"empty_vessel" - optional empty vessel or item to return to player.
Example
minetest.register_craftitem("mod_name:cup_of_soup", {
description = S("Cup of Soup"),
inventory_image = "mod_name_cup_of_soup.png",
on_use = function(itemstack,player,pointed_thing)
thirsty.drink(player, 2, 20, "mod_name:empty_cup")
itemstack:take_item()
return itemstack
end,
})
CANTEENS, FLASKS or BOTTLES
Craftable items that you may wish to configure to hold a certain amount of
liquid hydration points. If used these items are converted to registered tools
rather than straight regsitered items with stack maximum of 1 so that current
full/empty value is displayed to the player (using wear). Thirsty includes a
Steel canteen with 40 hydration point capacity and a Bronze canteen with 60
hydration point capacity. These can be refilled by clicking on any thirsty
registered hydrate_node.
thirsty.register_canteen(item_name,hydrate_capacity,max_hydration,on_use)
"item_name" Registered item name to convert to canteen type container
"hydrate_capacity" How many hydration points the container holds 1 full bar = 20
"max hydration" Optional will default to thirsty.config.start (default 20)
max hydration can be set above 20 to encourage use of items to drink with.
"on_use" Optional default is true. Will set item.on_use function to; thirsty.on_use(), however if set to false on_use wont be over written. Mod registering item will need to manually include "thirsty.on_use()" inside its on_use item definition or canteen will not work note see Tier 1 - thirsty.on_use()
Example
thirsty.register_canteen("thirsty:bronze_canteen",60,25)
COMPLEX CANTEENS, FLASKS or BOTTLES
Using the above will mean items can no longer be stacked most importantly when they are empty. The below function will overcome this as it will register a full version
of the empty vessel as a tool. Naturally if you do not wish or need the empty containers to stack just use thirsty.register_canteen. Once a container is empty it will be replaced with the empty version.
thirsty.register_canteen_complex(item/node_name,hydrate_capacity,max_hydration,full_image)
"item_name" or "node_name" Registered item name to convert to canteen type tool container
"hydrate_capacity" How many hydration points the container holds 1 full bar = 20
"max hydration" Optional will default to thirsty.config.start (default 20)
max hydration can be set above 20 to encourage use of items to drink with.
"full_image" The full image of the empty item used for inventory image and wield image
Example
thirsty.register_canteen_complex("vessels:glass_bottle",10,22,"vessels_glass_bottle_full.png")
Placeable drinking fountain / wash basin node: instantly fills your hydration when used.
Add the below to the on_rightclick function inside your node definition, you'll also need to register the node as a drinkable node so you'll need to also run - thirsty.register_drinkable_node(node_name). Recommended that the node.drop for your node dosen't equal itself otherwise players will simply use these as endless canteens/bottles.
thirsty.on_rightclick()
minetest.register_node('thirsty:drinking_fountain', {
description = 'Drinking fountain',
....
def info
....
drop = "default:stone 4",
on_rightclick = thirsty.on_rightclick(),
})
minetest.register_craft({
output = "thirsty:drinking_fountain",
recipe = {
{ "default:stone", "bucket:bucket_water", "default:stone"},
{ "" , "default:stone" , ""},
{ "" , "default:stone" , ""}
},
replacements = {
{"bucket:bucket_water", "bucket:bucket_empty"}
}
})
thirsty.register_drinkable_node("thirsty:drinking_fountain",30)
Placeable fountain node(s) to fill the hydration of all players within range. Placing more nodes increases the range.
thirsty.register_water_fountain(node_name)
Example
thirsty.register_water_fountain("thirsty:water_fountain")
HOW TO USE WATER FOUNTAINS (Taken from forum posts) Water fountains are placeable, but these are not usable. Instead, they constantly fill the hydration of all players within a 5 node radius, as if they were standing in water. Water fountains need actual water (source or flowing) near them to work.
You can extend the radius of water fountains with "water extenders", placeable nodes without any function of their own.
Specifically, a water fountain will check all the nodes in a 5-node-high pyramid starting one node above itself. It will count all water nodes (source or flowing), and count all water fountains / water extenders. The smaller of these numbers is the "level" of the fountain, up to 20 (in other words, you need an equal amount of water and fountain blocks). Each level adds 5 more nodes to the working radius. A large fountain should cover a city block or two.
I'd recommend placing one water source above the "fountain" node, and arranging extenders under it, but the plan is to allow many working designs.
Craftable trinkets/gadgets/amulets that constantly keep your hydration filled when in your inventory, solving your thirst problem once and for all.
thirsty.register_amulet_extractor(item_name,value)
"item_name" Registered item name
"value" Number of Hydration points extracted per half second (thirsty.config.tick_time)
Note: Container must be avaliable in Inventory with avaliable space to add hydration points to.
Example
thirsty.register_amulet_extractor("thirsty:amulet_of_moisture", 0.6)
Amulet of Moisture - Absorbs moisture from the surronding environment places it into a canteen or other water holding item. Must be held in Inventory.
thirsty.register_amulet_supplier(item_name,value)
"item_name" Registered item name
"value" Number of Hydration points supplied to player per half second.(thirsty.config.tick_time)
Note: Container must be avaliable in Inventory with avaliable space to add hydration points to.
Example
thirsty.register_amulet_supplier("thirsty:amulet_of_hydration", 0.5)
Amulet of Hydration - Feeds water from a Canteen or other water holding item directly into the player to keep them always hydrated. Must be held in Inventory.
The above two Amulets can be used in combination with each other plus a canteen. However this does permenantly fill 3 inventory slots the delibrate downside to offset the significant bonus.
Amulets of Thirst - Three versions lesser,normal and greater each will slower the rate at which a player becomes thirsty. Normal thirst factor is 1, however a "cursed" version could be created which makes a player become thirsty faster.
thirsty.register_amulet_thirst(item_name, thirst_factor)
"item_name" Registered item name
"thirst_factor" Float value that represents the speed at which a player uses hydration points
Example
minetest.register_craftitem("thirsty:greater_amulet_thirst", {
description = "Greater Amulet of Thirst",
inventory_image = "thirsty_amulet_of_thirst_greater_cc0.png",
})
thirsty.register_amulet_thirst("thirsty:lesser_amulet_thirst",0.85)
*Note: Included Amulets of Thirst have no craft recipes and are only avaliable as
*dungeon loot with more powerful versions only found in deeper dungeons.
thirsty.get_hydro(player) : returns the current hydration of a player
"player" refers to a player object, i.e. with a get_player_name() method.
Continued tidy and updating
- default (optional but needed for included components)
- bucket (optional but needed for some included components)
- hudbars (optional): https://forum.minetest.net/viewtopic.php?f=11&t=11153
- vessels (optional): https://forum.minetest.net/viewtopic.php?id=2574