Skip to content

1.16.5 3.3.0

TwistedGate edited this page Jun 5, 2023 · 1 revision

Content Table


Config

There are a number of values a modpack developer can tweak to balance Immersive Petroleum with their pack.

D:reservoir_chance
Default chance for a fluid reservoir of some type to spawn. Lowering this makes oil far more valuable.

I:pumpjack_consumption
Default flux / tick cost of the Pumpjack. This is a major balancing point, see below spreadsheet.

I:pumpjack_speed
How many mB of fluid is extracted every tick by a single Pumpjack.

B:req_pipes
Whether the player must build pipes down to bedrock to use the Pumpjack. Recommended to keep disabled but may prove useful in hardcore packs.

D:distillationTower_energyModifier
Default cost of the Distillation Tower is 2048 flux / operation. Increasing this number to 2.0 will double the flux cost, halving it will half the flux cost.

D:distillationTower_timeModifier
Not super useful, but lets you make each operation in the Distillation Tower take longer if it is increased.

I highly suggest developers that want to go "into the weeds" of balance copy and edit one of the Spreadsheets below which will automatically calculate net power production, reservoir drain time, and more.

Spreadsheets


DataPack

DataPack (or JSON) is pretty straight forward, a lot can be figured out by just looking at how Immersive Petroleum's own data is stored.
However, i am still going to write down what every part of the json means and how that changes the behavior.

Distillation

Even if there is currently just one, it is still good to know how the system works.

byproducts: Is an array of items that each have their own chance (0.0 to 1.0) of being spit out the backport while the main process is happening.

results: Is an array of the of the fluids the distillation results in, with fluid being the liquid that gets produced with an amount telling how much of it.

input: Is simply the fluid that is being distilled into its components and used up in the process by amount per operation.

time: The amount of time in ticks it takes until the input has been processed.

energy: The minimum power per tick required.

Example

Oil cracking recipe used by Immersive Petroleum.
Path: data/immersivepetroleum/recipes/distillationtower/oilcracking.json

{
  "type": "immersivepetroleum:distillation",
  "byproducts": [
    {
      "item": "immersivepetroleum:bitumen",
      "chance": "0.07"
    }
  ],
  "results": [
    {
      "fluid": "immersivepetroleum:lubricant",
      "amount": 9
    },
    {
      "fluid": "immersivepetroleum:diesel_sulfur",
      "amount": 14
    },
    {
      "fluid": "immersivepetroleum:gasoline",
      "amount": 39
    }
  ],
  "input": {
    "tag": "forge:crude_oil",
    "amount": 75
  },
  "time": 1,
  "energy": 2048
}

Coker

result: Primary output. (Item)

resultfluid: Secondary output. (FluidTag)

input: Primary input. (ItemTag)

inputfluid: Secondary input. (FluidTag)

time: The amount of time in ticks it takes until the input has been processed.

energy: The minimum power per tick required.

Example

Coker recipe used by Immersive Petroleum.
Path: data/immersivepetroleum/recipes/coking/petcoke.json

{
  "type": "immersivepetroleum:coker",
  "result": {
    "item": "immersivepetroleum:petcoke"
  },
  "resultfluid": {
    "tag": "forge:diesel_sulfur",
    "amount": 27
  },
  "input": {
    "count": 2,
    "base_ingredient": {
      "tag": "forge:bitumen"
    }
  },
  "inputfluid": {
    "tag": "minecraft:water",
    "amount": 125
  },
  "time": 30,
  "energy": 1024
}

Sulfur Recovery Unit

result: Primary output. (Fluid)

input: Primary input. (FluidTag)

secondary_input: Secondary input. (FluidTag)

secondary_result: Secondary output. (Fluid)

time: The amount of time in ticks it takes until the input has been processed.

energy: The minimum power per tick required.

Example

SRU recipe used by Immersive Petroleum.
Path: data/immersivepetroleum/recipes/hydrotreater/sulfur_recovery.json

{
  "type": "immersivepetroleum:hydrotreater",
  "time": 1,
  "energy": 512,
  "result": {
    "fluid": "immersivepetroleum:diesel",
    "amount": 7
  },
  "input": {
    "tag": "forge:diesel_sulfur",
    "amount": 7
  },
  "secondary_input": {
    "tag": "minecraft:water",
    "amount": 7
  },
  "secondary_result": {
    "item": "immersiveengineering:dust_sulfur",
    "chance": "0.02"
  }
}

