Рандомные координаты

Версия Minecraft
1.12.2
5,018
47
783
Здравствуйте еще раз. У меня вопрос - мне нужно получить координаты рандомного блока из прогруженных чанков. Каким бы образом можно это провернуть?
Отсчет от игрока не предлагать - не вариант. Точнее, накостылить с сохранением последней позиции игрока в WSD и тому подобной костыльной гадостью, вариант, но во первых это костыль, а во вторых я с WSD не в ладах :)
 
3,005
192
592
Махик, посмотри сурцы метода getTopSolidOrLiquidBlock.
Посмотри, он где-то использует твой Y, который ты зарандомил?
Хоть где-то?
Соррь, спойлеры.. Не ищи.
Он не использует.
А вот проверка, через которую задается возвращаемый Y:
Он циклом от Chunk#getTopFilledSegment() до >= делает такой иф:
Код:
state.getMaterial().blocksMovement() && !state.getBlock().isLeaves(state, this, blockpos1) && !state.getBlock().isFoliage(this, blockpos1)
А если у тебя выдает -1, значит эта проверка не прошла...
По идеи, добавь такое:
Код:
BlockPos pos = getRandom что-то там;
while (pos.getY() < 0) {
pos = getRandom что-то там;
}
 
5,018
47
783
Не помогло. Цикл вообще грохает майн(виснет намертво), а если просто иф - то игнор
 
3,005
192
592
Значит он не может найти.
Попробуй сам тп на координаты.
Если там есть что-то, то попробуй код еще раз (который цикл).
Если нету - то Хз.
Мб код как-то берет не загруженный чанк.
 
7,099
324
1,510
Нужно задавать рандомный y после getTopSolidOrLiquidBlock
 
7,099
324
1,510
Не вижу, где ты так делал. И перестань скринить код, оформляй в теги
 
5,018
47
783
Вот, пожалуйста. -1, как обычно.

Java:
    public BlockPos getRandomCoordFromChunk(World world) {


        ChunkProviderClient cp = (ChunkProviderClient)world.getChunkProvider();
        List<Chunk> chunks = Lists.newArrayList(cp.chunkMapping.values());
        Chunk chunk = chunks.get(RandomUtils.nextInt(0, chunks.size()));
        int x = chunk.x + RandomUtils.nextInt(0, 16);

        int z = chunk.z + RandomUtils.nextInt(0, 16);
        BlockPos pos =  world.getTopSolidOrLiquidBlock(new BlockPos(x,0, z));
        
        return pos;

    }

    @SubscribeEvent
    public void render(RenderWorldLastEvent e) {
        World world = Minecraft.getMinecraft().world;

        if(!mc.isGamePaused()) {
            GlStateManager.enableBlend();
            GlStateManager.color(1.0F, 1.0F, 1.0F, 0.5F);
            GlStateManager.doPolygonOffset(-3.0F, -3.0F);
            GlStateManager.enablePolygonOffset();
            GlStateManager.alphaFunc(516, 0.1F);
            GlStateManager.enableAlpha();
            GlStateManager.pushMatrix();
            playerpos = mc.player.getPosition();
            ChunkProviderClient cp = (ChunkProviderClient)world.getChunkProvider();
            List<Chunk> chunks = Lists.newArrayList(cp.chunkMapping.values());
            Chunk chunk = chunks.get(RandomUtils.nextInt(0, chunks.size()));
            
            BlockPos pos = this.getRandomCoordFromChunk(world);
            int y = world.rand.nextInt(10);
            
            if(world.isRemote) {
                
                    drawPuddleTexture(mc.player, mc.getRenderPartialTicks(), pos.getX(), y, pos.getZ(), mc.world, "realism:textatlas/puddle");
                    System.out.println("puddle on: " + pos);
                    System.out.println("loaded: " +chunk.isLoaded());
                
            }

            GlStateManager.disableAlpha();
            GlStateManager.doPolygonOffset(0F, 0.0F);
            GlStateManager.disablePolygonOffset();
            GlStateManager.enableAlpha();
            GlStateManager.depthMask(true);
            GlStateManager.popMatrix();
        }
    }

