Mod

Multiblock Lib 1174

Quick rating

Multiblock Lib 1174

No reviews yet

A custom multiblock mod

Mod Loaders
NeoForge
Minecraft
26.2

Community voices

Reviews

Versions
Loading versions…
Match includes

Click once to include, again to exclude, again to clear

Rating Any
Any 0.5 1.0 1.5 2.0 2.5 3.0 3.5 4.0 4.5 5.0
Min
Max
Play Status
Reviews
Time Played
hrs+
Verified developers only
Has developer response
List view
Grid view
Compact view
Sort by
Date
Rating
Helpful
Unhelpful
Edited
Sort ascending
Delete this review?

This removes your review from the project. You can write a new review after.

Review submitted for moderation

Your review has been sent to moderators, who will check that it meets our guidelines before it appears publicly.

No reviews yet. Be the first to review this project!

Get it on

Available Platforms

About

Project Details

Type
Mod
Latest Version
multiblocklibes-0.0.6.jar
Authors

For authors

Embed Badge

If you're the author of this project, you can embed a live badge anywhere that supports HTML or Markdown. It updates automatically whenever ratings change.

Custom banner text
ModDex rating badge preview

Use HTML for any page that supports it, or Markdown for README files and Markdown-based descriptions.

Identifiers

Platform IDs

CurseForge ID

Resources

External Links

Source Issues Wiki Discord

About

Description

1174's MultiblockLib

This is a mod which custom multiblock structure
How to use?

00 Config project

Add this mod's cursemaven to your build.gradle

01 Register Controller And Port

public class Register {
    public static final DeferredRegister.Blocks BLOCKS = DeferredRegister.createBlocks(MultiblockLib.MOD_ID);
    public static final DeferredRegister.Items ITEMS = DeferredRegister.createItems(MultiblockLib.MOD_ID);

    // 1.Port
    public static final DeferredBlock<Block> TEST_ITEM_PORT_IN_B = BLOCKS.register(
            "test_item_port_in",
            //                         ↓You can use ItemPortBlock, FluidPortBlock, FEPortBlock to register different port types
            registryName -> new ItemPortBlock(BlockBehaviour.Properties.of()
                    .setId(ResourceKey.create(Registries.BLOCK, registryName)),
                    //  ↓The IO Mode of the port, INPUT, OUTPUT or BOTH
                    4, IOMode.INPUT
                 // ↑The size of the port
            ));

    public static final DeferredItem<Item> TEST_ITEM_PORT_IN =
            ITEMS.register("test_item_port_in",
                    registryName -> new PortBlockItem(TEST_ITEM_PORT_IN_B.get(), new Item.Properties()
                            .setId(ResourceKey.create(Registries.ITEM, registryName)),
                            IOMode.INPUT
                    ));

    // If your port isn't directional, pls register like this
    public static final DeferredBlock<Block> TEST_WASTE_B = BLOCKS.register(
            "test_waste",
            registryName -> new ItemPortBlock(BlockBehaviour.Properties.of()
                    .setId(ResourceKey.create(Registries.BLOCK, registryName)),
                    1, IOMode.OUTPUT
            ) {
                @Override
                public boolean isDirectional() {
                    return false;
                }
            });

    // 2.Detector, which can make player know where need to place something
    public static final DeferredItem<Item> TEST_DETECTOR =
            ITEMS.register("test_detector",
                    registryName -> new MultiblockDetector(new Item.Properties()
                            .setId(ResourceKey.create(Registries.ITEM, registryName))
                    ));

    // 3.Builder, which can build the structure automatically
    public static final DeferredItem<Item> TEST_BUILDER =
            ITEMS.register("test_builder",
                    registryName -> new MultiblockBuilder(new Item.Properties()
                            .setId(ResourceKey.create(Registries.ITEM, registryName))
                    ));
}

The hardest part is the Controller
First, code Controller's BlockEntity

public class TestControllerBlockEntity extends ControllerBlockEntity {
    public TestControllerBlockEntity(BlockPos worldPosition, BlockState blockState) {
        super(Register.TEST_CONTROLLER_BE.get(), worldPosition, blockState);
        //    ↑This is its blockentity type, we'll code them later
    }

    // Both of these values can be changed dynamically
    // Number of recipes the machine can handle at the same time
    @Override
    public int getParallels() {
        return 1;
    }

