Begin implementing more OOP-like design

This commit is contained in:
2024-10-15 16:28:59 +02:00
parent db1d7fe820
commit 52aea868a5
6 changed files with 501 additions and 282 deletions

View File

@@ -33,20 +33,6 @@ industrialtest.internal.mclAfterDigNode=function(pos,oldmeta,lists)
meta:from_table(meta2:to_table())
end
industrialtest.internal.allowMoveToUpgradeSlot=function(pos,toIndex,stack)
local def=minetest.registered_items[stack:get_name()]
if not def or not def.groups or not def.groups._industrialtest_machineUpgrade then
return 0
end
local meta=minetest.get_meta(pos)
local inv=meta:get_inventory()
local targetSlot=inv:get_stack("upgrades",toIndex)
if not targetSlot:is_empty() then
return 0
end
return stack:get_count()
end
industrialtest.internal.chargeFromPowerStorageItem=function(meta,inv)
local shouldRerunTimer=false
local shouldUpdateFormspec=false
@@ -63,228 +49,6 @@ industrialtest.internal.chargeFromPowerStorageItem=function(meta,inv)
return shouldRerunTimer,shouldUpdateFormspec
end
machine.getFormspec=function(pos,config)
local formspec
if industrialtest.mtgAvailable then
formspec={
"formspec_version[4]",
"size[10.8,12]",
"label[0.5,0.5;"..config.displayName.."]",
"list[current_player;main;0.5,6.25;8,1]",
"list[current_player;main;0.5,7.5;8,3;8]",
"listring[current_player;main]",
(config.getFormspec and config.getFormspec(pos) or "")
}
elseif industrialtest.mclAvailable then
formspec={
"size[10.04,12]",
"label[0.25,0.25;"..config.displayName.."]",
"list[current_player;main;0.5,7;9,3;9]",
mcl_formspec.get_itemslot_bg(0.5,7,9,3),
"list[current_player;main;0.5,10.24;9,1]",
mcl_formspec.get_itemslot_bg(0.5,10.24,9,1),
"listring[current_player;main]",
(config.getFormspec and config.getFormspec(pos) or "")
}
end
return table.concat(formspec,"")
end
machine.onConstruct=function(pos,config)
local meta=minetest.get_meta(pos)
local inv=meta:get_inventory()
industrialtest.api.addPowerStorage(meta,config.capacity,config.flow,config.ioConfig)
if config.groups then
if config.groups._industrialtest_hasPowerInput then
local connections=industrialtest.api.getConnections(pos)
for _,conn in ipairs(connections) do
local connectionMeta=minetest.get_meta(conn)
if industrialtest.api.isNetworkMaster(connectionMeta) then
industrialtest.api.createNetworkMapForNode(conn)
minetest.get_node_timer(conn):start(industrialtest.updateDelay)
else
local def=minetest.registered_nodes[minetest.get_node(conn).name]
if def.groups._industrialtest_cable then
local networks=industrialtest.api.isAttachedToNetwork(connectionMeta)
if networks then
for _,network in ipairs(networks) do
industrialtest.api.createNetworkMapForNode(network)
minetest.get_node_timer(network):start(industrialtest.updateDelay)
end
end
end
end
end
end
if config.groups._industrialtest_hasPowerOutput then
meta:set_string("industrialtest.network",minetest.serialize(industrialtest.api.createNetworkMap(pos)))
end
end
if config.onConstruct then
config.onConstruct(pos,meta,inv)
end
if not config.withoutFormspec then
meta:set_string("formspec",machine.getFormspec(pos,config))
end
minetest.get_node_timer(pos):start(industrialtest.updateDelay)
end
machine.onDestruct=function(pos,config)
local meta=minetest.get_meta(pos)
if industrialtest.api.isNetworkMaster(meta) then
local network=industrialtest.api.createNetworkMap(pos,true)
for _,endpoint in ipairs(network) do
local endpointMeta=minetest.get_meta(endpoint.position)
local networks=industrialtest.api.isAttachedToNetwork(endpointMeta)
for key,value in ipairs(networks) do
if value.x==pos.x and value.y==pos.y and value.z==pos.z then
table.remove(networks,key)
break
end
end
endpointMeta:set_string("industrialtest.networks",minetest.serialize(networks))
end
end
local networks=industrialtest.api.isAttachedToNetwork(meta)
if networks then
for _,network in ipairs(networks) do
industrialtest.api.removeNodeFromNetwork(network,pos)
end
end
if config.onDestruct then
config.onDestruct(pos)
end
end
machine.onTimer=function(pos,elapsed,config)
local meta=minetest.get_meta(pos)
local inv=meta:get_inventory()
local shouldRerunTimer=false
local shouldUpdateFormspec=false
if config.onTimer then
shouldRerunTimer,shouldUpdateFormspec=config.onTimer(pos,elapsed,meta,inv)
end
local def=minetest.registered_nodes[minetest.get_node(pos).name]
if def.groups and def.groups._industrialtest_hasPowerInput and not industrialtest.api.isFullyCharged(meta) then
local networks=industrialtest.api.isAttachedToNetwork(meta)
if networks then
for _,network in ipairs(networks) do
minetest.get_node_timer(network):start(industrialtest.updateDelay)
end
end
end
if shouldUpdateFormspec then
machine.updateFormspec(pos,config)
end
return shouldRerunTimer
end
machine.allowMetadataInventoryMove=function(pos,fromList,fromIndex,toList,toIndex,count,config)
local meta=minetest.get_meta(pos)
local inv=meta:get_inventory()
local movedItemStack=inv:get_stack(fromList,1)
if toList=="upgrades" then
return industrialtest.internal.allowMoveToUpgradeSlot(pos,toIndex,movedItemStack)
end
local found=false
if config.powerSlots then
for _,value in ipairs(config.powerSlots) do
if value==toList then
found=true
break
end
end
end
if found and not industrialtest.api.hasPowerStorage(movedItemStack:get_meta()) then
return 0
end
if config.allowMetadataInventoryMove then
return config.allowMetadataInventoryMove(pos,fromList,fromIndex,toList,toIndex,count)
end
return count
end
machine.allowMetadataInventoryPut=function(pos,listname,index,stack,player,config)
if listname=="upgrades" then
return industrialtest.internal.allowMoveToUpgradeSlot(pos,index,stack)
end
local found=false
if config.powerSlots then
for _,value in ipairs(config.powerSlots) do
if value==listname then
found=true
break
end
end
end
if found and not industrialtest.api.hasPowerStorage(stack:get_meta()) then
return 0
end
if config.allowMetadataInventoryPut then
return config.allowMetadataInventoryPut(pos,listname,index,stack,player)
end
return stack:get_count()
end
machine.allowMetadataInventoryTake=function(pos,listname,index,stack,player,config)
if config.allowMetadataInventoryTake then
return config.allowMetadataInventoryTake(pos,listname,index,stack,player)
end
return stack:get_count()
end
machine.onMetadataInventoryMove=function(pos,fromList,fromIndex,toList,toIndex,count)
if toList=="upgrades" then
local meta=minetest.get_meta(pos)
local inv=meta:get_inventory()
local stack=inv:get_stack(fromList,fromIndex)
industrialtest.internal.applyUpgrade(pos,meta,stack)
elseif fromList=="upgrades" then
local meta=minetest.get_meta(pos)
local inv=meta:get_inventory()
local stack=inv:get_stack(fromList,fromIndex)
industrialtest.internal.removeUpgrade(pos,meta,stack)
end
end
machine.onMetadataInventoryPut=function(pos,listname,index,stack)
if listname=="upgrades" then
local meta=minetest.get_meta(pos)
industrialtest.internal.applyUpgrade(pos,meta,stack)
end
end
machine.onMetadataInventoryTake=function(pos,listname,index,stack)
if listname=="upgrades" then
local meta=minetest.get_meta(pos)
industrialtest.internal.removeUpgrade(pos,meta,stack)
end
end
machine.updateFormspec=function(pos,config)
if config.withoutFormspec then
return
end
local meta=minetest.get_meta(pos)
meta:set_string("formspec",machine.getFormspec(pos,config))
end
function industrialtest.internal.registerMachine(config)
local definition={
description=config.displayName,
@@ -335,52 +99,6 @@ function industrialtest.internal.registerMachine(config)
return machine.getFormspec(pos,config)
end
}
if industrialtest.mtgAvailable then
definition.groups={cracky=2}
if config.sounds=="metal" then
definition.sounds=default.node_sound_metal_defaults()
end
definition.can_dig=function(pos)
local meta=minetest.get_meta(pos)
local inv=meta:get_inventory()
for _,value in ipairs(config.storageSlots) do
if inv:get_stack(value,1):get_count()>0 then
return false
end
end
return true
end
elseif industrialtest.mclAvailable then
definition.after_dig_node=function(pos,oldnode,oldmeta)
industrialtest.internal.mclAfterDigNode(pos,oldmeta,config.storageSlots)
end
if config.sounds=="metal" then
definition.sounds=mcl_sounds.node_sound_metal_defaults()
end
definition.groups={
pickaxey=1,
container=2
}
definition._mcl_blast_resistance=3.5
definition._mcl_hardness=3.9
definition._mcl_hoppers_on_try_pull=function(pos, hop_pos, hop_inv, hop_list)
local meta = minetest.get_meta(pos)
local inv = meta:get_inventory()
local stack = inv:get_stack("dst", 1)
if not stack:is_empty() and hop_inv:room_for_item(hop_list, stack) then
return inv, "dst", 1
end
return nil, nil, nil
end
definition._mcl_hoppers_on_try_push=function(pos, hop_pos, hop_inv, hop_list)
local meta = minetest.get_meta(pos)
local inv = meta:get_inventory()
return inv, "src", mcl_util.select_stack(hop_inv, hop_list, inv, "src")
end
definition._mcl_hoppers_on_after_push=function(pos)
minetest.get_node_timer(pos):start(industrialtest.updateDelay)
end
end
definition.groups._industrialtest_wrenchUnmountable=1
if config.requiresWrench then
definition.drop="industrialtest:machine_block"