Вывод
Код:
[12:22:49] [main/INFO] [STDOUT]: [ru.legendgamer.Realism.Events.GameEvents.RenderEvents.PuddleEvent:render:83]: puddle on: BlockPos{x=75, y=-1, z=14}
[12:22:49] [main/INFO] [STDOUT]: [ru.legendgamer.Realism.Events.GameEvents.RenderEvents.PuddleEvent:render:84]: loaded: true
[12:22:49] [main/INFO] [STDOUT]: [ru.legendgamer.Realism.Events.GameEvents.RenderEvents.PuddleEvent:render:83]: puddle on: BlockPos{x=65, y=-1, z=0}
[12:22:49] [main/INFO] [STDOUT]: [ru.legendgamer.Realism.Events.GameEvents.RenderEvents.PuddleEvent:render:84]: loaded: true
[12:22:49] [main/INFO] [STDOUT]: [ru.legendgamer.Realism.Events.GameEvents.RenderEvents.PuddleEvent:render:83]: puddle on: BlockPos{x=73, y=-1, z=-3}
 
3,005
192
592
BlockPos pos = this.getRandomCoordFromChunk(world);
int y = world.rand.nextInt(10);
Ты делаешь такое.
Потом выводишь пос.
System.out.println("puddle on: " + pos);
Это нормально, что в pos y = -1.
Код:
BlockPos posRand = this.getRandomCoordFromChunk(world);
BlockPos pos = new BlockPos(posRand.getX(), world.rand.nextInt(10), posRand.getZ());
 
