55
66import org .lwjgl .input .Keyboard ;
77
8+ import net .minecraft .block .state .IBlockState ;
89import net .minecraft .client .Minecraft ;
910import net .minecraft .client .renderer .EntityRenderer ;
1011import net .minecraft .client .renderer .texture .DynamicTexture ;
1112import net .minecraft .client .settings .KeyBinding ;
13+ import net .minecraft .entity .Entity ;
14+ import net .minecraft .entity .EntityLivingBase ;
15+ import net .minecraft .item .ItemStack ;
1216import net .minecraft .world .World ;
1317import net .minecraftforge .client .IRenderHandler ;
1418import net .minecraftforge .client .event .EntityViewRenderEvent ;
1519import net .minecraftforge .client .event .RenderGameOverlayEvent ;
1620import net .minecraftforge .client .event .RenderWorldLastEvent ;
21+ import net .minecraftforge .common .MinecraftForge ;
1722import net .minecraftforge .fml .client .registry .ClientRegistry ;
23+ import net .minecraftforge .fml .common .Mod ;
1824import net .minecraftforge .fml .common .ObfuscationReflectionHelper ;
1925import net .minecraftforge .fml .common .eventhandler .EventPriority ;
2026import net .minecraftforge .fml .common .eventhandler .SubscribeEvent ;
2127import net .minecraftforge .fml .common .gameevent .InputEvent .KeyInputEvent ;
2228import net .minecraftforge .fml .common .gameevent .TickEvent ;
2329import net .minecraftforge .fml .relauncher .ReflectionHelper ;
30+ import net .minecraftforge .fml .relauncher .Side ;
2431import stellarapi .api .ICelestialWorld ;
2532import stellarapi .api .SAPICapabilities ;
26- import stellarapi .api .SAPIReferences ;
27- import stellarapi .api .optics .EyeDetector ;
28- import stellarapi .api .optics .IOpticalProp ;
29- import stellarapi .api .optics .NakedFilter ;
33+ import stellarapi .api .event .FilterQEEvent ;
34+ import stellarapi .api .interact .IFilter ;
35+ import stellarapi .api .interact .IScope ;
36+ import stellarapi .api .optics .EnumRGBA ;
37+ import stellarapi .api .optics .Wavelength ;
3038import stellarapi .api .render .IAdaptiveRenderer ;
3139import stellarapi .feature .gui .overlay .OverlayHandler ;
3240import stellarapi .reference .CelestialPackManager ;
3341
34- public class SAPIClientForgeEventHook {
42+ public class SAPIClientEventHook {
3543
3644 private static final Field lightMapField = ReflectionHelper .findField (EntityRenderer .class ,
3745 ObfuscationReflectionHelper .remapFieldNames (EntityRenderer .class .getName (), "lightmapTexture" ,
@@ -55,9 +63,8 @@ public class SAPIClientForgeEventHook {
5563 private KeyBinding focusGuiKey = new KeyBinding ("key.stellarapi.focusgui.description" , Keyboard .KEY_U ,
5664 "key.stellarapi" );
5765
58- public SAPIClientForgeEventHook (OverlayHandler overlay ) {
66+ public SAPIClientEventHook (OverlayHandler overlay ) {
5967 ClientRegistry .registerKeyBinding (this .focusGuiKey );
60-
6168 this .overlay = overlay ;
6269 }
6370
@@ -76,21 +83,54 @@ public void onRenderWorldLast(RenderWorldLastEvent event) {
7683 }
7784
7885 @ SubscribeEvent (priority = EventPriority .LOWEST )
79- public void onUpdateFOV (EntityViewRenderEvent .FOVModifier event ) {
80- // TODO AA FOV change - manual?
86+ public void onDecideFOV (EntityViewRenderEvent .FOVModifier event ) {
87+ if (event .getEntity () instanceof EntityLivingBase ) {
88+ EntityLivingBase viewer = (EntityLivingBase ) event .getEntity ();
89+ ItemStack active = viewer .getActiveItemStack ();
90+ if (active != null ) {
91+ IScope scope = active .getCapability (SAPICapabilities .SCOPE_CAPABILITY , null );
92+ if (scope != null )
93+ event .setFOV (scope .transformFOV (event .getFOV ()));
94+ }
95+ }
96+ }
97+
98+ @ SubscribeEvent (priority = EventPriority .LOWEST )
99+ public void onDecideQE (FilterQEEvent event ) {
100+ if (event .getEntity () instanceof EntityLivingBase ) {
101+ EntityLivingBase viewer = (EntityLivingBase ) event .getEntity ();
102+ ItemStack active = viewer .getActiveItemStack ();
103+ if (active != null ) {
104+ IFilter filter = active .getCapability (SAPICapabilities .FILTER_CAPABILITY , null );
105+ if (filter != null )
106+ event .setQE (filter .transformQE (event .getWavelength (), event .getQE ()));
107+ }
108+ }
109+ }
110+
111+
112+ private float getFilterQE (EntityViewRenderEvent event , Wavelength wavelengthIn , float initialQE ) {
113+ return getFilterQE (event .getRenderer (), event .getEntity (), event .getState (), event .getRenderPartialTicks (), wavelengthIn , initialQE );
114+ }
115+
116+ private float getFilterQE (EntityRenderer renderer , Entity entity , IBlockState state , double renderPartialTicks , Wavelength wavelengthIn , float initialQE ) {
117+ FilterQEEvent event = new FilterQEEvent (renderer , entity , state , renderPartialTicks , wavelengthIn , initialQE );
118+ MinecraftForge .EVENT_BUS .post (event );
119+ return event .getQE ();
81120 }
82121
83122 @ SubscribeEvent (priority = EventPriority .LOWEST )
84123 public void onDecideFogColor (EntityViewRenderEvent .FogColors event ) {
85- IOpticalProp filter = SAPIReferences .getFilter (event .getEntity ());
124+ //IOpticalProp filter = SAPIReferences.getFilter(event.getEntity());
125+ float [] eff = new float [3 ];
126+ for (EnumRGBA color : EnumRGBA .RGB )
127+ eff [color .ordinal ()] = this .getFilterQE (event , Wavelength .colorWaveMap .get (color ), 1.0f );
86128
87- double [] value = EyeDetector .getInstance ().process (1.0 , filter ,
88- new double [] { event .getRed (), event .getGreen (), event .getBlue () });
89- event .setRed ((float ) Math .min (value [0 ], 1.0 ));
90- event .setGreen ((float ) Math .min (value [1 ], 1.0 ));
91- event .setBlue ((float ) Math .min (value [2 ], 1.0 ));
129+ event .setRed ((float ) Math .min (event .getRed () * eff [0 ], 1.0 ));
130+ event .setGreen ((float ) Math .min (event .getGreen () * eff [1 ], 1.0 ));
131+ event .setBlue ((float ) Math .min (event .getBlue () * eff [2 ], 1.0 ));
92132
93- if (!( filter instanceof NakedFilter ) ) {
133+ if (eff [ 0 ] != 1.0f || eff [ 1 ] != 1.0f || eff [ 2 ] != 1.0f ) {
94134 DynamicTexture texture ;
95135 try {
96136 texture = (DynamicTexture ) lightMapField .get (event .getRenderer ());
@@ -101,12 +141,9 @@ public void onDecideFogColor(EntityViewRenderEvent.FogColors event) {
101141 int green = ((data & 0x0000ff00 ) >> 8 );
102142 int blue = data & 0x000000ff ;
103143
104- double [] modified = EyeDetector .getInstance ().process (1.0 , filter ,
105- new double [] { red / 255.0 , green / 255.0 , blue / 255.0 });
106-
107- red = Math .min (0xff , (int ) (modified [0 ] * 0xff ));
108- green = Math .min (0xff , (int ) (modified [1 ] * 0xff ));
109- blue = Math .min (0xff , (int ) (modified [2 ] * 0xff ));
144+ red = Math .min (0xff , (int ) (red * eff [0 ]));
145+ green = Math .min (0xff , (int ) (green * eff [1 ]));
146+ blue = Math .min (0xff , (int ) (blue * eff [2 ]));
110147
111148 texture .getTextureData ()[i ] = 255 << 24 | red << 16 | green << 8 | blue ;
112149 }
@@ -130,7 +167,6 @@ public void renderGameOverlay(RenderGameOverlayEvent.Post event) {
130167 @ SubscribeEvent
131168 public void onTick (TickEvent .ClientTickEvent event ) {
132169 if (event .phase == TickEvent .Phase .START ) {
133- //Minecraft mc = Minecraft.getMinecraft();
134170 overlay .updateOverlay ();
135171 }
136172 }
0 commit comments