Compare commits
29 Commits
2.0.0
...
d709feee6e
| Author | SHA1 | Date | |
|---|---|---|---|
| d709feee6e | |||
| b5f9955e07 | |||
| 986a0d189c | |||
| 8aa5ddc972 | |||
| a2ce0e5177 | |||
| 85b5d5808a | |||
| 69c8355ecb | |||
| 37b6d2b8ff | |||
| c9e73102c9 | |||
| d1511a5f10 | |||
| be435e616a | |||
| b4ea5629c1 | |||
| 92ed913cac | |||
| f98bebab4e | |||
| 6348ca2094 | |||
| 10045582e9 | |||
| fe55ade9b0 | |||
| f7d3ef2190 | |||
| 595241a9b2 | |||
| 25b9c2e1b8 | |||
| 1e1797e1dc | |||
| c594ac4743 | |||
| 868dd672b9 | |||
| 7fd2932118 | |||
| fbaf90895c | |||
| 8f286ebcbc | |||
| 8ca2a44070 | |||
| 28ff1aeb22 | |||
| d13d2b9dfd |
@@ -22,6 +22,9 @@ industrialtest.api={
|
|||||||
geothermalGeneratorFuels={},
|
geothermalGeneratorFuels={},
|
||||||
waterMillFuels={},
|
waterMillFuels={},
|
||||||
rotaryMaceratorModifiers={},
|
rotaryMaceratorModifiers={},
|
||||||
|
pumpTargets={},
|
||||||
|
pumpFluids={},
|
||||||
|
compressedFluids={},
|
||||||
storageCells={},
|
storageCells={},
|
||||||
tags={}
|
tags={}
|
||||||
}
|
}
|
||||||
@@ -32,10 +35,21 @@ industrialtest.api.hvPowerFlow=10200
|
|||||||
industrialtest.api.evPowerFlow=40800
|
industrialtest.api.evPowerFlow=40800
|
||||||
industrialtest.api.ivPowerFlow=163800
|
industrialtest.api.ivPowerFlow=163800
|
||||||
|
|
||||||
|
industrialtest.api.nodeFluidCapacity=1000
|
||||||
|
|
||||||
function industrialtest.internal.clamp(num,min,max)
|
function industrialtest.internal.clamp(num,min,max)
|
||||||
return math.max(math.min(num,max),min)
|
return math.max(math.min(num,max),min)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
function industrialtest.internal.addYVelocityClamped(player,vel,max)
|
||||||
|
local playerVel=player:get_velocity()
|
||||||
|
if playerVel.y+vel>max then
|
||||||
|
player:add_velocity(vector.new(0,math.max(max-playerVel.y,0),0))
|
||||||
|
else
|
||||||
|
player:add_velocity(vector.new(0,vel,0))
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
function industrialtest.internal.unpackTableInto(first,second)
|
function industrialtest.internal.unpackTableInto(first,second)
|
||||||
for k,v in pairs(second) do
|
for k,v in pairs(second) do
|
||||||
first[k]=v
|
first[k]=v
|
||||||
|
|||||||
@@ -25,6 +25,16 @@ local function createItemFluidStorageText(itemstack)
|
|||||||
return minetest.colorize(color,S("@1 / @2 mB",fluidAmount,fluidCapacity))
|
return minetest.colorize(color,S("@1 / @2 mB",fluidAmount,fluidCapacity))
|
||||||
end
|
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
|
-- \brief Check if itemstack contains fluid storage
|
||||||
-- \param itemstack ItemStack
|
-- \param itemstack ItemStack
|
||||||
-- \returns bool
|
-- \returns bool
|
||||||
|
|||||||
@@ -307,6 +307,65 @@ function industrialtest.api.getRotaryMaceratorModifier(name,modifier)
|
|||||||
return industrialtest.api.rotaryMaceratorModifiers[name.." "..modifier]
|
return industrialtest.api.rotaryMaceratorModifiers[name.." "..modifier]
|
||||||
end
|
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()
|
minetest.register_on_mods_loaded(function()
|
||||||
for _,def in pairs(industrialtest.api.rotaryMaceratorModifiers) do
|
for _,def in pairs(industrialtest.api.rotaryMaceratorModifiers) do
|
||||||
if def.stackLeftover then
|
if def.stackLeftover then
|
||||||
|
|||||||
@@ -53,6 +53,21 @@ industrialtest.internal={}
|
|||||||
if industrialtest.mclAvailable then
|
if industrialtest.mclAvailable then
|
||||||
industrialtest.stackMax=64
|
industrialtest.stackMax=64
|
||||||
|
|
||||||
|
minetest.override_item("mcl_buckets:bucket_empty",{
|
||||||
|
groups={
|
||||||
|
_industrialtest_simpleFluidStorage=1
|
||||||
|
},
|
||||||
|
_industrialtest_getResultingFluidStorageItemByNode=function(fluidType)
|
||||||
|
local resultingItem=mcl_buckets.liquids[fluidType]
|
||||||
|
if resultingItem then
|
||||||
|
return {
|
||||||
|
name=resultingItem.bucketname
|
||||||
|
}
|
||||||
|
end
|
||||||
|
end,
|
||||||
|
_industrialtest_simpleFluidStorageCapacity=1000
|
||||||
|
})
|
||||||
|
|
||||||
industrialtest.internal.mclMakeStrippedTrunk=function(itemstack,placer,pointedThing,electricTool)
|
industrialtest.internal.mclMakeStrippedTrunk=function(itemstack,placer,pointedThing,electricTool)
|
||||||
-- Taken from https://git.minetest.land/MineClone2/MineClone2/src/branch/master/mods/ITEMS/mcl_tools/init.lua#L360
|
-- Taken from https://git.minetest.land/MineClone2/MineClone2/src/branch/master/mods/ITEMS/mcl_tools/init.lua#L360
|
||||||
if pointedThing.type ~= "node" then return end
|
if pointedThing.type ~= "node" then return end
|
||||||
@@ -90,6 +105,22 @@ if industrialtest.mclAvailable then
|
|||||||
elseif industrialtest.mtgAvailable then
|
elseif industrialtest.mtgAvailable then
|
||||||
industrialtest.stackMax=99
|
industrialtest.stackMax=99
|
||||||
|
|
||||||
|
-- Override bucket to add function which will be used to query bucket with fluid
|
||||||
|
minetest.override_item("bucket:bucket_empty",{
|
||||||
|
groups={
|
||||||
|
_industrialtest_simpleFluidStorage=1
|
||||||
|
},
|
||||||
|
_industrialtest_getResultingFluidStorageItemByNode=function(fluidType)
|
||||||
|
local resultingItem=bucket.liquids[fluidType]
|
||||||
|
if resultingItem then
|
||||||
|
return {
|
||||||
|
name=resultingItem.itemname
|
||||||
|
}
|
||||||
|
end
|
||||||
|
end,
|
||||||
|
_industrialtest_simpleFluidStorageCapacity=1000
|
||||||
|
})
|
||||||
|
|
||||||
industrialtest.internal.explode=function(pos,radius)
|
industrialtest.internal.explode=function(pos,radius)
|
||||||
tnt.boom(pos,{radius=radius})
|
tnt.boom(pos,{radius=radius})
|
||||||
end
|
end
|
||||||
@@ -507,6 +538,7 @@ if industrialtest.mclAvailable then
|
|||||||
industrialtest.elementKeys.cactus="mcl_core:cactus"
|
industrialtest.elementKeys.cactus="mcl_core:cactus"
|
||||||
industrialtest.elementKeys.gunpowder="mcl_mobitems:gunpowder"
|
industrialtest.elementKeys.gunpowder="mcl_mobitems:gunpowder"
|
||||||
industrialtest.elementKeys.chest="mcl_chests:chest_small"
|
industrialtest.elementKeys.chest="mcl_chests:chest_small"
|
||||||
|
industrialtest.elementKeys.paper="mcl_core:paper"
|
||||||
industrialtest.elementKeys.groupSapling="group:sapling"
|
industrialtest.elementKeys.groupSapling="group:sapling"
|
||||||
industrialtest.elementKeys.groupLeaves="group:leaves"
|
industrialtest.elementKeys.groupLeaves="group:leaves"
|
||||||
industrialtest.elementKeys.stickyResin=(industrialtest.mods.mclRubber and "mcl_rubber:rubber_raw" or "industrialtest:sticky_resin")
|
industrialtest.elementKeys.stickyResin=(industrialtest.mods.mclRubber and "mcl_rubber:rubber_raw" or "industrialtest:sticky_resin")
|
||||||
@@ -742,6 +774,7 @@ elseif industrialtest.mtgAvailable then
|
|||||||
industrialtest.elementKeys.cactus="default:cactus"
|
industrialtest.elementKeys.cactus="default:cactus"
|
||||||
industrialtest.elementKeys.gunpowder="tnt:gunpowder"
|
industrialtest.elementKeys.gunpowder="tnt:gunpowder"
|
||||||
industrialtest.elementKeys.chest="default:chest"
|
industrialtest.elementKeys.chest="default:chest"
|
||||||
|
industrialtest.elementKeys.paper="default:paper"
|
||||||
industrialtest.elementKeys.groupSapling="group:sapling"
|
industrialtest.elementKeys.groupSapling="group:sapling"
|
||||||
industrialtest.elementKeys.groupLeaves="group:leaves"
|
industrialtest.elementKeys.groupLeaves="group:leaves"
|
||||||
industrialtest.elementKeys.stickyResin="industrialtest:sticky_resin"
|
industrialtest.elementKeys.stickyResin="industrialtest:sticky_resin"
|
||||||
|
|||||||
@@ -503,6 +503,13 @@ industrialtest.api.registerPlate("carbon_plate",S("Carbon Plate"),{
|
|||||||
}
|
}
|
||||||
},"#272725ff",true)
|
},"#272725ff",true)
|
||||||
|
|
||||||
|
industrialtest.api.registerPlate("iron_plate",S("Iron Plate"),{
|
||||||
|
{
|
||||||
|
resource=industrialtest.elementKeys.ironIngot,
|
||||||
|
count=1
|
||||||
|
}
|
||||||
|
},colors.iron,true)
|
||||||
|
|
||||||
industrialtest.api.registerPlate("tin_plate",S("Tin Plate"),{
|
industrialtest.api.registerPlate("tin_plate",S("Tin Plate"),{
|
||||||
{
|
{
|
||||||
resource=industrialtest.elementKeys.tinIngot,
|
resource=industrialtest.elementKeys.tinIngot,
|
||||||
@@ -533,6 +540,9 @@ minetest.register_craftitem("industrialtest:empty_cell",{
|
|||||||
description=S("Empty Cell"),
|
description=S("Empty Cell"),
|
||||||
inventory_image="industrialtest_empty_cell.png",
|
inventory_image="industrialtest_empty_cell.png",
|
||||||
liquids_pointable=true,
|
liquids_pointable=true,
|
||||||
|
groups={
|
||||||
|
_industrialtest_simpleFluidStorage=1
|
||||||
|
},
|
||||||
on_place=function(itemstack,user,pointed)
|
on_place=function(itemstack,user,pointed)
|
||||||
if pointed.type~="node" or not user or not user:is_player() then
|
if pointed.type~="node" or not user or not user:is_player() then
|
||||||
return nil
|
return nil
|
||||||
@@ -554,7 +564,9 @@ minetest.register_craftitem("industrialtest:empty_cell",{
|
|||||||
end
|
end
|
||||||
minetest.remove_node(pointed.under)
|
minetest.remove_node(pointed.under)
|
||||||
return itemstack
|
return itemstack
|
||||||
end
|
end,
|
||||||
|
_industrialtest_getResultingFluidStorageItemByNode=industrialtest.api.getStorageCellByNode,
|
||||||
|
_industrialtest_simpleFluidStorageCapacity=1000
|
||||||
})
|
})
|
||||||
minetest.register_craft({
|
minetest.register_craft({
|
||||||
type="shaped",
|
type="shaped",
|
||||||
|
|||||||
@@ -125,3 +125,12 @@ if industrialtest.mtgAvailable then
|
|||||||
}
|
}
|
||||||
})
|
})
|
||||||
end
|
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)
|
||||||
|
|||||||
535
guide.lua
Normal file
@@ -0,0 +1,535 @@
|
|||||||
|
-- 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")
|
||||||
|
|
||||||
|
-- \brief Creates hypertext table with rows
|
||||||
|
-- \param rows table
|
||||||
|
-- \param withTitleRow bool
|
||||||
|
-- \param description (optional) string
|
||||||
|
-- \returns string
|
||||||
|
local function createTable(rows,withTitleRow,description)
|
||||||
|
local columnWidths={}
|
||||||
|
for _,row in ipairs(rows) do
|
||||||
|
for i,cell in ipairs(row) do
|
||||||
|
-- Add 3 here because of cell padding (2 spaces at each side of column text) and right cell separator
|
||||||
|
columnWidths[i]=math.max(columnWidths[i] or 0,string.len(cell)+3)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Begin with width of 1 because of left edge
|
||||||
|
local tableWidth=1
|
||||||
|
for _,width in ipairs(columnWidths) do
|
||||||
|
tableWidth=tableWidth+width
|
||||||
|
end
|
||||||
|
|
||||||
|
local horizontalEdge=string.rep("-",tableWidth).."\n"
|
||||||
|
local hypertextRows={horizontalEdge}
|
||||||
|
for i,row in ipairs(rows) do
|
||||||
|
local hypertextRow={"|"}
|
||||||
|
for o,cell in ipairs(row) do
|
||||||
|
local cellWidth=string.len(cell)+3
|
||||||
|
local rightPadding=string.rep(" ",columnWidths[o]-cellWidth)
|
||||||
|
table.insert(hypertextRow,string.format(" %s%s |",cell,rightPadding))
|
||||||
|
end
|
||||||
|
table.insert(hypertextRow,"\n")
|
||||||
|
table.insert(hypertextRows,table.concat(hypertextRow,""))
|
||||||
|
-- Insert horizontal edge if title row is present
|
||||||
|
if withTitleRow and i==1 then
|
||||||
|
table.insert(hypertextRows,horizontalEdge)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
table.insert(hypertextRows,horizontalEdge)
|
||||||
|
|
||||||
|
return "<mono>"..table.concat(hypertextRows,"")..(description or "").."</mono>\n"
|
||||||
|
end
|
||||||
|
|
||||||
|
-- \brief Creates table with machine information while providing few shortcuts for common fields
|
||||||
|
-- \param fields table
|
||||||
|
-- \param machineName string
|
||||||
|
-- \returns string
|
||||||
|
local function createMachineInformationTable(fields,machineName)
|
||||||
|
local fieldLabels={
|
||||||
|
inputVoltage="Input voltage level",
|
||||||
|
outputVoltage="Output voltage level",
|
||||||
|
recipe="Recipe type",
|
||||||
|
powerCapacity="Power capacity",
|
||||||
|
opPower="Power per operation",
|
||||||
|
powerPerFuel="Power per fuel unit",
|
||||||
|
efficiency="Default efficiency"
|
||||||
|
}
|
||||||
|
|
||||||
|
local rows={}
|
||||||
|
for _,field in ipairs(fields) do
|
||||||
|
local label=fieldLabels[field.name] or field.name
|
||||||
|
table.insert(rows,{
|
||||||
|
label,
|
||||||
|
field.value
|
||||||
|
})
|
||||||
|
end
|
||||||
|
|
||||||
|
return createTable(rows,false,string.format("Figure 1. Machine information for %s",machineName))
|
||||||
|
end
|
||||||
|
|
||||||
|
local pages={
|
||||||
|
{
|
||||||
|
name="introduction",
|
||||||
|
title=S("Introduction"),
|
||||||
|
icon=industrialtest.elementKeys.paper,
|
||||||
|
content={
|
||||||
|
[[
|
||||||
|
<big>||Introduction||</big>
|
||||||
|
<left>
|
||||||
|
||IndustrialTest implements finite power functionality which can be used to perform various tasks using generators and consumers. Such features are not a new thing in Luanti, as there are older mods which do that already. This mod, however, proves to be more flexible.||
|
||||||
|
</left>
|
||||||
|
<img name="industrialtest_guide_introduction.png" width="{{IMAGE_WIDTH}}">
|
||||||
|
]]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
{
|
||||||
|
name="electricalNetwork",
|
||||||
|
title=S("Electrical network"),
|
||||||
|
icon="industrialtest:insulated_copper_cable",
|
||||||
|
content={
|
||||||
|
[[
|
||||||
|
<big>||Electrical network||</big>
|
||||||
|
<left>
|
||||||
|
||In order to attach electricity consumers to power sources (like generators, batteries, further just called generators) electrical network is used. Consumers can get connected either directly to generators or through various cables. Each generator can output certain voltage (this is actually amperage, however since this mod doesn't simulate electricity accurately, it's called voltage), the same situation is for consumers as they can only handle up to certain voltage.||
|
||||||
|
||Figure 1 shows voltage levels present in this mod.||
|
||||||
|
||If voltage is too high for cable it will melt without dropping anything while consumer will explode also without dropping anything and possibly destroying terrain around. Power capacity is measured in EU (Energy Units) and the voltage is EU/update.||
|
||||||
|
||Picture 1 shows environment after consumer explosion.||
|
||||||
|
</left>
|
||||||
|
]],
|
||||||
|
createTable({
|
||||||
|
{
|
||||||
|
"Voltage level",
|
||||||
|
"EU/update",
|
||||||
|
"Cable"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"LV",
|
||||||
|
"600",
|
||||||
|
"Tin"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"MV",
|
||||||
|
"2400",
|
||||||
|
"Copper"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"HV",
|
||||||
|
"10200",
|
||||||
|
"Gold"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"EV",
|
||||||
|
"40800",
|
||||||
|
"Iron"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"IV",
|
||||||
|
"163800",
|
||||||
|
"Glass Fibre"
|
||||||
|
}
|
||||||
|
},true,S("Figure 1. Voltage levels and respective cables")),
|
||||||
|
[[
|
||||||
|
<img name="industrialtest_guide_explosion.png" width="{{IMAGE_WIDTH}}">
|
||||||
|
<left>||Picture 1. Environment after consumer explosion||</left>
|
||||||
|
]]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
{
|
||||||
|
name="cableFormer",
|
||||||
|
title=S("Cable Former"),
|
||||||
|
icon="industrialtest:cable_former",
|
||||||
|
content={
|
||||||
|
[[
|
||||||
|
<big>||Cable Former||</big>
|
||||||
|
<left>
|
||||||
|
||Cable Former can be used to produce cables with higher material efficiency. It can, however, only produce cables from metals so for example <item name="industrialtest:glass_fibre_cable" height="{{ITEM_HEIGHT}}"> <b>Glass Fibre Cable</b> can't be produced in it.||
|
||||||
|
</left>
|
||||||
|
]],
|
||||||
|
createMachineInformationTable({
|
||||||
|
{
|
||||||
|
name="inputVoltage",
|
||||||
|
value="LV"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name="recipe",
|
||||||
|
value="Cable forming"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name="powerCapacity",
|
||||||
|
value=string.format("%d EU",industrialtest.CableFormer.capacity)
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name="opPower",
|
||||||
|
value=string.format("%d EU",industrialtest.CableFormer.opPower)
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name="efficiency",
|
||||||
|
value=tostring(1/industrialtest.CableFormer.efficiency)
|
||||||
|
}
|
||||||
|
},S("Cable Former")),
|
||||||
|
[[
|
||||||
|
<img name="industrialtest_guide_cable_former.png" width="{{IMAGE_WIDTH}}">
|
||||||
|
<left>||Picture 1. Cable Former running||</left>
|
||||||
|
]]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
{
|
||||||
|
name="canningMachine",
|
||||||
|
title=S("Canning Machine"),
|
||||||
|
icon="industrialtest:canning_machine",
|
||||||
|
content={
|
||||||
|
[[
|
||||||
|
<big>||Canning Machine||</big>
|
||||||
|
<left>
|
||||||
|
||Canning Machine is used to move certain fluid from one item to another. The common usage is to refill fuel in <item name="industrialtest:jetpack_v" height="{{ITEM_HEIGHT}}"> <b>Jetpack</b> or <item name="industrialtest:fuel_can" height="{{ITEM_HEIGHT}}"> <b>Fuel Can</b>.||
|
||||||
|
</left>
|
||||||
|
]],
|
||||||
|
createMachineInformationTable({
|
||||||
|
{
|
||||||
|
name="inputVoltage",
|
||||||
|
value="LV"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name="powerCapacity",
|
||||||
|
value=string.format("%d EU",industrialtest.CanningMachine.capacity)
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name="opPower",
|
||||||
|
value=string.format("%d EU",industrialtest.CanningMachine._opPower)
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name="Canning completion time",
|
||||||
|
value=string.format("%d seconds",industrialtest.CanningMachine._canningTime)
|
||||||
|
}
|
||||||
|
},S("Canning Machine")),
|
||||||
|
[[
|
||||||
|
<img name="industrialtest_guide_canning_machine.png" width="{{IMAGE_WIDTH}}">
|
||||||
|
<left>||Picture 1. Canning Machine refilling <item name="industrialtest:fuel_can" height="{{ITEM_HEIGHT}}"> <b>Fuel Can</b> with fuel from <item name="industrialtest:coalfuel_cell" height="{{ITEM_HEIGHT}}"> <b>Coalfuel Cell</b>||</left>
|
||||||
|
]]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
{
|
||||||
|
name="compressor",
|
||||||
|
title=S("Compressor"),
|
||||||
|
icon="industrialtest:compressor",
|
||||||
|
content={
|
||||||
|
[[
|
||||||
|
<big>||Compressor||</big>
|
||||||
|
<left>
|
||||||
|
||Compressor as the name suggests is used to compress various materials. Mostly required to produce items for crafting other items.||
|
||||||
|
</left>
|
||||||
|
]],
|
||||||
|
createMachineInformationTable({
|
||||||
|
{
|
||||||
|
name="inputVoltage",
|
||||||
|
value="LV"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name="recipe",
|
||||||
|
value="Compressing"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name="powerCapacity",
|
||||||
|
value=string.format("%d EU",industrialtest.Compressor.capacity)
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name="opPower",
|
||||||
|
value=string.format("%d EU",industrialtest.Compressor.opPower)
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name="efficiency",
|
||||||
|
value=tostring(1/industrialtest.Compressor.efficiency)
|
||||||
|
}
|
||||||
|
},S("Compressor")),
|
||||||
|
[[
|
||||||
|
<img name="industrialtest_guide_compressor.png" width="{{IMAGE_WIDTH}}">
|
||||||
|
<left>||Picture 1. Compressor compressing <item name="industrialtest:plantball" height="{{ITEM_HEIGHT}}"> <b>Plantball</b> into <item name="industrialtest:compressed_plantball" height="{{ITEM_HEIGHT}}"> <b>Compressed Plantball</b>||</left>
|
||||||
|
]]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
{
|
||||||
|
name="electricFurnace",
|
||||||
|
title=S("Electric Furnace"),
|
||||||
|
icon="industrialtest:electric_furnace",
|
||||||
|
content={
|
||||||
|
[[
|
||||||
|
<big>||Electric Furnace||</big>
|
||||||
|
<left>
|
||||||
|
||Electric Furnace like regular furnace can be used to smelt items. The difference is that Electric Furnace is slightly faster even without any upgrades and, well, it's electric so it doesn't require fuel.||
|
||||||
|
</left>
|
||||||
|
]],
|
||||||
|
createMachineInformationTable({
|
||||||
|
{
|
||||||
|
name="inputVoltage",
|
||||||
|
value="LV"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name="recipe",
|
||||||
|
value="Smelting"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name="powerCapacity",
|
||||||
|
value=string.format("%d EU",industrialtest.ElectricFurnace.capacity)
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name="opPower",
|
||||||
|
value=string.format("%d EU",industrialtest.ElectricFurnace.opPower)
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name="efficiency",
|
||||||
|
value=tostring(1/industrialtest.ElectricFurnace.efficiency)
|
||||||
|
}
|
||||||
|
},S("Electric Furnace")),
|
||||||
|
[[
|
||||||
|
<img name="industrialtest_guide_electric_furnace.png" width="{{IMAGE_WIDTH}}">
|
||||||
|
<left>||Picture 1. Electric Furnace smelting <item name="industrialtest:iron_dust" height="{{ITEM_HEIGHT}}"> <b>Iron Dust</b> into <item name="{{elementKeyIronIngot}}" height="{{ITEM_HEIGHT}}"> <b>Iron Ingot</b>||</left>
|
||||||
|
]]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
{
|
||||||
|
name="extractor",
|
||||||
|
title=S("Extractor"),
|
||||||
|
icon="industrialtest:extractor",
|
||||||
|
content={
|
||||||
|
[[
|
||||||
|
<big>||Extractor||</big>
|
||||||
|
<left>
|
||||||
|
||Extractor is used to separate materials from within other materials, often when it's not possible by other means.||
|
||||||
|
</left>
|
||||||
|
]],
|
||||||
|
createMachineInformationTable({
|
||||||
|
{
|
||||||
|
name="inputVoltage",
|
||||||
|
value="LV"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name="recipe",
|
||||||
|
value="Extracting"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name="powerCapacity",
|
||||||
|
value=string.format("%d EU",industrialtest.Extractor.capacity)
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name="opPower",
|
||||||
|
value=string.format("%d EU",industrialtest.Extractor.opPower)
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name="efficiency",
|
||||||
|
value=tostring(1/industrialtest.Extractor.efficiency)
|
||||||
|
}
|
||||||
|
},S("Extractor")),
|
||||||
|
[[
|
||||||
|
<img name="industrialtest_guide_extractor.png" width="{{IMAGE_WIDTH}}">
|
||||||
|
<left>||Picture 1. Extractor extracting <item name="{{elementKeyRubber}}" height="{{ITEM_HEIGHT}}"> <b>Rubber</b> from <item name="{{elementKeyRubberWood}}" height="{{ITEM_HEIGHT}}"> <b>Rubber Wood</b>||</left>
|
||||||
|
]]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
{
|
||||||
|
name="generator",
|
||||||
|
title=S("Generator"),
|
||||||
|
icon="industrialtest:generator",
|
||||||
|
content={
|
||||||
|
[[
|
||||||
|
<big>||Generator||</big>
|
||||||
|
<left>
|
||||||
|
||Generator produces energy from various fuels which can be used for smelting. It is the most basic way of powering electric machines and also the simplest to obtain.||
|
||||||
|
</left>
|
||||||
|
]],
|
||||||
|
createMachineInformationTable({
|
||||||
|
{
|
||||||
|
name="outputVoltage",
|
||||||
|
value="LV"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name="powerCapacity",
|
||||||
|
value=string.format("%d EU",industrialtest.Generator.capacity)
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name="powerPerFuel",
|
||||||
|
value="200 EU"
|
||||||
|
}
|
||||||
|
},S("Generator")),
|
||||||
|
[[
|
||||||
|
<img name="industrialtest_guide_generator.png" width="{{IMAGE_WIDTH}}">
|
||||||
|
<left>||Picture 1. Generator producing power from <item name="{{elementKeyCoal}}" height="{{ITEM_HEIGHT}}"> <b>Coal</b>||</left>
|
||||||
|
]]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
{
|
||||||
|
name="geothermalGenerator",
|
||||||
|
title=S("Geothermal Generator"),
|
||||||
|
icon="industrialtest:geothermal_generator",
|
||||||
|
content={
|
||||||
|
[[
|
||||||
|
<big>||Geothermal Generator||</big>
|
||||||
|
<left>
|
||||||
|
||Geothermal Generator produces energy using heat from fluids like lava. Hot fluids can be transferred into Geothermal Generator for example by using <item name="industrialtest:empty_cell" height="{{ITEM_HEIGHT}}"> <b>Empty Cell</b> or <item name="{{elementKeyBucket}}" height="{{ITEM_HEIGHT}}"> <b>Empty Bucket</b>.||
|
||||||
|
</left>
|
||||||
|
]],
|
||||||
|
createMachineInformationTable({
|
||||||
|
{
|
||||||
|
name="outputVoltage",
|
||||||
|
value="LV"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name="powerCapacity",
|
||||||
|
value=string.format("%d EU",industrialtest.GeothermalGenerator.capacity)
|
||||||
|
}
|
||||||
|
},S("Geothermal Generator")),
|
||||||
|
[[
|
||||||
|
<img name="industrialtest_guide_geothermal_generator.png" width="{{IMAGE_WIDTH}}">
|
||||||
|
<left>||Picture 1. Geothermal Generator producing power from <b>Lava</b>||</left>
|
||||||
|
]]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
{
|
||||||
|
name="inductionFurnace",
|
||||||
|
title=S("Induction Furnace"),
|
||||||
|
icon="industrialtest:induction_furnace",
|
||||||
|
content={
|
||||||
|
[[
|
||||||
|
<big>||Induction Furnace||</big>
|
||||||
|
<left>
|
||||||
|
||Induction Furnace like Electric Furnace uses electricity to smelt items. The difference between those is that Induction Furnace when running builds up heat internally over time. This property results in Induction Furnace smelting items faster the longer it's running. Once smelting is finished Induction Furnace begins to slowly lose heat. The heat level is indicated on the left of formspec.||
|
||||||
|
||Furthermore Induction Furnace allows to smelt 2 different items at once increasing efficiency even more.||
|
||||||
|
</left>
|
||||||
|
]],
|
||||||
|
createMachineInformationTable({
|
||||||
|
{
|
||||||
|
name="inputVoltage",
|
||||||
|
value="MV"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name="recipe",
|
||||||
|
value="Smelting"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name="powerCapacity",
|
||||||
|
value=string.format("%d EU",industrialtest.InductionFurnace.capacity)
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name="opPower",
|
||||||
|
value=string.format("%d EU",industrialtest.InductionFurnace._opPower)
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name="efficiency",
|
||||||
|
value=tostring(1/industrialtest.InductionFurnace._efficiency)
|
||||||
|
}
|
||||||
|
},S("Induction Furnace")),
|
||||||
|
[[
|
||||||
|
<img name="industrialtest_guide_induction_furnace.png" width="{{IMAGE_WIDTH}}">
|
||||||
|
<left>||Picture 1. Induction Furnace smelting <item name="industrialtest:copper_dust" height="{{ITEM_HEIGHT}}"> <b>Copper Dust</b> and <item name="industrialtest:iron_dust" height="{{ITEM_HEIGHT}}"> <b>Iron Dust</b> into <item name="{{elementKeyCopperIngot}}" height="{{ITEM_HEIGHT}}"> <b>Copper Ingot</b> and <item name="{{elementKeyIronIngot}}" height="{{ITEM_HEIGHT}}"> <b>Iron Ingot</b>.||</left>
|
||||||
|
]]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
local function preprocessHypertext(content,vars)
|
||||||
|
-- Find and replace strings which should be translated, this pattern matches any string that doesn't include | which is contained within || at both ends
|
||||||
|
content=string.gsub(content,"||([^|]+)||",function(sourceString)
|
||||||
|
return S(sourceString)
|
||||||
|
end)
|
||||||
|
|
||||||
|
for key,value in pairs(vars) do
|
||||||
|
content=string.gsub(content,string.format("{{%s}}",key),value)
|
||||||
|
end
|
||||||
|
|
||||||
|
return content
|
||||||
|
end
|
||||||
|
|
||||||
|
local function getGuideFormspec(playerName,pageName)
|
||||||
|
local formspec={
|
||||||
|
"formspec_version[4]",
|
||||||
|
"size[15,10.8]",
|
||||||
|
"label[0.1,0.2;"..S("IndustrialTest Guide").."]",
|
||||||
|
--"scrollbaroptions[]",
|
||||||
|
"scrollbar[3.6,0.4;0.5,10.3;vertical;scrollbarList;0]",
|
||||||
|
"scroll_container[0.1,0.4;4,10.3;scrollbarList;vertical]"
|
||||||
|
}
|
||||||
|
|
||||||
|
-- Contents sidebar
|
||||||
|
local PAGE_BUTTON_HEIGHT=0.7
|
||||||
|
for i,page in ipairs(pages) do
|
||||||
|
table.insert(formspec,string.format("container[0,%f]",(i-1)*PAGE_BUTTON_HEIGHT))
|
||||||
|
table.insert(formspec,string.format("item_image[0,0;%f,%f;%s]",PAGE_BUTTON_HEIGHT,PAGE_BUTTON_HEIGHT,page.icon))
|
||||||
|
table.insert(formspec,string.format("button[%f,0;%f,%f;%s;%s]",PAGE_BUTTON_HEIGHT+0.05,3.45-PAGE_BUTTON_HEIGHT,PAGE_BUTTON_HEIGHT,page.name,page.title))
|
||||||
|
table.insert(formspec,"container_end[]")
|
||||||
|
end
|
||||||
|
table.insert(formspec,"scroll_container_end[]")
|
||||||
|
|
||||||
|
-- Introduction page is shown by default
|
||||||
|
pageName=(pageName or "introduction")
|
||||||
|
|
||||||
|
for _,page in ipairs(pages) do
|
||||||
|
if page.name==pageName then
|
||||||
|
local content=preprocessHypertext(table.concat(page.content,""),{
|
||||||
|
IMAGE_WIDTH=550,
|
||||||
|
ITEM_HEIGHT=16,
|
||||||
|
elementKeyBucket=industrialtest.elementKeys.bucket,
|
||||||
|
elementKeyCoal=industrialtest.elementKeys.coal,
|
||||||
|
elementKeyCopperIngot=industrialtest.elementKeys.copperIngot,
|
||||||
|
elementKeyIronIngot=industrialtest.elementKeys.ironIngot,
|
||||||
|
elementKeyRubber=industrialtest.elementKeys.rubber,
|
||||||
|
elementKeyRubberWood=industrialtest.elementKeys.rubberWood
|
||||||
|
})
|
||||||
|
table.insert(formspec,string.format("hypertext[4.2,0.4;10.7,10.3;content;%s]",content))
|
||||||
|
break
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
return table.concat(formspec,"")
|
||||||
|
end
|
||||||
|
|
||||||
|
local function showGuide(playerName,page)
|
||||||
|
minetest.show_formspec(playerName,"industrialtest:guide",getGuideFormspec(playerName,page))
|
||||||
|
return true
|
||||||
|
end
|
||||||
|
|
||||||
|
local function handleGuideFields(player,formname,fields)
|
||||||
|
if formname~="industrialtest:guide" then
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
|
for _,page in ipairs(pages) do
|
||||||
|
if fields[page.name] then
|
||||||
|
minetest.close_formspec(player:get_player_name(),formname)
|
||||||
|
showGuide(player:get_player_name(),page.name)
|
||||||
|
break
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
minetest.register_on_player_receive_fields(handleGuideFields)
|
||||||
|
|
||||||
|
minetest.register_chatcommand("industrialtest_guide",{
|
||||||
|
description=S("Shows graphical guide for content and features provided by IndustrialTest"),
|
||||||
|
func=function(playerName)
|
||||||
|
showGuide(playerName)
|
||||||
|
end
|
||||||
|
})
|
||||||
3
init.lua
@@ -56,10 +56,12 @@ dofile(modpath.."/machines/generator.lua")
|
|||||||
dofile(modpath.."/machines/induction_furnace.lua")
|
dofile(modpath.."/machines/induction_furnace.lua")
|
||||||
dofile(modpath.."/machines/iron_furnace.lua")
|
dofile(modpath.."/machines/iron_furnace.lua")
|
||||||
dofile(modpath.."/machines/macerator.lua")
|
dofile(modpath.."/machines/macerator.lua")
|
||||||
|
dofile(modpath.."/machines/magnetizer.lua")
|
||||||
dofile(modpath.."/machines/mass_fabricator.lua")
|
dofile(modpath.."/machines/mass_fabricator.lua")
|
||||||
dofile(modpath.."/machines/miner.lua")
|
dofile(modpath.."/machines/miner.lua")
|
||||||
dofile(modpath.."/machines/nuclear_reactor.lua")
|
dofile(modpath.."/machines/nuclear_reactor.lua")
|
||||||
dofile(modpath.."/machines/power_storage.lua")
|
dofile(modpath.."/machines/power_storage.lua")
|
||||||
|
dofile(modpath.."/machines/pump.lua")
|
||||||
dofile(modpath.."/machines/recycler.lua")
|
dofile(modpath.."/machines/recycler.lua")
|
||||||
dofile(modpath.."/machines/rotary_macerator.lua")
|
dofile(modpath.."/machines/rotary_macerator.lua")
|
||||||
dofile(modpath.."/machines/tool_workshop.lua")
|
dofile(modpath.."/machines/tool_workshop.lua")
|
||||||
@@ -96,6 +98,7 @@ dofile(modpath.."/tools/wrench.lua")
|
|||||||
|
|
||||||
dofile(modpath.."/upgrades.lua")
|
dofile(modpath.."/upgrades.lua")
|
||||||
dofile(modpath.."/craftitems.lua")
|
dofile(modpath.."/craftitems.lua")
|
||||||
|
dofile(modpath.."/guide.lua")
|
||||||
dofile(modpath.."/nodes.lua")
|
dofile(modpath.."/nodes.lua")
|
||||||
if industrialtest.config.developerMode then
|
if industrialtest.config.developerMode then
|
||||||
dofile(modpath.."/utils.lua")
|
dofile(modpath.."/utils.lua")
|
||||||
|
|||||||
@@ -62,8 +62,38 @@ function industrialtest.Compressor.getCraftResult(self,itemstack)
|
|||||||
}
|
}
|
||||||
end
|
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.Compressor:register()
|
||||||
|
|
||||||
|
industrialtest.api.registerPumpTarget("industrialtest:compressor","o")
|
||||||
|
industrialtest.api.registerPumpTarget("industrialtest:compressor_active","o")
|
||||||
|
|
||||||
minetest.register_craft({
|
minetest.register_craft({
|
||||||
type="shaped",
|
type="shaped",
|
||||||
output="industrialtest:compressor",
|
output="industrialtest:compressor",
|
||||||
|
|||||||
272
machines/magnetizer.lua
Normal file
@@ -0,0 +1,272 @@
|
|||||||
|
-- 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")
|
||||||
|
|
||||||
|
local function findFenceRailEnd(initialPosition,direction)
|
||||||
|
local y=initialPosition.y
|
||||||
|
local railNode=minetest.get_node(vector.new(initialPosition.x,y,initialPosition.z))
|
||||||
|
while minetest.get_item_group(railNode.name,"_industrialtest_metalFence")>0 and math.abs(initialPosition.y-y)<=19 do
|
||||||
|
y=y+direction
|
||||||
|
railNode=minetest.get_node(vector.new(initialPosition.x,y,initialPosition.z))
|
||||||
|
end
|
||||||
|
return y-direction
|
||||||
|
end
|
||||||
|
|
||||||
|
local function hasMetalBoots(player)
|
||||||
|
local inv
|
||||||
|
if industrialtest.mtgAvailable then
|
||||||
|
_,inv=armor:get_valid_player(player,"")
|
||||||
|
elseif industrialtest.mclAvailable then
|
||||||
|
inv=player:get_inventory()
|
||||||
|
end
|
||||||
|
|
||||||
|
if inv then
|
||||||
|
local armorList=inv:get_list("armor")
|
||||||
|
assert(armorList)
|
||||||
|
local requiredGroups={
|
||||||
|
"armor_iron",
|
||||||
|
"armor_gold",
|
||||||
|
"armor_bronze",
|
||||||
|
"_industrialtest_electricArmor"
|
||||||
|
}
|
||||||
|
-- 3D armor boots have to be hardcoded here because they don't provide any group depending on material
|
||||||
|
local requiredNames={
|
||||||
|
"3d_armor:boots_steel",
|
||||||
|
"3d_armor:boots_gold",
|
||||||
|
"3d_armor:boots_bronze"
|
||||||
|
}
|
||||||
|
for _,itemstack in ipairs(armorList) do
|
||||||
|
local def=itemstack:get_definition()
|
||||||
|
if def and def.groups and def.groups.armor_feet then
|
||||||
|
for _,group in ipairs(requiredGroups) do
|
||||||
|
if def.groups[group] then
|
||||||
|
-- Matching group succeeded
|
||||||
|
return true
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
for _,itemname in ipairs(requiredNames) do
|
||||||
|
if itemname==itemstack:get_name() then
|
||||||
|
-- Matching itemname succeeded
|
||||||
|
return true
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
return false
|
||||||
|
end
|
||||||
|
|
||||||
|
industrialtest.Magnetizer=table.copy(industrialtest.ElectricMachine)
|
||||||
|
industrialtest.internal.unpackTableInto(industrialtest.Magnetizer,{
|
||||||
|
name="industrialtest:magnetizer",
|
||||||
|
description=S("Magnetizer"),
|
||||||
|
tiles={
|
||||||
|
"industrialtest_machine_block.png",
|
||||||
|
"industrialtest_machine_block.png",
|
||||||
|
"industrialtest_machine_block.png",
|
||||||
|
"industrialtest_machine_block.png",
|
||||||
|
"industrialtest_machine_block.png",
|
||||||
|
"industrialtest_machine_block.png^industrialtest_magnetizer_front.png"
|
||||||
|
},
|
||||||
|
sounds="metal",
|
||||||
|
facedir=true,
|
||||||
|
storageLists={
|
||||||
|
"powerStorage"
|
||||||
|
},
|
||||||
|
powerLists={
|
||||||
|
{
|
||||||
|
list="powerStorage",
|
||||||
|
direction="i"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
capacity=industrialtest.api.lvPowerFlow*2,
|
||||||
|
flow=industrialtest.api.lvPowerFlow,
|
||||||
|
ioConfig="iiiiii",
|
||||||
|
requiresWrench=true,
|
||||||
|
hasPowerInput=true,
|
||||||
|
_capacityPerFence=15,
|
||||||
|
_opPower=4
|
||||||
|
})
|
||||||
|
|
||||||
|
function industrialtest.Magnetizer.onConstruct(self,pos)
|
||||||
|
local meta=minetest.get_meta(pos)
|
||||||
|
local inv=meta:get_inventory()
|
||||||
|
inv:set_size("powerStorage",1)
|
||||||
|
self:determineFenceRail(pos)
|
||||||
|
self:determinePowerCapacity(pos)
|
||||||
|
industrialtest.ElectricMachine.onConstruct(self,pos)
|
||||||
|
end
|
||||||
|
|
||||||
|
function industrialtest.Magnetizer.onDestruct(self,pos)
|
||||||
|
self.detachFenceRail(pos)
|
||||||
|
industrialtest.ElectricMachine.onDestruct(self,pos)
|
||||||
|
end
|
||||||
|
|
||||||
|
function industrialtest.Magnetizer.onDig(self,pos,node,digger)
|
||||||
|
self.detachFenceRail(pos)
|
||||||
|
return industrialtest.ElectricMachine.onDig(self,pos,node,digger)
|
||||||
|
end
|
||||||
|
|
||||||
|
function industrialtest.Magnetizer.getFormspec(self,pos)
|
||||||
|
local parentFormspec=industrialtest.ElectricMachine.getFormspec(self,pos)
|
||||||
|
local meta=minetest.get_meta(pos)
|
||||||
|
local powerPercent=meta:get_int("industrialtest.powerAmount")/meta:get_int("industrialtest.powerCapacity")*100
|
||||||
|
local formspec={
|
||||||
|
(powerPercent>0 and "image[4.7,2.7;1,1;industrialtest_gui_electricity_bg.png^[lowpart:"..powerPercent..":industrialtest_gui_electricity_fg.png]"
|
||||||
|
or "image[4.7,2.7;1,1;industrialtest_gui_electricity_bg.png]"),
|
||||||
|
"list[context;powerStorage;4.7,3.7;1,1]",
|
||||||
|
"listring[context;powerStorage]"
|
||||||
|
}
|
||||||
|
return parentFormspec..table.concat(formspec,"")
|
||||||
|
end
|
||||||
|
|
||||||
|
function industrialtest.Magnetizer.determinePowerCapacity(self,pos)
|
||||||
|
local meta=minetest.get_meta(pos)
|
||||||
|
if meta:contains("lowY") and meta:contains("highY") then
|
||||||
|
local lowY=meta:get_int("lowY")
|
||||||
|
local highY=meta:get_int("highY")
|
||||||
|
local capacity=self.capacity+(highY-lowY)*self._capacityPerFence
|
||||||
|
meta:set_int("industrialtest.powerCapacity",capacity)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Checks all sides on the same Y level if there is rail made from metal fences attached
|
||||||
|
function industrialtest.Magnetizer.determineFenceRail(self,pos)
|
||||||
|
local neighbourPositions={
|
||||||
|
vector.offset(pos,-1,0,0),
|
||||||
|
vector.offset(pos,1,0,0),
|
||||||
|
vector.offset(pos,0,0,-1),
|
||||||
|
vector.offset(pos,0,0,1)
|
||||||
|
}
|
||||||
|
local railPosition
|
||||||
|
for _,neighbourPosition in ipairs(neighbourPositions) do
|
||||||
|
local neighbourNode=minetest.get_node(neighbourPosition)
|
||||||
|
if minetest.get_item_group(neighbourNode.name,"_industrialtest_metalFence")>0 then
|
||||||
|
railPosition=neighbourPosition
|
||||||
|
break
|
||||||
|
end
|
||||||
|
end
|
||||||
|
if not railPosition then
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
|
local direction=vector.subtract(railPosition,pos)
|
||||||
|
minetest.swap_node(pos,{
|
||||||
|
name=self.name,
|
||||||
|
-- Some cryptic code that converts direction vector to param2
|
||||||
|
param2=direction.z+1*math.abs(direction.z)+direction.x+2*math.abs(direction.x)
|
||||||
|
})
|
||||||
|
|
||||||
|
-- Find low and high points of fence rail
|
||||||
|
local lowY=findFenceRailEnd(railPosition,-1)
|
||||||
|
local highY=findFenceRailEnd(railPosition,1)
|
||||||
|
|
||||||
|
-- Keep magnetizer position in fence metadata so new fences can be attached easily
|
||||||
|
for y=lowY,highY,1 do
|
||||||
|
local meta=minetest.get_meta(vector.new(railPosition.x,y,railPosition.z))
|
||||||
|
meta:set_string("magnetizerPosition",minetest.serialize(pos))
|
||||||
|
end
|
||||||
|
|
||||||
|
local meta=minetest.get_meta(pos)
|
||||||
|
meta:set_string("railPosition",minetest.serialize(railPosition))
|
||||||
|
meta:set_int("lowY",lowY)
|
||||||
|
meta:set_int("highY",highY)
|
||||||
|
end
|
||||||
|
|
||||||
|
function industrialtest.Magnetizer.detachFenceRail(pos)
|
||||||
|
local meta=minetest.get_meta(pos)
|
||||||
|
if not meta:contains("railPosition") or not meta:contains("lowY") or not meta:contains("highY") then
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
|
local railPosition=minetest.deserialize(meta:get_string("railPosition"))
|
||||||
|
local lowY=meta:get_int("lowY")
|
||||||
|
local highY=meta:get_int("highY")
|
||||||
|
for y=lowY,highY,1 do
|
||||||
|
local fenceMeta=minetest.get_meta(vector.new(railPosition.x,y,railPosition.z))
|
||||||
|
fenceMeta:set_string("magnetizerPosition","")
|
||||||
|
end
|
||||||
|
meta:set_string("railPosition","")
|
||||||
|
end
|
||||||
|
|
||||||
|
industrialtest.Magnetizer:register()
|
||||||
|
|
||||||
|
minetest.register_craft({
|
||||||
|
type="shaped",
|
||||||
|
output="industrialtest:magnetizer",
|
||||||
|
recipe={
|
||||||
|
{industrialtest.elementKeys.powerCarrier,"industrialtest:iron_fence",industrialtest.elementKeys.powerCarrier},
|
||||||
|
{industrialtest.elementKeys.powerCarrier,"industrialtest:machine_block",industrialtest.elementKeys.powerCarrier},
|
||||||
|
{industrialtest.elementKeys.powerCarrier,"industrialtest:iron_fence",industrialtest.elementKeys.powerCarrier}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
-- Players to which Y velocity should be added
|
||||||
|
local validatedPlayers={}
|
||||||
|
-- Time since last check to which players the effect should be applied
|
||||||
|
local validationDelta=0.2
|
||||||
|
minetest.register_globalstep(function(dtime)
|
||||||
|
validationDelta=validationDelta+dtime
|
||||||
|
if validationDelta>=0.2 then
|
||||||
|
validatedPlayers={}
|
||||||
|
local players=minetest.get_connected_players()
|
||||||
|
for _,player in ipairs(players) do
|
||||||
|
local control=player:get_player_control()
|
||||||
|
if (control.jump or control.sneak) and hasMetalBoots(player) then
|
||||||
|
local props=player:get_properties()
|
||||||
|
local pos=player:get_pos()
|
||||||
|
local offsets={
|
||||||
|
vector.new(props.collisionbox[1],0,0),
|
||||||
|
vector.new(props.collisionbox[4],0,0),
|
||||||
|
vector.new(0,0,props.collisionbox[3]),
|
||||||
|
vector.new(0,0,props.collisionbox[6])
|
||||||
|
}
|
||||||
|
for _,offset in ipairs(offsets) do
|
||||||
|
local targetPos=vector.add(pos,offset)
|
||||||
|
local targetNode=minetest.get_node(targetPos)
|
||||||
|
if minetest.get_item_group(targetNode.name,"_industrialtest_metalFence")>0 then
|
||||||
|
local fenceMeta=minetest.get_meta(targetPos)
|
||||||
|
if fenceMeta:contains("magnetizerPosition") then
|
||||||
|
table.insert(validatedPlayers,{
|
||||||
|
playerName=player:get_player_name(),
|
||||||
|
magnetizerPosition=minetest.deserialize(fenceMeta:get_string("magnetizerPosition")),
|
||||||
|
multiplier=(control.sneak and 0.55 or 1)
|
||||||
|
})
|
||||||
|
break
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
for _,validatedPlayer in ipairs(validatedPlayers) do
|
||||||
|
local player=minetest.get_player_by_name(validatedPlayer.playerName)
|
||||||
|
if player then
|
||||||
|
local magnetizerMeta=minetest.get_meta(validatedPlayer.magnetizerPosition)
|
||||||
|
local physicsOverride=player:get_physics_override()
|
||||||
|
local requiredPower=industrialtest.Magnetizer._opPower*physicsOverride.gravity
|
||||||
|
if magnetizerMeta:get_int("industrialtest.powerAmount")>=requiredPower then
|
||||||
|
industrialtest.api.addPower(magnetizerMeta,-requiredPower)
|
||||||
|
industrialtest.Magnetizer:requestPower(validatedPlayer.magnetizerPosition)
|
||||||
|
industrialtest.Magnetizer:updateFormspec(validatedPlayer.magnetizerPosition)
|
||||||
|
industrialtest.internal.addYVelocityClamped(player,30*dtime*physicsOverride.gravity*validatedPlayer.multiplier,5*physicsOverride.gravity)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end)
|
||||||
@@ -166,6 +166,8 @@ function industrialtest.Miner.onConstruct(self,pos)
|
|||||||
inv:set_size("powerStorage",1)
|
inv:set_size("powerStorage",1)
|
||||||
inv:set_size("upgrades",1)
|
inv:set_size("upgrades",1)
|
||||||
meta:set_int("level",pos.y-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)
|
industrialtest.ElectricMachine.onConstruct(self,pos)
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -184,13 +186,13 @@ function industrialtest.Miner.getFormspec(self,pos)
|
|||||||
local meta=minetest.get_meta(pos)
|
local meta=minetest.get_meta(pos)
|
||||||
local powerPercent=meta:get_int("industrialtest.powerAmount")/meta:get_int("industrialtest.powerCapacity")*100
|
local powerPercent=meta:get_int("industrialtest.powerAmount")/meta:get_int("industrialtest.powerCapacity")*100
|
||||||
local formspec={
|
local formspec={
|
||||||
"label[0.7,1.2;"..S("Drill").."]",
|
"label[0.7,1.15;"..S("Drill").."]",
|
||||||
"list[context;drill;0.7,1.5;1,1]",
|
"list[context;drill;0.7,1.5;1,1]",
|
||||||
industrialtest.internal.getItemSlotBg(0.7,1.5,1,1),
|
industrialtest.internal.getItemSlotBg(0.7,1.5,1,1),
|
||||||
"label[0.7,2.8;"..S("Pipe").."]",
|
"label[0.7,2.75;"..S("Pipe").."]",
|
||||||
"list[context;src;0.7,3.1;1,1]",
|
"list[context;src;0.7,3.1;1,1]",
|
||||||
industrialtest.internal.getItemSlotBg(0.7,3.1,1,1),
|
industrialtest.internal.getItemSlotBg(0.7,3.1,1,1),
|
||||||
"label[0.7,4.4;"..S("Scanner").."]",
|
"label[0.7,4.35;"..S("Scanner").."]",
|
||||||
"list[context;scanner;0.7,4.7;1,1]",
|
"list[context;scanner;0.7,4.7;1,1]",
|
||||||
industrialtest.internal.getItemSlotBg(0.7,4.7,1,1),
|
industrialtest.internal.getItemSlotBg(0.7,4.7,1,1),
|
||||||
"list[context;dst;2.28,1.9;5,3]",
|
"list[context;dst;2.28,1.9;5,3]",
|
||||||
@@ -283,6 +285,14 @@ function industrialtest.Miner.update(self,pos,elapsed,meta,inv)
|
|||||||
srcSlot:take_item(1)
|
srcSlot:take_item(1)
|
||||||
inv:set_stack("src",1,srcSlot)
|
inv:set_stack("src",1,srcSlot)
|
||||||
local targetPos=vector.new(pos.x,level,pos.z)
|
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)
|
local drop=self.getNodeDrop(targetPos)
|
||||||
self.placeMiningPipe(pos,targetPos)
|
self.placeMiningPipe(pos,targetPos)
|
||||||
inv:add_item("dst",drop)
|
inv:add_item("dst",drop)
|
||||||
@@ -375,8 +385,27 @@ function industrialtest.Miner.placeMiningPipe(minerPos,pos)
|
|||||||
meta:set_string("miner",minetest.serialize(minerPos))
|
meta:set_string("miner",minetest.serialize(minerPos))
|
||||||
end
|
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.Miner:register()
|
||||||
|
|
||||||
|
industrialtest.api.registerPumpTarget("industrialtest:miner","i")
|
||||||
|
|
||||||
minetest.register_craft({
|
minetest.register_craft({
|
||||||
type="shaped",
|
type="shaped",
|
||||||
output="industrialtest:miner",
|
output="industrialtest:miner",
|
||||||
|
|||||||
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.35;"..S("Input").."]",
|
||||||
|
"label[4.6,1.35;"..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
|
-- You should have received a copy of the GNU General Public License
|
||||||
-- along with this program. If not, see <http://www.gnu.org/licenses/>.
|
-- 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.SimpleElectricItemProcessor=table.copy(industrialtest.ActivatedElectricMachine)
|
||||||
industrialtest.internal.unpackTableInto(industrialtest.SimpleElectricItemProcessor,{
|
industrialtest.internal.unpackTableInto(industrialtest.SimpleElectricItemProcessor,{
|
||||||
facedir=true,
|
facedir=true,
|
||||||
@@ -51,7 +53,9 @@ function industrialtest.SimpleElectricItemProcessor.getFormspec(self,pos)
|
|||||||
local meta=minetest.get_meta(pos)
|
local meta=minetest.get_meta(pos)
|
||||||
local powerPercent=meta:get_int("industrialtest.powerAmount")/meta:get_int("industrialtest.powerCapacity")*100
|
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 srcPercent=meta:get_float("srcTime")/meta:get_float("maxSrcTime")*100
|
||||||
|
local recipeOverride=self.isRecipeOverride(meta)
|
||||||
local formspec={
|
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]",
|
"list[context;src;3.4,1.8;1,1]",
|
||||||
industrialtest.internal.getItemSlotBg(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]"
|
(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)
|
local output=self:getCraftResult(srcSlot)
|
||||||
return output and output.time>0 and inv:room_for_item("dst",output.item)
|
return output and output.time>0 and inv:room_for_item("dst",output.item)
|
||||||
end
|
end
|
||||||
return false
|
|
||||||
|
return meta:contains("recipeOverride") and meta:contains("recipeOverrideMaxTime") and meta:get_string("recipeOverride")~=""
|
||||||
end
|
end
|
||||||
|
|
||||||
function industrialtest.SimpleElectricItemProcessor.shouldDeactivate(self,pos)
|
function industrialtest.SimpleElectricItemProcessor.shouldDeactivate(self,pos)
|
||||||
@@ -164,6 +169,10 @@ function industrialtest.SimpleElectricItemProcessor.shouldDeactivate(self,pos)
|
|||||||
return true
|
return true
|
||||||
end
|
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)
|
local srcSlot=inv:get_stack("src",1)
|
||||||
if srcSlot:is_empty() then
|
if srcSlot:is_empty() then
|
||||||
return true
|
return true
|
||||||
@@ -179,11 +188,15 @@ function industrialtest.SimpleElectricItemProcessor.activeUpdate(self,pos,elapse
|
|||||||
local srcTime=0
|
local srcTime=0
|
||||||
local maxSrcTime
|
local maxSrcTime
|
||||||
if meta:get_float("maxSrcTime")<=0 then
|
if meta:get_float("maxSrcTime")<=0 then
|
||||||
local output=self:getCraftResult(srcSlot)
|
local recipeOverride=self.isRecipeOverride(meta)
|
||||||
maxSrcTime=output.time*self.efficiency
|
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("srcTime",0)
|
||||||
meta:set_float("maxSrcTime",maxSrcTime)
|
meta:set_float("maxSrcTime",maxSrcTime)
|
||||||
shouldUpdateFormspec=true
|
|
||||||
else
|
else
|
||||||
srcTime=meta:get_float("srcTime")
|
srcTime=meta:get_float("srcTime")
|
||||||
maxSrcTime=meta:get_float("maxSrcTime")
|
maxSrcTime=meta:get_float("maxSrcTime")
|
||||||
@@ -196,25 +209,38 @@ function industrialtest.SimpleElectricItemProcessor.activeUpdate(self,pos,elapse
|
|||||||
meta:set_int("srcTime",srcTime)
|
meta:set_int("srcTime",srcTime)
|
||||||
|
|
||||||
if srcTime>=maxSrcTime then
|
if srcTime>=maxSrcTime then
|
||||||
local output=self:getCraftResult(srcSlot)
|
local recipeOverride=self.isRecipeOverride(meta)
|
||||||
local usedItems=srcSlot:get_count()-output.src:get_count()
|
if recipeOverride then
|
||||||
local multiplier=1
|
inv:add_item("dst",ItemStack(recipeOverride))
|
||||||
if srcSlot:get_count()>=speed*usedItems then
|
meta:set_string("recipeOverride","")
|
||||||
multiplier=speed
|
else
|
||||||
end
|
local output=self:getCraftResult(srcSlot)
|
||||||
if output.item:get_count()>0 then
|
local usedItems=srcSlot:get_count()-output.src:get_count()
|
||||||
output.item:set_count(output.item:get_count()*multiplier)
|
local multiplier=1
|
||||||
inv:add_item("dst",output.item)
|
if srcSlot:get_count()>=speed*usedItems then
|
||||||
|
multiplier=speed
|
||||||
|
end
|
||||||
|
if output.item:get_count()>0 then
|
||||||
|
output.item:set_count(output.item:get_count()*multiplier)
|
||||||
|
inv:add_item("dst",output.item)
|
||||||
|
end
|
||||||
|
srcSlot:set_count(srcSlot:get_count()-multiplier*usedItems)
|
||||||
|
inv:set_stack("src",1,srcSlot)
|
||||||
end
|
end
|
||||||
meta:set_float("srcTime",-1)
|
meta:set_float("srcTime",-1)
|
||||||
meta:set_float("maxSrcTime",0)
|
meta:set_float("maxSrcTime",0)
|
||||||
srcSlot:set_count(srcSlot:get_count()-multiplier*usedItems)
|
|
||||||
inv:set_stack("src",1,srcSlot)
|
|
||||||
end
|
end
|
||||||
|
|
||||||
return true
|
return true
|
||||||
end
|
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)
|
function industrialtest.SimpleElectricItemProcessor.getCraftResult(self,itemstack)
|
||||||
-- Dummy method
|
-- Dummy method
|
||||||
end
|
end
|
||||||
|
|||||||
125
nodes.lua
@@ -489,3 +489,128 @@ minetest.register_craft({
|
|||||||
{industrialtest.elementKeys.glass,"industrialtest:advanced_alloy",industrialtest.elementKeys.glass}
|
{industrialtest.elementKeys.glass,"industrialtest:advanced_alloy",industrialtest.elementKeys.glass}
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
|
-- \brief Function which should be called after iron fence was constructed
|
||||||
|
-- \param pos vector
|
||||||
|
-- \returns nil
|
||||||
|
local function ironFenceOnConstruct(pos)
|
||||||
|
local neighbours={
|
||||||
|
vector.offset(pos,0,-1,0),
|
||||||
|
vector.offset(pos,0,1,0)
|
||||||
|
}
|
||||||
|
for _,neighbourPosition in ipairs(neighbours) do
|
||||||
|
local meta=minetest.get_meta(neighbourPosition)
|
||||||
|
if meta:contains("magnetizerPosition") then
|
||||||
|
local magnetizerPosition=minetest.deserialize(meta:get_string("magnetizerPosition"))
|
||||||
|
industrialtest.Magnetizer:determineFenceRail(magnetizerPosition)
|
||||||
|
industrialtest.Magnetizer:determinePowerCapacity(magnetizerPosition)
|
||||||
|
industrialtest.Magnetizer:updateFormspec(magnetizerPosition)
|
||||||
|
industrialtest.Magnetizer:requestPower(magnetizerPosition)
|
||||||
|
break
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
neighbours={
|
||||||
|
vector.offset(pos,1,0,0),
|
||||||
|
vector.offset(pos,-1,0,0),
|
||||||
|
vector.offset(pos,0,0,1),
|
||||||
|
vector.offset(pos,0,0,-1)
|
||||||
|
}
|
||||||
|
for _,neighbourPosition in ipairs(neighbours) do
|
||||||
|
local neighbourNode=minetest.get_node(neighbourPosition)
|
||||||
|
if neighbourNode.name=="industrialtest:magnetizer" then
|
||||||
|
local meta=minetest.get_meta(neighbourPosition)
|
||||||
|
if not meta:contains("railPosition") then
|
||||||
|
industrialtest.Magnetizer:determineFenceRail(neighbourPosition)
|
||||||
|
industrialtest.Magnetizer:determinePowerCapacity(neighbourPosition)
|
||||||
|
industrialtest.Magnetizer:updateFormspec(neighbourPosition)
|
||||||
|
industrialtest.Magnetizer:requestPower(neighbourPosition)
|
||||||
|
break
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
-- \brief Function which should be called before iron fence was removed
|
||||||
|
-- \param pos vector
|
||||||
|
-- \returns nil
|
||||||
|
local function ironFenceOnDestruct(pos)
|
||||||
|
local meta=minetest.get_meta(pos)
|
||||||
|
if not meta:contains("magnetizerPosition") then
|
||||||
|
return
|
||||||
|
end
|
||||||
|
local magnetizerPosition=minetest.deserialize(meta:get_string("magnetizerPosition"))
|
||||||
|
industrialtest.Magnetizer.detachFenceRail(magnetizerPosition)
|
||||||
|
end
|
||||||
|
|
||||||
|
-- \brief Function which should be called after iron fence was removed
|
||||||
|
-- \param meta table
|
||||||
|
-- \returns nil
|
||||||
|
local function ironFenceDetach(meta)
|
||||||
|
if not meta or not meta.fields or not meta.fields.magnetizerPosition then
|
||||||
|
return
|
||||||
|
end
|
||||||
|
local magnetizerPosition=minetest.deserialize(meta.fields.magnetizerPosition)
|
||||||
|
industrialtest.Magnetizer:determineFenceRail(magnetizerPosition)
|
||||||
|
industrialtest.Magnetizer:determinePowerCapacity(magnetizerPosition)
|
||||||
|
industrialtest.Magnetizer:updateFormspec(magnetizerPosition)
|
||||||
|
end
|
||||||
|
|
||||||
|
if industrialtest.mtgAvailable then
|
||||||
|
local inventoryImage="default_fence_overlay.png^default_steel_block.png^default_fence_overlay.png^[makealpha:255,126,126"
|
||||||
|
default.register_fence("industrialtest:iron_fence",{
|
||||||
|
description=S("Iron Fence"),
|
||||||
|
texture="default_steel_block.png",
|
||||||
|
inventory_image=inventoryImage,
|
||||||
|
wield_image=inventoryImage,
|
||||||
|
groups={
|
||||||
|
cracky=1,
|
||||||
|
level=2,
|
||||||
|
_industrialtest_metalFence=1
|
||||||
|
},
|
||||||
|
sounds=default.node_sound_metal_defaults(),
|
||||||
|
connects_to={
|
||||||
|
"group:fence",
|
||||||
|
"group:wood",
|
||||||
|
"group:tree",
|
||||||
|
"group:wall",
|
||||||
|
"industrialtest:magnetizer"
|
||||||
|
},
|
||||||
|
on_construct=ironFenceOnConstruct,
|
||||||
|
on_destruct=ironFenceOnDestruct,
|
||||||
|
after_dig_node=function(pos,oldnode,oldmeta)
|
||||||
|
ironFenceDetach(oldmeta)
|
||||||
|
end
|
||||||
|
})
|
||||||
|
minetest.register_craft({
|
||||||
|
type="shaped",
|
||||||
|
output="industrialtest:iron_fence 4",
|
||||||
|
recipe={
|
||||||
|
{"industrialtest:iron_plate","industrialtest:iron_plate","industrialtest:iron_plate"},
|
||||||
|
{"industrialtest:iron_plate","industrialtest:iron_plate","industrialtest:iron_plate"}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
elseif industrialtest.mclAvailable then
|
||||||
|
mcl_fences.register_fence_def("iron_fence",{
|
||||||
|
description=S("Iron Fence"),
|
||||||
|
tiles={"default_steel_block.png"},
|
||||||
|
groups={
|
||||||
|
_industrialtest_metalFence=1
|
||||||
|
},
|
||||||
|
connects_to={
|
||||||
|
"group:fence",
|
||||||
|
"group:fence_gate",
|
||||||
|
"group:solid",
|
||||||
|
"industrialtest:magnetizer"
|
||||||
|
},
|
||||||
|
on_construct=ironFenceOnConstruct,
|
||||||
|
on_destruct=ironFenceOnDestruct,
|
||||||
|
after_destruct=function(pos,oldnode,oldmeta)
|
||||||
|
ironFenceDetach(oldmeta)
|
||||||
|
end,
|
||||||
|
_mcl_fences_baseitem="industrialtest:iron_plate",
|
||||||
|
_mcl_fences_stickreplacer="industrialtest:iron_plate"
|
||||||
|
})
|
||||||
|
-- mcl_fences.register_fence_def registers fences in it's own namespace so register alias here to keep compatibility
|
||||||
|
minetest.register_alias("industrialtest:iron_fence","mcl_fences:iron_fence")
|
||||||
|
end
|
||||||
|
|||||||
BIN
textures/industrialtest_guide_cable_former.png
Normal file
|
After Width: | Height: | Size: 8.9 KiB |
BIN
textures/industrialtest_guide_canning_machine.png
Normal file
|
After Width: | Height: | Size: 8.6 KiB |
BIN
textures/industrialtest_guide_compressor.png
Normal file
|
After Width: | Height: | Size: 9.3 KiB |
BIN
textures/industrialtest_guide_electric_furnace.png
Normal file
|
After Width: | Height: | Size: 8.8 KiB |
BIN
textures/industrialtest_guide_explosion.png
Normal file
|
After Width: | Height: | Size: 295 KiB |
BIN
textures/industrialtest_guide_extractor.png
Normal file
|
After Width: | Height: | Size: 10 KiB |
BIN
textures/industrialtest_guide_generator.png
Normal file
|
After Width: | Height: | Size: 8.4 KiB |
BIN
textures/industrialtest_guide_geothermal_generator.png
Normal file
|
After Width: | Height: | Size: 8.7 KiB |
BIN
textures/industrialtest_guide_induction_furnace.png
Normal file
|
After Width: | Height: | Size: 11 KiB |
BIN
textures/industrialtest_guide_introduction.png
Normal file
|
After Width: | Height: | Size: 321 KiB |
BIN
textures/industrialtest_magnetizer_front.png
Normal file
|
After Width: | Height: | Size: 4.3 KiB |
BIN
textures/industrialtest_pump_front.png
Normal file
|
After Width: | Height: | Size: 4.3 KiB |
BIN
textures/industrialtest_pump_front_active.png
Normal file
|
After Width: | Height: | Size: 4.6 KiB |
BIN
textures/industrialtest_pump_side.png
Normal file
|
After Width: | Height: | Size: 4.2 KiB |
@@ -25,7 +25,7 @@ function industrialtest.JetpackBase.update(self, player, inv, itemstack, dtime)
|
|||||||
local playerName = player:get_player_name()
|
local playerName = player:get_player_name()
|
||||||
local control = player:get_player_control()
|
local control = player:get_player_control()
|
||||||
if control.jump and self:tryFly(itemstack) then
|
if control.jump and self:tryFly(itemstack) then
|
||||||
self.addYVelocityClamped(player,1,10)
|
industrialtest.internal.addYVelocityClamped(player,1,10)
|
||||||
if not soundHandles[playerName] then
|
if not soundHandles[playerName] then
|
||||||
local pos = player:get_pos()
|
local pos = player:get_pos()
|
||||||
local handle = minetest.sound_play("industrialtest_jetpack_loop", {
|
local handle = minetest.sound_play("industrialtest_jetpack_loop", {
|
||||||
@@ -47,15 +47,6 @@ function industrialtest.JetpackBase.update(self, player, inv, itemstack, dtime)
|
|||||||
return false
|
return false
|
||||||
end
|
end
|
||||||
|
|
||||||
function industrialtest.JetpackBase.addYVelocityClamped(player,vel,max)
|
|
||||||
local playerVel=player:get_velocity()
|
|
||||||
if playerVel.y+vel>max then
|
|
||||||
player:add_velocity(vector.new(0,math.max(max-playerVel.y,0),0))
|
|
||||||
else
|
|
||||||
player:add_velocity(vector.new(0,vel,0))
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
industrialtest.Jetpack=table.copy(industrialtest.JetpackBase)
|
industrialtest.Jetpack=table.copy(industrialtest.JetpackBase)
|
||||||
industrialtest.internal.unpackTableInto(industrialtest.Jetpack,{
|
industrialtest.internal.unpackTableInto(industrialtest.Jetpack,{
|
||||||
-- _v is hack to suppress "Registered armor doesn't have material at the end of registration name" warning from 3D Armor.
|
-- _v is hack to suppress "Registered armor doesn't have material at the end of registration name" warning from 3D Armor.
|
||||||
|
|||||||
@@ -87,7 +87,7 @@ industrialtest.internal.unpackTableInto(industrialtest.QuantumBodyarmor,{
|
|||||||
part="torso",
|
part="torso",
|
||||||
modelImage="industrialtest_quantum_bodyarmor.png",
|
modelImage="industrialtest_quantum_bodyarmor.png",
|
||||||
update=industrialtest.JetpackBase.update,
|
update=industrialtest.JetpackBase.update,
|
||||||
addYVelocityClamped=industrialtest.JetpackBase.addYVelocityClamped,
|
addYVelocityClamped=industrialtest.internal.addYVelocityClamped,
|
||||||
tryFly=industrialtest.ElectricJetpack.tryFly
|
tryFly=industrialtest.ElectricJetpack.tryFly
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|||||||