Burning

Burning

Mod

A library mod to access and transfer the burning fuel between furnace-like blocks of all mods.

Server Library

241 downloads
1 follower
Follow Save
90% of ad revenue goes to creators. Go ad-free while supporting creators with Modrinth Plus. Subscribe today!

Burning

Burning is a library mod that adds a unified interface for managing the amount of burning fuel within most, if not all, furnace-like blocks from both vanilla Minecraft and other mods.

Uses Fabric's Lookup and Transaction APIs.

Documentation

Burning revolves around the BurningStorage interface, which manages insertions and extraction of burning fuel, and the Burning class, which represent the burning fuel itself.

You may read the documentation or the source code to learn more.

Getting Started (for normal users)

Install it as you'd with any other mod, and without further configuration, every block which entity extends the AbstractFurnaceBlockEntity (Mojang mappings' name) abstract class, be them the vanilla Furnace, Blast Furnace, or Smoker, or any third-party block, will get a BurningStorage automatically and thus will be ready to interop with every other mod using this library.

Dynamic Storages (for experienced users)

Some mods add block entities that can burn fuel but that, for one reason or another, don't extend the AbstractFurnaceBlockEntity abstract class, and thus, that won't automatically get a BurningStorage.

Fret not, for Burning makes available the burning:dynamic_storage dynamic registry, which, through data packs and a bit of reflection, resolves this specific problem.

How to do so.

For every such block entity, you must figure out a couple of things beforehand, that is:

  • The name of that block entity's type.
  • The name of the field of that block entity that is functionally equivalent to AbstractFurnaceBlockEntity.litTime (Mojang mappings' name).
  • The name of the field of that block entity that is functionally equivalent to AbstractFurnaceBlockEntity.litDuration (Mojang mappings' name).

Then you must create a data pack like the one in the following example.

Data Pack Structure Example
<datapack_name>.zip
├── data
│   └── <datapack_name>
│       └── burning
│           └── dynamic_storage
│               └── <block_entity_type_1>.json
│               └── <block_entity_type_2>.json
│               └── ...
├── pack.mcmeta
└── pack.png (optional)

JSON File Content Example
{
    // The name of that block entity's type
    "type": "example_mod:custom_furnace_entity_type",
    // The name of the field of that block entity that is functionally equivalent to `litTime`
    "lit_time": "burnTime",
    // The name of the field of that block entity that is functionally equivalent to `litDuration`
    "lit_duration": "fuelTime"
}

Add Dependencies (for mod developers)

Add the following to your gradle.build.

repositories {
    // Add Modrinth maven repository
    exclusiveContent {
        forRepository {
            maven {
                name = "Modrinth"
                url = "https://api.modrinth.com/maven"
            }
        }
        filter {
            includeGroup "maven.modrinth"
        }
    }
}

dependencies {
    // Add Burning dependency
    modImplementation "maven.modrinth:burning:<burning_version>"
}

For more information about the Modrinth maven repository read here.

Basic Usage (for mod developers)

Most of the time, as a mod developer using this library, you will only need to access already registered burning storages and transfer burning fuel between them. Here's how to do it.

Get a burning storage:

import niv.burning.api.BurningStorage;

// What you need
Level world;
BlockPos pos;

// How to
@Nullable
BurningStorage storage = BurningStorage.SIDED.find(world, pos, null);

Note: for most use cases, find's third argument, which should be a Direction, is ignored by the underlying implementation, so it's safe to pass null.

Transfer burning fuel between two storages:

import niv.burning.api.Burning;
import niv.burning.api.BurningStorage;

// What you need
BurningStorage source, target;

// Create the maximum amount of burning fuel to transfer, for instance, half a COAL worth of burning fuel
Burning burning = Burning.of(Items.COAL).withValue(800);
// or if you are using COAL, BLAZE_ROD, or LAVA_BUCKET
Burning burning = Burning.COAL.withValue(800);

// How to
Burning transferred = BurningStorage.transfer(
        source, // transfer from this storage
        target, // to this storage
        burning, // up to this amount of burning fuel
        null); // creating a new transaction in doing so
// `transferred` will have the same fuel as `burning`

Transfer an exact amount or nothing:

import niv.burning.api.Burning;
import niv.burning.api.BurningStorage;

BurningStorage source, target;

Burning burning = Burning.COAL.withValue(800);

try (Transaction transaction = Transaction.openOuter()) {
    Burning transferred = BurningStorage.transfer(source, target, burning, transaction);
    if (burning.equals(transferred)) {
        transaction.commit();
    }
}

Read the Fabric's Transaction API to understand the last example better.

Use a burning storage in your block entity (for mod developers)

Instead of implementing the two fields functionally equivalent to AbstractFurnaceBlockEntity's litTime and litDuration, do the following:

import niv.burning.api.base.SimpleBurningStorage;

public class NewBlockEntity extends BlockEntity {
    // Add a simple burning storage to the entity
    public final SimpleBurningStorage simpleBurningStorage = SimpleBurningStorage.getForBlockEntity(this);

    // (Optional) Add a simple container data for the burning storage
    public final ContainerData containerData = SimpleBurningStorage.getDefaultContainerData(this.simpleBurningStorage);

    // And don't forget to add the following
    @Override
    protected void loadAdditional(CompoundTag compoundTag, Provider provider) {
        // ...
        this.simpleBurningStorage.load(compoundTag, provider);
    }

    @Override
    protected void saveAdditional(CompoundTag compoundTag, Provider provider) {
        // ...
        this.simpleBurningStorage.save(compoundTag, provider)
    }
}

Don't forget to register it:

import niv.burning.api.BurningStorage;

// What you need
BlockEntityType<NewBlockEntity> NEW_BLOCK_ENTITY;

// How to
BurningStorage.SIDED.registerForBlockEntity((newBlockEntity, direction) -> newBlockEntity.storage, NEW_BLOCK_ENTITY);

Then you can access the equivalent litTime and litDuration like:

this.storage.getCurrentBurning(); // as the `litTime` equivalent
this.storage.setCurrentBurning(800);
this.storage.getMaxBurning(); // as the `litDuration` equivalent
this.storage.setMaxBurning(1600);

Project members

Niv Oridocs

Member

Details

Licensed MIT
Published a month ago
Updated a month ago