106 Commits

Author SHA1 Message Date
c7ff88087e Fix contents scrollbar in guide 2025-12-06 23:15:42 +01:00
cd585391ec Describe Mining Laser in guide 2025-12-06 15:13:12 +01:00
d50908dedb Describe jetpacks in guide 2025-12-06 14:51:45 +01:00
ae26f0fe58 Describe electric toolset in guide 2025-12-05 09:46:40 +01:00
a210cc78e0 Describe BatPacks in guide 2025-12-05 09:32:25 +01:00
f480f16340 Fix oversight in LapPack definition 2025-12-05 09:32:06 +01:00
6a37a84114 Describe machine upgrades in guide 2025-12-04 22:50:55 +01:00
eb546fd07b Replace variable parsing in guide with pattern matching 2025-12-04 22:45:23 +01:00
6c93528d13 Describe Wind Mill in guide 2025-12-04 21:32:01 +01:00
520f3717d6 Fix Wind Mill when used in MCL 2025-12-04 21:26:49 +01:00
75894128f0 Don't use mcl_fences.register_fence_def if not present 2025-12-03 23:51:19 +01:00
7efdf28b37 Describe chargepads in guide 2025-12-03 23:11:01 +01:00
8125d280da Fix fluid generator formspec not updating after putting fluid 2025-12-02 21:45:55 +01:00
0d8807a1c3 Describe Water Mill in guide 2025-12-02 19:05:49 +01:00
e7ed72b261 Describe transformers in guide 2025-12-02 19:00:21 +01:00
647d46b2f4 Add missing textures in previous commits 2025-12-01 23:43:30 +01:00
27ebd4fbc5 Describe Tool Workshop in guide 2025-12-01 15:19:02 +01:00
603ae83507 Describe solar panels in guide 2025-12-01 15:18:49 +01:00
9633214a85 Describe Rotary Macerator in guide 2025-11-30 17:38:39 +01:00
a920bef790 Describe Recycler in guide 2025-11-30 17:25:20 +01:00
a9be76866f Describe Pump in guide 2025-11-29 19:00:10 +01:00
9b0792f1ff Describe power storage in guide 2025-11-29 18:40:01 +01:00
fad7a690ae Describe Nuclear Reactor in guide 2025-11-28 19:45:38 +01:00
60717d8ec1 Describe Miner in guide 2025-11-28 19:45:30 +01:00
08fd6a5a40 Describe Mass Fabricator in guide 2025-11-27 22:43:45 +01:00
0cd9db64fb Describe Magnetizer in guide 2025-11-27 22:25:48 +01:00
374f9037a1 Describe Macerator in guide 2025-11-26 23:09:29 +01:00
8760600105 Describe Iron Furnace in guide 2025-11-26 22:59:41 +01:00
d709feee6e Describe Induction Furnace in guide 2025-11-25 22:20:37 +01:00
b5f9955e07 Describe Geothermal Generator in guide 2025-11-25 22:01:33 +01:00
986a0d189c Use machine information from definitions instead of duplicating it in guide 2025-11-25 22:00:57 +01:00
8aa5ddc972 Describe Generator in guide 2025-11-24 21:44:35 +01:00
a2ce0e5177 Describe Extractor in guide 2025-11-24 21:32:04 +01:00
85b5d5808a Support locale in guide hypertext 2025-11-24 21:23:16 +01:00
69c8355ecb Functions for faster table creation in guide 2025-11-23 22:16:52 +01:00
37b6d2b8ff Describe Electric Furnace in guide 2025-11-22 20:13:23 +01:00
c9e73102c9 Describe Compressor in guide 2025-11-22 20:07:14 +01:00
d1511a5f10 Resize guide screenshots so they only contain machine formspecs 2025-11-22 19:50:45 +01:00
be435e616a Add few screenshots to visualize better 2025-11-22 15:27:21 +01:00
b4ea5629c1 Describe Canning Machine in guide 2025-11-21 22:59:03 +01:00
92ed913cac Describe Cable Former in guide 2025-11-21 22:48:59 +01:00
f98bebab4e Describe electrical network in guide 2025-11-21 22:35:40 +01:00
6348ca2094 Begin implementing in-game guide 2025-11-21 20:35:36 +01:00
10045582e9 Add Magnetizer front texture by Migdyn 2025-11-21 12:19:22 +01:00
fe55ade9b0 Implement Magnetizer 2025-11-20 20:41:20 +01:00
f7d3ef2190 Move addYVelocityClamped to common API 2025-11-20 20:40:26 +01:00
595241a9b2 Add iron plate 2025-11-20 20:40:00 +01:00
25b9c2e1b8 Buckets can now take fluids from Pump 2025-11-14 13:19:02 +01:00
1e1797e1dc Fix misaligned labels in Miner formspec 2025-11-14 13:14:00 +01:00
c594ac4743 Add active Pump front 2025-11-12 21:19:21 +01:00
868dd672b9 Add Pump side texture by Migdyn 2025-11-12 21:18:52 +01:00
7fd2932118 Add Pump front texture by Migdyn 2025-11-12 21:18:16 +01:00
fbaf90895c Use side texture for Pump 2025-11-12 21:17:55 +01:00
8f286ebcbc Register Compressor and Miner as machines which can interact with Pump 2025-11-11 19:52:45 +01:00
8ca2a44070 Implement Pump 2025-11-11 19:52:30 +01:00
28ff1aeb22 Introduce recipe override support for SimpleElectricItemProcessor 2025-11-11 19:51:24 +01:00
d13d2b9dfd Implement few fluid related registration functions 2025-11-11 19:50:29 +01:00
17a9cab691 Release IndustrialTest 2.0.0 (stable, release) 2025-05-14 23:23:30 +02:00
322655f483 Implement cable melting 2025-05-12 21:44:33 +02:00
2dae1d931d Re-add electrocution by uninsulated cables 2025-05-11 18:34:25 +02:00
ce0a5ad2e6 Add industrialtest.api.getFlowingCurrent API function 2025-05-11 18:34:12 +02:00
c8e506be53 LV Solar Array now outputs LV 2025-05-09 20:13:08 +02:00
5161f70232 Add Miner front texture 2025-05-09 19:37:31 +02:00
969744f242 Use mcl_tooltips for handling additional information for items if necessary 2025-05-09 19:02:00 +02:00
c58aeb308b Update texture sources list 2025-05-09 14:26:24 +02:00
16c8bed915 Add OV Scanner texture 2025-05-09 14:23:30 +02:00
a6cb0d4ed1 Add OD Scanner texture 2025-05-09 14:23:23 +02:00
50565ca604 Implement scanners and add way to use them in Miner 2025-05-08 22:25:32 +02:00
ea422c5999 Some Miner tweaks 2025-05-07 18:51:00 +02:00
65e0304c9e Add Mining Pipe texture 2025-05-06 18:00:07 +02:00
93d6cdbb89 Implement Miner 2025-05-06 18:00:00 +02:00
03ff0ac8ce Add missing } in uu_matter_crafts.lua 2025-05-04 17:23:35 +02:00
7391ad34f3 Add few more crafts involving UU-Matter 2025-04-30 13:36:09 +02:00
4d544099b1 Refactor utils 2025-04-29 12:34:05 +02:00
52f5a5c672 Refactor cables 2025-04-29 12:14:54 +02:00
47b85df93c Refactor upgrades 2025-04-29 11:21:14 +02:00
43484defad Update Hydrated Coal Dust texture to match regular dust 2025-04-29 10:18:20 +02:00
9b57098fca Move configuration to in-game settings 2025-04-29 10:14:20 +02:00
63960f3de1 Refactor item fluid storage 2025-04-28 13:36:17 +02:00
84ff508056 Refactor item power storage 2025-04-28 13:10:41 +02:00
62246bf91b Make sure that pointed thing is node when using treetap 2025-04-28 12:53:19 +02:00
8d48b3f9f5 Refactor wrench 2025-04-28 12:53:03 +02:00
089550cc28 Make sure to define on_place callback for treetaps 2025-04-25 22:18:16 +02:00
462e731bb7 Fix bone meal usage on rubber tree saplings in mcl2 2025-04-25 22:17:40 +02:00
2c63498d78 Remove outdated TEXTURES_TODO.md file 2025-04-25 10:51:57 +02:00
5898cc4e1c Merge pull request 'add sound at jetpack' (#29) from Kindaglia/industrialtest:sound into master 2025-04-25 10:48:46 +02:00
e41dfb3344 Remove leftover testing messages 2025-04-25 10:43:21 +02:00
230c9803ea Refactor Quantum Suit 2025-04-25 10:42:33 +02:00
Kindaglia
f651e407f7 fix naming 2025-04-25 10:12:45 +02:00
Kindaglia
f5f27ef999 rename and fix sound jetpack 2025-04-25 00:14:45 +02:00
Kindaglia
68abb4d08e add sound jetpack 2025-04-24 21:12:15 +02:00
Kindaglia
f1d8d5060c add sound jetpack ogg 2025-04-24 20:52:55 +02:00
5b32382422 Refactor Static Boots 2025-04-24 13:46:45 +02:00
30c67390b2 Refactor Solar Helmet 2025-04-23 14:22:18 +02:00
e34c1eba66 Refactor Nano Suit 2025-04-23 13:11:25 +02:00
6e1d0b5229 Refactor Mining Laser 2025-04-19 20:18:02 +02:00
000cff6940 Refactor jetpacks 2025-04-17 13:49:06 +02:00
b383231c40 Refactor electric sabers 2025-04-15 22:47:44 +02:00
6f864eca78 Refactor electric hoes 2025-04-14 16:32:58 +02:00
9cb5748b73 Refactor electric drills 2025-04-14 14:48:42 +02:00
b108ce7c6a Refactor electric chainsaws 2025-04-10 22:47:47 +02:00
dfdce73376 Refactor batpacks 2025-04-08 21:28:28 +02:00
6147074e05 Refactor treetaps 2025-04-06 22:08:43 +02:00
ae123446ad Move some common tool functionality to separate files for further usage 2025-04-06 22:07:38 +02:00
25680ace72 Fix issue while moving item in Canning Machine 2025-04-05 23:03:17 +02:00
c57efcdd5c Re-add Pipeworks compatibility 2025-04-05 23:03:05 +02:00
107 changed files with 5607 additions and 1849 deletions

View File

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

View File

@@ -22,6 +22,9 @@ industrialtest.api={
geothermalGeneratorFuels={}, geothermalGeneratorFuels={},
waterMillFuels={}, waterMillFuels={},
rotaryMaceratorModifiers={}, rotaryMaceratorModifiers={},
pumpTargets={},
pumpFluids={},
compressedFluids={},
storageCells={}, storageCells={},
tags={} tags={}
} }
@@ -32,10 +35,21 @@ industrialtest.api.hvPowerFlow=10200
industrialtest.api.evPowerFlow=40800 industrialtest.api.evPowerFlow=40800
industrialtest.api.ivPowerFlow=163800 industrialtest.api.ivPowerFlow=163800
industrialtest.api.nodeFluidCapacity=1000
function industrialtest.internal.clamp(num,min,max) function industrialtest.internal.clamp(num,min,max)
return math.max(math.min(num,max),min) return math.max(math.min(num,max),min)
end end
function industrialtest.internal.addYVelocityClamped(player,vel,max)
local playerVel=player:get_velocity()
if playerVel.y+vel>max then
player:add_velocity(vector.new(0,math.max(max-playerVel.y,0),0))
else
player:add_velocity(vector.new(0,vel,0))
end
end
function industrialtest.internal.unpackTableInto(first,second) function industrialtest.internal.unpackTableInto(first,second)
for k,v in pairs(second) do for k,v in pairs(second) do
first[k]=v first[k]=v

View File

@@ -16,19 +16,23 @@
local S=minetest.get_translator("industrialtest") local S=minetest.get_translator("industrialtest")
-- \brief Prepares itemstack containing fluid storage local function createItemFluidStorageText(itemstack)
-- \param itemstack ItemStack
-- \returns bool
function industrialtest.api.prepareFluidStorageItem(itemstack)
local meta=itemstack:get_meta() local meta=itemstack:get_meta()
local def=itemstack:get_definition() local fluidCapacity=meta:get_int("industrialtest.fluidCapacity")
if industrialtest.api.itemHasFluidStorage(itemstack) or not def.groups or not def.groups._industrialtest_fluidStorage or not def._industrialtest_fluidCapacity then local fluidAmount=meta:get_int("industrialtest.fluidAmount")
return false local lowerLimit=math.floor(fluidCapacity*0.25)
end local color=(fluidAmount>lowerLimit and "#0000FF" or "#FF0000")
return minetest.colorize(color,S("@1 / @2 mB",fluidAmount,fluidCapacity))
end
-- \brief Adds fluid storage to node metadata
-- \param meta MetaDataRef
-- \param capacity number
-- \returns nil
function industrialtest.api.addFluidStorage(meta,capacity)
meta:set_int("industrialtest.fluidCapacity",capacity)
meta:set_int("industrialtest.fluidAmount",0) meta:set_int("industrialtest.fluidAmount",0)
meta:set_int("industrialtest.fluidCapacity",def._industrialtest_fluidCapacity) meta:set_string("industrialtest.fluidType","ignore")
industrialtest.api.updateItemFluidText(itemstack)
return true
end end
-- \brief Check if itemstack contains fluid storage -- \brief Check if itemstack contains fluid storage
@@ -80,8 +84,13 @@ 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
@@ -119,3 +128,15 @@ 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,6 +41,102 @@ 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
@@ -94,15 +190,43 @@ 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.updateDelay) minetest.get_node_timer(endpoint.position):start(industrialtest.config.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)
if path and #path>0 then
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) minetest.remove_node(endpoint.position)
industrialtest.internal.explode(endpoint.position,2) industrialtest.internal.explode(endpoint.position,2)
end end
industrialtest.api.createNetworkMapForNode(pos)
end
end
end end
end end
return roomAvailable,transferred return roomAvailable,transferred
@@ -199,6 +323,7 @@ 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
}) })
@@ -271,6 +396,34 @@ 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,6 +16,15 @@
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
@@ -158,24 +167,15 @@ 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)
itemstack:set_wear(65535-meta:get_int("industrialtest.powerAmount")/meta:get_int("industrialtest.powerCapacity")*65534) meta:set_string("description",string.format("%s\n%s",desc,powerText))
end elseif industrialtest.mclAvailable then
tt.reload_itemstack_description(itemstack)
-- \brief Adds power storage to item depending on it's definition
-- \param itemstack ItemStack to which item storage should be added
-- \returns true if power storage was successfully added, false otherwise
function industrialtest.api.preparePowerStorageItem(itemstack)
local meta=itemstack:get_meta()
local def=minetest.registered_tools[itemstack:get_name()]
if industrialtest.api.hasPowerStorage(meta) or not def or not def._industrialtest_powerStorage or not def._industrialtest_powerCapacity or not def._industrialtest_powerFlow then
return false
end end
industrialtest.api.addPowerStorage(meta,def._industrialtest_powerCapacity,def._industrialtest_powerFlow,"n/a") itemstack:set_wear(65535-meta:get_int("industrialtest.powerAmount")/meta:get_int("industrialtest.powerCapacity")*65534)
industrialtest.api.updateItemPowerText(itemstack)
return true
end end
-- \brief Adds power to itemstack. Function checks if itemstack has power storage. -- \brief Adds power to itemstack. Function checks if itemstack has power storage.
@@ -223,3 +223,15 @@ 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

@@ -307,6 +307,65 @@ function industrialtest.api.getRotaryMaceratorModifier(name,modifier)
return industrialtest.api.rotaryMaceratorModifiers[name.." "..modifier] return industrialtest.api.rotaryMaceratorModifiers[name.." "..modifier]
end end
-- \brief Registers target node with which Pump can interact
-- \param name string
-- \param fluidNodes table
-- \param direction string
-- \return nil
function industrialtest.api.registerPumpTarget(name,direction)
industrialtest.api.pumpTargets[name]={
name=name,
direction=direction
}
end
-- \brief Returns Pump target info
-- \param name string
-- \returns table
function industrialtest.api.getPumpTarget(name)
return industrialtest.api.pumpTargets[name]
end
-- \brief Registers fluid node which can be pumped by pump
-- \param name string
-- \param texture string
-- \returns nil
function industrialtest.api.registerPumpFluid(name,texture)
industrialtest.api.pumpFluids[name]={
name=name,
texture=texture
}
end
-- \brief Returns registered node which can be pumped by pump
-- \param name string
-- \returns table
function industrialtest.api.getPumpFluid(name)
return industrialtest.api.pumpFluids[name]
end
-- \brief Registers fluid which can be pumped into compressor resulting with different item
-- \param fluidType string
-- \param requiredAmount number
-- \param time number
-- \param result string
-- \returns nil
function industrialtest.api.registerCompressedFluid(fluidType,requiredAmount,time,result)
industrialtest.api.compressedFluids[fluidType]={
fluidType=fluidType,
requiredAmount=requiredAmount,
time=time,
result=result
}
end
-- \brief Returns information about fluid which can be pumped into compressor resulting with different item
-- \param fluidType string
-- \returns table
function industrialtest.api.getCompressedFluid(fluidType)
return industrialtest.api.compressedFluids[fluidType]
end
minetest.register_on_mods_loaded(function() minetest.register_on_mods_loaded(function()
for _,def in pairs(industrialtest.api.rotaryMaceratorModifiers) do for _,def in pairs(industrialtest.api.rotaryMaceratorModifiers) do
if def.stackLeftover then if def.stackLeftover then

View File

@@ -1,60 +0,0 @@
-- IndustrialTest
-- Copyright (C) 2024 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/>.
-- \brief Sets uses metadata value depending on item's definition
-- \param itemstack ItemStack which should be altered
-- \returns true if value was successfully added, false otherwise
function industrialtest.api.prepareToolItem(itemstack)
local def=minetest.registered_tools[itemstack:get_name()]
if not def then
return false
end
if def._industrialtest_tool and def.tool_capabilities and def.tool_capabilities.uses then
local meta=itemstack:get_meta()
meta:set_int("industrialtest.uses",def.tool_capabilities.uses)
return true
elseif def.groups and def.groups._industrialtest_emptyOnConstruct and itemstack:get_wear()==0 then
itemstack:set_wear(65534)
return true
end
return false
end
-- \brief Adds wear to item after it's use
-- \param itemstack ItemStack to which wear should be added
-- \returns nil
function industrialtest.api.afterToolUse(itemstack)
local meta=itemstack:get_meta()
local def=minetest.registered_tools[itemstack:get_name()]
if not def or not def._industrialtest_tool or not def.tool_capabilities or not def.tool_capabilities.uses then
return
end
if not meta:contains("industrialtest.uses") then
industrialtest.prepareToolItem(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
end
meta:set_int("industrialtest.uses",uses)
itemstack:set_wear(65535-uses/def.tool_capabilities.uses*65535)
end

View File

@@ -15,27 +15,43 @@
-- 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={}
cable.onConstruct=function(pos) industrialtest.Cable={}
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)
minetest.get_node_timer(network):start(industrialtest.updateDelay) local networkNode=minetest.get_node(network)
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
cable.onDestruct=function(pos) function industrialtest.Cable.onDestruct(self,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
@@ -45,14 +61,16 @@ cable.onDestruct=function(pos)
end end
end end
local function registerCable(name,displayName,size,flow,registerInsulated) function industrialtest.Cable.createDefinitionTable(self,description,inventoryImage,tile,insulated)
local definition={ local size=(insulated and self.size+0.02 or self.size)
description=S(displayName.." Cable"), local def={
inventory_image="industrialtest_"..name.."_cable_inv.png", description=description,
tiles={"industrialtest_"..name.."_cable.png"}, inventory_image=inventoryImage,
wield_image="industrialtest_"..name.."_cable_inv.png", wield_image=inventoryImage,
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",
@@ -118,39 +136,67 @@ local function registerCable(name,displayName,size,flow,registerInsulated)
"group:_industrialtest_hasPowerOutput", "group:_industrialtest_hasPowerOutput",
"group:_industrialtest_cable" "group:_industrialtest_cable"
}, },
on_construct=cable.onConstruct, on_construct=function(pos)
on_destruct=cable.onDestruct, self:onConstruct(pos)
_industrialtest_cableFlow=flow end,
on_destruct=function(pos)
self:onDestruct(pos)
end,
_industrialtest_cableFlow=self.flow
} }
if industrialtest.mtgAvailable then if industrialtest.mtgAvailable then
definition.groups={ def.groups={
cracky=1, cracky=1,
level=1, level=1,
oddly_breakable_by_hand=1 oddly_breakable_by_hand=1
} }
definition.sound=default.node_sound_metal_defaults() def.sound=default.node_sound_metal_defaults()
elseif industrialtest.mclAvailable then elseif industrialtest.mclAvailable then
definition.groups={ def.groups={
handy=1, handy=1,
pickaxey=1 pickaxey=1
} }
definition._mcl_blast_resistance=1 def._mcl_blast_resistance=1
definition._mcl_hardness=0.5 def._mcl_hardness=0.5
definition.sound=mcl_sounds.node_sound_metal_defaults() def.sound=mcl_sounds.node_sound_metal_defaults()
end end
definition.groups._industrialtest_cable=1 def.groups._industrialtest_cable=1
minetest.register_node("industrialtest:"..name.."_cable",definition) if insulated then
if registerInsulated then def.groups._industrialtest_insulatedCable=1
definition=table.copy(definition) end
definition.description=S("Insulated "..displayName.." Cable")
definition.inventory_image="industrialtest_insulated_"..name.."_cable_inv.png" return def
definition.tiles={"industrialtest_insulated_"..name.."_cable.png"} end
definition.wield_image="industrialtest_insulated_"..name.."_cable_inv.png"
minetest.register_node("industrialtest:insulated_"..name.."_cable",definition) function industrialtest.Cable.register(self)
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
registerCable("tin","Tin",0.19,industrialtest.api.lvPowerFlow,true) industrialtest.TinCable=table.copy(industrialtest.Cable)
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",
@@ -158,6 +204,7 @@ 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",
@@ -166,6 +213,7 @@ 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",
@@ -175,13 +223,31 @@ 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
}) })
registerCable("copper","Copper",0.15,industrialtest.api.mvPowerFlow,true) industrialtest.CopperCable=table.copy(industrialtest.Cable)
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",
@@ -189,6 +255,7 @@ 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",
@@ -197,6 +264,7 @@ 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",
@@ -206,12 +274,30 @@ 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
}) })
registerCable("gold","Gold",0.15,industrialtest.api.hvPowerFlow,true) industrialtest.GoldCable=table.copy(industrialtest.Cable)
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",
@@ -219,6 +305,7 @@ 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",
@@ -227,6 +314,7 @@ 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",
@@ -236,12 +324,30 @@ 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
}) })
registerCable("iron","Iron",0.15,industrialtest.api.evPowerFlow,true) industrialtest.IronCable=table.copy(industrialtest.Cable)
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",
@@ -249,6 +355,7 @@ 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",
@@ -257,6 +364,7 @@ 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",
@@ -266,13 +374,27 @@ 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
}) })
registerCable("glass_fibre","Glass Fibre",0.15,industrialtest.api.ivPowerFlow,false) industrialtest.GlassFibreCable=table.copy(industrialtest.Cable)
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",
@@ -283,3 +405,52 @@ 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

