Я новичок в моддинге Minecraft, и мне было интересно, как изменить скорость появления мобов. Допустим, мы хотим, например, создать много эндерменов.
До сих пор я нашел код, который, кажется, устанавливает частоту появления в net.minecraft.world.biome
DefaultBiomeFeatures.java
:
public static void withHostileMobs(MobSpawnInfo.Builder builder) {
...
builder.withSpawner(EntityClassification.MONSTER, new MobSpawnInfo.Spawners(EntityType.ENDERMAN, 10, 1, 4));
...
}
это означает, что эндермены появляются в большинстве биомов, хотя и редко (10 — это вес, у криперов и пауков — 100).
Я знаю, что это DefaultBiome
затем используется BiomeMaker.java
для makeGiantTaigaBiome
, makeBirchForestBiome
и т. д. Я пришел к выводу, что мне нужно изменить биомы, чтобы изменить скорость появления.
Я могу получить доступ к биомам, используя BiomeRegistry
или ForgeRegistries.BIOMES
. Я вижу здесь 2 подхода:
register
метод private
, поэтому я не могу добавлять новые биомы для замены существующих. Еще я прочитала здесь, что удалить их, видимо, невозможно.biome.withMobSpawnSettings(MobSpawnInfo mobSpawnSettings)
для изменения биома на месте. Но класс MobSpawnInfo
снова не имеет общедоступных сеттеров, поэтому я не вижу, как я могу получить модифицированный MobSpawnInfo
без повторного создания всего MobSpawnInfo
объекта вручную.Большинство онлайн-решений (1 , 2), по-видимому, предлагают следующее, что, к сожалению, больше не работает в текущей версии 1.16.4:
ModLoader.addSpawn(YOURENTITY.class, 25, 1, 3);
EntityRegistry.addSpawn(...)
Любая помощь будет принята с благодарностью.
Не пытайтесь изменить существующий пакет Minecraft с помощью Mixins — это называется coremodding и не одобряется по разным причинам. Правильный подход для версии 1.16 — подписаться на событие BiomeLoadingEvent, а затем пропатчить все биомы после их загрузки:
1,16
@Mod("example")
public class ExampleMod
{
public ExampleMod() {
MinecraftForge.EVENT_BUS.register(this);
}
@SubscribeEvent(priority = EventPriority.HIGH)
public void onBiomeLoadingEvent(BiomeLoadingEvent event) {
List<MobSpawnInfo.Spawners> spawns =
event.getSpawns().getSpawner(EntityClassification.MONSTER);
// Remove existing Enderman spawn information
spawns.removeIf(e -> e.type == EntityType.ENDERMAN);
// Make Enderman spawns more frequent and add Blaze spawns in all biomes
spawns.add(new MobSpawnInfo.Spawners(EntityType.BLAZE, 200, 1, 4));
spawns.add(new MobSpawnInfo.Spawners(EntityType.ENDERMAN, 200, 1, 4));
}
}
1.15 (также может работать в 1.14, 1.13, 1.12, ...)
@Mod("example")
public class ExampleMod
{
public ExampleMod() {
ForgeRegistries.BIOMES.forEach(biome -> {
List<Biome.SpawnListEntry> spawns = biome.getSpawns(EntityClassification.MONSTER);
spawns.removeIf(e -> e.entityType == EntityType.ENDERMAN);
spawns.add(new Biome.SpawnListEntry(EntityType.BLAZE, 200, 1, 4));
spawns.add(new Biome.SpawnListEntry(EntityType.ENDERMAN, 200, 1, 4));
});
}
}
Обновлено: обратите внимание, что InControl можно использовать для достижения аналогичного эффекта, не требуя кодирования.
Это должно быть «public static void onBiomeLoadingEvent», в вашем примере отсутствует «static», иначе он вообще не будет выполняться. Я надеюсь, что это поможет людям, которые запутались, почему он не будет создавать пользовательских мобов, но код не выдает ошибок.