power markers for info tool added
error message for inverter and further improvements
This commit is contained in:
parent
1fac45260e
commit
5ca83a5914
67
basis/mark2.lua
Normal file
67
basis/mark2.lua
Normal file
@ -0,0 +1,67 @@
|
||||
--[[
|
||||
|
||||
TechAge
|
||||
=======
|
||||
|
||||
Copyright (C) 2019 Joachim Stolberg
|
||||
|
||||
GPL v3
|
||||
See LICENSE.txt for more information
|
||||
|
||||
mark.lua:
|
||||
|
||||
]]--
|
||||
|
||||
local marker_region = {}
|
||||
|
||||
function techage.unmark_position(name)
|
||||
if marker_region[name] ~= nil then --marker already exists
|
||||
--wip: make the area stay loaded somehow
|
||||
for _, entity in ipairs(marker_region[name]) do
|
||||
entity:remove()
|
||||
end
|
||||
marker_region[name] = nil
|
||||
end
|
||||
end
|
||||
|
||||
function techage.mark_position(name, pos, nametag, color)
|
||||
local marker = minetest.add_entity(pos, "techage:position_cube")
|
||||
if marker ~= nil then
|
||||
marker:set_nametag_attributes({color = color, text = nametag})
|
||||
marker:get_luaentity().player_name = name
|
||||
if not marker_region[name] then
|
||||
marker_region[name] = {}
|
||||
end
|
||||
marker_region[name][#marker_region[name] + 1] = marker
|
||||
end
|
||||
minetest.after(30, techage.unmark_position, name)
|
||||
end
|
||||
|
||||
minetest.register_entity(":techage:position_cube", {
|
||||
initial_properties = {
|
||||
visual = "cube",
|
||||
textures = {
|
||||
"techage_cube_mark.png",
|
||||
"techage_cube_mark.png",
|
||||
"techage_cube_mark.png",
|
||||
"techage_cube_mark.png",
|
||||
"techage_cube_mark.png",
|
||||
"techage_cube_mark.png",
|
||||
},
|
||||
--use_texture_alpha = true,
|
||||
physical = false,
|
||||
visual_size = {x = 2, y = 2},
|
||||
collisionbox = {-1,-1,-1, 1,1,1},
|
||||
glow = 8,
|
||||
},
|
||||
on_step = function(self, dtime)
|
||||
if marker_region[self.player_name] == nil then
|
||||
self.object:remove()
|
||||
return
|
||||
end
|
||||
end,
|
||||
on_punch = function(self, hitter)
|
||||
techage.unmark_position(self.player_name)
|
||||
end,
|
||||
})
|
||||
|
@ -219,8 +219,9 @@ end
|
||||
function NodeStates:start(pos, mem)
|
||||
local state = mem.techage_state or STOPPED
|
||||
if state ~= RUNNING and state ~= FAULT then
|
||||
if not self.can_start(pos, mem, state) then
|
||||
self:fault(pos, mem)
|
||||
local res = self.can_start(pos, mem, state)
|
||||
if res ~= true then
|
||||
self:fault(pos, mem, res)
|
||||
return false
|
||||
end
|
||||
if not self.has_power(pos, mem, state) then
|
||||
@ -338,8 +339,9 @@ function NodeStates:nopower(pos, mem)
|
||||
return false
|
||||
end
|
||||
|
||||
function NodeStates:fault(pos, mem)
|
||||
function NodeStates:fault(pos, mem, err_string)
|
||||
local state = mem.techage_state or STOPPED
|
||||
err_string = err_string or "fault"
|
||||
if state == RUNNING or state == STOPPED then
|
||||
mem.techage_state = FAULT
|
||||
if self.node_name_passive then
|
||||
@ -347,7 +349,7 @@ function NodeStates:fault(pos, mem)
|
||||
end
|
||||
if self.infotext_name then
|
||||
local number = M(pos):get_string("node_number")
|
||||
M(pos):set_string("infotext", self.infotext_name.." "..number..": fault")
|
||||
M(pos):set_string("infotext", self.infotext_name.." "..number..": "..err_string)
|
||||
end
|
||||
if self.formspec_func then
|
||||
M(pos):set_string("formspec", self.formspec_func(self, pos, mem))
|
||||
|
@ -132,7 +132,7 @@ techage.register_node({"techage:ta4_generator", "techage:ta4_generator_on"}, {
|
||||
local mem = tubelib2.get_mem(pos)
|
||||
if topic == "power" then
|
||||
mem.remote_trigger = 2
|
||||
return techage.power.power_available(pos, mem, 0)
|
||||
return techage.power.power_network_available(pos)
|
||||
elseif topic == "start" then
|
||||
mem.remote_trigger = 2
|
||||
swap_node(pos, "techage:ta4_generator_on")
|
||||
|
1
init.lua
1
init.lua
@ -46,6 +46,7 @@ else
|
||||
dofile(MP.."/basis/command.lua") -- tubelib replacement
|
||||
dofile(MP.."/basis/firebox_lib.lua") -- common firebox functions
|
||||
dofile(MP.."/basis/mark.lua")
|
||||
dofile(MP.."/basis/mark2.lua")
|
||||
dofile(MP.."/basis/assemble.lua")
|
||||
|
||||
-- Main doc
|
||||
|
@ -237,6 +237,25 @@ local function connection_walk(pos, clbk)
|
||||
end
|
||||
end
|
||||
|
||||
-- walk limited by number of nodes and hops
|
||||
local function connection_walk2(pos, max_hops, max_nodes, clbk)
|
||||
local mem = tubelib2.get_mem(pos)
|
||||
mem.interrupted_dirs = mem.interrupted_dirs or {}
|
||||
if clbk then
|
||||
clbk(pos, mem, max_hops)
|
||||
end
|
||||
max_hops = max_hops - 1
|
||||
if max_hops < 0 then return end
|
||||
for out_dir,item in pairs(mem.connections or {}) do
|
||||
if item.pos and not pos_already_reached(item.pos) and
|
||||
not mem.interrupted_dirs[out_dir] then
|
||||
max_nodes = max_nodes - 1
|
||||
if max_nodes < 0 then return end
|
||||
connection_walk2(item.pos, max_hops, max_nodes, clbk)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
-- if no power available
|
||||
local function consumer_turn_off(pos, mem)
|
||||
local pwr = PWR(pos)
|
||||
@ -584,3 +603,23 @@ function techage.power.get_power(start_pos)
|
||||
return sum
|
||||
end
|
||||
|
||||
function techage.power.power_network_available(start_pos)
|
||||
Route = {}
|
||||
NumNodes = 0
|
||||
pos_already_reached(start_pos)
|
||||
local sum = 0
|
||||
connection_walk2(start_pos, 2, 3, function(pos, mem)
|
||||
sum = sum + 1
|
||||
end)
|
||||
return sum > 1
|
||||
end
|
||||
|
||||
function techage.power.mark_nodes(name, start_pos)
|
||||
Route = {}
|
||||
NumNodes = 0
|
||||
pos_already_reached(start_pos)
|
||||
techage.unmark_position(name)
|
||||
connection_walk2(start_pos, 3, 100, function(pos, mem, max_hops)
|
||||
techage.mark_position(name, pos, S(pos).." : "..(4 - max_hops), "#60FF60")
|
||||
end)
|
||||
end
|
||||
|
@ -25,7 +25,38 @@ local power = techage.power
|
||||
local CYCLE_TIME = 2
|
||||
local PWR_PERF = 120
|
||||
|
||||
local function determine_power(pos, mem)
|
||||
local time = minetest.get_timeofday() or 0
|
||||
if time < 6.00/24.00 or time > 18.00/24.00 then
|
||||
mem.ticks = 0
|
||||
mem.max_power = 0
|
||||
return
|
||||
end
|
||||
mem.ticks = mem.ticks or 0
|
||||
if (mem.ticks % 20) == 0 then -- calculate max_power not to often
|
||||
local dir = M(pos):get_int("left_dir")
|
||||
-- We have to use get_connected_node_pos, because the inverter has already
|
||||
-- a AC power connection. An additional DC power connection is not possibe,
|
||||
-- so we have to start the connection_walk on the next node.
|
||||
local pos1 = Solar:get_connected_node_pos(pos, dir)
|
||||
mem.max_power = math.min(PWR_PERF, power.get_power(pos1))
|
||||
else
|
||||
mem.max_power = mem.max_power or 0
|
||||
end
|
||||
mem.ticks = mem.ticks + 1
|
||||
end
|
||||
|
||||
local function determine_power_now(pos, mem)
|
||||
local dir = M(pos):get_int("left_dir")
|
||||
-- We have to use get_connected_node_pos, because the inverter has already
|
||||
-- a AC power connection. An additional DC power connection is not possibe,
|
||||
-- so we have to start the connection_walk on the next node.
|
||||
local pos1 = Solar:get_connected_node_pos(pos, dir)
|
||||
mem.max_power = math.min(PWR_PERF, power.get_power(pos1))
|
||||
end
|
||||
|
||||
local function formspec(self, pos, mem)
|
||||
determine_power_now(pos, mem)
|
||||
local max_power = mem.max_power or 0
|
||||
local delivered = mem.delivered or 0
|
||||
local bar_in = techage.power.formspec_power_bar(max_power, max_power)
|
||||
@ -44,29 +75,9 @@ local function formspec(self, pos, mem)
|
||||
"label[4,2.5;"..delivered.." ku]"
|
||||
end
|
||||
|
||||
local function determine_power(pos, mem)
|
||||
local time = minetest.get_timeofday() or 0
|
||||
if time < 6.00/24.00 or time > 18.00/24.00 then
|
||||
mem.ticks = 0
|
||||
mem.max_power = 0
|
||||
return
|
||||
end
|
||||
if (mem.ticks % 20) == 0 then -- calculate max_power not to often
|
||||
local dir = M(pos):get_int("left_dir")
|
||||
-- We have to use get_connected_node_pos, because the inverter has already
|
||||
-- a AC power connection. An additional DC power connection is not possibe,
|
||||
-- so we have to start the connection_walk on the next node.
|
||||
local pos1 = Solar:get_connected_node_pos(pos, dir)
|
||||
mem.max_power = math.min(PWR_PERF, power.get_power(pos1))
|
||||
else
|
||||
mem.max_power = mem.max_power or 0
|
||||
end
|
||||
mem.ticks = mem.ticks + 1
|
||||
end
|
||||
|
||||
local function can_start(pos, mem, state)
|
||||
determine_power(pos, mem)
|
||||
return mem.max_power > 0
|
||||
return mem.max_power > 0 or "no solar power"
|
||||
end
|
||||
|
||||
local function start_node(pos, mem, state)
|
||||
@ -127,7 +138,7 @@ minetest.register_node("techage:ta4_solar_inverter", {
|
||||
description = S("TA4 Solar Inverter"),
|
||||
tiles = {
|
||||
-- up, down, right, left, back, front
|
||||
"techage_filling_ta4.png^techage_frame_ta4_top.png",
|
||||
"techage_filling_ta4.png^techage_frame_ta4_top.png^techage_appl_arrow.png",
|
||||
"techage_filling_ta4.png^techage_frame_ta4.png",
|
||||
"techage_filling_ta4.png^techage_frame_ta4.png^techage_appl_hole_electric.png",
|
||||
"techage_filling_ta4.png^techage_frame_ta4.png^techage_appl_ta4_cable.png",
|
||||
|
@ -92,6 +92,7 @@ local function read_state(itemstack, user, pointed_thing)
|
||||
end
|
||||
elseif ndef and ndef.description then
|
||||
if ndef.is_power_available then
|
||||
techage.power.mark_nodes(user:get_player_name(), pos)
|
||||
local power = ndef.is_power_available(pos)
|
||||
if power and power.prim_available then
|
||||
local text = "\nGenerators: "..power.prim_available.." ku\nAkkus: "..power.sec_available.." ku\nMachines: "..power.prim_needed.." ku\nNum Nodes: "..power.num_nodes.."\n"
|
||||
|
Loading…
Reference in New Issue
Block a user