在一个伪造的雷工模型中修改怪物的繁殖率(1.16)

92vpleto  于 2021-06-30  发布在  Java
关注(0)|答案(1)|浏览(318)

我是新的改装雷艇,我想知道如何改变暴徒产卵率。比如说,我们想产生很多恩德门。
到目前为止,我已经找到了代码,似乎设置产卵频率
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.javamakeGiantTaigaBiome , makeBirchForestBiome 我的结论是我需要改变生物群落来改变产卵率。
我可以用任何一种方法进入生物群落 BiomeRegistry 或者 ForgeRegistries.BIOMES . 我在这里看到两种方法:
完全替换生物群落图。可悲的是 register 方法是 private 所以我不能添加新的生物群落来取代现有的生物群落。我在这里也读到,删除他们显然是不可能的。
修改现有的生物群落图。这将使用 biome.withMobSpawnSettings(MobSpawnInfo mobSpawnSettings) 改造生物群落。但是 MobSpawnInfo 类再次没有任何公共setter,所以我不知道如何获得修改的 MobSpawnInfo 不需要重新创建整个 MobSpawnInfo 用手拿东西。
大多数在线解决方案(1,2)似乎建议以下内容,但遗憾的是,这些内容在当前的1.16.4中不再适用:

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

任何帮助都将不胜感激。

gfttwv5a

gfttwv5a1#

不要试图用mixins修改现有的minecraft包——这被称为coremoding,出于各种原因不赞成。1.16的正确方法是订阅一个biomeloadingevent,然后在加载所有biome之后,对它们进行修补:
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));
        });
    }
}

相关问题