前言

什么是材料系统?干什么用?如果你看过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);