Compare commits

..

No commits in common. "master" and "sound" have entirely different histories.

43 changed files with 593 additions and 1721 deletions

4
TEXTURES_TODO.md Normal file
View File

@ -0,0 +1,4 @@
# List of textures that still have to be done
- bronze toolset for MCL
- bronze nugget for MCL
- advanced electronic circuit

View File

@ -16,13 +16,19 @@
local S=minetest.get_translator("industrialtest") local S=minetest.get_translator("industrialtest")
local function createItemFluidStorageText(itemstack) -- \brief Prepares itemstack containing fluid storage
-- \param itemstack ItemStack
-- \returns bool
function industrialtest.api.prepareFluidStorageItem(itemstack)
local meta=itemstack:get_meta() local meta=itemstack:get_meta()
local fluidCapacity=meta:get_int("industrialtest.fluidCapacity") local def=itemstack:get_definition()
local fluidAmount=meta:get_int("industrialtest.fluidAmount") if industrialtest.api.itemHasFluidStorage(itemstack) or not def.groups or not def.groups._industrialtest_fluidStorage or not def._industrialtest_fluidCapacity then
local lowerLimit=math.floor(fluidCapacity*0.25) return false
local color=(fluidAmount>lowerLimit and "#0000FF" or "#FF0000") end
return minetest.colorize(color,S("@1 / @2 mB",fluidAmount,fluidCapacity)) meta:set_int("industrialtest.fluidAmount",0)
meta:set_int("industrialtest.fluidCapacity",def._industrialtest_fluidCapacity)
industrialtest.api.updateItemFluidText(itemstack)
return true
end end
-- \brief Check if itemstack contains fluid storage -- \brief Check if itemstack contains fluid storage
@ -74,13 +80,8 @@ end
-- \returns nil -- \returns nil
function industrialtest.api.updateItemFluidText(itemstack) function industrialtest.api.updateItemFluidText(itemstack)
local meta=itemstack:get_meta() local meta=itemstack:get_meta()
if industrialtest.mtgAvailable then local def=itemstack:get_definition()
local def=itemstack:get_definition() meta:set_string("description",S("@1\n@2 / @3 mB",def.description,meta:get_int("industrialtest.fluidAmount"),meta:get_int("industrialtest.fluidCapacity")))
local fluidStorageText=createItemFluidStorageText(itemstack)
meta:set_string("description",string.format("%s\n%s",def.description,fluidStorageText))
elseif industrialtest.mclAvailable then
tt.reload_itemstack_description(itemstack)
end
itemstack:set_wear(65535-meta:get_int("industrialtest.fluidAmount")/meta:get_int("industrialtest.fluidCapacity")*65534) itemstack:set_wear(65535-meta:get_int("industrialtest.fluidAmount")/meta:get_int("industrialtest.fluidCapacity")*65534)
end end
@ -118,15 +119,3 @@ function industrialtest.api.transferFluidToItem(srcItemstack,itemstack,amount)
industrialtest.api.updateItemFluidText(srcItemstack) industrialtest.api.updateItemFluidText(srcItemstack)
return actualFlow return actualFlow
end end
if industrialtest.mclAvailable then
tt.register_snippet(function(itemstring,toolCapabilities,itemstack)
if not itemstack then
return nil
end
if not industrialtest.api.itemHasFluidStorage(itemstack) then
return nil
end
return createItemFluidStorageText(itemstack),false
end)
end

View File

@ -41,102 +41,6 @@ local function clampFlow(pos,flow)
return math.min(flow,newFlow) return math.min(flow,newFlow)
end end
-- \brief Finds path from pos to dest in network. Function finished if either dest is found or every node was visited
-- \param pos Vector
-- \param dest Vector
-- \returns table or nil
function industrialtest.api.findPathInNetwork(pos,dest)
local connections=industrialtest.api.getConnections(pos,"i")
if #connections==0 then
return nil
end
local workers={}
local serializedSourcePos=pos.x..","..pos.y..","..pos.z
local visitedNodes={[serializedSourcePos]=true}
for _,conn in ipairs(connections) do
local sideVector=vector.subtract(conn,pos)
table.insert(workers,{
position=conn,
direction=sideVector,
path={[1]=conn}
})
end
while #workers>0 do
for i=1,#workers do
local worker=workers[i]
local serializedPos=worker.position.x..","..worker.position.y..","..worker.position.z
if visitedNodes[serializedPos] then
table.remove(workers,i)
break
end
visitedNodes[serializedPos]=true
if worker.position.x==dest.x and worker.position.y==dest.y and worker.position.z==dest.z then
return worker.path
end
local def=minetest.registered_nodes[minetest.get_node(worker.position).name]
if def and def.groups and def.groups._industrialtest_cable then
connections=industrialtest.api.getConnections(worker.position,"i")
for j=1,#connections do
local direction=vector.subtract(connections[j],worker.position)
local oppositeDirection=vector.multiply(worker.direction,vector.new(-1,-1,-1))
if direction.x~=oppositeDirection.x or direction.y~=oppositeDirection.y or direction.z~=oppositeDirection.z then
if worker.direction.x~=direction.x or worker.direction.y~=direction.y or worker.direction.z~=direction.z then
table.insert(worker.path,worker.position)
end
for c=1,#connections do
local nextDirection=vector.subtract(connections[c],worker.position)
if c~=j and (nextDirection.x~=oppositeDirection.x or nextDirection.y~=oppositeDirection.y or nextDirection.z~=oppositeDirection.z) then
local newWorker={
position=connections[c],
direction=nextDirection,
path=table.copy(worker.path)
}
table.insert(newWorker.path,worker.position)
table.insert(workers,newWorker)
end
end
worker.direction=direction
worker.position=connections[j]
break
end
end
if #connections>2 then
break
end
else
table.remove(workers,i)
break
end
end
end
return nil
end
-- \brief Goes through path vertices specified by path running callback on each node.
-- Function finishes if either callback returns false or entire path is went over.
-- \param path table
-- \param callback function
-- \returns nil
function industrialtest.api.walkPath(path,callback)
local pos=path[1]
for i=2,#path do
local pathNode=path[i]
local direction=vector.normalize(vector.subtract(pathNode,pos))
while pos.x~=pathNode.x or pos.y~=pathNode.y or pos.z~=pathNode.z do
if not callback(pos) then
return
end
pos=vector.add(pos,direction)
end
end
end
-- \brief Transfers power from source node to it's network, if sides is set then power will be only transfered to network connected to that sides -- \brief Transfers power from source node to it's network, if sides is set then power will be only transfered to network connected to that sides
-- \param pos Vector with position of source node -- \param pos Vector with position of source node
-- \param (optional) sides table with Vectors -- \param (optional) sides table with Vectors
@ -190,42 +94,14 @@ function industrialtest.api.powerFlow(pos,sides,flowOverride)
def._industrialtest_self:triggerIfNeeded(endpoint.position) def._industrialtest_self:triggerIfNeeded(endpoint.position)
else else
-- Support for bare definitions that don't use industrialtest pseudo-OOP -- Support for bare definitions that don't use industrialtest pseudo-OOP
minetest.get_node_timer(endpoint.position):start(industrialtest.config.updateDelay) minetest.get_node_timer(endpoint.position):start(industrialtest.updateDelay)
end end
if not industrialtest.api.isFullyCharged(endpointMeta) then if not industrialtest.api.isFullyCharged(endpointMeta) then
roomAvailable=true roomAvailable=true
end end
else else
local path=industrialtest.api.findPathInNetwork(pos,endpoint.position) minetest.remove_node(endpoint.position)
if path and #path>0 then industrialtest.internal.explode(endpoint.position,2)
table.insert(path,endpoint.position)
local removed=false
industrialtest.api.walkPath(path,function(pathPos)
local def=minetest.registered_nodes[minetest.get_node(pathPos).name]
if not def or not def.groups or not def.groups._industrialtest_cable then
return false
end
if powerDistribution>def._industrialtest_cableFlow then
removed=true
minetest.swap_node(pathPos,{
name="air"
})
minetest.remove_node(pathPos)
minetest.check_for_falling(pathPos)
minetest.sound_play("default_cool_lava",{
pos=pathPos,
max_hear_distance=5,
gain=0.7
})
end
return true
end)
if not removed and powerDistribution>endpoint.originalFlow then
minetest.remove_node(endpoint.position)
industrialtest.internal.explode(endpoint.position,2)
end
industrialtest.api.createNetworkMapForNode(pos)
end
end end
end end
end end
@ -323,7 +199,6 @@ function industrialtest.api.createNetworkMap(pos,addCables,omit)
position=worker.position, position=worker.position,
distance=worker.distance, distance=worker.distance,
flow=math.min(worker.flow,flow), flow=math.min(worker.flow,flow),
originalFlow=flow,
side=connectionSide, side=connectionSide,
sourceSide=worker.sourceSide sourceSide=worker.sourceSide
}) })
@ -396,34 +271,6 @@ function industrialtest.api.getNetwork(meta)
return minetest.deserialize(meta:get_string("industrialtest.network")) return minetest.deserialize(meta:get_string("industrialtest.network"))
end end
-- \brief Returns amount of power that will flow from specified network master
-- \param pos Vector
-- \returns number
function industrialtest.api.getFlowingCurrent(pos)
local meta=minetest.get_meta(pos)
if not industrialtest.api.hasPowerStorage(meta) or meta:get_int("industrialtest.powerAmount")==0 then
return 0
end
local network=industrialtest.api.getNetwork(meta)
if not network then
return 0
end
local amount=meta:get_int("industrialtest.powerAmount")
if amount==0 then
return 0
end
local demand=0
for _,endpoint in ipairs(network) do
local endpointMeta=minetest.get_meta(endpoint.position)
if industrialtest.api.hasPowerStorage(endpointMeta) then
demand=demand+math.min(endpointMeta:get_int("industrialtest.powerCapacity")-endpointMeta:get_int("industrialtest.powerAmount"),endpoint.flow)
end
end
return math.min(amount,demand)
end
-- \brief Returns connections of node with power storage. If direction is "i" only input connections will be returned, if direction is "o" only output connections -- \brief Returns connections of node with power storage. If direction is "i" only input connections will be returned, if direction is "o" only output connections
-- will be returned, if it's not provided all connections will be returned. -- will be returned, if it's not provided all connections will be returned.
-- \param pos Vector -- \param pos Vector

View File

@ -16,15 +16,6 @@
local S=minetest.get_translator("industrialtest") local S=minetest.get_translator("industrialtest")
local function createItemPowerText(itemstack)
local meta=itemstack:get_meta()
local powerCapacity=meta:get_int("industrialtest.powerCapacity")
local powerAmount=meta:get_int("industrialtest.powerAmount")
local lowerLimit=math.floor(powerCapacity*0.25)
local color=(powerAmount>lowerLimit and "#00FFFF" or "#FF0000")
return minetest.colorize(color,S("@1 / @2 EU",powerAmount,powerCapacity))
end
-- \brief Adds power storage to metadata -- \brief Adds power storage to metadata
-- \param capacity How much EU item/node can store -- \param capacity How much EU item/node can store
-- \param flow How much EU can flow in or out item/node per industrialtest.updateDelay -- \param flow How much EU can flow in or out item/node per industrialtest.updateDelay
@ -167,14 +158,9 @@ end
-- \returns nil -- \returns nil
function industrialtest.api.updateItemPowerText(itemstack) function industrialtest.api.updateItemPowerText(itemstack)
local meta=itemstack:get_meta() local meta=itemstack:get_meta()
if industrialtest.mtgAvailable then local def=minetest.registered_tools[itemstack:get_name()]
local def=minetest.registered_tools[itemstack:get_name()] local desc=meta:contains("industrialtest.descriptionOverride") and meta:get_string("industrialtest.descriptionOverride") or def.description
local desc=meta:contains("industrialtest.descriptionOverride") and meta:get_string("industrialtest.descriptionOverride") or def.description meta:set_string("description",S("@1\n@2 / @3 EU",desc,meta:get_int("industrialtest.powerAmount"),meta:get_int("industrialtest.powerCapacity")))
local powerText=createItemPowerText(itemstack)
meta:set_string("description",string.format("%s\n%s",desc,powerText))
elseif industrialtest.mclAvailable then
tt.reload_itemstack_description(itemstack)
end
itemstack:set_wear(65535-meta:get_int("industrialtest.powerAmount")/meta:get_int("industrialtest.powerCapacity")*65534) itemstack:set_wear(65535-meta:get_int("industrialtest.powerAmount")/meta:get_int("industrialtest.powerCapacity")*65534)
end end
@ -223,15 +209,3 @@ function industrialtest.api.transferPowerFromItem(srcItemstack,meta,amount)
return actualFlow return actualFlow
end end
if industrialtest.mclAvailable then
tt.register_snippet(function(itemstring,toolCapabilities,itemstack)
if not itemstack then
return nil
end
local meta=itemstack:get_meta()
if not industrialtest.api.hasPowerStorage(meta) then
return nil
end
return createItemPowerText(itemstack),false
end)
end

View File