Flarestack

Just uses FluidTags to see if can burn a fluid. Thats it realy.

Simply add a FluidTag into the values array.

Example

Used by Immersive Petroleum.
Path: data/immersivepetroleum/tags/fluids/burnable_in_flarestack.json

{
  "replace": false,
  "values": [
    "#forge:lubricant",
    "#forge:diesel",
    "#forge:diesel_sulfur",
    "#forge:gasoline",
    "#forge:plantoil",
    "#forge:creosote",
    "#forge:ethanol"
  ]
}

Fluid Reservoirs

type: Should always be immersivepetroleum:reservoirs.

name: Display name for this reservoir type.
The base reservoirs are lowercase as they are translated - custom ones should be properly capitalized (ex. "Deep Ocean Oil Reservoir").

fluid: The internal ID of the fluid that should be used.
(ex. "water", "lava", "oil", "ethanol", "concrete")

fluidminimum/fluidcapacity: Any number >= 0.
Fluid capacity must be larger or equal to min. Linear distribution of reservoir sizes between these two numbers.

fluidtrace
Certain reservoir types can still be used after they're empty, such as Oil Reservoirs or Aquifers in base Immersive Petroleum.
0 here represents a finite reservoir. This value must be less than or equal to the I:pumpjack_speed config.

weight
Used in a weighted random calculation with the weights of other valid reservoirs. If this is the only valid reservoir, it must spawn.

Dimension Whitelist/Blacklist
List of Dimension IDs.

Biome Whitelist/Blacklist
List of Biome IDs.

Important Note: A reservoir with a whitelist does not use its blacklist. That goes for both, the Dimension and the Biome list.

Example

Oil reservoir used by Immersive Petroleum.
Path: data/immersivepetroleum/recipes/reservoirs/oil.json

{
  "type": "immersivepetroleum:reservoirs",
  "fluid": "immersivepetroleum:oil",
  "fluidminimum": 2500000,
  "fluidcapacity": 15000000,
  "fluidtrace": 6,
  "weight": 40,
  "dimension": {
    "whitelist": [],
    "blacklist": [
      "minecraft:the_end"
    ]
  },
  "biome": {
    "whitelist": [],
    "blacklist": []
  },
  "name": "oil"
}

CraftTweaker

Everything related to that can be found below.

Distillation

remove

Name Type
name String

Example:

// mods.immersivepetroleum.DistillationTower.remove(String name);

mods.immersivepetroleum.DistillationTower.remove("oilcracking");

removeAll

Name Type
/ /

Example:

mods.immersivepetroleum.DistillationTower.removeAll();

Builder

Constructor

Name Type

Example:

// new mods.immersivepetroleum.DistillationBuilder();

new mods.immersivepetroleum.DistillationBuilder();

setOutputFluid

Name Type
Fluids String

Example:

// builderInstance.setOutputFluids(IFluidStack[] fluidOutputs);

builderInstance.setOutputFluids([<fluid:minecraft:water> * 1]);

addByproduct(IItemStack item, int chance)

Name Type
Item IItemStack
Chance Integer (0 - 100)

Example:

// builderInstance.addByproduct(IItemStack item, int chance);

builderInstance.addByproduct(<item:minecraft:cobblestone>, 50);

addByproduct(IItemStack item, double chance)

Name Type
Item IItemStack
Chance Double (0.0 - 1.0)

Example:

// builderInstance.addByproduct(IItemStack item, double chance);

builderInstance.addByproduct(<item:minecraft:stone>, 0.25);

setEnergyAndTime

Name Type
FluxPerTick Integer (>=1)
Ticks Integer (>=1)

Example:

// builderInstance.setEnergyAndTime(int fluxPerTick, int ticks);

builderInstance.setEnergyAndTime(1024, 1);

setEnergy

Name Type
FluxPerTick Integer (>=1)

Example:

// builderInstance.setEnergy(int fluxPerTick);

builderInstance.setEnergy(1024);

setTime

Name Type
Ticks Integer (>=1)

Example:

// builderInstance.setTime(int ticks);

builderInstance.setTime(1);

build

Name Type
Recipe Name String

