diff --git a/technic/battery_box.lua b/technic/battery_box.lua index d36bca1..0e08d74 100644 --- a/technic/battery_box.lua +++ b/technic/battery_box.lua @@ -18,19 +18,12 @@ power_tools[registered_power_tools_count].tool_name=string1 power_tools[registered_power_tools_count].max_charge=max_charge end -register_power_tool ("technic:mining_drill",60000) -register_power_tool ("technic:chainsaw",30000) -register_power_tool ("technic:laser_mk1",40000) + register_power_tool ("technic:battery",10000) -register_power_tool ("technic:sonic_screwdriver",15000) -register_power_tool ("technic:flashlight",30000) register_power_tool ("technic:red_energy_crystal",100000) register_power_tool ("technic:green_energy_crystal",250000) register_power_tool ("technic:blue_energy_crystal",500000) -minetest.register_alias("battery", "technic:battery") -minetest.register_alias("battery_box", "technic:battery_box") - minetest.register_craft({ output = 'technic:battery 1', recipe = { @@ -143,7 +136,6 @@ minetest.register_node("technic:battery_box"..i, { }) end - LV_nodes_visited = {} function get_RE_item_load (load1,max_load) @@ -163,13 +155,12 @@ end function set_RE_wear (item_stack,load1,max_load) local temp=65536-math.floor(load1/max_load*65535) item_stack["wear"]=tostring(temp) -return item_stack +return item_stack end minetest.register_abm({ nodenames = {"technic:battery_box","technic:battery_box1","technic:battery_box2","technic:battery_box3","technic:battery_box4", - "technic:battery_box5","technic:battery_box6","technic:battery_box7","technic:battery_box8" - }, + "technic:battery_box5","technic:battery_box6","technic:battery_box7","technic:battery_box8"}, interval = 1, chance = 1, action = function(pos, node, active_object_count, active_object_count_wider) @@ -185,51 +176,73 @@ minetest.register_abm({ meta:set_float("last_side_shown",i) end ---loading registered power tools +--loading registered power tools local inv = meta:get_inventory() if inv:is_empty("src")==false then - srcstack = inv:get_stack("src", 1) - src_item=srcstack:to_table() - item_meta=srcstack:get_metadata() - if src_item["metadata"]=="" then src_item["metadata"]="0" end --create meta for not used before tool/item + local srcstack = inv:get_stack("src", 1) + local src_item=srcstack:to_table() + local src_meta=get_item_meta(src_item["metadata"]) - local item_max_charge = nil - local counter=registered_power_tools_count - for i=1, counter,1 do - if power_tools[i].tool_name==src_item["name"] then - item_max_charge=power_tools[i].max_charge + local item_max_charge=nil + for i=1,registered_power_tools_count,1 do + if power_tools[i].tool_name==src_item["name"] then + src_meta=get_item_meta(src_item["metadata"]) + if src_meta==nil then + src_meta={} + src_meta["technic_power_tool"]=true + src_meta["charge"]=0 + else + if src_meta["technic_power_tool"]==nil then + src_meta["technic_power_tool"]=true + src_meta["charge"]=0 + end + end + item_max_charge=power_tools[i].max_charge + end end - end - if item_max_charge then - load1=tonumber((src_item["metadata"])) - load_step=1000 - if load10 then - if charge-load_step<0 then load_step=charge end - if load1+load_step>item_max_charge then load_step=item_max_charge-load1 end - load1=load1+load_step - charge=charge-load_step - set_RE_wear(src_item,load1,item_max_charge) - src_item["metadata"]=tostring(load1) - inv:set_stack("src", 1, src_item) - end - meta:set_int("battery_charge",charge) - end + + if item_max_charge then + load1=src_meta["charge"] + load_step=1000 + if load10 then + if charge-load_step<0 then load_step=charge end + if load1+load_step>item_max_charge then load_step=item_max_charge-load1 end + load1=load1+load_step + charge=charge-load_step + set_RE_wear(src_item,load1,item_max_charge) + src_meta["charge"]=load1 + src_item["metadata"]=set_item_meta(src_meta) + inv:set_stack("src", 1, src_item) + end + meta:set_int("battery_charge",charge) + end end -- dischargin registered power tools if inv:is_empty("dst") == false then srcstack = inv:get_stack("dst", 1) src_item=srcstack:to_table() - local item_max_charge = nil - local counter=registered_power_tools_count-1 - for i=1, counter,1 do - if power_tools[i].tool_name==src_item["name"] then - item_max_charge=power_tools[i].max_charge - end + local src_meta=get_item_meta(src_item["metadata"]) + local item_max_charge=nil + for i=1,registered_power_tools_count,1 do + if power_tools[i].tool_name==src_item["name"] then + src_meta=get_item_meta(src_item["metadata"]) + if src_meta==nil then + src_meta={} + src_meta["technic_power_tool"]=true + src_meta["charge"]=0 + else + if src_meta["technic_power_tool"]==nil then + src_meta["technic_power_tool"]=true + src_meta["charge"]=0 + end + end + item_max_charge=power_tools[i].max_charge + end end + if item_max_charge then - if src_item["metadata"]=="" then src_item["metadata"]="0" end --create meta for not used before battery/crystal - local load1=tonumber((src_item["metadata"])) + local load1=src_meta["charge"] load_step=1000 if load1>0 and chargemax_charge then load_step=max_charge-charge end @@ -237,7 +250,8 @@ minetest.register_abm({ load1=load1-load_step charge=charge+load_step set_RE_wear(src_item,load1,item_max_charge) - src_item["metadata"]=tostring(load1) + src_meta["charge"]=load1 + src_item["metadata"]=set_item_meta(src_meta) inv:set_stack("dst", 1, src_item) end end @@ -247,18 +261,10 @@ minetest.register_abm({ local load = math.floor(charge/60000 * 100) meta:set_string("formspec", - "invsize[8,9;]".. + battery_box_formspec.. "image[1,1;1,2;technic_power_meter_bg.png^[lowpart:".. - (load)..":technic_power_meter_fg.png]".. - "list[current_name;src;3,1;1,1;]".. - "image[4,1;1,1;technic_battery_reload.png]".. - "list[current_name;dst;5,1;1,1;]".. - "label[0,0;Battery box]".. - "label[3,0;Charge]".. - "label[5,0;Discharge]".. - "label[1,3;Power level]".. - "list[current_player;main;0,5;8,4;]") - + (load)..":technic_power_meter_fg.png]") + local pos1={} pos1.y=pos.y-1 @@ -269,15 +275,15 @@ minetest.register_abm({ meta1 = minetest.env:get_meta(pos1) if meta1:get_float("cablelike")~=1 then return end - local LV_nodes = {} - local PR_nodes = {} - local RE_nodes = {} + local LV_nodes = {} + local PR_nodes = {} + local RE_nodes = {} - LV_nodes[1]={} - LV_nodes[1].x=pos1.x - LV_nodes[1].y=pos1.y - LV_nodes[1].z=pos1.z - LV_nodes[1].visited=false + LV_nodes[1]={} + LV_nodes[1].x=pos1.x + LV_nodes[1].y=pos1.y + LV_nodes[1].z=pos1.z + LV_nodes[1].visited=false table_index=1 @@ -344,45 +350,45 @@ end }) function add_new_cable_node (LV_nodes,pos1) -local i=1 + local i=1 repeat if LV_nodes[i]==nil then break end if pos1.x==LV_nodes[i].x and pos1.y==LV_nodes[i].y and pos1.z==LV_nodes[i].z then return false end i=i+1 until false -LV_nodes[i]={} -LV_nodes[i].x=pos1.x -LV_nodes[i].y=pos1.y -LV_nodes[i].z=pos1.z -LV_nodes[i].visited=false -return true + LV_nodes[i]={} + LV_nodes[i].x=pos1.x + LV_nodes[i].y=pos1.y + LV_nodes[i].z=pos1.z + LV_nodes[i].visited=false + return true end function check_LV_node (PR_nodes,RE_nodes,LV_nodes,i) - local pos1={} - pos1.x=LV_nodes[i].x - pos1.y=LV_nodes[i].y - pos1.z=LV_nodes[i].z - LV_nodes[i].visited=true - new_node_added=false - - pos1.x=pos1.x+1 - check_LV_node_subp (PR_nodes,RE_nodes,LV_nodes,pos1) - pos1.x=pos1.x-2 - check_LV_node_subp (PR_nodes,RE_nodes,LV_nodes,pos1) - pos1.x=pos1.x+1 - - pos1.y=pos1.y+1 - check_LV_node_subp (PR_nodes,RE_nodes,LV_nodes,pos1) - pos1.y=pos1.y-2 - check_LV_node_subp (PR_nodes,RE_nodes,LV_nodes,pos1) - pos1.y=pos1.y+1 + local pos1={} + pos1.x=LV_nodes[i].x + pos1.y=LV_nodes[i].y + pos1.z=LV_nodes[i].z + LV_nodes[i].visited=true + new_node_added=false - pos1.z=pos1.z+1 - check_LV_node_subp (PR_nodes,RE_nodes,LV_nodes,pos1) - pos1.z=pos1.z-2 - check_LV_node_subp (PR_nodes,RE_nodes,LV_nodes,pos1) - pos1.z=pos1.z+1 + pos1.x=pos1.x+1 + check_LV_node_subp (PR_nodes,RE_nodes,LV_nodes,pos1) + pos1.x=pos1.x-2 + check_LV_node_subp (PR_nodes,RE_nodes,LV_nodes,pos1) + pos1.x=pos1.x+1 + + pos1.y=pos1.y+1 + check_LV_node_subp (PR_nodes,RE_nodes,LV_nodes,pos1) + pos1.y=pos1.y-2 + check_LV_node_subp (PR_nodes,RE_nodes,LV_nodes,pos1) + pos1.y=pos1.y+1 + + pos1.z=pos1.z+1 + check_LV_node_subp (PR_nodes,RE_nodes,LV_nodes,pos1) + pos1.z=pos1.z-2 + check_LV_node_subp (PR_nodes,RE_nodes,LV_nodes,pos1) + pos1.z=pos1.z+1 return new_node_added end diff --git a/technic/battery_box_mv.lua b/technic/battery_box_mv.lua index b8f4e5e..8fc6dc7 100644 --- a/technic/battery_box_mv.lua +++ b/technic/battery_box_mv.lua @@ -85,7 +85,7 @@ minetest.register_node("technic:mv_battery_box"..i, { battery_charge = 0 max_charge = 300000 last_side_shown=0 - end, + end, can_dig = function(pos,player) local meta = minetest.env:get_meta(pos); local inv = meta:get_inventory() @@ -122,51 +122,73 @@ minetest.register_abm({ meta:set_float("last_side_shown",i) end ---loading registered power tools +--loading registered power tools local inv = meta:get_inventory() if inv:is_empty("src")==false then - srcstack = inv:get_stack("src", 1) - src_item=srcstack:to_table() - item_meta=srcstack:get_metadata() - if src_item["metadata"]=="" then src_item["metadata"]="0" end --create meta for not used before tool/item + local srcstack = inv:get_stack("src", 1) + local src_item=srcstack:to_table() + local src_meta=get_item_meta(src_item["metadata"]) - local item_max_charge = nil - local counter=registered_power_tools_count - for i=1, counter,1 do - if power_tools[i].tool_name==src_item["name"] then - item_max_charge=power_tools[i].max_charge + local item_max_charge=nil + for i=1,registered_power_tools_count,1 do + if power_tools[i].tool_name==src_item["name"] then + src_meta=get_item_meta(src_item["metadata"]) + if src_meta==nil then + src_meta={} + src_meta["technic_power_tool"]=true + src_meta["charge"]=0 + else + if src_meta["technic_power_tool"]==nil then + src_meta["technic_power_tool"]=true + src_meta["charge"]=0 + end + end + item_max_charge=power_tools[i].max_charge + end end - end - if item_max_charge then - load1=tonumber((src_item["metadata"])) - load_step=4000 - if load10 then - if charge-load_step<0 then load_step=charge end - if load1+load_step>item_max_charge then load_step=item_max_charge-load1 end - load1=load1+load_step - charge=charge-load_step - set_RE_wear(src_item,load1,item_max_charge) - src_item["metadata"]=tostring(load1) - inv:set_stack("src", 1, src_item) - end - meta:set_int("battery_charge",charge) - end + + if item_max_charge then + load1=src_meta["charge"] + load_step=4000 + if load10 then + if charge-load_step<0 then load_step=charge end + if load1+load_step>item_max_charge then load_step=item_max_charge-load1 end + load1=load1+load_step + charge=charge-load_step + set_RE_wear(src_item,load1,item_max_charge) + src_meta["charge"]=load1 + src_item["metadata"]=set_item_meta(src_meta) + inv:set_stack("src", 1, src_item) + end + meta:set_int("battery_charge",charge) + end end -- dischargin registered power tools if inv:is_empty("dst") == false then srcstack = inv:get_stack("dst", 1) src_item=srcstack:to_table() - local item_max_charge = nil - local counter=registered_power_tools_count-1 - for i=1, counter,1 do - if power_tools[i].tool_name==src_item["name"] then - item_max_charge=power_tools[i].max_charge - end + local src_meta=get_item_meta(src_item["metadata"]) + local item_max_charge=nil + for i=1,registered_power_tools_count,1 do + if power_tools[i].tool_name==src_item["name"] then + src_meta=get_item_meta(src_item["metadata"]) + if src_meta==nil then + src_meta={} + src_meta["technic_power_tool"]=true + src_meta["charge"]=0 + else + if src_meta["technic_power_tool"]==nil then + src_meta["technic_power_tool"]=true + src_meta["charge"]=0 + end + end + item_max_charge=power_tools[i].max_charge + end end + if item_max_charge then - if src_item["metadata"]=="" then src_item["metadata"]="0" end --create meta for not used before battery/crystal - local load1=tonumber((src_item["metadata"])) + local load1=src_meta["charge"] load_step=4000 if load1>0 and chargemax_charge then load_step=max_charge-charge end @@ -174,7 +196,8 @@ minetest.register_abm({ load1=load1-load_step charge=charge+load_step set_RE_wear(src_item,load1,item_max_charge) - src_item["metadata"]=tostring(load1) + src_meta["charge"]=load1 + src_item["metadata"]=set_item_meta(src_meta) inv:set_stack("dst", 1, src_item) end end @@ -182,19 +205,12 @@ minetest.register_abm({ meta:set_int("battery_charge",charge) - local load = math.floor(charge/300000 * 100) + local load = math.floor((charge/300000) * 100) meta:set_string("formspec", - "invsize[8,9;]".. + mv_battery_box_formspec.. "image[1,1;1,2;technic_power_meter_bg.png^[lowpart:".. - (load)..":technic_power_meter_fg.png]".. - "list[current_name;src;3,1;1,1;]".. - "image[4,1;1,1;technic_battery_reload.png]".. - "list[current_name;dst;5,1;1,1;]".. - "label[0,0;MV Battery box]".. - "label[3,0;Charge]".. - "label[5,0;Discharge]".. - "label[1,3;Power level]".. - "list[current_player;main;0,5;8,4;]") + (load)..":technic_power_meter_fg.png]" + ) local pos1={} diff --git a/technic/cans.lua b/technic/cans.lua index d50a621..78ff413 100644 --- a/technic/cans.lua +++ b/technic/cans.lua @@ -77,19 +77,20 @@ 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"]) end - if n.name == "default:water_source" then + if n.name == "default:lava_source" then if load+1<17 then minetest.env:add_node(pointed_thing.under, {name="air"}) - load=load+1; + load=load+1; item["metadata"]=tostring(load) - set_RE_wear(item,load,water_can_max_load) + set_RE_wear(item,load,lava_can_max_load) itemstack:replace(item) end return itemstack @@ -101,7 +102,7 @@ minetest.register_tool("technic:lava_can", { minetest.env:add_node(pointed_thing.under, {name="default:lava_source"}) load=load-1; item["metadata"]=tostring(load) - set_RE_wear(item,load,water_can_max_load) + set_RE_wear(item,load,lava_can_max_load) itemstack:replace(item) return itemstack end @@ -111,52 +112,9 @@ minetest.register_tool("technic:lava_can", { minetest.env:add_node(pointed_thing.above, {name="default:lava_source"}) load=load-1; item["metadata"]=tostring(load) - set_RE_wear(item,load,water_can_max_load) + set_RE_wear(item,load,lava_can_max_load) itemstack:replace(item) return itemstack end - - if pointed_thing.type ~= "node" then - return end - - n = minetest.env:get_node(pointed_thing.under) - if n.name == "default:lava_source" then - item=itemstack:to_table() - local load=tonumber((item["wear"])) - if load==0 then load =65535 end - load=get_RE_item_load(load,lava_can_max_load) - if load+1<9 then - minetest.env:add_node(pointed_thing.under, {name="air"}) - load=load+1; - load=set_RE_item_load(load,lava_can_max_load) - item["wear"]=tostring(load) - itemstack:replace(item) - end - return itemstack - end - item=itemstack:to_table() - load=tonumber((item["wear"])) - if load==0 then load =65535 end - load=get_RE_item_load(load,lava_can_max_load) - 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; - load=set_RE_item_load(load,lava_can_max_load) - item["wear"]=tostring(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; - load=set_RE_item_load(load,lava_can_max_load) - item["wear"]=tostring(load) - itemstack:replace(item) - return itemstack - end end, }) diff --git a/technic/chainsaw.lua b/technic/chainsaw.lua index 9970935..eb12732 100644 --- a/technic/chainsaw.lua +++ b/technic/chainsaw.lua @@ -1,4 +1,5 @@ chainsaw_max_charge=30000 +register_power_tool ("technic:chainsaw",chainsaw_max_charge) minetest.register_tool("technic:chainsaw", { description = "Chainsaw", @@ -7,14 +8,17 @@ minetest.register_tool("technic:chainsaw", { on_use = function(itemstack, user, pointed_thing) if pointed_thing.type=="node" then item=itemstack:to_table() - if item["metadata"]=="" or item["metadata"]=="0" then return end --tool not charged - charge=tonumber(item["metadata"]) + local meta=get_item_meta(item["metadata"]) + if meta==nil then return false end --tool not charghed + if meta["charge"]==nil then return false end + charge=meta["charge"] charge_to_take=600; if charge-charge_to_take>0 then charge_to_take=chainsaw_dig_it(minetest.get_pointed_thing_position(pointed_thing, above),user,charge_to_take) charge=charge-charge_to_take; set_RE_wear(item,charge,chainsaw_max_charge) - item["metadata"]=tostring(charge) + meta["charge"]=charge + item["metadata"]=set_item_meta(meta) itemstack:replace(item) return itemstack end @@ -56,4 +60,4 @@ function chainsaw_dig_it (pos, player,charge_to_take) end return charge_to_take -end \ No newline at end of file +end diff --git a/technic/flashlight.lua b/technic/flashlight.lua index e773cfc..f6e4dc2 100644 --- a/technic/flashlight.lua +++ b/technic/flashlight.lua @@ -1,23 +1,25 @@ -- original code comes from walkin_light mod by Echo http://minetest.net/forum/viewtopic.php?id=2621 flashlight_max_charge=30000 +register_power_tool ("technic:flashlight",flashlight_max_charge) - minetest.register_tool("technic:flashlight", { - description = "Flashlight", - inventory_image = "technic_flashlight.png", +minetest.register_tool("technic:flashlight", { + description = "Flashlight", + inventory_image = "technic_flashlight.png", stack_max = 1, - on_use = function(itemstack, user, pointed_thing) - end, - }) - - minetest.register_craft({ - output = "technic:flashlight", - recipe = { - {"technic:rubber","glass","technic:rubber"}, - {"technic:stainless_steel_ingot","technic:battery","technic:stainless_steel_ingot"}, - {"","technic:battery",""} - } - }) + on_use = function(itemstack, user, pointed_thing) + end, + }) + +minetest.register_craft({ +output = "technic:flashlight", +recipe = { + {"technic:rubber","glass","technic:rubber"}, + {"technic:stainless_steel_ingot","technic:battery","technic:stainless_steel_ingot"}, + {"","technic:battery",""} + } +}) + local players = {} local player_positions = {} local last_wielded = {} @@ -152,13 +154,16 @@ local hotbar=inv:get_list("main") for i=1,8,1 do if hotbar[i]:get_name() == "technic:flashlight" then - item=hotbar[i]:to_table() - if item["metadata"]=="" or item["metadata"]=="0" then return false end --flashlight not charghed - charge=tonumber(item["metadata"]) + 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; set_RE_wear(item,charge,flashlight_max_charge) - item["metadata"]=tostring(charge) + meta["charge"]=charge + item["metadata"]=set_item_meta(meta) hotbar[i]:replace(item) inv:set_stack("main",i,hotbar[i]) return true diff --git a/technic/helpers.lua b/technic/helpers.lua new file mode 100644 index 0000000..3fee5bb --- /dev/null +++ b/technic/helpers.lua @@ -0,0 +1,10 @@ +function get_item_meta (string) + if string.find(string, "return {") then + return minetest.deserialize(string) + else return nil + end +end + +function set_item_meta (table) + return minetest.serialize(table) +end diff --git a/technic/init.lua b/technic/init.lua index 0706b0f..8ffa9c7 100644 --- a/technic/init.lua +++ b/technic/init.lua @@ -1,9 +1,11 @@ --- Minetest 0.4.4 : technic +-- Minetest 0.4.4d1 : technic modpath=minetest.get_modpath("technic") --Read technic config file dofile(modpath.."/config.lua") +--helper functions +dofile(modpath.."/helpers.lua") -- world gen dofile(modpath.."/ores.lua") diff --git a/technic/mining_drill.lua b/technic/mining_drill.lua index 4ccfc95..ecaab65 100644 --- a/technic/mining_drill.lua +++ b/technic/mining_drill.lua @@ -1,25 +1,9 @@ mining_drill_max_charge=60000 - -minetest.register_tool("technic:mining_drill", { - description = "Mining Drill", - inventory_image = "technic_mining_drill.png", - stack_max = 1, - on_use = function(itemstack, user, pointed_thing) - if pointed_thing.type=="node" then - item=itemstack:to_table() - if item["metadata"]=="" or item["metadata"]=="0" then return end --tool not charged - charge=tonumber(item["metadata"]) - if charge-200>0 then - drill_dig_it(minetest.get_pointed_thing_position(pointed_thing, above),user) - charge =charge-200; - item["metadata"]=tostring(charge) - set_RE_wear(item,charge,mining_drill_max_charge) - itemstack:replace(item) - end - return itemstack - end - end, -}) +mining_drill_mk2_max_charge=240000 +mining_drill_mk3_max_charge=960000 +mining_drill_power_usage=200 +mining_drill_mk2_power_usage=600 +mining_drill_mk3_power_usage=1800 minetest.register_craft({ output = 'technic:mining_drill', @@ -29,21 +13,373 @@ minetest.register_craft({ {'', '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', ''}, + } +}) +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', ''}, + } +}) +function drill_dig_it (pos, player,drill_type,mode) + + local charge + 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) + end + 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 + drill_dig_it0 (pos,player) + end + if dir==2 then -- z+ + drill_dig_it0 (pos,player) + pos.z=pos.z+1 + drill_dig_it0 (pos,player) + pos.z=pos.z+1 + drill_dig_it0 (pos,player) + end + if dir==3 then -- z- + drill_dig_it0 (pos,player) + pos.z=pos.z+1 + drill_dig_it0 (pos,player) + pos.z=pos.z+1 + drill_dig_it0 (pos,player) + end + end + + if mode==3 then -- 3 wide + dir=drill_dig_it1(player) + if dir==0 or dir==1 then -- x + drill_dig_it0 (pos,player) + pos.z=pos.z+1 + drill_dig_it0 (pos,player) + pos.z=pos.z-2 + drill_dig_it0 (pos,player) + end + if dir==2 or dir==3 then -- z + drill_dig_it0 (pos,player) + pos.x=pos.x+1 + drill_dig_it0 (pos,player) + pos.x=pos.x-2 + drill_dig_it0 (pos,player) + end + end + + if mode==4 then -- 3 tall, selected in the middle + drill_dig_it0 (pos,player) + pos.y=pos.y+1 + drill_dig_it0 (pos,player) + pos.y=pos.y-2 + drill_dig_it0 (pos,player) + end + if mode==5 then -- 3 x 3 + local dir=player:get_look_dir() + if math.abs(dir.y)<0.5 then + dir=drill_dig_it1(player) + if dir==0 or dir==1 then -- x + drill_dig_it2(pos,player) + end + if dir==2 or dir==3 then -- z + drill_dig_it3(pos,player) + end + else + drill_dig_it4(pos,player) + end + end + + if drill_type==1 then charge=mining_drill_power_usage end + if drill_type==2 then + if mode==1 then charge=mining_drill_mk2_power_usage end + if (mode==2 or mode==3 or mode==4) then charge=mining_drill_mk2_power_usage*3 end + end + if drill_type==3 then + if mode==1 then charge=mining_drill_power_usage end + if (mode==2 or mode==3 or mode==4) then charge=mining_drill_mk2_power_usage*6 end + if mode==5 then charge=mining_drill_mk2_power_usage*9 end + end + minetest.sound_play("mining_drill", {pos = pos, gain = 1.0, max_hear_distance = 10,}) + return charge +end - - -function drill_dig_it (pos, player) +function drill_dig_it0 (pos,player) local node=minetest.env:get_node(pos) if node.name == "air" or node.name == "ignore" then return end if node.name == "default:lava_source" then return end if node.name == "default:lava_flowing" then return end if node.name == "default:water_source" then minetest.env:remove_node(pos) return end if node.name == "default:water_flowing" then minetest.env:remove_node(pos) return end - - minetest.sound_play("mining_drill", {pos = pos, gain = 1.0, max_hear_distance = 10,}) minetest.node_dig(pos,node,player) +end -end \ No newline at end of file +function drill_dig_it1 (player) + local dir=player:get_look_dir() + if math.abs(dir.x)>math.abs(dir.z) then + if dir.x>0 then return 0 end + return 1 + end + if dir.z>0 then return 2 end + return 3 +end + +function drill_dig_it2 (pos,player) + drill_dig_it0 (pos,player) + pos.z=pos.z+1 + drill_dig_it0 (pos,player) + pos.z=pos.z-2 + drill_dig_it0 (pos,player) + pos.z=pos.z+1 + pos.y=pos.y+1 + drill_dig_it0 (pos,player) + pos.z=pos.z+1 + drill_dig_it0 (pos,player) + pos.z=pos.z-2 + drill_dig_it0 (pos,player) + pos.z=pos.z+1 + pos.y=pos.y-2 + drill_dig_it0 (pos,player) + pos.z=pos.z+1 + drill_dig_it0 (pos,player) + pos.z=pos.z-2 + drill_dig_it0 (pos,player) +end +function drill_dig_it3 (pos,player) + drill_dig_it0 (pos,player) + pos.x=pos.x+1 + drill_dig_it0 (pos,player) + pos.x=pos.x-2 + drill_dig_it0 (pos,player) + pos.x=pos.x+1 + pos.y=pos.y+1 + drill_dig_it0 (pos,player) + pos.x=pos.x+1 + drill_dig_it0 (pos,player) + pos.x=pos.x-2 + drill_dig_it0 (pos,player) + pos.x=pos.x+1 + pos.y=pos.y-2 + drill_dig_it0 (pos,player) + pos.x=pos.x+1 + drill_dig_it0 (pos,player) + pos.x=pos.x-2 + drill_dig_it0 (pos,player) +end + +function drill_dig_it4 (pos,player) + drill_dig_it0 (pos,player) + pos.x=pos.x+1 + drill_dig_it0 (pos,player) + pos.x=pos.x-2 + drill_dig_it0 (pos,player) + pos.x=pos.x+1 + pos.z=pos.z+1 + drill_dig_it0 (pos,player) + pos.x=pos.x+1 + drill_dig_it0 (pos,player) + pos.x=pos.x-2 + drill_dig_it0 (pos,player) + pos.x=pos.x+1 + pos.z=pos.z-2 + drill_dig_it0 (pos,player) + pos.x=pos.x+1 + drill_dig_it0 (pos,player) + pos.x=pos.x-2 + drill_dig_it0 (pos,player) +end + +register_power_tool ("technic:mining_drill",mining_drill_max_charge) +minetest.register_tool("technic:mining_drill", { + description = "Mining Drill Mk1", + inventory_image = "technic_mining_drill.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 false end --tool not charghed + if meta["charge"]==nil then return false end + 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) + set_RE_wear(item,charge,mining_drill_max_charge) + itemstack:replace(item) + end + return itemstack + end + end, +}) + +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 + end, +}) +register_power_tool ("technic:mining_drill_mk2",mining_drill_mk2_max_charge) + +for i=1,4,1 do +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, + inventory_image = "technic_mining_drill_mk2.png^technic_tool_mode"..i..".png", + wield_image = "technic_mining_drill_mk2.png", + groups = {not_in_creative_inventory=1}, + on_use = function(itemstack, user, pointed_thing) + mining_drill_mk2_handler(itemstack,user,pointed_thing) + return itemstack + end, +}) +end + +minetest.register_tool("technic:mining_drill_mk3", { + description = "Mining Drill Mk3", + inventory_image = "technic_mining_drill_mk3.png", + on_use = function(itemstack, user, pointed_thing) + mining_drill_mk3_handler(itemstack,user,pointed_thing) + return itemstack + end, +}) +register_power_tool ("technic:mining_drill_mk3",mining_drill_mk3_max_charge) + +for i=1,5,1 do +register_power_tool ("technic:mining_drill_mk3_"..i,mining_drill_mk3_max_charge) +minetest.register_tool("technic:mining_drill_mk3_"..i, { + description = "Mining Drill Mk3 in Mode "..i, + inventory_image = "technic_mining_drill_mk3.png^technic_tool_mode"..i..".png", + wield_image = "technic_mining_drill_mk3.png", + groups = {not_in_creative_inventory=1}, + on_use = function(itemstack, user, pointed_thing) + mining_drill_mk3_handler(itemstack,user,pointed_thing) + return itemstack + end, +}) +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() + 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 false 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) + set_RE_wear(item,charge,mining_drill_mk2_max_charge) + itemstack:replace(item) + 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() + 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 false end + charge=meta["charge"] + if charge-mining_drill_power_usage>0 then + print(dump(meta)) + 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) + set_RE_wear(item,charge,mining_drill_mk3_max_charge) + itemstack:replace(item) + end + return itemstack +end + +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 player_name=user:get_player_name() + local item=itemstack:to_table() + local meta=get_item_meta(item["metadata"]) + if meta==nil then + meta={} + mode=0 + end + if meta["mode"]==nil then + minetest.chat_send_player(player_name,"Hold shift and use to change Mining Drill Mk2 modes.") + meta["mode"]=0 + mode=0 + end + mode=(meta["mode"]) + mode=mode+1 + if mode>=5 then mode=1 end + minetest.chat_send_player(player_name, "Mining Drill Mk2 mode : "..mode.." - "..mining_drill_mode_text[mode][1] ) + item["name"]="technic:mining_drill_mk2_"..mode + meta["mode"]=mode + item["metadata"]=set_item_meta(meta) + itemstack:replace(item) + return itemstack +end + +function mining_drill_mk3_setmode(user,itemstack) + local player_name=user:get_player_name() + local item=itemstack:to_table() + local meta=get_item_meta(item["metadata"]) + if meta==nil then + meta={} + mode=0 + end + if meta["mode"]==nil then + minetest.chat_send_player(player_name,"Hold shift and use to change Mining Drill Mk3 modes.") + meta["mode"]=0 + mode=0 + end + mode=(meta["mode"]) + mode=mode+1 + if mode>=6 then mode=1 end + minetest.chat_send_player(player_name, "Mining Drill Mk3 mode : "..mode.." - "..mining_drill_mode_text[mode][1] ) + item["name"]="technic:mining_drill_mk3_"..mode + meta["mode"]=mode + item["metadata"]=set_item_meta(meta) + itemstack:replace(item) + return itemstack +end diff --git a/technic/mining_laser_mk1.lua b/technic/mining_laser_mk1.lua index a206bb4..87c121d 100644 --- a/technic/mining_laser_mk1.lua +++ b/technic/mining_laser_mk1.lua @@ -1,4 +1,6 @@ laser_mk1_max_charge=40000 +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() @@ -10,7 +12,7 @@ local laser_shoot = function(itemstack, player, pointed_thing) minetest.node_dig(pos,node,player) end laser_straight_mode=1 - end + end direction_y=math.abs(math.floor(dir.y*100)) if direction_y>50 then entity_name="technic:laser_beam_entityV" @@ -54,13 +56,16 @@ minetest.register_tool("technic:laser_mk1", { stack_max = 1, on_use = function(itemstack, user, pointed_thing) item=itemstack:to_table() - if item["metadata"]=="" or item["metadata"]=="0" then return end - local charge=tonumber((item["metadata"])) + local meta=get_item_meta(item["metadata"]) + if meta==nil then return false end --tool not charghed + if meta["charge"]==nil then return false end + charge=meta["charge"] if charge-400>0 then laser_shoot(item, user, pointed_thing) - charge =charge-400; - item["metadata"]=tostring(charge) - charge=set_RE_wear(item,charge,laser_mk1_max_charge) + charge =charge-400; + set_RE_wear(item,charge,laser_mk1_max_charge) + meta["charge"]=charge + item["metadata"]=set_item_meta(meta) itemstack:replace(item) end return itemstack @@ -171,4 +176,4 @@ function lazer_it (pos, player) if node.name == "air" or node.name == "ignore" or node.name == "default:lava_source" or node.name == "default:lava_flowing" then return end if node.name == "default:water_source" or node.name == "default:water_flowing" then minetest.env:remove_node(pos) return end if player then minetest.node_dig(pos,node,player) end -end \ No newline at end of file +end diff --git a/technic/sonic_screwdriver.lua b/technic/sonic_screwdriver.lua index d089778..ffd2984 100644 --- a/technic/sonic_screwdriver.lua +++ b/technic/sonic_screwdriver.lua @@ -1,55 +1,59 @@ sonic_screwdriver_max_charge=15000 - - 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() - if item["metadata"]=="" or item["metadata"]=="0" then return end - local charge=tonumber((item["metadata"])) - 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) - - charge =charge-100; - item["metadata"]=tostring(charge) - set_RE_wear(item,charge,sonic_screwdriver_max_charge) - itemstack:replace(item) - end - return itemstack - else - return itemstack - end - end, - - }) - - minetest.register_craft({ - output = "technic:sonic_screwdriver", - recipe = { - {"technic:diamond"}, - {"technic:battery"}, - {"technic:stainless_steel_ingot"} - } - }) +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 false end --tool not charghed + if meta1["charge"]==nil then return false 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) + + charge=charge-100; + meta1["charge"]=charge + item["metadata"]=set_item_meta(meta1) + set_RE_wear(item,charge,sonic_screwdriver_max_charge) + itemstack:replace(item) + end + return itemstack + else + return itemstack + end + end, + + }) + +minetest.register_craft({ + output = "technic:sonic_screwdriver", + recipe = { + {"technic:diamond"}, + {"technic:battery"}, + {"technic:stainless_steel_ingot"} + } +}) diff --git a/technic/textures/technic_mining_drill_mk2.png b/technic/textures/technic_mining_drill_mk2.png new file mode 100644 index 0000000..30be719 Binary files /dev/null and b/technic/textures/technic_mining_drill_mk2.png differ diff --git a/technic/textures/technic_mining_drill_mk3.png b/technic/textures/technic_mining_drill_mk3.png new file mode 100644 index 0000000..30de896 Binary files /dev/null and b/technic/textures/technic_mining_drill_mk3.png differ diff --git a/technic/textures/technic_tool_mode1.png b/technic/textures/technic_tool_mode1.png new file mode 100644 index 0000000..571dbe5 Binary files /dev/null and b/technic/textures/technic_tool_mode1.png differ diff --git a/technic/textures/technic_tool_mode2.png b/technic/textures/technic_tool_mode2.png new file mode 100644 index 0000000..891aa82 Binary files /dev/null and b/technic/textures/technic_tool_mode2.png differ diff --git a/technic/textures/technic_tool_mode3.png b/technic/textures/technic_tool_mode3.png new file mode 100644 index 0000000..cd099a7 Binary files /dev/null and b/technic/textures/technic_tool_mode3.png differ diff --git a/technic/textures/technic_tool_mode4.png b/technic/textures/technic_tool_mode4.png new file mode 100644 index 0000000..62f50d7 Binary files /dev/null and b/technic/textures/technic_tool_mode4.png differ diff --git a/technic/textures/technic_tool_mode5.png b/technic/textures/technic_tool_mode5.png new file mode 100644 index 0000000..c918314 Binary files /dev/null and b/technic/textures/technic_tool_mode5.png differ diff --git a/technic/textures/technic_tool_mode6.png b/technic/textures/technic_tool_mode6.png new file mode 100644 index 0000000..9268f47 Binary files /dev/null and b/technic/textures/technic_tool_mode6.png differ diff --git a/technic/textures/technic_tool_mode7.png b/technic/textures/technic_tool_mode7.png new file mode 100644 index 0000000..5ba572a Binary files /dev/null and b/technic/textures/technic_tool_mode7.png differ diff --git a/technic/textures/technic_tool_mode8.png b/technic/textures/technic_tool_mode8.png new file mode 100644 index 0000000..b2655b6 Binary files /dev/null and b/technic/textures/technic_tool_mode8.png differ diff --git a/technic/textures/technic_tool_mode9.png b/technic/textures/technic_tool_mode9.png new file mode 100644 index 0000000..2077afb Binary files /dev/null and b/technic/textures/technic_tool_mode9.png differ