Blood Sweat and Gears: Behind the Scenes. [Packbuilding help/dev thread]


Too Much Free Time
Nov 9, 2012
Tartarus.. I mean at work. Same thing really.
So whats the deal?

Blood Sweat and Gears has been a pet project of mine over the last few years, which then evolved to have two key goals in mind;
  • Build an awesome modpack that suits my tastes.
  • Showcase a "Behind the Scenes" thread/guide which explains how the pack works.
The first point is self explanatory so I'll skip that for the more interesting one;
The idea for a 'behind the scenes' look at the pack came about when I was experimenting with CoFH's worldgen- pushing the limits of what I could do with the 'fractal' setting, and I realised I wanted more packs to have features like this. [C'mon- those giant crystals are pretty neat].

Also at the time, a few of other packbuilding tools lacked consistent documentation- which somewhat hindered progress since the syntax and examples provided would error out and fail. [Since then documentation has improved significantly]. This really hit home the usefulness of having a working example.

Finally I've been sniffing around the modding community for years; and picked up a fair bit about game design and concepts- something that rings true in modding and modpacking, especially since packs have grown a long way from 'a pile of mods which loads the start screen without crashing' to bespoke designed experiences -essentially games- in their own right

Why Here? Why Now?

The other option was a 'I just flunked at building a modpack- so here's everything I learned' thread. Originally I was going to finished/release the pack, then do the behind-the-scenes feature, but truth to be told I've bitten off more than I can chew and time is running against this.
With help, a release could happen before modded 1.14.x/1.15.x, but by that point it'll likely be far too late for the BTS thread to really serve its purpose. Without help? No chance.