5,018
47
783
Вот, это уже продвижение... Теперь игрик уже нормальный. Но все равно не рендерится текстура. :(
Точнее консоль говорит, что рендерится, но только вот что это за координаты, относительно чего?...
Java:
[15:49:16] [main/INFO] [STDOUT]: [ru.legendgamer.Realism.Events.GameEvents.RenderEvents.PuddleEvent:render:84]: puddle on: BlockPos{x=-23, y=4, z=-4}
[15:49:16] [main/INFO] [STDOUT]: [ru.legendgamer.Realism.Events.GameEvents.RenderEvents.PuddleEvent:render:85]: loaded: true
[15:49:16] [main/INFO] [STDOUT]: [ru.legendgamer.Realism.Events.GameEvents.RenderEvents.PuddleEvent:render:84]: puddle on: BlockPos{x=-9, y=4, z=17}
[15:49:16] [main/INFO] [STDOUT]: [ru.legendgamer.Realism.Events.GameEvents.RenderEvents.PuddleEvent:render:85]: loaded: true
[15:49:16] [main/INFO] [STDOUT]: [ru.legendgamer.Realism.Events.GameEvents.RenderEvents.PuddleEvent:render:84]: puddle on: BlockPos{x=1, y=4, z=18}
[15:49:16] [main/INFO] [STDOUT]: [ru.legendgamer.Realism.Events.GameEvents.RenderEvents.PuddleEvent:render:85]: loaded: true
[15:49:16] [main/INFO] [STDOUT]: [ru.legendgamer.Realism.Events.GameEvents.RenderEvents.PuddleEvent:render:84]: puddle on: BlockPos{x=3, y=4, z=5}
[15:49:16] [main/INFO] [STDOUT]: [ru.legendgamer.Realism.Events.GameEvents.RenderEvents.PuddleEvent:render:85]: loaded: true
[15:49:16] [main/INFO] [STDOUT]: [ru.legendgamer.Realism.Events.GameEvents.RenderEvents.PuddleEvent:render:84]: puddle on: BlockPos{x=-6, y=4, z=20}
[15:49:16] [main/INFO] [STDOUT]: [ru.legendgamer.Realism.Events.GameEvents.RenderEvents.PuddleEvent:render:85]: loaded: true
[15:49:17] [main/INFO] [STDOUT]: [ru.legendgamer.Realism.Events.GameEvents.RenderEvents.PuddleEvent:render:84]: puddle on: BlockPos{x=-15, y=4, z=3}
[15:49:17] [main/INFO] [STDOUT]: [ru.legendgamer.Realism.Events.GameEvents.RenderEvents.PuddleEvent:render:85]: loaded: true
 

tox1cozZ

aka Agravaine
8,456
598
2,893
Не помню только, нужно ли координаты чанка умножать на 16
Умножь x и z на 16. Вот по-этому у тебя y и был -1, потому-что таких координат не существовало, точнее они не были загружены.
 
5,018
47
783
Ну эм.. оно просто умножилось на 16 и ничего не изменилось¯\_(ツ)_/¯
Java:
    @SubscribeEvent
    public void render(RenderWorldLastEvent e) {
        World world = Minecraft.getMinecraft().world;

        if(!mc.isGamePaused()) {
            GlStateManager.enableBlend();
            GlStateManager.color(1.0F, 1.0F, 1.0F, 0.5F);
            GlStateManager.doPolygonOffset(-3.0F, -3.0F);
            GlStateManager.enablePolygonOffset();
            GlStateManager.alphaFunc(516, 0.1F);
            GlStateManager.enableAlpha();
            GlStateManager.pushMatrix();
            playerpos = mc.player.getPosition();
            ChunkProviderClient cp = (ChunkProviderClient)world.getChunkProvider();
            List<Chunk> chunks = Lists.newArrayList(cp.chunkMapping.values());
            Chunk chunk = chunks.get(RandomUtils.nextInt(0, chunks.size()));
          
            BlockPos posRand = this.getRandomCoordFromChunk(world);
            BlockPos pos = new BlockPos(posRand.getX()*16,4, posRand.getZ()*16);
        //    int y = world.rand.nextInt(10);
          
            if(world.isRemote) {
              
                    drawPuddleTexture(mc.player, mc.getRenderPartialTicks(), pos.getX(), pos.getY(), pos.getZ(), mc.world, "realism:textatlas/puddle");
                    System.out.println("puddle on: " + pos);
                    System.out.println("loaded: " +chunk.isLoaded());
              
            }

            GlStateManager.disableAlpha();
            GlStateManager.doPolygonOffset(0F, 0.0F);
            GlStateManager.disablePolygonOffset();
            GlStateManager.enableAlpha();
            GlStateManager.depthMask(true);
            GlStateManager.popMatrix();
        }
    }

Java:
[16:14:20] [main/INFO] [STDOUT]: [ru.legendgamer.Realism.Events.GameEvents.RenderEvents.PuddleEvent:render:84]: puddle on: BlockPos{x=-240, y=4, z=240}
[16:14:20] [main/INFO] [STDOUT]: [ru.legendgamer.Realism.Events.GameEvents.RenderEvents.PuddleEvent:render:85]: loaded: true
[16:14:21] [main/INFO] [STDOUT]: [ru.legendgamer.Realism.Events.GameEvents.RenderEvents.PuddleEvent:render:84]: puddle on: BlockPos{x=-48, y=4, z=304}
[16:14:21] [main/INFO] [STDOUT]: [ru.legendgamer.Realism.Events.GameEvents.RenderEvents.PuddleEvent:render:85]: loaded: true
[16:14:21] [main/INFO] [STDOUT]: [ru.legendgamer.Realism.Events.GameEvents.RenderEvents.PuddleEvent:render:84]: puddle on: BlockPos{x=-176, y=4, z=-48}
[16:14:21] [main/INFO] [STDOUT]: [ru.legendgamer.Realism.Events.GameEvents.RenderEvents.PuddleEvent:render:85]: loaded: true
[16:14:21] [main/INFO] [STDOUT]: [ru.legendgamer.Realism.Events.GameEvents.RenderEvents.PuddleEvent:render:84]: puddle on: BlockPos{x=-112, y=4, z=80}
[16:14:21] [main/INFO] [STDOUT]: [ru.legendgamer.Realism.Events.GameEvents.RenderEvents.PuddleEvent:render:85]: loaded: true
[16:14:21] [main/INFO] [STDOUT]: [ru.legendgamer.Realism.Events.GameEvents.RenderEvents.PuddleEvent:render:84]: puddle on: BlockPos{x=-256, y=4, z=112}
[16:14:21] [main/INFO] [STDOUT]: [ru.legendgamer.Realism.Events.GameEvents.RenderEvents.PuddleEvent:render:85]: loaded: true
 

tox1cozZ

aka Agravaine
8,456
598
2,893
int x = chunk.x * 16 + RandomUtils.nextInt(0, 16);
int z = chunk.z * 16 + RandomUtils.nextInt(0, 16);
BlockPos pos = world.getTopSolidOrLiquidBlock(new BlockPos(x, 0, z));
Чо ты творишь? Твои финальные координаты - это pos. А ты еще какие-то рандомишь...
 
5,018
47
783
5,018
47
783
3,005
192
592
5,018
47
783
Ну хотя бы мелькать начало бы... Ну хорошо, а как сделать чтобы не генерировались каждый раз новые? Чтобы там где сгенерилось один раз, там и осталось
 
5,018
47
783
Так, и вот у меня снова появилось желание писать модик. С лужами я чето так и не стало работать. Задав точные координаты, я так и не увидел моей текстурки...1531342292906.png
 
Сверху