Example:

// builderInstance.build(String name);

builderInstance.build("example_name");

Copy/Paste examples:

new DistillationBuilder()
	.setOutputFluids([<fluid:minecraft:water> * 1]) // Array of output fluids
	.setInputFluid(<tag:minecraft:lava>, 500) // Input Fluid Tag and the ammount of fluid in mB
	.addByproduct(<item:minecraft:cobblestone>, 50) // Chance using integer (0 - 100)
	.addByproduct(<item:minecraft:stone>, 0.25) // Chance using double (0.0 - 1.0)
	.addByproduct(<item:minecraft:obsidian>, 0.007) // Integer is for convenience, using double gives more control
	.setEnergyAndTime(1024, 1) // Can be done individualy with setEnergy(int) and setTime(int)
	.build("lava_to_solids");
new DistillationBuilder()
	.setOutputFluids([<fluid:minecraft:water> * 500])
	.setInputFluid(<tag:forge:concrete>, 500)
	.addByproduct(<item:minecraft:gravel>, 0.5)
	.addByproduct(<item:minecraft:sand>, 0.25)
	.addByproduct(<item:minecraft:sand>, 0.25)
	.addByproduct(<item:minecraft:clay_ball>, 0.125)
	.setEnergy(2048) // 2048 is the Default for Energy.
	.setTime(1) // 1 is the Default for Time.
	.build("concrete_reversal");

Coker

remove

Name Type
output IIngredient

Example:

// <recipetype:immersivepetroleum:cokerunit>.remove(IIngredient output);

<recipetype:immersivepetroleum:cokerunit>.remove(<item:immersivepetroleum:petcoke>);
// Or
<recipetype:immersivepetroleum:cokerunit>.remove(<tag:items:forge:coal_petcoke>);

remove

Name Type
output IFluidStack

Example:

// <recipetype:immersivepetroleum:cokerunit>.remove(IFluidStack output);

<recipetype:immersivepetroleum:cokerunit>.remove(<fluid:immersivepetroleum:diesel>);

removeAll

Name Type
/ /

Example:

<recipetype:immersivepetroleum:cokerunit>.removeAll();

addRecipe

Name Type
name String
inputItem IItemStack
outputItem IItemStack
inputFluid MCTagWithAmount
outputFluid MCTagWithAmount
energy Integer(>=1)

Example:

// addRecipe(String name, IItemStack inputItem, IItemStack outputItem, MCTagWithAmount<Fluid> inputFluid, MCTagWithAmount<Fluid> outputFluid, int energy);

<recipetype:immersivepetroleum:cokerunit>.addRecipe(
	"clay_from_sand",
	<item:minecraft:sand> * 1,
	<item:minecraft:clay_ball>,
	<tag:fluids:minecraft:water> * 125,
	<tag:fluids:minecraft:water> * 25,
	1024);

Sulfur Recovery Unit

removeByOutputItem

Name Type
output IIngredient

Example:

// <recipetype:immersivepetroleum:hydrotreater>.removeByOutputItem(IIngredient output);

<recipetype:immersivepetroleum:hydrotreater>.removeByOutputItem(<item:immersiveengineering:dust_sulfur>);
// Or
<recipetype:immersivepetroleum:hydrotreater>.removeByOutputItem(<tag:items:forge:dust_sulfur>);

removeByOutputFluid

Name Type
output IFluidStack

Example:

// <recipetype:immersivepetroleum:hydrotreater>.removeByOutputFluid(IFluidStack output);

<recipetype:immersivepetroleum:hydrotreater>.removeByOutputFluid(<fluid:immersivepetroleum:diesel>);

removeAll

Name Type
/ /

Example:

<recipetype:immersivepetroleum:hydrotreater>.removeAll();

addRecipe

Name Type
name String
output IFluidStack
outputItem IItemStack
chance Double
inputFluid MCTagWithAmount
energy Integer(>=1)

Example:

// addRecipe(String name, IFluidStack output, IItemStack outputItem, double chance, MCTagWithAmount<Fluid> inputFluid, int energy);

<recipetype:immersivepetroleum:hydrotreater>.addRecipe(
	"recovery_nonsense",
	<fluid:immersivepetroleum:gasoline> * 20,
	<item:immersiveengineering:slag> * 2,
	0.035,
	<tag:fluids:forge:lubricant> * 20,
	512);

