Шанс генерации структуры

Версия Minecraft
1.12.2
1,031
19
87
Создал значит структуру, зарегистрировал её генератор. Генерируется но... Ну короче смотрите:
2018-08-29_18.18.07.png
Как по человечески настроить генерацию например на поверхности и с шансом 1 структура на 128 чанков?
Java:
public class Shrine implements IWorldGenerator {

    @Override
    public void generate (Random random, int chunkX, int chunkZ, World world, IChunkGenerator chunkGenerator, IChunkProvider chunkProvider) {
      
        final BlockPos basePos = new BlockPos(chunkX * 16 + random.nextInt(128), 32 + random.nextInt(32), chunkZ * 16 + random.nextInt(128));
        final PlacementSettings settings = new PlacementSettings().setRotation(Rotation.NONE);
        final Template template = world.getSaveHandler().getStructureTemplateManager().getTemplate(world.getMinecraftServer(), new ResourceLocation("excaliburcraft:shrine"));
        
        template.addBlocksToWorld(world, basePos, settings);
        
    }

}
 
Решение
Оберни это например в rand.nextInt(100) < 10 и уже получишь самый простой 10% шанс спавна структуры в чанке. Это самое простое. Ну или же в цикле например несколько раз проверять и искать, попадет ли рандом в верхний блок земли, там и генерить. Плюс можешь добавлять всякие разные другие проверки - у тебя в распоряжении есть координаты, мир и все необходимое.
7,099
324
1,510
например на поверхности
Чекай, что есть земля под ногами.
Т.е. слой земли, а над ним воздух высотой в размер структуры

Есть ли готовый шаблон генерации в ванили не знаю, но можно глянуть деревни

P.S. В руке меч классно выглядит, а в инвентаре как-то слишком сглажено, не находишь?
 
1,031
19
87
5,018
47
783
Во первых ты должен сместить в центр свою структуру, чтобы избежать каскадной генерации.
Java:
    int x = (chunkX << 4) + trrand.nextInt(8);
    int z = (chunkZ << 4) + trrand.nextInt(8);
А этот рендом поможет тебе рандомно располагать твою структуру в чанке.
y надо получать через world.getActualState(или как то так)
Но вообще, если тебе нужно именно землю\камень\траву, то тупо чекай проверкой, не так уж это и трудно
Java:
        int y = 35 + trrand.nextInt(20);

if(world.getBlockState(pos.down).getBlock() != Blocks.GRASS) return;
В третьих у тебя этот код крашнет сервер, так как генерить нужно через серверный мир. Может он конечно по дефолту серверный, я не проверял, но мне кастить спокойнее.


Java:
        BlockPos pos = new BlockPos(x, y, z);
        WorldServer worldServer = (WorldServer)world;
        MinecraftServer minecraftServer = world.getMinecraftServer();
        TemplateManager templateManager = worldServer.getStructureTemplateManager();

Код наполовину писал от балды для примера, не вздумай копировать.
 
1,031
19
87
Код наполовину писал от балды для примера, не вздумай копировать.
А смысл? Мне такой же код тундра писал в одной из тем. :eek:k_hand:
сместить в центр свою структуру, чтобы избежать каскадной генерации
Это я уже понял по экспериментам.
Но!
Даже если вот так делать:
Java:
int x = (chunkX << 4) + 8;
        int z = (chunkZ << 4) + 8;
        int y = random.nextInt(world.getActualHeight());

        BlockPos position = new BlockPos(x, y, z);
        WorldServer worldServer = (WorldServer)world;
        MinecraftServer minecraftServer = world.getMinecraftServer();
        TemplateManager templateManager = worldServer.getStructureTemplateManager();
        Template template = templateManager.get(minecraftServer, new ResourceLocation("excaliburcraft:shrine"));
        PlacementSettings settings = new PlacementSettings();

        template.addBlocksToWorld(world, position, settings);
То я не могу понять как изменить шанс генерации структуры, смотрел в ванили, ничего нету(так искал) подскажи клас где может быть инфа о шансах генерации?
 
Последнее редактирование:

Eifel

Модератор
1,623
78
608
Оберни это например в rand.nextInt(100) < 10 и уже получишь самый простой 10% шанс спавна структуры в чанке. Это самое простое. Ну или же в цикле например несколько раз проверять и искать, попадет ли рандом в верхний блок земли, там и генерить. Плюс можешь добавлять всякие разные другие проверки - у тебя в распоряжении есть координаты, мир и все необходимое.
 
Последнее редактирование:
7,099
324
1,510
1,031
19
87
Оберни это например в rand.nextInt(100) < 10 и уже получишь самый простой 10% шанс спавна структуры в чанке.
Это типа так использовать?
Java:
if(random.nextInt(100) < 10) {
          
        int x = (chunkX << 4) + 8;
        int z = (chunkZ << 4) + 8;
        int y = random.nextInt(world.getActualHeight());

        BlockPos position = new BlockPos(x, y, z);
        WorldServer worldServer = (WorldServer)world;
        MinecraftServer minecraftServer = world.getMinecraftServer();
        TemplateManager templateManager = worldServer.getStructureTemplateManager();
        Template template = templateManager.get(minecraftServer, new ResourceLocation("excaliburcraft:shrine"));
        PlacementSettings settings = new PlacementSettings();

        template.addBlocksToWorld(world, position, settings);
          
}
PS: писать хороший мод и знать Java в моём случае разные вещи, поэтому могу нести бред.
 
586
32
136
Java:
public class Shrine implements IWorldGenerator {
    private static ResourceLocation SHRINE = new ResourceLocation("excaliburcraft:shrine");
    @Override
    public void generate(Random random, int chunkX, int chunkZ, World world, IChunkGenerator chunkGenerator, IChunkProvider chunkProvider) {
        if (random.nextInt(100) < 10) {
            int x = (chunkX << 4) + 8;
            int z = (chunkZ << 4) + 8;
            int y = random.nextInt(world.getActualHeight());
            BlockPos position = new BlockPos(x, y, z);
            WorldServer worldServer = (WorldServer) world;
            MinecraftServer minecraftServer = world.getMinecraftServer();
            TemplateManager templateManager = worldServer.getStructureTemplateManager();
            Template template = templateManager.getTemplate(minecraftServer, SHRINE);
            PlacementSettings settings = new PlacementSettings();
            template.addBlocksToWorld(world, position, settings);
        }
    }
}
 
Сверху