# Thirsty [thirsty] A Minetest mod that adds a "thirst" mechanic. Version: 0.10.2 ## *License* **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. # Description 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. # Terminology: "Thirst" vs. "hydration" "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. # Current behavior ## *Tier 0* 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") ## *Tier 1* 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, })* ## *Tier 2* 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") ## *Tier 3* 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) ## *Tier 4* 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. ## *Tier 5* 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. ## *Additional Functions* *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. Future plans ------------ Continued tidy and updating Dependencies ------------ * 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