Jump to content
Search In
  • More options...
Find results that contain...
Find results in...

Datagen ModelFiles, but with overlays like grass blocks


FireTamer81
 Share

Recommended Posts

This is what I have for two ModelFiles, the first only applying one overlay and the second apply the first overlay + another.

public ModelFile scuffedWarenaiBlockModel(Block block) {
        return models().getBuilder("scuffed_" + name(block))
                .parent(existingMcModel("block"))
                .texture("particle", warenaiBlockTexture(block))
                .texture("underlay", warenaiBlockTexture(block))
                .texture("overlay", scuffedTexture())
                .element().from(0, 0, 0).to(16, 16, 16).allFaces((direction, faceBuilder) -> faceBuilder.uvs(0, 0, 16, 16).texture("#underlay").cullface(direction)).end()
                .element().from(0, 0, 0).to(16, 16, 16).allFaces((direction, faceBuilder) -> faceBuilder.uvs(0, 0, 16, 16).texture("#overlay").cullface(direction)).end();
    }

    public ModelFile crackedWarenaiBlockModel(Block block, int crackedLevel) {
        return models().getBuilder("cracked" + crackedLevel + "_" + name(block))
                .parent(existingMcModel("block"))
                .texture("particle", warenaiBlockTexture(block))
                .texture("underlay", warenaiBlockTexture(block))
                .texture("overlay1", scuffedTexture())
                .texture("overlay2", crackedTexture(crackedLevel))
                .element().from(0, 0, 0).to(16, 16, 16).allFaces((direction, faceBuilder) -> faceBuilder.uvs(0, 0, 16, 16).texture("#underlay").cullface(direction)).end()
                .element().from(0, 0, 0).to(16, 16, 16).allFaces((direction, faceBuilder) -> faceBuilder.uvs(0, 0, 16, 16).texture("#overlay1").cullface(direction)).end()
                .element().from(0, 0, 0).to(16, 16, 16).allFaces((direction, faceBuilder) -> faceBuilder.uvs(0, 0, 16, 16).texture("#overlay2").cullface(direction)).end();
    }

 

This works, but it doesn't seem so simple for a stair block. 

I copied the stair stuff from the forge BlockStateProvider class to get started with a normal stair model that works: 

public void warenaiStairBlock(StairsBlock block, ResourceLocation texture) {
        warenaiStairBlockInternal1(block, texture, texture, texture);
    }

    public void warenaiStairBlockInternal1(StairsBlock block, ResourceLocation side, ResourceLocation bottom, ResourceLocation top) {
        warenaiStairBlockInternal2(block, block.getRegistryName().toString(), side, bottom, top);
    }

    public void warenaiStairBlockInternal2(StairsBlock block, String baseName, ResourceLocation side, ResourceLocation bottom, ResourceLocation top) {
        ModelFile normal_stairs = models().stairs(baseName, side, bottom, top);
        ModelFile normal_stairsInner = models().stairsInner(baseName + "_inner", side, bottom, top);
        ModelFile normal_stairsOuter = models().stairsOuter(baseName + "_outer", side, bottom, top);

        warenaiStairsBlock(block, normal_stairs, normal_stairsInner, normal_stairsOuter);
    }

    public void warenaiStairsBlock(StairsBlock block, ModelFile stairs, ModelFile stairsInner, ModelFile stairsOuter) {
        getVariantBuilder(block)
                .forAllStatesExcept(state -> {
                    Direction facing = state.getValue(StairsBlock.FACING);
                    Half half = state.getValue(StairsBlock.HALF);
                    StairsShape shape = state.getValue(StairsBlock.SHAPE);
                    int yRot = (int) facing.getClockWise().toYRot(); // Stairs model is rotated 90 degrees clockwise for some reason
                    yRot %= 360;
                    boolean uvlock = yRot != 0 || half == Half.TOP; // Don't set uvlock for states that have no rotation

                    ModelFile shapeDependentModel = shape == StairsShape.STRAIGHT ? stairs : shape == StairsShape.INNER_LEFT || shape == StairsShape.INNER_RIGHT ? stairsInner : stairsOuter;

                    if (shape == StairsShape.INNER_LEFT || shape == StairsShape.OUTER_LEFT) {
                        yRot += 270; // Left facing stairs are rotated 90 degrees clockwise
                    }
                    if (shape != StairsShape.STRAIGHT && half == Half.TOP) {
                        yRot += 90; // Top stairs are rotated 90 degrees clockwise
                    }

                    return ConfiguredModel.builder()
                            .modelFile(shapeDependentModel)
                            .rotationX(half == Half.BOTTOM ? 0 : 180)
                            .rotationY(yRot)
                            .uvLock(uvlock)
                            .build();
                }, StairsBlock.WATERLOGGED);
    }

 

Now I have no idea where to go. I could take the time and figure it out all on my own, but since I really should be working on a college essay I thought I would see if anyone else knew what to do first. If not, then I will just do it myself when I get the time.

Link to comment
Share on other sites

Update... I still can't figure it out. So, since the blockmodels are super custom while the blockstates and item models are your average ones, I have come up with the idea of only doing datagen for those two and just referencing the pre-made blockmodels which I will put into a subfolder of the models/block directory.

It will still be a little bit of pain, but at least my resources folder will stay organized which was my original goal.

 

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share



×
×
  • Create New...

Important Information

By using this site, you agree to our Privacy Policy.