Knowledge is wasted if you don't share it, and there'll be little point in sharing something like this for an outdated Minecraft version (if anything I've earned a boot up the arse for not doing this sooner).

Whats next?

I'll like to pick up Blood Sweat and Gears again. I've sunk too much into this to just give it up and want to see it come to fruition. As I said I've bitten off more than I can chew, so I'm looking for a helping hand to bring everything together.
As I carry on with BS&G I'll keep adding to this thread as I continue to learn.

Tools of the Trade
How to tame your modpack; a few bits and pieces you'll need to get yourself going.​
Not just for ores [CoFH worldgen]​
Recipes and you: How to change them
CraftTweaker mod family. Examples for Vanilla and some mods.​
Adding more to the game
Making your own blocks and items [ContentTweaker, Gregtech:CE]​
Making your own machines
Modular Machinery and how to build an entire pack out of one mod.

Oi! you got a loicence for that pack?...Mate?
Feel free to use any of my scripts here in your pack/project. However it'll be greatly appreciated if you ping a link back here. Thanks

Tools of the Trade
A toolbox full of hammers is still a toolbox full of tools...

The backbone of every modpack build. Allows you to install/change Forge in a heartbeat and provides a simple way for you to manage multiple Minecraft instances.​

Allows easy editing of the various config and scripting paraphernalia needed to keep everything running smoothly​

Zenscript syntax highlighter for Notepad++
Configuration file for Notepad to aid editing/creating .Zs (Zenscript) files (used by the CraftTweaker mod family).​

JSON formatter
A number of mods use the JSON script to define things [CoFH's worldgen]. Run your scripts through this formatter to check for syntax errors (missing brackets/colons/commas ect). As an added bonus it'll tidy and organise the script to make it more readable.​
This one lives in your web browser- so give it a tab of its own.

Even if its only for issue tracking, it'll be worthwhile setting one for your pack.​

A drive in the Cloud
Useful for keeping notes on the overall project. In addition I keep a separate list of any interesting mods/ideas I come across.
Keep a tab open on the Curseforge modlist.
[sorted by last updated]. Check daily if possible; you'll get the heads up on mod updates, and any new or unseen projects that could be useful/interesting.​

Graphics software (of some kind)
For creating textures of new blocks/items ect...
I use Adobe Flash CS5- which I won't recommend because its out of date, unsupported, and not widely available. Use whats comfortable/familiar to yourself.
If you looking for software, go for one that'll let you keep a 'library' of images in the programme, and let you manipulate those images (change colour tint/hue/darkness ect). I'm Sorry, but I can't help you out here (until Flash breaks properly and I have to find something better).

Archiving tool (such as 7zip or Winrar)
This one dates from the olden days when modding Minecraft involved opening the game's files and adding the mod(s) to it.
Useful for borrowing texture assets to base your own off. (some mods have open policy on their textures, if not then ask).​

Some good listening
Packbuilding can take a while and at times will get tedious, so rocking out to some tunes or listening in to a good story can make the process a lot less painful.​
Last edited:
  • Like
Reactions: buggirlexpres


Too Much Free Time
Nov 9, 2012
Tartarus.. I mean at work. Same thing really.
CoFH Worldgen- for more than just ores.

CoFH docs can be found here.

CoFH Wolrdgen works off the .JSON files located in .minecraft/config/cofh/world
You can have any number of files, which can be organised into their own folder and subfolders within the world folder.
Keeping the files organised is well worth doing- Blood Sweat and Gears has an individual file for each distribution, which are sorted into folders based off the dimensions they generate in;
.minecraft/config/cofh/world/overworld/rocks/giant crystals/Blue Crystal.JSON

To remove stock CoFH worldgen, open up the .JSON files and replace the script with
    "populate": {

A "generator" controls the structure at the block level; type of blocks generated, and the blocks they generate in, size/shape of the individual structure.

The "distribution" controls the structure at the world level; y level, overall size/shape, biome/dimension restrictions ect...

Each distribution contains either a generator, or an array of generators.
Using an array generator entries can produce variation within a structure/deposit, while using multiple distributions can produce variation between structures/deposits.

Useful commands, tips and tricks:

/cofhworld reload
Reloads the worldgen scripts without restarting the game. Any errors will be highlighted in the console log. Very useful for experimenting and tinkering with generated structures.

/cofh clearblock [player name] 100 100 100 [block type] Removes the named block in a 100x100x100 cube centered on the player. Useful for seeing how deposits look underground.

Exiting and entering a world will not reload the worldgen scripts.

In creative mode- a sprinting start will let you fly at 3x normal speed.

Its easier to generate structures above the ground when experimenting with size/shape. (set the "material" value to include "minecraft:air", and make sure the Y values are high enough).

When making slight adjustments- change one of the block types to a contrasting material (such as alternating between stone and netherrack) so you can easily see when changes take effect.

Creating fractal structures.
The fractal setting can clump the individual generators together to form a much larger structure.

Giant Crystals.
Majestic crystal spires that tower above the surroundings. Cave crystals from Quark work particularly well here. (Defaults to blue stained glass).
2018-02-03_18.50.50.png 2018-12-30_08.56.22.png

Basalt (/Obsidian) Dykes
Squat, angular towers which stick up a little above ground level. (Defaults to Obsidian). This distribution contains an array of different sized plate generators to make this structure appear more natural.
Towers of different height can be created through using multiple distributions with different 'vein-height' values. (Blood Sweat and Gears uses four).

Platinum Chandeliers
Elegant open structures hanging down from the sky. (Defaults to Stone and Gold Ore).
Originally used for platinum deposits in The End.
Note: The 'length' of this structure is controlled by the "cluster-count" and NOT the "vein-height" values.
Note 2: To make the stalactites stack off each other the "material" and "gen-body" values must include the blocks generated by the stalactites.

Titanium Towers
The opposite of the chandeliers, fractal stalagmites stack together to make a tiered structure. Using both stalactite and stalagmite generators will result in one generating above the other. (Defaults to Stone and Diamond ore)
Originally used for titanium deposits in the Dreadlands (AbyssalCraft)

Note: To make the stalagmites stack off each other the "material" and "gen-body" values must include the blocks generated by the stalactites.
Note 2: Even when the same generation values are used, the stalagmite structure will form wider than the stalactite one.
2018-12-30_13.49.07.png 2018-12-30_14.03.24.png

Spike Field
Creates a field of spikes which matches the surface morphology. (Defaults to Stone and Redstone Ore)
Originally used for Dreaded Ores in the Dreadlands (Abyssalcraft)
If you've got a cave world or a lot of overhangs then [in theory] a stalactite generator would work well too.

Adding a little spice to ore deposits
A few little pointers to help take your oregen away from the stock settings and into something a little more interesting (to be honest- digging a flat tunnel at a specific "y-level" gets pretty damn boring after a while);
Something I quite like doing (inspired by Gregtech) is making a gigantic ore deposit instead of multiple smaller ones. Finding one means you're set for quite a while, but they can be tricky to track down.
An alternative is to spread the ores across different biomes and dimensions; which greatly reduces the "randomness" of the materials grind, as once you've figured what surface features to look out for you can find areas you know are rich in a particular resource.

Using a filler block​
Unless you want an ore deposit to be 100% ore blocks; a filler block is needed. Essentially a 'non-ore' block that generates as part of the ore deposit. This doesn't have to be stone; marble, basalt, obsidian ect are all good stand-ins if you're willing to add some custom ore blocks to the game.

Of note here is the key difference between a filler block thats the same as the worldgen blocks or not. (by example using Minecraft:Stone in the Overworld, or Minecraft:Netherrack in the Nether).
If the filler block matches the background block, the generator entries can overlap and produce much higher densities of ore blocks than normal.
If the filler block is different to background, the generator entries can touch but not overlap.
Those examples used identical settings, other than changing the material array between 'air' and 'stone'

Digging through a deposit of just one ore block is well ...boring. So its time to mix it up by making different parts of the deposit contain different ores/amounts of ore.
In BS&G gold generates as a secondary deposit within quartz seams. (Defaults to Stone, Redstone, and Gold).
Almost all the BS&G ore deposits use this internal variation.
This is mostly controlled through the weighting of the generator array, however changing the generator type [plate/cluster/stalactite/geode ect], or setting the secondary ore to generate over the primary (add the primary ores to the secondary generator's "materials" array) also work well adding features to a deposit.
The evaporates deposit generates a horizontal band of secondary minerals using a plate generator set to override only the primary minerals (defaults to stone and vanilla ores).

(Defaults to Stone, Gold Ore, with an Iron Ore trace)
Spawns a handful of additional blocks on the surface- indicating the riches to be found underneath.
Note: This requires balancing the weighting values within the deposit to get the desired effect. Some experimenting may be required here (as will some basic mathematics).
Note 2: Adjusting the weighting of the trace generator (against the ore generators) will control how likely a trace is to be generated or the average number of traces per deposit.
Note 3: recommend adding some non-ore blocks to the trace, so only a handful of ore blocks are visible at the surface. (adjust the weighting within the trace's "block" array)

By example; the trace generator for copper deposits mostly replaces grass with grass, with a small amount (2%) gravel, and about 0.4% copper ore.

Want it to take on a different shape above the ground, or below the waterline?
Want to custom ore variations to generate into their different respective stone types?
(Defaults to Obsidian and Emerald Ore)
Use an array of generators to target specific blocks- such as the emerald/beryllium deposits (pictured) having a different shape above and below ground level, or the nickel deposits matching the desert sand colours.
Another idea could be to make a rock formation appear 'weathered' above the surface by replacing air/grass blocks with a "cobblestone", and dirt/stone with a "smoothstone"
Note: Individual generator structures will be truncated by changes in the block type they appear in, to create the illusion of a continuous formation those generator entries need to generate touching/overlapping each other.
Last edited:


Too Much Free Time
Nov 9, 2012
Tartarus.. I mean at work. Same thing really.
Changing the recipes; screwing over innocent players since 2003 :)

The CraftTweaker "mod family" (CraftTweaker, ModTweaker, ContentTweaker ect...) contains the tools you need to tweak Vanilla and modded recipes.
This is done through ZenScript(.Zs) scripts which go in the '.minecraft/scripts' folder. CraftTweaker can read from multiple files, and from within multiple subfolders.
I find it easiest to keep files organised by mod name and main function;
BS&Ga Botania Ore Dict.zs
BS&G Botania Material Processing.zs
BS&G Botania Materials.zs
BS&G Botania Ore Processing.zs
BS&G Botania Tools.zs
Which all go in a sub-folder 'recipes'

Remember: Files are read in alphabetical order. If you add recipes for an item in script "Alpha", and remove all recipes for it in script "Beta", then you'll remove those recipes in Alpha.

CraftTweaker docs found here.

  • The command /ct hand prints (displays) the ID/internal name of the held item/block and copies it to your clipboard in ZenScript formatting. It also displays any ore-dict values associated with the held item.
  • The command /ct syntax is your best friend here. No prizes for guessing what it does.
  • The ZenScript Highlighter may also be useful if you're using Notepad++

Using Items/Blocks in scripts.
First rule of Craft Club: Everything goes in <triangle brackets>

By Ore Dictionary
Ore dictionary name are case sensitive.
references the ore dictionary. Anything listed within the dictionary will be used- such as <ore:ingotCopper>.

By Internal Name
Internal names are all in lowercase.
'mod' is the mods internal name (such as tconstruct for Tinkers Construct or minecraft for to Vanilla MC).
Hold an item/block and use the command /ct hand. (this copies to your clipboard)
directly references an item/block- such as <minecraft:iron_ingot>.
If the item/block has metadata, a value of 0 is used. (<minecraft:wood_slab> referes to <minecraft:wood_slab:0>

directly references an item/block with metadata- such as <minecraft:wood_slab:4>

uses a wildcard to references all the metadata items under mod:name- such as <minecraft:wood_slab:*> hitting all the Vanilla wood slabs.

NBT data. NBT data is extra data added to a block/item to define additional properties/features. This appears after the item/blocks internal name.
NBT data is quite long, and generally makes scripts rather messy pile of 'dear God no';

<ic2:cable:2>.withTag({type: 2 as byte, insulation: 2 as byte})
<modularmachinery:itemblueprint>.withTag({dynamicmachine: "modularmachinery:autocrafter_advancediv"})
Sometimes NBT data can't be avoided, so copy and paste are good to keep around.

Multiple Items
Sometimes you'll want to input/output multiple of that item/block (like how crafting makes two planks);
<mod:item>*2, or <ore:typeMaterial>*2, or even <ore:typeMaterial>.firstItem*2
The multiplier goes after the input/output, but before any additional script/recipe function.

furnace.addRecipe(<ore:ingotGold>.firstItem*9 , <ore:blockGold>, 0.0);
furnace.addRecipe(<ore:dustRedstone>.firstItem, <minecraft:wooden_button>*2);

Fluids are referenced like so:
<liquid:name>*amount, such as <liquid:iron>*2000 or <liquid:water>*10000
With the amount being the volume of fluid in mili-buckets (mB).
(so 2 buckets of iron and 10 buckets of water in the above example)
Most mods typically register their fluids through Forge, so the source mod is not needed in the script.

Using the Ore Dictionary
Ore Dict docs found here.
The ore dictionary should be the top priority for a large project; as well managed ore dictionary and its proper use can save a tonne of pain and make life easier.

All about how
My life got flipped
turned upside down...

You know how Immersive Engineering adds 'Copper ore', and how Thermal Foundation adds 'Copper ore', and how IC2 adds 'Copper ore', and how Forestry adds 'Copper ore', and ...well you get the idea.
Each of these Copper ores are unique blocks with unique IDs, and the same with the Copper 'ingots' ect ect...

By default, a normal recipe will reference one ID per input and one per output. So Forestry's recipes would only take Forestry's Copper, and IC2 for IC2 ect...
As copper is well copper, it'll be a whole lot less annoying if any copper could work for any recipe; this is the job of the ore dictionary.
An ore-dict ID is a list of blocks/items, any which can be used in a recipe that references that ore-dict ID.

IC2 copper works with Thermal Foundation, and with Forestry.... And all three can take all the other types of copper at the same time.
...Aaaaand that how Equestria was made!

Ore dicting has a few neat advantages;
Like items can be used in the same recipe- so no more 50 shades of copper.
Your scripts will have human-readable names like <ore:ingotCopper> instead of <mod:ingot:7>.
Your scripts won't break if you remove/change a mod.** (if you reference a mod item directly, and later remove that mod then the script will break).​

**Note- as long as there is another entry in that ore-dict ID everything will be ok. If there isn't an entry just add one and carry on.

Ore-dicting ideally needs to happen before any other recipes are loaded; since scripts are loaded alphabetically sticking an extra 'a' in the title does the trick. Hence BS&Ga Botania Ore Dict.zs

One thing to be aware of:
Some mods allow player selected switching/unification of items/recipe outputs based off ore-dict IDs.
Meaning if a player can craft one item easily, and another listed in that ore-dict ID is more difficult to obtain (or more valuable in some way), then players might be able to craft the "easy" one into the difficult/valuable one.
Not saying it shouldn't be done, just saying to keep it in mind when adding arrays of items (like different coloured slime-balls) to ore-dict IDs.

Adding stuff to the Ore Dictionary:
If a particular ore dict ID doesn't exist, doing the script will simply magic it into existence and add the item/block to it.
(please don't do this. Its very childish).

Removing stuff from the Ore Dictionary:
If the last entry in an ore dict ID is removed, that ore dict ID will magically *poof* from existence. (Purple smoke not included. If you see purple smoke something went wrong and your computer might be on fire.)

Using stuff in the Ore Dictionary:
Ore dict IDs can be referenced directly in scripts (the same way as normal blocks/items) like so: <ore:typeMaterial>
[<ore:dustRedstone>, null, <ore:dustRedstone>],
[<ore:plankWood>, <ore:plankWood>, <ore:plankWood>],
[<ore:plankWood>, <ore:plankWood>, <ore:plankWood>]]);
So any combination vanilla (or modded) planks will work in this recipe.

Generally the ore-dict is designed for recipe inputs. Sticking <ore:trapdoorWood> as an output will cause your script to throw a hissy fit and sit in a corner sulking until you change it back. I guess this is something to do with recipes requiring a specific output, rather than a range of outputs.
Luckily there is a way around this;
[<ore:dustRedstone>, null, <ore:dustRedstone>],
[<ore:plankWood>, <ore:plankWood>, <ore:plankWood>],
[<ore:plankWood>, <ore:plankWood>, <ore:plankWood>]]);
Using <ore:trapdoorWood>.firstItem tells the recipe to use the first entry registered in that ore-dict ID. So your script can stop panicking and know which output to give.
The firstItem thingy is probably overkill for a lot of projects.

Vanilla Minecraft
Fun fact: This is Direwolf's favourite flavour of ice cream.

Crafting Table
Crafting Table docs found here.
Crafting table recipes come is 3 flavours; Shaped, Shapless, and Mirrored.
  • Shaped recipes requires items to be placed into specific slots. (armour/pistons/tools)
  • Shapeless recipes work in any slot (mixing dyes, repairing tools)
  • Mirrored recipes are shaped, but a 'mirror' (reverse) of the recipe also works. (hoe, observer)
--Removing a recipe:
To change a recipe; remove the original THEN add your new one. Adding a new recipe then removing the recipes will remove your recipe too.
Will remove all the crafting table recipes for the wooden pressure plate.

--Adding a Shaped recipe:
[<ore:dustRedstone>, null, <ore:dustRedstone>],
[<ore:plankWood>, <ore:plankWood>, <ore:plankWood>],
[<ore:plankWood>, <ore:plankWood>, <ore:plankWood>]]);
Use one array of items for each row of the crafting grid, and 'null' for an empty slot.
If a recipe does not use an entire row/column, then 'null' can be omitted- which allows the recipe to be crafted in any position within the crafting table.

