本篇教程由作者设定使用 CC BY-NC 协议。
使用mod:植物学拓展,CraftTweaker,RandomTweaker,ZU。
盖亚凝聚板:
看站内没有教程,就小搬一下。
注意!配方并不会在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);
}
这是gui图片,放在对应的gui图片位置就行了。
就如上文所说的那样,由于盖亚凝聚板的申必性,所以每种输入物品只能有一个
例子:输入1个金锭1个铁锭和10000魔力,输出1个泥土
GaiaPlateRecipe(<minecraft:dirt>,10000,[<minecraft:iron_ingot>, <minecraft:gold_ingot>]);
效果图:
最后感谢群友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>);
效果图: