diff --git a/breaker.lua b/breaker.lua index c7b0a19..bf17152 100644 --- a/breaker.lua +++ b/breaker.lua @@ -222,6 +222,35 @@ end +local function eject_item (pos, stack, eject_pos) + if utils.pipeworks_supported then + local node = utils.get_far_node (eject_pos) + + if node and minetest.get_item_group (node.name, "tube") > 0 then + local owner = nil + local meta = minetest.get_meta (pos) + + if meta then + local o = meta:get_string ("owner") + + if o ~= "" then + owner = o + end + end + + local vel = vector.subtract (eject_pos, pos) + + pipeworks.tube_inject_item (pos, pos, vel, stack, owner) + + return + end + end + + utils.item_drop (stack, nil, eject_pos) +end + + + local function break_node (pos, range) local node = minetest.get_node_or_nil (pos) @@ -242,7 +271,7 @@ local function break_node (pos, range) local eject_pos = get_breaker_side (pos, node.param2, "back") for i = 1, #drops do - utils.item_drop (drops[i], nil, eject_pos) + eject_item (pos, drops[i], eject_pos) end add_wear (pos, wear) @@ -324,7 +353,7 @@ end -local function after_place_node (pos, placer, itemstack, pointed_thing) +local function after_place_base (pos, placer, itemstack, pointed_thing) local meta = minetest.get_meta (pos) local spec = "formspec_version[3]\n".. @@ -342,6 +371,13 @@ local function after_place_node (pos, placer, itemstack, pointed_thing) inv:set_size ("tool", 1) inv:set_width ("tool", 1) +end + + + +local function after_place_node (pos, placer, itemstack, pointed_thing) + after_place_base (pos, placer, itemstack, pointed_thing) + utils.pipeworks_after_place (pos) -- If return true no item is taken from itemstack return false @@ -350,7 +386,7 @@ end local function after_place_node_locked (pos, placer, itemstack, pointed_thing) - after_place_node (pos, placer, itemstack, pointed_thing) + after_place_base (pos, placer, itemstack, pointed_thing) if placer and placer:is_player () then local meta = minetest.get_meta (pos) @@ -359,6 +395,8 @@ local function after_place_node_locked (pos, placer, itemstack, pointed_thing) meta:set_string ("infotext", "Breaker (owned by "..placer:get_player_name ()..")") end + utils.pipeworks_after_place (pos) + -- If return true no item is taken from itemstack return false end @@ -577,12 +615,126 @@ end +local function pipeworks_support () + if utils.pipeworks_supported then + return + { + priority = 100, + input_inventory = "tool", + connect_sides = { left = 1, right = 1, back = 1, bottom = 1, top = 1 }, + + insert_object = function (pos, node, stack, direction) + local meta = minetest.get_meta (pos) + local inv = (meta and meta:get_inventory ()) or nil + + if inv then + return inv:add_item ("tool", stack) + end + + return stack + end, + + can_insert = function (pos, node, stack, direction) + if stack and not stack:is_empty () then + local def = utils.find_item_def (stack:get_name ()) + + if def and def.tool_capabilities then + local meta = minetest.get_meta (pos) + local inv = (meta and meta:get_inventory ()) or nil + + if inv then + return inv:room_for_item ("tool", stack) + end + end + end + + return false + end, + + can_remove = function (pos, node, stack, dir) + -- returns the maximum number of items of that stack that can be removed + local meta = minetest.get_meta (pos) + local inv = (meta and meta:get_inventory ()) or nil + + if inv then + local slots = inv:get_size ("tool") + + for i = 1, slots, 1 do + local s = inv:get_stack ("tool", i) + + if s and not s:is_empty () and utils.is_same_item (stack, s) then + return s:get_count () + end + end + end + + return 0 + end, + + remove_items = function (pos, node, stack, dir, count) + -- removes count items and returns them + local meta = minetest.get_meta (pos) + local inv = (meta and meta:get_inventory ()) or nil + local left = count + + if inv then + local slots = inv:get_size ("tool") + + for i = 1, slots, 1 do + local s = inv:get_stack ("tool", i) + + if s and not s:is_empty () and utils.is_same_item (s, stack) then + if s:get_count () > left then + s:set_count (s:get_count () - left) + inv:set_stack ("tool", i, s) + left = 0 + else + left = left - s:get_count () + inv:set_stack ("tool", i, nil) + end + end + + if left == 0 then + break + end + end + end + + local result = ItemStack (stack) + result:set_count (count - left) + + return result + end + } + end + + return nil +end + + + +local breaker_groups = { cracky = 3 } +if utils.pipeworks_supported then + breaker_groups.tubedevice = 1 + breaker_groups.tubedevice_receiver = 1 +end + + + +local breaker_on_groups = { cracky = 3, not_in_creative_inventory = 1 } +if utils.pipeworks_supported then + breaker_on_groups.tubedevice = 1 + breaker_on_groups.tubedevice_receiver = 1 +end + + + minetest.register_node("lwcomponents:breaker", { description = S("Breaker"), tiles = { "lwbreaker.png", "lwbreaker.png", "lwbreaker.png", "lwbreaker.png", "lwbreaker_rear.png", "lwbreaker_face.png"}, is_ground_content = false, - groups = { cracky = 3 }, + groups = table.copy (breaker_groups), sounds = default.node_sound_stone_defaults (), paramtype = "none", param1 = 0, @@ -594,9 +746,11 @@ minetest.register_node("lwcomponents:breaker", { mesecons = mesecon_support (), digiline = digilines_support (), + tube = pipeworks_support (), on_receive_fields = on_receive_fields, can_dig = can_dig, + after_dig_node = utils.pipeworks_after_dig, after_place_node = after_place_node, on_blast = on_blast, on_timer = on_timer, @@ -611,7 +765,7 @@ minetest.register_node("lwcomponents:breaker_locked", { tiles = { "lwbreaker.png", "lwbreaker.png", "lwbreaker.png", "lwbreaker.png", "lwbreaker_rear.png", "lwbreaker_face.png"}, is_ground_content = false, - groups = { cracky = 3 }, + groups = table.copy (breaker_groups), sounds = default.node_sound_stone_defaults (), paramtype = "none", param1 = 0, @@ -623,9 +777,11 @@ minetest.register_node("lwcomponents:breaker_locked", { mesecons = mesecon_support (), digiline = digilines_support (), + tube = pipeworks_support (), on_receive_fields = on_receive_fields, can_dig = can_dig, + after_dig_node = utils.pipeworks_after_dig, after_place_node = after_place_node_locked, on_blast = on_blast, on_timer = on_timer, @@ -641,7 +797,7 @@ minetest.register_node("lwcomponents:breaker_on", { tiles = { "lwbreaker.png", "lwbreaker.png", "lwbreaker.png", "lwbreaker.png", "lwbreaker_rear.png", "lwbreaker_face_on.png"}, is_ground_content = false, - groups = { cracky = 3, not_in_creative_inventory = 1 }, + groups = table.copy (breaker_on_groups), sounds = default.node_sound_stone_defaults (), paramtype = "none", param1 = 0, @@ -654,9 +810,11 @@ minetest.register_node("lwcomponents:breaker_on", { mesecons = mesecon_support (), digiline = digilines_support (), + tube = pipeworks_support (), on_receive_fields = on_receive_fields, can_dig = can_dig, + after_dig_node = utils.pipeworks_after_dig, after_place_node = after_place_node, on_blast = on_blast, on_timer = on_timer, @@ -671,7 +829,7 @@ minetest.register_node("lwcomponents:breaker_locked_on", { tiles = { "lwbreaker.png", "lwbreaker.png", "lwbreaker.png", "lwbreaker.png", "lwbreaker_rear.png", "lwbreaker_face_on.png"}, is_ground_content = false, - groups = { cracky = 3, not_in_creative_inventory = 1 }, + groups = table.copy (breaker_on_groups), sounds = default.node_sound_stone_defaults (), paramtype = "none", param1 = 0, @@ -684,9 +842,11 @@ minetest.register_node("lwcomponents:breaker_locked_on", { mesecons = mesecon_support (), digiline = digilines_support (), + tube = pipeworks_support (), on_receive_fields = on_receive_fields, can_dig = can_dig, + after_dig_node = utils.pipeworks_after_dig, after_place_node = after_place_node_locked, on_blast = on_blast, on_timer = on_timer, diff --git a/cannon.lua b/cannon.lua index facb3e7..99d8e64 100644 --- a/cannon.lua +++ b/cannon.lua @@ -395,7 +395,7 @@ end -local function after_place_node (pos, placer, itemstack, pointed_thing) +local function after_place_base (pos, placer, itemstack, pointed_thing) local meta = minetest.get_meta (pos) meta:set_string ("sensitive", "true") @@ -407,6 +407,13 @@ local function after_place_node (pos, placer, itemstack, pointed_thing) inv:set_width ("main", 1) meta:set_string ("formspec", get_formspec (pos)) +end + + + +local function after_place_node (pos, placer, itemstack, pointed_thing) + after_place_base (pos, placer, itemstack, pointed_thing) + utils.pipeworks_after_place (pos) -- If return true no item is taken from itemstack return false @@ -415,7 +422,7 @@ end local function after_place_node_locked (pos, placer, itemstack, pointed_thing) - after_place_node (pos, placer, itemstack, pointed_thing) + after_place_base (pos, placer, itemstack, pointed_thing) if placer and placer:is_player () then local meta = minetest.get_meta (pos) @@ -424,6 +431,8 @@ local function after_place_node_locked (pos, placer, itemstack, pointed_thing) meta:set_string ("infotext", "Cannon (owned by "..placer:get_player_name ()..")") end + utils.pipeworks_after_place (pos) + -- If return true no item is taken from itemstack return false end @@ -838,6 +847,106 @@ end +local function pipeworks_support () + if utils.pipeworks_supported then + return + { + priority = 100, + input_inventory = "main", + connect_sides = { left = 1, right = 1, front = 1, back = 1, bottom = 1 }, + + insert_object = function (pos, node, stack, direction) + local meta = minetest.get_meta (pos) + local inv = (meta and meta:get_inventory ()) or nil + + if inv then + return inv:add_item ("main", stack) + end + + return stack + end, + + can_insert = function (pos, node, stack, direction) + local meta = minetest.get_meta (pos) + local inv = (meta and meta:get_inventory ()) or nil + + if inv then + return inv:room_for_item ("main", stack) + end + + return false + end, + + can_remove = function (pos, node, stack, dir) + -- returns the maximum number of items of that stack that can be removed + local meta = minetest.get_meta (pos) + local inv = (meta and meta:get_inventory ()) or nil + + if inv then + local slots = inv:get_size ("main") + + for i = 1, slots, 1 do + local s = inv:get_stack ("main", i) + + if s and not s:is_empty () and utils.is_same_item (stack, s) then + return s:get_count () + end + end + end + + return 0 + end, + + remove_items = function (pos, node, stack, dir, count) + -- removes count items and returns them + local meta = minetest.get_meta (pos) + local inv = (meta and meta:get_inventory ()) or nil + local left = count + + if inv then + local slots = inv:get_size ("main") + + for i = 1, slots, 1 do + local s = inv:get_stack ("main", i) + + if s and not s:is_empty () and utils.is_same_item (s, stack) then + if s:get_count () > left then + s:set_count (s:get_count () - left) + inv:set_stack ("main", i, s) + left = 0 + else + left = left - s:get_count () + inv:set_stack ("main", i, nil) + end + end + + if left == 0 then + break + end + end + end + + local result = ItemStack (stack) + result:set_count (count - left) + + return result + end + } + end + + return nil +end + + + +local cannon_groups = { cracky = 3 } +if utils.pipeworks_supported then + cannon_groups.tubedevice = 1 + cannon_groups.tubedevice_receiver = 1 +end + + + minetest.register_node("lwcomponents:cannon_blank", { description = S("Cannon blank"), drawtype = "airlike", @@ -917,7 +1026,7 @@ minetest.register_node("lwcomponents:cannon", { wield_image = "lwcannon_item.png", inventory_image = "lwcannon_item.png", is_ground_content = false, - groups = { cracky = 3 }, + groups = table.copy (cannon_groups), sounds = default.node_sound_stone_defaults (), paramtype = "light", paramtype2 = "facedir", @@ -928,12 +1037,14 @@ minetest.register_node("lwcomponents:cannon", { mesecons = mesecon_support (), digiline = digilines_support (), + tube = pipeworks_support (), on_construct = on_construct, on_destruct = on_destruct, on_place = on_place, on_receive_fields = on_receive_fields, can_dig = can_dig, + after_dig_node = utils.pipeworks_after_dig, after_place_node = after_place_node, on_blast = on_blast, on_rightclick = on_rightclick, @@ -979,7 +1090,7 @@ minetest.register_node("lwcomponents:cannon_locked", { wield_image = "lwcannon_item.png", inventory_image = "lwcannon_item.png", is_ground_content = false, - groups = { cracky = 3 }, + groups = table.copy (cannon_groups), sounds = default.node_sound_stone_defaults (), paramtype = "light", paramtype2 = "facedir", @@ -990,12 +1101,14 @@ minetest.register_node("lwcomponents:cannon_locked", { mesecons = mesecon_support (), digiline = digilines_support (), + tube = pipeworks_support (), on_construct = on_construct, on_destruct = on_destruct, on_place = on_place_locked, on_receive_fields = on_receive_fields, can_dig = can_dig, + after_dig_node = utils.pipeworks_after_dig, after_place_node = after_place_node_locked, on_blast = on_blast, on_rightclick = on_rightclick, diff --git a/change.log b/change.log index 11a9b8c..7e93554 100644 --- a/change.log +++ b/change.log @@ -118,3 +118,20 @@ v0.1.21 v0.1.22 * Added storage. + + +v0.1.23 +* Fixed storage indexer not taking items from storage properly. +* Added pipeworks support for: + Storage Indexer + Dropper + Collector + Dispenser + Breaker + Deployer + Cannon + Conduit +* Conduits now work in unloaded blocks. +* Fixed conduits sending items in groups. +* Fixed player attached to controller moving forever when they get blown up. +* Fixed pistons being powered from the pusher side. diff --git a/collector.lua b/collector.lua index fb46bc0..6454cad 100644 --- a/collector.lua +++ b/collector.lua @@ -148,7 +148,7 @@ end -local function after_place_node (pos, placer, itemstack, pointed_thing) +local function after_place_base (pos, placer, itemstack, pointed_thing) local meta = minetest.get_meta (pos) local is_off = itemstack and (itemstack:get_name () == "lwcomponents:collector" or itemstack:get_name () == "lwcomponents:collector_locked") @@ -162,6 +162,13 @@ local function after_place_node (pos, placer, itemstack, pointed_thing) inv:set_width ("main", 4) inv:set_size ("filter", 8) inv:set_width ("filter", 2) +end + + + +local function after_place_node (pos, placer, itemstack, pointed_thing) + after_place_base (pos, placer, itemstack, pointed_thing) + utils.pipeworks_after_place (pos) -- If return true no item is taken from itemstack return false @@ -170,7 +177,7 @@ end local function after_place_node_locked (pos, placer, itemstack, pointed_thing) - after_place_node (pos, placer, itemstack, pointed_thing) + after_place_base (pos, placer, itemstack, pointed_thing) if placer and placer:is_player () then local meta = minetest.get_meta (pos) @@ -179,6 +186,8 @@ local function after_place_node_locked (pos, placer, itemstack, pointed_thing) meta:set_string ("infotext", "Collector (owned by "..placer:get_player_name ()..")") end + utils.pipeworks_after_place (pos) + -- If return true no item is taken from itemstack return false end @@ -427,12 +436,120 @@ end +local function pipeworks_support () + if utils.pipeworks_supported then + return + { + priority = 100, + input_inventory = "main", + connect_sides = { left = 1, right = 1, front = 1, back = 1, bottom = 1, top = 1 }, + + insert_object = function (pos, node, stack, direction) + local meta = minetest.get_meta (pos) + local inv = (meta and meta:get_inventory ()) or nil + + if inv then + return inv:add_item ("main", stack) + end + + return stack + end, + + can_insert = function (pos, node, stack, direction) + local meta = minetest.get_meta (pos) + local inv = (meta and meta:get_inventory ()) or nil + + if inv then + return inv:room_for_item ("main", stack) + end + + return false + end, + + can_remove = function (pos, node, stack, dir) + -- returns the maximum number of items of that stack that can be removed + local meta = minetest.get_meta (pos) + local inv = (meta and meta:get_inventory ()) or nil + + if inv then + local slots = inv:get_size ("main") + + for i = 1, slots, 1 do + local s = inv:get_stack ("main", i) + + if s and not s:is_empty () and utils.is_same_item (stack, s) then + return s:get_count () + end + end + end + + return 0 + end, + + remove_items = function (pos, node, stack, dir, count) + -- removes count items and returns them + local meta = minetest.get_meta (pos) + local inv = (meta and meta:get_inventory ()) or nil + local left = count + + if inv then + local slots = inv:get_size ("main") + + for i = 1, slots, 1 do + local s = inv:get_stack ("main", i) + + if s and not s:is_empty () and utils.is_same_item (s, stack) then + if s:get_count () > left then + s:set_count (s:get_count () - left) + inv:set_stack ("main", i, s) + left = 0 + else + left = left - s:get_count () + inv:set_stack ("main", i, nil) + end + end + + if left == 0 then + break + end + end + end + + local result = ItemStack (stack) + result:set_count (count - left) + + return result + end + } + end + + return nil +end + + + +local collector_groups = { cracky = 3 } +if utils.pipeworks_supported then + collector_groups.tubedevice = 1 + collector_groups.tubedevice_receiver = 1 +end + + + +local collector_on_groups = { cracky = 3, not_in_creative_inventory = 1 } +if utils.pipeworks_supported then + collector_on_groups.tubedevice = 1 + collector_on_groups.tubedevice_receiver = 1 +end + + + minetest.register_node("lwcomponents:collector", { description = S("Collector"), tiles = { "lwcollector.png", "lwcollector.png", "lwcollector.png", "lwcollector.png", "lwcollector.png", "lwcollector.png"}, is_ground_content = false, - groups = { cracky = 3 }, + groups = table.copy (collector_groups), sounds = default.node_sound_stone_defaults (), paramtype = "none", param1 = 0, @@ -441,11 +558,13 @@ minetest.register_node("lwcomponents:collector", { _digistuff_channelcopier_fieldname = "channel", digiline = digilines_support (), + tube = pipeworks_support (), on_destruct = on_destruct, on_receive_fields = on_receive_fields, after_place_node = after_place_node, can_dig = can_dig, + after_dig_node = utils.pipeworks_after_dig, on_blast = on_blast, on_timer = on_timer, on_rightclick = on_rightclick @@ -458,7 +577,7 @@ minetest.register_node("lwcomponents:collector_locked", { tiles = { "lwcollector.png", "lwcollector.png", "lwcollector.png", "lwcollector.png", "lwcollector.png", "lwcollector.png"}, is_ground_content = false, - groups = { cracky = 3 }, + groups = table.copy (collector_groups), sounds = default.node_sound_stone_defaults (), paramtype = "none", param1 = 0, @@ -467,11 +586,13 @@ minetest.register_node("lwcomponents:collector_locked", { _digistuff_channelcopier_fieldname = "channel", digiline = digilines_support (), + tube = pipeworks_support (), on_destruct = on_destruct, on_receive_fields = on_receive_fields, after_place_node = after_place_node_locked, can_dig = can_dig, + after_dig_node = utils.pipeworks_after_dig, on_blast = on_blast, on_timer = on_timer, on_rightclick = on_rightclick @@ -484,7 +605,7 @@ minetest.register_node("lwcomponents:collector_on", { tiles = { "lwcollector_on.png", "lwcollector_on.png", "lwcollector_on.png", "lwcollector_on.png", "lwcollector_on.png", "lwcollector_on.png"}, is_ground_content = false, - groups = { cracky = 3, not_in_creative_inventory = 1 }, + groups = table.copy (collector_on_groups), sounds = default.node_sound_stone_defaults (), paramtype = "none", param1 = 0, @@ -493,11 +614,13 @@ minetest.register_node("lwcomponents:collector_on", { _digistuff_channelcopier_fieldname = "channel", digiline = digilines_support (), + tube = pipeworks_support (), on_destruct = on_destruct, on_receive_fields = on_receive_fields, after_place_node = after_place_node, can_dig = can_dig, + after_dig_node = utils.pipeworks_after_dig, on_blast = on_blast, on_timer = on_timer, on_rightclick = on_rightclick @@ -510,7 +633,7 @@ minetest.register_node("lwcomponents:collector_locked_on", { tiles = { "lwcollector_on.png", "lwcollector_on.png", "lwcollector_on.png", "lwcollector_on.png", "lwcollector_on.png", "lwcollector_on.png"}, is_ground_content = false, - groups = { cracky = 3, not_in_creative_inventory = 1 }, + groups = table.copy (collector_on_groups), sounds = default.node_sound_stone_defaults (), paramtype = "none", param1 = 0, @@ -519,11 +642,13 @@ minetest.register_node("lwcomponents:collector_locked_on", { _digistuff_channelcopier_fieldname = "channel", digiline = digilines_support (), + tube = pipeworks_support (), on_destruct = on_destruct, on_receive_fields = on_receive_fields, after_place_node = after_place_node_locked, can_dig = can_dig, + after_dig_node = utils.pipeworks_after_dig, on_blast = on_blast, on_timer = on_timer, on_rightclick = on_rightclick diff --git a/conduit.lua b/conduit.lua index 6fe8707..a51f5f3 100644 --- a/conduit.lua +++ b/conduit.lua @@ -12,6 +12,10 @@ local conduit_interval = 1.0 local conduit_connections = utils.connections:new (mod_storage, "conduit_connections") +-- forward declare +local run_initialize_forward = nil + + local function get_target_list (pos) local tlist = conduit_connections:get_connected_ids (pos) @@ -62,15 +66,18 @@ local function deliver_slot (pos, slot) local item = inv:get_stack ("transfer", slot) if transfer_data[slot] and item and not item:is_empty () then - local tmeta = minetest.get_meta (transfer_data[slot].pos) + local tnode = utils.get_far_node (transfer_data[slot].pos) - if tmeta then - local tinv = tmeta:get_inventory () + if tnode and (tnode.name == "lwcomponents:conduit" or + tnode.name == "lwcomponents:conduit_locked") then + local tmeta = minetest.get_meta (transfer_data[slot].pos) - if tinv then - tinv:add_item ("main", item) + if tmeta then + local tinv = tmeta:get_inventory () - --send_conduit_message (pos, target, slot) + if tinv then + tinv:add_item ("main", item) + end end end end @@ -138,7 +145,7 @@ end -local function delivered_earliest (pos) +local function deliver_earliest (pos) local meta = minetest.get_meta (pos) if meta then @@ -194,7 +201,8 @@ local function add_to_send_list (pos, item, destpos, distance) local slot = get_transfer_free_slot (pos) while slot < 1 do - delivered_earliest (pos) + deliver_earliest (pos) + slot = get_transfer_free_slot (pos) end local meta = minetest.get_meta (pos) @@ -210,15 +218,11 @@ local function add_to_send_list (pos, item, destpos, distance) due = minetest.get_us_time () + (transfer_rate * 1000000 * distance) } - inv:add_item ("transfer", item) + inv:set_stack ("transfer", slot, item) meta:set_string ("transfer_data", minetest.serialize (transfer_data)) - local timer = minetest.get_node_timer (pos) - - if not timer:is_started () then - timer:start (conduit_interval) - end + run_initialize_forward (pos) end end end @@ -292,8 +296,6 @@ local function send_to_target (pos, target, slot) stack:set_count (stack:get_count () - 1) inv:set_stack ("main", slot, stack) - --send_conduit_message (pos, target, slot) - return true, target, slot end end @@ -309,20 +311,42 @@ end -local function run_conduit (pos) +local function run_conduit (pos, id) + local node = utils.get_far_node (pos) + + if node and (node.name == "lwcomponents:conduit" or + node.name == "lwcomponents:conduit_locked") then + local meta = minetest.get_meta (pos) + + if meta and id == meta:get_int ("conduit_id") then + local automatic = meta:get_string ("automatic") == "true" + + if automatic then + send_to_target (pos) + end + + if run_deliveries (pos) or automatic then + minetest.after (conduit_interval, run_conduit, pos, id) + else + meta:set_int ("run_active", 0) + end + end + end +end + + + +local function run_initialize (pos) local meta = minetest.get_meta (pos) - local automatic = false if meta then - automatic = meta:get_string ("automatic") == "true" + if meta:get_int ("run_active") == 0 then + meta:set_int ("run_active", 1) + minetest.after (conduit_interval, run_conduit, pos, meta:get_int ("conduit_id")) + end end - - if automatic then - send_to_target (pos) - end - - return run_deliveries (pos) or automatic end +run_initialize_forward = run_initialize @@ -362,7 +386,7 @@ end -local function after_place_node (pos, placer, itemstack, pointed_thing) +local function after_place_base (pos, placer, itemstack, pointed_thing) local meta = minetest.get_meta (pos) local spec = "formspec_version[3]".. @@ -374,6 +398,7 @@ local function after_place_node (pos, placer, itemstack, pointed_thing) meta:set_string ("formspec", spec) meta:set_string ("transfer_data", minetest.serialize({ })) meta:set_string ("automatic", "false") + meta:set_int ("conduit_id", math.random (1000000)) local inv = meta:get_inventory () @@ -382,6 +407,13 @@ local function after_place_node (pos, placer, itemstack, pointed_thing) inv:set_size ("transfer", 32) inv:set_width ("transfer", 8) +end + + + +local function after_place_node (pos, placer, itemstack, pointed_thing) + after_place_base (pos, placer, itemstack, pointed_thing) + utils.pipeworks_after_place (pos) -- If return true no item is taken from itemstack return false @@ -390,7 +422,7 @@ end local function after_place_node_locked (pos, placer, itemstack, pointed_thing) - after_place_node (pos, placer, itemstack, pointed_thing) + after_place_base (pos, placer, itemstack, pointed_thing) if placer and placer:is_player () then local meta = minetest.get_meta (pos) @@ -399,6 +431,8 @@ local function after_place_node_locked (pos, placer, itemstack, pointed_thing) meta:set_string ("infotext", "Conduit (owned by "..placer:get_player_name ()..")") end + utils.pipeworks_after_place (pos) + -- If return true no item is taken from itemstack return false end @@ -492,11 +526,7 @@ local function on_receive_fields (pos, formname, fields, sender) meta:set_string ("automatic", fields.automatic) meta:set_string ("formspec", get_formspec (pos)) - local timer = minetest.get_node_timer (pos) - - if not timer:is_started () then - timer:start (conduit_interval) - end + run_initialize (pos) end end end @@ -592,12 +622,6 @@ end -local function on_timer (pos, elapsed) - return run_conduit (pos) -end - - - local function digilines_support () if utils.digilines_supported then return @@ -671,12 +695,112 @@ end +local function pipeworks_support () + if utils.pipeworks_supported then + return + { + priority = 100, + input_inventory = "main", + connect_sides = { left = 1, right = 1, front = 1, back = 1, bottom = 1, top = 1 }, + + insert_object = function (pos, node, stack, direction) + local meta = minetest.get_meta (pos) + local inv = (meta and meta:get_inventory ()) or nil + + if inv then + return inv:add_item ("main", stack) + end + + return stack + end, + + can_insert = function (pos, node, stack, direction) + local meta = minetest.get_meta (pos) + local inv = (meta and meta:get_inventory ()) or nil + + if inv then + return inv:room_for_item ("main", stack) + end + + return false + end, + + can_remove = function (pos, node, stack, dir) + -- returns the maximum number of items of that stack that can be removed + local meta = minetest.get_meta (pos) + local inv = (meta and meta:get_inventory ()) or nil + + if inv then + local slots = inv:get_size ("main") + + for i = 1, slots, 1 do + local s = inv:get_stack ("main", i) + + if s and not s:is_empty () and utils.is_same_item (stack, s) then + return s:get_count () + end + end + end + + return 0 + end, + + remove_items = function (pos, node, stack, dir, count) + -- removes count items and returns them + local meta = minetest.get_meta (pos) + local inv = (meta and meta:get_inventory ()) or nil + local left = count + + if inv then + local slots = inv:get_size ("main") + + for i = 1, slots, 1 do + local s = inv:get_stack ("main", i) + + if s and not s:is_empty () and utils.is_same_item (s, stack) then + if s:get_count () > left then + s:set_count (s:get_count () - left) + inv:set_stack ("main", i, s) + left = 0 + else + left = left - s:get_count () + inv:set_stack ("main", i, nil) + end + end + + if left == 0 then + break + end + end + end + + local result = ItemStack (stack) + result:set_count (count - left) + + return result + end + } + end + + return nil +end + + + +local conduit_groups = { cracky = 3 } +if utils.pipeworks_supported then + conduit_groups.tubedevice = 1 + conduit_groups.tubedevice_receiver = 1 +end + + + minetest.register_node("lwcomponents:conduit", { description = S("Conduit"), drawtype = "glasslike_framed", tiles = { "lwconduit_edge.png", "lwconduit.png" }, is_ground_content = false, - groups = { cracky = 3 }, + groups = table.copy (conduit_groups), sounds = default.node_sound_stone_defaults (), paramtype = "none", param1 = 0, @@ -687,14 +811,15 @@ minetest.register_node("lwcomponents:conduit", { mesecons = mesecon_support (), digiline = digilines_support (), + tube = pipeworks_support (), on_construct = on_construct, on_destruct = on_destruct, on_receive_fields = on_receive_fields, after_place_node = after_place_node, can_dig = can_dig, + after_dig_node = utils.pipeworks_after_dig, on_blast = on_blast, - on_timer = on_timer, on_rightclick = on_rightclick }) @@ -705,7 +830,7 @@ minetest.register_node("lwcomponents:conduit_locked", { drawtype = "glasslike_framed", tiles = { "lwconduit_edge.png", "lwconduit.png" }, is_ground_content = false, - groups = { cracky = 3 }, + groups = table.copy (conduit_groups), sounds = default.node_sound_stone_defaults (), paramtype = "none", param1 = 0, @@ -716,14 +841,15 @@ minetest.register_node("lwcomponents:conduit_locked", { mesecons = mesecon_support (), digiline = digilines_support (), + tube = pipeworks_support (), on_construct = on_construct, on_destruct = on_destruct, on_receive_fields = on_receive_fields, after_place_node = after_place_node_locked, can_dig = can_dig, + after_dig_node = utils.pipeworks_after_dig, on_blast = on_blast, - on_timer = on_timer, on_rightclick = on_rightclick }) @@ -745,4 +871,60 @@ utils.hopper_add_container({ +-- legacy code v0.1.23 (24-2-22) +local function convert_conduits () + local list = conduit_connections:get_full_list () + + for _, data in ipairs (list) do + local node = utils.get_far_node (data.pos) + + if node and (node.name == "lwcomponents:conduit" or + node.name == "lwcomponents:conduit_locked") then + local meta = minetest.get_meta (data.pos) + + if meta then + if meta:get_int ("conduit_id") == 0 then + meta:set_int ("conduit_id", math.random (1000000)) + + if meta:get_string ("automatic") == "true" then + meta:set_int ("run_active", 1) + else + local inv = meta:get_inventory () + + if inv and not inv:is_empty ("transfer") then + meta:set_int ("run_active", 1) + end + end + end + end + end + end +end + + + +local function restart_conduits () + convert_conduits () + + local list = conduit_connections:get_id_list () + + for _, data in ipairs (list) do + local meta = minetest.get_meta (data.pos) + + if meta and meta:get_int ("run_active") ~= 0 then + minetest.after (conduit_interval + (math.random (9) / 10), + run_conduit, data.pos, meta:get_int ("conduit_id")) + end + end + +end + + + +minetest.register_on_mods_loaded (function () + minetest.after (3.0, restart_conduits) +end) + + + end -- utils.digilines_supported or utils.mesecon_supported diff --git a/connections.lua b/connections.lua index 6e2f7ca..eaa3007 100644 --- a/connections.lua +++ b/connections.lua @@ -293,6 +293,40 @@ end +function connections:get_id_list () + local list = { } + + for spos, data in pairs (self.connector_list) do + if data.id then + list[#list + 1] = + { + pos = minetest.string_to_pos (spos), + id = data.id + } + end + end + + return list +end + + + +function connections:get_full_list () + local list = { } + + for spos, data in pairs (self.connector_list) do + list[#list + 1] = + { + pos = minetest.string_to_pos (spos), + id = data.id + } + end + + return list +end + + + return connections diff --git a/depends.txt b/depends.txt index 45e063d..5a8ebf6 100644 --- a/depends.txt +++ b/depends.txt @@ -5,3 +5,4 @@ unifieddyes? intllib? hopper? digistuff? +pipeworks? diff --git a/deployer.lua b/deployer.lua index 994023d..30785eb 100644 --- a/deployer.lua +++ b/deployer.lua @@ -292,7 +292,7 @@ end -local function after_place_node (pos, placer, itemstack, pointed_thing) +local function after_place_base (pos, placer, itemstack, pointed_thing) local meta = minetest.get_meta (pos) local spec = "formspec_version[3]\n".. @@ -310,6 +310,13 @@ local function after_place_node (pos, placer, itemstack, pointed_thing) inv:set_size ("main", 16) inv:set_width ("main", 4) +end + + + +local function after_place_node (pos, placer, itemstack, pointed_thing) + after_place_base (pos, placer, itemstack, pointed_thing) + utils.pipeworks_after_place (pos) -- If return true no item is taken from itemstack return false @@ -318,7 +325,7 @@ end local function after_place_node_locked (pos, placer, itemstack, pointed_thing) - after_place_node (pos, placer, itemstack, pointed_thing) + after_place_base (pos, placer, itemstack, pointed_thing) if placer and placer:is_player () then local meta = minetest.get_meta (pos) @@ -327,6 +334,8 @@ local function after_place_node_locked (pos, placer, itemstack, pointed_thing) meta:set_string ("infotext", "Deployer (owned by "..placer:get_player_name ()..")") end + utils.pipeworks_after_place (pos) + -- If return true no item is taken from itemstack return false end @@ -530,12 +539,120 @@ end +local function pipeworks_support () + if utils.pipeworks_supported then + return + { + priority = 100, + input_inventory = "main", + connect_sides = { left = 1, right = 1, back = 1, bottom = 1, top = 1 }, + + insert_object = function (pos, node, stack, direction) + local meta = minetest.get_meta (pos) + local inv = (meta and meta:get_inventory ()) or nil + + if inv then + return inv:add_item ("main", stack) + end + + return stack + end, + + can_insert = function (pos, node, stack, direction) + local meta = minetest.get_meta (pos) + local inv = (meta and meta:get_inventory ()) or nil + + if inv then + return inv:room_for_item ("main", stack) + end + + return false + end, + + can_remove = function (pos, node, stack, dir) + -- returns the maximum number of items of that stack that can be removed + local meta = minetest.get_meta (pos) + local inv = (meta and meta:get_inventory ()) or nil + + if inv then + local slots = inv:get_size ("main") + + for i = 1, slots, 1 do + local s = inv:get_stack ("main", i) + + if s and not s:is_empty () and utils.is_same_item (stack, s) then + return s:get_count () + end + end + end + + return 0 + end, + + remove_items = function (pos, node, stack, dir, count) + -- removes count items and returns them + local meta = minetest.get_meta (pos) + local inv = (meta and meta:get_inventory ()) or nil + local left = count + + if inv then + local slots = inv:get_size ("main") + + for i = 1, slots, 1 do + local s = inv:get_stack ("main", i) + + if s and not s:is_empty () and utils.is_same_item (s, stack) then + if s:get_count () > left then + s:set_count (s:get_count () - left) + inv:set_stack ("main", i, s) + left = 0 + else + left = left - s:get_count () + inv:set_stack ("main", i, nil) + end + end + + if left == 0 then + break + end + end + end + + local result = ItemStack (stack) + result:set_count (count - left) + + return result + end + } + end + + return nil +end + + + +local deployer_groups = { cracky = 3 } +if utils.pipeworks_supported then + deployer_groups.tubedevice = 1 + deployer_groups.tubedevice_receiver = 1 +end + + + +local deployer_on_groups = { cracky = 3, not_in_creative_inventory = 1 } +if utils.pipeworks_supported then + deployer_on_groups.tubedevice = 1 + deployer_on_groups.tubedevice_receiver = 1 +end + + + minetest.register_node("lwcomponents:deployer", { description = S("Deployer"), tiles = { "lwdeployer.png", "lwdeployer.png", "lwdeployer.png", "lwdeployer.png", "lwdeployer.png", "lwdeployer_face.png"}, is_ground_content = false, - groups = { cracky = 3 }, + groups = table.copy (deployer_groups), sounds = default.node_sound_stone_defaults (), paramtype = "none", param1 = 0, @@ -546,10 +663,12 @@ minetest.register_node("lwcomponents:deployer", { mesecons = mesecon_support (), digiline = digilines_support (), + tube = pipeworks_support (), on_receive_fields = on_receive_fields, after_place_node = after_place_node, can_dig = can_dig, + after_dig_node = utils.pipeworks_after_dig, on_blast = on_blast, on_timer = on_timer, on_rightclick = on_rightclick @@ -562,7 +681,7 @@ minetest.register_node("lwcomponents:deployer_locked", { tiles = { "lwdeployer.png", "lwdeployer.png", "lwdeployer.png", "lwdeployer.png", "lwdeployer.png", "lwdeployer_face.png"}, is_ground_content = false, - groups = { cracky = 3 }, + groups = table.copy (deployer_groups), sounds = default.node_sound_stone_defaults (), paramtype = "none", param1 = 0, @@ -573,10 +692,12 @@ minetest.register_node("lwcomponents:deployer_locked", { mesecons = mesecon_support (), digiline = digilines_support (), + tube = pipeworks_support (), on_receive_fields = on_receive_fields, after_place_node = after_place_node_locked, can_dig = can_dig, + after_dig_node = utils.pipeworks_after_dig, on_blast = on_blast, on_timer = on_timer, on_rightclick = on_rightclick @@ -590,7 +711,7 @@ minetest.register_node("lwcomponents:deployer_on", { tiles = { "lwdeployer.png", "lwdeployer.png", "lwdeployer.png", "lwdeployer.png", "lwdeployer.png", "lwdeployer_face_on.png"}, is_ground_content = false, - groups = { cracky = 3, not_in_creative_inventory = 1 }, + groups = table.copy (deployer_on_groups), sounds = default.node_sound_stone_defaults (), paramtype = "none", param1 = 0, @@ -603,9 +724,11 @@ minetest.register_node("lwcomponents:deployer_on", { mesecons = mesecon_support (), digiline = digilines_support (), + tube = pipeworks_support (), on_receive_fields = on_receive_fields, can_dig = can_dig, + after_dig_node = utils.pipeworks_after_dig, after_place_node = after_place_node, on_blast = on_blast, on_timer = on_timer, @@ -619,7 +742,7 @@ minetest.register_node("lwcomponents:deployer_locked_on", { tiles = { "lwdeployer.png", "lwdeployer.png", "lwdeployer.png", "lwdeployer.png", "lwdeployer.png", "lwdeployer_face_on.png"}, is_ground_content = false, - groups = { cracky = 3, not_in_creative_inventory = 1 }, + groups = table.copy (deployer_on_groups), sounds = default.node_sound_stone_defaults (), paramtype = "none", param1 = 0, @@ -632,9 +755,11 @@ minetest.register_node("lwcomponents:deployer_locked_on", { mesecons = mesecon_support (), digiline = digilines_support (), + tube = pipeworks_support (), on_receive_fields = on_receive_fields, can_dig = can_dig, + after_dig_node = utils.pipeworks_after_dig, after_place_node = after_place_node_locked, on_blast = on_blast, on_timer = on_timer, diff --git a/detector.lua b/detector.lua index e8be173..0dfca7b 100644 --- a/detector.lua +++ b/detector.lua @@ -410,7 +410,6 @@ local function after_place_node (pos, placer, itemstack, pointed_thing) local is_off = itemstack and (itemstack:get_name () == "lwcomponents:detector" or itemstack:get_name () == "lwcomponents:detector_locked") - meta:set_string ("inventory", "{ main = { }, filter = { } }") meta:set_string ("formspec", get_form_spec (is_off, 1, 0, 0, 0, 0, 1)) meta:set_string ("entities", "false") diff --git a/dispenser.lua b/dispenser.lua index 5777932..cf055ec 100644 --- a/dispenser.lua +++ b/dispenser.lua @@ -182,7 +182,7 @@ end -local function after_place_node (pos, placer, itemstack, pointed_thing) +local function after_place_base (pos, placer, itemstack, pointed_thing) local meta = minetest.get_meta (pos) local spec = "formspec_version[3]\n".. @@ -200,6 +200,13 @@ local function after_place_node (pos, placer, itemstack, pointed_thing) inv:set_size ("main", 16) inv:set_width ("main", 4) +end + + + +local function after_place_node (pos, placer, itemstack, pointed_thing) + after_place_base (pos, placer, itemstack, pointed_thing) + utils.pipeworks_after_place (pos) -- If return true no item is taken from itemstack return false @@ -208,7 +215,7 @@ end local function after_place_node_locked (pos, placer, itemstack, pointed_thing) - after_place_node (pos, placer, itemstack, pointed_thing) + after_place_base (pos, placer, itemstack, pointed_thing) if placer and placer:is_player () then local meta = minetest.get_meta (pos) @@ -217,6 +224,8 @@ local function after_place_node_locked (pos, placer, itemstack, pointed_thing) meta:set_string ("infotext", "Dispenser (owned by "..placer:get_player_name ()..")") end + utils.pipeworks_after_place (pos) + -- If return true no item is taken from itemstack return false end @@ -412,12 +421,112 @@ end +local function pipeworks_support () + if utils.pipeworks_supported then + return + { + priority = 100, + input_inventory = "main", + connect_sides = { left = 1, right = 1, back = 1, bottom = 1, top = 1 }, + + insert_object = function (pos, node, stack, direction) + local meta = minetest.get_meta (pos) + local inv = (meta and meta:get_inventory ()) or nil + + if inv then + return inv:add_item ("main", stack) + end + + return stack + end, + + can_insert = function (pos, node, stack, direction) + local meta = minetest.get_meta (pos) + local inv = (meta and meta:get_inventory ()) or nil + + if inv then + return inv:room_for_item ("main", stack) + end + + return false + end, + + can_remove = function (pos, node, stack, dir) + -- returns the maximum number of items of that stack that can be removed + local meta = minetest.get_meta (pos) + local inv = (meta and meta:get_inventory ()) or nil + + if inv then + local slots = inv:get_size ("main") + + for i = 1, slots, 1 do + local s = inv:get_stack ("main", i) + + if s and not s:is_empty () and utils.is_same_item (stack, s) then + return s:get_count () + end + end + end + + return 0 + end, + + remove_items = function (pos, node, stack, dir, count) + -- removes count items and returns them + local meta = minetest.get_meta (pos) + local inv = (meta and meta:get_inventory ()) or nil + local left = count + + if inv then + local slots = inv:get_size ("main") + + for i = 1, slots, 1 do + local s = inv:get_stack ("main", i) + + if s and not s:is_empty () and utils.is_same_item (s, stack) then + if s:get_count () > left then + s:set_count (s:get_count () - left) + inv:set_stack ("main", i, s) + left = 0 + else + left = left - s:get_count () + inv:set_stack ("main", i, nil) + end + end + + if left == 0 then + break + end + end + end + + local result = ItemStack (stack) + result:set_count (count - left) + + return result + end + } + end + + return nil +end + + + +local dispenser_groups = { cracky = 3 } +if utils.pipeworks_supported then + dispenser_groups.tubedevice = 1 + dispenser_groups.tubedevice_receiver = 1 +end + + + minetest.register_node("lwcomponents:dispenser", { description = S("Dispenser"), tiles = { "lwdispenser.png", "lwdispenser.png", "lwdispenser.png", "lwdispenser.png", "lwdispenser.png", "lwdispenser_face.png"}, is_ground_content = false, - groups = { cracky = 3 }, + groups = table.copy (dispenser_groups), sounds = default.node_sound_stone_defaults (), paramtype = "none", param1 = 0, @@ -428,10 +537,12 @@ minetest.register_node("lwcomponents:dispenser", { mesecons = mesecon_support (), digiline = digilines_support (), + tube = pipeworks_support (), on_receive_fields = on_receive_fields, after_place_node = after_place_node, can_dig = can_dig, + after_dig_node = utils.pipeworks_after_dig, on_blast = on_blast, on_rightclick = on_rightclick }) @@ -443,7 +554,7 @@ minetest.register_node("lwcomponents:dispenser_locked", { tiles = { "lwdispenser.png", "lwdispenser.png", "lwdispenser.png", "lwdispenser.png", "lwdispenser.png", "lwdispenser_face.png"}, is_ground_content = false, - groups = { cracky = 3 }, + groups = table.copy (dispenser_groups), sounds = default.node_sound_stone_defaults (), paramtype = "none", param1 = 0, @@ -454,10 +565,12 @@ minetest.register_node("lwcomponents:dispenser_locked", { mesecons = mesecon_support (), digiline = digilines_support (), + tube = pipeworks_support (), on_receive_fields = on_receive_fields, after_place_node = after_place_node_locked, can_dig = can_dig, + after_dig_node = utils.pipeworks_after_dig, on_blast = on_blast, on_rightclick = on_rightclick }) diff --git a/dropper.lua b/dropper.lua index e7ab25f..e628a43 100644 --- a/dropper.lua +++ b/dropper.lua @@ -118,7 +118,7 @@ end -local function after_place_node (pos, placer, itemstack, pointed_thing) +local function after_place_base (pos, placer, itemstack, pointed_thing) local meta = minetest.get_meta (pos) local spec = "formspec_version[3]\n".. @@ -136,6 +136,13 @@ local function after_place_node (pos, placer, itemstack, pointed_thing) inv:set_size ("main", 16) inv:set_width ("main", 4) +end + + + +local function after_place_node (pos, placer, itemstack, pointed_thing) + after_place_base (pos, placer, itemstack, pointed_thing) + utils.pipeworks_after_place (pos) -- If return true no item is taken from itemstack return false @@ -144,7 +151,7 @@ end local function after_place_node_locked (pos, placer, itemstack, pointed_thing) - after_place_node (pos, placer, itemstack, pointed_thing) + after_place_base (pos, placer, itemstack, pointed_thing) if placer and placer:is_player () then local meta = minetest.get_meta (pos) @@ -153,6 +160,8 @@ local function after_place_node_locked (pos, placer, itemstack, pointed_thing) meta:set_string ("infotext", "Dropper (owned by "..placer:get_player_name ()..")") end + utils.pipeworks_after_place (pos) + -- If return true no item is taken from itemstack return false end @@ -348,12 +357,112 @@ end +local function pipeworks_support () + if utils.pipeworks_supported then + return + { + priority = 100, + input_inventory = "main", + connect_sides = { left = 1, right = 1, back = 1, bottom = 1, top = 1 }, + + insert_object = function (pos, node, stack, direction) + local meta = minetest.get_meta (pos) + local inv = (meta and meta:get_inventory ()) or nil + + if inv then + return inv:add_item ("main", stack) + end + + return stack + end, + + can_insert = function (pos, node, stack, direction) + local meta = minetest.get_meta (pos) + local inv = (meta and meta:get_inventory ()) or nil + + if inv then + return inv:room_for_item ("main", stack) + end + + return false + end, + + can_remove = function (pos, node, stack, dir) + -- returns the maximum number of items of that stack that can be removed + local meta = minetest.get_meta (pos) + local inv = (meta and meta:get_inventory ()) or nil + + if inv then + local slots = inv:get_size ("main") + + for i = 1, slots, 1 do + local s = inv:get_stack ("main", i) + + if s and not s:is_empty () and utils.is_same_item (stack, s) then + return s:get_count () + end + end + end + + return 0 + end, + + remove_items = function (pos, node, stack, dir, count) + -- removes count items and returns them + local meta = minetest.get_meta (pos) + local inv = (meta and meta:get_inventory ()) or nil + local left = count + + if inv then + local slots = inv:get_size ("main") + + for i = 1, slots, 1 do + local s = inv:get_stack ("main", i) + + if s and not s:is_empty () and utils.is_same_item (s, stack) then + if s:get_count () > left then + s:set_count (s:get_count () - left) + inv:set_stack ("main", i, s) + left = 0 + else + left = left - s:get_count () + inv:set_stack ("main", i, nil) + end + end + + if left == 0 then + break + end + end + end + + local result = ItemStack (stack) + result:set_count (count - left) + + return result + end + } + end + + return nil +end + + + +local dropper_groups = { cracky = 3 } +if utils.pipeworks_supported then + dropper_groups.tubedevice = 1 + dropper_groups.tubedevice_receiver = 1 +end + + + minetest.register_node("lwcomponents:dropper", { description = S("Dropper"), tiles = { "lwdropper.png", "lwdropper.png", "lwdropper.png", "lwdropper.png", "lwdropper.png", "lwdropper_face.png"}, is_ground_content = false, - groups = { cracky = 3 }, + groups = table.copy (dropper_groups), sounds = default.node_sound_stone_defaults (), paramtype = "none", param1 = 0, @@ -364,10 +473,12 @@ minetest.register_node("lwcomponents:dropper", { mesecons = mesecon_support (), digiline = digilines_support (), + tube = pipeworks_support (), on_receive_fields = on_receive_fields, after_place_node = after_place_node, can_dig = can_dig, + after_dig_node = utils.pipeworks_after_dig, on_blast = on_blast, on_rightclick = on_rightclick }) @@ -379,7 +490,7 @@ minetest.register_node("lwcomponents:dropper_locked", { tiles = { "lwdropper.png", "lwdropper.png", "lwdropper.png", "lwdropper.png", "lwdropper.png", "lwdropper_face.png"}, is_ground_content = false, - groups = { cracky = 3 }, + groups = table.copy (dropper_groups), sounds = default.node_sound_stone_defaults (), paramtype = "none", param1 = 0, @@ -390,10 +501,12 @@ minetest.register_node("lwcomponents:dropper_locked", { mesecons = mesecon_support (), digiline = digilines_support (), + tube = pipeworks_support (), on_receive_fields = on_receive_fields, after_place_node = after_place_node_locked, can_dig = can_dig, + after_dig_node = utils.pipeworks_after_dig, on_blast = on_blast, on_rightclick = on_rightclick }) diff --git a/explode.lua b/explode.lua index eacf0a3..971ac28 100644 --- a/explode.lua +++ b/explode.lua @@ -70,21 +70,21 @@ end -local function is_same_item (stack1, stack2) - local copy1 = ItemStack (stack1) - local copy2 = ItemStack (stack2) +--local function is_same_item (stack1, stack2) + --local copy1 = ItemStack (stack1) + --local copy2 = ItemStack (stack2) - if copy1 and copy2 then - copy1:set_count (1) - copy2:set_count (1) + --if copy1 and copy2 then + --copy1:set_count (1) + --copy2:set_count (1) - if copy1:to_string () == copy2:to_string () then - return true - end - end + --if copy1:to_string () == copy2:to_string () then + --return true + --end + --end - return false -end + --return false +--end @@ -143,7 +143,7 @@ local function add_drops (drops, drop) if item and not item:is_empty () then local existing = drops[item:get_name ()] - if existing and is_same_item (item, existing) then + if existing and utils.is_same_item (item, existing) then existing:set_count (existing:get_count () + item:get_count ()) else drops[item:get_name ()] = item @@ -228,48 +228,74 @@ end local function explode_entities (pos, radius, damage, drops) local objs = minetest.get_objects_inside_radius (pos, radius) - for _, obj in pairs (objs) do - local obj_pos = obj:get_pos () - local dir = vector.direction (pos, obj_pos) - local dist = vector.length (vector.subtract (obj_pos, pos)) - local vel = vector.multiply (dir, ((radius + 1) - dist) / (radius + 1) * damage * 5) + for _, obj in ipairs (objs) do + -- could be detached player from controller + if obj.get_pos and obj:get_pos () then + local obj_pos = obj:get_pos () + local dir = vector.direction (pos, obj_pos) + local dist = vector.length (vector.subtract (obj_pos, pos)) + local vel = vector.multiply (dir, ((radius + 1) - dist) / (radius + 1) * damage * 5) - if entity_is_drop (obj) then - obj:add_velocity (vel) - - elseif not obj:get_armor_groups ().immortal then - - local ent_damage = ((radius - dist) / radius * damage / 2) + (damage / 2) - local reason = { type = "set_hp", from = "lwcomponents" } - - if obj:is_player() then + if entity_is_drop (obj) then obj:add_velocity (vel) - obj:set_hp (obj:get_hp() - ent_damage, reason) + elseif not obj:get_armor_groups ().immortal then - else - local luaobj = obj:get_luaentity() + local ent_damage = ((radius - dist) / radius * damage / 2) + (damage / 2) + local reason = { type = "set_hp", from = "lwcomponents" } - -- object might have disappeared somehow - if luaobj then - local do_damage = true - local do_knockback = true - local entity_drops = {} - local objdef = minetest.registered_entities[luaobj.name] + if obj:is_player() then + local parent = obj:get_attach () - if objdef and objdef.on_blast then - do_damage, do_knockback, entity_drops = objdef.on_blast (luaobj, ent_damage) + if parent then + obj:set_detach () end - if do_knockback then - obj:add_velocity (vel) - end + obj:add_velocity (vel) + obj:set_hp (obj:get_hp () - ent_damage, reason) - if do_damage then - obj:set_hp (obj:get_hp() - ent_damage, reason) - end + else + local luaobj = obj:get_luaentity () - add_drops (drops, entity_drops) + -- object might have disappeared somehow + if luaobj then + if luaobj.name == "digistuff:controller_entity" then + for _, child in ipairs (obj:get_children ()) do + if child:is_player () then + local def = utils.find_item_def ("digistuff:controller_programmed") + + if def and def.on_rightclick then + def.on_rightclick (obj:get_pos (), ItemStack (), child) + + local ent_damage = ((radius - dist) / radius * damage / 2) + (damage / 2) + local reason = { type = "set_hp", from = "lwcomponents" } + + child:add_velocity (vel) + child:set_hp (child:get_hp () - ent_damage, reason) + end + end + end + else + local do_damage = true + local do_knockback = true + local entity_drops = {} + local objdef = minetest.registered_entities[luaobj.name] + + if objdef and objdef.on_blast then + do_damage, do_knockback, entity_drops = objdef.on_blast (luaobj, ent_damage) + end + + if do_knockback then + obj:add_velocity (vel) + end + + if do_damage then + obj:set_hp (obj:get_hp() - ent_damage, reason) + end + + add_drops (drops, entity_drops) + end + end end end end @@ -404,7 +430,7 @@ function utils.boom (pos, -- center of explosion if not utils.is_protected (pos, nil) then local center_node = utils.get_far_node (pos) - if not node or node.name == "air" then + if not center_node or center_node.name == "air" then center_free = true end end diff --git a/init.lua b/init.lua index 389c170..99fa989 100644 --- a/init.lua +++ b/init.lua @@ -1,4 +1,4 @@ -local version = "0.1.22" +local version = "0.1.23" local mod_storage = minetest.get_mod_storage () diff --git a/mod.conf b/mod.conf index d5c44f8..0f3912a 100644 --- a/mod.conf +++ b/mod.conf @@ -3,4 +3,4 @@ description = Various components for mesecons and digilines. title = LWComponents name = lwcomponents depends = default -optional_depends = mesecons, digilines, unifieddyes, intllib, hopper, digistuff +optional_depends = mesecons, digilines, unifieddyes, intllib, hopper, digistuff, pipeworks diff --git a/pistons.lua b/pistons.lua index 52a5999..7c8d85b 100644 --- a/pistons.lua +++ b/pistons.lua @@ -635,7 +635,18 @@ local function mesecon_support () { effector = { - rules = utils.mesecon_default_rules, + rules = function (node) + local dir = vector.multiply (minetest.facedir_to_dir (node.param2), -1) + local rules = table.copy (utils.mesecon_default_rules) + + for i = #rules, 1, -1 do + if vector.equals (rules[i], dir) then + table.remove (rules, i) + end + end + + return rules + end, action_on = function (pos, node) -- do something to turn the effector on @@ -716,7 +727,7 @@ minetest.register_node("lwcomponents:piston", { is_ground_content = false, groups = { cracky = 3 }, sounds = default.node_sound_stone_defaults (), - paramtype = "none", + paramtype = "light", param1 = 0, paramtype2 = "facedir", param2 = 0, @@ -763,7 +774,7 @@ minetest.register_node("lwcomponents:piston_1", { is_ground_content = false, groups = { cracky = 3 , not_in_creative_inventory = 1 }, sounds = default.node_sound_stone_defaults (), - paramtype = "none", + paramtype = "light", param1 = 0, paramtype2 = "facedir", param2 = 0, @@ -810,7 +821,7 @@ minetest.register_node("lwcomponents:piston_2", { is_ground_content = false, groups = { cracky = 3 , not_in_creative_inventory = 1 }, sounds = default.node_sound_stone_defaults (), - paramtype = "none", + paramtype = "light", param1 = 0, paramtype2 = "facedir", param2 = 0, @@ -840,7 +851,7 @@ minetest.register_node("lwcomponents:piston_sticky", { is_ground_content = false, groups = { cracky = 3 }, sounds = default.node_sound_stone_defaults (), - paramtype = "none", + paramtype = "light", param1 = 0, paramtype2 = "facedir", param2 = 0, @@ -887,7 +898,7 @@ minetest.register_node("lwcomponents:piston_sticky_1", { is_ground_content = false, groups = { cracky = 3 , not_in_creative_inventory = 1 }, sounds = default.node_sound_stone_defaults (), - paramtype = "none", + paramtype = "light", param1 = 0, paramtype2 = "facedir", param2 = 0, @@ -934,7 +945,7 @@ minetest.register_node("lwcomponents:piston_sticky_2", { is_ground_content = false, groups = { cracky = 3 , not_in_creative_inventory = 1 }, sounds = default.node_sound_stone_defaults (), - paramtype = "none", + paramtype = "light", param1 = 0, paramtype2 = "facedir", param2 = 0, diff --git a/player_button.lua b/player_button.lua index 1392840..1c0718e 100644 --- a/player_button.lua +++ b/player_button.lua @@ -226,7 +226,9 @@ minetest.register_node ("lwcomponents:player_button_on", { }, after_destruct = digistuff.remove_receiver, --- on_rightclick = player_button_push, + on_rightclick = function (pos, node, clicker, itemstack, pointed_thing) + -- so clicking when depressed doesn't place node + end, on_timer = player_button_turnoff, }) diff --git a/readme.txt b/readme.txt index 323ff78..fbe8bf2 100644 --- a/readme.txt +++ b/readme.txt @@ -13,7 +13,7 @@ CC BY-SA 3.0 Version ======= -0.1.22 +0.1.23 Minetest Version diff --git a/storage.lua b/storage.lua index 170265b..a9e6688 100644 --- a/storage.lua +++ b/storage.lua @@ -371,18 +371,6 @@ end -local function is_same_item (item1, item2) - local copy1 = ItemStack (item1) - local copy2 = ItemStack (item2) - - copy1:set_count (1) - copy2:set_count (1) - - return copy1:to_string () == copy2:to_string () -end - - - local function output_items (pos, name, count) if count < 1 then return 0 @@ -427,14 +415,14 @@ local function output_items (pos, name, count) if tinv then local s = tinv:get_stack ("main", item[i].slot) - if is_same_item (name, s) then + if utils.is_same_item (name, s) then if s:get_count () > left then - left = 0 s:set_count (s:get_count () - left) tinv:set_stack ("main", item[i].slot, s) + left = 0 else - left = left - s:get_count () tinv:set_stack ("main", item[i].slot, nil) + left = left - s:get_count () end end @@ -464,7 +452,7 @@ local function consolidate_itemstacks (item1, item2) local copy1 = ItemStack (item1) local copy2 = ItemStack (item2) - if is_same_item (copy1, copy2) then + if utils.is_same_item (copy1, copy2) then local count = copy1:get_stack_max () - copy1:get_count () if count > copy2:get_count () then @@ -852,7 +840,7 @@ end -local function indexer_after_place_node (pos, placer, itemstack, pointed_thing) +local function indexer_after_place_base (pos, placer, itemstack, pointed_thing) local meta = minetest.get_meta (pos) meta:set_string ("inventory", "{ input = { }, output = { }, filter = { } }") @@ -866,6 +854,13 @@ local function indexer_after_place_node (pos, placer, itemstack, pointed_thing) inv:set_width ("output", 4) inv:set_size ("filter", 8) inv:set_width ("filter", 2) +end + + + +local function indexer_after_place_node (pos, placer, itemstack, pointed_thing) + indexer_after_place_base (pos, placer, itemstack, pointed_thing) + utils.pipeworks_after_place (pos) -- If return true no item is taken from itemstack return false @@ -874,7 +869,7 @@ end local function indexer_after_place_node_locked (pos, placer, itemstack, pointed_thing) - indexer_after_place_node (pos, placer, itemstack, pointed_thing) + indexer_after_place_base (pos, placer, itemstack, pointed_thing) if placer and placer:is_player () then local meta = minetest.get_meta (pos) @@ -883,6 +878,8 @@ local function indexer_after_place_node_locked (pos, placer, itemstack, pointed_ meta:set_string ("infotext", "Storage Indexer (owned by "..placer:get_player_name ()..")") end + utils.pipeworks_after_place (pos) + -- If return true no item is taken from itemstack return false end @@ -1261,6 +1258,108 @@ end +local function pipeworks_support () + if utils.pipeworks_supported then + return + { + priority = 100, + input_inventory = "output", + connect_sides = { left = 1, right = 1, front = 1, back = 1, bottom = 1, top = 1 }, + + insert_object = function (pos, node, stack, direction) + local meta = minetest.get_meta (pos) + local inv = (meta and meta:get_inventory ()) or nil + + if inv then + store_input_delayed (pos) + + return inv:add_item ("input", stack) + end + + return stack + end, + + can_insert = function (pos, node, stack, direction) + local meta = minetest.get_meta (pos) + local inv = (meta and meta:get_inventory ()) or nil + + if inv then + return inv:room_for_item ("input", stack) + end + + return false + end, + + can_remove = function (pos, node, stack, dir) + -- returns the maximum number of items of that stack that can be removed + local meta = minetest.get_meta (pos) + local inv = (meta and meta:get_inventory ()) or nil + + if inv then + local slots = inv:get_size ("output") + + for i = 1, slots, 1 do + local s = inv:get_stack ("output", i) + + if s and not s:is_empty () and utils.is_same_item (stack, s) then + return s:get_count () + end + end + end + + return 0 + end, + + remove_items = function (pos, node, stack, dir, count) + -- removes count items and returns them + local meta = minetest.get_meta (pos) + local inv = (meta and meta:get_inventory ()) or nil + local left = count + + if inv then + local slots = inv:get_size ("output") + + for i = 1, slots, 1 do + local s = inv:get_stack ("output", i) + + if s and not s:is_empty () and utils.is_same_item (s, stack) then + if s:get_count () > left then + s:set_count (s:get_count () - left) + inv:set_stack ("output", i, s) + left = 0 + else + left = left - s:get_count () + inv:set_stack ("output", i, nil) + end + end + + if left == 0 then + break + end + end + end + + local result = ItemStack (stack) + result:set_count (count - left) + + return result + end + } + end + + return nil +end + + + +local indexer_groups = { choppy = 2 } +if utils.pipeworks_supported then + indexer_groups.tubedevice = 1 + indexer_groups.tubedevice_receiver = 1 +end + + + minetest.register_node("lwcomponents:storage_indexer", { description = S("Storage Indexer"), drawtype = "normal", @@ -1268,7 +1367,7 @@ minetest.register_node("lwcomponents:storage_indexer", { "lwcomponents_storage_indexer.png", "lwcomponents_storage_indexer.png", "lwcomponents_storage_indexer.png", "lwcomponents_storage_indexer.png",}, is_ground_content = false, - groups = { choppy = 2 }, + groups = table.copy (indexer_groups), sounds = default.node_sound_wood_defaults (), paramtype = "none", param1 = 0, @@ -1278,10 +1377,12 @@ minetest.register_node("lwcomponents:storage_indexer", { _digistuff_channelcopier_fieldname = "channel", digiline = digilines_support (), + tube = pipeworks_support (), on_receive_fields = indexer_on_receive_fields, after_place_node = indexer_after_place_node, can_dig = indexer_can_dig, + after_dig_node = utils.pipeworks_after_dig, on_blast = indexer_on_blast, on_rightclick = indexer_on_rightclick, on_metadata_inventory_put = indexer_on_metadata_inventory_put, @@ -1300,7 +1401,7 @@ minetest.register_node("lwcomponents:storage_indexer_locked", { "lwcomponents_storage_indexer.png", "lwcomponents_storage_indexer.png", "lwcomponents_storage_indexer.png", "lwcomponents_storage_indexer.png",}, is_ground_content = false, - groups = { choppy = 2 }, + groups = table.copy (indexer_groups), sounds = default.node_sound_wood_defaults (), paramtype = "none", param1 = 0, @@ -1310,10 +1411,12 @@ minetest.register_node("lwcomponents:storage_indexer_locked", { _digistuff_channelcopier_fieldname = "channel", digiline = digilines_support (), + tube = pipeworks_support (), on_receive_fields = indexer_on_receive_fields, after_place_node = indexer_after_place_node_locked, can_dig = indexer_can_dig, + after_dig_node = utils.pipeworks_after_dig, on_blast = indexer_on_blast, on_rightclick = indexer_on_rightclick, on_metadata_inventory_put = indexer_on_metadata_inventory_put, diff --git a/utils.lua b/utils.lua index 5a75474..c765378 100644 --- a/utils.lua +++ b/utils.lua @@ -101,6 +101,21 @@ end +-- check for pipeworks +if minetest.global_exists ("pipeworks") then + utils.pipeworks_supported = true + utils.pipeworks_after_place = pipeworks.after_place + utils.pipeworks_after_dig = pipeworks.after_dig +else + utils.pipeworks_supported = false + utils.pipeworks_after_place = function (pos) + end + utils.pipeworks_after_dig = function (pos) + end +end + + + function utils.on_destroy (itemstack) local stack = ItemStack (itemstack) @@ -210,6 +225,22 @@ end +function utils.is_same_item (item1, item2) + local copy1 = ItemStack (stack1) + local copy2 = ItemStack (stack2) + + if copy1 and copy2 then + copy1:set_count (1) + copy2:set_count (1) + + return copy1:to_string () == copy2:to_string () + end + + return false +end + + + function utils.destroy_node (pos) local node = utils.get_far_node (pos)