--Adding a Shapeless recipe:
recipes.addShapeless(<minecraft:lever>, [<minecraft:redstone_torch>, <minecraft:cobblestone>]);

--Adding a Mirrored Recipe:
[<ore:dustRedstone>, <ore:plankWood>, <ore:plankWood>],
[null, <ore:plankWood>, <ore:plankWood>],
[<ore:dustRedstone, <ore:plankWood>, <ore:plankWood>]]);
With this recipe, it doesn't matter which side of the crafting grid the Redstone goes on. (will also mirror a recipe horizontally as well as vertically).

Furnace docs found here.
--Removing Smelting Recipes
Removes the easy smelting of charcoal.

--Adding Smelting Recipes
furnace.addRecipe(<output>, <input>, <exp vomit>);
Output and input can be blocks/items/ore dicts, with an optional multiplier.
[optional] Exp Vomit is the amount of experience orbs produced by the recipe. Note: This number is a 'double' meaning it can have a decimal point. Recipe defaults to 0exp if this value is omitted.
furnace.addRecipe(<ore:ingotGold>.firstItem*9 , <ore:blockGold>, 0.0);
furnace.addRecipe(<ore:dustRedstone>.firstItem, <minecraft:wooden_button>*2);
furnace.addRecipe(<minecraft:obsidian>, <minecraft:stone>, 5.4);
furnace.addRecipe(<ore:dustAsh>.firstItem*2, <ore:logWood>, 0.0);
furnace.addRecipe(<ore:dustAsh>.firstItem, <ore:plankWood>*2, 0.0);

