Minecraft 1.12.2 創造模式下出現凋零骷髏的條件

几乎跟我的Minecraft博客有点像,但不知道这样的内容适合在Qiita上发布吗。

环境

    • Minecraft 1.12.2 Java Edition

 

    forgeSrc-1.12.2-14.23.4.2705

请问有什么问题吗?我想调查一下在下界堡垒中,凋零骷髅的生成坐标是如何确定的。一旦了解了这一点,对于创建凋零骷髅刷怪塔的战略将非常有帮助。

在这里不考虑亮度和障碍物,仅仅考虑在给定坐标创建涌泉时是否可以喷涌。

相关文章

    [1] ウィザースケルトントラップの作り方 湧き層 編 #366 – オロオロKTのマイクラブログ http://blog.minecraft-oroorokt.com/entry/2017/11/06/%E3%82%A6%E3%82%A3%E3%82%B6%E3%83%BC%E3%82%B9%E3%82%B1%E3%83%AB%E3%83%88%E3%83%B3%E3%83%88%E3%83%A9%E3%83%83%E3%83%97%E3%81%AE%E4%BD%9C%E3%82%8A%E6%96%B9_%E6%B9%A7%E3%81%8D%E5%B1%A4_%E7%B7%A8_%2336

制作使用凋零骷髅陷阱的文章。听说在连续出现两个十字路口的地方敌对怪物易于生成。

在这篇文章中,它提到在桥梁与桥梁之间的空间中,是否确实能够形成温泉层?

调查

召唤死灵骷髅(Wither Skeleton)ウィザースケルトン的类别是net.minecraft.entity.monster.EntityWitherSkeleton。


在Minecraft中的Nether要塞结构生成器net.minecraft.world.gen.structure.MapGenNetherBridge中,有一段描述将凋灵骷髅添加到生成列表中。

this.spawnList.add(new Biome.SpawnListEntry(EntityBlaze.class, 10, 2, 3));
this.spawnList.add(new Biome.SpawnListEntry(EntityPigZombie.class, 5, 4, 4));
this.spawnList.add(new Biome.SpawnListEntry(EntityWitherSkeleton.class, 8, 5, 5));
this.spawnList.add(new Biome.SpawnListEntry(EntitySkeleton.class, 2, 5, 5));
this.spawnList.add(new Biome.SpawnListEntry(EntityMagmaCube.class, 3, 4, 4));

据看起来,似乎有28.5%的几率生成5只凋零骷髅,但实际情况不明。暂时保持原样,因为我想知道生成条件,而非生成概率和效率(注意,岩浆怪、恶魂、僵尸猪人和末影人在下界的生成可能性在 net.minecraft.world.biome.BiomeHell 中有所说明,但是根据堡垒的生成列表和生物群系的普通生成列表两者中,我们根据维度来决定使用哪个,而且获得堡垒内判定后,后者会被忽略,所以我猜凋零骷髅生成点应该不会有末影人)。

可以通过List net.minecraft.world.gen.structure.MapGenNetherBridge.getSpawnList()获取该列表。

唯一一個使用到它的地方是在 net.minecraft.world.gen.ChunkGeneratorHell.getPossibleCreatures(EnumCreatureType creatureType, BlockPos pos) 函數中的 List 。

通常情况下,生物(EntityLiving)的生成条件由维度(IChunkGenerator)提供。

在下界的某个坐标可以生成的生物
所以,ChunkGeneratorHell.getPossibleCreatures的内容大致如下。

List<Biome.SpawnListEntry> getPossibleCreatures(EnumCreatureType creatureType, BlockPos pos)
{
    if (creatureType == ) {
        if (isInsideStructure(pos)) {
            return ネザー要塞のスポーンリスト;
        }
        if (isPositionInStructure(world, pos) && posの1個下がネザーレンガ) {
            return ネザー要塞のスポーンリスト;
        }
    }
    return ネザーの通常のスポーンリスト;
}

在这里,条件是Nether Brick必须是Block类型且Blocks.NETHER_BRICK。
即使是Nether Brick的Metadata不同也会有反应,但红色的Nether Brick由于Block不同而不行(如果可以的话在制作建材时就可以省下Netherrack了)。
即使是Nether Brick的子类也不行,因为它不是Block的实例。

这个要塞是否在下界?这里,以下两种可能是什么?可能是判断是不是下界要塞内部,但是有两种不同的判断方式。

    • boolean net.minecraft.world.gen.structure.MapGenStructure.isInsideStructure(BlockPos pos)

 

    boolean net.minecraft.world.gen.structure.MapGenStructure.isPositionInStructure(World worldIn, BlockPos pos)

这两个是MapGenStructure(结构物)共同的操作。村庄和废弃矿井等也具有这两个操作。MapGenStructure不是按照结构物而是按照维度存在一个。

地图生成结构. 在结构内部.
除了初始化等操作,大致的运行情况如下。

boolean isInsideStructure(BlockPos pos)
{
    return getStructureAt(pos) != null;
}

