Compare commits

...

20 Commits

Author SHA1 Message Date
loosewheel
e4b3ae935d Add files via upload 2022-02-27 10:03:39 +10:00
loosewheel
914bdbbe30 Add files via upload 2022-02-27 10:01:16 +10:00
loosewheel
86362bbc86 Add files via upload 2022-02-27 09:58:15 +10:00
loosewheel
6ade6a84a2 Add files via upload 2022-02-27 09:57:07 +10:00
loosewheel
c26d7a86ca Add files via upload 2022-02-27 09:56:09 +10:00
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
loosewheel
3150c50312 Add files via upload 2022-02-22 14:38:06 +10:00
loosewheel
e507646519 Add files via upload 2022-02-22 14:04:04 +10:00
loosewheel
2f99a60cbd Add files via upload 2022-02-22 14:02:10 +10:00
loosewheel
e9cf28a648 Add files via upload 2022-02-22 13:59:52 +10:00
loosewheel
ebe1720922 Add files via upload 2022-02-22 13:58:38 +10:00
loosewheel
61e20f57ed Add files via upload 2022-02-22 13:58:03 +10:00
loosewheel
eaf6a679c3 Add files via upload 2022-02-19 14:08:26 +10:00
loosewheel
f41ab00398 Add files via upload 2022-02-19 14:06:27 +10:00
loosewheel
7f42fde4a0 Add files via upload 2022-02-19 14:04:44 +10:00
48 changed files with 5499 additions and 250 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 function break_node (pos, range)
local node = minetest.get_node_or_nil (pos) 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") local eject_pos = get_breaker_side (pos, node.param2, "back")
for i = 1, #drops do for i = 1, #drops do
utils.item_drop (drops[i], nil, eject_pos) eject_item (pos, drops[i], eject_pos)
end end
add_wear (pos, wear) 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 meta = minetest.get_meta (pos)
local spec = local spec =
"formspec_version[3]\n".. "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_size ("tool", 1)
inv:set_width ("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 -- If return true no item is taken from itemstack
return false return false
@@ -350,7 +386,7 @@ end
local function after_place_node_locked (pos, placer, itemstack, pointed_thing) 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 if placer and placer:is_player () then
local meta = minetest.get_meta (pos) 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 ()..")") meta:set_string ("infotext", "Breaker (owned by "..placer:get_player_name ()..")")
end end
utils.pipeworks_after_place (pos)
-- If return true no item is taken from itemstack -- If return true no item is taken from itemstack
return false return false
end 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", { minetest.register_node("lwcomponents:breaker", {
description = S("Breaker"), description = S("Breaker"),
tiles = { "lwbreaker.png", "lwbreaker.png", "lwbreaker.png", tiles = { "lwbreaker.png", "lwbreaker.png", "lwbreaker.png",
"lwbreaker.png", "lwbreaker_rear.png", "lwbreaker_face.png"}, "lwbreaker.png", "lwbreaker_rear.png", "lwbreaker_face.png"},
is_ground_content = false, is_ground_content = false,
groups = { cracky = 3 }, groups = table.copy (breaker_groups),
sounds = default.node_sound_stone_defaults (), sounds = default.node_sound_stone_defaults (),
paramtype = "none", paramtype = "none",
param1 = 0, param1 = 0,
@@ -594,9 +746,11 @@ minetest.register_node("lwcomponents:breaker", {
mesecons = mesecon_support (), mesecons = mesecon_support (),
digiline = digilines_support (), digiline = digilines_support (),
tube = pipeworks_support (),
on_receive_fields = on_receive_fields, on_receive_fields = on_receive_fields,
can_dig = can_dig, can_dig = can_dig,
after_dig_node = utils.pipeworks_after_dig,
after_place_node = after_place_node, after_place_node = after_place_node,
on_blast = on_blast, on_blast = on_blast,
on_timer = on_timer, on_timer = on_timer,
@@ -611,7 +765,7 @@ minetest.register_node("lwcomponents:breaker_locked", {
tiles = { "lwbreaker.png", "lwbreaker.png", "lwbreaker.png", tiles = { "lwbreaker.png", "lwbreaker.png", "lwbreaker.png",
"lwbreaker.png", "lwbreaker_rear.png", "lwbreaker_face.png"}, "lwbreaker.png", "lwbreaker_rear.png", "lwbreaker_face.png"},
is_ground_content = false, is_ground_content = false,
groups = { cracky = 3 }, groups = table.copy (breaker_groups),
sounds = default.node_sound_stone_defaults (), sounds = default.node_sound_stone_defaults (),
paramtype = "none", paramtype = "none",
param1 = 0, param1 = 0,
@@ -623,9 +777,11 @@ minetest.register_node("lwcomponents:breaker_locked", {
mesecons = mesecon_support (), mesecons = mesecon_support (),
digiline = digilines_support (), digiline = digilines_support (),
tube = pipeworks_support (),
on_receive_fields = on_receive_fields, on_receive_fields = on_receive_fields,
can_dig = can_dig, can_dig = can_dig,
after_dig_node = utils.pipeworks_after_dig,
after_place_node = after_place_node_locked, after_place_node = after_place_node_locked,
on_blast = on_blast, on_blast = on_blast,
on_timer = on_timer, on_timer = on_timer,
@@ -641,7 +797,7 @@ minetest.register_node("lwcomponents:breaker_on", {
tiles = { "lwbreaker.png", "lwbreaker.png", "lwbreaker.png", tiles = { "lwbreaker.png", "lwbreaker.png", "lwbreaker.png",
"lwbreaker.png", "lwbreaker_rear.png", "lwbreaker_face_on.png"}, "lwbreaker.png", "lwbreaker_rear.png", "lwbreaker_face_on.png"},
is_ground_content = false, is_ground_content = false,
groups = { cracky = 3, not_in_creative_inventory = 1 }, groups = table.copy (breaker_on_groups),
sounds = default.node_sound_stone_defaults (), sounds = default.node_sound_stone_defaults (),
paramtype = "none", paramtype = "none",
param1 = 0, param1 = 0,
@@ -654,9 +810,11 @@ minetest.register_node("lwcomponents:breaker_on", {
mesecons = mesecon_support (), mesecons = mesecon_support (),
digiline = digilines_support (), digiline = digilines_support (),
tube = pipeworks_support (),
on_receive_fields = on_receive_fields, on_receive_fields = on_receive_fields,
can_dig = can_dig, can_dig = can_dig,
after_dig_node = utils.pipeworks_after_dig,
after_place_node = after_place_node, after_place_node = after_place_node,
on_blast = on_blast, on_blast = on_blast,
on_timer = on_timer, on_timer = on_timer,
@@ -671,7 +829,7 @@ minetest.register_node("lwcomponents:breaker_locked_on", {
tiles = { "lwbreaker.png", "lwbreaker.png", "lwbreaker.png", tiles = { "lwbreaker.png", "lwbreaker.png", "lwbreaker.png",
"lwbreaker.png", "lwbreaker_rear.png", "lwbreaker_face_on.png"}, "lwbreaker.png", "lwbreaker_rear.png", "lwbreaker_face_on.png"},
is_ground_content = false, is_ground_content = false,
groups = { cracky = 3, not_in_creative_inventory = 1 }, groups = table.copy (breaker_on_groups),
sounds = default.node_sound_stone_defaults (), sounds = default.node_sound_stone_defaults (),
paramtype = "none", paramtype = "none",
param1 = 0, param1 = 0,
@@ -684,9 +842,11 @@ minetest.register_node("lwcomponents:breaker_locked_on", {
mesecons = mesecon_support (), mesecons = mesecon_support (),
digiline = digilines_support (), digiline = digilines_support (),
tube = pipeworks_support (),
on_receive_fields = on_receive_fields, on_receive_fields = on_receive_fields,
can_dig = can_dig, can_dig = can_dig,
after_dig_node = utils.pipeworks_after_dig,
after_place_node = after_place_node_locked, after_place_node = after_place_node_locked,
on_blast = on_blast, on_blast = on_blast,
on_timer = on_timer, on_timer = on_timer,

View File

@@ -15,7 +15,7 @@ local function get_cannon_barrel (pos)
local barrel_pos = { x = pos.x, y = pos.y + 0.65, z = pos.z } local barrel_pos = { x = pos.x, y = pos.y + 0.65, z = pos.z }
local objects = minetest.get_objects_inside_radius (barrel_pos, 0.1) local objects = minetest.get_objects_inside_radius (barrel_pos, 0.1)
for i = 1, #objects do for i = 1, #objects, 1 do
if not objects[i]:is_player () then if not objects[i]:is_player () then
if objects[i].get_luaentity and objects[i]:get_luaentity () and if objects[i].get_luaentity and objects[i]:get_luaentity () and
objects[i]:get_luaentity ().name and objects[i]:get_luaentity ().name and
@@ -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) local meta = minetest.get_meta (pos)
meta:set_string ("sensitive", "true") meta:set_string ("sensitive", "true")
@@ -407,6 +407,13 @@ local function after_place_node (pos, placer, itemstack, pointed_thing)
inv:set_width ("main", 1) inv:set_width ("main", 1)
meta:set_string ("formspec", get_formspec (pos)) 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 -- If return true no item is taken from itemstack
return false return false
@@ -415,7 +422,7 @@ end
local function after_place_node_locked (pos, placer, itemstack, pointed_thing) 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 if placer and placer:is_player () then
local meta = minetest.get_meta (pos) 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 ()..")") meta:set_string ("infotext", "Cannon (owned by "..placer:get_player_name ()..")")
end end
utils.pipeworks_after_place (pos)
-- If return true no item is taken from itemstack -- If return true no item is taken from itemstack
return false return false
end 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", { minetest.register_node("lwcomponents:cannon_blank", {
description = S("Cannon blank"), description = S("Cannon blank"),
drawtype = "airlike", drawtype = "airlike",
@@ -917,7 +1026,7 @@ minetest.register_node("lwcomponents:cannon", {
wield_image = "lwcannon_item.png", wield_image = "lwcannon_item.png",
inventory_image = "lwcannon_item.png", inventory_image = "lwcannon_item.png",
is_ground_content = false, is_ground_content = false,
groups = { cracky = 3 }, groups = table.copy (cannon_groups),
sounds = default.node_sound_stone_defaults (), sounds = default.node_sound_stone_defaults (),
paramtype = "light", paramtype = "light",
paramtype2 = "facedir", paramtype2 = "facedir",
@@ -928,12 +1037,14 @@ minetest.register_node("lwcomponents:cannon", {
mesecons = mesecon_support (), mesecons = mesecon_support (),
digiline = digilines_support (), digiline = digilines_support (),
tube = pipeworks_support (),
on_construct = on_construct, on_construct = on_construct,
on_destruct = on_destruct, on_destruct = on_destruct,
on_place = on_place, on_place = on_place,
on_receive_fields = on_receive_fields, on_receive_fields = on_receive_fields,
can_dig = can_dig, can_dig = can_dig,
after_dig_node = utils.pipeworks_after_dig,
after_place_node = after_place_node, after_place_node = after_place_node,
on_blast = on_blast, on_blast = on_blast,
on_rightclick = on_rightclick, on_rightclick = on_rightclick,
@@ -979,7 +1090,7 @@ minetest.register_node("lwcomponents:cannon_locked", {
wield_image = "lwcannon_item.png", wield_image = "lwcannon_item.png",
inventory_image = "lwcannon_item.png", inventory_image = "lwcannon_item.png",
is_ground_content = false, is_ground_content = false,
groups = { cracky = 3 }, groups = table.copy (cannon_groups),
sounds = default.node_sound_stone_defaults (), sounds = default.node_sound_stone_defaults (),
paramtype = "light", paramtype = "light",
paramtype2 = "facedir", paramtype2 = "facedir",
@@ -990,12 +1101,14 @@ minetest.register_node("lwcomponents:cannon_locked", {
mesecons = mesecon_support (), mesecons = mesecon_support (),
digiline = digilines_support (), digiline = digilines_support (),
tube = pipeworks_support (),
on_construct = on_construct, on_construct = on_construct,
on_destruct = on_destruct, on_destruct = on_destruct,
on_place = on_place_locked, on_place = on_place_locked,
on_receive_fields = on_receive_fields, on_receive_fields = on_receive_fields,
can_dig = can_dig, can_dig = can_dig,
after_dig_node = utils.pipeworks_after_dig,
after_place_node = after_place_node_locked, after_place_node = after_place_node_locked,
on_blast = on_blast, on_blast = on_blast,
on_rightclick = on_rightclick, on_rightclick = on_rightclick,

View File

@@ -153,8 +153,13 @@ local function register_shell (name, description, texture, inventory_image,
end end
elseif c.type == "object" then elseif c.type == "object" then
local c_name = (c.object.get_luaentity and
c.object:get_luaentity () and
c.object:get_luaentity ().name) or ""
local s_name = (self.name) or ""
-- explode at this pos -- explode at this pos
if c.object:get_armor_groups ().immortal then if c.object:get_armor_groups ().immortal or s_name == c_name then
self.object:set_velocity (c.old_velocity) self.object:set_velocity (c.old_velocity)
else else
explode_pos = vector.new (c.object:get_pos ()) explode_pos = vector.new (c.object:get_pos ())
@@ -198,7 +203,6 @@ local function register_shell (name, description, texture, inventory_image,
local obj = minetest.add_entity (spawn_pos, name.."_entity") local obj = minetest.add_entity (spawn_pos, name.."_entity")
if obj then if obj then
obj:set_armor_groups ({ immortal = 1 })
obj:set_acceleration ({ x = 0, y = -9.81, z = 0 }) obj:set_acceleration ({ x = 0, y = -9.81, z = 0 })
obj:set_rotation (vector.dir_to_rotation (vector.multiply (spawner_dir, shell_speed))) obj:set_rotation (vector.dir_to_rotation (vector.multiply (spawner_dir, shell_speed)))
obj:set_velocity (vector.multiply (spawner_dir, shell_speed)) obj:set_velocity (vector.multiply (spawner_dir, shell_speed))

View File

@@ -108,3 +108,39 @@ v0.1.19
v0.1.20 v0.1.20
* Valid distance and resolution for camera set by digilines message. * Valid distance and resolution for camera set by digilines message.
* Imposed maximum resolution of 128 for cameras. * Imposed maximum resolution of 128 for cameras.
v0.1.21
* Minor bug fix, movefloor global.
* Fixed movefloor so player doesn't fall through floor.
* Transfer timer in moved nodes for pistons.
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.
v0.1.24
* Limited requested count from storage indexer from digilines message to max stack.
* Fixed receptor state in detector.
* Fixed receptor state in digiswitch.
* Fixed bug in utils.is_same_item ().
* Added force field generators.
* Removed immortal from cannon shells (shells test for same type of shell and ignore).

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 meta = minetest.get_meta (pos)
local is_off = itemstack and (itemstack:get_name () == "lwcomponents:collector" or local is_off = itemstack and (itemstack:get_name () == "lwcomponents:collector" or
itemstack:get_name () == "lwcomponents:collector_locked") 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_width ("main", 4)
inv:set_size ("filter", 8) inv:set_size ("filter", 8)
inv:set_width ("filter", 2) 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 -- If return true no item is taken from itemstack
return false return false
@@ -170,7 +177,7 @@ end
local function after_place_node_locked (pos, placer, itemstack, pointed_thing) 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 if placer and placer:is_player () then
local meta = minetest.get_meta (pos) 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 ()..")") meta:set_string ("infotext", "Collector (owned by "..placer:get_player_name ()..")")
end end
utils.pipeworks_after_place (pos)
-- If return true no item is taken from itemstack -- If return true no item is taken from itemstack
return false return false
end 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", { minetest.register_node("lwcomponents:collector", {
description = S("Collector"), description = S("Collector"),
tiles = { "lwcollector.png", "lwcollector.png", "lwcollector.png", tiles = { "lwcollector.png", "lwcollector.png", "lwcollector.png",
"lwcollector.png", "lwcollector.png", "lwcollector.png"}, "lwcollector.png", "lwcollector.png", "lwcollector.png"},
is_ground_content = false, is_ground_content = false,
groups = { cracky = 3 }, groups = table.copy (collector_groups),
sounds = default.node_sound_stone_defaults (), sounds = default.node_sound_stone_defaults (),
paramtype = "none", paramtype = "none",
param1 = 0, param1 = 0,
@@ -441,11 +558,13 @@ minetest.register_node("lwcomponents:collector", {
_digistuff_channelcopier_fieldname = "channel", _digistuff_channelcopier_fieldname = "channel",
digiline = digilines_support (), digiline = digilines_support (),
tube = pipeworks_support (),
on_destruct = on_destruct, on_destruct = on_destruct,
on_receive_fields = on_receive_fields, on_receive_fields = on_receive_fields,
after_place_node = after_place_node, after_place_node = after_place_node,
can_dig = can_dig, can_dig = can_dig,
after_dig_node = utils.pipeworks_after_dig,
on_blast = on_blast, on_blast = on_blast,
on_timer = on_timer, on_timer = on_timer,
on_rightclick = on_rightclick on_rightclick = on_rightclick
@@ -458,7 +577,7 @@ minetest.register_node("lwcomponents:collector_locked", {
tiles = { "lwcollector.png", "lwcollector.png", "lwcollector.png", tiles = { "lwcollector.png", "lwcollector.png", "lwcollector.png",
"lwcollector.png", "lwcollector.png", "lwcollector.png"}, "lwcollector.png", "lwcollector.png", "lwcollector.png"},
is_ground_content = false, is_ground_content = false,
groups = { cracky = 3 }, groups = table.copy (collector_groups),
sounds = default.node_sound_stone_defaults (), sounds = default.node_sound_stone_defaults (),
paramtype = "none", paramtype = "none",
param1 = 0, param1 = 0,
@@ -467,11 +586,13 @@ minetest.register_node("lwcomponents:collector_locked", {
_digistuff_channelcopier_fieldname = "channel", _digistuff_channelcopier_fieldname = "channel",
digiline = digilines_support (), digiline = digilines_support (),
tube = pipeworks_support (),
on_destruct = on_destruct, on_destruct = on_destruct,
on_receive_fields = on_receive_fields, on_receive_fields = on_receive_fields,
after_place_node = after_place_node_locked, after_place_node = after_place_node_locked,
can_dig = can_dig, can_dig = can_dig,
after_dig_node = utils.pipeworks_after_dig,
on_blast = on_blast, on_blast = on_blast,
on_timer = on_timer, on_timer = on_timer,
on_rightclick = on_rightclick on_rightclick = on_rightclick
@@ -484,7 +605,7 @@ minetest.register_node("lwcomponents:collector_on", {
tiles = { "lwcollector_on.png", "lwcollector_on.png", "lwcollector_on.png", tiles = { "lwcollector_on.png", "lwcollector_on.png", "lwcollector_on.png",
"lwcollector_on.png", "lwcollector_on.png", "lwcollector_on.png"}, "lwcollector_on.png", "lwcollector_on.png", "lwcollector_on.png"},
is_ground_content = false, is_ground_content = false,
groups = { cracky = 3, not_in_creative_inventory = 1 }, groups = table.copy (collector_on_groups),
sounds = default.node_sound_stone_defaults (), sounds = default.node_sound_stone_defaults (),
paramtype = "none", paramtype = "none",
param1 = 0, param1 = 0,
@@ -493,11 +614,13 @@ minetest.register_node("lwcomponents:collector_on", {
_digistuff_channelcopier_fieldname = "channel", _digistuff_channelcopier_fieldname = "channel",
digiline = digilines_support (), digiline = digilines_support (),
tube = pipeworks_support (),
on_destruct = on_destruct, on_destruct = on_destruct,
on_receive_fields = on_receive_fields, on_receive_fields = on_receive_fields,
after_place_node = after_place_node, after_place_node = after_place_node,
can_dig = can_dig, can_dig = can_dig,
after_dig_node = utils.pipeworks_after_dig,
on_blast = on_blast, on_blast = on_blast,
on_timer = on_timer, on_timer = on_timer,
on_rightclick = on_rightclick 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", tiles = { "lwcollector_on.png", "lwcollector_on.png", "lwcollector_on.png",
"lwcollector_on.png", "lwcollector_on.png", "lwcollector_on.png"}, "lwcollector_on.png", "lwcollector_on.png", "lwcollector_on.png"},
is_ground_content = false, is_ground_content = false,
groups = { cracky = 3, not_in_creative_inventory = 1 }, groups = table.copy (collector_on_groups),
sounds = default.node_sound_stone_defaults (), sounds = default.node_sound_stone_defaults (),
paramtype = "none", paramtype = "none",
param1 = 0, param1 = 0,
@@ -519,11 +642,13 @@ minetest.register_node("lwcomponents:collector_locked_on", {
_digistuff_channelcopier_fieldname = "channel", _digistuff_channelcopier_fieldname = "channel",
digiline = digilines_support (), digiline = digilines_support (),
tube = pipeworks_support (),
on_destruct = on_destruct, on_destruct = on_destruct,
on_receive_fields = on_receive_fields, on_receive_fields = on_receive_fields,
after_place_node = after_place_node_locked, after_place_node = after_place_node_locked,
can_dig = can_dig, can_dig = can_dig,
after_dig_node = utils.pipeworks_after_dig,
on_blast = on_blast, on_blast = on_blast,
on_timer = on_timer, on_timer = on_timer,
on_rightclick = on_rightclick 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") local conduit_connections = utils.connections:new (mod_storage, "conduit_connections")
-- forward declare
local run_initialize_forward = nil
local function get_target_list (pos) local function get_target_list (pos)
local tlist = conduit_connections:get_connected_ids (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) local item = inv:get_stack ("transfer", slot)
if transfer_data[slot] and item and not item:is_empty () then 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 if tnode and (tnode.name == "lwcomponents:conduit" or
local tinv = tmeta:get_inventory () tnode.name == "lwcomponents:conduit_locked") then
local tmeta = minetest.get_meta (transfer_data[slot].pos)
if tinv then if tmeta then
tinv:add_item ("main", item) local tinv = tmeta:get_inventory ()
--send_conduit_message (pos, target, slot) if tinv then
tinv:add_item ("main", item)
end
end end
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) local meta = minetest.get_meta (pos)
if meta then if meta then
@@ -194,7 +201,8 @@ local function add_to_send_list (pos, item, destpos, distance)
local slot = get_transfer_free_slot (pos) local slot = get_transfer_free_slot (pos)
while slot < 1 do while slot < 1 do
delivered_earliest (pos) deliver_earliest (pos)
slot = get_transfer_free_slot (pos)
end end
local meta = minetest.get_meta (pos) 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) 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)) meta:set_string ("transfer_data", minetest.serialize (transfer_data))
local timer = minetest.get_node_timer (pos) run_initialize_forward (pos)
if not timer:is_started () then
timer:start (conduit_interval)
end
end end
end end
end end
@@ -292,8 +296,6 @@ local function send_to_target (pos, target, slot)
stack:set_count (stack:get_count () - 1) stack:set_count (stack:get_count () - 1)
inv:set_stack ("main", slot, stack) inv:set_stack ("main", slot, stack)
--send_conduit_message (pos, target, slot)
return true, target, slot return true, target, slot
end end
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 meta = minetest.get_meta (pos)
local automatic = false
if meta then 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 end
if automatic then
send_to_target (pos)
end
return run_deliveries (pos) or automatic
end 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 meta = minetest.get_meta (pos)
local spec = local spec =
"formspec_version[3]".. "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 ("formspec", spec)
meta:set_string ("transfer_data", minetest.serialize({ })) meta:set_string ("transfer_data", minetest.serialize({ }))
meta:set_string ("automatic", "false") meta:set_string ("automatic", "false")
meta:set_int ("conduit_id", math.random (1000000))
local inv = meta:get_inventory () 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_size ("transfer", 32)
inv:set_width ("transfer", 8) 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 -- If return true no item is taken from itemstack
return false return false
@@ -390,7 +422,7 @@ end
local function after_place_node_locked (pos, placer, itemstack, pointed_thing) 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 if placer and placer:is_player () then
local meta = minetest.get_meta (pos) 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 ()..")") meta:set_string ("infotext", "Conduit (owned by "..placer:get_player_name ()..")")
end end
utils.pipeworks_after_place (pos)
-- If return true no item is taken from itemstack -- If return true no item is taken from itemstack
return false return false
end end
@@ -492,11 +526,7 @@ local function on_receive_fields (pos, formname, fields, sender)
meta:set_string ("automatic", fields.automatic) meta:set_string ("automatic", fields.automatic)
meta:set_string ("formspec", get_formspec (pos)) meta:set_string ("formspec", get_formspec (pos))
local timer = minetest.get_node_timer (pos) run_initialize (pos)
if not timer:is_started () then
timer:start (conduit_interval)
end
end end
end end
end end
@@ -592,12 +622,6 @@ end
local function on_timer (pos, elapsed)
return run_conduit (pos)
end
local function digilines_support () local function digilines_support ()
if utils.digilines_supported then if utils.digilines_supported then
return 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", { minetest.register_node("lwcomponents:conduit", {
description = S("Conduit"), description = S("Conduit"),
drawtype = "glasslike_framed", drawtype = "glasslike_framed",
tiles = { "lwconduit_edge.png", "lwconduit.png" }, tiles = { "lwconduit_edge.png", "lwconduit.png" },
is_ground_content = false, is_ground_content = false,
groups = { cracky = 3 }, groups = table.copy (conduit_groups),
sounds = default.node_sound_stone_defaults (), sounds = default.node_sound_stone_defaults (),
paramtype = "none", paramtype = "none",
param1 = 0, param1 = 0,
@@ -687,14 +811,15 @@ minetest.register_node("lwcomponents:conduit", {
mesecons = mesecon_support (), mesecons = mesecon_support (),
digiline = digilines_support (), digiline = digilines_support (),
tube = pipeworks_support (),
on_construct = on_construct, on_construct = on_construct,
on_destruct = on_destruct, on_destruct = on_destruct,
on_receive_fields = on_receive_fields, on_receive_fields = on_receive_fields,
after_place_node = after_place_node, after_place_node = after_place_node,
can_dig = can_dig, can_dig = can_dig,
after_dig_node = utils.pipeworks_after_dig,
on_blast = on_blast, on_blast = on_blast,
on_timer = on_timer,
on_rightclick = on_rightclick on_rightclick = on_rightclick
}) })
@@ -705,7 +830,7 @@ minetest.register_node("lwcomponents:conduit_locked", {
drawtype = "glasslike_framed", drawtype = "glasslike_framed",
tiles = { "lwconduit_edge.png", "lwconduit.png" }, tiles = { "lwconduit_edge.png", "lwconduit.png" },
is_ground_content = false, is_ground_content = false,
groups = { cracky = 3 }, groups = table.copy (conduit_groups),
sounds = default.node_sound_stone_defaults (), sounds = default.node_sound_stone_defaults (),
paramtype = "none", paramtype = "none",
param1 = 0, param1 = 0,
@@ -716,14 +841,15 @@ minetest.register_node("lwcomponents:conduit_locked", {
mesecons = mesecon_support (), mesecons = mesecon_support (),
digiline = digilines_support (), digiline = digilines_support (),
tube = pipeworks_support (),
on_construct = on_construct, on_construct = on_construct,
on_destruct = on_destruct, on_destruct = on_destruct,
on_receive_fields = on_receive_fields, on_receive_fields = on_receive_fields,
after_place_node = after_place_node_locked, after_place_node = after_place_node_locked,
can_dig = can_dig, can_dig = can_dig,
after_dig_node = utils.pipeworks_after_dig,
on_blast = on_blast, on_blast = on_blast,
on_timer = on_timer,
on_rightclick = on_rightclick 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 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 return connections

View File

@@ -23,6 +23,64 @@ minetest.register_craft( {
}) })
minetest.register_craft( {
output = "lwcomponents:storage_unit 2",
recipe = {
{ "default:steel_ingot", "group:wood", "group:wood" },
{ "group:wood", "", "group:wood" },
{ "group:wood", "group:wood", "default:chest" },
},
})
minetest.register_craft( {
output = "lwcomponents:storage_unit_locked 2",
recipe = {
{ "default:steel_ingot", "group:wood", "group:wood" },
{ "group:wood", "", "group:wood" },
{ "group:wood", "group:wood", "default:chest_locked" },
},
})
minetest.register_craft( {
output = "lwcomponents:storage_indexer",
recipe = {
{ "default:steel_ingot", "group:wood" },
{ "group:wood", "default:chest" }
},
})
minetest.register_craft( {
output = "lwcomponents:storage_indexer_locked",
recipe = {
{ "default:steel_ingot", "group:wood" },
{ "group:wood", "default:chest_locked" }
},
})
minetest.register_craft( {
output = "lwcomponents:force_field",
recipe = {
{ "default:steel_ingot", "default:mese_crystal", "group:wood" },
{ "default:mese_crystal", "default:diamondblock", "default:mese_crystal" },
{ "default:stone", "default:mese_crystal", "default:chest" }
},
})
minetest.register_craft( {
output = "lwcomponents:force_field_locked",
recipe = {
{ "default:steel_ingot", "default:mese_crystal", "group:wood" },
{ "default:mese_crystal", "default:diamondblock", "default:mese_crystal" },
{ "default:stone", "default:mese_crystal", "default:chest_locked" }
},
})
minetest.register_craft( { minetest.register_craft( {
output = "lwcomponents:cannon_shell 10", output = "lwcomponents:cannon_shell 10",
recipe = { recipe = {
@@ -332,7 +390,7 @@ end -- utils.digilines_supported and utils.digistuff_supported
if utils.mesecon_supported and mesecon.mvps_push then if utils.mesecon_supported then
minetest.register_craft ({ minetest.register_craft ({
output = "lwcomponents:movefloor", output = "lwcomponents:movefloor",
@@ -343,7 +401,7 @@ minetest.register_craft ({
} }
}) })
end -- utils.mesecon_supported and mesecon.mvps_push end -- utils.mesecon_supported

View File

@@ -5,3 +5,4 @@ unifieddyes?
intllib? intllib?
hopper? hopper?
digistuff? 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 meta = minetest.get_meta (pos)
local spec = local spec =
"formspec_version[3]\n".. "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_size ("main", 16)
inv:set_width ("main", 4) 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 -- If return true no item is taken from itemstack
return false return false
@@ -318,7 +325,7 @@ end
local function after_place_node_locked (pos, placer, itemstack, pointed_thing) 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 if placer and placer:is_player () then
local meta = minetest.get_meta (pos) 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 ()..")") meta:set_string ("infotext", "Deployer (owned by "..placer:get_player_name ()..")")
end end
utils.pipeworks_after_place (pos)
-- If return true no item is taken from itemstack -- If return true no item is taken from itemstack
return false return false
end 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", { minetest.register_node("lwcomponents:deployer", {
description = S("Deployer"), description = S("Deployer"),
tiles = { "lwdeployer.png", "lwdeployer.png", "lwdeployer.png", tiles = { "lwdeployer.png", "lwdeployer.png", "lwdeployer.png",
"lwdeployer.png", "lwdeployer.png", "lwdeployer_face.png"}, "lwdeployer.png", "lwdeployer.png", "lwdeployer_face.png"},
is_ground_content = false, is_ground_content = false,
groups = { cracky = 3 }, groups = table.copy (deployer_groups),
sounds = default.node_sound_stone_defaults (), sounds = default.node_sound_stone_defaults (),
paramtype = "none", paramtype = "none",
param1 = 0, param1 = 0,
@@ -546,10 +663,12 @@ minetest.register_node("lwcomponents:deployer", {
mesecons = mesecon_support (), mesecons = mesecon_support (),
digiline = digilines_support (), digiline = digilines_support (),
tube = pipeworks_support (),
on_receive_fields = on_receive_fields, on_receive_fields = on_receive_fields,
after_place_node = after_place_node, after_place_node = after_place_node,
can_dig = can_dig, can_dig = can_dig,
after_dig_node = utils.pipeworks_after_dig,
on_blast = on_blast, on_blast = on_blast,
on_timer = on_timer, on_timer = on_timer,
on_rightclick = on_rightclick on_rightclick = on_rightclick
@@ -562,7 +681,7 @@ minetest.register_node("lwcomponents:deployer_locked", {
tiles = { "lwdeployer.png", "lwdeployer.png", "lwdeployer.png", tiles = { "lwdeployer.png", "lwdeployer.png", "lwdeployer.png",
"lwdeployer.png", "lwdeployer.png", "lwdeployer_face.png"}, "lwdeployer.png", "lwdeployer.png", "lwdeployer_face.png"},
is_ground_content = false, is_ground_content = false,
groups = { cracky = 3 }, groups = table.copy (deployer_groups),
sounds = default.node_sound_stone_defaults (), sounds = default.node_sound_stone_defaults (),
paramtype = "none", paramtype = "none",
param1 = 0, param1 = 0,
@@ -573,10 +692,12 @@ minetest.register_node("lwcomponents:deployer_locked", {
mesecons = mesecon_support (), mesecons = mesecon_support (),
digiline = digilines_support (), digiline = digilines_support (),
tube = pipeworks_support (),
on_receive_fields = on_receive_fields, on_receive_fields = on_receive_fields,
after_place_node = after_place_node_locked, after_place_node = after_place_node_locked,
can_dig = can_dig, can_dig = can_dig,
after_dig_node = utils.pipeworks_after_dig,
on_blast = on_blast, on_blast = on_blast,
on_timer = on_timer, on_timer = on_timer,
on_rightclick = on_rightclick on_rightclick = on_rightclick
@@ -590,7 +711,7 @@ minetest.register_node("lwcomponents:deployer_on", {
tiles = { "lwdeployer.png", "lwdeployer.png", "lwdeployer.png", tiles = { "lwdeployer.png", "lwdeployer.png", "lwdeployer.png",
"lwdeployer.png", "lwdeployer.png", "lwdeployer_face_on.png"}, "lwdeployer.png", "lwdeployer.png", "lwdeployer_face_on.png"},
is_ground_content = false, is_ground_content = false,
groups = { cracky = 3, not_in_creative_inventory = 1 }, groups = table.copy (deployer_on_groups),
sounds = default.node_sound_stone_defaults (), sounds = default.node_sound_stone_defaults (),
paramtype = "none", paramtype = "none",
param1 = 0, param1 = 0,
@@ -603,9 +724,11 @@ minetest.register_node("lwcomponents:deployer_on", {
mesecons = mesecon_support (), mesecons = mesecon_support (),
digiline = digilines_support (), digiline = digilines_support (),
tube = pipeworks_support (),
on_receive_fields = on_receive_fields, on_receive_fields = on_receive_fields,
can_dig = can_dig, can_dig = can_dig,
after_dig_node = utils.pipeworks_after_dig,
after_place_node = after_place_node, after_place_node = after_place_node,
on_blast = on_blast, on_blast = on_blast,
on_timer = on_timer, on_timer = on_timer,
@@ -619,7 +742,7 @@ minetest.register_node("lwcomponents:deployer_locked_on", {
tiles = { "lwdeployer.png", "lwdeployer.png", "lwdeployer.png", tiles = { "lwdeployer.png", "lwdeployer.png", "lwdeployer.png",
"lwdeployer.png", "lwdeployer.png", "lwdeployer_face_on.png"}, "lwdeployer.png", "lwdeployer.png", "lwdeployer_face_on.png"},
is_ground_content = false, is_ground_content = false,
groups = { cracky = 3, not_in_creative_inventory = 1 }, groups = table.copy (deployer_on_groups),
sounds = default.node_sound_stone_defaults (), sounds = default.node_sound_stone_defaults (),
paramtype = "none", paramtype = "none",
param1 = 0, param1 = 0,
@@ -632,9 +755,11 @@ minetest.register_node("lwcomponents:deployer_locked_on", {
mesecons = mesecon_support (), mesecons = mesecon_support (),
digiline = digilines_support (), digiline = digilines_support (),
tube = pipeworks_support (),
on_receive_fields = on_receive_fields, on_receive_fields = on_receive_fields,
can_dig = can_dig, can_dig = can_dig,
after_dig_node = utils.pipeworks_after_dig,
after_place_node = after_place_node_locked, after_place_node = after_place_node_locked,
on_blast = on_blast, on_blast = on_blast,
on_timer = on_timer, on_timer = on_timer,

View File

@@ -18,6 +18,12 @@ local function mesecons_on (pos)
if meta:get_int ("power_on") == 0 then if meta:get_int ("power_on") == 0 then
utils.mesecon_receptor_on (pos, utils.mesecon_default_rules) utils.mesecon_receptor_on (pos, utils.mesecon_default_rules)
meta:set_int ("power_on", 1) meta:set_int ("power_on", 1)
local node = utils.get_far_node (pos)
if node then
node.param1 = 1
minetest.swap_node (pos, node)
end
end end
end end
end end
@@ -31,6 +37,12 @@ local function mesecons_off (pos)
if meta:get_int ("power_on") ~= 0 then if meta:get_int ("power_on") ~= 0 then
utils.mesecon_receptor_off (pos, utils.mesecon_default_rules) utils.mesecon_receptor_off (pos, utils.mesecon_default_rules)
meta:set_int ("power_on", 0) meta:set_int ("power_on", 0)
local node = utils.get_far_node (pos)
if node then
node.param1 = 0
minetest.swap_node (pos, node)
end
end end
end end
end end
@@ -130,7 +142,7 @@ end
local function get_entity_height (objref) local function get_entity_height (objref)
if objref.get_luaentity then if objref.get_luaentity then
entity = objref:get_luaentity () local entity = objref:get_luaentity ()
if entity and entity.name then if entity and entity.name then
def = minetest.registered_entities[entity.name] def = minetest.registered_entities[entity.name]
@@ -410,7 +422,6 @@ local function after_place_node (pos, placer, itemstack, pointed_thing)
local is_off = itemstack and (itemstack:get_name () == "lwcomponents:detector" or local is_off = itemstack and (itemstack:get_name () == "lwcomponents:detector" or
itemstack:get_name () == "lwcomponents:detector_locked") 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 ("formspec", get_form_spec (is_off, 1, 0, 0, 0, 0, 1))
meta:set_string ("entities", "false") meta:set_string ("entities", "false")
@@ -693,8 +704,10 @@ local function mesecon_support ()
{ {
receptor = receptor =
{ {
state = utils.mesecon_state_off, state = utils.mesecon_state_on,
rules = utils.mesecon_default_rules rules = function (node)
return (node.param1 == 0 and { }) or utils.mesecon_default_rules
end
} }
} }
end end

View File

@@ -13,7 +13,7 @@ local function get_mesecon_rule_for_side (side)
if side == "white" then if side == "white" then
return { { x = 0, y = 1, z = 0 } } return { { x = 0, y = 1, z = 0 } }
elseif side == "black" then elseif side == "black" then
return { { x = 0, y = -1, z = 0 } } -- down doesn't work return { { x = 0, y = -1, z = 0 } }
elseif side == "red" then elseif side == "red" then
return { { x = -1, y = 0, z = 0 } } return { { x = -1, y = 0, z = 0 } }
elseif side == "green" then elseif side == "green" then
@@ -32,13 +32,106 @@ local function get_mesecon_rule_for_side (side)
{ x = 0, y = 0, z = 1 }, { x = 0, y = 0, z = 1 },
{ x = 0, y = 0, z = -1 }, { x = 0, y = 0, z = -1 },
{ x = 0, y = 1, z = 0 }, { x = 0, y = 1, z = 0 },
{ x = 0, y = -1, z = 0 }, -- down doesn't work { x = 0, y = -1, z = 0 },
} }
end end
end end
local side_bits =
{
["white"] = 0,
["black"] = 1,
["red"] = 2,
["green"] = 3,
["blue"] = 4,
["yellow"] = 5
}
local function get_side_bit (side)
if side then
if side == "switch" then
return 64
end
local bit = side_bits[side]
if bit then
return math.pow (2, bit)
end
end
return 63
end
local function is_side_on (bits, side)
local bit = get_side_bit (side)
for i = 0, 6, 1 do
if (bit % 2) == 1 and (bits % 2) ~= 1 then
return false
end
bit = math.floor (bit / 2)
bits = math.floor (bits / 2)
end
return true
end
local function set_side_bit (bits, side, on)
local bit = get_side_bit (side)
local result = 0
for i = 0, 6, 1 do
if (bit % 2) == 1 then
if on then
result = result + math.pow (2, i)
end
elseif (bits % 2) == 1 then
result = result + math.pow (2, i)
end
bit = math.floor (bit / 2)
bits = math.floor (bits / 2)
end
return result
end
local function switch_on (pos, side)
utils.mesecon_receptor_on (pos, get_mesecon_rule_for_side (side))
local node = utils.get_far_node (pos)
if node then
node.param1 = set_side_bit (node.param1, side, true)
minetest.swap_node (pos, node)
end
end
local function switch_off (pos, side)
utils.mesecon_receptor_off (pos, get_mesecon_rule_for_side (side))
local node = utils.get_far_node (pos)
if node then
node.param1 = set_side_bit (node.param1, side, false)
minetest.swap_node (pos, node)
end
end
local function digilines_support () local function digilines_support ()
return return
{ {
@@ -80,9 +173,9 @@ local function digilines_support ()
end end
if words[1] == "on" then if words[1] == "on" then
utils.mesecon_receptor_on (pos, get_mesecon_rule_for_side (words[2])) switch_on (pos, words[2])
elseif words[1] == "off" then elseif words[1] == "off" then
utils.mesecon_receptor_off (pos, get_mesecon_rule_for_side (words[2])) switch_off (pos, words[2])
end end
end end
end end
@@ -99,16 +192,32 @@ local function mesecon_support ()
{ {
receptor = receptor =
{ {
state = mesecon.state.off, state = mesecon.state.on,
rules =
{ rules = function (node)
{ x = 1, y = 0, z = 0 }, if is_side_on (node.param1, "switch") then
{ x = -1, y = 0, z = 0 }, return utils.mesecon_default_rules
{ x = 0, y = 0, z = 1 }, end
{ x = 0, y = 0, z = -1 },
{ x = 0, y = 1, z = 0 }, local r = { }
{ x = 0, y = -1, z = 0 }, -- down doesn't work local sides =
} {
"white",
"black",
"red",
"green",
"blue",
"yellow",
}
for _, side in ipairs (sides) do
if is_side_on (node.param1, side) then
r[#r + 1] = get_mesecon_rule_for_side (side)[1]
end
end
return r
end
}, },
} }
end end
@@ -124,7 +233,7 @@ local function on_construct (pos)
local formspec = local formspec =
"formspec_version[3]\n".. "formspec_version[3]\n"..
"size[6.0,4.0]\n".. "size[6.0,4.0]\n"..
"field[1.0,0.8;4.0,1.0;channel;Channel;]\n".. "field[1.0,0.8;4.0,1.0;channel;Channel;${channel}]\n"..
"button_exit[2.0,2.5;2.0,1.0;set;Set]\n" "button_exit[2.0,2.5;2.0,1.0;set;Set]\n"
meta:set_string ("formspec", formspec) meta:set_string ("formspec", formspec)
@@ -145,14 +254,6 @@ local function on_receive_fields (pos, formname, fields, sender)
if meta then if meta then
meta:set_string ("channel", fields.channel or "") meta:set_string ("channel", fields.channel or "")
local formspec =
"formspec_version[3]\n"..
"size[6.0,4.0]\n"..
"field[1.0,0.8;4.0,1.0;channel;Channel;"..minetest.formspec_escape (meta:get_string ("channel")).."]\n"..
"button_exit[2.0,2.5;2.0,1.0;set;Set]\n"
meta:set_string ("formspec", formspec)
end end
end end
end end
@@ -172,6 +273,8 @@ minetest.register_node ("lwcomponents:digiswitch", {
{-0.5, -0.5, -0.5, 0.5, 0.5, 0.5}, {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5},
} }
}, },
paramtype = "none",
param1 = 0,
groups = { cracky = 2, oddly_breakable_by_hand = 2 }, groups = { cracky = 2, oddly_breakable_by_hand = 2 },
sounds = default.node_sound_stone_defaults (), sounds = default.node_sound_stone_defaults (),
mesecons = mesecon_support (), mesecons = mesecon_support (),

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 meta = minetest.get_meta (pos)
local spec = local spec =
"formspec_version[3]\n".. "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_size ("main", 16)
inv:set_width ("main", 4) 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 -- If return true no item is taken from itemstack
return false return false
@@ -208,7 +215,7 @@ end
local function after_place_node_locked (pos, placer, itemstack, pointed_thing) 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 if placer and placer:is_player () then
local meta = minetest.get_meta (pos) 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 ()..")") meta:set_string ("infotext", "Dispenser (owned by "..placer:get_player_name ()..")")
end end
utils.pipeworks_after_place (pos)
-- If return true no item is taken from itemstack -- If return true no item is taken from itemstack
return false return false
end 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", { minetest.register_node("lwcomponents:dispenser", {
description = S("Dispenser"), description = S("Dispenser"),
tiles = { "lwdispenser.png", "lwdispenser.png", "lwdispenser.png", tiles = { "lwdispenser.png", "lwdispenser.png", "lwdispenser.png",
"lwdispenser.png", "lwdispenser.png", "lwdispenser_face.png"}, "lwdispenser.png", "lwdispenser.png", "lwdispenser_face.png"},
is_ground_content = false, is_ground_content = false,
groups = { cracky = 3 }, groups = table.copy (dispenser_groups),
sounds = default.node_sound_stone_defaults (), sounds = default.node_sound_stone_defaults (),
paramtype = "none", paramtype = "none",
param1 = 0, param1 = 0,
@@ -428,10 +537,12 @@ minetest.register_node("lwcomponents:dispenser", {
mesecons = mesecon_support (), mesecons = mesecon_support (),
digiline = digilines_support (), digiline = digilines_support (),
tube = pipeworks_support (),
on_receive_fields = on_receive_fields, on_receive_fields = on_receive_fields,
after_place_node = after_place_node, after_place_node = after_place_node,
can_dig = can_dig, can_dig = can_dig,
after_dig_node = utils.pipeworks_after_dig,
on_blast = on_blast, on_blast = on_blast,
on_rightclick = on_rightclick on_rightclick = on_rightclick
}) })
@@ -443,7 +554,7 @@ minetest.register_node("lwcomponents:dispenser_locked", {
tiles = { "lwdispenser.png", "lwdispenser.png", "lwdispenser.png", tiles = { "lwdispenser.png", "lwdispenser.png", "lwdispenser.png",
"lwdispenser.png", "lwdispenser.png", "lwdispenser_face.png"}, "lwdispenser.png", "lwdispenser.png", "lwdispenser_face.png"},
is_ground_content = false, is_ground_content = false,
groups = { cracky = 3 }, groups = table.copy (dispenser_groups),
sounds = default.node_sound_stone_defaults (), sounds = default.node_sound_stone_defaults (),
paramtype = "none", paramtype = "none",
param1 = 0, param1 = 0,
@@ -454,10 +565,12 @@ minetest.register_node("lwcomponents:dispenser_locked", {
mesecons = mesecon_support (), mesecons = mesecon_support (),
digiline = digilines_support (), digiline = digilines_support (),
tube = pipeworks_support (),
on_receive_fields = on_receive_fields, on_receive_fields = on_receive_fields,
after_place_node = after_place_node_locked, after_place_node = after_place_node_locked,
can_dig = can_dig, can_dig = can_dig,
after_dig_node = utils.pipeworks_after_dig,
on_blast = on_blast, on_blast = on_blast,
on_rightclick = on_rightclick on_rightclick = on_rightclick
}) })

View File

@@ -3,11 +3,13 @@ Breaker
* This block is only available if digilines and/or mesecons are loaded. * 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 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 the item at the back of them, or into a pipeworks tube if one is placed
tool that can dig it or if it can be dug by hand, and there are no nodes behind it. The node is only dug if the breaker has a tool that can dig it
before of it. ie. cannot dig 2nd node if 1st node has something in it. or if it can be dug by hand, and there are no nodes before of it. ie.
The tool is worn if used. Also acts as a digilines conductor. If the cannot dig 2nd node if 1st node has something in it. The tool is worn if
hopper mod is loaded, will take tools from the top and sides. 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. 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. 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 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: Cannon rotation range:
side to side - +/-60 degrees (- = left, + = right) 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 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 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. 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. 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. 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 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. 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. 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. 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 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. 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. 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. 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 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. 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 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 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. Only the owner can dig or access the form of the locked version.

View File

@@ -0,0 +1,67 @@
Force Field Generator
---------------------
Force field generators repel players and mobs within a given radius from
the generator. The radius can be 5 to 25 and is in all directions. An
'electric dome' appears marking the field. The generator consumes fuel
relative to the radius. A radius of 25 uses 1 coal in 10 seconds, 5 uses
1 coal in 50 seconds. Each time an entity is repelled it cost 1 fuel value
(1/40 of a coal). Any players or mobs permitted inside the field can be
added to the Permit list. Each entry must be on a new line with no extra
spaces. Empty lines (not even a space) are ignored. The mob's registered
name or tag can be used. The owner of a locked generator will not be
repelled. When something is repelled it takes a small amount of damage.
Only the owner can dig or access the form of the locked version.
UI
Channel - digilines channel of generator.
Radius - the node radius to repel, in every direction. 5 to 25.
Permit - list of players or mobs to allow within field. Mobs can be registered
entity name or tag.
Start/Stop button - starts and stops the field.
Fuel - single slot inventory.
Player inventor - 32 slot inventory at bottom.
Mesecons
Turns the generator on and off.
Digilines messages
"start"
Start the generator.
"stop"
Stop the generator.
"radius n"
Set the radius to n, where n is a number between 5 to 25.
"add <name>"
Add a name to the permit list.
"remove <name>"
Remove a name from the permit list.
"status"
Query the status of the generator. The generator will send a digilines
message with its own channel as the following table:
{
action = "status",
state = "on" | "off",
radius = n, -- radius as number
permit =
{
<list of names>
},
fuel =
{
name = name, -- eg. "default:coal_lump", will be "" if empty
count = n, -- count of fuel
}
}
Hoppers and pipeworks tubes can be used to push or pull the fuel.

View File

@@ -1,6 +1,6 @@
MoveFloor MoveFloor
--------- ---------
* This block is only available if mesecons and mesecons_mvps is loaded. * This block is only available if mesecons is loaded.
The MoveFloor block responds to a mesecons power source in the 4 horizontal The MoveFloor block responds to a mesecons power source in the 4 horizontal
directions. If the power source is one higher the MoveFloor moves up to directions. If the power source is one higher the MoveFloor moves up to

103
docs/storage.txt Normal file
View File

@@ -0,0 +1,103 @@
Storage
-------
Storage is accommodated with two nodes, Storage Unit and Storage Indexer.
Storage units can be interacted with like a basic chest, each with 32 slots,
and visually join together when placed adjacent to each other. Units are
generally accessed via indexers, which action all adjoining units as a
single storage block. Multiple indexers can action a single storage block.
Only the owner can dig or access the form of the locked versions.
Unowned indexers can only access unowned units. Owned indexers can access
units of the same owner or unowned units.
UI
Search - top left.
List - left.
Channel - digilines channel of indexer.
Input - middle.
Output - top right.
Filter - center right.
Player inventor - lower right.
When the UI is accessed the storage is scanned, and its contents are
displayed in the list. The list contains the following columns:
Item button - pressing will place one of these items from storage into the
output.
10 button - pressing will place 10 of the item.
<stack> button - pressing places a full stack.
Count - the total number of this item in storage.
Description - description of the item.
Note that the 10 and stack buttons may vary in number or not appear
depending on the requirements of that item.
The form does not update while open. A request for more items than in
storage will only deliver the amount in storage.
Terms can be entered into the search field, and when enter is pressed or
the Search button is pressed, only items whose description contains these
terms are shown in the list. That is if they match any of the space
separated terms.
Any items placed into the input are placed into storage. If the filter
is clear all items are accepted. If the filter contains items only these
items will be accepted. Any items not accepted or that do not fit into
storage are placed into the output.
When items are placed into the filter a copy is used and the item returns
to where it was taken from. When items are removed from the filter they
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.
Digilines messages
"output <item> <count>"
or
{
action = "output",
item = "<item>",
count = <count>
}
Moves the item/s to the output. If count is omitted defaults to 1. If
the requested amount is greater than in storage, only the stored amount
is moved. If the requested amount is greater than a full stack of the
item a full stack is moved.
"inventory"
Sends a digilines message with it's own channel in the following form:
{
action = "inventory",
inventory = {
<items>
}
}
The inventory key is an indexed list of items in storage. Each item
entry is a table with the following keys:
{
name -- string, the name of the item, as <mod>:<name>
description -- string, description of the item, same as in UI
count -- number, the total number of this item in storage
custom -- true if a custom item (has metadata), false if not
pallet_index -- string if the item has a pallet index, otherwise nil
id -- string, unique id of the item in storage
}
The description is derived in the following manner: from a custom
description in metadata; if none then the short description from
the item's definition; if none then the description from the item's
definition; if none then the item's name, as <mod>:<name>.
Note: When sending output messages the simple item name, as <mod>:<name>,
will work for most items, but not for custom items. With custom items, or
to play it safe, use the table form of the output message and set the item
field with the id field for the item from a returned inventory.

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 meta = minetest.get_meta (pos)
local spec = local spec =
"formspec_version[3]\n".. "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_size ("main", 16)
inv:set_width ("main", 4) 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 -- If return true no item is taken from itemstack
return false return false
@@ -144,7 +151,7 @@ end
local function after_place_node_locked (pos, placer, itemstack, pointed_thing) 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 if placer and placer:is_player () then
local meta = minetest.get_meta (pos) 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 ()..")") meta:set_string ("infotext", "Dropper (owned by "..placer:get_player_name ()..")")
end end
utils.pipeworks_after_place (pos)
-- If return true no item is taken from itemstack -- If return true no item is taken from itemstack
return false return false
end 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", { minetest.register_node("lwcomponents:dropper", {
description = S("Dropper"), description = S("Dropper"),
tiles = { "lwdropper.png", "lwdropper.png", "lwdropper.png", tiles = { "lwdropper.png", "lwdropper.png", "lwdropper.png",
"lwdropper.png", "lwdropper.png", "lwdropper_face.png"}, "lwdropper.png", "lwdropper.png", "lwdropper_face.png"},
is_ground_content = false, is_ground_content = false,
groups = { cracky = 3 }, groups = table.copy (dropper_groups),
sounds = default.node_sound_stone_defaults (), sounds = default.node_sound_stone_defaults (),
paramtype = "none", paramtype = "none",
param1 = 0, param1 = 0,
@@ -364,10 +473,12 @@ minetest.register_node("lwcomponents:dropper", {
mesecons = mesecon_support (), mesecons = mesecon_support (),
digiline = digilines_support (), digiline = digilines_support (),
tube = pipeworks_support (),
on_receive_fields = on_receive_fields, on_receive_fields = on_receive_fields,
after_place_node = after_place_node, after_place_node = after_place_node,
can_dig = can_dig, can_dig = can_dig,
after_dig_node = utils.pipeworks_after_dig,
on_blast = on_blast, on_blast = on_blast,
on_rightclick = on_rightclick on_rightclick = on_rightclick
}) })
@@ -379,7 +490,7 @@ minetest.register_node("lwcomponents:dropper_locked", {
tiles = { "lwdropper.png", "lwdropper.png", "lwdropper.png", tiles = { "lwdropper.png", "lwdropper.png", "lwdropper.png",
"lwdropper.png", "lwdropper.png", "lwdropper_face.png"}, "lwdropper.png", "lwdropper.png", "lwdropper_face.png"},
is_ground_content = false, is_ground_content = false,
groups = { cracky = 3 }, groups = table.copy (dropper_groups),
sounds = default.node_sound_stone_defaults (), sounds = default.node_sound_stone_defaults (),
paramtype = "none", paramtype = "none",
param1 = 0, param1 = 0,
@@ -390,10 +501,12 @@ minetest.register_node("lwcomponents:dropper_locked", {
mesecons = mesecon_support (), mesecons = mesecon_support (),
digiline = digilines_support (), digiline = digilines_support (),
tube = pipeworks_support (),
on_receive_fields = on_receive_fields, on_receive_fields = on_receive_fields,
after_place_node = after_place_node_locked, after_place_node = after_place_node_locked,
can_dig = can_dig, can_dig = can_dig,
after_dig_node = utils.pipeworks_after_dig,
on_blast = on_blast, on_blast = on_blast,
on_rightclick = on_rightclick on_rightclick = on_rightclick
}) })

View File

@@ -70,24 +70,6 @@ end
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:to_string () == copy2:to_string () then
return true
end
end
return false
end
local function dig_node (pos, toolname) local function dig_node (pos, toolname)
local node = utils.get_far_node (pos) local node = utils.get_far_node (pos)
local dig = false local dig = false
@@ -143,7 +125,7 @@ local function add_drops (drops, drop)
if item and not item:is_empty () then if item and not item:is_empty () then
local existing = drops[item:get_name ()] 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 ()) existing:set_count (existing:get_count () + item:get_count ())
else else
drops[item:get_name ()] = item drops[item:get_name ()] = item
@@ -228,48 +210,74 @@ end
local function explode_entities (pos, radius, damage, drops) local function explode_entities (pos, radius, damage, drops)
local objs = minetest.get_objects_inside_radius (pos, radius) local objs = minetest.get_objects_inside_radius (pos, radius)
for _, obj in pairs (objs) do for _, obj in ipairs (objs) do
local obj_pos = obj:get_pos () -- could be detached player from controller
local dir = vector.direction (pos, obj_pos) if obj.get_pos and obj:get_pos () then
local dist = vector.length (vector.subtract (obj_pos, pos)) local obj_pos = obj:get_pos ()
local vel = vector.multiply (dir, ((radius + 1) - dist) / (radius + 1) * damage * 5) 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 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
obj:add_velocity (vel) obj:add_velocity (vel)
obj:set_hp (obj:get_hp() - ent_damage, reason) elseif not obj:get_armor_groups ().immortal then
else local ent_damage = ((radius - dist) / radius * damage / 2) + (damage / 2)
local luaobj = obj:get_luaentity() local reason = { type = "set_hp", from = "lwcomponents" }
-- object might have disappeared somehow if obj:is_player() then
if luaobj then local parent = obj:get_attach ()
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 if parent then
do_damage, do_knockback, entity_drops = objdef.on_blast (luaobj, ent_damage) obj:set_detach ()
end end
if do_knockback then obj:add_velocity (vel)
obj:add_velocity (vel) obj:set_hp (obj:get_hp () - ent_damage, reason)
end
if do_damage then else
obj:set_hp (obj:get_hp() - ent_damage, reason) local luaobj = obj:get_luaentity ()
end
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 end
end end
@@ -309,7 +317,7 @@ local function add_effects (pos, radius, drops)
collisiondetection = false, collisiondetection = false,
vertical = false, vertical = false,
texture = "lwcomponents_boom.png", texture = "lwcomponents_boom.png",
glow = 15, glow = 14,
}) })
minetest.add_particlespawner ({ minetest.add_particlespawner ({
@@ -404,7 +412,7 @@ function utils.boom (pos, -- center of explosion
if not utils.is_protected (pos, nil) then if not utils.is_protected (pos, nil) then
local center_node = utils.get_far_node (pos) 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 center_free = true
end end
end end

1052
force_field.lua Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -1,4 +1,4 @@
local version = "0.1.20" local version = "0.1.24"
local mod_storage = minetest.get_mod_storage () local mod_storage = minetest.get_mod_storage ()
@@ -37,6 +37,8 @@ loadfile (modpath.."/cannon_shell.lua") (utils)
loadfile (modpath.."/pistons.lua") (utils) loadfile (modpath.."/pistons.lua") (utils)
loadfile (modpath.."/through_wire.lua") (utils) loadfile (modpath.."/through_wire.lua") (utils)
loadfile (modpath.."/camera.lua") (utils) loadfile (modpath.."/camera.lua") (utils)
loadfile (modpath.."/storage.lua") (utils)
loadfile (modpath.."/force_field.lua") (utils)
loadfile (modpath.."/extras.lua") (utils) loadfile (modpath.."/extras.lua") (utils)
loadfile (modpath.."/digiswitch.lua") (utils) loadfile (modpath.."/digiswitch.lua") (utils)
loadfile (modpath.."/movefloor.lua") (utils) loadfile (modpath.."/movefloor.lua") (utils)

View File

@@ -15,6 +15,8 @@ https://www.gnu.org/licenses/old-licenses/lgpl-2.1.html
Mesecons through wire code was adapted from mesecons_receiver. Mesecons through wire code was adapted from mesecons_receiver.
Fragments of code were gleaned from tnt mod.
lwsiren-buzz.ogg lwsiren-buzz.ogg
@@ -61,6 +63,24 @@ https://creativecommons.org/licenses/by/4.0/
lwmovefloor.ogg
---------------
https://www.freesoundslibrary.com/elevator-sound-effect-elevator-ride-doors-closing-and-opening/
License: Attribution 4.0 International (CC BY 4.0). You are allowed to use
sound effects free of charge and royalty free in your multimedia projects
for commercial or non-commercial purposes.
lwforce_field_zap.ogg
---------------------
https://orangefreesounds.com/electricity-zap/
Licence: The sound effect is permitted for non-commercial use under license
Attribution-NonCommercial 4.0 International (CC BY-NC 4.0)
Media license Media license
------------- -------------
siren images derived from images from https://openclipart.org, which is siren images derived from images from https://openclipart.org, which is
@@ -72,6 +92,9 @@ public domain.
camera lens images derived from images from https://openclipart.org, which camera lens images derived from images from https://openclipart.org, which
is public domain. is public domain.
storage nodes images derived from images from https://openclipart.org, which
is public domain.
player button images derived from mesecons button image. player button images derived from mesecons button image.
cannon firing and explosion sound from tnt (TumeniNodes/steveygos93), cannon firing and explosion sound from tnt (TumeniNodes/steveygos93),

View File

@@ -3,4 +3,4 @@ description = Various components for mesecons and digilines.
title = LWComponents title = LWComponents
name = lwcomponents name = lwcomponents
depends = default depends = default
optional_depends = mesecons, digilines, unifieddyes, intllib, hopper, digistuff optional_depends = mesecons, digilines, unifieddyes, intllib, hopper, digistuff, pipeworks

File diff suppressed because it is too large Load Diff

View File

@@ -3,7 +3,7 @@ local S = utils.S
if utils.mesecon_supported and mesecon.mvps_push then if utils.mesecon_supported then
@@ -21,14 +21,10 @@ local mesecon_rules =
-- use mesecons movestone settings
local timer_interval = 1 / mesecon.setting ("movestone_speed", 3)
local max_push = 3 local max_push = 3
local max_pull = 3
-- helper functions:
local function get_movefloor_direction (rulename) local function get_movefloor_direction (rulename)
if rulename.y > 0 then if rulename.y > 0 then
return { x = 0, y = 1, z = 0 } return { x = 0, y = 1, z = 0 }
@@ -38,6 +34,7 @@ local function get_movefloor_direction (rulename)
end end
local function add_movefloor_list (pos, list) local function add_movefloor_list (pos, list)
for i = 1, #list do for i = 1, #list do
if list[i].x == pos.x and if list[i].x == pos.x and
@@ -76,10 +73,289 @@ end
-- copied from mesecons movestone local function get_node_height (node)
local function movefloor_move (pos, node, rulename, is_sticky) local height = 0
local def = minetest.registered_nodes[node.name]
if def and type (def.collision_box) == "table" then
if def.collision_box.type and def.collision_box.type == "regular" then
height = 1
else
for _, box in pairs (def.collision_box) do
if type (box) == "table" then
if type (box[5]) == "number" then
height = box[5]
else
for _, b in ipairs (box) do
if type (b[5]) == "number" and b[5] > height then
height = b[5]
end
end
end
end
end
end
end
return height
end
local function get_affected_nodes (floor_list)
local list = { }
local max_height = 0
local protected = false
for _, fpos in ipairs (floor_list) do
for y = 0, max_push, 1 do
local npos = vector.add (fpos, { x = 0, y = y, z = 0 })
local node = utils.get_far_node (npos)
if node and node.name ~= "air" then
local meta = minetest.get_meta (npos)
local timer = minetest.get_node_timer (npos)
local h = get_node_height (node) + npos.y - fpos.y - 0.5
list[#list + 1] =
{
pos = npos,
node = node,
meta = (meta and meta:to_table ()),
timeout = (timer and timer:get_timeout ()) or 0,
elapsed = (timer and timer:get_elapsed ()) or 0
}
if h > max_height then
max_height = h
end
if utils.is_protected (npos, nil) then
protected = true
end
end
end
end
return list, math.ceil (max_height), protected
end
local function get_entity_height (obj, base)
local height = 0
if obj.get_pos then
local pos = obj:get_pos ()
if obj.get_luaentity then
local entity = obj:get_luaentity ()
if entity and entity.name then
local def = minetest.registered_entities[entity.name]
if def and type (def.collisionbox) == "table" and
type (def.collisionbox[5]) == "number" then
height = def.collisionbox[5] + pos.y - base
end
end
end
local props = obj:get_properties ()
if props and props.collisionbox and type (props.collisionbox) == "table" and
type (props.collisionbox[5]) == "number" then
if props.collisionbox[5] > height then
height = props.collisionbox[5] + pos.y - base
end
end
end
return height
end
local function get_affected_entities (floor_list)
local list = { }
local max_height = 0
for _, fpos in pairs (floor_list) do
local min_pos = vector.subtract (fpos, { x = 0.4999, y = 0.4999, z = 0.4999 })
local max_pos = vector.add (fpos, { x = 0.4999, y = max_push + 0.4999, z = 0.4999 })
local objects = minetest.get_objects_in_area (min_pos, max_pos)
for _, obj in ipairs (objects) do
local h = get_entity_height (obj, fpos.y + 0.5)
list[#list + 1] =
{
pos = obj:get_pos (),
obj = obj
}
if h > max_height then
max_height = h
end
end
end
return list, math.ceil (max_height)
end
local function is_obstructed (floor_list, height)
for _, fpos in pairs (floor_list) do
local npos = vector.add (fpos, { x = 0, y = height, z = 0 })
if utils.is_protected (npos, nil) then
return true
end
local node = utils.get_far_node (npos)
if node and node.name ~= "air" then
local def = minetest.registered_nodes[node.name]
if not def or not def.buildable_to then
return true
end
end
end
return false
end
local function move_entities (list, move, players)
for _, entry in ipairs (list) do
if entry.obj then
if players or not entry.obj:is_player () then
local pos = nil
if entry.obj:is_player () then
pos = vector.add (entry.pos, { x = move.x, y = move.y + 0.1, z = move.z })
else
pos = vector.add (entry.pos, move)
end
if entry.obj.move_to then
entry.obj:move_to (pos)
elseif entry.set_pos then
entry.obj:set_pos (pos)
end
end
end
end
end
local function update_player_position (list)
for _, entry in ipairs (list) do
local player = minetest.get_player_by_name (entry.name)
if player then
local pos = player:get_pos ()
if pos.y < entry.pos.y then
pos.y = entry.pos.y + 0.1
player:set_pos (pos)
end
end
end
end
local function queue_player_update (list, move)
local players = { }
for _, entry in ipairs (list) do
if entry.obj and entry.obj:is_player () then
players[#players + 1] =
{
pos = vector.add (entry.pos, move),
name = entry.obj:get_player_name ()
}
end
end
if #players > 0 then
minetest.after(0.1, update_player_position, players)
end
end
local function move_nodes (list, move)
if move.y > 0 then
for i = #list, 1, -1 do
local pos = vector.add (list[i].pos, move)
minetest.remove_node (list[i].pos)
minetest.set_node (pos, list[i].node)
if list[i].meta then
local meta = minetest.get_meta (pos)
if meta then
meta:from_table (list[i].meta)
end
end
if list[i].timeout > 0 then
timer = minetest.get_node_timer (pos)
if timer then
timer:set (list[i].timeout, list[i].elapsed)
end
end
end
else
for i = 1, #list, 1 do
local pos = vector.add (list[i].pos, move)
minetest.remove_node (list[i].pos)
minetest.set_node (pos, list[i].node)
if list[i].meta then
local meta = minetest.get_meta (pos)
if meta then
meta:from_table (list[i].meta)
end
end
if list[i].timeout > 0 then
timer = minetest.get_node_timer (pos)
if timer then
timer:set (list[i].timeout, list[i].elapsed)
end
end
end
end
end
local function check_for_falling (list)
for _, pos in ipairs (list) do
minetest.check_for_falling (vector.add (pos, { x = 0, y = max_push + 1, z = 0 }))
end
end
local function movefloor_move (pos, node, rulename)
local direction = get_movefloor_direction (rulename) local direction = get_movefloor_direction (rulename)
local play_sound = false
local list = local list =
{ {
@@ -88,68 +364,34 @@ local function movefloor_move (pos, node, rulename, is_sticky)
find_adjoining_movefloor (pos, list) find_adjoining_movefloor (pos, list)
for i = 1, #list do local nodes, height, protected = get_affected_nodes (list)
local frontpos = vector.add (list[i], direction)
local meta = minetest.get_meta (list[i])
local owner = meta:get_string ("owner")
local continue = true
-- ### Step 1: Push nodes in front ### if protected then
local success, stack, oldstack = mesecon.mvps_push (frontpos, direction, max_push, owner)
if not success then
if stack == "protected" then
meta:set_string ("infotext", "Can't move: protected area on the way")
else
minetest.get_node_timer (list[i]):start (timer_interval)
continue = false
end
end
if continue then
mesecon.mvps_move_objects (frontpos, direction, oldstack)
-- ### Step 2: Move the movestone ###
minetest.set_node (frontpos, node)
local meta2 = minetest.get_meta (frontpos)
meta2:set_string ("owner", owner)
minetest.remove_node (list[i])
mesecon.on_dignode (list[i], node)
mesecon.on_placenode (frontpos, node)
minetest.get_node_timer (frontpos):start (timer_interval)
play_sound = true
-- ### Step 3: If sticky, pull stack behind ###
if is_sticky and direction.y < 0 then
local backpos = vector.subtract (list[i], direction)
success, stack, oldstack = mesecon.mvps_pull_all (backpos, direction, max_pull, owner)
if success then
mesecon.mvps_move_objects (backpos, vector.multiply (direction, -1), oldstack, -1)
end
end
-- ### Step 4: Let things fall ###
minetest.check_for_falling (vector.add (list[i], { x = 0, y = 1, z = 0 }))
end
end
if play_sound then
minetest.sound_play("movestone", { pos = list[i], max_hear_distance = 20, gain = 0.5 }, true)
end
end
local function on_timer (pos, elapsed)
local sourcepos = mesecon.is_powered (pos)
if not sourcepos then
return return
end end
local rulename = vector.subtract (sourcepos[1], pos) local entities, h = get_affected_entities (list)
mesecon.activate (pos, minetest.get_node (pos), rulename, 0) if h > height then
height = h
end
if is_obstructed (list, (direction.y > 0 and height + 1) or -1) then
return
end
if direction.y > 0 then
move_entities (entities, direction, true)
move_nodes (nodes, direction)
queue_player_update (entities, direction)
else
move_nodes (nodes, direction)
move_entities (entities, direction, false)
check_for_falling (list)
queue_player_update (entities, direction)
end
minetest.sound_play ("lwmovefloor", { pos = pos, max_hear_distance = 10, gain = 1.0 }, true)
end end
@@ -164,8 +406,8 @@ local function mesecon_support ()
action_on = function (pos, node, rulename) action_on = function (pos, node, rulename)
-- do something to turn the effector on -- do something to turn the effector on
if rulename and not minetest.get_node_timer (pos):is_started () then if rulename then
movefloor_move (pos, node, rulename, true) movefloor_move (pos, node, rulename)
end end
end end
} }
@@ -190,8 +432,6 @@ minetest.register_node("lwcomponents:movefloor", {
groups = { cracky = 2 }, groups = { cracky = 2 },
sounds = default.node_sound_wood_defaults (), sounds = default.node_sound_wood_defaults (),
mesecons = mesecon_support (), mesecons = mesecon_support (),
on_timer = on_timer,
}) })

View File

@@ -120,6 +120,9 @@ local function push_nodes (pos, extent)
end end
local tmeta = cmeta:to_table () local tmeta = cmeta:to_table ()
local ctimer = minetest.get_node_timer (cpos)
local ctimeout = (ctimer and ctimer:get_timeout ()) or 0
local celapsed = (ctimer and ctimer:get_elapsed ()) or 0
push_entities (cpos, vec) push_entities (cpos, vec)
@@ -136,6 +139,14 @@ local function push_nodes (pos, extent)
cmeta:from_table (tmeta) cmeta:from_table (tmeta)
end end
if ctimeout > 0 then
ctimer = minetest.get_node_timer (last)
if ctimer then
ctimer:set (ctimeout, celapsed)
end
end
last = cpos last = cpos
end end
end end
@@ -161,6 +172,9 @@ local function pull_node (pos, extent)
if cmeta then if cmeta then
local tpos = vector.subtract (cpos, vec) local tpos = vector.subtract (cpos, vec)
local tmeta = cmeta:to_table () local tmeta = cmeta:to_table ()
local ctimer = minetest.get_node_timer (cpos)
local ctimeout = (ctimer and ctimer:get_timeout ()) or 0
local celapsed = (ctimer and ctimer:get_elapsed ()) or 0
minetest.remove_node (cpos) minetest.remove_node (cpos)
minetest.set_node (tpos, cnode) minetest.set_node (tpos, cnode)
@@ -172,6 +186,14 @@ local function pull_node (pos, extent)
cmeta:from_table (tmeta) cmeta:from_table (tmeta)
end end
end end
if ctimeout > 0 then
ctimer = minetest.get_node_timer (tpos)
if ctimer then
ctimer:set (ctimeout, celapsed)
end
end
end end
end end
end end
@@ -613,7 +635,18 @@ local function mesecon_support ()
{ {
effector = 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) action_on = function (pos, node)
-- do something to turn the effector on -- do something to turn the effector on
@@ -694,7 +727,7 @@ minetest.register_node("lwcomponents:piston", {
is_ground_content = false, is_ground_content = false,
groups = { cracky = 3 }, groups = { cracky = 3 },
sounds = default.node_sound_stone_defaults (), sounds = default.node_sound_stone_defaults (),
paramtype = "none", paramtype = "light",
param1 = 0, param1 = 0,
paramtype2 = "facedir", paramtype2 = "facedir",
param2 = 0, param2 = 0,
@@ -741,7 +774,7 @@ minetest.register_node("lwcomponents:piston_1", {
is_ground_content = false, is_ground_content = false,
groups = { cracky = 3 , not_in_creative_inventory = 1 }, groups = { cracky = 3 , not_in_creative_inventory = 1 },
sounds = default.node_sound_stone_defaults (), sounds = default.node_sound_stone_defaults (),
paramtype = "none", paramtype = "light",
param1 = 0, param1 = 0,
paramtype2 = "facedir", paramtype2 = "facedir",
param2 = 0, param2 = 0,
@@ -788,7 +821,7 @@ minetest.register_node("lwcomponents:piston_2", {
is_ground_content = false, is_ground_content = false,
groups = { cracky = 3 , not_in_creative_inventory = 1 }, groups = { cracky = 3 , not_in_creative_inventory = 1 },
sounds = default.node_sound_stone_defaults (), sounds = default.node_sound_stone_defaults (),
paramtype = "none", paramtype = "light",
param1 = 0, param1 = 0,
paramtype2 = "facedir", paramtype2 = "facedir",
param2 = 0, param2 = 0,
@@ -818,7 +851,7 @@ minetest.register_node("lwcomponents:piston_sticky", {
is_ground_content = false, is_ground_content = false,
groups = { cracky = 3 }, groups = { cracky = 3 },
sounds = default.node_sound_stone_defaults (), sounds = default.node_sound_stone_defaults (),
paramtype = "none", paramtype = "light",
param1 = 0, param1 = 0,
paramtype2 = "facedir", paramtype2 = "facedir",
param2 = 0, param2 = 0,
@@ -865,7 +898,7 @@ minetest.register_node("lwcomponents:piston_sticky_1", {
is_ground_content = false, is_ground_content = false,
groups = { cracky = 3 , not_in_creative_inventory = 1 }, groups = { cracky = 3 , not_in_creative_inventory = 1 },
sounds = default.node_sound_stone_defaults (), sounds = default.node_sound_stone_defaults (),
paramtype = "none", paramtype = "light",
param1 = 0, param1 = 0,
paramtype2 = "facedir", paramtype2 = "facedir",
param2 = 0, param2 = 0,
@@ -912,7 +945,7 @@ minetest.register_node("lwcomponents:piston_sticky_2", {
is_ground_content = false, is_ground_content = false,
groups = { cracky = 3 , not_in_creative_inventory = 1 }, groups = { cracky = 3 , not_in_creative_inventory = 1 },
sounds = default.node_sound_stone_defaults (), sounds = default.node_sound_stone_defaults (),
paramtype = "none", paramtype = "light",
param1 = 0, param1 = 0,
paramtype2 = "facedir", paramtype2 = "facedir",
param2 = 0, param2 = 0,

View File

@@ -226,7 +226,9 @@ minetest.register_node ("lwcomponents:player_button_on", {
}, },
after_destruct = digistuff.remove_receiver, 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, on_timer = player_button_turnoff,
}) })

View File

@@ -13,7 +13,7 @@ CC BY-SA 3.0
Version Version
======= =======
0.1.20 0.1.24
Minetest Version Minetest Version
@@ -34,6 +34,7 @@ unifieddyes
intllib intllib
hopper hopper
digistuff digistuff
pipeworks
Installation Installation
@@ -67,6 +68,8 @@ Various components for mesecons and digilines.
* Digiswitch, digilines controlled mesecons power. * Digiswitch, digilines controlled mesecons power.
* Movefloor, similar to vertical mesecons movestone. * Movefloor, similar to vertical mesecons movestone.
* Camera, takes a representative image. * Camera, takes a representative image.
* Storage, indexed storage units.
* Force Field Generator, repels players and mobs within a radius.
* Mesecons Through Wire, transmits through 1 to 2 solid blocks. * Mesecons Through Wire, transmits through 1 to 2 solid blocks.
* Solid color conductor blocks, same as Solid Color Block but also mesecons * Solid color conductor blocks, same as Solid Color Block but also mesecons
and digilines conductor. and digilines conductor.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 65 KiB

After

Width:  |  Height:  |  Size: 64 KiB

View File

@@ -10,7 +10,10 @@ utils.settings.alert_handler_errors =
minetest.settings:get_bool ("lwcomponents_alert_handler_errors", true) minetest.settings:get_bool ("lwcomponents_alert_handler_errors", true)
utils.settings.max_piston_nodes = utils.settings.max_piston_nodes =
tonumber(minetest.settings:get("lwcomponents_max_piston_nodes") or 15) tonumber (minetest.settings:get ("lwcomponents_max_piston_nodes") or 15)
utils.settings.default_stack_max =
tonumber (minetest.settings:get ("default_stack_max")) or 99

Binary file not shown.

BIN
sounds/lwmovefloor.ogg Normal file

Binary file not shown.

1452
storage.lua Normal file

File diff suppressed because it is too large Load Diff

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 427 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.7 KiB

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) function utils.on_destroy (itemstack)
local stack = ItemStack (itemstack) local stack = ItemStack (itemstack)
@@ -210,6 +225,22 @@ end
function utils.is_same_item (item1, item2)
local copy1 = ItemStack (item1)
local copy2 = ItemStack (item2)
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) function utils.destroy_node (pos)
local node = utils.get_far_node (pos) local node = utils.get_far_node (pos)