Compare commits
8 Commits
2.0.0
...
c594ac4743
| Author | SHA1 | Date | |
|---|---|---|---|
| c594ac4743 | |||
| 868dd672b9 | |||
| 7fd2932118 | |||
| fbaf90895c | |||
| 8f286ebcbc | |||
| 8ca2a44070 | |||
| 28ff1aeb22 | |||
| d13d2b9dfd |
@@ -22,6 +22,9 @@ industrialtest.api={
|
||||
geothermalGeneratorFuels={},
|
||||
waterMillFuels={},
|
||||
rotaryMaceratorModifiers={},
|
||||
pumpTargets={},
|
||||
pumpFluids={},
|
||||
compressedFluids={},
|
||||
storageCells={},
|
||||
tags={}
|
||||
}
|
||||
@@ -32,6 +35,8 @@ industrialtest.api.hvPowerFlow=10200
|
||||
industrialtest.api.evPowerFlow=40800
|
||||
industrialtest.api.ivPowerFlow=163800
|
||||
|
||||
industrialtest.api.nodeFluidCapacity=1000
|
||||
|
||||
function industrialtest.internal.clamp(num,min,max)
|
||||
return math.max(math.min(num,max),min)
|
||||
end
|
||||
|
||||
@@ -25,6 +25,16 @@ local function createItemFluidStorageText(itemstack)
|
||||
return minetest.colorize(color,S("@1 / @2 mB",fluidAmount,fluidCapacity))
|
||||
end
|
||||
|
||||
-- \brief Adds fluid storage to node metadata
|
||||
-- \param meta MetaDataRef
|
||||
-- \param capacity number
|
||||
-- \returns nil
|
||||
function industrialtest.api.addFluidStorage(meta,capacity)
|
||||
meta:set_int("industrialtest.fluidCapacity",capacity)
|
||||
meta:set_int("industrialtest.fluidAmount",0)
|
||||
meta:set_string("industrialtest.fluidType","ignore")
|
||||
end
|
||||
|
||||
-- \brief Check if itemstack contains fluid storage
|
||||
-- \param itemstack ItemStack
|
||||
-- \returns bool
|
||||
|
||||
@@ -307,6 +307,65 @@ function industrialtest.api.getRotaryMaceratorModifier(name,modifier)
|
||||
return industrialtest.api.rotaryMaceratorModifiers[name.." "..modifier]
|
||||
end
|
||||
|
||||
-- \brief Registers target node with which Pump can interact
|
||||
-- \param name string
|
||||
-- \param fluidNodes table
|
||||
-- \param direction string
|
||||
-- \return nil
|
||||
function industrialtest.api.registerPumpTarget(name,direction)
|
||||
industrialtest.api.pumpTargets[name]={
|
||||
name=name,
|
||||
direction=direction
|
||||
}
|
||||
end
|
||||
|
||||
-- \brief Returns Pump target info
|
||||
-- \param name string
|
||||
-- \returns table
|
||||
function industrialtest.api.getPumpTarget(name)
|
||||
return industrialtest.api.pumpTargets[name]
|
||||
end
|
||||
|
||||
-- \brief Registers fluid node which can be pumped by pump
|
||||
-- \param name string
|
||||
-- \param texture string
|
||||
-- \returns nil
|
||||
function industrialtest.api.registerPumpFluid(name,texture)
|
||||
industrialtest.api.pumpFluids[name]={
|
||||
name=name,
|
||||
texture=texture
|
||||
}
|
||||
end
|
||||
|
||||
-- \brief Returns registered node which can be pumped by pump
|
||||
-- \param name string
|
||||
-- \returns table
|
||||
function industrialtest.api.getPumpFluid(name)
|
||||
return industrialtest.api.pumpFluids[name]
|
||||
end
|
||||
|
||||
-- \brief Registers fluid which can be pumped into compressor resulting with different item
|
||||
-- \param fluidType string
|
||||
-- \param requiredAmount number
|
||||
-- \param time number
|
||||
-- \param result string
|
||||
-- \returns nil
|
||||
function industrialtest.api.registerCompressedFluid(fluidType,requiredAmount,time,result)
|
||||
industrialtest.api.compressedFluids[fluidType]={
|
||||
fluidType=fluidType,
|
||||
requiredAmount=requiredAmount,
|
||||
time=time,
|
||||
result=result
|
||||
}
|
||||
end
|
||||
|
||||
-- \brief Returns information about fluid which can be pumped into compressor resulting with different item
|
||||
-- \param fluidType string
|
||||
-- \returns table
|
||||
function industrialtest.api.getCompressedFluid(fluidType)
|
||||
return industrialtest.api.compressedFluids[fluidType]
|
||||
end
|
||||
|
||||
minetest.register_on_mods_loaded(function()
|
||||
for _,def in pairs(industrialtest.api.rotaryMaceratorModifiers) do
|
||||
if def.stackLeftover then
|
||||
|
||||
@@ -533,6 +533,9 @@ minetest.register_craftitem("industrialtest:empty_cell",{
|
||||
description=S("Empty Cell"),
|
||||
inventory_image="industrialtest_empty_cell.png",
|
||||
liquids_pointable=true,
|
||||
groups={
|
||||
_industrialtest_simpleFluidStorage=1
|
||||
},
|
||||
on_place=function(itemstack,user,pointed)
|
||||
if pointed.type~="node" or not user or not user:is_player() then
|
||||
return nil
|
||||
@@ -554,7 +557,9 @@ minetest.register_craftitem("industrialtest:empty_cell",{
|
||||
end
|
||||
minetest.remove_node(pointed.under)
|
||||
return itemstack
|
||||
end
|
||||
end,
|
||||
_industrialtest_getResultingFluidStorageItemByNode=industrialtest.api.getStorageCellByNode,
|
||||
_industrialtest_simpleFluidStorageCapacity=1000
|
||||
})
|
||||
minetest.register_craft({
|
||||
type="shaped",
|
||||
|
||||
@@ -125,3 +125,12 @@ if industrialtest.mtgAvailable then
|
||||
}
|
||||
})
|
||||
end
|
||||
|
||||
-- Pumped fluids
|
||||
if industrialtest.mtgAvailable then
|
||||
industrialtest.api.registerPumpFluid("default:river_water_source","industrialtest_gui_river_water.png")
|
||||
industrialtest.api.registerCompressedFluid("default:river_water_source",industrialtest.api.nodeFluidCapacity/2,5,"default:snow")
|
||||
end
|
||||
industrialtest.api.registerPumpFluid(industrialtest.elementKeys.waterSource,"industrialtest_gui_water.png")
|
||||
industrialtest.api.registerPumpFluid(industrialtest.elementKeys.lavaSource,"industrialtest_gui_lava.png")
|
||||
industrialtest.api.registerCompressedFluid(industrialtest.elementKeys.waterSource,industrialtest.api.nodeFluidCapacity/2,5,industrialtest.elementKeys.snowball)
|
||||
|
||||
1
init.lua
1
init.lua
@@ -60,6 +60,7 @@ dofile(modpath.."/machines/mass_fabricator.lua")
|
||||
dofile(modpath.."/machines/miner.lua")
|
||||
dofile(modpath.."/machines/nuclear_reactor.lua")
|
||||
dofile(modpath.."/machines/power_storage.lua")
|
||||
dofile(modpath.."/machines/pump.lua")
|
||||
dofile(modpath.."/machines/recycler.lua")
|
||||
dofile(modpath.."/machines/rotary_macerator.lua")
|
||||
dofile(modpath.."/machines/tool_workshop.lua")
|
||||
|
||||
@@ -62,8 +62,38 @@ function industrialtest.Compressor.getCraftResult(self,itemstack)
|
||||
}
|
||||
end
|
||||
|
||||
function industrialtest.Compressor.canPushFluid(self,pos,fluidType,fluidAmount)
|
||||
local meta=minetest.get_meta(pos)
|
||||
local compressedFluid=industrialtest.api.getCompressedFluid(fluidType)
|
||||
if not self.isRecipeOverride(meta) and compressedFluid and fluidAmount>=compressedFluid.requiredAmount then
|
||||
local inv=meta:get_inventory()
|
||||
local resultingStack=ItemStack(compressedFluid.result)
|
||||
if inv:room_for_item("dst",resultingStack) then
|
||||
return true
|
||||
end
|
||||
end
|
||||
return false
|
||||
end
|
||||
|
||||
-- Called by Pump when Compressor is next to it while it tries to push fluid
|
||||
function industrialtest.Compressor.onPumpFluidPush(self,pos,pumpPos,fluidType,fluidAmount)
|
||||
local compressedFluid=industrialtest.api.getCompressedFluid(fluidType)
|
||||
if compressedFluid then
|
||||
local meta=minetest.get_meta(pos)
|
||||
-- If recipe can be overriden keep information about this in meta so it's picked up by superclass
|
||||
meta:set_string("recipeOverride",compressedFluid.result)
|
||||
meta:set_int("recipeOverrideMaxTime",compressedFluid.time)
|
||||
fluidAmount=fluidAmount-compressedFluid.requiredAmount
|
||||
self:triggerIfNeeded(pos)
|
||||
end
|
||||
return fluidAmount
|
||||
end
|
||||
|
||||
industrialtest.Compressor:register()
|
||||
|
||||
industrialtest.api.registerPumpTarget("industrialtest:compressor","o")
|
||||
industrialtest.api.registerPumpTarget("industrialtest:compressor_active","o")
|
||||
|
||||
minetest.register_craft({
|
||||
type="shaped",
|
||||
output="industrialtest:compressor",
|
||||
|
||||
@@ -166,6 +166,8 @@ function industrialtest.Miner.onConstruct(self,pos)
|
||||
inv:set_size("powerStorage",1)
|
||||
inv:set_size("upgrades",1)
|
||||
meta:set_int("level",pos.y-1)
|
||||
-- Keep last fluid node here so pump has more time to access it
|
||||
meta:set_string("lastFluidNode","")
|
||||
industrialtest.ElectricMachine.onConstruct(self,pos)
|
||||
end
|
||||
|
||||
@@ -283,6 +285,14 @@ function industrialtest.Miner.update(self,pos,elapsed,meta,inv)
|
||||
srcSlot:take_item(1)
|
||||
inv:set_stack("src",1,srcSlot)
|
||||
local targetPos=vector.new(pos.x,level,pos.z)
|
||||
|
||||
-- Check if target node is fluid so pump, if attached, can get it
|
||||
local targetNode=minetest.get_node(targetPos)
|
||||
local targetFluid=industrialtest.api.getPumpFluid(targetNode.name)
|
||||
if targetFluid then
|
||||
meta:set_string("lastFluidNode",targetNode.name)
|
||||
end
|
||||
|
||||
local drop=self.getNodeDrop(targetPos)
|
||||
self.placeMiningPipe(pos,targetPos)
|
||||
inv:add_item("dst",drop)
|
||||
@@ -375,8 +385,27 @@ function industrialtest.Miner.placeMiningPipe(minerPos,pos)
|
||||
meta:set_string("miner",minetest.serialize(minerPos))
|
||||
end
|
||||
|
||||
function industrialtest.Miner.pullFluid(self,pos,amount)
|
||||
local meta=minetest.get_meta(pos)
|
||||
local lastFluidNode=meta:get_string("lastFluidNode")
|
||||
if lastFluidNode~="" then
|
||||
local result={
|
||||
fluidType=lastFluidNode
|
||||
}
|
||||
result.remaining=industrialtest.api.nodeFluidCapacity
|
||||
-- If everything was pulled then change to empty
|
||||
if amount>=industrialtest.api.nodeFluidCapacity then
|
||||
meta:set_string("lastFluidNode","")
|
||||
end
|
||||
return result
|
||||
end
|
||||
return nil
|
||||
end
|
||||
|
||||
industrialtest.Miner:register()
|
||||
|
||||
industrialtest.api.registerPumpTarget("industrialtest:miner","i")
|
||||
|
||||
minetest.register_craft({
|
||||
type="shaped",
|
||||
output="industrialtest:miner",
|
||||
|
||||
407
machines/pump.lua
Normal file
407
machines/pump.lua
Normal file
@@ -0,0 +1,407 @@
|
||||
-- IndustrialTest
|
||||
-- Copyright (C) 2025 mrkubax10
|
||||
|
||||
-- This program is free software: you can redistribute it and/or modify
|
||||
-- it under the terms of the GNU General Public License as published by
|
||||
-- the Free Software Foundation, either version 3 of the License, or
|
||||
-- (at your option) any later version.
|
||||
|
||||
-- This program is distributed in the hope that it will be useful,
|
||||
-- but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
-- GNU General Public License for more details.
|
||||
|
||||
-- You should have received a copy of the GNU General Public License
|
||||
-- along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
local S=minetest.get_translator("industrialtest")
|
||||
industrialtest.Pump=table.copy(industrialtest.ActivatedElectricMachine)
|
||||
industrialtest.internal.unpackTableInto(industrialtest.Pump,{
|
||||
name="industrialtest:pump",
|
||||
description=S("Pump"),
|
||||
tiles={
|
||||
"industrialtest_machine_block.png",
|
||||
"industrialtest_machine_block.png",
|
||||
"industrialtest_machine_block.png^industrialtest_pump_side.png",
|
||||
"industrialtest_machine_block.png",
|
||||
"industrialtest_machine_block.png",
|
||||
"industrialtest_machine_block.png^industrialtest_pump_front.png"
|
||||
},
|
||||
sounds="metal",
|
||||
facedir=true,
|
||||
storageLists={
|
||||
"src",
|
||||
"dst",
|
||||
"powerStorage"
|
||||
},
|
||||
powerLists={
|
||||
{
|
||||
list="powerStorage",
|
||||
direction="i"
|
||||
}
|
||||
},
|
||||
active={
|
||||
tiles={
|
||||
"industrialtest_machine_block.png",
|
||||
"industrialtest_machine_block.png",
|
||||
"industrialtest_machine_block.png^industrialtest_pump_side.png",
|
||||
"industrialtest_machine_block.png",
|
||||
"industrialtest_machine_block.png",
|
||||
"industrialtest_machine_block.png^industrialtest_pump_front_active.png"
|
||||
}
|
||||
},
|
||||
capacity=industrialtest.api.lvPowerFlow*2,
|
||||
flow=industrialtest.api.lvPowerFlow,
|
||||
ioConfig="iiiiii",
|
||||
requiresWrench=true,
|
||||
hasPowerInput=true,
|
||||
_fluidCapacity=5000,
|
||||
_opPower=300,
|
||||
_pumpTime=10
|
||||
})
|
||||
|
||||
function industrialtest.Pump.onConstruct(self,pos)
|
||||
local meta=minetest.get_meta(pos)
|
||||
local inv=meta:get_inventory()
|
||||
inv:set_size("src",1)
|
||||
inv:set_size("dst",1)
|
||||
inv:set_size("powerStorage",1)
|
||||
meta:set_float("srcTime",0)
|
||||
industrialtest.api.addFluidStorage(meta,self._fluidCapacity)
|
||||
self.determinePumpTargets(pos)
|
||||
industrialtest.ActivatedElectricMachine.onConstruct(self,pos)
|
||||
end
|
||||
|
||||
function industrialtest.Pump.getFormspec(self,pos)
|
||||
local parentFormspec=industrialtest.ActivatedElectricMachine.getFormspec(self,pos)
|
||||
local meta=minetest.get_meta(pos)
|
||||
local powerPercent=meta:get_int("industrialtest.powerAmount")/meta:get_int("industrialtest.powerCapacity")*100
|
||||
local srcPercent=meta:get_float("srcTime")/self._pumpTime*100
|
||||
local fluidType=meta:get_string("industrialtest.fluidType")
|
||||
local fluidPercent=0
|
||||
if meta:contains("industrialtest.fluidAmount") and meta:contains("industrialtest.fluidCapacity") then
|
||||
fluidPercent=meta:get_int("industrialtest.fluidAmount")/meta:get_int("industrialtest.fluidCapacity")*100
|
||||
end
|
||||
local pumpFluid=industrialtest.api.getPumpFluid(fluidType)
|
||||
local tile=(pumpFluid and pumpFluid.texture or "industrialtest_gui_fluid_bg.png")
|
||||
local formspec={
|
||||
"list[context;src;3.2,1.7;1,1]",
|
||||
industrialtest.internal.getItemSlotBg(3.2,1.7,1,1),
|
||||
"list[context;dst;4.6,1.7;1,1]",
|
||||
industrialtest.internal.getItemSlotBg(4.6,1.7,1,1),
|
||||
"list[context;powerStorage;3.9,3.7;1,1]",
|
||||
industrialtest.internal.getItemSlotBg(3.9,3.7,1,1),
|
||||
(powerPercent>0 and "image[3.9,2.7;1,1;industrialtest_gui_electricity_bg.png^[lowpart:"..powerPercent..":industrialtest_gui_electricity_fg.png]"
|
||||
or "image[3.9,2.7;1,1;industrialtest_gui_electricity_bg.png]"),
|
||||
(srcPercent>0 and "image[6.7,2.7;1,1;gui_furnace_arrow_bg.png^[lowpart:"..srcPercent..":gui_furnace_arrow_fg.png]"
|
||||
or "image[6.7,2.7;1,1;gui_furnace_arrow_bg.png]"),
|
||||
(fluidPercent>0 and "image[7.7,2.7;1,1;industrialtest_gui_fluid_bg.png^[lowpart:"..fluidPercent..":"..tile.."]" or "image[7.7,2.7;1,1;industrialtest_gui_fluid_bg.png]"),
|
||||
"label[3.2,1.5;"..S("Input").."]",
|
||||
"label[4.6,1.5;"..S("Output").."]",
|
||||
"listring[context;src]",
|
||||
"listring[context;dst]"
|
||||
}
|
||||
return parentFormspec..table.concat(formspec,"")
|
||||
end
|
||||
|
||||
function industrialtest.Pump.allowMetadataInventoryMove(self,pos,fromList,fromIndex,toList,count)
|
||||
if toList=="dst" then
|
||||
return 0
|
||||
end
|
||||
return industrialtest.ActivatedElectricMachine.allowMetadataInventoryMove(self,pos,fromList,fromIndex,toList,count)
|
||||
end
|
||||
|
||||
function industrialtest.Pump.allowMetadataInventoryPut(self,pos,listname,index,stack,player)
|
||||
if listname=="dst" then
|
||||
return 0
|
||||
end
|
||||
return industrialtest.ActivatedElectricMachine.allowMetadataInventoryPut(self,pos,listname,index,stack,player)
|
||||
end
|
||||
|
||||
function industrialtest.Pump.allowMetadataInventoryTake(self,pos,listname,index,stack,player)
|
||||
if listname=="src" then
|
||||
local meta=minetest.get_meta(pos)
|
||||
local inv=meta:get_inventory()
|
||||
local srcSlot=inv:get_stack("src",1)
|
||||
if stack:get_count()==srcSlot:get_count() and not meta:get_int("hasOutputTarget") then
|
||||
meta:set_float("srcTime",0)
|
||||
self:updateFormspec(pos)
|
||||
end
|
||||
end
|
||||
return industrialtest.ActivatedElectricMachine.allowMetadataInventoryTake(self,pos,listname,index,stack,player)
|
||||
end
|
||||
|
||||
function industrialtest.Pump.onMetadataInventoryMove(self,pos,fromList,fromIndex,toList,toIndex,count)
|
||||
if fromList=="src" then
|
||||
local meta=minetest.get_meta(pos)
|
||||
local inv=meta:get_inventory()
|
||||
local srcSlot=inv:get_stack("src",1)
|
||||
if count==srcSlot:get_count() and not meta:get_int("hasOutputTarget") then
|
||||
meta:set_float("srcTime",0)
|
||||
self:updateFormspec(pos)
|
||||
end
|
||||
elseif toList=="src" then
|
||||
self:triggerIfNeeded(pos)
|
||||
end
|
||||
industrialtest.ActivatedElectricMachine.onMetadataInventoryMove(self,pos,fromList,fromIndex,toList,toIndex,count)
|
||||
end
|
||||
|
||||
function industrialtest.Pump.onMetadataInventoryPut(self,pos,listname,index,stack)
|
||||
if listname=="src" then
|
||||
self:triggerIfNeeded(pos)
|
||||
end
|
||||
industrialtest.ActivatedElectricMachine.onMetadataInventoryPut(self,pos,listname,index,stack)
|
||||
end
|
||||
|
||||
function industrialtest.Miner.onMetadataInventoryTake(self,pos,listname,index,stack)
|
||||
if listname=="dst" then
|
||||
self:triggerIfNeeded(pos)
|
||||
end
|
||||
end
|
||||
|
||||
function industrialtest.Pump.shouldActivate(self,pos)
|
||||
local meta=minetest.get_meta(pos)
|
||||
if meta:get_int("industrialtest.powerAmount")<self._opPower then
|
||||
return false
|
||||
end
|
||||
|
||||
local hasInput=false
|
||||
local nodeUnder=minetest.get_node(vector.offset(pos,0,-1,0))
|
||||
local fluidAmount=meta:get_int("industrialtest.fluidAmount")
|
||||
if fluidAmount>0 then
|
||||
hasInput=true
|
||||
else
|
||||
-- Check if there is node that can be pumped under pump
|
||||
if industrialtest.api.getPumpFluid(nodeUnder.name) then
|
||||
hasInput=true
|
||||
end
|
||||
end
|
||||
|
||||
-- Check if any input target can provide with fluid
|
||||
if not hasInput and meta:get_int("hasInputTarget")>0 then
|
||||
local polledTargets=self.pollInputTargets(pos)
|
||||
hasInput=#polledTargets>0
|
||||
end
|
||||
|
||||
if not hasInput then
|
||||
return false
|
||||
end
|
||||
|
||||
local hasOutput=false
|
||||
-- First check if pump can push into any neighour node
|
||||
if meta:get_int("hasOutputTarget") then
|
||||
local outputTargets=minetest.deserialize(meta:get_string("outputTargets"))
|
||||
for _,target in ipairs(outputTargets) do
|
||||
local node=minetest.get_node(target)
|
||||
local def=minetest.registered_nodes[node.name]
|
||||
hasOutput=(def and def._industrialtest_self and def._industrialtest_self:canPushFluid(target,nodeUnder.name,fluidAmount))
|
||||
if hasOutput then
|
||||
break
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
-- Check if it's possible to pump fluid into item
|
||||
if not hasOutput then
|
||||
local inv=meta:get_inventory()
|
||||
local srcSlot=inv:get_stack("src",1)
|
||||
if not srcSlot:is_empty() then
|
||||
local def=srcSlot:get_definition()
|
||||
if def.groups._industrialtest_simpleFluidStorage and def._industrialtest_simpleFluidStorageCapacity and fluidAmount>=def._industrialtest_simpleFluidStorageCapacity and
|
||||
def._industrialtest_getResultingFluidStorageItemByNode then
|
||||
local fluidType=meta:get_string("industrialtest.fluidType")
|
||||
local resulting=def._industrialtest_getResultingFluidStorageItemByNode(fluidType)
|
||||
if resulting then
|
||||
local dstSlot=inv:get_stack("dst",1)
|
||||
hasOutput=dstSlot:item_fits(ItemStack(resulting.name))
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
-- Check if pump storage is not full
|
||||
if not hasOutput then
|
||||
local fluidCapacity=meta:get_int("industrialtest.fluidCapacity")
|
||||
hasOutput=fluidCapacity-fluidAmount>=industrialtest.api.nodeFluidCapacity
|
||||
end
|
||||
|
||||
return hasOutput
|
||||
end
|
||||
|
||||
function industrialtest.Pump.shouldDeactivate(self,pos)
|
||||
return not self:shouldActivate(pos)
|
||||
end
|
||||
|
||||
function industrialtest.Pump.afterDeactivation(self,pos)
|
||||
-- If machine was deactivated then make sure to update formspec
|
||||
local meta=minetest.get_meta(pos)
|
||||
meta:set_float("srcTime",0)
|
||||
self:updateFormspec(pos)
|
||||
end
|
||||
|
||||
function industrialtest.Pump.activeUpdate(self,pos,elapsed,meta,inv)
|
||||
local nodeUnderPos=vector.offset(pos,0,-1,0)
|
||||
local nodeUnder=minetest.get_node(nodeUnderPos)
|
||||
local fluidAmount=meta:get_int("industrialtest.fluidAmount")
|
||||
local fluidCapacity=meta:get_int("industrialtest.fluidCapacity")
|
||||
local shouldUpdateFormspec=false
|
||||
|
||||
-- First try to pump fluid under
|
||||
-- Check if there is node that can be pumped under pump
|
||||
if fluidCapacity-fluidAmount>=industrialtest.api.nodeFluidCapacity and industrialtest.api.getPumpFluid(nodeUnder.name) then
|
||||
local srcTime=meta:get_float("srcTime")+elapsed*industrialtest.api.getMachineSpeed(meta)
|
||||
if srcTime>=self._pumpTime then
|
||||
fluidAmount=fluidAmount+industrialtest.api.nodeFluidCapacity
|
||||
meta:set_string("industrialtest.fluidType",nodeUnder.name)
|
||||
meta:set_int("industrialtest.fluidAmount",fluidAmount)
|
||||
minetest.remove_node(nodeUnderPos)
|
||||
srcTime=0
|
||||
end
|
||||
industrialtest.api.addPower(meta,-self._opPower)
|
||||
meta:set_float("srcTime",srcTime)
|
||||
shouldUpdateFormspec=true
|
||||
end
|
||||
|
||||
if meta:get_int("hasInputTarget")>0 then
|
||||
local polledTargets=self.pollInputTargets(pos)
|
||||
local fluidType=meta:get_string("industrialtest.fluidType")
|
||||
for _,target in ipairs(polledTargets) do
|
||||
local moved=math.min(fluidCapacity-fluidAmount,target.fluidInfo.remaining)
|
||||
fluidAmount=fluidAmount+moved
|
||||
target.pullFluid(moved)
|
||||
meta:set_string("industrialtest.fluidType",target.fluidInfo.fluidType)
|
||||
shouldUpdateFormspec=true
|
||||
if fluidCapacity-fluidAmount<=0 then
|
||||
break
|
||||
end
|
||||
end
|
||||
meta:set_int("industrialtest.fluidAmount",fluidAmount)
|
||||
end
|
||||
|
||||
-- Try to push fluid into item if available
|
||||
local inv=meta:get_inventory()
|
||||
local srcSlot=inv:get_stack("src",1)
|
||||
if not srcSlot:is_empty() then
|
||||
local def=srcSlot:get_definition()
|
||||
if def.groups._industrialtest_simpleFluidStorage and def._industrialtest_simpleFluidStorageCapacity and fluidAmount>=def._industrialtest_simpleFluidStorageCapacity and
|
||||
def._industrialtest_getResultingFluidStorageItemByNode then
|
||||
local fluidType=meta:get_string("industrialtest.fluidType")
|
||||
local resulting=def._industrialtest_getResultingFluidStorageItemByNode(fluidType)
|
||||
if resulting then
|
||||
local dstSlot=inv:get_stack("dst",1)
|
||||
local resultingStack=ItemStack(resulting.name)
|
||||
if dstSlot:item_fits(resultingStack) then
|
||||
dstSlot:add_item(resultingStack)
|
||||
inv:set_stack("dst",1,dstSlot)
|
||||
srcSlot:take_item()
|
||||
inv:set_stack("src",1,srcSlot)
|
||||
fluidAmount=fluidAmount-def._industrialtest_simpleFluidStorageCapacity
|
||||
meta:set_int("industrialtest.fluidAmount",fluidAmount)
|
||||
shouldUpdateFormspec=true
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
-- Try to push fluid into neighbour target
|
||||
if meta:get_int("hasOutputTarget")>0 then
|
||||
local outputTargets=minetest.deserialize(meta:get_string("outputTargets"))
|
||||
for _,targetPos in ipairs(outputTargets) do
|
||||
local targetNode=minetest.get_node(targetPos)
|
||||
local targetDef=minetest.registered_nodes[targetNode.name]
|
||||
local fluidType=meta:get_string("industrialtest.fluidType")
|
||||
if targetDef and targetDef._industrialtest_self and targetDef._industrialtest_self.canPushFluid and
|
||||
targetDef._industrialtest_self.onPumpFluidPush and targetDef._industrialtest_self:canPushFluid(targetPos,fluidType,fluidAmount) then
|
||||
fluidAmount=targetDef._industrialtest_self:onPumpFluidPush(targetPos,pos,fluidType,fluidAmount)
|
||||
end
|
||||
end
|
||||
meta:set_int("industrialtest.fluidAmount",fluidAmount)
|
||||
end
|
||||
|
||||
return shouldUpdateFormspec
|
||||
end
|
||||
|
||||
function industrialtest.Pump.action(self,pos)
|
||||
self.determinePumpTargets(pos)
|
||||
self:triggerIfNeeded(pos)
|
||||
end
|
||||
|
||||
-- Scans neighbour positions for pump targets
|
||||
function industrialtest.Pump.determinePumpTargets(pos)
|
||||
local neighbourPositions={
|
||||
vector.offset(pos,-1,0,0),
|
||||
vector.offset(pos,1,0,0),
|
||||
vector.offset(pos,0,-1,0),
|
||||
vector.offset(pos,0,1,0),
|
||||
vector.offset(pos,0,0,-1),
|
||||
vector.offset(pos,0,0,1)
|
||||
}
|
||||
local inputTargets={}
|
||||
local outputTargets={}
|
||||
for _,neighbour in ipairs(neighbourPositions) do
|
||||
local node=minetest.get_node(neighbour)
|
||||
local targetDef=industrialtest.api.getPumpTarget(node.name)
|
||||
if targetDef then
|
||||
if targetDef.direction=="i" then
|
||||
table.insert(inputTargets,neighbour)
|
||||
elseif targetDef.direction=="o" then
|
||||
table.insert(outputTargets,neighbour)
|
||||
end
|
||||
end
|
||||
end
|
||||
local meta=minetest.get_meta(pos)
|
||||
meta:set_string("inputTargets",minetest.serialize(inputTargets))
|
||||
meta:set_int("hasInputTarget",#inputTargets>0 and 1 or 0)
|
||||
meta:set_string("outputTargets",minetest.serialize(outputTargets))
|
||||
meta:set_int("hasOutputTarget",#outputTargets>0 and 1 or 0)
|
||||
end
|
||||
|
||||
-- \brief Checks all input targets if they have any fluid incoming
|
||||
-- \param pos vector
|
||||
-- \returns table
|
||||
function industrialtest.Pump.pollInputTargets(pos)
|
||||
local meta=minetest.get_meta(pos)
|
||||
local inputTargets=minetest.deserialize(meta:get_string("inputTargets"))
|
||||
local fluidType=meta:get_string("industrialtest.fluidType")
|
||||
local result={}
|
||||
for _,targetPos in ipairs(inputTargets) do
|
||||
local targetNode=minetest.get_node(targetPos)
|
||||
local targetDef=minetest.registered_nodes[targetNode.name]
|
||||
if targetDef and targetDef._industrialtest_self and targetDef._industrialtest_self.pullFluid then
|
||||
local fluidInfo=targetDef._industrialtest_self:pullFluid(targetPos,0)
|
||||
if fluidInfo and (fluidInfo.fluidType==fluidType or fluidType=="ignore") then
|
||||
table.insert(result,{
|
||||
pos=targetPos,
|
||||
fluidInfo=fluidInfo,
|
||||
pullFluid=function(amount)
|
||||
return targetDef._industrialtest_self:pullFluid(targetPos,amount)
|
||||
end
|
||||
})
|
||||
fluidType=fluidInfo.fluidType
|
||||
end
|
||||
end
|
||||
end
|
||||
return result
|
||||
end
|
||||
|
||||
industrialtest.Pump:register()
|
||||
|
||||
minetest.register_abm({
|
||||
label="Pump pumping",
|
||||
nodenames={"industrialtest:pump"},
|
||||
interval=industrialtest.config.updateDelay,
|
||||
chance=1,
|
||||
action=function(pos)
|
||||
industrialtest.Pump:action(pos)
|
||||
end
|
||||
})
|
||||
|
||||
minetest.register_craft({
|
||||
type="shaped",
|
||||
output="industrialtest:pump",
|
||||
recipe={
|
||||
{"industrialtest:empty_cell","industrialtest:electronic_circuit","industrialtest:empty_cell"},
|
||||
{"industrialtest:empty_cell","industrialtest:machine_block","industrialtest:empty_cell"},
|
||||
{"industrialtest:mining_pipe",industrialtest.elementKeys.treetap,"industrialtest:mining_pipe"}
|
||||
}
|
||||
})
|
||||
@@ -14,6 +14,8 @@
|
||||
-- You should have received a copy of the GNU General Public License
|
||||
-- along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
local S=minetest.get_translator("industrialtest")
|
||||
|
||||
industrialtest.SimpleElectricItemProcessor=table.copy(industrialtest.ActivatedElectricMachine)
|
||||
industrialtest.internal.unpackTableInto(industrialtest.SimpleElectricItemProcessor,{
|
||||
facedir=true,
|
||||
@@ -51,7 +53,9 @@ function industrialtest.SimpleElectricItemProcessor.getFormspec(self,pos)
|
||||
local meta=minetest.get_meta(pos)
|
||||
local powerPercent=meta:get_int("industrialtest.powerAmount")/meta:get_int("industrialtest.powerCapacity")*100
|
||||
local srcPercent=meta:get_float("srcTime")/meta:get_float("maxSrcTime")*100
|
||||
local recipeOverride=self.isRecipeOverride(meta)
|
||||
local formspec={
|
||||
(recipeOverride and "label[3.4,1.5;"..S("Recipe override: @1", minetest.registered_items[recipeOverride].description).."]" or ""),
|
||||
"list[context;src;3.4,1.8;1,1]",
|
||||
industrialtest.internal.getItemSlotBg(3.4,1.8,1,1),
|
||||
(powerPercent>0 and "image[3.4,2.8;1,1;industrialtest_gui_electricity_bg.png^[lowpart:"..powerPercent..":industrialtest_gui_electricity_fg.png]"
|
||||
@@ -151,7 +155,8 @@ function industrialtest.SimpleElectricItemProcessor.shouldActivate(self,pos)
|
||||
local output=self:getCraftResult(srcSlot)
|
||||
return output and output.time>0 and inv:room_for_item("dst",output.item)
|
||||
end
|
||||
return false
|
||||
|
||||
return meta:contains("recipeOverride") and meta:contains("recipeOverrideMaxTime") and meta:get_string("recipeOverride")~=""
|
||||
end
|
||||
|
||||
function industrialtest.SimpleElectricItemProcessor.shouldDeactivate(self,pos)
|
||||
@@ -164,6 +169,10 @@ function industrialtest.SimpleElectricItemProcessor.shouldDeactivate(self,pos)
|
||||
return true
|
||||
end
|
||||
|
||||
if meta:contains("recipeOverride") and meta:contains("recipeOverrideMaxTime") and meta:get_string("recipeOverride")~="" then
|
||||
return false
|
||||
end
|
||||
|
||||
local srcSlot=inv:get_stack("src",1)
|
||||
if srcSlot:is_empty() then
|
||||
return true
|
||||
@@ -179,11 +188,15 @@ function industrialtest.SimpleElectricItemProcessor.activeUpdate(self,pos,elapse
|
||||
local srcTime=0
|
||||
local maxSrcTime
|
||||
if meta:get_float("maxSrcTime")<=0 then
|
||||
local recipeOverride=self.isRecipeOverride(meta)
|
||||
if recipeOverride then
|
||||
maxSrcTime=meta:get_int("recipeOverrideMaxTime")
|
||||
else
|
||||
local output=self:getCraftResult(srcSlot)
|
||||
maxSrcTime=output.time*self.efficiency
|
||||
end
|
||||
meta:set_float("srcTime",0)
|
||||
meta:set_float("maxSrcTime",maxSrcTime)
|
||||
shouldUpdateFormspec=true
|
||||
else
|
||||
srcTime=meta:get_float("srcTime")
|
||||
maxSrcTime=meta:get_float("maxSrcTime")
|
||||
@@ -196,6 +209,11 @@ function industrialtest.SimpleElectricItemProcessor.activeUpdate(self,pos,elapse
|
||||
meta:set_int("srcTime",srcTime)
|
||||
|
||||
if srcTime>=maxSrcTime then
|
||||
local recipeOverride=self.isRecipeOverride(meta)
|
||||
if recipeOverride then
|
||||
inv:add_item("dst",ItemStack(recipeOverride))
|
||||
meta:set_string("recipeOverride","")
|
||||
else
|
||||
local output=self:getCraftResult(srcSlot)
|
||||
local usedItems=srcSlot:get_count()-output.src:get_count()
|
||||
local multiplier=1
|
||||
@@ -206,15 +224,23 @@ function industrialtest.SimpleElectricItemProcessor.activeUpdate(self,pos,elapse
|
||||
output.item:set_count(output.item:get_count()*multiplier)
|
||||
inv:add_item("dst",output.item)
|
||||
end
|
||||
meta:set_float("srcTime",-1)
|
||||
meta:set_float("maxSrcTime",0)
|
||||
srcSlot:set_count(srcSlot:get_count()-multiplier*usedItems)
|
||||
inv:set_stack("src",1,srcSlot)
|
||||
end
|
||||
meta:set_float("srcTime",-1)
|
||||
meta:set_float("maxSrcTime",0)
|
||||
end
|
||||
|
||||
return true
|
||||
end
|
||||
|
||||
function industrialtest.SimpleElectricItemProcessor.isRecipeOverride(meta)
|
||||
if meta:contains("recipeOverride") and meta:contains("recipeOverrideMaxTime") and meta:get_string("recipeOverride")~="" then
|
||||
return meta:get_string("recipeOverride")
|
||||
end
|
||||
return false
|
||||
end
|
||||
|
||||
function industrialtest.SimpleElectricItemProcessor.getCraftResult(self,itemstack)
|
||||
-- Dummy method
|
||||
end
|
||||
|
||||
BIN
textures/industrialtest_pump_front.png
Normal file
BIN
textures/industrialtest_pump_front.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 4.3 KiB |
BIN
textures/industrialtest_pump_front_active.png
Normal file
BIN
textures/industrialtest_pump_front_active.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 4.6 KiB |
BIN
textures/industrialtest_pump_side.png
Normal file
BIN
textures/industrialtest_pump_side.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 4.2 KiB |
Reference in New Issue
Block a user