mirror of
https://git.minetest.land/VoxeLibre/VoxeLibre.git
synced 2024-11-28 05:21:05 +01:00
Change over redstone torcher (don't work), change hopper-comparator interaction again, start working on dig/place node handlers (doesn't work yet)
This commit is contained in:
parent
b3a04aae3b
commit
74d3fff5ff
5 changed files with 50 additions and 15 deletions
|
@ -33,6 +33,7 @@ local POSSIBLE_COMPARATOR_POSITIONS = {
|
||||||
}
|
}
|
||||||
-- update comparator state, if needed
|
-- update comparator state, if needed
|
||||||
local function update_self(pos, node)
|
local function update_self(pos, node)
|
||||||
|
print("Updating comparator at "..vector.to_string(pos))
|
||||||
node = node or minetest.get_node(pos)
|
node = node or minetest.get_node(pos)
|
||||||
local nodedef = minetest.registered_nodes[node.name]
|
local nodedef = minetest.registered_nodes[node.name]
|
||||||
|
|
||||||
|
@ -50,12 +51,14 @@ local function update_self(pos, node)
|
||||||
local power_level = 0
|
local power_level = 0
|
||||||
if back_nodedef and back_nodedef._mcl_comparators_get_reading then
|
if back_nodedef and back_nodedef._mcl_comparators_get_reading then
|
||||||
power_level = back_nodedef._mcl_comparators_get_reading(back_pos)
|
power_level = back_nodedef._mcl_comparators_get_reading(back_pos)
|
||||||
|
else
|
||||||
|
power_level = vl_redstone.get_power(back_pos)
|
||||||
end
|
end
|
||||||
|
|
||||||
-- Get the maximum side power level
|
-- Get the maximum side power level
|
||||||
local side_power_level = 0
|
local side_power_level = 0
|
||||||
for i=2,3 do
|
for i=2,3 do
|
||||||
local pl = vl_redstone.get_power_level(vector.add(pos,input_rules[i]))
|
local pl = vl_redstone.get_power(vector.add(pos,input_rules[i]))
|
||||||
if pl > side_power_level then
|
if pl > side_power_level then
|
||||||
side_power_level = pl
|
side_power_level = pl
|
||||||
end
|
end
|
||||||
|
|
|
@ -71,7 +71,7 @@ local function torch_action_on(pos, node)
|
||||||
else
|
else
|
||||||
minetest.swap_node(pos, {name="mesecons_torch:mesecon_torch_off", param2=node.param2})
|
minetest.swap_node(pos, {name="mesecons_torch:mesecon_torch_off", param2=node.param2})
|
||||||
end
|
end
|
||||||
mesecon.receptor_off(pos, torch_get_output_rules(node))
|
vl_redstone.set_power(pos, 0, 2)
|
||||||
elseif node.name == "mesecons_torch:mesecon_torch_on_wall" then
|
elseif node.name == "mesecons_torch:mesecon_torch_on_wall" then
|
||||||
overheat = mesecon.do_overheat(pos)
|
overheat = mesecon.do_overheat(pos)
|
||||||
if overheat then
|
if overheat then
|
||||||
|
@ -79,7 +79,7 @@ local function torch_action_on(pos, node)
|
||||||
else
|
else
|
||||||
minetest.swap_node(pos, {name="mesecons_torch:mesecon_torch_off_wall", param2=node.param2})
|
minetest.swap_node(pos, {name="mesecons_torch:mesecon_torch_off_wall", param2=node.param2})
|
||||||
end
|
end
|
||||||
mesecon.receptor_off(pos, torch_get_output_rules(node))
|
vl_redstone.set_power(pos, 0, 2)
|
||||||
end
|
end
|
||||||
if overheat then
|
if overheat then
|
||||||
torch_overheated(pos)
|
torch_overheated(pos)
|
||||||
|
@ -94,7 +94,7 @@ local function torch_action_off(pos, node)
|
||||||
minetest.swap_node(pos, {name="mesecons_torch:mesecon_torch_overheated", param2=node.param2})
|
minetest.swap_node(pos, {name="mesecons_torch:mesecon_torch_overheated", param2=node.param2})
|
||||||
else
|
else
|
||||||
minetest.swap_node(pos, {name="mesecons_torch:mesecon_torch_on", param2=node.param2})
|
minetest.swap_node(pos, {name="mesecons_torch:mesecon_torch_on", param2=node.param2})
|
||||||
mesecon.receptor_on(pos, torch_get_output_rules(node))
|
vl_redstone.set_power(pos, 15, 2)
|
||||||
end
|
end
|
||||||
elseif node.name == "mesecons_torch:mesecon_torch_off_wall" or node.name == "mesecons_torch:mesecon_torch_overheated_wall" then
|
elseif node.name == "mesecons_torch:mesecon_torch_off_wall" or node.name == "mesecons_torch:mesecon_torch_overheated_wall" then
|
||||||
overheat = mesecon.do_overheat(pos)
|
overheat = mesecon.do_overheat(pos)
|
||||||
|
@ -102,7 +102,7 @@ local function torch_action_off(pos, node)
|
||||||
minetest.swap_node(pos, {name="mesecons_torch:mesecon_torch_overheated_wall", param2=node.param2})
|
minetest.swap_node(pos, {name="mesecons_torch:mesecon_torch_overheated_wall", param2=node.param2})
|
||||||
else
|
else
|
||||||
minetest.swap_node(pos, {name="mesecons_torch:mesecon_torch_on_wall", param2=node.param2})
|
minetest.swap_node(pos, {name="mesecons_torch:mesecon_torch_on_wall", param2=node.param2})
|
||||||
mesecon.receptor_on(pos, torch_get_output_rules(node))
|
vl_redstone.set_power(pos, 15, 2)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
if overheat then
|
if overheat then
|
||||||
|
|
|
@ -1,3 +1,3 @@
|
||||||
name = mesecons_torch
|
name = mesecons_torch
|
||||||
depends = mesecons, mcl_torches
|
depends = mesecons, mcl_torches, vl_redstone
|
||||||
optional_depends = doc
|
optional_depends = doc
|
||||||
|
|
|
@ -23,10 +23,10 @@ local REDSTONE_POWER_META_SOURCE = REDSTONE_POWER_META.."."
|
||||||
|
|
||||||
local multipower_cache = {}
|
local multipower_cache = {}
|
||||||
|
|
||||||
local function get_node_multipower_data(pos)
|
local function get_node_multipower_data(pos, no_create)
|
||||||
local hash = minetest_hash_node_pos(pos)
|
local hash = minetest_hash_node_pos(pos)
|
||||||
local node_multipower = multipower_cache[hash]
|
local node_multipower = multipower_cache[hash]
|
||||||
if not node_multipower then
|
if not node_multipower and not no_create then
|
||||||
local meta = minetest_get_meta(pos)
|
local meta = minetest_get_meta(pos)
|
||||||
node_multipower = minetest_deserialize(meta:get_string("vl_redstone.multipower")) or {sources={}}
|
node_multipower = minetest_deserialize(meta:get_string("vl_redstone.multipower")) or {sources={}}
|
||||||
multipower_cache[hash] = node_multipower
|
multipower_cache[hash] = node_multipower
|
||||||
|
@ -236,7 +236,13 @@ vl_scheduler.register_function("vl_redstone:flow_power",function(task, source_po
|
||||||
end)
|
end)
|
||||||
|
|
||||||
function vl_redstone.set_power(pos, strength, delay)
|
function vl_redstone.set_power(pos, strength, delay)
|
||||||
local node_multipower = get_node_multipower_data(pos)
|
-- Get existing multipower data, but don't create the data if the strength is zero
|
||||||
|
local no_create
|
||||||
|
if strength == 0 then no_create = true end
|
||||||
|
local node_multipower = get_node_multipower_data(pos, no_create)
|
||||||
|
if not node_multipower then return end
|
||||||
|
|
||||||
|
-- Determine how far we need to trace conductors
|
||||||
local distance = node_multipower.drive_strength or 0
|
local distance = node_multipower.drive_strength or 0
|
||||||
|
|
||||||
-- Don't perform an update if the power level is the same as before
|
-- Don't perform an update if the power level is the same as before
|
||||||
|
@ -253,11 +259,33 @@ function vl_redstone.set_power(pos, strength, delay)
|
||||||
vl_scheduler.add_task(delay or 0, "vl_redstone:flow_power", 2, {pos, strength, distance + 1})
|
vl_scheduler.add_task(delay or 0, "vl_redstone:flow_power", 2, {pos, strength, distance + 1})
|
||||||
end
|
end
|
||||||
|
|
||||||
function vl_redstone.get_power_level(pos)
|
function vl_redstone.get_power(pos)
|
||||||
local node_multipower = get_node_multipower_data(pos)
|
local node_multipower = get_node_multipower_data(pos)
|
||||||
return node_multipower.strength or 0
|
return node_multipower.strength or 0
|
||||||
end
|
end
|
||||||
|
|
||||||
|
function vl_redstone.on_placenode(pos, node)
|
||||||
|
local nodedef = minetest.registered_nodes[node.name]
|
||||||
|
if not nodedef then return end
|
||||||
|
if not nodedef.mesecons then return end
|
||||||
|
local receptor = nodedef.mesecons.receptor
|
||||||
|
if not receptor then return end
|
||||||
|
|
||||||
|
if receptor.state == mesecon.state.on then
|
||||||
|
vl_redstone.set_power(pos, 15)
|
||||||
|
else
|
||||||
|
vl_redstone.set_power(pos, 0)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
function vl_redstone.on_dignode(pos, node)
|
||||||
|
print("Dug node at "..vector.to_string(pos))
|
||||||
|
|
||||||
|
-- Node was dug, can't power anything
|
||||||
|
-- This doesn't work because the node is gone and we don't know what we were powering
|
||||||
|
-- TODO: get the rules here and use that for the first step
|
||||||
|
vl_redstone.set_power(pos, 0)
|
||||||
|
end
|
||||||
|
|
||||||
-- Persist multipower data
|
-- Persist multipower data
|
||||||
minetest.register_on_shutdown(function()
|
minetest.register_on_shutdown(function()
|
||||||
for pos_hash,node_multipower in pairs(multipower_cache) do
|
for pos_hash,node_multipower in pairs(multipower_cache) do
|
||||||
|
@ -266,3 +294,6 @@ minetest.register_on_shutdown(function()
|
||||||
meta:set_string("vl_redstone.multipower", minetest_serialize(node_multipower))
|
meta:set_string("vl_redstone.multipower", minetest_serialize(node_multipower))
|
||||||
end
|
end
|
||||||
end)
|
end)
|
||||||
|
minetest.register_on_placenode(vl_redstone.on_placenode)
|
||||||
|
minetest.register_on_dignode(vl_redstone.on_dignode)
|
||||||
|
|
||||||
|
|
|
@ -188,6 +188,11 @@ local function hopper_pull_from_mc(mc_ent, dest_pos, inv_size)
|
||||||
end
|
end
|
||||||
mcl_hoppers.pull_from_minecart = hopper_pull_from_mc
|
mcl_hoppers.pull_from_minecart = hopper_pull_from_mc
|
||||||
|
|
||||||
|
local function get_reading(pos)
|
||||||
|
local meta = minetest.get_meta(pos)
|
||||||
|
local inv = meta:get_inventory()
|
||||||
|
return mcl_comparators.read_inventory(inv, "main")
|
||||||
|
end
|
||||||
|
|
||||||
-- Downwards hopper (base definition)
|
-- Downwards hopper (base definition)
|
||||||
|
|
||||||
|
@ -337,11 +342,7 @@ local def_hopper = {
|
||||||
|
|
||||||
return true
|
return true
|
||||||
end,
|
end,
|
||||||
_mcl_comparators_get_reading = function (pos)
|
_mcl_comparators_get_reading = get_reading,
|
||||||
local meta = minetest.get_meta(pos)
|
|
||||||
local inv = meta:get_inventory()
|
|
||||||
return mcl_comparators.read_inventory(inv, "main")
|
|
||||||
end,
|
|
||||||
sounds = mcl_sounds.node_sound_metal_defaults(),
|
sounds = mcl_sounds.node_sound_metal_defaults(),
|
||||||
|
|
||||||
_mcl_blast_resistance = 4.8,
|
_mcl_blast_resistance = 4.8,
|
||||||
|
|
Loading…
Reference in a new issue