Compare commits

...

6 Commits

Author SHA1 Message Date
loosewheel
729947a4dc Add files via upload 2022-02-24 08:32:23 +10:00
loosewheel
493167998d Add files via upload 2022-02-24 08:28:38 +10:00
loosewheel
9a118751e4 Add files via upload 2022-02-24 08:26:34 +10:00
loosewheel
0de1dfd620 Add files via upload 2022-02-24 08:24:13 +10:00
loosewheel
b2ac93d3d5 Add files via upload 2022-02-24 08:23:23 +10:00
loosewheel
14202a3a2e Add files via upload 2022-02-24 08:22:17 +10:00
27 changed files with 1330 additions and 161 deletions

View File

@@ -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,

View File

@@ -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,

View File

@@ -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.

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -5,3 +5,4 @@ unifieddyes?
intllib?
hopper?
digistuff?
pipeworks?

View File

@@ -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,

View File

@@ -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")

View File

@@ -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
})

View File

@@ -3,11 +3,13 @@ Breaker
* This block is only available if digilines and/or mesecons are loaded.
Breakers dig the node up to 5 nodes directly in front of them and drop
the item at the back of them. The node is only dug if the breaker has a
tool that can dig it or if it can be dug by hand, and there are no nodes
before of it. ie. cannot dig 2nd node if 1st node has something in it.
The tool is worn if used. Also acts as a digilines conductor. If the
hopper mod is loaded, will take tools from the top and sides.
the item at the back of them, or into a pipeworks tube if one is placed
behind it. The node is only dug if the breaker has a tool that can dig it
or if it can be dug by hand, and there are no nodes before of it. ie.
cannot dig 2nd node if 1st node has something in it. The tool is worn if
used. Also acts as a digilines conductor. If the hopper mod is loaded,
will take tools from the top and sides. Pipeworks tubes can push items
into and pull items from the inventory.
Only the owner can dig or access the form of the locked version.

View File

@@ -5,7 +5,8 @@ manually.
Contains a single inventory slot and shoots an item on command.
If the hopper mod is loaded, will take items from the top and sides, and
release them from the bottom.
release them from the bottom. Pipeworks tubes can push items into and pull
items from the inventory.
Cannon rotation range:
side to side - +/-60 degrees (- = left, + = right)

View File

@@ -4,7 +4,8 @@ Collector
Picks up dropped items in adjacent block, with optional filtering. Also
acts as a digilines conductor. If the hopper mod is loaded, will take items
from the top and sides, and release them from the bottom.
from the top and sides, and release them from the bottom. Pipeworks tubes
can push items into and pull items from the inventory.
Only the owner can dig or access the form of the locked version.

View File

@@ -10,10 +10,13 @@ This channel is both the digilines' channel and the target id of this
conduit within the circuit. A conduit does not have to be given a name.
Most of them are just used to connect other conduits together.
Transfer of items takes 0.1 seconds per conduit node moved.
Transfer of items takes 0.1 seconds per conduit node moved, and will work
in unloaded blocks.
Also acts as a digilines conductor. If the hopper mod is loaded, will
take items from the top and sides, and release them from the bottom.
Pipeworks tubes can push items into and pull items from the inventory.
Only the owner can dig or access the form of the locked version.

View File

@@ -7,6 +7,7 @@ node is only placed if there are no nodes before of it which are not
replaceable. ie. cannot place 2nd node if 1st node has something in it.
Also acts as a digilines conductor. If the hopper mod is loaded, will
take items from the top and sides, and release them from the bottom.
Pipeworks tubes can push items into and pull items from the inventory.
Only the owner can dig or access the form of the locked version.

View File

@@ -4,7 +4,8 @@ Dispenser
Contains an inventory and dispenses (with velocity) an item on command.
Also acts as a digilines conductor. If the hopper mod is loaded, will take
items from the top and sides, and release them from the bottom.
items from the top and sides, and release them from the bottom. Pipeworks
tubes can push items into and pull items from the inventory.
To spawn entities from dispensers include the lwcomponents_spawners mod.

View File

@@ -4,7 +4,8 @@ Dropper
Contains an inventory and drops an item on command. Also acts as a
digilines conductor. If the hopper mod is loaded, will take items from the
top and sides, and release them from the bottom.
top and sides, and release them from the bottom. Pipeworks tubes can push
items into and pull items from the inventory.
Only the owner can dig or access the form of the locked version.

View File

@@ -53,6 +53,9 @@ are disposed of.
Hoppers placed to the top or sides of an indexer will feed items into the
input. Hoppers placed below an indexer will take items from the output.
Pipeworks tubes can push items into the input, and pull items from the
output.
Every 20 inputs the storage is consolidated to minimize fragmentation.

View File

@@ -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
})

View File

@@ -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

View File

@@ -1,4 +1,4 @@
local version = "0.1.22"
local version = "0.1.23"
local mod_storage = minetest.get_mod_storage ()

View File

@@ -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

View File

@@ -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,

View File

@@ -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,
})

View File

@@ -13,7 +13,7 @@ CC BY-SA 3.0
Version
=======
0.1.22
0.1.23
Minetest Version
@@ -34,6 +34,7 @@ unifieddyes
intllib
hopper
digistuff
pipeworks
Installation

View File

@@ -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,

View File

@@ -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)