Compare commits
14 Commits
4e6b34da34
...
b36dd31f0f
Author | SHA1 | Date | |
---|---|---|---|
b36dd31f0f | |||
f03cd02854 | |||
5a04699b3e | |||
a055b5045a | |||
7a5cc43280 | |||
660bd62528 | |||
327c96cba8 | |||
0aa935c271 | |||
dd8432ef34 | |||
af4a699e19 | |||
c3f1b4ef41 | |||
ff525c09a4 | |||
45991bf124 | |||
dc6cc0b04a |
11
.github/workflows/build.yml
vendored
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
on: [push, pull_request]
|
||||||
|
name: build
|
||||||
|
jobs:
|
||||||
|
lint:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@master
|
||||||
|
- name: lint
|
||||||
|
uses: Roang-zero1/factorio-mod-luacheck@master
|
||||||
|
with:
|
||||||
|
luacheckrc_url: ""
|
@ -7,8 +7,11 @@ read_globals = {
|
|||||||
"pipeworks",
|
"pipeworks",
|
||||||
"dump",
|
"dump",
|
||||||
"VoxelArea",
|
"VoxelArea",
|
||||||
|
"ItemStack",
|
||||||
}
|
}
|
||||||
|
|
||||||
globals = {
|
globals = {
|
||||||
"digilines",
|
"digilines",
|
||||||
|
"tubelib",
|
||||||
|
"tubelib2"
|
||||||
}
|
}
|
||||||
|
@ -54,6 +54,9 @@ overflow <itemstack> <count>
|
|||||||
Tricky situation:
|
Tricky situation:
|
||||||
if you have a blank spot and put say 82 torches down your pipeline, followed by 99 coal, the 82 torches will go in the chest, and the chest will see that 1 more torch can fit since that would only go to 83. Since 1 more torch can fit, no "full" message will fire off. Then when the coal hits the chest, the "fail" message will fire and the coal will bounce out. The chest couldn't predict that coal would be coming next, so it couldn't know that the chest is full, for coal, while not full for torches.
|
if you have a blank spot and put say 82 torches down your pipeline, followed by 99 coal, the 82 torches will go in the chest, and the chest will see that 1 more torch can fit since that would only go to 83. Since 1 more torch can fit, no "full" message will fire off. Then when the coal hits the chest, the "fail" message will fire and the coal will bounce out. The chest couldn't predict that coal would be coming next, so it couldn't know that the chest is full, for coal, while not full for torches.
|
||||||
|
|
||||||
|
The inventory is also compatible with [`tubelib`](https://github.com/joe7575/techpack/tree/master/tubelib), which generally works in the same way as [`pipeworks`](https://gitlab.com/VanessaE/pipeworks) but transfers happen immediately and do not "bounce". This means that the messages should be identical to the messages sent by [`pipeworks`](https://gitlab.com/VanessaE/pipeworks), except that items will not send the "lost" message when they cannot fit.
|
||||||
|
One oddity is that "take" messages will be asynchronous because, if an item does not fit in the chest, the event will need to be canceled. This means that it is possible (though highly unlikely) to recieve a "put" message into a slot which you have not yet recieved a "take" message for, there will not actually be two stacks in the same slot, though it may briefly appear that way until the "take" message is recieved.
|
||||||
|
|
||||||
TODO:
|
TODO:
|
||||||
- make chest.lua a mixin that gets both default and locked chests
|
- make chest.lua a mixin that gets both default and locked chests
|
||||||
- digiline aware furnaces
|
- digiline aware furnaces
|
||||||
|
@ -1,6 +1,8 @@
|
|||||||
Digilines
|
Digilines
|
||||||
==========
|
==========
|
||||||
|
|
||||||
|
[](https://github.com/minetest-mods/digilines/actions)
|
||||||
|
|
||||||
- The minetest counterpart for bus systems like i2c, SPI, RS232, USB -
|
- The minetest counterpart for bus systems like i2c, SPI, RS232, USB -
|
||||||
- Minetest 5.0.0+ is required to use this mod.
|
- Minetest 5.0.0+ is required to use this mod.
|
||||||
|
|
||||||
|
@ -112,9 +112,9 @@ function digilines.transmit(pos, channel, msg, checked)
|
|||||||
for _, rule in ipairs(rules) do
|
for _, rule in ipairs(rules) do
|
||||||
local nextPos = digilines.addPosRule(curPos, rule)
|
local nextPos = digilines.addPosRule(curPos, rule)
|
||||||
if digilines.rules_link(curPos, nextPos) then
|
if digilines.rules_link(curPos, nextPos) then
|
||||||
local checkedID = minetest.hash_node_position(nextPos)
|
local checkedID2 = minetest.hash_node_position(nextPos)
|
||||||
if not checked[checkedID] then
|
if not checked[checkedID2] then
|
||||||
checked[checkedID] = true
|
checked[checkedID2] = true
|
||||||
queue_enqueue(queue, nextPos)
|
queue_enqueue(queue, nextPos)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
280
inventory.lua
@ -51,6 +51,99 @@ local last_inventory_put_stack
|
|||||||
-- that should be removed once that’s fixed.
|
-- that should be removed once that’s fixed.
|
||||||
local last_inventory_take_index
|
local last_inventory_take_index
|
||||||
|
|
||||||
|
local tube_can_insert = function(pos, _, stack, direction)
|
||||||
|
local ret = minetest.get_meta(pos):get_inventory():room_for_item("main", stack)
|
||||||
|
if not ret then
|
||||||
|
-- The stack cannot be accepted. It will never be passed to
|
||||||
|
-- insert_object, but it should be reported as a toverflow.
|
||||||
|
-- Here, direction = direction item is moving, which is into
|
||||||
|
-- side.
|
||||||
|
local side = vector.multiply(direction, -1)
|
||||||
|
send_message(pos, "toverflow", stack, nil, nil, side)
|
||||||
|
end
|
||||||
|
return ret
|
||||||
|
end
|
||||||
|
|
||||||
|
local tube_insert_object = function(pos, _, original_stack, direction)
|
||||||
|
-- Here, direction = direction item is moving, which is into side.
|
||||||
|
local side = vector.multiply(direction, -1)
|
||||||
|
local inv = minetest.get_meta(pos):get_inventory()
|
||||||
|
local inv_contents = inv:get_list("main")
|
||||||
|
local any_put = false
|
||||||
|
local stack = original_stack
|
||||||
|
local stack_name = stack:get_name()
|
||||||
|
local stack_count = stack:get_count()
|
||||||
|
-- Walk the inventory, adding items to existing stacks of the same
|
||||||
|
-- type.
|
||||||
|
for i = 1, #inv_contents do
|
||||||
|
local existing_stack = inv_contents[i]
|
||||||
|
if not existing_stack:is_empty() and existing_stack:get_name() == stack_name then
|
||||||
|
local leftover = existing_stack:add_item(stack)
|
||||||
|
local leftover_count = leftover:get_count()
|
||||||
|
if leftover_count ~= stack_count then
|
||||||
|
-- We put some items into the slot. Update the slot in
|
||||||
|
-- the inventory, tell Digilines listeners about it,
|
||||||
|
-- and keep looking for the a place to put the
|
||||||
|
-- leftovers if any.
|
||||||
|
any_put = true
|
||||||
|
inv:set_stack("main", i, existing_stack)
|
||||||
|
local stack_that_was_put
|
||||||
|
if leftover_count == 0 then
|
||||||
|
stack_that_was_put = stack
|
||||||
|
else
|
||||||
|
stack_that_was_put = ItemStack(stack)
|
||||||
|
stack_that_was_put:set_count(stack_count - leftover_count)
|
||||||
|
end
|
||||||
|
send_message(pos, "tput", stack_that_was_put, nil, i, side)
|
||||||
|
stack = leftover
|
||||||
|
stack_count = leftover_count
|
||||||
|
if stack_count == 0 then
|
||||||
|
break
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
if stack_count ~= 0 then
|
||||||
|
-- Walk the inventory, adding items to empty slots.
|
||||||
|
for i = 1, #inv_contents do
|
||||||
|
local existing_stack = inv_contents[i]
|
||||||
|
if existing_stack:is_empty() then
|
||||||
|
local leftover = existing_stack:add_item(stack)
|
||||||
|
local leftover_count = leftover:get_count()
|
||||||
|
if leftover_count ~= stack_count then
|
||||||
|
-- We put some items into the slot. Update the slot in
|
||||||
|
-- the inventory, tell Digilines listeners about it,
|
||||||
|
-- and keep looking for the a place to put the
|
||||||
|
-- leftovers if any.
|
||||||
|
any_put = true
|
||||||
|
inv:set_stack("main", i, existing_stack)
|
||||||
|
local stack_that_was_put
|
||||||
|
if leftover_count == 0 then
|
||||||
|
stack_that_was_put = stack
|
||||||
|
else
|
||||||
|
stack_that_was_put = ItemStack(stack)
|
||||||
|
stack_that_was_put:set_count(stack_count - leftover_count)
|
||||||
|
end
|
||||||
|
send_message(pos, "tput", stack_that_was_put, nil, i, side)
|
||||||
|
stack = leftover
|
||||||
|
stack_count = leftover_count
|
||||||
|
if stack_count == 0 then
|
||||||
|
break
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
if any_put then
|
||||||
|
check_full(pos, original_stack)
|
||||||
|
end
|
||||||
|
if stack_count ~= 0 then
|
||||||
|
-- Some items could not be added and bounced back. Report them.
|
||||||
|
send_message(pos, "toverflow", stack, nil, nil, side)
|
||||||
|
end
|
||||||
|
return stack
|
||||||
|
end
|
||||||
|
|
||||||
minetest.register_alias("digilines_inventory:chest", "digilines:chest")
|
minetest.register_alias("digilines_inventory:chest", "digilines:chest")
|
||||||
minetest.register_node("digilines:chest", {
|
minetest.register_node("digilines:chest", {
|
||||||
description = "Digiline Chest",
|
description = "Digiline Chest",
|
||||||
@ -97,7 +190,7 @@ minetest.register_node("digilines:chest", {
|
|||||||
minetest.get_meta(pos):set_string("channel",fields.channel)
|
minetest.get_meta(pos):set_string("channel",fields.channel)
|
||||||
end
|
end
|
||||||
end,
|
end,
|
||||||
digiline = {
|
digilines = {
|
||||||
receptor = {},
|
receptor = {},
|
||||||
effector = {
|
effector = {
|
||||||
action = function() end
|
action = function() end
|
||||||
@ -109,97 +202,8 @@ minetest.register_node("digilines:chest", {
|
|||||||
return not pipeworks.connects.facingFront(i,param2)
|
return not pipeworks.connects.facingFront(i,param2)
|
||||||
end,
|
end,
|
||||||
input_inventory = "main",
|
input_inventory = "main",
|
||||||
can_insert = function(pos, _, stack, direction)
|
can_insert = tube_can_insert,
|
||||||
local ret = minetest.get_meta(pos):get_inventory():room_for_item("main", stack)
|
insert_object = tube_insert_object,
|
||||||
if not ret then
|
|
||||||
-- The stack cannot be accepted. It will never be passed to
|
|
||||||
-- insert_object, but it should be reported as a toverflow.
|
|
||||||
-- Here, direction = direction item is moving, which is into
|
|
||||||
-- side.
|
|
||||||
local side = vector.multiply(direction, -1)
|
|
||||||
send_message(pos, "toverflow", stack, nil, nil, side)
|
|
||||||
end
|
|
||||||
return ret
|
|
||||||
end,
|
|
||||||
insert_object = function(pos, _, original_stack, direction)
|
|
||||||
-- Here, direction = direction item is moving, which is into side.
|
|
||||||
local side = vector.multiply(direction, -1)
|
|
||||||
local inv = minetest.get_meta(pos):get_inventory()
|
|
||||||
local inv_contents = inv:get_list("main")
|
|
||||||
local any_put = false
|
|
||||||
local stack = original_stack
|
|
||||||
local stack_name = stack:get_name()
|
|
||||||
local stack_count = stack:get_count()
|
|
||||||
-- Walk the inventory, adding items to existing stacks of the same
|
|
||||||
-- type.
|
|
||||||
for i = 1, #inv_contents do
|
|
||||||
local existing_stack = inv_contents[i]
|
|
||||||
if not existing_stack:is_empty() and existing_stack:get_name() == stack_name then
|
|
||||||
local leftover = existing_stack:add_item(stack)
|
|
||||||
local leftover_count = leftover:get_count()
|
|
||||||
if leftover_count ~= stack_count then
|
|
||||||
-- We put some items into the slot. Update the slot in
|
|
||||||
-- the inventory, tell Digilines listeners about it,
|
|
||||||
-- and keep looking for the a place to put the
|
|
||||||
-- leftovers if any.
|
|
||||||
any_put = true
|
|
||||||
inv:set_stack("main", i, existing_stack)
|
|
||||||
local stack_that_was_put
|
|
||||||
if leftover_count == 0 then
|
|
||||||
stack_that_was_put = stack
|
|
||||||
else
|
|
||||||
stack_that_was_put = ItemStack(stack)
|
|
||||||
stack_that_was_put:set_count(stack_count - leftover_count)
|
|
||||||
end
|
|
||||||
send_message(pos, "tput", stack_that_was_put, nil, i, side)
|
|
||||||
stack = leftover
|
|
||||||
stack_count = leftover_count
|
|
||||||
if stack_count == 0 then
|
|
||||||
break
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
if stack_count ~= 0 then
|
|
||||||
-- Walk the inventory, adding items to empty slots.
|
|
||||||
for i = 1, #inv_contents do
|
|
||||||
local existing_stack = inv_contents[i]
|
|
||||||
if existing_stack:is_empty() then
|
|
||||||
local leftover = existing_stack:add_item(stack)
|
|
||||||
local leftover_count = leftover:get_count()
|
|
||||||
if leftover_count ~= stack_count then
|
|
||||||
-- We put some items into the slot. Update the slot in
|
|
||||||
-- the inventory, tell Digilines listeners about it,
|
|
||||||
-- and keep looking for the a place to put the
|
|
||||||
-- leftovers if any.
|
|
||||||
any_put = true
|
|
||||||
inv:set_stack("main", i, existing_stack)
|
|
||||||
local stack_that_was_put
|
|
||||||
if leftover_count == 0 then
|
|
||||||
stack_that_was_put = stack
|
|
||||||
else
|
|
||||||
stack_that_was_put = ItemStack(stack)
|
|
||||||
stack_that_was_put:set_count(stack_count - leftover_count)
|
|
||||||
end
|
|
||||||
send_message(pos, "tput", stack_that_was_put, nil, i, side)
|
|
||||||
stack = leftover
|
|
||||||
stack_count = leftover_count
|
|
||||||
if stack_count == 0 then
|
|
||||||
break
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
if any_put then
|
|
||||||
check_full(pos, original_stack)
|
|
||||||
end
|
|
||||||
if stack_count ~= 0 then
|
|
||||||
-- Some items could not be added and bounced back. Report them.
|
|
||||||
send_message(pos, "toverflow", stack, nil, nil, side)
|
|
||||||
end
|
|
||||||
return stack
|
|
||||||
end,
|
|
||||||
remove_items = function(pos, _, stack, dir, count)
|
remove_items = function(pos, _, stack, dir, count)
|
||||||
-- Here, stack is the ItemStack in our own inventory that is being
|
-- Here, stack is the ItemStack in our own inventory that is being
|
||||||
-- pulled from, NOT the stack that is actually pulled out.
|
-- pulled from, NOT the stack that is actually pulled out.
|
||||||
@ -229,7 +233,7 @@ minetest.register_node("digilines:chest", {
|
|||||||
last_inventory_take_index = index
|
last_inventory_take_index = index
|
||||||
return stack:get_count()
|
return stack:get_count()
|
||||||
end,
|
end,
|
||||||
on_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player)
|
on_metadata_inventory_move = function(pos, _, from_index, _, to_index, count, player)
|
||||||
-- See what would happen if we were to move the items back from in the
|
-- See what would happen if we were to move the items back from in the
|
||||||
-- opposite direction. In the event of a normal move, this must
|
-- opposite direction. In the event of a normal move, this must
|
||||||
-- succeed, because a normal move subtracts some items from the from
|
-- succeed, because a normal move subtracts some items from the from
|
||||||
@ -310,6 +314,96 @@ minetest.register_node("digilines:chest", {
|
|||||||
end
|
end
|
||||||
})
|
})
|
||||||
|
|
||||||
|
if minetest.global_exists("tubelib") then
|
||||||
|
local speculative_pull = nil
|
||||||
|
local pull_succeeded = function(passed_speculative_pull)
|
||||||
|
if passed_speculative_pull.canceled then return end
|
||||||
|
|
||||||
|
send_message(passed_speculative_pull.pos, "ttake", passed_speculative_pull.taken,
|
||||||
|
passed_speculative_pull.index, nil, vector.multiply(passed_speculative_pull.dir, -1))
|
||||||
|
check_empty(passed_speculative_pull.pos)
|
||||||
|
end
|
||||||
|
local function tube_side(pos, side)
|
||||||
|
if side == "U" then return {x=0,y=-1,z=0}
|
||||||
|
elseif side == "D" then return {x=0,y=1,z=0}
|
||||||
|
end
|
||||||
|
local param2 = minetest.get_node(pos).param2
|
||||||
|
return vector.multiply(
|
||||||
|
minetest.facedir_to_dir(
|
||||||
|
tubelib2.side_to_dir(side, param2) - 1),
|
||||||
|
-1)
|
||||||
|
end
|
||||||
|
tubelib.register_node("digilines:chest", {}, {
|
||||||
|
on_pull_stack = function(pos, side, _)
|
||||||
|
local inv = minetest.get_meta(pos):get_inventory()
|
||||||
|
for i, stack in pairs(inv:get_list("main")) do
|
||||||
|
if not stack:is_empty() then
|
||||||
|
speculative_pull = {
|
||||||
|
canceled = false,
|
||||||
|
pos = pos,
|
||||||
|
taken = stack,
|
||||||
|
index = i,
|
||||||
|
dir = tube_side(pos, side)
|
||||||
|
}
|
||||||
|
minetest.after(0, pull_succeeded, speculative_pull)
|
||||||
|
inv:set_stack("main", i, nil)
|
||||||
|
return stack
|
||||||
|
end
|
||||||
|
end
|
||||||
|
return nil
|
||||||
|
end,
|
||||||
|
on_pull_item = function(pos, side, _)
|
||||||
|
local inv = minetest.get_meta(pos):get_inventory()
|
||||||
|
for i, stack in pairs(inv:get_list("main")) do
|
||||||
|
if not stack:is_empty() then
|
||||||
|
local taken = stack:take_item(1)
|
||||||
|
speculative_pull = {
|
||||||
|
canceled = false,
|
||||||
|
pos = pos,
|
||||||
|
taken = taken,
|
||||||
|
index = i,
|
||||||
|
dir = tube_side(pos, side)
|
||||||
|
}
|
||||||
|
minetest.after(0, pull_succeeded, speculative_pull)
|
||||||
|
inv:set_stack("main", i, stack)
|
||||||
|
return taken
|
||||||
|
end
|
||||||
|
end
|
||||||
|
return nil
|
||||||
|
end,
|
||||||
|
on_push_item = function(pos, side, item, _)
|
||||||
|
local dir_vec = tube_side(pos, side)
|
||||||
|
if not tube_can_insert(pos, nil, item, dir_vec) then
|
||||||
|
return false
|
||||||
|
end
|
||||||
|
tube_insert_object(pos, nil, item, dir_vec)
|
||||||
|
return true
|
||||||
|
end,
|
||||||
|
on_unpull_item = function(pos, _, item, _)
|
||||||
|
local inv = minetest.get_meta(pos):get_inventory()
|
||||||
|
if not inv:room_for_item("main", item) then
|
||||||
|
return false
|
||||||
|
end
|
||||||
|
|
||||||
|
local existing_stack = inv:get_stack("main", speculative_pull.index)
|
||||||
|
local leftover = existing_stack:add_item(item)
|
||||||
|
if not leftover:is_empty() then
|
||||||
|
return false
|
||||||
|
end
|
||||||
|
|
||||||
|
inv:set_stack("main", speculative_pull.index, existing_stack)
|
||||||
|
|
||||||
|
-- Cancel speculative pull
|
||||||
|
-- this on_unpull_item callback should be called
|
||||||
|
-- immediately after on_pull_item if it fails
|
||||||
|
-- so this should be procedural
|
||||||
|
speculative_pull.canceled = true
|
||||||
|
speculative_pull = nil
|
||||||
|
return true
|
||||||
|
end,
|
||||||
|
})
|
||||||
|
end
|
||||||
|
|
||||||
minetest.register_craft({
|
minetest.register_craft({
|
||||||
type = "shapeless",
|
type = "shapeless",
|
||||||
output = "digilines:chest",
|
output = "digilines:chest",
|
||||||
|
16
lcd.lua
@ -84,9 +84,8 @@ local create_lines = function(text)
|
|||||||
line = word
|
line = word
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
if word == " " then
|
-- don't add the space since we have a line break
|
||||||
-- don't add the space since we have a line break
|
if word ~= " " then
|
||||||
else
|
|
||||||
if line_len > 0 then
|
if line_len > 0 then
|
||||||
-- ok, we need the new line
|
-- ok, we need the new line
|
||||||
if flush_line_and_check_for_return() then return tab end
|
if flush_line_and_check_for_return() then return tab end
|
||||||
@ -292,12 +291,12 @@ minetest.register_node("digilines:lcd", {
|
|||||||
end,
|
end,
|
||||||
on_construct = reset_meta,
|
on_construct = reset_meta,
|
||||||
on_destruct = clearscreen,
|
on_destruct = clearscreen,
|
||||||
on_punch = function(pos, node, puncher, pointed_thing)
|
on_punch = function(pos, _, puncher, _)
|
||||||
if minetest.is_player(puncher) then
|
if minetest.is_player(puncher) then
|
||||||
spawn_entity(pos)
|
spawn_entity(pos)
|
||||||
end
|
end
|
||||||
end,
|
end,
|
||||||
on_rotate = function(pos, node, user, mode, new_param2)
|
on_rotate = function(pos, _, _, mode, new_param2)
|
||||||
if mode ~= screwdriver.ROTATE_FACE then
|
if mode ~= screwdriver.ROTATE_FACE then
|
||||||
return false
|
return false
|
||||||
end
|
end
|
||||||
@ -313,7 +312,7 @@ minetest.register_node("digilines:lcd", {
|
|||||||
minetest.get_meta(pos):set_string("channel", fields.channel)
|
minetest.get_meta(pos):set_string("channel", fields.channel)
|
||||||
end
|
end
|
||||||
end,
|
end,
|
||||||
digiline = {
|
digilines = {
|
||||||
receptor = {},
|
receptor = {},
|
||||||
effector = {
|
effector = {
|
||||||
action = on_digiline_receive
|
action = on_digiline_receive
|
||||||
@ -340,7 +339,10 @@ minetest.register_craft({
|
|||||||
output = "digilines:lcd 2",
|
output = "digilines:lcd 2",
|
||||||
recipe = {
|
recipe = {
|
||||||
{"default:steel_ingot", "digilines:wire_std_00000000", "default:steel_ingot"},
|
{"default:steel_ingot", "digilines:wire_std_00000000", "default:steel_ingot"},
|
||||||
{"mesecons_lightstone:lightstone_green_off","mesecons_lightstone:lightstone_green_off","mesecons_lightstone:lightstone_green_off"},
|
{"mesecons_lightstone:lightstone_green_off",
|
||||||
|
"mesecons_lightstone:lightstone_green_off",
|
||||||
|
"mesecons_lightstone:lightstone_green_off"},
|
||||||
|
|
||||||
{"default:glass","default:glass","default:glass"}
|
{"default:glass","default:glass","default:glass"}
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
@ -39,7 +39,7 @@ minetest.register_node("digilines:lightsensor", {
|
|||||||
groups = {dig_immediate=2},
|
groups = {dig_immediate=2},
|
||||||
selection_box = lsensor_selbox,
|
selection_box = lsensor_selbox,
|
||||||
node_box = lsensor_nodebox,
|
node_box = lsensor_nodebox,
|
||||||
digiline =
|
digilines =
|
||||||
{
|
{
|
||||||
receptor = {},
|
receptor = {},
|
||||||
effector = {
|
effector = {
|
||||||
@ -61,3 +61,11 @@ minetest.register_node("digilines:lightsensor", {
|
|||||||
end
|
end
|
||||||
end,
|
end,
|
||||||
})
|
})
|
||||||
|
|
||||||
|
minetest.register_craft({
|
||||||
|
output = "digilines:lightsensor",
|
||||||
|
recipe = {
|
||||||
|
{"default:glass","default:glass","default:glass"},
|
||||||
|
{"default:steel_ingot", "digilines:wire_std_00000000", "default:steel_ingot"},
|
||||||
|
}
|
||||||
|
})
|
||||||
|
1
mod.conf
@ -1,5 +1,6 @@
|
|||||||
name = digilines
|
name = digilines
|
||||||
depends = default
|
depends = default
|
||||||
|
optional_depends = tubelib,tubelib2
|
||||||
description = """
|
description = """
|
||||||
This mod adds digiline wires, an RTC (Real Time Clock), a light sensor as well as an LCD Screen.
|
This mod adds digiline wires, an RTC (Real Time Clock), a light sensor as well as an LCD Screen.
|
||||||
Can be used together with the luacontroller from mesecons.
|
Can be used together with the luacontroller from mesecons.
|
||||||
|
11
rtc.lua
@ -35,7 +35,7 @@ minetest.register_node("digilines:rtc", {
|
|||||||
groups = {dig_immediate=2},
|
groups = {dig_immediate=2},
|
||||||
selection_box = rtc_selbox,
|
selection_box = rtc_selbox,
|
||||||
node_box = rtc_nodebox,
|
node_box = rtc_nodebox,
|
||||||
digiline =
|
digilines =
|
||||||
{
|
{
|
||||||
receptor = {},
|
receptor = {},
|
||||||
effector = {
|
effector = {
|
||||||
@ -57,3 +57,12 @@ minetest.register_node("digilines:rtc", {
|
|||||||
end
|
end
|
||||||
end,
|
end,
|
||||||
})
|
})
|
||||||
|
|
||||||
|
minetest.register_craft({
|
||||||
|
output = "digilines:rtc",
|
||||||
|
recipe = {
|
||||||
|
{"", "dye:black", ""},
|
||||||
|
{"default:steel_ingot", "default:mese_crystal_fragment", "default:steel_ingot"},
|
||||||
|
{"", "digilines:wire_std_00000000", ""}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
BIN
textures/_sp.png
Before Width: | Height: | Size: 215 B After Width: | Height: | Size: 95 B |
Before Width: | Height: | Size: 446 B After Width: | Height: | Size: 250 B |
Before Width: | Height: | Size: 410 B After Width: | Height: | Size: 257 B |
Before Width: | Height: | Size: 196 B After Width: | Height: | Size: 136 B |
Before Width: | Height: | Size: 378 B After Width: | Height: | Size: 228 B |
Before Width: | Height: | Size: 218 B After Width: | Height: | Size: 194 B |
Before Width: | Height: | Size: 248 B After Width: | Height: | Size: 215 B |
Before Width: | Height: | Size: 142 B After Width: | Height: | Size: 132 B |
Before Width: | Height: | Size: 189 B After Width: | Height: | Size: 143 B |
@ -90,7 +90,7 @@ for zmy=0, 1 do
|
|||||||
paramtype = "light",
|
paramtype = "light",
|
||||||
paramtype2 = "facedir",
|
paramtype2 = "facedir",
|
||||||
sunlight_propagates = true,
|
sunlight_propagates = true,
|
||||||
digiline =
|
digilines =
|
||||||
{
|
{
|
||||||
wire =
|
wire =
|
||||||
{
|
{
|
||||||
|
@ -1,15 +1,12 @@
|
|||||||
minetest.register_on_placenode(function(pos, node)
|
|
||||||
if minetest.registered_nodes[node.name].digiline then
|
|
||||||
digilines.update_autoconnect(pos)
|
|
||||||
end
|
|
||||||
end)
|
|
||||||
|
|
||||||
minetest.register_on_dignode(function(pos, node)
|
local function check_and_update(pos, node)
|
||||||
if minetest.registered_nodes[node.name] and minetest.registered_nodes[node.name].digiline then
|
if digilines.getspec(node) then
|
||||||
-- need to make sure that node exists (unknown nodes!)
|
|
||||||
digilines.update_autoconnect(pos)
|
digilines.update_autoconnect(pos)
|
||||||
end
|
end
|
||||||
end)
|
end
|
||||||
|
|
||||||
|
minetest.register_on_placenode(check_and_update)
|
||||||
|
minetest.register_on_dignode(check_and_update)
|
||||||
|
|
||||||
function digilines.update_autoconnect(pos, secondcall)
|
function digilines.update_autoconnect(pos, secondcall)
|
||||||
local xppos = {x=pos.x+1, y=pos.y, z=pos.z}
|
local xppos = {x=pos.x+1, y=pos.y, z=pos.z}
|
||||||
@ -42,8 +39,7 @@ function digilines.update_autoconnect(pos, secondcall)
|
|||||||
digilines.update_autoconnect(zmympos, true)
|
digilines.update_autoconnect(zmympos, true)
|
||||||
end
|
end
|
||||||
|
|
||||||
local def = minetest.registered_nodes[minetest.get_node(pos).name]
|
local digilinespec = digilines.getspec(minetest.get_node(pos))
|
||||||
local digilinespec = def and def.digiline
|
|
||||||
if not (digilinespec and digilinespec.wire and
|
if not (digilinespec and digilinespec.wire and
|
||||||
digilinespec.wire.use_autoconnect) then
|
digilinespec.wire.use_autoconnect) then
|
||||||
return nil
|
return nil
|
||||||
|