Optimize electric network operations a little

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

View File

@@ -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

View File

@@ -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)

View File

@@ -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)

View File

@@ -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()