@@ -41,7 +41,10 @@ local function addPipeworksCompatibility(name,sides,inputInventory)
return nil return nil
end end
local result=inv:add_item(listname,stack) local result=inv:add_item(listname,stack)
minetest.get_node_timer(pos):start(industrialtest.updateDelay) local def=minetest.registered_nodes[node.name]
if def and def._industrialtest_self then
def._industrialtest_self:triggerIfNeeded(pos)
end
return result return result
end, end,
can_insert=function(pos,node,stack,direction) can_insert=function(pos,node,stack,direction)
@@ -53,6 +56,16 @@ local function addPipeworksCompatibility(name,sides,inputInventory)
end end
return inv:room_for_item(listname,stack) return inv:room_for_item(listname,stack)
end, end,
remove_items=function(pos,node,stack,direction,count,listname)
local meta=minetest.get_meta(pos)
local inv=meta:get_inventory()
inv:remove_item(listname,stack)
local def=minetest.registered_nodes[node.name]
if def and def._industrialtest_self then
def._industrialtest_self:triggerIfNeeded(pos)
end
return stack
end,
input_inventory=inputInventory, input_inventory=inputInventory,
connect_sides={ connect_sides={
left=1, left=1,
@@ -157,7 +170,8 @@ local 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)
minetest.registered_nodes["industrialtest:nuclear_reactor"].on_metadata_inventory_put(pos) industrialtest.Reactor.synchronizeChambers(pos)
industrialtest.Reactor:triggerIfNeeded(pos)
return result return result
end, end,
can_insert=function(pos,node,stack,direction) can_insert=function(pos,node,stack,direction)
@@ -171,6 +185,14 @@ local override={
local inv=meta:get_inventory() local inv=meta:get_inventory()
return inv:room_for_item(listname,stack) return inv:room_for_item(listname,stack)
end, end,
remove_items=function(pos,node,stack,direction,count,listname)
local meta=minetest.get_meta(pos)
local inv=meta:get_inventory()
inv:remove_item(listname,stack)
industrialtest.Reactor.synchronizeChambers(pos)
industrialtest.Reactor:triggerIfNeeded(pos)
return stack
end,
input_inventory="fuel", input_inventory="fuel",
connect_sides={ connect_sides={
left=1, left=1,
@@ -207,10 +229,22 @@ override.tube.insert_object=function(pos,node,stack,direction)
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)
minetest.registered_nodes["industrialtest:nuclear_reactor_chamber"].on_metadata_inventory_put(pos) industrialtest.Reactor:synchronizeToChamber(pos)
local reactorPos=minetest.deserialize(meta:get_string("reactor"))
industrialtest.Reactor:triggerIfNeeded(reactorPos)
return result return result
end end
override.tube.remove_items=function(pos,node,stack,direction,count,listname)
local meta=minetest.get_meta(pos)
local inv=meta:get_inventory()
inv:remove_item(listname,stack)
industrialtest.Reactor:synchronizeToChamber(pos)
local reactorPos=minetest.deserialize(meta:get_string("reactor"))
industrialtest.Reactor:triggerIfNeeded(reactorPos)
return stack
end
override.after_place_node_old=def.after_place_node override.after_place_node_old=def.after_place_node
override.after_place_node=function(pos) override.after_place_node=function(pos)
minetest.registered_nodes["industrialtest:nuclear_reactor_chamber"].after_place_node_old(pos) minetest.registered_nodes["industrialtest:nuclear_reactor_chamber"].after_place_node_old(pos)
@@ -269,20 +303,21 @@ override={
if direction.y==1 then if direction.y==1 then
listname="powerStorage" listname="powerStorage"
elseif direction.y==-1 then elseif direction.y==-1 then
listname="fuel" listname="src"
else else
listname="target" listname="dst"
end end
local def=stack:get_definition() local def=stack:get_definition()
if (listname=="powerStorage" and not industrialtest.api.hasPowerStorage(stack:get_meta())) or if (listname=="powerStorage" and not industrialtest.api.hasPowerStorage(stack:get_meta())) or
(listname=="fuel" and (not def.groups or not def.groups._industrialtest_fuel)) or (listname=="src" and (not def.groups or not def.groups._industrialtest_fuel)) or
(listname=="target" and (not def.groups or not def.groups._industrialtest_fueled)) then (listname=="dst" and (not def.groups or not def.groups._industrialtest_fueled)) then
return nil return nil
end end
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)
minetest.get_node_timer(pos):start(industrialtest.updateDelay) local nodeDef=minetest.registered_nodes[node.name]
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)
@@ -290,21 +325,28 @@ override={
if direction.y==1 then if direction.y==1 then
listname="powerStorage" listname="powerStorage"
elseif direction.y==-1 then elseif direction.y==-1 then
listname="fuel" listname="src"
else else
listname="target" listname="dst"
end end
local def=stack:get_definition() local def=stack:get_definition()
if (listname=="powerStorage" and not industrialtest.api.hasPowerStorage(stack:get_meta())) or if (listname=="powerStorage" and not industrialtest.api.hasPowerStorage(stack:get_meta())) or
(listname=="fuel" and (not def.groups or not def.groups._industrialtest_fuel)) or (listname=="src" and (not def.groups or not def.groups._industrialtest_fuel)) or
(listname=="target" and (not def.groups or not def.groups._industrialtest_fueled)) then (listname=="dst" and (not def.groups or not def.groups._industrialtest_fueled)) then
return false return false
end end
local meta=minetest.get_meta(pos) local meta=minetest.get_meta(pos)
local inv=meta:get_inventory() local inv=meta:get_inventory()
return inv:room_for_item(listname,stack) return inv:room_for_item(listname,stack)
end, end,
input_inventory="target", remove_items=function(pos,node,stack,direction,count,listname)
local meta=minetest.get_meta(pos)
local inv=meta:get_inventory()
inv:remove_item(listname,stack)
industrialtest.CanningMachine:triggerIfNeeded(pos)
return stack
end,
input_inventory="dst",
connect_sides={ connect_sides={
left=1, left=1,
right=1, right=1,

View File

@@ -53,6 +53,21 @@ industrialtest.internal={}
if industrialtest.mclAvailable then if industrialtest.mclAvailable then
industrialtest.stackMax=64 industrialtest.stackMax=64
minetest.override_item("mcl_buckets:bucket_empty",{
groups={
_industrialtest_simpleFluidStorage=1
},
_industrialtest_getResultingFluidStorageItemByNode=function(fluidType)
local resultingItem=mcl_buckets.liquids[fluidType]
if resultingItem then
return {
name=resultingItem.bucketname
}
end
end,
_industrialtest_simpleFluidStorageCapacity=1000
})
industrialtest.internal.mclMakeStrippedTrunk=function(itemstack,placer,pointedThing,electricTool) industrialtest.internal.mclMakeStrippedTrunk=function(itemstack,placer,pointedThing,electricTool)
-- Taken from https://git.minetest.land/MineClone2/MineClone2/src/branch/master/mods/ITEMS/mcl_tools/init.lua#L360 -- Taken from https://git.minetest.land/MineClone2/MineClone2/src/branch/master/mods/ITEMS/mcl_tools/init.lua#L360
if pointedThing.type ~= "node" then return end if pointedThing.type ~= "node" then return end
@@ -90,6 +105,22 @@ if industrialtest.mclAvailable then
elseif industrialtest.mtgAvailable then elseif industrialtest.mtgAvailable then
industrialtest.stackMax=99 industrialtest.stackMax=99
-- Override bucket to add function which will be used to query bucket with fluid
minetest.override_item("bucket:bucket_empty",{
groups={
_industrialtest_simpleFluidStorage=1
},
_industrialtest_getResultingFluidStorageItemByNode=function(fluidType)
local resultingItem=bucket.liquids[fluidType]
if resultingItem then
return {
name=resultingItem.itemname
}
end
end,
_industrialtest_simpleFluidStorageCapacity=1000
})
industrialtest.internal.explode=function(pos,radius) industrialtest.internal.explode=function(pos,radius)
tnt.boom(pos,{radius=radius}) tnt.boom(pos,{radius=radius})
end end
@@ -450,6 +481,7 @@ 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"
@@ -505,6 +537,8 @@ 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.paper="mcl_core:paper"
industrialtest.elementKeys.groupSapling="group:sapling" industrialtest.elementKeys.groupSapling="group:sapling"
industrialtest.elementKeys.groupLeaves="group:leaves" industrialtest.elementKeys.groupLeaves="group:leaves"
industrialtest.elementKeys.stickyResin=(industrialtest.mods.mclRubber and "mcl_rubber:rubber_raw" or "industrialtest:sticky_resin") industrialtest.elementKeys.stickyResin=(industrialtest.mods.mclRubber and "mcl_rubber:rubber_raw" or "industrialtest:sticky_resin")
@@ -690,6 +724,7 @@ 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"
@@ -738,6 +773,8 @@ 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.paper="default:paper"
industrialtest.elementKeys.groupSapling="group:sapling" industrialtest.elementKeys.groupSapling="group:sapling"
industrialtest.elementKeys.groupLeaves="group:leaves" industrialtest.elementKeys.groupLeaves="group:leaves"
industrialtest.elementKeys.stickyResin="industrialtest:sticky_resin" industrialtest.elementKeys.stickyResin="industrialtest:sticky_resin"

View File

@@ -41,75 +41,6 @@ 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"),
@@ -572,6 +503,13 @@ industrialtest.api.registerPlate("carbon_plate",S("Carbon Plate"),{
} }
},"#272725ff",true) },"#272725ff",true)
industrialtest.api.registerPlate("iron_plate",S("Iron Plate"),{
{
resource=industrialtest.elementKeys.ironIngot,
count=1
}
},colors.iron,true)
industrialtest.api.registerPlate("tin_plate",S("Tin Plate"),{ industrialtest.api.registerPlate("tin_plate",S("Tin Plate"),{
{ {
resource=industrialtest.elementKeys.tinIngot, resource=industrialtest.elementKeys.tinIngot,
@@ -602,6 +540,9 @@ minetest.register_craftitem("industrialtest:empty_cell",{
description=S("Empty Cell"), description=S("Empty Cell"),
inventory_image="industrialtest_empty_cell.png", inventory_image="industrialtest_empty_cell.png",
liquids_pointable=true, liquids_pointable=true,
groups={
_industrialtest_simpleFluidStorage=1
},
on_place=function(itemstack,user,pointed) on_place=function(itemstack,user,pointed)
if pointed.type~="node" or not user or not user:is_player() then if pointed.type~="node" or not user or not user:is_player() then
return nil return nil
@@ -623,7 +564,9 @@ minetest.register_craftitem("industrialtest:empty_cell",{
end end
minetest.remove_node(pointed.under) minetest.remove_node(pointed.under)
return itemstack return itemstack
end end,
_industrialtest_getResultingFluidStorageItemByNode=industrialtest.api.getStorageCellByNode,
_industrialtest_simpleFluidStorageCapacity=1000
}) })
minetest.register_craft({ minetest.register_craft({
type="shaped", type="shaped",
@@ -871,38 +814,3 @@ 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"}
}
})
-- Item callbacks
minetest.register_on_player_inventory_action(function(player,action,inventory,info)
if action=="put" then
if industrialtest.api.preparePowerStorageItem(info.stack) or industrialtest.api.prepareToolItem(info.stack) or industrialtest.api.prepareFluidStorageItem(info.stack) then
inventory:set_stack(info.listname,info.index,info.stack)
end
end
end)
minetest.register_on_craft(function(itemstack)
if industrialtest.api.preparePowerStorageItem(itemstack) or industrialtest.api.prepareToolItem(itemstack) then
return
end
industrialtest.api.prepareFluidStorageItem(itemstack)
end)

View File

@@ -125,3 +125,12 @@ if industrialtest.mtgAvailable then
} }
}) })
end end
-- Pumped fluids
if industrialtest.mtgAvailable then
industrialtest.api.registerPumpFluid("default:river_water_source","industrialtest_gui_river_water.png")
industrialtest.api.registerCompressedFluid("default:river_water_source",industrialtest.api.nodeFluidCapacity/2,5,"default:snow")
end
industrialtest.api.registerPumpFluid(industrialtest.elementKeys.waterSource,"industrialtest_gui_water.png")
industrialtest.api.registerPumpFluid(industrialtest.elementKeys.lavaSource,"industrialtest_gui_lava.png")
industrialtest.api.registerCompressedFluid(industrialtest.elementKeys.waterSource,industrialtest.api.nodeFluidCapacity/2,5,industrialtest.elementKeys.snowball)

1509
guide.lua Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -19,9 +19,12 @@ local modpath=minetest.get_modpath("industrialtest")
-- table with global functions, variables etc -- table with global functions, variables etc
industrialtest={} industrialtest={}
-- Initial constants -- Settings
industrialtest.updateDelay=1 -- Note: Make this value smaller to make machines update more frequently (it may make server more laggy) industrialtest.config={
industrialtest.developerMode=true -- Enables additional utils useful when developing mod updateDelay=tonumber(minetest.settings:get("industrialtest.updateDelay") or "1"),
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())
@@ -36,7 +39,6 @@ dofile(modpath.."/api/network.lua")
dofile(modpath.."/api/power.lua") dofile(modpath.."/api/power.lua")
dofile(modpath.."/api/registration.lua") dofile(modpath.."/api/registration.lua")
dofile(modpath.."/api/side.lua") dofile(modpath.."/api/side.lua")
dofile(modpath.."/api/tool.lua")
dofile(modpath.."/machines/machine.lua") dofile(modpath.."/machines/machine.lua")
dofile(modpath.."/machines/activated_machine.lua") dofile(modpath.."/machines/activated_machine.lua")
@@ -54,9 +56,12 @@ dofile(modpath.."/machines/generator.lua")
dofile(modpath.."/machines/induction_furnace.lua") dofile(modpath.."/machines/induction_furnace.lua")
dofile(modpath.."/machines/iron_furnace.lua") dofile(modpath.."/machines/iron_furnace.lua")
dofile(modpath.."/machines/macerator.lua") dofile(modpath.."/machines/macerator.lua")
dofile(modpath.."/machines/magnetizer.lua")
dofile(modpath.."/machines/mass_fabricator.lua") dofile(modpath.."/machines/mass_fabricator.lua")
dofile(modpath.."/machines/miner.lua")
dofile(modpath.."/machines/nuclear_reactor.lua") dofile(modpath.."/machines/nuclear_reactor.lua")
dofile(modpath.."/machines/power_storage.lua") dofile(modpath.."/machines/power_storage.lua")
dofile(modpath.."/machines/pump.lua")
dofile(modpath.."/machines/recycler.lua") dofile(modpath.."/machines/recycler.lua")
dofile(modpath.."/machines/rotary_macerator.lua") dofile(modpath.."/machines/rotary_macerator.lua")
dofile(modpath.."/machines/tool_workshop.lua") dofile(modpath.."/machines/tool_workshop.lua")
@@ -65,14 +70,26 @@ dofile(modpath.."/machines/solar_panel_generator.lua")
dofile(modpath.."/machines/wind_mill.lua") dofile(modpath.."/machines/wind_mill.lua")
dofile(modpath.."/tools/common.lua") dofile(modpath.."/tools/common.lua")
dofile(modpath.."/tools/item.lua")
dofile(modpath.."/tools/electric_item.lua")
dofile(modpath.."/tools/electric_armor.lua")
dofile(modpath.."/tools/fluid_container_item.lua")
dofile(modpath.."/tools/tool.lua")
dofile(modpath.."/tools/gear_tool.lua")
dofile(modpath.."/tools/electric_tool.lua")
dofile(modpath.."/tools/activated_electric_tool.lua")
dofile(modpath.."/tools/electric_gear_tool.lua")
dofile(modpath.."/tools/batpack.lua") dofile(modpath.."/tools/batpack.lua")
dofile(modpath.."/tools/electric_chainsaw.lua") 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")
@@ -81,8 +98,9 @@ dofile(modpath.."/tools/wrench.lua")
dofile(modpath.."/upgrades.lua") dofile(modpath.."/upgrades.lua")
dofile(modpath.."/craftitems.lua") dofile(modpath.."/craftitems.lua")
dofile(modpath.."/guide.lua")
dofile(modpath.."/nodes.lua") dofile(modpath.."/nodes.lua")
if industrialtest.developerMode then if industrialtest.config.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.updateDelay) minetest.get_node_timer(pos):start(industrialtest.config.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.updateDelay) minetest.get_node_timer(pos):start(industrialtest.config.updateDelay)
end end
function industrialtest.ActivatedMachine.shouldActivate(self,pos) function industrialtest.ActivatedMachine.shouldActivate(self,pos)

View File

@@ -99,7 +99,7 @@ function industrialtest.CanningMachine.getFormspec(self,pos)
return parentFormspec..table.concat(formspec,"") return parentFormspec..table.concat(formspec,"")
end end
function industrialtest.CanningMachine.allowMetadataInventoryMove(self,pos,fromList,fromIndex,toList,count) function industrialtest.CanningMachine.allowMetadataInventoryMove(self,pos,fromList,fromIndex,toList,toIndex,count)
if toList=="src" then if toList=="src" then
local inv=minetest.get_meta(pos):get_inventory() local inv=minetest.get_meta(pos):get_inventory()
local itemstack=inv:get_stack(fromList,fromIndex) local itemstack=inv:get_stack(fromList,fromIndex)
@@ -112,10 +112,13 @@ function industrialtest.CanningMachine.allowMetadataInventoryMove(self,pos,fromL
local def=itemstack:get_definition() local def=itemstack:get_definition()
return (def.groups and def.groups._industrialtest_fueled) and count or 0 return (def.groups and def.groups._industrialtest_fueled) and count or 0
end end
return math.min(count,industrialtest.ActivatedElectricMachine.allowMetadataInventoryMove(self,pos,fromList,fromIndex,toList,count)) if toList=="leftover" then
return 0
end
return math.min(count,industrialtest.ActivatedElectricMachine.allowMetadataInventoryMove(self,pos,fromList,fromIndex,toList,toIndex,count))
end end
function industrialtest.CanningMachine.allowMetadataInventoryPut(self,pos,listname,index,stack) function industrialtest.CanningMachine.allowMetadataInventoryPut(self,pos,listname,index,stack,player)
if listname=="src" then if listname=="src" then
local def=stack:get_definition() local def=stack:get_definition()
return (def.groups and def.groups._industrialtest_fuel) and stack:get_count() or 0 return (def.groups and def.groups._industrialtest_fuel) and stack:get_count() or 0
@@ -124,19 +127,22 @@ function industrialtest.CanningMachine.allowMetadataInventoryPut(self,pos,listna
local def=stack:get_definition() local def=stack:get_definition()
return (def.groups and def.groups._industrialtest_fueled) and stack:get_count() or 0 return (def.groups and def.groups._industrialtest_fueled) and stack:get_count() or 0
end end
return math.min(stack:get_count(),industrialtest.ActivatedElectricMachine.allowMetadataInventoryPut(self,pos,listname,index,stack)) if listname=="leftover" then
return 0
end
return math.min(stack:get_count(),industrialtest.ActivatedElectricMachine.allowMetadataInventoryPut(self,pos,listname,index,stack,player))
end end
function industrialtest.CanningMachine.allowMetadataInventoryTake(self,pos,listname,index,stack) function industrialtest.CanningMachine.allowMetadataInventoryTake(self,pos,listname,index,stack,player)
local meta=minetest.get_meta(pos) local meta=minetest.get_meta(pos)
local inv=meta:get_inventory() local inv=meta:get_inventory()
local fuelSlot=inv:get_stack("src",1) local fuelSlot=inv:get_stack("src",1)
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)
minetest.get_node_timer(pos):start(industrialtest.updateDelay) self:updateFormspec(pos)
end end
return industrialtest.ActivatedElectricMachine.allowMetadataInventoryTake(self,pos,listname,index,stack) return industrialtest.ActivatedElectricMachine.allowMetadataInventoryTake(self,pos,listname,index,stack,player)
end end
function industrialtest.CanningMachine.onMetadataInventoryMove(self,pos,fromList,fromIndex,toList,toIndex,count) function industrialtest.CanningMachine.onMetadataInventoryMove(self,pos,fromList,fromIndex,toList,toIndex,count)
@@ -147,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)
meta:set_string("formspec",canningMachine.getFormspec(pos)) self:updateFormspec(pos)
end end
end end
function industrialtest.CanningMachine.onMetadataInventoryPut(self,pos) function industrialtest.CanningMachine.onMetadataInventoryPut(self,pos,listname,index,stack)
minetest.get_node_timer(pos):start(industrialtest.updateDelay) self:triggerIfNeeded(pos)
industrialtest.ActivatedElectricMachine.onMetadataInventoryPut(self,pos,listname,index,stack) industrialtest.ActivatedElectricMachine.onMetadataInventoryPut(self,pos,listname,index,stack)
end end
@@ -182,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 targetMeta:get_int("industrialtest.fluidCapacity")-targetMeta:get_int("industrialtest.fluidAmount")<(fuelDef._industrialtest_fuelAmount or 0) 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.updateDelay, interval=industrialtest.config.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

@@ -62,8 +62,38 @@ function industrialtest.Compressor.getCraftResult(self,itemstack)
} }
end end
function industrialtest.Compressor.canPushFluid(self,pos,fluidType,fluidAmount)
local meta=minetest.get_meta(pos)
local compressedFluid=industrialtest.api.getCompressedFluid(fluidType)
if not self.isRecipeOverride(meta) and compressedFluid and fluidAmount>=compressedFluid.requiredAmount then
local inv=meta:get_inventory()
local resultingStack=ItemStack(compressedFluid.result)
if inv:room_for_item("dst",resultingStack) then
return true
end
end
return false
end
-- Called by Pump when Compressor is next to it while it tries to push fluid
function industrialtest.Compressor.onPumpFluidPush(self,pos,pumpPos,fluidType,fluidAmount)
local compressedFluid=industrialtest.api.getCompressedFluid(fluidType)
if compressedFluid then
local meta=minetest.get_meta(pos)
-- If recipe can be overriden keep information about this in meta so it's picked up by superclass
meta:set_string("recipeOverride",compressedFluid.result)
meta:set_int("recipeOverrideMaxTime",compressedFluid.time)
fluidAmount=fluidAmount-compressedFluid.requiredAmount
self:triggerIfNeeded(pos)
end
return fluidAmount
end
industrialtest.Compressor:register() industrialtest.Compressor:register()
industrialtest.api.registerPumpTarget("industrialtest:compressor","o")
industrialtest.api.registerPumpTarget("industrialtest:compressor_active","o")
minetest.register_craft({ minetest.register_craft({
type="shaped", type="shaped",
output="industrialtest:compressor", output="industrialtest:compressor",

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.updateDelay) minetest.get_node_timer(conn):start(industrialtest.config.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.updateDelay) minetest.get_node_timer(network):start(industrialtest.config.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.updateDelay) minetest.get_node_timer(network):start(industrialtest.config.updateDelay)
end end
end end
end end

View File

@@ -94,6 +94,7 @@ local function takeFuelFromItem(self,pos)
inv:set_stack("src",1,fluidSlot) inv:set_stack("src",1,fluidSlot)
meta:set_string("fluid",fuel.name) meta:set_string("fluid",fuel.name)
meta:set_float("fluidAmount",fluidAmount+1000) meta:set_float("fluidAmount",fluidAmount+1000)
self:updateFormspec(pos)
return true return true
end end
end end
@@ -366,7 +367,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.updateDelay, interval=industrialtest.config.updateDelay,
chance=1, chance=1,
action=function(pos) action=function(pos)
industrialtest.WaterMill:action(pos) industrialtest.WaterMill:action(pos)

View File

@@ -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)
minetest.get_node_timer(pos):start(industrialtest.updateDelay) self:triggerIfNeeded(pos)
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
minetest.get_node_timer(pos):start(industrialtest.updateDelay) self:triggerIfNeeded(pos)
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
minetest.get_node_timer(pos):start(industrialtest.updateDelay) self:triggerIfNeeded(pos)
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)
minetest.get_node_timer(pos):start(industrialtest.updateDelay) self:triggerIfNeeded(pos)
industrialtest.ActivatedMachine.onMetadataInventoryPut(self,pos,listname,index,stack) industrialtest.ActivatedMachine.onMetadataInventoryPut(self,pos,listname,index,stack)
end end

View File

@@ -32,6 +32,15 @@ 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
@@ -73,8 +82,7 @@ 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
minetest.debug("updating "..minetest.serialize(pos)) timer:start(industrialtest.config.updateDelay)
timer:start(industrialtest.updateDelay)
end end
end end
@@ -129,27 +137,37 @@ 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 stack=inv:get_stack(fromList,fromIndex) local itemstack=inv:get_stack(fromList,fromIndex)
industrialtest.internal.applyUpgrade(pos,meta,stack) local def=itemstack:get_definition()
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 stack=inv:get_stack(fromList,fromIndex) local itemstack=inv:get_stack(fromList,fromIndex)
industrialtest.internal.removeUpgrade(pos,meta,stack) local def=itemstack:get_definition()
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 meta=minetest.get_meta(pos) local def=stack: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
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 meta=minetest.get_meta(pos) local def=stack: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
@@ -186,6 +204,12 @@ 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,
@@ -260,7 +284,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)
minetest.get_node_timer(pos):start(industrialtest.updateDelay) self:triggerIfNeeded(pos)
end end
end end
@@ -290,8 +314,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,stack) function industrialtest.Machine.allowMoveToUpgradeSlot(pos,toIndex,itemstack)
local def=minetest.registered_items[stack:get_name()] local def=itemstack:get_definition()
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
@@ -301,5 +325,5 @@ function industrialtest.Machine.allowMoveToUpgradeSlot(pos,toIndex,stack)
if not targetSlot:is_empty() then if not targetSlot:is_empty() then
return 0 return 0
end end
return stack:get_count() return itemstack:get_count()
end end

