From 50fe1a5cefd1640142c6b3c2bc1c99f450bdcccc Mon Sep 17 00:00:00 2001 From: rnd1 Date: Sat, 26 Mar 2016 14:03:00 +0100 Subject: [PATCH] -doors can be activated by signal ( future 0.4.14 doors ) -more secure steel doors: cant be digged, repeated punch door removal -mover has now separate "reverse" option -texture redesign -minor changes: fuel cells max stack of 25 to prevent over stockpiling --- mesecon_doors.lua | 247 ++++++++++------------------- mover.lua | 59 +++---- recycler.lua | 2 +- technic_power.lua | 61 ++----- textures/basic_machine_battery.png | Bin 878 -> 1089 bytes textures/basic_machine_outlet.png | Bin 1715 -> 1963 bytes textures/basic_machine_side.png | Bin 1443 -> 1714 bytes textures/compass_top.png | Bin 1510 -> 1783 bytes textures/detector.png | Bin 1614 -> 2148 bytes textures/grinder.png | Bin 1183 -> 1841 bytes textures/keypad.png | Bin 2367 -> 1918 bytes textures/recycler.png | Bin 2931 -> 2136 bytes 12 files changed, 136 insertions(+), 233 deletions(-) diff --git a/mesecon_doors.lua b/mesecon_doors.lua index dc89498..ea0e714 100644 --- a/mesecon_doors.lua +++ b/mesecon_doors.lua @@ -1,173 +1,100 @@ -doors = {} - --- Registers a door - REDEFINITION ONLY | DOORS MOD MUST HAVE BEEN LOADED BEFORE --- name: The name of the door --- def: a table with the folowing fields: --- description --- inventory_image --- groups --- tiles_bottom: the tiles of the bottom part of the door {front, side} --- tiles_top: the tiles of the bottom part of the door {front, side} --- If the following fields are not defined the default values are used --- node_box_bottom --- node_box_top --- selection_box_bottom --- selection_box_top --- only_placer_can_open: if true only the player who placed the door can --- open it - -function doors:register_door(name, def) - def.groups.not_in_creative_inventory = 1 - - local box = {{-0.5, -0.5, -0.5, 0.5, 0.5, -0.5+1.5/16}} - - if not def.node_box_bottom then - def.node_box_bottom = box - end - if not def.node_box_top then - def.node_box_top = box - end - if not def.selection_box_bottom then - def.selection_box_bottom= box - end - if not def.selection_box_top then - def.selection_box_top = box +-- make doors open/close with signal +local function door_signal_overwrite(name) + local table = minetest.registered_nodes[name]; if not table then return end + local table2 = {} + for i,v in pairs(table) do + table2[i] = v end - local tt = def.tiles_top - local tb = def.tiles_bottom - - local function after_dig_node(pos, name) - if minetest.get_node(pos).name == name then - minetest.remove_node(pos) + -- this will make door toggle whenever its used + table2.mesecons = {effector = { + action_on = function (pos,node,ttl) + if ttl<0 then return end + local meta = minetest.get_meta(pos);local name = meta:get_string("doors_owner"); + -- create virtual player + local clicker = {}; + function clicker:get_player_name() return name end; -- define method get_player_name() returning owner name so that we can call on_rightclick function in door + table.on_rightclick(pos, node, clicker) + --minetest.swap_node(pos, {name = "protector:trapdoor", param1 = node.param1, param2 = node.param2}) end - end - - local function on_rightclick(pos, dir, check_name, replace, replace_dir, params) - pos.y = pos.y+dir - if not minetest.get_node(pos).name == check_name then - return - end - local p2 = minetest.get_node(pos).param2 - p2 = params[p2+1] - - local meta = minetest.get_meta(pos):to_table() - minetest.set_node(pos, {name=replace_dir, param2=p2}) - minetest.get_meta(pos):from_table(meta) - - pos.y = pos.y-dir - meta = minetest.get_meta(pos):to_table() - minetest.set_node(pos, {name=replace, param2=p2}) - minetest.get_meta(pos):from_table(meta) - end - - local function on_mesecons_signal_open (pos, node) - on_rightclick(pos, 1, name.."_t_1", name.."_b_2", name.."_t_2", {1,2,3,0}) - end - - local function on_mesecons_signal_close (pos, node) - on_rightclick(pos, 1, name.."_t_2", name.."_b_1", name.."_t_1", {3,0,1,2}) - end + } + }; - local function check_player_priv(pos, player) - if not def.only_placer_can_open then - return true - end - local meta = minetest.get_meta(pos) - local pn = player:get_player_name() - return meta:get_string("doors_owner") == pn - end + minetest.register_node(":"..name, table2) +end + +minetest.after(0,function() + door_signal_overwrite("doors:door_wood_a");door_signal_overwrite("doors:door_wood_b"); + door_signal_overwrite("doors:door_steel_a");door_signal_overwrite("doors:door_steel_b"); + door_signal_overwrite("doors:trapdoor");door_signal_overwrite("doors:trapdoor_open"); + door_signal_overwrite("doors:trapdoor_steel");door_signal_overwrite("doors:trapdoor_steel_open"); - minetest.register_node(":"..name.."_b_1", { - tiles = {tb[2], tb[2], tb[2], tb[2], tb[1], tb[1].."^[transformfx"}, - paramtype = "light", - paramtype2 = "facedir", - drop = name, - drawtype = "nodebox", - node_box = { - type = "fixed", - fixed = def.node_box_bottom - }, - selection_box = { - type = "fixed", - fixed = def.selection_box_bottom - }, - groups = def.groups, - - after_dig_node = function(pos, oldnode, oldmetadata, digger) - pos.y = pos.y+1 - after_dig_node(pos, name.."_t_1") - end, - - on_rightclick = function(pos, node, puncher) - if check_player_priv(pos, puncher) then - on_rightclick(pos, 1, name.."_t_1", name.."_b_2", name.."_t_2", {1,2,3,0}) + end +); + +local function make_it_noclip(name) + + local table = minetest.registered_nodes[name]; if not table then return end + local table2 = {} + for i,v in pairs(table) do + table2[i] = v + end + table2.walkable = false; -- cant be walked on + minetest.register_node(":"..name, table2) +end + +minetest.after(0,function() + make_it_noclip("doors:trapdoor_open"); + make_it_noclip("doors:trapdoor_steel_open"); +end); + + + +local function make_it_nondiggable_but_removable(name, dropname) + + local table = minetest.registered_nodes[name]; if not table then return end + local table2 = {} + for i,v in pairs(table) do + table2[i] = v + end + table2.groups.level = 99; -- cant be digged, but it can be removed by owner or if not protected + table2.on_punch = function(pos, node, puncher, pointed_thing) -- remove node if owner repeatedly punches it 3x + local pname = puncher:get_player_name(); + local meta = minetest.get_meta(pos); + local owner = meta:get_string("doors_owner") + if pname==owner or not minetest.is_protected(pos,pname) then -- can be dug by owner or if unprotected + local t0 = meta:get_int("punchtime");local count = meta:get_int("punchcount"); + local t = minetest.get_gametime(); + + if t-t0<2 then count = (count +1 ) % 3 else count = 0 end + + if count == 1 then + minetest.chat_send_player(pname, "#steel door: punch me one more time to remove me"); end - end, - - mesecons = {effector = { - action_on = on_mesecons_signal_open - }}, - - can_dig = check_player_priv, - }) - - minetest.register_node(":"..name.."_b_2", { - tiles = {tb[2], tb[2], tb[2], tb[2], tb[1].."^[transformfx", tb[1]}, - paramtype = "light", - paramtype2 = "facedir", - drop = name, - drawtype = "nodebox", - node_box = { - type = "fixed", - fixed = def.node_box_bottom - }, - selection_box = { - type = "fixed", - fixed = def.selection_box_bottom - }, - groups = def.groups, - - after_dig_node = function(pos, oldnode, oldmetadata, digger) - pos.y = pos.y+1 - after_dig_node(pos, name.."_t_2") - end, - - on_rightclick = function(pos, node, puncher) - if check_player_priv(pos, puncher) then - on_rightclick(pos, 1, name.."_t_2", name.."_b_1", name.."_t_1", {3,0,1,2}) + if count == 2 then -- remove steel door and drop it + minetest.set_node(pos, {name = "air"}); + local stack = ItemStack(dropname);minetest.add_item(pos,stack) end - end, + + meta:set_int("punchcount",count);meta:set_int("punchtime",t); + --minetest.chat_send_all("punch by "..name .. " count " .. count) + end + end + minetest.register_node(":"..name, table2) +end - mesecons = {effector = { - action_off = on_mesecons_signal_close - }}, - - can_dig = check_player_priv, - }) -end - -doors:register_door("doors:door_wood", { - description = "Wooden Door", - inventory_image = "doors_wood.png", - groups = {snappy=1,choppy=2,oddly_breakable_by_hand=2,flammable=2,door=1}, - tiles_bottom = {"doors_wood_b.png", "doors_brown.png"}, - tiles_top = {"doors_wood_a.png", "doors_brown.png"}, - sounds = default.node_sound_wood_defaults(), -}) - -doors:register_door("doors:door_steel", { - description = "Steel Door", - inventory_image = "doors_steel.png", - groups = {snappy=1,bendy=2,cracky=1,melty=2,level=2,door=1}, - tiles_bottom = {"doors_steel_b.png", "doors_grey.png"}, - tiles_top = {"doors_steel_a.png", "doors_grey.png"}, - only_placer_can_open = true, - sounds = default.node_sound_stone_defaults(), -}) +minetest.after(0,function() + make_it_nondiggable_but_removable("doors:door_steel_a","doors:door_steel"); + make_it_nondiggable_but_removable("doors:door_steel_b","doors:door_steel"); + + make_it_nondiggable_but_removable("doors:trapdoor_steel","doors:trapdoor_steel"); + make_it_nondiggable_but_removable("doors:trapdoor_steel_open","doors:trapdoor_steel"); +end); --- make trapdoor open close and when open make it unwalkable + + +-- make protected trapdoor open close and when open make it unwalkable local function trapdoor_open_overwrite() local name = "protector:trapdoor_open"; diff --git a/mover.lua b/mover.lua index 288b1b5..c2d5b65 100644 --- a/mover.lua +++ b/mover.lua @@ -48,7 +48,6 @@ basic_machines.plant_table = {["farming:seed_barley"]="farming:barley_1",["farm -- *** END OF SETTINGS *** -- - local punchset = {}; minetest.register_on_joinplayer(function(player) @@ -58,10 +57,9 @@ minetest.register_on_joinplayer(function(player) end ) - - +-- MOVER -- minetest.register_node("basic_machines:mover", { - description = "Mover", + description = "Mover - universal digging/harvesting/teleporting/transporting machine, its upgradeable.", tiles = {"compass_top.png","default_furnace_top.png", "basic_machine_side.png","basic_machine_side.png","basic_machine_side.png","basic_machine_side.png"}, groups = {oddly_breakable_by_hand=2,mesecon_effector_on = 1}, sounds = default.node_sound_wood_defaults(), @@ -99,7 +97,7 @@ minetest.register_node("basic_machines:mover", { return end -- only owner can set up mover, ppl sharing protection can only look - local x0,y0,z0,x1,y1,z1,x2,y2,z2,prefer,mode; + local x0,y0,z0,x1,y1,z1,x2,y2,z2,prefer,mode,mreverse; x0=meta:get_int("x0");y0=meta:get_int("y0");z0=meta:get_int("z0");x1=meta:get_int("x1");y1=meta:get_int("y1");z1=meta:get_int("z1");x2=meta:get_int("x2");y2=meta:get_int("y2");z2=meta:get_int("z2"); @@ -108,9 +106,9 @@ minetest.register_node("basic_machines:mover", { machines.pos2[player:get_player_name()] = {x=pos.x+x2,y=pos.y+y2,z=pos.z+z2};machines.mark_pos2(player:get_player_name()) -- mark pos2 prefer = meta:get_string("prefer"); + local mreverse = meta:get_int("reverse"); local list_name = "nodemeta:"..pos.x..','..pos.y..','..pos.z - local mode_list = {["normal"]=1,["dig"]=2, ["drop"]=3,["reverse"]=4, ["object"]=5, ["inventory"]=6, ["transport"]=7}; - --local inv_mode_list = {[1]=["normal"],[2]="dig", [3]="drop",[4]="reverse", [5]="object", [6]="inventory"}; + local mode_list = {["normal"]=1,["dig"]=2, ["drop"]=3, ["object"]=4, ["inventory"]=5, ["transport"]=6}; local mode = mode_list[meta:get_string("mode")] or ""; @@ -155,11 +153,11 @@ minetest.register_node("basic_machines:mover", { "field[0.25,2.5;1,1;x2;Target;"..x2.."] field[1.25,2.5;1,1;y2;;"..y2.."] field[2.25,2.5;1,1;z2;;"..z2.."]".. "dropdown[3,2.25;1.5,1;inv2;".. inv_list2 .. ";" .. inv2 .."]".. "button_exit[4,4.4;1,1;OK;OK] field[0.25,3.5;3,1;prefer;filter;"..prefer.."]".. - "button[3,4.4;1,1;help;help]".. + "button[4.,3.25;1,1;help;help]".. "label[0.,4.0;MODE selection]".. - "dropdown[0,4.5;3,1;mode;normal,dig,drop,reverse,object,inventory,transport;".. mode .."]".. - "list[nodemeta:"..pos.x..','..pos.y..','..pos.z ..";upgrade;3,3.3;1,1;]".. - "label[3,2.9;upgrade]"; + "dropdown[0,4.5;3,1;mode;normal,dig,drop,object,inventory,transport;".. mode .."]".. + "list[nodemeta:"..pos.x..','..pos.y..','..pos.z ..";upgrade;3,4.3;1,1;]".."label[3,3.9;upgrade]" .. + "field[3.25,3.5;1,1;reverse;reverse;"..mreverse.."]"; --"field[0.25,4.5;2,1;mode;mode;"..mode.."]"; @@ -191,6 +189,7 @@ minetest.register_node("basic_machines:mover", { local x0=meta:get_int("x0"); local y0=meta:get_int("y0"); local z0=meta:get_int("z0"); local mode = meta:get_string("mode"); + local mreverse = meta:get_int("reverse") local pos1 = {x=x0+pos.x,y=y0+pos.y,z=z0+pos.z}; -- where to take from local pos2 = {x=meta:get_int("x2")+pos.x,y=meta:get_int("y2")+pos.y,z=meta:get_int("z2")+pos.z}; -- where to put @@ -209,7 +208,7 @@ minetest.register_node("basic_machines:mover", { pos2 = {x=meta:get_int("x2")-x0+pos1.x,y=meta:get_int("y2")-y0+pos1.y,z=meta:get_int("z2")-z0+pos1.z}; -- translation from pos1 end - if mode == "reverse" then -- reverse pos1, pos2 + if mreverse ~= 0 then -- reverse pos1, pos2 local post = {x=pos1.x,y=pos1.y,z=pos1.z}; pos1 = {x=pos2.x,y=pos2.y,z=pos2.z}; pos2 = {x=post.x,y=post.y,z=post.z}; @@ -398,7 +397,7 @@ minetest.register_node("basic_machines:mover", { else return -- item not found in chest end - if mode == "reverse" then -- planting mode: check if transform seed->plant is needed + if mreverse ~= 0 then -- planting mode: check if transform seed->plant is needed if basic_machines.plant_table[prefer]~=nil then prefer = basic_machines.plant_table[prefer]; end @@ -526,7 +525,7 @@ minetest.register_node("basic_machines:mover", { } }) --- KEYPAD +-- KEYPAD -- local function use_keypad(pos,ttl) -- position, time to live ( how many times can signal travel before vanishing to prevent infinite recursion ) @@ -609,7 +608,7 @@ local function check_keypad(pos,name,ttl) -- called only when manually activated end minetest.register_node("basic_machines:keypad", { - description = "Keypad", + description = "Keypad - basic way to activated machines by signal it sends", tiles = {"keypad.png"}, groups = {oddly_breakable_by_hand=2}, sounds = default.node_sound_wood_defaults(), @@ -661,10 +660,10 @@ minetest.register_node("basic_machines:keypad", { --- DETECTOR +-- DETECTOR -- minetest.register_node("basic_machines:detector", { - description = "Detector", + description = "Detector - can detect blocks/players/objects and activate machines", tiles = {"detector.png"}, groups = {oddly_breakable_by_hand=2}, sounds = default.node_sound_wood_defaults(), @@ -780,7 +779,6 @@ minetest.register_node("basic_machines:detector", { }) - minetest.register_abm({ nodenames = {"basic_machines:detector"}, neighbors = {""}, @@ -866,10 +864,10 @@ minetest.register_abm({ end, }) --- DISTRIBUTOR: spreads one signal to two outputs +-- DISTRIBUTOR -- minetest.register_node("basic_machines:distributor", { - description = "Distributor", + description = "Distributor - can forward signal up to 16 different targets", tiles = {"distributor.png"}, groups = {oddly_breakable_by_hand=2}, sounds = default.node_sound_wood_defaults(), @@ -1030,7 +1028,7 @@ minetest.register_node("basic_machines:distributor", { ) --- LIGHT +-- LIGHT -- minetest.register_node("basic_machines:light_off", { description = "Light off", @@ -1062,7 +1060,7 @@ minetest.register_node("basic_machines:light_on", { punchset.known_nodes = {["basic_machines:mover"]=true,["basic_machines:keypad"]=true,["basic_machines:detector"]=true}; --- handles set up punches +-- SETUP BY PUNCHING minetest.register_on_punchnode(function(pos, node, puncher, pointed_thing) local name = puncher:get_player_name(); if name==nil then return end @@ -1320,7 +1318,7 @@ minetest.register_on_punchnode(function(pos, node, puncher, pointed_thing) end) --- handles forms processing for all machines +-- FORM PROCESSING for all machines minetest.register_on_player_receive_fields(function(player,formname,fields) -- MOVER @@ -1337,12 +1335,13 @@ minetest.register_on_player_receive_fields(function(player,formname,fields) local text = "SETUP: For interactive setup ".. "punch the mover and then punch source1, source2, target node (follow instructions). Put locked chest with fuel within distance 1 from mover. For advanced setup right click mover. Positions are defined by x y z coordinates (see top of mover for orientation). Mover itself is at coordinates 0 0 0. ".. "\n\nMODES of operation: normal (just teleport block), dig (digs and gives you resulted node - good for harvesting farms), drop ".. - "(drops node on ground), reverse(takes from target position, places on source positions - good for planting a farm), object (teleportation of player and objects. distance between source1/2 defines teleport radius). ".. + "(drops node on ground), object (teleportation of player and objects. distance between source1/2 defines teleport radius). ".. "By setting 'filter' only selected nodes are moved.\nInventory mode can exchange items between node inventories. You need to select inventory name for source/target from the dropdown list on the right and enter node to be moved into filter.".. + "\n You can reverse start/end position by setting reverse nonzero. This is useful for placing stuff at many locations-planting." .. "\n\n FUEL CONSUMPTION depends on blocks to be moved and distance. For example, stone or tree is harder to move than dirt, harvesting wheat is very cheap and and moving lava is very hard.".. "\n\n UPGRADE mover by moving mese blocks in upgrade inventory. Each mese block increases mover range by 10, fuel consumption is divided by (number of mese blocks)+1 in upgrade. Max 10 blocks are used for upgrade. Dont forget to right click mover to refresh after upgrade. ".. "\n\n Activate mover by keypad/detector signal or mese signal (if mesecons mod) ."; - local form = "size [5,7] textarea[0,0;5.5,8.5;help;MOVER HELP;".. text.."]" + local form = "size [6,7] textarea[0,0;6.5,8.5;help;MOVER HELP;".. text.."]" minetest.show_formspec(name, "basic_machines:help_mover", form) end @@ -1361,6 +1360,10 @@ minetest.register_on_player_receive_fields(function(player,formname,fields) meta:set_string("mode",fields.mode); end + if fields.reverse then + meta:set_string("reverse",fields.reverse); + end + if fields.inv1 then meta:set_string("inv1",fields.inv1); end @@ -1520,7 +1523,7 @@ minetest.register_on_player_receive_fields(function(player,formname,fields) end return end - + -- DISTRIBUTOR local fname = "basic_machines:distributor_" @@ -1610,7 +1613,9 @@ minetest.register_on_player_receive_fields(function(player,formname,fields) end) --- CRAFTS + + +-- CRAFTS -- minetest.register_craft({ output = "basic_machines:mover", diff --git a/recycler.lua b/recycler.lua index 89f54e1..40e3ab1 100644 --- a/recycler.lua +++ b/recycler.lua @@ -126,7 +126,7 @@ local recycler_update_meta = function(pos) end minetest.register_node("basic_machines:recycler", { - description = "Recycler", + description = "Recycler - use to get some ingredients back from crafted things", tiles = {"recycler.png"}, groups = {oddly_breakable_by_hand=2,mesecon_effector_on = 1}, sounds = default.node_sound_wood_defaults(), diff --git a/technic_power.lua b/technic_power.lua index 4e8a932..8f8cff5 100644 --- a/technic_power.lua +++ b/technic_power.lua @@ -18,12 +18,12 @@ local battery_update_meta = function(pos) local capacity = meta:get_float("capacity"); local energy = math.ceil(10*meta:get_float("energy"))/10; local form = - "size[8,5.5]" .. -- width, height + "size[8,6.5]" .. -- width, height "label[0,0;FUEL] ".."label[6,0;UPGRADE] ".. "label[1,0;ENERGY ".. energy .."/ ".. capacity..", maximum power output ".. (capacity*0.1) .."]".. "label[1,1;UPGRADE LEVEL ".. meta:get_int("upgrade") .. " (mese and diamond block)]".. "list["..list_name..";fuel;0.,0.5;1,1;]".. "list["..list_name..";upgrade;6.,0.5;2,1;]" .. - "list[current_player;main;0,1.5;8,4;]".. + "list[current_player;main;0,2.5;8,4;]".. "button[4.5,0.35;1.5,1;OK;REFRESH]"; meta:set_string("formspec", form); end @@ -102,13 +102,13 @@ battery_upgrade = function(pos) end minetest.register_node("basic_machines:battery", { - description = "battery - stores energy, generates energy from fuel, can power nearby machines, or accelerate/run furnace above it", + description = "battery - stores energy, generates energy from fuel, can power nearby machines, or accelerate/run furnace above it. Its upgradeable.", tiles = {"basic_machine_outlet.png","basic_machine_side.png","basic_machine_battery.png"}, groups = {oddly_breakable_by_hand=2,mesecon_effector_on = 1}, sounds = default.node_sound_wood_defaults(), after_place_node = function(pos, placer) local meta = minetest.get_meta(pos); - meta:set_string("infotext","battery - stores energy, generates energy from fuel, can power nearby machines, or accelerate/run furnace above it when activated"); + meta:set_string("infotext","battery - stores energy, generates energy from fuel, can power nearby machines, or accelerate/run furnace above it when activated by keypad"); meta:set_string("owner",placer:get_player_name()); local inv = meta:get_inventory();inv:set_size("fuel", 1*1); -- place to put crystals inv:set_size("upgrade", 2*1); @@ -239,11 +239,11 @@ local generator_update_meta = function(pos) local list_name = "nodemeta:"..pos.x..','..pos.y..','..pos.z local form = - "size[8,5.5]" .. -- width, height + "size[8,6.5]" .. -- width, height "label[0,0;POWER CRYSTALS] ".."label[6,0;UPGRADE] ".. "label[1,1;UPGRADE LEVEL ".. meta:get_int("upgrade") .. " (gold and diamond block)]".. "list["..list_name..";fuel;0.,0.5;1,1;]".. "list["..list_name..";upgrade;6.,0.5;2,1;]" .. - "list[current_player;main;0,1.5;8,4;]".. + "list[current_player;main;0,2.5;8,4;]".. "button[4.5,0.35;1.5,1;OK;REFRESH]"; meta:set_string("formspec", form); end @@ -268,7 +268,7 @@ generator_upgrade = function(pos) end minetest.register_node("basic_machines:generator", { - description = "generator - generates power crystals that provide power", + description = "Generator - very expensive, generates power crystals that provide power. Its upgradeable.", tiles = {"basic_machine_side.png","basic_machine_side.png","basic_machine_generator.png"}, groups = {oddly_breakable_by_hand=2,mesecon_effector_on = 1}, sounds = default.node_sound_wood_defaults(), @@ -393,7 +393,7 @@ function basic_machines.check_power(pos, power_draw) -- mover checks power sourc energy = energy-power_draw; if energy<0 then - meta:set_string("infotext", "try to use better fuel to accomodate power draw ".. power_draw); + meta:set_string("infotext", "used fuel provides too little power for current power draw ".. power_draw); return 0 end -- recharge wasnt enough, needs to be repeated manually, return 0 power available meta:set_float("energy", energy); @@ -417,11 +417,10 @@ minetest.register_craft({ } }) - minetest.register_craft({ output = "basic_machines:generator", recipe = { - {"default:diamondblock","default:diamondblock","default:diamondblock"}, + {"","",""}, {"default:diamondblock","basic_machines:battery","default:diamondblock"}, {"default:diamondblock","default:diamondblock","default:diamondblock"} @@ -429,47 +428,19 @@ minetest.register_craft({ }) minetest.register_craftitem("basic_machines:power_cell", { - description = "Power cell", + description = "Power cell - provides 1 power", inventory_image = "power_cell.png", - stack_max = 999 + stack_max = 25 }) minetest.register_craftitem("basic_machines:power_block", { - description = "Power block", + description = "Power block - provides 10 power", inventory_image = "power_block.png", - stack_max = 999 + stack_max = 25 }) minetest.register_craftitem("basic_machines:power_rod", { - description = "Power rod", + description = "Power rod - provides 100 power", inventory_image = "power_rod.png", - stack_max = 999 -}) - - - ---OLD: for compatibility with outlets - - -local outlet_power_demand = 300; -minetest.register_node("basic_machines:outlet", { - description = "Power outlet - generates power for machines", - tiles = {"outlet.png"}, - groups = {oddly_breakable_by_hand=2,mesecon_effector_on = 1}, - sounds = default.node_sound_wood_defaults(), -}) - -minetest.register_abm({ -- replace old outlets with batteries - nodenames = {"basic_machines:outlet"}, - neighbors = {""}, - interval = 5, - chance = 1, - action = function(pos, node, active_object_count, active_object_count_wider) - minetest.set_node(pos,{name="basic_machines:battery"}); - local meta = minetest.get_meta(pos); - meta:set_string("infotext","upgraded from outlet. please dig and place again.") - end - }); - - --- END OLD \ No newline at end of file + stack_max = 25 +}) \ No newline at end of file diff --git a/textures/basic_machine_battery.png b/textures/basic_machine_battery.png index b8309351edd9c72407278b1467b5858a77e95893..8c611c007d1477a39d25d5754f8df68ec620578a 100644 GIT binary patch delta 1016 zcmV2Ehm+iBL{Q4GJ0x0000DNk~Le0000W0000W2nGNE0CReJ^pPPl2pS9? zBty(zW06}ce*>jSL_t(o!^M|NjvO}(hCi}Y@2P%xV895x2;kFrpF3m|IMTsR!qJENcb8{0z2zc*_G2*>PRWZikoa3Bg zi~xwp7v*0gRmC|+UDuRlNl_G3RfPd4ih>XVs!HGYe>6=4fcG8|IkoeJKJA|y^eL@l zZQIf`4bwE?oWoj+xxT&zz!<}Bx1*{m?(Xi0F_NY!s!ELUt2_S|i3rX)+P3A*n>RS; z`0(Ka^E?wmz`TC_n)~~EcDo(F{{072-*G*3OkIbYEG8?+%ZjYLBCATW@`}8w$jh3n zs_6&Ie?!-E-*&WJ$3xq3-}O8kzl||$u4=YdHEC6`zq&$y`|HsFYc0Foj>F-=rO10v zS(eQ6jM?pW7-MML_F@Li^UP+mVVWkiC<Z&VEIg5jijYVoe-TLFIA^hCnRm|PCvzfll&w63z<$5S zIfqeI(ljN;$U{h&f-;7LDI`qMkotry2zgMlS;@SRc_p8PY!-%DXxHY2&MRF|`Y3c! zFi|l<(V!$j(Xe1jk|c--W<@*iJ%9f53&Uu!c4Qa^rg0=OhCI*7^Nc)Oc$ViBc}|uY zf83Na*nqWQhXiX=tj!s0jU5JzG1P5MT~$5*EGW*o;I}Im(x{)=ldZ440=qCTC60WpZrCF%X3K znJ%aCRqqkjb)M({?cnhT^}YA#cR#;pf28%)LkQ?40q8tB9z(zWv=dNO^uLDJ=R5%s zL6aomXOS`H(SV1DAXaEBZdUf=gaSnx>~Ub$t$(G{6|c3V_=8J%_{Ln`!lP zKf}Y}K;QS6H5I$06VCI@;c!^e@?jWGHNho);N!=Sc<(WN-!qQmMRP*u9DUz2e@zo+ z97ke|6h(0{1Dd9xZQCU+AIA}E?L~dy_V$)}o@tr}6Jul?N2Y1w?c2A!eEAY%%#yRK zepVa)NYD`xy!XuWd@9q@G<{4;o2KF2yLXgj$@};3pG2z_B}If7;}`k5*ec^Z>rp-Z zW4qlhRk1PDb-f^=wU$?}UXiBhLaAtQ&OQ0r5w{5;oXYqt%c$#`7?)Igm915ES(fbg md#b7;&vUlh?P*hMN%${(2LBh+_rmP}0000>(; zvetUG8*5u=weel6tgX@N^1Je)3E%;H2pfW&T0Z2^RSZvJbh`~KX|nevTVL4QI|^8f+t&6E-_Ee+@jGa(flXnv ze~ekitYEV;ZDMm`X3RNBDbZS^E(^8RQwz(vrC!c>t5tqjm+$ik!9uVA3t@&Hz6;Y~ zo^1=kLr5X)4jzKXv2Awb*fzW1XWzaDyBs;p19O-z%)52wx$eA^2c!T+Py`8(5F`Zk zqphcJ4q4AT`4#ct%bgzMDtEe%KbiZMZFr~eKHrCT>5q%Om*;WZvsai`^89OcAYOQ^ z##P8JfD7OPxBxDI3*Z8{04{(F-~zY+E`ST*0=NJ!fD7OP_(v>fz|LPa60dwujd)!j h`P%t3$5Vw6+n;hrx&Rl_WUK%H002ovPDHLkV1ldQZ4v+g diff --git a/textures/basic_machine_outlet.png b/textures/basic_machine_outlet.png index ac8af7f56f7ef3f9b676bb01682341417ac5b26d..505d2a68850176824f6bdf09475695fe4000bcbd 100644 GIT binary patch delta 1929 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 diff --git a/textures/basic_machine_side.png b/textures/basic_machine_side.png index 999b3930f719fc5520579a8b6649f27f9ae5d26a..b94a7e73b5fe86cbe067146293eb130824f57954 100644 GIT binary patch delta 1692 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 diff --git a/textures/detector.png b/textures/detector.png index ae0813298f342d3f0b1d604064c374dd82699359..093af2af2be937d109be3b9916db469053c56e93 100644 GIT binary patch delta 2129 zcmV-X2(I_e4CD}yDu4d~{{a7>y{D4^000SaNLh0L01m_e01m_fl`9S#00007bV*G` z2jBx53@bNfL){Ai00;3&L_t(o!?l-PtXx$U$A5dDeZJ<*nK?7Pb9;db(w2gih)swI zN+bb;NQ9X50i%x^qX`;gG$A~i;ENB6Z<3JsV2mWDFGe0f5Px1M62DL&wxv)Y?QLoA z$C)|z%sFSDy|)iHGrjk=7g6I%CVO&b&RYMy)?RD>|Kjn-A9vPTj4?RpFvcLIL@9;V znw{pH13(CI)#tmJloG8qNs2y#4Q50dVMM_ComZWJ4fH4Lk#Qd`}(AMue z0d2L}Z$(j%rhh3-)1bAcsw&i;J$nF9N|9w5olb|<)m5Bx_`Z*n66f5mJO6hkgg|Re zQ4}0FZ~(0}Yinz?ZHu)QwQt`(#^dokI51!TUnZrT1CUi!k!2Zqo`2{a{jX+>A&z6h zFhpfphEj^6C_eZl;ql^1ms6_==i7)gl_YN(d}moul7E}JlAv31b5?OrT7b2?`fA&j zUav>fG^i+w==FLmFE8)vXk72_GjyPOl0I)8(`ua_*x( z58T+0$;qx+Ow$ytH8M#O(lo{Hg7^>l0+0M-kqdcBASIF2L>p^((~7_b$Tmb&hGwne zi`Tb2dVjaz!dpH+{flf%2MrwmMZ3w0X zfdSblm>Sx=;r44|cy*4~`iuU0d%X@`!l5!#^23E?zH z8Gi*Xg~n0lhEMD>eEr@DOT7utzBK0d#~o2Pq91CyogN+ONT!y*ObxG2_pmdTF$T3W z^-@aydZ|NCDx_{kNaHZI<1;rqj^1$z^cu&W3wY`|kBaN)b~K@t3bnKSPE-M7D-i2r?pn&Z zeQ%Bm`v})ywWiq6lvB$!Ba4cA96mhaN8i7QwiUfBChaYNR3vf0(=X>daV$q>8GjcK zDaIzECyV)kx7MPz9X?>W4X{;7>^zQsJSU3{PL*g~fpA1|KpaOn=Od-h`sxZ_{=y9a zWc>kA+`-`^gvX~2_jux&KVoec=ORky)7vu6jWMXLhYuhS;N!3x6VBI5ER71@U#szh z4pA85c|I$v1yTyKEFtQQ@S_3F^M9DMl00`vsqws)m;QbRWC2};a1I4ncljEZQlfTV zF8iaFffNJ_3;f`hmsmS_j!{~3X<0K}1?d}Pw?@PY85wMMFSU>eUtl~z)DUsl5{S+SKMh$NN^aUKIJi`DVx{IyFQ5|(OcWCg9Q%Ff%97Gto(D>)%K&Dm zB3sZ7hMar{gmkFbqpfS`=6w22&E372#*0XLT}+suqKF_eD6eKbopNq%Ort?9T!RTy z8efveV{VH)T3Zr`?JYk)1Akk);VVm;7edRL5jbsV>zXidTwH4~8;Z2Qj#VIRjc6TJ z?r4yxKoZA3GSq~gph`M8G2w6^xT9Om{m-Va5CS>Nz-+CE*l#cJrTY|aEbyoqbW6&z zVWWbquh_eH54|)bOMC`t%+j7N!@ke7DX5z%OT#WfCq(#D;-KQ8g?|n)7v=zb-=D{n zvv!yPh^VmE^6;$%_upfgt~R`W5~85P#||bWoenE`!}40g+4Y)pdBgc}h1F9IEkq=d z;>6fd`I?3?UtJ9OT=y&vx2^WG0jSEdB+v6JZbRGT{P3Ygs%S6I|L!bL9-DCF_J~j3 z1~=^U8Ds$}ijc~(x_?pdR<3#OLcmEgL=1gK<+P?dG<1gs+10JlIA#nzWIt@pM0T1-o zY0br}QnEbHH);8FI-P5Rt>&?LXngZN-?}U1?n4>BeaZ61YJb3cb<6osK%yZG@e;+g zqm+aFmczY<2eX!a{zV$QaaBg-`#$UI>zk9XEKBOTX6H!WhS*HFX=#J+9_{gN<5*tz zxFBMT-$xpVoMs_j=fB z>bjV)g-900000NkvXX Hu0mjf%XJKN delta 1591 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 KMNUMnLSTY?=Y|~s delta 1157 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 l2>7^XU?c(~0{+hg`~y diff --git a/textures/recycler.png b/textures/recycler.png index 40a9c9ecdecfcc2b8718b273c987a5d7bb9480d4..a18c75bb213d63419715b6bf8d97030468eac7d9 100644 GIT binary patch delta 2117 zcmV-L2)g(47T6G5iBL{Q4GJ0x0000DNk~Le0000W0000W2nGNE0CReJ^Z)<=24YJ` zL;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2jBx53@sB68lGH{ zTPuGDyh%hsR9M56mwAj;R~^Sc=iGbWI&T?f#(_Gdz?3yqKo%QJFo>;Ap~TdJ#bQcP z)0&WCQ%N&4NYSQ2RvU`A5VeXGNiD5d28{xxiAVrNs6s$MQW#2MmiKz+zW45Oj(@zF zx6D%NNp9Y|_iVrA`}_WWKk?#=FKVR}K@fkSwI&Dxq?DMZiRXFrA6jbwgb;&%A8JS` z@jQ=sJWezkB@&4ci^VVjB9RD6DWsG*jzc1m03Zkggb<~t|3#Jm`wLV#`sQrgCXq+0$NFin$mI!!DVqqDOUtu>ZqA*DoXJ*4Kh8$t*?&%?HDnwy*PJdb~_ zt}cAvM=6Eb)YL>anJDmAR?vLH}Z+8c(fn3ugS6KMU>=JR=*bLTFX1<2>~ zq|<3KnG92=OeUGE{YaYmzK=vA=w}fD!Wi00j*}q>{zEhx#rJ*8bUKY`n%K4tsG)Dv zaO@w)Y0q6{LUIDfPoLmO&)Xm+Wf^}oVG&~GXI3z-dHmqVXoc_lB$G*8*TsxPA|#VZ zu3x_n3@v%D z3CbV{sI9Ff91a%+NTpI$NUt0@C&#k~SHqov7N9|B$#t`xno)5U*bC4~SGh{m8>~Lj z%CmAIgZ82FN539dX8YvlHX#)%zhv&-=&m7R#Ihu7kJubUj1CiYDC{kp^06M zv3cPpOv^+Vf>kq~CU&C+gf99ZqM3Ys5-p!@83a*9#_dyDR@14hS{i?fgm~?{uk-6W zUSVwKID`un;E566Wa6ZW0Gz*Yp0B_94aSaaW{RH56fu?N8_oRq!5?8tlM`o7a`yb$ zikx6n5t~_wP^AKP?%Iht+JYQtrBGTi>8?qf{QOCF{_!X5I`;}Im#-}CY5Mp`_P6dw z>ay^WXoUY>xWc0Ki`joK-sGNOHiugO0wGWpfDM8Gvoidol#CrUmgT#bb7}OYA}?vE z>!|17E8gK-i=N`~t|y45qoqBuSQKLA_m0j^w(Q)>#`X=^V{9-ahuaUb>%cCSE?kNb zP9f`({q^uzdyt#5z)fVIJQu$%27u?0o$ zSbKUcneJ>=X6;S=Wz!jk|x7UYSLl10Sypf#qK^5rDJ`5GDpmkBh<%_^5N8G%F6_2jyHM_tx%~Fb%j^mKYWUBH&O??fUKD!AcYn1c+fTw7}tM9+d zjw{Pn1kMp z)|yX@yqkxIeWf?aDiwv%C&3Ps4;oASVlm}sY zzg6~-T5F_~r882gRIw{IP2%x*F&E_Xd4>-kj%8U@O+)2jQp(aneQkUw6e1pvqqU~5 v#Seu-rLH;}jh4#qa5zjVl`1LK*Ao5@k8s4CAM;NH00000NkvXXu0mjffT8r% delta 2919 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