@ -15,43 +15,27 @@
-- 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") local S=minetest.get_translator("industrialtest")
local cable={}
industrialtest.Cable={} cable.onConstruct=function(pos)
function industrialtest.Cable.onConstruct(self,pos)
local connections=industrialtest.api.getConnections(pos) local connections=industrialtest.api.getConnections(pos)
for _,conn in ipairs(connections) do for _,conn in ipairs(connections) do
local meta=minetest.get_meta(conn) local meta=minetest.get_meta(conn)
if industrialtest.api.isNetworkMaster(meta) then if industrialtest.api.isNetworkMaster(meta) then
industrialtest.api.createNetworkMapForNode(conn) industrialtest.api.createNetworkMapForNode(conn)
local networkNode=minetest.get_node(conn)
local def=minetest.registered_nodes[networkNode.name]
if def and def._industrialtest_self then
def._industrialtest_self:triggerIfNeeded(conn)
else
-- Support for bare definitions that don't use industrialtest pseudo-OOP
minetest.get_node_timer(conn):start(industrialtest.config.updateDelay)
end
else else
local networks=industrialtest.api.isAttachedToNetwork(meta) local networks=industrialtest.api.isAttachedToNetwork(meta)
if networks then if networks then
for _,network in ipairs(networks) do for _,network in ipairs(networks) do
industrialtest.api.createNetworkMapForNode(network) industrialtest.api.createNetworkMapForNode(network)
local networkNode=minetest.get_node(network) minetest.get_node_timer(network):start(industrialtest.updateDelay)
local def=minetest.registered_nodes[networkNode.name]
if def and def._industrialtest_self then
def._industrialtest_self:triggerIfNeeded(network)
else
-- Support for bare definitions that don't use industrialtest pseudo-OOP
minetest.get_node_timer(network):start(industrialtest.config.updateDelay)
end
end end
end end
end end
end end
end end
function industrialtest.Cable.onDestruct(self,pos) cable.onDestruct=function(pos)
local meta=minetest.get_meta(pos) local meta=minetest.get_meta(pos)
local networks=industrialtest.api.isAttachedToNetwork(meta) local networks=industrialtest.api.isAttachedToNetwork(meta)
if networks then if networks then
@ -61,16 +45,14 @@ function industrialtest.Cable.onDestruct(self,pos)
end end
end end
function industrialtest.Cable.createDefinitionTable(self,description,inventoryImage,tile,insulated) local function registerCable(name,displayName,size,flow,registerInsulated)
local size=(insulated and self.size+0.02 or self.size) local definition={
local def={ description=S(displayName.." Cable"),
description=description, inventory_image="industrialtest_"..name.."_cable_inv.png",
inventory_image=inventoryImage, tiles={"industrialtest_"..name.."_cable.png"},
wield_image=inventoryImage, wield_image="industrialtest_"..name.."_cable_inv.png",
tiles={tile},
paramtype="light", paramtype="light",
sunlight_propagates=true, sunlight_propagates=true,
use_texture_alpha=(self.transparent and "clip" or "opaque"),
drawtype="nodebox", drawtype="nodebox",
node_box={ node_box={
type="connected", type="connected",
@ -136,67 +118,39 @@ function industrialtest.Cable.createDefinitionTable(self,description,inventoryIm
"group:_industrialtest_hasPowerOutput", "group:_industrialtest_hasPowerOutput",
"group:_industrialtest_cable" "group:_industrialtest_cable"
}, },
on_construct=function(pos) on_construct=cable.onConstruct,
self:onConstruct(pos) on_destruct=cable.onDestruct,
end, _industrialtest_cableFlow=flow
on_destruct=function(pos)
self:onDestruct(pos)
end,
_industrialtest_cableFlow=self.flow
} }
if industrialtest.mtgAvailable then if industrialtest.mtgAvailable then
def.groups={ definition.groups={
cracky=1, cracky=1,
level=1, level=1,
oddly_breakable_by_hand=1 oddly_breakable_by_hand=1
} }
def.sound=default.node_sound_metal_defaults() definition.sound=default.node_sound_metal_defaults()
elseif industrialtest.mclAvailable then elseif industrialtest.mclAvailable then
def.groups={ definition.groups={
handy=1, handy=1,
pickaxey=1 pickaxey=1
} }
def._mcl_blast_resistance=1 definition._mcl_blast_resistance=1
def._mcl_hardness=0.5 definition._mcl_hardness=0.5
def.sound=mcl_sounds.node_sound_metal_defaults() definition.sound=mcl_sounds.node_sound_metal_defaults()
end end
def.groups._industrialtest_cable=1 definition.groups._industrialtest_cable=1
if insulated then minetest.register_node("industrialtest:"..name.."_cable",definition)
def.groups._industrialtest_insulatedCable=1 if registerInsulated then
end definition=table.copy(definition)
definition.description=S("Insulated "..displayName.." Cable")
return def definition.inventory_image="industrialtest_insulated_"..name.."_cable_inv.png"
end definition.tiles={"industrialtest_insulated_"..name.."_cable.png"}
definition.wield_image="industrialtest_insulated_"..name.."_cable_inv.png"
function industrialtest.Cable.register(self) minetest.register_node("industrialtest:insulated_"..name.."_cable",definition)
local def=self:createDefinitionTable(self.description,self.inventoryImage,self.tile,self.safe)
minetest.register_node(self.name,def)
if self.insulated then
def=self:createDefinitionTable(self.insulated.description,self.insulated.inventoryImage,self.insulated.tile,true)
minetest.register_node(self.insulated.name,def)
end end
end end
industrialtest.TinCable=table.copy(industrialtest.Cable) registerCable("tin","Tin",0.19,industrialtest.api.lvPowerFlow,true)
industrialtest.internal.unpackTableInto(industrialtest.TinCable,{
name="industrialtest:tin_cable",
description=S("Tin Cable"),
inventoryImage="industrialtest_tin_cable_inv.png",
tile="industrialtest_tin_cable.png",
size=0.19,
flow=industrialtest.api.lvPowerFlow,
insulated={
name="industrialtest:insulated_tin_cable",
description=S("Insulated Tin Cable"),
inventoryImage="industrialtest_insulated_tin_cable_inv.png",
tile="industrialtest_insulated_tin_cable.png"
}
})
industrialtest.TinCable:register()
minetest.register_craft({ minetest.register_craft({
type="shaped", type="shaped",
output="industrialtest:tin_cable 6", output="industrialtest:tin_cable 6",
@ -204,7 +158,6 @@ minetest.register_craft({
{industrialtest.elementKeys.tinIngot,industrialtest.elementKeys.tinIngot,industrialtest.elementKeys.tinIngot} {industrialtest.elementKeys.tinIngot,industrialtest.elementKeys.tinIngot,industrialtest.elementKeys.tinIngot}
} }
}) })
minetest.register_craft({ minetest.register_craft({
type="shapeless", type="shapeless",
output="industrialtest:insulated_tin_cable", output="industrialtest:insulated_tin_cable",
@ -213,7 +166,6 @@ minetest.register_craft({
industrialtest.elementKeys.rubber industrialtest.elementKeys.rubber
} }
}) })
minetest.register_craft({ minetest.register_craft({
type="shaped", type="shaped",
output="industrialtest:insulated_tin_cable 6", output="industrialtest:insulated_tin_cable 6",
@ -223,31 +175,13 @@ minetest.register_craft({
{industrialtest.elementKeys.rubber,industrialtest.elementKeys.rubber,industrialtest.elementKeys.rubber} {industrialtest.elementKeys.rubber,industrialtest.elementKeys.rubber,industrialtest.elementKeys.rubber}
} }
}) })
industrialtest.api.registerCableFormerRecipe({ industrialtest.api.registerCableFormerRecipe({
output="industrialtest:tin_cable 12", output="industrialtest:tin_cable 12",
recipe=industrialtest.elementKeys.tinIngot, recipe=industrialtest.elementKeys.tinIngot,
time=1 time=1
}) })
industrialtest.CopperCable=table.copy(industrialtest.Cable) registerCable("copper","Copper",0.15,industrialtest.api.mvPowerFlow,true)
industrialtest.internal.unpackTableInto(industrialtest.CopperCable,{
name="industrialtest:copper_cable",
description=S("Copper Cable"),
inventoryImage="industrialtest_copper_cable_inv.png",
tile="industrialtest_copper_cable.png",
size=0.15,
flow=industrialtest.api.mvPowerFlow,
insulated={
name="industrialtest:insulated_copper_cable",
description=S("Insulated Copper Cable"),
inventoryImage="industrialtest_insulated_copper_cable_inv.png",
tile="industrialtest_insulated_copper_cable.png"
}
})
industrialtest.CopperCable:register()
minetest.register_craft({ minetest.register_craft({
type="shaped", type="shaped",
output="industrialtest:copper_cable 6", output="industrialtest:copper_cable 6",
@ -255,7 +189,6 @@ minetest.register_craft({
{industrialtest.elementKeys.copperIngot,industrialtest.elementKeys.copperIngot,industrialtest.elementKeys.copperIngot} {industrialtest.elementKeys.copperIngot,industrialtest.elementKeys.copperIngot,industrialtest.elementKeys.copperIngot}
} }
}) })
minetest.register_craft({ minetest.register_craft({
type="shapeless", type="shapeless",
output="industrialtest:insulated_copper_cable", output="industrialtest:insulated_copper_cable",
@ -264,7 +197,6 @@ minetest.register_craft({
industrialtest.elementKeys.rubber industrialtest.elementKeys.rubber
} }
}) })
minetest.register_craft({ minetest.register_craft({
type="shaped", type="shaped",
output="industrialtest:insulated_copper_cable 6", output="industrialtest:insulated_copper_cable 6",
@ -274,30 +206,12 @@ minetest.register_craft({
{industrialtest.elementKeys.rubber,industrialtest.elementKeys.rubber,industrialtest.elementKeys.rubber} {industrialtest.elementKeys.rubber,industrialtest.elementKeys.rubber,industrialtest.elementKeys.rubber}
} }
}) })
industrialtest.api.registerCableFormerRecipe({ industrialtest.api.registerCableFormerRecipe({
output="industrialtest:copper_cable 12", output="industrialtest:copper_cable 12",
recipe=industrialtest.elementKeys.copperIngot recipe=industrialtest.elementKeys.copperIngot
}) })
industrialtest.GoldCable=table.copy(industrialtest.Cable) registerCable("gold","Gold",0.15,industrialtest.api.hvPowerFlow,true)
industrialtest.internal.unpackTableInto(industrialtest.GoldCable,{
name="industrialtest:gold_cable",
description=S("Gold Cable"),
inventoryImage="industrialtest_gold_cable_inv.png",
tile="industrialtest_gold_cable.png",
size=0.15,
flow=industrialtest.api.hvPowerFlow,
insulated={
name="industrialtest:insulated_gold_cable",
description=S("Insulated Gold Cable"),
inventoryImage="industrialtest_insulated_gold_cable_inv.png",
tile="industrialtest_insulated_gold_cable.png"
}
})
industrialtest.GoldCable:register()
minetest.register_craft({ minetest.register_craft({
type="shaped", type="shaped",
output="industrialtest:gold_cable 6", output="industrialtest:gold_cable 6",
@ -305,7 +219,6 @@ minetest.register_craft({
{industrialtest.elementKeys.goldIngot,industrialtest.elementKeys.goldIngot,industrialtest.elementKeys.goldIngot} {industrialtest.elementKeys.goldIngot,industrialtest.elementKeys.goldIngot,industrialtest.elementKeys.goldIngot}
} }
}) })
minetest.register_craft({ minetest.register_craft({
type="shapeless", type="shapeless",
output="industrialtest:insulated_gold_cable", output="industrialtest:insulated_gold_cable",
@ -314,7 +227,6 @@ minetest.register_craft({
industrialtest.elementKeys.rubber industrialtest.elementKeys.rubber
} }
}) })
minetest.register_craft({ minetest.register_craft({
type="shaped", type="shaped",
output="industrialtest:insulated_gold_cable 6", output="industrialtest:insulated_gold_cable 6",
@ -324,30 +236,12 @@ minetest.register_craft({
{industrialtest.elementKeys.rubber,industrialtest.elementKeys.rubber,industrialtest.elementKeys.rubber} {industrialtest.elementKeys.rubber,industrialtest.elementKeys.rubber,industrialtest.elementKeys.rubber}
} }
}) })
industrialtest.api.registerCableFormerRecipe({ industrialtest.api.registerCableFormerRecipe({
output="industrialtest:gold_cable 12", output="industrialtest:gold_cable 12",
recipe=industrialtest.elementKeys.goldIngot recipe=industrialtest.elementKeys.goldIngot
}) })
industrialtest.IronCable=table.copy(industrialtest.Cable) registerCable("iron","Iron",0.15,industrialtest.api.evPowerFlow,true)
industrialtest.internal.unpackTableInto(industrialtest.IronCable,{
name="industrialtest:iron_cable",
description=S("Iron Cable"),
inventoryImage="industrialtest_iron_cable_inv.png",
tile="industrialtest_iron_cable.png",
size=0.15,
flow=industrialtest.api.evPowerFlow,
insulated={
name="industrialtest:insulated_iron_cable",
description=S("Insulated Iron Cable"),
inventoryImage="industrialtest_insulated_iron_cable_inv.png",
tile="industrialtest_insulated_iron_cable.png"
}
})
industrialtest.IronCable:register()
minetest.register_craft({ minetest.register_craft({
type="shaped", type="shaped",
output="industrialtest:iron_cable 6", output="industrialtest:iron_cable 6",
@ -355,7 +249,6 @@ minetest.register_craft({
{"industrialtest:refined_iron_ingot","industrialtest:refined_iron_ingot","industrialtest:refined_iron_ingot"} {"industrialtest:refined_iron_ingot","industrialtest:refined_iron_ingot","industrialtest:refined_iron_ingot"}
} }
}) })
minetest.register_craft({ minetest.register_craft({
type="shapeless", type="shapeless",
output="industrialtest:insulated_iron_cable", output="industrialtest:insulated_iron_cable",
@ -364,7 +257,6 @@ minetest.register_craft({
industrialtest.elementKeys.rubber industrialtest.elementKeys.rubber
} }
}) })
minetest.register_craft({ minetest.register_craft({
type="shaped", type="shaped",
output="industrialtest:insulated_iron_cable 6", output="industrialtest:insulated_iron_cable 6",
@ -374,27 +266,13 @@ minetest.register_craft({
{industrialtest.elementKeys.rubber,industrialtest.elementKeys.rubber,industrialtest.elementKeys.rubber} {industrialtest.elementKeys.rubber,industrialtest.elementKeys.rubber,industrialtest.elementKeys.rubber}
} }
}) })
industrialtest.api.registerCableFormerRecipe({ industrialtest.api.registerCableFormerRecipe({
output="industrialtest:iron_cable 12", output="industrialtest:iron_cable 12",
recipe="industrialtest:refined_iron_ingot", recipe="industrialtest:refined_iron_ingot",
time=3 time=3
}) })
industrialtest.GlassFibreCable=table.copy(industrialtest.Cable) registerCable("glass_fibre","Glass Fibre",0.15,industrialtest.api.ivPowerFlow,false)
industrialtest.internal.unpackTableInto(industrialtest.GlassFibreCable,{
name="industrialtest:glass_fibre_cable",
description=S("Glass Fibre Cable"),
inventoryImage="industrialtest_glass_fibre_cable_inv.png",
transparent=true,
tile="industrialtest_glass_fibre_cable.png",
safe=true,
size=0.12,
flow=industrialtest.api.ivPowerFlow
})
industrialtest.GlassFibreCable:register()
minetest.register_craft({ minetest.register_craft({
type="shaped", type="shaped",
output="industrialtest:glass_fibre_cable 4", output="industrialtest:glass_fibre_cable 4",
@ -405,52 +283,3 @@ minetest.register_craft({
} }
}) })
-- TODO: Add glass fibre cable craft with silver ingot -- TODO: Add glass fibre cable craft with silver ingot
if industrialtest.config.electrocution then
local electrocutionDelta=0
minetest.register_globalstep(function(dtime)
electrocutionDelta=electrocutionDelta+dtime
if electrocutionDelta<industrialtest.config.updateDelay then
return
end
electrocutionDelta=0
local offsets={
vector.new(0,0,0),
vector.new(-0.7,0,0),
vector.new(-0.7,1,0),
vector.new(0,1,0),
vector.new(0.7,0,0),
vector.new(0.7,1,0),
vector.new(0,0,-0.7),
vector.new(0,1,-0.7),
vector.new(0,0,0.7),
vector.new(0,1,0.7)
}
local players=minetest.get_connected_players()
for _,player in ipairs(players) do
local pos=player:get_pos()
for _,offset in ipairs(offsets) do
local nodePos=vector.add(pos,offset)
local node=minetest.get_node(nodePos)
local def=minetest.registered_nodes[node.name]
if def and def.groups and def.groups._industrialtest_cable and not def.groups._industrialtest_insulatedCable then
local meta=minetest.get_meta(pos)
local networks=industrialtest.api.isAttachedToNetwork(meta)
if networks then
local current=0
for _,network in ipairs(networks) do
current=current+industrialtest.api.getFlowingCurrent(network)
end
if current>0 then
local removed=math.ceil(current/500)
player:set_hp(player:get_hp()-removed,"electrocution")
break
end
end
end
end
end
end)
end

View File

@ -316,8 +316,7 @@ override={
local meta=minetest.get_meta(pos) local meta=minetest.get_meta(pos)
local inv=meta:get_inventory() local inv=meta:get_inventory()
local result=inv:add_item(listname,stack) local result=inv:add_item(listname,stack)
local nodeDef=minetest.registered_nodes[node.name] minetest.get_node_timer(pos):start(industrialtest.updateDelay)
nodeDef._industrialtest_self:triggerIfNeeded(pos)
return result return result
end, end,
can_insert=function(pos,node,stack,direction) can_insert=function(pos,node,stack,direction)

View File

@ -450,7 +450,6 @@ if industrialtest.mclAvailable then
industrialtest.elementKeys.stick="mcl_core:stick" industrialtest.elementKeys.stick="mcl_core:stick"
industrialtest.elementKeys.flint="mcl_core:flint" industrialtest.elementKeys.flint="mcl_core:flint"
industrialtest.elementKeys.snowball="mcl_throwing:snowball" industrialtest.elementKeys.snowball="mcl_throwing:snowball"
industrialtest.elementKeys.snowBlock="mcl_core:snowblock"
industrialtest.elementKeys.string="mcl_mobitems:string" industrialtest.elementKeys.string="mcl_mobitems:string"
industrialtest.elementKeys.junglePlanks="mcl_core:junglewood" industrialtest.elementKeys.junglePlanks="mcl_core:junglewood"
industrialtest.elementKeys.wood="mcl_core:tree" industrialtest.elementKeys.wood="mcl_core:tree"
@ -506,7 +505,6 @@ if industrialtest.mclAvailable then
industrialtest.elementKeys.dryShrub="mcl_core:deadbush" industrialtest.elementKeys.dryShrub="mcl_core:deadbush"
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.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")
@ -692,7 +690,6 @@ elseif industrialtest.mtgAvailable then
industrialtest.elementKeys.stick="default:stick" industrialtest.elementKeys.stick="default:stick"
industrialtest.elementKeys.flint="default:flint" industrialtest.elementKeys.flint="default:flint"
industrialtest.elementKeys.snowball="default:snow" industrialtest.elementKeys.snowball="default:snow"
industrialtest.elementKeys.snowBlock="default:snowblock"
industrialtest.elementKeys.blueDye="dye:blue" industrialtest.elementKeys.blueDye="dye:blue"
industrialtest.elementKeys.yellowDust="dye:yellow" industrialtest.elementKeys.yellowDust="dye:yellow"
industrialtest.elementKeys.bucket="bucket:bucket_empty" industrialtest.elementKeys.bucket="bucket:bucket_empty"
@ -741,7 +738,6 @@ elseif industrialtest.mtgAvailable then
industrialtest.elementKeys.dryShrub="default:dry_shrub" industrialtest.elementKeys.dryShrub="default:dry_shrub"
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.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"

View File

@ -41,6 +41,75 @@ local colors={
coolant="#188676ff" coolant="#188676ff"
} }
-- Power storage items
minetest.register_tool("industrialtest:re_battery",{
description=S("RE-Battery"),
inventory_image="industrialtest_re_battery.png",
_industrialtest_powerStorage=true,
_industrialtest_powerCapacity=7000,
_industrialtest_powerFlow=industrialtest.api.lvPowerFlow
})
minetest.register_craft({
type="shaped",
output="industrialtest:re_battery",
recipe={
{"","industrialtest:insulated_tin_cable",""},
{industrialtest.elementKeys.tinIngot,industrialtest.elementKeys.powerCarrier,industrialtest.elementKeys.tinIngot},
{industrialtest.elementKeys.tinIngot,industrialtest.elementKeys.powerCarrier,industrialtest.elementKeys.tinIngot}
}
})
minetest.register_tool("industrialtest:advanced_re_battery",{
description=S("Advanced RE-Battery"),
inventory_image="industrialtest_advanced_re_battery.png",
_industrialtest_powerStorage=true,
_industrialtest_powerCapacity=100000,
_industrialtest_powerFlow=industrialtest.api.mvPowerFlow
})
minetest.register_craft({
type="shaped",
output="industrialtest:advanced_re_battery",
recipe={
{"industrialtest:insulated_copper_cable",industrialtest.elementKeys.bronzeIngot,"industrialtest:insulated_copper_cable"},
{industrialtest.elementKeys.bronzeIngot,"industrialtest:sulfur_dust",industrialtest.elementKeys.bronzeIngot},
{industrialtest.elementKeys.bronzeIngot,"industrialtest:lead_dust",industrialtest.elementKeys.bronzeIngot}
}
})
minetest.register_tool("industrialtest:energy_crystal",{
description=S("Energy Crystal"),
inventory_image="industrialtest_energy_crystal.png",
_industrialtest_powerStorage=true,
_industrialtest_powerCapacity=100000,
_industrialtest_powerFlow=industrialtest.api.hvPowerFlow
})
minetest.register_craft({
type="shaped",
output="industrialtest:energy_crystal",
recipe={
{industrialtest.elementKeys.powerCarrier,industrialtest.elementKeys.powerCarrier,industrialtest.elementKeys.powerCarrier},
{industrialtest.elementKeys.powerCarrier,industrialtest.elementKeys.diamond,industrialtest.elementKeys.powerCarrier},
{industrialtest.elementKeys.powerCarrier,industrialtest.elementKeys.powerCarrier,industrialtest.elementKeys.powerCarrier}
}
})
minetest.register_tool("industrialtest:lapotron_crystal",{
description=S("Lapotron Crystal"),
inventory_image="industrialtest_lapotron_crystal.png",
_industrialtest_powerStorage=true,
_industrialtest_powerCapacity=1000000,
_industrialtest_powerFlow=industrialtest.api.evPowerFlow
})
minetest.register_craft({
type="shaped",
output="industrialtest:lapotron_crystal",
recipe={
{industrialtest.elementKeys.blueDye,"industrialtest:electronic_circuit",industrialtest.elementKeys.blueDye},
{industrialtest.elementKeys.blueDye,"industrialtest:energy_crystal",industrialtest.elementKeys.blueDye},
{industrialtest.elementKeys.blueDye,"industrialtest:electronic_circuit",industrialtest.elementKeys.blueDye}
}
})
-- Other resources -- Other resources
minetest.register_craftitem("industrialtest:refined_iron_ingot",{ minetest.register_craftitem("industrialtest:refined_iron_ingot",{
description=S("Refined Iron Ingot"), description=S("Refined Iron Ingot"),
@ -802,3 +871,23 @@ industrialtest.api.registerCompressorRecipe({
recipe="industrialtest:plantball", recipe="industrialtest:plantball",
time=5 time=5
}) })
minetest.register_tool("industrialtest:fuel_can",{
description=S("Fuel Can"),
inventory_image="industrialtest_fuel_can.png",
groups={
_industrialtest_fueled=1,
_industrialtest_fuel=1,
_industrialtest_fluidStorage=1
},
_industrialtest_fluidCapacity=10000
})
minetest.register_craft({
type="shaped",
output="industrialtest:fuel_can",
recipe={
{"","industrialtest:tin_plate","industrialtest:tin_plate"},
{"industrialtest:tin_plate","","industrialtest:tin_plate"},
{"industrialtest:tin_plate","industrialtest:tin_plate","industrialtest:tin_plate"}
}
})

View File

@ -19,12 +19,9 @@ local modpath=minetest.get_modpath("industrialtest")
-- table with global functions, variables etc -- table with global functions, variables etc
industrialtest={} industrialtest={}
-- Settings -- Initial constants
industrialtest.config={ industrialtest.updateDelay=1 -- Note: Make this value smaller to make machines update more frequently (it may make server more laggy)
updateDelay=tonumber(minetest.settings:get("industrialtest.updateDelay") or "1"), industrialtest.developerMode=true -- Enables additional utils useful when developing mod
electrocution=minetest.settings:get_bool("industrialtest.electrocution",true),
developerMode=minetest.settings:get_bool("industrialtest.developerMode",false)
}
-- Others -- Others
industrialtest.random=PseudoRandom(os.time()) industrialtest.random=PseudoRandom(os.time())
@ -57,7 +54,6 @@ 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/mass_fabricator.lua") dofile(modpath.."/machines/mass_fabricator.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/recycler.lua") dofile(modpath.."/machines/recycler.lua")
@ -82,12 +78,9 @@ dofile(modpath.."/tools/electric_chainsaw.lua")
dofile(modpath.."/tools/electric_drill.lua") dofile(modpath.."/tools/electric_drill.lua")
dofile(modpath.."/tools/electric_hoe.lua") dofile(modpath.."/tools/electric_hoe.lua")
dofile(modpath.."/tools/electric_saber.lua") dofile(modpath.."/tools/electric_saber.lua")
dofile(modpath.."/tools/fluid_storage.lua")
dofile(modpath.."/tools/jetpack.lua") dofile(modpath.."/tools/jetpack.lua")
dofile(modpath.."/tools/mining_laser.lua") dofile(modpath.."/tools/mining_laser.lua")
dofile(modpath.."/tools/nano_suit.lua") dofile(modpath.."/tools/nano_suit.lua")
dofile(modpath.."/tools/power_storage.lua")
dofile(modpath.."/tools/scanner.lua")
dofile(modpath.."/tools/solar_helmet.lua") dofile(modpath.."/tools/solar_helmet.lua")
dofile(modpath.."/tools/static_boots.lua") dofile(modpath.."/tools/static_boots.lua")
dofile(modpath.."/tools/treetap.lua") dofile(modpath.."/tools/treetap.lua")
@ -97,7 +90,7 @@ dofile(modpath.."/tools/wrench.lua")
dofile(modpath.."/upgrades.lua") dofile(modpath.."/upgrades.lua")
dofile(modpath.."/craftitems.lua") dofile(modpath.."/craftitems.lua")
dofile(modpath.."/nodes.lua") dofile(modpath.."/nodes.lua")
if industrialtest.config.developerMode then if industrialtest.developerMode then
dofile(modpath.."/utils.lua") dofile(modpath.."/utils.lua")
end end
dofile(modpath.."/cables.lua") dofile(modpath.."/cables.lua")

View File

@ -66,7 +66,7 @@ function industrialtest.ActivatedMachine.activate(self,pos)
param2=minetest.get_node(pos).param2 param2=minetest.get_node(pos).param2
}) })
self:afterActivation(pos) self:afterActivation(pos)
minetest.get_node_timer(pos):start(industrialtest.config.updateDelay) minetest.get_node_timer(pos):start(industrialtest.updateDelay)
end end
function industrialtest.ActivatedMachine.deactivate(self,pos) function industrialtest.ActivatedMachine.deactivate(self,pos)
@ -75,7 +75,7 @@ function industrialtest.ActivatedMachine.deactivate(self,pos)
param2=minetest.get_node(pos).param2 param2=minetest.get_node(pos).param2
}) })
self:afterDeactivation(pos) self:afterDeactivation(pos)
minetest.get_node_timer(pos):start(industrialtest.config.updateDelay) minetest.get_node_timer(pos):start(industrialtest.updateDelay)
end end
function industrialtest.ActivatedMachine.shouldActivate(self,pos) function industrialtest.ActivatedMachine.shouldActivate(self,pos)