addRecipeWithSecondary

Name Type
name String
output IFluidStack
outputItem IItemStack
chance Double
inputFluid MCTagWithAmount
inputFluidSecondary MCTagWithAmount
energy Integer(>=0)

Example:

// addRecipe(String name, IFluidStack output, IItemStack outputItem, double chance, MCTagWithAmount<Fluid> inputFluid, MCTagWithAmount<Fluid> inputFluidSecondary, int energy);

<recipetype:immersivepetroleum:hydrotreater>.addRecipeWithSecondary(
	"gasoline_from_lubricant",
	<fluid:immersivepetroleum:gasoline> * 10,
	<item:immersiveengineering:slag>,
	0.07,
	<tag:fluids:forge:lubricant> * 10,
	<tag:fluids:minecraft:water> * 10,
	512);

Flarestack

register

Name Type
fuel IFluidStack

Example:

//mods.immersivepetroleum.Flarestack.register(MCTag<Fluid> fuel);

mods.immersivepetroleum.Flarestack.register(<tag:fluids:minecraft:water>);

Lubricant

register

Name Type
fuel IFluidStack

Example:

//mods.immersivepetroleum.Lubricant.register(MCTagWithAmount<Fluid> fuel);

mods.immersivepetroleum.Lubricant.register(<tag:fluids:minecraft:water> * 32);

FuelRegistry

registerGeneratorFuel

Name Type
fuel IFluidStack
fluxPerTick Integer

Example:

//mods.immersivepetroleum.FuelRegistry.registerGeneratorFuel(IFluidStack fuel, int fluxPerTick);

mods.immersivepetroleum.FuelRegistry.registerGeneratorFuel(<fluid:minecraft:water> * 180, 64); // Using 180mB per Tick

registerMotorboatFuel

Name Type
fuel IFluidStack

Example:

//mods.immersivepetroleum.FuelRegistry.registerMotorboatFuel(IFluidStack fuel);

mods.immersivepetroleum.FuelRegistry.registerMotorboatFuel(<fluid:minecraft:water> * 6); // Using 6mB per Tick

Fluid Reservoirs

remove

Name Type
name String

Example:

// mods.immersivepetroleum.ReservoirRegistry.remove(String name);

mods.immersivepetroleum.ReservoirRegistry.remove("aquifer");

removeAll

Name Type

Example:

// mods.immersivepetroleum.ReservoirRegistry.removeAll();

mods.immersivepetroleum.ReservoirRegistry.removeAll();

Builder

constructor

Name Type
Fluid IFluidStack
Minimum Size int
Maximum Size int
Replenish Rate int
Weight int

Weight is the Weighted Chance of a chunk containing that specific fluid reservoir. The weight is counted as in X in Total.

So if you have 5 Reservoir values at: 5, 5, 6, 8, 10

Then each respective entry will have a weighted chance of:

5  in 34
5  in 34
6  in 34
8  in 34
10 in 34

Example:

// new mods.immersivepetroleum.ReservoirBuilder(IFluidStack fluid, int minSize, int maxSize, int traceAmount, int weight);

new mods.immersivepetroleum.ReservoirBuilder(<fluid:minecraft:lava>, 1000, 5000, 0, 20);

addDimensions

Name Type
Blacklist Boolean
Dimension Names String[] array

Example:

// builderInstance.addDimensions(boolean isBlacklist, String[] dimensionNames);

builderInstance.addDimensions(false, ["minecraft:overworld"]);

addBiomes

Name Type
Blacklist Boolean
Biome Names String[] array

Example:

// builderInstance.addBiomes(boolean isBlacklist, String[] biomeNames);

builderInstance.addBiomes(false, ["minecraft:plains"]);

build

The base reservoirs are lowercase as they are translated - custom ones should be properly capitalized (ex. "Deep Ocean Oil Reservoir").

Name Type
name String

Example:

// builderInstance.build(String name);

builderInstance.build("Example Name");

Copy/Paste example:

new ReservoirBuilder(<fluid:minecraft:lava>, 25000, 100000, 0, 20)
	.addDimensions(false, ["overworld"])
	.addBiomes(false, ["minecraft:desert"])
	.build("Desert Lava");