diff --git a/crafts.lua b/crafts.lua new file mode 100644 index 0000000..4fcd1d3 --- /dev/null +++ b/crafts.lua @@ -0,0 +1,8 @@ +for name, val in pairs(buildtest.pipes.types) do + minetest.register_craft({ + output = (val.outname or ("buildtest:pipe_" .. name .. "_000000_0")), + recipe = { + {val.base, "default:glass", val.base}, + } + }) +end \ No newline at end of file diff --git a/depends.txt b/depends.txt new file mode 100644 index 0000000..ff1c786 --- /dev/null +++ b/depends.txt @@ -0,0 +1,2 @@ +mesecons +str_helpers \ No newline at end of file diff --git a/init.lua b/init.lua new file mode 100644 index 0000000..8e3700b --- /dev/null +++ b/init.lua @@ -0,0 +1,10 @@ +buildtest={} + +dofile(minetest.get_modpath("buildtest").."/pipes/pipes_defs.lua") +dofile(minetest.get_modpath("buildtest").."/misc/init.lua") +dofile(minetest.get_modpath("buildtest").."/pipes/pipes_init.lua") +dofile(minetest.get_modpath("buildtest").."/pumps/pump_init.lua") +dofile(minetest.get_modpath("buildtest").."/support/entity.lua") +dofile(minetest.get_modpath("buildtest").."/support/liquid.lua") + +dofile(minetest.get_modpath("buildtest").."/crafts.lua") \ No newline at end of file diff --git a/misc/autocraft.lua b/misc/autocraft.lua new file mode 100644 index 0000000..adf6989 --- /dev/null +++ b/misc/autocraft.lua @@ -0,0 +1,119 @@ +buildtest.autocraft = { + allow_metadata_inventory_put = function(exc, isnumber) + return function(pos, listname, index, stack, player) + if listname==exc then + return stack:get_count() + end + local meta=minetest.get_meta(pos) + local inv=meta:get_inventory() + if inv:get_stack(listname, index):is_empty() then + local newStack = {name = stack:get_name()} + if isnumber==true then + newStack.count = stack:get_count() + end + inv:set_stack(listname, index, newStack) + end + return 0 + end + end, + allow_metadata_inventory_take = function(exc) + return function(pos, listname, index, stack, player) + if listname==exc then + return stack:get_count() + end + local meta=minetest.get_meta(pos) + local inv=meta:get_inventory() + inv:set_stack(listname, index, nil) + return 0 + end + end, + allow_metadata_inventory_move = function(exc, ok) + return function(pos, from_list, from_index, to_list, to_index, count, player) + if from_list==to_list or ok==true then + return count + end + return 0 + end + end, + -------------------------------------------------------------------------------- + do_craft = function(inventory) + local recipe=inventory:get_list("craft") + local result + local new + for i=1,9 do + recipe[i]=ItemStack({name=recipe[i]:get_name(),count=1}) + end + result,new=minetest.get_craft_result({method="normal",width=3,items=recipe}) + local input=inventory:get_list("in") + if result.item:is_empty() then return end + result=result.item + if not inventory:room_for_item("in", result) then return end + local to_use={} + for _,item in ipairs(recipe) do + if item~=nil and not item:is_empty() then + if to_use[item:get_name()]==nil then + to_use[item:get_name()]=1 + else + to_use[item:get_name()]=to_use[item:get_name()]+1 + end + end + end + local stack + for itemname,number in pairs(to_use) do + stack=ItemStack({name=itemname, count=number}) + if not inventory:contains_item("in",stack) then return end + end + for itemname,number in pairs(to_use) do + stack=ItemStack({name=itemname, count=number}) + inventory:remove_item("in",stack) + end + inventory:add_item("in",result) + for i=1,9 do + inventory:add_item("in",new.items[i]) + end + end, +} + + +minetest.register_node("buildtest:autocraft", { + --tiles = {"buildtest_pump_mesecon.png"}, + description = "Buildtest Automatic Crafting Table", + groups = {choppy=1, oddly_breakable_by_hand=3}, + paramtype = "light", + paramtype2 = "facedir", + sunlight_propagates = true, + on_construct = function(pos) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + inv:set_size("craft", 9) + inv:set_size("in", 8*3) + + meta:set_string("formspec", "size[8,11]" + .."list[context;craft;2.5,0;3,3]" + .."list[context;in;0,3.5;8,3]" + .."list[current_player;main;0,7;8,4]") + end, + can_dig = function(pos,player) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + return inv:is_empty("in") + end, + -------------------------------------------------------------------------------- + allow_metadata_inventory_put = buildtest.autocraft.allow_metadata_inventory_put("in"), + allow_metadata_inventory_take = buildtest.autocraft.allow_metadata_inventory_take("in"), + allow_metadata_inventory_move = buildtest.autocraft.allow_metadata_inventory_move("in"), + --------------------------------------------------------------------------------- + on_place = buildtest.pipes.onp_funct, + on_dig = buildtest.pipes.ond_funct, +}) + +minetest.register_abm({ + nodenames={"buildtest:autocraft"}, + interval=5, + chance=1, + action=function(pos,node) + local meta=minetest.get_meta(pos) + local inv=meta:get_inventory() + buildtest.autocraft.do_craft(inv) + end, +}) \ No newline at end of file diff --git a/misc/init.lua b/misc/init.lua new file mode 100644 index 0000000..3b36c8b --- /dev/null +++ b/misc/init.lua @@ -0,0 +1 @@ +dofile(minetest.get_modpath("buildtest").."/misc/autocraft.lua") \ No newline at end of file diff --git a/models/buildtest_newpump.blend b/models/buildtest_newpump.blend new file mode 100644 index 0000000..5dcc46e Binary files /dev/null and b/models/buildtest_newpump.blend differ diff --git a/models/buildtest_newpump.blend1 b/models/buildtest_newpump.blend1 new file mode 100644 index 0000000..d808240 Binary files /dev/null and b/models/buildtest_newpump.blend1 differ diff --git a/models/buildtest_newpump.blend2 b/models/buildtest_newpump.blend2 new file mode 100644 index 0000000..4fb310c Binary files /dev/null and b/models/buildtest_newpump.blend2 differ diff --git a/models/buildtest_pump.x b/models/buildtest_pump.x new file mode 100644 index 0000000..d8775cd --- /dev/null +++ b/models/buildtest_pump.x @@ -0,0 +1,591 @@ +xof 0303txt 0032 + +Frame Root { + FrameTransformMatrix { + 1.000000, 0.000000, 0.000000, 0.000000, + 0.000000, 0.000000, 1.000000, 0.000000, + 0.000000, 1.000000,-0.000000, 0.000000, + 0.000000, 0.000000, 0.000000, 1.000000;; + } + Frame Cube { + FrameTransformMatrix { + 1.000000, 0.000000, 0.000000, 0.000000, + 0.000000,-0.000000, 0.093750, 0.000000, + 0.000000,-1.000000,-0.000001, 0.000000, + 0.000000, 0.000000, 0.344000, 1.000000;; + } + Mesh { //Mesh Mesh + 24; + -1.000000;-1.000000;-1.000000;, + -1.000000; 1.000000;-1.000000;, + -1.000000; 1.000000; 1.000000;, + -1.000000;-1.000000; 1.000000;, + -1.000000; 1.000000;-1.000000;, + 1.000000; 1.000000;-1.000000;, + 1.000000; 1.000000; 1.000000;, + -1.000000; 1.000000; 1.000000;, + 1.000000; 1.000000;-1.000000;, + 1.000000;-1.000000;-1.000000;, + 1.000000;-1.000000; 1.000000;, + 1.000000; 1.000000; 1.000000;, + 1.000000;-1.000000;-1.000000;, + -1.000000;-1.000000;-1.000000;, + -1.000000;-1.000000; 1.000000;, + 1.000000;-1.000000; 1.000000;, + 1.000000;-1.000000;-1.000000;, + 1.000000; 1.000000;-1.000000;, + -1.000000; 1.000000;-1.000000;, + -1.000000;-1.000000;-1.000000;, + -1.000000;-1.000000; 1.000000;, + -1.000000; 1.000000; 1.000000;, + 1.000000; 1.000000; 1.000000;, + 1.000000;-1.000000; 1.000000;; + 6; + 4;0;1;2;3;, + 4;4;5;6;7;, + 4;8;9;10;11;, + 4;12;13;14;15;, + 4;16;17;18;19;, + 4;20;21;22;23;; + MeshNormals { //Mesh Normals + 24; + -1.000000; 0.000000; 0.000000;, + -1.000000; 0.000000; 0.000000;, + -1.000000; 0.000000; 0.000000;, + -1.000000; 0.000000; 0.000000;, + 0.000000; 1.000000;-0.000000;, + 0.000000; 1.000000;-0.000000;, + 0.000000; 1.000000;-0.000000;, + 0.000000; 1.000000;-0.000000;, + 1.000000; 0.000000;-0.000000;, + 1.000000; 0.000000;-0.000000;, + 1.000000; 0.000000;-0.000000;, + 1.000000; 0.000000;-0.000000;, + 0.000000;-1.000000; 0.000000;, + 0.000000;-1.000000; 0.000000;, + 0.000000;-1.000000; 0.000000;, + 0.000000;-1.000000; 0.000000;, + -0.000000; 0.000000;-1.000000;, + -0.000000; 0.000000;-1.000000;, + -0.000000; 0.000000;-1.000000;, + -0.000000; 0.000000;-1.000000;, + -0.000000; 0.000000; 1.000000;, + -0.000000; 0.000000; 1.000000;, + -0.000000; 0.000000; 1.000000;, + -0.000000; 0.000000; 1.000000;; + 6; + 4;0;1;2;3;, + 4;4;5;6;7;, + 4;8;9;10;11;, + 4;12;13;14;15;, + 4;16;17;18;19;, + 4;20;21;22;23;; + } //End of Mesh Normals + MeshMaterialList { //Mesh Material List + 1; + 1; + 0;; + Material Default_Material { + 0.800000; 0.800000; 0.800000; 0.800000;; + 96.078431; + 0.500000; 0.500000; 0.500000;; + 0.000000; 0.000000; 0.000000;; + } + } //End of Mesh Material List + MeshTextureCoords { //Mesh UV Coordinates + 24; + 0.000000; 0.000000;, + 1.000000; 0.000000;, + 1.000000; 0.125000;, + 0.000000; 0.125000;, + 0.000000; 0.000000;, + 1.000000; 0.000000;, + 1.000000; 1.000000;, + 0.000000; 1.000000;, + 1.000000; 0.125000;, + 0.000000; 0.125000;, + 0.000000; 0.000000;, + 1.000000; 0.000000;, + 1.000000; 1.000000;, + 0.000000; 1.000000;, + 0.000000; 0.000000;, + 1.000000; 0.000000;, + 0.992583; 0.000000;, + 0.992583; 0.123827;, + 0.000000; 0.123827;, + 0.000000; 0.000000;, + 0.000000; 0.125000;, + 0.000000; 0.000000;, + 1.000000; 0.000000;, + 1.000000; 0.125000;; + } //End of Mesh UV Coordinates + } //End of Mesh Mesh + } //End of Cube +} //End of Root Frame +AnimationSet { + Animation { + {Cube} + AnimationKey { //Position + 2; + 150; + 0;3; 0.000000, 0.000000, 0.344000;;, + 1;3; 0.000000, 0.000000, 0.355352;;, + 2;3; 0.000000, 0.000000, 0.388924;;, + 3;3; 0.000000, 0.000000, 0.440051;;, + 4;3; 0.000000, 0.000000, 0.498021;;, + 5;3; 0.000000, 0.000000, 0.549121;;, + 6;3; 0.000000, 0.000000, 0.582661;;, + 7;3; 0.000000, 0.000000, 0.594000;;, + 8;3; 0.000000, 0.000000, 0.582659;;, + 9;3; 0.000000, 0.000000, 0.549110;;, + 10;3; 0.000000, 0.000000, 0.497993;;, + 11;3; 0.000000, 0.000000, 0.440012;;, + 12;3; 0.000000, 0.000000, 0.388894;;, + 13;3; 0.000000, 0.000000, 0.355342;;, + 14;3; 0.000000, 0.000000, 0.344000;;, + 15;3; 0.000000, 0.000000, 0.346455;;, + 16;3; 0.000000, 0.000000, 0.353876;;, + 17;3; 0.000000, 0.000000, 0.366224;;, + 18;3; 0.000000, 0.000000, 0.383241;;, + 19;3; 0.000000, 0.000000, 0.404391;;, + 20;3; 0.000000, 0.000000, 0.428818;;, + 21;3; 0.000000, 0.000000, 0.455363;;, + 22;3; 0.000000, 0.000000, 0.482642;;, + 23;3; 0.000000, 0.000000, 0.509187;;, + 24;3; 0.000000, 0.000000, 0.533613;;, + 25;3; 0.000000, 0.000000, 0.554762;;, + 26;3; 0.000000, 0.000000, 0.571778;;, + 27;3; 0.000000, 0.000000, 0.584125;;, + 28;3; 0.000000, 0.000000, 0.591545;;, + 29;3; 0.000000, 0.000000, 0.594000;;, + 30;3; 0.000000, 0.000000, 0.591545;;, + 31;3; 0.000000, 0.000000, 0.584125;;, + 32;3; 0.000000, 0.000000, 0.571778;;, + 33;3; 0.000000, 0.000000, 0.554761;;, + 34;3; 0.000000, 0.000000, 0.533612;;, + 35;3; 0.000000, 0.000000, 0.509185;;, + 36;3; 0.000000, 0.000000, 0.482640;;, + 37;3; 0.000000, 0.000000, 0.455361;;, + 38;3; 0.000000, 0.000000, 0.428816;;, + 39;3; 0.000000, 0.000000, 0.404389;;, + 40;3; 0.000000, 0.000000, 0.383239;;, + 41;3; 0.000000, 0.000000, 0.366222;;, + 42;3; 0.000000, 0.000000, 0.353875;;, + 43;3; 0.000000, 0.000000, 0.346455;;, + 44;3; 0.000000, 0.000000, 0.344000;;, + 45;3; 0.000000, 0.000000, 0.345041;;, + 46;3; 0.000000, 0.000000, 0.348186;;, + 47;3; 0.000000, 0.000000, 0.353449;;, + 48;3; 0.000000, 0.000000, 0.360815;;, + 49;3; 0.000000, 0.000000, 0.370228;;, + 50;3; 0.000000, 0.000000, 0.381586;;, + 51;3; 0.000000, 0.000000, 0.394733;;, + 52;3; 0.000000, 0.000000, 0.409456;;, + 53;3; 0.000000, 0.000000, 0.425482;;, + 54;3; 0.000000, 0.000000, 0.442485;;, + 55;3; 0.000000, 0.000000, 0.460093;;, + 56;3; 0.000000, 0.000000, 0.477907;;, + 57;3; 0.000000, 0.000000, 0.495516;;, + 58;3; 0.000000, 0.000000, 0.512519;;, + 59;3; 0.000000, 0.000000, 0.528545;;, + 60;3; 0.000000, 0.000000, 0.543268;;, + 61;3; 0.000000, 0.000000, 0.556415;;, + 62;3; 0.000000, 0.000000, 0.567772;;, + 63;3; 0.000000, 0.000000, 0.577185;;, + 64;3; 0.000000, 0.000000, 0.584551;;, + 65;3; 0.000000, 0.000000, 0.589814;;, + 66;3; 0.000000, 0.000000, 0.592959;;, + 67;3; 0.000000, 0.000000, 0.594000;;, + 68;3; 0.000000, 0.000000, 0.592862;;, + 69;3; 0.000000, 0.000000, 0.589423;;, + 70;3; 0.000000, 0.000000, 0.583669;;, + 71;3; 0.000000, 0.000000, 0.575624;;, + 72;3; 0.000000, 0.000000, 0.565357;;, + 73;3; 0.000000, 0.000000, 0.552999;;, + 74;3; 0.000000, 0.000000, 0.538742;;, + 75;3; 0.000000, 0.000000, 0.522852;;, + 76;3; 0.000000, 0.000000, 0.505660;;, + 77;3; 0.000000, 0.000000, 0.487563;;, + 78;3; 0.000000, 0.000000, 0.469000;;, + 79;3; 0.000000, 0.000000, 0.450437;;, + 80;3; 0.000000, 0.000000, 0.432340;;, + 81;3; 0.000000, 0.000000, 0.415148;;, + 82;3; 0.000000, 0.000000, 0.399258;;, + 83;3; 0.000000, 0.000000, 0.385001;;, + 84;3; 0.000000, 0.000000, 0.372643;;, + 85;3; 0.000000, 0.000000, 0.362376;;, + 86;3; 0.000000, 0.000000, 0.354331;;, + 87;3; 0.000000, 0.000000, 0.348577;;, + 88;3; 0.000000, 0.000000, 0.345138;;, + 89;3; 0.000000, 0.000000, 0.344000;;, + 90;3; 0.000000, 0.000000, 0.344611;;, + 91;3; 0.000000, 0.000000, 0.346455;;, + 92;3; 0.000000, 0.000000, 0.349542;;, + 93;3; 0.000000, 0.000000, 0.353875;;, + 94;3; 0.000000, 0.000000, 0.359443;;, + 95;3; 0.000000, 0.000000, 0.366222;;, + 96;3; 0.000000, 0.000000, 0.374173;;, + 97;3; 0.000000, 0.000000, 0.383239;;, + 98;3; 0.000000, 0.000000, 0.393343;;, + 99;3; 0.000000, 0.000000, 0.404388;;, + 100;3; 0.000000, 0.000000, 0.416258;;, + 101;3; 0.000000, 0.000000, 0.428815;;, + 102;3; 0.000000, 0.000000, 0.441906;;, + 103;3; 0.000000, 0.000000, 0.455361;;, + 104;3; 0.000000, 0.000000, 0.469000;;, + 105;3; 0.000000, 0.000000, 0.482639;;, + 106;3; 0.000000, 0.000000, 0.496094;;, + 107;3; 0.000000, 0.000000, 0.509185;;, + 108;3; 0.000000, 0.000000, 0.521742;;, + 109;3; 0.000000, 0.000000, 0.533612;;, + 110;3; 0.000000, 0.000000, 0.544657;;, + 111;3; 0.000000, 0.000000, 0.554761;;, + 112;3; 0.000000, 0.000000, 0.563827;;, + 113;3; 0.000000, 0.000000, 0.571778;;, + 114;3; 0.000000, 0.000000, 0.578557;;, + 115;3; 0.000000, 0.000000, 0.584125;;, + 116;3; 0.000000, 0.000000, 0.588458;;, + 117;3; 0.000000, 0.000000, 0.591545;;, + 118;3; 0.000000, 0.000000, 0.593389;;, + 119;3; 0.000000, 0.000000, 0.594000;;, + 120;3; 0.000000, 0.000000, 0.593389;;, + 121;3; 0.000000, 0.000000, 0.591545;;, + 122;3; 0.000000, 0.000000, 0.588458;;, + 123;3; 0.000000, 0.000000, 0.584125;;, + 124;3; 0.000000, 0.000000, 0.578557;;, + 125;3; 0.000000, 0.000000, 0.571778;;, + 126;3; 0.000000, 0.000000, 0.563827;;, + 127;3; 0.000000, 0.000000, 0.554762;;, + 128;3; 0.000000, 0.000000, 0.544658;;, + 129;3; 0.000000, 0.000000, 0.533613;;, + 130;3; 0.000000, 0.000000, 0.521743;;, + 131;3; 0.000000, 0.000000, 0.509186;;, + 132;3; 0.000000, 0.000000, 0.496096;;, + 133;3; 0.000000, 0.000000, 0.482641;;, + 134;3; 0.000000, 0.000000, 0.469002;;, + 135;3; 0.000000, 0.000000, 0.455363;;, + 136;3; 0.000000, 0.000000, 0.441908;;, + 137;3; 0.000000, 0.000000, 0.428818;;, + 138;3; 0.000000, 0.000000, 0.416260;;, + 139;3; 0.000000, 0.000000, 0.404390;;, + 140;3; 0.000000, 0.000000, 0.393345;;, + 141;3; 0.000000, 0.000000, 0.383241;;, + 142;3; 0.000000, 0.000000, 0.374175;;, + 143;3; 0.000000, 0.000000, 0.366223;;, + 144;3; 0.000000, 0.000000, 0.359444;;, + 145;3; 0.000000, 0.000000, 0.353876;;, + 146;3; 0.000000, 0.000000, 0.349543;;, + 147;3; 0.000000, 0.000000, 0.346455;;, + 148;3; 0.000000, 0.000000, 0.344611;;, + 149;3; 0.000000, 0.000000, 0.344000;;; + } + AnimationKey { //Rotation + 0; + 150; + 0;4; -0.707107, 0.707107, 0.000000, 0.000000;;, + 1;4; -0.707107, 0.707107, 0.000000, 0.000000;;, + 2;4; -0.707107, 0.707107, 0.000000, 0.000000;;, + 3;4; -0.707107, 0.707107, 0.000000, 0.000000;;, + 4;4; -0.707107, 0.707107, 0.000000, 0.000000;;, + 5;4; -0.707107, 0.707107, 0.000000, 0.000000;;, + 6;4; -0.707107, 0.707107, 0.000000, 0.000000;;, + 7;4; -0.707107, 0.707107, 0.000000, 0.000000;;, + 8;4; -0.707107, 0.707107, 0.000000, 0.000000;;, + 9;4; -0.707107, 0.707107, 0.000000, 0.000000;;, + 10;4; -0.707107, 0.707107, 0.000000, 0.000000;;, + 11;4; -0.707107, 0.707107, 0.000000, 0.000000;;, + 12;4; -0.707107, 0.707107, 0.000000, 0.000000;;, + 13;4; -0.707107, 0.707107, 0.000000, 0.000000;;, + 14;4; -0.707107, 0.707107, 0.000000, 0.000000;;, + 15;4; -0.707107, 0.707107, 0.000000, 0.000000;;, + 16;4; -0.707107, 0.707107, 0.000000, 0.000000;;, + 17;4; -0.707107, 0.707107, 0.000000, 0.000000;;, + 18;4; -0.707107, 0.707107, 0.000000, 0.000000;;, + 19;4; -0.707107, 0.707107, 0.000000, 0.000000;;, + 20;4; -0.707107, 0.707107, 0.000000, 0.000000;;, + 21;4; -0.707107, 0.707107, 0.000000, 0.000000;;, + 22;4; -0.707107, 0.707107, 0.000000, 0.000000;;, + 23;4; -0.707107, 0.707107, 0.000000, 0.000000;;, + 24;4; -0.707107, 0.707107, 0.000000, 0.000000;;, + 25;4; -0.707107, 0.707107, 0.000000, 0.000000;;, + 26;4; -0.707107, 0.707107, 0.000000, 0.000000;;, + 27;4; -0.707107, 0.707107, 0.000000, 0.000000;;, + 28;4; -0.707107, 0.707107, 0.000000, 0.000000;;, + 29;4; -0.707107, 0.707107, 0.000000, 0.000000;;, + 30;4; -0.707107, 0.707107, 0.000000, 0.000000;;, + 31;4; -0.707107, 0.707107, 0.000000, 0.000000;;, + 32;4; -0.707107, 0.707107, 0.000000, 0.000000;;, + 33;4; -0.707107, 0.707107, 0.000000, 0.000000;;, + 34;4; -0.707107, 0.707107, 0.000000, 0.000000;;, + 35;4; -0.707107, 0.707107, 0.000000, 0.000000;;, + 36;4; -0.707107, 0.707107, 0.000000, 0.000000;;, + 37;4; -0.707107, 0.707107, 0.000000, 0.000000;;, + 38;4; -0.707107, 0.707107, 0.000000, 0.000000;;, + 39;4; -0.707107, 0.707107, 0.000000, 0.000000;;, + 40;4; -0.707107, 0.707107, 0.000000, 0.000000;;, + 41;4; -0.707107, 0.707107, 0.000000, 0.000000;;, + 42;4; -0.707107, 0.707107, 0.000000, 0.000000;;, + 43;4; -0.707107, 0.707107, 0.000000, 0.000000;;, + 44;4; -0.707107, 0.707107, 0.000000, 0.000000;;, + 45;4; -0.707107, 0.707107, 0.000000, 0.000000;;, + 46;4; -0.707107, 0.707107, 0.000000, 0.000000;;, + 47;4; -0.707107, 0.707107, 0.000000, 0.000000;;, + 48;4; -0.707107, 0.707107, 0.000000, 0.000000;;, + 49;4; -0.707107, 0.707107, 0.000000, 0.000000;;, + 50;4; -0.707107, 0.707107, 0.000000, 0.000000;;, + 51;4; -0.707107, 0.707107, 0.000000, 0.000000;;, + 52;4; -0.707107, 0.707107, 0.000000, 0.000000;;, + 53;4; -0.707107, 0.707107, 0.000000, 0.000000;;, + 54;4; -0.707107, 0.707107, 0.000000, 0.000000;;, + 55;4; -0.707107, 0.707107, 0.000000, 0.000000;;, + 56;4; -0.707107, 0.707107, 0.000000, 0.000000;;, + 57;4; -0.707107, 0.707107, 0.000000, 0.000000;;, + 58;4; -0.707107, 0.707107, 0.000000, 0.000000;;, + 59;4; -0.707107, 0.707107, 0.000000, 0.000000;;, + 60;4; -0.707107, 0.707107, 0.000000, 0.000000;;, + 61;4; -0.707107, 0.707107, 0.000000, 0.000000;;, + 62;4; -0.707107, 0.707107, 0.000000, 0.000000;;, + 63;4; -0.707107, 0.707107, 0.000000, 0.000000;;, + 64;4; -0.707107, 0.707107, 0.000000, 0.000000;;, + 65;4; -0.707107, 0.707107, 0.000000, 0.000000;;, + 66;4; -0.707107, 0.707107, 0.000000, 0.000000;;, + 67;4; -0.707107, 0.707107, 0.000000, 0.000000;;, + 68;4; -0.707107, 0.707107, 0.000000, 0.000000;;, + 69;4; -0.707107, 0.707107, 0.000000, 0.000000;;, + 70;4; -0.707107, 0.707107, 0.000000, 0.000000;;, + 71;4; -0.707107, 0.707107, 0.000000, 0.000000;;, + 72;4; -0.707107, 0.707107, 0.000000, 0.000000;;, + 73;4; -0.707107, 0.707107, 0.000000, 0.000000;;, + 74;4; -0.707107, 0.707107, 0.000000, 0.000000;;, + 75;4; -0.707107, 0.707107, 0.000000, 0.000000;;, + 76;4; -0.707107, 0.707107, 0.000000, 0.000000;;, + 77;4; -0.707107, 0.707107, 0.000000, 0.000000;;, + 78;4; -0.707107, 0.707107, 0.000000, 0.000000;;, + 79;4; -0.707107, 0.707107, 0.000000, 0.000000;;, + 80;4; -0.707107, 0.707107, 0.000000, 0.000000;;, + 81;4; -0.707107, 0.707107, 0.000000, 0.000000;;, + 82;4; -0.707107, 0.707107, 0.000000, 0.000000;;, + 83;4; -0.707107, 0.707107, 0.000000, 0.000000;;, + 84;4; -0.707107, 0.707107, 0.000000, 0.000000;;, + 85;4; -0.707107, 0.707107, 0.000000, 0.000000;;, + 86;4; -0.707107, 0.707107, 0.000000, 0.000000;;, + 87;4; -0.707107, 0.707107, 0.000000, 0.000000;;, + 88;4; -0.707107, 0.707107, 0.000000, 0.000000;;, + 89;4; -0.707107, 0.707107, 0.000000, 0.000000;;, + 90;4; -0.707107, 0.707107, 0.000000, 0.000000;;, + 91;4; -0.707107, 0.707107, 0.000000, 0.000000;;, + 92;4; -0.707107, 0.707107, 0.000000, 0.000000;;, + 93;4; -0.707107, 0.707107, 0.000000, 0.000000;;, + 94;4; -0.707107, 0.707107, 0.000000, 0.000000;;, + 95;4; -0.707107, 0.707107, 0.000000, 0.000000;;, + 96;4; -0.707107, 0.707107, 0.000000, 0.000000;;, + 97;4; -0.707107, 0.707107, 0.000000, 0.000000;;, + 98;4; -0.707107, 0.707107, 0.000000, 0.000000;;, + 99;4; -0.707107, 0.707107, 0.000000, 0.000000;;, + 100;4; -0.707107, 0.707107, 0.000000, 0.000000;;, + 101;4; -0.707107, 0.707107, 0.000000, 0.000000;;, + 102;4; -0.707107, 0.707107, 0.000000, 0.000000;;, + 103;4; -0.707107, 0.707107, 0.000000, 0.000000;;, + 104;4; -0.707107, 0.707107, 0.000000, 0.000000;;, + 105;4; -0.707107, 0.707107, 0.000000, 0.000000;;, + 106;4; -0.707107, 0.707107, 0.000000, 0.000000;;, + 107;4; -0.707107, 0.707107, 0.000000, 0.000000;;, + 108;4; -0.707107, 0.707107, 0.000000, 0.000000;;, + 109;4; -0.707107, 0.707107, 0.000000, 0.000000;;, + 110;4; -0.707107, 0.707107, 0.000000, 0.000000;;, + 111;4; -0.707107, 0.707107, 0.000000, 0.000000;;, + 112;4; -0.707107, 0.707107, 0.000000, 0.000000;;, + 113;4; -0.707107, 0.707107, 0.000000, 0.000000;;, + 114;4; -0.707107, 0.707107, 0.000000, 0.000000;;, + 115;4; -0.707107, 0.707107, 0.000000, 0.000000;;, + 116;4; -0.707107, 0.707107, 0.000000, 0.000000;;, + 117;4; -0.707107, 0.707107, 0.000000, 0.000000;;, + 118;4; -0.707107, 0.707107, 0.000000, 0.000000;;, + 119;4; -0.707107, 0.707107, 0.000000, 0.000000;;, + 120;4; -0.707107, 0.707107, 0.000000, 0.000000;;, + 121;4; -0.707107, 0.707107, 0.000000, 0.000000;;, + 122;4; -0.707107, 0.707107, 0.000000, 0.000000;;, + 123;4; -0.707107, 0.707107, 0.000000, 0.000000;;, + 124;4; -0.707107, 0.707107, 0.000000, 0.000000;;, + 125;4; -0.707107, 0.707107, 0.000000, 0.000000;;, + 126;4; -0.707107, 0.707107, 0.000000, 0.000000;;, + 127;4; -0.707107, 0.707107, 0.000000, 0.000000;;, + 128;4; -0.707107, 0.707107, 0.000000, 0.000000;;, + 129;4; -0.707107, 0.707107, 0.000000, 0.000000;;, + 130;4; -0.707107, 0.707107, 0.000000, 0.000000;;, + 131;4; -0.707107, 0.707107, 0.000000, 0.000000;;, + 132;4; -0.707107, 0.707107, 0.000000, 0.000000;;, + 133;4; -0.707107, 0.707107, 0.000000, 0.000000;;, + 134;4; -0.707107, 0.707107, 0.000000, 0.000000;;, + 135;4; -0.707107, 0.707107, 0.000000, 0.000000;;, + 136;4; -0.707107, 0.707107, 0.000000, 0.000000;;, + 137;4; -0.707107, 0.707107, 0.000000, 0.000000;;, + 138;4; -0.707107, 0.707107, 0.000000, 0.000000;;, + 139;4; -0.707107, 0.707107, 0.000000, 0.000000;;, + 140;4; -0.707107, 0.707107, 0.000000, 0.000000;;, + 141;4; -0.707107, 0.707107, 0.000000, 0.000000;;, + 142;4; -0.707107, 0.707107, 0.000000, 0.000000;;, + 143;4; -0.707107, 0.707107, 0.000000, 0.000000;;, + 144;4; -0.707107, 0.707107, 0.000000, 0.000000;;, + 145;4; -0.707107, 0.707107, 0.000000, 0.000000;;, + 146;4; -0.707107, 0.707107, 0.000000, 0.000000;;, + 147;4; -0.707107, 0.707107, 0.000000, 0.000000;;, + 148;4; -0.707107, 0.707107, 0.000000, 0.000000;;, + 149;4; -0.707107, 0.707107, 0.000000, 0.000000;;; + } + AnimationKey { //Scale + 1; + 150; + 0;3; 1.000000, 0.093750, 1.000000;;, + 1;3; 1.000000, 0.093750, 1.000000;;, + 2;3; 1.000000, 0.093750, 1.000000;;, + 3;3; 1.000000, 0.093750, 1.000000;;, + 4;3; 1.000000, 0.093750, 1.000000;;, + 5;3; 1.000000, 0.093750, 1.000000;;, + 6;3; 1.000000, 0.093750, 1.000000;;, + 7;3; 1.000000, 0.093750, 1.000000;;, + 8;3; 1.000000, 0.093750, 1.000000;;, + 9;3; 1.000000, 0.093750, 1.000000;;, + 10;3; 1.000000, 0.093750, 1.000000;;, + 11;3; 1.000000, 0.093750, 1.000000;;, + 12;3; 1.000000, 0.093750, 1.000000;;, + 13;3; 1.000000, 0.093750, 1.000000;;, + 14;3; 1.000000, 0.093750, 1.000000;;, + 15;3; 1.000000, 0.093750, 1.000000;;, + 16;3; 1.000000, 0.093750, 1.000000;;, + 17;3; 1.000000, 0.093750, 1.000000;;, + 18;3; 1.000000, 0.093750, 1.000000;;, + 19;3; 1.000000, 0.093750, 1.000000;;, + 20;3; 1.000000, 0.093750, 1.000000;;, + 21;3; 1.000000, 0.093750, 1.000000;;, + 22;3; 1.000000, 0.093750, 1.000000;;, + 23;3; 1.000000, 0.093750, 1.000000;;, + 24;3; 1.000000, 0.093750, 1.000000;;, + 25;3; 1.000000, 0.093750, 1.000000;;, + 26;3; 1.000000, 0.093750, 1.000000;;, + 27;3; 1.000000, 0.093750, 1.000000;;, + 28;3; 1.000000, 0.093750, 1.000000;;, + 29;3; 1.000000, 0.093750, 1.000000;;, + 30;3; 1.000000, 0.093750, 1.000000;;, + 31;3; 1.000000, 0.093750, 1.000000;;, + 32;3; 1.000000, 0.093750, 1.000000;;, + 33;3; 1.000000, 0.093750, 1.000000;;, + 34;3; 1.000000, 0.093750, 1.000000;;, + 35;3; 1.000000, 0.093750, 1.000000;;, + 36;3; 1.000000, 0.093750, 1.000000;;, + 37;3; 1.000000, 0.093750, 1.000000;;, + 38;3; 1.000000, 0.093750, 1.000000;;, + 39;3; 1.000000, 0.093750, 1.000000;;, + 40;3; 1.000000, 0.093750, 1.000000;;, + 41;3; 1.000000, 0.093750, 1.000000;;, + 42;3; 1.000000, 0.093750, 1.000000;;, + 43;3; 1.000000, 0.093750, 1.000000;;, + 44;3; 1.000000, 0.093750, 1.000000;;, + 45;3; 1.000000, 0.093750, 1.000000;;, + 46;3; 1.000000, 0.093750, 1.000000;;, + 47;3; 1.000000, 0.093750, 1.000000;;, + 48;3; 1.000000, 0.093750, 1.000000;;, + 49;3; 1.000000, 0.093750, 1.000000;;, + 50;3; 1.000000, 0.093750, 1.000000;;, + 51;3; 1.000000, 0.093750, 1.000000;;, + 52;3; 1.000000, 0.093750, 1.000000;;, + 53;3; 1.000000, 0.093750, 1.000000;;, + 54;3; 1.000000, 0.093750, 1.000000;;, + 55;3; 1.000000, 0.093750, 1.000000;;, + 56;3; 1.000000, 0.093750, 1.000000;;, + 57;3; 1.000000, 0.093750, 1.000000;;, + 58;3; 1.000000, 0.093750, 1.000000;;, + 59;3; 1.000000, 0.093750, 1.000000;;, + 60;3; 1.000000, 0.093750, 1.000000;;, + 61;3; 1.000000, 0.093750, 1.000000;;, + 62;3; 1.000000, 0.093750, 1.000000;;, + 63;3; 1.000000, 0.093750, 1.000000;;, + 64;3; 1.000000, 0.093750, 1.000000;;, + 65;3; 1.000000, 0.093750, 1.000000;;, + 66;3; 1.000000, 0.093750, 1.000000;;, + 67;3; 1.000000, 0.093750, 1.000000;;, + 68;3; 1.000000, 0.093750, 1.000000;;, + 69;3; 1.000000, 0.093750, 1.000000;;, + 70;3; 1.000000, 0.093750, 1.000000;;, + 71;3; 1.000000, 0.093750, 1.000000;;, + 72;3; 1.000000, 0.093750, 1.000000;;, + 73;3; 1.000000, 0.093750, 1.000000;;, + 74;3; 1.000000, 0.093750, 1.000000;;, + 75;3; 1.000000, 0.093750, 1.000000;;, + 76;3; 1.000000, 0.093750, 1.000000;;, + 77;3; 1.000000, 0.093750, 1.000000;;, + 78;3; 1.000000, 0.093750, 1.000000;;, + 79;3; 1.000000, 0.093750, 1.000000;;, + 80;3; 1.000000, 0.093750, 1.000000;;, + 81;3; 1.000000, 0.093750, 1.000000;;, + 82;3; 1.000000, 0.093750, 1.000000;;, + 83;3; 1.000000, 0.093750, 1.000000;;, + 84;3; 1.000000, 0.093750, 1.000000;;, + 85;3; 1.000000, 0.093750, 1.000000;;, + 86;3; 1.000000, 0.093750, 1.000000;;, + 87;3; 1.000000, 0.093750, 1.000000;;, + 88;3; 1.000000, 0.093750, 1.000000;;, + 89;3; 1.000000, 0.093750, 1.000000;;, + 90;3; 1.000000, 0.093750, 1.000000;;, + 91;3; 1.000000, 0.093750, 1.000000;;, + 92;3; 1.000000, 0.093750, 1.000000;;, + 93;3; 1.000000, 0.093750, 1.000000;;, + 94;3; 1.000000, 0.093750, 1.000000;;, + 95;3; 1.000000, 0.093750, 1.000000;;, + 96;3; 1.000000, 0.093750, 1.000000;;, + 97;3; 1.000000, 0.093750, 1.000000;;, + 98;3; 1.000000, 0.093750, 1.000000;;, + 99;3; 1.000000, 0.093750, 1.000000;;, + 100;3; 1.000000, 0.093750, 1.000000;;, + 101;3; 1.000000, 0.093750, 1.000000;;, + 102;3; 1.000000, 0.093750, 1.000000;;, + 103;3; 1.000000, 0.093750, 1.000000;;, + 104;3; 1.000000, 0.093750, 1.000000;;, + 105;3; 1.000000, 0.093750, 1.000000;;, + 106;3; 1.000000, 0.093750, 1.000000;;, + 107;3; 1.000000, 0.093750, 1.000000;;, + 108;3; 1.000000, 0.093750, 1.000000;;, + 109;3; 1.000000, 0.093750, 1.000000;;, + 110;3; 1.000000, 0.093750, 1.000000;;, + 111;3; 1.000000, 0.093750, 1.000000;;, + 112;3; 1.000000, 0.093750, 1.000000;;, + 113;3; 1.000000, 0.093750, 1.000000;;, + 114;3; 1.000000, 0.093750, 1.000000;;, + 115;3; 1.000000, 0.093750, 1.000000;;, + 116;3; 1.000000, 0.093750, 1.000000;;, + 117;3; 1.000000, 0.093750, 1.000000;;, + 118;3; 1.000000, 0.093750, 1.000000;;, + 119;3; 1.000000, 0.093750, 1.000000;;, + 120;3; 1.000000, 0.093750, 1.000000;;, + 121;3; 1.000000, 0.093750, 1.000000;;, + 122;3; 1.000000, 0.093750, 1.000000;;, + 123;3; 1.000000, 0.093750, 1.000000;;, + 124;3; 1.000000, 0.093750, 1.000000;;, + 125;3; 1.000000, 0.093750, 1.000000;;, + 126;3; 1.000000, 0.093750, 1.000000;;, + 127;3; 1.000000, 0.093750, 1.000000;;, + 128;3; 1.000000, 0.093750, 1.000000;;, + 129;3; 1.000000, 0.093750, 1.000000;;, + 130;3; 1.000000, 0.093750, 1.000000;;, + 131;3; 1.000000, 0.093750, 1.000000;;, + 132;3; 1.000000, 0.093750, 1.000000;;, + 133;3; 1.000000, 0.093750, 1.000000;;, + 134;3; 1.000000, 0.093750, 1.000000;;, + 135;3; 1.000000, 0.093750, 1.000000;;, + 136;3; 1.000000, 0.093750, 1.000000;;, + 137;3; 1.000000, 0.093750, 1.000000;;, + 138;3; 1.000000, 0.093750, 1.000000;;, + 139;3; 1.000000, 0.093750, 1.000000;;, + 140;3; 1.000000, 0.093750, 1.000000;;, + 141;3; 1.000000, 0.093750, 1.000000;;, + 142;3; 1.000000, 0.093750, 1.000000;;, + 143;3; 1.000000, 0.093750, 1.000000;;, + 144;3; 1.000000, 0.093750, 1.000000;;, + 145;3; 1.000000, 0.093750, 1.000000;;, + 146;3; 1.000000, 0.093750, 1.000000;;, + 147;3; 1.000000, 0.093750, 1.000000;;, + 148;3; 1.000000, 0.093750, 1.000000;;, + 149;3; 1.000000, 0.093750, 1.000000;;; + } + } +} //End of AnimationSet diff --git a/models/buildtest_pump_blue.png b/models/buildtest_pump_blue.png new file mode 100644 index 0000000..5b09886 Binary files /dev/null and b/models/buildtest_pump_blue.png differ diff --git a/models/buildtest_pump_blue.xcf b/models/buildtest_pump_blue.xcf new file mode 100644 index 0000000..793f277 Binary files /dev/null and b/models/buildtest_pump_blue.xcf differ diff --git a/models/buildtest_pump_green.png b/models/buildtest_pump_green.png new file mode 100644 index 0000000..984dd4f Binary files /dev/null and b/models/buildtest_pump_green.png differ diff --git a/models/buildtest_pump_green.xcf b/models/buildtest_pump_green.xcf new file mode 100644 index 0000000..a5850b0 Binary files /dev/null and b/models/buildtest_pump_green.xcf differ diff --git a/models/buildtest_pump_mesecon.png b/models/buildtest_pump_mesecon.png new file mode 100644 index 0000000..1574f79 Binary files /dev/null and b/models/buildtest_pump_mesecon.png differ diff --git a/models/buildtest_pump_mesecon.xcf b/models/buildtest_pump_mesecon.xcf new file mode 100644 index 0000000..68a98fd Binary files /dev/null and b/models/buildtest_pump_mesecon.xcf differ diff --git a/models/buildtest_pump_orange.png b/models/buildtest_pump_orange.png new file mode 100644 index 0000000..ef64f62 Binary files /dev/null and b/models/buildtest_pump_orange.png differ diff --git a/models/buildtest_pump_orange.xcf b/models/buildtest_pump_orange.xcf new file mode 100644 index 0000000..c7b9d73 Binary files /dev/null and b/models/buildtest_pump_orange.xcf differ diff --git a/models/buildtest_pump_red.png b/models/buildtest_pump_red.png new file mode 100644 index 0000000..ca4d81c Binary files /dev/null and b/models/buildtest_pump_red.png differ diff --git a/models/buildtest_pump_red.xcf b/models/buildtest_pump_red.xcf new file mode 100644 index 0000000..c76f7fa Binary files /dev/null and b/models/buildtest_pump_red.xcf differ diff --git a/models/buildtest_pump_sterling.png b/models/buildtest_pump_sterling.png new file mode 100644 index 0000000..97928d1 Binary files /dev/null and b/models/buildtest_pump_sterling.png differ diff --git a/models/buildtest_pump_sterling.xcf b/models/buildtest_pump_sterling.xcf new file mode 100644 index 0000000..23530b2 Binary files /dev/null and b/models/buildtest_pump_sterling.xcf differ diff --git a/models/pump.blend b/models/pump.blend new file mode 100644 index 0000000..c4b8b29 Binary files /dev/null and b/models/pump.blend differ diff --git a/models/pump.blend1 b/models/pump.blend1 new file mode 100644 index 0000000..c25986e Binary files /dev/null and b/models/pump.blend1 differ diff --git a/models/pump.blend2 b/models/pump.blend2 new file mode 100644 index 0000000..ba3deab Binary files /dev/null and b/models/pump.blend2 differ diff --git a/pipes/cobble.lua b/pipes/cobble.lua new file mode 100644 index 0000000..9caa0a6 --- /dev/null +++ b/pipes/cobble.lua @@ -0,0 +1,44 @@ +buildtest.pipes.types.cobble = { + base = "default:cobble", +} + +buildtest.pipes.makepipe(function(set, nodes, count, name, id, clas) + local def = { + sunlight_propagates = true, + paramtype = 'light', + walkable = true, + climbable = false, + diggable = true, + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = nodes + }, + -------------------------- + description = clas.."Buildtest Cobblestone Pipe", + tiles = {"buildtest_pipe_cobble.png"}, + groups = {choppy=1,oddly_breakable_by_hand=3}, + buildtest = { + slowdown=0.1, + pipe=1, + connects={ + buildtest.pipes.defaultPipes + }, + disconnects = {{ + "buildtest:pipe_stone", + }}, + }, + drop = { + max_items = 1, + items = { + { items = {'buildtest:pipe_cobble_000000_'..id} } + } + }, + on_place = buildtest.pipes.onp_funct, + on_dig = buildtest.pipes.ond_funct, + } + if count~=1 then + def.groups.not_in_creative_inventory=1 + end + minetest.register_node("buildtest:pipe_cobble_"..name, def) +end) \ No newline at end of file diff --git a/pipes/diamond.lua b/pipes/diamond.lua new file mode 100644 index 0000000..75889fe --- /dev/null +++ b/pipes/diamond.lua @@ -0,0 +1,95 @@ +buildtest.pipes.types.diamond = { + base = "default:diamond", + colours = { + "green", + "black", + "red", + "white", + "blue", + "yellow", + }, +} +-- x+ : red +-- x- : green +-- y+ : blue +-- y- : yellow +-- z+ : black +-- z- : white + +buildtest.pipes.makepipe(function(set, nodes, count, name, id, clas) + local top = "buildtest_pipe_diamond_top.png" + local bttm = "buildtest_pipe_diamond_bottem.png" + local side = "buildtest_pipe_diamond.png" + local def = { + sunlight_propagates = true, + paramtype = 'light', + walkable = true, + climbable = false, + diggable = true, + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = nodes + }, + -------------------------- + description = clas.."Buildtest Diamond Pipe", + tiles = {top,bttm,side,side,side,side}, + groups = {choppy=1,oddly_breakable_by_hand=3}, + buildtest = { + slowdown=0.1, + pipe=1, + connects={ + buildtest.pipes.defaultPipes + }, + }, + drop = { + max_items = 1, + items = { + { items = {'buildtest:pipe_diamond_000000_'..id} } + } + }, + on_place = function(itemstack, placer, pointed_thing) + buildtest.pipes.onp_funct(itemstack, placer, pointed_thing) + local meta = minetest.get_meta(pointed_thing.above) + --meta:set_string("formspec", buildtest.pipes.diamond.formspec) + meta:set_string("infotext", "Diamond Pipe") + local inv = meta:get_inventory() + --inv:set_size("main", 10*6) + for i=1,#buildtest.pipes.types.diamond.colours do + local name = buildtest.pipes.types.diamond.colours[i] + inv:set_size(name, 10) + end + end, + on_rightclick = function(pos, node, clicker, itemstack) + local posname = "nodemeta:"..pos.x..","..pos.y..","..pos.z + local formspec = "invsize[11,11;]" + --.."list["..posname..";main;1,0;10,6;]" + .."list[current_player;main;0,7;8,4;]" + for i=1,#buildtest.pipes.types.diamond.colours do + local name = buildtest.pipes.types.diamond.colours[i] + formspec = formspec.."list["..posname..";"..name..";1,"..(i-1)..";10,1;]label[0,"..(i-1)..";"..name.."]" + end + minetest.show_formspec(clicker:get_player_name(), "buildtest:pipe_diamond_"..name, formspec) + end, + on_dig = buildtest.pipes.ond_funct, + -------------------------------------------------------------------------------- + allow_metadata_inventory_put = buildtest.autocraft.allow_metadata_inventory_put(nil), -- {["green"]=1, ["black"]=1, ["red"]=1, ["white"]=1, ["blue"]=1, ["yellow"]=1,} + allow_metadata_inventory_take = buildtest.autocraft.allow_metadata_inventory_take(nil), + allow_metadata_inventory_move = buildtest.autocraft.allow_metadata_inventory_move(nil, true), + } + if count~=1 then + def.groups.not_in_creative_inventory=1 + end + minetest.register_node("buildtest:pipe_diamond_"..name, def) +end) + +buildtest.pipes.types.diamond.getDir = function(pos,cargo) + local inv = minetest.get_meta(pos):get_inventory() + for i=1,#buildtest.pipes.types.diamond.colours do + local name = buildtest.pipes.types.diamond.colours[i] + if inv:contains_item(name, {name=cargo.name}) then + return buildtest.toXY(i) + end + end + return nil +end \ No newline at end of file diff --git a/pipes/emriald.lua b/pipes/emriald.lua new file mode 100644 index 0000000..d797a28 --- /dev/null +++ b/pipes/emriald.lua @@ -0,0 +1,57 @@ +buildtest.pipes.makepipe(function(set, nodes, count, name, id, clas) + local def = { + sunlight_propagates = true, + paramtype = 'light', + walkable = true, + climbable = false, + diggable = true, + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = nodes + }, + -------------------------- + description = clas.."Buildtest Emeriald Pipe", + tiles = {"buildtest_pipe_emr.png"}, + groups = {choppy=1,oddly_breakable_by_hand=3}, + buildtest = { + slowdown=0.1, + pipe=1, + connects={ + buildtest.pipes.defaultPipes, + {"default:chest"} + }, + }, + drop = { + max_items = 1, + items = { + { items = {'buildtest:pipe_emr_000000_'..id} } + } + }, + --on_place = buildtest.pipes.onp_funct, + on_place = function(itemstack, placer, pointed_thing) + buildtest.pipes.onp_funct(itemstack, placer, pointed_thing) + local meta = minetest.get_meta(pointed_thing.above) + + meta:set_string("infotext", "Emeriald Pipe") + local inv = meta:get_inventory() + inv:set_size("main", 8*2) + end, + on_dig = buildtest.pipes.ond_funct, + on_rightclick = function(pos, node, clicker, itemstack) + local posname = "nodemeta:"..pos.x..","..pos.y..","..pos.z + local formspec = "invsize[8,7;]" + .."list["..posname..";main;0,0;8,2;]" + .."list[current_player;main;0,2;8,4;]" + minetest.show_formspec(clicker:get_player_name(), "buildtest:pipe_emr_"..name, formspec) + end, + -------------------------------------------------------------------------------- + allow_metadata_inventory_put = buildtest.autocraft.allow_metadata_inventory_put(nil), + allow_metadata_inventory_take = buildtest.autocraft.allow_metadata_inventory_take(nil), + allow_metadata_inventory_move = buildtest.autocraft.allow_metadata_inventory_move(nil), + } + if count~=1 then + def.groups.not_in_creative_inventory=1 + end + minetest.register_node("buildtest:pipe_emr_"..name, def) +end) \ No newline at end of file diff --git a/pipes/gate.lua b/pipes/gate.lua new file mode 100644 index 0000000..6f5c837 --- /dev/null +++ b/pipes/gate.lua @@ -0,0 +1,366 @@ +buildtest.pipes.types.gate = { + base = "mesecons_luacontroller:luacontroller0000", + outname = "buildtest:pipe_gate1_000000_0", + types = { + + }, +} + +buildtest.pipes.types.gate.setFS = function(meta) + --local meta = minetest.get_meta(pos) + + local trigger = meta:get_int("sel") or 1 + if trigger == 0 then trigger = 1 end + + local act = meta:get_int("act") or 1 + if act == 0 then act = 1 end +-- print("trigger: "..trigger) + local triggers = buildtest.pipes.types.gate.triggers + local nextTrigger = triggers[trigger + 1] or triggers[1] + + local acts = buildtest.pipes.types.gate.acts + local nextAct = acts[act + 1] or acts[1] + + local fs = + "invsize[8,7;]" + .."image_button[2,1;1,1;"..triggers[trigger][3] -- texture + ..";trigset_"..nextTrigger[1]--triggers[trigger][1] -- name + ..";"--..triggers[trigger][2] -- label + .."]" + + .."label[2,0.5;"..triggers[trigger][2].."]" + + + .."image_button[4,1;1,1;"..acts[act][3] -- texture + ..";setact_"..nextAct[1]--triggers[trigger][1] -- name + ..";"--..triggers[trigger][2] -- label + .."]" + + .."label[4,0.5;"..acts[act][2].."]" + + .."list[current_player;main;0,3;8,4;]" + + if buildtest.pipes.types.gate.triggers[meta:get_int("sel")].cont + == buildtest.pipes.types.gate.acts[meta:get_int("act")].cont then + fs = fs .. "image[3,1;2,1;buildtest_pipe_gate_joinok.png]" + else + fs = fs .. "image[3,1;2,1;buildtest_pipe_gate_joinnogo.png]" + end + + if triggers[trigger][4]~=nil then + fs = fs .. triggers[trigger][4] + --print(triggers[trigger][4]) + end + + meta:set_string("formspec", fs) +end + +buildtest.pipes.types.gate.triggers = { + {"eng_blue", "Engine blue", "buildtest_pump_mask_blue_side.png", cont=true}, + {"eng_green", "Engine green", "buildtest_pump_mask_green_side.png", cont=true}, + {"eng_yellow", "Engine yellow", "buildtest_pump_mask_yellow_side.png", cont=true}, + {"eng_red", "Engine red", "buildtest_pump_mask_red_side.png", cont=true}, + + {"chest_cont", "Chest contains", "default_chest_front.png", "list[context;main;2,2;1,1;]", cont=true}, + {"chest_room", "Chest has room", "default_chest_front.png", "list[context;main;2,2;1,1;]", cont=true}, + + {"item_pass", "Item traversing", "default_book.png", "list[context;main;2,2;1,1;]", cont=false}, +} + +buildtest.pipes.types.gate.acts = { + {"mesecon_on", "Mesecon On", "jeija_torches_on.png", cont=true}, + {"mesecon_off", "Mesecon Off", "jeija_torches_off.png", cont=true}, + {"mesecon_tog", "Mesecon Toggle", "jeija_wall_lever_off.png", cont=false}, +} + +if minetest.get_modpath("digilines") ~= nil then + buildtest.pipes.types.gate.acts[#buildtest.pipes.types.gate.acts + 1] = + {"digiline_send", "Digiline Send", "jeija_wall_lever_off.png", cont=false} +end + +for m_on = 1, 2 do + buildtest.pipes.makepipe(function(set, nodes, count, name, id, clas) + local state = {"off", "on"} + local mesecon_state = mesecon.state[state[m_on]] + --print(m_on .. " = " .. mesecon_state) + local def = { + sunlight_propagates = true, + paramtype = 'light', + walkable = true, + climbable = false, + diggable = true, + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = nodes + }, + -------------------------- + description = clas.."Buildtest Gate", + tiles = {"buildtest_pipe_gate_"..m_on..".png"}, + groups = {choppy=1,oddly_breakable_by_hand=3}, + buildtest = { + pipe=1, + slowdown=0.1, + connects={ + --"default:chest", + buildtest.pipes.defaultPipes + }, + }, + drop = { + max_items = 1, + items = { + { items = {'buildtest:pipe_gate1_000000_'..id} } + } + }, + mesecons = { + receptor = { + state = mesecon_state, + --rules = mesecon.rules.buttonlike_get + } + }, + digiline = { + receptor = {}, + effector = {}, + }, + on_place = function(itemstack, placer, pointed_thing) + buildtest.pipes.onp_funct(itemstack, placer, pointed_thing) + -- meta:set_string("formspec", ) + end, + on_construct = function(pos) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + inv:set_size("main", 1) + + meta:set_string("infotext", "Gate Pipe") + meta:set_int("sel", 1) + meta:set_int("act", 1) + + buildtest.pipes.types.gate.setFS(meta) + end, + -- on_rightclick = function(pos, node, clicker, itemstack) + -- local meta = minetest.get_meta(pos) + -- + -- local trigger = meta:get_int("sel") or 1 + -- if trigger == 0 then trigger = 1 end + -- --print("trigger: "..trigger) + -- local triggers = buildtest.pipes.types.gate.triggers + -- local nextTrigger = triggers[trigger + 1] or triggers[1] + -- + -- local posname = "nodemeta:"..pos.x..","..pos.y..","..pos.z + -- local formspec = "invsize[8,7;]" + ---- .."list["..posname..";main;0,0;8,2;]" + -- + -- .."image_button[2,1;1,1" + -- + -- ..";"..triggers[trigger][3] -- texture + -- + -- ..";trigset_"..triggers[trigger][1] -- name + -- + -- ..";"..triggers[trigger][2] -- label + -- + -- .."]" + -- + -- .."list[current_player;main;0,3;8,4;]" + -- minetest.show_formspec(clicker:get_player_name(), "buildtest:pipe_gate_"..name, formspec) + -- end, + on_receive_fields = function(pos, formname, fields, sender) + -- print("ok") + -- for name, val in pairs(fields) do + -- print(name .. "=" .. val) + -- end + + local triggers = buildtest.pipes.types.gate.triggers + for i=1, #triggers do + if fields["trigset_"..triggers[i][1]]~=nil then + --print(i) + minetest.env:get_meta(pos):set_int("sel", i) + end + end + + local acts = buildtest.pipes.types.gate.acts + for i=1, #acts do + if fields["setact_"..acts[i][1]]~=nil then + --print(i) + minetest.env:get_meta(pos):set_int("act", i) + end + end + + buildtest.pipes.types.gate.setFS(minetest.get_meta(pos)) + end, + on_place = buildtest.pipes.onp_funct, + on_dig = function(pos, node, digger) + buildtest.pipes.ond_funct(pos, node, digger) + mesecon.on_dignode(pos, node) + end, + + allow_metadata_inventory_put = buildtest.autocraft.allow_metadata_inventory_put(nil, true), + allow_metadata_inventory_take = buildtest.autocraft.allow_metadata_inventory_take(nil), + allow_metadata_inventory_move = buildtest.autocraft.allow_metadata_inventory_move(nil), + } + if count~=1 or m_on==2 then + def.groups.not_in_creative_inventory=1 + end + minetest.register_node("buildtest:pipe_gate"..m_on.."_"..name, def) + + + local getRunAction = function(pos) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + local trig = buildtest.pipes.types.gate.triggers[meta:get_int("sel")][1] + local action = buildtest.pipes.types.gate.acts[meta:get_int("act")][1] + local runAction = nil + + if action == "mesecon_on" or action == "mesecon_off" then + runAction = function(is_on) + --print(is_on) + local new_name = "buildtest:pipe_gate" + if is_on==(action == "mesecon_on") then + new_name = new_name .. "2" + else + new_name = new_name .. "1" + end + new_name = new_name .. "_" .. name + + if new_name~=minetest.get_node(pos).name then + --print(new_name) + buildtest.pumps.hacky_swap_node(pos, new_name) + if is_on~=(action == "mesecon_on") then + mesecon:receptor_off(pos) + else + mesecon:receptor_on(pos) + end + end + end + end + + if action == "mesecon_tog" then + runAction = function(is_on) + if is_on==false then + return + end + --print(is_on) + local def = minetest.registered_items[minetest.get_node(pos).name] + local is_now_on = def.mesecons.receptor.state + if is_now_on=="off" then + is_now_on = 2 + else + is_now_on = 1 + end + local new_name = "buildtest:pipe_gate" .. is_now_on .. "_" .. name + + buildtest.pumps.hacky_swap_node(pos, new_name) + if is_now_on==1 then + mesecon:receptor_off(pos) + else + mesecon:receptor_on(pos) + end + end + end + + if action == "digiline_send" then + runAction = function(is_on) + if is_on==false then + return + end + local setchan = "pipe_gate" + digiline:receptor_send(pos, digiline.rules.default, channel, "event") + end + end + + local entProcess = nil + + if trig=="item_pass" then + entProcess = function(stack) + if inv:get_stack("main", 1):is_empty() then + runAction(true) + return + end + if inv:get_stack("main", 1):get_name() == stack.name then + runAction(true) + return + end + end + end + + return {act = runAction, entProcess = entProcess,} + end + + local abm = function(pos) + + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + + if buildtest.pipes.types.gate.triggers[meta:get_int("sel")].cont + ~= buildtest.pipes.types.gate.acts[meta:get_int("act")].cont then + return + end + + local trig = buildtest.pipes.types.gate.triggers[meta:get_int("sel")][1] + local action = buildtest.pipes.types.gate.acts[meta:get_int("act")][1] + local runAction = getRunAction(pos).act + + for i=1, 6 do + local newPos = buildtest.posADD(buildtest.toXY(i), pos) + local posname = minetest.get_node(newPos).name + local def = minetest.registered_items[posname] + if strs:starts(trig, "eng_") then + if def~=nil then + local colour = strs:rem_from_start(trig, "eng_") + if def.buildtest~=nil then + if def.buildtest.pump~=nil then + if colour==def.buildtest.pump.colour then + if runAction~=nil then + runAction(true) + return + end + end + end + end + end + end + + + if (trig=="chest_cont" or trig=="chest_room") and buildtest.canPumpInto[posname]~=nil then + local listname = buildtest.get_listname_for_dir_in(buildtest.toXY(i), posname) + --buildtest.canPumpInto[minetest.get_node(newPos).name][1] + local newInv = minetest.get_meta(newPos):get_inventory() + + if trig=="chest_cont" then + -- if minetest.get_node(newPos).name=="default:chest" then + if newInv:contains_item(listname, inv:get_stack("main", 1)) then + if runAction~=nil then + runAction(true) + return + end + end + end + + if trig=="chest_room" then + --if minetest.get_node(newPos).name=="default:chest" then + if newInv:room_for_item(listname, inv:get_stack("main", 1)) then + if runAction~=nil then + runAction(true) + return + end + end + end + end + end + if runAction~=nil then + runAction(false) + end + end + + buildtest.pipes.types.gate.types["buildtest:pipe_gate"..m_on.."_"..name] = { + abm = abm, + getRunAction = getRunAction, + } + + minetest.register_abm({ + nodenames = {"buildtest:pipe_gate"..m_on.."_"..name}, + interval = 1, + chance = 1, + action = abm, + }) + end) +end \ No newline at end of file diff --git a/pipes/gold.lua b/pipes/gold.lua new file mode 100644 index 0000000..d5e4e3b --- /dev/null +++ b/pipes/gold.lua @@ -0,0 +1,57 @@ +buildtest.pipes.types.gold = { + base = "default:gold_ingot", +} + +buildtest.pipes.makepipe(function(set, nodes, count, name, id, clas) + local def = { + sunlight_propagates = true, + paramtype = 'light', + walkable = true, + climbable = false, + diggable = true, + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = nodes + }, + -------------------------- + description = clas.."Buildtest Gold Pipe", + tiles = {"buildtest_pipe_gold.png"}, + groups = {choppy=1,oddly_breakable_by_hand=3}, + buildtest = { + slowdown=0.1, + pipe=1, + connects={ + buildtest.pipes.defaultPipes + }, + }, + drop = { + max_items = 1, + items = { + { items = {'buildtest:pipe_gold_000000_'..id} } + } + }, + mesecons = { + effector = { + action_off = function (pos, node) + local meta = minetest.get_meta(pos) + meta:set_int("on", 1) + end, + action_on = function (pos, node) + local meta = minetest.get_meta(pos) + meta:set_int("on", 0) + end, + }, + }, + on_place = function(itemstack, placer, pointed_thing) + buildtest.pipes.onp_funct(itemstack, placer, pointed_thing) + local meta = minetest.get_meta(pointed_thing.above) + meta:set_int("on", 1) + end, + on_dig = buildtest.pipes.ond_funct, + } + if count~=1 then + def.groups.not_in_creative_inventory=1 + end + minetest.register_node("buildtest:pipe_gold_"..name, def) +end) \ No newline at end of file diff --git a/pipes/iron.lua b/pipes/iron.lua new file mode 100644 index 0000000..bc61b4a --- /dev/null +++ b/pipes/iron.lua @@ -0,0 +1,121 @@ +buildtest.pipes.types.iron = { + base = "default:steel_ingot", +} + +buildtest.pipes.makepipe(function(set, nodes, count, name, id, clas) + local top = "buildtest_pipe_iron_top.png" + local side = "buildtest_pipe_iron.png" + local def = { + sunlight_propagates = true, + paramtype = 'light', + paramtype2= "facedir", + walkable = true, + climbable = false, + diggable = true, + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = nodes + }, + -------------------------- + description = clas.."Buildtest Iron Pipe", + tiles = {top,side,side,side,side,side}, + groups = {cracky=1}, + buildtest = { + slowdown=0.1, + pipe=1, + connects={ + buildtest.pipes.defaultPipes + }, + }, + mesecons = { + effector = { + action_off = function (pos, node) + end, + action_on = function (pos, node) + --minetest.after(0.5, function() -- mesecons seems to call "action_on" BEFORE it sets all the wires to new nodes. -- WRONG! + for i=0, 5 do + local newPos = buildtest.posADD(pos, buildtest.pipes.types.iron.getRawDir(i*4)) + --if mesecon:is_power_on(newPos) then +-- local rule = {x=newPos.x, y=newPos.y, z=newPos.z, name = "in"..i} +-- local invRule = {x=rule.x, y=rule.y, z=rule.z, name = rule.name} +-- if mesecon:is_power_on(mesecon:addPosRule(pos, rule), invRule) +-- and mesecon:rules_link(mesecon:addPosRule(pos, rule), pos) then +-- local def = minetest.registered_items[minetest.get_node(newPos).name] +-- if def~=nil and +-- def.mesecons~=nil and +-- def.mesecons.receptor~=nil and +-- def.mesecons.receptor.state=="on" then + if strs:starts(minetest.get_node(newPos).name, "buildtest:pipe_meseconon_") then + + node.param2 = i * 4 + minetest.set_node(pos, node) +-- print("setting facedir to: "..node.param2) + end + end + --end) + end, + }, + }, + drop = { + max_items = 1, + items = { + { items = {'buildtest:pipe_iron_000000_'..id} } + } + }, + on_place = function(itemstack, placer, pointed_thing) + buildtest.pipes.onp_funct(itemstack, placer, pointed_thing) + --local meta = minetest.get_meta(pointed_thing.above) + --meta:set_int("facedir", 1) + end, + on_dig = buildtest.pipes.ond_funct, + on_punch = function(pos, node, puncher) + --node.param2 = node.param2 + 1 + --print("rotation: "..node.param2) +-- local meta = minetest.get_meta(pos) + --local rot = meta:get_int("rot") + local rot = node.param2 + rot = rot + 4 + if rot >= 24 then rot = 0 end + --meta:set_int("rot", rot) + node.param2 = rot + minetest.set_node(pos, node) + --print("rotation: "..rot) + --buildtest.pipes.processNode(pos) + end, + } + if count~=1 then + def.groups.not_in_creative_inventory=1 + end + minetest.register_node("buildtest:pipe_iron_"..name, def) +end) + +buildtest.pipes.types.iron.getRawDir = function(rot) + if rot>=0 and rot<=3 then + return {x= 0,y= 1,z= 0} + end + if rot>=4 and rot<=7 then + return {x= 0,y= 0,z= 1} + end + if rot>=8 and rot<=11 then + return {x= 0,y= 0,z=-1} + end + if rot>=12 and rot<=15 then + return {x= 1,y= 0,z= 0} + end + if rot>=16 and rot<=19 then + return {x=-1,y= 0,z= 0} + end + if rot>=20 and rot<=23 then + return {x= 0,y=-1,z= 0} + end + return nil +end + +buildtest.pipes.types.iron.getDir = function(pos) + --print("ok") + local node=minetest.get_node(pos) + if node==nil then return nil end + local rot = node.param2 + return buildtest.pipes.types.iron.getRawDir(rot) +end \ No newline at end of file diff --git a/pipes/mesecon.lua b/pipes/mesecon.lua new file mode 100644 index 0000000..940f4a1 --- /dev/null +++ b/pipes/mesecon.lua @@ -0,0 +1,66 @@ +buildtest.pipes.types.mesecon = { + base = "mesecons:wire_00000000_off", + outname = "buildtest:pipe_meseconoff_000000_0", +} + +local mesecons_rules={{x=0,y=0,z=1},{x=0,y=0,z=-1},{x=1,y=0,z=0},{x=-1,y=0,z=0},{x=0,y=1,z=0},{x=0,y=-1,z=0}} + +for state, invState in pairs({off="on", on="off"}) do + local top = "buildtest_pipe_mesecon.png^wires_"..state..".png" + buildtest.pipes.makepipe(function(set, nodes, count, name, id, clas) + local side = "buildtest_pipe_mesecon.png" + local def = { + sunlight_propagates = true, + paramtype = 'light', + walkable = true, + climbable = false, + diggable = true, + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = nodes + }, + -------------------------- + description = clas.."Buildtest Mesecon Pipe", + tiles = {top,side,side,side,side,side}, + groups = {choppy=1,oddly_breakable_by_hand=3}, + buildtest = { + pipe=1, + slowdown=0.1, + connects={ + --"default:chest", + buildtest.pipes.defaultPipes + }, + }, + mesecons={ + conductor={ + state=state, + rules=mesecons_rules, + [invState.."state"]="buildtest:pipe_mesecon"..invState.."_"..name + } + }, + drop = { + max_items = 1, + items = { + { items = {'buildtest:pipe_meseconoff_000000_'..id} } + } + }, + on_place = buildtest.pipes.onp_funct, + on_dig = buildtest.pipes.ond_funct, + } + if count~=1 or state~="off" then + def.groups.not_in_creative_inventory=1 + end +-- def.node_box.fixed[#def.node_box.fixed+1] = {1/16, 0.25, -1/16, 8/16, 0.25+1/16, 1/16} +-- local size = #def.node_box.fixed +-- for i=2, size do -- skip the middle bit +-- local newID = #def.node_box.fixed + 1 +-- def.node_box.fixed[newID] = def.node_box.fixed[i] +-- +-- def.node_box.fixed[newID][2] = 0.25 +-- def.node_box.fixed[newID][2] = 0.25 + 1/16 +-- end + + minetest.register_node("buildtest:pipe_mesecon"..state.."_"..name, def) + end) +end \ No newline at end of file diff --git a/pipes/obsidian.lua b/pipes/obsidian.lua new file mode 100644 index 0000000..b1241b3 --- /dev/null +++ b/pipes/obsidian.lua @@ -0,0 +1,41 @@ +buildtest.pipes.types.obsidian = { + base = "default:obsidian", +} + +buildtest.pipes.makepipe(function(set, nodes, count, name, id, clas) + local def = { + sunlight_propagates = true, + paramtype = 'light', + walkable = true, + climbable = false, + diggable = true, + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = nodes + }, + -------------------------- + description = clas.."Buildtest Obsidian Pipe", + tiles = {"buildtest_pipe_obsidian.png"}, + groups = {choppy=1,oddly_breakable_by_hand=3}, + buildtest = { + slowdown=0.1, + pipe=1, + connects={ + buildtest.pipes.defaultPipes + }, + }, + drop = { + max_items = 1, + items = { + { items = {'buildtest:pipe_obsidian_000000_'..id} } + } + }, + on_place = buildtest.pipes.onp_funct, + on_dig = buildtest.pipes.ond_funct, + } + if count~=1 then + def.groups.not_in_creative_inventory=1 + end + minetest.register_node("buildtest:pipe_obsidian_"..name, def) +end) \ No newline at end of file diff --git a/pipes/pipes_defs.lua b/pipes/pipes_defs.lua new file mode 100644 index 0000000..8a9712f --- /dev/null +++ b/pipes/pipes_defs.lua @@ -0,0 +1,250 @@ +buildtest.pipes={} +buildtest.pipes.shapes={} +buildtest.pipes.types = {} +buildtest.pipes.makepipe = function(go) + local count=0 + for wp=0, 0 do -- was for wp=0, 1 do + for f=0,1 do + for e=0,1 do + for d=0,1 do + for c=0,1 do + for b=0,1 do + for a=0,1 do + count=count+1 + local set={a,b,c,d,e,f} + buildtest.pipes.shapes[count]=set + local nodeboxCENTERE={-0.25,-0.25,-0.25, 0.25,0.25,0.25} + ------------------------------------ + local left={-0.5,-0.25,-0.25, -0.25,0.25,0.25} + local right={0.25,-0.25,-0.25, 0.5,0.25,0.25} + local top={-0.25,-0.25,0.25, 0.25,0.25,0.5} + local bttm={-0.25,-0.25,-0.25, 0.25,0.25,-0.5} + local high={-0.25,0.25,-0.25, 0.25,0.5,0.25} + local low={-0.25,-0.5,-0.25, 0.25,-0.25,0.25} + local nodes={nodeboxCENTERE} + if(set[1]==1) then + nodes[#nodes+1]=left + end + if(set[2]==1) then + nodes[#nodes+1]=top + end + if(set[3]==1) then + nodes[#nodes+1]=right + end + if(set[4]==1) then + nodes[#nodes+1]=bttm + end + if(set[5]==1) then + nodes[#nodes+1]=high + end + if(set[6]==1) then + nodes[#nodes+1]=low + end + ----------------------------------------- + local clas="" + if wp==1 then + clas="Waterproof "..clas + end + ----------------------------------------- + go(set, nodes, count, a..b..c..d..e..f.."_"..wp, wp, clas) + end + end + end + end + end + end + count=0 -- it relly is a diffrent type of pipe + end +end + +buildtest.pipes.onp_funct = function(itemstack, placer, pointed_thing) + + local itemstk=minetest.item_place(itemstack, placer, pointed_thing) + buildtest.pipes.processNode(pointed_thing.above) + for i=1,6 do + buildtest.pipes.processNode(buildtest.posADD(pointed_thing.above,buildtest.toXY(i))) + end + return itemstk +end + +buildtest.pipes.getConns = function(pos) + local oks={} + for i=1,6 do + local tmpPos=buildtest.posADD(pos,buildtest.toXY(i)) + if buildtest.pipeAt(tmpPos)==true then + oks[#oks+1] = tmpPos + end + end + return oks +end + +buildtest.pipes.ond_funct = function(pos, node, digger) + minetest.node_dig(pos, node, digger) + + for i=1,6 do + buildtest.pipes.processNode(buildtest.posADD(pos,buildtest.toXY(i))) + end +end + +buildtest.pipes.processNode=function(pos) + --print(minetest.get_node(pos).name) + if buildtest.pipeAt(pos)==false then + return + end + + local j={} + for i=1,6 do + j[i]=buildtest.pipeConn(buildtest.posADD(pos,buildtest.toXY(i)), pos) + end + + local node = minetest.get_node(pos) + if strs:starts(node.name, "buildtest:pipe_")==true then + local param2 = node.param2 + local type=strs:rem_from_start(minetest.get_node(pos).name,"buildtest:pipe_") + local id=type:split("_")[3] + type=type:split("_")[1] + node.name = "buildtest:pipe_"..type.."_"..buildtest.arrToStr(j,"").."_"..id + print(node.name) + --minetest.set_node(pos, node) + hacky_swap_node(pos, node.name) + end + return j +end + +function hacky_swap_node(pos,name) + local node = minetest.get_node(pos) + local meta = minetest.get_meta(pos) + local meta0 = meta:to_table() + if node.name == name then + return + end + node.name = name + local meta0 = meta:to_table() + minetest.set_node(pos,node) + meta = minetest.get_meta(pos) + meta:from_table(meta0) +end + +buildtest.toXY = function(i) + local pos={x=0,y=0,z=0} + if i==1 then pos.x=-1 + elseif i==2 then pos.z=1 + elseif i==3 then pos.x=1 + elseif i==4 then pos.z=-1 + elseif i==5 then pos.y=1 + elseif i==6 then pos.y=-1 + end + return pos +end + +buildtest.posADD = function(a,b) + local pos={x=0,y=0,z=0} + pos.x=a.x+b.x + pos.y=a.y+b.y + pos.z=a.z+b.z + return pos +end + +buildtest.posMult = function(a,b) + local pos={x=0,y=0,z=0} + pos.x=a.x*b + pos.y=a.y*b + pos.z=a.z*b + return pos +end + +buildtest.pipeAt = function(pos) + return buildtest.pipeConn(pos, nil) +end + +buildtest.pipeConn = function(pos, refpos) + if refpos~=nil then + local def=minetest.registered_items[minetest.get_node(refpos).name] + if def==nil then return false end + if def.buildtest==nil then return false end + if def.buildtest.pipe~=1 then return false end + if def.buildtest.connects==nil then return false end + --if strs:inarray(minetest.get_node(pos).name,def.buildtest.connects)==false then return false end + if def.buildtest.disconnects~=nil then + for i=1,#def.buildtest.disconnects do + if buildtest.pipes.pipeInArray(minetest.get_node(pos).name, def.buildtest.disconnects[i])==true then return false end + end + end + + for i=1,#def.buildtest.connects do + if buildtest.pipes.pipeInArray(minetest.get_node(pos).name, def.buildtest.connects[i])==true then break end + if i==#def.buildtest.connects then return false end + end + else +-- if strs:starts(minetest.get_node(pos).name,"buildtest:pipe_")==false then +-- --print("hv eletro : ok") +-- return false +-- end + local def = minetest.registered_items[minetest.get_node(pos).name] + if def==nil then return false end + if def.buildtest==nil then return false end + if def.buildtest.pipe~=1 then return false end + end + return true +end + +buildtest.pipes.pipeInArray = function(node, set) + for i=1, #set do + local name = set[i] + if strs:starts(node, name) then + return true + end + end + return false +end + +buildtest.arrToStr=function(t,tok) + if t==nil then + return "" + end + local str="" + local i=0 + for i=1,#t do + local tmpStr=t[i] + if tmpStr==true then tmpStr="1" end + if tmpStr==false then tmpStr="0" end + if str~=nil and str~="" then + str=str..tok + end + str=str..tmpStr + end + return str +end + +buildtest.pipes.defaultPipes = { + ----------- ITEST ------------- + "itest:macerator", + "itest:macerator_active", + "itest:iron_furnace_active", + "itest:iron_furnace", + "itest:electric_furnace_active", + "itest:electric_furnace", + "itest:extractor_active", + "itest:extractor", + "itest:generator_active", + "itest:generator", + ----------- ITEST ------------- + --"buildtest:pump_stirling", + "default:furnace_active", + "buildtest:autocraft", + "default:furnace", + "default:chest", + ----------- + "buildtest:pipe_meseconoff", + "buildtest:pipe_meseconon", + "buildtest:pipe_sandstone", + "buildtest:pipe_obsidian", + "buildtest:pipe_diamond", + "buildtest:pipe_stripe", + "buildtest:pipe_cobble", + "buildtest:pipe_stone", + "buildtest:pipe_iron", + "buildtest:pipe_gold", + "buildtest:pipe_gate", + --"buildtest:pipe_emr", +} \ No newline at end of file diff --git a/pipes/pipes_init.lua b/pipes/pipes_init.lua new file mode 100644 index 0000000..dc421ef --- /dev/null +++ b/pipes/pipes_init.lua @@ -0,0 +1,12 @@ +dofile(minetest.get_modpath("buildtest").."/pipes/wood.lua") +dofile(minetest.get_modpath("buildtest").."/pipes/cobble.lua") +dofile(minetest.get_modpath("buildtest").."/pipes/stone.lua") +dofile(minetest.get_modpath("buildtest").."/pipes/iron.lua") +dofile(minetest.get_modpath("buildtest").."/pipes/gold.lua") +dofile(minetest.get_modpath("buildtest").."/pipes/diamond.lua") +dofile(minetest.get_modpath("buildtest").."/pipes/obsidian.lua") +dofile(minetest.get_modpath("buildtest").."/pipes/sandstone.lua") +dofile(minetest.get_modpath("buildtest").."/pipes/emriald.lua") +dofile(minetest.get_modpath("buildtest").."/pipes/gate.lua") +dofile(minetest.get_modpath("buildtest").."/pipes/stripe.lua") +dofile(minetest.get_modpath("buildtest").."/pipes/mesecon.lua") \ No newline at end of file diff --git a/pipes/sandstone.lua b/pipes/sandstone.lua new file mode 100644 index 0000000..e4ffeb8 --- /dev/null +++ b/pipes/sandstone.lua @@ -0,0 +1,44 @@ +buildtest.pipes.types.sandstone = { + base = "default:sandstone", +} + +buildtest.pipes.makepipe(function(set, nodes, count, name, id, clas) + local def = { + sunlight_propagates = true, + paramtype = 'light', + walkable = true, + climbable = false, + diggable = true, + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = nodes + }, + -------------------------- + description = clas.."Buildtest Sandstone Pipe", + tiles = {"buildtest_pipe_sandstone.png"}, + groups = {choppy=1,oddly_breakable_by_hand=3}, + buildtest = { + slowdown=1.1, + pipe=1, + connects={ + buildtest.pipes.defaultPipes, + { + "buildtest:pipe_stone", + }, + }, + }, + drop = { + max_items = 1, + items = { + { items = {'buildtest:pipe_sandstone_000000_'..id} } + } + }, + on_place = buildtest.pipes.onp_funct, + on_dig = buildtest.pipes.ond_funct, + } + if count~=1 then + def.groups.not_in_creative_inventory=1 + end + minetest.register_node("buildtest:pipe_sandstone_"..name, def) +end) \ No newline at end of file diff --git a/pipes/stone.lua b/pipes/stone.lua new file mode 100644 index 0000000..99483d3 --- /dev/null +++ b/pipes/stone.lua @@ -0,0 +1,44 @@ +buildtest.pipes.types.stone = { + base = "default:stone", +} + +buildtest.pipes.makepipe(function(set, nodes, count, name, id, clas) + local def = { + sunlight_propagates = true, + paramtype = 'light', + walkable = true, + climbable = false, + diggable = true, + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = nodes + }, + -------------------------- + description = clas.."Buildtest Stone Pipe", + tiles = {"buildtest_pipe_stone.png"}, + groups = {choppy=1,oddly_breakable_by_hand=3}, + buildtest = { + slowdown=0.025, + pipe=1, + connects={ + buildtest.pipes.defaultPipes + }, + disconnects = {{ + "buildtest:pipe_cobble", + }}, + }, + drop = { + max_items = 1, + items = { + { items = {'buildtest:pipe_stone_000000_'..id} } + } + }, + on_place = buildtest.pipes.onp_funct, + on_dig = buildtest.pipes.ond_funct, + } + if count~=1 then + def.groups.not_in_creative_inventory=1 + end + minetest.register_node("buildtest:pipe_stone_"..name, def) +end) \ No newline at end of file diff --git a/pipes/stripe.lua b/pipes/stripe.lua new file mode 100644 index 0000000..2b2e765 --- /dev/null +++ b/pipes/stripe.lua @@ -0,0 +1,48 @@ +minetest.register_craft({ + output = "buildtest:pipe_stripe_000000_0", + recipe = { + {"dye:black", "default:glass", "dye:yellow"}, + } +}) + +buildtest.pipes.makepipe(function(set, nodes, count, name, id, clas) + local def = { + sunlight_propagates = true, + paramtype = 'light', + walkable = true, + climbable = false, + diggable = true, + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = nodes + }, + -------------------------- + description = clas.."Buildtest Stripe Pipe", + tiles = {"buildtest_pipe_stripe.png"}, + groups = {choppy=1,oddly_breakable_by_hand=3}, + buildtest = { + slowdown=0.025, + pipe=1, + connects={ + buildtest.pipes.defaultPipes + }, + disconnects = {{ + "default:chest", + "default:chest_locked", + }}, + }, + drop = { + max_items = 1, + items = { + { items = {'buildtest:pipe_stripe_000000_'..id} } + } + }, + on_place = buildtest.pipes.onp_funct, + on_dig = buildtest.pipes.ond_funct, + } + if count~=1 then + def.groups.not_in_creative_inventory=1 + end + minetest.register_node("buildtest:pipe_stripe_"..name, def) +end) \ No newline at end of file diff --git a/pipes/wood.lua b/pipes/wood.lua new file mode 100644 index 0000000..ce7a54b --- /dev/null +++ b/pipes/wood.lua @@ -0,0 +1,45 @@ +buildtest.pipes.types.wood = { + base = "default:wood", +} + +buildtest.pipes.makepipe(function(set, nodes, count, name, id, clas) + local def = { + sunlight_propagates = true, + paramtype = 'light', + walkable = true, + climbable = false, + diggable = true, + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = nodes + }, + -------------------------- + description = clas.."Buildtest Wood Pipe", + tiles = {"buildtest_pipe_wood.png"}, + groups = {choppy=1,oddly_breakable_by_hand=3}, + buildtest = { + pipe=1, + slowdown=0.1, + connects={ + --"default:chest", + buildtest.pipes.defaultPipes + }, + disconnects = {{ + "default:chest", + }}, + }, + drop = { + max_items = 1, + items = { + { items = {'buildtest:pipe_wood_000000_'..id} } + } + }, + on_place = buildtest.pipes.onp_funct, + on_dig = buildtest.pipes.ond_funct, + } + if count~=1 then + def.groups.not_in_creative_inventory=1 + end + minetest.register_node("buildtest:pipe_wood_"..name, def) +end) \ No newline at end of file diff --git a/pumps/combustion.lua b/pumps/combustion.lua new file mode 100644 index 0000000..a25391c --- /dev/null +++ b/pumps/combustion.lua @@ -0,0 +1,174 @@ +buildtest.pumps.types.combustion = { + get_pump_active_formspec = function(heat, fuel) + local formspec = + "size[8,9]".. + --"image[2,2;1,1;default_furnace_fire_bg.png^[lowpart:"..percent..":default_furnace_fire_fg.png]".. + "list[context;fuel;2.5,2;1,1;]".. + + "image[6.5,0;1,5;default_lava.png^[lowpart:"..(heat)..":default_water.png]]".. + --"image[6.5,0;1,5;default_water.png]".. + --"image[6.5,"..(5 - heat * 5 / 4)..";1,1;buildtest_maker.png]".. + + "image[5.5,0;1,5;oil_oil.png^[lowpart:"..(fuel)..":oil_fuel.png]]".. + --"image[5.5,0;1,5;oil_fuel.png]".. + --"image[5.5,"..(5 - fuel * 5 / 100)..";1,1;buildtest_maker.png]".. + + "list[context;heat;2.5,3;1,1;]".. + "list[context;out;3.5,3;2,2;]".. + "list[current_player;main;0,5;8,4;]" + return formspec + end, + set_pump_active_formspec = function(pos) + local meta = minetest.get_meta(pos) + local fuel_level = meta:get_int("fuel") + --local max_fuel = meta:get_int("maxfuel") + local max_fuel = 1000 + local fuel = (fuel_level / max_fuel) * 100 + local def = minetest.registered_items[minetest.get_node(pos).name] + --local water = def.buildtest.pump.typeId * 100 / 4 + local water = meta:get_int("water") + local formspec = buildtest.pumps.types.combustion.get_pump_active_formspec(water, (fuel or 0)) + meta:set_string("formspec", formspec) + end, + handleCooling = function(pos, inv) + local meta = minetest.get_meta(pos) + local def = minetest.registered_items[minetest.get_node(pos).name] + ---------------------------------------------------- + if minetest.get_node(pos).name=="buildtest:pump_combustion_yellow" then + --print(meta:get_int("water")) + if meta:get_int("water") > 1 then + meta:set_int("water", meta:get_int("water") - 2) + buildtest.pumps.types.combustion.set_pump_active_formspec(pos) + return false + end + end + if minetest.get_node(pos).name=="buildtest:pump_combustion_red" then + if meta:get_int("water") > 20 then + meta:set_int("water", meta:get_int("water") - 20) + buildtest.pumps.hacky_swap_node(pos, def.buildtest.pump.prev) + buildtest.pumps.types.combustion.set_pump_active_formspec(pos) + return true + end + end + ------------------------------------------------------ + if inv:get_stack("heat", 1):is_empty() then + return false + end + local name = inv:get_stack("heat", 1):get_name() + if name=="bucket:bucket_lava" then + if def.buildtest.pump.next~=nil then + buildtest.pumps.hacky_swap_node(pos, def.buildtest.pump.next) + inv:set_stack("heat", 1, ItemStack(nil)) + inv:add_item("out", ItemStack("bucket:bucket_empty")) + return true + end + end + if name=="bucket:bucket_water" then + --if def.buildtest.pump.prev~=nil then + if meta:get_int("water") < 80 then + --buildtest.pumps.hacky_swap_node(pos, def.buildtest.pump.prev) + meta:set_int("water", meta:get_int("water") + 20) + inv:set_stack("heat", 1, ItemStack(nil)) + inv:add_item("out", ItemStack("bucket:bucket_empty")) + buildtest.pumps.types.combustion.set_pump_active_formspec(pos) + return true + end + end + return false + end, +} + +buildtest.pumps.register_pump("buildtest:pump_combustion", "default_steel_block.png", { + description = "Buildtest Combustion Engine", + on_construct = function(pos) + local meta = minetest.get_meta(pos) + --------------------------- + local formspec = buildtest.pumps.types.combustion.get_pump_active_formspec(0, 1) + --------------------------- + meta:set_string("formspec", formspec) + meta:set_int("water", 0) + --------------------------- + local inv = meta:get_inventory() + inv:set_size("fuel", 1) + inv:set_size("heat", 1) + inv:set_size("out", 2*2) + buildtest.pumps.on_construct(pos) + end, + can_dig = function(pos,player) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + if not inv:is_empty("fuel") then + return false + end + return true + end, +}, +{ + abm = function(pos) + buildtest.pumps.send(pos) + end, + runConf = function(pos) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + local isBurning = function() + local fuel_level = (meta:get_int("fuel") or 0) + if fuel_level > 20 then + fuel_level = fuel_level - 20 + meta:set_int("fuel", fuel_level) + buildtest.pumps.types.combustion.set_pump_active_formspec(pos) + return true + end + return false + end + + if buildtest.pumps.types.combustion.handleCooling(pos, inv)==true then + return false + end + + if inv:get_stack("fuel", 1):is_empty() then + return isBurning() + end + + local items = inv:get_list("fuel") + + local itemName = items[1]:get_name() + if itemName ~= "bucket:bucket_lava" and itemName ~= "oil:fuel_bucket" and itemName ~= "oil:bucket_oil" then + return isBurning() + end +-- print("item: "..inv:get_stack("fuel", 1):get_name()) + local fuel + local sub + fuel, sub = minetest.get_craft_result({ + method="fuel", + width=1, + items = items, + }) + if fuel.time <= 0 then + return isBurning() + end + --meta:set_int("maxfuel", fuel.time) + local fuel_level = (meta:get_int("fuel") or 0) + if fuel.time + fuel_level >= 1000 then + return isBurning() + end + meta:set_int("fuel", fuel.time + fuel_level) + inv:set_list("fuel", sub.items) + buildtest.pumps.types.combustion.set_pump_active_formspec(pos) +-- print("pumping") + return isBurning() + end, + + canHeat = function(pos) + local meta = minetest.get_meta(pos) + if minetest.get_node(pos).name=="buildtest:pump_combustion_yellow" then + if meta:get_int("water") > 20 then + return false + end + end + return true + end, + + moveCount = 99, + explodes = true, +} +) \ No newline at end of file diff --git a/pumps/graphics/init.lua b/pumps/graphics/init.lua new file mode 100644 index 0000000..74d7505 --- /dev/null +++ b/pumps/graphics/init.lua @@ -0,0 +1,66 @@ +buildtest.pumps.gfx = { + frames = { + {90, 60}, + {45, 45}, + {15, 30}, + {1 , 15}, + } +} + +local def = { + collisionbox = {0,0,0,0,0,0}, + visual = "mesh", + mesh = "buildtest_pump.x", + visual_size = {x=5, y=5}, + on_step = function(self, dtime) + self.timer = self.timer + dtime + if self.timer > 10 then +-- print("removing entity") + self.object:remove() + return + end + + if self.config~=nil then -- self.timer > 1 and +-- print("new entity") + self:setTexture(self.config.texture) + self:setAnim(self.config.speed) + self.config = nil + end + end, + setTexture = function(self, texture) + prop = { + visual_size = {x=5, y=5}, + drawtype = "front", + visual = "mesh", + mesh = "buildtest_pump.x", + textures = {texture}, + } + self.object:set_properties(prop) + end, + setAnim = function(self, level) + local frameSeq = buildtest.pumps.gfx.frames[level or 1] + self.object:set_animation( + { + x = frameSeq[1] -- start + ,y = frameSeq[1] + frameSeq[2] -- end + }, + 15 --frame rate + , 0 + ) + end, + get_staticdata = function(self) + return minetest.serialize(config) + end, + on_activate = function(self, staticdata) +-- if staticdata~=nil and staticdata~="" then +-- self.config = minetest.deserialize(staticdata) +-- return +-- end +-- print("removeing entity") +-- self.object:remove() + end, + timer = 0, + config = nil, +} + +minetest.register_entity("buildtest:pump_ent", def) \ No newline at end of file diff --git a/pumps/graphics/init_old.lua b/pumps/graphics/init_old.lua new file mode 100644 index 0000000..723bd32 --- /dev/null +++ b/pumps/graphics/init_old.lua @@ -0,0 +1,122 @@ +local def = { + collisionbox = {0,0,0,0,0,0}, + visual = "mesh", + mesh = "buildtest_pump.x", + --textures = {"mobs_dirt_monster.png"}, + visual_size = {x=5, y=5}, +-- drawtype = "front", + --paramtype = "light", + on_step = function(self, dtime) +-- print("ok") + if self==nil or self.homepos==nil or self.homename==nil then + --self.object:remove() + return + end + if self.reset==true then + self.resetSelf(self) + return + end + --if self.inInit==true then return end + + self.totTime=self.totTime+dtime + if self.totTime > 1 then + self.object:setpos(self.homepos) + self.totTime = 0 --self.totTime - 1 / self.speed + if minetest.get_node(self.homepos).name ~= self.homename then + self.object:remove() + return + end + local def = minetest.registered_items[minetest.get_node(self.homepos).name] + local meta = minetest.get_meta(self.homepos) + local level = meta:get_int("level") or 1 + self.speed = level + local texture = def.buildtest.pump.textures[1] + if def.buildtest.pump.textures[level]~=nil then + texture = texture.."^"..def.buildtest.pump.textures[level] + end + + self.setTexture(self.object, texture) + self.setAnim(self, level) + end + end, + speed = 1, + totTime = 0, + lastLevel = -1, + reset = false, + inInit = true, + inited = false, + setTexture = function(self, texture) + prop = { + visual_size = {x=5, y=5}, + drawtype = "front", + visual = "mesh", + mesh = "buildtest_pump.x", + textures = {texture}, + } + self:set_properties(prop) + end, + resetTexture = function(self) + local def = minetest.registered_items[minetest.get_node(self.homepos).name] + local texture = def.buildtest.pump.textures[1] + self.setTexture(self.object, texture) + end, + resetSelf = function(self) + --print("a: ok") + self.reset = false + self.object:setpos(self.homepos) + self.resetAnim(self) + self.resetTexture(self) +-- self.inInit = false + end, + setAnim = function(self, level) + if self.lastLevel ~= level then + self.lastLevel = level + --print("ok") + self.object:set_animation( + { + x=1 -- start + ,y=30 -- end + }, + level*15 --frame rate + --15 + , 0 + ) + end + end, + resetAnim = function(self) + local meta = minetest.get_meta(self.homepos) + local level = meta:get_int("level") or 1 + self.setAnim(self, level) + end, + get_staticdata = function(self) + if self.homepos==nil then return "?" end + --return minetest.pos_to_string(self.homepos) + --local homepos = minetest.pos_to_string(self.homepos) +-- self.homeposAsText = minetest.pos_to_string(self.homepos) +-- --local texture = self.textures[1] +-- return minetest.serialize({ +---- self.homeposAsText, +-- self.homename, +-- }) + return minetest.pos_to_string(self.homepos) or "?" + end, + on_activate = function(self, staticdata) +-- local item = minetest.deserialize(staticdata) +-- self.homepos = minetest.string_to_pos(item.homeposAsText) +-- self.homename = item.homename +-- --self.setTexture(self, "buildtest_pump_mesecon.png") +-- self.reset = true +-- print("ok") +-- if self.handmade==true then return end + if staticdata==nil or staticdata=="" then return end + self.object:remove() + -------------------- + -------------------- +-- local pos = minetest.string_to_pos(staticdata) +-- if pos~=nil then +-- buildtest.pumps.on_construct(pos) +-- end + end, +} + +minetest.register_entity("buildtest:pump_ent", def) \ No newline at end of file diff --git a/pumps/mesecon.lua b/pumps/mesecon.lua new file mode 100644 index 0000000..f235fb5 --- /dev/null +++ b/pumps/mesecon.lua @@ -0,0 +1,14 @@ +buildtest.pumps.register_pump("buildtest:pump_mesecon", "default_wood.png", { + description = "Buildtest Mesecon Pump", +}, +{ + abm = function(pos) + buildtest.pumps.send(pos) + end, + + runConf = function(pos) + local meta = minetest.get_meta(pos) + return true + end, +} +) \ No newline at end of file diff --git a/pumps/pump.lua b/pumps/pump.lua new file mode 100644 index 0000000..c49260e --- /dev/null +++ b/pumps/pump.lua @@ -0,0 +1,25 @@ +minetest.register_node("buildtest:pump", { + --tiles = {"buildtest_pump_mesecon.png"}, + description = "Buildtest Liquids Pump", + groups = {choppy=1,oddly_breakable_by_hand=3}, + paramtype = "light", + paramtype2 = "facedir", + sunlight_propagates = true, + buildtest = { + pipe=1, + connects={ + --{"buildtest:pipe_wood"}, + buildtest.pipes.defaultPipes, + }, + }, + on_construct = function(pos) + end, + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = {{-0.5,-0.5,-0.5,0.5,0.5,0.5}} + }, + selection_box = {{ + 0.5,0.5,0.5,-0.5,-0.5,-0.5, + }}, +}) \ No newline at end of file diff --git a/pumps/pump_init.lua b/pumps/pump_init.lua new file mode 100644 index 0000000..31420b5 --- /dev/null +++ b/pumps/pump_init.lua @@ -0,0 +1,379 @@ +buildtest.pumps = { + types = {}, + colours = { + [1] = "blue", + [2] = "green", + [3] = "yellow", + [4] = "red", + }, + pulls = { + ["default:chest"] = {"main"}, + ["default:furnace_active"] = {"dst"}, + ["default:furnace"] = {"dst"}, + ["buildtest:autocraft"] = {"in"}, + ["itest:macerator"] = {"dst"}, + ["itest:macerator_active"] = {"dst"}, + ["itest:iron_furnace_active"] = {"dst"}, + ["itest:iron_furnace"] = {"dst"}, + ["itest:electric_furnace_active"] = {"dst"}, + ["itest:electric_furnace"] = {"dst"}, + ["itest:extractor_active"] = {"dst"}, + ["itest:extractor"] = {"dst"}, + }, + hacky_swap_node = function(pos, name) + local node = minetest.get_node(pos) + local meta = minetest.get_meta(pos) + --local meta0 = meta:to_table() + if node.name == name then + return + end + node.name = name + local meta0 = meta:to_table() + minetest.set_node(pos,node) + meta = minetest.get_meta(pos) + meta:from_table(meta0) + end, + temp = function(pos, amnt) + local prev = minetest.registered_items[minetest.get_node(pos).name].buildtest.pump[amnt] + if prev~=nil then + buildtest.pumps.hacky_swap_node(pos, prev) + end + end, + findpipe = function(pos) + for i=1,6 do + local tmpPos=buildtest.posADD(pos,buildtest.toXY(i)) + if buildtest.pipeAt(tmpPos)==true then + return tmpPos + end + end + return {x=pos.x,y=pos.y+1,z=pos.z} + end, + findchest = function(pos) + for i=1,6 do + local tmpPos=buildtest.posADD(pos,buildtest.toXY(i)) + if buildtest.pumps.pulls[minetest.get_node(tmpPos).name]~=nil then + return tmpPos + end + end + return {x=pos.x,y=pos.y+1,z=pos.z} + end, +} + +buildtest.pumps.register_pump = function(name, textureBase, flags, def) + local abm = def.abm + for typeId, typeName in pairs(buildtest.pumps.colours) do + local sideTexture = textureBase.."^buildtest_pump_mask_"..typeName.."_side.png" + local def = { + tiles = {textureBase, textureBase, sideTexture, sideTexture, sideTexture, sideTexture}, + groups = {choppy=1,oddly_breakable_by_hand=3}, + paramtype = "light", + paramtype2 = "facedir", + sunlight_propagates = true, + buildtest = { + pipe=1, + connects={ +-- "buildtest:pipe_wood", + }, + pump = { +-- maxSpeed = 0.5, +-- moveCount = 1, +-- maxLevel = 5, + upTime = 10, + next = name.."_"..(buildtest.pumps.colours[typeId + 1] or typeName), + prev = name.."_"..(buildtest.pumps.colours[typeId - 1] or typeName), + colour = typeName, + stepSpeed = typeId,--#buildtest.pumps.colours + 1 - typeId, + typeId = typeId, + moveCount = def.moveCount or 1, + runConf = def.runConf, + explodes = def.explodes or false, + canHeat = def.canHeat, + +-- textures = { +-- "buildtest_pump_mesecon.png", +-- "buildtest_pump_blue.png", +-- "buildtest_pump_green.png", +-- "buildtest_pump_orange.png", +-- "buildtest_pump_red.png", +-- } + } + }, + on_construct = function(pos) + buildtest.pumps.on_construct(pos) + end, + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = { + --{0,0,0,0,0,0}, + {-5/16, -5/16, -5/16, 5/16, 8/16, 5/16}, + {-8/16, -8/16, -8/16, 8/16, -5/16, 8/16}, + } + }, + drop = { + max_items = 1, + items = { + { items = {name.."_"..buildtest.pumps.colours[1]} } + } + }, + mesecons = { + effector = { + action_off = function (pos, node) + local meta = minetest.get_meta(pos) + meta:set_int("on", 0) + end, + action_on = function (pos, node) + local meta = minetest.get_meta(pos) + meta:set_int("on", 1) + end, + }, + }, + -- selection_box = {{ + -- 0.5,0.5,0.5,-0.5,-0.5,-0.5, + -- }}, + } + for name, val in pairs(flags) do + def[name] = val + end + if typeId~=1 then + def.groups.not_in_creative_inventory=1 + end + if buildtest.pumps.colours[typeId + 1]==nil then + def.buildtest.pump.next=nil + end + if buildtest.pumps.colours[typeId - 1]==nil then + def.buildtest.pump.prev=nil + end + minetest.register_node(name.."_"..typeName, def) + + minetest.register_abm({ + nodenames = {name.."_"..typeName}, + interval = 0.5, + chance = 1, + action = abm + }) + end +end + +buildtest.pumps.send = function(pos) +-- print("ok") +-- local facedir = minetest.get_node(pos).param2 +-- facedir = buildtest.facedir_to_dir(facedir) +-- facedir = buildtest.posADD(pos,facedir) +-- local chestpos=buildtest.pipes.getConns(facedir) +-- if #chestpos == 0 then +-- return +-- end +-- chestpos = chestpos[0] + local pipepos = buildtest.pumps.findpipe(pos) --{x=pos.x,y=pos.y+1,z=pos.z} + local chestpos = buildtest.pumps.findchest(pipepos) --{x=pipepos.x,y=pipepos.y+1,z=pipepos.z} + local speedup = 0 + local thisMeta = minetest.get_meta(pos) + + if thisMeta:get_int("on")~=1 then + buildtest.pumps.temp(pos, "prev") + return + end + + local def = minetest.registered_items[minetest.get_node(pos).name] + if def.buildtest.pump~=nil then + + if def.buildtest.pump.runConf~=nil then + if def.buildtest.pump.runConf(pos)==false then + buildtest.pumps.temp(pos, "prev") + return + end + end + + local timerCount = thisMeta:get_int("timer") or 0 + --if timerCount==nil then timerCount=0 end + timerCount = timerCount + 1 +-- if timerCount % def.buildtest.pump.upTime == 0 then +-- local id +-- for name,value in pairs(minetest.luaentities) do +-- --print(name) +-- if strs:starts(value.name, "buildtest:") and value.homepos==pos then +-- id=name +-- end +-- end +-- if not id then +-- buildtest.pumps.on_construct(pos) +-- end +-- --timerCount = 0 +-- local level = thisMeta:get_int("level") or 1 +-- --if level==nil then level=0 end +-- level = level + 1 +-- if level <= def.buildtest.pump.maxLevel then +-- thisMeta:set_int("level", level) +-- end +-- end + local canHeat = false + if timerCount >= def.buildtest.pump.upTime then + canHeat = true + + for name,value in pairs(minetest.luaentities) do + if strs:starts(value.name, "buildtest:") and value.homepos==pos then -- :get_luaentity() + value:remove() + end + end + buildtest.pumps.on_construct(pos, "default_wood.png", def.buildtest.pump.typeId) + end + if def.buildtest.pump.canHeat~=nil then + if def.buildtest.pump.canHeat(pos)==false then + canHeat=false + end + end + if canHeat==true then + --print("ok: "..def.buildtest.pump.next) +-- local node = minetest.get_node(pos) +-- node.name = def.buildtest.pump.next +-- minetest.set_node(pos, node) + if def.buildtest.pump.next~=nil then + buildtest.pumps.hacky_swap_node(pos, def.buildtest.pump.next) + elseif def.buildtest.pump.explodes == true then + minetest.remove_node(pos) + tnt:blowup(pos, 0.5, nil) + end + + thisMeta:set_int("timer", 0) + return + end + thisMeta:set_int("timer", timerCount) + end + + --if not buildtest.pipeAt(pipepos) then return end + + --local speed = thisMeta:get_int("level") or 1 + local speed = def.buildtest.pump.stepSpeed + --minetest.set_node(chestpos, {name="default:cobble"}) + --if thisMeta:get_int("timer") % (def.buildtest.pump.maxLevel + 1 - speed) ~= 0 then + if thisMeta:get_int("timer") % (#buildtest.pumps.colours + 1 - speed) ~= 0 then + return + end + + if buildtest.pumps.pulls[minetest.get_node(chestpos).name]~=nil and (strs:starts(minetest.get_node(pipepos).name, "buildtest:pipe_wood_") or strs:starts(minetest.get_node(pipepos).name, "buildtest:pipe_emr_")) then -- was minetest.get_node(chestpos).name=="default:chest" + local inv = minetest.get_meta(chestpos):get_inventory() + local tosend = nil + local pipeinv = minetest.get_meta(pipepos):get_inventory() + local listname = buildtest.pumps.pulls[minetest.get_node(chestpos).name][1] + --------------------------------- + for i=1, inv:get_size(listname) do + local cell = inv:get_stack(listname, i):to_table() + if tosend==nil and cell~=nil and inv:get_stack(listname, i):is_empty()==false then + if strs:starts(minetest.get_node(pipepos).name, "buildtest:pipe_wood_") or pipeinv:contains_item("main", {name = cell.name}) then + local move = math.min(cell.count, + def.buildtest.pump.moveCount) + + tosend=ItemStack(cell):to_table() + tosend.count = move + cell.count = cell.count - move + inv:set_stack(listname, i, cell) + end + end + end + if tosend==nil then return end + local entity = buildtest.makeEnt(pipepos, tosend, speed) + if entity then + entity:setpos(chestpos) + entity:setvelocity({x=0, y=0-speed, z=0}) + end + elseif strs:starts(minetest.get_node(pipepos).name, "buildtest:pipe_obsidian_") then + for _,object in ipairs(minetest.get_objects_inside_radius(pos, speed*def.buildtest.pump.moveCount)) do + if not object:is_player() and object:get_luaentity() and object:get_luaentity().name == "__builtin:item" then + if object:get_luaentity().itemstring ~= "" then +---- local titem=tube_item(pos,object:get_luaentity().itemstring) +---- titem:get_luaentity().start_pos = {x=pos.x,y=pos.y-1,z=pos.z} +---- titem:setvelocity({x=0.01,y=1,z=-0.01}) +---- titem:setacceleration({x=0, y=0, z=0}) + buildtest.makeEnt(pipepos, ItemStack(object:get_luaentity().itemstring):to_table(), speed) + end + --object:setvelocity + object:get_luaentity().itemstring = "" + object:remove() + end + end + elseif minetest.get_node(pipepos).name=="buildtest:pump" then + local ent=minetest.add_entity(pipepos, "buildtest:entity_liquid") + ent:get_luaentity().pos = pipepos + elseif strs:starts(minetest.get_node(pipepos).name, "buildtest:pipe_stripe_") then + local itemName = minetest.get_node(chestpos).name + if itemName~="air" and itemName~="ignore" then +-- print("currently cutting: "..itemName) + local drops = minetest.get_node_drops(itemName, "default:pick_mese")--minetest.registered_nodes[itemName].drop + + for _,item in ipairs(drops) do + local count, name + if type(item) == "string" then + count = 1 + name = item + else + count = item:get_count() + name = item:get_name() + end + + local entity = buildtest.makeEnt(pipepos, {name = name, count = count}, speed) + if entity then + entity:setpos(chestpos) + entity:setvelocity({x=0, y=0-speed, z=0}) + end + end + + minetest.set_node(chestpos, {name = "air"}) + nodeupdate(chestpos) + end + else + speedup = speed + end + + thisMeta:set_int("speedup", speedup) +end + +buildtest.facedir_to_dir = function(param) + local list={ + {x= 0,y=0,z= 1}, + {x= 1,y=0,z= 0}, + {x= 0,y=0,z=-1}, + {x=-1,y=0,z= 0}, + } + return list[param+1] +end + +buildtest.makeEnt = function(pos, tosend, speed) + if speed < 1 then speed = 1 end + local entity=minetest.add_entity(pos, "buildtest:entity_flat") + if entity then + entity:get_luaentity().nextpos = pos + entity:get_luaentity().speed = speed + entity:setpos(pos) + entity:setvelocity({x=0, y=0, z=0}) + entity:get_luaentity():set_item(tosend) + --entity:get_luaentity().inInit = false + end + return entity +end + +buildtest.pumps.on_construct = function(pos, texture, speed) + --print("ok") + local ent = minetest.add_entity(pos, "buildtest:pump_ent") + if ent then + local luaent = ent:get_luaentity() + ent:setpos(pos) + --ent:get_luaentity():setTexture(texture) + --ent:get_luaentity():setAnim(speed) + ent:get_luaentity().config = { + texture = texture, + speed = speed, + } + ent:get_luaentity().homepos = pos +-- ent:get_luaentity().handmade = true + --ent:get_luaentity().setTexture(ent, "buildtest_pump_mesecon.png") +-- ent:get_luaentity().homename = minetest.get_node(pos).name +-- ent:get_luaentity().reset = true + end +end + +dofile(minetest.get_modpath("buildtest").."/pumps/graphics/init.lua") +dofile(minetest.get_modpath("buildtest").."/pumps/mesecon.lua") +dofile(minetest.get_modpath("buildtest").."/pumps/sterling.lua") +dofile(minetest.get_modpath("buildtest").."/pumps/pump.lua") +dofile(minetest.get_modpath("buildtest").."/pumps/combustion.lua") \ No newline at end of file diff --git a/pumps/sterling.lua b/pumps/sterling.lua new file mode 100644 index 0000000..f342a62 --- /dev/null +++ b/pumps/sterling.lua @@ -0,0 +1,176 @@ +--minetest.register_node("buildtest:pump_sterling", { +-- --tiles = {"buildtest_pump_mesecon.png"}, +-- description = "Buildtest Sterling Pump", +-- groups = {choppy=1,oddly_breakable_by_hand=3}, +-- paramtype = "light", +-- paramtype2 = "facedir", +-- sunlight_propagates = true, +-- buildtest = { +-- pipe=1, +-- connects={ +-- "buildtest:pipe_wood", +-- }, +-- pump = { +-- maxSpeed = 0.5, +-- moveCount = 2, +-- maxLevel = 10, +-- upTime = 20, +-- textures = { +-- "buildtest_pump_sterling.png", +-- "buildtest_pump_blue.png", +-- "buildtest_pump_green.png", +-- "buildtest_pump_orange.png", +-- "buildtest_pump_red.png", +-- } +-- } +-- }, +-- on_construct = function(pos) +-- local ent = minetest.add_entity(pos, "buildtest:pump_ent") +-- if ent then +-- ent:setpos(pos) +-- ent:get_luaentity().homepos = pos +-- ent:get_luaentity().setTexture(ent, "buildtest_pump_sterling.png") +-- --ent:get_luaentity().homename = minetest.get_node(pos).name +-- end +-- end, +-- drawtype = "nodebox", +-- node_box = { +-- type = "fixed", +-- fixed = {{0,0,0,0,0,0}} +-- }, +-- selection_box = {{ +-- 0.5,0.5,0.5,-0.5,-0.5,-0.5, +-- }}, +--}) +-- +--minetest.register_abm({ +-- nodenames = {"buildtest:pump_sterling"}, +-- interval = 0.5, +-- chance = 1, +-- action = function(pos) +-- buildtest.pumps.send(pos) +-- end, +--}) + +buildtest.pumps.types.stirling = { + get_pump_active_formspec = function(percent) + local formspec = + "size[8,9]".. + "image[2,2;1,1;default_furnace_fire_bg.png^[lowpart:"..percent..":default_furnace_fire_fg.png]".. + "list[context;fuel;2,3;1,1;]".. + "list[context;heat;4,1;1,1;]".. + "list[context;out;6,1;2,2;]".. + "list[current_player;main;0,5;8,4;]" + return formspec + end, + set_pump_active_formspec = function(pos) + local meta = minetest.get_meta(pos) + local fuel_level = meta:get_int("fuel") + local max_fuel = meta:get_int("maxfuel") + local percent = (fuel_level / max_fuel) * 100 + local formspec = buildtest.pumps.types.stirling.get_pump_active_formspec(percent) + meta:set_string("formspec", formspec) + end, + handleCooling = function(pos, inv) + if inv:get_stack("heat", 1):is_empty() then + return false + end + local name = inv:get_stack("heat", 1):get_name() + local def = minetest.registered_items[minetest.get_node(pos).name] + if name=="bucket:bucket_lava" then + if def.buildtest.pump.next~=nil then + buildtest.pumps.hacky_swap_node(pos, def.buildtest.pump.next) + inv:set_stack("heat", 1, ItemStack(nil)) + inv:add_item("out", ItemStack("bucket:bucket_empty")) + return true + end + end + if name=="bucket:bucket_water" then + if def.buildtest.pump.prev~=nil then + buildtest.pumps.hacky_swap_node(pos, def.buildtest.pump.prev) + inv:set_stack("heat", 1, ItemStack(nil)) + inv:add_item("out", ItemStack("bucket:bucket_empty")) + return true + end + end + return false + end, +} + +buildtest.pumps.register_pump("buildtest:pump_stirling", "default_cobble.png", { + description = "Buildtest Stirling Engine", + on_construct = function(pos) + local meta = minetest.get_meta(pos) + --------------------------- +-- local formspec = +-- "size[8,9]".. +-- "image[2,2;1,1;default_furnace_fire_bg.png]".. +-- "list[context;fuel;2,3;1,1;]".. +-- "list[current_player;main;0,5;8,4;]" + local formspec = buildtest.pumps.types.stirling.get_pump_active_formspec(0) + --------------------------- + meta:set_string("formspec", formspec) + --------------------------- + local inv = meta:get_inventory() + inv:set_size("fuel", 1) + inv:set_size("heat", 1) + inv:set_size("out", 2*2) + buildtest.pumps.on_construct(pos) + end, + can_dig = function(pos,player) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + if not inv:is_empty("fuel") then + return false + end + return true + end, +}, +{ + abm = function(pos) + buildtest.pumps.send(pos) + end, + runConf = function(pos) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + + if buildtest.pumps.types.stirling.handleCooling(pos, inv)==true then + return false + end + + local fuel_level = (meta:get_int("fuel") or 0) + if fuel_level > 0 then + fuel_level = fuel_level - 1 + meta:set_int("fuel", fuel_level) + buildtest.pumps.types.stirling.set_pump_active_formspec(pos) + return true + end + + if inv:get_stack("fuel", 1):is_empty() then + return false + end + + local items = inv:get_list("fuel") +-- print("item: "..inv:get_stack("fuel", 1):get_name()) + local fuel + local sub + fuel, sub = minetest.get_craft_result({ + method="fuel", + width=1, + items = items, + }) + if fuel.time <= 0 then + return false + end + meta:set_int("maxfuel", fuel.time) + meta:set_int("fuel", fuel.time) + inv:set_list("fuel", sub.items) + buildtest.pumps.types.stirling.set_pump_active_formspec(pos) +-- print("pumping") + return true + end, + + moveCount = 2, + explodes = true, +} +) \ No newline at end of file diff --git a/support/entity.lua b/support/entity.lua new file mode 100644 index 0000000..00825aa --- /dev/null +++ b/support/entity.lua @@ -0,0 +1,292 @@ +buildtest.canPumpInto = { + ["default:chest_locked"] = {"main"}, + ["default:chest"] = {"main"}, + ["morechests:dropbox"] = {"main"}, + ["default:furnace_active"] = {"src", negy = "fuel"}, + ["default:furnace"] = {"src", negy = "fuel"}, + --["buildtest:pump_stirling"] = {"heat", negy = "fuel"}, + ["buildtest:autocraft"] = {"in", on_send = function(pos) + local meta=minetest.get_meta(pos) + local inv=meta:get_inventory() + buildtest.autocraft.do_craft(inv) + end}, + ["itest:macerator"] = {"src"}, + ["itest:macerator_active"] = {"src"}, + + ["itest:iron_furnace_active"] = {"src", negy = "fuel"}, + ["itest:iron_furnace"] = {"src", negy = "fuel"}, + ["itest:electric_furnace_active"] = {"src"}, + ["itest:electric_furnace"] = {"src"}, + ["itest:extractor_active"] = {"src"}, + ["itest:extractor"] = {"src"}, + ["itest:generator_active"] = {"src"}, + ["itest:generator"] = {"src"}, +} + +buildtest.get_listname_for_dir_in = function(dir, posname) + local listName = buildtest.canPumpInto[posname][1] + local dirName = "" + if dir.x+dir.y+dir.z > 0 then + dirName = dirName .. "neg" + end + if dir.x~=0 then + dirName = dirName .. "x" + end + if dir.y~=0 then + dirName = dirName .. "y" + end + if dir.z~=0 then + dirName = dirName .. "z" + end + if buildtest.canPumpInto[posname][dirName]~=nil then + listName = buildtest.canPumpInto[posname][dirName] + end + return listName +end + +minetest.register_entity("buildtest:entity_flat", { + initial_properties = { + visual = "cube", + visual_size = {x=0.5, y=0.5}, + --visual_size = {x=1, y=1}, +-- textures = {"worldedit_pos1.png", "worldedit_pos1.png", +-- "worldedit_pos1.png", "worldedit_pos1.png", +-- "worldedit_pos1.png", "worldedit_pos1.png"}, +-- collisionbox = {-0.25, -0.25, -0.25, 0.25, 0.25, 0.25}, + collisionbox = {0, 0, 0, 0, 0, 0}, + physical = false, + }, + on_step = function(self, dtime) + self.totTime=self.totTime+dtime + local pos=self.object:getpos() +-- pos.x=pos.x+dtime +-- self.object:setpos(pos) + if self.totTime > 1 / self.speed then + self.totTime = 0 --self.totTime - 1 / self.speed + --self.lastTime=math.toint(self.totTime) + --print(self.totTime) + --local acc=self.object:getacceleration() + --acc.x=0-acc.x + --acc.y=0-acc.y + --acc.z=0-acc.z + --self.object:setacceleration(acc) + if self.nextpos~=nil then + local newDir=nil + local posname = minetest.get_node(self.nextpos).name + --if posname=="default:chest" or posname=="default:chest_locked" then + if buildtest.canPumpInto[posname]~=nil then + local listName = buildtest.get_listname_for_dir_in(self.olddir, posname) + + local inv = minetest.get_meta(self.nextpos):get_inventory() + if inv:room_for_item(listName, self.content)==true then + inv:add_item(listName, self.content) + else + self.turn_into_item(self, self.content) + end +-- local leftover = inv:add_item("main", self.content) +-- if leftover~=nil and leftover:get_count()>0 then +-- self.turn_into_item(self, leftover) +-- return +-- end + self.object:remove() + + if buildtest.canPumpInto[posname].on_send~=nil then + buildtest.canPumpInto[posname].on_send(self.nextpos) + end + + return + end + --if self.nextpos==nil then + -- return + --end + --self.object:setpos({x=self.nextpos.x, y=self.nextpos.y+2, z=self.nextpos.z}) -- snap to grid + + if strs:starts(posname, "buildtest:pipe_iron_") then + newDir = buildtest.pipes.types.iron.getDir(self.nextpos) + end + + if strs:starts(posname, "buildtest:pipe_diamond_") then + newDir = buildtest.pipes.types.diamond.getDir(self.nextpos, self.content) + end + + if strs:starts(posname, "buildtest:pipe_stripe_") then + local targetPos = self.addpos(self.object:getpos(), self.olddir) + if minetest.get_node(targetPos).name == "air" + and self.content.count==1 and minetest.registered_nodes[self.content.name]~=nil then + minetest.set_node(targetPos, self.content) + self.object:remove() + nodeupdate(targetPos) + return + end + end + + if strs:starts(posname, "buildtest:pipe_gate") then + local getRunAction = buildtest.pipes.types.gate.types[posname].getRunAction(self.nextpos).entProcess(self.content) + end + + self.object:setpos(self.nextpos) -- snap to grid + if newDir==nil then + newDir = self.get_dir(self) + end + if newDir==nil then + self.turn_into_item(self, self.content) + --self.nextpos = nil + return + end + + --------------- + local posUnder = {x=self.nextpos.x, y=self.nextpos.y - 1, z=self.nextpos.z} + if strs:starts(minetest.get_node(posUnder).name, "buildtest:pump_") then + local speedup = minetest.get_meta(posUnder):get_int("speedup") + if speedup==nil then speedup=0 end + self.speed = self.speed + speedup + end + + if strs:starts(posname, "buildtest:pipe_gold_") then + local speedup = minetest.get_meta(self.nextpos):get_int("on") + --print("ok: "..speedup) + self.speed = self.speed + (speedup * 1) + end + + local pipedef = minetest.registered_items[posname] + if pipedef~=nil then + if pipedef.buildtest~=nil then + if pipedef.buildtest.slowdown~=nil then + self.speed = self.speed - pipedef.buildtest.slowdown + end + end + end + + + if self.speed > 20 then self.speed = 20 end + if self.speed < 1 then self.speed = 1 end + --------------- + + self.olddir=newDir + self.nextpos=self.addpos(self.nextpos,newDir) + self.object:setvelocity(buildtest.posMult(newDir, self.speed)) + self.direction = newDir + --print("old: "..minetest.pos_to_string(self.currpos)) + --print("new: "..minetest.pos_to_string(self.currpos)) + else + self.object:remove() + end + end + end, + on_punch = function(self, hitter) + end, + get_dir = function(self) + local poses={ + {x= 0,y= 0,z=-1}, + {x= 0,y= 0,z= 1}, + {x=-1,y= 0,z= 0}, + {x= 1,y= 0,z= 0}, + {x= 0,y=-1,z= 0}, + {x= 0,y= 1,z= 0}, + } + local prohib={self.invertpos(self.direction)} + for i=1,#prohib do + for j=1,#poses do + if minetest.pos_to_string(poses[j])==minetest.pos_to_string(prohib[i]) then + poses[j]=0 + elseif buildtest.pipeConn(self.addpos(self.nextpos,poses[j]),self.nextpos)==false then -- minetest.get_node(self.addpos(self.nextpos,poses[j])) + poses[j]=0 + end + end + end + for i=1,#poses do + if poses[i]~=0 then + return poses[i] + end + end + return nil + end, + invertpos = function(pos) + return {x=0-pos.x, y=0-pos.y, z=0-pos.z} + end, + addpos = function(posa, posb) + return {x=posa.x+posb.x, y=posa.y+posb.y, z=posa.z+posb.z} + end, + ispipe = function(node) + if node.name=="air" then + return false + end + local def=minetest.registered_items[node.name] + if def.buildtest==nil then + return false + end + return true + end, + ------------------------------------------------ + set_item = function(self, itemstring) + self.content = itemstring +-- print("ok") + local stack = ItemStack(itemstring) + local itemtable = stack:to_table() + local itemname = nil + if itemtable then + itemname = stack:to_table().name + end + local item_texture = nil + local item_type = "" + if minetest.registered_items[itemname] then + item_texture = minetest.registered_items[itemname].inventory_image + item_type = minetest.registered_items[itemname].type + end + prop = { + is_visible = true, + visual = "sprite", + textures = {"unknown_item.png"} + } + if item_texture and item_texture ~= "" then + prop.visual = "sprite" + prop.textures = {item_texture} + --prop.visual_size = {x=0.3, y=0.3} + prop.visual_size = {x=0.6, y=0.6} + else + prop.visual = "wielditem" + prop.textures = {itemname} + --prop.visual_size = {x=0.15, y=0.15} + prop.visual_size = {x=0.3, y=0.3} + end + self.object:set_properties(prop) + end, + ------------------------------------------------ + turn_into_item = function(self, stack) + minetest.add_item(self.addpos(self.object:getpos(),self.olddir), stack) + self.object:remove() + end, + -------------------------------------------------- + get_staticdata = function(self) + --local nextpoz = minetest.pos_to_string(self.nextpos) + return minetest.serialize({ + self.nextpos, + self.olddir, + self.content, + self.speed, + self.direction, + }) + end, + + on_activate = function(self, staticdata) +-- if staticdata=="" or staticdata==nil then return end +-- local item = minetest.deserialize(staticdata) + + +-- self.olddir = item.olddir +-- self.speed = item.speed + --self.direction = item.direction + --self.nextpos = minetest.pos_to_string(item.nextpos) + + --self.object:setpos(self.nextpos) + + --self:set_item(self.content) + end, + + totTime=0, + lastTime=0, + olddir={x=0,y=0,z=0}, + content={name="default:dirt",count=0}, + speed = 1, + direction = {x=0,y=0,z=0}, +}) \ No newline at end of file diff --git a/support/liquid.lua b/support/liquid.lua new file mode 100644 index 0000000..7da4d06 --- /dev/null +++ b/support/liquid.lua @@ -0,0 +1,126 @@ +minetest.register_entity("buildtest:entity_liquid", { + initial_properties = { + visual = "cube", + visual_size = {x=0.5, y=0.5}, + collisionbox = {0, 0, 0, 0, 0, 0}, + physical = false, + }, + on_step = function(self, dtime) + self.object:remove() +-- self.totTime=self.totTime+dtime +-- if self.totTime > 2 then +-- self.totTime = 0 +-- if self.pos~=nil and buildtest.pipeAt(self.pos) then +-- self.spread(self) +-- else +-- self.object:remove() +-- end +-- end + end, + on_punch = function(self, hitter) + end, + spread = function(self) + local poses={ + {x= 0,y= 0,z=-1}, + {x= 0,y= 0,z= 1}, + {x= 0,y=-1,z= 0}, + {x= 0,y= 1,z= 0}, + {x=-1,y= 0,z= 0}, + {x= 1,y= 0,z= 0}, + } + for _,object in ipairs(minetest.get_objects_inside_radius(self.pos, 5)) do + if not object:is_player() and object:get_luaentity() and object:get_luaentity().name == self.name then + if object~=self.object then + if object:get_luaentity().pos~=nil and object:get_luaentity().posOfs~=nil then + if object:get_luaentity().pos~=self.pos then + --return + local remPos = object:get_luaentity().pos + for i=1, #poses do + if poses[i]~=nil then + if poses[i].x==remPos.x and poses[i].y==remPos.y and poses[i].z==remPos.z then + poses[i] = nil + end + end + end + end + end + end + end + end + for i=1,#poses do + if poses[i]~=nil then + local newPos = self.addpos(poses[i], self.pos) + if buildtest.pipeConn(newPos, self.pos) then + --local posOfs = {x=poses[i].x/3,y=poses[i].y/3,z=poses[i].z/3} + local ent = minetest.add_entity(newPos, "buildtest:entity_liquid") + if ent then + --print("ok") + --ent:setpos(newPos) + ent:get_luaentity().pos=newPos--self.pos + -- ent:get_luaentity().posOfs=poses[i] + end + end + end + end + end, + addpos = function(posa, posb) + return {x=posa.x+posb.x, y=posa.y+posb.y, z=posa.z+posb.z} + end, +-- can_goto = function(pos, refpos) +-- local refnode = minetest.get_node(refpos) +-- if strs:starts(refnode.name, "buildtest:pipe_") then +-- local id = refnode.name:split("_")[3] +-- if id=="0" then +-- return false +-- end +-- return buildtest.pipeConn(pos, refpos) +-- end +-- return false +-- end, + ------------------------------------------------ + set_item = function(self, itemstring) +-- self.content = itemstring +---- print("ok") +-- local stack = ItemStack(itemstring) +-- local itemtable = stack:to_table() +-- local itemname = nil +-- if itemtable then +-- itemname = stack:to_table().name +-- end +-- local item_texture = nil +-- local item_type = "" +-- if minetest.registered_items[itemname] then +-- item_texture = minetest.registered_items[itemname].inventory_image +-- item_type = minetest.registered_items[itemname].type +-- end +-- prop = { +-- is_visible = true, +-- visual = "sprite", +-- textures = {"unknown_item.png"} +-- } +-- if item_texture and item_texture ~= "" then +-- prop.visual = "sprite" +-- prop.textures = {item_texture} +-- --prop.visual_size = {x=0.3, y=0.3} +-- prop.visual_size = {x=0.6, y=0.6} +-- else +-- prop.visual = "wielditem" +-- prop.textures = {itemname} +-- --prop.visual_size = {x=0.15, y=0.15} +-- prop.visual_size = {x=0.3, y=0.3} +-- end +-- self.object:set_properties(prop) + end, + -------------------------------------------------- + get_staticdata = function(self) + end, + + on_activate = function(self, staticdata) + end, + + totTime=0, + lastTime=0, + --pos={x=0,y=0,z=0}, + posOfs = {x=0,y=0,z=0}, + content={name="default:water_source"}, +}) \ No newline at end of file