mirror of
https://github.com/minetest-mods/technic.git
synced 2025-07-03 00:30:36 +02:00
Make switching station run all machines it is connected to, including those in unloaded blocks.
This commit is contained in:
@ -80,8 +80,78 @@ function technic.register_battery_box(data)
|
||||
"label[3.5,4;"..S("Upgrade Slots").."]"
|
||||
end
|
||||
|
||||
local run = function(pos, node)
|
||||
local meta = minetest.get_meta(pos)
|
||||
local eu_input = meta:get_int(tier.."_EU_input")
|
||||
local current_charge = meta:get_int("internal_EU_charge")
|
||||
|
||||
local EU_upgrade, tube_upgrade = 0, 0
|
||||
if data.upgrade then
|
||||
EU_upgrade, tube_upgrade = technic.handle_machine_upgrades(meta)
|
||||
end
|
||||
local max_charge = data.max_charge * (1 + EU_upgrade / 10)
|
||||
|
||||
-- Charge/discharge the battery with the input EUs
|
||||
if eu_input >= 0 then
|
||||
current_charge = math.min(current_charge + eu_input, max_charge)
|
||||
else
|
||||
current_charge = math.max(current_charge + eu_input, 0)
|
||||
end
|
||||
|
||||
-- Charging/discharging tools here
|
||||
local tool_full, tool_empty
|
||||
current_charge, tool_full = technic.charge_tools(meta,
|
||||
current_charge, data.charge_step)
|
||||
current_charge, tool_empty = technic.discharge_tools(meta,
|
||||
current_charge, data.discharge_step,
|
||||
max_charge)
|
||||
|
||||
if data.tube then
|
||||
local inv = meta:get_inventory()
|
||||
technic.handle_machine_pipeworks(pos, tube_upgrade,
|
||||
function(pos, x_velocity, z_velocity)
|
||||
if tool_full and not inv:is_empty("src") then
|
||||
technic.send_items(pos, x_velocity, z_velocity, "src")
|
||||
elseif tool_empty and not inv:is_empty("dst") then
|
||||
technic.send_items(pos, x_velocity, z_velocity, "dst")
|
||||
end
|
||||
end)
|
||||
end
|
||||
|
||||
-- We allow batteries to charge on less than the demand
|
||||
meta:set_int(tier.."_EU_demand",
|
||||
math.min(data.charge_rate, max_charge - current_charge))
|
||||
meta:set_int(tier.."_EU_supply",
|
||||
math.min(data.discharge_rate, current_charge))
|
||||
meta:set_int("internal_EU_charge", current_charge)
|
||||
|
||||
-- Select node textures
|
||||
local charge_count = math.ceil((current_charge / max_charge) * 8)
|
||||
charge_count = math.min(charge_count, 8)
|
||||
charge_count = math.max(charge_count, 0)
|
||||
local last_count = meta:get_float("last_side_shown")
|
||||
if charge_count ~= last_count then
|
||||
technic.swap_node(pos,"technic:"..ltier.."_battery_box"..charge_count)
|
||||
meta:set_float("last_side_shown", charge_count)
|
||||
end
|
||||
|
||||
local charge_percent = math.floor(current_charge / max_charge * 100)
|
||||
meta:set_string("formspec",
|
||||
formspec..
|
||||
"image[1,1;1,2;technic_power_meter_bg.png"
|
||||
.."^[lowpart:"..charge_percent
|
||||
..":technic_power_meter_fg.png]")
|
||||
|
||||
local infotext = S("%s Battery Box: %d/%d"):format(tier,
|
||||
current_charge, max_charge)
|
||||
if eu_input == 0 then
|
||||
infotext = S("%s Idle"):format(infotext)
|
||||
end
|
||||
meta:set_string("infotext", infotext)
|
||||
end
|
||||
|
||||
for i = 0, 8 do
|
||||
local groups = {snappy=2, choppy=2, oddly_breakable_by_hand=2}
|
||||
local groups = {snappy=2, choppy=2, oddly_breakable_by_hand=2, technic_machine=1}
|
||||
if i ~= 0 then
|
||||
groups.not_in_creative_inventory = 1
|
||||
end
|
||||
@ -124,93 +194,10 @@ function technic.register_battery_box(data)
|
||||
allow_metadata_inventory_put = technic.machine_inventory_put,
|
||||
allow_metadata_inventory_take = technic.machine_inventory_take,
|
||||
allow_metadata_inventory_move = technic.machine_inventory_move,
|
||||
technic_run = run,
|
||||
})
|
||||
end
|
||||
|
||||
|
||||
minetest.register_abm({
|
||||
nodenames = {"technic:"..ltier.."_battery_box0", "technic:"..ltier.."_battery_box1",
|
||||
"technic:"..ltier.."_battery_box2", "technic:"..ltier.."_battery_box3",
|
||||
"technic:"..ltier.."_battery_box4", "technic:"..ltier.."_battery_box5",
|
||||
"technic:"..ltier.."_battery_box6", "technic:"..ltier.."_battery_box7",
|
||||
"technic:"..ltier.."_battery_box8"},
|
||||
interval = 1,
|
||||
chance = 1,
|
||||
action = function(pos, node, active_object_count, active_object_count_wider)
|
||||
local meta = minetest.get_meta(pos)
|
||||
local eu_input = meta:get_int(tier.."_EU_input")
|
||||
local current_charge = meta:get_int("internal_EU_charge")
|
||||
|
||||
-- Power off automatically if no longer connected to a switching station
|
||||
technic.switching_station_timeout_count(pos, tier)
|
||||
|
||||
local EU_upgrade, tube_upgrade = 0, 0
|
||||
if data.upgrade then
|
||||
EU_upgrade, tube_upgrade = technic.handle_machine_upgrades(meta)
|
||||
end
|
||||
local max_charge = data.max_charge * (1 + EU_upgrade / 10)
|
||||
|
||||
-- Charge/discharge the battery with the input EUs
|
||||
if eu_input >= 0 then
|
||||
current_charge = math.min(current_charge + eu_input, max_charge)
|
||||
else
|
||||
current_charge = math.max(current_charge + eu_input, 0)
|
||||
end
|
||||
|
||||
-- Charging/discharging tools here
|
||||
local tool_full, tool_empty
|
||||
current_charge, tool_full = technic.charge_tools(meta,
|
||||
current_charge, data.charge_step)
|
||||
current_charge, tool_empty = technic.discharge_tools(meta,
|
||||
current_charge, data.discharge_step,
|
||||
max_charge)
|
||||
|
||||
if data.tube then
|
||||
local inv = meta:get_inventory()
|
||||
technic.handle_machine_pipeworks(pos, tube_upgrade,
|
||||
function(pos, x_velocity, z_velocity)
|
||||
if tool_full and not inv:is_empty("src") then
|
||||
technic.send_items(pos, x_velocity, z_velocity, "src")
|
||||
elseif tool_empty and not inv:is_empty("dst") then
|
||||
technic.send_items(pos, x_velocity, z_velocity, "dst")
|
||||
end
|
||||
end)
|
||||
end
|
||||
|
||||
-- We allow batteries to charge on less than the demand
|
||||
meta:set_int(tier.."_EU_demand",
|
||||
math.min(data.charge_rate, max_charge - current_charge))
|
||||
meta:set_int(tier.."_EU_supply",
|
||||
math.min(data.discharge_rate, current_charge))
|
||||
|
||||
meta:set_int("internal_EU_charge", current_charge)
|
||||
|
||||
-- Select node textures
|
||||
local charge_count = math.ceil((current_charge / max_charge) * 8)
|
||||
charge_count = math.min(charge_count, 8)
|
||||
charge_count = math.max(charge_count, 0)
|
||||
local last_count = meta:get_float("last_side_shown")
|
||||
if charge_count ~= last_count then
|
||||
technic.swap_node(pos,"technic:"..ltier.."_battery_box"..charge_count)
|
||||
meta:set_float("last_side_shown", charge_count)
|
||||
end
|
||||
|
||||
local charge_percent = math.floor(current_charge / max_charge * 100)
|
||||
meta:set_string("formspec",
|
||||
formspec..
|
||||
"image[1,1;1,2;technic_power_meter_bg.png"
|
||||
.."^[lowpart:"..charge_percent
|
||||
..":technic_power_meter_fg.png]")
|
||||
|
||||
local infotext = S("%s Battery Box: %d/%d"):format(tier,
|
||||
current_charge, max_charge)
|
||||
if eu_input == 0 then
|
||||
infotext = S("%s Idle"):format(infotext)
|
||||
end
|
||||
meta:set_string("infotext", infotext)
|
||||
end
|
||||
})
|
||||
|
||||
-- Register as a battery type
|
||||
-- Battery type machines function as power reservoirs and can both receive and give back power
|
||||
for i = 0, 8 do
|
||||
|
@ -59,7 +59,6 @@ function technic.register_cable(tier, size)
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
minetest.register_on_placenode(function(pos, node)
|
||||
for tier, machine_list in pairs(technic.machines) do
|
||||
if machine_list[node.name] ~= nil then
|
||||
@ -79,7 +78,6 @@ minetest.register_on_dignode(function(pos, node)
|
||||
end
|
||||
end)
|
||||
|
||||
|
||||
function technic.get_cable_id(links)
|
||||
return (links[6] * 1) + (links[5] * 2)
|
||||
+ (links[4] * 4) + (links[3] * 8)
|
||||
@ -146,7 +144,7 @@ function technic.gen_cable_nodebox(x1, y1, z1, x2, y2, z2, size)
|
||||
local box_center = {-size, -size, -size, size, size, size}
|
||||
local box_y1 = {-size, -size, -size, size, 0.5, size} -- y+
|
||||
local box_x1 = {-size, -size, -size, 0.5, size, size} -- x+
|
||||
local box_z1 = {-size, -size, size, size, size, 0.5} -- z+
|
||||
local box_z1 = {-size, -size, size, size, size, 0.5} -- z+
|
||||
local box_z2 = {-size, -size, -0.5, size, size, size} -- z-
|
||||
local box_y2 = {-size, -0.5, -size, size, size, size} -- y-
|
||||
local box_x2 = {-0.5, -size, -size, size, size, size} -- x-
|
||||
|
@ -18,8 +18,8 @@ function technic.register_generator(data)
|
||||
local tier = data.tier
|
||||
local ltier = string.lower(tier)
|
||||
|
||||
local groups = {snappy=2, choppy=2, oddly_breakable_by_hand=2}
|
||||
local active_groups = {snappy=2, choppy=2, oddly_breakable_by_hand=2, not_in_creative_inventory=1}
|
||||
local groups = {snappy=2, choppy=2, oddly_breakable_by_hand=2, technic_machine=1}
|
||||
local active_groups = {snappy=2, choppy=2, oddly_breakable_by_hand=2, technic_machine=1, not_in_creative_inventory=1}
|
||||
if data.tube then
|
||||
groups.tubedevice = 1
|
||||
groups.tubedevice_receiver = 1
|
||||
@ -35,6 +35,54 @@ function technic.register_generator(data)
|
||||
"list[current_player;main;0,5;8,4;]"
|
||||
|
||||
local desc = S("Fuel-Fired %s Generator"):format(tier)
|
||||
|
||||
local run = function(pos, node)
|
||||
local meta = minetest.get_meta(pos)
|
||||
local burn_time = meta:get_int("burn_time")
|
||||
local burn_totaltime = meta:get_int("burn_totaltime")
|
||||
-- If more to burn and the energy produced was used: produce some more
|
||||
if burn_time > 0 then
|
||||
meta:set_int(tier.."_EU_supply", data.supply)
|
||||
burn_time = burn_time - 1
|
||||
meta:set_int("burn_time", burn_time)
|
||||
end
|
||||
-- Burn another piece of fuel
|
||||
if burn_time == 0 then
|
||||
local inv = meta:get_inventory()
|
||||
if not inv:is_empty("src") then
|
||||
local fuellist = inv:get_list("src")
|
||||
local fuel = minetest.get_craft_result(
|
||||
{method = "fuel", width = 1,
|
||||
items = fuellist})
|
||||
if not fuel or fuel.time == 0 then
|
||||
meta:set_string("infotext", S("%s Out Of Fuel"):format(desc))
|
||||
technic.swap_node(pos, "technic:"..ltier.."_generator")
|
||||
return
|
||||
end
|
||||
meta:set_int("burn_time", fuel.time)
|
||||
meta:set_int("burn_totaltime", fuel.time)
|
||||
local stack = inv:get_stack("src", 1)
|
||||
stack:take_item()
|
||||
inv:set_stack("src", 1, stack)
|
||||
technic.swap_node(pos, "technic:"..ltier.."_generator_active")
|
||||
meta:set_int(tier.."_EU_supply", data.supply)
|
||||
else
|
||||
technic.swap_node(pos, "technic:"..ltier.."_generator")
|
||||
meta:set_int(tier.."_EU_supply", 0)
|
||||
end
|
||||
end
|
||||
if burn_totaltime == 0 then burn_totaltime = 1 end
|
||||
local percent = math.floor((burn_time / burn_totaltime) * 100)
|
||||
meta:set_string("infotext", desc.." ("..percent.."%)")
|
||||
meta:set_string("formspec",
|
||||
"size[8, 9]"..
|
||||
"label[0, 0;"..minetest.formspec_escape(desc).."]"..
|
||||
"list[current_name;src;3, 1;1, 1;]"..
|
||||
"image[4, 1;1, 1;default_furnace_fire_bg.png^[lowpart:"..
|
||||
(percent)..":default_furnace_fire_fg.png]"..
|
||||
"list[current_player;main;0, 5;8, 4;]")
|
||||
end
|
||||
|
||||
minetest.register_node("technic:"..ltier.."_generator", {
|
||||
description = desc,
|
||||
tiles = {"technic_"..ltier.."_generator_top.png", "technic_machine_bottom.png",
|
||||
@ -59,6 +107,7 @@ function technic.register_generator(data)
|
||||
allow_metadata_inventory_put = technic.machine_inventory_put,
|
||||
allow_metadata_inventory_take = technic.machine_inventory_take,
|
||||
allow_metadata_inventory_move = technic.machine_inventory_move,
|
||||
technic_run = run,
|
||||
})
|
||||
|
||||
minetest.register_node("technic:"..ltier.."_generator_active", {
|
||||
@ -76,58 +125,10 @@ function technic.register_generator(data)
|
||||
allow_metadata_inventory_put = technic.machine_inventory_put,
|
||||
allow_metadata_inventory_take = technic.machine_inventory_take,
|
||||
allow_metadata_inventory_move = technic.machine_inventory_move,
|
||||
technic_run = run,
|
||||
technic_disabled_machine_name = "technic:"..ltier.."_generator",
|
||||
})
|
||||
minetest.register_abm({
|
||||
nodenames = {"technic:"..ltier.."_generator", "technic:"..ltier.."_generator_active"},
|
||||
interval = 1,
|
||||
chance = 1,
|
||||
action = function(pos, node, active_object_count, active_object_count_wider)
|
||||
local meta = minetest.get_meta(pos)
|
||||
local burn_time = meta:get_int("burn_time")
|
||||
local burn_totaltime = meta:get_int("burn_totaltime")
|
||||
-- If more to burn and the energy produced was used: produce some more
|
||||
if burn_time > 0 then
|
||||
meta:set_int(tier.."_EU_supply", data.supply)
|
||||
burn_time = burn_time - 1
|
||||
meta:set_int("burn_time", burn_time)
|
||||
end
|
||||
-- Burn another piece of fuel
|
||||
if burn_time == 0 then
|
||||
local inv = meta:get_inventory()
|
||||
if not inv:is_empty("src") then
|
||||
local fuellist = inv:get_list("src")
|
||||
local fuel = minetest.get_craft_result(
|
||||
{method = "fuel", width = 1,
|
||||
items = fuellist})
|
||||
if not fuel or fuel.time == 0 then
|
||||
meta:set_string("infotext", S("%s Out Of Fuel"):format(desc))
|
||||
technic.swap_node(pos, "technic:"..ltier.."_generator")
|
||||
return
|
||||
end
|
||||
meta:set_int("burn_time", fuel.time)
|
||||
meta:set_int("burn_totaltime", fuel.time)
|
||||
local stack = inv:get_stack("src", 1)
|
||||
stack:take_item()
|
||||
inv:set_stack("src", 1, stack)
|
||||
technic.swap_node(pos, "technic:"..ltier.."_generator_active")
|
||||
meta:set_int(tier.."_EU_supply", data.supply)
|
||||
else
|
||||
technic.swap_node(pos, "technic:"..ltier.."_generator")
|
||||
meta:set_int(tier.."_EU_supply", 0)
|
||||
end
|
||||
end
|
||||
if burn_totaltime == 0 then burn_totaltime = 1 end
|
||||
local percent = math.floor((burn_time / burn_totaltime) * 100)
|
||||
meta:set_string("infotext", desc.." ("..percent.."%)")
|
||||
meta:set_string("formspec",
|
||||
"size[8, 9]"..
|
||||
"label[0, 0;"..minetest.formspec_escape(desc).."]"..
|
||||
"list[current_name;src;3, 1;1, 1;]"..
|
||||
"image[4, 1;1, 1;default_furnace_fire_bg.png^[lowpart:"..
|
||||
(percent)..":default_furnace_fire_fg.png]"..
|
||||
"list[current_player;main;0, 5;8, 4;]")
|
||||
end
|
||||
})
|
||||
|
||||
technic.register_machine(tier, "technic:"..ltier.."_generator", technic.producer)
|
||||
technic.register_machine(tier, "technic:"..ltier.."_generator_active", technic.producer)
|
||||
end
|
||||
|
@ -23,8 +23,8 @@ function technic.register_base_machine(data)
|
||||
local tier = data.tier
|
||||
local ltier = string.lower(tier)
|
||||
|
||||
local groups = {cracky = 2}
|
||||
local active_groups = {cracky = 2, not_in_creative_inventory = 1}
|
||||
local groups = {cracky = 2, technic_machine = 1}
|
||||
local active_groups = {cracky = 2, technic_machine = 1, not_in_creative_inventory = 1}
|
||||
if data.tube then
|
||||
groups.tubedevice = 1
|
||||
groups.tubedevice_receiver = 1
|
||||
@ -46,6 +46,61 @@ function technic.register_base_machine(data)
|
||||
"label[1,4;"..S("Upgrade Slots").."]"
|
||||
end
|
||||
|
||||
local run = function(pos, node)
|
||||
local meta = minetest.get_meta(pos)
|
||||
local inv = meta:get_inventory()
|
||||
local eu_input = meta:get_int(tier.."_EU_input")
|
||||
|
||||
local machine_desc_tier = machine_desc:format(tier)
|
||||
local machine_node = "technic:"..ltier.."_"..machine_name
|
||||
local machine_demand = data.demand
|
||||
|
||||
-- Setup meta data if it does not exist.
|
||||
if not eu_input then
|
||||
meta:set_int(tier.."_EU_demand", machine_demand[1])
|
||||
meta:set_int(tier.."_EU_input", 0)
|
||||
return
|
||||
end
|
||||
|
||||
local EU_upgrade, tube_upgrade = 0, 0
|
||||
if data.upgrade then
|
||||
EU_upgrade, tube_upgrade = technic.handle_machine_upgrades(meta)
|
||||
end
|
||||
if data.tube then
|
||||
technic.handle_machine_pipeworks(pos, tube_upgrade)
|
||||
end
|
||||
|
||||
local result = technic.get_recipe(typename, inv:get_list("src"))
|
||||
|
||||
if not result then
|
||||
technic.swap_node(pos, machine_node)
|
||||
meta:set_string("infotext", S("%s Idle"):format(machine_desc_tier))
|
||||
meta:set_int(tier.."_EU_demand", 0)
|
||||
return
|
||||
end
|
||||
|
||||
if eu_input < machine_demand[EU_upgrade+1] then
|
||||
-- Unpowered - go idle
|
||||
technic.swap_node(pos, machine_node)
|
||||
meta:set_string("infotext", S("%s Unpowered"):format(machine_desc_tier))
|
||||
elseif eu_input >= machine_demand[EU_upgrade+1] then
|
||||
-- Powered
|
||||
technic.swap_node(pos, machine_node.."_active")
|
||||
meta:set_string("infotext", S("%s Active"):format(machine_desc_tier))
|
||||
|
||||
meta:set_int("src_time", meta:get_int("src_time") + 1)
|
||||
if meta:get_int("src_time") >= result.time / data.speed then
|
||||
meta:set_int("src_time", 0)
|
||||
local result_stack = ItemStack(result.output)
|
||||
if inv:room_for_item("dst", result_stack) then
|
||||
inv:set_list("src", result.new_input)
|
||||
inv:add_item("dst", result_stack)
|
||||
end
|
||||
end
|
||||
end
|
||||
meta:set_int(tier.."_EU_demand", machine_demand[EU_upgrade+1])
|
||||
end
|
||||
|
||||
minetest.register_node("technic:"..ltier.."_"..machine_name, {
|
||||
description = machine_desc:format(tier),
|
||||
tiles = {"technic_"..ltier.."_"..machine_name.."_top.png",
|
||||
@ -75,6 +130,7 @@ function technic.register_base_machine(data)
|
||||
allow_metadata_inventory_put = technic.machine_inventory_put,
|
||||
allow_metadata_inventory_take = technic.machine_inventory_take,
|
||||
allow_metadata_inventory_move = technic.machine_inventory_move,
|
||||
technic_run = run,
|
||||
})
|
||||
|
||||
minetest.register_node("technic:"..ltier.."_"..machine_name.."_active",{
|
||||
@ -95,70 +151,8 @@ function technic.register_base_machine(data)
|
||||
allow_metadata_inventory_put = technic.machine_inventory_put,
|
||||
allow_metadata_inventory_take = technic.machine_inventory_take,
|
||||
allow_metadata_inventory_move = technic.machine_inventory_move,
|
||||
})
|
||||
|
||||
minetest.register_abm({
|
||||
nodenames = {"technic:"..ltier.."_"..machine_name,
|
||||
"technic:"..ltier.."_"..machine_name.."_active"},
|
||||
interval = 1,
|
||||
chance = 1,
|
||||
action = function(pos, node, active_object_count, active_object_count_wider)
|
||||
local meta = minetest.get_meta(pos)
|
||||
local inv = meta:get_inventory()
|
||||
local eu_input = meta:get_int(tier.."_EU_input")
|
||||
|
||||
local machine_desc_tier = machine_desc:format(tier)
|
||||
local machine_node = "technic:"..ltier.."_"..machine_name
|
||||
local machine_demand = data.demand
|
||||
|
||||
-- Setup meta data if it does not exist.
|
||||
if not eu_input then
|
||||
meta:set_int(tier.."_EU_demand", machine_demand[1])
|
||||
meta:set_int(tier.."_EU_input", 0)
|
||||
return
|
||||
end
|
||||
|
||||
-- Power off automatically if no longer connected to a switching station
|
||||
technic.switching_station_timeout_count(pos, tier)
|
||||
|
||||
local EU_upgrade, tube_upgrade = 0, 0
|
||||
if data.upgrade then
|
||||
EU_upgrade, tube_upgrade = technic.handle_machine_upgrades(meta)
|
||||
end
|
||||
if data.tube then
|
||||
technic.handle_machine_pipeworks(pos, tube_upgrade)
|
||||
end
|
||||
|
||||
local result = technic.get_recipe(typename, inv:get_list("src"))
|
||||
|
||||
if not result then
|
||||
technic.swap_node(pos, machine_node)
|
||||
meta:set_string("infotext", S("%s Idle"):format(machine_desc_tier))
|
||||
meta:set_int(tier.."_EU_demand", 0)
|
||||
return
|
||||
end
|
||||
|
||||
if eu_input < machine_demand[EU_upgrade+1] then
|
||||
-- Unpowered - go idle
|
||||
technic.swap_node(pos, machine_node)
|
||||
meta:set_string("infotext", S("%s Unpowered"):format(machine_desc_tier))
|
||||
elseif eu_input >= machine_demand[EU_upgrade+1] then
|
||||
-- Powered
|
||||
technic.swap_node(pos, machine_node.."_active")
|
||||
meta:set_string("infotext", S("%s Active"):format(machine_desc_tier))
|
||||
|
||||
meta:set_int("src_time", meta:get_int("src_time") + 1)
|
||||
if meta:get_int("src_time") >= result.time / data.speed then
|
||||
meta:set_int("src_time", 0)
|
||||
local result_stack = ItemStack(result.output)
|
||||
if inv:room_for_item("dst", result_stack) then
|
||||
inv:set_list("src", result.new_input)
|
||||
inv:add_item("dst", result_stack)
|
||||
end
|
||||
end
|
||||
end
|
||||
meta:set_int(tier.."_EU_demand", machine_demand[EU_upgrade+1])
|
||||
end
|
||||
technic_run = run,
|
||||
technic_disabled_machine_name = "technic:"..ltier.."_"..machine_name,
|
||||
})
|
||||
|
||||
technic.register_machine(tier, "technic:"..ltier.."_"..machine_name, technic.receiver)
|
||||
|
@ -5,11 +5,42 @@ function technic.register_solar_array(data)
|
||||
local tier = data.tier
|
||||
local ltier = string.lower(tier)
|
||||
|
||||
local run = function(pos, node)
|
||||
-- The action here is to make the solar array produce power
|
||||
-- Power is dependent on the light level and the height above ground
|
||||
-- There are many ways to cheat by using other light sources like lamps.
|
||||
-- As there is no way to determine if light is sunlight that is just a shame.
|
||||
-- To take care of some of it solar panels do not work outside daylight hours or if
|
||||
-- built below 0m
|
||||
local pos1 = {}
|
||||
local machine_name = S("Arrayed Solar %s Generator"):format(tier)
|
||||
pos1.y = pos.y + 1
|
||||
pos1.x = pos.x
|
||||
pos1.z = pos.z
|
||||
local light = minetest.get_node_light(pos1, nil)
|
||||
local time_of_day = minetest.get_timeofday()
|
||||
local meta = minetest.get_meta(pos)
|
||||
light = light or 0
|
||||
|
||||
-- turn on array only during day time and if sufficient light
|
||||
-- I know this is counter intuitive when cheating by using other light sources.
|
||||
if light >= 12 and time_of_day >= 0.24 and time_of_day <= 0.76 and pos.y > 0 then
|
||||
local charge_to_give = math.floor((light + pos.y) * data.power)
|
||||
charge_to_give = math.max(charge_to_give, 0)
|
||||
charge_to_give = math.min(charge_to_give, data.power * 50)
|
||||
meta:set_string("infotext", S("%s Active"):format(machine_name).." ("..charge_to_give.."EU)")
|
||||
meta:set_int(tier.."_EU_supply", charge_to_give)
|
||||
else
|
||||
meta:set_string("infotext", S("%s Idle"):format(machine_name))
|
||||
meta:set_int(tier.."_EU_supply", 0)
|
||||
end
|
||||
end
|
||||
|
||||
minetest.register_node("technic:solar_array_"..ltier, {
|
||||
tiles = {"technic_"..ltier.."_solar_array_top.png", "technic_"..ltier.."_solar_array_bottom.png",
|
||||
"technic_"..ltier.."_solar_array_side.png", "technic_"..ltier.."_solar_array_side.png",
|
||||
"technic_"..ltier.."_solar_array_side.png", "technic_"..ltier.."_solar_array_side.png"},
|
||||
groups = {snappy=2, choppy=2, oddly_breakable_by_hand=2},
|
||||
groups = {snappy=2, choppy=2, oddly_breakable_by_hand=2, technic_machine=1},
|
||||
sounds = default.node_sound_wood_defaults(),
|
||||
description = S("Arrayed Solar %s Generator"):format(tier),
|
||||
active = false,
|
||||
@ -24,45 +55,7 @@ function technic.register_solar_array(data)
|
||||
local name = minetest.get_node(pos).name
|
||||
meta:set_int(tier.."_EU_supply", 0)
|
||||
end,
|
||||
})
|
||||
|
||||
minetest.register_abm({
|
||||
nodenames = {"technic:solar_array_"..ltier},
|
||||
interval = 1,
|
||||
chance = 1,
|
||||
action = function(pos, node, active_object_count, active_object_count_wider)
|
||||
-- The action here is to make the solar array produce power
|
||||
-- Power is dependent on the light level and the height above ground
|
||||
-- 130m and above is optimal as it would be above cloud level.
|
||||
-- Height gives 1/4 of the effect, light 3/4. Max. effect is 2880EU for the array.
|
||||
-- There are many ways to cheat by using other light sources like lamps.
|
||||
-- As there is no way to determine if light is sunlight that is just a shame.
|
||||
-- To take care of some of it solar panels do not work outside daylight hours or if
|
||||
-- built below -10m
|
||||
local pos1 = {}
|
||||
local machine_name = S("Arrayed Solar %s Generator"):format(tier)
|
||||
pos1.y = pos.y + 1
|
||||
pos1.x = pos.x
|
||||
pos1.z = pos.z
|
||||
local light = minetest.get_node_light(pos1, nil)
|
||||
local time_of_day = minetest.get_timeofday()
|
||||
local meta = minetest.get_meta(pos)
|
||||
light = light or 0
|
||||
|
||||
|
||||
-- turn on array only during day time and if sufficient light
|
||||
-- I know this is counter intuitive when cheating by using other light sources.
|
||||
if light >= 12 and time_of_day >= 0.24 and time_of_day <= 0.76 and pos.y > 0 then
|
||||
local charge_to_give = math.floor((light + pos.y) * data.power)
|
||||
charge_to_give = math.max(charge_to_give, 0)
|
||||
charge_to_give = math.min(charge_to_give, data.power * 50)
|
||||
meta:set_string("infotext", S("%s Active"):format(machine_name).." ("..charge_to_give.."EU)")
|
||||
meta:set_int(tier.."_EU_supply", charge_to_give)
|
||||
else
|
||||
meta:set_string("infotext", S("%s Idle"):format(machine_name))
|
||||
meta:set_int(tier.."_EU_supply", 0)
|
||||
end
|
||||
end,
|
||||
technic_run = run,
|
||||
})
|
||||
|
||||
technic.register_machine(tier, "technic:solar_array_"..ltier, technic.producer)
|
||||
|
Reference in New Issue
Block a user