Voidworks 0.1.1
Curse Maven Snippet
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 notoverworld, it refuses: it pops off as its item with what it holds. (#26) - Density, by item tag:
#voidworks:density/1to#voidworks:density/4name 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:displacementdata 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, soVoidSpender.spendspends from it. (#26) - A server config,
voidworks-server.toml, with the provisional numbers:zone(64 harvests),voidstoneCapacity(16 motes),harvestInterval(20 ticks) anddensityMotes(1, 4, 16, 64). (#26) /voidworks mote <pos> <grade> [count]puts motes into the network of the Voidstone atpos, 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, callssoak(level)each server tick and works only once it returns true, and saves it withsaveandload. Its block addsDormancy.DORMANT, true when placed and false once awake, for its look, andstatus()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_costdata 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) soakIntervalinvoidworks-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 tomost, and is never refused;VoidEnergy.planUpTois 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 isnone. 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.endturns the fed block to Voidstone in the air aimed at;overworldswaps it with the natural block (#voidworks:overworld_terrain) aimed at, which comes back to the player;netherdisplaces a lava source into an empty bucket or another mod's fluid item from the inventory, and refuses with none. It holds motes in itsvoidworks:siphon_motesdata component, keeping them wherever it goes, andVoidSiphonItem.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 itsvoidworks:siphon_modetoggle (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, andDormancy.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) andsiphonRate(8 motes) invoidworks-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 isend, 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 hasfacing, 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 notend. It is placed Dormant, and Voidworks ships its cost invoidworks: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 hasdormant; 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) zoneandharvestIntervalinvoidworks-server.tomlnow 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
optionaldependency). 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'sDormancy.Holdertoo,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()andstall(level)(aDisplacerBlockEntity.Stall) read the same, andDisplacerReportandNetworkReportare 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 isnether, 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.StallhasTANK_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 notnether. It is placed Dormant, with its cost invoidworks:dormant_cost: 6400 void energy, 32 Overworld motes carried down in a Void Siphon at the Nether's default pressure. Its blockstate hasdormant, and it is unlit while Dormant. It is drawn from Malcolm Riley's unused textures (CC BY 4.0, credited inNOTICE): 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:familydatapack registry (data/<namespace>/voidworks/family/<name>.json), each a list of Rungs, bottom first. The bottom Rung names onlyitems, an item tag; every other namesitems, itsresult,count(1 unless set),costin void energy andchance, and accepts its own result besides its tag. Voidworks shipsmetal_ingots,metal_nuggets,metal_blocks,raw_metalsandraw_metal_blocks(copper → iron → gold),gems,dusts,hostile_dropsandpassive_drops, with a tag per Rung,#voidworks:rung/<family>/<rung>, that takes in thec: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 invoidworks:dormant_cost: 1600 void energy, 16 Overworld motes. Awake, once everymutationIntervalticks (a newvoidworks-server.tomlentry, 20 by default) it takes the next Rung'scountof what its input holds and spends the Rung'scostfrom 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'schance: on success the items become oneresultin 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 hasdormant, 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.Holdertoo, 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, andTouchingMotes.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()andstall(level)(aMutationChamberBlockEntity.Stall) read the same, andChamberReportis 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 timescrucibleTicks(a newvoidworks-server.tomlentry, 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 withincrucibleRadiusblocks (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;CrucibleReportis what Jade is sent, andVoidCrucibleBlockEntity.progress(),ticksLeft(level),sharing(level)andstall()read the same.CrucibleTimeis the time rule as plain logic. The result it works on, or waits with, done, floats above it, turning and bobbing, andVoidCrucibleBlockEntity.floating()reads it. Its look is a placeholder. (#46)
This mod has no additional files