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

Версия Minecraft
1.12.2
5,018
47
783
Здравствуйте еще раз. У меня вопрос - мне нужно получить координаты рандомного блока из прогруженных чанков. Каким бы образом можно это провернуть?
Отсчет от игрока не предлагать - не вариант. Точнее, накостылить с сохранением последней позиции игрока в WSD и тому подобной костыльной гадостью, вариант, но во первых это костыль, а во вторых я с WSD не в ладах :)
 
5,018
47
783
Ты указал координаты x/y/z.
А ты выделил координаты чанка.
После того как я написал пост, мне пришла в голову такая мысль и я побежал на мировые координаты 2 4 2. Как и следовало ожидать, там ничего не было... так что вопрос все равно открыт пока
 
5,018
47
783
Народ, что то тухло... Я в рендере вообще ноль без палочки, а тут еще и никто не знает в чем дело. может, есть какие то иные варианты лужи запилить? На крайняк можно попробовать шейдером, как @Ivasik советует, но это целая история:)
@timaxa007 что можешь посоветовать по этой теме?
 

timaxa007

Модератор
5,831
409
672
иные варианты лужи запилить?
Эм... Честно, точно не знаю. Рендер я наверное использовал для этого эвент RenderWorldLastEvent, а вот в дальнейшем не знаю точно что ещё. Ну, возможно ещё использовал WorldSaveData, чтобы сохранять, Chunk Load и Save, чтобы отгружать и загружать чанки, на которых бы рендерить лужи, а так-же информацию о их наличии, а значит ещё и пакеты. Зависить от погоды и т.д.
 
5,018
47
783
так а зачем сохранять, если оно и так будет работать всегда, когда рендерится мир? Вопрос в том, почему оно не рендерится сейчас вообще(
 

timaxa007

Модератор
5,831
409
672
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();
            Chunk chunk = cp.getLoadedChunk(playerpos.getX(), playerpos.getZ());
            int x = chunk.x*16;
            int z = chunk.z*16;
            
            BlockPos pos = new BlockPos(x, 3, z);
        /*   
            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(2, 4, 2);
        //    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);
                
                
            }

            GlStateManager.disableAlpha();
            GlStateManager.doPolygonOffset(0F, 0.0F);
            GlStateManager.disablePolygonOffset();
            GlStateManager.enableAlpha();
            GlStateManager.depthMask(true);
            GlStateManager.popMatrix();
        }
    }
 
5,018
47
783
Нашел. Но как пофиксить, хз. Чанк нулевой... Я так понял, мир загружается раньше чем игрок, пытается подгрузить игрока, а игрок в это время еще нулл...
 

Icosider

Kotliner
Администратор
3,603
99
664
мир загружается раньше чем игрок
Не понимаю почему тебя это так удивило :/
Позицию игрока которую ты передаешь подели на 16 или через побитовый сдвиг на 4
 
Последнее редактирование:
5,018
47
783
Меня это не удивило... Я просто хз как теперь из игрока получить координаты
 

Icosider

Kotliner
Администратор
3,603
99
664
Java:
@SubscribeEvent
public void render(RenderWorldLastEvent e)
{
    final Minecraft mc = Minecraft.getMinecraft();
    final World world = mc.world;
    final EntityPlayer player = mc.player;

    if (world != null && player != null && !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 = player.getPosition();
        ChunkProviderClient cp = (ChunkProviderClient) world.getChunkProvider();
        Chunk chunk = cp.getLoadedChunk(playerpos.getX() >> 4, playerpos.getZ() >> 4);
        int x = chunk.x << 4;// В нормальные координаты по X
        int z = chunk.z << 4;// В нормальные координаты по Z
            
        BlockPos pos = new BlockPos(x, 3, z);

        if (world.isRemote)
        {
            drawPuddleTexture(player, mc.getRenderPartialTicks(), pos.getX(), pos.getY(), pos.getZ(), world, "realism:textatlas/puddle");
            System.out.println("puddle on: " + pos);
        }
        GlStateManager.disableAlpha();
        GlStateManager.doPolygonOffset(0F, 0.0F);
        GlStateManager.disablePolygonOffset();
        GlStateManager.enableAlpha();
        GlStateManager.depthMask(true);
        GlStateManager.popMatrix();
    }
}
 
5,018
47
783
Теперь вопрос, как сделать чтобы рисовалось не каждый кадр, а каждые, 5000 кадров, например?
И допустим, чтобы сгенерированная позиция лужи сохранялясь...
боюсь спросить, WSD?
 
5,018
47
783
Почем твои обои рисуются, а эти лужи нет?
Обои в итоге сделаны сущностями были:). А так уже все, рисуется.
Покажи drawPuddleTexture
Java:
    public static void drawPuddleTexture(Entity entityIn, float partialTicks, int x,int y,int z, World world, String texture) {
        double d3 = entityIn.lastTickPosX + (entityIn.posX - entityIn.lastTickPosX) * (double) partialTicks;
        double d4 = entityIn.lastTickPosY + (entityIn.posY - entityIn.lastTickPosY) * (double) partialTicks;
        double d5 = entityIn.lastTickPosZ + (entityIn.posZ - entityIn.lastTickPosZ) * (double) partialTicks;
        Tessellator tessellatorIn = Tessellator.getInstance();
        BufferBuilder bufferBuilderIn = tessellatorIn.getBuffer();
        Minecraft.getMinecraft().renderEngine.bindTexture(TextureMap.LOCATION_BLOCKS_TEXTURE);
        bufferBuilderIn.begin(7, DefaultVertexFormats.BLOCK);
        bufferBuilderIn.setTranslation(-d3, -d4, -d5);
        bufferBuilderIn.noColor();
        IBlockState iblockstate = world.getBlockState(new BlockPos(x,y,z));
        TextureMap texturemap = Minecraft.getMinecraft().getTextureMapBlocks();
        BlockRendererDispatcher blockrendererdispatcher = Minecraft.getMinecraft().getBlockRendererDispatcher();

        blockrendererdispatcher.renderBlockDamage(iblockstate, new BlockPos(x,y,z), texturemap.getAtlasSprite("realism:textatlas/puddle"), world);
        tessellatorIn.draw();

        bufferBuilderIn.setTranslation(0.0D, 0D, 0.0D);

    }
 
5,018
47
783
@Maxik001, if (world.isRemote) зачем в клиентском событии??? !mc.isGamePaused() магия исчезновения луж?)
world.isRemote я однажды от безнадеги поставил. А с геймпаузед, если его не вставлять, раньше краш был. Само собой сейчас это не нужно
 
Сверху