    // Speed. The bigger, the faster
    @Override
    public int getParseSpeed() {
        return 1;
    }
}

Then, code its Block

public class TestControllerBlock extends ControllerBlock {
    public TestControllerBlock(Properties properties) {
        super(properties);
    }

    @Override
    public @Nullable <T extends BlockEntity> BlockEntityTicker<T> getTicker(Level level, BlockState blockState, BlockEntityType<T> type) {
        return createTickerHelper(type, Register.TEST_CONTROLLER_BE.get(), TestControllerBlockEntity::tick);
        //                              ↑This is its block register, we'll code them later
    }

    @Override
    protected MapCodec<? extends BaseEntityBlock> codec() {
        return simpleCodec(TestControllerBlock::new);
    }

    @Override
    public @Nullable BlockEntity newBlockEntity(BlockPos blockPos, BlockState blockState) {
        return new TestControllerBlockEntity(blockPos, blockState);
    }
}

Last, go back into your register class

public static final DeferredRegister<BlockEntityType<?>> BLOCK_ENTITY_TYPES =
        DeferredRegister.create(Registries.BLOCK_ENTITY_TYPE, MultiblockLib.MOD_ID);

public static final DeferredBlock<Block> TEST_CONTROLLER_B = BLOCKS.register(
        "test_controller",
        registryName -> new TestControllerBlock(BlockBehaviour.Properties.of()
                .setId(ResourceKey.create(Registries.BLOCK, registryName))
        ));

public static final DeferredItem<Item> TEST_CONTROLLER =
        ITEMS.register("test_controller",
                registryName -> new BlockItem(TEST_CONTROLLER_B.get(), new Item.Properties()
                        .setId(ResourceKey.create(Registries.ITEM, registryName))
                ));

public static final Supplier<BlockEntityType<TestControllerBlockEntity>> TEST_CONTROLLER_BE = BLOCK_ENTITY_TYPES.register(
        "test_controller",
        () -> new BlockEntityType<>(
                TestControllerBlockEntity::new,
                false,
                TEST_CONTROLLER_B.get()
        )
);

02 Structure

Build your structure in you world
Use this command

/multiblocklibes structure -104 56 -61 -109 59 -64 -99 56 -61 TestExport

First BlockPos is the controller pos
Second & third is block of two corners The string is the file's name Find your file at /GameFile/multiblockes/xxx.json
It's a recipe json file

