【问题标题】:Modify mob spawn rates in a Forge Minecraft mod (1.16)在 Forge Minecraft mod (1.16) 中修改暴徒生成率
【发布时间】:2021-05-07 18:01:23
【问题描述】:

我是 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 使用到makeGiantTaigaBiomemakeBirchForestBiome 等。我的结论是我需要改变生物群落以改变生成率。 p>

我可以使用BiomeRegistryForgeRegistries.BIOMES 访问生物群系。我在这里看到两种方法:

  1. 完全替换生物群系地图。 遗憾的是,它的 register 方法是 private,所以我无法添加新的生物群系来替换现有的生物群系。我还读到 here 说删除它们显然是不可能的。
  2. 修改现有的生物群系地图。这将使用biome.withMobSpawnSettings(MobSpawnInfo mobSpawnSettings) 就地修改生物群系。但是MobSpawnInfo 再一次没有任何公共设置器,所以我不明白如何在不手动重新创建整个MobSpawnInfo 对象的情况下获得修改后的MobSpawnInfo

大多数在线解决方案(12)似乎都提出了以下问题,遗憾的是在当前的 1.16.4 中不再适用:

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

任何帮助将不胜感激。

【问题讨论】:

    标签: java minecraft minecraft-forge


    【解决方案1】:

    不要尝试使用 Mixins 修改现有的 Minecraft 软件包——这被称为 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可以用来达到类似的效果,不需要编码。

    【讨论】:

    • It Needs to be "public static void onBiomeLoadingEvent" 在您的示例中缺少“static”,否则它根本不会执行。我希望它能帮助那些对为什么它不会产生自定义小怪但代码不会抛出错误感到困惑的人。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-31
    • 1970-01-01
    相关资源
    最近更新 更多