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
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",
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
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
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,
})
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,
})
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({
},
})
-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
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 = {
})
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
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,
})
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,
})
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)
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
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,
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",