Fix negative tool discharging and a few other tweaks...
authorShadowNinja <noreply@gmail.com>
Sat, 19 Oct 2013 02:22:39 +0000 (22:22 -0400)
committerShadowNinja <noreply@gmail.com>
Sat, 19 Oct 2013 02:28:32 +0000 (22:28 -0400)
Disable the flashlight by default.
Use itemstack:{get,set}_{metadata,name,wear,...} rather than {to,from}_table.
Improve the style of part of the code of mischelaneous tools

technic/config.lua
technic/machines/register/battery_box.lua
technic/register.lua
technic/tools/cans.lua
technic/tools/chainsaw.lua
technic/tools/flashlight.lua
technic/tools/mining_drill.lua
technic/tools/mining_laser_mk1.lua
technic/tools/sonic_screwdriver.lua

index 668e7db4c5c41d9c45b4be2373887ad7fbb19251..db3dfafe5bcc83825dee726f47c83454308cbff7 100644 (file)
@@ -8,7 +8,7 @@ local conf_table = technic.config:to_table()
 local defaults = {
        enable_mining_drill = "true",
        enable_mining_laser = "true",
-       enable_flashlight = "true",
+       enable_flashlight = "false",
        enable_rubber_tree_generation = "true",
        enable_marble_generation = "true",
        enable_granite_generation = "true",
index 626467240ef41b9ee9b7f4609dfc5f35bd2d04c2..a1d9b00b0f414a43be5f65bb2947d7edb06ea23a 100644 (file)
@@ -137,80 +137,73 @@ function technic.register_battery_box(data)
 end -- End registration
 
 
-function technic.charge_tools(meta, charge, charge_step)
-       --charge registered power tools
+function technic.charge_tools(meta, batt_charge, charge_step)
        local inv = meta:get_inventory()
-       if not inv:is_empty("src") then
-               local srcstack = inv:get_stack("src", 1)
-               local src_item = srcstack:to_table()
-               local src_meta = get_item_meta(src_item["metadata"])
-
-               local toolname = src_item["name"]
-               if technic.power_tools[toolname] ~= nil then
-                       -- Set meta data for the tool if it didn't do it itself :-(
-                       src_meta = get_item_meta(src_item["metadata"])
-                       src_meta = src_meta or {}
-                       if src_meta["charge"] == nil then
-                               src_meta["charge"] = 0
-                       end
-                       -- Do the charging
-                       local item_max_charge = technic.power_tools[toolname]
-                       local tool_charge     = src_meta["charge"]
-                       if tool_charge < item_max_charge and charge > 0 then
-                               if charge - charge_step < 0 then
-                                       charge_step = charge
-                               end
-                               if tool_charge + charge_step > item_max_charge then
-                                       charge_step = item_max_charge - tool_charge
-                               end
-                               tool_charge = tool_charge + charge_step
-                               charge = charge - charge_step
-                               technic.set_RE_wear(src_item, tool_charge, item_max_charge)
-                               src_meta["charge"]   = tool_charge
-                               src_item["metadata"] = set_item_meta(src_meta)
-                               inv:set_stack("src", 1, src_item)
-                       end
-               end
+       if inv:is_empty("src") then
+               return batt_charge
+       end
+       local srcstack = inv:get_stack("src", 1)
+       local src_meta = get_item_meta(srcstack:get_metadata())
+
+       local toolname = srcstack:get_name()
+       if not technic.power_tools[toolname] then
+               return batt_charge
+       end
+       -- Set meta data for the tool if it didn't do it itself
+       src_meta = get_item_meta(srcstack:get_metadata())
+       src_meta = src_meta or {}
+       if not src_meta.charge then
+               src_meta.charge = 0
+       end
+       -- Do the charging
+       local item_max_charge = technic.power_tools[toolname]
+       local tool_charge     = src_meta.charge
+       if tool_charge >= item_max_charge or batt_charge <= 0 then
+               return batt_charge
        end
-       return charge -- return the remaining charge in the battery
+       charge_step = math.min(charge_step, batt_charge)
+       charge_step = math.min(charge_step, item_max_charge - tool_charge)
+       tool_charge = tool_charge + charge_step
+       batt_charge = batt_charge - charge_step
+       technic.set_RE_wear(srcstack, tool_charge, item_max_charge)
+       src_meta.charge = tool_charge
+       srcstack:set_metadata(set_item_meta(src_meta))
+       inv:set_stack("src", 1, srcstack)
+       return batt_charge
 end
 
 
-function technic.discharge_tools(meta, charge, charge_step, max_charge)
-       -- discharging registered power tools
+function technic.discharge_tools(meta, batt_charge, charge_step, max_charge)
        local inv = meta:get_inventory()
-       if not inv:is_empty("dst") then
-               srcstack = inv:get_stack("dst", 1)
-               src_item = srcstack:to_table()
-               local src_meta = get_item_meta(src_item["metadata"])
-               local toolname = src_item["name"]
-               if technic.power_tools[toolname] ~= nil then
-                       -- Set meta data for the tool if it didn't do it itself :-(
-                       src_meta = get_item_meta(src_item["metadata"])
-                       src_meta = src_meta or {}
-                       if src_meta["charge"] == nil then
-                               src_meta["charge"] = 0
-                       end
+       if inv:is_empty("dst") then
+               return batt_charge
+       end
+       srcstack = inv:get_stack("dst", 1)
+       local toolname = srcstack:get_name()
+       if technic.power_tools[toolname] == nil then
+               return batt_charge
+       end
+       -- Set meta data for the tool if it didn't do it itself :-(
+       local src_meta = get_item_meta(srcstack:get_metadata())
+       src_meta = src_meta or {}
+       if not src_meta.charge then
+               src_meta.charge = 0
+       end
 
-                       -- Do the discharging
-                       local item_max_charge = technic.power_tools[toolname]
-                       local tool_charge     = src_meta["charge"]
-                       if tool_charge > 0 and charge < max_charge then
-                               if charge + charge_step > max_charge then
-                                       charge_step = max_charge - charge
-                               end
-                               if tool_charge - charge_step < 0 then
-                                       charge_step = charge
-                               end
-                               tool_charge = tool_charge - charge_step
-                               charge = charge + charge_step
-                               technic.set_RE_wear(src_item, tool_charge, item_max_charge)
-                               src_meta["charge"] = tool_charge
-                               src_item["metadata"] = set_item_meta(src_meta)
-                               inv:set_stack("dst", 1, src_item)
-                       end
-               end
+       -- Do the discharging
+       local item_max_charge = technic.power_tools[toolname]
+       local tool_charge     = src_meta.charge
+       if tool_charge <= 0 or batt_charge >= max_charge then
+               return batt_charge
        end
-       return charge -- return the remaining charge in the battery
+       charge_step = math.min(charge_step, max_charge - batt_charge)
+       charge_step = math.min(charge_step, tool_charge)
+       tool_charge = tool_charge - charge_step
+       batt_charge = batt_charge + charge_step
+       technic.set_RE_wear(srcstack, tool_charge, item_max_charge)
+       src_meta.charge = tool_charge
+       srcstack:set_metadata(set_item_meta(src_meta))
+       inv:set_stack("dst", 1, srcstack)
+       return batt_charge
 end
 
index 38766d906991d931160ffb343a5cc3b80a531ed4..288db575edb83965d2dc55461291aa1e353b8bbf 100644 (file)
@@ -43,8 +43,8 @@ function technic.set_RE_item_load(load1, max_load)
 end
 
 -- Wear down a tool depending on the remaining charge.
-function technic.set_RE_wear(item_stack, item_load, max_load)
+function technic.set_RE_wear(itemstack, item_load, max_load)
        local temp = 65536 - math.floor(item_load / max_load * 65535)
-       item_stack.wear = tostring(temp)
-       return item_stack
+       itemstack:set_wear(temp)
+       return itemstack
 end
index 6a98ce9fc3d838313d48f107ad1c611989c5de0f..e95b1443b6c8d01c9c440657e33353f65a73a955 100644 (file)
@@ -26,48 +26,46 @@ minetest.register_tool("technic:water_can", {
        stack_max = 1,
        liquids_pointable = true,
        on_use = function(itemstack, user, pointed_thing)
-               
                if pointed_thing.type ~= "node" then
-                                       return end
-               n = minetest.env:get_node(pointed_thing.under)
-               
-               item=itemstack:to_table()
-               local load=nil
-               if item["metadata"]=="" then load=0 
-               else load=tonumber(item["metadata"]) 
+                       return
                end
-               
-               if n.name == "default:water_source" then
-                       if load+1<17 then
-                       minetest.env:add_node(pointed_thing.under, {name="air"})
-                        load=load+1;   
-                       item["metadata"]=tostring(load)
-                       technic.set_RE_wear(item,load,water_can_max_load)
-                       itemstack:replace(item)
+               node = minetest.get_node(pointed_thing.under)
+
+               local charge = nil
+               if itemstack:get_metadata() == "" then
+                       charge = 0
+               else
+                       charge = tonumber(itemstack:get_metadata())
+               end
+               if node.name == "default:water_source" then
+                       if charge + 1 < 17 then
+                               minetest.remove_node(pointed_thing.under)
+                               charge = charge + 1
+                               itemstack:set_metadata(tostring(charge))
+                               technic.set_RE_wear(itemstack, charge, water_can_max_load)
                        end
                        return itemstack
                end
-               item=itemstack:to_table()
-               if load==0 then return end
-                       
-               if n.name == "default:water_flowing" then
-                       minetest.env:add_node(pointed_thing.under, {name="default:water_source"})
-                       load=load-1;    
-                       item["metadata"]=tostring(load)
-                       technic.set_RE_wear(item,load,water_can_max_load)
-                       itemstack:replace(item)
+               if charge == 0 then
+                       return
+               end
+
+               if node.name == "default:water_flowing" then
+                       minetest.set_node(pointed_thing.under, {name="default:water_source"})
+                       charge = charge - 1
+                       itemstack:set_metadata(tostring(charge))
+                       technic.set_RE_wear(itemstack, charge, water_can_max_load)
                        return itemstack
-                       end
+               end
 
-               n = minetest.env:get_node(pointed_thing.above)
-               if n.name == "air" then
-                       minetest.env:add_node(pointed_thing.above, {name="default:water_source"})
-                       load=load-1;    
-                       item["metadata"]=tostring(load)
-                       technic.set_RE_wear(item,load,water_can_max_load)
-                       itemstack:replace(item)
+               node = minetest.get_node(pointed_thing.above)
+               if node.name == "air" then
+                       minetest.set_node(pointed_thing.above, {name="default:water_source"})
+                       charge = charge - 1;
+                       itemstack:set_metadata(tostring(charge))
+                       technic.set_RE_wear(itemstack, charge, water_can_max_load)
                        return itemstack
-                       end             
+               end             
        end,
 })
 
@@ -77,44 +75,45 @@ minetest.register_tool("technic:lava_can", {
        stack_max = 1,
        liquids_pointable = true,
        on_use = function(itemstack, user, pointed_thing)
-               if pointed_thing.type ~= "node" then return end
-               n = minetest.env:get_node(pointed_thing.under)
-               item=itemstack:to_table()
-               local load=nil
-               if item["metadata"]=="" then load=0 
-               else load=tonumber(item["metadata"]) 
+               if pointed_thing.type ~= "node" then
+                       return
                end
-               
-               if n.name == "default:lava_source" then
-                       if load+1<17 then
-                       minetest.env:add_node(pointed_thing.under, {name="air"})
-                        load=load+1;
-                       item["metadata"]=tostring(load)
-                       technic.set_RE_wear(item,load,lava_can_max_load)
-                       itemstack:replace(item)
+               node = minetest.get_node(pointed_thing.under)
+               local charge = 0
+               if itemstack:get_metadata() == "" then
+                       charge = 0
+               else
+                       charge = tonumber(itemstack:get_metadata())
+               end
+
+               if node.name == "default:lava_source" then
+                       if charge + 1 < 17 then
+                               minetest.remove_node(pointed_thing.under)
+                               charge = charge + 1
+                               itemstack:set_metadata(tostring(charge))
+                               technic.set_RE_wear(itemstack, charge, lava_can_max_load)
                        end
                        return itemstack
                end
-               item=itemstack:to_table()
-               if load==0 then return end
-                       
-               if n.name == "default:lava_flowing" then
-                       minetest.env:add_node(pointed_thing.under, {name="default:lava_source"})
-                       load=load-1;    
-                       item["metadata"]=tostring(load)
-                       technic.set_RE_wear(item,load,lava_can_max_load)
-                       itemstack:replace(item)
+               if charge == 0 then
+                       return
+               end
+
+               if node.name == "default:lava_flowing" then
+                       minetest.set_node(pointed_thing.under, {name="default:lava_source"})
+                       charge = charge - 1     
+                       itemstack:set_metadata(tostring(charge))
+                       technic.set_RE_wear(itemstack, charge, lava_can_max_load)
                        return itemstack
-                       end
+               end
 
-               n = minetest.env:get_node(pointed_thing.above)
-               if n.name == "air" then
-                       minetest.env:add_node(pointed_thing.above, {name="default:lava_source"})
-                       load=load-1;    
-                       item["metadata"]=tostring(load)
-                       technic.set_RE_wear(item,load,lava_can_max_load)
-                       itemstack:replace(item)
+               node = minetest.get_node(pointed_thing.above)
+               if node.name == "air" then
+                       minetest.set_node(pointed_thing.above, {name="default:lava_source"})
+                       charge = charge - 1
+                       itemstack:set_metadata(tostring(charge))
+                       technic.set_RE_wear(itemstack, charge, lava_can_max_load)
                        return itemstack
-                       end     
+               end
        end,
 })
index 785cf3e230561cde050e8f78ef1383220f90ec43..833f830ca79d3cd22f26799b3818defec427aba4 100644 (file)
@@ -6,27 +6,28 @@ local chainsaw_leaves          = true  -- true  - Cut down entire trees, leaves
 technic.register_power_tool("technic:chainsaw", chainsaw_max_charge)
 
 minetest.register_tool("technic:chainsaw", {
-        description = "Chainsaw",
-        inventory_image = "technic_chainsaw.png",
-        stack_max = 1,
-        on_use = function(itemstack, user, pointed_thing)
-                if pointed_thing.type=="node" then
-                        item=itemstack:to_table()
-                        local meta=get_item_meta(item["metadata"])
-                        if meta==nil then return end --tool not charged
-                        if meta["charge"]==nil then return end
-                        -- Send current charge to digging function so that the chainsaw will stop after digging a number of nodes.
-                        local charge=meta["charge"]
-                        if charge < chainsaw_charge_per_node then return end -- only cut if charged
+       description = "Chainsaw",
+       inventory_image = "technic_chainsaw.png",
+       stack_max = 1,
+       on_use = function(itemstack, user, pointed_thing)
+               if pointed_thing.type == "node" then
+                       return itemstack
+               end
+               local meta = get_item_meta(itemstack:get_metadata())
+               if not meta or not meta.charge then
+                       return
+               end
+               -- Send current charge to digging function so that the chainsaw will stop after digging a number of nodes.
+               if mata.charge < chainsaw_charge_per_node then
+                       return
+               end
 
-                        charge=chainsaw_dig_it(minetest.get_pointed_thing_position(pointed_thing, above),user,charge)
-                        technic.set_RE_wear(item,charge,chainsaw_max_charge)
-                        meta["charge"]=charge
-                        item["metadata"]=set_item_meta(meta)
-                        itemstack:replace(item)
-                        return itemstack
-                end
-        end,
+               local pos = minetest.get_pointed_thing_position(pointed_thing, above)
+               meta.charge = chainsaw_dig_it(pos, user, mata.charge)
+               technic.set_RE_wear(itemstack, meta.charge, chainsaw_max_charge)
+               itemstack:set_metadata(set_item_meta(meta))
+               return itemstack
+       end,
 })
 
 minetest.register_craft({
index f37c4a3c06b98826cf96a51e23d6ed42753e1cc0..e33ee7b51accc851511ef8e33bd957ac86f9020c 100644 (file)
@@ -140,28 +140,26 @@ minetest.register_node("technic:light_off", {
     },
 })
 
-function check_for_flashlight (player)
-if player==nil then return false end
-local inv = player:get_inventory()
-local hotbar=inv:get_list("main")
-               for i=1,8,1 do
-                       
-                       if hotbar[i]:get_name() == "technic:flashlight" then
-                       local item=hotbar[i]:to_table()
-                       local meta=get_item_meta(item["metadata"])
-                       if meta==nil then return false end --flashlight not charghed
-                       if meta["charge"]==nil then return false end
-                       charge=meta["charge"]
-                       if charge-2>0 then
-                        charge =charge-2;
-                       technic.set_RE_wear(item,charge,flashlight_max_charge)
-                       meta["charge"]=charge
-                       item["metadata"]=set_item_meta(meta)
-                       hotbar[i]:replace(item)
-                       inv:set_stack("main",i,hotbar[i])
-                       return true
+function check_for_flashlight(player)
+       if player == nil then
+               return false
+       end
+       local inv = player:get_inventory()
+       local hotbar = inv:get_list("main")
+       for i = 1, 8 do
+               if hotbar[i]:get_name() == "technic:flashlight" then
+                       local meta = get_item_meta(hotbar[i]:get_metadata())
+                       if not meta or not meta.charge then
+                               return false
                        end
+                       if meta.charge - 2 > 0 then
+                               meta.charge = meta.charge - 2;
+                               technic.set_RE_wear(hotbar[i], meta.charge, flashlight_max_charge)
+                               hotbar[i]:set_metadata(set_item_meta(meta))
+                               inv:set_stack("main", i, hotbar[i])
+                               return true
                        end
                end
-return false
+       end
+       return false
 end    
index 4203c2bdce5ce65940dade85409963f884faf177..f20cb642cdd87b8e61d2b4297eb5f948e7a0097b 100644 (file)
@@ -8,28 +8,28 @@ local mining_drill_mk3_power_usage = 1800
 minetest.register_craft({
        output = 'technic:mining_drill',
        recipe = {
-               {'technic:stainless_steel_ingot',       'technic:diamond_drill_head',   'technic:stainless_steel_ingot'},
-               {'technic:stainless_steel_ingot',       'technic:motor',                                'technic:stainless_steel_ingot'},
-               {'',                                                            'technic:red_energy_crystal',   'moreores:copper_ingot'},
+               {'technic:stainless_steel_ingot', 'technic:diamond_drill_head', 'technic:stainless_steel_ingot'},
+               {'technic:stainless_steel_ingot', 'technic:motor',              'technic:stainless_steel_ingot'},
+               {'',                              'technic:red_energy_crystal', 'moreores:copper_ingot'},
        }
 })
 minetest.register_craft({
        output = 'technic:mining_drill_mk2',
        recipe = {
-               {'technic:diamond_drill_head',          'technic:diamond_drill_head',   'technic:diamond_drill_head'},
-               {'technic:stainless_steel_ingot',       'technic:mining_drill',                 'technic:stainless_steel_ingot'},
-               {'',                                                            'technic:green_energy_crystal', ''},
+               {'technic:diamond_drill_head',    'technic:diamond_drill_head',   'technic:diamond_drill_head'},
+               {'technic:stainless_steel_ingot', 'technic:mining_drill',         'technic:stainless_steel_ingot'},
+               {'',                              'technic:green_energy_crystal', ''},
        }
 })
 minetest.register_craft({
        output = 'technic:mining_drill_mk3',
        recipe = {
-               {'technic:diamond_drill_head',          'technic:diamond_drill_head',   'technic:diamond_drill_head'},
-               {'technic:stainless_steel_ingot',       'technic:mining_drill_mk2',     'technic:stainless_steel_ingot'},
-               {'',                                                            'technic:blue_energy_crystal',  ''},
+               {'technic:diamond_drill_head',    'technic:diamond_drill_head',  'technic:diamond_drill_head'},
+               {'technic:stainless_steel_ingot', 'technic:mining_drill_mk2',    'technic:stainless_steel_ingot'},
+               {'',                              'technic:blue_energy_crystal', ''},
        }
 })
-for i=1,4,1 do
+for i = 1, 4 do
        minetest.register_craft({
                output = 'technic:mining_drill_mk3',
                recipe = {
@@ -40,25 +40,23 @@ for i=1,4,1 do
        })
 end
 
-function drill_dig_it (pos, player,drill_type,mode)
-       
+function drill_dig_it(pos, player, drill_type, mode)
        local charge
-
-       if mode==1 then
-               drill_dig_it0 (pos,player)
+       if mode == 1 then
+               drill_dig_it0(pos, player)
        end
        
-       if mode==2 then -- 3 deep
-               dir=drill_dig_it1(player)
-               if dir==0 then -- x+
-                       drill_dig_it0 (pos,player)
-                       pos.x=pos.x+1
-                       drill_dig_it0 (pos,player)
-                       pos.x=pos.x+1
-                       drill_dig_it0 (pos,player)
+       if mode == 2 then -- 3 deep
+               dir = drill_dig_it1(player)
+               if dir == 0 then -- x+
+                       drill_dig_it0(pos, player)
+                       pos.x = pos.x + 1
+                       drill_dig_it0(pos, player)
+                       pos.x = pos.x + 1
+                       drill_dig_it0(pos, player)
                end
-               if dir==1 then  -- x-
-                       drill_dig_it0 (pos,player)
+               if dir == 1 then  -- x-
+                       drill_dig_it0(pos, player)
                        pos.x=pos.x-1
                        drill_dig_it0 (pos,player)
                        pos.x=pos.x-1
@@ -226,22 +224,21 @@ minetest.register_tool("technic:mining_drill", {
        inventory_image = "technic_mining_drill.png",
        stack_max = 1,
        on_use = function(itemstack, user, pointed_thing)
-               if pointed_thing.type=="node" then 
-               local item=itemstack:to_table()
-               local meta=get_item_meta(item["metadata"])
-               if meta==nil then return end --tool not charghed
-               if meta["charge"]==nil then return end
-               local charge=meta["charge"]
-               if charge-mining_drill_power_usage>0 then
-                       charge_to_take=drill_dig_it(minetest.get_pointed_thing_position(pointed_thing, above),user,1,1)
-                       charge =charge-mining_drill_power_usage;
-                       meta["charge"]=charge
-                       item["metadata"]=set_item_meta(meta)
-                       technic.set_RE_wear(item,charge,mining_drill_max_charge)
-                       itemstack:replace(item)
-                       end
-               return itemstack
+               if pointed_thing.type ~= "node" then
+                       return itemstack
+               end
+               local meta = get_item_meta(itemstack:get_metadata())
+               if not meta or not meta.charge then
+                       return
+               end
+               if meta.charge - mining_drill_power_usage > 0 then
+                       local pos = minetest.get_pointed_thing_position(pointed_thing, above)
+                       charge_to_take = drill_dig_it(pos, user, 1, 1)
+                       meta.charge = meta.charge - mining_drill_power_usage
+                       itemstack:set_metadata(set_item_meta(meta))
+                       technic.set_RE_wear(itemstack, meta.charge, mining_drill_max_charge)
                end
+               return itemstack
        end,
 })
 
@@ -249,14 +246,14 @@ minetest.register_tool("technic:mining_drill_mk2", {
        description = "Mining Drill Mk2",
        inventory_image = "technic_mining_drill_mk2.png",
        on_use = function(itemstack, user, pointed_thing)
-       mining_drill_mk2_handler(itemstack,user,pointed_thing)
-       return itemstack
+               mining_drill_mk2_handler(itemstack, user, pointed_thing)
+               return itemstack
        end,
 })
 
 technic.register_power_tool("technic:mining_drill_mk2", mining_drill_mk2_max_charge)
 
-for i=1,4,1 do
+for i = 1, 4 do
        technic.register_power_tool("technic:mining_drill_mk2_"..i, mining_drill_mk2_max_charge)
        minetest.register_tool("technic:mining_drill_mk2_"..i, {
                description = "Mining Drill Mk2 in Mode "..i,
@@ -295,56 +292,54 @@ for i=1,5,1 do
        })
 end
 
-function mining_drill_mk2_handler (itemstack,user,pointed_thing)
-       local keys=user:get_player_control()
-       local player_name=user:get_player_name()
-       local item=itemstack:to_table()
-       local meta=get_item_meta(item["metadata"])
-       if meta==nil or keys["sneak"]==true then return mining_drill_mk2_setmode(user,itemstack) end
-       if meta["mode"]==nil then return mining_drill_mk2_setmode(user,itemstack) end
-       if pointed_thing.type~="node" then return end
-       if meta["charge"]==nil then return end
-       charge=meta["charge"]
-       if charge-mining_drill_power_usage>0 then
-               local charge_to_take=drill_dig_it(minetest.get_pointed_thing_position(pointed_thing, above),user,2,meta["mode"])
-               charge=charge-charge_to_take;
-               if charge<0 then charge=0 end
-               meta["charge"]=charge
-               item["metadata"]=set_item_meta(meta)
-               technic.set_RE_wear(item,charge,mining_drill_mk2_max_charge)
-               itemstack:replace(item)
+function mining_drill_mk2_handler(itemstack, user, pointed_thing)
+       local keys = user:get_player_control()
+       local player_name = user:get_player_name()
+       local meta = get_item_meta(itemstack:get_metadata())
+       if not meta or not meta.mode or keys.sneak then
+               return mining_drill_mk2_setmode(user, itemstack)
+       end
+       if pointed_thing.type ~= "node" or not meta.charge then
+               return
+       end
+       if meta.charge - mining_drill_power_usage > 0 then
+               local pos = minetest.get_pointed_thing_position(pointed_thing, above)
+               local charge_to_take = drill_dig_it(pos, user, 2, meta.mode)
+               meta.charge = meta.charge - charge_to_take
+               meta.charge = math.max(meta.charge, 0)
+               itemstack:set_metadata(set_item_meta(meta))
+               technic.set_RE_wear(itemstack, meta.charge, mining_drill_mk2_max_charge)
        end
        return itemstack
 end
 
-function mining_drill_mk3_handler (itemstack,user,pointed_thing)
-       local keys=user:get_player_control()
-       local player_name=user:get_player_name()
-       local item=itemstack:to_table()
-       local meta=get_item_meta(item["metadata"])
-       if meta==nil or keys["sneak"]==true then return mining_drill_mk3_setmode(user,itemstack) end
-       if meta["mode"]==nil then return mining_drill_mk3_setmode(user,itemstack) end
-       if pointed_thing.type~="node" then return end
-       if meta["charge"]==nil then return end
-       local charge=meta["charge"]
-       if charge-mining_drill_power_usage>0 then
-               local charge_to_take=drill_dig_it(minetest.get_pointed_thing_position(pointed_thing, above),user,3,meta["mode"])
-               charge=charge-charge_to_take;
-               if charge<0 then charge=0 end
-               meta["charge"]=charge
-               item["metadata"]=set_item_meta(meta)
-               technic.set_RE_wear(item,charge,mining_drill_mk3_max_charge)
-               itemstack:replace(item)
+function mining_drill_mk3_handler(itemstack, user, pointed_thing)
+       local keys = user:get_player_control()
+       local player_name = user:get_player_name()
+       local meta = get_item_meta(itemstack:get_metadata())
+       if not meta or not meta.mode or keys.sneak then
+               return mining_drill_mk3_setmode(user, itemstack)
+       end
+       if pointed_thing.type ~= "node" or not meta.charge then
+               return
+       end
+       if meta.charge - mining_drill_power_usage > 0 then
+               local pos = minetest.get_pointed_thing_position(pointed_thing, above)
+               local charge_to_take = drill_dig_it(pos, user, 3, meta.mode)
+               meta.charge = meta.charge - charge_to_take
+               meta.charge = math.max(meta.charge, 0)
+               itemstack:set_metadata(set_item_meta(meta))
+               technic.set_RE_wear(itemstack, meta.charge, mining_drill_mk3_max_charge)
        end
        return itemstack
 end
 
-mining_drill_mode_text={
-{"Single node."},
-{"3 nodes deep."},
-{"3 modes wide."},
-{"3 modes tall."},
-{"3x3 nodes."},
+mining_drill_mode_text = {
+       {"Single node."},
+       {"3 nodes deep."},
+       {"3 modes wide."},
+       {"3 modes tall."},
+       {"3x3 nodes."},
 }
 
 function mining_drill_mk2_setmode(user,itemstack)
index 3d8d55628ab7a08d106d4b76d8dd4118ad66e9aa..4280cf7a7a51be47bf9a5f8707f5f9b796028be0 100644 (file)
@@ -1,52 +1,52 @@
 local laser_mk1_max_charge = 40000
 technic.register_power_tool("technic:laser_mk1", laser_mk1_max_charge)
 
-local laser_shoot = function(itemstack, player, pointed_thing)
-                               local laser_straight_mode=0
-                               local playerpos=player:getpos()
-                               local dir=player:get_look_dir()
-                               if pointed_thing.type=="node" then  
-                                       pos=minetest.get_pointed_thing_position(pointed_thing, above)
-                                       local node = minetest.env:get_node(pos)
-                                       if node.name~="ignore" then
-                                       minetest.node_dig(pos,node,player)
-                                       end
-                                       laser_straight_mode=1
-                                       end     
-                               
-                               direction_y=math.abs(math.floor(dir.y*100))
-                               if direction_y>50 then entity_name="technic:laser_beam_entityV"
-                                       else entity_name="technic:laser_beam_entity" end
-                               
-                               if laser_straight_mode==1  then
-                                       pos1=minetest.get_pointed_thing_position(pointed_thing, under)
-                                       pos1.x=math.floor(pos1.x) 
-                                       pos1.y=math.floor(pos1.y)
-                                       pos1.z=math.floor(pos1.z)
-                                       obj=minetest.env:add_entity(pos1,entity_name)
-                               else
-                               obj=minetest.env:add_entity({x=playerpos.x,y=playerpos.y+1.6,z=playerpos.z},entity_name)
-                               end
-                               if obj:get_luaentity().player == nil then
-                                       obj:get_luaentity().player = player
-                               end
-                               if laser_straight_mode==1 and direction_y<50 then
-                                       obj:setvelocity({x=dir.x*8, y=0, z=dir.z*8})
-                               else if laser_straight_mode==1 and direction_y>50 then
-                                       obj:setvelocity({x=0, y=dir.y*8, z=dir.z*8})
-                                       end
-                               end
-                               if laser_straight_mode==0 then
-                                       obj:setvelocity({x=dir.x*8, y=dir.y*8, z=dir.z*8})
-                                       end
-                               obj:setacceleration({x=0, y=0, z=0})
-                               obj:setyaw(player:get_look_yaw()+math.pi)
-                               if obj:get_luaentity().player == nil then
-                                       obj:get_luaentity().player = player
-                               end
-                               --obj:get_luaentity().node = player:get_inventory():get_stack("main", 1):get_name()
-                               minetest.sound_play("technic_laser", {pos = playerpos, gain = 1.0, max_hear_distance = 10,})
-                               return true
+local laser_shoot = function(player, pointed_thing)
+       local laser_straight_mode=0
+       local playerpos=player:getpos()
+       local dir=player:get_look_dir()
+       if pointed_thing.type=="node" then  
+               pos=minetest.get_pointed_thing_position(pointed_thing, above)
+               local node = minetest.env:get_node(pos)
+               if node.name~="ignore" then
+                       minetest.node_dig(pos,node,player)
+               end
+               laser_straight_mode=1
+       end
+       
+       direction_y=math.abs(math.floor(dir.y*100))
+       if direction_y>50 then entity_name="technic:laser_beam_entityV"
+               else entity_name="technic:laser_beam_entity" end
+       
+       if laser_straight_mode==1  then
+               pos1=minetest.get_pointed_thing_position(pointed_thing, under)
+               pos1.x=math.floor(pos1.x) 
+               pos1.y=math.floor(pos1.y)
+               pos1.z=math.floor(pos1.z)
+               obj=minetest.env:add_entity(pos1,entity_name)
+       else
+       obj=minetest.env:add_entity({x=playerpos.x,y=playerpos.y+1.6,z=playerpos.z},entity_name)
+       end
+       if obj:get_luaentity().player == nil then
+               obj:get_luaentity().player = player
+       end
+       if laser_straight_mode==1 and direction_y<50 then
+               obj:setvelocity({x=dir.x*8, y=0, z=dir.z*8})
+       else if laser_straight_mode==1 and direction_y>50 then
+               obj:setvelocity({x=0, y=dir.y*8, z=dir.z*8})
+               end
+       end
+       if laser_straight_mode==0 then
+               obj:setvelocity({x=dir.x*8, y=dir.y*8, z=dir.z*8})
+               end
+       obj:setacceleration({x=0, y=0, z=0})
+       obj:setyaw(player:get_look_yaw()+math.pi)
+       if obj:get_luaentity().player == nil then
+               obj:get_luaentity().player = player
+       end
+       --obj:get_luaentity().node = player:get_inventory():get_stack("main", 1):get_name()
+       minetest.sound_play("technic_laser", {pos = playerpos, gain = 1.0, max_hear_distance = 10,})
+       return true
 end
 
 
@@ -55,18 +55,15 @@ minetest.register_tool("technic:laser_mk1", {
        inventory_image = "technic_mining_laser_mk1.png",
        stack_max = 1,
        on_use = function(itemstack, user, pointed_thing)
-               item=itemstack:to_table()
-               local meta=get_item_meta(item["metadata"])
-               if meta==nil then return end --tool not charghed
-               if meta["charge"]==nil then return end
-               charge=meta["charge"]
-               if charge-400>0 then
-                laser_shoot(item, user, pointed_thing)
-                charge = charge-400;
-               technic.set_RE_wear(item,charge,laser_mk1_max_charge)
-               meta["charge"]=charge
-               item["metadata"]=set_item_meta(meta)
-               itemstack:replace(item)
+               local meta = get_item_meta(itemstack:get_metadata())
+               if not meta or not meta.charge then
+                       return
+               end
+               if meta.charge - 400 > 0 then
+                       laser_shoot(user, pointed_thing)
+                       meta.charge = meta.charge - 400
+                       technic.set_RE_wear(itemstack, meta.charge, laser_mk1_max_charge)
+                       itemstack:set_metadata(set_item_meta(meta))
                end
                return itemstack
        end,
index 31fa0f976057de006767a730c352baffed231548..7582c8cb5f752e0e779b9467a9c07682d8c5d595 100644 (file)
@@ -2,52 +2,57 @@ local sonic_screwdriver_max_charge = 15000
 technic.register_power_tool("technic:sonic_screwdriver", sonic_screwdriver_max_charge)
 
 minetest.register_tool("technic:sonic_screwdriver", {
-                       description = "Sonic Screwdriver",
-                       inventory_image = "technic_sonic_screwdriver.png",
-                       on_use = function(itemstack, user, pointed_thing)
-                                       -- Must be pointing to facedir applicable node
-                                       if pointed_thing.type~="node" then return end
-                                       local pos=minetest.get_pointed_thing_position(pointed_thing,above)
-                                       local node=minetest.env:get_node(pos)
-                                       local node_name=node.name
-                                               if minetest.registered_nodes[node_name].paramtype2 == "facedir" or minetest.registered_nodes[node_name].paramtype2 == "wallmounted" then
-                                       if node.param2==nil  then return end
-                                       item=itemstack:to_table()
-                                       local meta1=get_item_meta(item["metadata"])
-                                       if meta1==nil then return end --tool not charghed
-                                       if meta1["charge"]==nil then return end
-                                       charge=meta1["charge"]
-                                       if charge-100>0 then
-                                               minetest.sound_play("technic_sonic_screwdriver", {pos = pos, gain = 0.3, max_hear_distance = 10,})
-                                               local n = node.param2
-                                               if minetest.registered_nodes[node_name].paramtype2 == "facedir" then
-                                                  n = n+1
-                                               if n == 4 then n = 0 end
-                                               else
-                                                       n = n+1
-                                                       if n == 6 then n = 0 end
-                                               end
-                                               -- hacky_swap_node, unforunatly.
-                                               local meta = minetest.env:get_meta(pos)
-                                               local meta0 = meta:to_table()
-                                               node.param2 = n
-                                               minetest.env:set_node(pos,node)
-                                               meta = minetest.env:get_meta(pos)
-                                               meta:from_table(meta0)
+       description = "Sonic Screwdriver",
+       inventory_image = "technic_sonic_screwdriver.png",
+       on_use = function(itemstack, user, pointed_thing)
+               -- Must be pointing to facedir applicable node
+               if pointed_thing.type ~= "node" then
+                       return
+               end
+               local pos = minetest.get_pointed_thing_position(pointed_thing, above)
+               local node = minetest.get_node(pos)
+               local node_name = node.name
+               if minetest.registered_nodes[node_name].paramtype2 ~= "facedir" and
+                  minetest.registered_nodes[node_name].paramtype2 ~= "wallmounted" then
+                       return itemstack
+               end
+               if node.param2 == nil then
+                       return
+               end
+               local meta1 = get_item_meta(itemstack:get_metadata())
+               if not meta1 or not meta1.charge then
+                       return
+               end
+               if meta1.charge - 100 > 0 then
+                       minetest.sound_play("technic_sonic_screwdriver",
+                                       {pos = pos, gain = 0.3, max_hear_distance = 10})
+                       local p = node.param2
+                       if minetest.registered_nodes[node_name].paramtype2 == "facedir" then
+                               p = p + 1
+                               if p == 4 then
+                                       p = 0
+                               end
+                       else
+                               p = p + 1
+                               if p == 6 then
+                                       p = 0
+                               end
+                       end
+                       -- hacky_swap_node, unforunatly.
+                       local meta = minetest.get_meta(pos)
+                       local meta0 = meta:to_table()
+                       node.param2 = p
+                       minetest.set_node(pos, node)
+                       meta = minetest.get_meta(pos)
+                       meta:from_table(meta0)
 
-                                               charge=charge-100;  
-                                               meta1["charge"]=charge
-                                               item["metadata"]=set_item_meta(meta1)
-                                               technic.set_RE_wear(item,charge,sonic_screwdriver_max_charge)
-                                               itemstack:replace(item)
-                                               end
-                                               return itemstack
-                                               else
-                                               return itemstack
-                                               end
-                                               end,
-                
-       })
+                       meta1.charge = meta1.charge - 100  
+                       itemstack:set_metadata(set_item_meta(meta1))
+                       technic.set_RE_wear(itemstack, meta1.charge, sonic_screwdriver_max_charge)
+               end
+               return itemstack
+       end, 
+})
  
 minetest.register_craft({
        output = "technic:sonic_screwdriver",