power distribution improved
This commit is contained in:
parent
3a9e889d57
commit
b2d15efd27
@ -193,7 +193,6 @@ function techage.register_consumer(base_name, inv_name, tiles, tNode, validState
|
|||||||
on_metadata_inventory_put = tNode.on_metadata_inventory_put,
|
on_metadata_inventory_put = tNode.on_metadata_inventory_put,
|
||||||
on_metadata_inventory_take = tNode.on_metadata_inventory_take,
|
on_metadata_inventory_take = tNode.on_metadata_inventory_take,
|
||||||
|
|
||||||
drop = "",
|
|
||||||
paramtype2 = "facedir",
|
paramtype2 = "facedir",
|
||||||
groups = table.copy(tNode.groups),
|
groups = table.copy(tNode.groups),
|
||||||
is_ground_content = false,
|
is_ground_content = false,
|
||||||
@ -222,6 +221,7 @@ function techage.register_consumer(base_name, inv_name, tiles, tNode, validState
|
|||||||
on_metadata_inventory_take = tNode.on_metadata_inventory_take,
|
on_metadata_inventory_take = tNode.on_metadata_inventory_take,
|
||||||
|
|
||||||
paramtype2 = "facedir",
|
paramtype2 = "facedir",
|
||||||
|
drop = "",
|
||||||
diggable = false,
|
diggable = false,
|
||||||
groups = tNode.groups,
|
groups = tNode.groups,
|
||||||
is_ground_content = false,
|
is_ground_content = false,
|
||||||
|
@ -124,10 +124,31 @@ function techage.can_node_dig(node, ndef)
|
|||||||
return true
|
return true
|
||||||
end
|
end
|
||||||
|
|
||||||
|
local function handle_drop(drop)
|
||||||
|
-- To keep it simple, return only the item with the lowest rarity
|
||||||
|
if drop.items then
|
||||||
|
local rarity = 9999
|
||||||
|
local name
|
||||||
|
for idx,item in ipairs(drop.items) do
|
||||||
|
if item.rarity and item.rarity < rarity then
|
||||||
|
rarity = item.rarity
|
||||||
|
name = item.items[1] -- take always the first item
|
||||||
|
else
|
||||||
|
return item.items[1] -- take always the first item
|
||||||
|
end
|
||||||
|
end
|
||||||
|
return name
|
||||||
|
end
|
||||||
|
return false
|
||||||
|
end
|
||||||
|
|
||||||
-- returns the node name, if node can be dropped, otherwise nil
|
-- returns the node name, if node can be dropped, otherwise nil
|
||||||
function techage.dropped_node(node, ndef)
|
function techage.dropped_node(node, ndef)
|
||||||
if node.name == "air" then return end
|
if node.name == "air" then return end
|
||||||
if ndef.buildable_to == true then return end
|
if ndef.buildable_to == true then return end
|
||||||
if ndef.drop == "" then return end
|
if ndef.drop == "" then return end
|
||||||
|
if type(ndef.drop) == "table" then
|
||||||
|
return handle_drop(ndef.drop)
|
||||||
|
end
|
||||||
return ndef.drop or node.name
|
return ndef.drop or node.name
|
||||||
end
|
end
|
||||||
|
@ -39,18 +39,18 @@ end
|
|||||||
|
|
||||||
local function node_timer(pos, elapsed)
|
local function node_timer(pos, elapsed)
|
||||||
local mem = tubelib2.get_mem(pos)
|
local mem = tubelib2.get_mem(pos)
|
||||||
--print("firebox burn_cycles = "..(mem.burn_cycles or 0))
|
print("firebox burn_cycles = "..(mem.burn_cycles or 0))
|
||||||
if mem.running then
|
if mem.running then
|
||||||
-- trigger generator and provide power ratio 0..1
|
-- trigger generator and provide power ratio 0..1
|
||||||
local ratio = techage.transfer(
|
local ratio = techage.transfer(
|
||||||
{x=pos.x, y=pos.y+2, z=pos.z},
|
{x=pos.x, y=pos.y+2, z=pos.z},
|
||||||
nil, -- outdir
|
nil, -- outdir
|
||||||
"trigger", -- topic
|
"trigger", -- topic
|
||||||
mem.power_level/4.0, -- payload
|
(mem.power_level or 4)/4.0, -- payload
|
||||||
nil, -- network
|
nil, -- network
|
||||||
{"techage:coalboiler_top"} -- nodenames
|
{"techage:coalboiler_top"} -- nodenames
|
||||||
)
|
)
|
||||||
mem.burn_cycles = (mem.burn_cycles or 0) - math.max((ratio or 0.1), 0.1)
|
mem.burn_cycles = (mem.burn_cycles or 0) - math.max((ratio or 0.02), 0.02)
|
||||||
if mem.burn_cycles <= 0 then
|
if mem.burn_cycles <= 0 then
|
||||||
local taken = firebox.get_fuel(pos)
|
local taken = firebox.get_fuel(pos)
|
||||||
if taken then
|
if taken then
|
||||||
|
@ -4,7 +4,7 @@ local P = minetest.string_to_pos
|
|||||||
local M = minetest.get_meta
|
local M = minetest.get_meta
|
||||||
|
|
||||||
local PWR_NEEDED = 0.5
|
local PWR_NEEDED = 0.5
|
||||||
local CYCLE_TIME = 2
|
local CYCLE_TIME = 4
|
||||||
|
|
||||||
local Cable = techage.ElectricCable
|
local Cable = techage.ElectricCable
|
||||||
local consume_power = techage.power.consume_power
|
local consume_power = techage.power.consume_power
|
||||||
@ -20,20 +20,29 @@ local function swap_node(pos, postfix)
|
|||||||
minetest.swap_node(pos, node)
|
minetest.swap_node(pos, node)
|
||||||
end
|
end
|
||||||
|
|
||||||
local function node_timer(pos, elapsed)
|
local function on_power(pos)
|
||||||
--print("node_timer lamp "..S(pos))
|
|
||||||
local mem = tubelib2.get_mem(pos)
|
local mem = tubelib2.get_mem(pos)
|
||||||
if mem.running then
|
if mem.turned_on then
|
||||||
local got = consume_power(pos, PWR_NEEDED)
|
local got = consume_power(pos, PWR_NEEDED)
|
||||||
if got < PWR_NEEDED then
|
if got < PWR_NEEDED and mem.node_on then
|
||||||
swap_node(pos, "off")
|
swap_node(pos, "off")
|
||||||
else
|
mem.node_on = false
|
||||||
|
elseif not mem.node_on then
|
||||||
swap_node(pos, "on")
|
swap_node(pos, "on")
|
||||||
|
mem.node_on = true
|
||||||
end
|
end
|
||||||
return true
|
mem.trigger = true
|
||||||
end
|
end
|
||||||
swap_node(pos, "off")
|
end
|
||||||
return false
|
|
||||||
|
local function node_timer(pos, elapsed)
|
||||||
|
local mem = tubelib2.get_mem(pos)
|
||||||
|
if mem.node_on and not mem.trigger then
|
||||||
|
mem.node_on = false
|
||||||
|
swap_node(pos, "off")
|
||||||
|
end
|
||||||
|
mem.trigger = false
|
||||||
|
return mem.turned_on
|
||||||
end
|
end
|
||||||
|
|
||||||
local function lamp_on_rightclick(pos, node, clicker)
|
local function lamp_on_rightclick(pos, node, clicker)
|
||||||
@ -41,14 +50,20 @@ local function lamp_on_rightclick(pos, node, clicker)
|
|||||||
return
|
return
|
||||||
end
|
end
|
||||||
local mem = tubelib2.get_mem(pos)
|
local mem = tubelib2.get_mem(pos)
|
||||||
if not mem.running and power_available(pos, PWR_NEEDED) then
|
mem.turned_on = not mem.turned_on
|
||||||
mem.running = true
|
if mem.turned_on and power_available(pos, PWR_NEEDED) then
|
||||||
|
mem.node_on = true
|
||||||
swap_node(pos, "on")
|
swap_node(pos, "on")
|
||||||
|
mem.trigger = true
|
||||||
|
minetest.get_node_timer(pos):start(CYCLE_TIME)
|
||||||
|
elseif mem.turned_on then
|
||||||
|
mem.node_on = false
|
||||||
|
swap_node(pos, "off")
|
||||||
minetest.get_node_timer(pos):start(CYCLE_TIME)
|
minetest.get_node_timer(pos):start(CYCLE_TIME)
|
||||||
else
|
else
|
||||||
mem.running = false
|
mem.node_on = false
|
||||||
minetest.get_node_timer(pos):stop()
|
|
||||||
swap_node(pos, "off")
|
swap_node(pos, "off")
|
||||||
|
minetest.get_node_timer(pos):stop()
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -105,5 +120,6 @@ function techage.register_lamp(basename, ndef_off, ndef_on)
|
|||||||
techage.power.register_node({basename.."_off", basename.."_on"}, {
|
techage.power.register_node({basename.."_off", basename.."_on"}, {
|
||||||
power_network = Cable,
|
power_network = Cable,
|
||||||
conn_sides = ndef_off.conn_sides or determine_power_side, -- will be handled by clbk function
|
conn_sides = ndef_off.conn_sides or determine_power_side, -- will be handled by clbk function
|
||||||
|
on_power = on_power,
|
||||||
})
|
})
|
||||||
end
|
end
|
||||||
|
@ -19,6 +19,9 @@ local M = minetest.get_meta
|
|||||||
local MP = minetest.get_modpath("techage")
|
local MP = minetest.get_modpath("techage")
|
||||||
local I,_ = dofile(MP.."/intllib.lua")
|
local I,_ = dofile(MP.."/intllib.lua")
|
||||||
|
|
||||||
|
local Cable = techage.ElectricCable
|
||||||
|
local power_switched = techage.power.power_switched
|
||||||
|
|
||||||
local size = 3/32
|
local size = 3/32
|
||||||
local Boxes = {
|
local Boxes = {
|
||||||
{{-size, -size, size, size, size, 0.5 }}, -- z+
|
{{-size, -size, size, size, size, 0.5 }}, -- z+
|
||||||
@ -29,7 +32,7 @@ local Boxes = {
|
|||||||
{{-size, -size, -size, size, 0.5, size}}, -- y+
|
{{-size, -size, -size, size, 0.5, size}}, -- y+
|
||||||
}
|
}
|
||||||
|
|
||||||
techage.register_junction("techage:electric_junction", 2/8, Boxes, techage.ElectricCable, {
|
techage.register_junction("techage:electric_junction", 2/8, Boxes, Cable, {
|
||||||
description = I("TA Electric Junction Box"),
|
description = I("TA Electric Junction Box"),
|
||||||
tiles = {"techage_electric_junction.png"},
|
tiles = {"techage_electric_junction.png"},
|
||||||
groups = {snappy = 2, choppy = 2, oddly_breakable_by_hand = 3, techage_trowel = 1},
|
groups = {snappy = 2, choppy = 2, oddly_breakable_by_hand = 3, techage_trowel = 1},
|
||||||
@ -37,9 +40,9 @@ techage.register_junction("techage:electric_junction", 2/8, Boxes, techage.Elect
|
|||||||
|
|
||||||
on_construct = tubelib2.init_mem,
|
on_construct = tubelib2.init_mem,
|
||||||
after_tube_update = function(node, pos, out_dir, peer_pos, peer_in_dir)
|
after_tube_update = function(node, pos, out_dir, peer_pos, peer_in_dir)
|
||||||
local name = "techage:electric_junction"..techage.junction_type(pos, techage.ElectricCable)
|
local name = "techage:electric_junction"..techage.junction_type(pos, Cable)
|
||||||
minetest.swap_node(pos, {name = name, param2 = 0})
|
minetest.swap_node(pos, {name = name, param2 = 0})
|
||||||
techage.power.on_network_change(pos)
|
power_switched(pos)
|
||||||
end,
|
end,
|
||||||
})
|
})
|
||||||
|
|
||||||
|
@ -143,6 +143,16 @@ local function store_master(pos, master_pos)
|
|||||||
end)
|
end)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
local function trigger_lamps(pos)
|
||||||
|
Route = {}
|
||||||
|
pos_already_reached(pos)
|
||||||
|
connection_walk(pos, function(pos, mem)
|
||||||
|
local pwr = PWR(pos)
|
||||||
|
if pwr and pwr.on_power then
|
||||||
|
pwr.on_power(pos)
|
||||||
|
end
|
||||||
|
end)
|
||||||
|
end
|
||||||
|
|
||||||
-- called from any generator
|
-- called from any generator
|
||||||
local function on_power_switch(pos)
|
local function on_power_switch(pos)
|
||||||
@ -154,7 +164,6 @@ local function on_power_switch(pos)
|
|||||||
local mpos = determine_master(pos)
|
local mpos = determine_master(pos)
|
||||||
store_master(pos, mpos)
|
store_master(pos, mpos)
|
||||||
if mpos then
|
if mpos then
|
||||||
--print("master = "..S(mpos))
|
|
||||||
local mem = tubelib2.get_mem(mpos)
|
local mem = tubelib2.get_mem(mpos)
|
||||||
mem.is_master = true
|
mem.is_master = true
|
||||||
return mem
|
return mem
|
||||||
@ -189,21 +198,12 @@ local function accounting(mem)
|
|||||||
mem.available2 = 0
|
mem.available2 = 0
|
||||||
end
|
end
|
||||||
|
|
||||||
-- called from tubelib2.after_tube_update
|
|
||||||
local function on_network_change(pos)
|
|
||||||
local mem = on_power_switch(pos)
|
|
||||||
if mem then
|
|
||||||
accounting(mem)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
--
|
--
|
||||||
-- Generic API functions
|
-- Generic API functions
|
||||||
--
|
--
|
||||||
techage.power = {}
|
techage.power = {}
|
||||||
|
|
||||||
techage.power.power_switched = on_power_switch
|
techage.power.power_switched = on_power_switch
|
||||||
techage.power.on_network_change = on_network_change
|
|
||||||
|
|
||||||
-- Used to turn on/off the power by means of a power switch
|
-- Used to turn on/off the power by means of a power switch
|
||||||
function techage.power.power_cut(pos, dir, cable, cut)
|
function techage.power.power_cut(pos, dir, cable, cut)
|
||||||
@ -223,6 +223,7 @@ function techage.power.power_cut(pos, dir, cable, cut)
|
|||||||
for dir,_ in pairs(mem.connections) do
|
for dir,_ in pairs(mem.connections) do
|
||||||
mem.interrupted_dirs[dir] = false
|
mem.interrupted_dirs[dir] = false
|
||||||
on_power_switch(npos)
|
on_power_switch(npos)
|
||||||
|
trigger_lamps(npos)
|
||||||
mem.interrupted_dirs[dir] = true
|
mem.interrupted_dirs[dir] = true
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
@ -238,6 +239,7 @@ function techage.power.register_node(names, pwr_def)
|
|||||||
minetest.override_item(name, {
|
minetest.override_item(name, {
|
||||||
power = {
|
power = {
|
||||||
conn_sides = pwr_def.conn_sides or {"L", "R", "U", "D", "F", "B"},
|
conn_sides = pwr_def.conn_sides or {"L", "R", "U", "D", "F", "B"},
|
||||||
|
on_power = pwr_def.on_power,
|
||||||
power_network = pwr_def.power_network,
|
power_network = pwr_def.power_network,
|
||||||
after_place_node = ndef.after_place_node,
|
after_place_node = ndef.after_place_node,
|
||||||
after_dig_node = ndef.after_dig_node,
|
after_dig_node = ndef.after_dig_node,
|
||||||
@ -274,7 +276,7 @@ function techage.power.register_node(names, pwr_def)
|
|||||||
mem.connections[out_dir] = {pos = peer_pos, in_dir = peer_in_dir}
|
mem.connections[out_dir] = {pos = peer_pos, in_dir = peer_in_dir}
|
||||||
end
|
end
|
||||||
-- To be called delayed, so that all network connections have been established
|
-- To be called delayed, so that all network connections have been established
|
||||||
minetest.after(0.2, on_network_change, pos)
|
minetest.after(0.2, on_power_switch, pos)
|
||||||
if pwr.after_tube_update then
|
if pwr.after_tube_update then
|
||||||
return pwr.after_tube_update(node, pos, out_dir, peer_pos, peer_in_dir)
|
return pwr.after_tube_update(node, pos, out_dir, peer_pos, peer_in_dir)
|
||||||
end
|
end
|
||||||
@ -304,6 +306,7 @@ function techage.power.provide_power(pos, provide)
|
|||||||
local mem = tubelib2.get_mem(pos)
|
local mem = tubelib2.get_mem(pos)
|
||||||
if mem.is_master then
|
if mem.is_master then
|
||||||
accounting(mem)
|
accounting(mem)
|
||||||
|
trigger_lamps(pos, mem)
|
||||||
elseif mem.master_pos then
|
elseif mem.master_pos then
|
||||||
mem = tubelib2.get_mem(mem.master_pos)
|
mem = tubelib2.get_mem(mem.master_pos)
|
||||||
else
|
else
|
||||||
@ -322,6 +325,7 @@ function techage.power.secondary_power(pos, provide, needed)
|
|||||||
local mem = tubelib2.get_mem(pos)
|
local mem = tubelib2.get_mem(pos)
|
||||||
if mem.is_master then
|
if mem.is_master then
|
||||||
accounting(mem)
|
accounting(mem)
|
||||||
|
trigger_lamps(pos, mem)
|
||||||
elseif mem.master_pos then
|
elseif mem.master_pos then
|
||||||
mem = tubelib2.get_mem(mem.master_pos)
|
mem = tubelib2.get_mem(mem.master_pos)
|
||||||
else
|
else
|
||||||
|
@ -21,6 +21,10 @@ local M = minetest.get_meta
|
|||||||
local MP = minetest.get_modpath("techage")
|
local MP = minetest.get_modpath("techage")
|
||||||
local I,_ = dofile(MP.."/intllib.lua")
|
local I,_ = dofile(MP.."/intllib.lua")
|
||||||
|
|
||||||
|
local Cable = techage.ElectricCable
|
||||||
|
local power_cut = techage.power.power_cut
|
||||||
|
|
||||||
|
|
||||||
local Param2ToDir = {
|
local Param2ToDir = {
|
||||||
[0] = 6,
|
[0] = 6,
|
||||||
[1] = 5,
|
[1] = 5,
|
||||||
@ -42,7 +46,7 @@ local function switch_on(pos, node, clicker)
|
|||||||
max_hear_distance = 5,
|
max_hear_distance = 5,
|
||||||
})
|
})
|
||||||
local dir = Param2ToDir[node.param2]
|
local dir = Param2ToDir[node.param2]
|
||||||
techage.power.power_cut(pos, dir, techage.ElectricCable, false)
|
power_cut(pos, dir, Cable, false)
|
||||||
end
|
end
|
||||||
|
|
||||||
local function switch_off(pos, node, clicker)
|
local function switch_off(pos, node, clicker)
|
||||||
@ -58,7 +62,7 @@ local function switch_off(pos, node, clicker)
|
|||||||
max_hear_distance = 5,
|
max_hear_distance = 5,
|
||||||
})
|
})
|
||||||
local dir = Param2ToDir[node.param2]
|
local dir = Param2ToDir[node.param2]
|
||||||
techage.power.power_cut(pos, dir, techage.ElectricCable, true)
|
power_cut(pos, dir, Cable, true)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
@ -167,7 +171,7 @@ minetest.register_node("techage:powerswitch_box", {
|
|||||||
})
|
})
|
||||||
|
|
||||||
techage.power.register_node({"techage:powerswitch_box"}, {
|
techage.power.register_node({"techage:powerswitch_box"}, {
|
||||||
power_network = techage.ElectricCable})
|
power_network = Cable})
|
||||||
|
|
||||||
minetest.register_craft({
|
minetest.register_craft({
|
||||||
output = "techage:powerswitch 2",
|
output = "techage:powerswitch 2",
|
||||||
|
Loading…
Reference in New Issue
Block a user