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

Версия Minecraft
1.12.2
5,018
47
783
Здравствуйте еще раз. У меня вопрос - мне нужно получить координаты рандомного блока из прогруженных чанков. Каким бы образом можно это провернуть?
Отсчет от игрока не предлагать - не вариант. Точнее, накостылить с сохранением последней позиции игрока в WSD и тому подобной костыльной гадостью, вариант, но во первых это костыль, а во вторых я с WSD не в ладах :)
 
5,018
47
783
5,018
47
783
А, точно)
~~~
Так ну насколько я понял... Это выглядит как то так. (там когда провайдер получаешь, тоже коры нужны, ну я взял игроковые, сойдут ведь?)
Я значит создал pos, потом по этому позу достал чанк и через чанк получил коры блока... на котором стоит игрок. Все верно?
Java:
            int x = playerpos.getX();
            int y = playerpos.getY();
            int z = playerpos.getZ();
            BlockPos pos = new BlockPos(x,y,z);
            Chunk chunk = world.getChunkProvider().getLoadedChunk(pos.getX(), pos.getZ());
            chunk.getBlockState(pos.getX(), pos.getY(), pos.getZ());
 

tox1cozZ

aka Agravaine
8,456
598
2,893
Java:
if(world.getChunkProvider() instanceof ChunkProviderServer){
            ChunkProviderServer chunkProvider = (ChunkProviderServer)world.getChunkProvider();
            List<Chunk> chunks = Lists.newArrayList(chunkProvider.getLoadedChunks());
            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));
        }
Типа такого. Не помню только, нужно ли координаты чанка умножать на 16.
 

Eifel

Модератор
1,624
79
609
Рандома там только нету никакого. Как написал @Agravaine , тебе надо получить рандомный прогруженный чанк из getLoadedChunks(). Т.е. ты получишь лист чанков, и из него можешь выбрать рандомный чанк, например:
Chunk chunk = world.getChunkProvider().getLoadedChunks().get(random.nextInt(размер_этого_списка))
А потом уже из него рандомную координату, например через координаты этого чанка, или каким-то другим способом.

UPD. Пока писал - уже дали код, а мне не показало что есть непрочитанное сообщение. Код такой как я и предполагал)
 
5,018
47
783
ААААFUUUUU...., CHUNKS
:ROFLMAO:
Я сижу такой не понимаю откуда вы взяли что это лист)))
@Dahaka мне лишь бы блок получить, а там уже можно нарандомить
 
5,018
47
783
Кстати. Если мне для нужд рендера текстуры... мне сервер подойдет разве?
Вообщем говоря... WorldLastEvent клиентский же. У меня вообще не выполняется это условие.
 
Последнее редактирование:
5,018
47
783
5,018
47
783
Есть, внимательнее смотри. Исходники хоть иногда открывай.
Я все просмотрел! Вот весь класс ChunkProviderClient. Ладно б еще был, хоть бы приватный, так нету...

Java:
@SideOnly(Side.CLIENT)
public class ChunkProviderClient implements IChunkProvider
{
    private static final Logger LOGGER = LogManager.getLogger();
    /**
     * The completely empty chunk used by ChunkProviderClient when chunkMapping doesn't contain the requested
     * coordinates.
     */
    private final Chunk blankChunk;
    /** The mapping between ChunkCoordinates and Chunks that ChunkProviderClient maintains. */
    private final Long2ObjectMap<Chunk> chunkMapping = new Long2ObjectOpenHashMap<Chunk>(8192)
    {
        protected void rehash(int p_rehash_1_)
        {
            if (p_rehash_1_ > this.key.length)
            {
                super.rehash(p_rehash_1_);
            }
        }
    };
    /** Reference to the World object. */
    private final World world;

    public ChunkProviderClient(World worldIn)
    {
        this.blankChunk = new EmptyChunk(worldIn, 0, 0);
        this.world = worldIn;
    }

    /**
     * Unload chunk from ChunkProviderClient's hashmap. Called in response to a Packet50PreChunk with its mode field set
     * to false
     */
    public void unloadChunk(int x, int z)
    {
        Chunk chunk = this.provideChunk(x, z);

        if (!chunk.isEmpty())
        {
            chunk.onUnload();
        }

        this.chunkMapping.remove(ChunkPos.asLong(x, z));
    }

    @Nullable
    public Chunk getLoadedChunk(int x, int z)
    {
        return (Chunk)this.chunkMapping.get(ChunkPos.asLong(x, z));
    }

    /**
     * loads or generates the chunk at the chunk location specified
     */
    public Chunk loadChunk(int chunkX, int chunkZ)
    {
        Chunk chunk = new Chunk(this.world, chunkX, chunkZ);
        this.chunkMapping.put(ChunkPos.asLong(chunkX, chunkZ), chunk);
        net.minecraftforge.common.MinecraftForge.EVENT_BUS.post(new net.minecraftforge.event.world.ChunkEvent.Load(chunk));
        chunk.markLoaded(true);
        return chunk;
    }

    public Chunk provideChunk(int x, int z)
    {
        return (Chunk)MoreObjects.firstNonNull(this.getLoadedChunk(x, z), this.blankChunk);
    }

    /**
     * Unloads chunks that are marked to be unloaded. This is not guaranteed to unload every such chunk.
     */
    public boolean tick()
    {
        long i = System.currentTimeMillis();
        ObjectIterator objectiterator = this.chunkMapping.values().iterator();

        while (objectiterator.hasNext())
        {
            Chunk chunk = (Chunk)objectiterator.next();
            chunk.onTick(System.currentTimeMillis() - i > 5L);
        }

        if (System.currentTimeMillis() - i > 100L)
        {
            LOGGER.info("Warning: Clientside chunk ticking took {} ms", (long)(System.currentTimeMillis() - i));
        }

        return false;
    }

    /**
     * Converts the instance data to a readable string.
     */
    public String makeString()
    {
        return "MultiplayerChunkCache: " + this.chunkMapping.size() + ", " + this.chunkMapping.size();
    }

    public boolean isChunkGeneratedAt(int x, int z)
    {
        return this.chunkMapping.containsKey(ChunkPos.asLong(x, z));
    }
}
 
5,018
47
783
Это было слишком неочевидно, бро...
~~
Так ладно, вроде бы что то как то через пень колоду и с помощью бабы Тани заработало, но у меня появилось две новых ошибки: во первых координата по "y" у всех одинаковая = (-1)
во вторых
Java:
########## GL ERROR ##########
[11:03:06] [main/ERROR]: @ Post render
[11:03:06] [main/ERROR]: 1284: Stack underflow
Почему переполнение стака(что это вообще такое?) и как сделать y неотрицательной?
Это веселье выглядит вот так:
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();




            BlockPos pos = this.getRandomCoordFromChunk(world);


            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
Up. С опегл решил проблему, остался только чанк и то что координата по y всегда -1. Что делать?(
 
Сверху