Botania Docs found here.

Mana Infusion
Mana Infusion docs found here.
Mana infusion is carried out with just a mana pool
Mana transmutation requires the transmutation catalyst
Mana replication requires the conjuration catalyst

mods.botania.ManaInfusion.addInfusion(<output>, <input>, mana);
Remember charcoal generates 1200 mana in an endoflame.
mods.botania.ManaInfusion.addInfusion(<ore:ingotGold>.firstItem, <ore:oreGold>, 10);
Generates an infusion recipe to turn gold ore into gold.

Pure Daisy
Pure Daisy docs found here.
mods.botania.PureDaisy.addRecipe(<input>, <output>);
mods.botania.PureDaisy.addRecipe(<ore:oreDiamond>, <minecraft:diamond_ore>);
Converts all modded diamond ores into Vanilla diamond ore.

Gregtech CE docs found here.

Gregtech recipes are built a little differently;
While most mod's machines have defined input and output criteria, Gregtech's machines can have an array of items or fluids (or both!), for input and/or output, and some additional recipe modifers on top of that.

First you give you recipe a unique name (such as lazy_circuit) and select which machine you want to use.
val lazy_circuit as RecipeMap = RecipeMap.getByName("forming_press");

Then use the recipe builder to create the recipe:
    .inputs([<ore:plateCopper>, <ore:plateRubber>])
    .outputs(<ore:circuitBasic>.firstItem * 2)

Immersive Engineering
Immersive Engineering docs found here.

Arc Furnace
Arc Furnace docs found here.
Removing Recipes
Adding recipes
mods.immersiveengineering.ArcFurnace.addRecipe(<output>, <input>, <output byproduct>, time, power);
Time is the processing time in ticks(t)
Power is the power usage in Rf/t
mods.immersiveengineering.ArcFurnace.addRecipe(<ore:ingotAluminium>.firstItem*1, <ore:oreLapis>, <ore:itemSlagRich>.firstItem*4, 2000, 2048);
mods.immersiveengineering.ArcFurnace.addRecipe(<ore:ingotTin>.firstItem*4, <ore:oreCassiterite>, <ore:itemSlagRich>.firstItem*10, 2000, 2048);