272
machines/magnetizer.lua Normal file
View File

@@ -0,0 +1,272 @@
-- IndustrialTest
-- Copyright (C) 2025 mrkubax10
-- This program is free software: you can redistribute it and/or modify
-- it under the terms of the GNU General Public License as published by
-- the Free Software Foundation, either version 3 of the License, or
-- (at your option) any later version.
-- This program is distributed in the hope that it will be useful,
-- but WITHOUT ANY WARRANTY; without even the implied warranty of
-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-- GNU General Public License for more details.
-- You should have received a copy of the GNU General Public License
-- along with this program. If not, see <http://www.gnu.org/licenses/>.
local S=minetest.get_translator("industrialtest")
local function findFenceRailEnd(initialPosition,direction)
local y=initialPosition.y
local railNode=minetest.get_node(vector.new(initialPosition.x,y,initialPosition.z))
while minetest.get_item_group(railNode.name,"_industrialtest_metalFence")>0 and math.abs(initialPosition.y-y)<=19 do
y=y+direction
railNode=minetest.get_node(vector.new(initialPosition.x,y,initialPosition.z))
end
return y-direction
end
local function hasMetalBoots(player)
local inv
if industrialtest.mtgAvailable then
_,inv=armor:get_valid_player(player,"")
elseif industrialtest.mclAvailable then
inv=player:get_inventory()
end
if inv then
local armorList=inv:get_list("armor")
assert(armorList)
local requiredGroups={
"armor_iron",
"armor_gold",
"armor_bronze",
"_industrialtest_electricArmor"
}
-- 3D armor boots have to be hardcoded here because they don't provide any group depending on material
local requiredNames={
"3d_armor:boots_steel",
"3d_armor:boots_gold",
"3d_armor:boots_bronze"
}
for _,itemstack in ipairs(armorList) do
local def=itemstack:get_definition()
if def and def.groups and def.groups.armor_feet then
for _,group in ipairs(requiredGroups) do
if def.groups[group] then
-- Matching group succeeded
return true
end
end
end
for _,itemname in ipairs(requiredNames) do
if itemname==itemstack:get_name() then
-- Matching itemname succeeded
return true
end
end
end
end
return false
end
industrialtest.Magnetizer=table.copy(industrialtest.ElectricMachine)
industrialtest.internal.unpackTableInto(industrialtest.Magnetizer,{
name="industrialtest:magnetizer",
description=S("Magnetizer"),
tiles={
"industrialtest_machine_block.png",
"industrialtest_machine_block.png",
"industrialtest_machine_block.png",
"industrialtest_machine_block.png",
"industrialtest_machine_block.png",
"industrialtest_machine_block.png^industrialtest_magnetizer_front.png"
},
sounds="metal",
facedir=true,
storageLists={
"powerStorage"
},
powerLists={
{
list="powerStorage",
direction="i"
}
},
capacity=industrialtest.api.lvPowerFlow*2,
flow=industrialtest.api.lvPowerFlow,
ioConfig="iiiiii",
requiresWrench=true,
hasPowerInput=true,
_capacityPerFence=15,
_opPower=4
})
function industrialtest.Magnetizer.onConstruct(self,pos)
local meta=minetest.get_meta(pos)
local inv=meta:get_inventory()
inv:set_size("powerStorage",1)
self:determineFenceRail(pos)
self:determinePowerCapacity(pos)
industrialtest.ElectricMachine.onConstruct(self,pos)
end
function industrialtest.Magnetizer.onDestruct(self,pos)
self.detachFenceRail(pos)
industrialtest.ElectricMachine.onDestruct(self,pos)
end
function industrialtest.Magnetizer.onDig(self,pos,node,digger)
self.detachFenceRail(pos)
return industrialtest.ElectricMachine.onDig(self,pos,node,digger)
end
function industrialtest.Magnetizer.getFormspec(self,pos)
local parentFormspec=industrialtest.ElectricMachine.getFormspec(self,pos)
local meta=minetest.get_meta(pos)
local powerPercent=meta:get_int("industrialtest.powerAmount")/meta:get_int("industrialtest.powerCapacity")*100
local formspec={
(powerPercent>0 and "image[4.7,2.7;1,1;industrialtest_gui_electricity_bg.png^[lowpart:"..powerPercent..":industrialtest_gui_electricity_fg.png]"
or "image[4.7,2.7;1,1;industrialtest_gui_electricity_bg.png]"),
"list[context;powerStorage;4.7,3.7;1,1]",
"listring[context;powerStorage]"
}
return parentFormspec..table.concat(formspec,"")
end
function industrialtest.Magnetizer.determinePowerCapacity(self,pos)
local meta=minetest.get_meta(pos)
if meta:contains("lowY") and meta:contains("highY") then
local lowY=meta:get_int("lowY")
local highY=meta:get_int("highY")
local capacity=self.capacity+(highY-lowY)*self._capacityPerFence
meta:set_int("industrialtest.powerCapacity",capacity)
end
end
-- Checks all sides on the same Y level if there is rail made from metal fences attached
function industrialtest.Magnetizer.determineFenceRail(self,pos)
local neighbourPositions={
vector.offset(pos,-1,0,0),
vector.offset(pos,1,0,0),
vector.offset(pos,0,0,-1),
vector.offset(pos,0,0,1)
}
local railPosition
for _,neighbourPosition in ipairs(neighbourPositions) do
local neighbourNode=minetest.get_node(neighbourPosition)
if minetest.get_item_group(neighbourNode.name,"_industrialtest_metalFence")>0 then
railPosition=neighbourPosition
break
end
end
if not railPosition then
return
end
local direction=vector.subtract(railPosition,pos)
minetest.swap_node(pos,{
name=self.name,
-- Some cryptic code that converts direction vector to param2
param2=direction.z+1*math.abs(direction.z)+direction.x+2*math.abs(direction.x)
})
-- Find low and high points of fence rail
local lowY=findFenceRailEnd(railPosition,-1)
local highY=findFenceRailEnd(railPosition,1)
-- Keep magnetizer position in fence metadata so new fences can be attached easily
for y=lowY,highY,1 do
local meta=minetest.get_meta(vector.new(railPosition.x,y,railPosition.z))
meta:set_string("magnetizerPosition",minetest.serialize(pos))
end
local meta=minetest.get_meta(pos)
meta:set_string("railPosition",minetest.serialize(railPosition))
meta:set_int("lowY",lowY)
meta:set_int("highY",highY)
end
function industrialtest.Magnetizer.detachFenceRail(pos)
local meta=minetest.get_meta(pos)
if not meta:contains("railPosition") or not meta:contains("lowY") or not meta:contains("highY") then
return
end
local railPosition=minetest.deserialize(meta:get_string("railPosition"))
local lowY=meta:get_int("lowY")
local highY=meta:get_int("highY")
for y=lowY,highY,1 do
local fenceMeta=minetest.get_meta(vector.new(railPosition.x,y,railPosition.z))
fenceMeta:set_string("magnetizerPosition","")
end
meta:set_string("railPosition","")
end
industrialtest.Magnetizer:register()
minetest.register_craft({
type="shaped",
output="industrialtest:magnetizer",
recipe={
{industrialtest.elementKeys.powerCarrier,"industrialtest:iron_fence",industrialtest.elementKeys.powerCarrier},
{industrialtest.elementKeys.powerCarrier,"industrialtest:machine_block",industrialtest.elementKeys.powerCarrier},
{industrialtest.elementKeys.powerCarrier,"industrialtest:iron_fence",industrialtest.elementKeys.powerCarrier}
}
})
-- Players to which Y velocity should be added
local validatedPlayers={}
-- Time since last check to which players the effect should be applied
local validationDelta=0.2
minetest.register_globalstep(function(dtime)
validationDelta=validationDelta+dtime
if validationDelta>=0.2 then
validatedPlayers={}
local players=minetest.get_connected_players()
for _,player in ipairs(players) do
local control=player:get_player_control()
if (control.jump or control.sneak) and hasMetalBoots(player) then
local props=player:get_properties()
local pos=player:get_pos()
local offsets={
vector.new(props.collisionbox[1],0,0),
vector.new(props.collisionbox[4],0,0),
vector.new(0,0,props.collisionbox[3]),
vector.new(0,0,props.collisionbox[6])
}
for _,offset in ipairs(offsets) do
local targetPos=vector.add(pos,offset)
local targetNode=minetest.get_node(targetPos)
if minetest.get_item_group(targetNode.name,"_industrialtest_metalFence")>0 then
local fenceMeta=minetest.get_meta(targetPos)
if fenceMeta:contains("magnetizerPosition") then
table.insert(validatedPlayers,{
playerName=player:get_player_name(),
magnetizerPosition=minetest.deserialize(fenceMeta:get_string("magnetizerPosition")),
multiplier=(control.sneak and 0.55 or 1)
})
break
end
end
end
end
end
end
for _,validatedPlayer in ipairs(validatedPlayers) do
local player=minetest.get_player_by_name(validatedPlayer.playerName)
if player then
local magnetizerMeta=minetest.get_meta(validatedPlayer.magnetizerPosition)
local physicsOverride=player:get_physics_override()
local requiredPower=industrialtest.Magnetizer._opPower*physicsOverride.gravity
if magnetizerMeta:get_int("industrialtest.powerAmount")>=requiredPower then
industrialtest.api.addPower(magnetizerMeta,-requiredPower)
industrialtest.Magnetizer:requestPower(validatedPlayer.magnetizerPosition)
industrialtest.Magnetizer:updateFormspec(validatedPlayer.magnetizerPosition)
industrialtest.internal.addYVelocityClamped(player,30*dtime*physicsOverride.gravity*validatedPlayer.multiplier,5*physicsOverride.gravity)
end
end
end
end)

417
machines/miner.lua Normal file
View File

@@ -0,0 +1,417 @@
-- 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)
-- Keep last fluid node here so pump has more time to access it
meta:set_string("lastFluidNode","")
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.15;"..S("Drill").."]",
"list[context;drill;0.7,1.5;1,1]",
industrialtest.internal.getItemSlotBg(0.7,1.5,1,1),
"label[0.7,2.75;"..S("Pipe").."]",
"list[context;src;0.7,3.1;1,1]",
industrialtest.internal.getItemSlotBg(0.7,3.1,1,1),
"label[0.7,4.35;"..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)
-- Check if target node is fluid so pump, if attached, can get it
local targetNode=minetest.get_node(targetPos)
local targetFluid=industrialtest.api.getPumpFluid(targetNode.name)
if targetFluid then
meta:set_string("lastFluidNode",targetNode.name)
end
local drop=self.getNodeDrop(targetPos)
self.placeMiningPipe(pos,targetPos)
inv:add_item("dst",drop)
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
function industrialtest.Miner.pullFluid(self,pos,amount)
local meta=minetest.get_meta(pos)
local lastFluidNode=meta:get_string("lastFluidNode")
if lastFluidNode~="" then
local result={
fluidType=lastFluidNode
}
result.remaining=industrialtest.api.nodeFluidCapacity
-- If everything was pulled then change to empty
if amount>=industrialtest.api.nodeFluidCapacity then
meta:set_string("lastFluidNode","")
end
return result
end
return nil
end
industrialtest.Miner:register()
industrialtest.api.registerPumpTarget("industrialtest:miner","i")
minetest.register_craft({
type="shaped",
output="industrialtest:miner",
recipe={
{"",industrialtest.elementKeys.chest,""},
{"industrialtest:electronic_circuit","industrialtest:machine_block","industrialtest:electronic_circuit"},
{"","industrialtest:mining_pipe",""}
}
})

407
machines/pump.lua Normal file
View File