View File

@ -140,7 +140,7 @@ function industrialtest.CanningMachine.allowMetadataInventoryTake(self,pos,listn
local targetSlot=inv:get_stack("dst",1) local targetSlot=inv:get_stack("dst",1)
if ((listname=="src" and stack:get_count()==fuelSlot:get_count()) or (listname=="dst" and stack:get_count()==targetSlot:get_count())) and meta:get_float("srcTime")>0 then if ((listname=="src" and stack:get_count()==fuelSlot:get_count()) or (listname=="dst" and stack:get_count()==targetSlot:get_count())) and meta:get_float("srcTime")>0 then
meta:set_float("srcTime",0) meta:set_float("srcTime",0)
self:updateFormspec(pos) minetest.get_node_timer(pos):start(industrialtest.updateDelay)
end end
return industrialtest.ActivatedElectricMachine.allowMetadataInventoryTake(self,pos,listname,index,stack,player) return industrialtest.ActivatedElectricMachine.allowMetadataInventoryTake(self,pos,listname,index,stack,player)
end end
@ -153,12 +153,12 @@ function industrialtest.CanningMachine.onMetadataInventoryMove(self,pos,fromList
local targetSlot=inv:get_stack("dst",1) local targetSlot=inv:get_stack("dst",1)
if ((fromList=="src" and count==fuelSlot:get_count()) or (fromList=="dst" and count==targetSlot:get_count())) and meta:get_float("srcTime")>0 then if ((fromList=="src" and count==fuelSlot:get_count()) or (fromList=="dst" and count==targetSlot:get_count())) and meta:get_float("srcTime")>0 then
meta:set_float("srcTime",0) meta:set_float("srcTime",0)
self:updateFormspec(pos) meta:set_string("formspec",canningMachine.getFormspec(pos))
end end
end end
function industrialtest.CanningMachine.onMetadataInventoryPut(self,pos,listname,index,stack) function industrialtest.CanningMachine.onMetadataInventoryPut(self,pos,listname,index,stack)
self:triggerIfNeeded(pos) minetest.get_node_timer(pos):start(industrialtest.updateDelay)
industrialtest.ActivatedElectricMachine.onMetadataInventoryPut(self,pos,listname,index,stack) industrialtest.ActivatedElectricMachine.onMetadataInventoryPut(self,pos,listname,index,stack)
end end
@ -188,7 +188,7 @@ function industrialtest.CanningMachine.shouldDeactivate(self,pos)
return fuelSlot:is_empty() or targetSlot:is_empty() or meta:get_int("industrialtest.powerAmount")<self._opPower or return fuelSlot:is_empty() or targetSlot:is_empty() or meta:get_int("industrialtest.powerAmount")<self._opPower or
(industrialtest.api.itemHasFluidStorage(fuelSlot) and industrialtest.api.isItemFluidStorageEmpty(fuelSlot)) or (industrialtest.api.itemHasFluidStorage(fuelSlot) and industrialtest.api.isItemFluidStorageEmpty(fuelSlot)) or
industrialtest.api.isItemFluidStorageFull(targetSlot) or industrialtest.api.isItemFluidStorageFull(targetSlot) or
targetMeta:get_int("industrialtest.fluidCapacity")-targetMeta:get_int("industrialtest.fluidAmount")<(fuelDef._industrialtest_fuelAmount or 0) or targetMeta:get_int("industrialtest.fluidCapacity")-targetMeta:get_int("industrialtest.fluidAmount")<fuelDef._industrialtest_fuelAmount or
(fuelDef._industrialtest_emptyVariant and not leftoverSlot:item_fits(ItemStack(fuelDef._industrialtest_emptyVariant))) (fuelDef._industrialtest_emptyVariant and not leftoverSlot:item_fits(ItemStack(fuelDef._industrialtest_emptyVariant)))
end end

View File

@ -291,7 +291,7 @@ industrialtest.MFSUChargepad:register()
minetest.register_abm({ minetest.register_abm({
label="Chargepad updating", label="Chargepad updating",
nodenames=industrialtest.internal.chargepads, nodenames=industrialtest.internal.chargepads,
interval=industrialtest.config.updateDelay, interval=industrialtest.updateDelay,
chance=1, chance=1,
action=function(pos,node) action=function(pos,node)
local def=minetest.registered_nodes[node.name] local def=minetest.registered_nodes[node.name]

View File

@ -32,7 +32,7 @@ function industrialtest.ElectricMachine.onConstruct(self,pos)
def._industrialtest_self:flowPower(conn) def._industrialtest_self:flowPower(conn)
else else
-- Support for bare definitions that don't use industrialtest pseudo-OOP -- Support for bare definitions that don't use industrialtest pseudo-OOP
minetest.get_node_timer(conn):start(industrialtest.config.updateDelay) minetest.get_node_timer(conn):start(industrialtest.updateDelay)
end end
else else
local def=minetest.registered_nodes[minetest.get_node(conn).name] local def=minetest.registered_nodes[minetest.get_node(conn).name]
@ -46,7 +46,7 @@ function industrialtest.ElectricMachine.onConstruct(self,pos)
def._industrialtest_self:flowPower(network) def._industrialtest_self:flowPower(network)
else else
-- Support for bare definitions that don't use industrialtest pseudo-OOP -- Support for bare definitions that don't use industrialtest pseudo-OOP
minetest.get_node_timer(network):start(industrialtest.config.updateDelay) minetest.get_node_timer(network):start(industrialtest.updateDelay)
end end
end end
end end
@ -177,7 +177,7 @@ function industrialtest.ElectricMachine.requestPower(self,pos)
def._industrialtest_self:flowPower(network) def._industrialtest_self:flowPower(network)
else else
-- Support for bare definitions that don't use industrialtest pseudo-OOP -- Support for bare definitions that don't use industrialtest pseudo-OOP
minetest.get_node_timer(network):start(industrialtest.config.updateDelay) minetest.get_node_timer(network):start(industrialtest.updateDelay)
end end
end end
end end

View File

@ -366,7 +366,7 @@ minetest.register_abm({
label="Water Mill generating", label="Water Mill generating",
nodenames={"industrialtest:water_mill"}, nodenames={"industrialtest:water_mill"},
neighbors=neighbors, neighbors=neighbors,
interval=industrialtest.config.updateDelay, interval=industrialtest.updateDelay,
chance=1, chance=1,
action=function(pos) action=function(pos)
industrialtest.WaterMill:action(pos) industrialtest.WaterMill:action(pos)

View File

@ -19,7 +19,7 @@ industrialtest.Generator=table.copy(industrialtest.ActivatedElectricMachine)
industrialtest.internal.unpackTableInto(industrialtest.Generator,{ industrialtest.internal.unpackTableInto(industrialtest.Generator,{
name="industrialtest:generator", name="industrialtest:generator",
description=S("Generator"), description=S("Generator"),
tiles={ 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",
@ -85,7 +85,7 @@ function industrialtest.Generator.getFormspec(self,pos)
end end
function industrialtest.Generator.onMetadataInventoryPut(self,pos,listname,index,stack) function industrialtest.Generator.onMetadataInventoryPut(self,pos,listname,index,stack)
self:triggerIfNeeded(pos) minetest.get_node_timer(pos):start(industrialtest.updateDelay)
industrialtest.ActivatedElectricMachine.onMetadataInventoryPut(self,pos,listname,index,stack) industrialtest.ActivatedElectricMachine.onMetadataInventoryPut(self,pos,listname,index,stack)
end end

View File

@ -131,7 +131,7 @@ function industrialtest.IronFurnace.allowMetadataInventoryTake(self,pos,listname
self:updateFormspec(pos) self:updateFormspec(pos)
end end
elseif listname=="dst" and dstSlot:get_free_space()==0 then elseif listname=="dst" and dstSlot:get_free_space()==0 then
self:triggerIfNeeded(pos) minetest.get_node_timer(pos):start(industrialtest.updateDelay)
end end
return industrialtest.ActivatedMachine.allowMetadataInventoryTake(self,pos,listname,index,stack) return industrialtest.ActivatedMachine.allowMetadataInventoryTake(self,pos,listname,index,stack)
end end
@ -148,13 +148,13 @@ function industrialtest.IronFurnace.onMetadataInventoryMove(self,pos,fromList,fr
self:updateFormspec(pos) self:updateFormspec(pos)
end end
elseif fromList=="dst" and dstSlot:get_free_space()==0 then elseif fromList=="dst" and dstSlot:get_free_space()==0 then
self:triggerIfNeeded(pos) minetest.get_node_timer(pos):start(industrialtest.updateDelay)
end end
industrialtest.ActivatedMachine.onMetadataInventoryMove(self,pos,fromList,fromIndex,toList,toIndex,count) industrialtest.ActivatedMachine.onMetadataInventoryMove(self,pos,fromList,fromIndex,toList,toIndex,count)
end end
function industrialtest.IronFurnace.onMetadataInventoryPut(self,pos,listname,index,stack) function industrialtest.IronFurnace.onMetadataInventoryPut(self,pos,listname,index,stack)
self:triggerIfNeeded(pos) minetest.get_node_timer(pos):start(industrialtest.updateDelay)
industrialtest.ActivatedMachine.onMetadataInventoryPut(self,pos,listname,index,stack) industrialtest.ActivatedMachine.onMetadataInventoryPut(self,pos,listname,index,stack)
end end

View File

@ -32,15 +32,6 @@ function industrialtest.Machine.afterPlaceNode(self,pos,placer,itemstack,pointed
-- dummy function -- dummy function
end end
function industrialtest.Machine.afterDigNode(self,pos,oldnode,oldmetadata,digger)
-- dummy function
end
function industrialtest.Machine.onDig(self,pos,node,digger)
-- dummy function
return minetest.node_dig(pos,node,digger)
end
function industrialtest.Machine.getFormspec(self,pos) function industrialtest.Machine.getFormspec(self,pos)
local formspec local formspec
if industrialtest.mtgAvailable then if industrialtest.mtgAvailable then
@ -82,7 +73,8 @@ end
function industrialtest.Machine.trigger(self,pos) function industrialtest.Machine.trigger(self,pos)
local timer=minetest.get_node_timer(pos) local timer=minetest.get_node_timer(pos)
if not timer:is_started() then if not timer:is_started() then
timer:start(industrialtest.config.updateDelay) minetest.debug("updating "..minetest.serialize(pos))
timer:start(industrialtest.updateDelay)
end end
end end
@ -137,37 +129,27 @@ function industrialtest.Machine.onMetadataInventoryMove(self,pos,fromList,fromIn
if toList=="upgrades" then if toList=="upgrades" then
local meta=minetest.get_meta(pos) local meta=minetest.get_meta(pos)
local inv=meta:get_inventory() local inv=meta:get_inventory()
local itemstack=inv:get_stack(fromList,fromIndex) local stack=inv:get_stack(fromList,fromIndex)
local def=itemstack:get_definition() industrialtest.internal.applyUpgrade(pos,meta,stack)
if def and def._industrialtest_self and def._industrialtest_self.apply then
def._industrialtest_self:apply(pos)
end
elseif fromList=="upgrades" then elseif fromList=="upgrades" then
local meta=minetest.get_meta(pos) local meta=minetest.get_meta(pos)
local inv=meta:get_inventory() local inv=meta:get_inventory()
local itemstack=inv:get_stack(fromList,fromIndex) local stack=inv:get_stack(fromList,fromIndex)
local def=itemstack:get_definition() industrialtest.internal.removeUpgrade(pos,meta,stack)
if def and def._industrialtest_self and def._industrialtest_self.remove then
def._industrialtest_self:remove(pos)
end
end end
end end
function industrialtest.Machine.onMetadataInventoryPut(self,pos,listname,index,stack) function industrialtest.Machine.onMetadataInventoryPut(self,pos,listname,index,stack)
if listname=="upgrades" then if listname=="upgrades" then
local def=stack:get_definition() local meta=minetest.get_meta(pos)
if def and def._industrialtest_self and def._industrialtest_self.apply then industrialtest.internal.applyUpgrade(pos,meta,stack)
def._industrialtest_self:apply(pos)
end
end end
end end
function industrialtest.Machine.onMetadataInventoryTake(self,pos,listname,index,stack) function industrialtest.Machine.onMetadataInventoryTake(self,pos,listname,index,stack)
if listname=="upgrades" then if listname=="upgrades" then
local def=stack:get_definition() local meta=minetest.get_meta(pos)
if def and def._industrialtest_self and def._industrialtest_self.remove then industrialtest.internal.removeUpgrade(pos,meta,stack)
def._industrialtest_self:remove(pos)
end
end end
end end
@ -204,12 +186,6 @@ function industrialtest.Machine.createDefinitionTable(self)
after_place_node=function(pos,placer,itemstack,pointed) after_place_node=function(pos,placer,itemstack,pointed)
self:afterPlaceNode(pos,placer,itemstack,pointed) self:afterPlaceNode(pos,placer,itemstack,pointed)
end, end,
after_dig_node=function(pos,oldnode,oldmetadata,digger)
self:afterDigNode(pos,oldnode,oldmetadata,digger)
end,
on_dig=function(pos,node,digger)
return self:onDig(pos,node,digger)
end,
on_timer=function(pos,elapsed) on_timer=function(pos,elapsed)
return self:onTimer(pos,elapsed) return self:onTimer(pos,elapsed)
end, end,
@ -284,7 +260,7 @@ function industrialtest.Machine.createDefinitionTable(self)
return inv, "src", mcl_util.select_stack(hop_inv, hop_list, inv, "src") return inv, "src", mcl_util.select_stack(hop_inv, hop_list, inv, "src")
end end
def._mcl_hoppers_on_after_push=function(pos) def._mcl_hoppers_on_after_push=function(pos)
self:triggerIfNeeded(pos) minetest.get_node_timer(pos):start(industrialtest.updateDelay)
end end
end end
@ -314,8 +290,8 @@ function industrialtest.Machine.register(self)
industrialtest.api.addTag(self.name,"usesTimer") industrialtest.api.addTag(self.name,"usesTimer")
end end
function industrialtest.Machine.allowMoveToUpgradeSlot(pos,toIndex,itemstack) function industrialtest.Machine.allowMoveToUpgradeSlot(pos,toIndex,stack)
local def=itemstack:get_definition() local def=minetest.registered_items[stack:get_name()]
if not def or not def.groups or not def.groups._industrialtest_machineUpgrade then if not def or not def.groups or not def.groups._industrialtest_machineUpgrade then
return 0 return 0
end end
@ -325,5 +301,5 @@ function industrialtest.Machine.allowMoveToUpgradeSlot(pos,toIndex,itemstack)
if not targetSlot:is_empty() then if not targetSlot:is_empty() then
return 0 return 0
end end
return itemstack:get_count() return stack:get_count()
end end

View File

@ -1,388 +0,0 @@
-- 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 destructMiningPipe(pos,player)
local count=0
local originalPos=table.copy(pos)
local node=minetest.get_node(pos)
while node.name=="industrialtest:mining_pipe" do
count=count+1
pos.y=pos.y-1
node=minetest.get_node(pos)
if node.name=="ignore" then
minetest.load_area(pos)
node=minetest.get_node(pos)
end
end
local endPos=table.copy(pos)
local manip=minetest.get_voxel_manip()
local minp,maxp=manip:read_from_map(pos,originalPos)
local data=manip:get_data()
local area=VoxelArea(minp,maxp)
pos=table.copy(originalPos)
while pos.y>endPos.y do
data[area:index(pos.x,pos.y,pos.z)]=minetest.CONTENT_AIR
pos.y=pos.y-1
end
manip:set_data(data)
manip:write_to_map()
if player then
local itemstack=ItemStack("industrialtest:mining_pipe "..tostring(count))
if industrialtest.mtgAvailable then
local inv=player:get_inventory()
local leftover=inv:add_item("main",itemstack)
if not leftover:is_empty() then
minetest.add_item(player:get_pos(),leftover)
end
elseif industrialtest.mclAvailable then
minetest.add_item(originalPos,itemstack)
end
end
end
local function miningPipeUpdateMiner(pos)
local meta=minetest.get_meta(pos)
if meta:contains("miner") then
local minerPos=minetest.deserialize(meta:get_string("miner"))
local minerMeta=minetest.get_meta(minerPos)
minerMeta:set_int("level",pos.y)
end
end
local definition={
description=S("Mining Pipe"),
tiles={"industrialtest_mining_pipe.png"},
paramtype="light",
sunlight_propagates=true,
drawtype="nodebox",
node_box={
type="fixed",
fixed={
-0.25,
-0.5,
-0.25,
0.25,
0.5,
0.25
}
},
on_destruct=function(pos)
miningPipeUpdateMiner(pos)
destructMiningPipe(pos,nil)
end,
on_dig=function(pos,node,digger)
miningPipeUpdateMiner(pos)
destructMiningPipe(pos,digger)
end
}
if industrialtest.mtgAvailable then
definition.groups={
cracky=3,
oddly_breakable_by_hand=1
}
definition.sounds=default.node_sound_metal_defaults()
elseif industrialtest.mclAvailable then
definition.groups={
pickaxey=1,
handy=1
}
definition.sounds=mcl_sounds.node_sound_metal_defaults()
definition._mcl_blast_resistance=1
definition._mcl_hardness=1
end
minetest.register_node("industrialtest:mining_pipe",definition)
minetest.register_craft({
type="shaped",
output="industrialtest:mining_pipe 8",
recipe={
{"industrialtest:refined_iron_ingot","","industrialtest:refined_iron_ingot"},
{"industrialtest:refined_iron_ingot","","industrialtest:refined_iron_ingot"},
{"industrialtest:refined_iron_ingot",industrialtest.elementKeys.treetap,"industrialtest:refined_iron_ingot"}
}
})
industrialtest.Miner=table.copy(industrialtest.ElectricMachine)
industrialtest.internal.unpackTableInto(industrialtest.Miner,{
name="industrialtest:miner",
description=S("Miner"),
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_miner_front.png"
},
sounds="metal",
storageLists={
"drill",
"src",
"scanner",
"dst",
"powerStorage",
"upgrades"
},
powerLists={
{
list="powerStorage",
direction="i"
}
},
requiresWrench=true,
facedir=true,
flow=industrialtest.api.lvPowerFlow,
capacity=5000,
ioConfig="iiiiii",
hasPowerInput=true,
_opPower=1000,
_scannerOpPower=10
})
function industrialtest.Miner.onConstruct(self,pos)
local meta=minetest.get_meta(pos)
local inv=meta:get_inventory()
inv:set_size("drill",1)
inv:set_size("src",1)
inv:set_size("scanner",1)
inv:set_size("dst",15)
inv:set_size("powerStorage",1)
inv:set_size("upgrades",1)
meta:set_int("level",pos.y-1)
industrialtest.ElectricMachine.onConstruct(self,pos)
end
function industrialtest.Miner.onDestruct(self,pos)
destructMiningPipe(vector.new(pos.x,pos.y-1,pos.z),nil)
industrialtest.ElectricMachine.onDestruct(self,pos)
end
function industrialtest.Miner.onDig(self,pos,node,digger)
destructMiningPipe(vector.new(pos.x,pos.y-1,pos.z),digger)
return industrialtest.ElectricMachine.onDig(self,pos,node,digger)
end
function industrialtest.Miner.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={
"label[0.7,1.2;"..S("Drill").."]",
"list[context;drill;0.7,1.5;1,1]",
industrialtest.internal.getItemSlotBg(0.7,1.5,1,1),
"label[0.7,2.8;"..S("Pipe").."]",
"list[context;src;0.7,3.1;1,1]",
industrialtest.internal.getItemSlotBg(0.7,3.1,1,1),
"label[0.7,4.4;"..S("Scanner").."]",
"list[context;scanner;0.7,4.7;1,1]",
industrialtest.internal.getItemSlotBg(0.7,4.7,1,1),
"list[context;dst;2.28,1.9;5,3]",
industrialtest.internal.getItemSlotBg(2.28,1.9,5,3),
"list[context;upgrades;9.1,1.2;1,1]",
industrialtest.internal.getItemSlotBg(9.1,1.2,1,1),
(powerPercent>0 and "image[9.1,2.29;1,1;industrialtest_gui_electricity_bg.png^[lowpart:"..powerPercent..":industrialtest_gui_electricity_fg.png]"
or "image[9.1,2.29;1,1;industrialtest_gui_electricity_bg.png]"),
"list[context;powerStorage;9.1,3.5;1,1]",
industrialtest.internal.getItemSlotBg(9.1,3.5,1,1),
"listring[context;src]",
"listring[context;dst]"
}
return parentFormspec..table.concat(formspec,"")
end
function industrialtest.Miner.canUpdate(self,pos)
local meta=minetest.get_meta(pos)
local inv=meta:get_inventory()
local drillSlot=inv:get_stack("drill",1)
local srcSlot=inv:get_stack("src",1)
local level=meta:get_int("level")
local requiredPower=self:getRequiredPower(pos)
return meta:get_int("industrialtest.powerAmount")>=requiredPower and not drillSlot:is_empty() and not srcSlot:is_empty() and
self:canContinue(pos,level)
end
function industrialtest.Miner.allowMetadataInventoryMove(self,pos,fromList,fromIndex,toList,toIndex,count)
local meta=minetest.get_meta(pos)
local inv=meta:get_inventory()
local itemstack=inv:get_stack(fromList,fromIndex)
if toList=="drill" then
return self.allowDrillPut(itemstack) and count or 0
end
if toList=="src" then
return itemstack:get_name()=="industrialtest:mining_pipe" and count or 0
end
if toList=="scanner" then
return self.allowScannerPut(itemstack) and 1 or 0
end
if toList=="dst" then
return 0
end
return industrialtest.ElectricMachine.allowMetadataInventoryMove(self,pos,fromList,fromIndex,toList,toIndex,count)
end
function industrialtest.Miner.allowMetadataInventoryPut(self,pos,listname,index,itemstack,player)
if listname=="drill" then
return self.allowDrillPut(itemstack) and itemstack:get_count() or 0
end
if listname=="src" then
return itemstack:get_name()=="industrialtest:mining_pipe" and itemstack:get_count() or 0
end
if listname=="scanner" then
return self.allowScannerPut(itemstack) and 1 or 0
end
if listname=="dst" then
return 0
end
return industrialtest.ElectricMachine.allowMetadataInventoryPut(self,pos,listname,index,itemstack,player)
end
function industrialtest.Miner.onMetadataInventoryMove(self,pos,fromList,fromIndex,toList,toIndex,count)
self:onInventoryPut(pos,toList)
industrialtest.ElectricMachine.onMetadataInventoryMove(self,pos,fromList,fromIndex,toList,toIndex,count)
end
function industrialtest.Miner.onMetadataInventoryPut(self,pos,listname,index,stack)
self:onInventoryPut(pos,listname)
industrialtest.ElectricMachine.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.Miner.update(self,pos,elapsed,meta,inv)
if not self:canUpdate(pos) then
return false,false
end
local level=meta:get_int("level")
if not self:canContinue(pos,level) then
return false,false
end
local srcSlot=inv:get_stack("src",1)
srcSlot:take_item(1)
inv:set_stack("src",1,srcSlot)
local targetPos=vector.new(pos.x,level,pos.z)
local drop=self.getNodeDrop(targetPos)
self.placeMiningPipe(pos,targetPos)
inv:add_item("dst",drop)
local scannerSlot=inv:get_stack("scanner",1)
if not scannerSlot:is_empty() then
local def=scannerSlot:get_definition()
if def and def._industrialtest_self then
local filtered=def._industrialtest_self:filter(targetPos)
for _,filteredPos in ipairs(filtered) do
drop=self.getNodeDrop(filteredPos)
if inv:room_for_item("dst",drop) then
minetest.remove_node(filteredPos)
inv:add_item("dst",drop)
end
end
end
end
local requiredPower=self:getRequiredPower(pos)
meta:set_int("level",level-1)
industrialtest.api.addPower(meta,-requiredPower)
return true,true
end
function industrialtest.Miner.onInventoryPut(self,pos,listname)
if listname=="drill" or listname=="src" then
self:triggerIfNeeded(pos)
end
end
function industrialtest.Miner.allowDrillPut(itemstack)
local def=itemstack:get_definition()
return def and def.groups and def.groups._industrialtest_miningDrill
end
function industrialtest.Miner.allowScannerPut(itemstack)
local def=itemstack:get_definition()
return def and def.groups and def.groups._industrialtest_scanner
end
function industrialtest.Miner.canContinue(self,pos,level)
local meta=minetest.get_meta(pos)
local inv=meta:get_inventory()
local targetPos=vector.new(pos.x,level,pos.z)
local targetNode=minetest.get_node(targetPos)
if targetNode.name=="ignore" then
minetest.load_area(targetPos)
targetNode=minetest.get_node(targetPos)
if targetNode.name=="ignore" then
return false
end
end
local def=minetest.registered_nodes[targetNode.name]
local drop=self.getNodeDrop(vector.new(pos.x,level,pos.z))
return not (def and def.groups and def.groups.unbreakable) and inv:room_for_item("dst",drop)
end
function industrialtest.Miner.getRequiredPower(self,pos)
local meta=minetest.get_meta(pos)
local inv=meta:get_inventory()
local scannerSlot=inv:get_stack("scanner",1)
local result=self._opPower
if not scannerSlot:is_empty() then
local def=scannerSlot:get_definition()
if def and def._industrialtest_self then
local distance=def._industrialtest_self.minerDistance or 0
result=result+(distance*distance-1)*self._scannerOpPower
end
end
return result
end
function industrialtest.Miner.getNodeDrop(pos)
local node=minetest.get_node(pos)
local def=minetest.registered_nodes[node.name]
if not def.pointable then
return ItemStack()
end
return ItemStack((def and def.drop and def.drop~="") and def.drop or node.name)
end
function industrialtest.Miner.placeMiningPipe(minerPos,pos)
minetest.add_node(pos,{
name="industrialtest:mining_pipe"
})
local meta=minetest.get_meta(pos)
meta:set_string("miner",minetest.serialize(minerPos))
end
industrialtest.Miner:register()
minetest.register_craft({
type="shaped",
output="industrialtest:miner",
recipe={
{"",industrialtest.elementKeys.chest,""},
{"industrialtest:electronic_circuit","industrialtest:machine_block","industrialtest:electronic_circuit"},
{"","industrialtest:mining_pipe",""}
}
})

View File

@ -107,8 +107,8 @@ function industrialtest.SimpleElectricItemProcessor.onMetadataInventoryMove(self
end end
end end
function industrialtest.SimpleElectricItemProcessor.onMetadataInventoryPut(self,pos,listname,index,stack) function industrialtest.SimpleElectricItemProcessor.onMetadataInventoryPut(self,pos)
industrialtest.ActivatedElectricMachine.onMetadataInventoryPut(self,pos,listname,index,stack) industrialtest.ActivatedElectricMachine.onMetadataInventoryPut(self,pos)
self:triggerIfNeeded(pos) self:triggerIfNeeded(pos)
end end

View File

@ -29,8 +29,7 @@ industrialtest.internal.unpackTableInto(industrialtest.SolarPanelBase,{
} }
}, },
hasPowerOutput=true, hasPowerOutput=true,
ioConfig="oooooo", ioConfig="oooooo"
multiplier=1
}) })
local solarPanels={} local solarPanels={}
@ -67,7 +66,7 @@ function industrialtest.SolarPanelBase.action(self,pos)
local amount=minetest.get_natural_light(vector.offset(pos,0,1,0))/15.0 local amount=minetest.get_natural_light(vector.offset(pos,0,1,0))/15.0
local charging=amount>0.5 local charging=amount>0.5
if charging then if charging then
if industrialtest.api.addPower(meta,math.ceil(amount*self.flow*self.multiplier))>0 then if industrialtest.api.addPower(meta,math.ceil(amount*self.flow))>0 then
self:updateFormspec(pos) self:updateFormspec(pos)
end end
self:trigger(pos) self:trigger(pos)
@ -119,8 +118,7 @@ industrialtest.internal.unpackTableInto(industrialtest.LVSolarArray,{
"industrialtest_machine_block.png" "industrialtest_machine_block.png"
}, },
capacity=industrialtest.api.lvPowerFlow*4, capacity=industrialtest.api.lvPowerFlow*4,
flow=industrialtest.api.lvPowerFlow, flow=industrialtest.api.lvPowerFlow*2
multiplier=1.5
}) })
industrialtest.LVSolarArray:register() industrialtest.LVSolarArray:register()
@ -195,7 +193,7 @@ minetest.register_craft({
minetest.register_abm({ minetest.register_abm({
name="Solar panel updating", name="Solar panel updating",
nodenames=solarPanels, nodenames=solarPanels,
interval=industrialtest.config.updateDelay, interval=industrialtest.updateDelay,
chance=1, chance=1,
action=function(pos,node) action=function(pos,node)
local def=minetest.registered_nodes[node.name] local def=minetest.registered_nodes[node.name]

View File

@ -122,7 +122,7 @@ minetest.register_craft({
minetest.register_abm({ minetest.register_abm({
name="Wind mill updating", name="Wind mill updating",
nodenames={"industrialtest:wind_mill"}, nodenames={"industrialtest:wind_mill"},
interval=industrialtest.config.updateDelay, interval=industrialtest.updateDelay,
chance=1, chance=1,
action=function(pos) action=function(pos)
industrialtest.WindMill:action(pos) industrialtest.WindMill:action(pos)

View File

@ -354,19 +354,6 @@ if not industrialtest.mods.mclRubber then
name=="mcl_core:podzol" or name=="mcl_core:podzol_snow" or name=="mcl_core:podzol" or name=="mcl_core:podzol_snow" or
name=="mcl_core:dirt" or name=="mcl_core:mycelium" or name=="mcl_core:coarse_dirt" name=="mcl_core:dirt" or name=="mcl_core:mycelium" or name=="mcl_core:coarse_dirt"
end) end)
definition._on_bone_meal=function(itemstack,user,pointed)
if industrialtest.random:next(1,100)>45 then
return
end
local meta=minetest.get_meta(pointed.under)
local stage=meta:get_int("stage") or 0
stage=stage+1
if stage>=3 then
industrialtest.internal.makeRubberTree(pointed.under)
else
meta:set_int("stage",stage)
end
end
minetest.register_abm({ minetest.register_abm({
label="Rubber sapling growing", label="Rubber sapling growing",
nodenames={"industrialtest:rubber_sapling"}, nodenames={"industrialtest:rubber_sapling"},
@ -392,6 +379,23 @@ if not industrialtest.mods.mclRubber then
end end
end end
}) })
mcl_dye.register_on_bone_meal_apply(function(pointed)
local node=minetest.get_node(pointed.under)
if node.name~="industrialtest:rubber_sapling" then
return
end
if industrialtest.random:next(1,100)>45 then
return
end
local meta=minetest.get_meta(pointed.under)
local stage=meta:get_int("stage") or 0
stage=stage+1
if stage>=3 then
industrialtest.internal.makeRubberTree(pointed.under)
else
meta:set_int("stage",stage)
end
end)
end end
definition.groups.attached_node=1 definition.groups.attached_node=1
definition.groups.dig_immediate=3 definition.groups.dig_immediate=3

View File

@ -1,8 +0,0 @@
# This determines value how frequently machines update
industrialtest.updateDelay (Update delay) float 1.0
# Whether electrocution by uninsulated cables is used
industrialtest.electrocution (Electrocution) bool true
# Enables additional utils useful when developing mod
industrialtest.developerMode (Developer mode) bool false

View File

@ -3,4 +3,4 @@
- `industrialtest_gui_water.png` was taken from Minetest Game (by Cisoun licensed with CC BY-SA 3.0) - `industrialtest_gui_water.png` was taken from Minetest Game (by Cisoun licensed with CC BY-SA 3.0)
- `industrialtest_gui_river_water.png` was taken from Minetest Game (by paramat licensed with CC BY-SA 3.0) - `industrialtest_gui_river_water.png` was taken from Minetest Game (by paramat licensed with CC BY-SA 3.0)
... rest was made either by LuanHawk, mrkubax10, HandfulOfFrogs or Migdyn and is licensed with CC BY 4.0 International ... rest was made either by LuanHawk, mrkubax10 or Migdyn and is licensed with CC BY 4.0 International

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.6 KiB

After

Width:  |  Height:  |  Size: 7.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 663 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 686 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 692 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 704 B

View File

@ -23,7 +23,7 @@ industrialtest.internal.unpackTableInto(industrialtest.BatPackBase,{
local updateDelta=0 local updateDelta=0
function industrialtest.BatPackBase.update(self,player,inv,itemstack,dtime) function industrialtest.BatPackBase.update(self,player,inv,itemstack,dtime)
updateDelta=updateDelta+dtime updateDelta=updateDelta+dtime
if updateDelta<industrialtest.config.updateDelay then if updateDelta<industrialtest.updateDelay then
return false return false
end end
updateDelta=0 updateDelta=0

View File

@ -103,6 +103,7 @@ minetest.register_on_player_hpchange(function(player,hpChange)
local def=itemstack:get_definition() local def=itemstack:get_definition()
if def.groups and def.groups._industrialtest_electricArmor and def._industrialtest_self then if def.groups and def.groups._industrialtest_electricArmor and def._industrialtest_self then
local reducedDamage=def._industrialtest_self:tryReduceDamage(itemstack,hpChange) local reducedDamage=def._industrialtest_self:tryReduceDamage(itemstack,hpChange)
minetest.debug(reducedDamage)
if reducedDamage>0 then if reducedDamage>0 then
result=result+reducedDamage result=result+reducedDamage
industrialtest.api.addPowerToItem(itemstack,-reducedDamage*def._industrialtest_self:getPowerPerDamageForItem(itemstack)) industrialtest.api.addPowerToItem(itemstack,-reducedDamage*def._industrialtest_self:getPowerPerDamageForItem(itemstack))

View File

@ -23,12 +23,6 @@ industrialtest.internal.unpackTableInto(industrialtest.ElectricDrillBase,{
} }
}) })
function industrialtest.ElectricDrillBase.createDefinitionTable(self)
local def=industrialtest.ActivatedElectricTool.createDefinitionTable(self)
def.groups._industrialtest_miningDrill=1
return def
end
function industrialtest.ElectricDrillBase.getOpPower(self,itemstack) function industrialtest.ElectricDrillBase.getOpPower(self,itemstack)
return 50 return 50
end end

View File

@ -1,45 +0,0 @@
-- 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.FuelCan=table.copy(industrialtest.FluidContainerItem)
industrialtest.internal.unpackTableInto(industrialtest.FuelCan,{
name="industrialtest:fuel_can",
description=S("Fuel Can"),
inventoryImage="industrialtest_fuel_can.png",
capacity=10000
})
function industrialtest.FuelCan.createDefinitionTable(self)
local def=industrialtest.FluidContainerItem.createDefinitionTable(self)
def.groups._industrialtest_fueled=1
def.groups._industrialtest_fuel=1
return def
end
industrialtest.FuelCan:register()
minetest.register_craft({
type="shaped",
output="industrialtest:fuel_can",
recipe={
{"","industrialtest:tin_plate","industrialtest:tin_plate"},
{"industrialtest:tin_plate","","industrialtest:tin_plate"},
{"industrialtest:tin_plate","industrialtest:tin_plate","industrialtest:tin_plate"}
}
})

View File

@ -1,101 +0,0 @@
-- 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.REBattery=table.copy(industrialtest.ElectricItem)
industrialtest.internal.unpackTableInto(industrialtest.REBattery,{
name="industrialtest:re_battery",
description=S("RE-Battery"),
inventoryImage="industrialtest_re_battery.png",
capacity=7000,
flow=industrialtest.api.lvPowerFlow
})
industrialtest.REBattery:register()
minetest.register_craft({
type="shaped",
output="industrialtest:re_battery",
recipe={
{"","industrialtest:insulated_tin_cable",""},
{industrialtest.elementKeys.tinIngot,industrialtest.elementKeys.powerCarrier,industrialtest.elementKeys.tinIngot},
{industrialtest.elementKeys.tinIngot,industrialtest.elementKeys.powerCarrier,industrialtest.elementKeys.tinIngot}
}
})
industrialtest.AdvancedREBattery=table.copy(industrialtest.ElectricItem)
industrialtest.internal.unpackTableInto(industrialtest.AdvancedREBattery,{
name="industrialtest:advanced_re_battery",
description=S("Advanced RE-Battery"),
inventoryImage="industrialtest_advanced_re_battery.png",
capacity=100000,
flow=industrialtest.api.mvPowerFlow
})
industrialtest.AdvancedREBattery:register()
minetest.register_craft({
type="shaped",
output="industrialtest:advanced_re_battery",
recipe={
{"industrialtest:insulated_copper_cable",industrialtest.elementKeys.bronzeIngot,"industrialtest:insulated_copper_cable"},
{industrialtest.elementKeys.bronzeIngot,"industrialtest:sulfur_dust",industrialtest.elementKeys.bronzeIngot},
{industrialtest.elementKeys.bronzeIngot,"industrialtest:lead_dust",industrialtest.elementKeys.bronzeIngot}
}
})
industrialtest.EnergyCrystal=table.copy(industrialtest.ElectricItem)
industrialtest.internal.unpackTableInto(industrialtest.EnergyCrystal,{
name="industrialtest:energy_crystal",
description=S("Energy Crystal"),
inventoryImage="industrialtest_energy_crystal.png",
capacity=1000000,
flow=industrialtest.api.hvPowerFlow
})
industrialtest.EnergyCrystal:register()
minetest.register_craft({
type="shaped",
output="industrialtest:energy_crystal",
recipe={
{industrialtest.elementKeys.powerCarrier,industrialtest.elementKeys.powerCarrier,industrialtest.elementKeys.powerCarrier},
{industrialtest.elementKeys.powerCarrier,industrialtest.elementKeys.diamond,industrialtest.elementKeys.powerCarrier},
{industrialtest.elementKeys.powerCarrier,industrialtest.elementKeys.powerCarrier,industrialtest.elementKeys.powerCarrier}
}
})
industrialtest.LapotronCrystal=table.copy(industrialtest.ElectricItem)
industrialtest.internal.unpackTableInto(industrialtest.LapotronCrystal,{
name="industrialtest:lapotron_crystal",
description=S("Lapotron Crystal"),
inventoryImage="industrialtest_lapotron_crystal.png",
capacity=10000000,
flow=industrialtest.api.evPowerFlow
})
industrialtest.LapotronCrystal:register()
minetest.register_craft({
type="shaped",
output="industrialtest:lapotron_crystal",
recipe={
{industrialtest.elementKeys.blueDye,"industrialtest:electronic_circuit",industrialtest.elementKeys.blueDye},
{industrialtest.elementKeys.blueDye,"industrialtest:energy_crystal",industrialtest.elementKeys.blueDye},
{industrialtest.elementKeys.blueDye,"industrialtest:electronic_circuit",industrialtest.elementKeys.blueDye}
}
})

View File

@ -16,213 +16,62 @@
local S=minetest.get_translator("industrialtest") local S=minetest.get_translator("industrialtest")
industrialtest.QuantumArmorBase=table.copy(industrialtest.ElectricGearTool) local quantumSuit={}
industrialtest.internal.unpackTableInto(industrialtest.QuantumArmorBase,{ quantumSuit.helmetBreathRefillOpPower=1000
flow=industrialtest.api.ivPowerFlow, quantumSuit.leggingsSpeedOpPower=125
capacity=10000000 quantumSuit.leggingsSpeedMaxVel=4
}) quantumSuit.bootsJumpOpPower=50
quantumSuit.bootsFallDamageReductionOpPower=900
function industrialtest.QuantumArmorBase.createDefintionTable(self)
local def=industrialtest.ElectricGearTool.createDefintionTable(self)
def.groups._industrialtest_electricArmor=1
return def
end
function industrialtest.QuantumArmorBase.getPowerPerDamageForItem(self,itemstack)
return 30
end
industrialtest.QuantumHelmet=table.copy(industrialtest.QuantumArmorBase)
industrialtest.internal.unpackTableInto(industrialtest.QuantumHelmet,{
name="industrialtest:quantum_helmet",
description=S("Quantum Helmet"),
inventoryImage="industrialtest_quantum_helmet_inv.png",
part="head",
modelImage="industrialtest_quantum_helmet.png",
_breathRefillOpPower=1000
})
local quantumHelmetUpdateDelta=0
function industrialtest.QuantumHelmet.update(self,player,inv,itemstack,dtime)
quantumHelmetUpdateDelta=quantumHelmetUpdateDelta+dtime
if quantumHelmetUpdateDelta<industrialtest.config.updateDelay then
return false
end
quantumHelmetUpdateDelta=0
if player:get_breath()<10 then
local meta=itemstack:get_meta()
local refilled=math.min(9-player:get_breath(),math.floor(meta:get_int("industrialtest.powerAmount")/self._breathRefillOpPower))
if refilled>0 then
player:set_breath(player:get_breath()+refilled)
industrialtest.api.addPowerToItem(itemstack,-refilled*self._breathRefillOpPower)
return true
end
end
return false
end
function industrialtest.QuantumHelmet.getReducedDamageForItem(self,itemstack)
return 0.15
end
industrialtest.QuantumHelmet:register()
minetest.register_craft({
type="shaped",
output="industrialtest:quantum_helmet",
recipe={
{"industrialtest:reinforced_glass","industrialtest:nano_helmet","industrialtest:reinforced_glass"},
{"industrialtest:iridium_plate","industrialtest:lapotron_crystal","industrialtest:iridium_plate"},
{"industrialtest:advanced_electronic_circuit","industrialtest:empty_cell","industrialtest:advanced_electronic_circuit"}
}
})
industrialtest.QuantumBodyarmor=table.copy(industrialtest.QuantumArmorBase)
industrialtest.internal.unpackTableInto(industrialtest.QuantumBodyarmor,{
name="industrialtest:quantum_bodyarmor",
description=S("Quantum Bodyarmor"),
inventoryImage="industrialtest_quantum_bodyarmor_inv.png",
part="torso",
modelImage="industrialtest_quantum_bodyarmor.png",
update=industrialtest.JetpackBase.update,
addYVelocityClamped=industrialtest.JetpackBase.addYVelocityClamped,
tryFly=industrialtest.ElectricJetpack.tryFly
})
function industrialtest.QuantumBodyarmor.getReducedDamageForItem(self,itemstack)
return 0.4
end
industrialtest.QuantumBodyarmor:register()
minetest.register_craft({
type="shaped",
output="industrialtest:quantum_bodyarmor",
recipe={
{"industrialtest:advanced_alloy","industrialtest:nano_bodyarmor","industrialtest:advanced_alloy"},
{"industrialtest:iridium_plate","industrialtest:lapotron_crystal","industrialtest:iridium_plate"},
{"industrialtest:iridium_plate","industrialtest:electric_jetpack","industrialtest:iridium_plate"}
}
})
industrialtest.QuantumLeggings=table.copy(industrialtest.QuantumArmorBase)
industrialtest.internal.unpackTableInto(industrialtest.QuantumLeggings,{
name="industrialtest:quantum_leggings",
description=S("Quantum Leggings"),
inventoryImage="industrialtest_quantum_leggings_inv.png",
part="legs",
modelImage="industrialtest_quantum_leggings.png",
_speedOpPower=125,
_speedMaxVel=4
})
local leggingsSpeedEnabled={}
local playerPositions={} local playerPositions={}
function industrialtest.QuantumLeggings.update(self,player,inv,itemstack,dtime) local playerLeggingsSpeedEnabled={}
local control=player:get_player_control() local playerBootsJumpEnabled={}
local playerName=player:get_player_name()
if leggingsSpeedEnabled[playerName] then local function registerQuantumSuitPart(config)
if control.up and control.aux1 then config.groups=config.groups or {}
local meta=itemstack:get_meta() config.groups._industrialtest_nanoSuit=1
local requiredPower=vector.distance(player:get_pos(),playerPositions[playerName])*self._speedOpPower if config.element=="head" then
if meta:get_int("industrialtest.powerAmount")>=requiredPower then config.groups.armor_head=1
industrialtest.api.addPowerToItem(itemstack,-requiredPower) elseif config.element=="torso" then
playerPositions[playerName]=player:get_pos() config.groups.armor_torso=1
return true elseif config.element=="legs" then
end config.groups.armor_legs=1
end elseif config.element=="feet" then
player:set_physics_override({ config.groups.armor_feet=1
speed=1 end
}) local definition={
leggingsSpeedEnabled[playerName]=false description=config.displayName,
elseif control.up and control.aux1 then inventory_image="industrialtest_"..config.name.."_inv.png",
local meta=itemstack:get_meta() groups=config.groups,
local requiredPower=vector.distance(player:get_pos(),playerPositions[playerName])*self._speedOpPower _industrialtest_powerStorage=true,
if meta:get_int("industrialtest.powerAmount")>=requiredPower then _industrialtest_powerCapacity=10000000,
player:set_physics_override({ _industrialtest_powerFlow=industrialtest.api.ivPowerFlow,
speed=self._speedMaxVel _industrialtest_damageReduction=config.damageReduction,
}) _industrialtest_powerPerDamage=30
leggingsSpeedEnabled[playerName]=true }
if config.customKeys then
for k,v in pairs(config.customKeys) do
definition[k]=v
end end
end end
playerPositions[playerName]=player:get_pos() if industrialtest.mtgAvailable then
return false definition.groups.armor_heal=0
end armor:register_armor("industrialtest:"..config.name,definition)
elseif industrialtest.mclAvailable then
function industrialtest.QuantumLeggings.getReducedDamageForItem(self,itemstack) definition.groups.armor=1
return 0.3 definition.groups.non_combat_armor=1
end definition.sounds={
_mcl_armor_equip="mcl_armor_equip_iron",
industrialtest.QuantumLeggings:register() _mcl_armor_unequip="mcl_armor_unequip_iron"
}
minetest.register_craft({ definition.on_place=mcl_armor.equip_on_use
type="shaped", definition.on_secondary_use=mcl_armor.equip_on_use
output="industrialtest:quantum_leggings", definition._mcl_armor_element=config.element
recipe={ definition._mcl_armor_texture=(config.element=="feet" and "industrialtest_mcl_" or "industrialtest_")..config.name..".png"
{"industrialtest:machine_block","industrialtest:lapotron_crystal","industrialtest:machine_block"}, minetest.register_tool("industrialtest:"..config.name,definition)
{"industrialtest:iridium_plate","industrialtest:nano_leggings","industrialtest:iridium_plate"},
{industrialtest.elementKeys.yellowDust,"",industrialtest.elementKeys.yellowDust}
}
})
industrialtest.QuantumBoots=table.copy(industrialtest.QuantumArmorBase)
industrialtest.internal.unpackTableInto(industrialtest.QuantumBoots,{
name="industrialtest:quantum_boots",
description=S("Quantum Boots"),
inventoryImage="industrialtest_quantum_boots_inv.png",
part="feet",
modelImage=(industrialtest.mclAvailable and "industrialtest_mcl_quantum_leggings.png" or "industrialtest_quantum_leggings.png"),
_jumpOpPower=50,
_jumpPower=2,
_fallDamageReductionOpPower=900,
})
local bootsJumpEnabled={}
function industrialtest.QuantumBoots.update(self,player,inv,itemstack,dtime)
local control=player:get_player_control()
local playerName=player:get_player_name()
if bootsJumpEnabled[playerName] then
local shouldStopJump=not control.aux1
if control.jump and control.aux1 then
local meta=itemstack:get_meta()
if meta:get_int("industrialtest.powerAmount")>=self._jumpOpPower then
industrialtest.api.addPowerToItem(itemstack,-self._jumpOpPower)
return true
end
end
player:set_physics_override({
jump=1
})
bootsJumpEnabled[playerName]=false
elseif control.aux1 then
local meta=itemstack:get_meta()
if meta:get_int("industrialtest.powerAmount")>=self._jumpOpPower then
player:set_physics_override({
jump=self._jumpPower
})
bootsJumpEnabled[playerName]=true
end
end end
return false
end end
function industrialtest.QuantumBoots.getReducedDamageForItem(self,itemstack)
return 0.15
end
industrialtest.QuantumBoots:register()
minetest.register_craft({
type="shaped",
output="industrialtest:quantum_boots",
recipe={
{"industrialtest:iridium_plate","industrialtest:nano_boots","industrialtest:iridium_plate"},
{industrialtest.elementKeys.ironBoots,"industrialtest:lapotron_crystal",industrialtest.elementKeys.ironBoots}
}
})
local function findInPlayerArmorList(player,itemname) local function findInPlayerArmorList(player,itemname)
local inv local inv
if industrialtest.mclAvailable then if industrialtest.mclAvailable then
@ -238,6 +87,174 @@ local function findInPlayerArmorList(player,itemname)
end end
end end
quantumSuit.tryFly=function(itemstack)
local meta=itemstack:get_meta()
if meta:get_int("industrialtest.powerAmount")<10 then
return false
end
industrialtest.api.addPowerToItem(itemstack,-10)
return true
end
registerQuantumSuitPart({
name="quantum_helmet",
displayName=S("Quantum Helmet"),
element="head",
damageReduction=0.15
})
minetest.register_craft({
type="shaped",
output="industrialtest:quantum_helmet",
recipe={
{"industrialtest:reinforced_glass","industrialtest:nano_helmet","industrialtest:reinforced_glass"},
{"industrialtest:iridium_plate","industrialtest:lapotron_crystal","industrialtest:iridium_plate"},
{"industrialtest:advanced_electronic_circuit","industrialtest:empty_cell","industrialtest:advanced_electronic_circuit"}
}
})
registerQuantumSuitPart({
name="quantum_bodyarmor",
displayName=S("Quantum Bodyarmor"),
element="torso",
damageReduction=0.4,
groups={
_industrialtest_jetpack=1
},
customKeys={
_industrialtest_tryFly=quantumSuit.tryFly
}
})
minetest.register_craft({
type="shaped",
output="industrialtest:quantum_bodyarmor",
recipe={
{"industrialtest:advanced_alloy","industrialtest:nano_bodyarmor","industrialtest:advanced_alloy"},
{"industrialtest:iridium_plate","industrialtest:lapotron_crystal","industrialtest:iridium_plate"},
{"industrialtest:iridium_plate","industrialtest:electric_jetpack","industrialtest:iridium_plate"}
}
})
registerQuantumSuitPart({
name="quantum_leggings",
displayName=S("Quantum Leggings"),
element="legs",
damageReduction=0.30
})
minetest.register_craft({
type="shaped",
output="industrialtest:quantum_leggings",
recipe={
{"industrialtest:machine_block","industrialtest:lapotron_crystal","industrialtest:machine_block"},
{"industrialtest:iridium_plate","industrialtest:nano_leggings","industrialtest:iridium_plate"},
{industrialtest.elementKeys.yellowDust,"",industrialtest.elementKeys.yellowDust}
}
})
registerQuantumSuitPart({
name="quantum_boots",
displayName=S("Quantum Boots"),
element="feet",
damageReduction=0.15
})
minetest.register_craft({
type="shaped",
output="industrialtest:quantum_boots",
recipe={
{"industrialtest:iridium_plate","industrialtest:nano_boots","industrialtest:iridium_plate"},
{industrialtest.elementKeys.ironBoots,"industrialtest:lapotron_crystal",industrialtest.elementKeys.ironBoots}
}
})
minetest.register_globalstep(function(dtime)
local players=minetest.get_connected_players()
for _,player in ipairs(players) do
local control=player:get_player_control()
local playerName=player:get_player_name()
if playerLeggingsSpeedEnabled[playerName] then
local shouldStopSpeed=true
if control.up and control.aux1 then
local index,stack,inv=findInPlayerArmorList(player,"industrialtest:quantum_leggings")
if index and stack and inv then
local meta=stack:get_meta()
local requiredPower=vector.distance(player:get_pos(),playerPositions[playerName])*quantumSuit.leggingsSpeedOpPower
if meta:get_int("industrialtest.powerAmount")>=requiredPower then
industrialtest.api.addPowerToItem(stack,-requiredPower)
inv:set_stack("armor",index,stack)
shouldStopSpeed=false
end
end
end
if shouldStopSpeed then
player:set_physics_override({
speed=1
})
playerLeggingsSpeedEnabled[playerName]=false
end
elseif control.up and control.aux1 then
local index,stack,inv=findInPlayerArmorList(player,"industrialtest:quantum_leggings")
if index and stack and inv then
local meta=stack:get_meta()
local requiredPower=vector.distance(player:get_pos(),playerPositions[playerName])*quantumSuit.leggingsSpeedOpPower
if meta:get_int("industrialtest.powerAmount")>=requiredPower then
player:set_physics_override({
speed=quantumSuit.leggingsSpeedMaxVel
})
playerLeggingsSpeedEnabled[playerName]=true
end
end
end
if playerBootsJumpEnabled[playerName] then
local shouldStopJump=not control.aux1
if control.jump and control.aux1 then
local index,stack,inv=findInPlayerArmorList(player,"industrialtest:quantum_boots")
if index and stack and inv then
local meta=stack:get_meta()
if meta:get_int("industrialtest.powerAmount")>=quantumSuit.bootsJumpOpPower then
industrialtest.api.addPowerToItem(stack,-quantumSuit.bootsJumpOpPower)
inv:set_stack("armor",index,stack)
shouldStopJump=false
end
end
end
if shouldStopJump then
player:set_physics_override({
jump=1
})
playerBootsJumpEnabled[playerName]=false
end
elseif control.aux1 then
local index,stack,inv=findInPlayerArmorList(player,"industrialtest:quantum_boots")
if index and stack and inv then
local meta=stack:get_meta()
local requiredPower=vector.distance(player:get_pos(),playerPositions[playerName])*quantumSuit.leggingsSpeedOpPower
if meta:get_int("industrialtest.powerAmount")>=quantumSuit.bootsJumpOpPower then
player:set_physics_override({
jump=2
})
playerBootsJumpEnabled[playerName]=true
end
end
end
if player:get_breath()<10 then
local index,stack,inv=findInPlayerArmorList(player,"industrialtest:quantum_helmet")
if index and stack and inv then
local meta=stack:get_meta()
local refilled=math.min(9-player:get_breath(),math.floor(meta:get_int("industrialtest.powerAmount")/quantumSuit.helmetBreathRefillOpPower))
if refilled>0 then
player:set_breath(player:get_breath()+refilled)
industrialtest.api.addPowerToItem(stack,-refilled*quantumSuit.helmetBreathRefillOpPower)
inv:set_stack("armor",index,stack)
end
end
end
playerPositions[playerName]=player:get_pos()
end
end)
minetest.register_on_player_hpchange(function(player,hpChange,reason) minetest.register_on_player_hpchange(function(player,hpChange,reason)
if reason.type~="fall" then if reason.type~="fall" then
return hpChange return hpChange
@ -250,8 +267,8 @@ minetest.register_on_player_hpchange(function(player,hpChange,reason)
local damage=math.abs(hpChange) local damage=math.abs(hpChange)
local meta=stack:get_meta() local meta=stack:get_meta()
local reducedDamage=math.min(damage,math.floor(meta:get_int("industrialtest.powerAmount")/(damage*industrialtest.QuantumBoots._fallDamageReductionOpPower))) local reducedDamage=math.min(damage,math.floor(meta:get_int("industrialtest.powerAmount")/(damage*quantumSuit.bootsFallDamageReductionOpPower)))
industrialtest.api.addPowerToItem(stack,-reducedDamage*industrialtest.QuantumBoots._fallDamageReductionOpPower) industrialtest.api.addPowerToItem(stack,-reducedDamage*quantumSuit.bootsFallDamageReductionOpPower)
inv:set_stack("armor",index,stack) inv:set_stack("armor",index,stack)
return hpChange+reducedDamage return hpChange+reducedDamage

View File

@ -1,152 +0,0 @@
-- 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.Scanner=table.copy(industrialtest.ElectricTool)
industrialtest.internal.unpackTableInto(industrialtest.Scanner,{
define={onUse=true}
})
function industrialtest.Scanner.createDefinitionTable(self)
local def=industrialtest.ElectricTool.createDefinitionTable(self)
def.groups._industrialtest_scanner=1
return def
end
-- Used by Miner to provide Scanner functionality there
function industrialtest.Scanner.filter(self,pos)
-- dummy function
return {}
end
industrialtest.OreScanner=table.copy(industrialtest.Scanner)
function industrialtest.OreScanner.hitUse(self,itemstack,user,pointed)
if not user:is_player() then
return false
end
local positions=""
local pos=user:get_pos()
for x=pos.x-self.distance,pos.x+self.distance do
for y=pos.y-self.distance,pos.y+self.distance do
for z=pos.z-self.distance,pos.z+self.distance do
local targetPos=vector.new(x,y,z)
local node=minetest.get_node(targetPos)
if self.isOre(node) then
positions=positions..string.format("%d %d %d",x,y,z)
positions=positions..","
end
end
end
end
local formspec={
"formspec_version[4]",
"size[10.5,11]",
"label[0.5,0.5;"..self.description.."]",
"label[0.5,1.7;"..S("Found ores").."]",
"textlist[0.5,1.9;9.5,8.6;pos;"..positions.."]"
}
local content=table.concat(formspec,"")
minetest.show_formspec(user:get_player_name(),"industrialtest:scanner",content)
return true
end
function industrialtest.OreScanner.filter(self,pos)
local result={}
for x=pos.x-self.minerDistance,pos.x+self.minerDistance do
for z=pos.z-self.minerDistance,pos.z+self.minerDistance do
local nodePos=vector.new(x,pos.y,z)
local node=minetest.get_node(nodePos)
-- This is very hacky, but currently there is no other way of determining if node is ore
if (x~=pos.x or z~=pos.z) and self.isOre(node) then
table.insert(result,nodePos)
end
end
end
return result
end
function industrialtest.OreScanner.isOre(node)
return string.find(node.name,":stone_with_")
end
industrialtest.ODScanner=table.copy(industrialtest.OreScanner)
industrialtest.internal.unpackTableInto(industrialtest.ODScanner,{
name="industrialtest:od_scanner",
description=S("OD Scanner"),
inventoryImage="industrialtest_od_scanner.png",
capacity=100000,
flow=industrialtest.api.lvPowerFlow,
distance=7,
minerDistance=3
})
function industrialtest.ODScanner.getOpPower(self,itemstack)
return 700
end
industrialtest.ODScanner:register()
minetest.register_craft({
type="shaped",
output="industrialtest:od_scanner",
recipe={
{"",industrialtest.elementKeys.yellowDust,""},
{"industrialtest:electronic_circuit","industrialtest:re_battery","industrialtest:electronic_circuit"},
{"industrialtest:insulated_copper_cable","industrialtest:insulated_copper_cable","industrialtest:insulated_copper_cable"}
}
})
industrialtest.OVScanner=table.copy(industrialtest.OreScanner)
industrialtest.internal.unpackTableInto(industrialtest.OVScanner,{
name="industrialtest:ov_scanner",
description=S("OV Scanner"),
inventoryImage="industrialtest_ov_scanner.png",
capacity=1000000,
flow=industrialtest.api.mvPowerFlow,
distance=11,
minerDistance=5
})
function industrialtest.OVScanner.getOpPower(self,itemstack)
return 7000
end
industrialtest.OVScanner:register()
minetest.register_craft({
type="shaped",
output="industrialtest:ov_scanner",
recipe={
{"",industrialtest.elementKeys.yellowDust,""},
{industrialtest.elementKeys.yellowDust,"industrialtest:electronic_circuit",industrialtest.elementKeys.yellowDust},
{"industrialtest:insulated_gold_cable","industrialtest:od_scanner","industrialtest:insulated_gold_cable"}
}
})
minetest.register_craft({
type="shaped",
output="industrialtest:ov_scanner",
recipe={
{"",industrialtest.elementKeys.yellowDust,""},
{industrialtest.elementKeys.yellowDust,"industrialtest:electronic_circuit",industrialtest.elementKeys.yellowDust},
{"industrialtest:insulated_gold_cable","industrialtest:re_battery","industrialtest:insulated_gold_cable"}
}
})

View File

@ -27,7 +27,7 @@ industrialtest.internal.unpackTableInto(industrialtest.SolarHelmet,{
local updateDelta=0 local updateDelta=0
function industrialtest.SolarHelmet.update(self,player,inv,itemstack,dtime) function industrialtest.SolarHelmet.update(self,player,inv,itemstack,dtime)
updateDelta=updateDelta+dtime updateDelta=updateDelta+dtime
if updateDelta<industrialtest.config.updateDelay then if updateDelta<industrialtest.updateDelay then
return false return false
end end
updateDelta=0 updateDelta=0

View File

@ -53,29 +53,6 @@ function industrialtest.Tool.onPlace(self,itemstack,user,pointed)
return false return false
end end
function industrialtest.Tool.onUse(self,itemstack,user,pointed)
if self:hitUse(itemstack,user,pointed) then
local meta=itemstack:get_meta()
if not meta:contains("industrialtest.uses") then
self:prepare(itemstack)
end
local uses=meta:get_int("industrialtest.uses")-1
if uses==0 then
itemstack:set_count(0)
minetest.sound_play({name="default_tool_breaks"},{
gain=1,
fade=0,
pitch=1
},true)
return true
end
meta:set_int("industrialtest.uses",uses)
itemstack:set_wear(65535-uses/self.uses*65535)
return true
end
return false
end
function industrialtest.Tool.prepare(self,itemstack) function industrialtest.Tool.prepare(self,itemstack)
local meta=itemstack:get_meta() local meta=itemstack:get_meta()
meta:set_int("industrialtest.uses",self.uses) meta:set_int("industrialtest.uses",self.uses)

View File

@ -19,9 +19,6 @@ if industrialtest.mods.mclRubber then
end end
local function onTreetapUse(user,pointed) local function onTreetapUse(user,pointed)
if pointed.type~="node" or not user or not user:is_player() then
return false
end
local node=minetest.get_node_or_nil(pointed.under) local node=minetest.get_node_or_nil(pointed.under)
if not node then if not node then
return false return false
@ -41,7 +38,6 @@ local S=minetest.get_translator("industrialtest")
industrialtest.Treetap=table.copy(industrialtest.Tool) industrialtest.Treetap=table.copy(industrialtest.Tool)
industrialtest.internal.unpackTableInto(industrialtest.Treetap,{ industrialtest.internal.unpackTableInto(industrialtest.Treetap,{
name="industrialtest:treetap", name="industrialtest:treetap",
define={onPlace=true},
description=S("Treetap"), description=S("Treetap"),
inventoryImage="industrialtest_treetap.png", inventoryImage="industrialtest_treetap.png",
uses=50, uses=50,
@ -50,7 +46,7 @@ industrialtest.internal.unpackTableInto(industrialtest.Treetap,{
}) })
function industrialtest.Treetap.use(self,itemstack,user,pointed) function industrialtest.Treetap.use(self,itemstack,user,pointed)
return onTreetapUse(user,pointed) return pointed.type=="node" and user and user:is_player() and onTreetapUse(user,pointed)
end end
industrialtest.Treetap:register() industrialtest.Treetap:register()
@ -68,7 +64,6 @@ minetest.register_craft({
industrialtest.ElectricTreetap=table.copy(industrialtest.ElectricTool) industrialtest.ElectricTreetap=table.copy(industrialtest.ElectricTool)
industrialtest.internal.unpackTableInto(industrialtest.ElectricTreetap,{ industrialtest.internal.unpackTableInto(industrialtest.ElectricTreetap,{
name="industrialtest:electric_treetap", name="industrialtest:electric_treetap",
define={onPlace=true},
description=S("Electric Treetap"), description=S("Electric Treetap"),
inventoryImage="industrialtest_electric_treetap.png", inventoryImage="industrialtest_electric_treetap.png",
capacity=10000, capacity=10000,
@ -76,7 +71,7 @@ industrialtest.internal.unpackTableInto(industrialtest.ElectricTreetap,{
}) })
function industrialtest.ElectricTreetap.use(self,itemstack,user,pointed) function industrialtest.ElectricTreetap.use(self,itemstack,user,pointed)
return onTreetapUse(user,pointed) return user and user:is_player() and onTreetapUse(user,pointed)
end end
function industrialtest.ElectricTreetap.getOpPower(self,itemstack) function industrialtest.ElectricTreetap.getOpPower(self,itemstack)

View File

@ -16,9 +16,6 @@
local S=minetest.get_translator("industrialtest") local S=minetest.get_translator("industrialtest")
local function onWrenchUse(user,pointed) local function onWrenchUse(user,pointed)
if pointed.type~="node" or not user or not user:is_player() then
return false
end
local node=minetest.get_node_or_nil(pointed.under) local node=minetest.get_node_or_nil(pointed.under)
if not node then if not node then
return false return false
@ -40,22 +37,29 @@ local function onWrenchUse(user,pointed)
return true return true
end end
industrialtest.Wrench=table.copy(industrialtest.Tool) local definition={
industrialtest.internal.unpackTableInto(industrialtest.Wrench,{
name="industrialtest:wrench",
define={onUse=true},
description=S("Wrench"), description=S("Wrench"),
inventoryImage="industrialtest_wrench.png", inventory_image="industrialtest_wrench.png",
uses=200, tool_capabilities={
repairMaterial=industrialtest.elementKeys.bronzeIngot full_punch_interval=1,
}) uses=200
},
function industrialtest.Wrench.hitUse(self,itemstack,user,pointed) on_use=function(itemstack,user,pointed)
return onWrenchUse(user,pointed) if pointed.type=="node" and user and user:is_player() and onWrenchUse(user,pointed) then
industrialtest.api.afterToolUse(itemstack)
return itemstack
end
return nil
end,
_industrialtest_tool=true
}
if industrialtest.mclAvailable then
definition.groups={
tool=1
}
definition._mcl_toollike_wield=true
end end
minetest.register_tool("industrialtest:wrench",definition)
industrialtest.Wrench:register()
minetest.register_craft({ minetest.register_craft({
type="shaped", type="shaped",
output="industrialtest:wrench", output="industrialtest:wrench",
@ -66,26 +70,28 @@ minetest.register_craft({
} }
}) })
industrialtest.ElectricWrench=table.copy(industrialtest.ElectricTool) definition={
industrialtest.internal.unpackTableInto(industrialtest.ElectricWrench,{
name="industrialtest:electric_wrench",
define={onUse=true},
description=S("Electric Wrench"), description=S("Electric Wrench"),
inventoryImage="industrialtest_electric_wrench.png", inventory_image="industrialtest_electric_wrench.png",
capacity=10000, on_use=function(itemstack,user,pointed)
flow=industrialtest.api.lvPowerFlow local meta=itemstack:get_meta()
}) if meta:get_int("industrialtest.powerAmount")>=20 and user and user:is_player() and onWrenchUse(user,pointed) then
industrialtest.api.addPowerToItem(itemstack,-20)
function industrialtest.ElectricWrench.getOpPower(self,itemstack) return itemstack
return 50 end
return nil
end,
_industrialtest_powerStorage=true,
_industrialtest_powerCapacity=10000,
_industrialtest_powerFlow=industrialtest.api.lvPowerFlow
}
if industrialtest.mclAvailable then
definition.groups={
tool=1
}
definition._mcl_toollike_wield=true
end end
minetest.register_tool("industrialtest:electric_wrench",definition)
function industrialtest.ElectricWrench.hitUse(self,itemstack,user,pointed)
return onWrenchUse(user,pointed)
end
industrialtest.ElectricWrench:register()
minetest.register_craft({ minetest.register_craft({
type="shapeless", type="shapeless",
output="industrialtest:electric_wrench", output="industrialtest:electric_wrench",

View File

@ -16,56 +16,106 @@
local S=minetest.get_translator("industrialtest") local S=minetest.get_translator("industrialtest")
industrialtest.Upgrade={} industrialtest.internal.applyUpgrade=function(pos,meta,stack)
local def=minetest.registered_items[stack:get_name()]
if def.groups._industrialtest_upgradeSpeed then
local speed=industrialtest.api.getMachineSpeed(meta)
meta:set_int("industrialtest.speed",math.min(4,speed+def.groups._industrialtest_upgradeSpeed))
elseif def.groups._industrialtest_upgradeTransformer then
local flows={
industrialtest.api.lvPowerFlow,
industrialtest.api.mvPowerFlow,
industrialtest.api.hvPowerFlow,
industrialtest.api.evPowerFlow,
industrialtest.api.ivPowerFlow
}
local machineFlow=meta:get_int("industrialtest.powerFlow")
local upgradedFlow=machineFlow
for _,flow in ipairs(flows) do
if flow>machineFlow then
upgradedFlow=flow
break
end
end
meta:set_int("industrialtest.powerFlow",upgradedFlow)
local networks=industrialtest.api.isAttachedToNetwork(meta)
if networks then
for _,network in ipairs(networks) do
industrialtest.api.createNetworkMapForNode(network)
end
end
elseif def.groups._industrialtest_upgradePowerStorage then
meta:set_int("industrialtest.powerCapacity",meta:get_int("industrialtest.powerCapacity")+10000)
local nodeDef=minetest.registered_nodes[minetest.get_node(pos).name]
if nodeDef._industrialtest_updateFormspec then
nodeDef._industrialtest_updateFormspec(pos)
end
local networks=industrialtest.api.isAttachedToNetwork(meta)
if networks then
for _,network in ipairs(networks) do
minetest.get_node_timer(network):start(industrialtest.updateDelay)
end
end
end
end
function industrialtest.Upgrade.createDefinitionTable(self) industrialtest.internal.removeUpgrade=function(pos,meta,stack)
local def={ local def=minetest.registered_items[stack:get_name()]
description=self.description, if def.groups._industrialtest_upgradeSpeed and meta:contains("industrialtest.speed") then
inventory_image=self.inventoryImage, local speed=meta:get_int("industrialtest.speed")
meta:set_int("industrialtest.speed",math.max(1,speed-def.groups._industrialtest_upgradeSpeed))
elseif def.groups._industrialtest_upgradeTransformer then
local flows={
industrialtest.api.lvPowerFlow,
industrialtest.api.mvPowerFlow,
industrialtest.api.hvPowerFlow,
industrialtest.api.evPowerFlow,
industrialtest.api.ivPowerFlow
}
local machineFlow=meta:get_int("industrialtest.powerFlow")
local downgradedFlow=machineFlow
for i=#flows,1,-1 do
local flow=flows[i]
if flow<machineFlow then
downgradedFlow=flow
break
end
end
meta:set_int("industrialtest.powerFlow",downgradedFlow)
local networks=industrialtest.api.isAttachedToNetwork(meta)
if networks then
for _,network in ipairs(networks) do
minetest.get_node_timer(network):start(industrialtest.updateDelay)
end
end
elseif def.groups._industrialtest_upgradePowerStorage then
meta:set_int("industrialtest.powerCapacity",meta:get_int("industrialtest.powerCapacity")-10000)
meta:set_int("industrialtest.powerAmount",math.min(meta:get_int("industrialtest.powerAmount"),meta:get_int("industrialtest.powerCapacity")))
local nodeDef=minetest.registered_nodes[minetest.get_node(pos).name]
if nodeDef._industrialtest_updateFormspec then
nodeDef._industrialtest_updateFormspec(pos)
end
end
end
local function registerMachineUpgrade(config)
minetest.register_craftitem("industrialtest:"..config.name,{
description=config.displayName,
inventory_image="industrialtest_"..config.name..".png",
groups={ groups={
_industrialtest_machineUpgrade=1 _industrialtest_machineUpgrade=1,
}, _industrialtest_upgradeSpeed=config.speed or nil,
_industrialtest_self=self _industrialtest_upgradeTransformer=config.transformer or nil,
} _industrialtest_upgradePowerStorage=config.powerStorage or nil,
}
return def })
end end
function industrialtest.Upgrade.register(self) registerMachineUpgrade({
local def=self:createDefinitionTable() name="overclocker_upgrade",
minetest.register_craftitem(self.name,def) displayName=S("Overclocker Upgrade"),
end speed=1
function industrialtest.Upgrade.apply(self,pos)
-- dummy function
end
function industrialtest.Upgrade.remove(self,pos)
-- dummy function
end
industrialtest.OverclockerUpgrade=table.copy(industrialtest.Upgrade)
industrialtest.internal.unpackTableInto(industrialtest.OverclockerUpgrade,{
name="industrialtest:overclocker_upgrade",
description=S("Overclocker Upgrade"),
inventoryImage="industrialtest_overclocker_upgrade.png",
_speed=1
}) })
function industrialtest.OverclockerUpgrade.apply(self,pos)
local meta=minetest.get_meta(pos)
local speed=industrialtest.api.getMachineSpeed(meta)
meta:set_int("industrialtest.speed",math.min(4,speed+self._speed))
end
function industrialtest.OverclockerUpgrade.remove(self,pos)
local meta=minetest.get_meta(pos)
local speed=industrialtest.api.getMachineSpeed(meta)
meta:set_int("industrialtest.speed",math.max(1,speed-self._speed))
end
industrialtest.OverclockerUpgrade:register()
minetest.register_craft({ minetest.register_craft({
type="shaped", type="shaped",
output="industrialtest:overclocker_upgrade", output="industrialtest:overclocker_upgrade",
@ -75,68 +125,11 @@ minetest.register_craft({
} }
}) })
industrialtest.TransformerUpgrade=table.copy(industrialtest.Upgrade) registerMachineUpgrade({
industrialtest.internal.unpackTableInto(industrialtest.TransformerUpgrade,{ name="transformer_upgrade",
name="industrialtest:transformer_upgrade", displayName=S("Transformer Upgrade"),
description=S("Transformer Upgrade"), transformer=1
inventoryImage="industrialtest_transformer_upgrade.png"
}) })
function industrialtest.TransformerUpgrade.apply(self,pos)
local meta=minetest.get_meta(pos)
local flows={
industrialtest.api.lvPowerFlow,
industrialtest.api.mvPowerFlow,
industrialtest.api.hvPowerFlow,
industrialtest.api.evPowerFlow,
industrialtest.api.ivPowerFlow
}
local machineFlow=meta:get_int("industrialtest.powerFlow")
local upgradedFlow=machineFlow
for _,flow in ipairs(flows) do
if flow>machineFlow then
upgradedFlow=flow
break
end
end
meta:set_int("industrialtest.powerFlow",upgradedFlow)
local networks=industrialtest.api.isAttachedToNetwork(meta)
if networks then
for _,network in ipairs(networks) do
industrialtest.api.createNetworkMapForNode(network)
end
end
end
function industrialtest.TransformerUpgrade.remove(self,pos)
local meta=minetest.get_meta(pos)
local flows={
industrialtest.api.lvPowerFlow,
industrialtest.api.mvPowerFlow,
industrialtest.api.hvPowerFlow,
industrialtest.api.evPowerFlow,
industrialtest.api.ivPowerFlow
}
local machineFlow=meta:get_int("industrialtest.powerFlow")
local downgradedFlow=machineFlow
for i=#flows,1,-1 do
local flow=flows[i]
if flow<machineFlow then
downgradedFlow=flow
break
end
end
meta:set_int("industrialtest.powerFlow",downgradedFlow)
local networks=industrialtest.api.isAttachedToNetwork(meta)
if networks then
for _,network in ipairs(networks) do
industrialtest.api.createNetworkMapForNode(network)
end
end
end
industrialtest.TransformerUpgrade:register()
minetest.register_craft({ minetest.register_craft({
type="shaped", type="shaped",
output="industrialtest:transformer_upgrade", output="industrialtest:transformer_upgrade",
@ -147,40 +140,11 @@ minetest.register_craft({
} }
}) })
industrialtest.PowerStorageUpgrade=table.copy(industrialtest.Upgrade) registerMachineUpgrade({
industrialtest.internal.unpackTableInto(industrialtest.PowerStorageUpgrade,{ name="power_storage_upgrade",
name="industrialtest:power_storage_upgrade", displayName=S("Power Storage Upgrade"),
description=S("Power Storage Upgrade"), powerStorage=1
inventoryImage="industrialtest_power_storage_upgrade.png",
_storage=10000
}) })
function industrialtest.PowerStorageUpgrade.apply(self,pos)
local meta=minetest.get_meta(pos)
meta:set_int("industrialtest.powerCapacity",meta:get_int("industrialtest.powerCapacity")+self._storage)
local node=minetest.get_node(pos)
local def=minetest.registered_nodes[node.name]
if def._industrialtest_self then
def._industrialtest_self:updateFormspec(pos)
if def._industrialtest_self.requestPower then
def._industrialtest_self:requestPower(pos)
end
end
end
function industrialtest.PowerStorageUpgrade.remove(self,pos)
local meta=minetest.get_meta(pos)
meta:set_int("industrialtest.powerCapacity",meta:get_int("industrialtest.powerCapacity")-self._storage)
meta:set_int("industrialtest.powerAmount",math.min(meta:get_int("industrialtest.powerAmount"),meta:get_int("industrialtest.powerCapacity")))
local node=minetest.get_node(pos)
local def=minetest.registered_nodes[node.name]
if def._industrialtest_self then
def._industrialtest_self:updateFormspec(pos)
end
end
industrialtest.PowerStorageUpgrade:register()
minetest.register_craft({ minetest.register_craft({
type="shaped", type="shaped",
output="industrialtest:power_storage_upgrade", output="industrialtest:power_storage_upgrade",

View File

@ -19,39 +19,30 @@ local S=minetest.get_translator("industrialtest")
local powerStorageInspectorContext={} local powerStorageInspectorContext={}
local function inspectNode(pos,playerName) local function inspectNode(pos,playerName)
local meta=minetest.get_meta(pos) local meta=minetest.get_meta(pos)
local sides={"X-","X+","Y-","Y+","Z-","Z+"}
local powerCapacity=meta:get_int("industrialtest.powerCapacity") local powerCapacity=meta:get_int("industrialtest.powerCapacity")
local powerFlow=meta:get_int("industrialtest.powerFlow") local powerFlow=meta:get_int("industrialtest.powerFlow")
local powerAmount=meta:get_int("industrialtest.powerAmount") local powerAmount=meta:get_int("industrialtest.powerAmount")
local powerIOConfig local powerIOConfig=meta:get_string("industrialtest.ioConfig")
if industrialtest.api.isExtendedIoConfig(meta) then
powerIOConfig="\n"
local ioConfig=minetest.deserialize(meta:get_string("industrialtest.ioConfig"))
for i,config in ipairs(ioConfig) do
powerIOConfig=powerIOConfig..sides[i].." "..config.mode.." "..config.flow.."\n"
end
else
powerIOConfig=meta:get_string("industrialtest.ioConfig")
end
local formspec={ local formspec={
"formspec_version[4]", "formspec_version[4]",
"size[15,15]", "size[8,8]",
"label[0.5,0.5;"..S("Power Storage Inspector").."]", "label[0.5,0.5;"..S("Power Storage Inspector").."]",
"label[0.5,1.5;"..S("Power Capacity: @1",powerCapacity).."]", "label[0.5,1.5;"..S("Power Capacity: @1",powerCapacity).."]",
"label[0.5,1.9;"..S("Power Flow: @1",powerFlow).."]", "label[0.5,1.9;"..S("Power Flow: @1",powerFlow).."]",
"label[0.5,2.3;"..S("Power Amount: @1",powerAmount).."]", "label[0.5,2.3;"..S("Power Amount: @1",powerAmount).."]",
"label[0.5,2.7;"..S("Power IO Config: @1",powerIOConfig).."]", "label[0.5,2.7;"..S("Power IO Config: @1",powerIOConfig).."]",
"field[0.5,7.0;2,0.5;powerCapacity;"..S("Power Capacity")..";"..powerCapacity.."]", "field[0.5,3.7;2,0.5;powerCapacity;"..S("Power Capacity")..";"..powerCapacity.."]",
"field[0.5,8.0;2,0.5;powerFlow;"..S("Power Flow")..";"..powerFlow.."]", "field[0.5,4.5;2,0.5;powerFlow;"..S("Power Flow")..";"..powerFlow.."]",
"field[0.5,9.0;2,0.5;powerAmount;"..S("Power Amount")..";"..powerAmount.."]", "field[0.5,5.4;2,0.5;powerAmount;"..S("Power Amount")..";"..powerAmount.."]",
"field[0.5,10.0;2,0.5;powerIOConfig;"..S("Power IO Config")..";"..meta:get_string("industrialtest.ioConfig").."]", "field[0.5,6.2;2,0.5;powerIOConfig;"..S("Power IO Config")..";"..powerIOConfig.."]",
"button[0.5,11.0;2,0.5;update;"..S("Update").."]", "button[0.5,6.8;2,0.5;update;"..S("Update").."]",
"label[4.2,2.25;"..S("Connections:").."]" "label[4.2,2.25;"..S("Connections:").."]"
} }
local connections=industrialtest.api.getConnections(pos) local connections=industrialtest.api.getConnections(pos)
local sides={"X-","X+","Y-","Y+","Z-","Z+"}
local sideString="" local sideString=""
for i,value in ipairs(connections) do for _,value in ipairs(connections) do
sideString=sideString..sides[i].." ("..value.x..", "..value.y..", "..value.z..")\n" sideString=sideString.."("..value.x..", "..value.y..", "..value.z..")\n"
end end
table.insert(formspec,"label[4.2,2.65;"..sideString.."]") table.insert(formspec,"label[4.2,2.65;"..sideString.."]")
powerStorageInspectorContext[playerName]=pos powerStorageInspectorContext[playerName]=pos
@ -80,11 +71,7 @@ minetest.register_on_player_receive_fields(function(player,formname,fields)
meta:set_int("industrialtest.powerCapacity",tonumber(fields.powerCapacity)) meta:set_int("industrialtest.powerCapacity",tonumber(fields.powerCapacity))
meta:set_int("industrialtest.powerFlow",tonumber(fields.powerFlow)) meta:set_int("industrialtest.powerFlow",tonumber(fields.powerFlow))
meta:set_int("industrialtest.powerAmount",tonumber(fields.powerAmount)) meta:set_int("industrialtest.powerAmount",tonumber(fields.powerAmount))
if industrialtest.api.isExtendedIoConfig(meta) then meta:set_string("industrialtest.powerIOConfig",fields.powerIOConfig)
meta:set_string("industrialtest.powerIOConfig",minetest.serialize(fields.powerIOConfig))
else
meta:set_string("industrialtest.powerIOConfig",fields.powerIOConfig)
end
local def=minetest.registered_nodes[minetest.get_node(context).name] local def=minetest.registered_nodes[minetest.get_node(context).name]
if def and def._industrialtest_updateFormspec then if def and def._industrialtest_updateFormspec then
def._industrialtest_updateFormspec(context) def._industrialtest_updateFormspec(context)

View File

@ -15,38 +15,14 @@
-- along with this program. If not, see <http://www.gnu.org/licenses/>. -- along with this program. If not, see <http://www.gnu.org/licenses/>.
minetest.register_craft({ minetest.register_craft({
type="shaped", type="shapeless",
output=industrialtest.elementKeys.wood.." 48", output=industrialtest.elementKeys.stone.." 16",
recipe={ recipe={"industrialtest:uu_matter"}
{"","industrialtest:uu_matter",""},
{"","",""},
{"","",""}
}
}) })
minetest.register_craft({ minetest.register_craft({
type="shaped", type="shaped",
output=industrialtest.elementKeys.stone.." 48", output=industrialtest.elementKeys.grassBlock.." 16",
recipe={
{"","",""},
{"","industrialtest:uu_matter",""},
{"","",""}
}
})
minetest.register_craft({
type="shaped",
output=industrialtest.elementKeys.snowBlock.." 48",
recipe={
{"industrialtest:uu_matter","","industrialtest:uu_matter"},
{"","",""},
{"","",""}
}
})
minetest.register_craft({
type="shaped",
output=industrialtest.elementKeys.grassBlock.." 48",
recipe={ recipe={
{"industrialtest:uu_matter"}, {"industrialtest:uu_matter"},
{"industrialtest:uu_matter"} {"industrialtest:uu_matter"}
@ -55,10 +31,11 @@ minetest.register_craft({
minetest.register_craft({ minetest.register_craft({
type="shaped", type="shaped",
output=industrialtest.elementKeys.obsidian.." 16", output=industrialtest.elementKeys.wood.." 16",
recipe={ recipe={
{"industrialtest:uu_matter"}, {"","industrialtest:uu_matter",""},
{"industrialtest:uu_matter"} {"","",""},
{"industrialtest:uu_matter","",""}
} }
}) })
@ -81,57 +58,7 @@ minetest.register_craft({
} }
}) })
minetest.register_craft({
type="shaped",
output=industrialtest.elementKeys.cactus.." 48",
recipe={
{"","industrialtest:uu_matter",""},
{"industrialtest:uu_matter","industrialtest:uu_matter","industrialtest:uu_matter"},
{"industrialtest:uu_matter","","industrialtest:uu_matter"}
}
})
minetest.register_craft({
type="shaped",
output=industrialtest.elementKeys.flint.." 32",
recipe={
{"","industrialtest:uu_matter",""},
{"industrialtest:uu_matter","industrialtest:uu_matter",""},
{"industrialtest:uu_matter","industrialtest:uu_matter",""}
}
})
minetest.register_craft({
type="shaped",
output=industrialtest.elementKeys.whiteWool.." 12",
recipe={
{"industrialtest:uu_matter","","industrialtest:uu_matter"},
{"","",""},
{"","industrialtest:uu_matter",""}
}
})
minetest.register_craft({
type="shaped",
output=industrialtest.elementKeys.sugarCane.." 48",
recipe={
{"industrialtest:uu_matter","","industrialtest:uu_matter"},
{"industrialtest:uu_matter","","industrialtest:uu_matter"},
{"industrialtest:uu_matter","","industrialtest:uu_matter"}
}
})
if industrialtest.mclAvailable then if industrialtest.mclAvailable then
minetest.register_craft({
type="shaped",
output="mcl_core:vine 24",
recipe={
{"industrialtest:uu_matter","",""},
{"industrialtest:uu_matter","",""},
{"industrialtest:uu_matter","",""}
}
})
minetest.register_craft({ minetest.register_craft({
type="shaped", type="shaped",
output="mcl_core:stonebrickcarved 48", output="mcl_core:stonebrickcarved 48",