Blast Furnace
Blast Furnace docs found here.

Adding recipes
mods.immersiveengineering.BlastFurnace.addRecipe(<output>, <input>, time, <output byproduct>);
Time is the processing time in ticks(t).
The byproduct is typically slag, but can be anything. (optional)

mods.immersiveengineering.BlastFurnace.addRecipe(<ore:ingotInvar>.firstItem, <ore:dustInvar>, 2000);
mods.immersiveengineering.BlastFurnace.addRecipe(<ore:ingotSteel>.firstItem*9, <ore:blockIron>, 10000, <ore:itemSlag>.firstItem*9);

Crusher docs found here.
Removing Recipes:

Adding recipes
mods.immersiveengineering.Crusher.addRecipe(<output>, <input>, energy, <byproduct output>, byproduct chance);
Energy is the total Rf used in the recipe
Byproduct chance is a 'double'.

Adding a byproduct is optional.
mods.immersiveengineering.Crusher.addRecipe(<minecraft:gravel>, <ore:blockStone>, 4096, <minecraft:flint>, 0.9);

Thaumcraft Docs found here.

Crucible (Alchemy)
Crucibe docs found here.

Adding recipes:
mods.thaumcraft.Crucible.registerRecipe("recipeName", "research", <output>, <input>, [aspect array]);

recipeName is a unique name for the recipe.
Research provides the option to lock a recipe behind a particular research in the Thaumonomicon (do-doo-dee-dodo). Leave a pair of empty makes like so: "" if you do not want a reseach gate.
The aspect array is the list of aspects needed in the recipe.

mods.thaumcraft.Crucible.registerRecipe("oreMalachite", "METALPURIFICATION", <ore:clusterCopper>.firstItem, <ore:crushedPurifiedMalachite>, [<aspect:metallum>*15, <aspect:permutatio>*5]);
mods.thaumcraft.Crucible.registerRecipe("oreTetrahedrite", "METALPURIFICATION", <ore:clusterCopper>.firstItem, <ore:crushedPurifiedTetrahedrite>, [<aspect:metallum>*15, <aspect:permutatio>*7]);
Right now all I have is Thaumic processing of Gregtech ore.
Last edited:
  • Like
Reactions: buggirlexpres


Too Much Free Time
Nov 9, 2012
Tartarus.. I mean at work. Same thing really.
Custom ores that glow in the dark? How about some new decorative blocks? Or maybe you just enjoy torturing your players with excessive numbers of intermediate crafting steps?

Adding new blocks and items to the game with ContentTweaker.
ContentTweaker docs can be found here.
ContentTweaker is a member of the CraftTweaker 'mod family' and reads the Zenscript (.zs) files located in .minecraft/scripts/[filename/folder].
ContentTweaker can read nested folders/files, so it'll be worthwhile keeping everything organised- such as separate folders for blocks, items, and recipes.
You can also have multiple blocks/items defined in a single file- its useful to keep like items/blocks together.

In addition ContentTweaker also makes use of the resources folder for localization (display names) and textures;
.minecraft/resources/contentweaker/(blockstates, lang, models, sounds, textures)

Remember you'll need to restart the game for any changes to take effect.

Adding new blocks
Blocks are added using Zenscript (.zs) files, which go into the .minecraft/scripts folder.

Always start your script with #loader contenttweaker, and import the ContentTweaker functions;
#loader contenttweaker

import mods.contenttweaker.VanillaFactory;
import mods.contenttweaker.Block;
Remember scripts for adding blocks/items can't be used for adding/changing recipes.

Defining the new block:
var BlockName = VanillaFactory.createBlock("internalname", <blockmaterial:rock>);

BlockName is just a name (named variable) that the script uses to assign the block's properties. The list of block materials can be found here.

"internalname" is the internal name (string) that the game uses to identify the block. ContentTweaker also uses this as the default for defining the block's textures.
All blocks/items added by ContentTweaker can be referenced by contenttweaker:internalname when using CraftTweaker scripts.

Both BlockName and internalname must be unique values, and internalname must be in lowercase. (Capitalisation being a good method to differentiate the two).

blockmaterial is the material type (rock/dirt ect) the block is made of.

Defining the block's properties:
The blocks hardness (mining speed), blast resistance, tool type ect are all define under 'properties'.
Note some properties are required, while others are optional.

#loader contenttweaker

import mods.contenttweaker.VanillaFactory;
import mods.contenttweaker.Block;

var Dolomite = VanillaFactory.createBlock("dolomite", <blockmaterial:rock>);
The last line for each block will always be to register that block. You can define multiple blocks in a single script if you want. (useful for similar block- such as ore varients, or different designs of chiselled stone)

ToolLevel is the mining level. Vanilla default is 0-3, but you can use any integer- so setting it to 7 will only allow level 7 (or higher!) tools to successfully mine the block.
Slipperiness has some ...interesting side effects. 0.6 is normal for most blocks, other values are worth experimenting with.

Adding the textures
Everything texture related goes in .minecraft/resources/contenttweaker
Texture related scripts use the .JSON (NOT the Zenscript).

So you've got the block defined. Time to boot up the game and see what happens right?
Well it looks pretty hideous as it doesn't have a texture yet, but if everything worked ok ContentTweaker should of automagically created some scripts to help us out;

