跳到正文

KubeJS GT Dynamic Render

作者:P_nutsK

为 GregTech CEu Modern 添加 KubeJS 渲染器的附属模组。

收藏

介绍

介绍由机器翻译自 CurseForge 原页面,仅供参考。
难道你不想为 GregTech CEu Modern 添加酷炫的渲染效果吗?但那需要用到 Java?别担心!这个模组解决了这个问题。
 
我们仅支持 1.20.1 Forge,因为 GTCEu 就在这个版本上。
 
示例:
在 startup_scripts 中:
GTRenderJSEvents.registerModelsForRender(event => {
    event.register("kubejs:obj/space");
    event.register("kubejs:obj/star");
    event.register("kubejs:obj/foo");
    event.register("kubejs:obj/bar");
    event.register("kubejs:obj/baz");
});
这些 obj 文件应放置在 /assets/kubejs/models 中。
 

在 startup_scripts 中(gregtech 多方块机器注册)

// before
.workableCasingModel(
            "gtceu:block/casings/solid/machine_casing_stable_titanium",
            "gtceu:block/multiblock/implosion_compressor"
        );
// You will use this instead of that.
// after
.model(
            GTMachineModels.createWorkableCasingMachineModel(
                "gtceu:block/casings/solid/machine_casing_stable_titanium",
                 "gtceu:block/multiblock/implosion_compressor"
            )["andThen(java.util.function.Consumer)"](b =>
                b.addDynamicRenderer(() => KubeJSDynamicRender.of("kubejs:example"))
            )
        );

在 client_scripts 中

请发送要翻译的英文内容。

const OverlayTexture = Java.loadClass("net.minecraft.client.renderer.texture.OverlayTexture");
const RenderType = Java.loadClass("net.minecraft.client.renderer.RenderType");
const LightTexture = Java.loadClass("net.minecraft.client.renderer.LightTexture");

GTRenderJSEvents.registerDynamicRender(event => {
    event.create(
        "kubejs:example",
        /**
         *@param {Internal.RenderBuilder<Internal.WorkableElectricMultiblockMachine,{ someValue:string }>} builder
         */
        builder => {
            // default: raw => raw
            // By using this API, you can utilize arguments with type safety and default values.
            // The result of this function is cached.
            builder.prepareBindings(raw => {
                return {
                    someValue: raw.someValue || "default value",
                };
            });

            builder.render(ctx => {
                // you can use bindings here
                console.log(ctx.binding.someValue);
                // const light = ctx.packedLight;
                // const overlay = ctx.packedOverlay;
                const machine = ctx.machine;
                const poseStack = ctx.poseStack;
                const buffer = ctx.buffer;
                var tick = machine.getOffsetTimer() + ctx.partialTick;
                // offsets
                var x = 0.5,
                    y = 0.5,
                    z = 0.5;
                switch (machine.getFrontFacing()) {
                    case Direction.NORTH:
                        z = 16.5;
                        break;
                    case Direction.SOUTH:
                        z = -15.5;
                        break;
                    case Direction.WEST:
                        x = 16.5;
                        break;
                    case Direction.EAST:
                        x = -15.5;
                        break;
                }
                poseStack.pushPose();
                poseStack.translate(x, y, z);
                renderOuterSpaceShell(poseStack, buffer.getBuffer(RenderType.solid()));
                poseStack.popPose();
            });
            const shouldRender = machine => machine.isFormed();

            builder
                .viewDistance(256)
                .shouldRender(shouldRender)
                .shouldRenderOffScreen(shouldRender)
                .renderBoundingBox(() => {
                    // todo ちゃんとやる
                    const rad = 32;
                    return AABB.of(-rad, -rad, -rad, rad, rad, rad);
                });
        }
    );
});
/**
 * @param {Internal.PoseStack} poseStack
 * @param {Internal.MultiBufferSource} buffer
 * @param {number} scale
 */
function renderOuterSpaceShell(poseStack, buffer) {
    const scale = 0.01 * 17.5;
    poseStack.pushPose();
    poseStack.scale(scale, scale, scale);
    const rt = RenderType.solid();
    BakedModelRenderer.renderModel(poseStack.last(), buffer.getBuffer(rt), getBakedModel("kubejs:obj/space"), rt);
    poseStack.popPose();
}

/**
 * @param {ResourceLocation_} id
 */
function getBakedModel(id) {
    // In the context of KubeJS, Client = Minecraft.getInstance()
    return Client.getModelManager().getModel(id);
}

常见问题

KubeJS GT Dynamic Render 支持哪些 Minecraft 版本?

KubeJS GT Dynamic Render 支持 Minecraft Java 版 1.20.1,可用的加载器:Forge。下载时注意选择和你游戏版本一致的文件。

KubeJS GT Dynamic Render 怎么安装?

先用 PCL2 或 HMCL 启动器安装对应版本的 Forge,再把下载的 .jar 文件放进游戏目录的 mods 文件夹,重新启动游戏即可。开启了版本隔离的,mods 文件夹在 versions/版本名 下面。

评论

登录后评论和评分

P_nutsK 的其他作品

查看全部 →