From 756833b8558ef3a8dabaef383e6410e911700b95 Mon Sep 17 00:00:00 2001 From: FaceDeer Date: Mon, 27 Mar 2017 14:51:45 -0600 Subject: [PATCH] add breathing tube --- init.lua | 93 +++++++++++++++++++++++---- locale/template.pot | 41 ++++++++---- sounds/airtanks_gasp.ogg | Bin 0 -> 7515 bytes textures/airtanks_breathing_tube.png | Bin 0 -> 496 bytes 4 files changed, 110 insertions(+), 24 deletions(-) create mode 100644 sounds/airtanks_gasp.ogg create mode 100644 textures/airtanks_breathing_tube.png diff --git a/init.lua b/init.lua index f4c9159..d527c7e 100644 --- a/init.lua +++ b/init.lua @@ -25,6 +25,10 @@ local function setting(stype, name, default, description) end end +setting("int", "steel_uses", 30, "Number of uses for a steel air tank") +setting("int", "copper_uses", 10, "Number of uses for a copper air tank") +setting("int", "bronze_uses", (config.steel_uses + config.copper_uses)/2, "Number of uses for a bronze air tank") + local full_tank_desc = S("A tank containing compressed air.") local full_tank_help = S("If you're underwater and you're running out of breath, wield this item and use it to replenish 5 bubbles on your breath bar. When fully charged this tank has %i uses before it becomes empty.") @@ -34,13 +38,12 @@ local empty_tank_help = S("This tank can be recharged with compressed air by usi local compressor_desc = S("A machine for filling air tanks with compressed air.") local compressor_help = S("Place this machine somewhere that it has access to air (one of its adjacent nodes needs to have air in it). When you click on it with an empty or partly-empty compressed air tank the tank will be refilled.") -setting("int", "steel_uses", 30, "Number of uses for a steel air tank") -setting("int", "copper_uses", 10, "Number of uses for a copper air tank") -setting("int", "bronze_uses", (config.steel_uses + config.copper_uses)/2, "Number of uses for a bronze air tank") +local tube_desc = S("A breathing tube to allow automatic hands-free use of air tanks.") +local tube_help = S("If this item is present in your quick-use inventory then whenever your breath bar goes below 5 it will automatically make use of any air tanks that are present in your quick-use inventory to replenish your breath supply. Note that it will not use air tanks that are present elsewhere in your inventory, only ones in your quick-use bar.") local cardinal_dirs = {{x=1,y=0,z=0},{x=-1,y=0,z=0},{x=0,y=1,z=0},{x=0,y=-1,z=0},{x=0,y=0,z=1},{x=0,y=0,z=-1},} -local recharge_airtank = function(itemstack, user, pointed_thing, full_item) +local function recharge_airtank(itemstack, user, pointed_thing, full_item) if pointed_thing.type ~= "node" then return itemstack end local node = minetest.get_node(pointed_thing.under) if minetest.get_item_group(node.name, "airtanks_compressor") > 0 then @@ -71,8 +74,10 @@ local recharge_airtank = function(itemstack, user, pointed_thing, full_item) return itemstack end -local use_airtank = function(itemstack, user, pointed_thing, uses, full_item, empty_item) - itemstack = recharge_airtank(itemstack, user, pointed_thing, full_item) -- first check if we're clicking on a compressor +local function use_airtank(itemstack, user, pointed_thing, full_item) + if pointed_thing then + itemstack = recharge_airtank(itemstack, user, pointed_thing, full_item) -- first check if we're clicking on a compressor + end local breath = user:get_breath() if breath > 9 then return itemstack end @@ -82,14 +87,14 @@ local use_airtank = function(itemstack, user, pointed_thing, uses, full_item, em if not minetest.setting_getbool("creative_mode") then local wdef = itemstack:get_definition() - itemstack:add_wear(65535/(uses-1)) + itemstack:add_wear(65535/(wdef._airtank_uses-1)) if itemstack:get_count() == 0 then if wdef.sound and wdef.sound.breaks then minetest.sound_play(wdef.sound.breaks, {pos = user:getpos(), gain = 0.5}) end local inv = user:get_inventory() - itemstack = inv:add_item("main", empty_item) + itemstack = inv:add_item("main", wdef._airtank_empty) end end return itemstack @@ -117,17 +122,19 @@ local function register_air_tank(name, desc, color, uses, material) description = desc, _doc_items_longdesc = full_tank_desc, _doc_items_usagehelp = string.format(full_tank_help, uses), - groups = {not_repaired_by_anvil = 1}, + _airtank_uses = uses, + _airtank_empty = "airtanks:empty_"..name.."_tank", + groups = {not_repaired_by_anvil = 1, airtank = 1}, inventory_image = "airtanks_airtank.png^[multiply:"..color, wield_image = "airtanks_airtank.png^[multiply:"..color, stack_max = 1, on_place = function(itemstack, user, pointed_thing) - return use_airtank(itemstack, user, pointed_thing, uses, "airtanks:"..name.."_tank", "airtanks:empty_"..name.."_tank") + return use_airtank(itemstack, user, pointed_thing, "airtanks:"..name.."_tank", "airtanks:empty_"..name.."_tank") end, on_use = function(itemstack, user, pointed_thing) - return use_airtank(itemstack, user, pointed_thing, uses, "airtanks:"..name.."_tank", "airtanks:empty_"..name.."_tank") + return use_airtank(itemstack, user, pointed_thing, "airtanks:"..name.."_tank", "airtanks:empty_"..name.."_tank") end, }) @@ -146,6 +153,9 @@ register_air_tank("steel", S("Steel Air Tank"), "#d6d6d6", config.steel_uses, "d register_air_tank("copper", S("Copper Air Tank"), "#cd8e54", config.copper_uses, "default:copper_ingot") register_air_tank("bronze", S("Bronze Air Tank"), "#c87010", config.bronze_uses, "default:bronze_ingot") +--------------------------------------------------------------------------------------------------------- +-- Compressor + local sounds if default.node_sound_metal_defaults then -- 0.4.14 doesn't have metal sounds sounds = default.node_sound_metal_defaults() @@ -184,4 +194,63 @@ minetest.register_craft({ {"group:wood", "default:steel_ingot", "group:wood"}, }, output = "airtanks:compressor" -}) \ No newline at end of file +}) + +--------------------------------------------------------------------------------------------------------- +-- breathing tube + +minetest.register_craftitem("airtanks:breathing_tube", { + description = S("Breathing Tube"), + _doc_items_longdesc = tube_desc, + _doc_items_usagehelp = tube_help, + inventory_image = "airtanks_breathing_tube.png", + wield_image = "airtanks_breathing_tube.png", + stack_max = 99, +}) + +minetest.register_craft({ + recipe = { + {"", "group:stick", ""}, + {"", "group:stick", ""}, + {"group:wood", "group:stick", ""}, + }, + output = "airtanks:breathing_tube" +}) + +local function tool_active(player, item) + local inv = player:get_inventory() + local hotbar = player:hud_get_hotbar_itemcount() + for i=1, hotbar do + if inv:get_stack("main", i):get_name() == item then + return true + end + end + return false +end + +local function use_any_airtank(player) + local inv = player:get_inventory() + local hotbar = player:hud_get_hotbar_itemcount() + for i=1, hotbar do + local itemstack = inv:get_stack("main", i) + if minetest.get_item_group(itemstack:get_name(), "airtank") > 0 then + itemstack = use_airtank(itemstack, player) + inv:set_stack("main", i, itemstack) + return true + end + end + return false +end + +local function player_event_handler(player, eventname) + assert(player:is_player()) + if eventname == "breath_changed" and player:get_breath() < 5 and tool_active(player, "airtanks:breathing_tube") then + if not use_any_airtank(player) then + minetest.sound_play("airtanks_gasp", {pos = player:getpos(), gain = 0.5}) + end + end + + return false +end + +minetest.register_playerevent(player_event_handler) \ No newline at end of file diff --git a/locale/template.pot b/locale/template.pot index 3262128..694686b 100644 --- a/locale/template.pot +++ b/locale/template.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-03-26 10:53-0600\n" +"POT-Creation-Date: 2017-03-27 14:50-0600\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -17,11 +17,11 @@ msgstr "" "Content-Type: text/plain; charset=CHARSET\n" "Content-Transfer-Encoding: 8bit\n" -#: C:\Users\Bryan\Downloads\minetest-0.4.15-win64\mods\airtanks\init.lua:28 +#: C:\Users\Bryan\Downloads\minetest-0.4.15-win64\mods\airtanks\init.lua:32 msgid "A tank containing compressed air." msgstr "" -#: C:\Users\Bryan\Downloads\minetest-0.4.15-win64\mods\airtanks\init.lua:29 +#: C:\Users\Bryan\Downloads\minetest-0.4.15-win64\mods\airtanks\init.lua:33 #, lua-format msgid "" "If you're underwater and you're running out of breath, wield this item and " @@ -29,44 +29,61 @@ msgid "" "tank has %i uses before it becomes empty." msgstr "" -#: C:\Users\Bryan\Downloads\minetest-0.4.15-win64\mods\airtanks\init.lua:31 +#: C:\Users\Bryan\Downloads\minetest-0.4.15-win64\mods\airtanks\init.lua:35 msgid "A compressed air tank, currently empty." msgstr "" -#: C:\Users\Bryan\Downloads\minetest-0.4.15-win64\mods\airtanks\init.lua:32 +#: C:\Users\Bryan\Downloads\minetest-0.4.15-win64\mods\airtanks\init.lua:36 #, lua-format msgid "" "This tank can be recharged with compressed air by using it on a compressor " "block. When fully charged this tank has %i uses before it becomes empty." msgstr "" -#: C:\Users\Bryan\Downloads\minetest-0.4.15-win64\mods\airtanks\init.lua:34 +#: C:\Users\Bryan\Downloads\minetest-0.4.15-win64\mods\airtanks\init.lua:38 msgid "A machine for filling air tanks with compressed air." msgstr "" -#: C:\Users\Bryan\Downloads\minetest-0.4.15-win64\mods\airtanks\init.lua:35 +#: C:\Users\Bryan\Downloads\minetest-0.4.15-win64\mods\airtanks\init.lua:39 msgid "" "Place this machine somewhere that it has access to air (one of its adjacent " "nodes needs to have air in it). When you click on it with an empty or partly-" "empty compressed air tank the tank will be refilled." msgstr "" -#: C:\Users\Bryan\Downloads\minetest-0.4.15-win64\mods\airtanks\init.lua:100 +#: C:\Users\Bryan\Downloads\minetest-0.4.15-win64\mods\airtanks\init.lua:41 +msgid "A breathing tube to allow automatic hands-free use of air tanks." +msgstr "" + +#: C:\Users\Bryan\Downloads\minetest-0.4.15-win64\mods\airtanks\init.lua:42 +msgid "" +"If this item is present in your quick-use inventory then whenever your " +"breath bar goes below 5 it will automatically make use of any air tanks that " +"are present in your quick-use inventory to replenish your breath supply. " +"Note that it will not use air tanks that are present elsewhere in your " +"inventory, only ones in your quick-use bar." +msgstr "" + +#: C:\Users\Bryan\Downloads\minetest-0.4.15-win64\mods\airtanks\init.lua:105 msgid "Empty @1" msgstr "" -#: C:\Users\Bryan\Downloads\minetest-0.4.15-win64\mods\airtanks\init.lua:145 +#: C:\Users\Bryan\Downloads\minetest-0.4.15-win64\mods\airtanks\init.lua:152 msgid "Steel Air Tank" msgstr "" -#: C:\Users\Bryan\Downloads\minetest-0.4.15-win64\mods\airtanks\init.lua:146 +#: C:\Users\Bryan\Downloads\minetest-0.4.15-win64\mods\airtanks\init.lua:153 msgid "Copper Air Tank" msgstr "" -#: C:\Users\Bryan\Downloads\minetest-0.4.15-win64\mods\airtanks\init.lua:147 +#: C:\Users\Bryan\Downloads\minetest-0.4.15-win64\mods\airtanks\init.lua:154 msgid "Bronze Air Tank" msgstr "" -#: C:\Users\Bryan\Downloads\minetest-0.4.15-win64\mods\airtanks\init.lua:157 +#: C:\Users\Bryan\Downloads\minetest-0.4.15-win64\mods\airtanks\init.lua:167 msgid "Air Compressor" msgstr "" + +#: C:\Users\Bryan\Downloads\minetest-0.4.15-win64\mods\airtanks\init.lua:203 +msgid "Breathing Tube" +msgstr "" diff --git a/sounds/airtanks_gasp.ogg b/sounds/airtanks_gasp.ogg new file mode 100644 index 0000000000000000000000000000000000000000..ac03e92bc2341bc409226d616f1dc3435db428d7 GIT binary patch literal 7515 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 dSMdO4ku0I`wnWFU8GbZ8()Nlj2>E@cM*00C4} zIn{*6CL}IBea0vGeg4n$s6E*RuqL-%fhm(@&FM5RYi3;$^){O7a;Gr+;028ytzOkKFqran&z<&>}+l^GdGJM zs1<5?D|7?{6!LkVU!Lp(v5^D^`+L;Z>+}r_+6OMr&M_K%(icx~dXiCWeI$=oNoQAx zo7-FT`y5BRyFX7b6psOLb$t!M#MC4J7>~B0_U( zi}XfgGM!3EI=%X1=5qqmG