本篇教程由作者设定使用 CC BY-NC 协议。

使用mod:植物学拓展CraftTweakerRandomTweakerZU

  • 盖亚凝聚板:

看站内没有教程,就小搬一下。

注意!配方并不会在jei内显示(只能用RandomTweaker手动添加配方)!

导入包

import mods.botanicadds.GaiaPlate;

添加配方

GaiaPlate.add(IItemStack output, int mana, IItemStack[] inputs);

例子:输入铁锭,金锭,114514魔力,输出泥土。

GaiaPlate.add(<minecraft:dirt>, 114514, [<minecraft:iron_ingot>, <minecraft:gold_ingot>]);

删除配方

GaiaPlate.remove(IItemStack output);

例子:删除泰拉钢锭的合成

GaiaPlate.remove(<botania:manaresource:4>);


加上配方后会发现配方并不会在jei内显示,这时候就需要用RandomTweaker来手写jei了,作者在这里提供一个模板。由于盖亚凝聚板的配方比较申必,你写配方时最好最好每种输入只有一个物品,比如1金锭加1个铁锭合成1个泥土是没有问题的,但如果你要写3个金锭加2个铁锭合成一个泥土,那就会出问题。

import mods.randomtweaker.jei.IJeiPanel;
import mods.randomtweaker.jei.IJeiUtils;
import mods.randomtweaker.jei.IJeiRecipe;

import crafttweaker.item.IItemStack;
import crafttweaker.item.IIngredient;

static created as bool[int]={};//一个静态变量,方便后续查询是否已经创建IJeiPanel。
function GaiaPlateRecipe(output as IItemStack,mana as int,input as IIngredient[]) as void{
    val iL=input.length % 2;//获取输入物品的种类是奇数还是偶数,如果是奇数则为1,偶数为0。
    if(isNull(created[iL])){//如果当前种类的IJeiPanel还未被创建。
        val gPJ=JEI.createJei("GaiaPlateJei"~iL,"盖亚凝聚板");//新建一个IJeiPanel。
        gPJ.setModid("botanicadds");
        gPJ.setIcon(<botanicadds:gaia_plate>);
        gPJ.addRecipeCatalyst(<botanicadds:gaia_plate>);
        gPJ.setBackground(IJeiUtils.createBackground(0,0,170,130,"randomtweaker:textures/gui/jei/lmy_gaia.png"));//设置gui图片,下方有该gui图片。自己改下路径位置就行了。
        gPJ.addSlot(IJeiUtils.createItemSlot("output",77,38,false,false));
        gPJ.addElement(IJeiUtils.createJeiManaBarElement(35,63,mana,0));
        gPJ.addSlot(IJeiUtils.createItemSlot("block0",77,66,true,false));
        gPJ.addSlot(IJeiUtils.createItemSlot("block1",77,82,true,false));
        gPJ.addSlot(IJeiUtils.createItemSlot("block2",61,90,true,false));
        gPJ.addSlot(IJeiUtils.createItemSlot("block3",93,90,true,false));
        gPJ.addSlot(IJeiUtils.createItemSlot("block4",45,98,true,false));
        gPJ.addSlot(IJeiUtils.createItemSlot("block5",77,98,true,false));
        gPJ.addSlot(IJeiUtils.createItemSlot("block6",109,98,true,false));
        gPJ.addSlot(IJeiUtils.createItemSlot("block7",61,106,true,false));
        gPJ.addSlot(IJeiUtils.createItemSlot("block8",93,106,true,false));
        gPJ.addSlot(IJeiUtils.createItemSlot("block9",77,114,true,false));
        val s=iL == 0 ? 67 : 77;//如果输入物品的种类是偶数则将s赋值为67反之77。这两个值是物品输入槽的中心槽的x位置。
        for ig4 in 0 to (s == 67 ? 8 : 9){//如果s值为67,那么此时输入物品种类为偶数,那么最大槽位为8槽。
            var l=ig4 % 2;//这里我的想法比较抽象,不太好表达。反正你知道他能运行就行了。
            var xa=ig4 as float / 2.0f;
            while xa >= 1.0f{
                xa -= 1.0f;
                l += 1;
            }
            if(ig4 % 2 == 0){
                gPJ.addSlot(IJeiUtils.createItemSlot("inputA"~ig4,s - l * 18,0,true,false));
            }else gPJ.addSlot(IJeiUtils.createItemSlot("inputA"~ig4,s + l * 18,0,true,false));
        }
        gPJ.register();
        created[iL]=true;//标记该物品种类的IJeiPanel已创建。
    }
    val gP=JEI.createJeiRecipe("GaiaPlateJei"~iL);
    gP.addElement(IJeiUtils.createFontInfoElement("消耗mana:"~mana,0,68,16718891));
    gP.addInput(<botanicadds:gaia_plate>);
    gP.addInput(<botanicadds:dreamrock>);
    gP.addInput(<botanicadds:elven_lapis_block>);
    gP.addInput(<botanicadds:elven_lapis_block>);
    gP.addInput(<botanicadds:dreamrock>);
    gP.addInput(<botanicadds:dreamrock>);
    gP.addInput(<botanicadds:dreamrock>);
    gP.addInput(<botanicadds:elven_lapis_block>);
    gP.addInput(<botanicadds:elven_lapis_block>);
    gP.addInput(<botanicadds:dreamrock>);
    for ig4 in input{
        gP.addInput(ig4);
    }
    gP.addOutput(output);
    gP.build();
   
    var it=[]as [IItemStack];
    for ii in input{
        it += ii.itemArray[0];
    }
    mods.botanicadds.GaiaPlate.add(output,mana,it);
}

