Optimize electric network operations a little

This commit is contained in:
mrkubax10 2025-01-08 22:45:12 +01:00
parent 6e2a3c22cf
commit 752fe4f192
5 changed files with 47 additions and 10 deletions

View File

@ -76,17 +76,16 @@ function industrialtest.api.powerFlow(pos,sides,flowOverride)
transferred=true transferred=true
end end
local def=minetest.registered_nodes[minetest.get_node(endpoint.position).name] local def=minetest.registered_nodes[minetest.get_node(endpoint.position).name]
if def then if def and def._industrialtest_self then
local updateFormspec=def._industrialtest_updateFormspec def._industrialtest_self:updateFormspec(endpoint.position)
if updateFormspec then if def._industrialtest_self.onPowerFlow and transferredPower>0 then
updateFormspec(endpoint.position) def._industrialtest_self:onPowerFlow(endpoint.position,industrialtest.api.getOppositeSide(endpoint.side),transferredPower)
end
local onPowerFlow=def._industrialtest_onPowerFlow
if onPowerFlow and transferredPower>0 then
onPowerFlow(endpoint.position,industrialtest.api.getOppositeSide(endpoint.side),transferredPower)
end end
def._industrialtest_self:triggerIfNeeded(endpoint.position)
else
-- Support for bare definitions that don't use industrialtest pseudo-OOP
minetest.get_node_timer(endpoint.position):start(industrialtest.updateDelay)
end end
minetest.get_node_timer(endpoint.position):start(industrialtest.updateDelay)
if not industrialtest.api.isFullyCharged(endpointMeta) then if not industrialtest.api.isFullyCharged(endpointMeta) then
roomAvailable=true roomAvailable=true
end end

View File

@ -22,6 +22,8 @@ function industrialtest.ActivatedElectricMachine.onTimer(self,pos,elapsed)
return result or result2 return result or result2
end end
industrialtest.ActivatedElectricMachine.canUpdate=industrialtest.ActivatedMachine.canUpdate
industrialtest.ActivatedElectricMachine.register=industrialtest.ActivatedMachine.register industrialtest.ActivatedElectricMachine.register=industrialtest.ActivatedMachine.register
industrialtest.ActivatedElectricMachine.createDefinitionTable=industrialtest.ActivatedMachine.createDefinitionTable industrialtest.ActivatedElectricMachine.createDefinitionTable=industrialtest.ActivatedMachine.createDefinitionTable

View File

@ -16,6 +16,10 @@
industrialtest.ActivatedMachine=table.copy(industrialtest.Machine) industrialtest.ActivatedMachine=table.copy(industrialtest.Machine)
function industrialtest.ActivatedMachine.canUpdate(self,pos)
return self:shouldActivate(pos)
end
function industrialtest.ActivatedMachine.onTimer(self,pos,elapsed) function industrialtest.ActivatedMachine.onTimer(self,pos,elapsed)
local result=industrialtest.Machine.onTimer(self,pos,elapsed) local result=industrialtest.Machine.onTimer(self,pos,elapsed)

View File

@ -116,6 +116,20 @@ function industrialtest.Machine.allowMetadataInventoryPut(self,pos,listname,inde
return industrialtest.Machine.allowMetadataInventoryPut(self,pos,listname,index,stack,player) return industrialtest.Machine.allowMetadataInventoryPut(self,pos,listname,index,stack,player)
end end
function industrialtest.ElectricMachine.requestPower(self,pos)
if not self.hasPowerOutput then
return
end
local meta=minetest.get_meta(pos)
if meta:get_int("industrialtest.powerAmount")<=0 then
return
end
local spaceAvailable,flowTransferred=industrialtest.api.powerFlow(pos)
if (spaceAvailable and meta:get_int("industrialtest.powerAmount")>0) or self:canUpdate(pos) then
minetest.get_node_timer(pos):start(industrialtest.updateDelay)
end
end
function industrialtest.ElectricMachine.powerExchange(self,pos) function industrialtest.ElectricMachine.powerExchange(self,pos)
local meta=minetest.get_meta(pos) local meta=minetest.get_meta(pos)
local shouldRerunTimer=false local shouldRerunTimer=false
@ -124,7 +138,13 @@ function industrialtest.ElectricMachine.powerExchange(self,pos)
local networks=industrialtest.api.isAttachedToNetwork(meta) local networks=industrialtest.api.isAttachedToNetwork(meta)
if networks then if networks then
for _,network in ipairs(networks) do for _,network in ipairs(networks) do
minetest.get_node_timer(network):start(industrialtest.updateDelay) local def=minetest.registered_nodes[minetest.get_node(network).name]
if def and def._industrialtest_self then
def._industrialtest_self:requestPower(network)
else
-- Support for bare definitions that don't use industrialtest pseudo-OOP
minetest.get_node_timer(network):start(industrialtest.updateDelay)
end
end end
end end
shouldRerunTimer=shouldRerunTimer or not industrialtest.api.isFullyCharged(meta) shouldRerunTimer=shouldRerunTimer or not industrialtest.api.isFullyCharged(meta)

View File

@ -60,6 +60,18 @@ function industrialtest.Machine.updateFormspec(self,pos)
meta:set_string("formspec",self:getFormspec(pos)) meta:set_string("formspec",self:getFormspec(pos))
end end
function industrialtest.Machine.canUpdate(self,pos)
return false
end
function industrialtest.Machine.triggerIfNeeded(self,pos)
local timer=minetest.get_node_timer(pos)
if not timer:is_started() and self:canUpdate(pos) then
minetest.debug("updating "..minetest.serialize(pos))
timer:start(industrialtest.updateDelay)
end
end
function industrialtest.Machine.onTimer(self,pos,elapsed) function industrialtest.Machine.onTimer(self,pos,elapsed)
local meta=minetest.get_meta(pos) local meta=minetest.get_meta(pos)
local inv=meta:get_inventory() local inv=meta:get_inventory()