Плотность тумана

Код:
@SubscribeEvent
   public void tumanEvent(FogDensity event)
   {
       EntityPlayer player = (EntityPlayer)event.entity;
       if(player.isSneaking())
       {
           event.density = 0.85F;
       }
   }

Не работает, хоть и зарегистрирован эвентбас.
 
Конечно не работает. setCanceled надо делать для этого события.
 
Подскажите, как правильно импортировать FogDestiny
Код:
package blessentumble.core.tick;

import org.lwjgl.opengl.GL11;

import blessentumble.planets.venus.dimension.WorldProviderVenus;
import net.minecraft.client.Minecraft;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraftforge.client.event.EntityViewRenderEvent.FogDensity;
import net.minecraftforge.client.event.EntityViewRenderEvent.RenderFogEvent;
import cpw.mods.fml.common.eventhandler.SubscribeEvent;
import cpw.mods.fml.common.gameevent.TickEvent;

public class TickEventBless {

 @SubscribeEvent
 public void onClientTick(TickEvent.ClientTickEvent event)
 {
 EntityPlayer player = (EntityPlayer)e.entity;
 if(player.dimension == -6)
 {
 e.density = 0.85F;
 e.setCanceled(true);
 }
 }

 
}
 
Вообщем...

@SideOnly(Side.CLIENT)
@SubscribeEvent
  public void onClientRendererTick(ClientTickEvent event) {
Minecraft minecraft = FMLClientHandler.instance().getClient();
WorldClient world = minecraft.theWorld;
if(world != null) {



if(world.provider instanceof WorldProviderVenus) {
   
}



}

}

Я понял, что данная проверка работает.
Ограничивает на 1 дименс.

Теперь осталось понять, как импортировать FogDestiny....
 
Код:
package blessentumble.core.tick;

import org.lwjgl.opengl.GL11;

import blessentumble.planets.venus.dimension.WorldProviderVenus;
import net.minecraft.block.Block;
import net.minecraft.client.Minecraft;
import net.minecraft.client.multiplayer.WorldClient;
import net.minecraft.client.renderer.EntityRenderer;
import net.minecraft.entity.EntityLivingBase;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.world.World;
import net.minecraftforge.client.event.EntityViewRenderEvent;
import net.minecraftforge.client.event.EntityViewRenderEvent.FogDensity;
import net.minecraftforge.client.event.EntityViewRenderEvent.RenderFogEvent;
import cpw.mods.fml.client.FMLClientHandler;
import cpw.mods.fml.common.eventhandler.SubscribeEvent;
import cpw.mods.fml.common.gameevent.TickEvent;
import cpw.mods.fml.common.gameevent.TickEvent.ClientTickEvent;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;

public class TickEventBless {
 
 
 



 private FogDensity e;

 @SideOnly(Side.CLIENT)
 @SubscribeEvent
 public void onFogRendererTick(ClientTickEvent event) 
 {
 Minecraft minecraft = FMLClientHandler.instance().getClient();
 WorldClient world = minecraft.theWorld;

 
 if(world != null) 
 {
 if(world.provider instanceof WorldProviderVenus) {
 
 
 e.density = 0.85F;
 e.setCanceled(true);
 } 
 }
 
 }
 

 
 
}
Что я не так делаю?
 
Всьо.

Поясню логику выполняемого тобою кода по шагам:
  1. В какой-то момент создается объект твоего класса - TickEventBless. Регистрируется в EVENT_BUS'е, который потом его дёргает на каждый тик клиента, вызывая onFogRendererTick. При этом обьявляется ПУСТАЯ ссылка на объект типа FogDensity. Что в корне неверно:

    1.1
    Объекты событий создаются тогда, когда надо уведомить игру о том, что произошло событие. В данном случае FogDensity создается каждый раз, когда в игре начинает рендерится туман. Т.е. до самого рендера тумана, чтобы ты мог настроить плотность. Дальше рассылается в нужные места, откуда их можно подцепить через хандлеры событий. Которые @ForgeSubscribe
    Самому просто так, ВНЕЗАПНО, нельзя создать событие, достав его "из ниоткуда" и что-то поменять, ожидая хорошего эффекта. Надо делать это через хандлер - это единственный способ. Даже если как-то умудришься - получишь баги\исключения.

       1.1.1
       Так-то событие создать можно, но это уже больше склонности к написанию API для своего мода. Так что не поясняю.
    ---[/*]
  2. Каждый раз при вызове метода onFogRendererTick ты попадаешь в место, где начинается клиентский тик. Очевидно. И это никак не привязано к туману, т.е. отсюда с ним ничего не сделать.
    Больше того, ты потом обращаешься к ранее обьявленной пустой ссылке на событие тумана и у тебя вылетает NullPointerException. Страдания.
    Со стороны логики кода всё правильно.
    Сама логика построения кода, МЯГКО говоря, хромает.
    ---[/*]
  3. Поэтому иди и почитай книжки по жабе.
Я специально расписал все пункты, чтобы никто не говорил, что я могу только посылать всех читать книги. Но в данном случае это просто необходимо. Если непонятно почему - перечитай сообщение ещё раз.
 
Это риторический вопрос,здесь как бы не нужен ответ. А евент вызывается каждый тик,т.к. для рендера нужно каждый тип вызывать
 
Вызывается-то он каждый тик, но когда ты хандлишь ClientTick, доступа к FogDensity всё равно нет.
 
Oldestkon написал(а):
Вызывается-то он каждый тик, но когда ты хандлишь ClientTick, доступа к FogDensity всё равно нет.
Чтобы доступ был - надо импортировать?
И если да, то каким способом?
А то я все перепробовал, что советовал Эклипс =D
И field, и parametr, и constant, и method....
 
Почитай книгу,а инициализировать можно в параметрах метода,да там уже реализированно
 
Назад
Сверху