Voidworks

Harvest void from the world, carry it downhill between dimensions, and spend it to upgrade items
Back to Files

Voidworks 0.1.1

File namevoidworks-0.1.1.jar
Uploader
kc00lkc00l
Uploaded
Oct 13, 2026
Downloads
8
Size
409.9 KB
Mod Loaders
NeoForge
File ID
9154147
Type
B
Beta
Supported game versions
  • 26.1.2

Curse Maven Snippet

NeoForge

implementation "curse.maven:voidworks-1742531:9154147"

Learn more about Curse Maven

What's new

  • Voidstone and the Overworld Void Displacer (crying obsidian on the corners, ender pearls on the sides, a sticky piston in the centre). The Displacer works only where the harvest kind is overworld: it swaps fed blocks with the natural terrain (#voidworks:overworld_terrain) touching it or its own Voidstone, nearest first, leaving Voidstone, and each harvest's motes, at one grade above the local Void Pressure, fly to it as butterflies and land in the network its Voidstone forms; each harvest plays vanilla's chorus fruit teleport sound for now, and the swapped-out terrain crumbles into its breaking particles. Its Zone is a count of harvests; spent, or with nothing left in reach, it becomes Voidstone and its motes stay, but one that could reach no terrain before its first harvest pops off as its item. Until then it cannot be broken or moved, and Voidstone never can; Voidstone has no item. A full output, or a network that cannot take a harvest's motes, stalls it; an empty hand takes back its fed blocks. Placed where the harvest kind is not overworld, it refuses: it pops off as its item with what it holds. (#26)
  • Density, by item tag: #voidworks:density/1 to #voidworks:density/4 name the fed blocks (copper and coal, iron, redstone and lapis, gold and emerald, diamond and netherite storage blocks, raw blocks included); every other block is Density 0, which the Displacer's item face refuses. Its item capability takes fed blocks into the input and gives only from its output. (#26)
  • The displacement table, the voidworks:displacement data map on blocks (data/<namespace>/data_maps/block/displacement.json): what the Displacer's output gets for a terrain block by the fed block's Density, such as {"values": {"minecraft:iron_ore": {"4": {"id": "minecraft:raw_iron", "count": 3}}}}. A block or Density it does not name gives the terrain block itself. Voidworks ships no entries. (#26)
  • Voidstone networks: touching Voidstone is one network, a single pool of motes whose capacity grows by a fixed amount per Voidstone, and networks that come to touch merge. Every Voidstone provides the network's voidworks:motes, so VoidSpender.spend spends from it. (#26)
  • A server config, voidworks-server.toml, with the provisional numbers: zone (64 harvests), voidstoneCapacity (16 motes), harvestInterval (20 ticks) and densityMotes (1, 4, 16, 64). (#26)
  • /voidworks mote <pos> <grade> [count] puts motes into the network of the Voidstone at pos, as many as it has room for, or with no count fills it. (#26)
  • Dormant, for any void machine whose recipe costs motes, a Consumer's too: its block entity holds a Dormancy, calls soak(level) each server tick and works only once it returns true, and saves it with save and load. Its block adds Dormancy.DORMANT, true when placed and false once awake, for its look, and status() tells a player how much of the cost is paid. Dormant, it soaks its cost from every touching mote store (voidworks:motes) by the spend rule at its own block, and wakes once paid, for good; a partial payment is saved. (#34)
  • The Dormant cost, in void energy, is the voidworks:dormant_cost data map on blocks (data/<namespace>/data_maps/block/dormant_cost.json), such as {"values": {"voidworks:mutation_chamber": {"cost": 1600}}}. A block with no entry costs nothing. (#34)
  • soakInterval in voidworks-server.toml: ticks between a Dormant machine's soaks, 20 by default. (#34)
  • VoidSpender.spendUpTo(motes, level, pos, most) spends as much as a store's motes release where the spender stands, up to most, and is never refused; VoidEnergy.planUpTo is the same rule as plain logic. (#34)
  • The Void Siphon (voidworks:void_siphon; a ghast tear over crying obsidian over a blaze rod), harvesting by hand by the dimension's harvest kind and refusing where it is none. In the main hand, each use harvests once, aimed like placing a block, feeding the off hand's block of Density above 0 and yielding one Density step below a Displacer, never below 1 (1, 1, 4, 16), at one grade above the local Void Pressure; every harvest leaves Voidstone. end turns the fed block to Voidstone in the air aimed at; overworld swaps it with the natural block (#voidworks:overworld_terrain) aimed at, which comes back to the player; nether displaces a lava source into an empty bucket or another mod's fluid item from the inventory, and refuses with none. It holds motes in its voidworks:siphon_motes data component, keeping them wherever it goes, and VoidSiphonItem.heldMotes(stack) reads them; no block can charge or empty it. Standing on Voidstone, its holder charges every Siphon they carry from the network or empties it into it, as its voidworks:siphon_mode toggle (sneak-use) says, the highest grade first; set to empty and used on a Dormant machine, it pays what its motes can of the cost. (#28)
  • Dormant machines take payment from a Siphon: a machine's block entity now implements Dormancy.Holder, and Dormancy.payFrom(level, motes, from) pays what a mote store can of the rest of the cost, which the neighbours' soak uses too. (#28)
  • siphonCapacity (256 motes), siphonInterval (10 ticks) and siphonRate (8 motes) in voidworks-server.toml: what a Void Siphon holds, and how often and how much it charges or empties on Voidstone. (#28)
  • The Void Siphon and the Overworld Void Displacer are drawn from Malcolm Riley's unused textures (CC BY 4.0, credited in NOTICE): the Siphon as a wand of its recipe, the Displacer as a purple casing with an animated void flame on each side and a glowing eye on the top and bottom. (#39)
  • Voidstone is drawn from Malcolm Riley's unused textures too: obsidian sand in the Displacer casing's dark purples, tiling without seams. (#40)
  • The End Void Displacer (voidworks:end_void_displacer; end stone bricks on the corners, popped chorus fruit above and below a sticky piston, end rods beside it). It works only where the harvest kind is end, and places its fed blocks into the air touching it or its own Voidstone, nearest first, so its body grows outward; nothing comes back to its output. Its blockstate has facing, the way the player looked when placing it (down by default): it grows only into the space ahead of that face, so its other five faces are never walled in. Over the open void its harvests grade one step higher, and each Voidstone it leaves closes the column above it. It shares the Overworld Displacer's Zone, growth, Density, item face, stalling and end as Voidstone, and pops off as its item where the harvest kind is not end. It is placed Dormant, and Voidworks ships its cost in voidworks:dormant_cost: 6400 void energy, 64 motes one step above the pressure where it stands, so only grade 4 and 5 motes pay it at the End's default pressures. Its blockstate has dormant; it is unlit while Dormant, and an empty hand on it, with no fed blocks to take back, tells how much of its cost is paid. (#30)
  • zone and harvestInterval in voidworks-server.toml now count for every Void Displacer. (#30)
  • A Displacer takes back its fed blocks only for an empty main hand, so a Void Siphon used on a Dormant one pays it. One that can reach nothing before its first harvest now pops off on its first tick, before a Dormant one soaks any of its cost. (#30)
  • The End Void Displacer is drawn from Malcolm Riley's unused textures too (CC BY 4.0, credited in NOTICE): the Overworld Displacer's casing in end stone's yellows, bare but for its front face, the one it grows through, which carries the void flame, lit while it works and dark while it is Dormant. (#30)
  • Voidstone looks like the dimension it was placed in: its blockstate has kind, the harvest kind of that dimension, which every harvest sets. In the End it is drawn in the End Void Displacer's casing yellows; everywhere else it keeps the void's purples. It is still one block, voidworks:voidstone, and its networks join whatever it looks like. (#30)
  • Jade shows what a void block holds, when Jade is installed; Voidworks still runs without it (an optional dependency). Looking at Voidstone shows its network's motes by grade, tinted like their butterflies, and its total against its capacity; at any Dormant machine, a Consumer's Dormancy.Holder too, Dormancy.status(); at a Void Displacer, its fed block, the harvests left in its Zone, and what stalls it: a Void Pressure too high to grade, a network with no room, or a full output. Voidworks now nests libworks-runtime ([0.1.5,0.2)) by jar-in-jar, whose machine view the Displacer's and the Dormant one use, so players still install nothing more. From code, DisplacerBlockEntity.fed(), harvestsLeft() and stall(level) (a DisplacerBlockEntity.Stall) read the same, and DisplacerReport and NetworkReport are what Jade is sent. (#37)
  • The Nether Void Displacer (voidworks:nether_void_displacer; polished blackstone bricks on the corners, magma cream above and below a sticky piston, blaze rods beside it). It works only where the harvest kind is nether, and displaces the lava sources touching it or its own Voidstone, nearest first, one fed block each, so its body grows along a lava lake; flowing lava and anything past a solid block are out of its reach. Each source's bucket of lava goes into its internal tank of 16 buckets, which its fluid capability (Capabilities.Fluid.BLOCK, the same on every side) gives to any pipe or tank and never takes from; an empty bucket or another mod's fluid item used on it takes lava too. Nothing comes back to its item output, and lava still in its tank when it ends, as Voidstone or popping off, is lost. A full tank stalls it, and Jade says so: DisplacerBlockEntity.Stall has TANK_FULL. It shares the other Displacers' Zone, growth, Density, item face, stalling and end as Voidstone, and pops off as its item where the harvest kind is not nether. It is placed Dormant, with its cost in voidworks:dormant_cost: 6400 void energy, 32 Overworld motes carried down in a Void Siphon at the Nether's default pressure. Its blockstate has dormant, and it is unlit while Dormant. It is drawn from Malcolm Riley's unused textures (CC BY 4.0, credited in NOTICE): the Overworld Displacer's flame and eye in a casing of nether bricks' reds, the forge unlit while it is Dormant. (#29)
  • Voidstone in the Nether, where the harvest kind is nether, is drawn in the Nether Void Displacer's casing reds, as the End's is in its yellows. (#29)
  • Families, the ladders an upgrade climbs: the voidworks:family datapack registry (data/<namespace>/voidworks/family/<name>.json), each a list of Rungs, bottom first. The bottom Rung names only items, an item tag; every other names items, its result, count (1 unless set), cost in void energy and chance, and accepts its own result besides its tag. Voidworks ships metal_ingots, metal_nuggets, metal_blocks, raw_metals and raw_metal_blocks (copper → iron → gold), gems, dusts, hostile_drops and passive_drops, with a tag per Rung, #voidworks:rung/<family>/<rung>, that takes in the c: tag where one exists, so another mod's item joins a Rung by tag. Families.next(stack) gives an item's next upgrade, or nothing for an item only on top Rungs, in no Family, or where the Rungs that accept it differ in their next step, which loading warns of, naming the Families. (#35)
  • The Mutation Chamber (voidworks:mutation_chamber; amethyst shards around a smithing table, crying obsidian above and below it), which upgrades items up their Family for motes. It is placed Dormant, and Voidworks ships its cost in voidworks:dormant_cost: 1600 void energy, 16 Overworld motes. Awake, once every mutationInterval ticks (a new voidworks-server.toml entry, 20 by default) it takes the next Rung's count of what its input holds and spends the Rung's cost from the mote stores touching it together (voidworks:motes: Voidstone networks or a Consumer's machines), all or nothing, by the spend rule at its block, then rolls the Rung's chance: on success the items become one result in its output, and on failure they stay and the motes are spent. It waits, spending nothing, while the input holds fewer than the count, the output cannot take the result, or the stores touching it cannot afford the cost together. It has no screen: its item capability (Capabilities.Item.BLOCK, the same on every side) takes into the input only items with an upgrade and gives only from the output, so hoppers and belts feed and empty it. A hand holding an item puts it in, or is told it has no upgrade or that the input holds another; an empty hand takes the result, or with none takes back the input, or tells how much of a Dormant one's cost is paid; a Void Siphon set to empty pays it. Its blockstate has dormant, and it is unlit while Dormant. It breaks with a pickaxe, dropping itself and what it holds, and loses what it was paid toward its Dormant cost. It is drawn from vanilla's smithing table, with a crying obsidian top once awake, until it has art of its own. (#27)
  • What motes are worth, in void energy, where they would be spent, so a player can compare them with a cost: Voidstone in Jade adds "Worth N void energy here" for its network's motes at that block, and a Void Siphon's tooltip adds the same for its motes at its holder's feet. VoidEnergy.worth(motes, pressure) is the rule as plain logic, for any count type. A client learns its dimension's Void Pressure from the server, which sends each player their dimension's entry (PressurePayload, an optional payload) on joining, changing dimension, respawning and reloading, and forgets it on leaving; KnownPressure.here() reads it on the client. (#27)
  • Jade on a Dormant machine, a Consumer's Dormancy.Holder too, adds what the mote stores touching it are worth there together, a network touching it on several faces counted once, or that none touches it, so a player sees whether it will wake. TouchingMotes.at(level, pos) lists the mote stores touching a block, TouchingMotes.totalWorth(level, pos) what they are worth there together, and TouchingMotes.spend(level, pos, required) spends from them together. VoidSpender.spendTogether(stores, level, pos, required) is that spend from any distinct mote stores, all or nothing. VoidstoneMotes.network() is the network a Voidstone reaches now. (#27)
  • Jade on the Mutation Chamber, beside Jade's own view of what it holds: its next upgrade (count, result, cost and chance), what the mote stores touching it are worth together in void energy, and in green that it is upgrading or in red what stalls it: what it holds has no upgrade, it needs more items, its output cannot take the result, no mote store touches it, or together they are not worth the cost. From code, MutationChamberBlockEntity.next() and stall(level) (a MutationChamberBlockEntity.Stall) read the same, and ChamberReport is what Jade is sent. (#27)
  • The Void Crucible (voidworks:void_crucible; amethyst shards around a cauldron, crying obsidian above and below it), which upgrades items up their Family for free, slowly. It spends no motes and is never Dormant. It upgrades one result at a time by the Rung's count and never fails, the Rung's chance being the Mutation Chamber's alone. A result takes the Rung's void energy cost times crucibleTicks (a new voidworks-server.toml entry, 30 by default) at a Void Pressure of 3, the End's shipped pressure, halved for each step above it and doubled for each below: a 100-cost Rung takes 2.5 minutes in the End, 5 in the Overworld and 10 in the Nether. Working Crucibles within crucibleRadius blocks (another new entry, 8 by default) share one rate, each one's time multiplied by how many work there, itself included; an empty or stalled one does not count. What it has done belongs to what its input holds: emptied or given another item it starts again, and it waits, done, while its output cannot take the result. It progresses only while its chunk is loaded and keeps its progress across a save. Its item face and hand are the Mutation Chamber's, taking into the input only items with an upgrade. Jade shows its upgrade with its count and cost, its progress and the time left where it stands, how many working Crucibles share its rate, and what stalls it; CrucibleReport is what Jade is sent, and VoidCrucibleBlockEntity.progress(), ticksLeft(level), sharing(level) and stall() read the same. CrucibleTime is the time rule as plain logic. The result it works on, or waits with, done, floats above it, turning and bobbing, and VoidCrucibleBlockEntity.floating() reads it. Its look is a placeholder. (#46)

This mod has no additional files