/ bjvxlx_computers / soldering_iron.lua
soldering_iron.lua
1 local mod = bjvxlx.computers 2 local S = mod.translate 3 4 mod.soldering_iron = { 5 name = 'bjvxlx_computers:soldering_iron', 6 description = S("Soldering Iron"), 7 _doc_items_longdesc = S(table.concat({ 8 "The soldering iron is used as a tool in engineering recipes", 9 "for computer components and similar micro-redstone technology.", 10 "It can also be used to start fires, as well as to smelt blocks", 11 "in-place without mining them first." 12 }, ' ')), 13 _doc_items_usagehelp = S(table.concat({ 14 "Right-click the surface of a block to smelt it and/or its drops", 15 "in-place. This will also start a fire. The fire will start", 16 "even if the block and/or its drops cannot be smelted." 17 }, ' ')), 18 inventory_image = "bjvxlx_computers_soldering_iron.png", 19 wield_image = "bjvxlx_computers_soldering_iron.png", 20 groups = {tool = 1} 21 } 22 23 function mod.soldering_iron.get_node_drops(node_name) 24 local cooked_drops = {} 25 local drops = 26 minetest.get_node_drops(node_name, 'mcl_tools:pick_diamond') 27 if drops then 28 for _, drop in ipairs(drops) do 29 if drop ~= '' then 30 cooked = minetest.get_craft_result({ 31 method = 'cooking', 32 width = 1, 33 items = {ItemStack(drop)} 34 }) 35 if cooked and cooked.item and 36 (cooked.item:get_name() ~= '') and 37 (cooked.item:get_name() ~= node_name) 38 then 39 table.insert(cooked_drops, cooked.item) 40 end 41 end 42 end 43 end 44 return cooked_drops 45 end 46 47 function mod.soldering_iron.get_burnt_node(node_name) 48 local node = minetest.registered_nodes[node_name] 49 if node then 50 local cooked = minetest.get_craft_result({ 51 method = 'cooking', 52 width = 1, 53 items = {ItemStack(node_name)} 54 }) 55 local function group(group_name) 56 return minetest.get_item_group(node_name, group_name) > 0 57 end 58 if cooked and cooked.item and cooked.item:get_name() ~= '' and 59 minetest.registered_nodes[cooked.item:get_name()] 60 then 61 return cooked.item:get_name() 62 elseif node_name:match(":stone_with_") then 63 return 'mcl_core:stone' 64 elseif group('leaves') or 65 group('leaves_orphan') or 66 group('plant') or 67 group('double_plant') or 68 group('wool') or 69 group('flower') 70 then 71 return '' 72 elseif group('wood') or 73 group('material_wood') or 74 group('wood_slab') or 75 group('wood_stairs') or 76 group('tree') or 77 group('fence_wood') 78 then 79 return 'mcl_core:coalblock' 80 elseif group('material_sand') or 81 group('sand') or 82 group('sandstone') or 83 group('normal_sandstone') or 84 group('red_sandstone') 85 then 86 return 'mcl_core:glass' 87 end 88 end 89 return node_name 90 end 91 92 function mod.soldering_iron.burn_pointed_node(pointed_thing, player) 93 if pointed_thing and pointed_thing.type == 'node' and 94 minetest.get_item_group( 95 minetest.get_node(pointed_thing.above).name, 96 'water' 97 ) == 0 98 then 99 local node = minetest.get_node(pointed_thing.under) 100 if node.name ~= '' then 101 local drops = mod.soldering_iron.get_node_drops(node.name) 102 local burnt = mod.soldering_iron.get_burnt_node(node.name) 103 local any_drops = false 104 for _, drop in ipairs(drops) do 105 if drop:get_name() ~= '' and drop:get_name() ~= burnt then 106 any_drops = true 107 minetest.add_item(pointed_thing.above, drop) 108 end 109 end 110 minetest.sound_play('fire_extinguish_flame', { 111 pos = pointed_thing.intersection_point, 112 max_hear_distance = 16, 113 gain = 0.15 114 }, true) 115 mcl_fire.set_fire(pointed_thing, player, false) 116 if burnt == '' then 117 minetest.remove_node(pointed_thing.under) 118 elseif burnt ~= node.name then 119 minetest.set_node(pointed_thing.under, {name = burnt}) 120 elseif any_drops then 121 minetest.remove_node(pointed_thing.under) 122 end 123 end 124 return true 125 else 126 return false 127 end 128 end 129 130 function mod.soldering_iron.on_place(ironstack, placer, pointed_thing) 131 if not placer:is_player() then 132 placer = nil 133 end 134 if mod.soldering_iron.burn_pointed_node(pointed_thing, placer) then 135 ironstack:add_wear_by_uses(65) 136 end 137 return ironstack 138 end 139 140 minetest.register_tool(mod.soldering_iron.name, mod.soldering_iron) 141 142 bjvxlx.engineering.register_blueprint({ 143 output = 'bjvxlx_computers:soldering_iron', 144 recipe = { 145 {'', 'mcl_fire:flint_and_steel', ''}, 146 {'', 'mcl_core:iron_ingot', ''}, 147 {'mesecons:wire_00000000_off', 148 'screwdriver:screwdriver', 149 'mesecons:wire_00000000_off'} 150 }, 151 tool = 'screwdriver:screwdriver' 152 })