First go to .minecraft/resources/contentweaker/blockstates
You'll find a list of .JSON files for every block, named after their internal names. This defines where the textures images are found.
  "forge_marker": 1,
  "defaults": {
    "textures": {
      "texture": "contenttweaker:blocks/dolomite",
      "particle": "contenttweaker:blocks/dolomite"
    "model": "base:storage",
    "uvlock": true,
    "transform": "forge:default-block"
  "variants": {
    "normal": [{}],
    "inventory": [{}]

By default textures are given the blocks internal name, and go into .minecraft/resources/contenttweaker/textures/blocks/internalname
Changing the filepath defined in the blockstate .JSON will allow you to use a different texture name, and/or sort textures into sub-folders.

By default a block is given the same texture on each side. If you want different sided textures you can do this. Make sure you texture files (.PNG) match the file path defined in the .JSON

Giving it a name
Finally giving the block a proper display name. Go to .minecraft/resources/contenttweaker/lang.

Open up the en_us.lang file and add the following;
All the blocks and items are named in this .lang file- so it'll be wise to keep them in alphabetical order (by internal name) otherwise you'll end up with a mess.

Adding new items
Items are added using Zenscript (.zs) files, which go into the .minecraft/scripts folder.
Adding a new item is similar to adding a new block; items are defined like so:
Remember scripts for adding blocks/items can't be used for adding/changing recipes.

#loader contenttweaker

import mods.contenttweaker.VanillaFactory;
import mods.contenttweaker.Item;
import mods.contenttweaker.IItemRightClick;
import mods.contenttweaker.Commands;

var CoilLV = VanillaFactory.createItem("coillv");

The last line for each item will always be to register that item, but since you dont have to define any properties most items simply require two lines. You can define multiple items in a script like this.

Giving items a texture.
Everything texture related goes in .minecraft/resources/contenttweaker
Texture related scripts use the .JSON (NOT the Zenscript).

Like with blocks, ContentTweaker will automatically generate the texture scripts when you load the game;
Go to .minecraft/resources/contenttweaker/models/items and you'll find a list of .JSON files for every item, named after their internal names. This .JSON defines where the textures images are found.

  "parent": "item/generated",
  "textures": {
    "layer0": "contenttweaker:items/coillv"
As with blocks, the texture path defaults to the item's internal name, and you can change this to anything you like.
Your texture files (.PNG images) go into .minecraft/resources/contenttweaker/textures/items.

Naming your item
Finally giving the item a proper display name. Go to .minecraft/resources/contenttweaker/lang.

Open up the en_us.lang file and add the following;
Code: Voltage Coil
All the blocks and items are defined in this .lang file- so it'll be wise to keep them in alphabetical order (by internal name) otherwise you'll end up with a mess.

Adding new blocks/items with the Gregtech Material Builder.
The Gregtech material builder is a CraftTweaker tool designed to automatically create sets of blocks, items, and tools with recipes included in the mix. If you're playing/building a pack with Gregtech then this tool will be very useful.
Requires Gregtech: Community Edition
Material Builder docs can be found here.

Scripts for the material builder go .minecraft/scripts, and use the Zenscript (.zs) format.
All Material Builder scripts start with #loader gregtech (so the script loads first), and calling up the Gregtech packages.
Remember scripts for adding blocks/items can't be used for adding/changing recipes.
#loader gregtech

import mods.gregtech.material.MaterialRegistry;
import mods.gregtech.recipe.RecipeMap;

Each Gregtech material is assigned a numerical ID (from 000-999); much like the old block-IDs from early Minecraft versions this is limited one ID per material, and 000-500 are reserved for stock Gregtech Materials.
This ID is used to generate the internal names for the items added by the material builder.

Adding a new material
First thing to do is define the material- like so
val ingotTest= MaterialRegistry.createIngotMaterial(602, "test", 0xFF4C00, "dull", 4, null, 3.5, 128, 1800);
  • val ingotTest is the name (string) assigned to this material, you'll use it in your script to specify additional properties/items/blocks
  • MaterialRegistry.createIngotMaterial tells Gregtech what material type this is (dust, ingot, gemstone, or fluid). This will automatically generate a few items depending on whats selected. (an ingotMaterial will have an ingot [Duh!], dust, small dust, tiny dust, and liquid form generated by default).
  • 602 is the material ID. This is unique to this material. Used for generating items.
  • "test" is the internal name. This is unique to this material. Used for generating ore dictionary tags and the internal names of blocks.
  • 0xFF4C00 is the base colour of the material, as a 6 figure RGB hexadecimal number.
  • "dull" is the iconset used. (decided what the item textures looks like)
  • 4 is the mining level (of this material's ores/blocks/tools)
  • null is for an optional array of materials. (See adding a chemical formula).
  • 3.5 is the mining speed of the tools
  • 128 is tool durability. Set to 0 to skip generating tools.
  • 1800 optional value for blast furnace temperature. Less then 1000 is smeltable in the primitative blast furnace. Greater than 1700 generates a 'hot ingot' and a vacuum freezer recipe.
Naming the material
Materials need be given a display name in a .lang file, otherwise you'll end up with something horrible like material.test Ingot appearing as the ingot item name.
Go to .minecraft/resources/gregtech/lang and create a file called en_us.lang
Materials can be named like this;
This'll automatically names all of the generated components from that material type.

Adding more components/blocks/recipes ect...
You can specify additional items/blocks/recipes (such as plates, gears, ores) to be generated out of each material type- this is called adding 'flags'.
Some of these generate a single item (plate and rod) while others (ore) generate a number (ore blocks for most stone types, crushed, washed, pure/impure dusts ect) and all the processing recipes to match.
The docs have a full list of flags

Creating Wires and Fluid Pipes.
The material can also be made into functional wires (for Gtech Eu) and fluid pipes;
ingotTest.setCableProperties(512, 1, 1);
Cable properties are Max Voltage (Eu), Max Current (Amps), Energy Loss (Eu/Amp/Block)
(Max current is for a single core cable; multicore cables take 2x/4x/8x/16x this value).
(Energy loss is for insulated cables; uninsulated wires automatically have a 2x/3x loss).
ingotTest.setFluidPipeProperties(2000, 5000, true);
Pipe properties are Throughput (mB/t), Max Temperature (°K), Gas Proof (true/false)
(Throughput is for a tiny pipe. Small/Medium/Large pipes have 2x/4x/8x this throughput).

Adding Enchantments.
If you add an enchantment to a material, any tool/weapon crafted from this material will have them automatically applied;
ingotTest.addToolEnchantment(<enchantment:minecraft:smite> * 4);
ingotTest.addToolEnchantment(<enchantment:minecraft:fortune> * 3);
So tools/weapons made out of test will always have Smite IV and Fortune III.

Adding Chemical Formula
Gregtech can generate a chemical formula for a given material, and display it as a tooltip under the material item name. This is made with an array of existing material types in material generator;
This will also generate an electrolzyer recipe to produce the component materials from your new one.
(If you do NOT want a chemical formula, leave this array as null).
val ingotsignalum = MaterialRegistry.createIngotMaterial(612, "signalum", 0xF6872E, "shiny", 1, [<material:copper>*3, <material:silver>*1, <material:redstone>*9], 3.5, 0, 4500);
Any previously added material can be used- including your own; however keep in mind;
  • You cannot add new elements to the builder. (you'll have to make your own Gtech add-on mod if you want them)
  • You can nest as many chemical formulae as you wish. (I tried to find the upper limit and got the tooltip to cover half the screen!)
  • If a component material lacks a chemical formula/element, the new chemical formula tooltip will have a blank space in it (electrolyzer recipes will still work as normal).
  • Electrolyzer recipes default to 120Eu/t, unless Tungsten is a component material- then its defaults to a higher value.
Modifying an existing material
Need to add components to an existing material?
(note- you can only add features to an existing material, you can't remove stock features)
var copper = <material:copper>;

var titanium = <material:titanium>;
So this generates Copper rings, and a full set of ores for Titanium. (and have every hardcore Gregtech player baying for my blood)

You can rename an existing material too; go the the lang file in .minecraft/resources/gregtech/lang and add;
material.titanium=Fancy Purple Metal

Which will rename all the Titanium components to 'Fancy Purple Metal'
(This example isn't something you'll see in the pack)

Hints and tips
For the ingotMaterial tools; the tool heads are crafted out of plates and rods. You'll need to generate these items too.
Last edited:
  • Like
Reactions: buggirlexpres


Too Much Free Time
Nov 9, 2012
Tartarus.. I mean at work. Same thing really.
Modular Machinery.
Modular Machinery docs found here.
Sometimes you pack needs a machine to do XYZ, so your endlessly scrolling through CurseForge (or rummaging through rival packs like a chump) and either can't find it, or you get a mod that does wXYZaCBBQuack$%! giving the feature you want with a tonne of bloat.
Enter: The Modular Machine.​

With MM you can make a multiblock machine out of any blocks you choose, and give it any set of recipes you like. Meaning your pack can go just about ...anywhere really.

Now Modular Machinery runs of the power of JSON; which -for the uninitiated- is JavaScript Object Notion or JSON for short and now I sound like James May. (The Grand Tour Season 3- very good distraction).

Ok, so lets build a machine!
(literally- the first step is to build it in-world. And Yes that IS a Nether portal! ...well you can use any block you want.)
And yes- the default MM colour is bright orange- this can be configured per machine.

Of note- your machine structure will need to include a 'Machine Controller' and some various input/outblock blocks for power/fluids/items.
The Machine Controller is the keystone that'll read the 'blueprint' and form the multiblock.
Input/Output blocks do exactly what it says on the tin.
MM also provides some aesthetic casing blocks too.

Convert the machine structure to JSON
Next up- hit it with the 'Construction Selection Tool' (right click or shift-right-click)
Do the Controller Block last.
The Selection Tool will remember what blocks are selected, you can saftely place/remove other blocks while doing this without loosing progress.
You can dis-select a block by (shift)right clicking again.

When you're happy with the selection: shift-right-click the controller to save your selection to a "machine file"
(this also clears the selection tool).

Firstly- give the file a sensible name; Denizen Communicus and open it up to reveal a parts list.
You'll see each block you hit has been given a set of coordinates relative to the controller, and a description of each block type.

Next up is to refine the block entries a little. Any NBT data will be exactly matched by the machine blueprint- which causes problems when the player assembles the structure facing a west (instead of north) and the orientation data of the blocks no longer match internally while everything looks right externally.
            "x": 1,
            "y": 0,
            "z": 0,
            "nbt": {"casingColor":"16730368","id":"minecraft:tilecolorablemachinecomponent"},
            "elements": [
            "x": -1,
            "y": 0,
            "z": 2,
            "nbt": {"busSize":"3","casingColor":"16730368","id":"minecraft:tileiteminputbus","inventory":{"inventoryArray":[{"holderEmpty":"1b","holderId":"0"},{"holderEmpty":"1b","holderId":"1"},{"holderEmpty":"1b","holderId":"2"},{"holderEmpty":"1b","holderId":"3"},{"holderEmpty":"1b","holderId":"4"},{"holderEmpty":"1b","holderId":"5"},{"holderEmpty":"1b","holderId":"6"},{"holderEmpty":"1b","holderId":"7"},{"holderEmpty":"1b","holderId":"8"}],"outSlots":,"miscSlots":,"inSlots":,"sides":}},
            "elements": [

            "x": 1,
            "y": 0,
            "z": 0,
            "elements": [
            "x": -1,
            "y": 0,
            "z": 2,
            "elements": [

And repeat for the entire script. (check your syntax in the JSON checker)

Turn it into a Machine!
After refining the parts list its time to get it working.
This goes at the top of the parts list.
   "localizedname":"Denizen Communicus",
Check your syntax again and the full script should look like this.

The registry name MUST be unique, or bad things happen.
Localized name is the name that appears in NEI
Blueprints are good- so set this to true.
Color is the colour of the MM blocks. This is a RGB hexidecimal value (in this case a fairly good match for obsidian)
And parts are the parts list. This bit isn't new.

Restart Minecraft and log back into your world. If everything worked they'll be a new shiny waiting for you in JEI.
Is that a blueprint in your pants or are you happy to see me?

Put that blueprint in the machine controller and some magic happens:

Try viewing the 'recipes' for the blueprint- nice view right?
You'll also notice the lack of a crafting recipe for the blueprint- add it yourself with CraftTweaker.

Viewing the 'uses' for the blueprint however is a different story. (Spoiler Alert!! Ned Stark dies in Game of Thrones. There aren't any recipes. Time to add them).

Adding recipes with Modular Machinery:
MM can build its own recipes in .JSON
Recipes go in .minecraft/config/modularmachinary/recipes and can be places in nested folders as needed. (one folder per machine recommended)
Note: A limitation of .JSON means one recipe per .JSON file!

Machine is the machine's registry name
registryName is the recipe's registry name, and MUST be unique for all MM recipes.
recipeTime in ticks(t)
requirements define is inputs needed to produce the desired output.
Energy is power use(/generation) Rf/t (or FE/t- they're both the same).
Remember- an energy input is the minimum power requirement; if a machine runs out of power it'll reset its progress.
As many inputs and outputs as you want can be defined here.
Item outputs automatically read the ore dictionary too!​

Check your recipe in the syntax checker and you're good to go!

Adding recipes with CraftTweaker:
MM also has CraftTweaker support- so ZenScript recipes in the usual folders.
You can define multiple recipes in a file here.

Much like the Gregtech Recipe builder: Select your machine like so:
val CommunicusGhastTears = mods.modularmachinery.RecipeBuilder.newBuilder("cttestrecipe", "denizen_communicus", 200, 0);
CommunicusGhastTears is just a case sensitive reference for the script. Must be unique.
cttestrecipe is the recipe's registry name- this MUST be unique for all recipes.
denizen_communicus is the machine's registry name.
200 is the recipe time in ticks(t)
The extra 0 is the sorting priority.

Then build the recipe itself:
CommunicusGhastTears.addItemOutput(<ore:dustGunpowder>, 13);;

Important on defining multiples of items:
  • referencing an item/block directly is done with a * like normal.
  • referencing an ore dictionary is done with a comma and the multiplier.
(Do NOT ask me why; I don't know).

Check your syntax with /ct syntax, and if all is good restart MC to check out the working machine.
The Denizen Communicus; not quite a deal with the devil...

Few things to note (time to get creative):
There is no limit on the number of item/fluid/energy inputs/outputs.
You don't have to have an energy input- using a fluid input you can make 'steam driven' machines.
Combine this with ContentTweaker if you dare! (actually you could build an entire pack out of two mods like this)
Last edited:
  • Like
Reactions: buggirlexpres


Too Much Free Time
Nov 9, 2012
Tartarus.. I mean at work. Same thing really.
[and one more for luck].

Random Ideas I have kicking around.
Generally a good idea to have a notepad kicking around where you can jot down interesting stuff;

Forestry peat- makes dirt as a byproduct; good for skyblocks?

Natura Respawn Obelisk- allows setting of player spawn without a bed

Interesting Natura stuff to automate
Natura Fusewood- explosion when harvested
Natura Bloodwood- grows upside down

Thermal Expansion
Cobblegen machine can make granite/diorite ect, can be a progress gate if diorate ect were removed from worldgen.

No such thing as too many explosions- though automating the blasting of ore blocks would prove an interesting challenge.

Fluid ores
(inspired by CoFH Cathrates), ore block places a liquid block when broken. Like ice breaking into water, but useful.
Last edited:
  • Like
Reactions: buggirlexpres


Well-Known Member
Jan 2, 2016
What kind of help do you need with the pack? I might be able to do something for you, I have a decent amount of experience with pack making.
  • Like
Reactions: Celestialphoenix


Trusted User
Nov 11, 2012
CoFH Worldgen- for more than just ores.

Creating fractal structures.
The fractal setting can clump the individual generators together to form a much larger structure.

Giant Crystals.
Majestic crystal spires that tower above the surroundings. Cave crystals from Quark work particularly well here. (Defaults to blue stained glass).
View attachment 37004 View attachment 37006 View attachment 37005

Basalt (/Obsidian) Dykes
Squat, angular towers which stick up a little above ground level. (Defaults to Obsidian). Using multiple plate generators of different sizes makes this structure appear more natural.
Towers of different height are possible through using multiple distributions with different 'vein-height' values. (Blood Sweat and Gears uses four).

View attachment 37007
Always love creative worldgen. Thought I'd try them out with different textures in my modpack:


Crystal Spires as "Super Alien Spires" (my pack uses Ruins mod to generate alien bug nest/spires around, so I thought what would these crystals look like as super nests?)
2018-12-30_11.45.19.jpg 2018-12-30_11.51.54.jpg


Too Much Free Time
Nov 9, 2012
Tartarus.. I mean at work. Same thing really.
What kind of help do you need with the pack? I might be able to do something for you, I have a decent amount of experience with pack making.

Thanks for the offer.
On the outset it looks like a lot of CraftTweakering and bit of the worldgen to finish. Really what I need to do is get the project better organised for working as a team, otherwise we'll likely end up tripping over each other or implementing the same feature twice.
I guess first and foremost; what would yourself/others prefer for talking/discussing ideas? (forum PMs/Discord/Teamspeak ect...)


Trusted User
Nov 11, 2012
Thanks for the offer.
On the outset it looks like a lot of CraftTweakering and bit of the worldgen to finish. Really what I need to do is get the project better organised for working as a team, otherwise we'll likely end up tripping over each other or implementing the same feature twice.
I guess first and foremost; what would yourself/others prefer for talking/discussing ideas? (forum PMs/Discord/Teamspeak ect...)
Discord seems to work well. I'd never used it, but gave it a try, and it really helps.

Happy to assist too, even just to bounce ideas/problems off.
  • Like
Reactions: Celestialphoenix