Compare commits

...

13 Commits

Author SHA1 Message Date
loosewheel
391d8e1393 Add files via upload 2022-07-12 19:58:17 +10:00
loosewheel
108abd4485 Add files via upload 2022-07-12 19:56:18 +10:00
loosewheel
6fd2af5e17 Add files via upload 2022-06-19 02:28:52 +10:00
loosewheel
85e5a877c6 Add files via upload 2022-05-23 20:01:18 +10:00
loosewheel
e3a53dcb61 Add files via upload 2022-03-08 20:11:38 +10:00
loosewheel
78f9fe2ef0 Add files via upload 2022-03-08 20:07:00 +10:00
loosewheel
dcc13da758 Add files via upload 2022-03-08 20:03:58 +10:00
loosewheel
75d51c7b4d Add files via upload 2022-03-06 17:02:22 +10:00
loosewheel
b717ea2bd7 Add files via upload 2022-03-06 16:37:25 +10:00
loosewheel
cb9d799276 Add files via upload 2022-03-06 16:34:41 +10:00
loosewheel
691ba63c2b Add files via upload 2022-03-06 16:31:37 +10:00
loosewheel
7c512a504e Add files via upload 2022-03-06 16:30:15 +10:00
loosewheel
1b02b55e7f Add files via upload 2022-03-06 16:28:05 +10:00
42 changed files with 1398 additions and 532 deletions

27
.luacheckrc Normal file
View File

@@ -0,0 +1,27 @@
unused_args = false
allow_defined_top = true
max_comment_line_length = 999
read_globals = {
"DIR_DELIM",
"minetest", "core",
"unpack",
"dump",
table = { fields = { "copy", "getn" } },
"vector", "nodeupdate",
"VoxelManip", "VoxelArea",
"PseudoRandom", "ItemStack",
"default",
"lwcomponents",
"intllib",
"mesecon",
"digiline",
"digilines",
"hopper",
"pipeworks",
"unifieddyes",
"digistuff",
}
globals = {
}

View File

@@ -12,7 +12,7 @@ local break_interval = 1.0
local function get_breaker_side (pos, param2, side) local function get_breaker_side (pos, param2, side)
local base = nil local base
if side == "left" then if side == "left" then
base = { x = -1, y = pos.y, z = 0 } base = { x = -1, y = pos.y, z = 0 }
@@ -138,7 +138,7 @@ local function can_break_node (pos, breakpos)
if node_def then if node_def then
-- try tool first -- try tool first
local tool = get_tool (pos) local tool = get_tool (pos)
local dig_params = nil local dig_params
if tool then if tool then
local tool_def = minetest.registered_items[tool:get_name ()] local tool_def = minetest.registered_items[tool:get_name ()]
@@ -253,8 +253,13 @@ 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)
local meta = minetest.get_meta (pos)
if node then if node then
if meta and minetest.is_protected (pos, meta:get_string ("owner")) then
return
end
local breakpos = get_break_pos (pos, node.param2, range) local breakpos = get_break_pos (pos, node.param2, range)
if breakpos then if breakpos then
@@ -516,7 +521,6 @@ local function on_blast (pos, intensity)
local stack = ItemStack (items[1]) local stack = ItemStack (items[1])
if stack then if stack then
preserve_metadata (pos, node, meta, { stack })
utils.item_drop (stack, nil, pos) utils.item_drop (stack, nil, pos)
minetest.remove_node (pos) minetest.remove_node (pos)
end end
@@ -713,7 +717,7 @@ end
local breaker_groups = { cracky = 3 } local breaker_groups = { cracky = 3, wires_connect = 1 }
if utils.pipeworks_supported then if utils.pipeworks_supported then
breaker_groups.tubedevice = 1 breaker_groups.tubedevice = 1
breaker_groups.tubedevice_receiver = 1 breaker_groups.tubedevice_receiver = 1
@@ -721,7 +725,7 @@ end
local breaker_on_groups = { cracky = 3, not_in_creative_inventory = 1 } local breaker_on_groups = { cracky = 3, not_in_creative_inventory = 1, wires_connect = 1 }
if utils.pipeworks_supported then if utils.pipeworks_supported then
breaker_on_groups.tubedevice = 1 breaker_on_groups.tubedevice = 1
breaker_on_groups.tubedevice_receiver = 1 breaker_on_groups.tubedevice_receiver = 1

View File

@@ -121,7 +121,7 @@ local function camera_scan (pos, resolution, distance)
local horz = (x - (resolution / 2)) * scale * view local horz = (x - (resolution / 2)) * scale * view
local vert = (y - (resolution / 2)) * scale * view local vert = (y - (resolution / 2)) * scale * view
local tpos = nil local tpos
if dir.x ~= 0 then if dir.x ~= 0 then
tpos = vector.round ({ x = (dist * dir.x) + pos.x, y = pos.y - vert, z = horz + pos.z }) tpos = vector.round ({ x = (dist * dir.x) + pos.x, y = pos.y - vert, z = horz + pos.z })
else else
@@ -146,9 +146,9 @@ local function camera_scan (pos, resolution, distance)
last_color = string.format ("0000%02X", color) last_color = string.format ("0000%02X", color)
image[y][x] = last_color image[y][x] = last_color
else else
local node = utils.get_far_node (tpos) local tnode = utils.get_far_node (tpos)
if node and node.name ~= "air" then if tnode and tnode.name ~= "air" then
local color = (((distance - dist) / distance) * 98) + 30 local color = (((distance - dist) / distance) * 98) + 30
last_color = string.format ("%02X%02X%02X", color, color, color) last_color = string.format ("%02X%02X%02X", color, color, color)
@@ -293,7 +293,6 @@ local function on_blast (pos, intensity)
local stack = ItemStack (items[1]) local stack = ItemStack (items[1])
if stack then if stack then
preserve_metadata (pos, node, meta, { stack })
utils.item_drop (stack, nil, pos) utils.item_drop (stack, nil, pos)
minetest.remove_node (pos) minetest.remove_node (pos)
end end

View File

@@ -29,18 +29,6 @@ end
local function get_barrel_pos (pos)
local barrel = get_cannon_barrel (pos)
if barrel then
return barrel:get_pos ()
end
return nil
end
local function get_barrel_angle (pos) local function get_barrel_angle (pos)
local node = minetest.get_node_or_nil (pos) local node = minetest.get_node_or_nil (pos)
local barrel = get_cannon_barrel (pos) local barrel = get_cannon_barrel (pos)
@@ -181,11 +169,7 @@ end
local function aim_barrel_delayed (pos, aimpos) local function aim_barrel_delayed (pos, aimpos)
local x = tonumber (aimpos.x) or 0 if (tonumber (aimpos.z) or 0) < 1 then
local y = tonumber (aimpos.y) or 0
local z = tonumber (aimpos.z) or 0
if z < 1 then
return return
end end
@@ -230,7 +214,8 @@ local function fire_cannon (pos)
if ammo_pos and ammo_angle then if ammo_pos and ammo_angle then
local dir = vector.rotate ({ x = 0, y = 0, z = -1 }, ammo_angle) local dir = vector.rotate ({ x = 0, y = 0, z = -1 }, ammo_angle)
local owner = meta:get_string ("owner") local owner = meta:get_string ("owner")
local obj, cancel = nil, false local obj = nil
local cancel
local spawn_pos = { x = ammo_pos.x + dir.x, local spawn_pos = { x = ammo_pos.x + dir.x,
y = ammo_pos.y + dir.y, y = ammo_pos.y + dir.y,
z = ammo_pos.z + dir.z } z = ammo_pos.z + dir.z }
@@ -464,7 +449,7 @@ local function on_place (itemstack, placer, pointed_thing)
minetest.set_node (pos, { name = "lwcomponents:cannon", param1 = 0, param2 = param2 }) minetest.set_node (pos, { name = "lwcomponents:cannon", param1 = 0, param2 = param2 })
after_place_node (pos, placer, itemstack, pointed_thing) after_place_node (pos, placer, itemstack, pointed_thing)
if not utils.is_creative (player) then if not utils.is_creative (placer) then
itemstack:set_count (itemstack:get_count () - 1) itemstack:set_count (itemstack:get_count () - 1)
end end
end end
@@ -499,7 +484,7 @@ local function on_place_locked (itemstack, placer, pointed_thing)
minetest.set_node (pos, { name = "lwcomponents:cannon_locked", param1 = 0, param2 = param2 }) minetest.set_node (pos, { name = "lwcomponents:cannon_locked", param1 = 0, param2 = param2 })
after_place_node_locked (pos, placer, itemstack, pointed_thing) after_place_node_locked (pos, placer, itemstack, pointed_thing)
if not utils.is_creative (player) then if not utils.is_creative (placer) then
itemstack:set_count (itemstack:get_count () - 1) itemstack:set_count (itemstack:get_count () - 1)
end end
end end
@@ -621,7 +606,6 @@ local function on_blast (pos, intensity)
local stack = ItemStack (items[1]) local stack = ItemStack (items[1])
if stack then if stack then
preserve_metadata (pos, node, meta, { stack })
utils.item_drop (stack, nil, pos) utils.item_drop (stack, nil, pos)
on_destruct (pos) on_destruct (pos)
minetest.remove_node (pos) minetest.remove_node (pos)
@@ -939,7 +923,7 @@ end
local cannon_groups = { cracky = 3 } local cannon_groups = { cracky = 3, wires_connect = 1 }
if utils.pipeworks_supported then if utils.pipeworks_supported then
cannon_groups.tubedevice = 1 cannon_groups.tubedevice = 1
cannon_groups.tubedevice_receiver = 1 cannon_groups.tubedevice_receiver = 1

View File

@@ -53,7 +53,7 @@ v0.1.8
* Made changes to lwcomponents.register_spawner api - called function * Made changes to lwcomponents.register_spawner api - called function
must now set velocity, can use force parameter. must now set velocity, can use force parameter.
* Removed spawning from this mod. Created lwcomponents_spawners to * Removed spawning from this mod. Created lwcomponents_spawners to
register spawers. register spawners.
v0.1.9 v0.1.9
@@ -153,3 +153,30 @@ v0.1.25
* Improved unescaping item description. * Improved unescaping item description.
* Fixed custom item output from storage. * Fixed custom item output from storage.
* Added filtering to conduit forms. * Added filtering to conduit forms.
v0.1.26
* Added support for stickblocks to pistons.
* Changed description of hoppers to avoid confusion.
* Added destroyer.
* Cleaned up hopper code.
* Fixed recipe for solid conductor blocks.
v0.1.27
* Bug fixes and code cleanup.
* Fixed receptor state in detector.
* Improved receptor state in digiswitch.
v0.1.28
* Added support for lwwires. Wires will not connect to conduits.
v0.1.29
* Fixed piston moving piston blanks.
v0.1.30
* Added quantity field to droppers.
* Added 'Use player when placing' setting.

View File

@@ -316,7 +316,6 @@ local function on_blast (pos, intensity)
local stack = ItemStack (items[1]) local stack = ItemStack (items[1])
if stack then if stack then
preserve_metadata (pos, node, meta, { stack })
utils.item_drop (stack, nil, pos) utils.item_drop (stack, nil, pos)
on_destruct (pos) on_destruct (pos)
minetest.remove_node (pos) minetest.remove_node (pos)

View File

