Skip to content

[1.14.x] Modpack Developers

TwistedGate edited this page Sep 22, 2020 · 1 revision

Content Table


Balance

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 this Google Drive spreadsheet which will automatically calculate net power production, reservoir drain time, and more.


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.

type
should always be immersivepetroleum:distillation.

byproducts
is an array of item's 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.

energy
is the minimum power per tick required to distill the input.

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

Here is the default oil cracking recipe json that's used by Immersive Petroleum itself.

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

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.

Here's the default Oil reservoir used by Immersive Petroleum.

{
  "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

Distillation

remove

Name Type
Recipe Name String

Example:

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

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 recipeName);

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");

Fluid Reservoirs

remove

Name Type
Recipe Name String

Example:

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

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

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

Name Type
Name String

Preface

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

Example:

// builderInstance.build(String same);

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");

Lubricant

register

Name Type
Fluid IFluidStack

Example:

//mods.immersivepetroleum.Lubricant.register(IFluidStack fuel, int fluxPerTick);

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

Fuel Registry

registerGeneratorFuel

Name Type
Fluid 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
Fluid IFluidStack

Example:

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

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