有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

爪哇修改怪物在锻造雷霆模型中的繁殖率(1.16)

我刚开始改装雷霆战舰,我想知道如何改变怪物的繁殖率。比如说,我们想要产生很多恩德曼

到目前为止,我已经找到了在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.javamakeGiantTaigaBiomemakeBirchForestBiome等等使用。我的结论是,我需要改变生物群落来改变产卵率

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

  1. 完全替换生物群落地图不幸的是,它的register方法是private,所以我不能添加新的生物群落来取代现有的生物群落。我还读到here删除它们显然是不可能的
  2. 修改现有的生物群落地图这将使用biome.withMobSpawnSettings(MobSpawnInfo mobSpawnSettings)来修改原地的生物群落。但是MobSpawnInfo 再次没有任何公共setter,因此我不知道如何在不手动重新创建整个MobSpawnInfo对象的情况下获得修改的MobSpawnInfo

大多数在线解决方案(12)似乎建议以下内容,但遗憾的是,这些内容在当前的1.16.4中不再有效:

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

任何帮助都将不胜感激


共 (1) 个答案

  1. # 1 楼答案

    不要试图使用名为CoreModing且因各种原因不受欢迎的mixin来修改现有的Minecraft软件包。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));
            });
        }
    }
    

    编辑:注意InControl可以用来实现类似的效果,不需要编码