@@ -300,7 +300,6 @@ local function send_to_target (pos, target, slot)
local stack = inv:get_stack ("main", slot) local stack = inv:get_stack ("main", slot)
if stack and not stack:is_empty () then if stack and not stack:is_empty () then
local name = stack:get_name ()
local item = ItemStack (stack) local item = ItemStack (stack)
target = (target and tostring (target)) or target = (target and tostring (target)) or
@@ -447,7 +446,7 @@ local function send_inventory_message (pos)
if stack and not stack:is_empty () then if stack and not stack:is_empty () then
local name = stack:get_name () local name = stack:get_name ()
local description = nil local description
local custom = false local custom = false
local pallet_index = nil local pallet_index = nil
local tstack = stack:to_table () local tstack = stack:to_table ()
@@ -737,7 +736,6 @@ local function on_blast (pos, intensity)
local stack = ItemStack (items[1]) local stack = ItemStack (items[1])
if stack then if stack then
preserve_metadata (pos, node, meta, { stack })
utils.item_drop (stack, nil, pos) utils.item_drop (stack, nil, pos)
on_destruct (pos) on_destruct (pos)
minetest.remove_node (pos) minetest.remove_node (pos)
@@ -1026,7 +1024,7 @@ end
local conduit_groups = { cracky = 3 } local conduit_groups = { cracky = 3, wires_connect = 1 }
if utils.pipeworks_supported then if utils.pipeworks_supported then
conduit_groups.tubedevice = 1 conduit_groups.tubedevice = 1
conduit_groups.tubedevice_receiver = 1 conduit_groups.tubedevice_receiver = 1
@@ -1036,13 +1034,14 @@ end
minetest.register_node("lwcomponents:conduit", { minetest.register_node("lwcomponents:conduit", {
description = S("Conduit"), description = S("Conduit"),
short_description = S("Conduit"),
tiles = { "lwconduit.png" }, tiles = { "lwconduit.png" },
drawtype = "nodebox", drawtype = "nodebox",
node_box = { node_box = {
type = "connected", type = "connected",
fixed = { -0.375, -0.375, -0.375, 0.375, 0.375, 0.375 }, -- body fixed = { -0.375, -0.375, -0.375, 0.375, 0.375, 0.375 }, -- body
connect_top = { -0.3125, 0.3125, -0.3125, 0.3125, 0.5, 0.3125 }, -- top connect_top = { -0.3125, 0.3125, -0.3125, 0.3125, 0.5, 0.3125 }, -- top
connect_bottom = {-0.3125, -0.5, -0.3125, 0.3125, -0.3125, 0.3125}, -- down connect_bottom = { -0.3125, -0.5, -0.3125, 0.3125, -0.3125, 0.3125 }, -- down
connect_front = { -0.3125, -0.3125, -0.5, 0.3125, 0.3125, -0.3125 }, -- front connect_front = { -0.3125, -0.3125, -0.5, 0.3125, 0.3125, -0.3125 }, -- front
connect_back = { -0.3125, -0.3125, 0.5, 0.3125, 0.3125, 0.3125 }, -- back connect_back = { -0.3125, -0.3125, 0.5, 0.3125, 0.3125, 0.3125 }, -- back
connect_left = { -0.5, -0.3125, -0.3125, -0.3125, 0.3125, 0.3125 }, -- left connect_left = { -0.5, -0.3125, -0.3125, -0.3125, 0.3125, 0.3125 }, -- left
@@ -1058,7 +1057,7 @@ minetest.register_node("lwcomponents:conduit", {
type = "connected", type = "connected",
fixed = { -0.375, -0.375, -0.375, 0.375, 0.375, 0.375 }, -- body fixed = { -0.375, -0.375, -0.375, 0.375, 0.375, 0.375 }, -- body
connect_top = { -0.3125, 0.3125, -0.3125, 0.3125, 0.5, 0.3125 }, -- top connect_top = { -0.3125, 0.3125, -0.3125, 0.3125, 0.5, 0.3125 }, -- top
connect_bottom = {-0.3125, -0.5, -0.3125, 0.3125, -0.3125, 0.3125}, -- down connect_bottom = { -0.3125, -0.5, -0.3125, 0.3125, -0.3125, 0.3125 }, -- down
connect_front = { -0.3125, -0.3125, -0.5, 0.3125, 0.3125, -0.3125 }, -- front connect_front = { -0.3125, -0.3125, -0.5, 0.3125, 0.3125, -0.3125 }, -- front
connect_back = { -0.3125, -0.3125, 0.5, 0.3125, 0.3125, 0.3125 }, -- back connect_back = { -0.3125, -0.3125, 0.5, 0.3125, 0.3125, 0.3125 }, -- back
connect_left = { -0.5, -0.3125, -0.3125, -0.3125, 0.3125, 0.3125 }, -- left connect_left = { -0.5, -0.3125, -0.3125, -0.3125, 0.3125, 0.3125 }, -- left
@@ -1068,7 +1067,7 @@ minetest.register_node("lwcomponents:conduit", {
type = "connected", type = "connected",
fixed = { -0.375, -0.375, -0.375, 0.375, 0.375, 0.375 }, -- body fixed = { -0.375, -0.375, -0.375, 0.375, 0.375, 0.375 }, -- body
connect_top = { -0.3125, 0.3125, -0.3125, 0.3125, 0.5, 0.3125 }, -- top connect_top = { -0.3125, 0.3125, -0.3125, 0.3125, 0.5, 0.3125 }, -- top
connect_bottom = {-0.3125, -0.5, -0.3125, 0.3125, -0.3125, 0.3125}, -- down connect_bottom = { -0.3125, -0.5, -0.3125, 0.3125, -0.3125, 0.3125 }, -- down
connect_front = { -0.3125, -0.3125, -0.5, 0.3125, 0.3125, -0.3125 }, -- front connect_front = { -0.3125, -0.3125, -0.5, 0.3125, 0.3125, -0.3125 }, -- front
connect_back = { -0.3125, -0.3125, 0.5, 0.3125, 0.3125, 0.3125 }, -- back connect_back = { -0.3125, -0.3125, 0.5, 0.3125, 0.3125, 0.3125 }, -- back
connect_left = { -0.5, -0.3125, -0.3125, -0.3125, 0.3125, 0.3125 }, -- left connect_left = { -0.5, -0.3125, -0.3125, -0.3125, 0.3125, 0.3125 }, -- left
@@ -1106,13 +1105,14 @@ minetest.register_node("lwcomponents:conduit", {
minetest.register_node("lwcomponents:conduit_locked", { minetest.register_node("lwcomponents:conduit_locked", {
description = S("Conduit (locked)"), description = S("Conduit (locked)"),
short_description = S("Conduit (locked)"),
tiles = { "lwconduit.png" }, tiles = { "lwconduit.png" },
drawtype = "nodebox", drawtype = "nodebox",
node_box = { node_box = {
type = "connected", type = "connected",
fixed = { -0.375, -0.375, -0.375, 0.375, 0.375, 0.375 }, -- body fixed = { -0.375, -0.375, -0.375, 0.375, 0.375, 0.375 }, -- body
connect_top = { -0.3125, 0.3125, -0.3125, 0.3125, 0.5, 0.3125 }, -- top connect_top = { -0.3125, 0.3125, -0.3125, 0.3125, 0.5, 0.3125 }, -- top
connect_bottom = {-0.3125, -0.5, -0.3125, 0.3125, -0.3125, 0.3125}, -- down connect_bottom = { -0.3125, -0.5, -0.3125, 0.3125, -0.3125, 0.3125 }, -- down
connect_front = { -0.3125, -0.3125, -0.5, 0.3125, 0.3125, -0.3125 }, -- front connect_front = { -0.3125, -0.3125, -0.5, 0.3125, 0.3125, -0.3125 }, -- front
connect_back = { -0.3125, -0.3125, 0.5, 0.3125, 0.3125, 0.3125 }, -- back connect_back = { -0.3125, -0.3125, 0.5, 0.3125, 0.3125, 0.3125 }, -- back
connect_left = { -0.5, -0.3125, -0.3125, -0.3125, 0.3125, 0.3125 }, -- left connect_left = { -0.5, -0.3125, -0.3125, -0.3125, 0.3125, 0.3125 }, -- left
@@ -1128,7 +1128,7 @@ minetest.register_node("lwcomponents:conduit_locked", {
type = "connected", type = "connected",
fixed = { -0.375, -0.375, -0.375, 0.375, 0.375, 0.375 }, -- body fixed = { -0.375, -0.375, -0.375, 0.375, 0.375, 0.375 }, -- body
connect_top = { -0.3125, 0.3125, -0.3125, 0.3125, 0.5, 0.3125 }, -- top connect_top = { -0.3125, 0.3125, -0.3125, 0.3125, 0.5, 0.3125 }, -- top
connect_bottom = {-0.3125, -0.5, -0.3125, 0.3125, -0.3125, 0.3125}, -- down connect_bottom = { -0.3125, -0.5, -0.3125, 0.3125, -0.3125, 0.3125 }, -- down
connect_front = { -0.3125, -0.3125, -0.5, 0.3125, 0.3125, -0.3125 }, -- front connect_front = { -0.3125, -0.3125, -0.5, 0.3125, 0.3125, -0.3125 }, -- front
connect_back = { -0.3125, -0.3125, 0.5, 0.3125, 0.3125, 0.3125 }, -- back connect_back = { -0.3125, -0.3125, 0.5, 0.3125, 0.3125, 0.3125 }, -- back
connect_left = { -0.5, -0.3125, -0.3125, -0.3125, 0.3125, 0.3125 }, -- left connect_left = { -0.5, -0.3125, -0.3125, -0.3125, 0.3125, 0.3125 }, -- left
@@ -1138,7 +1138,7 @@ minetest.register_node("lwcomponents:conduit_locked", {
type = "connected", type = "connected",
fixed = { -0.375, -0.375, -0.375, 0.375, 0.375, 0.375 }, -- body fixed = { -0.375, -0.375, -0.375, 0.375, 0.375, 0.375 }, -- body
connect_top = { -0.3125, 0.3125, -0.3125, 0.3125, 0.5, 0.3125 }, -- top connect_top = { -0.3125, 0.3125, -0.3125, 0.3125, 0.5, 0.3125 }, -- top
connect_bottom = {-0.3125, -0.5, -0.3125, 0.3125, -0.3125, 0.3125}, -- down connect_bottom = { -0.3125, -0.5, -0.3125, 0.3125, -0.3125, 0.3125 }, -- down
connect_front = { -0.3125, -0.3125, -0.5, 0.3125, 0.3125, -0.3125 }, -- front connect_front = { -0.3125, -0.3125, -0.5, 0.3125, 0.3125, -0.3125 }, -- front
connect_back = { -0.3125, -0.3125, 0.5, 0.3125, 0.3125, 0.3125 }, -- back connect_back = { -0.3125, -0.3125, 0.5, 0.3125, 0.3125, 0.3125 }, -- back
connect_left = { -0.5, -0.3125, -0.3125, -0.3125, 0.3125, 0.3125 }, -- left connect_left = { -0.5, -0.3125, -0.3125, -0.3125, 0.3125, 0.3125 }, -- left

View File

@@ -1,5 +1,4 @@
local utils = ... local utils = ...
local S = utils.S
@@ -101,6 +100,16 @@ minetest.register_craft( {
}) })
minetest.register_craft( {
output = "lwcomponents:destroyer",
recipe = {
{ "default:stone", "", "group:wood" },
{ "", "default:steel_ingot", "" },
{ "group:wood", "", "default:stone" }
},
})
minetest.register_craft( { minetest.register_craft( {
output = "lwcomponents:cannon_shell 10", output = "lwcomponents:cannon_shell 10",
recipe = { recipe = {
@@ -437,7 +446,7 @@ end -- utils.digilines_supported and utils.mesecon_supported
if utils.unifieddyes_supported and utils.mesecon_supported then if utils.unifieddyes_supported and utils.mesecon_supported then
minetest.register_craft ({ minetest.register_craft ({
output = "lwcomputers:solid_conductor_off 3", output = "lwcomponents:solid_conductor_off 3",
recipe = { recipe = {
{ "default:mese_crystal_fragment", "group:wood", ""}, { "default:mese_crystal_fragment", "group:wood", ""},
{ "group:wood", "group:wood", "dye:white" }, { "group:wood", "group:wood", "dye:white" },
@@ -446,7 +455,7 @@ minetest.register_craft ({
minetest.register_craft ({ minetest.register_craft ({
output = "lwcomputers:solid_horizontal_conductor_off 3", output = "lwcomponents:solid_horizontal_conductor_off 3",
recipe = { recipe = {
{ "group:wood", "group:wood", ""}, { "group:wood", "group:wood", ""},
{ "default:mese_crystal_fragment", "group:wood", "dye:white" }, { "default:mese_crystal_fragment", "group:wood", "dye:white" },

View File

@@ -6,3 +6,4 @@ intllib?
hopper? hopper?
digistuff? digistuff?
pipeworks? pipeworks?
lwwires?

View File

@@ -73,13 +73,18 @@ end
local function place_node (item, pos) local function place_node (item, pos, owner)
local node = minetest.get_node_or_nil ({ x = pos.x, y = pos.y - 1, z = pos.z }) local node = minetest.get_node_or_nil ({ x = pos.x, y = pos.y - 1, z = pos.z })
if not node then if not node then
return false return false
end end
if (utils.settings.use_player_when_placing and minetest.is_protected (pos, owner)) or
(not utils.settings.use_player_when_placing and minetest.is_protected (pos, "")) then
return false
end
local nodedef = utils.find_item_def (node.name) local nodedef = utils.find_item_def (node.name)
if node.name == "air" or not nodedef or (nodedef and nodedef.buildable_to) then if node.name == "air" or not nodedef or (nodedef and nodedef.buildable_to) then
@@ -95,7 +100,7 @@ local function place_node (item, pos)
nodedef = utils.find_item_def (node.name) nodedef = utils.find_item_def (node.name)
if node.name ~= "air" then if node.name ~= "air" then
if not nodedef or not nodedef.buildable_to or minetest.is_protected (pos, "") then if not nodedef or not nodedef.buildable_to then
return false return false
end end
end end
@@ -121,8 +126,14 @@ local function place_node (item, pos)
} }
end end
local placer
if owner ~= "" and utils.settings.use_player_when_placing then
placer = minetest.get_player_by_name (owner)
end
if itemdef and itemdef.on_place then if itemdef and itemdef.on_place then
local result, leftover = pcall (itemdef.on_place, stack, nil, pointed_thing) local result, leftover = pcall (itemdef.on_place, stack, placer, pointed_thing)
placed = result placed = result
@@ -145,7 +156,7 @@ local function place_node (item, pos)
if not result then if not result then
if utils.settings.alert_handler_errors then if utils.settings.alert_handler_errors then
minetest.log ("error", "after_place_node handler for "..nodename.." crashed - "..msg) minetest.log ("error", "after_place_node handler for "..stack:get_name ().." crashed - "..msg)
end end
end end
end end
@@ -221,7 +232,7 @@ local function deploy_item (pos, node, slot, range)
local deploypos = get_deploy_pos (pos, node.param2, range) local deploypos = get_deploy_pos (pos, node.param2, range)
if item and deploypos then if item and deploypos then
if place_node (stack, deploypos) then if place_node (stack, deploypos, meta:get_string ("owner")) then
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)
@@ -262,7 +273,7 @@ end
local function deployer_on (pos, node, slot, range) local function deployer_on (pos, _node, slot, range)
local node = minetest.get_node (pos) local node = minetest.get_node (pos)
range = tonumber (range) or 1 range = tonumber (range) or 1
@@ -428,7 +439,6 @@ local function on_blast (pos, intensity)
local stack = ItemStack (items[1]) local stack = ItemStack (items[1])
if stack then if stack then
preserve_metadata (pos, node, meta, { stack })
utils.item_drop (stack, nil, pos) utils.item_drop (stack, nil, pos)
minetest.remove_node (pos) minetest.remove_node (pos)
end end
@@ -631,7 +641,7 @@ end
local deployer_groups = { cracky = 3 } local deployer_groups = { cracky = 3, wires_connect = 1 }
if utils.pipeworks_supported then if utils.pipeworks_supported then
deployer_groups.tubedevice = 1 deployer_groups.tubedevice = 1
deployer_groups.tubedevice_receiver = 1 deployer_groups.tubedevice_receiver = 1
@@ -639,7 +649,7 @@ end
local deployer_on_groups = { cracky = 3, not_in_creative_inventory = 1 } local deployer_on_groups = { cracky = 3, not_in_creative_inventory = 1, wires_connect = 1 }
if utils.pipeworks_supported then if utils.pipeworks_supported then
deployer_on_groups.tubedevice = 1 deployer_on_groups.tubedevice = 1
deployer_on_groups.tubedevice_receiver = 1 deployer_on_groups.tubedevice_receiver = 1

164
destroyer.lua Normal file
View File

@@ -0,0 +1,164 @@
local utils = ...
local S = utils.S
local function trash (pos)
local meta = minetest.get_meta (pos)
local inv = (meta and meta:get_inventory ()) or nil
if inv then
local stack = inv:get_stack ("trash", 1)
if stack and not stack:is_empty () then
utils.on_destroy (stack)
inv:set_stack ("trash", 1, nil)
end
end
end
local function trash_delayed (pos)
minetest.after (0.1, trash, pos)
end
local function after_place_node (pos, placer, itemstack, pointed_thing)
local meta = minetest.get_meta (pos)
if meta then
local inv = meta:get_inventory ()
if inv then
meta:set_string ("inventory", "{ trash = { [1] = '' } }")
meta:set_string ("formspec",
"formspec_version[3]"..
"size[11.75,8.5,false]"..
"label[5.15,1.0;Destroy]"..
"list[context;trash;5.3,1.25;1,1;]"..
"list[current_player;main;1.0,2.75;8,4;]"..
"listring[]")
inv:set_size ("trash", 1)
inv:set_width ("trash", 1)
end
end
utils.pipeworks_after_place (pos)
-- If return true no item is taken from itemstack
return false
end
local function on_metadata_inventory_put (pos, listname, index, stack, player)
if listname == "trash" then
trash_delayed (pos)
end
end
local function on_metadata_inventory_move (pos, from_list, from_index,
to_list, to_index, count, player)
if to_list == "trash" then
trash_delayed (pos)
end
end
local function pipeworks_support ()
if utils.pipeworks_supported then
return
{
priority = 100,
input_inventory = "trash",
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
trash_delayed (pos)
return inv:add_item ("trash", 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 ("trash", 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
return 0
end,
remove_items = function (pos, node, stack, dir, count)
-- removes count items and returns them
return stack
end
}
end
return nil
end
local destroyer_groups = { cracky = 3 }
if utils.pipeworks_supported then
destroyer_groups.tubedevice = 1
destroyer_groups.tubedevice_receiver = 1
end
minetest.register_node("lwcomponents:destroyer", {
description = S("Destroyer"),
drawtype = "normal",
tiles = { "lwcomponents_destroyer_top.png", "lwcomponents_destroyer_top.png",
"lwcomponents_destroyer_side.png", "lwcomponents_destroyer_side.png",
"lwcomponents_destroyer_side.png", "lwcomponents_destroyer_side.png" },
is_ground_content = false,
groups = table.copy (destroyer_groups),
sounds = default.node_sound_stone_defaults (),
paramtype = "none",
param1 = 0,
paramtype2 = "none",
param2 = 0,
floodable = false,
tube = pipeworks_support (),
after_place_node = after_place_node,
after_dig_node = utils.pipeworks_after_dig,
on_metadata_inventory_put = on_metadata_inventory_put,
on_metadata_inventory_move = on_metadata_inventory_move,
})
utils.hopper_add_container({
{"bottom", "lwcomponents:destroyer", "trash"}, -- insert items below from hopper above
{"side", "lwcomponents:destroyer", "trash"}, -- insert items from hopper at side
})
--

View File

@@ -21,7 +21,12 @@ local function mesecons_on (pos)
local node = utils.get_far_node (pos) local node = utils.get_far_node (pos)
if node then if node then
node.param1 = 1 if node.name == "lwcomponents:detector_locked_on" then
node.name = "lwcomponents:detector_locked_on_on"
elseif node.name == "lwcomponents:detector_on" then
node.name = "lwcomponents:detector_on_on"
end
minetest.swap_node (pos, node) minetest.swap_node (pos, node)
end end
end end
@@ -40,7 +45,12 @@ local function mesecons_off (pos)
local node = utils.get_far_node (pos) local node = utils.get_far_node (pos)
if node then if node then
node.param1 = 0 if node.name == "lwcomponents:detector_locked_on_on" then
node.name = "lwcomponents:detector_locked_on"
elseif node.name == "lwcomponents:detector_on_on" then
node.name = "lwcomponents:detector_on"
end
minetest.swap_node (pos, node) minetest.swap_node (pos, node)
end end
end end
@@ -145,7 +155,7 @@ local function get_entity_height (objref)
local 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] local def = minetest.registered_entities[entity.name]
if def and type (def.collisionbox) == "table" and if def and type (def.collisionbox) == "table" and
type (def.collisionbox[5]) == "number" then type (def.collisionbox[5]) == "number" then
@@ -343,30 +353,21 @@ end
local function start_detector (pos) local function start_detector (pos)
local node = minetest.get_node (pos) local node = minetest.get_node (pos)
local meta = minetest.get_meta (pos)
if node and meta then if node then
if node.name == "lwcomponents:detector" then if node.name == "lwcomponents:detector" then
local meta = minetest.get_meta (pos)
if meta then
node.name = "lwcomponents:detector_on" node.name = "lwcomponents:detector_on"
minetest.swap_node (pos, node) minetest.swap_node (pos, node)
minetest.get_node_timer (pos):start (detect_interval) minetest.get_node_timer (pos):start (detect_interval)
update_form_spec (pos) update_form_spec (pos)
end
elseif node.name == "lwcomponents:detector_locked" then elseif node.name == "lwcomponents:detector_locked" then
local meta = minetest.get_meta (pos)
if meta then
node.name = "lwcomponents:detector_locked_on" node.name = "lwcomponents:detector_locked_on"
minetest.swap_node (pos, node) minetest.swap_node (pos, node)
minetest.get_node_timer (pos):start (detect_interval) minetest.get_node_timer (pos):start (detect_interval)
update_form_spec (pos) update_form_spec (pos)
end
end end
end end
@@ -376,32 +377,25 @@ end
local function stop_detector (pos) local function stop_detector (pos)
local node = minetest.get_node (pos) local node = minetest.get_node (pos)
local meta = minetest.get_meta (pos)
if node and meta then if node then
if node.name == "lwcomponents:detector_on" then if node.name == "lwcomponents:detector_on" or
local meta = minetest.get_meta (pos) node.name == "lwcomponents:detector_on_on" then
if meta then
node.name = "lwcomponents:detector" node.name = "lwcomponents:detector"
minetest.swap_node (pos, node) minetest.swap_node (pos, node)
minetest.get_node_timer (pos):stop () minetest.get_node_timer (pos):stop ()
mesecons_off (pos) mesecons_off (pos)
update_form_spec (pos) update_form_spec (pos)
end
elseif node.name == "lwcomponents:detector_locked_on" then elseif node.name == "lwcomponents:detector_locked_on" or
local meta = minetest.get_meta (pos) node.name == "lwcomponents:detector_locked_on_on" then
if meta then
node.name = "lwcomponents:detector_locked" node.name = "lwcomponents:detector_locked"
minetest.swap_node (pos, node) minetest.swap_node (pos, node)
minetest.get_node_timer (pos):stop () minetest.get_node_timer (pos):stop ()
mesecons_off (pos) mesecons_off (pos)
update_form_spec (pos) update_form_spec (pos)
end
end end
end end
@@ -565,7 +559,6 @@ local function on_blast (pos, intensity)
local stack = ItemStack (items[1]) local stack = ItemStack (items[1])
if stack then if stack then
preserve_metadata (pos, node, meta, { stack })
utils.item_drop (stack, nil, pos) utils.item_drop (stack, nil, pos)
on_destruct (pos) on_destruct (pos)
minetest.remove_node (pos) minetest.remove_node (pos)
@@ -698,16 +691,31 @@ end
local function mesecon_support () local function mesecon_support_on ()
if utils.mesecon_supported then if utils.mesecon_supported then
return return
{ {
receptor = receptor =
{ {
state = utils.mesecon_state_on, state = utils.mesecon_state_on,
rules = function (node) rules = utils.mesecon_default_rules
return (node.param1 == 0 and { }) or utils.mesecon_default_rules }
}
end end
return nil
end
local function mesecon_support_off ()
if utils.mesecon_supported then
return
{
receptor =
{
state = utils.mesecon_state_off,
rules = utils.mesecon_default_rules
} }
} }
end end
@@ -722,7 +730,7 @@ minetest.register_node("lwcomponents:detector", {
tiles = { "lwdetector_face.png", "lwdetector_face.png", "lwdetector.png", tiles = { "lwdetector_face.png", "lwdetector_face.png", "lwdetector.png",
"lwdetector.png", "lwdetector.png", "lwdetector_face.png"}, "lwdetector.png", "lwdetector.png", "lwdetector_face.png"},
is_ground_content = false, is_ground_content = false,
groups = { cracky = 3 }, groups = { cracky = 3, wires_connect = 1 },
sounds = default.node_sound_stone_defaults (), sounds = default.node_sound_stone_defaults (),
paramtype = "none", paramtype = "none",
param1 = 0, param1 = 0,
@@ -732,7 +740,7 @@ minetest.register_node("lwcomponents:detector", {
drop = "lwcomponents:detector", drop = "lwcomponents:detector",
_digistuff_channelcopier_fieldname = "channel", _digistuff_channelcopier_fieldname = "channel",
mesecons = mesecon_support (), mesecons = mesecon_support_off (),
digiline = digilines_support (), digiline = digilines_support (),
on_destruct = on_destruct, on_destruct = on_destruct,
@@ -751,7 +759,7 @@ minetest.register_node("lwcomponents:detector_locked", {
tiles = { "lwdetector_face.png", "lwdetector_face.png", "lwdetector.png", tiles = { "lwdetector_face.png", "lwdetector_face.png", "lwdetector.png",
"lwdetector.png", "lwdetector.png", "lwdetector_face.png"}, "lwdetector.png", "lwdetector.png", "lwdetector_face.png"},
is_ground_content = false, is_ground_content = false,
groups = { cracky = 3 }, groups = { cracky = 3, wires_connect = 1 },
sounds = default.node_sound_stone_defaults (), sounds = default.node_sound_stone_defaults (),
paramtype = "none", paramtype = "none",
param1 = 0, param1 = 0,
@@ -761,7 +769,7 @@ minetest.register_node("lwcomponents:detector_locked", {
drop = "lwcomponents:detector_locked", drop = "lwcomponents:detector_locked",
_digistuff_channelcopier_fieldname = "channel", _digistuff_channelcopier_fieldname = "channel",
mesecons = mesecon_support (), mesecons = mesecon_support_off (),
digiline = digilines_support (), digiline = digilines_support (),
on_destruct = on_destruct, on_destruct = on_destruct,
@@ -780,7 +788,7 @@ minetest.register_node("lwcomponents:detector_on", {
tiles = { "lwdetector_face_on.png", "lwdetector_face_on.png", "lwdetector.png", tiles = { "lwdetector_face_on.png", "lwdetector_face_on.png", "lwdetector.png",
"lwdetector.png", "lwdetector.png", "lwdetector_face_on.png"}, "lwdetector.png", "lwdetector.png", "lwdetector_face_on.png"},
is_ground_content = false, is_ground_content = false,
groups = { cracky = 3, not_in_creative_inventory = 1 }, groups = { cracky = 3, not_in_creative_inventory = 1, wires_connect = 1 },
sounds = default.node_sound_stone_defaults (), sounds = default.node_sound_stone_defaults (),
paramtype = "none", paramtype = "none",
param1 = 0, param1 = 0,
@@ -790,7 +798,7 @@ minetest.register_node("lwcomponents:detector_on", {
drop = "lwcomponents:detector", drop = "lwcomponents:detector",
_digistuff_channelcopier_fieldname = "channel", _digistuff_channelcopier_fieldname = "channel",
mesecons = mesecon_support (), mesecons = mesecon_support_off (),
digiline = digilines_support (), digiline = digilines_support (),
on_destruct = on_destruct, on_destruct = on_destruct,
@@ -809,7 +817,7 @@ minetest.register_node("lwcomponents:detector_locked_on", {
tiles = { "lwdetector_face_on.png", "lwdetector_face_on.png", "lwdetector.png", tiles = { "lwdetector_face_on.png", "lwdetector_face_on.png", "lwdetector.png",
"lwdetector.png", "lwdetector.png", "lwdetector_face_on.png"}, "lwdetector.png", "lwdetector.png", "lwdetector_face_on.png"},
is_ground_content = false, is_ground_content = false,
groups = { cracky = 3, not_in_creative_inventory = 1 }, groups = { cracky = 3, not_in_creative_inventory = 1, wires_connect = 1 },
sounds = default.node_sound_stone_defaults (), sounds = default.node_sound_stone_defaults (),
paramtype = "none", paramtype = "none",
param1 = 0, param1 = 0,
@@ -819,7 +827,65 @@ minetest.register_node("lwcomponents:detector_locked_on", {
drop = "lwcomponents:detector_locked", drop = "lwcomponents:detector_locked",
_digistuff_channelcopier_fieldname = "channel", _digistuff_channelcopier_fieldname = "channel",
mesecons = mesecon_support (), mesecons = mesecon_support_off (),
digiline = digilines_support (),
on_destruct = on_destruct,
on_receive_fields = on_receive_fields,
can_dig = can_dig,
after_place_node = after_place_node_locked,
on_blast = on_blast,
on_timer = on_timer,
on_rightclick = on_rightclick
})
minetest.register_node("lwcomponents:detector_on_on", {
description = S("Detector"),
tiles = { "lwdetector_face_on.png", "lwdetector_face_on.png", "lwdetector.png",
"lwdetector.png", "lwdetector.png", "lwdetector_face_on.png"},
is_ground_content = false,
groups = { cracky = 3, not_in_creative_inventory = 1, wires_connect = 1 },
sounds = default.node_sound_stone_defaults (),
paramtype = "none",
param1 = 0,
paramtype2 = "facedir",
param2 = 1,
floodable = false,
drop = "lwcomponents:detector",
_digistuff_channelcopier_fieldname = "channel",
mesecons = mesecon_support_on (),
digiline = digilines_support (),
on_destruct = on_destruct,
on_receive_fields = on_receive_fields,
can_dig = can_dig,
after_place_node = after_place_node,
on_blast = on_blast,
on_timer = on_timer,
on_rightclick = on_rightclick
})
minetest.register_node("lwcomponents:detector_locked_on_on", {
description = S("Detector (locked)"),
tiles = { "lwdetector_face_on.png", "lwdetector_face_on.png", "lwdetector.png",
"lwdetector.png", "lwdetector.png", "lwdetector_face_on.png"},
is_ground_content = false,
groups = { cracky = 3, not_in_creative_inventory = 1, wires_connect = 1 },
sounds = default.node_sound_stone_defaults (),
paramtype = "none",
param1 = 0,
paramtype2 = "facedir",
param2 = 1,
floodable = false,
drop = "lwcomponents:detector_locked",
_digistuff_channelcopier_fieldname = "channel",
mesecons = mesecon_support_on (),
digiline = digilines_support (), digiline = digilines_support (),
on_destruct = on_destruct, on_destruct = on_destruct,

View File

@@ -8,8 +8,6 @@ if utils.digilines_supported and utils.mesecon_supported then
local function get_mesecon_rule_for_side (side) local function get_mesecon_rule_for_side (side)
local base = nil
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
@@ -108,12 +106,59 @@ end
local function get_powered_rules (node)
local rules = { }
if is_side_on (node.param1, "switch") then
rules = table.copy (utils.mesecon_default_rules)
if is_side_on (node.param1, "white") then
rules[#rules + 1] = get_mesecon_rule_for_side ("white")[1]
end
if is_side_on (node.param1, "black") then
rules[#rules + 1] = get_mesecon_rule_for_side ("black")[1]
end
else
local sides =
{
"white",
"black",
"red",
"green",
"blue",
"yellow",
}
for _, side in ipairs (sides) do
if is_side_on (node.param1, side) then
rules[#rules + 1] = get_mesecon_rule_for_side (side)[1]
end
end
end
return rules
end
local function get_node_name (node)
if node.param1 ~= 0 then
return "lwcomponents:digiswitch_on"
end
return "lwcomponents:digiswitch"
end
local function switch_on (pos, side) local function switch_on (pos, side)
utils.mesecon_receptor_on (pos, get_mesecon_rule_for_side (side)) utils.mesecon_receptor_on (pos, get_mesecon_rule_for_side (side))
local node = utils.get_far_node (pos) local node = utils.get_far_node (pos)
if node then if node then
node.param1 = set_side_bit (node.param1, side, true) node.param1 = set_side_bit (node.param1, side, true)
node.name = get_node_name (node)
minetest.swap_node (pos, node) minetest.swap_node (pos, node)
end end
end end
@@ -126,6 +171,7 @@ local function switch_off (pos, side)
local node = utils.get_far_node (pos) local node = utils.get_far_node (pos)
if node then if node then
node.param1 = set_side_bit (node.param1, side, false) node.param1 = set_side_bit (node.param1, side, false)
node.name = get_node_name (node)
minetest.swap_node (pos, node) minetest.swap_node (pos, node)
end end
end end
@@ -192,32 +238,37 @@ local function mesecon_support ()
{ {
receptor = receptor =
{ {
state = mesecon.state.on, state = mesecon.state.off,
rules =
rules = function (node)
if is_side_on (node.param1, "switch") then
return utils.mesecon_default_rules
end
local r = { }
local sides =
{ {
"white", { x = 0, y = 0, z = -1 },
"black", { x = 1, y = 0, z = 0 },
"red", { x = -1, y = 0, z = 0 },
"green", { x = 0, y = 0, z = 1 },
"blue", { x = 1, y = 1, z = 0 },
"yellow", { x = 1, y = -1, z = 0 },
{ x = -1, y = 1, z = 0 },
{ x = -1, y = -1, z = 0 },
{ x = 0, y = 1, z = 1 },
{ x = 0, y = -1, z = 1 },
{ x = 0, y = 1, z = -1 },
{ x = 0, y = -1, z = -1 },
{ x = 0, y = 1, z = 0 },
{ x = 0, y = -1, z = 0 }
} }
},
}
end
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 local function mesecon_support_on ()
return
{
receptor =
{
state = mesecon.state.on,
rules = get_powered_rules
}, },
} }
end end
@@ -243,7 +294,15 @@ end
local function on_destruct (pos) local function on_destruct (pos)
utils.mesecon_receptor_off (pos, get_mesecon_rule_for_side ()) local node = utils.get_far_node (pos)
if node then
local rules = get_powered_rules (node)
if #rules > 0 then
utils.mesecon_receptor_off (pos, rules)
end
end
end end
@@ -275,7 +334,7 @@ minetest.register_node ("lwcomponents:digiswitch", {
}, },
paramtype = "none", paramtype = "none",
param1 = 0, param1 = 0,
groups = { cracky = 2, oddly_breakable_by_hand = 2 }, groups = { cracky = 2, oddly_breakable_by_hand = 2, wires_connect = 1 },
sounds = default.node_sound_stone_defaults (), sounds = default.node_sound_stone_defaults (),
mesecons = mesecon_support (), mesecons = mesecon_support (),
digiline = digilines_support (), digiline = digilines_support (),
@@ -288,4 +347,32 @@ minetest.register_node ("lwcomponents:digiswitch", {
minetest.register_node ("lwcomponents:digiswitch_on", {
description = S("Digilines Switch"),
tiles = { "lwdigiswitch_white.png", "lwdigiswitch_black.png",
"lwdigiswitch_green.png", "lwdigiswitch_red.png",
"lwdigiswitch_yellow.png", "lwdigiswitch_blue.png" },
sunlight_propagates = false,
drawtype = "normal",
node_box = {
type = "fixed",
fixed = {
{-0.5, -0.5, -0.5, 0.5, 0.5, 0.5},
}
},
paramtype = "none",
param1 = 0,
groups = { cracky = 2, oddly_breakable_by_hand = 2, not_in_creative_inventory = 1, wires_connect = 1 },
sounds = default.node_sound_stone_defaults (),
mesecons = mesecon_support_on (),
digiline = digilines_support (),
_digistuff_channelcopier_fieldname = "channel",
on_construct = on_construct,
on_destruct = on_destruct,
on_receive_fields = on_receive_fields,
})
end -- utils.digilines_supported and utils.mesecon_supported end -- utils.digilines_supported and utils.mesecon_supported

View File

@@ -139,7 +139,8 @@ local function dispense_item (pos, node, slot)
item:set_count (1) item:set_count (1)
local spawn_pos = dispense_pos (pos, node) local spawn_pos = dispense_pos (pos, node)
local owner = meta:get_string ("owner") local owner = meta:get_string ("owner")
local obj, cancel = nil, false local obj = nil
local cancel
if utils.settings.spawn_mobs then if utils.settings.spawn_mobs then
obj, cancel = utils.spawn_registered (name, obj, cancel = utils.spawn_registered (name,
@@ -318,7 +319,6 @@ local function on_blast (pos, intensity)
local stack = ItemStack (items[1]) local stack = ItemStack (items[1])
if stack then if stack then
preserve_metadata (pos, node, meta, { stack })
utils.item_drop (stack, nil, pos) utils.item_drop (stack, nil, pos)
minetest.remove_node (pos) minetest.remove_node (pos)
end end
@@ -513,7 +513,7 @@ end
local dispenser_groups = { cracky = 3 } local dispenser_groups = { cracky = 3, wires_connect = 1 }
if utils.pipeworks_supported then if utils.pipeworks_supported then
dispenser_groups.tubedevice = 1 dispenser_groups.tubedevice = 1
dispenser_groups.tubedevice_receiver = 1 dispenser_groups.tubedevice_receiver = 1

View File

@@ -11,7 +11,9 @@ 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 will take tools from the top and sides. Pipeworks tubes can push items
into and pull items from the inventory. 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. To break
nodes in a protected area, the locked version must be used and the owner
must be able to dig in the area.
UI UI

View File

@@ -1,5 +1,5 @@
Deployer Deployer
------- --------
* This block is only available if digilines and/or mesecons are loaded. * This block is only available if digilines and/or mesecons are loaded.
Deployers place the node up to 5 nodes directly in front of them. The Deployers place the node up to 5 nodes directly in front of them. The
@@ -9,7 +9,10 @@ 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. 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. To place
nodes in a protected area the 'Use player when placing' setting must be
enabled, the deployer must be the locked version and the owner must be able
to place in the area.
UI UI

11
docs/destroyer.txt Normal file
View File

@@ -0,0 +1,11 @@
Destroyer
---------
Destroyers dispose of items placed in their single slot inventory (basically
a trash). Items can be push into destroyers with tubes from pipeworks or
hoppers attached to the top or sides, so they are suitable for automation.
Items cannot be pulled out of destroyers.
Note that destroyers act when an item is placed in their inventory, as with
storage indexers it is best to use the hopper from this mod to feed them
in multi-player games.

View File

@@ -1,21 +1,31 @@
DigiSwitch Digilines Switch
---------- ----------------
* This block is only available if both digilines and mesecons are loaded. * This block is only available if both digilines and mesecons are loaded.
Digiswitches act as both a digilines message target and a digilines cable, Digilines switches act as both a digilines message target and a digilines
as well as a mesecons power source. They can be placed beside each other cable, as well as a mesecons power source. They can be placed beside each
to form a bank, horizontally or vertically. other to form a bank, horizontally or vertically.
Right click the digiswitch to give it a channel. Right click the digilines switch to give it a channel.
Mesecon power can be delivered at 6 sides of the digiswitch, the adjacent Mesecon power can be delivered at 6 sides of the digilines switch, the
4 in the (x, z), above and below. Around the connector on these sides are a adjacent 4 in the (x, z), above and below. Around the connector on these
colored border indicating the side. The sides are named "red", "green", sides are a colored border indicating the side. The sides are named "red",
"blue", "yellow", "white" and "black". "green", "blue", "yellow", "white" and "black".
The digilines message sent to the digiswitch dictates the action, "on" or The digilines message sent to the digilines switch dictates the action,
"off". The action can be followed with the side to act upon, separated by "on" or "off". The action can be followed with the side to act upon,
a space. eg. "on white". If a side is stated only that side is acted upon. separated by a space. eg. "on white". If a side is stated only that side
If the side is omitted (or is invalid) all 6 sides are acted upon. If the is acted upon. If the side is omitted (or is invalid) all 6 sides are
side name "switch" is give the power is supplied the same as a mesecons acted upon. If the side name "switch" is given the power is supplied the
switch (all horizontal sides, one below, this height and one above). same as a mesecons switch (all horizontal sides, one below, this height
and one above).
A note on connecting mesecons wires. Mesecons does not appear to allow
for some sides to be on and some off on receptors (power sources). When
any side is on the state of the digilines switch is on, but only rules for
the powered sides are defined. This means if wires are placed while in
this state only the sides that are powered will connect. When no side is
powered the state of the digilines switch is off with rules defined for
all potentially connected sides. In this state (as when first placed)
mesecons wires will connect correctly.

View File

@@ -2,7 +2,7 @@ Dropper
------- -------
* This block is only available if digilines and/or mesecons are loaded. * This block is only available if digilines and/or mesecons are loaded.
Contains an inventory and drops an item on command. Also acts as a Contains an inventory and drops item/s 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. Pipeworks tubes can push top and sides, and release them from the bottom. Pipeworks tubes can push
items into and pull items from the inventory. items into and pull items from the inventory.
@@ -13,29 +13,52 @@ UI
Channel - digilines channel of dropper. Channel - digilines channel of dropper.
Top 16 slot inventory - storage of items to drop. Top 16 slot inventory - storage of items to drop.
Qty - the number of items dropped on an action.
Bottom 32 slot inventory - player's inventory. Bottom 32 slot inventory - player's inventory.
Mesecons Mesecons
Drops the next item when power is turned on. Drops the next item/s when power is turned on, to the given quantity.
Digilines messages Digilines messages
"drop [<slot>|<itemname>] [qty]"
slot or itemname are optional. If given slot must be the number of
the dropper slot to drop from (1 to 16). itemname must be the name of
the item from the dropper to drop (eg. default:stone).
qty is optional. If given must be the number of items to drop. If
omitted the quantity set on the dropper's form is dropped.
examples:
"drop" "drop"
Drops the next item. No drop if dropper is empty. Drops the first found item with the quantity from the dropper's form.
"drop <slot>" "drop 7"
Drops 1 item from the given slot (1 to 16). No drop if slot is empty. Drops items from slot 7 with the quantity from the dropper's form.
eg. "drop 7"
"drop <itemname>" "drop default:stone"
Drops 1 item of the given name. No drop if dropper does not contain the Drops the item "default:stone" with the quantity from the dropper's form.
item.
eg. "drop default:stone"
When an item is dropped a digilines message is sent with the dropper's "drop 7 5"
Drops items from slot 7 with the quantity of 5.
"drop default:stone 5"
Drops the item "default:stone" with the quantity of 5.
"drop nil 5"
Drops the first found item with the quantity of 5.
If there are not enough items in the dropper (of a name or in a slot) to
fulfil the quantity, only the amount available is dropped. If no slot or
name is given the first found item is used (multiple items are not dropped
to fulfil the quantity).
When items are dropped a digilines message is sent with the dropper's
channel. The message is a table with the following keys: channel. The message is a table with the following keys:
{ {
action = "drop", action = "drop",
name = "<itemname>", -- name of dropped item name = "<itemname>", -- name of dropped item/s
slot = <slot> -- slot number the item was taken from (1 to 16). slot = <slot>, -- slot number the item/s were taken from (1 to 16). If
-- more than one slot was taken from this will be -1
qty = <number> -- the number of items dropped
} }

View File

@@ -7,6 +7,18 @@ of the pusher when extended. Sticky piston draw back a single node in
front of the pusher when retracted. Piston also act as a digilines front of the pusher when retracted. Piston also act as a digilines
conductor. conductor.
Sticky blocks are also supported. Any sticky block structure attached to
the pusher will also be pushed, up to the maximum setting. Any free blocks
(not attached to the sticky blocks) in front will be pushed up to the
maximum setting. This limit is from the pusher, not the sticky block. When
retracting a maximum of one free block depth will be pulled. Any sticky
block structure extending laterally by more than half the maximum limit
will not be pushed.
Any entities in front of or standing on a moving node are pushed/pulled,
if nothing is in the way of their base position. Any entities against a
sticky face are not pulled.
UI UI
Channel - digilines channel of piston. Channel - digilines channel of piston.

View File

@@ -23,7 +23,7 @@ end
local function send_drop_message (pos, slot, name) local function send_drop_message (pos, slot, name, qty)
if utils.digilines_supported then if utils.digilines_supported then
local meta = minetest.get_meta (pos) local meta = minetest.get_meta (pos)
@@ -36,7 +36,8 @@ local function send_drop_message (pos, slot, name)
channel, channel,
{ action = "drop", { action = "drop",
name = name, name = name,
slot = slot }) slot = slot,
qty = qty })
end end
end end
end end
@@ -45,69 +46,110 @@ end
-- slot: -- slot:
-- nil - next item, no drop if empty -- nil or "nil"- next item, no drop if empty, max qty or less of first found item
-- number - 1 item from slot, no drop if empty -- number - qty items from slot, no drop if empty, max qty or less
-- string - name of item to drop, no drop if none -- string - name of item to drop, no drop if none, max qty or less
local function drop_item (pos, node, slot) local function drop_item (pos, node, slot, qty)
local meta = minetest.get_meta (pos) local meta = minetest.get_meta (pos)
if meta then if meta then
local inv = meta:get_inventory () local inv = meta:get_inventory ()
if inv then if inv then
if not slot then local item
if qty then
qty = tonumber (qty)
end
if not qty then
qty = tonumber (meta:get_string ("quantity")) or 1
end
qty = math.max (qty, 1)
if not slot or (type (slot) == "string" and slot == "nil") then
local slots = inv:get_size ("main") local slots = inv:get_size ("main")
for i = 1, slots do for i = 1, slots do
local stack = inv:get_stack ("main", i) local stack = inv:get_stack ("main", i)
if not stack:is_empty () and stack:get_count () > 0 then if not stack:is_empty () and stack:get_count () > 0 then
slot = i item = stack:get_name ()
break break
end end
end end
elseif type (slot) == "string" then
local name = slot
slot = nil slot = nil
local slots = inv:get_size ("main") elseif type (slot) == "string" then
item = slot
for i = 1, slots do slot = nil
local stack = inv:get_stack ("main", i)
if not stack:is_empty () and stack:get_count () > 0 then
if name == stack:get_name () then
slot = i
break
end
end
end
else else
slot = tonumber (slot) slot = tonumber (slot)
end end
if slot then if slot then
local stack = inv:get_stack ("main", slot) local stack = inv:get_stack ("main", slot)
if not stack:is_empty () and stack:get_count () > 0 then if not stack:is_empty () and stack:get_count () > 0 then
local name = stack:get_name () item = stack:get_name ()
local item = ItemStack (stack) local drop
if item then if stack:get_count () >= qty then
item:set_count (1) drop = qty
stack:set_count (stack:get_count () - qty)
stack:set_count (stack:get_count () - 1)
inv:set_stack ("main", slot, stack) inv:set_stack ("main", slot, stack)
else
utils.item_drop (item, nil, drop_pos (pos, node)) drop = stack:get_count ()
inv:set_stack ("main", slot, nil)
send_drop_message (pos, slot, name)
return true, slot, name
end end
if drop > 0 then
utils.item_drop (ItemStack (item.." "..drop), nil, drop_pos (pos, node))
send_drop_message (pos, slot, item, drop)
return true, slot, item
end
end
elseif item then
local slots = inv:get_size ("main")
local drop = 0
for i = 1, slots do
local stack = inv:get_stack ("main", i)
if not stack:is_empty () and stack:get_count () > 0 then
if item == stack:get_name () then
local remain = qty - drop
slot = (slot and -1) or i
if stack:get_count () > remain then
stack:set_count (stack:get_count () - remain)
drop = qty
inv:set_stack ("main", i, stack)
else
drop = drop + stack:get_count ()
inv:set_stack ("main", i, nil)
end
end
end
if drop == qty then
break
end
end
if drop > 0 then
utils.item_drop (ItemStack (item.." "..drop), nil, drop_pos (pos, node))
send_drop_message (pos, slot, item, drop)
return true, slot, item
end end
end end
end end
@@ -118,19 +160,27 @@ end
local function after_place_base (pos, placer, itemstack, pointed_thing) local function get_formspec ()
local meta = minetest.get_meta (pos) return
local spec =
"formspec_version[3]\n".. "formspec_version[3]\n"..
"size[11.75,13.75;true]\n".. "size[11.75,13.75;true]\n"..
"field[1.0,1.0;4.0,0.8;channel;Channel;${channel}]\n".. "field[1.0,1.0;4.0,0.8;channel;Channel;${channel}]"..
"button[5.5,1.0;2.0,0.8;setchannel;Set]\n".. "button[5.5,1.0;2.0,0.8;setchannel;Set]"..
"list[context;main;3.5,2.5;4,4;]\n".. "list[context;main;1.0,2.5;4,4;]"..
"list[current_player;main;1.0,8.0;8,4;]\n".. "list[current_player;main;1.0,8.0;8,4;]"..
"listring[]" "listring[]"..
"field[6.5,2.9;2.75,0.8;quantity;Qty;${quantity}]"..
"button[9.25,2.9;1.5,0.8;setquantity;Set]"
end
local function after_place_base (pos, placer, itemstack, pointed_thing)
local meta = minetest.get_meta (pos)
meta:set_string ("inventory", "{ main = { } }") meta:set_string ("inventory", "{ main = { } }")
meta:set_string ("formspec", spec) meta:set_string ("quantity", "1")
meta:set_string ("formspec", get_formspec ())
local inv = meta:get_inventory () local inv = meta:get_inventory ()
@@ -180,6 +230,15 @@ local function on_receive_fields (pos, formname, fields, sender)
meta:set_string ("channel", fields.channel) meta:set_string ("channel", fields.channel)
end end
end end
if fields.setquantity then
local meta = minetest.get_meta (pos)
if meta then
local qty = math.max (tonumber (fields.quantity or 1) or 1, 1)
meta:set_string ("quantity", tostring (qty))
end
end
end end
@@ -254,7 +313,6 @@ local function on_blast (pos, intensity)
local stack = ItemStack (items[1]) local stack = ItemStack (items[1])
if stack then if stack then
preserve_metadata (pos, node, meta, { stack })
utils.item_drop (stack, nil, pos) utils.item_drop (stack, nil, pos)
minetest.remove_node (pos) minetest.remove_node (pos)
end end
@@ -286,6 +344,15 @@ local function on_rightclick (pos, node, clicker, itemstack, pointed_thing)
"lwcomponents:component_privately_owned", "lwcomponents:component_privately_owned",
spec) spec)
end end
else
local meta = minetest.get_meta (pos)
if meta then
if meta:get_string ("quantity") == "" then
meta:set_string ("quantity", "1")
meta:set_string ("formspec", get_formspec ())
end
end
end end
return itemstack return itemstack
@@ -323,7 +390,13 @@ local function digilines_support ()
m[2] = tonumber (m[2]) m[2] = tonumber (m[2])
end end
drop_item (pos, node, m[2]) if m[3] and tonumber (m[3]) then
m[3] = tonumber (m[3])
else
m[3] = nil
end
drop_item (pos, node, m[2], m[3])
end end
end end
end end
@@ -449,7 +522,7 @@ end
local dropper_groups = { cracky = 3 } local dropper_groups = { cracky = 3, wires_connect = 1 }
if utils.pipeworks_supported then if utils.pipeworks_supported then
dropper_groups.tubedevice = 1 dropper_groups.tubedevice = 1
dropper_groups.tubedevice_receiver = 1 dropper_groups.tubedevice_receiver = 1

View File

@@ -22,8 +22,8 @@ local function get_dummy_player (as_player, name, pos, look_dir, controls, veloc
end end
object.set_pos = function (self, pos) object.set_pos = function (self, _pos)
obj_pos = vector.new (pos) obj_pos = vector.new (_pos)
end end
@@ -37,8 +37,8 @@ local function get_dummy_player (as_player, name, pos, look_dir, controls, veloc
end end
object.move_to = function (self, pos, continuous) object.move_to = function (self, _pos, continuous)
obj_pos = vector.new (pos) obj_pos = vector.new (_pos)
end end
@@ -55,8 +55,8 @@ local function get_dummy_player (as_player, name, pos, look_dir, controls, veloc
end end
object.set_hp = function (self, hp, reason) object.set_hp = function (self, _hp, reason)
obj_hp = hp obj_hp = _hp
end end
@@ -134,8 +134,8 @@ local function get_dummy_player (as_player, name, pos, look_dir, controls, veloc
end end
object.set_properties = function (self, properties) object.set_properties = function (self, _properties)
obj_properties = table.copy (properties or { }) obj_properties = table.copy (_properties or { })
end end
@@ -237,7 +237,6 @@ local function get_dummy_player (as_player, name, pos, look_dir, controls, veloc
object.set_fov = function (self, fov, is_multiplier, transition_time) object.set_fov = function (self, fov, is_multiplier, transition_time)
obj_breath = value
end end

View File

@@ -249,9 +249,6 @@ local function explode_entities (pos, radius, damage, drops)
if def and def.on_rightclick then if def and def.on_rightclick then
def.on_rightclick (obj:get_pos (), ItemStack (), child) 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:add_velocity (vel)
child:set_hp (child:get_hp () - ent_damage, reason) child:set_hp (child:get_hp () - ent_damage, reason)
end end

10
fan.lua
View File

@@ -45,7 +45,6 @@ end
local function blow (pos) local function blow (pos)
local meta = minetest.get_meta (pos)
local node = minetest.get_node (pos) local node = minetest.get_node (pos)
local dir = direction_vector (node) local dir = direction_vector (node)
local reach = 5 local reach = 5
@@ -211,7 +210,6 @@ local function on_blast (pos, intensity)
local stack = ItemStack (items[1]) local stack = ItemStack (items[1])
if stack then if stack then
preserve_metadata (pos, node, meta, { stack })
utils.item_drop (stack, nil, pos) utils.item_drop (stack, nil, pos)
minetest.remove_node (pos) minetest.remove_node (pos)
end end
@@ -343,7 +341,7 @@ minetest.register_node("lwcomponents:fan", {
tiles = { "lwfan.png", "lwfan.png", "lwfan.png", tiles = { "lwfan.png", "lwfan.png", "lwfan.png",
"lwfan.png", "lwfan.png", "lwfan_face.png"}, "lwfan.png", "lwfan.png", "lwfan_face.png"},
is_ground_content = false, is_ground_content = false,
groups = { cracky = 3 }, groups = { cracky = 3, wires_connect = 1 },
sounds = default.node_sound_stone_defaults (), sounds = default.node_sound_stone_defaults (),
paramtype = "none", paramtype = "none",
param1 = 0, param1 = 0,
@@ -371,7 +369,7 @@ minetest.register_node("lwcomponents:fan_locked", {
tiles = { "lwfan.png", "lwfan.png", "lwfan.png", tiles = { "lwfan.png", "lwfan.png", "lwfan.png",
"lwfan.png", "lwfan.png", "lwfan_face.png"}, "lwfan.png", "lwfan.png", "lwfan_face.png"},
is_ground_content = false, is_ground_content = false,
groups = { cracky = 3 }, groups = { cracky = 3, wires_connect = 1 },
sounds = default.node_sound_stone_defaults (), sounds = default.node_sound_stone_defaults (),
paramtype = "none", paramtype = "none",
param1 = 0, param1 = 0,
@@ -399,7 +397,7 @@ minetest.register_node("lwcomponents:fan_on", {
tiles = { "lwfan.png", "lwfan.png", "lwfan.png", tiles = { "lwfan.png", "lwfan.png", "lwfan.png",
"lwfan.png", "lwfan.png", "lwfan_face_on.png"}, "lwfan.png", "lwfan.png", "lwfan_face_on.png"},
is_ground_content = false, is_ground_content = false,
groups = { cracky = 3, not_in_creative_inventory = 1 }, groups = { cracky = 3, not_in_creative_inventory = 1, wires_connect = 1 },
sounds = default.node_sound_stone_defaults (), sounds = default.node_sound_stone_defaults (),
paramtype = "none", paramtype = "none",
param1 = 0, param1 = 0,
@@ -428,7 +426,7 @@ minetest.register_node("lwcomponents:fan_locked_on", {
tiles = { "lwfan.png", "lwfan.png", "lwfan.png", tiles = { "lwfan.png", "lwfan.png", "lwfan.png",
"lwfan.png", "lwfan.png", "lwfan_face_on.png"}, "lwfan.png", "lwfan.png", "lwfan_face_on.png"},
is_ground_content = false, is_ground_content = false,
groups = { cracky = 3, not_in_creative_inventory = 1 }, groups = { cracky = 3, not_in_creative_inventory = 1, wires_connect = 1 },
sounds = default.node_sound_stone_defaults (), sounds = default.node_sound_stone_defaults (),
paramtype = "none", paramtype = "none",
param1 = 0, param1 = 0,

View File

@@ -136,7 +136,6 @@ local function check_fuel (pos, used)
end end
if used > power then if used > power then
power = 0
meta:set_float ("power", 0) meta:set_float ("power", 0)
return false return false
@@ -598,7 +597,6 @@ local function on_blast (pos, intensity)
local stack = ItemStack (items[1]) local stack = ItemStack (items[1])
if stack then if stack then
preserve_metadata (pos, node, meta, { stack })
utils.item_drop (stack, nil, pos) utils.item_drop (stack, nil, pos)
on_destruct (pos) on_destruct (pos)
minetest.remove_node (pos) minetest.remove_node (pos)
@@ -822,7 +820,7 @@ end
local force_field_groups = { cracky = 3 } local force_field_groups = { cracky = 3, wires_connect = 1 }
if utils.pipeworks_supported then if utils.pipeworks_supported then
force_field_groups.tubedevice = 1 force_field_groups.tubedevice = 1
force_field_groups.tubedevice_receiver = 1 force_field_groups.tubedevice_receiver = 1
@@ -830,7 +828,7 @@ end
local force_field_on_groups = { cracky = 3, not_in_creative_inventory = 1 } local force_field_on_groups = { cracky = 3, not_in_creative_inventory = 1, wires_connect = 1 }
if utils.pipeworks_supported then if utils.pipeworks_supported then
force_field_on_groups.tubedevice = 1 force_field_on_groups.tubedevice = 1
force_field_on_groups.tubedevice_receiver = 1 force_field_on_groups.tubedevice_receiver = 1

View File

@@ -126,14 +126,14 @@ local function draw_map (pos, map)
end end
if draw then if draw then
local holonode = hologram_block[line[z]] local colornode = hologram_block[line[z]]
if node then if node then
utils.destroy_node (holopos) utils.destroy_node (holopos)
end end
if holonode then if colornode then
minetest.set_node (holopos, { name = holonode.node }) minetest.set_node (holopos, { name = colornode.node })
local nodemeta = minetest.get_meta (holopos) local nodemeta = minetest.get_meta (holopos)
@@ -231,7 +231,6 @@ local function on_blast (pos, intensity)
local stack = ItemStack (items[1]) local stack = ItemStack (items[1])
if stack then if stack then
preserve_metadata (pos, node, meta, { stack })
utils.item_drop (stack, nil, pos) utils.item_drop (stack, nil, pos)
minetest.remove_node (pos) minetest.remove_node (pos)
end end

View File

@@ -149,6 +149,29 @@ end
local function call_allow_metadata_inventory_put (def, pos, listname, index, stack, placer)
if def.allow_metadata_inventory_put and placer then
local result, count = pcall (def.allow_metadata_inventory_put,
pos, listname, index, stack, placer)
if result then
return count
end
end
return utils.settings.default_stack_max
end
local function call_on_metadata_inventory_put (def, pos, listname, index, stack, placer)
if def.on_metadata_inventory_put and placer then
pcall (def.on_metadata_inventory_put, pos, listname, index, stack, placer)
end
end
local function place_item (dest_pos, dest_node, dest_inv_name, stack, placer) local function place_item (dest_pos, dest_node, dest_inv_name, stack, placer)
local dest_def = minetest.registered_nodes[dest_node.name] local dest_def = minetest.registered_nodes[dest_node.name]
@@ -169,16 +192,12 @@ local function place_item (dest_pos, dest_node, dest_inv_name, stack, placer)
if inv_stack and not inv_stack:is_empty () and if inv_stack and not inv_stack:is_empty () and
utils.is_same_item (inv_stack, stack) and utils.is_same_item (inv_stack, stack) and
inv_stack:get_count () < inv_stack:get_stack_max () and inv_stack:get_count () < inv_stack:get_stack_max () and
(dest_def.allow_metadata_inventory_put == nil or (call_allow_metadata_inventory_put (dest_def, dest_pos, dest_inv_name, slot, stack, placer) > 0) then
placer == nil or
dest_def.allow_metadata_inventory_put(dest_pos, dest_inv_name, slot, stack, placer) > 0) then
inv_stack:set_count (inv_stack:get_count () + 1) inv_stack:set_count (inv_stack:get_count () + 1)
dest_inv:set_stack (dest_inv_name, slot, inv_stack) dest_inv:set_stack (dest_inv_name, slot, inv_stack)
if dest_def.on_metadata_inventory_put and placer then call_on_metadata_inventory_put (dest_def, dest_pos, dest_inv_name, slot, stack, placer)
dest_def.on_metadata_inventory_put (dest_pos, dest_inv_name, slot, stack, placer)
end
return true return true
end end
@@ -189,15 +208,11 @@ local function place_item (dest_pos, dest_node, dest_inv_name, stack, placer)
local inv_stack = dest_inv:get_stack (dest_inv_name, slot) local inv_stack = dest_inv:get_stack (dest_inv_name, slot)
if not inv_stack or inv_stack:is_empty () and if not inv_stack or inv_stack:is_empty () and
(dest_def.allow_metadata_inventory_put == nil or (call_allow_metadata_inventory_put (dest_def, dest_pos, dest_inv_name, slot, stack, placer) > 0) then
placer == nil or
dest_def.allow_metadata_inventory_put(dest_pos, dest_inv_name, slot, stack, placer) > 0) then
dest_inv:set_stack (dest_inv_name, slot, stack) dest_inv:set_stack (dest_inv_name, slot, stack)
if dest_def.on_metadata_inventory_put and placer then call_on_metadata_inventory_put (dest_def, dest_pos, dest_inv_name, slot, stack, placer)
dest_def.on_metadata_inventory_put (dest_pos, dest_inv_name, slot, stack, placer)
end
return true return true
end end
@@ -209,6 +224,28 @@ end
local function get_player_object (pos)
local meta = minetest.get_meta (pos)
local placer_name = "<unknown>"
if meta then
placer_name = meta:get_string ("placer_name")
local placer = minetest.get_player_by_name (placer_name)
if placer then
return placer
end
if placer_name == "" then
placer_name = "<unknown>"
end
end
return utils.get_dummy_player (true, placer_name)
end
local function run_hopper_action (pos) local function run_hopper_action (pos)
local node = utils.get_far_node (pos) local node = utils.get_far_node (pos)
local dest_dir = get_output_dir (node) local dest_dir = get_output_dir (node)
@@ -221,13 +258,10 @@ local function run_hopper_action (pos)
local registered_dest_invs = hopper.get_registered_inventories_for (dest_node.name) local registered_dest_invs = hopper.get_registered_inventories_for (dest_node.name)
if registered_dest_invs then if registered_dest_invs then
local meta = minetest.get_meta (pos) local placer = get_player_object (pos)
local placer_name = (meta and meta:get_string ("placer_name")) or nil
local placer = (placer_name and minetest.get_player_by_name (placer_name)) or
utils.get_dummy_player (true, placer_name or "<unknown>")
local src_pos = vector.add (pos, get_input_dir (node)) local src_pos = vector.add (pos, get_input_dir (node))
local drop = nil local drop
local stack = nil local stack
local slot = nil local slot = nil
local src_inv_name = nil local src_inv_name = nil
@@ -310,7 +344,7 @@ end
minetest.register_node ("lwcomponents:hopper", { minetest.register_node ("lwcomponents:hopper", {
description = S("Hopper"), description = S("Conduit Hopper"),
tiles = { "lwcomponents_hopper_top.png", "lwcomponents_hopper_vert_spout.png", tiles = { "lwcomponents_hopper_top.png", "lwcomponents_hopper_vert_spout.png",
"lwcomponents_hopper_side.png", "lwcomponents_hopper_side.png", "lwcomponents_hopper_side.png", "lwcomponents_hopper_side.png",
"lwcomponents_hopper_side.png", "lwcomponents_hopper_side.png" }, "lwcomponents_hopper_side.png", "lwcomponents_hopper_side.png" },
@@ -359,7 +393,7 @@ minetest.register_node ("lwcomponents:hopper", {
minetest.register_node ("lwcomponents:hopper_horz", { minetest.register_node ("lwcomponents:hopper_horz", {
description = S("Hopper"), description = S("Conduit Hopper"),
tiles = { "lwcomponents_hopper_top.png", "lwcomponents_hopper_bottom.png", tiles = { "lwcomponents_hopper_top.png", "lwcomponents_hopper_bottom.png",
"lwcomponents_hopper_side.png", "lwcomponents_hopper_side.png", "lwcomponents_hopper_side.png", "lwcomponents_hopper_side.png",
"lwcomponents_hopper_side_spout.png", "lwcomponents_hopper_side.png" }, "lwcomponents_hopper_side_spout.png", "lwcomponents_hopper_side.png" },

View File

@@ -1,4 +1,4 @@
local version = "0.1.25" local version = "0.1.30"
local mod_storage = minetest.get_mod_storage () local mod_storage = minetest.get_mod_storage ()
@@ -17,7 +17,7 @@ local modpath = minetest.get_modpath ("lwcomponents")
loadfile (modpath.."/settings.lua") (utils) loadfile (modpath.."/settings.lua") (utils)
utils.get_dummy_player = loadfile (modpath.."/dummy_player.lua") () utils.get_dummy_player = loadfile (modpath.."/dummy_player.lua") ()
loadfile (modpath.."/utils.lua") (utils, mod_storage) loadfile (modpath.."/utils.lua") (utils)
loadfile (modpath.."/explode.lua") (utils) loadfile (modpath.."/explode.lua") (utils)
loadfile (modpath.."/api.lua") (utils) loadfile (modpath.."/api.lua") (utils)
utils.connections = loadfile (modpath.."/connections.lua") () utils.connections = loadfile (modpath.."/connections.lua") ()
@@ -41,6 +41,7 @@ loadfile (modpath.."/through_wire.lua") (utils)
loadfile (modpath.."/camera.lua") (utils) loadfile (modpath.."/camera.lua") (utils)
loadfile (modpath.."/storage.lua") (utils) loadfile (modpath.."/storage.lua") (utils)
loadfile (modpath.."/force_field.lua") (utils) loadfile (modpath.."/force_field.lua") (utils)
loadfile (modpath.."/destroyer.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

@@ -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, pipeworks optional_depends = mesecons, digilines, unifieddyes, intllib, hopper, digistuff, pipeworks, lwwires

View File

@@ -237,7 +237,7 @@ local function move_entities (list, move, players)
for _, entry in ipairs (list) do for _, entry in ipairs (list) do
if entry.obj then if entry.obj then
if players or not entry.obj:is_player () then if players or not entry.obj:is_player () then
local pos = nil local pos
if entry.obj:is_player () then if entry.obj:is_player () then
pos = vector.add (entry.pos, { x = move.x, y = move.y + 0.1, z = move.z }) pos = vector.add (entry.pos, { x = move.x, y = move.y + 0.1, z = move.z })
@@ -311,7 +311,7 @@ local function move_nodes (list, move)
end end
if list[i].timeout > 0 then if list[i].timeout > 0 then
timer = minetest.get_node_timer (pos) local timer = minetest.get_node_timer (pos)
if timer then if timer then
timer:set (list[i].timeout, list[i].elapsed) timer:set (list[i].timeout, list[i].elapsed)
@@ -334,7 +334,7 @@ local function move_nodes (list, move)
end end
if list[i].timeout > 0 then if list[i].timeout > 0 then
timer = minetest.get_node_timer (pos) local timer = minetest.get_node_timer (pos)
if timer then if timer then
timer:set (list[i].timeout, list[i].elapsed) timer:set (list[i].timeout, list[i].elapsed)

View File

@@ -43,33 +43,36 @@ end
local function push_entities (pos, vec) local function push_entities (pos, movedir, entity_list, upper_limit)
local tpos = vector.add (pos, vec) local objects = minetest.get_objects_inside_radius (pos, 1.5)
local tnode = utils.get_far_node (tpos)
local can_move = false
if tnode then for _, obj in ipairs (objects) do
if tnode.name == "air" then if obj.get_pos and obj.move_to then
can_move = true local opos = obj:get_pos ()
else
local tdef = utils.find_item_def (tnode.name)
can_move = tdef and not tdef.walkable
end
end
if can_move then
local object = minetest.get_objects_inside_radius (pos, 1.5)
for j = 1, #object do
if object[j].get_pos then
local opos = object[j]:get_pos ()
if opos.x > (pos.x - 0.5) and opos.x < (pos.x + 0.5) and if opos.x > (pos.x - 0.5) and opos.x < (pos.x + 0.5) and
opos.z > (pos.z - 0.5) and opos.z < (pos.z + 0.5) and opos.z > (pos.z - 0.5) and opos.z < (pos.z + 0.5) and
opos.y > (pos.y - 0.5) and opos.y < (pos.y + 0.5) then opos.y >= (pos.y - 0.5) and opos.y < (pos.y + upper_limit) then
object[j]:set_pos (vector.add (opos, vec)) local newpos = vector.add (opos, movedir)
local node = utils.get_far_node (vector.round (newpos))
local def = (node and utils.find_item_def (node.name)) or nil
if (node.name == "air") or (def and not def.walkable) then
entity_list[#entity_list + 1] =
{
obj = obj,
pos = newpos
}
obj:move_to (newpos)
else
entity_list[#entity_list + 1] =
{
obj = obj,
pos = opos
}
end end
end end
end end
@@ -78,76 +81,266 @@ end
local function push_nodes (pos, extent) local function update_player_position (player_list)
local node = utils.get_far_node (pos) for _, entry in ipairs (player_list) do
local player = minetest.get_player_by_name (entry.name)
if node then if player then
local vec = direction_vector (node) local pos = player:get_pos ()
local last = vector.add (pos, vector.multiply (vec, extent))
local maxnodes = utils.settings.max_piston_nodes + 1
local count = 0
for i = 1, maxnodes do if pos.y < entry.pos.y then
local tnode = utils.get_far_node (last) pos.y = entry.pos.y
player:set_pos (pos)
end
end
end
end
if not tnode then
return false
local function queue_player_update (entity_list, movedir)
local players = { }
for _, entry in ipairs (entity_list) do
if entry.obj and entry.obj:is_player () then
players[#players + 1] =
{
pos = entry.pos,
name = entry.obj:get_player_name ()
}
end
end end
local tdef = utils.find_item_def (tnode.name) if #players > 0 then
minetest.after(0.1, update_player_position, players)
end
end
if tnode.name == "air" or (tdef and not tdef.walkable) then
count = i - 1
local rules_alldirs =
{
{x = 1, y = 0, z = 0},
{x = -1, y = 0, z = 0},
{x = 0, y = 1, z = 0},
{x = 0, y = -1, z = 0},
{x = 0, y = 0, z = 1},
{x = 0, y = 0, z = -1},
}
local function add_pos_to_list (pos, dir, movedir, node_list, check_list)
local hash = minetest.hash_node_position (pos)
if not check_list[hash] then
if minetest.is_protected (pos, "") then
return 0
end
local node = utils.get_far_node (pos)
if not node then
return 0
end
local def = utils.find_item_def (node.name)
if node.name == "air" or (def and def.buildable_to) then
return 1
end
if node.name == "lwcomponents:piston_blank_1" or
node.name == "lwcomponents:piston_blank_2" then
return 0
end
local meta = minetest.get_meta (pos)
local timer = minetest.get_node_timer (pos)
check_list[hash] = true
node_list[#node_list + 1] =
{
node = node,
def = def,
pos = vector.new (pos),
newpos = vector.add (pos, movedir),
meta = (meta and meta:to_table ()) or { },
node_timer =
{
(timer and timer:get_timeout ()) or 0,
(timer and timer:get_elapsed ()) or 0
}
}
if def.mvps_sticky then
local sides = def.mvps_sticky (pos, node)
for _, r in ipairs (sides) do
if add_pos_to_list (r, dir, movedir, node_list, check_list) == 0 then
return 0
end
end
end
-- If adjacent node is sticky block and connects add that
-- position to the connected table
for _, r in ipairs (rules_alldirs) do
local apos = vector.add (pos, r)
local anode = utils.get_far_node (apos)
local adef = (anode and minetest.registered_nodes[anode.name]) or nil
if adef and adef.mvps_sticky then
local sides = adef.mvps_sticky (apos, anode)
-- connects to this position?
for _, link in ipairs (sides) do
if vector.equals (link, pos) then
if add_pos_to_list (apos, dir, movedir, node_list, check_list) == 0 then
return 0
end
break
end
end
end
end
end
return 2
end
local function node_list_last_pos (pos, node_list, length)
local movedir = node_list.movedir
local base_pos = node_list.base_pos
if movedir then
if movedir.x ~= 0 then
return vector.new ({
x = base_pos.x + (movedir.x * length),
y = pos.y,
z = pos.z
})
elseif movedir.z ~= 0 then
return vector.new ({
x = pos.x,
y = pos.y,
z = base_pos.z + (movedir.z * length)
})
elseif movedir.y ~= 0 then
return vector.new ({
x = pos.x,
y = base_pos.y + (movedir.y * length),
z = pos.z
})
end
end
return pos
end
local function get_node_list (pos, extent, length, maxnodes, pushing, node_list, check_list)
local node = utils.get_far_node (pos)
node_list = node_list or { }
check_list = check_list or { }
if node then
local dir = vector.round (direction_vector (node))
local movedir = vector.round ((pushing and dir) or vector.multiply (dir, -1))
node_list.dir = dir
node_list.movedir = movedir
node_list.base_pos = vector.add (pos, vector.multiply (dir, extent))
node_list.length = length
node_list.maxnodes = maxnodes
check_list[minetest.hash_node_position (vector.add (pos, vector.multiply (dir, extent - 1)))] = true
for i = 0, length - 1, 1 do
local tpos = vector.add (pos, vector.multiply (dir, extent + i))
local result = add_pos_to_list (tpos, dir, movedir, node_list, check_list)
if result == 0 then
return false
elseif result == 1 then
break
end
end
-- get any ahead of stickyblocks to limit
local copy_list = table.copy (node_list)
for _, n in ipairs (copy_list) do
local hash = minetest.hash_node_position (n.newpos)
if not check_list[hash] then
local last_pos = node_list_last_pos (n.newpos, node_list, length)
local this_pos = vector.new (n.newpos)
local count = 0
while not vector.equals (this_pos, last_pos) and count < length do
local result = add_pos_to_list (this_pos, dir, movedir, node_list, check_list)
if result == 0 then
return false
elseif result == 1 then
break break
end end
if i == maxnodes then count = count + 1
this_pos = vector.add (this_pos, movedir)
end
end
end
return true
end
return false
end
local function can_node_list_move (node_list, check_list)
local movedir = node_list.movedir
local radius = math.floor (node_list.maxnodes / 2)
local base_pos = node_list.base_pos
if movedir then
for _, n in ipairs (node_list) do
-- check connected stickyblocks don't extend too far laterally
if movedir.x ~= 0 then
if math.abs (n.pos.y - base_pos.y) > radius or
math.abs (n.pos.z - base_pos.z) > radius then
return false return false
end end
elseif movedir.z ~= 0 then
last = vector.add (last, vec) if math.abs (n.pos.y - base_pos.y) > radius or
end math.abs (n.pos.x - base_pos.x) > radius then
push_entities (last, vec)
for i = 1, count, 1 do
local cpos = vector.subtract (last, vec)
local cnode = utils.get_far_node (cpos)
local cmeta = minetest.get_meta (cpos)
if not cnode or not cmeta then
return false return false
end end
elseif movedir.y ~= 0 then
local tmeta = cmeta:to_table () if math.abs (n.pos.x - base_pos.x) > radius or
local ctimer = minetest.get_node_timer (cpos) math.abs (n.pos.z - base_pos.z) > radius then
local ctimeout = (ctimer and ctimer:get_timeout ()) or 0
local celapsed = (ctimer and ctimer:get_elapsed ()) or 0
push_entities (cpos, vec)
minetest.remove_node (cpos)
minetest.set_node (last, cnode)
if tmeta then
cmeta = minetest.get_meta (last)
if not cmeta then
return false return false
end end
cmeta:from_table (tmeta)
end end
if ctimeout > 0 then -- check moving to is clear
ctimer = minetest.get_node_timer (last) if not check_list[minetest.hash_node_position (n.newpos)] then
local node = utils.get_far_node (n.newpos)
local def = (node and utils.find_item_def (node.name)) or nil
if ctimer then if node.name ~= "air" and def and not def.buildable_to then
ctimer:set (ctimeout, celapsed) return false
end end
end end
last = cpos
end end
end end
@@ -156,47 +349,239 @@ end
local function sort_node_list (node_list)
local movedir = node_list.movedir
if movedir then
if movedir.x > 0 then
table.sort (node_list , function (n1, n2)
return n1.pos.x > n2.pos.x
end)
elseif movedir.x < 0 then
table.sort (node_list , function (n1, n2)
return n1.pos.x < n2.pos.x
end)
elseif movedir.z > 0 then
table.sort (node_list , function (n1, n2)
return n1.pos.z > n2.pos.z
end)
elseif movedir.z < 0 then
table.sort (node_list , function (n1, n2)
return n1.pos.z < n2.pos.z
end)
elseif movedir.y > 0 then
table.sort (node_list , function (n1, n2)
return n1.pos.y > n2.pos.y
end)
elseif movedir.y < 0 then
table.sort (node_list , function (n1, n2)
return n1.pos.y < n2.pos.y
end)
end
end
end
local on_mvps_move = function (node_list)
end
local is_mvps_stopper = function (node, movedir, node_list, id)
return false
end
local update_mesecons_connections_removed = function (node_list)
end
local update_mesecons_connections_added = function (node_list)
end
if utils.mesecon_supported then
if mesecon.on_mvps_move then
on_mvps_move = function (node_list)
for _, callback in ipairs (mesecon.on_mvps_move) do
callback (node_list)
end
end
end
if mesecon.is_mvps_stopper then
is_mvps_stopper = function (node, movedir, node_list, id)
return mesecon.is_mvps_stopper (node, movedir, node_list, id)
end
end
if mesecon.on_dignode then
update_mesecons_connections_removed = function (node_list)
for _, node in ipairs (node_list) do
mesecon.on_dignode (node.oldpos, node.node)
end
end
end
if mesecon.on_placenode then
update_mesecons_connections_added = function (node_list)
for _, node in ipairs (node_list) do
mesecon.on_placenode (node.pos, utils.get_far_node (node.pos))
end
end
end
end
local function push_nodes (pos, extent)
local node_list = { }
local check_list = { }
local entity_list = { }
local maxnodes = utils.settings.max_piston_nodes
if not get_node_list (pos, extent, maxnodes, maxnodes, true, node_list, check_list) then
return false
end
if not can_node_list_move (node_list, check_list, maxnodes) then
return false
end
sort_node_list (node_list)
for id, node in ipairs (node_list) do
if is_mvps_stopper (node.node, node_list.movedir, node_list, id) then
return false
end
end
for _, node in ipairs (node_list) do
node.oldpos = vector.new (node.pos)
node.pos = vector.new (node.newpos)
node.newpos = nil
minetest.remove_node (node.oldpos)
end
update_mesecons_connections_removed (node_list)
-- push entities in front first
for _, node in ipairs (node_list) do
if not check_list[minetest.hash_node_position (node.pos)] then
push_entities (node.pos, node_list.movedir, entity_list, 0.5)
end
end
for _, node in ipairs (node_list) do
push_entities (node.oldpos, node_list.movedir, entity_list, 1.0)
minetest.set_node (node.pos, node.node)
if node.meta then
local meta = minetest.get_meta (node.pos)
if meta then
meta:from_table (node.meta)
end
end
if node.node_timer[1] > 0 then
local timer = minetest.get_node_timer (node.pos)
if timer then
timer:set (node.node_timer[1], node.node_timer[2])
end
end
end
-- push any entities in front of pusher
push_entities (node_list.base_pos, node_list.movedir, entity_list, 0.5)
on_mvps_move (node_list)
update_mesecons_connections_added (node_list)
if node_list.movedir.y >= 0 then
queue_player_update (entity_list, node_list.movedir)
end
return true
end
local function pull_node (pos, extent) local function pull_node (pos, extent)
local node = utils.get_far_node (pos) local node_list = { }
local check_list = { }
local entity_list = { }
local maxnodes = utils.settings.max_piston_nodes
if node then if not get_node_list (pos, extent, 1, maxnodes, false, node_list, check_list) then
local vec = direction_vector (node) return false
local cpos = vector.add (pos, vector.multiply (vec, extent)) end
local cnode = utils.get_far_node (cpos)
local cdef = cnode and utils.find_item_def (cnode.name)
if cnode and cnode.name ~= "air" and cdef and cdef.walkable then if not can_node_list_move (node_list, check_list, maxnodes) then
return false
end
local cmeta = minetest.get_meta (cpos) sort_node_list (node_list)
if cmeta then for id, node in ipairs (node_list) do
local tpos = vector.subtract (cpos, vec) if is_mvps_stopper (node.node, node_list.movedir, node_list, id) then
local tmeta = cmeta:to_table () return false
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.set_node (tpos, cnode)
if tmeta then
cmeta = minetest.get_meta (tpos)
if cmeta then
cmeta:from_table (tmeta)
end end
end end
if ctimeout > 0 then for _, node in ipairs (node_list) do
ctimer = minetest.get_node_timer (tpos) node.oldpos = vector.new (node.pos)
node.pos = vector.new (node.newpos)
node.newpos = nil
if ctimer then minetest.remove_node (node.oldpos)
ctimer:set (ctimeout, celapsed) end
end
update_mesecons_connections_removed (node_list)
-- push entities in front first
for _, node in ipairs (node_list) do
if not check_list[minetest.hash_node_position (node.pos)] then
push_entities (node.pos, node_list.movedir, entity_list, 0.5)
end
end
for _, node in ipairs (node_list) do
push_entities (node.oldpos, node_list.movedir, entity_list, 1.0)
minetest.set_node (node.pos, node.node)
if node.meta then
local meta = minetest.get_meta (node.pos)
if meta then
meta:from_table (node.meta)
end
end
if node.node_timer[1] > 0 then
local timer = minetest.get_node_timer (node.pos)
if timer then
timer:set (node.node_timer[1], node.node_timer[2])
end end
end end
end end
on_mvps_move (node_list)
update_mesecons_connections_added (node_list)
if node_list.movedir.y >= 0 then
queue_player_update (entity_list, node_list.movedir)
end end
return true
end end
@@ -504,7 +889,6 @@ local function on_blast (pos, intensity)
local stack = ItemStack (items[1]) local stack = ItemStack (items[1])
if stack then if stack then
preserve_metadata (pos, node, meta, { stack })
utils.item_drop (stack, nil, pos) utils.item_drop (stack, nil, pos)
minetest.remove_node (pos) minetest.remove_node (pos)
end end
@@ -690,7 +1074,7 @@ minetest.register_node("lwcomponents:piston_blank_1", {
minetest.register_node("lwcomponents:piston_blank_2", { minetest.register_node("lwcomponents:piston_blank_2", {
description = S("Piston blank"), description = S("Piston blank"),
drawtype = "airlike", drawtype = "airlike",
paramtype = "none", paramtype = "light",
param1 = 0, param1 = 0,
paramtype2 = "facedir", paramtype2 = "facedir",
param2 = 0, param2 = 0,
@@ -704,15 +1088,14 @@ minetest.register_node("lwcomponents:piston_blank_2", {
light_source = 0, light_source = 0,
sunlight_propagates = true, sunlight_propagates = true,
walkable = true, walkable = true,
pointable = false, pointable = true,
diggable = false, diggable = true,
climbable = false, climbable = false,
buildable_to = false, buildable_to = false,
floodable = false, floodable = false,
is_ground_content = false, is_ground_content = false,
drop = "", drop = "",
groups = { not_in_creative_inventory = 1 }, groups = { cracky = 3, not_in_creative_inventory = 1 },
paramtype = "light",
-- unaffected by explosions -- unaffected by explosions
on_blast = function() end, on_blast = function() end,
}) })
@@ -725,7 +1108,7 @@ minetest.register_node("lwcomponents:piston", {
"lwcomponents_piston_right.png", "lwcomponents_piston_left.png", "lwcomponents_piston_right.png", "lwcomponents_piston_left.png",
"lwcomponents_piston_base.png", "lwcomponents_piston_pusher.png" }, "lwcomponents_piston_base.png", "lwcomponents_piston_pusher.png" },
is_ground_content = false, is_ground_content = false,
groups = { cracky = 3 }, groups = { cracky = 3, wires_connect = 1 },
sounds = default.node_sound_stone_defaults (), sounds = default.node_sound_stone_defaults (),
paramtype = "light", paramtype = "light",
param1 = 0, param1 = 0,
@@ -772,7 +1155,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, wires_connect = 1 },
sounds = default.node_sound_stone_defaults (), sounds = default.node_sound_stone_defaults (),
paramtype = "light", paramtype = "light",
param1 = 0, param1 = 0,
@@ -819,7 +1202,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, wires_connect = 1 },
sounds = default.node_sound_stone_defaults (), sounds = default.node_sound_stone_defaults (),
paramtype = "light", paramtype = "light",
param1 = 0, param1 = 0,
@@ -849,7 +1232,7 @@ minetest.register_node("lwcomponents:piston_sticky", {
"lwcomponents_piston_right.png", "lwcomponents_piston_left.png", "lwcomponents_piston_right.png", "lwcomponents_piston_left.png",
"lwcomponents_piston_base.png", "lwcomponents_piston_pusher_sticky.png" }, "lwcomponents_piston_base.png", "lwcomponents_piston_pusher_sticky.png" },
is_ground_content = false, is_ground_content = false,
groups = { cracky = 3 }, groups = { cracky = 3, wires_connect = 1 },
sounds = default.node_sound_stone_defaults (), sounds = default.node_sound_stone_defaults (),
paramtype = "light", paramtype = "light",
param1 = 0, param1 = 0,
@@ -896,7 +1279,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, wires_connect = 1 },
sounds = default.node_sound_stone_defaults (), sounds = default.node_sound_stone_defaults (),
paramtype = "light", paramtype = "light",
param1 = 0, param1 = 0,
@@ -943,7 +1326,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, wires_connect = 1 },
sounds = default.node_sound_stone_defaults (), sounds = default.node_sound_stone_defaults (),
paramtype = "light", paramtype = "light",
param1 = 0, param1 = 0,

View File

@@ -69,7 +69,6 @@ end
local function player_button_turnoff (pos) local function player_button_turnoff (pos)
local node = minetest.get_node(pos) local node = minetest.get_node(pos)
local meta = minetest.get_meta(pos)
if node.name == "lwcomponents:player_button_on" then if node.name == "lwcomponents:player_button_on" then
node.name = "lwcomponents:player_button_off" node.name = "lwcomponents:player_button_off"
@@ -85,7 +84,7 @@ end
minetest.register_node ("lwcomponents:player_button", { minetest.register_node ("lwcomponents:player_button", {
description = "Player Button", description = S("Player Button"),
drawtype = "nodebox", drawtype = "nodebox",
tiles = { tiles = {
"lwplayer_button_side.png", "lwplayer_button_side.png",
@@ -134,7 +133,7 @@ minetest.register_node ("lwcomponents:player_button", {
minetest.register_node ("lwcomponents:player_button_off", { minetest.register_node ("lwcomponents:player_button_off", {
description = "Player Button", description = S("Player Button"),
drawtype = "nodebox", drawtype = "nodebox",
tiles = { tiles = {
"lwplayer_button_side.png", "lwplayer_button_side.png",
@@ -184,7 +183,7 @@ minetest.register_node ("lwcomponents:player_button_off", {
minetest.register_node ("lwcomponents:player_button_on", { minetest.register_node ("lwcomponents:player_button_on", {
description = "Player Button", description = S("Player Button"),
drawtype = "nodebox", drawtype = "nodebox",
tiles = { tiles = {
"lwplayer_button_side.png", "lwplayer_button_side.png",

View File

@@ -97,13 +97,8 @@ local function punch (pos)
punched = true punched = true
end end
elseif object[i].get_luaentity and object[i]:get_luaentity () and elseif not utils.is_drop (object[i]) and object[i].get_pos
object[i]:get_luaentity ().name and and object[i]:get_pos () then
object[i]:get_luaentity ().name == "__builtin:item" then
-- don't punch drops
elseif object[i].get_pos and object[i]:get_pos () then
-- entity -- entity
if meta:get_string ("entities") == "true" then if meta:get_string ("entities") == "true" then
@@ -180,28 +175,19 @@ end
local function start_puncher (pos) local function start_puncher (pos)
local node = minetest.get_node (pos) local node = minetest.get_node (pos)
local meta = minetest.get_meta (pos)
if node and meta then if node then
if node.name == "lwcomponents:puncher" then if node.name == "lwcomponents:puncher" then
local meta = minetest.get_meta (pos)
if meta then
node.name = "lwcomponents:puncher_on" node.name = "lwcomponents:puncher_on"
minetest.swap_node (pos, node) minetest.swap_node (pos, node)
update_form_spec (pos) update_form_spec (pos)
end
elseif node.name == "lwcomponents:puncher_locked" then elseif node.name == "lwcomponents:puncher_locked" then
local meta = minetest.get_meta (pos)
if meta then
node.name = "lwcomponents:puncher_locked_on" node.name = "lwcomponents:puncher_locked_on"
minetest.swap_node (pos, node) minetest.swap_node (pos, node)
update_form_spec (pos) update_form_spec (pos)
end
end end
end end
@@ -211,28 +197,19 @@ end
local function stop_puncher (pos) local function stop_puncher (pos)
local node = minetest.get_node (pos) local node = minetest.get_node (pos)
local meta = minetest.get_meta (pos)
if node and meta then if node then
if node.name == "lwcomponents:puncher_on" then if node.name == "lwcomponents:puncher_on" then
local meta = minetest.get_meta (pos)
if meta then
node.name = "lwcomponents:puncher" node.name = "lwcomponents:puncher"
minetest.swap_node (pos, node) minetest.swap_node (pos, node)
update_form_spec (pos) update_form_spec (pos)
end
elseif node.name == "lwcomponents:puncher_locked_on" then elseif node.name == "lwcomponents:puncher_locked_on" then
local meta = minetest.get_meta (pos)
if meta then
node.name = "lwcomponents:puncher_locked" node.name = "lwcomponents:puncher_locked"
minetest.swap_node (pos, node) minetest.swap_node (pos, node)
update_form_spec (pos) update_form_spec (pos)
end
end end
end end
@@ -365,7 +342,6 @@ local function on_blast (pos, intensity)
local stack = ItemStack (items[1]) local stack = ItemStack (items[1])
if stack then if stack then
preserve_metadata (pos, node, meta, { stack })
utils.item_drop (stack, nil, pos) utils.item_drop (stack, nil, pos)
minetest.remove_node (pos) minetest.remove_node (pos)
end end
@@ -506,7 +482,7 @@ minetest.register_node("lwcomponents:puncher", {
tiles = { "lwpuncher_face.png", "lwpuncher_face.png", "lwpuncher.png", tiles = { "lwpuncher_face.png", "lwpuncher_face.png", "lwpuncher.png",
"lwpuncher.png", "lwpuncher.png", "lwpuncher_face.png"}, "lwpuncher.png", "lwpuncher.png", "lwpuncher_face.png"},
is_ground_content = false, is_ground_content = false,
groups = { cracky = 3 }, groups = { cracky = 3, wires_connect = 1 },
sounds = default.node_sound_stone_defaults (), sounds = default.node_sound_stone_defaults (),
paramtype = "none", paramtype = "none",
param1 = 0, param1 = 0,
@@ -533,7 +509,7 @@ minetest.register_node("lwcomponents:puncher_locked", {
tiles = { "lwpuncher_face.png", "lwpuncher_face.png", "lwpuncher.png", tiles = { "lwpuncher_face.png", "lwpuncher_face.png", "lwpuncher.png",
"lwpuncher.png", "lwpuncher.png", "lwpuncher_face.png"}, "lwpuncher.png", "lwpuncher.png", "lwpuncher_face.png"},
is_ground_content = false, is_ground_content = false,
groups = { cracky = 3 }, groups = { cracky = 3, wires_connect = 1 },
sounds = default.node_sound_stone_defaults (), sounds = default.node_sound_stone_defaults (),
paramtype = "none", paramtype = "none",
param1 = 0, param1 = 0,
@@ -560,7 +536,7 @@ minetest.register_node("lwcomponents:puncher_on", {
tiles = { "lwpuncher_face_on.png", "lwpuncher_face_on.png", "lwpuncher.png", tiles = { "lwpuncher_face_on.png", "lwpuncher_face_on.png", "lwpuncher.png",
"lwpuncher.png", "lwpuncher.png", "lwpuncher_face_on.png"}, "lwpuncher.png", "lwpuncher.png", "lwpuncher_face_on.png"},
is_ground_content = false, is_ground_content = false,
groups = { cracky = 3, not_in_creative_inventory = 1 }, groups = { cracky = 3, not_in_creative_inventory = 1, wires_connect = 1 },
sounds = default.node_sound_stone_defaults (), sounds = default.node_sound_stone_defaults (),
paramtype = "none", paramtype = "none",
param1 = 0, param1 = 0,
@@ -587,7 +563,7 @@ minetest.register_node("lwcomponents:puncher_locked_on", {
tiles = { "lwpuncher_face_on.png", "lwpuncher_face_on.png", "lwpuncher.png", tiles = { "lwpuncher_face_on.png", "lwpuncher_face_on.png", "lwpuncher.png",
"lwpuncher.png", "lwpuncher.png", "lwpuncher_face_on.png"}, "lwpuncher.png", "lwpuncher.png", "lwpuncher_face_on.png"},
is_ground_content = false, is_ground_content = false,
groups = { cracky = 3, not_in_creative_inventory = 1 }, groups = { cracky = 3, not_in_creative_inventory = 1, wires_connect = 1 },
sounds = default.node_sound_stone_defaults (), sounds = default.node_sound_stone_defaults (),
paramtype = "none", paramtype = "none",
param1 = 0, param1 = 0,

View File

@@ -13,7 +13,7 @@ CC BY-SA 3.0
Version Version
======= =======
0.1.25 0.1.30
Minetest Version Minetest Version
@@ -35,6 +35,7 @@ intllib
hopper hopper
digistuff digistuff
pipeworks pipeworks
lwwires
Installation Installation
@@ -59,13 +60,14 @@ Various components for mesecons and digilines.
* Puncher, punches players or entities within a given reach. * Puncher, punches players or entities within a given reach.
* Player button, sends digilines message with player name. * Player button, sends digilines message with player name.
* Breaker, digs the nodes directly in front. * Breaker, digs the nodes directly in front.
* Deployers, places the nodes directly in front. * Deployer, places the nodes directly in front.
* Destroyer, automated trash.
* Hologram, projects a hologram above the hologram node. * Hologram, projects a hologram above the hologram node.
* Fan, blows any entity, player or drop in front of the fan. * Fan, blows any entity, player or drop in front of the fan.
* Conduit, connected in a circuit to move items. * Conduit, connected in a circuit to move items.
* Cannon, shoots an item on command with directional aiming (plus 3 shells). * Cannon, shoots an item on command with directional aiming (plus 3 shells).
* Double (optionally single) reach pistons and sticky pistons. * Double (optionally single) reach pistons and sticky pistons.
* Digiswitch, digilines controlled mesecons power. * Digilines Switch, 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. * Storage, indexed storage units.
@@ -103,5 +105,9 @@ Maximum piston nodes
Maximum nodes a piston can push. Maximum nodes a piston can push.
Default: 15 Default: 15
Use player when placing
Use the owner player of locked versions when placing nodes, otherwise
no player is used.
Default: false
------------------------------------------------------------------------ ------------------------------------------------------------------------

View File

@@ -12,6 +12,9 @@ utils.settings.alert_handler_errors =
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.use_player_when_placing =
minetest.settings:get_bool ("lwcomponents_use_player_when_placing", false)
utils.settings.default_stack_max = utils.settings.default_stack_max =
tonumber (minetest.settings:get ("default_stack_max")) or 99 tonumber (minetest.settings:get ("default_stack_max")) or 99

View File

@@ -6,3 +6,6 @@ lwcomponents_alert_handler_errors (Alert handler errors) bool true
# Maximum nodes a piston can push. # Maximum nodes a piston can push.
lwcomponents_max_piston_nodes (Maximum piston nodes) int 15 lwcomponents_max_piston_nodes (Maximum piston nodes) int 15
# Use owner player when placing nodes.
lwcomponents_use_player_when_placing (Use player when placing) bool false

View File

@@ -103,30 +103,21 @@ end
local function start_siren (pos) local function start_siren (pos)
local node = minetest.get_node (pos) local node = minetest.get_node (pos)
local meta = minetest.get_meta (pos)
if node and meta then if node then
if node.name == "lwcomponents:siren" then if node.name == "lwcomponents:siren" then
local meta = minetest.get_meta (pos)
if meta then
node.name = "lwcomponents:siren_on" node.name = "lwcomponents:siren_on"
stop_sound (pos) stop_sound (pos)
minetest.swap_node (pos, node) minetest.swap_node (pos, node)
update_form_spec (pos) update_form_spec (pos)
end
elseif node.name == "lwcomponents:siren_locked" then elseif node.name == "lwcomponents:siren_locked" then
local meta = minetest.get_meta (pos)
if meta then
node.name = "lwcomponents:siren_locked_on" node.name = "lwcomponents:siren_locked_on"
stop_sound (pos) stop_sound (pos)
minetest.swap_node (pos, node) minetest.swap_node (pos, node)
update_form_spec (pos) update_form_spec (pos)
end
end end
end end
@@ -136,34 +127,25 @@ end
local function stop_siren (pos) local function stop_siren (pos)
local node = minetest.get_node (pos) local node = minetest.get_node (pos)
local meta = minetest.get_meta (pos)
if node and meta then if node then
if node.name == "lwcomponents:siren_on" or if node.name == "lwcomponents:siren_on" or
node.name == "lwcomponents:siren_alarm" then node.name == "lwcomponents:siren_alarm" then
local meta = minetest.get_meta (pos)
if meta then
node.name = "lwcomponents:siren" node.name = "lwcomponents:siren"
minetest.get_node_timer (pos):stop () minetest.get_node_timer (pos):stop ()
stop_sound (pos) stop_sound (pos)
minetest.swap_node (pos, node) minetest.swap_node (pos, node)
update_form_spec (pos) update_form_spec (pos)
end
elseif node.name == "lwcomponents:siren_locked_on" or elseif node.name == "lwcomponents:siren_locked_on" or
node.name == "lwcomponents:siren_locked_alarm" then node.name == "lwcomponents:siren_locked_alarm" then
local meta = minetest.get_meta (pos)
if meta then
node.name = "lwcomponents:siren_locked" node.name = "lwcomponents:siren_locked"
minetest.get_node_timer (pos):stop () minetest.get_node_timer (pos):stop ()
stop_sound (pos) stop_sound (pos)
minetest.swap_node (pos, node) minetest.swap_node (pos, node)
update_form_spec (pos) update_form_spec (pos)
end
end end
end end
@@ -173,30 +155,21 @@ end
local function start_alarm (pos) local function start_alarm (pos)
local node = minetest.get_node (pos) local node = minetest.get_node (pos)
local meta = minetest.get_meta (pos)
if node and meta then if node then
if node.name == "lwcomponents:siren_on" then if node.name == "lwcomponents:siren_on" then
local meta = minetest.get_meta (pos)
if meta then
node.name = "lwcomponents:siren_alarm" node.name = "lwcomponents:siren_alarm"
minetest.get_node_timer (pos):start (sound_interval) minetest.get_node_timer (pos):start (sound_interval)
start_sound (pos) start_sound (pos)
minetest.swap_node (pos, node) minetest.swap_node (pos, node)
end
elseif node.name == "lwcomponents:siren_locked_on" then elseif node.name == "lwcomponents:siren_locked_on" then
local meta = minetest.get_meta (pos)
if meta then
node.name = "lwcomponents:siren_locked_alarm" node.name = "lwcomponents:siren_locked_alarm"
minetest.get_node_timer (pos):start (sound_interval) minetest.get_node_timer (pos):start (sound_interval)
start_sound (pos) start_sound (pos)
minetest.swap_node (pos, node) minetest.swap_node (pos, node)
end
end end
end end
@@ -206,30 +179,21 @@ end
local function stop_alarm (pos) local function stop_alarm (pos)
local node = minetest.get_node (pos) local node = minetest.get_node (pos)
local meta = minetest.get_meta (pos)
if node and meta then if node then
if node.name == "lwcomponents:siren_alarm" then if node.name == "lwcomponents:siren_alarm" then
local meta = minetest.get_meta (pos)
if meta then
node.name = "lwcomponents:siren_on" node.name = "lwcomponents:siren_on"
minetest.get_node_timer (pos):stop () minetest.get_node_timer (pos):stop ()
stop_sound (pos) stop_sound (pos)
minetest.swap_node (pos, node) minetest.swap_node (pos, node)
end
elseif node.name == "lwcomponents:siren_locked_alarm" then elseif node.name == "lwcomponents:siren_locked_alarm" then
local meta = minetest.get_meta (pos)
if meta then
node.name = "lwcomponents:siren_locked_on" node.name = "lwcomponents:siren_locked_on"
minetest.get_node_timer (pos):stop () minetest.get_node_timer (pos):stop ()
stop_sound (pos) stop_sound (pos)
minetest.swap_node (pos, node) minetest.swap_node (pos, node)
end
end end
end end
@@ -365,7 +329,6 @@ local function on_blast (pos, intensity)
local stack = ItemStack (items[1]) local stack = ItemStack (items[1])
if stack then if stack then
preserve_metadata (pos, node, meta, { stack })
utils.item_drop (stack, nil, pos) utils.item_drop (stack, nil, pos)
on_destruct (pos) on_destruct (pos)
minetest.remove_node (pos) minetest.remove_node (pos)
@@ -528,7 +491,7 @@ minetest.register_node("lwcomponents:siren", {
tiles = { "lwsiren_base.png", "lwsiren_base.png", "lwsiren.png", tiles = { "lwsiren_base.png", "lwsiren_base.png", "lwsiren.png",
"lwsiren.png", "lwsiren.png", "lwsiren.png"}, "lwsiren.png", "lwsiren.png", "lwsiren.png"},
is_ground_content = false, is_ground_content = false,
groups = { cracky = 3 }, groups = { cracky = 3, wires_connect = 1 },
sounds = default.node_sound_stone_defaults (), sounds = default.node_sound_stone_defaults (),
paramtype = "none", paramtype = "none",
param1 = 0, param1 = 0,
@@ -555,7 +518,7 @@ minetest.register_node("lwcomponents:siren_locked", {
tiles = { "lwsiren_base.png", "lwsiren_base.png", "lwsiren.png", tiles = { "lwsiren_base.png", "lwsiren_base.png", "lwsiren.png",
"lwsiren.png", "lwsiren.png", "lwsiren.png"}, "lwsiren.png", "lwsiren.png", "lwsiren.png"},
is_ground_content = false, is_ground_content = false,
groups = { cracky = 3 }, groups = { cracky = 3, wires_connect = 1 },
sounds = default.node_sound_stone_defaults (), sounds = default.node_sound_stone_defaults (),
paramtype = "none", paramtype = "none",
param1 = 0, param1 = 0,
@@ -582,7 +545,7 @@ minetest.register_node("lwcomponents:siren_on", {
tiles = { "lwsiren_base.png", "lwsiren_base.png", "lwsiren_on.png", tiles = { "lwsiren_base.png", "lwsiren_base.png", "lwsiren_on.png",
"lwsiren_on.png", "lwsiren_on.png", "lwsiren_on.png"}, "lwsiren_on.png", "lwsiren_on.png", "lwsiren_on.png"},
is_ground_content = false, is_ground_content = false,
groups = { cracky = 3, not_in_creative_inventory = 1 }, groups = { cracky = 3, not_in_creative_inventory = 1, wires_connect = 1 },
sounds = default.node_sound_stone_defaults (), sounds = default.node_sound_stone_defaults (),
paramtype = "none", paramtype = "none",
param1 = 0, param1 = 0,
@@ -609,7 +572,7 @@ minetest.register_node("lwcomponents:siren_locked_on", {
tiles = { "lwsiren_base.png", "lwsiren_base.png", "lwsiren_on.png", tiles = { "lwsiren_base.png", "lwsiren_base.png", "lwsiren_on.png",
"lwsiren_on.png", "lwsiren_on.png", "lwsiren_on.png"}, "lwsiren_on.png", "lwsiren_on.png", "lwsiren_on.png"},
is_ground_content = false, is_ground_content = false,
groups = { cracky = 3, not_in_creative_inventory = 1 }, groups = { cracky = 3, not_in_creative_inventory = 1, wires_connect = 1 },
sounds = default.node_sound_stone_defaults (), sounds = default.node_sound_stone_defaults (),
paramtype = "none", paramtype = "none",
param1 = 0, param1 = 0,
@@ -636,7 +599,7 @@ minetest.register_node("lwcomponents:siren_alarm", {
tiles = { "lwsiren_base.png", "lwsiren_base.png", "lwsiren_alarm.png", tiles = { "lwsiren_base.png", "lwsiren_base.png", "lwsiren_alarm.png",
"lwsiren_alarm.png", "lwsiren_alarm.png", "lwsiren_alarm.png"}, "lwsiren_alarm.png", "lwsiren_alarm.png", "lwsiren_alarm.png"},
is_ground_content = false, is_ground_content = false,
groups = { cracky = 3, not_in_creative_inventory = 1 }, groups = { cracky = 3, not_in_creative_inventory = 1, wires_connect = 1 },
sounds = default.node_sound_stone_defaults (), sounds = default.node_sound_stone_defaults (),
paramtype = "none", paramtype = "none",
param1 = 0, param1 = 0,
@@ -664,7 +627,7 @@ minetest.register_node("lwcomponents:siren_locked_alarm", {
tiles = { "lwsiren_base.png", "lwsiren_base.png", "lwsiren_alarm.png", tiles = { "lwsiren_base.png", "lwsiren_base.png", "lwsiren_alarm.png",
"lwsiren_alarm.png", "lwsiren_alarm.png", "lwsiren_alarm.png"}, "lwsiren_alarm.png", "lwsiren_alarm.png", "lwsiren_alarm.png"},
is_ground_content = false, is_ground_content = false,
groups = { cracky = 3, not_in_creative_inventory = 1 }, groups = { cracky = 3, not_in_creative_inventory = 1, wires_connect = 1 },
sounds = default.node_sound_stone_defaults (), sounds = default.node_sound_stone_defaults (),
paramtype = "none", paramtype = "none",
param1 = 0, param1 = 0,

View File

@@ -35,6 +35,7 @@ mesecon.register_node (":lwcomponents:solid_conductor",
groups = { groups = {
dig_immediate = 2, dig_immediate = 2,
ud_param2_colorable = 1, ud_param2_colorable = 1,
wires_connect = 1
}, },
}, },
{ {
@@ -51,7 +52,8 @@ mesecon.register_node (":lwcomponents:solid_conductor",
groups = { groups = {
dig_immediate = 2, dig_immediate = 2,
ud_param2_colorable = 1, ud_param2_colorable = 1,
not_in_creative_inventory = 1 not_in_creative_inventory = 1,
wires_connect = 1
}, },
} }
) )
@@ -101,6 +103,7 @@ mesecon.register_node (":lwcomponents:solid_horizontal_conductor",
groups = { groups = {
dig_immediate = 2, dig_immediate = 2,
ud_param2_colorable = 1, ud_param2_colorable = 1,
wires_connect = 1
}, },
}, },
{ {
@@ -117,7 +120,8 @@ mesecon.register_node (":lwcomponents:solid_horizontal_conductor",
groups = { groups = {
dig_immediate = 2, dig_immediate = 2,
ud_param2_colorable = 1, ud_param2_colorable = 1,
not_in_creative_inventory = 1 not_in_creative_inventory = 1,
wires_connect = 1
}, },
} }
) )

View File

@@ -87,7 +87,6 @@ local function unit_on_blast (pos, intensity)
end end
end end
on_destruct (pos)
minetest.remove_node (pos) minetest.remove_node (pos)
else -- intensity < 1.0 else -- intensity < 1.0
@@ -113,9 +112,7 @@ local function unit_on_blast (pos, intensity)
local stack = ItemStack (items[1]) local stack = ItemStack (items[1])
if stack then if stack then
preserve_metadata (pos, node, meta, { stack })
utils.item_drop (stack, nil, pos) utils.item_drop (stack, nil, pos)
on_destruct (pos)
minetest.remove_node (pos) minetest.remove_node (pos)
end end
end end
@@ -312,7 +309,7 @@ local function get_stock_list (pos)
for k, v in pairs (inv_list) do for k, v in pairs (inv_list) do
local stack = ItemStack (k) local stack = ItemStack (k)
local name = stack:get_name () local name = stack:get_name ()
local description = nil local description
local custom = false local custom = false
local pallet_index = nil local pallet_index = nil
local tstack = stack:to_table () local tstack = stack:to_table ()
@@ -704,8 +701,6 @@ local function get_formspec_list (pos)
for k, v in pairs (inv_list) do for k, v in pairs (inv_list) do
local description = k local description = k
local stack = ItemStack (k) local stack = ItemStack (k)
local smeta = stack:get_meta ()
if stack:get_short_description () ~= "" then if stack:get_short_description () ~= "" then
description = stack:get_short_description () description = stack:get_short_description ()
@@ -942,7 +937,6 @@ local function indexer_on_blast (pos, intensity)
end end
end end
on_destruct (pos)
minetest.remove_node (pos) minetest.remove_node (pos)
else -- intensity < 1.0 else -- intensity < 1.0
@@ -978,9 +972,7 @@ local function indexer_on_blast (pos, intensity)
local stack = ItemStack (items[1]) local stack = ItemStack (items[1])
if stack then if stack then
preserve_metadata (pos, node, meta, { stack })
utils.item_drop (stack, nil, pos) utils.item_drop (stack, nil, pos)
on_destruct (pos)
minetest.remove_node (pos) minetest.remove_node (pos)
end end
end end

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 932 B

View File

@@ -1,4 +1,4 @@
local utils, mod_storage = ... local utils = ...