Рендер тумана

Версия Minecraft
1.12.2
Пытаюсь реализовать подобие песчаной бури. Для этого решил сделать так, чтобы при входе в биом пустыни на игрока постепенно наползал туман (меняю плотность тумана, используя событие). Проблема в том, что я не могу сделать так, чтобы плотность менялась только в нужном биоме, т.к. для этого мне нужно поставить вызов event.isCanceled(true) внутри проверки биома, а, когда я это делаю, эта функция просто перестает давать необходимый эффект. Объясните, пожалуйста, почему так происходит. (Я в первый раз работаю с туманом и вообще с подобными событиями)

Нерабочий код:
Java:
@SubscribeEvent
    public static void onFogDensityRender(EntityViewRenderEvent.FogDensity event)
    {
        Entity entity = event.getEntity();
        if(entity instanceof EntityPlayer)
        {
            Biome biome = entity.getEntityWorld().getBiome(entity.getPosition());
            if (biome == Biomes.DESERT)
            {
                event.setDensity(fogDensity);
                if (fogDensity < 0.9f)
                {
                    fogDensity += 0.0001f;
                }
                event.setCanceled(true);
            }
        }
    }

Если не ставить event.setCanceled(true); в зависимость от биома (вынести его за скобки условия проверки биома), код работает, но тогда туман не сбрасывается на ванильные значения при выходе из пустыни.
 

necauqua

когда-то был anti344
Администратор
1,216
27
172
Насколько я могу понять по твоему коду, у тебя есть некая переменная fogDensity
Ты её только в вызове ивента, то бишь, по сути, в каждый кадр, увеличиваешь на 0.0001 пока она не станет равна 0.9
0.9 / 0.0001 = 9000 кадров = ну скажем 150 секунд если 60 fps

Это во-первых
А во-вторых, ты не резетишь (ну или не уменьшаешь обратно) эту переменную, когда вышел из биома, ну во всяком случае в скинутом коде такого нет, так что она единожды дойдёт до 0.9 и там и останется.

setCanceled у тебя правильно в ифе стоит, так-что либо в вышеописанном проблема, либо ещё где.
 
Как я понял, если не отменять событие, то должен сработать ванильный туман, по этому я не изменяю свое поле fogDensity (сейчас мне главное добиться того, чтобы при выходе из биома пустыни мое событие переставало работать и начинал работать ванильный туман). Проблема в другом: когда я ставлю event.setCanceled(true) в то место, где оно стоит в представленном коде, мой туман перестает сгущаться при заходе в мир, а когда я выношу метод из условия с проверкой биома, все работает как надо, но в таком случае туман не сбрасывается на ванильный после выхода из пустыни.
 

necauqua

когда-то был anti344
Администратор
1,216
27
172
То что перед тем как меняет значение - не важно, оно вызывается каждый фрейм
А вот почему оно не работает - неведомо, вроде всё ок же.
Ну, сисаути всё что можешь, биом там, переменную эту твою)
ееее, дебаг
 
Я вот уже все, что в голову приходило, проверял... И, само собой, дебагал. Получил такой результат: в начале выполнения isCanceled у события всегда на false. Далее идет проверка на игрока и на биом. Обе проверки срабатывают, а эффекта нет.
 

tox1cozZ

aka Agravaine
8,455
598
2,892
Переменную fogDensity нужно изменять где-то в апдейте, а не в рендере, ибо чем больше у человека фпс, тем быстрее переменная будет увеличиватся. У чуваков с 30фпс туман густеть будет очень долго, а у мажиков с 900 фпс он будет проходить моментально.
 
7,099
324
1,510
Допустим, игрок стоит в красной точке в пределах пустыне недалеко от границы с другогим биомом.
Тогда значение плотность тумана(частичек песка) будет пропорционально минимальному расстоянию до границы биомов.
Т.к. границы дискретные по блокам, то искать минимальное расстояние довольно просто перебором точек границы, попадающих в радиус
1591353170672.png
 
Всем спасибо за ответы. По итогу, немного поэкспериментировав, я решил все таки установить режим тумана на EXP, так как это дает наилучший для меня эффект. Действительно для моего изначального кода хватило установки EXP тумана и все заработало.
 
Сверху