StructureStart getStructureAt(BlockPos pos)
{
    ObjectIterator objectiterator = structureMap.values().iterator();
    label31:
    while (objectiterator.hasNext()) {
        StructureStart structurestart = (StructureStart)objectiterator.next();

        if (structurestart.isSizeableStructure() && structurestart.getBoundingBox().isVecInside(pos)) {

            // (1)
            Iterator<StructureComponent> iterator = structurestart.getComponents().iterator();
            while (true) {
                if (!iterator.hasNext()) continue label31;
                StructureComponent structurecomponent = iterator.next();
                if (structurecomponent.getBoundingBox().isVecInside(pos)) break;
            }
            return structurestart;

        }

    }
    return null;
}

当指定坐标上存在一个结构物(在下界是下界要塞)时,进行生成,而不为空。在获取结构物的部分,逐个遍历结构物的每个组件并进行逐一判断。

记住(1)周围的事物。

地图生成结构.是否位置在结构中.
基本的框架与getStructureAt函数相似。

boolean isPositionInStructure(World worldIn, BlockPos pos)
{
    ObjectIterator objectiterator = structureMap.values().iterator();
    while (objectiterator.hasNext()) {
        StructureStart structurestart = (StructureStart)objectiterator.next();

        if (structurestart.isSizeableStructure() && structurestart.getBoundingBox().isVecInside(pos)) {

            // (2)
            return true;

        }

    }
    return false;
}

这里的(2)是对应于(1)的部分。(1)中进行了严格的房间逐一判断,然而(2)直接返回了true,因此变得相当粗略。

给我一个想法凋零骷髅会在以下情况下的任一出现。

    1. 在下面两个场景中的一个房间(包括通道)中

 

    在包括整个下界要塞的直方体范围内的下界砖块上面

如果用下界砖制作下界农场的地板,似乎能够保证相当数量的出怪。

验证
我使用以下代码覆盖了net.minecraft.item.ItemClock.onItemUse,并检查了能够生成凋灵骷髅的范围。

if (worldIn.isRemote) return EnumActionResult.SUCCESS;

for (int x = -40; x <= 40; x++) {
    for (int y = -100; y <= 100; y++) {
        for (int z = -40; z <= 40; z++) {

            BlockPos pos2 = pos.add(x, y, z);
            List<SpawnListEntry> chunkProvider = ((ChunkProviderServer) worldIn.getChunkProvider()).getPossibleCreatures(EnumCreatureType.MONSTER, pos2);
            if (chunkProvider.stream()
                .filter(e -> e.entityClass == EntityWitherSkeleton.class)
                .findAny()
                .isPresent()) {
                worldIn.setBlockState(pos2, Blocks.GLASS.getDefaultState());
            }

        }
    }
}
2018-09-27_05.25.52.png在玻璃完全覆盖的部分,被判定为1的位置是骷髅之王以25%的概率生成的地方。这样看来,虽然看起来相当狭窄,但实际上很宽敞。

由玻璃和下界砖所形成的条纹区域是凋零骷髅生成的位置。为什么会形成条纹呢?因为我们从底部开始将生成位置设置为玻璃,所以刚刚设置为玻璃的部分会从判定2中漏出。在判定2中,除了图中形成条纹的部分外,只要在围绕着下界要塞的大长方体内,任何地方都会被判定到。


2018-09-27_05.29.49.png在这张图片中,条纹图案在下方转换为下界砖填充,但是程序也正确地对该部分进行了判定。也就是说,那里不是下界要塞所包含的坐标。被下界要塞下方的下界砖填充的部分不是下界要塞的一部分。


在下面的图片里,只替换左半部分,右边保持不变。

2018-09-27_05.53.51.png可以如关联文章[1]所述,在桥的Y±4处创建一个湖泊,这样水就可以美观地流动。上层边界可能有些棘手,但敌人可能会直立在玻璃块的下方。我曾在另一个实验中使用了这种形式(上层使用了上半方块),并观察到敌人确实在上层出现过。


2018-09-27_05.34.29.png
看起来就算是这种偏僻之地如果下面是下界砖,那么凋零骷髅也会生成。真的会在这种地方生成层然后生成吗?

2018-09-27_05.38.45.png确定了。证明结束了。

得出結論凋零骷髅可能会在以下情况下产生。

    1. 在覆盖着下界堡垒任意房间(包括通道)的立方体范围内

 

    位于覆盖着整个下界堡垒立方体范围内的地狱砖上

请注意,下面的腿部不是尼德要塞的一部分。

审查如果本文所述属实,那么相关文章[1]中提到在桥梁空隙中也制造了涌动层,并且称涌动层的制作方块可以是任何可生成生物怪物的方块,但实际上那里并没有凋零骷髅生成。

由于证明难且没有可得之处,所以我不进行无用的证明。总的来说,如果地板铺上地狱砖,虽然不太精确,但大致上也能够生成。

bannerAds