@@ -0,0 +1,407 @@
-- IndustrialTest
-- Copyright (C) 2025 mrkubax10
-- This program is free software: you can redistribute it and/or modify
-- it under the terms of the GNU General Public License as published by
-- the Free Software Foundation, either version 3 of the License, or
-- (at your option) any later version.
-- This program is distributed in the hope that it will be useful,
-- but WITHOUT ANY WARRANTY; without even the implied warranty of
-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-- GNU General Public License for more details.
-- You should have received a copy of the GNU General Public License
-- along with this program. If not, see <http://www.gnu.org/licenses/>.
local S=minetest.get_translator("industrialtest")
industrialtest.Pump=table.copy(industrialtest.ActivatedElectricMachine)
industrialtest.internal.unpackTableInto(industrialtest.Pump,{
name="industrialtest:pump",
description=S("Pump"),
tiles={
"industrialtest_machine_block.png",
"industrialtest_machine_block.png",
"industrialtest_machine_block.png^industrialtest_pump_side.png",
"industrialtest_machine_block.png",
"industrialtest_machine_block.png",
"industrialtest_machine_block.png^industrialtest_pump_front.png"
},
sounds="metal",
facedir=true,
storageLists={
"src",
"dst",
"powerStorage"
},
powerLists={
{
list="powerStorage",
direction="i"
}
},
active={
tiles={
"industrialtest_machine_block.png",
"industrialtest_machine_block.png",
"industrialtest_machine_block.png^industrialtest_pump_side.png",
"industrialtest_machine_block.png",
"industrialtest_machine_block.png",
"industrialtest_machine_block.png^industrialtest_pump_front_active.png"
}
},
capacity=industrialtest.api.lvPowerFlow*2,
flow=industrialtest.api.lvPowerFlow,
ioConfig="iiiiii",
requiresWrench=true,
hasPowerInput=true,
_fluidCapacity=5000,
_opPower=300,
_pumpTime=10
})
function industrialtest.Pump.onConstruct(self,pos)
local meta=minetest.get_meta(pos)
local inv=meta:get_inventory()
inv:set_size("src",1)
inv:set_size("dst",1)
inv:set_size("powerStorage",1)
meta:set_float("srcTime",0)
industrialtest.api.addFluidStorage(meta,self._fluidCapacity)
self.determinePumpTargets(pos)
industrialtest.ActivatedElectricMachine.onConstruct(self,pos)
end
function industrialtest.Pump.getFormspec(self,pos)
local parentFormspec=industrialtest.ActivatedElectricMachine.getFormspec(self,pos)
local meta=minetest.get_meta(pos)
local powerPercent=meta:get_int("industrialtest.powerAmount")/meta:get_int("industrialtest.powerCapacity")*100
local srcPercent=meta:get_float("srcTime")/self._pumpTime*100
local fluidType=meta:get_string("industrialtest.fluidType")
local fluidPercent=0
if meta:contains("industrialtest.fluidAmount") and meta:contains("industrialtest.fluidCapacity") then
fluidPercent=meta:get_int("industrialtest.fluidAmount")/meta:get_int("industrialtest.fluidCapacity")*100
end
local pumpFluid=industrialtest.api.getPumpFluid(fluidType)
local tile=(pumpFluid and pumpFluid.texture or "industrialtest_gui_fluid_bg.png")
local formspec={
"list[context;src;3.2,1.7;1,1]",
industrialtest.internal.getItemSlotBg(3.2,1.7,1,1),
"list[context;dst;4.6,1.7;1,1]",
industrialtest.internal.getItemSlotBg(4.6,1.7,1,1),
"list[context;powerStorage;3.9,3.7;1,1]",
industrialtest.internal.getItemSlotBg(3.9,3.7,1,1),
(powerPercent>0 and "image[3.9,2.7;1,1;industrialtest_gui_electricity_bg.png^[lowpart:"..powerPercent..":industrialtest_gui_electricity_fg.png]"
or "image[3.9,2.7;1,1;industrialtest_gui_electricity_bg.png]"),
(srcPercent>0 and "image[6.7,2.7;1,1;gui_furnace_arrow_bg.png^[lowpart:"..srcPercent..":gui_furnace_arrow_fg.png]"
or "image[6.7,2.7;1,1;gui_furnace_arrow_bg.png]"),
(fluidPercent>0 and "image[7.7,2.7;1,1;industrialtest_gui_fluid_bg.png^[lowpart:"..fluidPercent..":"..tile.."]" or "image[7.7,2.7;1,1;industrialtest_gui_fluid_bg.png]"),
"label[3.2,1.35;"..S("Input").."]",
"label[4.6,1.35;"..S("Output").."]",
"listring[context;src]",
"listring[context;dst]"
}
return parentFormspec..table.concat(formspec,"")
end
function industrialtest.Pump.allowMetadataInventoryMove(self,pos,fromList,fromIndex,toList,count)
if toList=="dst" then
return 0
end
return industrialtest.ActivatedElectricMachine.allowMetadataInventoryMove(self,pos,fromList,fromIndex,toList,count)
end
function industrialtest.Pump.allowMetadataInventoryPut(self,pos,listname,index,stack,player)
if listname=="dst" then
return 0
end
return industrialtest.ActivatedElectricMachine.allowMetadataInventoryPut(self,pos,listname,index,stack,player)
end
function industrialtest.Pump.allowMetadataInventoryTake(self,pos,listname,index,stack,player)
if listname=="src" then
local meta=minetest.get_meta(pos)
local inv=meta:get_inventory()
local srcSlot=inv:get_stack("src",1)
if stack:get_count()==srcSlot:get_count() and not meta:get_int("hasOutputTarget") then
meta:set_float("srcTime",0)
self:updateFormspec(pos)
end
end
return industrialtest.ActivatedElectricMachine.allowMetadataInventoryTake(self,pos,listname,index,stack,player)
end
function industrialtest.Pump.onMetadataInventoryMove(self,pos,fromList,fromIndex,toList,toIndex,count)
if fromList=="src" then
local meta=minetest.get_meta(pos)
local inv=meta:get_inventory()
local srcSlot=inv:get_stack("src",1)
if count==srcSlot:get_count() and not meta:get_int("hasOutputTarget") then
meta:set_float("srcTime",0)
self:updateFormspec(pos)
end
elseif toList=="src" then
self:triggerIfNeeded(pos)
end
industrialtest.ActivatedElectricMachine.onMetadataInventoryMove(self,pos,fromList,fromIndex,toList,toIndex,count)
end
function industrialtest.Pump.onMetadataInventoryPut(self,pos,listname,index,stack)
if listname=="src" then
self:triggerIfNeeded(pos)
end
industrialtest.ActivatedElectricMachine.onMetadataInventoryPut(self,pos,listname,index,stack)
end
function industrialtest.Miner.onMetadataInventoryTake(self,pos,listname,index,stack)
if listname=="dst" then
self:triggerIfNeeded(pos)
end
end
function industrialtest.Pump.shouldActivate(self,pos)
local meta=minetest.get_meta(pos)
if meta:get_int("industrialtest.powerAmount")<self._opPower then
return false
end
local hasInput=false
local nodeUnder=minetest.get_node(vector.offset(pos,0,-1,0))
local fluidAmount=meta:get_int("industrialtest.fluidAmount")
if fluidAmount>0 then
hasInput=true
else
-- Check if there is node that can be pumped under pump
if industrialtest.api.getPumpFluid(nodeUnder.name) then
hasInput=true
end
end
-- Check if any input target can provide with fluid
if not hasInput and meta:get_int("hasInputTarget")>0 then
local polledTargets=self.pollInputTargets(pos)
hasInput=#polledTargets>0
end
if not hasInput then
return false
end
local hasOutput=false
-- First check if pump can push into any neighour node
if meta:get_int("hasOutputTarget") then
local outputTargets=minetest.deserialize(meta:get_string("outputTargets"))
for _,target in ipairs(outputTargets) do
local node=minetest.get_node(target)
local def=minetest.registered_nodes[node.name]
hasOutput=(def and def._industrialtest_self and def._industrialtest_self:canPushFluid(target,nodeUnder.name,fluidAmount))
if hasOutput then
break
end
end
end
-- Check if it's possible to pump fluid into item
if not hasOutput then
local inv=meta:get_inventory()
local srcSlot=inv:get_stack("src",1)
if not srcSlot:is_empty() then
local def=srcSlot:get_definition()
if def.groups._industrialtest_simpleFluidStorage and def._industrialtest_simpleFluidStorageCapacity and fluidAmount>=def._industrialtest_simpleFluidStorageCapacity and
def._industrialtest_getResultingFluidStorageItemByNode then
local fluidType=meta:get_string("industrialtest.fluidType")
local resulting=def._industrialtest_getResultingFluidStorageItemByNode(fluidType)
if resulting then
local dstSlot=inv:get_stack("dst",1)
hasOutput=dstSlot:item_fits(ItemStack(resulting.name))
end
end
end
end
-- Check if pump storage is not full
if not hasOutput then
local fluidCapacity=meta:get_int("industrialtest.fluidCapacity")
hasOutput=fluidCapacity-fluidAmount>=industrialtest.api.nodeFluidCapacity
end
return hasOutput
end
function industrialtest.Pump.shouldDeactivate(self,pos)
return not self:shouldActivate(pos)
end
function industrialtest.Pump.afterDeactivation(self,pos)
-- If machine was deactivated then make sure to update formspec
local meta=minetest.get_meta(pos)
meta:set_float("srcTime",0)
self:updateFormspec(pos)
end
function industrialtest.Pump.activeUpdate(self,pos,elapsed,meta,inv)
local nodeUnderPos=vector.offset(pos,0,-1,0)
local nodeUnder=minetest.get_node(nodeUnderPos)
local fluidAmount=meta:get_int("industrialtest.fluidAmount")
local fluidCapacity=meta:get_int("industrialtest.fluidCapacity")
local shouldUpdateFormspec=false
-- First try to pump fluid under
-- Check if there is node that can be pumped under pump
if fluidCapacity-fluidAmount>=industrialtest.api.nodeFluidCapacity and industrialtest.api.getPumpFluid(nodeUnder.name) then
local srcTime=meta:get_float("srcTime")+elapsed*industrialtest.api.getMachineSpeed(meta)
if srcTime>=self._pumpTime then
fluidAmount=fluidAmount+industrialtest.api.nodeFluidCapacity
meta:set_string("industrialtest.fluidType",nodeUnder.name)
meta:set_int("industrialtest.fluidAmount",fluidAmount)
minetest.remove_node(nodeUnderPos)
srcTime=0
end
industrialtest.api.addPower(meta,-self._opPower)
meta:set_float("srcTime",srcTime)
shouldUpdateFormspec=true
end
if meta:get_int("hasInputTarget")>0 then
local polledTargets=self.pollInputTargets(pos)
local fluidType=meta:get_string("industrialtest.fluidType")
for _,target in ipairs(polledTargets) do
local moved=math.min(fluidCapacity-fluidAmount,target.fluidInfo.remaining)
fluidAmount=fluidAmount+moved
target.pullFluid(moved)
meta:set_string("industrialtest.fluidType",target.fluidInfo.fluidType)
shouldUpdateFormspec=true
if fluidCapacity-fluidAmount<=0 then
break
end
end
meta:set_int("industrialtest.fluidAmount",fluidAmount)
end
-- Try to push fluid into item if available
local inv=meta:get_inventory()
local srcSlot=inv:get_stack("src",1)
if not srcSlot:is_empty() then
local def=srcSlot:get_definition()
if def.groups._industrialtest_simpleFluidStorage and def._industrialtest_simpleFluidStorageCapacity and fluidAmount>=def._industrialtest_simpleFluidStorageCapacity and
def._industrialtest_getResultingFluidStorageItemByNode then
local fluidType=meta:get_string("industrialtest.fluidType")
local resulting=def._industrialtest_getResultingFluidStorageItemByNode(fluidType)
if resulting then
local dstSlot=inv:get_stack("dst",1)
local resultingStack=ItemStack(resulting.name)
if dstSlot:item_fits(resultingStack) then
dstSlot:add_item(resultingStack)
inv:set_stack("dst",1,dstSlot)
srcSlot:take_item()
inv:set_stack("src",1,srcSlot)
fluidAmount=fluidAmount-def._industrialtest_simpleFluidStorageCapacity
meta:set_int("industrialtest.fluidAmount",fluidAmount)
shouldUpdateFormspec=true
end
end
end
end
-- Try to push fluid into neighbour target
if meta:get_int("hasOutputTarget")>0 then
local outputTargets=minetest.deserialize(meta:get_string("outputTargets"))
for _,targetPos in ipairs(outputTargets) do
local targetNode=minetest.get_node(targetPos)
local targetDef=minetest.registered_nodes[targetNode.name]
local fluidType=meta:get_string("industrialtest.fluidType")
if targetDef and targetDef._industrialtest_self and targetDef._industrialtest_self.canPushFluid and
targetDef._industrialtest_self.onPumpFluidPush and targetDef._industrialtest_self:canPushFluid(targetPos,fluidType,fluidAmount) then
fluidAmount=targetDef._industrialtest_self:onPumpFluidPush(targetPos,pos,fluidType,fluidAmount)
end
end
meta:set_int("industrialtest.fluidAmount",fluidAmount)
end
return shouldUpdateFormspec
end
function industrialtest.Pump.action(self,pos)
self.determinePumpTargets(pos)
self:triggerIfNeeded(pos)
end
-- Scans neighbour positions for pump targets
function industrialtest.Pump.determinePumpTargets(pos)
local neighbourPositions={
vector.offset(pos,-1,0,0),
vector.offset(pos,1,0,0),
vector.offset(pos,0,-1,0),
vector.offset(pos,0,1,0),
vector.offset(pos,0,0,-1),
vector.offset(pos,0,0,1)
}
local inputTargets={}
local outputTargets={}
for _,neighbour in ipairs(neighbourPositions) do
local node=minetest.get_node(neighbour)
local targetDef=industrialtest.api.getPumpTarget(node.name)
if targetDef then
if targetDef.direction=="i" then
table.insert(inputTargets,neighbour)
elseif targetDef.direction=="o" then
table.insert(outputTargets,neighbour)
end
end
end
local meta=minetest.get_meta(pos)
meta:set_string("inputTargets",minetest.serialize(inputTargets))
meta:set_int("hasInputTarget",#inputTargets>0 and 1 or 0)
meta:set_string("outputTargets",minetest.serialize(outputTargets))
meta:set_int("hasOutputTarget",#outputTargets>0 and 1 or 0)
end
-- \brief Checks all input targets if they have any fluid incoming
-- \param pos vector
-- \returns table
function industrialtest.Pump.pollInputTargets(pos)
local meta=minetest.get_meta(pos)
local inputTargets=minetest.deserialize(meta:get_string("inputTargets"))
local fluidType=meta:get_string("industrialtest.fluidType")
local result={}
for _,targetPos in ipairs(inputTargets) do
local targetNode=minetest.get_node(targetPos)
local targetDef=minetest.registered_nodes[targetNode.name]
if targetDef and targetDef._industrialtest_self and targetDef._industrialtest_self.pullFluid then
local fluidInfo=targetDef._industrialtest_self:pullFluid(targetPos,0)
if fluidInfo and (fluidInfo.fluidType==fluidType or fluidType=="ignore") then
table.insert(result,{
pos=targetPos,
fluidInfo=fluidInfo,
pullFluid=function(amount)
return targetDef._industrialtest_self:pullFluid(targetPos,amount)
end
})
fluidType=fluidInfo.fluidType
end
end
end
return result
end
industrialtest.Pump:register()
minetest.register_abm({
label="Pump pumping",
nodenames={"industrialtest:pump"},
interval=industrialtest.config.updateDelay,
chance=1,
action=function(pos)
industrialtest.Pump:action(pos)
end
})
minetest.register_craft({
type="shaped",
output="industrialtest:pump",
recipe={
{"industrialtest:empty_cell","industrialtest:electronic_circuit","industrialtest:empty_cell"},
{"industrialtest:empty_cell","industrialtest:machine_block","industrialtest:empty_cell"},
{"industrialtest:mining_pipe",industrialtest.elementKeys.treetap,"industrialtest:mining_pipe"}
}
})

View File

@@ -14,6 +14,8 @@
-- You should have received a copy of the GNU General Public License -- You should have received a copy of the GNU General Public License
-- along with this program. If not, see <http://www.gnu.org/licenses/>. -- along with this program. If not, see <http://www.gnu.org/licenses/>.
local S=minetest.get_translator("industrialtest")
industrialtest.SimpleElectricItemProcessor=table.copy(industrialtest.ActivatedElectricMachine) industrialtest.SimpleElectricItemProcessor=table.copy(industrialtest.ActivatedElectricMachine)
industrialtest.internal.unpackTableInto(industrialtest.SimpleElectricItemProcessor,{ industrialtest.internal.unpackTableInto(industrialtest.SimpleElectricItemProcessor,{
facedir=true, facedir=true,
@@ -51,7 +53,9 @@ function industrialtest.SimpleElectricItemProcessor.getFormspec(self,pos)
local meta=minetest.get_meta(pos) local meta=minetest.get_meta(pos)
local powerPercent=meta:get_int("industrialtest.powerAmount")/meta:get_int("industrialtest.powerCapacity")*100 local powerPercent=meta:get_int("industrialtest.powerAmount")/meta:get_int("industrialtest.powerCapacity")*100
local srcPercent=meta:get_float("srcTime")/meta:get_float("maxSrcTime")*100 local srcPercent=meta:get_float("srcTime")/meta:get_float("maxSrcTime")*100
local recipeOverride=self.isRecipeOverride(meta)
local formspec={ local formspec={
(recipeOverride and "label[3.4,1.5;"..S("Recipe override: @1", minetest.registered_items[recipeOverride].description).."]" or ""),
"list[context;src;3.4,1.8;1,1]", "list[context;src;3.4,1.8;1,1]",
industrialtest.internal.getItemSlotBg(3.4,1.8,1,1), industrialtest.internal.getItemSlotBg(3.4,1.8,1,1),
(powerPercent>0 and "image[3.4,2.8;1,1;industrialtest_gui_electricity_bg.png^[lowpart:"..powerPercent..":industrialtest_gui_electricity_fg.png]" (powerPercent>0 and "image[3.4,2.8;1,1;industrialtest_gui_electricity_bg.png^[lowpart:"..powerPercent..":industrialtest_gui_electricity_fg.png]"
@@ -107,8 +111,8 @@ function industrialtest.SimpleElectricItemProcessor.onMetadataInventoryMove(self
end end
end end
function industrialtest.SimpleElectricItemProcessor.onMetadataInventoryPut(self,pos) function industrialtest.SimpleElectricItemProcessor.onMetadataInventoryPut(self,pos,listname,index,stack)
industrialtest.ActivatedElectricMachine.onMetadataInventoryPut(self,pos) industrialtest.ActivatedElectricMachine.onMetadataInventoryPut(self,pos,listname,index,stack)
self:triggerIfNeeded(pos) self:triggerIfNeeded(pos)
end end
@@ -151,7 +155,8 @@ function industrialtest.SimpleElectricItemProcessor.shouldActivate(self,pos)
local output=self:getCraftResult(srcSlot) local output=self:getCraftResult(srcSlot)
return output and output.time>0 and inv:room_for_item("dst",output.item) return output and output.time>0 and inv:room_for_item("dst",output.item)
end end
return false
return meta:contains("recipeOverride") and meta:contains("recipeOverrideMaxTime") and meta:get_string("recipeOverride")~=""
end end
function industrialtest.SimpleElectricItemProcessor.shouldDeactivate(self,pos) function industrialtest.SimpleElectricItemProcessor.shouldDeactivate(self,pos)
@@ -164,6 +169,10 @@ function industrialtest.SimpleElectricItemProcessor.shouldDeactivate(self,pos)
return true return true
end end
if meta:contains("recipeOverride") and meta:contains("recipeOverrideMaxTime") and meta:get_string("recipeOverride")~="" then
return false
end
local srcSlot=inv:get_stack("src",1) local srcSlot=inv:get_stack("src",1)
if srcSlot:is_empty() then if srcSlot:is_empty() then
return true return true
@@ -179,11 +188,15 @@ function industrialtest.SimpleElectricItemProcessor.activeUpdate(self,pos,elapse
local srcTime=0 local srcTime=0
local maxSrcTime local maxSrcTime
if meta:get_float("maxSrcTime")<=0 then if meta:get_float("maxSrcTime")<=0 then
local recipeOverride=self.isRecipeOverride(meta)
if recipeOverride then
maxSrcTime=meta:get_int("recipeOverrideMaxTime")
else
local output=self:getCraftResult(srcSlot) local output=self:getCraftResult(srcSlot)
maxSrcTime=output.time*self.efficiency maxSrcTime=output.time*self.efficiency
end
meta:set_float("srcTime",0) meta:set_float("srcTime",0)
meta:set_float("maxSrcTime",maxSrcTime) meta:set_float("maxSrcTime",maxSrcTime)
shouldUpdateFormspec=true
else else
srcTime=meta:get_float("srcTime") srcTime=meta:get_float("srcTime")
maxSrcTime=meta:get_float("maxSrcTime") maxSrcTime=meta:get_float("maxSrcTime")
@@ -196,6 +209,11 @@ function industrialtest.SimpleElectricItemProcessor.activeUpdate(self,pos,elapse
meta:set_int("srcTime",srcTime) meta:set_int("srcTime",srcTime)
if srcTime>=maxSrcTime then if srcTime>=maxSrcTime then
local recipeOverride=self.isRecipeOverride(meta)
if recipeOverride then
inv:add_item("dst",ItemStack(recipeOverride))
meta:set_string("recipeOverride","")
else
local output=self:getCraftResult(srcSlot) local output=self:getCraftResult(srcSlot)
local usedItems=srcSlot:get_count()-output.src:get_count() local usedItems=srcSlot:get_count()-output.src:get_count()
local multiplier=1 local multiplier=1
@@ -206,15 +224,23 @@ function industrialtest.SimpleElectricItemProcessor.activeUpdate(self,pos,elapse
output.item:set_count(output.item:get_count()*multiplier) output.item:set_count(output.item:get_count()*multiplier)
inv:add_item("dst",output.item) inv:add_item("dst",output.item)
end end
meta:set_float("srcTime",-1)
meta:set_float("maxSrcTime",0)
srcSlot:set_count(srcSlot:get_count()-multiplier*usedItems) srcSlot:set_count(srcSlot:get_count()-multiplier*usedItems)
inv:set_stack("src",1,srcSlot) inv:set_stack("src",1,srcSlot)
end end
meta:set_float("srcTime",-1)
meta:set_float("maxSrcTime",0)
end
return true return true
end end
function industrialtest.SimpleElectricItemProcessor.isRecipeOverride(meta)
if meta:contains("recipeOverride") and meta:contains("recipeOverrideMaxTime") and meta:get_string("recipeOverride")~="" then
return meta:get_string("recipeOverride")
end
return false
end
function industrialtest.SimpleElectricItemProcessor.getCraftResult(self,itemstack) function industrialtest.SimpleElectricItemProcessor.getCraftResult(self,itemstack)
-- Dummy method -- Dummy method
end end

View File

@@ -29,7 +29,8 @@ industrialtest.internal.unpackTableInto(industrialtest.SolarPanelBase,{
} }
}, },
hasPowerOutput=true, hasPowerOutput=true,
ioConfig="oooooo" ioConfig="oooooo",
multiplier=1
}) })
local solarPanels={} local solarPanels={}
@@ -66,7 +67,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))>0 then if industrialtest.api.addPower(meta,math.ceil(amount*self.flow*self.multiplier))>0 then
self:updateFormspec(pos) self:updateFormspec(pos)
end end
self:trigger(pos) self:trigger(pos)
@@ -118,7 +119,8 @@ 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*2 flow=industrialtest.api.lvPowerFlow,
multiplier=1.5
}) })
industrialtest.LVSolarArray:register() industrialtest.LVSolarArray:register()
@@ -193,7 +195,7 @@ minetest.register_craft({
minetest.register_abm({ minetest.register_abm({
name="Solar panel updating", name="Solar panel updating",
nodenames=solarPanels, nodenames=solarPanels,
interval=industrialtest.updateDelay, interval=industrialtest.config.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

@@ -76,13 +76,14 @@ function industrialtest.WindMill.action(self,pos)
local dimMax=31000 local dimMax=31000
local dim=mcl_worlds.pos_to_dimension(pos) local dim=mcl_worlds.pos_to_dimension(pos)
if dim=="overworld" then if dim=="overworld" then
dimMax=mcl_vars.mg_overworld_max dimMax=mcl_vars.mg_overworld_max_official
elseif dim=="nether" then elseif dim=="nether" then
dimMax=mcl_vars.mg_nether_max dimMax=mcl_vars.mg_nether_max
elseif dim=="end" then elseif dim=="end" then
dimMax=mcl_vars.mg_end_max dimMax=mcl_vars.mg_end_max_official
end end
charging=math.max(mcl_worlds.layer_to_y(pos.y,dim),0)/dimMax local layer,_=mcl_worlds.y_to_layer(pos.y)
charging=math.min(math.max((layer or 0),0)/dimMax,1.0)
end end
local neighbourPositions={ local neighbourPositions={
vector.offset(pos,-1,0,0), vector.offset(pos,-1,0,0),
@@ -122,7 +123,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.updateDelay, interval=industrialtest.config.updateDelay,
chance=1, chance=1,
action=function(pos) action=function(pos)
industrialtest.WindMill:action(pos) industrialtest.WindMill:action(pos)

168
nodes.lua
View File

@@ -354,6 +354,19 @@ 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"},
@@ -379,23 +392,6 @@ 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
@@ -493,3 +489,141 @@ minetest.register_craft({
{industrialtest.elementKeys.glass,"industrialtest:advanced_alloy",industrialtest.elementKeys.glass} {industrialtest.elementKeys.glass,"industrialtest:advanced_alloy",industrialtest.elementKeys.glass}
} }
}) })
-- \brief Function which should be called after iron fence was constructed
-- \param pos vector
-- \returns nil
local function ironFenceOnConstruct(pos)
local neighbours={
vector.offset(pos,0,-1,0),
vector.offset(pos,0,1,0)
}
for _,neighbourPosition in ipairs(neighbours) do
local meta=minetest.get_meta(neighbourPosition)
if meta:contains("magnetizerPosition") then
local magnetizerPosition=minetest.deserialize(meta:get_string("magnetizerPosition"))
industrialtest.Magnetizer:determineFenceRail(magnetizerPosition)
industrialtest.Magnetizer:determinePowerCapacity(magnetizerPosition)
industrialtest.Magnetizer:updateFormspec(magnetizerPosition)
industrialtest.Magnetizer:requestPower(magnetizerPosition)
break
end
end
neighbours={
vector.offset(pos,1,0,0),
vector.offset(pos,-1,0,0),
vector.offset(pos,0,0,1),
vector.offset(pos,0,0,-1)
}
for _,neighbourPosition in ipairs(neighbours) do
local neighbourNode=minetest.get_node(neighbourPosition)
if neighbourNode.name=="industrialtest:magnetizer" then
local meta=minetest.get_meta(neighbourPosition)
if not meta:contains("railPosition") then
industrialtest.Magnetizer:determineFenceRail(neighbourPosition)
industrialtest.Magnetizer:determinePowerCapacity(neighbourPosition)
industrialtest.Magnetizer:updateFormspec(neighbourPosition)
industrialtest.Magnetizer:requestPower(neighbourPosition)
break
end
end
end
end
-- \brief Function which should be called before iron fence was removed
-- \param pos vector
-- \returns nil
local function ironFenceOnDestruct(pos)
local meta=minetest.get_meta(pos)
if not meta:contains("magnetizerPosition") then
return
end
local magnetizerPosition=minetest.deserialize(meta:get_string("magnetizerPosition"))
industrialtest.Magnetizer.detachFenceRail(magnetizerPosition)
end
-- \brief Function which should be called after iron fence was removed
-- \param meta table
-- \returns nil
local function ironFenceDetach(meta)
if not meta or not meta.fields or not meta.fields.magnetizerPosition then
return
end
local magnetizerPosition=minetest.deserialize(meta.fields.magnetizerPosition)
industrialtest.Magnetizer:determineFenceRail(magnetizerPosition)
industrialtest.Magnetizer:determinePowerCapacity(magnetizerPosition)
industrialtest.Magnetizer:updateFormspec(magnetizerPosition)
end
if industrialtest.mtgAvailable then
local inventoryImage="default_fence_overlay.png^default_steel_block.png^default_fence_overlay.png^[makealpha:255,126,126"
default.register_fence("industrialtest:iron_fence",{
description=S("Iron Fence"),
texture="default_steel_block.png",
inventory_image=inventoryImage,
wield_image=inventoryImage,
groups={
cracky=1,
level=2,
_industrialtest_metalFence=1
},
sounds=default.node_sound_metal_defaults(),
connects_to={
"group:fence",
"group:wood",
"group:tree",
"group:wall",
"industrialtest:magnetizer"
},
on_construct=ironFenceOnConstruct,
on_destruct=ironFenceOnDestruct,
after_dig_node=function(pos,oldnode,oldmeta)
ironFenceDetach(oldmeta)
end
})
minetest.register_craft({
type="shaped",
output="industrialtest:iron_fence 4",
recipe={
{"industrialtest:iron_plate","industrialtest:iron_plate","industrialtest:iron_plate"},
{"industrialtest:iron_plate","industrialtest:iron_plate","industrialtest:iron_plate"}
}
})
elseif industrialtest.mclAvailable then
-- Some MCL2 forks define this function so use it if available
if mcl_fences.register_fence_def then
mcl_fences.register_fence_def("iron_fence",{
description=S("Iron Fence"),
tiles={"default_steel_block.png"},
groups={
_industrialtest_metalFence=1
},
connects_to={
"group:fence",
"group:fence_gate",
"group:solid",
"industrialtest:magnetizer"
},
on_construct=ironFenceOnConstruct,
on_destruct=ironFenceOnDestruct,
after_destruct=function(pos,oldnode,oldmeta)
ironFenceDetach(oldmeta)
end
})
else
mcl_fences.register_fence("iron_fence",S("Iron Fence"),"default_steel_block.png",{_industrialtest_metalFence=1},4,5,{"industrialtest:magnetizer","group:fence"},mcl_sounds.node_sound_metal_defaults())
end
if minetest.registered_nodes["mcl_fences:iron_fence"] then
-- mcl_fences.register_fence_def registers fences in it's own namespace so register alias here to keep compatibility
minetest.register_alias("industrialtest:iron_fence","mcl_fences:iron_fence")
end
minetest.register_craft({
type="shaped",
output="industrialtest:iron_fence 3",
recipe={
{"industrialtest:iron_plate","industrialtest:iron_plate","industrialtest:iron_plate"},
{"industrialtest:iron_plate","industrialtest:iron_plate","industrialtest:iron_plate"}
}
})
end

8
settingtypes.txt Normal file
View File

@@ -0,0 +1,8 @@
# 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

Binary file not shown.

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 or Migdyn and is licensed with CC BY 4.0 International ... rest was made either by LuanHawk, mrkubax10, HandfulOfFrogs or Migdyn and is licensed with CC BY 4.0 International

View File

Before

Width:  |  Height:  |  Size: 10 KiB

After

Width:  |  Height:  |  Size: 10 KiB

View File

Before

Width:  |  Height:  |  Size: 302 B

After

Width:  |  Height:  |  Size: 302 B

View File

Before

Width:  |  Height:  |  Size: 9.2 KiB

After

Width:  |  Height:  |  Size: 9.2 KiB

View File

Before

Width:  |  Height:  |  Size: 686 B

After

Width:  |  Height:  |  Size: 686 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 226 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 295 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 321 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 183 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 236 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 216 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 215 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 220 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 221 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.5 KiB

After

Width:  |  Height:  |  Size: 6.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 663 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 686 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 692 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 704 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.2 KiB

View File

@@ -0,0 +1,160 @@
-- 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/>.
industrialtest.ActivatedElectricTool=table.copy(industrialtest.ElectricTool)
function industrialtest.ActivatedElectricTool.createDefinitionTable(self)
local def=industrialtest.ElectricTool.createDefinitionTable(self)
def.groups._industrialtest_activatedElectricTool=1
def.tool_capabilities.full_punch_interval=self.fullPunchInterval
if self.digs then
self:defineToolCapabilities(def,nil,self.digSpeed)
end
if self.hits then
def.tool_capabilities.damage_groups={}
for _,hitType in ipairs(self.hits) do
def.tool_capabilities.damage_groups[hitType]=1
end
end
return def
end
function industrialtest.ActivatedElectricTool.createActiveDefinitionTable(self)
local def=self:createDefinitionTable()
if self.digs or self.hits then
self:defineToolCapabilities(def,self.active.times,self.active.digSpeed)
end
def.groups.not_in_creative_inventory=1
def.after_use=function(itemstack,user,node,digparams)
if self:afterUse(itemstack,user,node,digparams) then
return itemstack
end
return nil
end
return def
end
function industrialtest.ActivatedElectricTool.register(self)
industrialtest.ElectricTool.register(self)
local def=self:createActiveDefinitionTable()
minetest.register_tool(self.name.."_active",def)
end
function industrialtest.ActivatedElectricTool.beforeUse(self,itemstack,node)
local def=itemstack:get_definition()
if self:canActivate(itemstack,node) then
if not self.isActive(itemstack) then
itemstack:set_name(itemstack:get_name().."_active")
end
return true
else
itemstack:set_name(self.name)
end
return false
end
function industrialtest.ActivatedElectricTool.afterUse(self,itemstack,user,node,digparams)
local meta=itemstack:get_meta()
industrialtest.api.addPowerToItem(itemstack,-self:getOpPower(itemstack))
return true
end
function industrialtest.ActivatedElectricTool.canActivate(self,itemstack,node)
local meta=itemstack:get_meta()
return meta:get_int("industrialtest.powerAmount")>=self:getOpPower(itemstack)
end
function industrialtest.ActivatedElectricTool.isActive(itemstack)
return string.sub(itemstack:get_name(),-string.len("_active"),-1)=="_active"
end
function industrialtest.ActivatedElectricTool.defineToolCapabilities(self,def,times,digSpeed)
if industrialtest.mtgAvailable then
if self.digs then
def.tool_capabilities.groupcaps={}
for _,digType in ipairs(self.digs) do
def.tool_capabilities.groupcaps[digType]={
times=times,
maxlevel=self.digLevel+1
}
if digType=="choppy" then
def.groups.axe=1
elseif digType=="cracky" then
def.groups.pickaxe=1
elseif digType=="crumbly" then
def.groups.shovel=1
elseif digType=="hoey" then
def.groups.hoe=1
end
end
end
if self.hits then
for _,hitType in ipairs(self.hits) do
if hitType=="fleshy" then
def.groups.sword=1
end
end
end
elseif industrialtest.mclAvailable then
if self.digs then
local digTypeMapping={
choppy={"axey"},
cracky={"pickaxey"},
crumbly={"shovely"},
hoey={"hoey"},
snappy={"swordy","swordy_cobweb"}
}
def.groups.dig_speed_class=self.digSpeedClass
def._mcl_diggroups={}
for _,digType in ipairs(self.digs) do
for _,mappedDigType in ipairs(digTypeMapping[digType]) do
def._mcl_diggroups[mappedDigType]={
speed=digSpeed,
level=5-self.digLevel,
uses=-1
}
end
end
end
if self.hits then
for _,hitType in ipairs(self.hits) do
if hitType=="fleshy" then
def.groups.weapon=1
def.groups.sword=1
end
end
end
end
end
minetest.register_on_punchnode(function(pos,node,user)
if not user then
return
end
local itemstack=user:get_wielded_item()
local def=itemstack:get_definition()
if def and def._industrialtest_self and def.groups and def.groups._industrialtest_activatedElectricTool and
def._industrialtest_self:beforeUse(itemstack,node) then
user:set_wielded_item(itemstack)
end
end)

View File

@@ -15,72 +15,44 @@
-- 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")
industrialtest.BatPackBase=table.copy(industrialtest.ElectricGearTool)
industrialtest.internal.unpackTableInto(industrialtest.BatPackBase,{
part="torso"
})
local updateDelta=0 local updateDelta=0
function industrialtest.BatPackBase.update(self,player,inv,itemstack,dtime)
local function registerBatpack(config) updateDelta=updateDelta+dtime
if industrialtest.mtgAvailable then if updateDelta<industrialtest.config.updateDelay then
armor:register_armor("industrialtest:"..config.name,{
description=config.displayName,
inventory_image="industrialtest_"..config.name.."_inv.png",
groups={
armor_torso=1,
armor_heal=0,
_industrialtest_batpack=1
},
_industrialtest_powerStorage=true,
_industrialtest_powerCapacity=config.powerCapacity,
_industrialtest_powerFlow=config.powerFlow
})
elseif industrialtest.mclAvailable then
minetest.register_tool("industrialtest:"..config.name,{
description=config.displayName,
inventory_image="industrialtest_"..config.name.."_inv.png",
groups={
armor=1,
non_combat_armor=1,
armor_torso=1,
non_combat_torso=1,
_industrialtest_batpack=1
},
sounds={
_mcl_armor_equip="mcl_armor_equip_iron",
_mcl_armor_unequip="mcl_armor_unequip_iron"
},
on_place=mcl_armor.equip_on_use,
on_secondary_use=mcl_armor.equip_on_use,
_mcl_armor_element="torso",
_mcl_armor_texture="industrialtest_"..config.name..".png",
_industrialtest_powerStorage=true,
_industrialtest_powerCapacity=config.powerCapacity,
_industrialtest_powerFlow=config.powerFlow
})
end
end
local function onGlobalStep(player,inv,stack,index,def)
if not def.groups or not def.groups._industrialtest_batpack then
return false return false
end end
updateDelta=0
local wielded=player:get_wielded_item() local wielded=player:get_wielded_item()
local wieldedMeta=wielded:get_meta() local wieldedMeta=wielded:get_meta()
if not industrialtest.api.hasPowerStorage(wieldedMeta) or wieldedMeta:get_int("industrialtest.powerFlow")>def._industrialtest_powerFlow then if not industrialtest.api.hasPowerStorage(wieldedMeta) or wieldedMeta:get_int("industrialtest.powerFlow")>self.flow then
return true return false
end end
if industrialtest.api.transferPowerFromItem(stack,wieldedMeta,def._industrialtest_powerFlow)>0 then if industrialtest.api.transferPowerFromItem(itemstack,wieldedMeta,self.flow)>0 then
industrialtest.api.updateItemPowerText(wielded) industrialtest.api.updateItemPowerText(wielded)
player:set_wielded_item(wielded) player:set_wielded_item(wielded)
inv:set_stack("armor",index,stack)
end
return true return true
end
return false
end end
registerBatpack({ industrialtest.BatPack=table.copy(industrialtest.BatPackBase)
name="batpack_v", industrialtest.internal.unpackTableInto(industrialtest.BatPack,{
displayName=S("BatPack"), name="industrialtest:batpack_v",
powerCapacity=60000, description=S("BatPack"),
powerFlow=industrialtest.api.lvPowerFlow inventoryImage="industrialtest_batpack_v_inv.png",
modelImage="industrialtest_batpack_v.png",
capacity=60000,
flow=industrialtest.api.lvPowerFlow
}) })
industrialtest.BatPack:register()
minetest.register_craft({ minetest.register_craft({
type="shaped", type="shaped",
output="industrialtest:batpack_v", output="industrialtest:batpack_v",
@@ -91,48 +63,24 @@ minetest.register_craft({
} }
}) })
registerBatpack({ industrialtest.LapPack=table.copy(industrialtest.BatPackBase)
name="lappack_v", industrialtest.internal.unpackTableInto(industrialtest.LapPack,{
displayName=S("LapPack"), name="industrialtest:lappack_v",
powerCapacity=300000, description=S("LapPack"),
powerFlow=industrialtest.api.hvPowerFlow inventoryImage="industrialtest_lappack_v_inv.png",
modelImage="industrialtest_lappack_v.png",
capacity=300000,
flow=industrialtest.api.mvPowerFlow
}) })
industrialtest.LapPack:register()
minetest.register_craft({ minetest.register_craft({
type="shaped", type="shaped",
output="industrialtest:lappack_v", output="industrialtest:lappack_v",
recipe={ recipe={
{industrialtest.elementKeys.powerCarrier,"industrialtest:electronic_circuit",industrialtest.elementKeys.powerCarrier}, {industrialtest.elementKeys.powerCarrier,"industrialtest:advanced_electronic_circuit",industrialtest.elementKeys.powerCarrier},
{industrialtest.elementKeys.powerCarrier,"industrialtest:batpack_v",industrialtest.elementKeys.powerCarrier}, {industrialtest.elementKeys.powerCarrier,"industrialtest:batpack_v",industrialtest.elementKeys.powerCarrier},
{industrialtest.elementKeys.powerCarrier,"",industrialtest.elementKeys.powerCarrier} {industrialtest.elementKeys.powerCarrier,"",industrialtest.elementKeys.powerCarrier}
} }
}) })
minetest.register_globalstep(function(dtime)
updateDelta=updateDelta+dtime
if updateDelta<industrialtest.updateDelay then
return
end
updateDelta=0
local players=minetest.get_connected_players()
for _,player in ipairs(players) do
if industrialtest.mtgAvailable then
local _,inv=armor:get_valid_player(player,"")
if inv then
local armorList=inv:get_list("armor")
assert(armorList)
for i=1,#armorList do
local stack=armorList[i]
local def=stack:get_definition()
if onGlobalStep(player,inv,stack,i,def) then
break
end
end
end
elseif industrialtest.mclAvailable then
local inv=player:get_inventory()
local stack=inv:get_stack("armor",3)
local def=stack:get_definition()
onGlobalStep(player,inv,stack,3,def)
end
end
end)

View File

@@ -19,23 +19,6 @@ industrialtest.internal.registeredElectricDrills={}
industrialtest.internal.registeredElectricHoes={} industrialtest.internal.registeredElectricHoes={}
industrialtest.internal.registeredElectricSabers={} industrialtest.internal.registeredElectricSabers={}
local function isActive(itemstack)
return string.sub(itemstack:get_name(),-string.len("_active"),-1)=="_active"
end
local function beforeUse(user,itemstack,canDig)
local meta=itemstack:get_meta()
local def=itemstack:get_definition()
if meta:get_int("industrialtest.powerAmount")>=20 and canDig then
if not isActive(itemstack) then
itemstack:set_name(itemstack:get_name().."_active")
end
else
itemstack:set_name(def._industrialtest_inactiveName)
end
user:set_wielded_item(itemstack)
end
minetest.register_on_punchnode(function(pos,node,user,pointed) minetest.register_on_punchnode(function(pos,node,user,pointed)
if not user then if not user then
return return

115
tools/electric_armor.lua Normal file
View File

@@ -0,0 +1,115 @@
-- 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/>.
industrialtest.ElectricArmor={
prepare=industrialtest.ElectricItem.prepare
}
function industrialtest.ElectricArmor.createDefinitionTableForElement(self,element)
local def={
description=element.description,
inventory_image=element.inventoryImage,
groups={
_industrialtest_electricArmor=1,
["armor_"..element.element]=1
},
_industrialtest_self=self
}
if industrialtest.mclAvailable then
def.groups.armor=1
def.groups.non_combat_armor=1
def.sounds={
_mcl_armor_equip="mcl_armor_equip_iron",
_mcl_armor_unequip="mcl_armor_unequip_iron"
}
def.on_place=mcl_armor.armor_on_use
def.on_secondary_use=mcl_armor.armor_on_use
def._mcl_armor_element=element.element
if type(element.texture)=="string" then
def._mcl_armor_texture=element.texture
else
def._mcl_armor_texture=element.texture[2] or element.texture[1]
end
end
return def
end
function industrialtest.ElectricArmor.register(self)
for _,element in ipairs(self.elements) do
local def=self:createDefinitionTableForElement(element)
local name=self.name.."_"..element.name
if industrialtest.mtgAvailable then
armor:register_armor(name,def)
elseif industrialtest.mclAvailable then
minetest.register_tool(name,def)
end
end
end
function industrialtest.ElectricArmor.tryReduceDamage(self,itemstack,hpChange)
local meta=itemstack:get_meta()
local targetReducedDamage=math.floor(math.abs(hpChange)*self:getReducedDamageForItem(itemstack))
local powerPerDamage=self:getPowerPerDamageForItem(itemstack)
local requiredPower=targetReducedDamage*powerPerDamage
local availablePower=math.min(meta:get_int("industrialtest.powerAmount"),requiredPower)
return math.floor(availablePower/powerPerDamage)
end
function industrialtest.ElectricArmor.getReducedDamageForItem(self,itemstack)
-- dummy function
return 0
end
function industrialtest.ElectricArmor.getPowerPerDamageForItem(self,itemstack)
-- dummy function
return 0
end
minetest.register_on_player_hpchange(function(player,hpChange)
if hpChange>0 or not player:is_player() then
return hpChange
end
local inv
if industrialtest.mtgAvailable then
_,inv=armor:get_valid_player(player,"")
if not inv then
return hpChange
end
elseif industrialtest.mclAvailable then
inv=player:get_inventory()
end
local armorList=inv:get_list("armor")
assert(armorList)
local result=hpChange
for i=1,#armorList do
local itemstack=armorList[i]
local def=itemstack:get_definition()
if def.groups and def.groups._industrialtest_electricArmor and def._industrialtest_self then
local reducedDamage=def._industrialtest_self:tryReduceDamage(itemstack,hpChange)
if reducedDamage>0 then
result=result+reducedDamage
industrialtest.api.addPowerToItem(itemstack,-reducedDamage*def._industrialtest_self:getPowerPerDamageForItem(itemstack))
inv:set_stack("armor",i,itemstack)
end
end
end
return result
end,true)

View File

@@ -15,107 +15,42 @@
-- 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")
industrialtest.ElectricChainsawBase=table.copy(industrialtest.ActivatedElectricTool)
industrialtest.internal.unpackTableInto(industrialtest.ElectricChainsawBase,{
digs={"choppy"}
})
local electricChainsaw={} function industrialtest.ElectricChainsawBase.use(self,itemstack,user,pointed)
if not industrialtest.mclAvailable then
electricChainsaw.afterUse=function(itemstack,config) return false
local meta=itemstack:get_meta()
industrialtest.api.addPowerToItem(itemstack,-20)
if meta:get_int("industrialtest.powerAmount")<20 then
itemstack:set_name("industrialtest:"..config.name)
end end
return itemstack
end
local function registerElectricChainsaw(config)
local definition={
description=config.displayName,
inventory_image="industrialtest_"..config.name..".png",
after_use=function(itemstack)
-- Hack to make sure that chainsaw won't be destroyed when has 0 EU
return nil
end,
_industrialtest_powerStorage=true,
_industrialtest_powerCapacity=10000,
_industrialtest_powerFlow=industrialtest.api.lvPowerFlow,
_industrialtest_inactiveName="industrialtest:"..config.name
}
if industrialtest.mtgAvailable then
definition.tool_capabilities={
full_punch_interval=0.5,
max_drop_level=config.maxDropLevel,
groupcaps={
choppy={
times=config.inactiveTimes,
maxlevel=config.maxLevel
}
}
}
definition.groups={
axe=1
}
elseif industrialtest.mclAvailable then
definition.tool_capabilities={
full_punch_interval=0.5,
max_drop_level=config.maxDropLevel,
}
definition.groups={
tool=1,
dig_speed_class=config.digSpeedClass,
}
definition.on_place=function(itemstack,user,pointed)
local meta=itemstack:get_meta() local meta=itemstack:get_meta()
if meta:get_int("industrialtest.powerAmount")>=20 then
local itemstackCopy=itemstack local itemstackCopy=itemstack
if itemstack:get_wear()~=industrialtest.internal.mclMakeStrippedTrunk(itemstackCopy,user,pointed,true):get_wear() then return itemstack:get_wear()~=industrialtest.internal.mclMakeStrippedTrunk(itemstackCopy,user,pointed,true):get_wear()
industrialtest.api.addPowerToItem(itemstack,-20)
return itemstack
end
end
return nil
end
definition._mcl_diggroups={
axey={
speed=config.inactiveDigSpeed,
level=config.digLevel,
uses=-1
}
}
definition._mcl_toollike_wield=true
end
minetest.register_tool("industrialtest:"..config.name,definition)
definition=table.copy(definition)
if industrialtest.mtgAvailable then
definition.tool_capabilities.groupcaps.choppy.times=config.activeTimes
elseif industrialtest.mclAvailable then
definition._mcl_diggroups.axey.speed=config.activeDigSpeed
end
definition.groups.not_in_creative_inventory=1
definition.on_use=nil
definition.after_use=function(itemstack)
return electricChainsaw.afterUse(itemstack,config)
end
minetest.register_tool("industrialtest:"..config.name.."_active",definition)
industrialtest.internal.registeredElectricChainsaws["industrialtest:"..config.name]=true
industrialtest.internal.registeredElectricChainsaws["industrialtest:"..config.name.."_active"]=true
end end
local definition={
name="electric_chainsaw", function industrialtest.ElectricChainsawBase.getOpPower(self,itemstack)
displayName=S("Electric Chainsaw") return 50
}
if industrialtest.mtgAvailable then
definition.maxDropLevel=1
definition.inactiveTimes={[1]=10,[2]=5.6,[3]=4}
definition.maxLevel=2
definition.activeTimes={[1]=2.2,[2]=1.1,[3]=0.7}
elseif industrialtest.mclAvailable then
definition.digSpeedClass=4
definition.maxDropLevel=4
definition.inactiveDigSpeed=1
definition.digLevel=4
definition.activeDigSpeed=7
end end
registerElectricChainsaw(definition)
industrialtest.ElectricChainsaw=table.copy(industrialtest.ElectricChainsawBase)
industrialtest.internal.unpackTableInto(industrialtest.ElectricChainsaw,{
name="industrialtest:electric_chainsaw",
description=S("Electric Chainsaw"),
inventoryImage="industrialtest_electric_chainsaw.png",
capacity=10000,
flow=industrialtest.api.lvPowerFlow,
digLevel=0,
digSpeedClass=4,
digSpeed=1,
active={
times={[1]=1.7,[2]=1.2,[3]=1.0,[4]=0.7},
digSpeed=7
}
})
industrialtest.ElectricChainsaw:register()
minetest.register_craft({ minetest.register_craft({
type="shaped", type="shaped",
output="industrialtest:electric_chainsaw", output="industrialtest:electric_chainsaw",
@@ -125,26 +60,28 @@ minetest.register_craft({
{"industrialtest:re_battery","industrialtest:refined_iron_ingot",""} {"industrialtest:re_battery","industrialtest:refined_iron_ingot",""}
} }
}) })
definition={
name="diamond_electric_chainsaw", industrialtest.AdvancedElectricChainsaw=table.copy(industrialtest.ElectricChainsawBase)
displayName=S("Diamond Electric Chainsaw") industrialtest.internal.unpackTableInto(industrialtest.AdvancedElectricChainsaw,{
} name="industrialtest:advanced_electric_chainsaw",
if industrialtest.mtgAvailable then description=S("Advanced Electric Chainsaw"),
definition.maxDropLevel=1 inventoryImage="industrialtest_advanced_electric_chainsaw.png",
definition.inactiveTimes={[1]=10,[2]=5.6,[3]=4} capacity=10000,
definition.maxLevel=3 flow=industrialtest.api.lvPowerFlow,
definition.activeTimes={[1]=2.0,[2]=0.8,[3]=0.4} digLevel=0,
elseif industrialtest.mclAvailable then digSpeedClass=5,
definition.digSpeedClass=5 digSpeed=1,
definition.maxDropLevel=5 active={
definition.inactiveDigSpeed=1 times={[1]=1.0,[2]=0.7,[3]=0.5,[4]=0.2},
definition.digLevel=5 digSpeed=8
definition.activeDigSpeed=9 }
end })
registerElectricChainsaw(definition)
industrialtest.AdvancedElectricChainsaw:register()
minetest.register_craft({ minetest.register_craft({
type="shaped", type="shaped",
output="industrialtest:diamond_electric_chainsaw", output="industrialtest:advanced_electric_chainsaw",
recipe={ recipe={
{"",industrialtest.elementKeys.diamond,""}, {"",industrialtest.elementKeys.diamond,""},
{industrialtest.elementKeys.diamond,"industrialtest:electric_chainsaw",industrialtest.elementKeys.diamond} {industrialtest.elementKeys.diamond,"industrialtest:electric_chainsaw",industrialtest.elementKeys.diamond}

View File

@@ -15,107 +15,41 @@
-- 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")
industrialtest.ElectricDrillBase=table.copy(industrialtest.ActivatedElectricTool)
industrialtest.internal.unpackTableInto(industrialtest.ElectricDrillBase,{
digs={
"cracky",
"crumbly"
}
})
local electricDrill={} function industrialtest.ElectricDrillBase.createDefinitionTable(self)
local def=industrialtest.ActivatedElectricTool.createDefinitionTable(self)
electricDrill.afterUse=function(itemstack,config) def.groups._industrialtest_miningDrill=1
local meta=itemstack:get_meta() return def
industrialtest.api.addPowerToItem(itemstack,-20)
if meta:get_int("industrialtest.powerAmount")<20 then
itemstack:set_name("industrialtest:"..config.name)
end
return itemstack
end end
local function registerElectricDrill(config) function industrialtest.ElectricDrillBase.getOpPower(self,itemstack)
local definition={ return 50
description=config.displayName,
inventory_image="industrialtest_"..config.name..".png",
after_use=function()
-- Hack to make sure that drill won't be destroyed when has 0 EU
return nil
end,
_industrialtest_powerStorage=true,
_industrialtest_powerCapacity=10000,
_industrialtest_powerFlow=industrialtest.api.lvPowerFlow,
_industrialtest_inactiveName="industrialtest:"..config.name
}
if industrialtest.mtgAvailable then
definition.tool_capabilities={
full_punch_interval=0.5,
max_drop_level=config.maxDropLevel,
groupcaps={
cracky={
times=config.inactiveTimes,
maxlevel=config.maxLevel
},
crumbly={
times=config.inactiveTimes,
maxlevel=config.maxLevel
}
}
}
definition.groups={
pickaxe=1,
shovel=1
}
elseif industrialtest.mclAvailable then
definition.tool_capabilities={
full_punch_interval=0.5,
max_drop_level=config.maxDropLevel
}
definition.groups={
tool=1,
dig_speed_class=config.digSpeedClass
}
definition._mcl_diggroups={
pickaxey={
speed=config.inactiveDigSpeed,
level=config.digLevel,
uses=-1
},
shovely={
speed=config.inactiveDigSpeed,
level=config.digLevel,
uses=-1
}
}
definition._mcl_toollike_wield=true
end
minetest.register_tool("industrialtest:"..config.name,definition)
definition=table.copy(definition)
if industrialtest.mtgAvailable then
definition.tool_capabilities.groupcaps.cracky.times=config.activeTimes
definition.tool_capabilities.groupcaps.crumbly.times=config.activeTimes
elseif industrialtest.mclAvailable then
definition._mcl_diggroups.pickaxey.speed=config.activeDigSpeed
definition._mcl_diggroups.shovely.speed=config.activeDigSpeed
end
definition.groups.not_in_creative_inventory=1
definition.after_use=function(itemstack)
return electricDrill.afterUse(itemstack,config)
end
minetest.register_tool("industrialtest:"..config.name.."_active",definition)
industrialtest.internal.registeredElectricDrills["industrialtest:"..config.name]=true
industrialtest.internal.registeredElectricDrills["industrialtest:"..config.name.."_active"]=true
end end
local definition={
name="electric_drill", industrialtest.ElectricDrill=table.copy(industrialtest.ElectricDrillBase)
displayName=S("Electric Drill") industrialtest.internal.unpackTableInto(industrialtest.ElectricDrill,{
} name="industrialtest:electric_drill",
if industrialtest.mtgAvailable then description=S("Electric Drill"),
definition.maxDropLevel=1 inventoryImage="industrialtest_electric_drill.png",
definition.inactiveTimes={[1]=10,[2]=5.6,[3]=4} capacity=30000,
definition.maxLevel=2 flow=industrialtest.api.lvPowerFlow,
definition.activeTimes={[1]=2.0,[2]=0.8,[3]=0.4} digLevel=1,
elseif industrialtest.mclAvailable then digSpeedClass=4,
definition.digSpeedClass=4 active={
definition.maxDropLevel=4 times={[1]=1.7,[2]=1.2,[3]=1.0,[4]=0.7},
definition.inactiveDigSpeed=1 digSpeed=4
definition.digLevel=4 }
definition.activeDigSpeed=7 })
end
registerElectricDrill(definition) industrialtest.ElectricDrill:register()
minetest.register_craft({ minetest.register_craft({
type="shaped", type="shaped",
output="industrialtest:electric_drill", output="industrialtest:electric_drill",
@@ -125,26 +59,27 @@ minetest.register_craft({
{"industrialtest:refined_iron_ingot","industrialtest:re_battery","industrialtest:refined_iron_ingot"} {"industrialtest:refined_iron_ingot","industrialtest:re_battery","industrialtest:refined_iron_ingot"}
} }
}) })
definition={
name="diamond_electric_drill", industrialtest.AdvancedElectricDrill=table.copy(industrialtest.ElectricDrillBase)
displayName=S("Diamond Electric Drill") industrialtest.internal.unpackTableInto(industrialtest.AdvancedElectricDrill,{
} name="industrialtest:advanced_electric_drill",
if industrialtest.mtgAvailable then description=S("Advanced Electric Drill"),
definition.maxDropLevel=1 inventoryImage="industrialtest_advanced_electric_drill.png",
definition.inactiveTimes={[1]=10,[2]=5.6,[3]=4} capacity=30000,
definition.maxLevel=3 flow=industrialtest.api.lvPowerFlow,
definition.activeTimes={[1]=2.0,[2]=0.8,[3]=0.4} digLevel=0,
elseif industrialtest.mclAvailable then digSpeedClass=5,
definition.digSpeedClass=5 active={
definition.maxDropLevel=5 times={[1]=1.0,[2]=0.7,[3]=0.3,[4]=0.1},
definition.inactiveDigSpeed=1 digSpeed=7
definition.digLevel=5 }
definition.activeDigSpeed=9 })
end
registerElectricDrill(definition) industrialtest.AdvancedElectricDrill:register()
minetest.register_craft({ minetest.register_craft({
type="shaped", type="shaped",
output="industrialtest:diamond_electric_drill", output="industrialtest:advanced_electric_drill",
recipe={ recipe={
{"",industrialtest.elementKeys.diamond,""}, {"",industrialtest.elementKeys.diamond,""},
{industrialtest.elementKeys.diamond,"industrialtest:electric_drill",industrialtest.elementKeys.diamond} {industrialtest.elementKeys.diamond,"industrialtest:electric_drill",industrialtest.elementKeys.diamond}

View File

@@ -0,0 +1,20 @@
-- 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/>.
industrialtest.ElectricGearTool=table.copy(industrialtest.GearTool)
industrialtest.internal.unpackTableInto(industrialtest.ElectricGearTool,{
prepare=industrialtest.ElectricItem.prepare
})

View File

@@ -15,30 +15,25 @@
-- 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")
industrialtest.ElectricHoeBase=table.copy(industrialtest.ActivatedElectricTool)
industrialtest.internal.unpackTableInto(industrialtest.ElectricHoeBase,{
digs={"hoey"},
capacity=10000,
flow=industrialtest.api.lvPowerFlow
})
local electricHoe={} function industrialtest.ElectricHoeBase.register(self)
if industrialtest.mtgAvailable then
electricHoe.afterUse=function(itemstack,config) self.define.onUse=true
local meta=itemstack:get_meta() elseif industrialtest.mclAvailable then
industrialtest.api.addPowerToItem(itemstack,-20) self.define.onPlace=true
if meta:get_int("industrialtest.powerAmount")<20 then
itemstack:set_name("industrialtest:"..config.name)
end end
return itemstack
industrialtest.ActivatedElectricTool.register(self)
end end
local function registerElectricHoe(config) function industrialtest.ElectricHoeBase.hitUse(self,itemstack,user,pointed)
local definition={
description=config.displayName,
inventory_image="industrialtest_"..config.name..".png",
_industrialtest_powerStorage=true,
_industrialtest_powerCapacity=10000,
_industrialtest_powerFlow=industrialtest.api.lvPowerFlow,
_industrialtest_inactiveName="industrialtest:"..config.name
}
if industrialtest.mtgAvailable then
-- Taken and adapted from farming mod from Minetest Game -- Taken and adapted from farming mod from Minetest Game
local function onUse(user,pointed)
local pt = pointed local pt = pointed
-- check if pointing at a node -- check if pointing at a node
if not pt then if not pt then
@@ -95,104 +90,60 @@ local function registerElectricHoe(config)
}, true) }, true)
return true return true
end end
definition.groups={
hoe=1 function industrialtest.ElectricHoeBase.use(self,itemstack,user,pointed)
} local node=minetest.get_node(pointed.under)
definition.on_use=function(itemstack,user,pointed) if user and not user:get_player_control().sneak then
local meta=itemstack:get_meta() if minetest.registered_nodes[node.name] and minetest.registered_nodes[node.name].on_rightclick then
if meta:get_int("industrialtest.powerAmount")>=20 and onUse(user,pointed) then minetest.registered_nodes[node.name].on_rightclick(pointed.under,node,user,itemstack)
industrialtest.api.addPowerToItem(itemstack,-20)
return itemstack
end
return nil
end
elseif industrialtest.mclAvailable then
-- Taken from https://git.minetest.land/MineClone2/MineClone2/src/branch/master/mods/ITEMS/mcl_farming/hoes.lua#L3
local function createSoil(pos)
if pos == nil then
return false return false
end end
local node = minetest.get_node(pos) end
if minetest.is_protected(pointed.under, user:get_player_name()) then
minetest.record_protection_violation(pointed.under,user:get_player_name())
return false
end
-- Taken and adapted from https://git.minetest.land/MineClone2/MineClone2/src/branch/master/mods/ITEMS/mcl_farming/hoes.lua#L3
local name = node.name local name = node.name
local above = minetest.get_node({x=pos.x, y=pos.y+1, z=pos.z}) local above = minetest.get_node({x=pointed.under.x, y=pointed.under.y+1, z=pointed.under.z})
if minetest.get_item_group(name, "cultivatable") == 2 then if minetest.get_item_group(name, "cultivatable") == 2 then
if above.name == "air" then if above.name == "air" then
node.name = "mcl_farming:soil" node.name = "mcl_farming:soil"
minetest.set_node(pos, node) minetest.set_node(pointed.under, node)
minetest.sound_play("default_dig_crumbly", { pos = pos, gain = 0.5 }, true) minetest.sound_play("default_dig_crumbly", { pos = pointed.under, gain = 0.5 }, true)
return true return true
end end
elseif minetest.get_item_group(name, "cultivatable") == 1 then elseif minetest.get_item_group(name, "cultivatable") == 1 then
if above.name == "air" then if above.name == "air" then
node.name = "mcl_core:dirt" node.name = "mcl_core:dirt"
minetest.set_node(pos, node) minetest.set_node(pointed.under, node)
minetest.sound_play("default_dig_crumbly", { pos = pos, gain = 0.6 }, true) minetest.sound_play("default_dig_crumbly", { pos = pointed.under, gain = 0.6 }, true)
return true return true
end end
end end
return false return false
end
definition.tool_capabilities={
full_punch_interval=0.5
}
definition.groups={
tool=1
}
definition.on_place=function(itemstack,user,pointed)
local node=minetest.get_node(pointed.under)
if user and not user:get_player_control().sneak then
if minetest.registered_nodes[node.name] and minetest.registered_nodes[node.name].on_rightclick then
return minetest.registered_nodes[node.name].on_rightclick(pointed.under,node,user,itemstack) or itemstack
end
end
if minetest.is_protected(pointed.under, user:get_player_name()) then
minetest.record_protection_violation(pointed.under,user:get_player_name())
return nil
end
local meta=itemstack:get_meta()
if meta:get_int("industrialtest.powerAmount")>=20 and createSoil(pointed.under) then
industrialtest.api.addPowerToItem(itemstack,-20)
return itemstack
end
return nil
end
definition.after_use=function(itemstack)
-- Hack to make sure that chainsaw won't be destroyed when has 0 EU in MCL
return nil
end
definition._mcl_toollike_wield=true
definition._mcl_diggroups={
hoey={
speed=config.inactiveDigSpeed,
level=config.digLevel,
uses=-1
}
}
end
minetest.register_tool("industrialtest:"..config.name,definition)
if industrialtest.mclAvailable then
definition=table.copy(definition)
definition._mcl_diggroups.hoey.speed=config.activeDigSpeed
definition.groups.not_in_creative_inventory=1
definition.after_use=function(itemstack)
return electricHoe.afterUse(itemstack,config)
end
minetest.register_tool("industrialtest:"..config.name.."_active",definition)
industrialtest.internal.registeredElectricHoes["industrialtest:"..config.name.."_active"]=true
end
industrialtest.internal.registeredElectricHoes["industrialtest:"..config.name]=true
end end
local definition={
name="electric_hoe", function industrialtest.ElectricHoeBase.getOpPower(self,itemstack)
displayName=S("Electric Hoe") return 50
}
if industrialtest.mclAvailable then
definition.inactiveDigSpeed=1
definition.digLevel=2
definition.activeDigSpeed=7
end end
registerElectricHoe(definition)
industrialtest.ElectricHoe=table.copy(industrialtest.ElectricHoeBase)
industrialtest.internal.unpackTableInto(industrialtest.ElectricHoe,{
name="industrialtest:electric_hoe",
description=S("Electric Hoe"),
inventoryImage="industrialtest_electric_hoe.png",
digLevel=0,
digSpeedClass=4,
active={
digSpeed=3
}
})
industrialtest.ElectricHoe:register()
minetest.register_craft({ minetest.register_craft({
type="shaped", type="shaped",
output="industrialtest:electric_hoe", output="industrialtest:electric_hoe",
@@ -211,17 +162,25 @@ minetest.register_craft({
{"industrialtest:re_battery",""} {"industrialtest:re_battery",""}
} }
}) })
if industrialtest.mclAvailable then if industrialtest.mclAvailable then
registerElectricHoe({ industrialtest.AdvancedElectricHoe=table.copy(industrialtest.ElectricHoeBase)
name="diamond_electric_hoe", industrialtest.internal.unpackTableInto(industrialtest.AdvancedElectricHoe,{
displayName=S("Diamond Electric Hoe"), name="industrialtest:advanced_electric_hoe",
inactiveDigSpeed=1, description=S("Advanced Electric Hoe"),
digLevel=5, inventoryImage="industrialtest_advanced_electric_hoe.png",
activeDigSpeed=9 digLevel=0,
digSpeedClass=5,
active={
digSpeed=7
}
}) })
industrialtest.AdvancedElectricHoe:register()
minetest.register_craft({ minetest.register_craft({
type="shapeless", type="shapeless",
output="industrialtest:diamond_electric_hoe", output="industrialtest:advanced_electric_hoe",
recipe={ recipe={
"industrialtest:electric_hoe", "industrialtest:electric_hoe",
industrialtest.elementKeys.diamond, industrialtest.elementKeys.diamond,

26
tools/electric_item.lua Normal file
View File

@@ -0,0 +1,26 @@
-- 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/>.
industrialtest.ElectricItem=table.copy(industrialtest.Item)
function industrialtest.ElectricItem.prepare(self,itemstack)
local meta=itemstack:get_meta()
if industrialtest.api.hasPowerStorage(meta) then
return
end
industrialtest.api.addPowerStorage(meta,self.capacity,self.flow,"n/a")
industrialtest.api.updateItemPowerText(itemstack)
end

View File

@@ -14,162 +14,95 @@
-- You should have received a copy of the GNU General Public License -- You should have received a copy of the GNU General Public License
-- along with this program. If not, see <http://www.gnu.org/licenses/>. -- along with this program. If not, see <http://www.gnu.org/licenses/>.
-- This entire code is super hacky, I'm aware.
local S=minetest.get_translator("industrialtest") local S=minetest.get_translator("industrialtest")
industrialtest.ElectricSaberBase=table.copy(industrialtest.ActivatedElectricTool)
industrialtest.internal.unpackTableInto(industrialtest.ElectricSaberBase,{
fullPunchInterval=0.5,
digs={"snappy"},
hits={"fleshy"},
capacity=100000,
flow=industrialtest.api.hvPowerFlow
})
local electricSaber={} function industrialtest.ElectricSaberBase.createActiveDefinitionTable(self)
self.define.onUse=false
electricSaber.afterUse=function(itemstack,config) return industrialtest.ActivatedElectricTool.createActiveDefinitionTable(self)
local meta=itemstack:get_meta()
industrialtest.api.addPowerToItem(itemstack,-20)
if meta:get_int("industrialtest.powerAmount")<20 then
itemstack:set_name("industrialtest:"..config.name)
end
return itemstack
end end
local function registerElectricSaber(config) function industrialtest.ElectricSaberBase.hitUse(self,itemstack,user,pointed)
local definition={ if self:canActivate(itemstack) and pointed.type=="object" then
description=config.displayName, -- pointed is a ObjectRef
inventory_image="industrialtest_"..config.name..".png", industrialtest.api.addPowerToItem(itemstack,-self:getOpPower(itemstack))
after_use=function() local toolCapabilities={damage_groups={}}
-- Hack to make sure that saber won't be destroyed when has 0 EU for _,hitType in ipairs(self.hits) do
return nil toolCapabilities.damage_groups[hitType]=self.active.damage
end,
_industrialtest_powerStorage=true,
_industrialtest_powerCapacity=10000,
_industrialtest_powerFlow=industrialtest.api.lvPowerFlow,
_industrialtest_inactiveName="industrialtest:"..config.name
}
if industrialtest.mtgAvailable then
definition.groups={
sword=1
}
definition.tool_capabilities={
full_punch_interval=0.5,
max_drop_level=config.maxDropLevel,
groupcaps={
snappy={
times=config.inactiveTimes,
maxlevel=config.maxLevel
}
},
damage_groups={fleshy=config.inactiveDamage}
}
elseif industrialtest.mclAvailable then
definition.groups={
weapon=1,
sword=1,
dig_speed_class=config.digSpeedClass
}
definition.tool_capabilities={
full_punch_interval=0.5,
max_drop_level=config.maxDropLevel,
damage_groups={fleshy=config.inactiveDamage}
}
definition._mcl_toollike_wield=true
definition._mcl_diggroups={
swordy={
speed=config.inactiveDigSpeed,
level=config.digLevel,
uses=-1
},
swordy_cobweb={
speed=config.inactiveDigSpeed,
level=config.digLevel,
uses=-1
}
}
end end
minetest.register_tool("industrialtest:"..config.name,definition) pointed.ref:punch(user,nil,toolCapabilities)
definition=table.copy(definition) return true
if industrialtest.mtgAvailable then
definition.tool_capabilities.groupcaps.snappy.times=config.activeTimes
definition.tool_capabilities.damage_groups.fleshy=config.activeDamage
elseif industrialtest.mclAvailable then
definition.tool_capabilities.damage_groups.fleshy=config.activeDamage
definition._mcl_diggroups.swordy.speed=config.activeDigSpeed
definition._mcl_diggroups.swordy_cobweb.speed=config.activeDigSpeed
end end
definition.groups.not_in_creative_inventory=1 return false
definition.after_use=function(itemstack)
return electricSaber.afterUse(itemstack,config)
end
minetest.register_tool("industrialtest:"..config.name.."_active",definition)
industrialtest.internal.registeredElectricSabers["industrialtest:"..config.name]=true
industrialtest.internal.registeredElectricSabers["industrialtest:"..config.name.."_active"]=true
end end
local definition={
name="electric_saber", function industrialtest.ElectricSaberBase.afterUse(self,itemstack,user,node,digparams)
displayName=S("Electric Saber") industrialtest.ActivatedElectricTool.afterUse(self,itemstack,user,node,digparams)
} itemstack:set_name(self.name)
if industrialtest.mtgAvailable then return true
definition.maxDropLevel=1
definition.inactiveTimes={[1]=10,[2]=5.6,[3]=4}
definition.maxLevel=3
definition.inactiveDamage=1
definition.activeTimes={[1]=2.0,[2]=0.8,[3]=0.4}
definition.activeDamage=6
elseif industrialtest.mclAvailable then
definition.digSpeedClass=4
definition.maxDropLevel=4
definition.inactiveDamage=1
definition.inactiveDigSpeed=1
definition.digLevel=4
definition.activeDamage=6
definition.activeDigSpeed=7
end end
registerElectricSaber(definition)
function industrialtest.ElectricSaberBase.getOpPower(self,itemstack)
return 500
end
industrialtest.ElectricSaber=table.copy(industrialtest.ElectricSaberBase)
industrialtest.internal.unpackTableInto(industrialtest.ElectricSaber,{
name="industrialtest:electric_saber",
description=S("Electric Saber"),
inventoryImage="industrialtest_electric_saber.png",
digLevel=0,
digSpeedClass=4,
active={
digSpeed=7,
times={[1]=0.7,[2]=0.5,[3]=0.2,[4]=0.15},
damage=3
}
})
industrialtest.ElectricSaber:register()
minetest.register_craft({ minetest.register_craft({
type="shaped", type="shaped",
output="industrialtest:electric_saber", output="industrialtest:electric_saber",
recipe={ recipe={
{"industrialtest:refined_iron_ingot"}, {industrialtest.elementKeys.yellowDust,"industrialtest:advanced_alloy",""},
{"industrialtest:refined_iron_ingot"}, {industrialtest.elementKeys.yellowDust,"industrialtest:advanced_alloy",""},
{"industrialtest:re_battery"} {"industrialtest:carbon_plate","industrialtest:energy_crystal","industrialtest:carbon_plate"}
} }
}) })
definition={
name="diamond_electric_saber", industrialtest.AdvancedElectricSaber=table.copy(industrialtest.ElectricSaberBase)
displayName=S("Diamond Electric Saber") industrialtest.internal.unpackTableInto(industrialtest.AdvancedElectricSaber,{
} name="industrialtest:advanced_electric_saber",
if industrialtest.mtgAvailable then description=S("Advanced Electric Saber"),
definition.maxDropLevel=1 inventoryImage="industrialtest_advanced_electric_saber.png",
definition.inactiveTimes={[1]=10,[2]=5.6,[3]=4} digLevel=0,
definition.maxLevel=3 digSpeedClass=5,
definition.inactiveDamage=1 active={
definition.activeTimes={[1]=2.0,[2]=0.8,[3]=0.4} digSpeed=8,
definition.activeDamage=9 times={[1]=0.5,[2]=0.2,[3]=0.15,[4]=0.1},
elseif industrialtest.mclAvailable then damage=5
definition.digSpeedClass=5 }
definition.maxDropLevel=5 })
definition.inactiveDamage=1
definition.inactiveDigSpeed=1 industrialtest.AdvancedElectricSaber:register()
definition.digLevel=5
definition.activeDamage=9
definition.activeDigSpeed=9
end
registerElectricSaber(definition)
minetest.register_craft({ minetest.register_craft({
type="shapeless", type="shapeless",
output="industrialtest:diamond_electric_saber", output="industrialtest:advanced_electric_saber",
recipe={ recipe={
"industrialtest:electric_saber", "industrialtest:electric_saber",
industrialtest.elementKeys.diamond, industrialtest.elementKeys.diamond,
industrialtest.elementKeys.diamond industrialtest.elementKeys.diamond
} }
}) })
minetest.register_on_punchplayer(function(player,hitter)
local itemstack=hitter:get_wielded_item()
if industrialtest.internal.registeredElectricSabers[itemstack:get_name()] then
local meta=itemstack:get_meta()
if meta:get_int("industrialtest.powerAmount")>=20 then
industrialtest.api.addPowerToItem(itemstack,-20)
hitter:set_wielded_item(itemstack)
local def=minetest.registered_tools[itemstack:get_name().."_active"]
player:set_hp(player:get_hp()-def.tool_capabilites.damage_groups.fleshy)
return true
end
end
return false
end)

76
tools/electric_tool.lua Normal file
View File

@@ -0,0 +1,76 @@
-- 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/>.
industrialtest.ElectricTool=table.copy(industrialtest.Tool)
industrialtest.internal.unpackTableInto(industrialtest.ElectricTool,{
prepare=industrialtest.ElectricItem.prepare
})
function industrialtest.ElectricTool.createDefinitionTable(self)
local def=industrialtest.Tool.createDefinitionTable(self)
def.after_use=function()
-- Hack to make sure that chainsaw won't be destroyed when has 0 EU
return nil
end
return def
end
function industrialtest.ElectricTool.onPlace(self,itemstack,user,pointed)
self:prepare(itemstack)
local meta=itemstack:get_meta()
local opPower=self:getOpPower(itemstack)
if meta:get_int("industrialtest.powerAmount")<opPower then
return false
end
if self:use(itemstack,user,pointed) then
industrialtest.api.addPowerToItem(itemstack,-opPower)
end
return true
end
function industrialtest.ElectricTool.onUse(self,itemstack,user,pointed)
self:prepare(itemstack)
if user:is_player() then
local controls=user:get_player_control()
if controls.sneak and self:changeMode(itemstack) then
return true
end
end
local meta=itemstack:get_meta()
local opPower=self:getOpPower(itemstack)
if meta:get_int("industrialtest.powerAmount")<opPower then
return false
end
if self:hitUse(itemstack,user,pointed) then
industrialtest.api.addPowerToItem(itemstack,-opPower)
end
return true
end
function industrialtest.ElectricTool.changeMode(self,itemstack)
-- dummy function
return false
end
function industrialtest.ElectricTool.getOpPower(self,itemstack)
-- dummy function
return 0
end

View File

@@ -0,0 +1,27 @@
-- 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/>.
industrialtest.FluidContainerItem=table.copy(industrialtest.Item)
function industrialtest.FluidContainerItem.prepare(self,itemstack)
if industrialtest.api.itemHasFluidStorage(itemstack) then
return
end
local meta=itemstack:get_meta()
meta:set_int("industrialtest.fluidAmount",0)
meta:set_int("industrialtest.fluidCapacity",self.capacity)
industrialtest.api.updateItemFluidText(itemstack)
end

45
tools/fluid_storage.lua Normal file
View File

@@ -0,0 +1,45 @@
-- 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"}
}
})

72
tools/gear_tool.lua Normal file
View File

@@ -0,0 +1,72 @@
-- 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/>.
industrialtest.GearTool=table.copy(industrialtest.Item)
function industrialtest.GearTool.createDefinitionTable(self)
local def=industrialtest.Item.createDefinitionTable(self)
def.groups._industrialtest_gearTool=1
def.groups["armor_"..self.part]=1
if industrialtest.mtgAvailable then
def.groups.armor_heal=1
elseif industrialtest.mclAvailable then
def.groups.armor=1
def.groups.non_combat_armor=1
def.sounds={
_mcl_armor_equip="mcl_armor_equip_iron",
_mcl_armor_unequip="mcl_armor_unequip_iron"
}
def.on_place=mcl_armor.equip_on_use
def.on_secondary_use=mcl_armor.equip_on_use
def._mcl_armor_element=self.part
def._mcl_armor_texture=self.modelImage
end
return def
end
function industrialtest.GearTool.register(self)
local def=self:createDefinitionTable()
if industrialtest.mtgAvailable then
armor:register_armor(self.name,def)
elseif industrialtest.mclAvailable then
minetest.register_tool(self.name,def)
end
end
minetest.register_globalstep(function(dtime)
local players=minetest.get_connected_players()
for _,player in ipairs(players) do
local inv
if industrialtest.mtgAvailable then
_,inv=armor:get_valid_player(player,"")
elseif industrialtest.mclAvailable then
inv=player:get_inventory()
end
if inv then
local armorList=inv:get_list("armor")
assert(armorList)
for i,itemstack in ipairs(armorList) do
local def=itemstack:get_definition()
if def and def.groups._industrialtest_gearTool and def._industrialtest_self and def._industrialtest_self.update and
def._industrialtest_self:update(player,inv,itemstack,dtime) then
inv:set_stack("armor",i,itemstack)
end
end
end
end
end)

54
tools/item.lua Normal file
View File

@@ -0,0 +1,54 @@
-- 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/>.
industrialtest.Item={}
function industrialtest.Item.createDefinitionTable(self)
local def={
description=self.description,
inventory_image=self.inventoryImage,
groups={},
_industrialtest_self=self
}
if industrialtest.mtgAvailable then
def.groups.flammable=self.flammable
end
return def
end
function industrialtest.Item.register(self)
local def=self:createDefinitionTable()
minetest.register_tool(self.name,def)
end
-- Item callbacks
minetest.register_on_player_inventory_action(function(player,action,inventory,info)
if action=="put" then
local def=info.stack:get_definition()
if def and def._industrialtest_self and def._industrialtest_self.prepare then
def._industrialtest_self:prepare(info.stack)
inventory:set_stack(info.listname,info.index,info.stack)
end
end
end)
minetest.register_on_craft(function(itemstack)
local def=itemstack:get_definition()
if def and def._industrialtest_self and def._industrialtest_self.prepare then
def._industrialtest_self:prepare(itemstack)
end
end)

View File

@@ -15,112 +15,65 @@
-- 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")
industrialtest.JetpackBase=table.copy(industrialtest.GearTool)
industrialtest.internal.unpackTableInto(industrialtest.JetpackBase,{
part="torso"
})
local soundHandles = {}
local jetpack={} function industrialtest.JetpackBase.update(self, player, inv, itemstack, dtime)
local electricJetpack={} local playerName = player:get_player_name()
local control = player:get_player_control()
local function registerJetpack(config) if control.jump and self:tryFly(itemstack) then
if industrialtest.mclAvailable then industrialtest.internal.addYVelocityClamped(player,1,10)
local groups={ if not soundHandles[playerName] then
armor=1, local pos = player:get_pos()
non_combat_armor=1, local handle = minetest.sound_play("industrialtest_jetpack_loop", {
armor_torso=1, pos = pos,
non_combat_torso=1, gain = 1.0, -- Volume of the sound
_industrialtest_jetpack=1 max_hear_distance = 16, -- Maximum distance to hear the sound
} object = player, -- Attach the sound to the player
if config.groups then loop = true, -- The sound is played in a loop
for key,value in pairs(config.groups) do })
groups[key]=value soundHandles[playerName] = handle
end
end
local definition={
description=config.displayName,
inventory_image="industrialtest_"..config.name.."_inv.png",
groups=groups,
sounds={
_mcl_armor_equip="mcl_armor_equip_iron",
_mcl_armor_unequip="mcl_armor_unequip_iron"
},
on_place=mcl_armor.equip_on_use,
on_secondary_use=mcl_armor.equip_on_use,
_mcl_armor_element="torso",
_mcl_armor_texture="industrialtest_"..config.name..".png",
_industrialtest_tryFly=config.tryFly
}
if config.customKeys then
for key,value in pairs(config.customKeys) do
definition[key]=value
end
end
minetest.register_tool("industrialtest:"..config.name,definition)
elseif industrialtest.mtgAvailable then
local groups={
armor_torso=1,
armor_heal=0,
_industrialtest_jetpack=1
}
if config.groups then
for key,value in pairs(config.groups) do
groups[key]=value
end
end
local definition={
description=config.displayName,
inventory_image="industrialtest_"..config.name.."_inv.png",
groups=groups,
_industrialtest_tryFly=config.tryFly
}
if config.customKeys then
for key,value in pairs(config.customKeys) do
definition[key]=value
end
end
armor:register_armor("industrialtest:"..config.name,definition)
end
end
local function addYVelocityClamped(player,vel,max)
local playerVel=player:get_velocity()
if playerVel.y+vel>max then
player:add_velocity(vector.new(0,math.max(max-playerVel.y,0),0))
else
player:add_velocity(vector.new(0,vel,0))
end
end
local function onGlobalStep(player,inv,itemstack,index,def)
if def.groups and def.groups._industrialtest_jetpack then
if def._industrialtest_tryFly(itemstack) then
addYVelocityClamped(player,1,10)
inv:set_stack("armor",index,itemstack)
end end
return true return true
else
if soundHandles[playerName] then
minetest.sound_stop(soundHandles[playerName])
soundHandles[playerName] = nil
end
end end
return false return false
end end
jetpack.tryFly=function(itemstack) industrialtest.Jetpack=table.copy(industrialtest.JetpackBase)
local meta=itemstack:get_meta() industrialtest.internal.unpackTableInto(industrialtest.Jetpack,{
if meta:get_int("industrialtest.fluidAmount")==0 then -- _v is hack to suppress "Registered armor doesn't have material at the end of registration name" warning from 3D Armor.
name="industrialtest:jetpack_v",
description=S("Jetpack"),
inventoryImage="industrialtest_jetpack_v_inv.png",
modelImage="industrialtest_jetpack_v.png",
capacity=5000,
prepare=industrialtest.FluidContainerItem.prepare
})
function industrialtest.Jetpack.createDefinitionTable(self)
local def=industrialtest.JetpackBase.createDefinitionTable(self)
def.groups._industrialtest_fueled=1
return def
end
function industrialtest.Jetpack.tryFly(self,itemstack)
if industrialtest.api.isItemFluidStorageEmpty(itemstack) then
return false return false
end end
industrialtest.api.addFluidToItem(itemstack,-1) industrialtest.api.addFluidToItem(itemstack,-1)
return true return true
end end
-- _v is hack to suppress "Registered armor doesn't have material at the end of registration name" warning from 3D Armor. industrialtest.Jetpack:register()
registerJetpack({
name="jetpack_v",
displayName=S("Jetpack"),
groups={
_industrialtest_fueled=1,
_industrialtest_fluidStorage=1
},
tryFly=jetpack.tryFly,
customKeys={
_industrialtest_fluidCapacity=5000
}
})
minetest.register_craft({ minetest.register_craft({
type="shaped", type="shaped",
output="industrialtest:jetpack_v", output="industrialtest:jetpack_v",
@@ -131,7 +84,18 @@ minetest.register_craft({
} }
}) })
electricJetpack.tryFly=function(itemstack) industrialtest.ElectricJetpack=table.copy(industrialtest.JetpackBase)
industrialtest.internal.unpackTableInto(industrialtest.ElectricJetpack,{
name="industrialtest:electric_jetpack",
description=S("Electric Jetpack"),
inventoryImage="industrialtest_electric_jetpack_inv.png",
modelImage="industrialtest_electric_jetpack.png",
flow=industrialtest.api.lvPowerFlow,
capacity=30000,
prepare=industrialtest.ElectricItem.prepare
})
function industrialtest.ElectricJetpack.tryFly(self,itemstack)
local meta=itemstack:get_meta() local meta=itemstack:get_meta()
if meta:get_int("industrialtest.powerAmount")<10 then if meta:get_int("industrialtest.powerAmount")<10 then
return false return false
@@ -140,16 +104,8 @@ electricJetpack.tryFly=function(itemstack)
return true return true
end end
registerJetpack({ industrialtest.ElectricJetpack:register()
name="electric_jetpack",
displayName=S("Electric Jetpack"),
tryFly=electricJetpack.tryFly,
customKeys={
_industrialtest_powerStorage=true,
_industrialtest_powerCapacity=30000,
_industrialtest_powerFlow=industrialtest.api.lvPowerFlow
}
})
minetest.register_craft({ minetest.register_craft({
type="shaped", type="shaped",
output="industrialtest:electric_jetpack", output="industrialtest:electric_jetpack",
@@ -159,32 +115,3 @@ minetest.register_craft({
{industrialtest.elementKeys.yellowDust,"",industrialtest.elementKeys.yellowDust} {industrialtest.elementKeys.yellowDust,"",industrialtest.elementKeys.yellowDust}
} }
}) })
minetest.register_globalstep(function(dtime)
-- FIXME: Maybe this can be optimized?
local players=minetest.get_connected_players()
for _,player in ipairs(players) do
local control=player:get_player_control()
if control.jump then
if industrialtest.mclAvailable then
local inv=player:get_inventory()
local stack=inv:get_stack("armor",3)
local def=stack:get_definition()
onGlobalStep(player,inv,stack,3,def)
elseif industrialtest.mtgAvailable then
local _,inv=armor:get_valid_player(player,"")
if inv then
local armorList=inv:get_list("armor")
assert(armorList)
for i=1,#armorList do
local stack=armorList[i]
local def=stack:get_definition()
if onGlobalStep(player,inv,stack,i,def) then
break
end
end
end
end
end
end
end)

View File

@@ -15,10 +15,9 @@
-- 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")
industrialtest.MiningLaserBeam={}
local beam={} function industrialtest.MiningLaserBeam.onActivate(self,staticdata)
beam.onActivate=function(self,staticdata)
local data=minetest.deserialize(staticdata) local data=minetest.deserialize(staticdata)
self.direction=data.direction self.direction=data.direction
self.energy=data.energy self.energy=data.energy
@@ -28,11 +27,11 @@ beam.onActivate=function(self,staticdata)
self.user=data.user self.user=data.user
end end
beam.onPunch=function() function industrialtest.MiningLaserBeam.onPunch()
return true return true
end end
beam.onNodeBreak=function(pos,node,user) function industrialtest.MiningLaserBeam.onNodeBreak(pos,node,user)
if industrialtest.mclAvailable then if industrialtest.mclAvailable then
local drops=minetest.get_node_drops(node.name,"") local drops=minetest.get_node_drops(node.name,"")
for _, val in ipairs(drops) do for _, val in ipairs(drops) do
@@ -45,7 +44,7 @@ beam.onNodeBreak=function(pos,node,user)
minetest.node_dig(pos,node,user) minetest.node_dig(pos,node,user)
end end
beam.onStep=function(self,dtime,moveresult) function industrialtest.MiningLaserBeam.onStep(self,dtime,moveresult)
local pos=self.object:get_pos() local pos=self.object:get_pos()
if vector.distance(self.startPos,pos)>=self.distance or self.energy<=0 then if vector.distance(self.startPos,pos)>=self.distance or self.energy<=0 then
self.object:remove() self.object:remove()
@@ -67,7 +66,7 @@ beam.onStep=function(self,dtime,moveresult)
self.object:remove() self.object:remove()
return return
else else
beam.onNodeBreak(val.node_pos,node,minetest.get_player_by_name(self.user)) industrialtest.MiningLaserBeam.onNodeBreak(val.node_pos,node,minetest.get_player_by_name(self.user))
self.energy=self.energy-1 self.energy=self.energy-1
end end
elseif self.mode==4 then elseif self.mode==4 then
@@ -80,6 +79,7 @@ beam.onStep=function(self,dtime,moveresult)
end end
end end
-- Note: If there are more entities registered then replace manual registration with proper pseudo-OOP
minetest.register_entity("industrialtest:mining_laser_beam",{ minetest.register_entity("industrialtest:mining_laser_beam",{
initial_properties={ initial_properties={
physical=true, physical=true,
@@ -103,18 +103,77 @@ minetest.register_entity("industrialtest:mining_laser_beam",{
static_save=false, static_save=false,
shaded=false, shaded=false,
}, },
on_activate=beam.onActivate, on_activate=industrialtest.MiningLaserBeam.onActivate,
on_punch=beam.onPunch, on_punch=industrialtest.MiningLaserBeam.onPunch,
on_step=beam.onStep on_step=industrialtest.MiningLaserBeam.onStep
}) })
local miningLaser={} industrialtest.MiningLaser=table.copy(industrialtest.ElectricTool)
miningLaser.mode1OpPower=1250 industrialtest.internal.unpackTableInto(industrialtest.MiningLaser,{
miningLaser.mode2OpPower=100 name="industrialtest:mining_laser",
miningLaser.mode4OpPower=5000 description=S("Mining Laser (Mode 1)"),
miningLaser.modeCount=4 inventoryImage="industrialtest_mining_laser.png",
capacity=300000,
flow=industrialtest.api.hvPowerFlow,
define={onUse=true},
_modeCount=4
})
miningLaser.getMode=function(itemstack) function industrialtest.MiningLaser.hitUse(self,itemstack,user,pointed)
if not user:is_player() then
return false
end
local control=user:get_player_control()
if control.sneak then
end
local mode=self.getMode(itemstack)
local meta=itemstack:get_meta()
if mode==1 then
if not self:spawnBeam(itemstack,user,user:get_pos(),user:get_look_dir(),10,64) then
return false
end
elseif mode==2 then
if not self:spawnBeam(itemstack,user,user:get_pos(),user:get_look_dir(),3,2) then
return false
end
elseif mode==3 then
local yaw=user:get_look_horizontal()
local dir=vector.new(-math.sin(yaw),0,math.cos(yaw))
if not self:spawnBeam(itemstack,user,user:get_pos(),dir,10,64) then
return false
end
elseif mode==4 then
if not self:spawnBeam(itemstack,user,user:get_pos(),user:get_look_dir(),1,64) then
return false
end
end
return true
end
function industrialtest.MiningLaser.changeMode(self,itemstack)
local mode=self.getMode(itemstack)
mode=mode+1
if mode>=self._modeCount+1 then
mode=1
end
self.setMode(itemstack,mode)
return true
end
function industrialtest.MiningLaser.getOpPower(self,itemstack)
local mode=self.getMode(itemstack)
if mode==1 then
return 1250
elseif mode==2 or mode==3 then
return 100
elseif mode==4 then
return 5000
end
-- assert not reached
assert(false)
end
function industrialtest.MiningLaser.getMode(itemstack)
local meta=itemstack:get_meta() local meta=itemstack:get_meta()
if not meta:contains("mode") then if not meta:contains("mode") then
meta:set_int("mode",1) meta:set_int("mode",1)
@@ -123,74 +182,26 @@ miningLaser.getMode=function(itemstack)
return meta:get_int("mode") return meta:get_int("mode")
end end
miningLaser.setMode=function(itemstack,mode) function industrialtest.MiningLaser.setMode(itemstack,mode)
local meta=itemstack:get_meta() local meta=itemstack:get_meta()
meta:set_int("mode",mode) meta:set_int("mode",mode)
meta:set_string("industrialtest.descriptionOverride",S("Mining Laser (Mode @1)",mode)) meta:set_string("industrialtest.descriptionOverride",S("Mining Laser (Mode @1)",mode))
industrialtest.api.updateItemPowerText(itemstack) industrialtest.api.updateItemPowerText(itemstack)
end end
miningLaser.spawnBeam=function(itemstack,user,pos,dir,opPower,energy,distance) function industrialtest.MiningLaser.spawnBeam(self,itemstack,user,pos,dir,energy,distance)
local meta=itemstack:get_meta()
if meta:get_int("industrialtest.powerAmount")<opPower then
return false
end
minetest.add_entity(pos+vector.new(0,1.5,0),"industrialtest:mining_laser_beam",minetest.serialize({ minetest.add_entity(pos+vector.new(0,1.5,0),"industrialtest:mining_laser_beam",minetest.serialize({
direction=dir, direction=dir,
energy=energy, energy=energy,
distance=distance, distance=distance,
mode=miningLaser.getMode(itemstack), mode=self.getMode(itemstack),
user=user:get_player_name() user=user:get_player_name()
})) }))
industrialtest.api.addPowerToItem(itemstack,-opPower)
return true return true
end end
miningLaser.onUse=function(itemstack,user) industrialtest.MiningLaser:register()
if not user:is_player() then
return nil
end
local mode=miningLaser.getMode(itemstack)
local control=user:get_player_control()
if control.sneak then
mode=mode+1
if mode>=miningLaser.modeCount+1 then
mode=1
end
miningLaser.setMode(itemstack,mode)
return itemstack
end
local meta=itemstack:get_meta()
if mode==1 then
if not miningLaser.spawnBeam(itemstack,user,user:get_pos(),user:get_look_dir(),miningLaser.mode1OpPower,10,64) then
return nil
end
elseif mode==2 then
if not miningLaser.spawnBeam(itemstack,user,user:get_pos(),user:get_look_dir(),miningLaser.mode2OpPower,3,2) then
return nil
end
elseif mode==3 then
local yaw=user:get_look_horizontal()
local dir=vector.new(-math.sin(yaw),0,math.cos(yaw))
if not miningLaser.spawnBeam(itemstack,user,user:get_pos(),dir,miningLaser.mode1OpPower,10,64) then
return nil
end
elseif mode==4 then
if not miningLaser.spawnBeam(itemstack,user,user:get_pos(),user:get_look_dir(),miningLaser.mode4OpPower,1,64) then
return nil
end
end
return itemstack
end
minetest.register_tool("industrialtest:mining_laser",{
description=S("Mining Laser (Mode 1)"),
inventory_image="industrialtest_mining_laser.png",
on_use=miningLaser.onUse,
_industrialtest_powerStorage=true,
_industrialtest_powerCapacity=300000,
_industrialtest_powerFlow=industrialtest.api.hvPowerFlow
})
minetest.register_craft({ minetest.register_craft({
type="shaped", type="shaped",
output="industrialtest:mining_laser", output="industrialtest:mining_laser",

View File

@@ -15,62 +15,66 @@
-- 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")
industrialtest.NanoSuit=table.copy(industrialtest.ElectricArmor)
local function registerNanoSuitPart(config) industrialtest.internal.unpackTableInto(industrialtest.NanoSuit,{
local groups={ name="industrialtest:nano",
_industrialtest_nanoSuit=1 elements={
} {
if config.element=="head" then name="helmet",
groups.armor_head=1 description=S("Nano Helmet"),
elseif config.element=="torso" then element="head",
groups.armor_torso=1 inventoryImage="industrialtest_nano_helmet_inv.png",
elseif config.element=="legs" then texture="industrialtest_nano_helmet.png"
groups.armor_legs=1
elseif config.element=="feet" then
groups.armor_feet=1
end
if industrialtest.mtgAvailable then
groups.armor_heal=0
armor:register_armor("industrialtest:"..config.name,{
description=config.displayName,
inventory_image="industrialtest_"..config.name.."_inv.png",
groups=groups,
_industrialtest_powerStorage=true,
_industrialtest_powerCapacity=1000000,
_industrialtest_powerFlow=industrialtest.api.evPowerFlow,
_industrialtest_damageReduction=config.damageReduction,
industrialtest_powerPerDamage=5000
})
elseif industrialtest.mclAvailable then
groups.armor=1
groups.non_combat_armor=1
minetest.register_tool("industrialtest:"..config.name,{
description=config.displayName,
inventory_image="industrialtest_"..config.name.."_inv.png",
groups=groups,
sounds={
_mcl_armor_equip="mcl_armor_equip_iron",
_mcl_armor_unequip="mcl_armor_unequip_iron"
}, },
on_place=mcl_armor.equip_on_use, {
on_secondary_use=mcl_armor.equip_on_use, name="bodyarmor",
_mcl_armor_element=config.element, description=S("Nano Bodyarmor"),
_mcl_armor_texture=(config.element=="feet" and "industrialtest_mcl_" or "industrialtest_")..config.name..".png", element="torso",
_industrialtest_powerStorage=true, inventoryImage="industrialtest_nano_bodyarmor_inv.png",
_industrialtest_powerCapacity=1000000, texture="industrialtest_nano_bodyarmor.png"
_industrialtest_powerFlow=industrialtest.api.evPowerFlow, },
_industrialtest_damageReduction=config.damageReduction, {
_industrialtest_powerPerDamage=5000 name="leggings",
}) description=S("Nano Leggings"),
element="legs",
inventoryImage="industrialtest_nano_leggings_inv.png",
texture="industrialtest_nano_leggings.png"
},
{
name="boots",
description=S("Nano Boots"),
element="feet",
inventoryImage="industrialtest_nano_boots_inv.png",
texture={
"industrialtest_nano_boots.png",
"industrialtest_mcl_nano_boots.png"
}
}
},
capacity=1000000,
flow=industrialtest.api.evPowerFlow
})
function industrialtest.NanoSuit.getReducedDamageForItem(self,itemstack)
local def=itemstack:get_definition()
if def.groups.armor_head then
return 0.12
elseif def.groups.armor_torso then
return 0.32
elseif def.groups.armor_legs then
return 0.3
elseif def.groups.armor_feet then
return 0.24
end end
return 0
end end
registerNanoSuitPart({ function industrialtest.NanoSuit.getPowerPerDamageForItem(self,itemstack)
name="nano_helmet", return 5000
displayName=S("Nano Helmet"), end
element="head",
damageReduction=0.12 industrialtest.NanoSuit:register()
})
minetest.register_craft({ minetest.register_craft({
type="shaped", type="shaped",
output="industrialtest:nano_helmet", output="industrialtest:nano_helmet",
@@ -80,12 +84,6 @@ minetest.register_craft({
} }
}) })
registerNanoSuitPart({
name="nano_bodyarmor",
displayName=S("Nano Bodyarmor"),
element="torso",
damageReduction=0.32
})
minetest.register_craft({ minetest.register_craft({
type="shaped", type="shaped",
output="industrialtest:nano_bodyarmor", output="industrialtest:nano_bodyarmor",
@@ -96,12 +94,6 @@ minetest.register_craft({
} }
}) })
registerNanoSuitPart({
name="nano_leggings",
displayName=S("Nano Leggings"),
element="legs",
damageReduction=0.3
})
minetest.register_craft({ minetest.register_craft({
type="shaped", type="shaped",
output="industrialtest:nano_leggings", output="industrialtest:nano_leggings",
@@ -112,12 +104,6 @@ minetest.register_craft({
} }
}) })
registerNanoSuitPart({
name="nano_boots",
displayName=S("Nano Boots"),
element="feet",
damageReduction=0.24
})
minetest.register_craft({ minetest.register_craft({
type="shaped", type="shaped",
output="industrialtest:nano_boots", output="industrialtest:nano_boots",
@@ -126,41 +112,3 @@ minetest.register_craft({
{"industrialtest:carbon_plate","industrialtest:energy_crystal","industrialtest:carbon_plate"} {"industrialtest:carbon_plate","industrialtest:energy_crystal","industrialtest:carbon_plate"}
} }
}) })
minetest.register_on_player_hpchange(function(player,hpChange)
if hpChange>0 or not player:is_player() then
return hpChange
end
local inv
if industrialtest.mtgAvailable then
_,inv=armor:get_valid_player(player,"")
if not inv then
return hpChange
end
elseif industrialtest.mclAvailable then
inv=player:get_inventory()
end
local armorList=inv:get_list("armor")
assert(armorList)
local result=hpChange
for i=1,#armorList do
local stack=armorList[i]
local def=stack:get_definition()
if def.groups and def.groups._industrialtest_nanoSuit then
local meta=stack:get_meta()
local targetReducedDamage=math.floor(math.abs(hpChange)*def._industrialtest_damageReduction)
local requiredPower=targetReducedDamage*def._industrialtest_powerPerDamage
local availablePower=math.min(meta:get_int("industrialtest.powerAmount"),requiredPower)
local reducedDamage=math.floor(availablePower/def._industrialtest_powerPerDamage)
if reducedDamage>0 then
result=result+reducedDamage
industrialtest.api.addPowerToItem(stack,-reducedDamage*def._industrialtest_powerPerDamage)
inv:set_stack("armor",i,stack)
end
end
end
return result
end,true)

101
tools/power_storage.lua Normal file
View File

@@ -0,0 +1,101 @@
-- 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,62 +16,213 @@
local S=minetest.get_translator("industrialtest") local S=minetest.get_translator("industrialtest")
local quantumSuit={} industrialtest.QuantumArmorBase=table.copy(industrialtest.ElectricGearTool)
quantumSuit.helmetBreathRefillOpPower=1000 industrialtest.internal.unpackTableInto(industrialtest.QuantumArmorBase,{
quantumSuit.leggingsSpeedOpPower=125 flow=industrialtest.api.ivPowerFlow,
quantumSuit.leggingsSpeedMaxVel=4 capacity=10000000
quantumSuit.bootsJumpOpPower=50 })
quantumSuit.bootsFallDamageReductionOpPower=900
local playerPositions={} function industrialtest.QuantumArmorBase.createDefintionTable(self)
local playerLeggingsSpeedEnabled={} local def=industrialtest.ElectricGearTool.createDefintionTable(self)
local playerBootsJumpEnabled={} def.groups._industrialtest_electricArmor=1
return def
local function registerQuantumSuitPart(config)
config.groups=config.groups or {}
config.groups._industrialtest_nanoSuit=1
if config.element=="head" then
config.groups.armor_head=1
elseif config.element=="torso" then
config.groups.armor_torso=1
elseif config.element=="legs" then
config.groups.armor_legs=1
elseif config.element=="feet" then
config.groups.armor_feet=1
end
local definition={
description=config.displayName,
inventory_image="industrialtest_"..config.name.."_inv.png",
groups=config.groups,
_industrialtest_powerStorage=true,
_industrialtest_powerCapacity=10000000,
_industrialtest_powerFlow=industrialtest.api.ivPowerFlow,
_industrialtest_damageReduction=config.damageReduction,
_industrialtest_powerPerDamage=30
}
if config.customKeys then
for k,v in pairs(config.customKeys) do
definition[k]=v
end
end
if industrialtest.mtgAvailable then
definition.groups.armor_heal=0
armor:register_armor("industrialtest:"..config.name,definition)
elseif industrialtest.mclAvailable then
definition.groups.armor=1
definition.groups.non_combat_armor=1
definition.sounds={
_mcl_armor_equip="mcl_armor_equip_iron",
_mcl_armor_unequip="mcl_armor_unequip_iron"
}
definition.on_place=mcl_armor.equip_on_use
definition.on_secondary_use=mcl_armor.equip_on_use
definition._mcl_armor_element=config.element
definition._mcl_armor_texture=(config.element=="feet" and "industrialtest_mcl_" or "industrialtest_")..config.name..".png"
minetest.register_tool("industrialtest:"..config.name,definition)
end
end 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.internal.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={}
function industrialtest.QuantumLeggings.update(self,player,inv,itemstack,dtime)
local control=player:get_player_control()
local playerName=player:get_player_name()
if leggingsSpeedEnabled[playerName] then
if control.up and control.aux1 then
local meta=itemstack:get_meta()
local requiredPower=vector.distance(player:get_pos(),playerPositions[playerName])*self._speedOpPower
if meta:get_int("industrialtest.powerAmount")>=requiredPower then
industrialtest.api.addPowerToItem(itemstack,-requiredPower)
playerPositions[playerName]=player:get_pos()
return true
end
end
player:set_physics_override({
speed=1
})
leggingsSpeedEnabled[playerName]=false
elseif control.up and control.aux1 then
local meta=itemstack:get_meta()
local requiredPower=vector.distance(player:get_pos(),playerPositions[playerName])*self._speedOpPower
if meta:get_int("industrialtest.powerAmount")>=requiredPower then
player:set_physics_override({
speed=self._speedMaxVel
})
leggingsSpeedEnabled[playerName]=true
end
end
playerPositions[playerName]=player:get_pos()
return false
end
function industrialtest.QuantumLeggings.getReducedDamageForItem(self,itemstack)
return 0.3
end
industrialtest.QuantumLeggings:register()
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}
}
})
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
return false
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
@@ -87,174 +238,6 @@ 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
@@ -267,8 +250,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*quantumSuit.bootsFallDamageReductionOpPower))) local reducedDamage=math.min(damage,math.floor(meta:get_int("industrialtest.powerAmount")/(damage*industrialtest.QuantumBoots._fallDamageReductionOpPower)))
industrialtest.api.addPowerToItem(stack,-reducedDamage*quantumSuit.bootsFallDamageReductionOpPower) industrialtest.api.addPowerToItem(stack,-reducedDamage*industrialtest.QuantumBoots._fallDamageReductionOpPower)
inv:set_stack("armor",index,stack) inv:set_stack("armor",index,stack)
return hpChange+reducedDamage return hpChange+reducedDamage

152
tools/scanner.lua Normal file
View File

@@ -0,0 +1,152 @@
-- 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

@@ -15,58 +15,41 @@
-- 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")
industrialtest.SolarHelmet=table.copy(industrialtest.GearTool)
industrialtest.internal.unpackTableInto(industrialtest.SolarHelmet,{
name="industrialtest:solar_helmet",
description=S("Solar Helmet"),
inventoryImage="industrialtest_solar_helmet_inv.png",
part="head",
modelImage="industrialtest_solar_helmet.png"
})
local updateDelta=0 local updateDelta=0
function industrialtest.SolarHelmet.update(self,player,inv,itemstack,dtime)
local function onGlobalStep(player,inv,stack) updateDelta=updateDelta+dtime
if stack:get_name()~="industrialtest:solar_helmet" then if updateDelta<industrialtest.config.updateDelay then
return false return false
end end
updateDelta=0
local amount=math.floor((minetest.get_node_light(player:get_pos()) or 0)/2) local amount=math.floor((minetest.get_node_light(player:get_pos()) or 0)/2)
if amount==0 then if amount==0 then
return true return false
end end
local armorList=inv:get_list("armor") local armorList=inv:get_list("armor")
for i=1,#armorList do for i,armorItemstack in ipairs(armorList) do
local meta=armorList[i]:get_meta() local meta=armorItemstack:get_meta()
if industrialtest.api.hasPowerStorage(meta) and not industrialtest.api.isFullyCharged(meta) then if industrialtest.api.hasPowerStorage(meta) and not industrialtest.api.isFullyCharged(meta) then
industrialtest.api.addPowerToItem(armorList[i],amount) industrialtest.api.addPowerToItem(armorItemstack,amount)
inv:set_stack("armor",i,armorList[i]) inv:set_stack("armor",i,armorItemstack)
break break
end end
end end
return true return false
end end
if industrialtest.mtgAvailable then industrialtest.SolarHelmet:register()
armor:register_armor("industrialtest:solar_helmet",{
description=S("Solar Helmet"),
inventory_image="industrialtest_solar_helmet_inv.png",
groups={
armor_head=1,
armor_heal=0
}
})
elseif industrialtest.mclAvailable then
minetest.register_tool("industrialtest:solar_helmet",{
description=S("Solar Helmet"),
inventory_image="industrialtest_solar_helmet_inv.png",
groups={
armor=1,
non_combat_armor=1,
armor_head=1,
non_combat_feet=1
},
sounds={
_mcl_armor_equip="mcl_armor_equip_iron",
_mcl_armor_unequip="mcl_armor_unequip_iron"
},
on_place=mcl_armor.equip_on_use,
on_secondary_use=mcl_armor.equip_on_use,
_mcl_armor_element="head",
_mcl_armor_texture="industrialtest_solar_helmet.png"
})
end
minetest.register_craft({ minetest.register_craft({
type="shaped", type="shaped",
output="industrialtest:solar_helmet", output="industrialtest:solar_helmet",
@@ -76,6 +59,7 @@ minetest.register_craft({
{"industrialtest:insulated_copper_cable","industrialtest:insulated_copper_cable","industrialtest:insulated_copper_cable"} {"industrialtest:insulated_copper_cable","industrialtest:insulated_copper_cable","industrialtest:insulated_copper_cable"}
} }
}) })
minetest.register_craft({ minetest.register_craft({
type="shaped", type="shaped",
output="industrialtest:solar_helmet", output="industrialtest:solar_helmet",
@@ -85,31 +69,3 @@ minetest.register_craft({
{"industrialtest:insulated_copper_cable","industrialtest:insulated_copper_cable","industrialtest:insulated_copper_cable"} {"industrialtest:insulated_copper_cable","industrialtest:insulated_copper_cable","industrialtest:insulated_copper_cable"}
} }
}) })
minetest.register_globalstep(function(dtime)
updateDelta=updateDelta+dtime
if updateDelta<industrialtest.updateDelay then
return
end
updateDelta=0
local players=minetest.get_connected_players()
for _,player in ipairs(players) do
if industrialtest.mtgAvailable then
local _,inv=armor:get_valid_player(player,"")
if inv then
local armorList=inv:get_list("armor")
assert(armorList)
for i=1,#armorList do
local stack=armorList[i]
if onGlobalStep(player,inv,stack) then
break
end
end
end
elseif industrialtest.mclAvailable then
local inv=player:get_inventory()
local stack=inv:get_stack("armor",1)
onGlobalStep(player,inv,stack)
end
end
end)

Some files were not shown because too many files have changed in this diff Show More