/ 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  })