From 56b9442e4b4ac02a6d6beee20cf58762a7759906 Mon Sep 17 00:00:00 2001 From: ConfidentOwl Date: Wed, 21 Dec 2022 08:57:54 +0300 Subject: [PATCH] Initial Commit --- api/fluid_llogik.lua | 240 +++++++++++ api/init.lua | 39 ++ api/item_logick.lua | 156 +++++++ api/miners.lua | 203 +++++++++ api/pipe_logick.lua | 282 ++++++++++++ custom_recips/init.lua | 5 + .../recips_table_and_some_metods.lua | 42 ++ debug_tools/init.lua | 41 ++ i3_integration/init.lua | 42 ++ init.lua | 20 + lists_of_all.lua | 58 +++ mashins/init.lua | 7 + mashins/quarry.lua | 103 +++++ mashins/steam_machins.lua | 400 ++++++++++++++++++ mashins/vertical_miner.lua | 81 ++++ mod.conf | 7 + ore/init.lua | 10 + ore/node_register.lua | 264 ++++++++++++ ore/ore_gen.lua | 332 +++++++++++++++ pipe/fluid_pipe.lua | 51 +++ pipe/fluid_pump.lua | 242 +++++++++++ pipe/fluid_tank.lua | 62 +++ pipe/init.lua | 8 + pipe/item_pipe.lua | 169 ++++++++ steam/init.lua | 6 + steam/small_steam_boiler.lua | 119 ++++++ steam/steam_gen_logick.lua | 101 +++++ textures/owl_tech_base_big_tiles.png | Bin 0 -> 5518 bytes textures/owl_tech_base_briks.png | Bin 0 -> 5524 bytes textures/owl_tech_base_fluid_pipe.png | Bin 0 -> 5713 bytes textures/owl_tech_base_frame.png | Bin 0 -> 5584 bytes textures/owl_tech_base_grid.png | Bin 0 -> 5392 bytes textures/owl_tech_base_meshanism_side.png | Bin 0 -> 5721 bytes textures/owl_tech_base_pump.png | Bin 0 -> 667 bytes textures/owl_tech_base_tank_side.png | Bin 0 -> 6009 bytes textures/owl_tech_base_tiles.png | Bin 0 -> 5470 bytes textures/owl_tech_boiler_face.png | Bin 0 -> 4998 bytes textures/owl_tech_compressor_face.png | Bin 0 -> 624 bytes textures/owl_tech_dirt_dust.png | Bin 0 -> 5938 bytes textures/owl_tech_dust.png | Bin 0 -> 5258 bytes textures/owl_tech_dust_block_1.png | Bin 0 -> 6065 bytes textures/owl_tech_forge_face.png | Bin 0 -> 624 bytes textures/owl_tech_gem_1.png | Bin 0 -> 5145 bytes textures/owl_tech_gem_2.png | Bin 0 -> 5100 bytes textures/owl_tech_gem_block_1.png | Bin 0 -> 5172 bytes textures/owl_tech_gem_block_2.png | Bin 0 -> 5341 bytes textures/owl_tech_macerator_face.png | Bin 0 -> 598 bytes textures/owl_tech_ore_base.png | Bin 0 -> 5449 bytes textures/owl_tech_plate.png | Bin 0 -> 6151 bytes textures/owl_tech_quary.png | Bin 0 -> 5373 bytes textures/owl_tech_quary_point.png | Bin 0 -> 5334 bytes textures/owl_tech_sieve_face.png | Bin 0 -> 5039 bytes textures/owl_tech_smelter_face.png | Bin 0 -> 622 bytes textures/owl_tech_steam_output.png | Bin 0 -> 5126 bytes textures/owl_tech_stick.png | Bin 0 -> 5089 bytes textures/owl_tech_stick_of_trufh.png | Bin 0 -> 5364 bytes textures/owl_tech_vertical_miner_face.png | Bin 0 -> 5227 bytes textures/owl_tech_xray.png | Bin 0 -> 5281 bytes xray/init.lua | 17 + 59 files changed, 3107 insertions(+) create mode 100755 api/fluid_llogik.lua create mode 100755 api/init.lua create mode 100755 api/item_logick.lua create mode 100644 api/miners.lua create mode 100755 api/pipe_logick.lua create mode 100755 custom_recips/init.lua create mode 100755 custom_recips/recips_table_and_some_metods.lua create mode 100755 debug_tools/init.lua create mode 100644 i3_integration/init.lua create mode 100755 init.lua create mode 100755 lists_of_all.lua create mode 100755 mashins/init.lua create mode 100644 mashins/quarry.lua create mode 100755 mashins/steam_machins.lua create mode 100644 mashins/vertical_miner.lua create mode 100755 mod.conf create mode 100755 ore/init.lua create mode 100755 ore/node_register.lua create mode 100755 ore/ore_gen.lua create mode 100755 pipe/fluid_pipe.lua create mode 100755 pipe/fluid_pump.lua create mode 100755 pipe/fluid_tank.lua create mode 100755 pipe/init.lua create mode 100755 pipe/item_pipe.lua create mode 100755 steam/init.lua create mode 100755 steam/small_steam_boiler.lua create mode 100755 steam/steam_gen_logick.lua create mode 100644 textures/owl_tech_base_big_tiles.png create mode 100644 textures/owl_tech_base_briks.png create mode 100755 textures/owl_tech_base_fluid_pipe.png create mode 100644 textures/owl_tech_base_frame.png create mode 100644 textures/owl_tech_base_grid.png create mode 100755 textures/owl_tech_base_meshanism_side.png create mode 100755 textures/owl_tech_base_pump.png create mode 100755 textures/owl_tech_base_tank_side.png create mode 100644 textures/owl_tech_base_tiles.png create mode 100755 textures/owl_tech_boiler_face.png create mode 100755 textures/owl_tech_compressor_face.png create mode 100755 textures/owl_tech_dirt_dust.png create mode 100755 textures/owl_tech_dust.png create mode 100755 textures/owl_tech_dust_block_1.png create mode 100755 textures/owl_tech_forge_face.png create mode 100755 textures/owl_tech_gem_1.png create mode 100755 textures/owl_tech_gem_2.png create mode 100755 textures/owl_tech_gem_block_1.png create mode 100755 textures/owl_tech_gem_block_2.png create mode 100755 textures/owl_tech_macerator_face.png create mode 100755 textures/owl_tech_ore_base.png create mode 100755 textures/owl_tech_plate.png create mode 100644 textures/owl_tech_quary.png create mode 100644 textures/owl_tech_quary_point.png create mode 100755 textures/owl_tech_sieve_face.png create mode 100755 textures/owl_tech_smelter_face.png create mode 100755 textures/owl_tech_steam_output.png create mode 100755 textures/owl_tech_stick.png create mode 100755 textures/owl_tech_stick_of_trufh.png create mode 100644 textures/owl_tech_vertical_miner_face.png create mode 100755 textures/owl_tech_xray.png create mode 100755 xray/init.lua diff --git a/api/fluid_llogik.lua b/api/fluid_llogik.lua new file mode 100755 index 0000000..8eea95d --- /dev/null +++ b/api/fluid_llogik.lua @@ -0,0 +1,240 @@ +--Setter and getter pull_amount +function owl_tech.get_pull_amount(meta) + return meta:get_int("pull_amount") +end + +function owl_tech.set_pull_amount(meta,new_amount) + meta:set_int("pull_amount",new_amount) + return owl_tech.get_pull_amount(meta) +end +------------------------------ +--Setter and getter pull_volume +function owl_tech.get_pull_volume(meta,namber) + return meta:get_float(namber.."_current_volume") +end + +function owl_tech.set_pull_volume(meta,namber,volume) + meta:set_float(namber.."_current_volume",volume) + return owl_tech.get_pull_volume(meta,namber) +end +------------------------------ +--Setter and getter pull_max_volume +function owl_tech.get_pull_max_volume(meta,namber) + return meta:get_float(namber.."_max_volume") +end + +function owl_tech.set_pull_max_volume(meta,namber,volume) + meta:set_float(namber.."_max_volume",volume) + return owl_tech.get_pull_max_volume(meta,namber) +end +------------------------------ +--Setter and getter fluid name +function owl_tech.get_pull_fluid_name(meta,namber) + return meta:get_string(namber.."_fluid_name") +end + +function owl_tech.set_pull_fluid_name(meta,namber,volume) + meta:set_string(namber.."_fluid_name",volume) + return owl_tech.get_pull_fluid_name(meta,namber) +end +------------------------------ +--Setter and getter can fluid input use 0 and 1!!! +function owl_tech.get_pull_fluid_input(meta,namber) + return meta:get_int(namber.."_input") +end + +function owl_tech.set_pull_fluid_input(meta,namber,input) + meta:set_int(namber.."_input",input) + return owl_tech.get_pull_fluid_input(meta,namber) +end +------------------------------ +--Setter and getter can fluid output 0 and 1!!! +function owl_tech.get_pull_fluid_output(meta,namber) + return meta:get_int(namber.."_output") +end + +function owl_tech.set_pull_fluid_output(meta,namber,input) + meta:set_int(namber.."_output",input) + return owl_tech.get_pull_fluid_output(meta,namber) +end +------------------------------ +--whitlist for fluid tanks (Only 1 fluid can put in whitelist) +function owl_tech.get_pull_fluid_whitlist(meta,namber) + return meta:get_string(namber.."_whitlist") +end + +function owl_tech.set_pull_fluid_whitlist(meta,namber,name) + meta:set_string(namber.."_whitlist",name) + return owl_tech.get_pull_fluid_whitlist(meta,namber) +end + +function owl_tech.remove_pull_fluid_whitlist(meta,namber) + meta:set_string(namber.."_whitlist","none") + return owl_tech.get_pull_fluid_whitlist(meta,namber) +end +------------------------------ +--Add new pull +function owl_tech.add_new_pull(meta,max_volume,input,output) + owl_tech.set_pull_amount(meta,owl_tech.get_pull_amount(meta)+1) + local pull_amount = owl_tech.get_pull_amount(meta) + owl_tech.set_pull_max_volume(meta,pull_amount,max_volume) + owl_tech.set_pull_volume(meta,pull_amount,0) + owl_tech.set_pull_fluid_name(meta,pull_amount,"none") + owl_tech.set_pull_fluid_input(meta,pull_amount,input)--use int not bool(( + owl_tech.set_pull_fluid_output(meta,pull_amount,output) + owl_tech.remove_pull_fluid_whitlist(meta,pull_amount) +end +------------------------------ +--finde tank in node for add some fluid(local func ) +function owl_tech.finde_tank_in_node_for_add_fluid_amount(meta,pulls,fluid_indef,fluid_amount) + local ret =0 + for i = 0, pulls, 1 do + local pull_max_volume = owl_tech.get_pull_max_volume(meta,i) + local pull_curent_volume = owl_tech.get_pull_volume(meta,i) + local difer = pull_curent_volume+fluid_amount + if owl_tech.get_pull_fluid_name(meta,i)=="none" or (owl_tech.get_pull_fluid_name(meta,i)==fluid_indef and difer<=pull_max_volume )then + ret =i + break + end + end + return ret + +end +------------------------------ +--finde tank in side node for remove some fluid(local func ) +function owl_tech.finde_tank_in_node_for_remove_fluid_amount(meta,pulls,fluid_indef,fluid_amount) + for i = 0, pulls, 1 do + local pull_curent_volume = owl_tech.get_pull_volume(meta,i) + local difer = pull_curent_volume-fluid_amount + if (owl_tech.get_pull_fluid_name(meta,i)==fluid_indef and difer>=0 )then + return i + end + end +end +------------------------------ +--Fluid from itemslot +function owl_tech.add_fluid_in_pull_from_itemslot(meta,itemstak_buck,inv,itemstak_dst,slot_name_fuel,slot_name_dst) + local pulls=owl_tech.get_pull_amount(meta) + local name_item_fluid= itemstak_buck:get_name() + local fluid_indef="" + local epmty_sel_name ="" + if name_item_fluid=="mcl_buckets:bucket_water" or name_item_fluid=="mcl_buckets:bucket_river_water" then + fluid_indef="mcl_water" + epmty_sel_name= "mcl_buckets:bucket_empty" + elseif name_item_fluid=="mcl_buckets:bucket_lava" then + fluid_indef="mcl_lava" + epmty_sel_name= "mcl_buckets:bucket_empty" + end + local can_return_buck= false + if itemstak_dst:is_empty() then + can_return_buck =true + elseif itemstak_dst:get_free_space()>0 and itemstak_dst:get_name()==epmty_sel_name then + can_return_buck =true + end + if pulls>0 and fluid_indef~="" and can_return_buck then + local inde_pull =owl_tech.finde_tank_in_node_for_add_fluid_amount(meta,pulls,fluid_indef,1000)--1000 is 1 bucket\cell + if inde_pull~=0 and (owl_tech.get_pull_fluid_whitlist(meta,inde_pull)==fluid_indef or owl_tech.get_pull_fluid_whitlist(meta,inde_pull)=="none" )then + local volume = owl_tech.get_pull_volume(meta,inde_pull)+1000 + owl_tech.set_pull_volume(meta,inde_pull,volume) + local amount_buck = itemstak_buck:get_count() + owl_tech.set_pull_fluid_name(meta,inde_pull,fluid_indef) + if amount_buck>1 then + itemstak_buck:set_count(amount_buck-1) + inv:set_stack(slot_name_fuel, 1, itemstak_buck) + if itemstak_dst:is_empty() then --retrun emty sell + local item ={name=epmty_sel_name, count=1, wear=0, metadata=""} + itemstak_dst:add_item(item) + inv:set_stack(slot_name_dst, 1, itemstak_dst) + elseif not itemstak_dst:is_empty() then + local item ={name=epmty_sel_name, count=itemstak_dst:get_count()+1, wear=0, metadata=""} + itemstak_dst:add_item(item) + inv:set_stack(slot_name_dst, 1, itemstak_dst) + end + else + itemstak_buck:clear() + inv:set_stack(slot_name_fuel, 1, itemstak_buck) + if itemstak_dst:is_empty() then --retrun emty sell + local item ={name=epmty_sel_name, count=itemstak_dst:get_count()+1, wear=0, metadata=""} + itemstak_dst:add_item(item) + inv:set_stack(slot_name_dst, 1, itemstak_dst) + elseif not itemstak_dst:is_empty() then + itemstak_dst:set_count(itemstak_dst:get_count()+1) + inv:set_stack(slot_name_dst, 1, itemstak_dst) + end + end + else + return false + end + end +end +------------------------------ +--can add fluid in node pulls +function owl_tech.test_add_fluid_in_any_pulls(meta,fluid_name,fluid_amount) + local pulls=owl_tech.get_pull_amount(meta) + if pulls>0 then + local inde_pull =owl_tech.finde_tank_in_node_for_add_fluid_amount(meta,pulls,fluid_name,fluid_amount) + if inde_pull~=0 and (owl_tech.get_pull_fluid_whitlist(meta,inde_pull)==fluid_name or owl_tech.get_pull_fluid_whitlist(meta,inde_pull)=="none" )then + return true ,inde_pull + else + return false ,inde_pull + end + end +end +------------------------------ +--add fluid in node +function owl_tech.add_fluid_in_node_pull(meta,fluid_name,fluid_amount,pull_number) + local volume = owl_tech.get_pull_volume(meta,pull_number)+fluid_amount + owl_tech.set_pull_volume(meta,pull_number,volume) + owl_tech.set_pull_fluid_name(meta,pull_number,fluid_name) +end +------------------------------ +--can remove fluid in node pulls +function owl_tech.test_remove_fluid_in_any_pulls(meta,fluid_name,fluid_amount) + local pulls=owl_tech.get_pull_amount(meta) + local remove_amount=0 + if pulls>0 then + local inde_pull=owl_tech.finde_tank_in_node_for_remove_fluid_amount(meta,pulls,fluid_name,fluid_amount) + if inde_pull~=nil and inde_pull~=0 and (owl_tech.get_pull_fluid_whitlist(meta,inde_pull)==fluid_name or owl_tech.get_pull_fluid_whitlist(meta,inde_pull)=="none" )then + if owl_tech.get_pull_volume(meta,inde_pull)>=fluid_amount then + remove_amount=fluid_amount + else + remove_amount=owl_tech.get_pull_volume(meta,inde_pull) + end + return true ,inde_pull ,remove_amount + else + return false ,inde_pull ,remove_amount + end + end +end +------------------------------ +--remove fluid in node +function owl_tech.remove_fluid_in_node_pull(meta,fluid_amount,pull_number) + local pull_curent_volume = owl_tech.get_pull_volume(meta,pull_number) + local difer = pull_curent_volume-fluid_amount + owl_tech.set_pull_volume(meta,pull_number,difer) + if difer ==0 then + owl_tech.set_pull_fluid_name(meta,pull_number,"none") + end +end +------------------------------ +--Chek for name thit 0 amount fluid and has name +function owl_tech.delit_name_fluid_if_0(meta) + local pulls_amount = owl_tech.get_pull_amount(meta) + for i = 1,pulls_amount, 1 do + if owl_tech.get_pull_volume(meta,i)==0 then + owl_tech.set_pull_fluid_name(meta,i,"none") + end + end +end +--------------------------------- +--Getter and setter conection amount +function owl_tech.get_conection_amount_item(meta) + return meta:get_int("conection_amount") +end +function owl_tech.set_conection_amount_item(meta,number) + meta:set_int("conection_amount",number) +end +function owl_tech.add_1_conection_amount_itemd(meta) + meta:set_int("conection_amount",meta:get_int("conection_amount")+1) +end +------------------------------------------- \ No newline at end of file diff --git a/api/init.lua b/api/init.lua new file mode 100755 index 0000000..2727d26 --- /dev/null +++ b/api/init.lua @@ -0,0 +1,39 @@ +owl_tech={} + +local S = minetest.get_translator(minetest.get_current_modname()) +local name = minetest.get_current_modname() +local path = minetest.get_modpath(name) + +-- META Key info +--[[ + 1 buket is 1000 mlbickets(Use mlbucks for work) + Begin from 1 pull 0 is not walid!!0-is NOT pull in shis node! + pull_amount--amount fo pulls in this meta + + + non in mechanims - none + water in mechanism - mcl_water + lava in mechanism - mcl_lava + steam in mechanism - owl_tech_steam + + + Pipse!!! + + White-fluids + Green-items + Yelou-energy + + Red-Input + Blue-Output +]] + +--[[main names for items slots + dst-main_output + fuel --use only for nodes for that can burn like fuel + fluid_in- use for buckets miners.lua +]] + +dofile(minetest.get_modpath("owl_tech") .. "/api/fluid_llogik.lua") --main fail about all fluid work +dofile(minetest.get_modpath("owl_tech") .. "/api/item_logick.lua") --main fail about all item work +dofile(minetest.get_modpath("owl_tech") .. "/api/pipe_logick.lua") --main fail about all pipe work +dofile(minetest.get_modpath("owl_tech") .. "/api/miners.lua") --main fail about all miners work diff --git a/api/item_logick.lua b/api/item_logick.lua new file mode 100755 index 0000000..7d24f53 --- /dev/null +++ b/api/item_logick.lua @@ -0,0 +1,156 @@ +--all logick of item (pipe for item dont puy hear) +--list for input itemslot +--settera and geters for calculate item_redines (always max -100) +function owl_tech.get_item_redines(meta) + return meta:get_int("_redines") +end +function owl_tech.set_item_redines(meta,amount) + meta:set_int("_redines", amount) +end +function owl_tech.reset_item_redines(meta) + meta:set_int("_redines", 0) +end +function owl_tech.add_item_redines(meta,amount) + meta:set_int("_redines",owl_tech.get_item_redines(meta)+amount) +end +---------------------------------------------- +-- calculate add bnus for speed work if recipt tire is low that tire mashine ( 1 lv give 20%) +function owl_tech.calculate_recipe_tire_bonus(meta,recip_tire,recip_dens) + return recip_dens+(recip_dens*(owl_tech.get_mashine_tire(meta)-recip_tire)*0.2) +end +---------------------------------------------- +----Logick for item pipe +function owl_tech.set_item_pipe_logick(meta) + local inv = meta:get_inventory() + inv:set_size("pipe_inv", 1) +end +---------------------------------------------- + +--get item from inventory to pipe +function owl_tech.finde_inventory_slot_for_removing_item_around(pos) + local mass_pos ={ + {x=pos.x,y=pos.y+1,z=pos.z}, + {x=pos.x,y=pos.y-1,z=pos.z}, + {x=pos.x+1,y=pos.y,z=pos.z}, + {x=pos.x-1,y=pos.y,z=pos.z}, + {x=pos.x,y=pos.y,z=pos.z+1}, + {x=pos.x,y=pos.y,z=pos.z-1} + } + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() -- pipe + for i, value in ipairs(mass_pos) do + for j, value1 in pairs(OUTPUT_SLOT_NAME) do + if minetest.get_item_group((minetest.get_node(mass_pos[i])).name,OUTPUT_SLOT_NAME[j])>0 then-- for special item slots + local meta_source = minetest.get_meta(mass_pos[i]) + local inv_sourc = meta_source:get_inventory() + if inv:is_empty("pipe_inv") and not inv_sourc:is_empty(OUTPUT_SLOT_NAME[j]) then + if inv:room_for_item("pipe_inv", inv_sourc:get_stack(OUTPUT_SLOT_NAME[j], 1)) then + inv:add_item("pipe_inv", inv_sourc:get_stack(OUTPUT_SLOT_NAME[j], 1)) + inv_sourc:set_stack(OUTPUT_SLOT_NAME[j],1,'') + do return end + end + end + end + end + if minetest.get_node(mass_pos[i]).name=='mcl_chests:chest_small' + or minetest.get_node(mass_pos[i]).name=="mcl_chests:ender_chest" + or minetest.get_node(mass_pos[i]).name=="mcl_chests:ender_chest_small" then -- for chest type + local meta_source = minetest.get_meta(mass_pos[i]) + local inv_sourc = meta_source:get_inventory() + if inv:is_empty("pipe_inv") and not inv_sourc:is_empty("main")then + for k = 1, #(inv_sourc:get_list("main")),1 do + if inv:room_for_item("pipe_inv", inv_sourc:get_stack("main", k)) and not (inv_sourc:get_stack("main", k)):is_empty() then + inv:add_item("pipe_inv", inv_sourc:get_stack("main", k)) + inv_sourc:set_stack("main", k,'') + do return end + end + end + end + end + if minetest.get_item_group((minetest.get_node(mass_pos[i])).name,"owl_tech_can_pipe_output")>0 then + local meta_source = minetest.get_meta(mass_pos[i]) + local inv_sourc = meta_source:get_inventory() + if (not inv:is_empty("pipe_inv")) and inv_sourc:is_empty("pipe_inv") then + if inv_sourc:room_for_item("pipe_inv", inv:get_stack("pipe_inv", 1)) then + local itemstack= inv:get_stack("pipe_inv", 1) + inv_sourc:add_item("pipe_inv",itemstack) + inv:set_stack("pipe_inv", 1, '') + do return end + end + end + end + end +end +------------------------------------------- +--get item pipe to pipe +function owl_tech.finde_pipe_and_send_item(pos) + local mass_pos ={ + {x=pos.x,y=pos.y+1,z=pos.z}, + {x=pos.x,y=pos.y-1,z=pos.z}, + {x=pos.x+1,y=pos.y,z=pos.z}, + {x=pos.x-1,y=pos.y,z=pos.z}, + {x=pos.x,y=pos.y,z=pos.z+1}, + {x=pos.x,y=pos.y,z=pos.z-1} + } + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + --for i, value in ipairs(mass_pos) do + local rand = math.random(1,6) + if minetest.get_item_group((minetest.get_node(mass_pos[rand])).name,"owl_tech_can_pipe_output")>0 then + local meta_source = minetest.get_meta(mass_pos[rand]) + local inv_sourc = meta_source:get_inventory() + if (not inv:is_empty("pipe_inv")) and inv_sourc:is_empty("pipe_inv") then + if inv_sourc:room_for_item("pipe_inv", inv:get_stack("pipe_inv", 1)) then + local itemstack= inv:get_stack("pipe_inv", 1) + inv_sourc:add_item("pipe_inv",itemstack) + inv:set_stack("pipe_inv", 1, '') + do return end + end + end + end +end +----------------------------------------------------- +--Send item in pipe +function owl_tech.send_item_in_inventory(pos) + local meta = minetest.get_meta(pos) + local mass_pos ={ + {x=pos.x,y=pos.y+1,z=pos.z}, + {x=pos.x,y=pos.y-1,z=pos.z}, + {x=pos.x+1,y=pos.y,z=pos.z}, + {x=pos.x-1,y=pos.y,z=pos.z}, + {x=pos.x,y=pos.y,z=pos.z+1}, + {x=pos.x,y=pos.y,z=pos.z-1} + } + for i, value in ipairs(mass_pos) do + local name= minetest.get_node(mass_pos[i]).name + for j, value in pairs(INPUT_SLOT_NAME) do + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() -- pipe + if minetest.get_item_group((minetest.get_node(mass_pos[i])).name,"owl_tech_can_pipe_output")>0 then --get item from enather pipe + local meta_source = minetest.get_meta(mass_pos[i]) + local inv_sourc = meta_source:get_inventory() + if inv:is_empty("pipe_inv") and not inv_sourc:is_empty("pipe_inv") then + if inv:room_for_item("pipe_inv", inv_sourc:get_stack("pipe_inv", 1)) and not (inv_sourc:get_stack("pipe_inv", 1)):is_empty() then + inv:set_stack("pipe_inv", 1, inv_sourc:get_stack("pipe_inv", 1)) + inv_sourc:set_stack("pipe_inv", 1,'' ) + end + end + end + if minetest.get_node(mass_pos[i]).name=='mcl_chests:chest_small' + or minetest.get_node(mass_pos[i]).name=="mcl_chests:ender_chest" + or minetest.get_node(mass_pos[i]).name=="mcl_chests:ender_chest_small" then -- for chest + local meta_source = minetest.get_meta(mass_pos[i]) + local inv_sourc = meta_source:get_inventory() + if not inv:is_empty("pipe_inv") then + for k = 1, #(inv_sourc:get_list("main")),1 do + if (inv_sourc:room_for_item("main", inv:get_stack("pipe_inv", 1)) and not ((inv:get_stack("pipe_inv", 1)):is_empty() ))then + inv_sourc:add_item("main", inv:get_stack("pipe_inv", 1)) + inv:set_stack("pipe_inv", 1,'' ) + do return end + end + end + end + end + end + end +end diff --git a/api/miners.lua b/api/miners.lua new file mode 100644 index 0000000..8bbc8a7 --- /dev/null +++ b/api/miners.lua @@ -0,0 +1,203 @@ +-- prepear for vertical steam miner +function owl_tech.prepear_for_verticak_steam_miner(pos) + local meta = minetest.get_meta(pos) + owl_tech.add_new_pull(meta,16000,1,0) --steam eat 25 steam in 1 tick + owl_tech.set_pull_fluid_whitlist(meta,1,"owl_tech_steam")--whitlist for make and output ONLY Steam + meta:set_int("curent-y",1) -- use pos - curent-y for get diginbg pos + meta:set_int("get_bedrock",0) +end +---------------------------------- +-- can steam miner mine this node +function owl_tech.can_vertical_steam_miner_mine_this(pos,meta) + local node_mine = minetest.get_node_or_nil({x=pos.x,y=(pos.y-meta:get_int("curent-y")),z=pos.z}) + local can_do = true + if node_mine~=nil then + if node_mine.name =='mcl_core:bedrock' then --bedrock mcl_core:bedrock + can_do =false + meta:set_int("get_bedrock",1) + return can_do + end + for i, value in ipairs(GLOBAL_FLUID_LIST) do + if node_mine.name ==GLOBAL_FLUID_LIST[i] and not can_do then --finde fluid + can_do =false + return can_do + end + end + return can_do + end +end +----------------------------------- +--mine verical steam +function owl_tech.vertical_steam_mine(pos,meta,can_mine) + if can_mine then + local inv = meta:get_inventory() + local dst_its = inv:get_stack('dst', 1) + local node_mine = minetest.get_node_or_nil({x=pos.x,y=(pos.y-meta:get_int("curent-y")),z=pos.z}) + if dst_its:is_empty() or ( + dst_its:get_stack_max()-dst_its:get_count()>0 and + node_mine.name == dst_its:get_name() + ) then + if dst_its:is_empty() and node_mine.name~='air' then + local new_stack = {name=node_mine.name, count=1, wear=0, metadata=""} + inv:set_stack('dst', 1,new_stack) + minetest.set_node({x=pos.x,y=(pos.y-meta:get_int("curent-y")),z=pos.z}, {name="owl_tech:decor_bronze_pipe"}) + meta:set_int("curent-y",meta:get_int("curent-y")+1) + elseif node_mine.name~='air' then + dst_its:set_count(dst_its:get_count()+1) + inv:set_stack('dst', 1,dst_its) + minetest.set_node({x=pos.x,y=(pos.y-meta:get_int("curent-y")),z=pos.z}, {name="owl_tech:decor_bronze_pipe"}) + meta:set_int("curent-y",meta:get_int("curent-y")+1) + elseif node_mine.name=='air' then + minetest.set_node({x=pos.x,y=(pos.y-meta:get_int("curent-y")),z=pos.z}, {name="owl_tech:decor_bronze_pipe"}) + meta:set_int("curent-y",meta:get_int("curent-y")+1) + end + end + end +end +-------------------------------- +--remove all vertical pipe +function owl_tech.remove_all_pipe_vertical(pos) + pos.y=pos.y-1 + while minetest.get_node_or_nil(pos).name =="owl_tech:decor_bronze_pipe" do + minetest.set_node(pos, {name="air"}) + pos.y=pos.y-1 + end + do return end +end +----------------------------------- +-- Prerpear for quarry +function owl_tech.prepera_quarry(pos,max_distance) + local meta = minetest.get_meta(pos) + owl_tech.add_new_pull(meta,32000,1,0) --steam + owl_tech.set_pull_fluid_whitlist(meta,1,"owl_tech_steam")--whitlist for make and output ONLY Steam + meta:set_int('horiz_max_distance',max_distance) + meta:set_int("curent-y",1) -- use pos - curent-y for get diginbg pos + meta:set_int("curent-x",0) + meta:set_int("max_x",0) + meta:set_int('min_x',0) + meta:set_int("curent-z",0) + meta:set_int("max_z",0) + meta:set_int('min_z',0) + meta:set_int("get_bedrock",0) +end +------------------------------------ +--scan for point +function owl_tech.scan_for_point(pos,meta,scan_disctance) + local x_pos = 0 + for i = (-1*scan_disctance), scan_disctance, 1 do + local node = minetest.get_node_or_nil({x=pos.x+i,y=pos.y,z=pos.z}) + if node~=nil and node.name =="owl_tech:quary_point" then + x_pos=i + end + end + local z_pos = 0 + for i = (-1*scan_disctance), scan_disctance, 1 do + local node = minetest.get_node_or_nil({x=pos.x,y=pos.y,z=pos.z+i}) + if node~=nil and node.name =="owl_tech:quary_point" then + z_pos=i + end + end + if x_pos~=0 and z_pos~=0 then + if pos.x+x_pos>pos.x and pos.z+z_pos>pos.z then -- ++ + meta:set_int("max_x",pos.x+x_pos) + meta:set_int("min_x",pos.x ) + meta:set_int("max_z",pos.z+z_pos) + meta:set_int("min_z",pos.z ) + elseif pos.x+x_pos>pos.x and pos.z+z_pospos.z then -- -+ + meta:set_int("max_x",pos.x) + meta:set_int("min_x",pos.x+x_pos) + meta:set_int("max_z",pos.z+z_pos) + meta:set_int("min_z",pos.z ) + elseif pos.x+x_pos0 and + node_mine.name == dst_its:get_name() + ) then + if dst_its:is_empty() and node_mine.name~='air' then + local new_stack = {name=node_mine.name, count=1, wear=0, metadata=""} + inv:set_stack('dst', 1,new_stack) + minetest.remove_node(pos_dig) + owl_tech.calculate_new_pos_for_quarry(meta) + elseif node_mine.name~='air' then + dst_its:set_count(dst_its:get_count()+1) + inv:set_stack('dst', 1,dst_its) + minetest.remove_node(pos_dig) + owl_tech.calculate_new_pos_for_quarry(meta) + elseif node_mine.name=='air' then + minetest.remove_node(pos_dig) + owl_tech.calculate_new_pos_for_quarry(meta) + end + end + end +end +------------------------------------ +--calculate new pos for qurey +function owl_tech.calculate_new_pos_for_quarry(meta) + if meta:get_int("curent-x")< meta:get_int("max_x") then --x + meta:set_int("curent-x",meta:get_int("curent-x")+1) + do return end + end + if meta:get_int("curent-x")==meta:get_int("max_x") then + if meta:get_int("curent-z")==meta:get_int("max_z") then + meta:set_int("curent-x",meta:get_int("min_x")) + meta:set_int("curent-z",meta:get_int("min_z")) + meta:set_int("curent-y",meta:get_int("curent-y")+1) + do return end + end + meta:set_int("curent-x",meta:get_int("min_x")) + meta:set_int("curent-z",meta:get_int("curent-z")+1) + end +end +---------------------------------- +-- can quary mine this node +function owl_tech.can_quary_mine_this(pos,meta) + local pos_dig={ + x=meta:get_int("curent-x"), + y=pos.y-meta:get_int("curent-y"), + z=meta:get_int("curent-z") + } + local node_mine = minetest.get_node_or_nil(pos_dig) + local can_do = true + if node_mine~=nil then + if node_mine.name =='mcl_core:bedrock' then --bedrock mcl_core:bedrock + can_do =false + meta:set_int("get_bedrock",1) + return can_do + end + for i, value in ipairs(GLOBAL_FLUID_LIST) do + if node_mine.name ==GLOBAL_FLUID_LIST[i] and not can_do then --finde fluid + minetest.remove_node(pos_dig) + return can_do + end + end + return can_do + end +end \ No newline at end of file diff --git a/api/pipe_logick.lua b/api/pipe_logick.lua new file mode 100755 index 0000000..322e70c --- /dev/null +++ b/api/pipe_logick.lua @@ -0,0 +1,282 @@ +--[[ + 0-nothing + 1-get\set_somthing +]] +local conetc_to={ + "owl_tech_generator","owl_tech_fluid_pipe","owl_tech_machine" +} +--node in pos ?in list +function owl_tech.node_in_pos_connect_to_fluid_pipe(pos) + local ret=0 + for index, value in ipairs(conetc_to) do + if minetest.get_item_group((minetest.get_node(pos)).name,"owl_tech_fluid_pipe")>0 then + ret=1 + end + end + return ret +end +------------------------------------------- +--Getter and setter conection amount +function owl_tech.get_conection_amount_fluid(meta) + return meta:get_int("conection_amount") +end +function owl_tech.set_conection_amount_fluid(meta,number) + meta:set_int("conection_amount",number) +end +function owl_tech.add_1_conection_amount_fluid(meta) + meta:set_int("conection_amount",meta:get_int("conection_amount")+1) +end +------------------------------------------- +--setter and getter fluid sander in 1 tick +function owl_tech.get_fluid_sand_in_tick(meta) + return meta:get_int("fluid_sand_in_tick") +end +function owl_tech.set_fluid_sand_in_tick(meta,number) + meta:set_int("fluid_sand_in_tick",number) +end +------------------------------------------- +--setter and geters for all 6 sides info +function owl_tech.set_side_info_y_p(meta,number)--y+ + meta:set_int("+y",number) +end +function owl_tech.set_side_info_y_m(meta,number)--y- + meta:set_int("-y",number) +end +function owl_tech.set_side_info_x_p(meta,number)--x+ + meta:set_int("+x",number) +end +function owl_tech.set_side_info_x_m(meta,number)--x- + meta:set_int("-x",number) +end +function owl_tech.set_side_info_z_p(meta,number)--z+ + meta:set_int("+z",number) +end +function owl_tech.set_side_info_z_m(meta,number)--z- + meta:set_int("-z",number) +end +function owl_tech.get_side_info_y_p(meta)--y+ + return meta:get_int("+y") +end +function owl_tech.get_side_info_y_m(meta)--y- + return meta:get_int("-y") +end +function owl_tech.get_side_info_x_p(meta)--x+ + return meta:get_int("+x") +end +function owl_tech.get_side_info_x_m(meta)--x- + return meta:get_int("-x") +end +function owl_tech.get_side_info_z_p(meta)--z+ + return meta:get_int("+z") +end +function owl_tech.get_side_info_z_m(meta)--z- + return meta:get_int("-z") +end +------------------------------------------- +--update pipe around +function owl_tech.update_fluid_pipe_around(pos) + local mass_pos ={ + {x=pos.x,y=pos.y+1,z=pos.z}, + {x=pos.x,y=pos.y-1,z=pos.z}, + {x=pos.x+1,y=pos.y,z=pos.z}, + {x=pos.x-1,y=pos.y,z=pos.z}, + {x=pos.x,y=pos.y,z=pos.z+1}, + {x=pos.x,y=pos.y,z=pos.z-1} + } + for i, value in ipairs(mass_pos) do + if minetest.get_item_group((minetest.get_node(mass_pos[i])).name,"fluid_pipe")>0 then + local meta = minetest.get_meta(mass_pos[i]) + owl_tech.check_all_side_for_fluid_work(mass_pos[i],meta) + end + end +end +------------------------------ +--Chek all side for work and set it +function owl_tech.check_all_side_for_fluid_work(pos,meta) + owl_tech.set_conection_amount_fluid(meta,0)--reset conection amount + + owl_tech.set_side_info_y_p(meta,owl_tech.node_in_pos_connect_to_fluid_pipe({x=pos.x,y=pos.y+1,z=pos.z}))--y+ + owl_tech.set_conection_amount_fluid(meta,owl_tech.get_conection_amount_fluid(meta)+owl_tech.node_in_pos_connect_to_fluid_pipe({x=pos.x,y=pos.y+1,z=pos.z})) + + owl_tech.set_side_info_y_m(meta,owl_tech.node_in_pos_connect_to_fluid_pipe({x=pos.x,y=pos.y-1,z=pos.z}))--y- + owl_tech.set_conection_amount_fluid(meta,owl_tech.get_conection_amount_fluid(meta)+owl_tech.node_in_pos_connect_to_fluid_pipe({x=pos.x,y=pos.y-1,z=pos.z})) + + owl_tech.set_side_info_x_p(meta,owl_tech.node_in_pos_connect_to_fluid_pipe({x=pos.x+1,y=pos.y,z=pos.z}))--x+ + owl_tech.set_conection_amount_fluid(meta,owl_tech.get_conection_amount_fluid(meta)+owl_tech.node_in_pos_connect_to_fluid_pipe({x=pos.x+1,y=pos.y,z=pos.z})) + + owl_tech.set_side_info_x_m(meta,owl_tech.node_in_pos_connect_to_fluid_pipe({x=pos.x-1,y=pos.y,z=pos.z}))--x- + owl_tech.set_conection_amount_fluid(meta,owl_tech.get_conection_amount_fluid(meta)+owl_tech.node_in_pos_connect_to_fluid_pipe({x=pos.x-1,y=pos.y,z=pos.z})) + + owl_tech.set_side_info_z_p(meta,owl_tech.node_in_pos_connect_to_fluid_pipe({x=pos.x,y=pos.y,z=pos.z+1}))--z+ + owl_tech.set_conection_amount_fluid(meta,owl_tech.get_conection_amount_fluid(meta)+owl_tech.node_in_pos_connect_to_fluid_pipe({x=pos.x,y=pos.y,z=pos.z+1})) + + owl_tech.set_side_info_z_m(meta,owl_tech.node_in_pos_connect_to_fluid_pipe({x=pos.x,y=pos.y,z=pos.z-1}))--z- + owl_tech.set_conection_amount_fluid(meta,owl_tech.get_conection_amount_fluid(meta)+owl_tech.node_in_pos_connect_to_fluid_pipe({x=pos.x,y=pos.y,z=pos.z-1})) +end +------------------------------------------- +--chek can send fluid in pipe\mashine +function owl_tech.can_send_fluid_in_node(meta,pos_send,send_amount) + local flyid_name= owl_tech.get_pull_fluid_name(meta,0) + local meta_send = minetest.get_meta(pos_send) + local can_sand ,inde_pull =owl_tech.test_add_fluid_in_any_pulls(meta_send,flyid_name,send_amount) + return can_sand ,inde_pull +end +------------------------------------------- +--send fluid in pos by pipe +function owl_tech.send_fluid_from_pipe_in_pos(meta,pos_send,send_amount) + local meta_send = minetest.get_meta(pos_send) + local flyid_name= owl_tech.get_pull_fluid_name(meta,0) + local can_sand , inde_pull = owl_tech.can_send_fluid_in_node(meta_send,pos_send,send_amount) + if can_sand then + owl_tech.add_fluid_in_node_pull(meta_send,flyid_name,send_amount,inde_pull) + end +end +------------------------------------------- +--send for all sides in 1 tick +function owl_tech.send_for_all_sides_fluid_pipe(meta,pos) + local send_amount = owl_tech.get_fluid_sand_in_tick(meta) + local flyid_name= owl_tech.get_pull_fluid_name(meta,1) + local side_andres = owl_tech.get_need_pipe_to_send_fluid(pos,meta) + --+Y + if side_andres==1 then + local meta_up = minetest.get_meta({x=pos.x,y=pos.y+1,z=pos.z}) + local can_do ,inde_pull =owl_tech.test_add_fluid_in_any_pulls(meta_up,flyid_name,send_amount) + local can_do2 ,_ , remove_amount =owl_tech.test_remove_fluid_in_any_pulls(meta,flyid_name,send_amount) + if can_do and can_do2 then + owl_tech.add_fluid_in_node_pull(meta_up,flyid_name,remove_amount,inde_pull) + owl_tech.remove_fluid_in_node_pull(meta,remove_amount,inde_pull) + end + end + ---Y + if side_andres==2 then + local meta_up = minetest.get_meta({x=pos.x,y=pos.y-1,z=pos.z}) + local can_do ,inde_pull =owl_tech.test_add_fluid_in_any_pulls(meta_up,flyid_name,send_amount) + local can_do2 ,_ , remove_amount =owl_tech.test_remove_fluid_in_any_pulls(meta,flyid_name,send_amount) + if can_do and can_do2 then + owl_tech.add_fluid_in_node_pull(meta_up,flyid_name,remove_amount,inde_pull) + owl_tech.remove_fluid_in_node_pull(meta,remove_amount,inde_pull) + end + end + --+X + if side_andres==3 then + local meta_up = minetest.get_meta({x=pos.x+1,y=pos.y,z=pos.z}) + local can_do ,inde_pull =owl_tech.test_add_fluid_in_any_pulls(meta_up,flyid_name,send_amount) + local can_do2 ,_ , remove_amount =owl_tech.test_remove_fluid_in_any_pulls(meta,flyid_name,send_amount) + if can_do and can_do2 then + owl_tech.add_fluid_in_node_pull(meta_up,flyid_name,remove_amount,inde_pull) + owl_tech.remove_fluid_in_node_pull(meta,remove_amount,inde_pull) + end + end + ---X + if side_andres==4 then + local meta_up = minetest.get_meta({x=pos.x-1,y=pos.y,z=pos.z}) + local can_do ,inde_pull =owl_tech.test_add_fluid_in_any_pulls(meta_up,flyid_name,send_amount) + local can_do2 ,_ , remove_amount =owl_tech.test_remove_fluid_in_any_pulls(meta,flyid_name,send_amount) + if can_do and can_do2 then + owl_tech.add_fluid_in_node_pull(meta_up,flyid_name,remove_amount,inde_pull) + owl_tech.remove_fluid_in_node_pull(meta,remove_amount,inde_pull) + end + end + --+Z + if side_andres==5 then + local meta_up = minetest.get_meta({x=pos.x,y=pos.y,z=pos.z+1}) + local can_do ,inde_pull =owl_tech.test_add_fluid_in_any_pulls(meta_up,flyid_name,send_amount) + local can_do2 ,_ , remove_amount =owl_tech.test_remove_fluid_in_any_pulls(meta,flyid_name,send_amount) + if can_do and can_do2 then + owl_tech.add_fluid_in_node_pull(meta_up,flyid_name,remove_amount,inde_pull) + owl_tech.remove_fluid_in_node_pull(meta,remove_amount,inde_pull) + end + end + ---Z + if side_andres==6 then + local meta_up = minetest.get_meta({x=pos.x,y=pos.y,z=pos.z-1}) + local can_do ,inde_pull =owl_tech.test_add_fluid_in_any_pulls(meta_up,flyid_name,send_amount) + local can_do2 ,_ , remove_amount =owl_tech.test_remove_fluid_in_any_pulls(meta,flyid_name,send_amount) + if can_do and can_do2 then + owl_tech.add_fluid_in_node_pull(meta_up,flyid_name,remove_amount,inde_pull) + owl_tech.remove_fluid_in_node_pull(meta,remove_amount,inde_pull) + end + end +end +------------------------------------------- +--get need pipe to send +function owl_tech.get_need_pipe_to_send_fluid(pos,meta) + local send_amount = owl_tech.get_fluid_sand_in_tick(meta) + local flyid_name= owl_tech.get_pull_fluid_name(meta,1) + local all_sede_table ={} + all_sede_table[1]=math.huge + all_sede_table[2]=math.huge + all_sede_table[3]=math.huge + all_sede_table[4]=math.huge + all_sede_table[5]=math.huge + all_sede_table[6]=math.huge + --+Y + if minetest.get_item_group((minetest.get_node({x=pos.x,y=pos.y+1,z=pos.z})).name,"owl_tech_fluid_pipe")>0 + and owl_tech.get_pull_volume(minetest.get_meta({x=pos.x,y=pos.y+1,z=pos.z}),1)0 + and owl_tech.get_pull_volume(minetest.get_meta({x=pos.x,y=pos.y-1,z=pos.z}),1)0 + and owl_tech.get_pull_volume(minetest.get_meta({x=pos.x+1,y=pos.y,z=pos.z}),1)0 + and owl_tech.get_pull_volume(minetest.get_meta({x=pos.x-1,y=pos.y,z=pos.z}),1)0 + and owl_tech.get_pull_volume(minetest.get_meta({x=pos.x,y=pos.y,z=pos.z+1}),1)0 + and owl_tech.get_pull_volume(minetest.get_meta({x=pos.x,y=pos.y,z=pos.z-1}),1) all_sede_table[i] then + min = all_sede_table[i] + side_andres =i + end + end + return side_andres +end \ No newline at end of file diff --git a/custom_recips/init.lua b/custom_recips/init.lua new file mode 100755 index 0000000..d7c03a7 --- /dev/null +++ b/custom_recips/init.lua @@ -0,0 +1,5 @@ +local S = minetest.get_translator(minetest.get_current_modname()) +local name = minetest.get_current_modname() +local path = minetest.get_modpath(name) + +dofile(path .. "/custom_recips/recips_table_and_some_metods.lua") --main fail about all pipes \ No newline at end of file diff --git a/custom_recips/recips_table_and_some_metods.lua b/custom_recips/recips_table_and_some_metods.lua new file mode 100755 index 0000000..121ccd0 --- /dev/null +++ b/custom_recips/recips_table_and_some_metods.lua @@ -0,0 +1,42 @@ + +--setter and getter mashine tire +function owl_tech.get_mashine_tire(meta) + return meta:get_int("_tire") +end +function owl_tech.set_mashine_tire(meta,value) + meta:set_int("_tire",value) +end +-------------------------------- +-- maceratro recips func +function owl_tech.can_macaerat_recips_go_in_this_mashien(meta,name,dst_its,dst_add_its) -- chek for tire , and slots for free space for res and add res + local ret =false + if MACERATO_RECIPS[name][2]<=owl_tech.get_mashine_tire(meta) + and (dst_its:is_empty() or(dst_its:get_name()==MACERATO_RECIPS[name][3] and dst_its:get_count()+MACERATO_RECIPS[name][4]<=dst_its:get_stack_max())) + and (dst_add_its:is_empty() or(dst_add_its:get_name()==MACERATO_RECIPS[name][7] and dst_add_its:get_count()+MACERATO_RECIPS[name][8]<=dst_add_its:get_stack_max())) then + ret =true + end + return ret +end +-------------------------------- +-- sieve recips func +function owl_tech.can_recips_go_in_this_mashien(meta,name,dst_its,dst_add_its) -- chek for tire , and slots for free space for res and add res + local ret =false + if SIEV_RESIPS[name][2]<=owl_tech.get_mashine_tire(meta) + and (dst_its:is_empty() or(dst_its:get_name()==SIEV_RESIPS[name][3] and dst_its:get_count()+SIEV_RESIPS[name][4]<=dst_its:get_stack_max())) + and (dst_add_its:is_empty() or(dst_add_its:get_name()==SIEV_RESIPS[name][7] and dst_add_its:get_count()+SIEV_RESIPS[name][8]<=dst_add_its:get_stack_max())) then + ret =true + end + return ret +end +-------------------------------- +-- smelter recips func +function owl_tech.can_smelter_recips_recips_go_in_this_mashien(meta,name,dst_its) -- chek for tire , and slots for free space for res and add res + local ret =false + if SMELTER_RECIPS[name][5]<=owl_tech.get_mashine_tire(meta) + and (dst_its:is_empty() or(dst_its:get_name()==SMELTER_RECIPS[name][3] and dst_its:get_count()+SMELTER_RECIPS[name][4]<=dst_its:get_stack_max())) then + ret =true + end + return ret +end +-------------------------------- + diff --git a/debug_tools/init.lua b/debug_tools/init.lua new file mode 100755 index 0000000..5e2c73f --- /dev/null +++ b/debug_tools/init.lua @@ -0,0 +1,41 @@ +local S = minetest.get_translator(minetest.get_current_modname()) +local name = minetest.get_current_modname() +local path = minetest.get_modpath(name) + + +minetest.register_craftitem("owl_tech:stick_of_truef", { + description = S("Stick of truef"), + _doc_items_longdesc = S("get all info about node and envirment"), + inventory_image = "owl_tech_stick_of_trufh.png", + stack_max = 64, + groups = { book=1, craftitem = 1 }, + on_use = function(itemstack, user, pointed_thing) + local name = user:get_player_name() + local pos = {} + --local bioms_table = biomeinfo.get_active_v6_biomes() + minetest.chat_send_player(name, "-------------------------------------------") + if pointed_thing.type == "node" then + pos = pointed_thing.under + minetest.chat_send_player(name, "Node pos-"..(minetest.pos_to_string(pos))) + minetest.chat_send_player(name, "Node name-"..((minetest.get_node(pos)).name)) + --minetest.chat_send_player(name, "All bioms list -"..(biomeinfo.all_v6_biomes())) + --minetest.chat_send_player(name, "All active bioms list -"..(biomeinfo.get_active_v6_biomes())) + minetest.chat_send_player(name, "Biom name -"..(biomeinfo.get_v6_biome(pos))) + minetest.chat_send_player(name, "Biom humidity -"..(biomeinfo.get_v6_humidity(pos))) + minetest.chat_send_player(name, "Biom heat -"..(biomeinfo.get_v6_heat(pos))) + elseif pointed_thing.type == "object" then + pos = pointed_thing.ref:get_pos() + minetest.chat_send_player(name, "Object pos-"..(minetest.pos_to_string(pos))) + --minetest.chat_send_player(name, "All bioms list -"..(biomeinfo.all_v6_biomes())) + --minetest.chat_send_player(name, "All active bioms list -"..(biomeinfo.get_active_v6_biomes())) + minetest.chat_send_player(name, "Biom name -"..(biomeinfo.get_v6_biome(pos))) + minetest.chat_send_player(name, "Biom humidity -"..(biomeinfo.get_v6_humidity(pos))) + minetest.chat_send_player(name, "Biom heat -"..(biomeinfo.get_v6_heat(pos))) + else + minetest.chat_send_player(name, "Dont use it in air -finde node or some object") + end + minetest.chat_send_player(name, "-------------------------------------------") + end +}) + + diff --git a/i3_integration/init.lua b/i3_integration/init.lua new file mode 100644 index 0000000..af3e5fd --- /dev/null +++ b/i3_integration/init.lua @@ -0,0 +1,42 @@ +---Integration for i3 + +i3.register_craft_type("alloy_smelter", { + description = "Alloy smetler", + icon = "owl_tech_smelter_face.png", +}) + +i3.register_craft_type("macerator", { --SIEV_RESIPS + description = "Macerator", + icon = "owl_tech_macerator_face.png", +}) + +i3.register_craft_type("siev", { + description = "Siev", + icon = "owl_tech_sieve_face.png", +}) + +for i, value in pairs(SMELTER_RECIPS) do + i3.register_craft { + type = "alloy_smelter", + result = value[3]..' '..value[4], + items = {value[7]..' '..value[1],value[8]..' '..value[2]}, + } +end + +for i, value in pairs(MACERATO_RECIPS) do + i3.register_craft { + type = "macerator", + result = value[3]..' '..value[4], + items = {value[9]..' '..value[1]}, + } +end + +for i, value in pairs(SIEV_RESIPS) do + i3.register_craft { + type = "siev", + result = value[3]..' '..value[4], + items = {value[9]..' '..value[1]}, + } +end + + diff --git a/init.lua b/init.lua new file mode 100755 index 0000000..8fd5a6e --- /dev/null +++ b/init.lua @@ -0,0 +1,20 @@ +local S = minetest.get_translator(minetest.get_current_modname()) +local name = minetest.get_current_modname() +local path = minetest.get_modpath(name) + +local i3_name = minetest.get_modpath('i3') + + +dofile(path .. "/api/init.lua") --all base func +dofile(path .. "/ore/init.lua") --ore loads +dofile(path .. "/debug_tools/init.lua") --debug_tools don.t use in surv game +--dofile(path .. "/xray/init.lua") --xray don.t use in surv game +dofile(path .. "/steam/init.lua") --main fail about all steam gen +dofile(path .. "/pipe/init.lua") --main fail about all pipes +dofile(path .. "/custom_recips/init.lua") --main fail about all custom recips +dofile(path .. "/mashins/init.lua") --main fail about all pipes +dofile(path .. "/lists_of_all.lua") --GLOBAL carialbe +if i3_name~=nil then + dofile(path .. "/i3_integration/init.lua") --i3 integration +end +dofile(path .. "/multiblocks/init.lua") --Multi-nodes \ No newline at end of file diff --git a/lists_of_all.lua b/lists_of_all.lua new file mode 100755 index 0000000..8f1ea0c --- /dev/null +++ b/lists_of_all.lua @@ -0,0 +1,58 @@ +--Global lists +GLOBAL_FLUID_LIST ={ + "mcl_water","mcl_lava" +} +INPUT_SLOT_NAME= { + "fluid_in","fuel",'input_in' +} +OUTPUT_SLOT_NAME={ + 'dst_add','dst' +} + + +local ore_duration = 4 +local ingot_duration = 2 +local smel_metal_duration = 2 + +-- key-input_name ----1)input_amount 2)recip_tire 3)output_name 4)output_amount 5)duration(use for 100) 6)seconds_chanse(0-100) 7)output_name_second 8)output_amount_second 9)Input full name +-- minus 10 key +MACERATO_RECIPS = { + --ore + iron_ore= {(1),(1),("owl_tech:iron_dirt_dust"),(2),(ore_duration),(25),("owl_tech:tin_dirt_dust"),(1),("owl_tech:iron_ore")}, + tin_ore = {(1),(1),("owl_tech:tin_dirt_dust"),(2),(ore_duration),(25),("owl_tech:iron_dirt_dust"),(1),("owl_tech:tin_ore")}, + copper_ore = {(1),(1),("owl_tech:copper_dirt_dust"),(2),(ore_duration),(25),("owl_tech:gold_dirt_dust"),(1),("owl_tech:copper_ore")}, + gold_ore = {(1),(1),("owl_tech:gold_dirt_dust"),(2),(ore_duration),(25),("owl_tech:copper_dirt_dust"),(1),("owl_tech:gold_ore")}, + silver_ore = {(1),(1),("owl_tech:silver_dirt_dust"),(2),(ore_duration),(25),("owl_tech:lead_dirt_dust"),(1),("owl_tech:silver_ore")}, + lead_ore = {(1),(1),("owl_tech:lead_dirt_dust"),(2),(ore_duration),(25),("owl_tech:silver_dirt_dust"),(1),("owl_tech:lead_ore")}, + coal_ore = {(1),(1),("owl_tech:coal_dirt_dust"),(2),(ore_duration),(25),("owl_tech:coal_dirt_dust"),(1),("owl_tech:coal_ore")}, + saltpeter_ore = {(1),(1),("owl_tech:saltpeter_dirt_dust"),(2),(ore_duration),(25),("owl_tech:sulfur_dirt_dust"),(1),("owl_tech:saltpeter_ore")}, + sulfur_ore = {(1),(1),("owl_tech:sulfur_dirt_dust"),(2),(ore_duration),(25),("owl_tech:saltpeter_dirt_dust"),(1),("owl_tech:sulfur_ore")}, + diamond_ore = {(1),(1),("owl_tech:diamond_dirt_dust"),(2),(ore_duration),(25),("owl_tech:coal_dirt_dust"),(1),("owl_tech:diamond_ore")}, + --ingots + iron_ingot = {(1),(1),("owl_tech:iron_dust"),(1),(ingot_duration),(0),("none"),(0),("owl_tech:iron_ingot")}, + tin_ingot = {(1),(1),("owl_tech:tin_dust"),(1),(ingot_duration),(0),("none"),(0),("owl_tech:tin_ingot")}, + copper_ingot = {(1),(1),("owl_tech:copper_dust"),(1),(ingot_duration),(0),("none"),(0),("owl_tech:copper_ingot")}, + gold_ingot = {(1),(1),("owl_tech:gold_dust"),(1),(ingot_duration),(0),("none"),(0),("owl_tech:gold_ingot")}, + silver_ingot = {(1),(1),("owl_tech:silver_dust"),(1),(ingot_duration),(0),("none"),(0),("owl_tech:silver_ingot")}, + lead_ingot = {(1),(1),("owl_tech:lead_dust"),(1),(ingot_duration),(0),("none"),(0),("owl_tech:lead_ingot")}, + steal_ingot = {(1),(1),("owl_tech:steal_dust"),(1),(ingot_duration),(0),("none"),(0),("owl_tech:steal_ingot")}, + bronze_ingot = {(1),(1),("owl_tech:bronze_dust"),(1),(ingot_duration),(0),("none"),(0),("owl_tech:bronze_ingot")}, +} +-- key-input_name ----1)1 input amount 2)2 input amount 3)output name 4)output amount 5)recipt tire 6)duration(use for 100) 7)name 1 input 8)name 2 input +SMELTER_RECIPS={ + tin_ingotcopper_ingot={(1),(3),("owl_tech:bronze_ingot"),(4),(1),(smel_metal_duration),'owl_tech:tin_ingot','owl_tech:copper_ingot'}, + copper_ingottin_ingot={(3),(1),("owl_tech:bronze_ingot"),(4),(1),(smel_metal_duration),'owl_tech:copper_ingot','owl_tech:tin_ingot'}, +} +-- key-input_name ----1)input_amount 2)recip_tire 3)output_name 4)output_amount 5)duration(use for 100) 6)seconds_chanse(0-100) 7)output_name_second 8)output_amount_second 9)Input full name +SIEV_RESIPS={ + iron_dirt_dust= {(1),(1),("owl_tech:iron_dust"),(2),(ore_duration),(25),("owl_tech:tin_dust"),(1),("owl_tech:iron_dirt_dust")}, + tin_dirt_dust= {(1),(1),("owl_tech:tin_dust"),(2),(ore_duration),(25),("owl_tech:iron_dust"),(1),("owl_tech:tin_dirt_dust")}, + copper_dirt_dust= {(1),(1),("owl_tech:copper_dust"),(2),(ore_duration),(25),("owl_tech:gold_dust"),(1),("owl_tech:copper_dirt_dust")}, + gold_dirt_dust= {(1),(1),("owl_tech:gold_dust"),(2),(ore_duration),(25),("owl_tech:copper_dust"),(1),("owl_tech:gold_dirt_dust")}, + silver_dirt_dust= {(1),(1),("owl_tech:silver_dust"),(2),(ore_duration),(25),("owl_tech:lead_dust"),(1),("owl_tech:silver_dirt_dust")}, + lead_dirt_dust= {(1),(1),("owl_tech:lead_dust"),(2),(ore_duration),(25),("owl_tech:silver_dust"),(1),("owl_tech:lead_dirt_dust")}, + coal_dirt_dust= {(1),(1),("owl_tech:coal_dust"),(2),(ore_duration),(25),("owl_tech:coal_dust"),(1),("owl_tech:coal_dirt_dust")}, + saltpeter_dirt_dust= {(1),(1),("owl_tech:saltpeter_dust"),(2),(ore_duration),(25),("owl_tech:sulfur_dust"),(1),("owl_tech:saltpeter_dirt_dust")}, + sulfur_dirt_dust= {(1),(1),("owl_tech:sulfur_dust"),(2),(ore_duration),(25),("owl_tech:saltpeter_dust"),(1),("owl_tech:sulfur_dirt_dust")}, + diamond_dirt_dust= {(1),(1),("owl_tech:diamond_dust"),(2),(ore_duration),(25),("owl_tech:diamond_dust"),(1),("owl_tech:diamond_dirt_dust")}, +} \ No newline at end of file diff --git a/mashins/init.lua b/mashins/init.lua new file mode 100755 index 0000000..91c601b --- /dev/null +++ b/mashins/init.lua @@ -0,0 +1,7 @@ +local S = minetest.get_translator(minetest.get_current_modname()) +local name = minetest.get_current_modname() +local path = minetest.get_modpath(name) + +dofile(path .. "/mashins/steam_machins.lua") --steam mashins +dofile(path .. "/mashins/vertical_miner.lua") --steam mashins +dofile(path .. "/mashins/quarry.lua") \ No newline at end of file diff --git a/mashins/quarry.lua b/mashins/quarry.lua new file mode 100644 index 0000000..eef5bdd --- /dev/null +++ b/mashins/quarry.lua @@ -0,0 +1,103 @@ +local S = minetest.get_translator(minetest.get_current_modname()) +local name = minetest.get_current_modname() +local path = minetest.get_modpath(name) + +minetest.register_node("owl_tech:quary_point", { + description = S("Quary point"), + _doc_items_longdesc = S("Point the pos for quary "), + tiles = { + "(owl_tech_base_meshanism_side.png^[colorize:#a35900:128)", + "(owl_tech_base_meshanism_side.png^[colorize:#a35900:128)", + "(owl_tech_base_meshanism_side.png^[colorize:#a35900:128)^owl_tech_quary_point.png", + "(owl_tech_base_meshanism_side.png^[colorize:#a35900:128)^owl_tech_quary_point.png", + "(owl_tech_base_meshanism_side.png^[colorize:#a35900:128)^owl_tech_quary_point.png", + "(owl_tech_base_meshanism_side.png^[colorize:#a35900:128)^owl_tech_quary_point.png", + }, + is_ground_content = false, + stack_max = 64, + groups = {pickaxey=2, owl_tech_machine=1,dst=1}, + sounds = mcl_sounds.node_sound_metal_defaults(), + paramtype2 = "facedir", + _mcl_blast_resistance = 6, + _mcl_hardness = 5, +}) + + +local function set_formspect_steam_quarry(meta) + local fluid_1_name = owl_tech.get_pull_fluid_name(meta,1) + local fluid_1_volume = owl_tech.get_pull_volume(meta,1) + local formspec = "size[9,8.75]".. + "label[0,4;"..minetest.formspec_escape(minetest.colorize("#313131", S("Inventory"))).."]".. + "list[current_player;main;0,4.5;9,3;9]".. + mcl_formspec.get_itemslot_bg(0,4.5,9,3).. + "list[current_player;main;0,7.74;9,1;]".. + mcl_formspec.get_itemslot_bg(0,7.74,9,1).. + "label[2.25,0;"..minetest.formspec_escape(minetest.colorize("#313131", S("Stean vertical miner"))).."]".. + "list[context;dst;5.5,1.5;1,1;]".. + mcl_formspec.get_itemslot_bg(5.5,1.5,1,1).. + "label[0,1.5;"..minetest.formspec_escape(minetest.colorize("#313131", (fluid_1_name.."--"..fluid_1_volume))).."]".. + "listring[context;dst]".. + "listring[current_player;main]".. + "listring[current_player;main]".. + "listring[current_player;main]" + meta:set_string("formspec", formspec) +end + + +minetest.register_node("owl_tech:steam_quarry", { + description = S("Steam quarry"), + _doc_items_longdesc = S("Dig the Hole"), + tiles = { + "(owl_tech_base_meshanism_side.png^[colorize:#a35900:128)", + "owl_tech_base_meshanism_side.png^[colorize:#a35900:128", + "(owl_tech_base_meshanism_side.png^[colorize:#a35900:128)^owl_tech_quary.png", + "(owl_tech_base_meshanism_side.png^[colorize:#a35900:128)^owl_tech_quary.png", + "(owl_tech_base_meshanism_side.png^[colorize:#a35900:128)^owl_tech_quary.png", + "(owl_tech_base_meshanism_side.png^[colorize:#a35900:128)^owl_tech_quary.png", + }, + is_ground_content = false, + stack_max = 64, + groups = {pickaxey=2, owl_tech_machine=1,dst=1}, + sounds = mcl_sounds.node_sound_metal_defaults(), + paramtype2 = "facedir", + _mcl_blast_resistance = 6, + _mcl_hardness = 5, + on_construct = function(pos) + local meta = minetest.get_meta(pos) + owl_tech.add_new_pull(meta,8000,1,0) --steam eat 25 steam in 1 tick + owl_tech.set_pull_fluid_whitlist(meta,1,"owl_tech_steam")--whitlist for make and output ONLY Steam + owl_tech.set_mashine_tire(meta,1) --all steam mishine has 1 tire + set_formspect_steam_quarry(meta) + owl_tech.prepear_for_verticak_steam_miner(pos) + local timer =minetest.get_node_timer(pos) + local inv = meta:get_inventory() + inv:set_size("dst", 1) + timer:start(2) + end, + on_timer = function(pos, elapsed) + local meta = minetest.get_meta(pos) + local timer = minetest.get_node_timer(pos) + if meta:get_int("min_x")==0 and meta:get_int("min_z")==0 then + owl_tech.scan_for_point(pos,meta,8) + end + if meta:get_int("get_bedrock")==0 and + owl_tech.get_pull_volume(meta,1)>=15 then + local inv = meta:get_inventory() + owl_tech.set_pull_volume(meta,1,owl_tech.get_pull_volume(meta,1)-15) + local can_mine = owl_tech.can_quary_mine_this(pos,meta) + owl_tech.diging_quary(pos,meta,can_mine) + end + if minetest.get_item_group((minetest.get_node({x=pos.x,y=pos.y+1,z=pos.z})).name,"fluid_pipe") then --get from pipe steam + local meta_up = minetest.get_meta({x=pos.x,y=pos.y+1,z=pos.z}) + local can_do ,inde_pull =owl_tech.test_add_fluid_in_any_pulls(meta,"owl_tech_steam",owl_tech.get_fluid_sand_in_tick(meta)) + local can_do2 ,inde_pull_2 , remove_amount =owl_tech.test_remove_fluid_in_any_pulls(meta_up,"owl_tech_steam",owl_tech.get_fluid_sand_in_tick(meta_up)) + if can_do and can_do2 then + owl_tech.add_fluid_in_node_pull(meta,"owl_tech_steam",remove_amount,inde_pull) + owl_tech.remove_fluid_in_node_pull(meta_up,remove_amount,inde_pull) + end + end + owl_tech.delit_name_fluid_if_0(meta) + set_formspect_steam_quarry(meta) + timer:start(0.2) + end +}) \ No newline at end of file diff --git a/mashins/steam_machins.lua b/mashins/steam_machins.lua new file mode 100755 index 0000000..70aa1d6 --- /dev/null +++ b/mashins/steam_machins.lua @@ -0,0 +1,400 @@ +local S = minetest.get_translator(minetest.get_current_modname()) +local name = minetest.get_current_modname() +local path = minetest.get_modpath(name) + +local function set_formspect_base_macerator(meta) + local fluid_1_name = owl_tech.get_pull_fluid_name(meta,1) + local fluid_1_volume = owl_tech.get_pull_volume(meta,1) + local redines = owl_tech.get_item_redines(meta) + local formspec = "size[9,8.75]".. + "label[0,4;"..minetest.formspec_escape(minetest.colorize("#313131", S("Inventory"))).."]".. + "list[current_player;main;0,4.5;9,3;9]".. + mcl_formspec.get_itemslot_bg(0,4.5,9,3).. + "list[current_player;main;0,7.74;9,1;]".. + mcl_formspec.get_itemslot_bg(0,7.74,9,1).. + "label[2.25,0;"..minetest.formspec_escape(minetest.colorize("#313131", S("Stean macerator"))).."]".. + "list[context;input_in;2.5,2.5;1,1;]".. + mcl_formspec.get_itemslot_bg(2.5,2.5,1,1).. + "list[context;dst;5.5,1.5;1,1;]".. + mcl_formspec.get_itemslot_bg(5.5,1.5,1,1).. + "list[context;dst_add;6.5,1.5;1,1;]".. + mcl_formspec.get_itemslot_bg(6.5,1.5,1,1).. + "label[0,1.5;"..minetest.formspec_escape(minetest.colorize("#313131", (fluid_1_name.."--"..fluid_1_volume))).."]".. + "label[0,2;"..minetest.formspec_escape(minetest.colorize("#313131", (redines.." / 100"))).."]".. + "listring[context;dst]".. + "listring[context;dst_add]".. + "listring[current_player;main]".. + "listring[context;input_in]".. + "listring[current_player;main]".. + "listring[current_player;main]" + meta:set_string("formspec", formspec) +end + +--bronze_macerator" +minetest.register_node("owl_tech:bronze_macerator", { + description = S("Bronze macerator"), + _doc_items_longdesc = S("Macerate ore in dust"), + tiles = { + "(owl_tech_base_meshanism_side.png^[colorize:#a35900:128)", + "owl_tech_base_meshanism_side.png^[colorize:#a35900:128", + "owl_tech_base_meshanism_side.png^[colorize:#a35900:128", + "owl_tech_base_meshanism_side.png^[colorize:#a35900:128", + "owl_tech_base_meshanism_side.png^[colorize:#a35900:128", + "(owl_tech_base_meshanism_side.png^[colorize:#a35900:128)^owl_tech_macerator_face.png", + }, + is_ground_content = false, + stack_max = 64, + groups = {pickaxey=2, owl_tech_machine=1,dst=1,dst_add=1}, + sounds = mcl_sounds.node_sound_metal_defaults(), + paramtype2 = "facedir", + _mcl_blast_resistance = 6, + _mcl_hardness = 5, + on_construct = function(pos) + local meta = minetest.get_meta(pos) + owl_tech.add_new_pull(meta,8000,1,0) --steam eat 25 steam in 1 tick + owl_tech.set_pull_fluid_whitlist(meta,1,"owl_tech_steam")--whitlist for make and output ONLY Steam + owl_tech.set_mashine_tire(meta,1) --all steam mishine has 1 tire + owl_tech.reset_item_redines(meta) + set_formspect_base_macerator(meta) + owl_tech.update_fluid_pipe_around(pos) + local timer =minetest.get_node_timer(pos) + local inv = meta:get_inventory() + inv:set_size("input_in", 1) + inv:set_size("dst", 1) + inv:set_size("dst_add", 1) + timer:start(0.2) + end, + on_timer = function(pos, elapsed) + local timer = minetest.get_node_timer(pos) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + local input_its = inv:get_stack('input_in', 1) + local dst_its = inv:get_stack('dst', 1) + local dst_add_its = inv:get_stack('dst_add', 1) + if not input_its:is_empty() then -- chek for item in slots + local name= string.sub(input_its:get_name(), 10) + if MACERATO_RECIPS[name]~=nil and owl_tech.get_item_redines(meta)>0 and owl_tech.get_item_redines(meta)<100 then --recipt real + if owl_tech.can_macaerat_recips_go_in_this_mashien(meta,name,dst_its,dst_add_its) then-- chek for all itemslot and machine tire + local amount=owl_tech.calculate_recipe_tire_bonus(meta,MACERATO_RECIPS[name][2],MACERATO_RECIPS[name][5]) + local steam_new =owl_tech.get_pull_volume(meta,1)-25 + owl_tech.set_pull_volume(meta,1,steam_new) + owl_tech.add_item_redines(meta,amount) + end + elseif MACERATO_RECIPS[name]~=nil and owl_tech.get_item_redines(meta)>=100 then + if owl_tech.can_macaerat_recips_go_in_this_mashien(meta,name,dst_its,dst_add_its) then-- chek for all itemslot and machine tire + + input_its:set_count(input_its:get_count()-1) --Remove item from input slot + inv:set_stack('input_in', 1, input_its) + + if not dst_its:is_empty() then-- Add main output + dst_its:set_count(dst_its:get_count()+MACERATO_RECIPS[name][4]) + inv:set_stack('dst', 1, dst_its) + else + local item ={name=MACERATO_RECIPS[name][3], count=MACERATO_RECIPS[name][4], wear=0, metadata=""} + dst_its:add_item(item) + inv:set_stack('dst', 1, dst_its) + end + + local random = math.random(1,100) --chans to get second output + if MACERATO_RECIPS[name][6]>random then-- Add second output if has + if not dst_add_its:is_empty() then + dst_add_its:set_count(dst_add_its:get_count()+MACERATO_RECIPS[name][8]) + inv:set_stack('dst_add', 1, dst_add_its) + else + local item ={name=MACERATO_RECIPS[name][7], count=MACERATO_RECIPS[name][8], wear=0, metadata=""} + dst_add_its:add_item(item) + inv:set_stack('dst_add', 1, dst_add_its) + end + end + local steam_new =owl_tech.get_pull_volume(meta,1)-25 + owl_tech.set_pull_volume(meta,1,steam_new) + owl_tech.reset_item_redines(meta) + end + elseif MACERATO_RECIPS[name]~=nil and 100/MACERATO_RECIPS[name][5]*25<= owl_tech.get_pull_volume(meta,1) and owl_tech.get_item_redines(meta)==0 then --begin for work + local amount=owl_tech.calculate_recipe_tire_bonus(meta,MACERATO_RECIPS[name][2],MACERATO_RECIPS[name][5]) + local steam_new =owl_tech.get_pull_volume(meta,1)-25 + owl_tech.set_pull_volume(meta,1,steam_new) + owl_tech.add_item_redines(meta,amount) + end + else + owl_tech.reset_item_redines(meta) + end + if minetest.get_item_group((minetest.get_node({x=pos.x,y=pos.y-1,z=pos.z})).name,"fluid_pipe") then --get from pipe steam + local meta_up = minetest.get_meta({x=pos.x,y=pos.y-1,z=pos.z}) + local can_do ,inde_pull =owl_tech.test_add_fluid_in_any_pulls(meta,"owl_tech_steam",owl_tech.get_fluid_sand_in_tick(meta)) + local can_do2 ,inde_pull_2 , remove_amount =owl_tech.test_remove_fluid_in_any_pulls(meta_up,"owl_tech_steam",owl_tech.get_fluid_sand_in_tick(meta_up)) + if can_do and can_do2 then + owl_tech.add_fluid_in_node_pull(meta,"owl_tech_steam",remove_amount,inde_pull) + owl_tech.remove_fluid_in_node_pull(meta_up,remove_amount,inde_pull) + end + end + owl_tech.delit_name_fluid_if_0(meta) + set_formspect_base_macerator(meta) + timer:start(0.2) + end +}) +--alloy smelter +local function set_formspect_base_alloy_smelter(meta) + local fluid_1_name = owl_tech.get_pull_fluid_name(meta,1) + local fluid_1_volume = owl_tech.get_pull_volume(meta,1) + local redines = owl_tech.get_item_redines(meta) + local formspec = "size[9,8.75]".. + "label[0,4;"..minetest.formspec_escape(minetest.colorize("#313131", S("Inventory"))).."]".. + "list[current_player;main;0,4.5;9,3;9]".. + mcl_formspec.get_itemslot_bg(0,4.5,9,3).. + "list[current_player;main;0,7.74;9,1;]".. + mcl_formspec.get_itemslot_bg(0,7.74,9,1).. + "label[2.75,0;"..minetest.formspec_escape(minetest.colorize("#313131", S("Steam alloy smelter"))).."]".. + "list[context;input_in;2.5,2.5;1,1;]".. + mcl_formspec.get_itemslot_bg(2.5,2.5,1,1).. + "list[context;input_in_add;4,2.5;1,1;]".. + mcl_formspec.get_itemslot_bg(4,2.5,1,1).. + "list[context;dst;5.5,1.5;1,1;]".. + mcl_formspec.get_itemslot_bg(5.5,1.5,1,1).. + "label[0,1.5;"..minetest.formspec_escape(minetest.colorize("#313131", (fluid_1_name.."--"..fluid_1_volume))).."]".. + "label[0,2;"..minetest.formspec_escape(minetest.colorize("#313131", (redines.." / 100"))).."]".. + "listring[context;dst]".. + "listring[current_player;main]".. + "listring[context;input_in]".. + "listring[context;input_in_add]".. + "listring[current_player;main]".. + "listring[current_player;main]" + meta:set_string("formspec", formspec) +end +------------------------------------------- +--bronze_alloy_smelter +minetest.register_node("owl_tech:bronze_alloy_smelter", { + description = S("Bronze alloy smelter"), + _doc_items_longdesc = S("Smelt alll"), + tiles = { + "(owl_tech_base_meshanism_side.png^[colorize:#a35900:128)", + "owl_tech_base_meshanism_side.png^[colorize:#a35900:128", + "owl_tech_base_meshanism_side.png^[colorize:#a35900:128", + "owl_tech_base_meshanism_side.png^[colorize:#a35900:128", + "owl_tech_base_meshanism_side.png^[colorize:#a35900:128", + "(owl_tech_base_meshanism_side.png^[colorize:#a35900:128)^owl_tech_smelter_face.png", + }, + is_ground_content = false, + stack_max = 64, + groups = {pickaxey=2, owl_tech_machine=1}, + sounds = mcl_sounds.node_sound_metal_defaults(), + paramtype2 = "facedir", + _mcl_blast_resistance = 6, + _mcl_hardness = 5, + on_construct = function(pos) + local meta = minetest.get_meta(pos) + owl_tech.add_new_pull(meta,8000,1,0) --steam eat 25 steam in 1 tick + owl_tech.set_pull_fluid_whitlist(meta,1,"owl_tech_steam")--whitlist for make and output ONLY Steam + owl_tech.set_mashine_tire(meta,1) --all steam mishine has 1 tire + owl_tech.reset_item_redines(meta) + set_formspect_base_alloy_smelter(meta) + owl_tech.update_fluid_pipe_around(pos) + local timer =minetest.get_node_timer(pos) + local inv = meta:get_inventory() + inv:set_size("input_in", 1) + inv:set_size("input_in_add", 1) + inv:set_size("dst", 1) + timer:start(0.2) + end, + on_timer = function(pos, elapsed) + local timer = minetest.get_node_timer(pos) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + local input_its = inv:get_stack('input_in', 1) + local input_its_add = inv:get_stack('input_in_add', 1) + local dst_its = inv:get_stack('dst', 1) + if not input_its:is_empty() then -- chek for item in slots + local name1= string.sub(input_its:get_name(), 10) + local name2 = string.sub(input_its_add:get_name(), 10) + local name ="" + local recipt_true = false + if SMELTER_RECIPS[name1..name2]~=nil then + recipt_true= true + name=name1..name2 + elseif SMELTER_RECIPS[name2..name1]~=nil then + recipt_true= true + name=name2..name1 + end + if recipt_true and owl_tech.get_item_redines(meta)>0 and owl_tech.get_item_redines(meta)<100 then --recipt real + + if owl_tech.can_smelter_recips_recips_go_in_this_mashien(meta,name,dst_its) then-- chek for all itemslot and machine tire + + local amount=owl_tech.calculate_recipe_tire_bonus(meta,SMELTER_RECIPS[name][5],SMELTER_RECIPS[name][6]) + local steam_new =owl_tech.get_pull_volume(meta,1)-25 + owl_tech.set_pull_volume(meta,1,steam_new) + owl_tech.add_item_redines(meta,amount) + end + elseif recipt_true and owl_tech.get_item_redines(meta)>=100 then + if owl_tech.can_smelter_recips_recips_go_in_this_mashien(meta,name,dst_its) then-- chek for all itemslot and machine tire + input_its:set_count(input_its:get_count()-1) --Remove item from input slot + inv:set_stack('input_in', 1, input_its) + input_its:set_count(input_its_add:get_count()-1) --Remove item from input slot + inv:set_stack('input_in_add', 1, input_its) + + if not dst_its:is_empty() then-- Add main output + dst_its:set_count(dst_its:get_count()+SMELTER_RECIPS[name][4]) + inv:set_stack('dst', 1, dst_its) + else + local item ={name=SMELTER_RECIPS[name][3], count=SMELTER_RECIPS[name][4], wear=0, metadata=""} + dst_its:add_item(item) + inv:set_stack('dst', 1, dst_its) + end + local steam_new =owl_tech.get_pull_volume(meta,1)-25 + owl_tech.set_pull_volume(meta,1,steam_new) + owl_tech.reset_item_redines(meta) + end + elseif recipt_true and 100/SMELTER_RECIPS[name][6]*25<= owl_tech.get_pull_volume(meta,1) and owl_tech.get_item_redines(meta)==0 then --begin for work + local amount=owl_tech.calculate_recipe_tire_bonus(meta,SMELTER_RECIPS[name][2],SMELTER_RECIPS[name][5]) + local steam_new =owl_tech.get_pull_volume(meta,1)-25 + owl_tech.set_pull_volume(meta,1,steam_new) + owl_tech.add_item_redines(meta,amount) + end + else + owl_tech.reset_item_redines(meta) + end + if minetest.get_item_group((minetest.get_node({x=pos.x,y=pos.y+1,z=pos.z})).name,"fluid_pipe") then --get from pipe steam + local meta_up = minetest.get_meta({x=pos.x,y=pos.y-1,z=pos.z}) + local can_do ,inde_pull =owl_tech.test_add_fluid_in_any_pulls(meta,"owl_tech_steam",owl_tech.get_fluid_sand_in_tick(meta)) + local can_do2 ,inde_pull_2 , remove_amount =owl_tech.test_remove_fluid_in_any_pulls(meta_up,"owl_tech_steam",owl_tech.get_fluid_sand_in_tick(meta_up)) + if can_do and can_do2 then + owl_tech.add_fluid_in_node_pull(meta,"owl_tech_steam",remove_amount,inde_pull) + owl_tech.remove_fluid_in_node_pull(meta_up,remove_amount,inde_pull) + end + end + owl_tech.delit_name_fluid_if_0(meta) + set_formspect_base_alloy_smelter(meta) + timer:start(0.2) + end +}) +------------------------------------------- +--base sieve +local function set_formspect_base_sieve(meta) + local fluid_1_name = owl_tech.get_pull_fluid_name(meta,1) + local fluid_1_volume = owl_tech.get_pull_volume(meta,1) + local redines = owl_tech.get_item_redines(meta) + local formspec = "size[9,8.75]".. + "label[0,4;"..minetest.formspec_escape(minetest.colorize("#313131", S("Inventory"))).."]".. + "list[current_player;main;0,4.5;9,3;9]".. + mcl_formspec.get_itemslot_bg(0,4.5,9,3).. + "list[current_player;main;0,7.74;9,1;]".. + mcl_formspec.get_itemslot_bg(0,7.74,9,1).. + "label[2.25,0;"..minetest.formspec_escape(minetest.colorize("#313131", S("Stean sieve"))).."]".. + "list[context;input_in;2.5,2.5;1,1;]".. + mcl_formspec.get_itemslot_bg(2.5,2.5,1,1).. + "list[context;dst;5.5,1.5;1,1;]".. + mcl_formspec.get_itemslot_bg(5.5,1.5,1,1).. + "list[context;dst_add;6.5,1.5;1,1;]".. + mcl_formspec.get_itemslot_bg(6.5,1.5,1,1).. + "label[0,1.5;"..minetest.formspec_escape(minetest.colorize("#313131", (fluid_1_name.."--"..fluid_1_volume))).."]".. + "label[0,2;"..minetest.formspec_escape(minetest.colorize("#313131", (redines.." / 100"))).."]".. + "listring[context;dst]".. + "listring[context;dst_add]".. + "listring[current_player;main]".. + "listring[context;input_in]".. + "listring[current_player;main]".. + "listring[current_player;main]" + meta:set_string("formspec", formspec) +end +--bronze_sieve" +minetest.register_node("owl_tech:bronze_sieve", { + description = S("Bronze sieve"), + _doc_items_longdesc = S("sieve alls"), + tiles = { + "(owl_tech_base_meshanism_side.png^[colorize:#a35900:128)", + "owl_tech_base_meshanism_side.png^[colorize:#a35900:128", + "owl_tech_base_meshanism_side.png^[colorize:#a35900:128", + "owl_tech_base_meshanism_side.png^[colorize:#a35900:128", + "owl_tech_base_meshanism_side.png^[colorize:#a35900:128", + "(owl_tech_base_meshanism_side.png^[colorize:#a35900:128)^owl_tech_sieve_face.png", + }, + is_ground_content = false, + stack_max = 64, + groups = {pickaxey=2, owl_tech_machine=1}, + sounds = mcl_sounds.node_sound_metal_defaults(), + paramtype2 = "facedir", + _mcl_blast_resistance = 6, + _mcl_hardness = 5, + on_construct = function(pos) + local meta = minetest.get_meta(pos) + owl_tech.add_new_pull(meta,8000,1,0) --steam eat 25 steam in 1 tick + owl_tech.set_pull_fluid_whitlist(meta,1,"owl_tech_steam")--whitlist for make and output ONLY Steam + owl_tech.set_mashine_tire(meta,1) --all steam mishine has 1 tire + owl_tech.reset_item_redines(meta) + set_formspect_base_sieve(meta) + owl_tech.update_fluid_pipe_around(pos) + local timer =minetest.get_node_timer(pos) + local inv = meta:get_inventory() + inv:set_size("input_in", 1) + inv:set_size("dst", 1) + inv:set_size("dst_add", 1) + timer:start(0.2) + end, + on_timer = function(pos, elapsed) + local timer = minetest.get_node_timer(pos) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + local input_its = inv:get_stack('input_in', 1) + local dst_its = inv:get_stack('dst', 1) + local dst_add_its = inv:get_stack('dst_add', 1) + if not input_its:is_empty() then -- chek for item in slots + local name= string.sub(input_its:get_name(), 10) + if SIEV_RESIPS[name]~=nil and owl_tech.get_item_redines(meta)>0 and owl_tech.get_item_redines(meta)<100 then --recipt real + if owl_tech.can_recips_go_in_this_mashien(meta,name,dst_its,dst_add_its) then-- chek for all itemslot and machine tire + local amount=owl_tech.calculate_recipe_tire_bonus(meta,SIEV_RESIPS[name][2],SIEV_RESIPS[name][5]) + local steam_new =owl_tech.get_pull_volume(meta,1)-25 + owl_tech.set_pull_volume(meta,1,steam_new) + owl_tech.add_item_redines(meta,amount) + end + elseif SIEV_RESIPS[name]~=nil and owl_tech.get_item_redines(meta)>=100 then + if owl_tech.can_recips_go_in_this_mashien(meta,name,dst_its,dst_add_its) then-- chek for all itemslot and machine tire + + input_its:set_count(input_its:get_count()-1) --Remove item from input slot + inv:set_stack('input_in', 1, input_its) + + if not dst_its:is_empty() then-- Add main output + dst_its:set_count(dst_its:get_count()+SIEV_RESIPS[name][4]) + inv:set_stack('dst', 1, dst_its) + else + local item ={name=SIEV_RESIPS[name][3], count=SIEV_RESIPS[name][4], wear=0, metadata=""} + dst_its:add_item(item) + inv:set_stack('dst', 1, dst_its) + end + + local random = math.random(1,100) --chans to get second output + if SIEV_RESIPS[name][6]>random then-- Add second output if has + if not dst_add_its:is_empty() then + dst_add_its:set_count(dst_add_its:get_count()+SIEV_RESIPS[name][8]) + inv:set_stack('dst_add', 1, dst_add_its) + else + local item ={name=SIEV_RESIPS[name][7], count=SIEV_RESIPS[name][8], wear=0, metadata=""} + dst_add_its:add_item(item) + inv:set_stack('dst_add', 1, dst_add_its) + end + end + local steam_new =owl_tech.get_pull_volume(meta,1)-25 + owl_tech.set_pull_volume(meta,1,steam_new) + owl_tech.reset_item_redines(meta) + end + elseif SIEV_RESIPS[name]~=nil and 100/SIEV_RESIPS[name][5]*25<= owl_tech.get_pull_volume(meta,1) and owl_tech.get_item_redines(meta)==0 then --begin for work + local amount=owl_tech.calculate_recipe_tire_bonus(meta,SIEV_RESIPS[name][2],SIEV_RESIPS[name][5]) + local steam_new =owl_tech.get_pull_volume(meta,1)-25 + owl_tech.set_pull_volume(meta,1,steam_new) + owl_tech.add_item_redines(meta,amount) + end + else + owl_tech.reset_item_redines(meta) + end + if minetest.get_item_group((minetest.get_node({x=pos.x,y=pos.y+1,z=pos.z})).name,"fluid_pipe") then --get from pipe steam + local meta_up = minetest.get_meta({x=pos.x,y=pos.y-1,z=pos.z}) + local can_do ,inde_pull =owl_tech.test_add_fluid_in_any_pulls(meta,"owl_tech_steam",owl_tech.get_fluid_sand_in_tick(meta)) + local can_do2 ,inde_pull_2 , remove_amount =owl_tech.test_remove_fluid_in_any_pulls(meta_up,"owl_tech_steam",owl_tech.get_fluid_sand_in_tick(meta_up)) + if can_do and can_do2 then + owl_tech.add_fluid_in_node_pull(meta,"owl_tech_steam",remove_amount,inde_pull) + owl_tech.remove_fluid_in_node_pull(meta_up,remove_amount,inde_pull) + end + end + owl_tech.delit_name_fluid_if_0(meta) + set_formspect_base_sieve(meta) + timer:start(0.2) + end +}) \ No newline at end of file diff --git a/mashins/vertical_miner.lua b/mashins/vertical_miner.lua new file mode 100644 index 0000000..3c71873 --- /dev/null +++ b/mashins/vertical_miner.lua @@ -0,0 +1,81 @@ +local S = minetest.get_translator(minetest.get_current_modname()) +local name = minetest.get_current_modname() +local path = minetest.get_modpath(name) + +local function set_formspect_steam_vertical_miner(meta) + local fluid_1_name = owl_tech.get_pull_fluid_name(meta,1) + local fluid_1_volume = owl_tech.get_pull_volume(meta,1) + local formspec = "size[9,8.75]".. + "label[0,4;"..minetest.formspec_escape(minetest.colorize("#313131", S("Inventory"))).."]".. + "list[current_player;main;0,4.5;9,3;9]".. + mcl_formspec.get_itemslot_bg(0,4.5,9,3).. + "list[current_player;main;0,7.74;9,1;]".. + mcl_formspec.get_itemslot_bg(0,7.74,9,1).. + "label[2.25,0;"..minetest.formspec_escape(minetest.colorize("#313131", S("Stean vertical miner"))).."]".. + "list[context;dst;5.5,1.5;1,1;]".. + mcl_formspec.get_itemslot_bg(5.5,1.5,1,1).. + "label[0,1.5;"..minetest.formspec_escape(minetest.colorize("#313131", (fluid_1_name.."--"..fluid_1_volume))).."]".. + "listring[context;dst]".. + "listring[current_player;main]".. + "listring[current_player;main]".. + "listring[current_player;main]" + meta:set_string("formspec", formspec) +end + + +minetest.register_node("owl_tech:steam_vertical_miner", { + description = S("Vertical miner"), + _doc_items_longdesc = S("Dig the hole"), + tiles = { + "(owl_tech_base_meshanism_side.png^[colorize:#a35900:128)", + "owl_tech_base_meshanism_side.png^[colorize:#a35900:128", + "(owl_tech_base_meshanism_side.png^[colorize:#a35900:128)^owl_tech_vertical_miner_face.png", + "(owl_tech_base_meshanism_side.png^[colorize:#a35900:128)^owl_tech_vertical_miner_face.png", + "(owl_tech_base_meshanism_side.png^[colorize:#a35900:128)^owl_tech_vertical_miner_face.png", + "(owl_tech_base_meshanism_side.png^[colorize:#a35900:128)^owl_tech_vertical_miner_face.png", + }, + is_ground_content = false, + stack_max = 64, + groups = {pickaxey=2, owl_tech_machine=1,dst=1}, + sounds = mcl_sounds.node_sound_metal_defaults(), + paramtype2 = "facedir", + _mcl_blast_resistance = 6, + _mcl_hardness = 5, + on_construct = function(pos) + local meta = minetest.get_meta(pos) + owl_tech.add_new_pull(meta,8000,1,0) --steam eat 25 steam in 1 tick + owl_tech.set_pull_fluid_whitlist(meta,1,"owl_tech_steam")--whitlist for make and output ONLY Steam + owl_tech.set_mashine_tire(meta,1) --all steam mishine has 1 tire + set_formspect_steam_vertical_miner(meta) + owl_tech.prepear_for_verticak_steam_miner(pos) + local timer =minetest.get_node_timer(pos) + local inv = meta:get_inventory() + inv:set_size("dst", 1) + timer:start(2) + end, + on_timer = function(pos, elapsed) + local meta = minetest.get_meta(pos) + local timer = minetest.get_node_timer(pos) + if meta:get_int("get_bedrock")==0 and + owl_tech.get_pull_volume(meta,1)>=15 then + local inv = meta:get_inventory() + owl_tech.set_pull_volume(meta,1,owl_tech.get_pull_volume(meta,1)-15) + owl_tech.vertical_steam_mine(pos,meta,owl_tech.can_vertical_steam_miner_mine_this(pos,meta)) + end + if minetest.get_item_group((minetest.get_node({x=pos.x,y=pos.y+1,z=pos.z})).name,"fluid_pipe") then --get from pipe steam + local meta_up = minetest.get_meta({x=pos.x,y=pos.y+1,z=pos.z}) + local can_do ,inde_pull =owl_tech.test_add_fluid_in_any_pulls(meta,"owl_tech_steam",owl_tech.get_fluid_sand_in_tick(meta)) + local can_do2 ,inde_pull_2 , remove_amount =owl_tech.test_remove_fluid_in_any_pulls(meta_up,"owl_tech_steam",owl_tech.get_fluid_sand_in_tick(meta_up)) + if can_do and can_do2 then + owl_tech.add_fluid_in_node_pull(meta,"owl_tech_steam",remove_amount,inde_pull) + owl_tech.remove_fluid_in_node_pull(meta_up,remove_amount,inde_pull) + end + end + owl_tech.delit_name_fluid_if_0(meta) + set_formspect_steam_vertical_miner(meta) + timer:start(0.2) + end, + on_destruct = function(pos) + owl_tech.remove_all_pipe_vertical(pos) + end +}) \ No newline at end of file diff --git a/mod.conf b/mod.conf new file mode 100755 index 0000000..5912516 --- /dev/null +++ b/mod.conf @@ -0,0 +1,7 @@ +name = owl_tech +author = ConfidentOwl +depends = mcl_core + +description = Big tech mod + +release = 0.001 diff --git a/ore/init.lua b/ore/init.lua new file mode 100755 index 0000000..292df0c --- /dev/null +++ b/ore/init.lua @@ -0,0 +1,10 @@ +local S = minetest.get_translator(minetest.get_current_modname()) +local name = minetest.get_current_modname() +local path = minetest.get_modpath(name) + +dofile(minetest.get_modpath("owl_tech") .. "/ore/node_register.lua") --ore node load +dofile(minetest.get_modpath("owl_tech") .. "/ore/ore_gen.lua") --ore node load + +--All ore logick put hear!!! + + diff --git a/ore/node_register.lua b/ore/node_register.lua new file mode 100755 index 0000000..fefd87f --- /dev/null +++ b/ore/node_register.lua @@ -0,0 +1,264 @@ +local S = minetest.get_translator(minetest.get_current_modname()) +local name = minetest.get_current_modname() +local path = minetest.get_modpath(name) +--delite vanila ores (dont foget make confige for it) +--[[local ore_for_delite ={"mcl_core:stone_with_coal","mcl_core:stone_with_iron","mcl_core:stone_with_redstone","mcl_core:stone_with_lapis","mcl_core:stone_with_diamond",} +for i, value in ipairs(ore_for_delite) do + minetest.unregister_item(ore_for_delite[i]) +end]] +--wanila res remove !!!! + +-- 1)tech_name 2)useal name 3)ineed ore ? 4)pickasxe_level 5)color +local metals_ore_array={ + {"iron","Iron ",true,3,"#f7f7f7"}, + {"copper","Copper ",true,2,"#ff5e00"}, + {"tin","Tin ",true,2,"#c9c9c9"}, + {"gold","Gold ",true,2,"#ffe600"}, + {"silver","Silver ",true,3,"#d1d1d1"}, + {"lead","Lead ",true,3,"#9092ab"}, + {"steal","Steal ",false,3,"#575757"}, + {"bronze","Bronze ",false,3,"#a35900"}, +} +--make metals ALL +for i, value in ipairs(metals_ore_array) do + --ore + if metals_ore_array[i][3] then + minetest.register_node("owl_tech:"..metals_ore_array[i][1].."_ore", { + description = S(metals_ore_array[i][2].." ore"), + _doc_items_longdesc = S(metals_ore_array[i][2]..' ore'), + _doc_items_hidden = false, + tiles = {"default_stone.png^(owl_tech_ore_base.png^[colorize:"..metals_ore_array[i][5]..":128)"}, + is_ground_content = true, + stack_max = 64, + groups = {pickaxey=metals_ore_array[i][4], building_block=1, material_stone=1, blast_furnace_smeltable=1}, + drop = "owl_tech:"..metals_ore_array[i][1].."_ore", + sounds = mcl_sounds.node_sound_stone_defaults(), + _mcl_blast_resistance = 3, + _mcl_hardness = 3, + _mcl_silk_touch_drop = true, + }) + end + --Nugget + minetest.register_craftitem("owl_tech:"..metals_ore_array[i][1].."_nugget", { + description = S(metals_ore_array[i][2].. " Nugget"), + _doc_items_longdesc = S(metals_ore_array[i][2].. " Nugget"), + inventory_image = "mcl_core_iron_nugget.png^[colorize:"..metals_ore_array[i][5]..":128", + stack_max = 64, + groups = { craftitem=1 }, + }) + --Ingot + minetest.register_craftitem("owl_tech:"..metals_ore_array[i][1].."_ingot", { + description = S(metals_ore_array[i][2].. " Ingot"), + _doc_items_longdesc = S(metals_ore_array[i][2].. " Ingot"), + inventory_image = "default_steel_ingot.png^[colorize:"..metals_ore_array[i][5]..":128", + stack_max = 64, + groups = { craftitem=1 }, + }) + --dust + minetest.register_craftitem("owl_tech:"..metals_ore_array[i][1].."_dust", { + description = S(metals_ore_array[i][2].. " dust"), + _doc_items_longdesc = S(metals_ore_array[i][2].. " dust"), + inventory_image = "owl_tech_dust.png^[colorize:"..metals_ore_array[i][5]..":128", + stack_max = 64, + groups = { craftitem=1 }, + }) + --dirt dust + minetest.register_craftitem("owl_tech:"..metals_ore_array[i][1].."_dirt_dust", { + description = S(metals_ore_array[i][2].. " dirt dust"), + _doc_items_longdesc = S(metals_ore_array[i][2].. " dirt dust"), + inventory_image = "owl_tech_dirt_dust.png^[colorize:"..metals_ore_array[i][5]..":128", + stack_max = 64, + groups = { craftitem=1 }, + }) + --plate + minetest.register_craftitem("owl_tech:"..metals_ore_array[i][1].."_plate", { + description = S(metals_ore_array[i][2].. " plate"), + _doc_items_longdesc = S(metals_ore_array[i][2].. " plate"), + inventory_image = "owl_tech_plate.png^[colorize:"..metals_ore_array[i][5]..":128", + stack_max = 64, + groups = { craftitem=1 }, + }) + --stick + minetest.register_craftitem("owl_tech:"..metals_ore_array[i][1].."_stick", { + description = S(metals_ore_array[i][2].. " stick"), + _doc_items_longdesc = S(metals_ore_array[i][2].. " stick"), + inventory_image = "owl_tech_stick.png^[colorize:"..metals_ore_array[i][5]..":128", + stack_max = 64, + groups = { craftitem=1 }, + }) + --Block + minetest.register_node("owl_tech:"..metals_ore_array[i][1].."block", { + description = S("Block of "..metals_ore_array[i][2]), + _doc_items_longdesc = S("Block of "..metals_ore_array[i][2]), + tiles = {"default_steel_block.png^[colorize:"..metals_ore_array[i][5]..":128"}, + is_ground_content = false, + stack_max = 64, + groups = {pickaxey=metals_ore_array[i][4], building_block=1}, + sounds = mcl_sounds.node_sound_metal_defaults(), + _mcl_blast_resistance = 6, + _mcl_hardness = 5, + }) + --Block dust + minetest.register_node("owl_tech:"..metals_ore_array[i][1].."_dust_block", { + description = S("Dust block of "..metals_ore_array[i][2]), + _doc_items_longdesc = S("Block of "..metals_ore_array[i][2]), + tiles = {"owl_tech_dust_block_1.png^[colorize:"..metals_ore_array[i][5]..":128"}, + is_ground_content = false, + stack_max = 64, + groups = {pickaxey=metals_ore_array[i][4], building_block=1}, + sounds = mcl_sounds.node_sound_metal_defaults(), + _mcl_blast_resistance = 6, + _mcl_hardness = 5, + }) + --Crafte ingot from nugets + minetest.register_craft({ + type = "shaped", + output = "owl_tech:"..metals_ore_array[i][1].."_ingot", + recipe = { + {"owl_tech:"..metals_ore_array[i][1].."_nugget","owl_tech:"..metals_ore_array[i][1].."_nugget","owl_tech:"..metals_ore_array[i][1].."_nugget"}, + {"owl_tech:"..metals_ore_array[i][1].."_nugget","owl_tech:"..metals_ore_array[i][1].."_nugget","owl_tech:"..metals_ore_array[i][1].."_nugget"}, + {"owl_tech:"..metals_ore_array[i][1].."_nugget","owl_tech:"..metals_ore_array[i][1].."_nugget","owl_tech:"..metals_ore_array[i][1].."_nugget"} + } + }) + --Crafte block from ingots + minetest.register_craft({ + type = "shaped", + output = "owl_tech:"..metals_ore_array[i][1].."block", + recipe = { + {"owl_tech:"..metals_ore_array[i][1].."_ingot","owl_tech:"..metals_ore_array[i][1].."_ingot","owl_tech:"..metals_ore_array[i][1].."_ingot"}, + {"owl_tech:"..metals_ore_array[i][1].."_ingot","owl_tech:"..metals_ore_array[i][1].."_ingot","owl_tech:"..metals_ore_array[i][1].."_ingot"}, + {"owl_tech:"..metals_ore_array[i][1].."_ingot","owl_tech:"..metals_ore_array[i][1].."_ingot","owl_tech:"..metals_ore_array[i][1].."_ingot"} + } + }) + --Crafte block dust from ingots + minetest.register_craft({ + type = "shaped", + output = "owl_tech:"..metals_ore_array[i][1].."_dust_block", + recipe = { + {"owl_tech:"..metals_ore_array[i][1].."_dust","owl_tech:"..metals_ore_array[i][1].."_dust","owl_tech:"..metals_ore_array[i][1].."_dust"}, + {"owl_tech:"..metals_ore_array[i][1].."_dust","owl_tech:"..metals_ore_array[i][1].."_dust","owl_tech:"..metals_ore_array[i][1].."_dust"}, + {"owl_tech:"..metals_ore_array[i][1].."_dust","owl_tech:"..metals_ore_array[i][1].."_dust","owl_tech:"..metals_ore_array[i][1].."_dust"} + } + }) + --Crafte ingots from block + minetest.register_craft({ + type = "shapeless", + output = "owl_tech:"..metals_ore_array[i][1].."_ingot 9", + recipe = {"owl_tech:"..metals_ore_array[i][1].."block"} + }) + --Crafte dust from block + minetest.register_craft({ + type = "shapeless", + output = "owl_tech:"..metals_ore_array[i][1].."_dust 9", + recipe = {"owl_tech:"..metals_ore_array[i][1].."_dust_block"} + }) + +end +-- 1)tech_name 2)useal name 3)need ore ? 4)pickasxe_level 5)color 6)gem_base 7)gem_block_base 8)dust_block 9)burn fuel + +local gems_orew_array={ + {"coal","Coal ",true,1,"#1b1b1b","owl_tech_gem_1.png","owl_tech_gem_block_1.png","owl_tech_dust_block_1.png",80}, + {"sulfur","Sulfur ",true,1,"#c2a800","owl_tech_gem_1.png","owl_tech_gem_block_1.png","owl_tech_dust_block_1.png",0}, + {"saltpeter","Saltpeter ",true,1,"#b3e6ee","owl_tech_gem_1.png","owl_tech_gem_block_1.png","owl_tech_dust_block_1.png",0}, + {"diamond","Diamond ",true,3,"#77cefb","owl_tech_gem_2.png","owl_tech_gem_block_2.png","owl_tech_dust_block_1.png",0}, + +} +for i, value in ipairs(gems_orew_array) do + --ore + if gems_orew_array[i][3] then + minetest.register_node("owl_tech:"..gems_orew_array[i][1].."_ore", { + description = S(gems_orew_array[i][2].." ore"), + _doc_items_longdesc = S(gems_orew_array[i][2]..' ore'), + _doc_items_hidden = false, + tiles = {"default_stone.png^(owl_tech_ore_base.png^[colorize:"..gems_orew_array[i][5]..":128)"}, + is_ground_content = true, + stack_max = 64, + groups = {pickaxey=gems_orew_array[i][4], building_block=1, material_stone=1, blast_furnace_smeltable=1}, + drop = "owl_tech:coal_ore", + sounds = mcl_sounds.node_sound_stone_defaults(), + _mcl_blast_resistance = 3, + _mcl_hardness = 3, + _mcl_silk_touch_drop = true, + }) + end + --dust + minetest.register_craftitem("owl_tech:"..gems_orew_array[i][1].."_dust", { + description = S(gems_orew_array[i][2].. " dust"), + _doc_items_longdesc = S(gems_orew_array[i][2].. " dust"), + inventory_image = "owl_tech_dust.png^[colorize:"..gems_orew_array[i][5]..":128", + stack_max = 64, + groups = { craftitem=1 }, + }) + --dirt dust + minetest.register_craftitem("owl_tech:"..gems_orew_array[i][1].."_dirt_dust", { + description = S(gems_orew_array[i][2].. " dirt dust"), + _doc_items_longdesc = S(gems_orew_array[i][2].. " dirt dust"), + inventory_image = "owl_tech_dirt_dust.png^[colorize:"..gems_orew_array[i][5]..":128", + stack_max = 64, + groups = { craftitem=1 }, + }) + --gem + minetest.register_craftitem("owl_tech:"..gems_orew_array[i][1], { + description = S(gems_orew_array[i][2]), + _doc_items_longdesc = S(gems_orew_array[i][2]), + inventory_image = gems_orew_array[i][6].."^[colorize:"..gems_orew_array[i][5]..":128", + stack_max = 64, + groups = { craftitem=1 }, + }) + --plate + minetest.register_craftitem("owl_tech:"..gems_orew_array[i][1].."_plate", { + description = S(gems_orew_array[i][2].. " plate"), + _doc_items_longdesc = S(gems_orew_array[i][2].. " plate"), + inventory_image = "owl_tech_plate.png^[colorize:"..gems_orew_array[i][5]..":128", + stack_max = 64, + groups = { craftitem=1 }, + }) + --stick + minetest.register_craftitem("owl_tech:"..gems_orew_array[i][1].."_stick", { + description = S(gems_orew_array[i][2].. " stick"), + _doc_items_longdesc = S(gems_orew_array[i][2].. " stick"), + inventory_image = "owl_tech_stick.png^[colorize:"..gems_orew_array[i][5]..":128", + stack_max = 64, + groups = { craftitem=1 }, + }) + --burn time gem + if gems_orew_array[i][9]>0 then + minetest.register_craft({ + type = "fuel", + recipe = "owl_tech:"..gems_orew_array[i][1], + burntime = gems_orew_array[i][9], + }) + end + --Block + minetest.register_node("owl_tech:"..gems_orew_array[i][1].."_block", { + description = S("Block of "..gems_orew_array[i][2]), + _doc_items_longdesc = S("Block of "..gems_orew_array[i][2]), + tiles = {gems_orew_array[i][7].."^[colorize:"..gems_orew_array[i][5]..":128"}, + is_ground_content = false, + stack_max = 64, + groups = {pickaxey=gems_orew_array[i][4], building_block=1}, + sounds = mcl_sounds.node_sound_metal_defaults(), + _mcl_blast_resistance = 6, + _mcl_hardness = 5, + }) + --burn time block + if gems_orew_array[i][9]>0 then + minetest.register_craft({ + type = "fuel", + recipe = "owl_tech:"..gems_orew_array[i][1].."_block", + burntime = gems_orew_array[i][9]*9, + }) + end + --Block dust + minetest.register_node("owl_tech:"..gems_orew_array[i][1].."_dust_block", { + description = S("Block of "..gems_orew_array[i][2]), + _doc_items_longdesc = S("Block of "..gems_orew_array[i][2]), + tiles = {gems_orew_array[i][8].."^[colorize:"..gems_orew_array[i][5]..":128"}, + is_ground_content = false, + stack_max = 64, + groups = {pickaxey=gems_orew_array[i][4], building_block=1}, + sounds = mcl_sounds.node_sound_metal_defaults(), + _mcl_blast_resistance = 6, + _mcl_hardness = 5, + }) +end \ No newline at end of file diff --git a/ore/ore_gen.lua b/ore/ore_gen.lua new file mode 100755 index 0000000..6add889 --- /dev/null +++ b/ore/ore_gen.lua @@ -0,0 +1,332 @@ +local stonelike = {"mcl_core:stone", "mcl_core:diorite", "mcl_core:andesite", "mcl_core:granite"} +--------------------------------- Coal +minetest.register_ore({ + ore_type = "vein", + ore = "owl_tech:coal_ore", + wherein = stonelike, + clust_scarcity = 4*4*4, + clust_num_ores = 2048, + clust_size = 3, + y_min = -31000, + y_max = 31000, + noise_params = { + offset = 0, + scale = 3, + spread = {x=100, y=100, z=100}, + seed = 423423, + octaves = 3, + persistence = 0,1, + lacunarity = 4, + }, + noise_threshold = 1.5, + random_factor = 1.0, +}) + +minetest.register_ore({ + ore_type = "vein", + ore = "owl_tech:coal_ore", + wherein = stonelike, + clust_scarcity = 4*4*4, + clust_num_ores = 2048, + clust_size = 3, + y_min = -31000, + y_max = 31000, + noise_params = { + offset = 0, + scale = 3, + spread = {x=100, y=100, z=100}, + seed = 423423, + octaves = 3, + persistence = 0,1, + lacunarity = 4, + }, + noise_threshold = 1.5 , + random_factor = 1.0, +}) +minetest.register_ore({ + ore_type = "vein", + ore = "owl_tech:coal_ore", + wherein = stonelike, + clust_scarcity = 4*4*4, + clust_num_ores = 2048, + clust_size = 3, + y_min = -31000, + y_max = 31000, + noise_params = { + offset = 0, + scale = 3, + spread = {x=100, y=100, z=100}, + seed = 423423, + octaves = 3, + persistence = 0,1, + lacunarity = 4, + }, + noise_threshold = 1.5 , + random_factor = 1.0, +}) +-------------------------------------- +--------------------------------- iron +minetest.register_ore({ + ore_type = "vein", + ore = "owl_tech:iron_ore", + wherein = stonelike, + clust_scarcity = 4*4*4, + clust_num_ores = 2048, + clust_size = 3, + y_min = -31000, + y_max = 31000, + noise_params = { + offset = 0, + scale = 3, + spread = {x=125, y=125, z=125}, + seed = 12341423, + octaves = 3, + persistence = 0,1, + lacunarity = 4, + }, + noise_threshold = 1.6, + random_factor = 1.0, +}) + +minetest.register_ore({ + ore_type = "vein", + ore = "owl_tech:iron_ore", + wherein = stonelike, + clust_scarcity = 4*4*4, + clust_num_ores = 2048, + clust_size = 3, + y_min = -31000, + y_max = 31000, + noise_params = { + offset = 0, + scale = 3, + spread = {x=125, y=125, z=125}, + seed = 12341423, + octaves = 3, + persistence = 0,1, + lacunarity = 4, + }, + noise_threshold = 1.6 , + random_factor = 1.0, +}) +-------------------------------------- +--------------------------------- copper +minetest.register_ore({ + ore_type = "vein", + ore = "owl_tech:copper_ore", + wherein = stonelike, + clust_scarcity = 4*4*4, + clust_num_ores = 2048, + clust_size = 3, + y_min = -31000, + y_max = 31000, + noise_params = { + offset = 0, + scale = 3, + spread = {x=125, y=125, z=125}, + seed = 456456, + octaves = 3, + persistence = 0,1, + lacunarity = 4, + }, + noise_threshold = 1.6, + random_factor = 1.0, +}) + +minetest.register_ore({ + ore_type = "vein", + ore = "owl_tech:copper_ore", + wherein = stonelike, + clust_scarcity = 4*4*4, + clust_num_ores = 2048, + clust_size = 3, + y_min = -31000, + y_max = 31000, + noise_params = { + offset = 0, + scale = 3, + spread = {x=125, y=125, z=125}, + seed = 456456, + octaves = 3, + persistence = 0,1, + lacunarity = 4, + }, + noise_threshold = 1.6 , + random_factor = 1.0, +}) +-------------------------------------- +--------------------------------- tin +minetest.register_ore({ + ore_type = "vein", + ore = "owl_tech:tin_ore", + wherein = stonelike, + clust_scarcity = 4*4*4, + clust_num_ores = 2048, + clust_size = 3, + y_min = -31000, + y_max = 31000, + noise_params = { + offset = 0, + scale = 3, + spread = {x=75, y=75, z=75}, + seed = 879789, + octaves = 3, + persistence = 0,1, + lacunarity = 4, + }, + noise_threshold = 1.6, + random_factor = 1.0, +}) + +minetest.register_ore({ + ore_type = "vein", + ore = "owl_tech:tin_ore", + wherein = stonelike, + clust_scarcity = 4*4*4, + clust_num_ores = 2048, + clust_size = 3, + y_min = -31000, + y_max = 31000, + noise_params = { + offset = 0, + scale = 3, + spread = {x=75, y=75, z=75}, + seed = 879789, + octaves = 3, + persistence = 0,1, + lacunarity = 4, + }, + noise_threshold = 1.6 , + random_factor = 1.0, +}) +-------------------------------------- +--------------------------------- gold +minetest.register_ore({ + ore_type = "vein", + ore = "owl_tech:gold_ore", + wherein = stonelike, + clust_scarcity = 4*4*4, + clust_num_ores = 2048, + clust_size = 3, + y_min = -31000, + y_max = 31000, + noise_params = { + offset = 0, + scale = 3, + spread = {x=75, y=75, z=75}, + seed = 453234654, + octaves = 3, + persistence = 0,1, + lacunarity = 4, + }, + noise_threshold = 1.6, + random_factor = 1.0, +}) +minetest.register_ore({ + ore_type = "vein", + ore = "owl_tech:silver_ore", + wherein = stonelike, + clust_scarcity = 4*4*4, + clust_num_ores = 2048, + clust_size = 3, + y_min = -31000, + y_max = 31000, + noise_params = { + offset = 0, + scale = 3, + spread = {x=75, y=75, z=75}, + seed = 453234654, + octaves = 3, + persistence = 0,1, + lacunarity = 4, + }, + noise_threshold = 1.6 , + random_factor = 1.0, +}) +minetest.register_ore({ + ore_type = "vein", + ore = "owl_tech:silver_ore", + wherein = stonelike, + clust_scarcity = 4*4*4, + clust_num_ores = 2048, + clust_size = 3, + y_min = -31000, + y_max = 31000, + noise_params = { + offset = 0, + scale = 3, + spread = {x=75, y=75, z=75}, + seed = 453234654, + octaves = 3, + persistence = 0,1, + lacunarity = 4, + }, + noise_threshold = 1.6 , + random_factor = 1.0, +}) +-------------------------------------- +--------------------------------- Sulfure and saltpeter +minetest.register_ore({ + ore_type = "vein", + ore = "owl_tech:sulfur_ore", + wherein = stonelike, + clust_scarcity = 4*4*4, + clust_num_ores = 2048, + clust_size = 3, + y_min = -31000, + y_max = 31000, + noise_params = { + offset = 0, + scale = 3, + spread = {x=75, y=75, z=75}, + seed = 34567890, + octaves = 3, + persistence = 0,1, + lacunarity = 4, + }, + noise_threshold = 1.6, + random_factor = 1.0, +}) +minetest.register_ore({ + ore_type = "vein", + ore = "owl_tech:sulfur_ore", + wherein = stonelike, + clust_scarcity = 4*4*4, + clust_num_ores = 2048, + clust_size = 3, + y_min = -31000, + y_max = 31000, + noise_params = { + offset = 0, + scale = 3, + spread = {x=75, y=75, z=75}, + seed = 34567890, + octaves = 3, + persistence = 0,1, + lacunarity = 4, + }, + noise_threshold = 1.6 , + random_factor = 1.0, +}) +minetest.register_ore({ + ore_type = "vein", + ore = "owl_tech:saltpeter_ore", + wherein = stonelike, + clust_scarcity = 4*4*4, + clust_num_ores = 2048, + clust_size = 3, + y_min = -31000, + y_max = 31000, + noise_params = { + offset = 0, + scale = 3, + spread = {x=75, y=75, z=75}, + seed = 34567890, + octaves = 3, + persistence = 0,1, + lacunarity = 4, + }, + noise_threshold = 1.6 , + random_factor = 1.0, +}) +-------------------------------------- \ No newline at end of file diff --git a/pipe/fluid_pipe.lua b/pipe/fluid_pipe.lua new file mode 100755 index 0000000..2e8a29a --- /dev/null +++ b/pipe/fluid_pipe.lua @@ -0,0 +1,51 @@ +local S = minetest.get_translator(minetest.get_current_modname()) + +minetest.register_node("owl_tech:iron_fluid_pipe",{ + description = "Fluid pipe tire 1", + _tt_help = S("Transport fluids"), + _doc_items_longdesc = S("Fence gates can be opened or closed and can't be jumped over. Fences will connect nicely to fence gates."), + _doc_items_usagehelp = S("Right-click the fence gate to open or close it."), + tiles = {"owl_tech_base_fluid_pipe.png"}, + paramtype = "light", + is_ground_content = false, + stack_max = 64, + sunlight_propagates = true, + walkable = true, + groups = {owl_tech_fluid_pipe=1}, + drawtype = "nodebox", + node_box = { + type = "connected", + fixed = {-0.125,-0.125,-0.125,0.125,0.125,0.125} , + connect_top = {-0.125,-0.125,-0.125,0.125,0.5,0.125} , + connect_bottom = {-0.125,-0.5,-0.125,0.125,0.125,0.125} , + connect_front = {-0.125,-0.125,-0.5,0.125,0.125,0.125} , + connect_left = {-0.5,-0.125,-0.125,0.125,0.125,0.125} , + connect_back = {-0.125,-0.125,-0.125,0.125,0.125,0.5} , + connect_right = {-0.125,-0.125,-0.125,0.5,0.125,0.125} , + }, + connects_to = {"group:owl_tech_fluid_pipe","group:owl_tech_generator","group:owl_tech_machine"}, + sounds = mcl_sounds.node_sound_wool_defaults(), + _mcl_hardness = 0.1, + _mcl_blast_resistance = 0.1, + on_construct = function(pos) + local meta = minetest.get_meta(pos) + owl_tech.add_new_pull(meta,300,1,1) + owl_tech.set_fluid_sand_in_tick(meta,60) + owl_tech.check_all_side_for_fluid_work(pos,meta) + owl_tech.update_fluid_pipe_around(pos) + local info_set = owl_tech.get_pull_volume(meta,1) + meta:set_string("infotext", info_set) + local timer =minetest.get_node_timer(pos) + timer:start(0.2) + end, + on_timer = function (pos, elapsed) + local meta = minetest.get_meta(pos) + local timer =minetest.get_node_timer(pos) + if owl_tech.get_pull_volume(meta,1)>0 then + owl_tech.send_for_all_sides_fluid_pipe(meta,pos) + end + local info_set = owl_tech.get_pull_volume(meta,1) + meta:set_string("infotext", info_set) + timer:start(0.01) + end +}) \ No newline at end of file diff --git a/pipe/fluid_pump.lua b/pipe/fluid_pump.lua new file mode 100755 index 0000000..f1c1c68 --- /dev/null +++ b/pipe/fluid_pump.lua @@ -0,0 +1,242 @@ +local S = minetest.get_translator(minetest.get_current_modname()) +local name = minetest.get_current_modname() +local path = minetest.get_modpath(name) + +function owl_tech.prepear_for_pump(meta,max_horizontal_distance) + meta:set_int("check_y",-1) + meta:set_int("check_x",max_horizontal_distance) + meta:set_int("check_z",max_horizontal_distance) + meta:set_int("max_horizontal_distance",max_horizontal_distance) +end + +function owl_tech.get_max_horizontal_distance(meta) + return meta:get_int("max_horizontal_distance") +end + +function owl_tech.get_y_pump(meta) + return meta:get_int("check_y") +end + +function owl_tech.get_x_pump(meta) + return meta:get_int("check_x") +end + +function owl_tech.get_z_pump(meta) + return meta:get_int("check_z") +end + +function owl_tech.add_y_pump(meta) + meta:set_int("check_y",owl_tech.get_y_pump(meta)-1) +end + +function owl_tech.add_x_pump(meta) + meta:set_int("check_x",owl_tech.get_x_pump(meta)-1) +end + +function owl_tech.add_z_pump(meta) + meta:set_int("check_z",owl_tech.get_z_pump(meta)-1) +end + +function owl_tech.reset_x_pump(meta) + meta:set_int("check_x",meta:get_int("max_horizontal_distance")) +end + +function owl_tech.reset_z_pump(meta) + meta:set_int("check_z",meta:get_int("max_horizontal_distance")) +end + +function owl_tech.pos_pumping_update(meta) + if (-owl_tech.get_max_horizontal_distance(meta))>owl_tech.get_x_pump(meta)then --x + owl_tech.reset_x_pump(meta) + owl_tech.add_z_pump(meta) + end +end +function owl_tech.finde_fluid_on_level(meta,pos) + local finde = false + local new_pos = { + x=pos.x+owl_tech.get_max_horizontal_distance(meta), + y=pos.y+owl_tech.get_y_pump(meta), + z=pos.z+owl_tech.get_max_horizontal_distance(meta) + } + for i = owl_tech.get_max_horizontal_distance(meta), -owl_tech.get_max_horizontal_distance(meta), -1 do --x + new_pos.x= new_pos.x-1 + for j = owl_tech.get_max_horizontal_distance(meta), -owl_tech.get_max_horizontal_distance(meta), -1 do--z + new_pos.z= new_pos.z-1 + if (minetest.get_node(new_pos).name)=="mclx_core:river_water_source" or (minetest.get_node(new_pos).name)=="mcl_core:water_source" or (minetest.get_node(new_pos).name)=="mcl_core:lava_source" then + finde =true + return true + end + end + end + return finde +end + +local function set_formspect_base_pump(meta) + local fluid_1_name = owl_tech.get_pull_fluid_name(meta,1) + local fluid_1_volume = owl_tech.get_pull_volume(meta,1) + local fluid_2_name = owl_tech.get_pull_fluid_name(meta,2) + local fluid_2_volume = owl_tech.get_pull_volume(meta,2) + local formspec = "size[9,8.75]".. + "label[0,4;"..minetest.formspec_escape(minetest.colorize("#313131", S("Inventory"))).."]".. + "list[current_player;main;0,4.5;9,3;9]".. + mcl_formspec.get_itemslot_bg(0,4.5,9,3).. + "list[current_player;main;0,7.74;9,1;]".. + mcl_formspec.get_itemslot_bg(0,7.74,9,1).. + "label[2.25,0;"..minetest.formspec_escape(minetest.colorize("#313131", S("Stean pump"))).."]".. + "label[0,1.5;"..minetest.formspec_escape(minetest.colorize("#313131", (fluid_1_name.."--"..fluid_1_volume))).."]".. + "label[0,2.5;"..minetest.formspec_escape(minetest.colorize("#313131", (fluid_2_name.."--"..fluid_2_volume))).."]".. + "listring[current_player;main]".. + "listring[current_player;main]".. + "listring[current_player;main]" + meta:set_string("formspec", formspec) +end +--decor pump fluid +minetest.register_node("owl_tech:decor_bronze_pipe",{ + description = "Decor fluid pipe ", + _tt_help = S("Safe for decor"), + tiles = {"(owl_tech_base_fluid_pipe.png^[colorize:#a35900:128)"}, + paramtype = "light", + is_ground_content = false, + stack_max = 64, + drop ="", + sunlight_propagates = true, + walkable = true, + groups = {owl_tech_decor_fluid_pipe=1}, + drawtype = "nodebox", + node_box = { + type = "connected", + fixed = {-0.125,-0.125,-0.125,0.125,0.125,0.125} , + connect_top = {-0.125,-0.125,-0.125,0.125,0.5,0.125} , + connect_bottom = {-0.125,-0.5,-0.125,0.125,0.125,0.125} , + connect_front = {-0.125,-0.125,-0.5,0.125,0.125,0.125} , + connect_left = {-0.5,-0.125,-0.125,0.125,0.125,0.125} , + connect_back = {-0.125,-0.125,-0.125,0.125,0.125,0.5} , + connect_right = {-0.125,-0.125,-0.125,0.5,0.125,0.125} , + }, + connects_to = {"group:owl_tech_decor_fluid_pipe","group:owl_tech_machine"}, + sounds = mcl_sounds.node_sound_wool_defaults(), + _mcl_hardness = 0.1, + _mcl_blast_resistance = 0.1, +}) +--bronze_pump" +minetest.register_node("owl_tech:bronze_pump", { + description = S("Bronze pump"), + _doc_items_longdesc = S("Pump fluid"), + tiles = { + "(owl_tech_base_meshanism_side.png^[colorize:#a35900:128)", + "owl_tech_base_meshanism_side.png^[colorize:#a35900:128", + "(owl_tech_base_meshanism_side.png^[colorize:#a35900:128)^owl_tech_base_pump.png", + "(owl_tech_base_meshanism_side.png^[colorize:#a35900:128)^owl_tech_base_pump.png", + "(owl_tech_base_meshanism_side.png^[colorize:#a35900:128)^owl_tech_base_pump.png", + "(owl_tech_base_meshanism_side.png^[colorize:#a35900:128)^owl_tech_base_pump.png", + }, + is_ground_content = false, + stack_max = 64, + groups = {pickaxey=2, owl_tech_machine=1}, + sounds = mcl_sounds.node_sound_metal_defaults(), + paramtype2 = "facedir", + _mcl_blast_resistance = 6, + _mcl_hardness = 5, + on_construct = function(pos) + local meta = minetest.get_meta(pos) + owl_tech.add_new_pull(meta,8000,1,0) --steam eat 25 steam in 1 tick + owl_tech.add_new_pull(meta,8000,0,1) + owl_tech.set_pull_fluid_whitlist(meta,1,"owl_tech_steam")--whitlist for make and output ONLY Steam + owl_tech.set_mashine_tire(meta,1) --all steam mashine has 1 tire + owl_tech.prepear_for_pump(meta,2) + set_formspect_base_pump(meta) + owl_tech.update_fluid_pipe_around(pos) + local timer =minetest.get_node_timer(pos) + timer:start(0.2) + end, + on_timer = function(pos, elapsed) + local timer = minetest.get_node_timer(pos) + local meta = minetest.get_meta(pos) + --gete fluid down air mcl_core:lava_source mclx_core:water_source mcl_core:water_source + local new_pos = { + x=pos.x+owl_tech.get_x_pump(meta), + y=pos.y+owl_tech.get_y_pump(meta), + z=pos.z+owl_tech.get_z_pump(meta) + }if owl_tech.get_pull_volume(meta,1)>100 then + if minetest.get_node({x=pos.x,y=pos.y+owl_tech.get_y_pump(meta),z=pos.z}).name=="air" and + not owl_tech.finde_fluid_on_level(meta,pos) then -- place decor pipe + minetest.set_node({x=pos.x,y=pos.y+owl_tech.get_y_pump(meta),z=pos.z},{name="owl_tech:decor_bronze_pipe"}) + owl_tech.reset_x_pump(meta) + owl_tech.reset_z_pump(meta) + owl_tech.add_y_pump(meta) + end + --minetest.chat_send_all(minetest.get_node(new_pos).name) + if (minetest.get_node(new_pos).name)=="mclx_core:river_water_source" or (minetest.get_node(new_pos).name)=="mcl_core:water_source" or (minetest.get_node(new_pos).name)=="mcl_core:lava_source" then + if (owl_tech.get_pull_fluid_name(meta,2)=='none' or owl_tech.get_pull_fluid_name(meta,2)=='mcl_core:water_source' or owl_tech.get_pull_fluid_name(meta,2)=='mclx_core:river_water_source' or (minetest.get_node(new_pos).name)=="mcl_core:lava_source") + and owl_tech.get_pull_max_volume(meta,2)-owl_tech.get_pull_volume(meta,2)>=1000 then + owl_tech.add_fluid_in_node_pull(meta,minetest.get_node(new_pos).name,1000,2) + owl_tech.set_pull_volume(meta,1, owl_tech.get_pull_volume(meta,1)-100) + minetest.set_node(new_pos,{name="air"}) + end + end + owl_tech.pos_pumping_update(meta) + owl_tech.add_x_pump(meta) + end + -- + if minetest.get_item_group((minetest.get_node({x=pos.x,y=pos.y+1,z=pos.z})).name,"fluid_pipe") then --get from pipe steam + local meta_up = minetest.get_meta({x=pos.x,y=pos.y+1,z=pos.z}) + local can_do ,inde_pull =owl_tech.test_add_fluid_in_any_pulls(meta,"owl_tech_steam",owl_tech.get_fluid_sand_in_tick(meta)) + local can_do2 ,inde_pull_2 , remove_amount =owl_tech.test_remove_fluid_in_any_pulls(meta_up,"owl_tech_steam",owl_tech.get_fluid_sand_in_tick(meta_up)) + if can_do and can_do2 then + owl_tech.add_fluid_in_node_pull(meta,"owl_tech_steam",remove_amount,inde_pull) + owl_tech.remove_fluid_in_node_pull(meta_up,remove_amount,inde_pull) + end + end + if minetest.get_item_group((minetest.get_node({x=pos.x+1,y=pos.y,z=pos.z})).name,"fluid_pipe") then --sand in pipe + local meta_up = minetest.get_meta({x=pos.x+1,y=pos.y,z=pos.z}) + local fluid_name_to_send = owl_tech.get_pull_fluid_name(meta,2) + local can_do ,inde_pull =owl_tech.test_add_fluid_in_any_pulls(meta_up,fluid_name_to_send,owl_tech.get_fluid_sand_in_tick(meta_up)) + local can_do2 ,inde_pull_2 , remove_amount =owl_tech.test_remove_fluid_in_any_pulls(meta,fluid_name_to_send,owl_tech.get_fluid_sand_in_tick(meta_up)) + if can_do and can_do2 then + owl_tech.add_fluid_in_node_pull(meta_up,fluid_name_to_send,remove_amount,inde_pull) + local pull_curent_volume = owl_tech.get_pull_volume(meta,2) + local difer = pull_curent_volume-remove_amount + owl_tech.set_pull_volume(meta,2,difer) + end + end + if minetest.get_item_group((minetest.get_node({x=pos.x-1,y=pos.y,z=pos.z})).name,"fluid_pipe") then --sand in pipe + local meta_up = minetest.get_meta({x=pos.x-1,y=pos.y,z=pos.z}) + local fluid_name_to_send = owl_tech.get_pull_fluid_name(meta,2) + local can_do ,inde_pull =owl_tech.test_add_fluid_in_any_pulls(meta_up,fluid_name_to_send,owl_tech.get_fluid_sand_in_tick(meta_up)) + local can_do2 ,inde_pull_2 , remove_amount =owl_tech.test_remove_fluid_in_any_pulls(meta,fluid_name_to_send,owl_tech.get_fluid_sand_in_tick(meta_up)) + if can_do and can_do2 then + owl_tech.add_fluid_in_node_pull(meta_up,fluid_name_to_send,remove_amount,inde_pull) + local pull_curent_volume = owl_tech.get_pull_volume(meta,2) + local difer = pull_curent_volume-remove_amount + owl_tech.set_pull_volume(meta,2,difer) + end + end + if minetest.get_item_group((minetest.get_node({x=pos.x,y=pos.y,z=pos.z+1})).name,"fluid_pipe") then --sand in pipe + local meta_up = minetest.get_meta({x=pos.x,y=pos.y,z=pos.z+1}) + local fluid_name_to_send = owl_tech.get_pull_fluid_name(meta,2) + local can_do ,inde_pull =owl_tech.test_add_fluid_in_any_pulls(meta_up,fluid_name_to_send,owl_tech.get_fluid_sand_in_tick(meta_up)) + local can_do2 ,inde_pull_2 , remove_amount =owl_tech.test_remove_fluid_in_any_pulls(meta,fluid_name_to_send,owl_tech.get_fluid_sand_in_tick(meta_up)) + if can_do and can_do2 then + owl_tech.add_fluid_in_node_pull(meta_up,fluid_name_to_send,remove_amount,inde_pull) + local pull_curent_volume = owl_tech.get_pull_volume(meta,2) + local difer = pull_curent_volume-remove_amount + owl_tech.set_pull_volume(meta,2,difer) + end + end + if minetest.get_item_group((minetest.get_node({x=pos.x,y=pos.y,z=pos.z-1})).name,"fluid_pipe") then --sand in pipe + local meta_up = minetest.get_meta({x=pos.x,y=pos.y,z=pos.z-1}) + local fluid_name_to_send = owl_tech.get_pull_fluid_name(meta,2) + local can_do ,inde_pull =owl_tech.test_add_fluid_in_any_pulls(meta_up,fluid_name_to_send,owl_tech.get_fluid_sand_in_tick(meta_up)) + local can_do2 ,inde_pull_2 , remove_amount =owl_tech.test_remove_fluid_in_any_pulls(meta,fluid_name_to_send,owl_tech.get_fluid_sand_in_tick(meta_up)) + if can_do and can_do2 then + owl_tech.add_fluid_in_node_pull(meta_up,fluid_name_to_send,remove_amount,inde_pull) + local pull_curent_volume = owl_tech.get_pull_volume(meta,2) + local difer = pull_curent_volume-remove_amount + owl_tech.set_pull_volume(meta,2,difer) + end + end + owl_tech.delit_name_fluid_if_0(meta) + set_formspect_base_pump(meta) + timer:start(0.2) + end +}) \ No newline at end of file diff --git a/pipe/fluid_tank.lua b/pipe/fluid_tank.lua new file mode 100755 index 0000000..18e2c12 --- /dev/null +++ b/pipe/fluid_tank.lua @@ -0,0 +1,62 @@ +local S = minetest.get_translator(minetest.get_current_modname()) +local name = minetest.get_current_modname() +local path = minetest.get_modpath(name) + +minetest.register_node("owl_tech:bronze_tank", { + description = S("Bronze tank"), + _doc_items_longdesc = S("Tank fluid"), + tiles = { + "(owl_tech_base_meshanism_side.png^[colorize:#a35900:128)", + "owl_tech_base_meshanism_side.png^[colorize:#a35900:128", + "(owl_tech_base_tank_side.png^[colorize:#a35900:128)", + "(owl_tech_base_tank_side.png^[colorize:#a35900:128)", + "(owl_tech_base_tank_side.png^[colorize:#a35900:128)", + "(owl_tech_base_tank_side.png^[colorize:#a35900:128)", + }, + is_ground_content = false, + stack_max = 64, + groups = {pickaxey=2, owl_tech_machine=1}, + sounds = mcl_sounds.node_sound_metal_defaults(), + paramtype2 = "facedir", + _mcl_blast_resistance = 6, + _mcl_hardness = 5, + on_construct = function(pos) + local meta = minetest.get_meta(pos) + owl_tech.add_new_pull(meta,16000,1,1) + owl_tech.set_mashine_tire(meta,1) + owl_tech.update_fluid_pipe_around(pos) + owl_tech.set_fluid_sand_in_tick(meta,60) + local timer =minetest.get_node_timer(pos) + meta:set_string("infotext",owl_tech.get_pull_volume(meta,1)) + timer:start(0.2) + end, + on_timer = function(pos, elapsed) + local timer = minetest.get_node_timer(pos) + local meta = minetest.get_meta(pos) + if minetest.get_item_group((minetest.get_node({x=pos.x,y=pos.y+1,z=pos.z})).name,"fluid_pipe") then --get from pipe steam + local meta_up = minetest.get_meta({x=pos.x,y=pos.y+1,z=pos.z}) + local fluid_name_to_send = owl_tech.get_pull_fluid_name(meta_up,1) + local can_do ,inde_pull =owl_tech.test_add_fluid_in_any_pulls(meta,fluid_name_to_send,owl_tech.get_fluid_sand_in_tick(meta)) + local can_do2 ,inde_pull_2 , remove_amount =owl_tech.test_remove_fluid_in_any_pulls(meta_up,fluid_name_to_send,owl_tech.get_fluid_sand_in_tick(meta_up)) + if can_do and can_do2 then + owl_tech.add_fluid_in_node_pull(meta,fluid_name_to_send,remove_amount,inde_pull) + owl_tech.remove_fluid_in_node_pull(meta_up,remove_amount,inde_pull) + end + end + if minetest.get_item_group((minetest.get_node({x=pos.x,y=pos.y-1,z=pos.z})).name,"fluid_pipe") then --sand in pipe + local meta_up = minetest.get_meta({x=pos.x,y=pos.y-1,z=pos.z}) + local fluid_name_to_send = owl_tech.get_pull_fluid_name(meta,1) + local can_do ,inde_pull =owl_tech.test_add_fluid_in_any_pulls(meta_up,fluid_name_to_send,owl_tech.get_fluid_sand_in_tick(meta_up)) + local can_do2 ,inde_pull_2 , remove_amount =owl_tech.test_remove_fluid_in_any_pulls(meta,fluid_name_to_send,owl_tech.get_fluid_sand_in_tick(meta_up)) + if can_do and can_do2 then + owl_tech.add_fluid_in_node_pull(meta_up,fluid_name_to_send,remove_amount,inde_pull) + local pull_curent_volume = owl_tech.get_pull_volume(meta,1) + local difer = pull_curent_volume-remove_amount + owl_tech.set_pull_volume(meta,2,difer) + end + end + owl_tech.delit_name_fluid_if_0(meta) + meta:set_string("infotext",owl_tech.get_pull_volume(meta,1)) + timer:start(0.2) + end +}) \ No newline at end of file diff --git a/pipe/init.lua b/pipe/init.lua new file mode 100755 index 0000000..10c56c7 --- /dev/null +++ b/pipe/init.lua @@ -0,0 +1,8 @@ +local S = minetest.get_translator(minetest.get_current_modname()) +local name = minetest.get_current_modname() +local path = minetest.get_modpath(name) + +dofile(minetest.get_modpath("owl_tech") .. "/pipe/fluid_pipe.lua") --fluid pipe logick +dofile(minetest.get_modpath("owl_tech") .. "/pipe/fluid_pump.lua") --fluid pump logick +dofile(minetest.get_modpath("owl_tech") .. "/pipe/fluid_tank.lua") --fluid tank logick +dofile(minetest.get_modpath("owl_tech") .. "/pipe/item_pipe.lua") --item pipe logick \ No newline at end of file diff --git a/pipe/item_pipe.lua b/pipe/item_pipe.lua new file mode 100755 index 0000000..b619ba5 --- /dev/null +++ b/pipe/item_pipe.lua @@ -0,0 +1,169 @@ +local S = minetest.get_translator(minetest.get_current_modname()) +local name = minetest.get_current_modname() +local path = minetest.get_modpath(name) + +minetest.register_node("owl_tech:iron_item_pipe_input",{ + description = "Item input pipe tire 1", + _tt_help = S("Input items in pipe systems"), + _doc_items_longdesc = S("Use for input items in pipe "), + _doc_items_usagehelp = S("Put it in the world to start pulling items from inventory."), + tiles = {"owl_tech_base_fluid_pipe.png^[colorize:#0066ff:128"}, + paramtype = "light", + is_ground_content = false, + stack_max = 64, + sunlight_propagates = true, + walkable = true, + groups = {owl_tech_item_pipe=1}, + drawtype = "nodebox", + node_box = { + type = "connected", + fixed = {-0.125,-0.125,-0.125,0.125,0.125,0.125} , + connect_top = {-0.125,-0.125,-0.125,0.125,0.5,0.125} , + connect_bottom = {-0.125,-0.5,-0.125,0.125,0.125,0.125} , + connect_front = {-0.125,-0.125,-0.5,0.125,0.125,0.125} , + connect_left = {-0.5,-0.125,-0.125,0.125,0.125,0.125} , + connect_back = {-0.125,-0.125,-0.125,0.125,0.125,0.5} , + connect_right = {-0.125,-0.125,-0.125,0.5,0.125,0.125} , + }, + connects_to = {"group:owl_tech_item_pipe","group:owl_tech_generator","group:owl_tech_machine","mcl_chests:chest_small"}, + sounds = mcl_sounds.node_sound_wool_defaults(), + _mcl_hardness = 0.1, + _mcl_blast_resistance = 0.1, + on_construct = function(pos) + local meta = minetest.get_meta(pos) + local inv= meta:get_inventory() + local itemstack = inv:get_stack("pipe_inv", 1) + owl_tech.set_item_pipe_logick(meta) + local info_set =("empty") + if not itemstack:is_empty() then + info_set = (itemstack:get_name().."-"..itemstack:get_count()) + end + meta:set_string("infotext", info_set) + local timer =minetest.get_node_timer(pos) + timer:start(0.2) + end, + on_timer = function (pos, elapsed) + local meta = minetest.get_meta(pos) + local inv= meta:get_inventory() + local itemstack = inv:get_stack("pipe_inv", 1) + local timer =minetest.get_node_timer(pos) + owl_tech.finde_pipe_and_send_item(pos) + local info_set =("empty") + if not itemstack:is_empty() then + info_set = (itemstack:get_name().."-"..itemstack:get_count()) + end + owl_tech.finde_inventory_slot_for_removing_item_around(pos) + meta:set_string("infotext", info_set) + timer:start(0.2) + end +}) + +minetest.register_node("owl_tech:iron_item_pipe",{ + description = "Item pipe tire 1", + _tt_help = S("Transport items"), + _doc_items_longdesc = S("Fence gates can be opened or closed and can't be jumped over. Fences will connect nicely to fence gates."), + _doc_items_usagehelp = S("Put it in the world to let objects move through it."), + tiles = {"owl_tech_base_fluid_pipe.png"}, + paramtype = "light", + is_ground_content = false, + stack_max = 64, + sunlight_propagates = true, + walkable = true, + groups = {owl_tech_item_pipe=1,owl_tech_can_pipe_output=1}, + drawtype = "nodebox", + node_box = { + type = "connected", + fixed = {-0.125,-0.125,-0.125,0.125,0.125,0.125} , + connect_top = {-0.125,-0.125,-0.125,0.125,0.5,0.125} , + connect_bottom = {-0.125,-0.5,-0.125,0.125,0.125,0.125} , + connect_front = {-0.125,-0.125,-0.5,0.125,0.125,0.125} , + connect_left = {-0.5,-0.125,-0.125,0.125,0.125,0.125} , + connect_back = {-0.125,-0.125,-0.125,0.125,0.125,0.5} , + connect_right = {-0.125,-0.125,-0.125,0.5,0.125,0.125} , + }, + connects_to = {"group:owl_tech_item_pipe","group:owl_tech_generator","group:owl_tech_machine"}, + sounds = mcl_sounds.node_sound_wool_defaults(), + _mcl_hardness = 0.1, + _mcl_blast_resistance = 0.1, + on_construct = function(pos) + local meta = minetest.get_meta(pos) + local inv= meta:get_inventory() + local itemstack = inv:get_stack("pipe_inv", 1) + owl_tech.set_item_pipe_logick(meta) + local info_set =("empty") + if not itemstack:is_empty() then + info_set = (itemstack:get_name().."-"..itemstack:get_count()) + end + meta:set_string("infotext", info_set) + local timer =minetest.get_node_timer(pos) + timer:start(0.2) + end, + on_timer = function (pos, elapsed) + local meta = minetest.get_meta(pos) + local inv= meta:get_inventory() + local itemstack = inv:get_stack("pipe_inv", 1) + local timer =minetest.get_node_timer(pos) + owl_tech.finde_pipe_and_send_item(pos) + local info_set =("empty") + if not itemstack:is_empty() then + info_set = (itemstack:get_name().."-"..itemstack:get_count()) + end + meta:set_string("infotext", info_set) + timer:start(0.01) + end +}) + +minetest.register_node("owl_tech:iron_item_pipe_output",{ + description = "Item pipe tire 1 output", + _tt_help = S("Move item from pipe to invenotry"), + _doc_items_longdesc = S("Fence gates can be opened or closed and can't be jumped over. Fences will connect nicely to fence gates."), + _doc_items_usagehelp = S("Put it in the world to put the item in inventory."), + tiles = {"owl_tech_base_fluid_pipe.png^[colorize:#ff3300:128"}, + paramtype = "light", + is_ground_content = false, + stack_max = 64, + sunlight_propagates = true, + walkable = true, + groups = {owl_tech_item_pipe=1,owl_tech_can_pipe_output=1}, + drawtype = "nodebox", + node_box = { + type = "connected", + fixed = {-0.125,-0.125,-0.125,0.125,0.125,0.125} , + connect_top = {-0.125,-0.125,-0.125,0.125,0.5,0.125} , + connect_bottom = {-0.125,-0.5,-0.125,0.125,0.125,0.125} , + connect_front = {-0.125,-0.125,-0.5,0.125,0.125,0.125} , + connect_left = {-0.5,-0.125,-0.125,0.125,0.125,0.125} , + connect_back = {-0.125,-0.125,-0.125,0.125,0.125,0.5} , + connect_right = {-0.125,-0.125,-0.125,0.5,0.125,0.125} , + }, + connects_to = {"group:owl_tech_item_pipe","group:owl_tech_generator","group:owl_tech_machine"}, + sounds = mcl_sounds.node_sound_wool_defaults(), + _mcl_hardness = 0.1, + _mcl_blast_resistance = 0.1, + on_construct = function(pos) + local meta = minetest.get_meta(pos) + local inv= meta:get_inventory() + local itemstack = inv:get_stack("pipe_inv", 1) + owl_tech.set_item_pipe_logick(meta) + local info_set =("empty") + if not itemstack:is_empty() then + info_set = (itemstack:get_name().."-"..itemstack:get_count()) + end + meta:set_string("infotext", info_set) + local timer =minetest.get_node_timer(pos) + timer:start(0.2) + end, + on_timer = function (pos, elapsed) + local meta = minetest.get_meta(pos) + local inv= meta:get_inventory() + local itemstack = inv:get_stack("pipe_inv", 1) + local timer =minetest.get_node_timer(pos) + owl_tech.send_item_in_inventory(pos) + local info_set =("empty") + if not itemstack:is_empty() then + info_set = (itemstack:get_name().."-"..itemstack:get_count()) + end + meta:set_string("infotext", info_set) + timer:start(0.2) + end +}) \ No newline at end of file diff --git a/steam/init.lua b/steam/init.lua new file mode 100755 index 0000000..69b296a --- /dev/null +++ b/steam/init.lua @@ -0,0 +1,6 @@ +local S = minetest.get_translator(minetest.get_current_modname()) +local name = minetest.get_current_modname() +local path = minetest.get_modpath(name) + +dofile(minetest.get_modpath("owl_tech") .. "/steam/small_steam_boiler.lua") --ore loads +dofile(minetest.get_modpath("owl_tech") .."/steam/steam_gen_logick.lua") --logick for steam gen \ No newline at end of file diff --git a/steam/small_steam_boiler.lua b/steam/small_steam_boiler.lua new file mode 100755 index 0000000..b894a35 --- /dev/null +++ b/steam/small_steam_boiler.lua @@ -0,0 +1,119 @@ +local S = minetest.get_translator(minetest.get_current_modname()) +local name = minetest.get_current_modname() +local path = minetest.get_modpath(name) + +local function set_formspect_base_boiler(meta) + local fluid_1_name = owl_tech.get_pull_fluid_name(meta,1) + local fluid_2_name = owl_tech.get_pull_fluid_name(meta,2) + local fluid_1_volume = owl_tech.get_pull_volume(meta,1) + local fluid_2_volume = owl_tech.get_pull_volume(meta,2) + local heat = owl_tech.get_curent_heat(meta) + local max_heat = owl_tech.get_max_heat(meta) + local fuel_burn =owl_tech.get_fuel_time(meta) + local formspec = "size[9,8.75]".. + "label[0,4;"..minetest.formspec_escape(minetest.colorize("#313131", S("Inventory"))).."]".. + "list[current_player;main;0,4.5;9,3;9]".. + mcl_formspec.get_itemslot_bg(0,4.5,9,3).. + "list[current_player;main;0,7.74;9,1;]".. + mcl_formspec.get_itemslot_bg(0,7.74,9,1).. + "label[2.75,0;"..minetest.formspec_escape(minetest.colorize("#313131", S("Boiler"))).."]".. + "list[context;fluid_in;2.5,2.5;1,1;]".. + mcl_formspec.get_itemslot_bg(2.5,2.5,1,1).. + "list[context;fuel;2.5,1.5;1,1;]".. + mcl_formspec.get_itemslot_bg(2.5,1.5,1,1).. + "list[context;dst;5.75,1.5;1,1;]".. + mcl_formspec.get_itemslot_bg(5.75,1.5,1,1).. + "label[0,0.5;"..minetest.formspec_escape(minetest.colorize("#313131", ("Heat-"..heat.."--"..max_heat))).."]".. + "label[0,1;"..minetest.formspec_escape(minetest.colorize("#313131", ("Fuel brun-"..fuel_burn))).."]".. + "label[0,1.5;"..minetest.formspec_escape(minetest.colorize("#313131", (fluid_1_name.."--"..fluid_1_volume))).."]".. + "label[0,2;"..minetest.formspec_escape(minetest.colorize("#313131", (fluid_2_name.."--"..fluid_2_volume))).."]".. + "listring[context;dst]".. + "listring[current_player;main]".. + "listring[context;fluid_in]".. + "listring[current_player;main]".. + "listring[context;fuel]".. + "listring[current_player;main]" + meta:set_string("formspec", formspec) +end + + +minetest.register_node("owl_tech:bronze_boiler", { + description = S("Bronze boiler"), + _doc_items_longdesc = S("First wey generate steam"), + tiles = { + "(owl_tech_base_meshanism_side.png^[colorize:#a35900:128)^owl_tech_steam_output.png", + "owl_tech_base_meshanism_side.png^[colorize:#a35900:128", + "owl_tech_base_meshanism_side.png^[colorize:#a35900:128", + "owl_tech_base_meshanism_side.png^[colorize:#a35900:128", + "owl_tech_base_meshanism_side.png^[colorize:#a35900:128", + "(owl_tech_base_meshanism_side.png^[colorize:#a35900:128)^owl_tech_boiler_face.png", + }, + is_ground_content = false, + stack_max = 64, + groups = {pickaxey=2, owl_tech_generator=1 ,fluid_in=1,fuel=1,dst=1 }, + sounds = mcl_sounds.node_sound_metal_defaults(), + paramtype2 = "facedir", + _mcl_blast_resistance = 6, + _mcl_hardness = 5, + on_construct = function(pos) + local meta = minetest.get_meta(pos) + owl_tech.add_new_pull(meta,8000,1,0) --water + owl_tech.set_pull_fluid_whitlist(meta,1,"mcl_water") --whitlist for make input ONLY Water + owl_tech.add_new_pull(meta,8000,0,1) --steam + owl_tech.set_pull_fluid_whitlist(meta,2,"owl_tech_steam")--whitlist for make and output ONLY Steam + set_formspect_base_boiler(meta) + owl_tech.prepear_for_make_steam(meta,256,0.5,1,0.25) --prepea al meta info for work like boiler + owl_tech.update_fluid_pipe_around(pos) + local timer =minetest.get_node_timer(pos) + local inv = meta:get_inventory() + inv:set_size("fluid_in", 1) + inv:set_size("fuel", 1) + inv:set_size("dst", 1) + timer:start(0.2) + end, + on_timer = function(pos, elapsed) + local timer = minetest.get_node_timer(pos) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + local fluid_its = inv:get_stack('fluid_in', 1) + local fuel_its = inv:get_stack('fuel', 1) + local dst_its = inv:get_stack('dst', 1) + if not fluid_its:is_empty() then --Load fluid from buckets + owl_tech.add_fluid_in_pull_from_itemslot(meta,fluid_its,inv,dst_its,'fluid_in','dst') + end + if owl_tech.get_fuel_time(meta)>0 then --burn process + owl_tech.fuel_burning(meta) + end + if owl_tech.get_curent_heat(meta)>0 and owl_tech.get_fuel_time(meta)==0 then --coling boiler if not burn + owl_tech.cooling_boiler(meta) + end + if owl_tech.get_curent_heat(meta)>100 + and owl_tech.get_pull_volume(meta,2)+owl_tech.get_water_in_steam(meta)*5<=owl_tech.get_pull_max_volume(meta,2) + and owl_tech.get_pull_volume(meta,1)-owl_tech.get_water_in_steam(meta)>=0 then --make steam + owl_tech.gen_steam_in_node_pull(meta,1,2,owl_tech.get_water_in_steam(meta)) + if owl_tech.get_pull_fluid_name(meta,2)~="owl_tech_steam" then + owl_tech.set_pull_fluid_name(meta,2,"owl_tech_steam") + end + end + if not fuel_its:is_empty() and owl_tech.get_fuel_time(meta)==0 then --Load fluid from buckets + local out_fuel= minetest.get_craft_result({method = "fuel", width = 1, items = {fuel_its}}) + if out_fuel.time>0 then + owl_tech.load_fuel_in_boiler(meta,inv,'fuel',out_fuel,fuel_its) + end + end + if minetest.get_item_group((minetest.get_node({x=pos.x,y=pos.y+1,z=pos.z})).name,"fluid_pipe") then --sand in pipe + local meta_up = minetest.get_meta({x=pos.x,y=pos.y+1,z=pos.z}) + local can_do ,inde_pull =owl_tech.test_add_fluid_in_any_pulls(meta_up,"owl_tech_steam",owl_tech.get_fluid_sand_in_tick(meta_up)) + local can_do2 ,inde_pull_2 , remove_amount =owl_tech.test_remove_fluid_in_any_pulls(meta,"owl_tech_steam",owl_tech.get_fluid_sand_in_tick(meta_up)) + if can_do and can_do2 then + owl_tech.add_fluid_in_node_pull(meta_up,"owl_tech_steam",remove_amount,inde_pull) + local pull_curent_volume = owl_tech.get_pull_volume(meta,2) + local difer = pull_curent_volume-remove_amount + owl_tech.set_pull_volume(meta,2,difer) + end + end + owl_tech.delit_name_fluid_if_0(meta) + set_formspect_base_boiler(meta) + timer:start(0.2) + end +}) diff --git a/steam/steam_gen_logick.lua b/steam/steam_gen_logick.lua new file mode 100755 index 0000000..aed1aaa --- /dev/null +++ b/steam/steam_gen_logick.lua @@ -0,0 +1,101 @@ +--Setter and getter max_heat (USE UNT!) +function owl_tech.get_max_heat(meta) + return meta:get_float("max_heat") + end + +function owl_tech.set_max_heat(meta,new_amount) + meta:set_float("max_heat",new_amount) + return owl_tech.get_max_heat(meta) +end + ------------------------------ + --Setter and getter curent_heat (USE UNT!) +function owl_tech.get_curent_heat(meta) + return meta:get_float("curent_heat") + end + +function owl_tech.set_curent_heat(meta,new_amount) + meta:set_float("curent_heat",new_amount) + return owl_tech.get_curent_heat(meta) +end + ------------------------------ + --Setter and getter speed_heat(USE UNT!) +function owl_tech.get_speed_heat(meta) + return meta:get_float("speed_heat") + end + +function owl_tech.set_speed_heat(meta,new_amount) + meta:set_float("speed_heat",new_amount) + return owl_tech.get_speed_heat(meta) +end + ------------------------------ + --Setter and getter fuel_time(USE UNT!) +function owl_tech.get_fuel_time(meta) + return meta:get_float("fuel_time") +end + +function owl_tech.set_fuel_time(meta,new_amount) + meta:set_float("fuel_time",new_amount) + return owl_tech.get_fuel_time(meta) +end +------------------------------ +--Setter and getter fuel consumption(USE UNT!) +function owl_tech.get_fuel_consumption(meta) + return meta:get_float("fuel_consumption") +end + +function owl_tech.set_fuel_consumption(meta,new_amount) + meta:set_float("fuel_consumption",new_amount) + return owl_tech.get_fuel_consumption(meta) +end + ------------------------------ + --Water in steam in 1 time +function owl_tech.get_water_in_steam(meta) + return meta:get_float("water_in_steam") +end + +function owl_tech.set_water_in_steam(meta,new_amount) + meta:set_float("water_in_steam",new_amount) + return owl_tech.get_water_in_steam(meta) +end + ------------------------------ +--Prepea mashine for make steam --call ONLY in on_construct = function(pos) +function owl_tech.prepear_for_make_steam(meta,max_heat,heat_speed,fuel_consumption,water_in_steam) + owl_tech.set_max_heat(meta,max_heat) + owl_tech.set_curent_heat(meta,0) + owl_tech.set_speed_heat(meta,heat_speed) + owl_tech.set_fuel_time(meta,0) + owl_tech.set_fuel_consumption(meta,fuel_consumption) + owl_tech.set_water_in_steam(meta,water_in_steam) +end +---------------------------------------------- +--load fuel from slot +function owl_tech.load_fuel_in_boiler(meta,inv,slot_name,out_fuel,fuel_its) + local fuel_time=out_fuel.time + local bon= math.modf(owl_tech.get_curent_heat(meta)/5) + owl_tech.set_fuel_time(meta,(bon+fuel_time)*10) + fuel_its:set_count(fuel_its:get_count()-1) + inv:set_stack(slot_name, 1, fuel_its) +end +---------------------------------------------- +--Fuel burn +function owl_tech.fuel_burning(meta) + owl_tech.set_fuel_time(meta,owl_tech.get_fuel_time(meta)-owl_tech.get_fuel_consumption(meta))--remove fuel + if owl_tech.get_curent_heat(meta)g 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 H_{IMQN^4yN literal 0 HcmV?d00001 diff --git a/textures/owl_tech_base_frame.png b/textures/owl_tech_base_frame.png new file mode 100644 index 0000000000000000000000000000000000000000..c778696b770851c28fc686675c700065d15a80d1 GIT binary patch literal 5584 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 literal 0 HcmV?d00001 diff --git a/textures/owl_tech_base_grid.png b/textures/owl_tech_base_grid.png new file mode 100644 index 0000000000000000000000000000000000000000..446620bb2c64d75a6523fadc4038f5156f04ea8b GIT binary patch literal 5392 zcmeHLYg7~07LGgu4WJ^ZSW6p1>y^qRGn3cMETSSoh!UX?ky5NoW+oUR50U`_6h+Y% z&=#cBR*Ns70t+lx6k91i&?>&F)mmv$6vZbfh}zo+Dt8hPVco8Em#eq;msx9)%-MT? zXYcQP`ANV_ZZ{A%|BM!&6|N80eTaE4XXlHJ4^@Zw+tS8GK zJXGhoWb~?!c1;KOkG}TL3%^Q(`etJRsbkIMI(*?uwroVShj#y~urG;w4$&%;|@3zXu0& z9{TZK@>!Q@2?aAc9-fLW%*x;Ah;F|trI!kdZ=;IJ8QOYY>!>>or4?N`WBoY^yB!N`l@-tIoD6xHDFHqxUV17 z?fzt1oNHa77si`UJ1$h#sk|Spdh6@e+VgBlaMzs72sG_yvlW zPyTd=c%4^m)Ek_5yN^irl+r0;9k~_XJ;6X;Stb45&n&9!E8258z3l_ranMEnmC7>e_N4K@$bUWGKhCEu@`_{W zg`!Krp{FZzC%45dTS3oVH8J;9MS<^!7a3dm2jj}m0OQ~F3@j*b_Br~_n~nFBrz@Rb zl@)W>>#OeBo$CTd@wX)DdGhaEpDC!H|d?#TpLN4BTr%z|&y zvcInZ+dA{?8}QF>le3QBi2maHX$Qwbxl`>pJC~U2N>=pz))10in+9#VzO4H+wBR2(B!{`51%z?jENleWtP!{~s^2SYxJZnQb#h z8HN!C9UmtRYKm{s8JTUB#R`~VG2%obMRV0uf>tl%^?b9R$JLTD-U6`_R2qY*#oEve z6BU&)Peo)T5-7==F`W}&!59D?MdMtHE=h03EHa)A7h}F#hXp*Y&4o^s@nVz_+#rLA z;)?hpJ_rO`w5c#}I)@uzA~jf~eD)v&b0_01rfDN45TvE0@zaESgDF7(p(rW&=5KFnkCs zxKRM{L4i&u7#?A!gHsuh!G!)a!mMIWA3-E#Hl&ycDmazW)4szYNMb17m|{w@l|vE& zDv8oDu4ZOdXvCBu3T4Dlgq4B>tYkCT~jAxx6BMpR>#B5&?h!o;#5ebNe8Z{t7K{0?Ls1%S$U`i@Q2~s2_ zhCwOxW*XNMlog5r=W7`pn1m5n3QGW~7=!>3NJs&ckl+A{OK}jvaSe(i!yv* z&zzzulbKPX6%zvaLfB@pE(^vK!w`#Gb;9Ham>L`nc5EQBSvS|ip- z)FYGrOC^d`FoZ!MCKUhwN~A<;kp?DlK!{4LCE`K=r^F;c!W034FpA)k0jdA>RfJ&R zne5?_B?btrJO5MN1_=H`*#i#4jtXY=2gaBqh&j;&Lr2=6ESP-%&evc^{hd>Axi2Pp zE`DFo^@6VFV&J))U#RN^UC+h9b2-0I*Z+(z&a;PNO3(b3O=BK;+Z+9)%;WM)#?ZIT zES8Ih^%}+6P~yc5I?)Pcu+t4!&oOSUTiKlL%n)B84^$y1h`7BOzx21%E)wSE=fj0T y!o5o$Z@@1#rn_D{yQYlqmC{t{!p?JHE!y|!o_$Xk^A{(Jr3juU|8iFRihl#!yU-Q@ literal 0 HcmV?d00001 diff --git a/textures/owl_tech_base_meshanism_side.png b/textures/owl_tech_base_meshanism_side.png new file mode 100755 index 0000000000000000000000000000000000000000..fc0175962f2c09bb38f6533974802a8ce582edb9 GIT binary patch literal 5721 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 Br91!t literal 0 HcmV?d00001 diff --git a/textures/owl_tech_base_pump.png b/textures/owl_tech_base_pump.png new file mode 100755 index 0000000000000000000000000000000000000000..7954617c01e7b75aa963f182734d7f6328f230da GIT binary patch literal 667 zcmV;M0%ZM(P)EX>4Tx04R}tkv&MmKpe$iQ$^9LgB_$eWT*~eK~%(1s#pXIrLEAagUO{|(4-+r zad8w}3l4rPRvlcNb#-tR1i=pwM<*vm7b)?7NufoI2gm(*ckglc4iM^PrkWiSfT~$W zG8Ppx*;TRY6}y{D4^000SaNLh0L z01FcU01FcV0GgZ_00007bV*G`2j&YJ4lyOedMYXa005UsL_t(I%k7Xo3dA57L`V77 zN^%Pi;w8M82eQ)2RuH^I+KA{@Ns*PXKd{^El*90N4Dip#VYAX&%cPXI5W)rkT5BSr zZj2e{EuR5utxJq?6GA`;0q=cltu3?d6p(XX0U)J>S}Op+Ik!Fy*rSv}DdqBmOF$_F zN~!k&zcuK+9|mKL*8!aK!+Oz6BY?z#K>Zlu((u`3JH*fBtS$|#ASle4xrd# zi^|ptxZ8>%qPXBLxBxBKK)WF*iV7kk%~Svt&-9!b&rHuRb55nI-n;jE_kQoYbyGktW z2!y(^C`7WA?_x0Ua)!`Q2UTwCv9qn)RM@xHotVms3+Z{3OE*MCoZP+e$@|_A{NU4Z zlCJ8*dUmJF-pAhZnKwgk#p>JYwQ&y_tACwd@$|+{&xM(rRD&j~8qthjCkJG39ys~s zT~GZ$GykpI&eRWY7RTH>J9pCq6;mB>R+aHW5^A@WF0)_S%War{Zh$!8gG-V*waJ{e zpT1f$?Lu1ezRJ|Dv7Q5I8?xpnS7z#%)@AIkWKC_JL$KfV`WKHN^JAuUD+!4p(iY&EPg3TJF-Y}ICPhed0=}~>+abpV;iiEE!RKo!a2`CPAbeZ znPz?1Iok7pM{S^UaMA9FtzM@b?sJ!|`{DRDb3pXSC~D*Go69V#CfL2Xqrbmr5#kWo zHaFJ(tzc&Q&4|^dIXE4OW42#PgK`z^V4;bkMj^}Gn|h-x?Rpo*P-MoAx=d^C)Cu0B z%g)>&)Gx^W-7{2|*R@PP2tmm7GMsBP^$NIXY_d&h3e)dV_II7r#_#vn+u(vLY23SH z0v<}ave}uOnU(d}HhMr~9Oj*xIu*ZSlBq3q`RkiUdzU16SZ>asIJhohrZ8D+QjBer zGR$V1xbUVi2-Nq^*bCMRZf|2ToEGQaMHZ#!9Jv;Aq$bOI6V(dX^}uNI(!zBU{Y$vT z9eqJ7v!_JuYftg_Z&yrS`bXBxh*xvj{`)h<2V&o_!$gORZZsD5boPyj#)O`);*hu8 z*dFDx)%fWp!-Sh#Fa*;rvF(;3FMiwgv2xQ{%3S<+L8nrJycBKwW=GDmQB6jYx%X`< zY&x$GpqtZAOm6Oy<=}J6?Qp#}o1E&S&TP24?D>mxJ30Q1D=#{k6t^hru$0rfi^FHf zKiT@U!?DBR&i2v?1q+VWM?X1LSZe!Ih=+7+-7K+DyiuXc&Mf~sQ`(-^h5HGr_Bhqm zUdC-~aJhWsuthCbS{4)!uIp--HW@=9V_%mK0Z4B#XxX zR{9IqF~6ezJb?5ytS9pcFg&sWD&6Oc{B$Mzz<=Nh>i`4saVMtvZ+%}R*QK5;UjM?TXm;A(eG!O8QEZ|_feS8!Y2_8Qab zVAFa-kv0=ZTwp6b;HUd|@xo4ogv6EwJ-)snZRul{Lym)bfIUzfE{kZ;(R&gQ^NK7c z$~%?k8WK0Sf~*s*2pOgO(S5pKUo>}PwQDZ=TKNkL=L7DNSzuqO^%IlV)%lE5`n$qo z-o%Uzc}%x=dEwm_*7eYRyFz^la@QSLpoo9D?pVkhk?U!b$ntp8I}a}Q*F-RU-+cf0 zR6+i|#gzvgnj8EQXZ>N5~Gh>Me3=~YcI^K)|Yne6gv zH7n02ecYu1b;8ToUehkpjCt5{M}!ZtheLN1C`(fYtyUU1XuQ%>uh&j&zi1M1sewUH zI-T~~wO6@%(<-VAbJoGE2FoU=k~NVe_788|V>Q{#oOe6a5qpd$dMFkv-u)wVpW?VrDlUc=-{n5r`CTWQ+}S!T zgN#6L8>?-a+a*~%q)$I~^5CJ)fGmGhh)ue!@!r{MMEzBRtqEnmVAO4v(S_s}ldrwE z9`oUp=TT{B%cZS#^f5^_XR{mMhJ1JSxl?=3@kvyjvB%e>Jv;8$Ip)V%XKOb*cH{$n zqC{i;)`9d&mvMTsHO<65W%cg!?UGI6jwR{Z+UgYeTwRi|JRu-bHn>yV)2n;*nxd-U zh}BvIVgg+Z_Y^LB9*r-PxPby04{}pWkP1YqB{5PZP0c_J;nLu1?JydJ z95PWwGf-T1Aktf=fRF??f*S_#QH$eoD0d?yT_F(Cf|ZieBxn{k%0cxL& zsvJf`2>74;<#CFbp>za%G!z3#U{fW$D)x&d{aEb4PaawdBE=Hx7mSOP6jfm%MXBodWG!sGB%EEPw^Q$HImf)q+vi&|7H#tn}fn$d0y4NeE9 z7St*g1{fNLv!Qt_AW$V!aAdL=21*+gQtSC?nhh6}091iYPzAxD7#xm<#nNyT4t#;b z(D3A$7(5L#%3dZA3zz>pYi;=;>BE~oN34X`Up_Q6TvH36*x|e3+ZgdsF(HvdWkCb^ z!zn1ict|i5CyX^b#TS9nNC7T-(UmfxDgjhLUXd`5FjufZhqyvI&l5}I)Gl9ICx{^JF2IBV7z%*JabUJE zBpQJ-LKyn5PZ5u&kSJ6t7NCNV03d)E2;gA_BmmY8js)_AL?MayWzhdsibM_$OT)sN zApZYSd<6vUoZ zUzI`F2?M9y58W-hk@mOJ*EybPK3A&wt*-pg63e!}G>iK&Bqpcf*s*%+I|TN^h4qak zB^~9yOeUdPGbjBP)lWm&Rnv5Qdj8Mi;JMY-jATvo3VyoM)I3#0m|~9C^)#podv^NZ zGupak>Gt`cb@jtogFH!-wS#$RG_}nYRo292Xf9h9jN1r@&OO+mxs3HS4|V&osdJL~ znB9W$`zs^dP+7q|pQ}{eWDPQ3bGF9wf^|Xtp+x$wnuo9EFdk78Cy`-mdNJVM#@Y(5EAvsm z>EedY-WBgG^k1rID-$%>bAv%$ikmJ)z5O@p!*a7w14jlcdSgfy=JluRqI#BY#w{9H z{pj>yxav%c-QWH4Znq#&=P`#g6-&_i#`aIo2RK?FaWc{F}`Cf QoF9VaGoN{2_Og_J08Rh+UjP6A literal 0 HcmV?d00001 diff --git a/textures/owl_tech_base_tiles.png b/textures/owl_tech_base_tiles.png new file mode 100644 index 0000000000000000000000000000000000000000..ed944cc518bfb147de6f886d1c1216442e81288a GIT binary patch literal 5470 zcmeHKdsGu=7LSzz0xB-};8kN(D&QnDlaNeC0$QF~i692FtYRlK69|xpNgx445J5m% zTdh{X2Pjyfh^{8@E5r-6p|;wEG`+^yRUysEecLmOpF8 z0?{!Q$tQQ5EqyfZc9o{}z?kfFuFLV3@Y(I%d9zBs;FfQk&hhGQUibDvPZ##qgFjvD zZ+4pEd?m!klJ$PA%c|7;^>w}6uG^k5r4!CMo^flK@3ddj&Sw`sRgIW6u}Ml`3AY~f zN{ZR#b>fvNqoyv*n_D*Bh2Uwc8hQ5DQ>V55Y*F0zIDYYX3*~9;ry&8dOKpwuzw~UG zJu9v;pkT!&+kPz;cXR*vEaL4E;bh(Y@X@U8PWg6>4feR6NpfO-V1iPZ!BDy9l86R#GUTP(59U$4v#9|LA5$3RMlLwbWv*WeOPl=*mHF*lJa=< z;m2pwCNF>F5eI)|IdQr5l+}*YJ!6Xa^>@iUptS6 zgi|w$6RXd#`(3ro6(Q%d`hu4=ZVH!)UDPvnok>jAZD~I~;UCiZ@sSlp@s*WFRy!v+ zw~X1t>9cBiQsTZ%y5+8w_o6TTmT1zpU2d{F_Q2~nv)kn@$6B6z?gwPqx`gJ>W`yUA zw@|p$9RFyNbd1vF7ah|#2n$LaRPG3-Xops|Mdh~s&Z-uS$&T`=rsY|=EEuF*ZKkskf zx_N9=%!CVW%Uy~P36`c)LrA=IYM-X~<^oCiOU-ga#i}VF! z9>tXhU6ZfQSmR{-W9PaFc_g21hbQ!yT=7Z4l&1HA;17#JL8{;R|tgmnga|q_Ol`NmqxxXo;peClG z=4a6_wkJ|Zy0DXX@{_MwpE3Qj*5Iegj|F`gwaU>}aW(A8li(#sL)jY_)3A1CiH+Nu zPOImu+S{UYD#RR*t&G&Au6L%|WGAnTI}Ke+7fxs62mN-3O0P% z{jmE;_qAU|-*xv`#rJDVx6W*BXE4V4D!~19kt7r+)k-!&sbw_VsMLV_FN5LZXVeg6 z0-g5o@8h1eR$0={QA5s+L}mI!{WbCXhmk<>zbTW5fZ0lGYPU zqcTyY!;K=AnHLAYO=b>@X@=+%M65-UaHhXnOEY6qTMZLMq)<6U6{W0Iegn3XNW& zRxwSSgiM{J7qM7io%td@rA8tdqF3n#RRDT$jD&`Ruwjl;$rnmmV=C19K=LQez`dK!?zD2gK}j>1v|!%-g2 z6?nm193F;OQwn*?e?yywhv_p=@(_g%?4M#b4NTMmdfC9$z-6MsJW5Qac_?s#97sV& zB-4~RPQW#=M8*-SSQ^|t2HW+8UGY1uKnS>qoFWN`<{=2gqXjZZD3i+}8YcOafG@-_ z?*Und*mY{T-au&SIk7-TpcQCOvsTO*=0bVA8jB&0HdO%#2EiDFpi&gZVLr~o1_k5% z`6+U_7#|Y~5lBeT6vQK78j>LtA9Onxy2EmrNC=}-*nd-xn4_w z*8;!kuK$@_HZLEFX%+Y{YXFbDdmNAVg2&}invnN(42G?P={foXv_V2%_!-SsUpE_1eB!1)ZjWEo56&br?6b+~Jl_1#JM-je3z{szIt z=!yFZoeJ}(u{vss8Qp8Ap$?hCcN?BDwoe^pIN4nOMU`*Sxor1;`5zqdup3`$dBV9I P&@;q=^8)t1_d(Wgaq#P0 literal 0 HcmV?d00001 diff --git a/textures/owl_tech_boiler_face.png b/textures/owl_tech_boiler_face.png new file mode 100755 index 0000000000000000000000000000000000000000..843268e0d7d900cc0175a6a2afc1ecdea62281da GIT binary patch literal 4998 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 KA5pO|J^xQx31kca literal 0 HcmV?d00001 diff --git a/textures/owl_tech_compressor_face.png b/textures/owl_tech_compressor_face.png new file mode 100755 index 0000000000000000000000000000000000000000..3015b4c7b09e756e0ba7ad169001cf4f3d6d7283 GIT binary patch literal 624 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 TgEyzD2tu))Jz4pVA<2IO;C%PQ literal 0 HcmV?d00001 diff --git a/textures/owl_tech_dust_block_1.png b/textures/owl_tech_dust_block_1.png new file mode 100755 index 0000000000000000000000000000000000000000..8e513834377dd3e90b6cd53f3e473f444d7a17a2 GIT binary patch literal 6065 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 Q;(r^+Hao0KtoFwJ58D2T?f?J) literal 0 HcmV?d00001 diff --git a/textures/owl_tech_forge_face.png b/textures/owl_tech_forge_face.png new file mode 100755 index 0000000000000000000000000000000000000000..88bb0f4d25330fa4300fbbda53c5aaa9feecf696 GIT binary patch literal 624 zcmV-$0+0QPP)EX>4Tx04R}tkv&MmKpe$iTct%R3U&~2$j~~qAS&XhRVYG*P%E_RU~=gfG-*gu zTpR`0f`cE6RRx1k-{RDAVPqQIx48bLV{L}6cZWRPkQ)A9KT2|nOqex zax9<*6_Voz|AXJ%n#IWpHz}M1dS7h&BL)O_fmXw|zmILZbpiyQfh(=!uQh?0PtqG5 zEqVkDYy%h99ZlW?E_Z<8CtWfmM+(sN7mL9A8GTb87`g@e*4*CO`#607veZ@j1~@nb z#!8gE?(yzWcW?imY4`U7lVEbRhMApA00009a7bBm000XU000XU0RWnu7ytkO2XskI zMF-{x3=;zsS@=BB0001gNklboXc^R69l-IngQY>= zKJ#sZUHH|&D(<@k)>~KUj;FC_%`i|^RMj*Qk)bn7>?S)u@qb)j?jrl|aVkat0000< KMNUMnLSTZPAO^bt literal 0 HcmV?d00001 diff --git a/textures/owl_tech_gem_1.png b/textures/owl_tech_gem_1.png new file mode 100755 index 0000000000000000000000000000000000000000..43022fce71009fbc87553aa7d9077251c065da92 GIT binary patch literal 5145 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 Cb)j|u literal 0 HcmV?d00001 diff --git a/textures/owl_tech_gem_2.png b/textures/owl_tech_gem_2.png new file mode 100755 index 0000000000000000000000000000000000000000..796683f1b523b9bae2c0f8bb41b32a17f287f6e4 GIT binary patch literal 5100 zcmeHKc~leU77r@2D1xX35g`p~QA{$~7YU1mB}f1fWcA2oG6@6ONCpxRTo4s0PX!m& zDqyv?C?Ev{r6^UTqNtQws)Az0rCMC;1FeNO38;8p&w0mlUjH-aB$>JQcYoi#zwdrG znXSQrz82_!M?5ZZ_~-xr{nVx5Qm%iLuzOQ8UkwZDz#FA$Y4C0qJr_T z4w2w+x@&de344BbHXXjSNMe>jXs~yDT5@7zO(ot6Qt#UsPN zJ=wmhzkF$IXMqS!-Zax1E(?>lHK3nkDs};8;Cm(k9rhG4> zH79PYkE}6YwypJzir&X$+M{YrgEiuM_9NlG{Da%yluS&Eji}k;Rp*+sj;7I zY3RA21F2>FB;f98+g}7}&pHa`ul{VHrE7z+^q2lc7vkb`=M*h0uqK-*sZsMHMdu%s18cvSwAOl{V~4Pk zm-QplWDj9V$KN_Ab8gDznQ+vg8R~=)z(82KRGXBu(M&gUD?2_7Q{c` z;N-6Bpd_Gr`_Iz&sj!pFr21F6r7OJ(c_xx=iw~EueI32}ZTFu^be24|_J}CYIyCRx z1BP=#=<+LHa+W_!j#Fm~@(%7&*B4xMm9AM*?0IohHn|Mg74c=9V1BsEKD$NT5eMRh z3|4&e)t8;3od=0^O?{#RwV9jp8-6HX7NtHG^3Wmmeh-vi$$ODjUElc%AXRUklRz)D z+pMmZMCJAxZ@ZmoBK5KL^nhX}8{ZbsDdDtQ#Q`j~X6s>>f~oT?FWOBzo6}N_Pi*^Q zN$Kv+mYyozL^EwuXHelr&tC7l4k>HSM$Oq*#+@B~LN)KoOSdf3oDFR@54UE9PYJ)X z#5Y7;thqN-W!;=G#PdzYJr9cQ@f+fm%rbs$e)eCPt6Lg8jU3xwFnk}gH(2&ZwTlPp zC(wp*=NH|QFTQ!HRbkQ8QS>}~jc}J`_p%gllBM#%olN`UG|wKR*7S7^KaH5>#@&Q! zkDtu%>V8mmeO0Sh*zNGH=A1uPMW|}rVs|G~w>`R(*HBlpZ%4{p>n2?Vsm5vHfG~Ml zd|6|gebwcvS?ng+UZlhK(+cwe7{2^*QX@IiX9Q1-kDhcn7Vyu5-1US4m` zGx_npyNn( zZQF4r( zu-h)7cjrkUuRDBCW1z-Vuvlbf&38UjmSZkEgIp0D-Er`*%NTu7MIAPKbqF?NBZL85NGT_QVxEtSG2IFw9 z?m86+CBP_N1WOSGkMQ`!Ndg`b^9bP#As|$F!EuORsv2IA8W;+tCO{l9!QIW=Rma5$ zn5Lly3QbVwJGOR$I##4x)xACeZwaieC7$U3HUsMetoW3 z2_a&x;gUmRFleAeLWD#RgGiT1s6iw<$H zL_`3QPNA@fAdMp-av%wXO`|}NNX#}+i6O3!QY{Cu?L_3D6eg<_QiDS;IM*{+z#~ve zz&lH@3`8YZ0FMxWD3WyV9HEFDUV(yoH7QIcKxMJ$Oe&SepipV=Kr3Oj2J1vUCj}tU zs0NRITew&;n6RL}PcZ_69jk@wrG`ONsSZ^tWjumDCA>cJty_p4CozbEd=P~(Qh-Y3 z0&FgY8Vazu6bcuhxBxURFb=O2Ba)Q=h1MS)yzA(e`ym=^{S<>~^hB+I6G!hxZ)J$# zDB~D{D*LUS)=Z2sHaS#zIALk^P-Vrhm*h29KfBrVlA1DcUHa-PS3UStkDTey z1>{kZn0v40=c4AvUq3v4%E5>~&*i}V>A$GMt2XvvPDUO8;=ZE;ivtw@#N^Pc| z4(@oKGuW&u QhNX)Wcn9(;m&RuN2i`EGX8-^I literal 0 HcmV?d00001 diff --git a/textures/owl_tech_gem_block_1.png b/textures/owl_tech_gem_block_1.png new file mode 100755 index 0000000000000000000000000000000000000000..c8e15dc11ebb3347d6f7351de0687ab38cbe2cde GIT binary patch literal 5172 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 k^yye_&d$ze9AW%kR7Qckg$T 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 J*yH2P{|0Jp>PP?p literal 0 HcmV?d00001 diff --git a/textures/owl_tech_sieve_face.png b/textures/owl_tech_sieve_face.png new file mode 100755 index 0000000000000000000000000000000000000000..8f94ccca3c19619494ce87c0aba7c82972e298d0 GIT binary patch literal 5039 zcmeHKc~nzp77varLD?%%3iu2tA_>`732VSa46>w>R#9J)7YJk{d6)pB7Obcg)Z&JU zBTUtb6zVBTRn&?Fmo^F(M5|~N9H|r$Z51sp^Ch6-OwXC)In)2lJ4xQV%kR7Q_uYGw zZ%tytEGI`FM+^qzB;fOs!MCgB?O+E!C;#>W#$f(dmM0RU$*=*^>NIkN5`oZMEdn7% zg&c!1Ub(nA?VFzI6IYr)YQftG9GY~b@_pBv@XMVar@IGL=eOS(Zrh_=y}l)C@{L0e z&5N!*Tk+YkIIoUm6FG0elvO6%(p%rwn1Y^=b`HBNrw#NE^e-+Se^42b()G+`=95Og zsO_iik<|l!KQ5i+oc|QX9&ibaar@%JqsUyBz@s^B{*}u12jrl}9Vfq0=ggFsHC!!S zb-84z-QnlXMg8=ZN#&_i?i-5-r$wGRm*D7=8}8wY-Oc}GzT2i4tosA}+}=%9dtIt; zR=4|Ys*i2GJ1{$BZ~(U@@O1sMOvA3$YEy@~#P_G`-TA}G4T)B&!?Uf$wdjy_y5W4Dt2YW#|gw2Cv|N5dRbKU#x(^sDV1?6Ikok5qABFT zzRPWk>+tR6%`E+sQ4@S8 zJ#0ujbHyJMe6r1veA%fWvXmEG#*_y{<2*2v`03cApJ1wWEBL2Qty#Qc$EQ{Ii!Y!E zQtsE!GDSvDEiQ0+V?jJsz}`~syQe&Otv2h~-Xr57{z z9o~FO=yQIZ=k|jgx{#1s@$4*dPH9c8;#}4pac0^Am$dx;&Xm?;6&*{ya`~52=7E$R zK_=^pz-eB6!1&T0o;?*K^>S!dK_?1tH<^MQ3+xX!nbJ?yB^L4hOg>H$$a|jTF1lZT z)Xnc!c=v65S9XtiYOmc9=2@;TKd!d4HE~CCLmI2B&$iL!S=Nk-A0A)kb_{%Yy78ge zbFWuvsz(du>f?Rp&Vfv0T6~C0QqwZckqAiMIpDH->$D-B>Bv(S9sf(J|A5D&Zx0Uh zT54BMUbx;Y%8odA<-5bsqPo)kwf(K1R&cuf2Rk1L+t&p@(3~|Y{;-MN8MS@;BabP) z3##^>{=0Y0=G4>er5=6>cW;LIOuj^%w!eEgk9;i_CC=S{skiFP=f&z(3HQ#sNuTgH zW|`f8JMde=)_m_r@yPS`)(eZg`JCq_+0f)&(=VA1?X$_oU~E<@Vqy{nF)=T@6ZB-o z($Bg4?<2j7%+L8XBHw4!XhpMLZe z=Md}Hz8fYZ%KX>hO z&5LE8q|I{MSYF+_M&kI7o?rdLkDFU^Hyf_){37-2_KAbo=K48Ie795g9btU$(Ye0J zRKb++Ab;vFh0W_0Y)MS|)CG=Q*rTig|yMcy)W-=MtQ-7wht(vd8P})D1Ng2T6& z9ZKE{&cD`k?dJL8&*r!HnO&e}U6Ha53+AVjQ31xKSU86x)u=*YnMQ(y8dX{_PBECU z2%{F3W+5mfLDCg!F796AcQ{BPD%aXEXxQKAaFe3*5 zs1Ou}j4GvC&oOdwR$LCaw}^>2$ZCRSadBc{A{3+1ArLK;7D^(-8Wl?@xNt`(Oed3b zl6i5X5a5Z6%Ro^rhe$LS450>Us79AgB(vFUB8ftzPzb<+pwCsKu#uqF2Us9RFnEYw zs#9oDg+>ioFky)%2j${$Ko7l)Po)(KU%{*OqbvYEh(=gTB!`lSDiv|8haQbx0zgIs z`cn_R2>j|0lM%fpM<+#Mmmq31U@U}8`pRFMqf=Vbkx7Y&5>WwDJy@0e#*(uH!o*h| z77Ef8Dy`KEko|@ws*t}X>y6kf8f!XZ0|D-@aNn?gnY+~(SP6w3o<^Eu2~WV|;w{?Pyjqs z0dOcVi%gbDBm@|iF$gq7P9?Bt2tZ`g*)pb-j7aHYA?E57pekYI*r+T}G5|$q!Au%i zMkkQzR4Rc+Ll^|MjLs%dSpbzxMVN9n(;AIT%8AqHR4~|1g$hnbh+1{JRbe5V6O}07 z;wYh{*OEjfjLLxn7dJ^bXo|B${~%h*T@v|-2Y{5X&xwSWXt&qJy<{2DjMmi6eN4(Y2;C< zu(lEeS(}0bOGi@B!%GmEHBNvvqLOC7>U0E5kI`~{DOdbSDKO*`8X18p1PM%`6KG6| zlmIgjgdl_2Ojsh3BP7XxpzAeq)Bx*{sC2+1;0lzdl`Ckvb)$mcjKz?FSatyrMj){X zuL+}%5=I#Z1gE8}<7^^UH$V&JWe-&NQDjV{O6$0?HBC zc$g~7bxu=lIecNY{Eze)%mfe1+Xl0(!W#(fQGqbl{x;UZA%r=;-fcM$tr75|M64gr zB{yNeC%LA~wrhhH_79F{76g$NnpR}2_#J5vRCTpQ>a}Nlzl@=bd!Ck(f2+a^Gkv$O zyJ;fERa$|$k-fFh^`x#yoOLX&sn!1W-N>J&6x z0`nV(=g({m+_UkIvaPjc!PS#}rrqDv)t%p(H?D9g^Ui}xR|W_QBZy7l)kQBZ{5O<3 Bev<$I literal 0 HcmV?d00001 diff --git a/textures/owl_tech_smelter_face.png b/textures/owl_tech_smelter_face.png new file mode 100755 index 0000000000000000000000000000000000000000..9825109dd30741bf88bcf467b1cafd998136fe9b GIT binary patch literal 622 zcmV-!0+IcRP)EX>4Tx04R}tkv&MmKpe$iTct%R3U&~2$j~~qAS&XhRVYG*P%E_RU~=gfG-*gu zTpR`0f`cE6RRx1k-{RDAVPqQIx48bLV{L}6cZWRPkQ)A9KT2|nOqex zax9<*6_Voz|AXJ%n#IWpHz}M1dS7h&BL)O_fmXw|zmILZbpiyQfh(=!uQh?0PtqG5 zEqVkDYy%h99ZlW?E_Z<8CtWfmM+(sN7mL9A8GTb87`g@e*4*CO`#607veZ@j1~@nb z#!8gE?(yzWcW?imY4`U7lVEbRhMApA00009a7bBm000XU000XU0RWnu7ytkO2XskI zMF-{x3=tC-iMOj%0001eNklhbYzMa3UW~6v%$B!kKMze3)W914Zj+ME#bMF=Dog~_I8&1)c ztFCNKykkq;a(T(5I;_UFu-|nf*S|Dkp<_ zE^Y0DHIjeVI7pcT3;F3CPJ>wwh{d+gTw5>_bXsxO(ZhsC3tuKYUJve7obx<7VR)?X zqhq1azi^UGxd7d6c!GRu^&!J*m!g~>G5c1FHO4E-SSHcmI;^_bQQ20<-ITYjq(4Jn zp;xse--4Q;7i2*(QkfN2WO{zOyZhU}`i(i&7p#d#*iltqmIZT{S-xuHjWt|;9%aNL zFVDKO6XFTed@E12eTP@-4-)a{c2F6ei z`P=W1Za%=@4@d&9tg(a$v)g#w%Yu`W~HhM?BV$Q99WT zrZwj+r7g|AMDr|cpzM#Z6USv|`qZlI8%B?YWv_p{?|$2jJZ^NKqXD^L z&d)1czdEpE(dB}2gBrPC;m!5)6Ku$sNUmw3274d3p&|Mu5Zt=tSfpk+?Rs;Oa$bAw zBdhV23{`5>2TokiH6PStLhGOQ?emjHKkxNV`#rF6cdEsb?f2P# zHT3>^)A?b$&#`R$-qVAj4LzUty-4X!-|&_DPeVP9=~ZzPH*H=i*;h>)atfb1rCb;} zfefW|A`p6CikM7p5R>_OIKU&JH1%snV56Ty(}wUSkK)Wkx7!6}^fe2t5;{BImmKk^E%=V_koAaux%&IbxPxNjN4^#}JmQG^bYjPgms&yJ4V~q9c z1=P2aeu#6pto$u_>22OeCp{jWLS-z_znquT>IsGv77kMz#`^D!e3ma%`8*yPj#OCB z{Q`B*lNem0-mKo(PNt4qX0KVfI`>j;b8sE>+{UxKvaQ8r z0Xy9JJJhzrdqSQDoCAv|tc6FSp|+I!Hu{QZ7YSV=Gv`fgPybBA4_6g&v$ifeLU*?g zt8p5?kTG4a_!Pn_EL z!I9*8ug3|`5EYd_44BGfhWXZRDfNvf=Z@CDOgVVHZ@wE-o_n^A^$;H7Y7soFqd38I zP%6d%d?^pYsKqjPm?IG0zG@i&#z9IX4-$$b4Al6^(bJf05PNlkZN(fL_t?GP&!;Xyw-}bD5TCr8OK0HakxmPR1P6Y z7!n4DW~)Vs1eA{v(p%0K(8E~ErXk=v1}avml+m%+q@*NF5)mVn3$b__jfTY$uml1c zwm>VAB}zbzmMEOH5K|Z|NCC=4GNni=L25Apo>Zk|pir>}(H(lAQ>HOegfW9*PL~KMxxQDWobn2(c3(iPCvC1RtF7m#O6Ox^nm+ z7K(?&u&Dx$ihnEQ@*oa(#zRYiP$ZV=ykN55vQ&x$Z^(KpH?2lj&g?{B_Zi%`tY6oz zGls1=96C!1snu^CkI1&K_ zs07k1s33_#2}nRl3k8E?L@*8?PXh5|Di00fNH{c!LIBZ#03@P`c!NK_gbPkCds8j>sEPSj%JaTp>&r_pW;9WDkY7SQ%744{+4wa}Sz2vADp5mIS9 z1Eoy~sr8&ubKv8|2b2H{P(m;$jzFN}sC2wn1OZQn*Ld>BI3gW4%U;SC36lSpwf68J zy{EQ3P^5t4C+kF0Cn_9Dn7W&~jTh;T5)!F96m$TbDnS7xLQ@RGSW_x67LW)bczR5? z>ub5_?^=O}CwS2ad^DLR5THqT2#2P6kw|DVfQNWw9L|d(py^ncL03ox$|OJz`3qql zVXolz)NzG$(`}Ud+tx|3kaibf!q7M>`VC=}X~MA61!J`{<8{T}*#F|hTW2t9$iRM6 zGI)5wvk*Ho45vAR^Zh43(|hqxhCm|U2YDxc-_!M;u6JVKos8di*L%9&iGg=Ae&1dH zH@b}8yiP$9_$ep}epy26qkTTUeW$ zaz}Q+BKX1EKZ4paTA(p)^fQ^e8);uVXy}VDXfbP@<9mL*g7FPX9Z9~0z53L{Khy2& zU)s_Oid-~~zn$3`cu}=w^ms6#koQTD*@x?wb58p%0uhMAM)i-|*IlaiUp4A=VWjVP s=i>I$6$LjGQAP=OaW8+`qOLw`QYksA!?! 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 literal 0 HcmV?d00001 diff --git a/textures/owl_tech_stick_of_trufh.png b/textures/owl_tech_stick_of_trufh.png new file mode 100755 index 0000000000000000000000000000000000000000..c29c688dc44ed371b31d471c87b0e0f822545016 GIT binary patch literal 5364 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 literal 0 HcmV?d00001 diff --git a/textures/owl_tech_xray.png b/textures/owl_tech_xray.png new file mode 100755 index 0000000000000000000000000000000000000000..dde49e358d7e3115bd1f032ff8d2f63667f3816a GIT binary patch literal 5281 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 MP