我的世界fabric-1-21-1mod制作心得三——数据生成

java文件


因为我的世界这款游戏其实需要很多json文件,但手动书写很容易出现错误。所以fabric提供了数据生成类,用来实现自动生成json文件。减少工作量,避免出错。

注意:以下的文件生成类的类名没有要求,但建议起一个意义明确的名字。


AModBlockTagProvider.java

此文件用于生成方块的tag数据。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public class AModBlockTagsProvider extends FabricTagProvider.BlockTagProvider {
// 此类需要继承fabric提供的抽象类,并实现以下方法。
public AModBlockTagsProvider(FabricDataOutput output, CompletableFuture<RegistryWrapper.WrapperLookup> registriesFuture) {
super(output, registriesFuture); // super构造方法
}

@Override
protected void configure(RegistryWrapper.WrapperLookup wrapperLookup) {
// 这里用是一个定义方块用稿子挖掘的tag标签
getOrCreateTagBuilder(BlockTags.PICKAXE_MINEABLE)
// 用add方法添加
.add(AModBlocks.物品常量名);

// 这里是一个用来定义需要铁镐以上挖掘等级的tag标签
getOrCreateTagBuilder(BlockTags.NEEDS_IRON_TOOL)
.add(AModBlocks.物品常量名);

// 类似方法可以自行查看。您也可以自行定义一个更高的挖掘等级。
}
}

AModItemTagsProvider.java

1
2
3
4
5
6
7
8
9
10
11
public class AModItemTagsProvider extends FabricTagProvider.ItemTagProvider {
// 这个是定义物品tag的数据生成类。和方块类似,不多赘述。
public AModItemTagsProvider(FabricDataOutput output, CompletableFuture<RegistryWrapper.WrapperLookup> completableFuture) {
super(output, completableFuture);
}

@Override
protected void configure(RegistryWrapper.WrapperLookup wrapperLookup) {

}
}

AModLootTableProvider.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
public class AModLootTableProvider extends FabricBlockLootTableProvider {
// 这时生成战利品列表的数据生成类。
public AModLootTableProvider(FabricDataOutput dataOutput) {
super(dataOutput);
}

@Override
public void generate() {
addDrop(AModBlocks.方块常量名);
// 这时方块的战利品列表,掉落方块本身。
}

// 下面提供一个矿石类方块的战利品列表生成方法。
// drop方块对象,item物品对象(比如铁矿石对应粗铁),min和max最大最小值。
public LootTable.Builder likeCopperOreDrops(Block drop, Item item, float min, float max){
// dropswithSilkTouch代表精准采集,意思如果稿子有精准采集则掉落方块本身。
return dropsWithSilkTouch(
drop,//掉落方块本身
// applyExplosionDecay应用爆炸衰减,如果方块是被爆炸破坏的掉落物减少
(LootPoolEntry.Builder<?>)this.applyExplosionDecay(
drop,
// 创建一个物品条目,表示掉落的物品
ItemEntry.builder(item)
// 这里设置一般情况掉落物品的最大最小值。
.apply(SetCountLootFunction.builder(UniformLootNumberProvider.create(min, max)))
// 应用时运附魔,用时运稿挖掘时掉落物依据时运规则增加。
.apply(ApplyBonusLootFunction.oreDrops(Enchantments.FORTUNE))
)
);
}
}

AModModelsProvider.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public class AModModelsProvider extends FabricModelProvider {
public AModModelsProvider(FabricDataOutput output) {
super(output);
}

@Override
public void generateBlockStateModels(BlockStateModelGenerator blockStateModelGenerator) {
// 这个方法registerSimpleCubeAll,意思是普通的方块,并且六个面贴图都一样。
blockStateModelGenerator.registerSimpleCubeAll(AModBlocks.方块);
}

@Override
public void generateItemModels(ItemModelGenerator itemModelGenerator) {
// 这里添加物品,第二个参数是模型类型。Models.GENERATED表示普通的扁物品,是原版的大多数物品。
itemModelGenerator.register(AModItems.物品, Models.GENERATED);
itemModelGenerator.register(AModItems.物品, Models.GENERATED);
}
}

AModRecipesProvider.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
public class AModRecipesProvider extends FabricRecipeProvider {
// 这是配方生成类。包括合成表,熔炼表。
public AModRecipesProvider(FabricDataOutput output) {
super(output);
}

// 这里定义了一个物品列表,可以方便使用。
// 比如所有原木都可以烧成木炭,就可以把所有原木写到一个列表里。
public static final List<ItemConvertible> 列表名 = List.of(AModItems.物品);

@Override
public void generate(Consumer<RecipeJsonProvider> exporter) {
// 这里是一个“块”到“锭”的相互转换合成配方。比如铁锭到铁块,钻石到钻石块等
offerReversibleCompactingRecipes(exporter, RecipeCategory.MISC, AModItems.物品,
RecipeCategory.BUILDING_BLOCKS, AModBlocks.方块);

// 这里定义熔炉熔炼配方,RecipeCategory.MISC表示配方分类杂项。
// 0.7f表示获得的经验值。200表示消耗的时间tick(1/20秒)。
offerSmelting(exporter, 原料, RecipeCategory.MISC, 产物, 0.7f, 200, "配方标识符");
// 这里是高炉的熔炼配方,同上。
offerBlasting(exporter, 原料, RecipeCategory.MISC, 产物, 0.7f, 100, "配方标识符");

// ShapelessRecipeJsonBuilder无序合成表。
ShapelessRecipeJsonBuilder.create(RecipeCategory.MISC, 输出物品, 数量)
.input(输入一)
.input(输入二)
// 以下用于定义配方的解锁方式,意思是当获得“AModItems.物品”时,解锁此配方。
.criterion(hasItem(AModItems.物品), conditionsFromItem(AModItems.物品))、、
// 将配方输出到exporter,添加标识符。
.offerTo(exporter, new Identifier(CelestialMod.MOD_ID, "配方标识符"));

// ShapedRecipeJsonBuilder有序合唱表。
// RecipeCategory.FOOD配方分类,食物类。
// 输出物品Items.SUGAR。原版的糖。最后是数量。
ShapedRecipeJsonBuilder.create(RecipeCategory.FOOD, Items.SUGAR, 2)
// pattern表示物品在工作台里的位置,第一个表示第一行。最多写三行。
// #表示物品标识符,可以用任意字符。
.pattern("###")
// 这里对“#”,符号进行解释。意思是#代表原版甜菜根。
.input('#', Items.BEETROOT)
// 同上。
.criterion(hasItem(Items.BEETROOT), conditionsFromItem(Items.BEETROOT))
// 同上。
.offerTo(exporter, new Identifier(CelestialMod.MOD_ID, "beetroot_sugar"));

}
}

AModEnUsLanguageProvider.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class AModEnUsLanguageProvider extends FabricLanguageProvider {
// 这里是语言翻译类。
public AModEnUsLanguageProvider(FabricDataOutput dataOutput) {
// 这里代表翻译文件的语种。"en_us"表示英语。“zh_cn”表示中文。
super(dataOutput, "en_us");
}

@Override
public void generateTranslations(TranslationBuilder translationBuilder) {
translationBuilder.add(AModItems.物品, "名");

translationBuilder.add(AModBlocks.方块, "名");

translationBuilder.add(AModItemGroups.物品栏, "名");
}
}