前言
什么是材料系统?干什么用?如果你看过cot自定义方块,物品等的教程,那你是否会想到,如果你想添加各种科技模组的物品或者方块,比如锡锭,锡矿,锡齿轮,锡板,锡棒等各种各样的内容,难道打算一个一个写?这就是材料系统带来的便利之处。
介绍
材料系统由材料和部件组成,那么他们都是什么?如果你看过cot自定义匠魂的教程,那么你或许可以理解。按照前言来说,锡 = 材料 ,锭、矿、齿轮 = 部件。
接下来也会分两部分讲解。
cot脚本开头记得#loader contenttweaker
材料与部件
自定义材料
导包
import mods.contenttweaker.MaterialSystem;
import mods.contenttweaker.MaterialBuilder;
import mods.contenttweaker.Material;
脚本
第一种写法
//获取材料构建器
//var 变量名 as MaterialBuilder = MaterialSystem.getMaterialBuilder();
var builder as MaterialBuilder = MaterialSystem.getMaterialBuilder();
//设置ID
//变量名.setName("ID");builder.setName("Urubuntu");
//设置颜色
//变量名.setColor(颜色代码);
builder.setColor(0x000151);
//设置是否有附魔光效
//变量名.setHasEffect(true/false);
builder.setHasEffect(false);
//构建
val 变量名2 as Material = 变量名.build();
val urubuntu as Material = builder.build();
第二种写法(链式)
作用同上
val arakantara as Material = MaterialSystem.getMaterialBuilder().setName("Arakantara").setColor(15592941).setHasEffect(true).build();
本地化
base.material.材料ID = xxx
自定义部件
导包
import mods.contenttweaker.MaterialSystem;
import mods.contenttweaker.Part;
import mods.contenttweaker.PartBuilder;
import mods.contenttweaker.PartType;
脚本
第一种写法
//部件构建器
//var 变量名 = MaterialSystem.getPartBuilder();
var pBuilder = MaterialSystem.getPartBuilder();
//设置部件的ID
//变量名.setName("ID");
pBuilder.setName("dense_gear");
//设置部件类型是什么(item (物品)、block (方块)、ore(矿石)、fluid(流体)、armor(护甲)、minecart (矿车))
//变量名.setPartType(MaterialSystem.getPartType("什么东西"));
pBuilder.setPartType(MaterialSystem.getPartType("item"));
//设置是否有一部分不会上色(类似于皮革套,准备两张图,一张xx.png是上色图,一张xx_overlay.png是不上色图)
//变量名.setHasOverlay(true/false);
pBuilder.setHasOverlay(true);
//设置矿辞
//变量名.setOreDictName("矿辞");
pBuilder.setOreDictName("superIngot");
//构建
//var 变量名2 = 变量名.build();
var denseGearPart = pBuilder.build();
第二种写法(链式)
作用同上
var denseIngotPart = MaterialSystem.getPartBuilder().setName("dense_ingot").setPartType(mods.contenttweaker.MaterialSystem.getPartType("item")).setHasOverlay(true).setOreDictName("superIngot").build();
当然CoT提供了很多预设WIKI
本地化
contenttweaker.part.部件ID = %s xx(%s代表材料,当你创建了对应的材料部件,比如锡,它就会自动替换%s ,比如锡 齿轮)
材质
和cot创建物品,方块一样,item就放在items里面,block就放在blocks里面,以此类推
将部件与材料结合,注册材料部件
上面虽然教了材料和部件如何创建,但都是各管各的,我们需要将他们结合。
//这里随便创建一个材料和部件来示范
val copper as Material = MaterialSystem.getMaterialBuilder().setName("Copper").setColor(0xFF9933).build();
var denseIngotPart = MaterialSystem.getPartBuilder().setName("dense_ingot").setPartType(mods.contenttweaker.MaterialSystem.getPartType("item")).setHasOverlay(true).setOreDictName("superIngot").build();
//注册材料部件
//材料变量名.registerPart(部件ID sring / 部件变量名 IPart);
copper.registerPart("dense_ingot");
copper.registerPart(denseIngotPart);
//当然也可以数组
//材料变量名.registerParts(部件ID string[] / 部件变量名 IPart[]);下方 as 类型 是因为我所用的版本会把数组默认识别为ang[],而报传参错误
copper.registerParts(["gear", "casing", "dense_ingot"] as string[]);
copper.registerParts([denseIngotPart] as IPart[]);
//当然其实它们可以反着来
//部件变量名.registerToMaterial(材料变量名);
denseIngotPart.registerToMaterial(copper);
//数组
//部件变量名.registerToMaterials(材料变量名 Material[]);
denseIngotPart.registerToMaterials([copper] as Material[]);
材料部件信息
也许,你对材料系统提供的材料有更高的要求,如某个材料的挖掘等级为2,某个材料的挖掘等级却为3。
导包
import mods.contenttweaker.MaterialPartData;
脚本
//首先,创建一个材料部件是的没错,不是材料与部件而是材料部件
//与材料不同的是,不需要 as 类型 ,然后在build()后面加上registerPart(部件ID).getData()
val oreData = MaterialSystem.getMaterialBuilder().setName("Lawrencium").setColor(15426660).build().registerPart("ore").getData();
//之后就可以根据提供的WIKI进行改动
oreData.addDataValue("drops", "minecraft:redstone,minecraft:gold_ingot");
oreData.addDataValue("variants", "minecraft:stone,minecraft:end_stone");
oreData.addDataValue("hardness", "3,3");
oreData.addDataValue("resistance", "15,15");
oreData.addDataValue("harvestLevel", "1,1");
oreData.addDataValue("harvestTool", "pickaxe,shovel");
进阶
如果你想让添加的物品有特殊效果,比如是个魔法卷轴呢?那么材料部件信息所提供的方法并不可行,所以我们需要创建属于自己的部件类型,也就是上文自定义部件中所用的item、ore、block等等
自定义部件类型
导包
因为是像cot那样创建原版物品、方块,所以需要导入
import mods.contenttweaker.VanillaFactory;
脚本
//创建自定义部件类型对象
//val 变量名 as PartType = MaterialSystem.createPartType("类型ID", function(materialPart){
val frame as PartType = MaterialSystem.createPartType("frame", function(materialPart){
//获取材料的名字
//var 变量名2 as string = materialPart.getMaterial().getName();
var materialName as string = materialPart.getMaterial().getName();
//cot注册物品/方块,微改动
//注册方块、物品,将ID拼接,类似于上文的 %s 部件ID
//var 变量名 as Block = VanillaFactory.createBlock("类型ID_" ~ materialName.toLowerCase(), <blockmaterial:iron>);
var frame as Block = VanillaFactory.createBlock("frame_" ~ materialName.toLowerCase(), <blockmaterial:iron>);
//以下就是正常的方块/物品注册部分,这里不过多叙述
frame.blockLayer = "CUTOUT";
frame.blockHardness = 3.0;
frame.blockResistance = 45.0;
frame.lightOpacity = 0;
frame.fullBlock = false;
frame.setToolClass("pickaxe");
frame.translucent = true;
frame.setToolLevel(1);
//设置自定义部件类型的材质路径
//变量名.textureLocation = mods.contenttweaker.ResourceLocation.create("contenttweaker:(blocks/items)/类型ID");
frame.textureLocation = mods.contenttweaker.ResourceLocation.create("contenttweaker:blocks/frame");
//设置物品颜色,当然这里建议使用materialPart.getCTColor()直接返回材料的颜色
//变量名.itemColorSupplier = function(item, tintindex) { xxx };
frame.itemColorSupplier = function(item, tintindex) {
return materialPart.getCTColor();
};
//设置方块颜色,同上,如果你自定义部件类型不是block当然就不用写这个
//变量名.blockColorSupplier = function(state, access, pos, tintindex) { xxx };
frame.blockColorSupplier = function(state, access, pos, tintIndex) {
return materialPart.getCTColor();
};
//结束构建
//变量名.register();
frame.register();
});
//然后给自定义部件应用上这个自定义部件类型,然后你使用这个部件去创建材料就行了
//自定义部件
//val 变量名 = mods.contenttweaker.MaterialSystem.getPartBuilder().setName("cool_part").setPartType(自定义部件类型对象).build();
val ourPart = mods.contenttweaker.MaterialSystem.getPartBuilder().setName("cool_part").setPartType(frame).build();
//自定义材料
val ourMaterial = MaterialSystem.getMaterialBuilder().setName("Lawrencium").setColor(15426660).build();
//注册材料部件
ourMaterial.registerPart(ourPart);