From 689b25e4cbfadf11412c960550c8cab0489a2db2 Mon Sep 17 00:00:00 2001 From: ConfidentOwl Date: Sat, 11 Feb 2023 19:23:15 +0300 Subject: [PATCH] Add new fluid -tar --- api/item_logick.lua | 27 +- debug_tools/init.lua | 1 - mashins/electro_machins.lua | 2 +- mod.conf | 2 +- multiblocks/help_node.lua | 357 +++++++++- multiblocks/multiblock_api.lua | 110 ++- multiblocks/wood_pyrolysis.lua | 736 ++++++++++++++++++--- ore/node_register.lua | 162 ++++- pipe/fluid_tank.lua | 4 +- textures/owl_tech_empty_sell.png | Bin 0 -> 766 bytes textures/owl_tech_item_hatch.png | Bin 0 -> 623 bytes textures/owl_tech_lava_for_sell.png | Bin 0 -> 5056 bytes textures/owl_tech_tar_bucket.png | Bin 0 -> 5659 bytes textures/owl_tech_tar_flowing_animated.png | Bin 0 -> 7002 bytes textures/owl_tech_tar_for_sell.png | Bin 0 -> 627 bytes textures/owl_tech_tar_source_animated.png | Bin 0 -> 6237 bytes textures/owl_tech_water_for_sell.png | Bin 0 -> 5054 bytes 17 files changed, 1278 insertions(+), 123 deletions(-) create mode 100644 textures/owl_tech_empty_sell.png create mode 100644 textures/owl_tech_item_hatch.png create mode 100644 textures/owl_tech_lava_for_sell.png create mode 100644 textures/owl_tech_tar_bucket.png create mode 100644 textures/owl_tech_tar_flowing_animated.png create mode 100644 textures/owl_tech_tar_for_sell.png create mode 100644 textures/owl_tech_tar_source_animated.png create mode 100644 textures/owl_tech_water_for_sell.png diff --git a/api/item_logick.lua b/api/item_logick.lua index e689046..40ed016 100755 --- a/api/item_logick.lua +++ b/api/item_logick.lua @@ -145,18 +145,31 @@ function owl_tech.send_item_in_inventory(pos) or minetest.get_node(mass_pos[i]).name=="mcl_chests:trapped_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 + for j, value1 in pairs(INPUT_SLOT_NAME) do + if minetest.get_item_group((minetest.get_node(mass_pos[i])).name,INPUT_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 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 + if not inv:is_empty("pipe_inv") and inv_sourc:is_empty(INPUT_SLOT_NAME[j]) then + if inv_sourc:room_for_item(INPUT_SLOT_NAME[j], inv:get_stack("pipe_inv", 1)) and meta:get_int("has_filte")==0 then-- no filters + inv_sourc:add_item(INPUT_SLOT_NAME[j], 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/debug_tools/init.lua b/debug_tools/init.lua index ffe6e75..6894d45 100755 --- a/debug_tools/init.lua +++ b/debug_tools/init.lua @@ -32,7 +32,6 @@ minetest.register_craftitem("owl_tech:stick_of_truef", { 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/mashins/electro_machins.lua b/mashins/electro_machins.lua index 418941d..d77d55f 100644 --- a/mashins/electro_machins.lua +++ b/mashins/electro_machins.lua @@ -267,7 +267,7 @@ for i = 1, #table_all_machines, 1 do owl_tech.reset_item_redines(meta) end elseif recipt_true and 100/SMELTER_RECIPS[name][6]*12<=owl_tech:get_charge(meta) 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 amount=owl_tech.calculate_recipe_tire_bonus(meta,SMELTER_RECIPS[name][5],SMELTER_RECIPS[name][6]) meta:set_int("eat_in_tick",((100/SMELTER_RECIPS[name][6]*12)/(100/amount))) meta:set_int("bonus",amount) local steam_new =owl_tech:get_charge(meta)-meta:get_int("eat_in_tick") diff --git a/mod.conf b/mod.conf index 5912516..218138e 100755 --- a/mod.conf +++ b/mod.conf @@ -1,6 +1,6 @@ name = owl_tech author = ConfidentOwl -depends = mcl_core +depends = mcl_core,mcl_buckets,mcl_util description = Big tech mod diff --git a/multiblocks/help_node.lua b/multiblocks/help_node.lua index 24f1ddf..8c20200 100644 --- a/multiblocks/help_node.lua +++ b/multiblocks/help_node.lua @@ -3,20 +3,20 @@ local name = minetest.get_current_modname() local path = minetest.get_modpath(name) local energy_hatch_table ={ - {"base","Base",32,16000,"#575757","owl_tech:copper_electro_wire","steel"} + {"base","Base",32,16000,"#575757","owl_tech:copper_electro_wire","steel","owl_tech:bronze_fluid_pipe"} } for i, value in ipairs(energy_hatch_table) do - - minetest.register_node("owl_tech:"..energy_hatch_table[i][1].."energy_hatch_input", { + --input electro hatch + minetest.register_node("owl_tech:"..energy_hatch_table[i][1].."_energy_hatch_input", { description = S(energy_hatch_table[i][2].."energy hatch input"), _doc_items_longdesc = S("Contein energy for multinode"), tiles = { "(owl_tech_base_meshanism_side.png^[colorize:"..energy_hatch_table[i][5]..":128)", "owl_tech_base_meshanism_side.png^[colorize:"..energy_hatch_table[i][5]..":128", - "(owl_tech_base_tank_side.png^[colorize:"..energy_hatch_table[i][5]..":128)", - "(owl_tech_base_tank_side.png^[colorize:"..energy_hatch_table[i][5]..":128)", - "(owl_tech_base_tank_side.png^[colorize:"..energy_hatch_table[i][5]..":128)", - "(owl_tech_base_tank_side.png^[colorize:"..energy_hatch_table[i][5]..":128)^owl_tech_steam_input.png", + "(owl_tech_base_meshanism_side.png^[colorize:"..energy_hatch_table[i][5]..":128)^owl_tech_base_battary_side.png", + "(owl_tech_base_meshanism_side.png^[colorize:"..energy_hatch_table[i][5]..":128)^owl_tech_base_battary_side.png", + "(owl_tech_base_meshanism_side.png^[colorize:"..energy_hatch_table[i][5]..":128)^owl_tech_base_battary_side.png", + "(owl_tech_base_meshanism_side.png^[colorize:"..energy_hatch_table[i][5]..":128)^owl_tech_steam_input.png", }, is_ground_content = false, stack_max = 64, @@ -38,7 +38,7 @@ for i, value in ipairs(energy_hatch_table) do local timer = minetest.get_node_timer(pos) local meta = minetest.get_meta(pos) local rotation = minetest.get_node(pos).param2 % 32 - if owl_tech.get_active_hatch(meta)==1 then + if owl_tech:get_active_hatch(meta)==1 then if rotation==0 then --z-1 if minetest.get_item_group((minetest.get_node({x=pos.x,y=pos.y,z=pos.z-1})).name,"owl_tech_electro_wire")>0 and owl_tech:get_charge_max(meta)-owl_tech:get_charge(meta)>=owl_tech:get_voltage(meta) then --get from wire electro @@ -83,28 +83,28 @@ for i, value in ipairs(energy_hatch_table) do --Crafte minetest.register_craft({ type = "shaped", - output = "owl_tech:"..energy_hatch_table[i][1].."energy_hatch_input", + output = "owl_tech:"..energy_hatch_table[i][1].."_energy_hatch_input", recipe = { {"owl_tech:"..energy_hatch_table[i][7].."_plate","owl_tech:batteri_tire_"..i,"owl_tech:"..energy_hatch_table[i][7].."_plate"}, {"owl_tech:"..energy_hatch_table[i][7].."_plate","owl_tech:batteri_tire_"..i,"owl_tech:"..energy_hatch_table[i][7].."_plate"}, {"owl_tech:"..energy_hatch_table[i][7].."_plate",energy_hatch_table[i][6],"owl_tech:"..energy_hatch_table[i][7].."_plate"} } }) - - minetest.register_node("owl_tech:"..energy_hatch_table[i][1].."energy_hatch_output", { + --output electro hatch + minetest.register_node("owl_tech:"..energy_hatch_table[i][1].."_energy_hatch_output", { description = S(energy_hatch_table[i][2].."energy hatch output"), _doc_items_longdesc = S("Contein energy for multinode"), tiles = { "(owl_tech_base_meshanism_side.png^[colorize:"..energy_hatch_table[i][5]..":128)", "owl_tech_base_meshanism_side.png^[colorize:"..energy_hatch_table[i][5]..":128", - "(owl_tech_base_tank_side.png^[colorize:"..energy_hatch_table[i][5]..":128)", - "(owl_tech_base_tank_side.png^[colorize:"..energy_hatch_table[i][5]..":128)", - "(owl_tech_base_tank_side.png^[colorize:"..energy_hatch_table[i][5]..":128)", - "(owl_tech_base_tank_side.png^[colorize:"..energy_hatch_table[i][5]..":128)^owl_tech_steam_output.png", + "(owl_tech_base_meshanism_side.png^[colorize:"..energy_hatch_table[i][5]..":128)^owl_tech_base_battary_side.png", + "(owl_tech_base_meshanism_side.png^[colorize:"..energy_hatch_table[i][5]..":128)^owl_tech_base_battary_side.png", + "(owl_tech_base_meshanism_side.png^[colorize:"..energy_hatch_table[i][5]..":128)^owl_tech_base_battary_side.png", + "(owl_tech_base_meshanism_side.png^[colorize:"..energy_hatch_table[i][5]..":128)^owl_tech_steam_output.png", }, is_ground_content = false, stack_max = 64, - groups = {pickaxey=2, owl_tech_machine=1,energy_hatch_1_input=1}, + groups = {pickaxey=2, owl_tech_machine=1,energy_hatch_1_output=1}, sounds = mcl_sounds.node_sound_metal_defaults(), paramtype2 = "facedir", _mcl_blast_resistance = 6, @@ -122,7 +122,7 @@ for i, value in ipairs(energy_hatch_table) do local timer = minetest.get_node_timer(pos) local meta = minetest.get_meta(pos) local rotation = minetest.get_node(pos).param2 % 32 - if owl_tech.get_active_hatch(meta)==1 then + if owl_tech:get_active_hatch(meta)==1 then if rotation==0 then --z-1 if minetest.get_item_group((minetest.get_node({x=pos.x,y=pos.y,z=pos.z-1})).name,"owl_tech_electro_wire") then --send electro in wire local meta_up = minetest.get_meta({x=pos.x,y=pos.y,z=pos.z+1}) @@ -175,11 +175,332 @@ for i, value in ipairs(energy_hatch_table) do --Crafte minetest.register_craft({ type = "shaped", - output = "owl_tech:"..energy_hatch_table[i][1].."energy_hatch_input", + output = "owl_tech:"..energy_hatch_table[i][1].."_energy_hatch_output", recipe = { {"owl_tech:"..energy_hatch_table[i][7].."_plate",energy_hatch_table[i][6],"owl_tech:"..energy_hatch_table[i][7].."_plate"}, {"owl_tech:"..energy_hatch_table[i][7].."_plate","owl_tech:batteri_tire_"..i,"owl_tech:"..energy_hatch_table[i][7].."_plate"}, {"owl_tech:"..energy_hatch_table[i][7].."_plate","owl_tech:batteri_tire_"..i,"owl_tech:"..energy_hatch_table[i][7].."_plate"} } }) + --input item + minetest.register_node("owl_tech:"..energy_hatch_table[i][1].."_item_hatch_input", { + description = S(energy_hatch_table[i][2].."item hatch input"), + _doc_items_longdesc = S("Contein item for multinode"), + tiles = { + "(owl_tech_base_meshanism_side.png^[colorize:"..energy_hatch_table[i][5]..":128)", + "(owl_tech_base_meshanism_side.png^[colorize:"..energy_hatch_table[i][5]..":128)", + "(owl_tech_base_meshanism_side.png^[colorize:"..energy_hatch_table[i][5]..":128)^owl_tech_item_hatch.png", + "(owl_tech_base_meshanism_side.png^[colorize:"..energy_hatch_table[i][5]..":128)^owl_tech_item_hatch.png", + "(owl_tech_base_meshanism_side.png^[colorize:"..energy_hatch_table[i][5]..":128)^owl_tech_item_hatch.png", + "(owl_tech_base_meshanism_side.png^[colorize:"..energy_hatch_table[i][5]..":128)^owl_tech_steam_input.png", + }, + is_ground_content = false, + stack_max = 64, + groups = {pickaxey=2, owl_tech_machine=1,item_hatch_1_input=1,input_in=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.set_mashine_tire(meta,i+1) + owl_tech:set_active_hatch(meta,0) + local inv = meta:get_inventory() + inv:set_size("input_in", 1) + local timer =minetest.get_node_timer(pos) + local text_info ="empty" + local input_stack = inv:get_stack("input_in", 1) + if not input_stack:is_empty() then + text_info = input_stack:get_count().."--"..input_stack:get_name() + end + meta:set_string("infotext",text_info) + 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_stack = inv:get_stack("input_in", 1) + local rotation = minetest.get_node(pos).param2 % 32 + local text_info ="empty" + if not input_stack:is_empty() then + text_info = input_stack:get_count().."--"..input_stack:get_name() + end + meta:set_string("infotext",text_info) + timer:start(0.2) + end + }) + --Crafte + minetest.register_craft({ + type = "shaped", + output = "owl_tech:"..energy_hatch_table[i][1].."_item_hatch_input", + recipe = { + {"owl_tech:"..energy_hatch_table[i][7].."_plate",energy_hatch_table[i][6],"owl_tech:"..energy_hatch_table[i][7].."_plate"}, + {"owl_tech:"..energy_hatch_table[i][7].."_plate","mcl_chests:chest","owl_tech:"..energy_hatch_table[i][7].."_plate"}, + {"owl_tech:"..energy_hatch_table[i][7].."_plate","mcl_chests:chest","owl_tech:"..energy_hatch_table[i][7].."_plate"} + } + }) + --output item + minetest.register_node("owl_tech:"..energy_hatch_table[i][1].."_item_hatch_output", { + description = S(energy_hatch_table[i][2].."item hatch output"), + _doc_items_longdesc = S("Contein item for multinode"), + tiles = { + "(owl_tech_base_meshanism_side.png^[colorize:"..energy_hatch_table[i][5]..":128)", + "(owl_tech_base_meshanism_side.png^[colorize:"..energy_hatch_table[i][5]..":128)", + "(owl_tech_base_meshanism_side.png^[colorize:"..energy_hatch_table[i][5]..":128)^owl_tech_item_hatch.png", + "(owl_tech_base_meshanism_side.png^[colorize:"..energy_hatch_table[i][5]..":128)^owl_tech_item_hatch.png", + "(owl_tech_base_meshanism_side.png^[colorize:"..energy_hatch_table[i][5]..":128)^owl_tech_item_hatch.png", + "(owl_tech_base_meshanism_side.png^[colorize:"..energy_hatch_table[i][5]..":128)^owl_tech_steam_output.png", + }, + is_ground_content = false, + stack_max = 64, + groups = {pickaxey=2, owl_tech_machine=1,item_hatch_1_output=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.set_mashine_tire(meta,i+1) + owl_tech:set_active_hatch(meta,0) + local inv = meta:get_inventory() + inv:set_size("dst", 1) + local timer =minetest.get_node_timer(pos) + local text_info ="empty" + local input_stack = inv:get_stack("dst", 1) + if not input_stack:is_empty() then + text_info = input_stack:get_count().."--"..input_stack:get_name() + end + meta:set_string("infotext",text_info) + 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_stack = inv:get_stack("dst", 1) + local text_info ="empty" + if not input_stack:is_empty() then + text_info = input_stack:get_count().."--"..input_stack:get_name() + end + meta:set_string("infotext",text_info) + timer:start(0.2) + end + }) + --Crafte + minetest.register_craft({ + type = "shaped", + output = "owl_tech:"..energy_hatch_table[i][1].."_item_hatch_output", + recipe = { + {"owl_tech:"..energy_hatch_table[i][7].."_plate","mcl_chests:chest","owl_tech:"..energy_hatch_table[i][7].."_plate"}, + {"owl_tech:"..energy_hatch_table[i][7].."_plate","mcl_chests:chest","owl_tech:"..energy_hatch_table[i][7].."_plate"}, + {"owl_tech:"..energy_hatch_table[i][7].."_plate",energy_hatch_table[i][6],"owl_tech:"..energy_hatch_table[i][7].."_plate"} + } + }) + --input fluid hatch + minetest.register_node("owl_tech:"..energy_hatch_table[i][1].."_fluid_hatch_input", { + description = S(energy_hatch_table[i][2].."fluid hatch input"), + _doc_items_longdesc = S("Contein fluid for multinode"), + tiles = { + "(owl_tech_base_tank_side.png^[colorize:"..energy_hatch_table[i][5]..":128)", + "(owl_tech_base_tank_side.png^[colorize:"..energy_hatch_table[i][5]..":128)", + "(owl_tech_base_tank_side.png^[colorize:"..energy_hatch_table[i][5]..":128)", + "(owl_tech_base_tank_side.png^[colorize:"..energy_hatch_table[i][5]..":128)", + "(owl_tech_base_tank_side.png^[colorize:"..energy_hatch_table[i][5]..":128)", + "(owl_tech_base_tank_side.png^[colorize:"..energy_hatch_table[i][5]..":128)^owl_tech_steam_input.png", + }, + is_ground_content = false, + stack_max = 64, + groups = {pickaxey=2, owl_tech_machine=1,fluid_hatch_1_input=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,(energy_hatch_table[i][4]*2),1,1) + owl_tech.set_mashine_tire(meta,i+1) + owl_tech:set_active_hatch(meta,0) + owl_tech.update_fluid_pipe_around(pos) + owl_tech.set_fluid_sand_in_tick(meta,(energy_hatch_table[i][3]*2)) + 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) + local rotation = minetest.get_node(pos).param2 % 32 + if owl_tech:get_active_hatch(meta)==1 then + if rotation==0 then --z-1 + if minetest.get_item_group((minetest.get_node({x=pos.x,y=pos.y,z=pos.z-1})).name,"fluid_pipe") then --get from 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_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 + end + if rotation==2 then --z+1 + if minetest.get_item_group((minetest.get_node({x=pos.x,y=pos.y,z=pos.z+1})).name,"fluid_pipe") then --get from 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_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 + end + if rotation==3 then --x-1 + if minetest.get_item_group((minetest.get_node({x=pos.x-1,y=pos.y,z=pos.z})).name,"fluid_pipe") then --get from 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_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 + end + if rotation==1 then --x+1 + if minetest.get_item_group((minetest.get_node({x=pos.x+1,y=pos.y,z=pos.z})).name,"fluid_pipe") then --get from 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_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 + end + end + owl_tech.delit_name_fluid_if_0(meta) + meta:set_string("infotext",owl_tech.get_pull_volume(meta,1).."--"..owl_tech.get_pull_max_volume(meta,1)) + timer:start(0.2) + end + }) + --Crafte + minetest.register_craft({ + type = "shaped", + output = "owl_tech:"..energy_hatch_table[i][1].."_fluid_hatch_input", + recipe = { + {"owl_tech:"..energy_hatch_table[i][7].."_plate","owl_tech:batteri_tire_"..i,"owl_tech:"..energy_hatch_table[i][7].."_plate"}, + {"owl_tech:"..energy_hatch_table[i][7].."_plate","owl_tech:batteri_tire_"..i,"owl_tech:"..energy_hatch_table[i][7].."_plate"}, + {"owl_tech:"..energy_hatch_table[i][7].."_plate",energy_hatch_table[i][8],"owl_tech:"..energy_hatch_table[i][7].."_plate"} + } + }) + --output fluid hatch + minetest.register_node("owl_tech:"..energy_hatch_table[i][1].."_fluid_hatch_output", { + description = S(energy_hatch_table[i][2].."fluid hatch output"), + _doc_items_longdesc = S("Contein fluid for multinode"), + tiles = { + "(owl_tech_base_tank_side.png^[colorize:"..energy_hatch_table[i][5]..":128)", + "(owl_tech_base_tank_side.png^[colorize:"..energy_hatch_table[i][5]..":128)", + "(owl_tech_base_tank_side.png^[colorize:"..energy_hatch_table[i][5]..":128)", + "(owl_tech_base_tank_side.png^[colorize:"..energy_hatch_table[i][5]..":128)", + "(owl_tech_base_tank_side.png^[colorize:"..energy_hatch_table[i][5]..":128)", + "(owl_tech_base_tank_side.png^[colorize:"..energy_hatch_table[i][5]..":128)^owl_tech_steam_output.png", + }, + is_ground_content = false, + stack_max = 64, + groups = {pickaxey=2, owl_tech_machine=1,fluid_hatch_1_output=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,(energy_hatch_table[i][4]*2),1,1) + owl_tech.set_mashine_tire(meta,i+1) + owl_tech:set_active_hatch(meta,0) + owl_tech.update_fluid_pipe_around(pos) + owl_tech.set_fluid_sand_in_tick(meta,(energy_hatch_table[i][3]*2)) + 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) + local rotation = minetest.get_node(pos).param2 % 32 + if owl_tech:get_active_hatch(meta)==1 then + if rotation==0 then --z-1 + 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,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 + end + if rotation==2 then --z+1 + 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,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 + end + if rotation==3 then --x-1 + 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,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 + end + if rotation==1 then --x+1 + 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,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 + end + end + owl_tech.delit_name_fluid_if_0(meta) + meta:set_string("infotext",owl_tech.get_pull_volume(meta,1).."--"..owl_tech.get_pull_max_volume(meta,1)) + timer:start(0.2) + end + }) + --Crafte + minetest.register_craft({ + type = "shaped", + output = "owl_tech:"..energy_hatch_table[i][1].."_fluid_hatch_output", + recipe = { + {"owl_tech:"..energy_hatch_table[i][7].."_plate",energy_hatch_table[i][8],"owl_tech:"..energy_hatch_table[i][7].."_plate"}, + {"owl_tech:"..energy_hatch_table[i][7].."_plate","owl_tech:batteri_tire_"..i,"owl_tech:"..energy_hatch_table[i][7].."_plate"}, + {"owl_tech:"..energy_hatch_table[i][7].."_plate","owl_tech:batteri_tire_"..i,"owl_tech:"..energy_hatch_table[i][7].."_plate"} + } + }) end \ No newline at end of file diff --git a/multiblocks/multiblock_api.lua b/multiblocks/multiblock_api.lua index c42946a..0b68218 100644 --- a/multiblocks/multiblock_api.lua +++ b/multiblocks/multiblock_api.lua @@ -10,4 +10,112 @@ end function owl_tech:get_active_hatch(meta) return meta:get_int("activ_hatch") end -------------------------------------------------------- \ No newline at end of file +------------------------------------------------------- +--get and set enrgy hatch pos ofset (energy_hatch,item_hatch,fluid_hatch) +function owl_tech:set_hatch_ofset(meta,number_hatch,hatch_name,x,y,z) + meta:set_int("X"..number_hatch..hatch_name,x) + meta:set_int("Y"..number_hatch..hatch_name,y) + meta:set_int("Z"..number_hatch..hatch_name,z) +end +function owl_tech:get_hatch_ofset_X(meta,number_hatch,hatch_name) + return meta:get_int("X"..number_hatch..hatch_name) +end +function owl_tech:get_hatch_ofset_Y(meta,number_hatch,hatch_name) + return meta:get_int("Y"..number_hatch..hatch_name) +end +function owl_tech:get_hatch_ofset_Z(meta,number_hatch,hatch_name) + return meta:get_int("Z"..number_hatch..hatch_name) +end +------------------------------------------------------- +--set amount hatchs +function owl_tech:set_amount_energy_hatch(meta,amount) + meta:set_int("amount_energy_hatch",amount) +end +function owl_tech:get_amount_energy_hatch(meta) + return meta:get_int("amount_energy_hatch") +end +function owl_tech:set_amount_fluid_hatch(meta,amount) + meta:set_int("amount_fluid_hatch",amount) +end +function owl_tech:get_amount_fluid_hatch(meta) + return meta:get_int("amount_fluid_hatch") +end +function owl_tech:set_amount_item_hatch(meta,amount) + meta:set_int("amount_item_hatch",amount) +end +function owl_tech:get_amount_item_hatch(meta) + return meta:get_int("amount_item_hatch") +end +------------------------------------------------------ +--get and set item in hatch +function owl_tech:get_item_in_input_hatch_pos(x,y,z) + local meta = minetest.get_meta({x=x,y=y,z=z}) + local inv = meta:get_inventory() + local input_stack = inv:get_stack("input_in", 1) + return input_stack +end +function owl_tech:set_item_in_input_hatch_pos(x,y,z,item_stack) + local meta = minetest.get_meta({x=x,y=y,z=z}) + local inv = meta:get_inventory() + inv:set_stack("input_in", 1 ,item_stack) +end +function owl_tech:get_item_in_input_output_pos(x,y,z) + local meta = minetest.get_meta({x=x,y=y,z=z}) + local inv = meta:get_inventory() + local input_stack = inv:get_stack("dst", 1) + return input_stack +end +function owl_tech:set_item_in_input_output_pos(x,y,z,item_stack) + local meta = minetest.get_meta({x=x,y=y,z=z}) + local inv = meta:get_inventory() + inv:set_stack("dst", 1 ,item_stack) +end +------------------------------------------------------ +--get and set energy in hatch +function owl_tech:get_charge_in_hatch_pos(x,y,z) + return owl_tech:get_charge(minetest.get_meta({x=x,y=y,z=z})) +end +function owl_tech:set_charge_in_hatch_pos(x,y,z,energy) + owl_tech:set_charge(minetest.get_meta({x=x,y=y,z=z}),energy) +end +------------------------------------------------------ +--get and set max charge in hatch +function owl_tech:get_max_charge_in_hatch_pos(x,y,z) + return owl_tech:get_charge_max(minetest.get_meta({x=x,y=y,z=z})) +end +function owl_tech:set_max_charge_in_hatch_pos(x,y,z,energy) + owl_tech:set_charge_max(minetest.get_meta({x=x,y=y,z=z}),energy) +end +------------------------------------------------------ +--get and set voltage hatch +function owl_tech:get_voltage_in_hatch_pos(x,y,z) + return owl_tech:get_voltage(minetest.get_meta({x=x,y=y,z=z})) +end +function owl_tech:set_voltage_in_hatch_pos(x,y,z,energy) + owl_tech:set_voltage(minetest.get_meta({x=x,y=y,z=z}),energy) +end +------------------------------------------------------ +--get and set fluid amount in hatch +function owl_tech:get_volume_amount_in_hatch_pos(x,y,z) + return owl_tech.get_pull_volume(minetest:get_meta({x=x,y=y,z=z}),1) +end +function owl_tech:set_volume_amount_in_hatch_pos(x,y,z,volume) + owl_tech.set_pull_volume(minetest:get_meta({x=x,y=y,z=z}),1,volume) +end +------------------------------------------------------ +--get and set max volume amount in hatch +function owl_tech:get_max_volume_in_hatch_pos(x,y,z) + return owl_tech.get_pull_max_volume(minetest:get_meta({x=x,y=y,z=z}),1) +end +function owl_tech:set_max_volume_in_hatch_pos(x,y,z,volume) + owl_tech.set_pull_max_volume(minetest:get_meta({x=x,y=y,z=z}),1,volume) +end +------------------------------------------------------ +--get and set name fluid in hatch +function owl_tech:get_name_fluid_in_hatch_pos(x,y,z) + return owl_tech.get_pull_fluid_name(minetest:get_meta({x=x,y=y,z=z}),1) +end +function owl_tech:set_name_fluid_in_hatch_pos(x,y,z,name) + owl_tech.set_pull_fluid_name(minetest:get_meta({x=x,y=y,z=z}),1,name) +end +------------------------------------------------------- diff --git a/multiblocks/wood_pyrolysis.lua b/multiblocks/wood_pyrolysis.lua index 5949f9d..2d006dd 100644 --- a/multiblocks/wood_pyrolysis.lua +++ b/multiblocks/wood_pyrolysis.lua @@ -1,8 +1,17 @@ local S = minetest.get_translator(minetest.get_current_modname()) local name = minetest.get_current_modname() local path = minetest.get_modpath(name) +--[[ + multinode = 3x4x3 + frames - "owl_tech:steel_big_tiles" + entrails - "owl_tech:copper_grid" + other nodes(can replace bu hatch) - "owl_tech:tin_tiles" + need 1 input item hatch ,1 output item hatch , 1 input energy hatch , 1 output fluid hatch +]] ---[[local function set_formspect_wood_pyrolis(meta) + + +local function set_formspect_wood_pyrolis(meta) local redines = owl_tech.get_item_redines(meta) local burn= meta:get_int("fuel_burn") local formspec = "size[9,8.75]".. @@ -31,63 +40,587 @@ end local function bronze_blast_furnanse_build_correct(pos) local retu = true - local centr_pos= { - x=0,y=0,z=0 - } - if minetest.get_node_or_nil({x=pos.x+1,y=pos.y,z=pos.z}).name=='mcl_core:lava_source' then --x+1 - centr_pos={ - x=pos.x+1,y=pos.y,z=pos.z - } - elseif minetest.get_node_or_nil({x=pos.x-1,y=pos.y,z=pos.z}).name=='mcl_core:lava_source' then --x-1 - centr_pos={ - x=pos.x-1,y=pos.y,z=pos.z - } - elseif minetest.get_node_or_nil({x=pos.x,y=pos.y,z=pos.z+1}).name=='mcl_core:lava_source' then --z+1 - centr_pos={ - x=pos.x,y=pos.y,z=pos.z+1 - } - elseif minetest.get_node_or_nil({x=pos.x,y=pos.y,z=pos.z-1}).name=='mcl_core:lava_source' then --z-1 - centr_pos={ - x=pos.x,y=pos.y,z=pos.z-1 + local meta = minetest.get_meta(pos) + local rotation = minetest.get_node(pos).param2 % 32 + + local id_frame = minetest.get_content_id("owl_tech:steel_big_tiles") + local id_entrails = minetest.get_content_id("owl_tech:copper_tiles") + local id_other= minetest.get_content_id("owl_tech:tin_tiles") + + local id_item_input_hatch = minetest.get_content_id("owl_tech:base_item_hatch_input") + local id_item_output_hatch = minetest.get_content_id("owl_tech:base_item_hatch_output") + local id_energy_input_hatch = minetest.get_content_id("owl_tech:base_energy_hatch_input") + local id_energy_output_hatch = minetest.get_content_id("owl_tech:base_energy_hatch_output") + local id_fluid_input_hatch = minetest.get_content_id("owl_tech:base_fluid_hatch_input") + local id_fluid_output_hatch = minetest.get_content_id("owl_tech:base_fluid_hatch_output") + + local item_hatch_input_count = 0 + local item_hatch_output_count = 0 + local energy_hatch_input_count = 0 + local fluid_hatch_output_count = 0 + + --check frame + if rotation==0 then --z-1 + local corect =true + local vm = minetest.get_voxel_manip() + local pos1,pos2 = {x=pos.x-1,y=pos.y-1,z=pos.z},{x=pos.x+1,y=pos.y+1,z=pos.z+4} + local emin, emax = vm:read_from_map(pos1,pos2) + local a = VoxelArea:new{ + MinEdge = emin, + MaxEdge = emax } + local data = vm:get_data() + -- begin frames + for z = pos1.z, pos2.z do + for y = pos1.y,pos2.y,pos2.y-pos1.y do + for x = pos1.x,pos2.x,pos2.x-pos1.x do + local vi = a:index(x, y, z) + if data[vi] ~= id_frame then + minetest.chat_send_all("error"..pos1.x.."--"..pos1.y.."--"..z) + corect = false + end + end + end + end + for y = pos1.y,pos2.y,pos2.y-pos1.y do + for z = pos1.z,pos2.z,pos2.z-pos1.z do + local vi = a:index(pos.x, y, z) + if data[vi] ~= id_frame then + minetest.chat_send_all("error"..pos1.x.."--"..pos1.y.."--"..z) + corect = false + end + end + end + for x = pos1.x,pos2.x,pos2.x-pos1.x do + for z = pos1.z,pos2.z,pos2.z-pos1.z do + local vi = a:index(x, pos1.y+1, z) + if data[vi] ~= id_frame then + minetest.chat_send_all("error"..pos1.x.."--"..pos1.y.."--"..z) + corect = false + end + end + end + -- end frames -begin entrails + for z = pos1.z+1,pos2.z-1 , 1 do + local vi = a:index(pos.x, pos.y, z) + if data[vi] ~= id_entrails then + minetest.chat_send_all("error"..pos1.x.."--"..pos1.y.."--"..z) + corect = false + end + end + -- end entrails look for hatch + for x = pos1.x, pos2.x,pos2.x-pos1.x do + for z = pos1.z+1,pos2.z-1 , 1 do + local vi = a:index(x, pos.y, z) + if data[vi] == id_item_input_hatch then + owl_tech:set_hatch_ofset(meta,1,"item_hatch_input",x,pos.y,z) + item_hatch_input_count = item_hatch_input_count + 1 + end + if data[vi] == id_item_output_hatch then + owl_tech:set_hatch_ofset(meta,1,"item_hatch_output",x,pos.y,z) + item_hatch_output_count = item_hatch_output_count + 1 + end + if data[vi] == id_energy_input_hatch then + owl_tech:set_hatch_ofset(meta,1,"energy_hatch_input",x,pos.y,z) + energy_hatch_input_count = energy_hatch_input_count + 1 + end + if data[vi] == id_fluid_output_hatch then + owl_tech:set_hatch_ofset(meta,1,"fluid_hatch_output",x,pos.y,z) + fluid_hatch_output_count = fluid_hatch_output_count + 1 + end + end + end + for y = pos1.y, pos2.y,pos2.y-pos1.y do + for z = pos1.z+1,pos2.z-1 , 1 do + local vi = a:index(pos.x, y, z) + if data[vi] == id_item_input_hatch then + owl_tech:set_hatch_ofset(meta,1,"item_hatch_input",pos.x, y, z) + item_hatch_input_count = item_hatch_input_count + 1 + end + if data[vi] == id_item_output_hatch then + owl_tech:set_hatch_ofset(meta,1,"item_hatch_output",pos.x, y, z) + item_hatch_output_count = item_hatch_output_count + 1 + end + if data[vi] == id_energy_input_hatch then + owl_tech:set_hatch_ofset(meta,1,"energy_hatch_input",pos.x, y, z) + energy_hatch_input_count = energy_hatch_input_count + 1 + end + if data[vi] == id_fluid_output_hatch then + owl_tech:set_hatch_ofset(meta,1,"fluid_hatch_output",pos.x, y, z) + fluid_hatch_output_count = fluid_hatch_output_count + 1 + end + end + end + if data[a:index(pos.x, pos.y, pos2.z)] == id_item_input_hatch then + owl_tech:set_hatch_ofset(meta,1,"fluid_hatch_output",pos.x, pos.y, pos2.z) + fluid_hatch_output_count = fluid_hatch_output_count + 1 + end + if data[a:index(pos.x, pos.y, pos2.z)] == id_item_output_hatch then + owl_tech:set_hatch_ofset(meta,1,"item_hatch_output",pos.x, pos.y, pos2.z) + item_hatch_output_count = item_hatch_output_count + 1 + end + if data[a:index(pos.x, pos.y, pos2.z)] == id_energy_input_hatch then + owl_tech:set_hatch_ofset(meta,1,"energy_hatch_input",pos.x, pos.y, pos2.z) + energy_hatch_input_count = energy_hatch_input_count + 1 + end + if data[a:index(pos.x, pos.y, pos2.z)] == id_fluid_output_hatch then + owl_tech:set_hatch_ofset(meta,1,"fluid_hatch_output",pos.x, pos.y, pos2.z) + fluid_hatch_output_count = fluid_hatch_output_count + 1 + end + --end look for hacth begin look for other nodes + for x = pos1.x, pos2.x,pos2.x-pos1.x do + for z = pos1.z+1,pos2.z-1 , 1 do + local vi = a:index(x, pos.y, z) + if not (data[vi] == id_other or data[vi] == id_item_input_hatch or data[vi] == id_item_output_hatch or data[vi] == id_energy_input_hatch or data[vi] == id_fluid_output_hatch) then + minetest.chat_send_all(1) + corect = false + end + end + end + for y = pos1.y, pos2.y,pos2.y-pos1.y do + for z = pos1.z+1,pos2.z-1 , 1 do + local vi = a:index(pos.x, y, z) + if not (data[vi] == id_other or data[vi] == id_item_input_hatch or data[vi] == id_item_output_hatch or data[vi] == id_energy_input_hatch or data[vi] == id_fluid_output_hatch) then + minetest.chat_send_all(1) + corect = false + end + end + end + if not (data[a:index(pos.x, pos.y, pos2.z)] == id_other or data[a:index(pos.x, pos.y, pos2.z)] == id_item_input_hatch or data[a:index(pos.x, pos.y, pos2.z)] == id_item_output_hatch + or data[a:index(pos.x, pos.y, pos2.z)] == id_energy_input_hatch or data[a:index(pos.x, pos.y, pos2.z)] == id_fluid_output_hatch) then + corect = false + end + if item_hatch_input_count~=1 or item_hatch_output_count~=1 or energy_hatch_input_count~=1 or fluid_hatch_output_count~=1 then--get need count of hatchs + local meta = minetest.get_meta(pos) + corect = false + minetest.chat_send_all(rotation.."eror!") + owl_tech:set_hatch_ofset(meta,1,"item_hatch_input",0,0,0) + owl_tech:set_hatch_ofset(meta,1,"item_hatch_output",0,0,0) + owl_tech:set_hatch_ofset(meta,1,"energy_hatch_input",0,0,0) + owl_tech:set_hatch_ofset(meta,1,"fluid_hatch_output",0,0,0) + end + return corect end - if centr_pos.y==pos.y then - for i = -1, 1, 1 do --check botom - for j = -1, 1, 1 do - if minetest.get_node_or_nil({x=centr_pos.x+i,y=centr_pos.y-1,z=centr_pos.z+j}).name~="owl_tech:bronze_briks" then - retu=false + if rotation==2 then --z+1 + local corect =true + local vm = minetest.get_voxel_manip() + local pos1,pos2 = {x=pos.x-1,y=pos.y-1,z=pos.z-4},{x=pos.x+1,y=pos.y+1,z=pos.z} + local emin, emax = vm:read_from_map(pos1,pos2) + local a = VoxelArea:new{ + MinEdge = emin, + MaxEdge = emax + } + local data = vm:get_data() + -- begin frames + for z = pos1.z, pos2.z do + for y = pos1.y,pos2.y,pos2.y-pos1.y do + for x = pos1.x,pos2.x,pos2.x-pos1.x do + local vi = a:index(x, y, z) + if data[vi] ~= id_frame then + minetest.chat_send_all("error"..pos1.x.."--"..pos1.y.."--"..z) + corect = false + end end end end - if minetest.get_node_or_nil({x=centr_pos.x+1,y=centr_pos.y,z=centr_pos.z+1}).name~="owl_tech:bronze_briks" or - minetest.get_node_or_nil({x=centr_pos.x-1,y=centr_pos.y,z=centr_pos.z+1}).name~="owl_tech:bronze_briks" or - minetest.get_node_or_nil({x=centr_pos.x+1,y=centr_pos.y,z=centr_pos.z-1}).name~="owl_tech:bronze_briks" or - minetest.get_node_or_nil({x=centr_pos.x-1,y=centr_pos.y,z=centr_pos.z-1}).name~="owl_tech:bronze_briks" then - retu=false - end - for i = -1, 1, 1 do --check +1 level - for j = -1, 1, 1 do - if minetest.get_node_or_nil({x=centr_pos.x+i,y=centr_pos.y+1,z=centr_pos.z+j}).name~="owl_tech:bronze_briks" and not(i==0 and j==0) then - retu=false + for y = pos1.y,pos2.y,pos2.y-pos1.y do + for z = pos1.z,pos2.z,pos2.z-pos1.z do + local vi = a:index(pos.x, y, z) + if data[vi] ~= id_frame then + minetest.chat_send_all("error"..pos1.x.."--"..pos1.y.."--"..z) + corect = false end end end - for i = -1, 1, 1 do --check +2 level - for j = -1, 1, 1 do - if minetest.get_node_or_nil({x=centr_pos.x+i,y=centr_pos.y+2,z=centr_pos.z+j}).name~="owl_tech:bronze_briks" and not(i==0 and j==0) then - retu=false + for x = pos1.x,pos2.x,pos2.x-pos1.x do + for z = pos1.z,pos2.z,pos2.z-pos1.z do + local vi = a:index(x, pos1.y+1, z) + if data[vi] ~= id_frame then + minetest.chat_send_all("error"..pos1.x.."--"..pos1.y.."--"..z) + corect = false end end end - return retu - else - return false + -- end frames -begin entrails + for z = pos1.z+1,pos2.z-1 , 1 do + local vi = a:index(pos.x, pos.y, z) + if data[vi] ~= id_entrails then + minetest.chat_send_all("error"..pos1.x.."--"..pos1.y.."--"..z) + corect = false + end + end + -- end entrails look for hatch + for x = pos1.x, pos2.x,pos2.x-pos1.x do + for z = pos1.z+1,pos2.z-1 , 1 do + local vi = a:index(x, pos.y, z) + if data[vi] == id_item_input_hatch then + owl_tech:set_hatch_ofset(meta,1,"item_hatch_input",x,pos.y,z) + item_hatch_input_count = item_hatch_input_count + 1 + end + if data[vi] == id_item_output_hatch then + owl_tech:set_hatch_ofset(meta,1,"item_hatch_output",x,pos.y,z) + item_hatch_output_count = item_hatch_output_count + 1 + end + if data[vi] == id_energy_input_hatch then + owl_tech:set_hatch_ofset(meta,1,"energy_hatch_input",x,pos.y,z) + energy_hatch_input_count = energy_hatch_input_count + 1 + end + if data[vi] == id_fluid_output_hatch then + owl_tech:set_hatch_ofset(meta,1,"fluid_hatch_output",x,pos.y,z) + fluid_hatch_output_count = fluid_hatch_output_count + 1 + end + end + end + for y = pos1.y, pos2.y,pos2.y-pos1.y do + for z = pos1.z+1,pos2.z-1 , 1 do + local vi = a:index(pos.x, y, z) + if data[vi] == id_item_input_hatch then + owl_tech:set_hatch_ofset(meta,1,"item_hatch_input",pos.x, y, z) + item_hatch_input_count = item_hatch_input_count + 1 + end + if data[vi] == id_item_output_hatch then + owl_tech:set_hatch_ofset(meta,1,"item_hatch_output",pos.x, y, z) + item_hatch_output_count = item_hatch_output_count + 1 + end + if data[vi] == id_energy_input_hatch then + owl_tech:set_hatch_ofset(meta,1,"energy_hatch_input",pos.x, y, z) + energy_hatch_input_count = energy_hatch_input_count + 1 + end + if data[vi] == id_fluid_output_hatch then + owl_tech:set_hatch_ofset(meta,1,"fluid_hatch_output",pos.x, y, z) + fluid_hatch_output_count = fluid_hatch_output_count + 1 + end + end + end + if data[a:index(pos.x, pos.y, pos2.z)] == id_item_input_hatch then + owl_tech:set_hatch_ofset(meta,1,"fluid_hatch_output",pos.x, pos.y, pos2.z) + fluid_hatch_output_count = fluid_hatch_output_count + 1 + end + if data[a:index(pos.x, pos.y, pos2.z)] == id_item_output_hatch then + owl_tech:set_hatch_ofset(meta,1,"item_hatch_output",pos.x, pos.y, pos2.z) + item_hatch_output_count = item_hatch_output_count + 1 + end + if data[a:index(pos.x, pos.y, pos2.z)] == id_energy_input_hatch then + owl_tech:set_hatch_ofset(meta,1,"energy_hatch_input",pos.x, pos.y, pos2.z) + energy_hatch_input_count = energy_hatch_input_count + 1 + end + if data[a:index(pos.x, pos.y, pos2.z)] == id_fluid_output_hatch then + owl_tech:set_hatch_ofset(meta,1,"fluid_hatch_output",pos.x, pos.y, pos2.z) + fluid_hatch_output_count = fluid_hatch_output_count + 1 + end + --end look for hacth begin look for other nodes + for x = pos1.x, pos2.x,pos2.x-pos1.x do + for z = pos1.z+1,pos2.z-1 , 1 do + local vi = a:index(x, pos.y, z) + if not (data[vi] == id_other or data[vi] == id_item_input_hatch or data[vi] == id_item_output_hatch or data[vi] == id_energy_input_hatch or data[vi] == id_fluid_output_hatch) then + corect = false + end + end + end + for y = pos1.y, pos2.y,pos2.y-pos1.y do + for z = pos1.z+1,pos2.z-1 , 1 do + local vi = a:index(pos.x, y, z) + if not (data[vi] == id_other or data[vi] == id_item_input_hatch or data[vi] == id_item_output_hatch or data[vi] == id_energy_input_hatch or data[vi] == id_fluid_output_hatch) then + corect = false + end + end + end + if not (data[a:index(pos.x, pos.y, pos1.z)]== id_other + or data[a:index(pos.x, pos.y, pos1.z)] == id_item_input_hatch + or data[a:index(pos.x, pos.y, pos1.z)] == id_item_output_hatch + or data[a:index(pos.x, pos.y, pos1.z)] == id_energy_input_hatch + or data[a:index(pos.x, pos.y, pos1.z)] == id_fluid_output_hatch) then + corect = false + end + if item_hatch_input_count~=1 or item_hatch_output_count~=1 or energy_hatch_input_count~=1 or fluid_hatch_output_count~=1 then--get need count of hatchs + local meta = minetest.get_meta(pos) + owl_tech:set_hatch_ofset(meta,1,"item_hatch_input",0,0,0) + owl_tech:set_hatch_ofset(meta,1,"item_hatch_output",0,0,0) + owl_tech:set_hatch_ofset(meta,1,"energy_hatch_input",0,0,0) + owl_tech:set_hatch_ofset(meta,1,"fluid_hatch_output",0,0,0) + end + return corect + end + if rotation==1 then --x-1 + local corect =true + local vm = minetest.get_voxel_manip() + local pos1,pos2 = {x=pos.x,y=pos.y-1,z=pos.z-1},{x=pos.x+4,y=pos.y+1,z=pos.z+1} + local emin, emax = vm:read_from_map(pos1,pos2) + local a = VoxelArea:new{ + MinEdge = emin, + MaxEdge = emax + } + local data = vm:get_data() + -- begin frames + for x = pos1.x, pos2.x do + for y = pos1.y,pos2.y,pos2.y-pos1.y do + for z = pos1.z,pos2.z,pos2.x-pos1.z do + local vi = a:index(x, y, z) + if data[vi] ~= id_frame then + minetest.chat_send_all("error"..pos1.x.."--"..pos1.y.."--"..z) + corect = false + end + end + end + end + for y = pos1.y,pos2.y,pos2.y-pos1.y do + for x = pos1.x,pos2.x,pos2.x-pos1.x do + local vi = a:index(x, y, pos.z) + if data[vi] ~= id_frame then + minetest.chat_send_all("error"..x.."--"..pos1.y.."--"..pos1.z) + corect = false + end + end + end + for z = pos1.z,pos2.z,pos2.z-pos1.z do + for x = pos1.x,pos2.x,pos2.x-pos1.x do + local vi = a:index(x, pos1.y+1, z) + if data[vi] ~= id_frame then + minetest.chat_send_all("error"..pos1.x.."--"..pos1.y.."--"..z) + corect = false + end + end + end + -- end frames -begin entrails + for x = pos1.x+1,pos2.x-1 , 1 do + local vi = a:index(x, pos.y, pos.z) + if data[vi] ~= id_entrails then + minetest.chat_send_all("error"..x.."--"..pos1.y.."--"..pos1.z) + corect = false + end + end + -- end entrails look for hatch + for z = pos1.z, pos2.z,pos2.z-pos1.z do + for x = pos1.x+1,pos2.x-1 , 1 do + local vi = a:index(x, pos.y, z) + if data[vi] == id_item_input_hatch then + owl_tech:set_hatch_ofset(meta,1,"item_hatch_input",x,pos.y,z) + item_hatch_input_count = item_hatch_input_count + 1 + end + if data[vi] == id_item_output_hatch then + owl_tech:set_hatch_ofset(meta,1,"item_hatch_output",x,pos.y,z) + item_hatch_output_count = item_hatch_output_count + 1 + end + if data[vi] == id_energy_input_hatch then + owl_tech:set_hatch_ofset(meta,1,"energy_hatch_input",x,pos.y,z) + energy_hatch_input_count = energy_hatch_input_count + 1 + end + if data[vi] == id_fluid_output_hatch then + owl_tech:set_hatch_ofset(meta,1,"fluid_hatch_output",x,pos.y,z) + fluid_hatch_output_count = fluid_hatch_output_count + 1 + end + end + end + for y = pos1.y, pos2.y,pos2.y-pos1.y do + for x = pos1.x+1,pos2.x-1 , 1 do + local vi = a:index(x, y, pos.z) + if data[vi] == id_item_input_hatch then + owl_tech:set_hatch_ofset(meta,1,"item_hatch_input",x, y, pos.z) + item_hatch_input_count = item_hatch_input_count + 1 + end + if data[vi] == id_item_output_hatch then + owl_tech:set_hatch_ofset(meta,1,"item_hatch_output",x, y, pos.z) + item_hatch_output_count = item_hatch_output_count + 1 + end + if data[vi] == id_energy_input_hatch then + owl_tech:set_hatch_ofset(meta,1,"energy_hatch_input",x, y, pos.z) + energy_hatch_input_count = energy_hatch_input_count + 1 + end + if data[vi] == id_fluid_output_hatch then + owl_tech:set_hatch_ofset(meta,1,"fluid_hatch_output",x, y, pos.z) + fluid_hatch_output_count = fluid_hatch_output_count + 1 + end + end + end + if data[a:index(pos2.x, pos.y, pos.z)] == id_item_input_hatch then + owl_tech:set_hatch_ofset(meta,1,"fluid_hatch_output",pos.x, pos.y, pos2.z) + fluid_hatch_output_count = fluid_hatch_output_count + 1 + end + if data[a:index(pos2.x, pos.y, pos.z)] == id_item_output_hatch then + owl_tech:set_hatch_ofset(meta,1,"item_hatch_output",pos.x, pos.y, pos2.z) + item_hatch_output_count = item_hatch_output_count + 1 + end + if data[a:index(pos2.x, pos.y, pos.z)] == id_energy_input_hatch then + owl_tech:set_hatch_ofset(meta,1,"energy_hatch_input",pos.x, pos.y, pos2.z) + energy_hatch_input_count = energy_hatch_input_count + 1 + end + if data[a:index(pos2.x, pos.y, pos.z)] == id_fluid_output_hatch then + owl_tech:set_hatch_ofset(meta,1,"fluid_hatch_output",pos.x, pos.y, pos2.z) + fluid_hatch_output_count = fluid_hatch_output_count + 1 + end + --end look for hacth begin look for other nodes + for z = pos1.x, pos2.z,pos2.z-pos1.z do + for x = pos1.x+1,pos2.x-1 , 1 do + local vi = a:index(x, pos.y, z) + if not (data[vi] == id_other or data[vi] == id_item_input_hatch or data[vi] == id_item_output_hatch or data[vi] == id_energy_input_hatch or data[vi] == id_fluid_output_hatch) then + corect = false + end + end + end + for y = pos1.y, pos2.y,pos2.y-pos1.y do + for x = pos1.x+1,pos2.x-1 , 1 do + local vi = a:index(x, y, pos.z) + if not (data[vi] == id_other or data[vi] == id_item_input_hatch or data[vi] == id_item_output_hatch or data[vi] == id_energy_input_hatch or data[vi] == id_fluid_output_hatch) then + corect = false + end + end + end + if not (data[a:index(pos2.x, pos.y, pos.z)] == id_other or data[a:index(pos2.x, pos.y, pos.z)] == id_item_input_hatch or data[a:index(pos2.x, pos.y, pos.z)] == id_item_output_hatch + or data[a:index(pos2.x, pos.y, pos.z)] == id_energy_input_hatch or data[a:index(pos2.x, pos.y, pos.z)] == id_fluid_output_hatch) then + corect = false + end + if item_hatch_input_count~=1 or item_hatch_output_count~=1 or energy_hatch_input_count~=1 or fluid_hatch_output_count~=1 then--get need count of hatchs + local meta = minetest.get_meta(pos) + minetest.chat_send_all(rotation.."eror!") + owl_tech:set_hatch_ofset(meta,1,"item_hatch_input",0,0,0) + owl_tech:set_hatch_ofset(meta,1,"item_hatch_output",0,0,0) + owl_tech:set_hatch_ofset(meta,1,"energy_hatch_input",0,0,0) + owl_tech:set_hatch_ofset(meta,1,"fluid_hatch_output",0,0,0) + end + return corect + end + if rotation==3 then --x+1 dont work! + local corect =true + local vm = minetest.get_voxel_manip() + local pos1,pos2 = {x=pos.x-4,y=pos.y-1,z=pos.z-1},{x=pos.x,y=pos.y+1,z=pos.z+1} + local emin, emax = vm:read_from_map(pos1,pos2) + local a = VoxelArea:new{ + MinEdge = emin, + MaxEdge = emax + } + local data = vm:get_data() + -- begin frames + for x = pos1.x, pos2.x do + for y = pos1.y,pos2.y,pos2.y-pos1.y do + for z = pos1.z,pos2.z,pos2.x-pos1.z do + local vi = a:index(x, y, z) + if data[vi] ~= id_frame then + minetest.chat_send_all("error"..pos1.x.."--"..pos1.y.."--"..z) + corect = false + end + end + end + end + for y = pos1.y,pos2.y,pos2.y-pos1.y do + for x = pos1.x,pos2.x,pos2.x-pos1.x do + local vi = a:index(x, y, pos.z) + if data[vi] ~= id_frame then + minetest.chat_send_all("error"..x.."--"..pos1.y.."--"..pos1.z) + corect = false + end + end + end + for z = pos1.z,pos2.z,pos2.z-pos1.z do + for x = pos1.x,pos2.x,pos2.x-pos1.x do + local vi = a:index(x, pos1.y+1, z) + if data[vi] ~= id_frame then + minetest.chat_send_all("error"..pos1.x.."--"..pos1.y.."--"..z) + corect = false + end + end + end + -- end frames -begin entrails + for x = pos1.x+1,pos2.x-1 , 1 do + local vi = a:index(x, pos.y, pos.z) + if data[vi] ~= id_entrails then + minetest.chat_send_all("error"..x.."--"..pos1.y.."--"..pos1.z) + corect = false + end + end + -- end entrails look for hatch + for z = pos1.z, pos2.z,pos2.z-pos1.z do + for x = pos1.x+1,pos2.x-1 , 1 do + local vi = a:index(x, pos.y, z) + if data[vi] == id_item_input_hatch then + owl_tech:set_hatch_ofset(meta,1,"item_hatch_input",x,pos.y,z) + item_hatch_input_count = item_hatch_input_count + 1 + end + if data[vi] == id_item_output_hatch then + owl_tech:set_hatch_ofset(meta,1,"item_hatch_output",x,pos.y,z) + item_hatch_output_count = item_hatch_output_count + 1 + end + if data[vi] == id_energy_input_hatch then + owl_tech:set_hatch_ofset(meta,1,"energy_hatch_input",x,pos.y,z) + energy_hatch_input_count = energy_hatch_input_count + 1 + end + if data[vi] == id_fluid_output_hatch then + owl_tech:set_hatch_ofset(meta,1,"fluid_hatch_output",x,pos.y,z) + fluid_hatch_output_count = fluid_hatch_output_count + 1 + end + end + end + for y = pos1.y, pos2.y,pos2.y-pos1.y do + for x = pos1.x+1,pos2.x-1 , 1 do + local vi = a:index(x, y, pos.z) + if data[vi] == id_item_input_hatch then + owl_tech:set_hatch_ofset(meta,1,"item_hatch_input",x, y, pos.z) + item_hatch_input_count = item_hatch_input_count + 1 + end + if data[vi] == id_item_output_hatch then + owl_tech:set_hatch_ofset(meta,1,"item_hatch_output",x, y, pos.z) + item_hatch_output_count = item_hatch_output_count + 1 + end + if data[vi] == id_energy_input_hatch then + owl_tech:set_hatch_ofset(meta,1,"energy_hatch_input",x, y, pos.z) + energy_hatch_input_count = energy_hatch_input_count + 1 + end + if data[vi] == id_fluid_output_hatch then + owl_tech:set_hatch_ofset(meta,1,"fluid_hatch_output",x, y, pos.z) + fluid_hatch_output_count = fluid_hatch_output_count + 1 + end + end + end + if data[a:index(pos2.x, pos.y, pos.z)] == id_item_input_hatch then + owl_tech:set_hatch_ofset(meta,1,"fluid_hatch_output",pos.x, pos.y, pos2.z) + fluid_hatch_output_count = fluid_hatch_output_count + 1 + end + if data[a:index(pos2.x, pos.y, pos.z)] == id_item_output_hatch then + owl_tech:set_hatch_ofset(meta,1,"item_hatch_output",pos.x, pos.y, pos2.z) + item_hatch_output_count = item_hatch_output_count + 1 + end + if data[a:index(pos2.x, pos.y, pos.z)] == id_energy_input_hatch then + owl_tech:set_hatch_ofset(meta,1,"energy_hatch_input",pos.x, pos.y, pos2.z) + energy_hatch_input_count = energy_hatch_input_count + 1 + end + if data[a:index(pos2.x, pos.y, pos.z)] == id_fluid_output_hatch then + owl_tech:set_hatch_ofset(meta,1,"fluid_hatch_output",pos.x, pos.y, pos2.z) + fluid_hatch_output_count = fluid_hatch_output_count + 1 + end + --end look for hacth begin look for other nodes + for z = pos1.x, pos2.z,pos2.z-pos1.z do + for x = pos1.x+1,pos2.x-1 , 1 do + local vi = a:index(x, pos.y, z) + if not (data[vi] == id_other or data[vi] == id_item_input_hatch or data[vi] == id_item_output_hatch or data[vi] == id_energy_input_hatch or data[vi] == id_fluid_output_hatch) then + corect = false + end + end + end + for y = pos1.y, pos2.y,pos2.y-pos1.y do + for x = pos1.x+1,pos2.x-1 , 1 do + local vi = a:index(x, y, pos.z) + if not (data[vi] == id_other or data[vi] == id_item_input_hatch or data[vi] == id_item_output_hatch or data[vi] == id_energy_input_hatch or data[vi] == id_fluid_output_hatch) then + corect = false + end + end + end + if not (data[a:index(pos1.x, pos.y, pos.z)] == id_other or data[a:index(pos1.x, pos.y, pos.z)] == id_item_input_hatch or data[a:index(pos1.x, pos.y, pos.z)] == id_item_output_hatch + or data[a:index(pos1.x, pos.y, pos.z)] == id_energy_input_hatch or data[a:index(pos1.x, pos.y, pos.z)] == id_fluid_output_hatch) then + corect = false + end + if item_hatch_input_count~=1 or item_hatch_output_count~=1 or energy_hatch_input_count~=1 or fluid_hatch_output_count~=1 then--get need count of hatchs + local meta = minetest.get_meta(pos) + minetest.chat_send_all(rotation.."eror!") + owl_tech:set_hatch_ofset(meta,1,"item_hatch_input",0,0,0) + owl_tech:set_hatch_ofset(meta,1,"item_hatch_output",0,0,0) + owl_tech:set_hatch_ofset(meta,1,"energy_hatch_input",0,0,0) + owl_tech:set_hatch_ofset(meta,1,"fluid_hatch_output",0,0,0) + end + return corect end end - ---bronze_blast furnance +--wood pyrolyze controller minetest.register_node("owl_tech:wood_pyrolis", { - description = S("WIP Wood pyrolis controller"), + description = S("Wood pyrolis controller"), _doc_items_longdesc = S("A more efficient way to turn wood into coal"), tiles = { "(owl_tech_base_meshanism_side.png^[colorize:#575757:128)", @@ -95,11 +628,11 @@ minetest.register_node("owl_tech:wood_pyrolis", { "owl_tech_base_meshanism_side.png^[colorize:#575757:128", "owl_tech_base_meshanism_side.png^[colorize:#575757:128", "owl_tech_base_meshanism_side.png^[colorize:#575757:128", - "(owl_tech_base_meshanism_side.png^[colorize:#575757:128)^owl_tech_smelter_face.png", + "(owl_tech_base_meshanism_side.png^[colorize:#575757:128)^owl_tech_macerator_face.png", }, is_ground_content = false, stack_max = 64, - groups = {pickaxey=2, owl_tech_machine=1}, + groups = {pickaxey=2, owl_tech_machine=1,controller_node=1}, sounds = mcl_sounds.node_sound_metal_defaults(), paramtype2 = "facedir", _mcl_blast_resistance = 6, @@ -108,58 +641,79 @@ minetest.register_node("owl_tech:wood_pyrolis", { local meta = minetest.get_meta(pos) owl_tech.set_mashine_tire(meta,2) --all steam mishine has 1 tire owl_tech.reset_item_redines(meta) - set_formspect_wood_pyrolis(meta) local timer =minetest.get_node_timer(pos) - local inv = meta:get_inventory() - meta:set_int("fuel_burn",0) - 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 bronze_blast_furnanse_build_correct(pos) then - if meta:get_int("fuel_burn")~=0 and input_its:get_name() ~= "owl_tech:iron_ingot" then - meta:set_int("fuel_burn",0) - end - if meta:get_int("fuel_burn")==0 and input_its_add:get_name() =='owl_tech:coal' and input_its:get_name() == "owl_tech:iron_ingot" then - meta:set_int("fuel_burn",50) - input_its_add:set_count(input_its_add:get_count()-1) - inv:set_stack('input_in_add', 1,input_its_add) - end - if input_its:get_name()== "owl_tech:iron_ingot" and meta:get_int("fuel_burn")>0 then -- chek for item in slots - local name1 =input_its:get_name() -- for metal - if name1=="owl_tech:iron_ingot" and owl_tech.get_item_redines(meta)>-1 and owl_tech.get_item_redines(meta)<100 then --recipt real - owl_tech.add_item_redines(meta,1) - meta:set_int("fuel_burn",meta:get_int("fuel_burn")-1) - elseif name1=="owl_tech:iron_ingot" and owl_tech.get_item_redines(meta)>=100 then - 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()+1) - inv:set_stack('dst', 1, dst_its) - else - local item ={name="owl_tech:steel_ingot", count=1, 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) + if bronze_blast_furnanse_build_correct(pos) then + local input_stack = owl_tech:get_item_in_input_hatch_pos( + owl_tech:get_hatch_ofset_X(meta,1,"item_hatch_input"), + owl_tech:get_hatch_ofset_Y(meta,1,"item_hatch_input"), + owl_tech:get_hatch_ofset_Z(meta,1,"item_hatch_input") + ) + local output_stack = owl_tech:get_item_in_input_output_pos( + owl_tech:get_hatch_ofset_X(meta,1,"item_hatch_output"), + owl_tech:get_hatch_ofset_Y(meta,1,"item_hatch_output"), + owl_tech:get_hatch_ofset_Z(meta,1,"item_hatch_output") + ) + local input_energy = owl_tech:get_charge_in_hatch_pos( + owl_tech:get_hatch_ofset_X(meta,1,"energy_hatch_input"), + owl_tech:get_hatch_ofset_Y(meta,1,"energy_hatch_input"), + owl_tech:get_hatch_ofset_Z(meta,1,"energy_hatch_input") + ) + local fluid_output = owl_tech:get_volume_amount_in_hatch_pos( + owl_tech:get_hatch_ofset_X(meta,1,"fluid_hatch_output"), + owl_tech:get_hatch_ofset_Y(meta,1,"fluid_hatch_output"), + owl_tech:get_hatch_ofset_Z(meta,1,"fluid_hatch_output") + ) + if owl_tech.get_item_redines(meta)>0 and owl_tech.get_item_redines(meta)<100 then + if owl_tech.get_item_redines(meta)==0 and input_stack:get_count()>=4 and output_stack:get_free_space()>=6 + and minetest.get_item_group(input_stack:get_name(),"tree" and (output_stack:get_name()=="mcl_core:charcoal_lump" or output_stack:is_empty()) ) + and owl_tech:get_max_volume_in_hatch_pos(owl_tech:get_hatch_ofset_X(meta,1,"fluid_hatch_output"),owl_tech:get_hatch_ofset_Y(meta,1,"fluid_hatch_output"),owl_tech:get_hatch_ofset_Z(meta,1,"fluid_hatch_output"))-fluid_output>=250 then --has bonus coal + owl_tech.add_item_redines(meta,10) + owl_tech:set_charge_in_hatch_pos(owl_tech:get_hatch_ofset_X(meta,1,"energy_hatch_input"),owl_tech:get_hatch_ofset_Y(meta,1,"energy_hatch_input"),owl_tech:get_hatch_ofset_Z(meta,1,"energy_hatch_input") + ,input_energy-10) end - else end - else - owl_tech.reset_item_redines(meta) - meta:set_int("fuel_burn",0) + if owl_tech.get_item_redines(meta)==0 and input_stack:get_count()>=4 and output_stack:get_free_space()>=6 + and minetest.get_item_group(input_stack:get_name(),"tree" and (output_stack:get_name()=="mcl_core:charcoal_lump" or output_stack:is_empty()) ) + and input_energy>=100 + and owl_tech:get_max_volume_in_hatch_pos(owl_tech:get_hatch_ofset_X(meta,1,"fluid_hatch_output"),owl_tech:get_hatch_ofset_Y(meta,1,"fluid_hatch_output"),owl_tech:get_hatch_ofset_Z(meta,1,"fluid_hatch_output"))-fluid_output>=250 then --has bonus coal + owl_tech.add_item_redines(meta,10) + owl_tech:set_charge_in_hatch_pos(owl_tech:get_hatch_ofset_X(meta,1,"energy_hatch_input"),owl_tech:get_hatch_ofset_Y(meta,1,"energy_hatch_input"),owl_tech:get_hatch_ofset_Z(meta,1,"energy_hatch_input") + ,input_energy-10) + end + if owl_tech.get_item_redines(meta)>=100 then + if not output_stack:is_empty() then-- Add main output + output_stack:set_count(output_stack:get_count()+6) + owl_tech:set_item_in_input_output_pos( + owl_tech:get_hatch_ofset_X(meta,1,"item_hatch_output"), + owl_tech:get_hatch_ofset_Y(meta,1,"item_hatch_output"), + owl_tech:get_hatch_ofset_Z(meta,1,"item_hatch_output"),output_stack + ) + else + local item ={name="mcl_core:charcoal_lump", count=6, wear=0, metadata=""} + output_stack:add_item(item) + owl_tech:set_item_in_input_output_pos( + owl_tech:get_hatch_ofset_X(meta,1,"item_hatch_output"), + owl_tech:get_hatch_ofset_Y(meta,1,"item_hatch_output"), + owl_tech:get_hatch_ofset_Z(meta,1,"item_hatch_output"),output_stack + ) + end + input_stack:set_count(input_stack:get_count()-4) + owl_tech:set_item_in_input_hatch_pos( + owl_tech:get_hatch_ofset_X(meta,1,"item_hatch_input"), + owl_tech:get_hatch_ofset_Y(meta,1,"item_hatch_input"), + owl_tech:get_hatch_ofset_Z(meta,1,"item_hatch_input"),input_stack + ) + if fluid_output==0 then ---Dont forget add fluid TODO + + end + owl_tech.reset_item_redines(meta) + end end - owl_tech.delit_name_fluid_if_0(meta) set_formspect_wood_pyrolis(meta) timer:start(0.2) end @@ -167,10 +721,10 @@ minetest.register_node("owl_tech:wood_pyrolis", { --Crafte controller minetest.register_craft({ type = "shaped", - output = "owl_tech:bronze_blast_furnace_controller", + output = "owl_tech:wood_pyrolis", recipe = { {"mcl_furnaces:furnace","owl_tech:bronze_plate","mcl_furnaces:furnace"}, {"owl_tech:bronze_plate","mcl_furnaces:furnace","owl_tech:bronze_plate"}, {"owl_tech:bronze_plate","owl_tech:bronze_plate","owl_tech:bronze_plate"} } -})]] \ No newline at end of file +}) \ No newline at end of file diff --git a/ore/node_register.lua b/ore/node_register.lua index 8a397af..80c5116 100755 --- a/ore/node_register.lua +++ b/ore/node_register.lua @@ -1,8 +1,29 @@ local S = minetest.get_translator(minetest.get_current_modname()) local name = minetest.get_current_modname() local path = minetest.get_modpath(name) +local use_select_box = minetest.settings:get_bool("mcl_buckets_use_select_box", false) ---- This crutch was suggested by the developers of Mineclone 2 - they made the functions of their shovels and hoes local +local mod_doc = minetest.get_modpath("doc") +local mod_mcl_core = minetest.get_modpath("mcl_core") +--local mod_mclx_core = minetest.get_modpath("mclx_core") + +-- Localize some functions for faster access +local vector = vector +local math = math +local string = string + +local raycast = minetest.raycast +local get_node = minetest.get_node +local set_node = minetest.set_node +local add_node = minetest.add_node +local add_item = minetest.add_item + +local registered_nodes = minetest.registered_nodes +local get_item_group = minetest.get_item_group +local is_creative_enabled = minetest.is_creative_enabled +local is_protected = minetest.is_protected +local record_protection_violation = minetest.record_protection_violation local function create_soil(pos, inv) if pos == nil then @@ -925,7 +946,146 @@ for i, value in ipairs(gems_orew_array) do _mcl_hardness = 5, }) end - +local fluid_array ={ + {"tar","Tar","owl_tech_tar_flowing_animated.png","owl_tech_tar_source_animated.png","owl_tech_tar_bucket.png","owl_tech_tar_for_sell.png"}--#8d4a00 +} +for i, value in ipairs(fluid_array) do + minetest.register_node("owl_tech:"..fluid_array[i][1].."_flowing", { + description = S(fluid_array[i][2].." Water"), + _doc_items_create_entry = false, + wield_image = fluid_array[i][3].."^[verticalframe:64:0", + drawtype = "flowingliquid", + tiles = {fluid_array[i][3].."^[verticalframe:64:0"}, + special_tiles = { + { + image="("..fluid_array[i][3]..")", + backface_culling=false, + animation={type="vertical_frames", aspect_w=16, aspect_h=16, length=4.0} + }, + { + image="("..fluid_array[i][3]..")", + backface_culling=false, + animation={type="vertical_frames", aspect_w=16, aspect_h=16, length=4.0} + }, + }, + sounds = mcl_sounds.node_sound_water_defaults(), + is_ground_content = false, + use_texture_alpha = USE_TEXTURE_ALPHA, + paramtype = "light", + paramtype2 = "flowingliquid", + walkable = false, + pointable = false, + diggable = false, + buildable_to = true, + drop = "", + drowning = 4, + liquidtype = "flowing", + liquid_alternative_flowing = "owl_tech:"..fluid_array[i][1].."_flowing", + liquid_alternative_source = "owl_tech:"..fluid_array[i][1].."_source", + liquid_viscosity = WATER_VISC, + liquid_range = 7, + waving = 3, + post_effect_color = {a=20, r=0x03, g=0x3C, b=0x5C}, + groups = { water=3, liquid=3, puts_out_fire=1, melt_around=1, dig_by_piston=1, not_in_creative_inventory=1,},--not_in_creative_inventory=1, + _mcl_blast_resistance = 100, + -- Hardness intentionally set to infinite instead of 100 (Minecraft value) to avoid problems in creative mode + _mcl_hardness = -1, + }) + + minetest.register_node("owl_tech:"..fluid_array[i][1].."_source", { + description = S("Water Source"), + _doc_items_entry_name = S("Water"), + _doc_items_longdesc = + S("Сompounds from cyclic, highly volatile and non-volatile compounds, which are presented in a spectrum: from methyl esters to combustion of alcohols, acids, phenols and light compounds.").."\n\n", + _doc_items_hidden = false, + drawtype = "liquid", + waving = 3, + tiles = { + {name=fluid_array[i][4], animation={type="vertical_frames", aspect_w=16, aspect_h=16, length=5.0}} + }, + special_tiles = { + -- New-style water source material (mostly unused) + { + name=fluid_array[i][4], + animation={type="vertical_frames", aspect_w=16, aspect_h=16, length=5.0}, + backface_culling = false, + } + }, + sounds = mcl_sounds.node_sound_water_defaults(), + is_ground_content = false, + use_texture_alpha = USE_TEXTURE_ALPHA, + paramtype = "light", + walkable = false, + pointable = false, + diggable = false, + buildable_to = true, + drop = "", + drowning = 4, + liquidtype = "source", + liquid_alternative_flowing = "owl_tech:"..fluid_array[i][1].."_flowing", + liquid_alternative_source = "owl_tech:"..fluid_array[i][1].."_source", + liquid_viscosity = WATER_VISC, + liquid_range = 7, + post_effect_color = {a=90, r=0x03, g=0x3C, b=0x5C}, + stack_max = 64, + groups = { water=3, liquid=3, puts_out_fire=1, not_in_creative_inventory=1, dig_by_piston=1}, + _mcl_blast_resistance = 100, + -- Hardness intentionally set to infinite instead of 100 (Minecraft value) to avoid problems in creative mode + _mcl_hardness = -1, + }) + --capsuls + minetest.register_craftitem("owl_tech:"..fluid_array[i][1].."sell_tire_1", { + description = S("Get 1000 of "..fluid_array[i][1]), + _doc_items_longdesc = S("Contein "..fluid_array[i][1]), + inventory_image = "owl_tech_empty_sell.png^"..fluid_array[i][6], + stack_max = 64, + groups = { craftitem=1 }, + on_place = function(itemstack, placer, pointed_thing) + if pointed_thing.type == "node" then + minetest.place_node(pointed_thing.above,{name="owl_tech:"..fluid_array[i][1].."_source"}) + itemstack:set_count(itemstack:get_count()-1) + return itemstack + end + end + }) +end +--empty sell +minetest.register_craftitem("owl_tech:empty_sell_tire_1", { + description = S("Sell tire 1"), + _doc_items_longdesc = S("Simple sell for fluids"), + inventory_image = "owl_tech_empty_sell.png", + stack_max = 64, + groups = { craftitem=1 }, +}) +-- water and lava sell owl_tech_lava_for_sell.png +minetest.register_craftitem("owl_tech:water_sell_tire_1", { + description = S("Get 1000 of water"), + _doc_items_longdesc = S("Contein water"), + inventory_image = "owl_tech_empty_sell.png^owl_tech_water_for_sell.png", + stack_max = 64, + groups = { craftitem=1 }, + on_place = function(itemstack, placer, pointed_thing) + if pointed_thing.type == "node" then + minetest.place_node(pointed_thing.above,{name="owl_tech:water_source"}) + itemstack:set_count(itemstack:get_count()-1) + return itemstack + end + end +}) +minetest.register_craftitem("owl_tech:lava_sell_tire_1", { + description = S("Get 1000 of lava"), + _doc_items_longdesc = S("Contein lava"), + inventory_image = "owl_tech_empty_sell.png^owl_tech_lava_for_sell.png", + stack_max = 64, + groups = { craftitem=1 }, + on_place = function(itemstack, placer, pointed_thing) + if pointed_thing.type == "node" then + minetest.place_node(pointed_thing.above,{name="owl_tech:lava_source"}) + itemstack:set_count(itemstack:get_count()-1) + return itemstack + end + end +}) ----------------------------------------------------------------------------------- --Some custom recips --Crafte bronze dust from copper and tin diff --git a/pipe/fluid_tank.lua b/pipe/fluid_tank.lua index 406372b..407fa63 100755 --- a/pipe/fluid_tank.lua +++ b/pipe/fluid_tank.lua @@ -27,7 +27,7 @@ minetest.register_node("owl_tech:bronze_tank", { 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)) + meta:set_string("infotext",owl_tech.get_pull_volume(meta,1).."--"..owl_tech.get_pull_max_volume(meta,1)) timer:start(0.2) end, on_timer = function(pos, elapsed) @@ -56,7 +56,7 @@ minetest.register_node("owl_tech:bronze_tank", { end end owl_tech.delit_name_fluid_if_0(meta) - meta:set_string("infotext",owl_tech.get_pull_volume(meta,1)) + meta:set_string("infotext",owl_tech.get_pull_volume(meta,1).."--"..owl_tech.get_pull_max_volume(meta,1)) timer:start(0.2) end }) diff --git a/textures/owl_tech_empty_sell.png b/textures/owl_tech_empty_sell.png new file mode 100644 index 0000000000000000000000000000000000000000..cde4db8fd03840b9532e27b76a997e6aba7e9484 GIT binary patch literal 766 zcmVEX>4Tx04R}tkv&MmKpe$iQ^is$4t5Z6$WWc^q9TGztwIqhgj%6h2a`*`ph-iL z;^HW{799LotU9+0Yt2!bCVt}afBE>hzEl0u6Z503ls?%w0>9UwHTOtX3tfTr7K zCY2O(`Bky+6#~KtVHS{?Wz0!Z8ouM}9s$1I#d((hxj#q0TCf-p5Q!7aFm2)u;^|G> z;Ji;9Wo204LiuG^86KR zEyg62WqC2lYywr!&>KEar%@;(AUHZ_E5NjQ($}kM~lPDsgX&an%+wZNPRt^fc407*qoM6N<$f~&4lbN~PV literal 0 HcmV?d00001 diff --git a/textures/owl_tech_item_hatch.png b/textures/owl_tech_item_hatch.png new file mode 100644 index 0000000000000000000000000000000000000000..b60a22085296e387f91e56ca220a8450454584e9 GIT binary patch literal 623 zcmV-#0+9WQP)EX>4Tx04R}tkv&MmKpe$iQ?(+M4i*#<%ut=|q9Ts93Pq?8YK2xEOfLO`CJjl7 zi=*ILaPVWX>fqw6tAnc`2!4RLx;QDiNQwVT3N2ziIPS;0dyl(!fKV?p&FYE)nr@q^ zL|n{dSH-|91oR+;L5#}GGUg;HiH_sz9zMR_MR``|bAOJ0HD@uvClbe)VcNtS#50?= z!FiuJ%!;x~d`>)J(glehxvqHp#<}3Kz%#>UIyFxmCKd~Ath6yJni}ymaYWU0$`>*o ztDLtuYvn3y-jlyDnA2C5xlVHg2`pj>5=1DdqJ%PRL}}GYv5=zucnANm>zBx-kgEhn zjs;YpL3aJ%fAG6oD?c^qB?aR^_lx6vi~)gNpiy(2?_!4TvhDKtg0Y6 zqIX9TFL#i6#>`eg(C5J}$!mq3DNC{dy4|}3?G@&K(4F$*dH|)WJ)P+67^naM002ov JPDHLkV1m1~3~>Me literal 0 HcmV?d00001 diff --git a/textures/owl_tech_lava_for_sell.png b/textures/owl_tech_lava_for_sell.png new file mode 100644 index 0000000000000000000000000000000000000000..fc8a95efe1d8133cb259247e111dd688c5450d12 GIT binary patch literal 5056 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 L852>pP`2SeaiM?; literal 0 HcmV?d00001 diff --git a/textures/owl_tech_tar_bucket.png b/textures/owl_tech_tar_bucket.png new file mode 100644 index 0000000000000000000000000000000000000000..84e6c1d36c72ea06fa21eb3d982233a24d964151 GIT binary patch literal 5659 zcmeHKc{r478=v7MlyWMO&=}crX6Bv643i;@7#f5uQF_h1!(f(X#uz%Oq(ns7=xL?@asko$LCpuIoGhHFLe&z5Jg0{yq0|zweXe>F%td zuB(nfAT$^*bT9a-DL+(I;PZm<_aFi>1&H*vMaS${vu`0=e5J-6Lt?OBsZM`Io6Zn)Jrj@C8RZJ*&QkFBS3rw)$V zi!RsL&KsaL(Mf~S>G>=dncX24Y6R-qMT%SPFuX3Z(^c}mrP^wJ!rMVxbZl!~DiCd0 zUX}b@1vPHEbZpjGtc~$X-PGfIn{|}NR%JgkLUtVR?EP)8f&W?K*Q*7&U7}wLn!I<_ z(c+F%?jJO0dYWjrP8z!~?uJ{%TBF$HcW-ufNJ=bOT3u5TsM$`v%d?aoXjL63y@^=4 zv2~-K*N*XJR$2k8cB{Ag1`2&$>-$-|@|I?(ys-2w-Z)e>KSlF^#ZabeT2qpR%&2VZ zUKMA?b^67yRi_vKIe!}Fw=2GMYsTe@A(` znhqjjVXjhFlU|ah%M|;0?E!k)z>+?(vWpar>@oA`lo?;oyqbHM+@6=QNeyR@u43%5 zPZt}!nw^7Atk52*etFUPr0pxcg;o8Is`!?I19|k&BdLas$M6j$N8Eo`*;$-PGIftH z81{C-b6w3tCtAv~N2QGk+0(SmOJ&{;NltEy&Z5^BAFtV}d;FG<_@0Tz+q^Avv(DTQ z6{h$+DxEZleR9Y9nsO1jemdois?iL6?)|Jv$H)7}HEs=+HEu7m#`l%j&%X!7a~6;8 zC2BS{{;ZR_S7{;1qpf6**d`+@yDQ;u(_G|rk2YOq*LxRa{g=`Vm~`6BX-c9 zH*UC^opIy$D?NUFHLMe@ykpo#saD&emG&<*I$9Ri<7H>2^$29a!&ojecb(JTL!zad$RvP1 zqLf_q!Wf;lxB;4KzP$ihnK3#iXwPZifx*NI8ABsu9i4fsnRn?meQNA(PPo7O zR`KR1?KQpoyXX(~Cc}^ZoZ@J4yI`zf!?VCA(sM6{VjrF}eUZK>C{k6oC&@q`Ig!&H zK`$FNo2OMdnsDgY?IJDLx>eIo;rY0@+`aO6q#{mEIuC|o3rUGUpXx9#4q@w z8Qo`YEnNJ(tHRIk_=`Y&df2+FPi813@?*Bmbp37Nv?#@bFG*hxX=yG}5=^)t#wbr1t+0N(JT;FoNaC2QnLQc>o<7ZBZ z-6vM|-4vYEt1IkJ8|>xvlY?V6wp><`Wa7T23s0>YZ@M z%wE5n=2EvruOZmG!E4bBspi@y&zvVm(D8039DZJuu=4PVse9dO4>26~3=Ei6&DDG3 zUqY?2diH^(Gxj`-Dz z@)0eiORC`9T^Udd!%Mg3-eUt~OL!m|Yp3 zQ#o=aSjT+GqB*G0I)2XF@}Jbub8alR*CG#`est8osXgxcWxFS@jYa17i#P6OAuYpp zt+Ja~@aEaAMego0#_omflLJ-@@|N7iwuf7_y)3_X+I?d`QJ5e7rqTo$XT;{^HKc6Z z#Ooh8muJ52!r%bpFwyeq%-I_1JeL%{dQ zlcWi+$`mkQs@#W*xdVIqm3q5YYjC`W+^LXof}EP!#6ais*btvbp^#O6@F z=u1CBz)v)Em_#C^;&9Q?(b#ArRv-$+;jOK$aR32FAYfn%j5vlb0c9Az*hmiX0fP>S zSt71b!WHmQa!fEp5GA3Z(Xbx%DL$T%$@~n@7k^{{<^v}Kg*ZGG!0~vvuRX*PCn*f_ zF`$3+5c|Mi1UN59EQk`ZASWrrml%Bw!DfB-7e7~6}Ofl6e|EC0vHe=QZOVk#Ku^&Eh!j02gDO8AP2Ix4*3d-!52$FJ`0jV z!Qfafj04~~WIRA%V@Mzfz$b`>u_h477y!?v5Ud~wPXS0@L3oI`a8-hlUq>Z}V#82G z5`jaYfDndEAzNWc00qK;Runu2BoPQCk`+Xt5IG7cHjBDcAmV}WbaHuMD1;O8Llp`+ z;Z%E11`SQX0$(Jak)VVFJJ8U}xcn&D7ljX(2YE|CIh%NRP{5KvB;oNS3W-SmV&n^n z#Be3bG4TMFNKk0x(?W%lfr$m>bqWJ0@WFKhYYLD_tmau==`9zRAQ`mmzB zp|u~LK0HQp6-x<)QY;E8$oi0i7?eV6MVv6!2Nf#} z!dOBiGKNH8TVkw1A_o&frV!YK5DuOKvc5$Z3pkQ!Pz2eB!aTxU!R4vo3T394DD!Wv zqr)KiEWm_e00QOP1Q`0qAm7FB54wKP^<4~nm+_D4`a#!sG4Nf+KdS5hMwj}R?G(g^zk;IS z&C;!Pz*2alr4r)iOh+7+|62t`^39i;&?P{OKunu0KahybY#mrQRl;C8O?{}OK5L5k zSgLsuyqOMQ(CvM!nj7|>cUQ8Xv$a-VGG#PAJ?O@Mpz+d#l60=^mJ=o_4EpRrEyAqC6bX~w{xdb z8V5>BN?(GFDi=G8NPi4$F0j1jQ|9hSUk+_wo8Rboo@u*3jX$eFqvnpCNdbqe(phF| zq#B5hR6aE=(`!QtMTA_nY`4A(p zQytOsP-J6g8>3bnoMyWumENh|#vF2L6}QbZ%xE*KEjs6PHJ?xzx<5Jb!nFo7W1C{9 z6CUP$R$nEjX6^?#V}W9rop&3iH2NLGFPUI(ad0wGUS9xl$26#sZOaA zp@`gaM1@XQL~`rmGNq0=qP*W3>ePCFYrX5N_5S{AEX()%JbQok-k;~QH;*KmtCNP> zQZ*0=q(NP8?+*Ob27%^)=BffuuXnV+0fE4qqC9*=?(_&)sDRJm2D4$J$WS(nE#`7S zAaO^5r(fB?+PPB^P|JNFIB9wI&aNdN-`zwtjUKIPZGE%M8*XEgYOC=|l{niXP3QiAcm-C3Kuwv&3l_**w3$scQ9@so0OJ_hIp6nCZ^u1HdiY=gf z_C=~SNq(Q3t&~`;b2cP*ls>1DZ6p1(PG?pBO>)(lxWp%we}3kE3>e7kkH74vCJlDD zwXq-B^ycy2OIm07;IXm#?Us$ZsZ)>aGH#~mx62|fr#|(q_D2^dwI4l% z$|6qJ%|F;yapdB<+KA}AS>8&iQ5i7@psUJGYrDLWQemfpB)NIk>PLdNf)Z7(EUHb7 zRl4e!m;M^XS!oN$&b>JIw4neDKHCho5kRRutFPVs1DelkZl*zA?>ZrwcWjkvNU}%j zqWru)CY(n!&j%MSQeCd;UZ%QlJn3HCzn_6G(%Xp4^etoHol|^;%^5<|a$VCnyUosP zy##9ty#6kvTsg6gPTSeH8fmV9#P2LW=C!W*eB%|%u%Ytf{t&Gt1Z&5o=3|I_*OQ2X zCFfgkyg^^iHbki*y`jJu=@)s-b9>=~Qr?SBEuZ`Y`0kD6xm7;#PlkVmS-USNM29@utF^jV* z3^1~$&WJ*d>R&%`hMy;#d1QBWGNYuqTrji>4B3xArLxf7p$$5ictba>{=%LD!)5A6 zp%7Mli&rL0qz4Oqy30R?Q|%s<;>klc^s@e1RL^^Gd{brWqgr!!!SC;edY08OKgA|@ z*>*~BhaqWhwQ$ItdC=48I2aZ13(d)HFu0?NETPpI zJT_8#AL)lH1A&y{xpsCms-4}})&d$TD<;iyeLZD)!}iS$?rSx}wRhd2ogU7E$2niN zU9fiFmRwKBQRnI$s@;*^Uc?RE@j;#u>n_n7SsLy7x{Wu|1%tl`{E$ zw7YL~1q^p-VY1T3PYu*40%^OIuz+ymB z>j$eG{Od_~;~Q{l!IeKPYHEK$dF2g9#MGuWnLUMMgLK_IfVIF!!Z$riyF>_BdaC0u&58V=*KEaBdG7nDn=9Xp7- zK1#se9Odf4jM~X0vf$QMYGg490N}AjbeNbI93mu%E#V4W67VcvHiN?yCZe5|a32>M z%#JT$!*HfJQxwuc%nirDt<+#-0gFR&w|AU{0NyO&K_XEo$;>PwBEmERYswb{nxTnA zq8SQfhQS~K3#2eIL_`-OLxd~k5HlF|Y#~#?4Ha?uAuu^6oxu+iS;FDKKJ06LyigaH zZ}1_)Sr!03%*6CiGqfqnjK?$k-a{yI2nRrB6Z(%HLJ!~zt@KveV(A)Tl$v~M1A3Ie&jP=yyj_79dKF6SSze#lL} zqbTS5L;&}1xIb8btzBUZSh={6?D@e!1C6yn z;&2QLB!hvWBk^d0g*hF^WL$(BO_;HF#vhrs3#>1aF_iKAP{A@Cd| z1B1sS@i;b%h2x-zC>HTMh)n`6ph|l1_gTrISO65qg2N`znM@=BYe7fi&>RMm0Kg+L zYytzv#xrpkrnv%&#UwfM1w1-%oLn9~kZl$k5~$da6HcfWdT@E{%_6#-O|-d%ISPZund4FBfI`v#7>l6S`tOK=>>;!DOh%fNq^Mftn@&sUV&u`ll&m8%Bt`LYHsaTrnsLkwMGjB7m!CXZv!C;D} zAkmpKB?#%^Y?dNV0BdH88AJ~WWCPPmVUYh2 zhMy(OY_?!C`ONrQG1=^YaY9xYd^cnOznL{)cmcD}?AtJ$l8Z#_$w#^xGZ%{)m#NGTB;0Z zCwow?{OdmdH~HmjUg&yXAqb?tQ2wn1I+>*hEJ8$77YE2IWwm(*DgpC804sANsrEJ= z;*OEiLxN7i{DcL*w;I}8aIMAslEXKok6VVHgzZl2GEg%~or8SO@MCBOlKPr;9n#ts z$3n&aUnWj{=~|JLnD|5pAHg2KZusE$s)?9V-;(JEu06$PCas^^+kaT{fZ-T_H_Eld zSDUAmy(qNZq@uOcE&^}$g+~RXHiL+0vv+3RE$rNeq(+`j}_4Q-eVe)c@Qt z(SP{pRj}!`=EB?FYo^C{K*qI;ZQ7AX?WW2~hGQ@6yeR!Gy@05`u5JGMWv;g_G9f)m zVvs(x7MyHCh95f&jv23c^{DvTo~iNeyog}wP2wpp-^qiBxrnJ6s2Y@;WMFhXKUy-z za}Whb#TFMXln8?BBz1ca=1In4x-_{wYu@udH%eOloyO@ctCa_KFEOV5eSIcIeSFY# z4f^bUu)`sr{``)`MWNe01>%!J?@X^7eR>F20}$dmxNRgC80%|WEB*r&`!@2s!sPBa8EY7{PApblgo3t{$2(5T9AZTGe9ME>27#IpV4 z1{R)MvV+6SXuF?G?9REc;O+!wxS8BH@KKVb`Y^U`^fDOQsS__LE<8U!y*n`hX%@9X z5L2#P^8h9q!wb}i)jxsdFm#1}_ryd`x3`FU%nMY1MV|~LFat<``v|Bm3kf?@` z{(iZj$>3QE2SqD6+NhN7d6|5u67&k3%nQ(@m041V+sTyo?KJ^8s5CW|4H;|P${hXS z_jHO@fgMW0??7ab*13D}AOBK0qvovKjAV`}CA21~CX)=C|A1;hUkJ13K*xI(ym`Sv0$V{Ldk5c2y%>T2u0P%u@Mr; zM7Q-jr3Q0cI4(Z6?%|5zZW1N!a4>?lqlv`3?|EzZ(h@%$jZo3F&X9DeZlx~sei&N# zbZhA#mX>8DM$p7jI0U1}SPxA{PYuv4WQ<|2JaUf zNXrOUN0h1GTb$_XyjcR@-qGviMe0pZN@%C;tRDm?lUv^XW*9m0(FDmzYfqR_U<07Q zo(dl$38VTj*RO!QhbQ5!zivVsy>rBZQFJXy4V=u0v7rR z+eSW@Mn4;KGHE>LlXC}tzD^a~aNLFUthU&7PID3UxsQ=5;=qyx8dT>?{-QQOpp%!> zp&>TFX>{(`Js=qWDA--zno2*pSF@`*50lHCHL2%g>0hqym4{f&mD5q57N+ zPu4u}9NG0v&9b}vdu2~=%u!pmsm;GHJ~ppv=R-*P5bD!8dtQ9;Ca>*d>6Zg;KFd}f zUs_$dZMTF%^^%JtY(os?{opzy2NU4(+*S)57x-PkTJoJ&1_u`-itUp!pHb3`fL%wU zvByVOW@wj|Typh(vc@gi`R@RtmjATFyhXMH?LJj(*|Aw}MOLr+Z|Ss-v@~ehEdXN){r{k!e=R+7j91C@FR9o_7u~ zi~wL|t+CO)+G2AE=sv=jiu$PQ&Cm0il5iuvU|Z&&LALvpU$& zV{=QUl_S&F1TX^S2u1?|3T)IO{pb9>XWxTVqNLYHYLtMj>MPxo9JLGP8YN|_DEdm$J$bw>dhZ!Bc6Mmn-1M7l<4pdgE>7Dw&hA;ZXYPi{pfuKLB1lb#S%6VjB?mKY}$YaR2}S literal 0 HcmV?d00001 diff --git a/textures/owl_tech_tar_for_sell.png b/textures/owl_tech_tar_for_sell.png new file mode 100644 index 0000000000000000000000000000000000000000..f8aad019becb74a5879c5ffdf50a174881818569 GIT binary patch literal 627 zcmV-(0*w8MP)EX>4Tx04R}tkv&MmKpe$iQ^is$4t5Z6$WWc^q9TGztwIqhgj%6h2a`*`ph-iL z;^HW{799LotU9+0Yt2!bCVt}afBE>hzEl0u6Z503ls?%w0>9UwHTOtX3tfTr7K zCY2O(`Bky+6#~KtVHS{?Wz0!Z8ouM}9s$1I#d((hxj#q0TCf-p5Q!7aFm2)u;^|G> z;Ji;9Wo204LF6o1@j|C{&#yY z{Kuz;375nKALjqxetcnIVq##3SH^7!P6H&xq!_+_|G~h`#lv82#7DXdK7RhhATBJ* zz{bMH@aXv`(hazB`y<2e-@h52y?)0az)NNz_IWe@ud>1)h@*fC007|MAI)uat@Ho@ N002ovPDHLkV1nks6?gyu literal 0 HcmV?d00001 diff --git a/textures/owl_tech_tar_source_animated.png b/textures/owl_tech_tar_source_animated.png new file mode 100644 index 0000000000000000000000000000000000000000..1ac7df4f959e6d684e5a7f14ab270ada8a6c041f GIT binary patch literal 6237 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 literal 0 HcmV?d00001 diff --git a/textures/owl_tech_water_for_sell.png b/textures/owl_tech_water_for_sell.png new file mode 100644 index 0000000000000000000000000000000000000000..8fcebb87c53e4cb97927402e1c853b20329d3340 GIT binary patch literal 5054 zcmeHKc~leU77rpKOWdFqDe4&1gXkoag=`WL5`-WDDv_c>>m-?hQL>l}5Ue6qwhL^l9~J6`}^+w z-6i=phlK=C?Op9D6be-uC|Lx)$C>j_6zedfPx zU3kg;0@KtVTUL^;b86l8)$L!x{&4iUJw+XvCx826^%LH`Jd+{ zv68|zuY;{&$481p z+`rcXA-rtU*EM{@&f3uHvYk}N6VprLKAIbQTbcKm+xOsj`N-zny$vIksiC(|n@&t^ z`YC(Fj?nI?Y4itQ#-*0lADXZN^6Ls((PDSn)O`JCPsk-A`}%})fpMalEB00KQF6capASQD~cn+&zEt6_vFLJ zT8j5)FMD)rzjEN$(q*BdZdUAaPwHf}26f-+-B2U{_UHTyNZYYp`0o25kE?qhC2w$z zzGB?DbW6g4w1}hM+AVFBMmAA0awlwR^-HlkpS~;f`-b#eiU;iDK6V+4)lBxesj`UvUp$Lp$*D<-iq!*v9PY~Kq05PGp_O;1-%ur zKIqSuIiGaY=Rulsr$V8!cM89|**?7A=I~6n^goCr#ZOW*OD^yJ-L=hD3P*En=El5W zd3Q7H^SkC3w_FbBsC!gD>E+nEE$;kkk<$-9ubI(b%jxSZ`@GYd{TylZ$T_*yu z!3jaIOzqQJzb$WIf8J)p!i05J^oCQ8i_5x53dL#zAr^;8#o|{@3|cp5?G91k+4*j@ zpN0EhoM=0DlZWbHNW#bC>y~b$$w!y@6^)tsRkH8SwCT0AAM0R#PibVlZq>D`XBLke z=`%knI>$Ns`TaK+2Is=I;CJerp~d(KXR}1Z`E$q*Y_-HWFe)jX_mni;*l zXGi;%I&Drm-NBo!z%O;xj8~MloC&f$nprSD)G1)G?7*67?WGM#=|>|9O0S8YJBX9k zV!PTo0o!Y6*^qDQde?@7RSPmAa-AKBo1r~D|A?-X&^Jb5h5=lXU&kXQ)TpR(FKq0O zx2)23JKo5Oo)sAG;hfUV?#*{Yj1Er^C7mk!b5$=zb+G6PRi_)B@!_n`O%F|{a!>Vt zo`3buSbrCN)~2<(NHA-S1emFjvS6W7tEQtWtpcMP)jBY9DHLxXqYhQB#7Ibi#Sj`1 zt@A`B4I)$`+9zHzM5YsCu|(i%Jr=$?M6O)DQYlc;eCFAE8-)Nsjgcs1RL5xyLZgUg z!4-mgvzS4HEGpzm5iL>{28p$L4C2r^bOiP{5(zBYJbTDnufm0kBnyThz>|m;OOiSv zgOQk+NKa(bwfYzaQy>s95Eg^Qf`JBXNYap~5!M*o%@Bha63n2~6FQR6Y9KQvs?f%h zA{q^>L$CZ(>twRm@EXGq3xE%X5!Er6bcCT+Glp9jNdE)?GUU)-S{UTur-`u$Gic-W zO3Xh2(~$1NAymrO_PTg|oFyEUl7YoxYM^QWyE5O}GC(Q|du?H+Acj!uELMQ*w=_ut ze?!(=zL{4n;S6^Kn7_t-OZ!#q7G|dkV1$dPU=Ejq z!2&+w1@jd=1(S_&y-+517(}R^09A>`4fo0nr2tKGFdDppN(*tOwKUt2uyDPm1xFfB6K#(Vs1{05Cj8=Ma^{z z04#D4i%_h`P*SUxYqfDAn%O1DZ25Xw2HHu5lBfhFF#w9N*g}LQWHRMUu8<`Va#*tw zAQ`5wRS|g7|I#)$59B?V@<74>_D`~i20JPoTQ&GJ_!vi6S_y(IO(8^;gCQ8u1WaY| z6JQN4DPvJh3IYbY0g;|>7&{U-0k?|Zu5)Addayp!_#>UvMt zJ2CK1%I~Y||3;Vno8uIw0sn#$!C@(M%2%hrL2Hy^VSt2^XMUg87MKrTcDleN1`5T& z$$VK+zR7U`LR(TQ^S6CC!ht$@HZv;xDG(W?5??vLQMug3=9mrZjP1a}AK~ZQLa9!4 zJ8ARPfr0+snyRXrrm7>~KHsCVjH}3(^-ULk zZ#TtXqV~M(K+XbTgMSx1b&RT0$ubVH-f_>g(CG2 KksS70zWzUSO_Cx2 literal 0 HcmV?d00001