Изменить скорость появления мобов в моде Forge Minecraft (1.16)

Я новичок в моддинге Minecraft, и мне было интересно, как изменить скорость появления мобов. Допустим, мы хотим, например, создать много эндерменов.

До сих пор я нашел код, который, кажется, устанавливает частоту появления в net.minecraft.world.biomeDefaultBiomeFeatures.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 подхода:

  1. Полностью заменить карту биомов. К сожалению, его register метод private, поэтому я не могу добавлять новые биомы для замены существующих. Еще я прочитала здесь, что удалить их, видимо, невозможно.
  2. Измените существующую карту биомов. Это будет использовать biome.withMobSpawnSettings(MobSpawnInfo mobSpawnSettings) для изменения биома на месте. Но класс MobSpawnInfo снова не имеет общедоступных сеттеров, поэтому я не вижу, как я могу получить модифицированный MobSpawnInfo без повторного создания всего MobSpawnInfo объекта вручную.

Большинство онлайн-решений (1 , 2), по-видимому, предлагают следующее, что, к сожалению, больше не работает в текущей версии 1.16.4:

ModLoader.addSpawn(YOURENTITY.class, 25, 1, 3);
EntityRegistry.addSpawn(...)

Любая помощь будет принята с благодарностью.

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
0
13 581
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Не пытайтесь изменить существующий пакет 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», иначе он вообще не будет выполняться. Я надеюсь, что это поможет людям, которые запутались, почему он не будет создавать пользовательских мобов, но код не выдает ошибок.

Skylander 07.05.2021 12:01

Другие вопросы по теме