From eac48441754260fe42c7a605e72141a79ed79bc1 Mon Sep 17 00:00:00 2001 From: ShadowNinja Date: Fri, 18 Oct 2013 22:22:39 -0400 Subject: [PATCH] Fix negative tool discharging and a few other tweaks... 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 | 2 +- technic/machines/register/battery_box.lua | 129 ++++++++--------- technic/register.lua | 6 +- technic/tools/cans.lua | 145 ++++++++++--------- technic/tools/chainsaw.lua | 41 +++--- technic/tools/flashlight.lua | 40 +++--- technic/tools/mining_drill.lua | 165 +++++++++++----------- technic/tools/mining_laser_mk1.lua | 113 ++++++++------- technic/tools/sonic_screwdriver.lua | 95 +++++++------ 9 files changed, 362 insertions(+), 374 deletions(-) diff --git a/technic/config.lua b/technic/config.lua index 668e7db..db3dfaf 100644 --- a/technic/config.lua +++ b/technic/config.lua @@ -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", diff --git a/technic/machines/register/battery_box.lua b/technic/machines/register/battery_box.lua index 6264672..a1d9b00 100644 --- a/technic/machines/register/battery_box.lua +++ b/technic/machines/register/battery_box.lua @@ -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 - return charge -- return the remaining charge in the battery + 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 + 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 - - -- 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 + if inv:is_empty("dst") then + return batt_charge end - return charge -- return the remaining charge in the battery + 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 or batt_charge >= max_charge then + return batt_charge + end + 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 diff --git a/technic/register.lua b/technic/register.lua index 38766d9..288db57 100644 --- a/technic/register.lua +++ b/technic/register.lua @@ -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 diff --git a/technic/tools/cans.lua b/technic/tools/cans.lua index 6a98ce9..e95b144 100644 --- a/technic/tools/cans.lua +++ b/technic/tools/cans.lua @@ -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) - 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) - return itemstack - end + node = minetest.get_node(pointed_thing.under) - 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) + 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 + end + 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 + + 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, }) @@ -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) - end - return itemstack + node = minetest.get_node(pointed_thing.under) + local charge = 0 + if itemstack:get_metadata() == "" then + charge = 0 + else + charge = tonumber(itemstack:get_metadata()) 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) - return itemstack - 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) + 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 + end + 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 + + 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, }) diff --git a/technic/tools/chainsaw.lua b/technic/tools/chainsaw.lua index 785cf3e..833f830 100644 --- a/technic/tools/chainsaw.lua +++ b/technic/tools/chainsaw.lua @@ -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({ diff --git a/technic/tools/flashlight.lua b/technic/tools/flashlight.lua index f37c4a3..e33ee7b 100644 --- a/technic/tools/flashlight.lua +++ b/technic/tools/flashlight.lua @@ -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 diff --git a/technic/tools/mining_drill.lua b/technic/tools/mining_drill.lua index 4203c2b..f20cb64 100644 --- a/technic/tools/mining_drill.lua +++ b/technic/tools/mining_drill.lua @@ -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) diff --git a/technic/tools/mining_laser_mk1.lua b/technic/tools/mining_laser_mk1.lua index 3d8d556..4280cf7 100644 --- a/technic/tools/mining_laser_mk1.lua +++ b/technic/tools/mining_laser_mk1.lua @@ -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, diff --git a/technic/tools/sonic_screwdriver.lua b/technic/tools/sonic_screwdriver.lua index 31fa0f9..7582c8c 100644 --- a/technic/tools/sonic_screwdriver.lua +++ b/technic/tools/sonic_screwdriver.lua @@ -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",