使用CrT对盖亚凝聚板及魔力注入配方魔改(仅1.12.2)-第1张图片这是gui图片,放在对应的gui图片位置就行了。


就如上文所说的那样,由于盖亚凝聚板的申必性,所以每种输入物品只能有一个

例子:输入1个金锭1个铁锭和10000魔力,输出1个泥土

GaiaPlateRecipe(<minecraft:dirt>,10000,[<minecraft:iron_ingot>, <minecraft:gold_ingot>]);

效果图:

使用CrT对盖亚凝聚板及魔力注入配方魔改(仅1.12.2)-第2张图片

最后感谢群友mc_Edwin提供的灵感

  • 魔力注入:

写魔改写着玩时突然发现植物魔法提供的api创建魔力注入配方时其实是可以指定催化剂方块的,但mot并没有开放这一点,刚好ZU又能用zs访问java类,于是就想着用zu来写一个。使用方法请看https://github.com/friendlyhj/ZenUtils/wiki/NativeMethodAccess

import native.net.minecraft.item.ItemStack;
import native.net.minecraft.block.state.IBlockState;
import native.vazkii.botania.api.BotaniaAPI;

import crafttweaker.item.IItemStack;


zenClass ManaInfusionR{//新建一个zenClass,方便来写配方。
    zenConstructor(output as IItemStack,input as IItemStack,mana as int,catalyst as IItemStack){
        val o=output as ItemStack;//将IItemStack转为ItemStack,不然人家不认这个。
        val i=input as ItemStack;
        val c=catalyst.asBlock().definition.getStateFromMeta(catalyst.damage)as IBlockState;//获取催化剂的blockState并转为mc的IBlockState。
        val r=BotaniaAPI.registerManaInfusionRecipe(o,i,mana);//直接用bot写好的api创建一个配方。
        r.setCatalyst(c);//设置催化剂为对应方块。
    }
}

例子:输入一个魔力钻石块和1000魔力,输出一个钻石块,设置催化剂方块为魔力泰拉钢块。

ManaInfusionR(<minecraft:diamond_block>,<botania:storage:3>,1000,<botania:storage:1>);

效果图:

使用CrT对盖亚凝聚板及魔力注入配方魔改(仅1.12.2)-第3张图片

使用CrT对盖亚凝聚板及魔力注入配方魔改(仅1.12.2)-第4张图片