{
    "type": "multiblocklibes:structure",
    // Structure's id
    "structure_id": "blast",
    // Controller's block id
    "controller_id": "multiblocklibes:test_controller",
    "pattern": [
        // Block can exist in somewhere, it's a json array
        [1, 0, 0, ["minecraft:oxidized_cut_copper", "multiblocklibes:test_item_port_in", "multiblocklibes:test_item_port_ou", "multiblocklibes:test_fluid_port_in", "multiblocklibes:test_fluid_port_ou", "multiblocklibes:test_fe_port"]],
        [-1, 0, 0, ["minecraft:oxidized_cut_copper", "multiblocklibes:test_item_port_in", "multiblocklibes:test_item_port_ou", "multiblocklibes:test_fluid_port_in", "multiblocklibes:test_fluid_port_ou", "multiblocklibes:test_fe_port"]],
        [1, 0, 1, ["minecraft:oxidized_cut_copper", "multiblocklibes:test_item_port_in", "multiblocklibes:test_item_port_ou", "multiblocklibes:test_fluid_port_in", "multiblocklibes:test_fluid_port_ou", "multiblocklibes:test_fe_port"]],
        [-1, 0, 1, ["minecraft:oxidized_cut_copper", "multiblocklibes:test_item_port_in", "multiblocklibes:test_item_port_ou", "multiblocklibes:test_fluid_port_in", "multiblocklibes:test_fluid_port_ou", "multiblocklibes:test_fe_port"]],
        [1, 0, 2, ["minecraft:oxidized_cut_copper", "multiblocklibes:test_item_port_in", "multiblocklibes:test_item_port_ou", "multiblocklibes:test_fluid_port_in", "multiblocklibes:test_fluid_port_ou", "multiblocklibes:test_fe_port"]],
        [0, 0, 2, ["minecraft:oxidized_cut_copper", "multiblocklibes:test_item_port_in", "multiblocklibes:test_item_port_ou", "multiblocklibes:test_fluid_port_in", "multiblocklibes:test_fluid_port_ou", "multiblocklibes:test_fe_port"]],
        [-1, 0, 2, ["minecraft:oxidized_cut_copper", "multiblocklibes:test_item_port_in", "multiblocklibes:test_item_port_ou", "multiblocklibes:test_fluid_port_in", "multiblocklibes:test_fluid_port_ou", "multiblocklibes:test_fe_port"]],
        [0, 0, 1, ["minecraft:oxidized_cut_copper", "multiblocklibes:test_item_port_in", "multiblocklibes:test_item_port_ou", "multiblocklibes:test_fluid_port_in", "multiblocklibes:test_fluid_port_ou", "multiblocklibes:test_fe_port"]],

        [1, 3, 0, ["minecraft:oxidized_cut_copper", "multiblocklibes:test_item_port_in", "multiblocklibes:test_item_port_ou", "multiblocklibes:test_fluid_port_in", "multiblocklibes:test_fluid_port_ou", "multiblocklibes:test_fe_port"]],
        [0, 3, 0, ["minecraft:oxidized_cut_copper", "multiblocklibes:test_item_port_in", "multiblocklibes:test_item_port_ou", "multiblocklibes:test_fluid_port_in", "multiblocklibes:test_fluid_port_ou", "multiblocklibes:test_fe_port"]],
        [-1, 3, 0, ["minecraft:oxidized_cut_copper", "multiblocklibes:test_item_port_in", "multiblocklibes:test_item_port_ou", "multiblocklibes:test_fluid_port_in", "multiblocklibes:test_fluid_port_ou", "multiblocklibes:test_fe_port"]],
        [1, 3, 1, ["minecraft:oxidized_cut_copper", "multiblocklibes:test_item_port_in", "multiblocklibes:test_item_port_ou", "multiblocklibes:test_fluid_port_in", "multiblocklibes:test_fluid_port_ou", "multiblocklibes:test_fe_port"]],
        [-1, 3, 1, ["minecraft:oxidized_cut_copper", "multiblocklibes:test_item_port_in", "multiblocklibes:test_item_port_ou", "multiblocklibes:test_fluid_port_in", "multiblocklibes:test_fluid_port_ou", "multiblocklibes:test_fe_port"]],
        [1, 3, 2, ["minecraft:oxidized_cut_copper", "multiblocklibes:test_item_port_in", "multiblocklibes:test_item_port_ou", "multiblocklibes:test_fluid_port_in", "multiblocklibes:test_fluid_port_ou", "multiblocklibes:test_fe_port"]],
        [0, 3, 2, ["minecraft:oxidized_cut_copper", "multiblocklibes:test_item_port_in", "multiblocklibes:test_item_port_ou", "multiblocklibes:test_fluid_port_in", "multiblocklibes:test_fluid_port_ou", "multiblocklibes:test_fe_port"]],
        [-1, 3, 2, ["minecraft:oxidized_cut_copper", "multiblocklibes:test_item_port_in", "multiblocklibes:test_item_port_ou", "multiblocklibes:test_fluid_port_in", "multiblocklibes:test_fluid_port_ou", "multiblocklibes:test_fe_port"]],

        [0, 1, 0, ["minecraft:diamond_block", "minecraft:emerald_block"]],
        [1, 1, 0, ["minecraft:diamond_block", "minecraft:emerald_block"]],
        [-1, 1, 0, ["minecraft:diamond_block", "minecraft:emerald_block"]],
        [1, 1, 1, ["minecraft:diamond_block", "minecraft:emerald_block"]],
        [-1, 1, 1, ["minecraft:diamond_block", "minecraft:emerald_block"]],
        [1, 1, 2, ["minecraft:diamond_block", "minecraft:emerald_block"]],
        [0, 1, 2, ["minecraft:diamond_block", "minecraft:emerald_block"]],
        [-1, 1, 2, ["minecraft:diamond_block", "minecraft:emerald_block"]],

        [0, 2, 0, ["minecraft:diamond_block", "minecraft:emerald_block"]],
        [1, 2, 0, ["minecraft:diamond_block", "minecraft:emerald_block"]],
        [-1, 2, 0, ["minecraft:diamond_block", "minecraft:emerald_block"]],
        [1, 2, 1, ["minecraft:diamond_block", "minecraft:emerald_block"]],
        [-1, 2, 1, ["minecraft:diamond_block", "minecraft:emerald_block"]],
        [1, 2, 2, ["minecraft:diamond_block", "minecraft:emerald_block"]],
        [0, 2, 2, ["minecraft:diamond_block", "minecraft:emerald_block"]],
        [-1, 2, 2, ["minecraft:diamond_block", "minecraft:emerald_block"]],

        [0, 3, 1, ["multiblocklibes:test_waste"]]
    ],
    "requirements": [
        // The Structure Requirements
    ]
}

