我们有了自己的矿石,理所当然的就需要将它添加到我们的世界中去,本章将会介绍如何添加矿石的世界生成。
首先创建类
OreInitLoader.java
package com.zunipe;
import java.util.function.Predicate;
public class OreInitLoader
{
public OreInitLoader()
{
}
}
矿石的生成是依靠生物群系的ConfigureFeature实现的,ConfigureFeature能够实现的不仅仅限于矿石的生成,生物群系中的各种各样的修饰都是依靠它来实现的,例如草、树木等等。
这里创建我们生成矿石的ConfigureFeature。
public static final ConfiguredFeature<?, ?> VOID_ORE = Feature.ORE.configure(new OreFeatureConfig(
OreFeatureConfig.Rules.BASE_STONE_OVERWORLD,
BlockLoader.VOID_ORE.getDefaultState(),
9))
.uniformRange(YOffset.getBottom(), YOffset.getTop())
.spreadHorizontally().repeat(20);
我们可以看到,它仅需要1个参数,我们需要提供一个OreFeatureConfig,其中又包括3个参数,第一个是矿石生成的规则,也就是它在生成的时候要选择替换原本什么方块,第二个则是我们自己矿石的BlockState,有关BlockState的内容之后会讲,这里我们就用默认的即可,最后是一个整数,由于矿石的生成是一块一块的生成的,这里的数字就是一块中矿石的数量。
我们还需要对OreFeatureConfig进行修饰,uniformRange是对高度的控制,这里我们选择的是从世界的底部到顶部都可以生成,当然我们也可以自己选择高度,使用YOffset.fixed(50)即可,repeat顾名思义是重复生成多少次,这个数字决定了在一个区块中将会尝试生成矿脉的次数,通常我们可以通过控制矿脉的大小和次数控制矿石的稀有程度。
既然ConfigureFeature有了,接下来就是注册它。
OreInitLoader.java
public class OreInitLoader
{
public static final ConfiguredFeature<?, ?> VOID_ORE = Feature.ORE.configure(new OreFeatureConfig(
OreFeatureConfig.Rules.BASE_STONE_OVERWORLD,
BlockLoader.VOID_ORE.getDefaultState(),
9))
.uniformRange(YOffset.getBottom(), YOffset.fixed(50))
.spreadHorizontally().repeat(20);
public OreInitLoader()
{
register(VOID_ORE, BiomeSelectors.foundInOverworld(), "void_ore");
}
private void register(ConfiguredFeature<?, ?> configuredFeature, Predicate<BiomeSelectionContext> predicate, String name)
{
RegistryKey<ConfiguredFeature<?, ?>> key = RegistryKey.of(Registry.CONFIGURED_FEATURE_KEY,
new Identifier("haha", name));
Registry.register(BuiltinRegistries.CONFIGURED_FEATURE, new Identifier("haha", name), configuredFeature);
BiomeModifications.addFeature(predicate, GenerationStep.Feature.UNDERGROUND_ORES, key);
}
}
然后再把OreInitLoader丢进主类。
public class FabricExample implements ModInitializer
{
public static final Logger LOGGER = LogManager.getLogger("haha");
@Override
public void onInitialize()
{
new ItemLoader();
new BlockLoader();
new OreInitLoader();
}
}
然后我们就可以进游戏看看效果了。
为了方便的看到效果我们可以用/fill指令把石头都替换成空气,免得还得去找它。
/fill ~ ~ ~ ~16 ~-50 ~16 air replace stone
当然我们也可以更改替换的规则,可以让矿石生成在地表上。
public static final ConfiguredFeature<?, ?> VOID_ORE = Feature.ORE.configure(new OreFeatureConfig(
new BlockMatchRuleTest(Blocks.AIR),
BlockLoader.VOID_ORE.getDefaultState(),
9))
.uniformRange(YOffset.getBottom(), YOffset.fixed(200))
.spreadHorizontally().repeat(20);
效果就是这样的