From 752fe4f1923b67396d71a91909c0a85669ff1ce4 Mon Sep 17 00:00:00 2001 From: mrkubax10 Date: Wed, 8 Jan 2025 22:45:12 +0100 Subject: [PATCH] Optimize electric network operations a little --- api/network.lua | 17 ++++++++--------- machines/activated_electric_machine.lua | 2 ++ machines/activated_machine.lua | 4 ++++ machines/electric_machine.lua | 22 +++++++++++++++++++++- machines/machine.lua | 12 ++++++++++++ 5 files changed, 47 insertions(+), 10 deletions(-) diff --git a/api/network.lua b/api/network.lua index dd9b7e8..922eacd 100644 --- a/api/network.lua +++ b/api/network.lua @@ -76,17 +76,16 @@ function industrialtest.api.powerFlow(pos,sides,flowOverride) transferred=true end local def=minetest.registered_nodes[minetest.get_node(endpoint.position).name] - if def then - local updateFormspec=def._industrialtest_updateFormspec - if updateFormspec then - updateFormspec(endpoint.position) - end - local onPowerFlow=def._industrialtest_onPowerFlow - if onPowerFlow and transferredPower>0 then - onPowerFlow(endpoint.position,industrialtest.api.getOppositeSide(endpoint.side),transferredPower) + if def and def._industrialtest_self then + def._industrialtest_self:updateFormspec(endpoint.position) + if def._industrialtest_self.onPowerFlow and transferredPower>0 then + def._industrialtest_self:onPowerFlow(endpoint.position,industrialtest.api.getOppositeSide(endpoint.side),transferredPower) 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 - minetest.get_node_timer(endpoint.position):start(industrialtest.updateDelay) if not industrialtest.api.isFullyCharged(endpointMeta) then roomAvailable=true end diff --git a/machines/activated_electric_machine.lua b/machines/activated_electric_machine.lua index 39a766a..6a2bb96 100644 --- a/machines/activated_electric_machine.lua +++ b/machines/activated_electric_machine.lua @@ -22,6 +22,8 @@ function industrialtest.ActivatedElectricMachine.onTimer(self,pos,elapsed) return result or result2 end +industrialtest.ActivatedElectricMachine.canUpdate=industrialtest.ActivatedMachine.canUpdate + industrialtest.ActivatedElectricMachine.register=industrialtest.ActivatedMachine.register industrialtest.ActivatedElectricMachine.createDefinitionTable=industrialtest.ActivatedMachine.createDefinitionTable diff --git a/machines/activated_machine.lua b/machines/activated_machine.lua index f6c5553..64d75c7 100644 --- a/machines/activated_machine.lua +++ b/machines/activated_machine.lua @@ -16,6 +16,10 @@ industrialtest.ActivatedMachine=table.copy(industrialtest.Machine) +function industrialtest.ActivatedMachine.canUpdate(self,pos) + return self:shouldActivate(pos) +end + function industrialtest.ActivatedMachine.onTimer(self,pos,elapsed) local result=industrialtest.Machine.onTimer(self,pos,elapsed) diff --git a/machines/electric_machine.lua b/machines/electric_machine.lua index bce4d7a..be1604a 100644 --- a/machines/electric_machine.lua +++ b/machines/electric_machine.lua @@ -116,6 +116,20 @@ function industrialtest.Machine.allowMetadataInventoryPut(self,pos,listname,inde return industrialtest.Machine.allowMetadataInventoryPut(self,pos,listname,index,stack,player) 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) local meta=minetest.get_meta(pos) local shouldRerunTimer=false @@ -124,7 +138,13 @@ function industrialtest.ElectricMachine.powerExchange(self,pos) local networks=industrialtest.api.isAttachedToNetwork(meta) if networks then 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 shouldRerunTimer=shouldRerunTimer or not industrialtest.api.isFullyCharged(meta) diff --git a/machines/machine.lua b/machines/machine.lua index f64f1a5..4cbac68 100644 --- a/machines/machine.lua +++ b/machines/machine.lua @@ -60,6 +60,18 @@ function industrialtest.Machine.updateFormspec(self,pos) meta:set_string("formspec",self:getFormspec(pos)) 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) local meta=minetest.get_meta(pos) local inv=meta:get_inventory()