You can also add sth in "The Structure Requirements"

{
    // How many blocks in Structure
    "id": "right_count_blocks_structure_requirement",
    "property": [
        ["multiblocklibes:test_fe_port"],
        1
    ]
}
{
    "id": "max_blocks_structure_requirement",
    "property": [
        ["multiblocklibes:test_fe_port"],
        1
    ]
}
{
    "id": "min_blocks_structure_requirement",
    "property": [
        ["multiblocklibes:test_fe_port"],
        1
    ]
}
// Add Description to the Structure
// Translatable
{
    "id": "desc_structure_requirement",
    "property": [
        "tran",
        "key.modid.sth"
    ]
},
// Literal
{
    "id": "desc_structure_requirement",
    "property": [
        "lite",
        "Also Trys War Thunder !!"
    ]
}
// Some block need be same
{
    "id": "same_block_structure_requirement",
    "property": [
        [0, 1, 0],
        [1, 1, 0],
        [-1, 1, 0],
        [1, 1, 1],
        [-1, 1, 1],
        [1, 1, 2],
        [0, 1, 2],
        [-1, 1, 2],

        [0, 2, 0],
        [1, 2, 0],
        [-1, 2, 0],
        [1, 2, 1],
        [-1, 2, 1],
        [1, 2, 2],
        [0, 2, 2],
        [-1, 2, 2]
    ]
}

03 Recipe

This is an example recipe

{
    "type": "multiblocklibes:recipe",
    // Recipe Time
    "time": 100,
    // Recipe ID
    "recipe_id": "blast_revipe_test",
    // Binding Structure
    "structure_id": "blast",
    "requirements": [
        // Recipe requirement
    ]
}

Recipe requirements:

// Item Requirement
{
    "id": "item_recipe_requirement",
    "property": [
        "input",
        "minecraft:iron_ingot",
        3
    ]
},
{
    "id": "item_recipe_requirement",
    "property": [
        "output",
        "minecraft:netherite_ingot",
        1,
        // If you want to make the item can only be output through ports of a specified type
        // Also can be use in fluid and FE requirement
        ["multiblocklibes:test_item_port_ou"]
    ]
}
{
    "id": "fluid_recipe_requirement",
    "property": [
        "output",
        "mod_id:some_fluid",
        2
    ]
}
{
    "id": "fe_recipe_requirement",
    "property": [
        "input",
        5000
    ]
}
{
    "id": "block_recipe_requirement",
    "property": [
        // It won't destroy block when input
        "input",
        ["modid:blovkkkkk"],
        0,3,0
    ]
}
{
    "id": "command_recipe_requirement",
    "property": [
        // When execute, input or output!
        "input",
        "summon modid:sth_mob",
        0,3,0
    ]
}
{
    "id": "desc_recipe_requirement",
    "property": [
        // When execute, input or output!
        "input",
        "tran",
        "key.modid.eeeeeee"
    ]
}
{
    // How many blocks in Structure
    "id": "right_count_blocks_structure_requirement",
    "property": [
        ["modid:sth_block"],
        10
    ]
}
{
    "id": "min_count_blocks_structure_requirement",
    "property": [
        ["modid:sth_block"],
        10
    ]
}
{
    "id": "max_count_blocks_structure_requirement",
    "property": [
        ["modid:sth_block"],
        10
    ]
}

Screenshots

Gallery

This project has no gallery images yet.

Versions

Files

Relations

Project Relations

More like this

Similar Mods

Suggestions use data such as tags, dependencies, dependents, descriptions, titles, and more to rank how much they overlap with this mod.

On ModDex

Community snapshot

0
Ratings
0
Followers
0
In stacks

By the numbers

Statistics

<1,000
Downloads
Last Updated
Created
Last synced
When ModDex last fetched and imported data for this project from CurseForge or Modrinth. High-traffic and active projects are checked more often.
Next pipeline sync