From c4ca8270b9fbe5ce19551601317e9fe9300b210b Mon Sep 17 00:00:00 2001 From: Abastro Date: Tue, 16 Feb 2016 22:52:41 +0900 Subject: [PATCH] Added EntityViewRenderEvent#FOVModifier Enables mods to modify raw FOV directly. Avoids modifier limit from FOVUpdateEvent. Aware of blocks which are needed for fov change related with materials. --- .../client/renderer/EntityRenderer.java.patch | 9 +++++++ .../client/ForgeHooksClient.java | 6 +++++ .../client/event/EntityViewRenderEvent.java | 26 +++++++++++++++++-- .../minecraftforge/test/FOVModifierTest.java | 26 +++++++++++++++++++ 4 files changed, 65 insertions(+), 2 deletions(-) create mode 100644 src/test/java/net/minecraftforge/test/FOVModifierTest.java diff --git a/patches/minecraft/net/minecraft/client/renderer/EntityRenderer.java.patch b/patches/minecraft/net/minecraft/client/renderer/EntityRenderer.java.patch index 8ee9bcf8e..6bc47e6d1 100644 --- a/patches/minecraft/net/minecraft/client/renderer/EntityRenderer.java.patch +++ b/patches/minecraft/net/minecraft/client/renderer/EntityRenderer.java.patch @@ -17,6 +17,15 @@ { if (d2 == 0.0D) { +@@ -512,7 +513,7 @@ + f = f * 60.0F / 70.0F; + } + +- return f; ++ return net.minecraftforge.client.ForgeHooksClient.getFOVModifier(this, entity, block, p_78481_1_, f); + } + } + @@ -576,14 +577,8 @@ { BlockPos blockpos = new BlockPos(entity); diff --git a/src/main/java/net/minecraftforge/client/ForgeHooksClient.java b/src/main/java/net/minecraftforge/client/ForgeHooksClient.java index 5b8cfea86..4a184c811 100644 --- a/src/main/java/net/minecraftforge/client/ForgeHooksClient.java +++ b/src/main/java/net/minecraftforge/client/ForgeHooksClient.java @@ -196,6 +196,12 @@ public class ForgeHooksClient MinecraftForge.EVENT_BUS.post(fovUpdateEvent); return fovUpdateEvent.newfov; } + + public static float getFOVModifier(EntityRenderer renderer, Entity entity, Block block, double renderPartialTicks, float fov) { + EntityViewRenderEvent.FOVModifier event = new EntityViewRenderEvent.FOVModifier(renderer, entity, block, renderPartialTicks, fov); + MinecraftForge.EVENT_BUS.post(event); + return event.getFOV(); + } private static int skyX, skyZ; diff --git a/src/main/java/net/minecraftforge/client/event/EntityViewRenderEvent.java b/src/main/java/net/minecraftforge/client/event/EntityViewRenderEvent.java index 7d08011f8..1f23314ac 100644 --- a/src/main/java/net/minecraftforge/client/event/EntityViewRenderEvent.java +++ b/src/main/java/net/minecraftforge/client/event/EntityViewRenderEvent.java @@ -7,8 +7,8 @@ import net.minecraftforge.fml.common.eventhandler.Cancelable; import net.minecraftforge.fml.common.eventhandler.Event; /** - * Event that hooks into EntityRenderer, allowing any feature to customize visual attributes of - * fog the player sees. + * Event that hooks into EntityRenderer, allowing any feature to customize visual attributes + * the player sees. */ public abstract class EntityViewRenderEvent extends Event { @@ -94,4 +94,26 @@ public abstract class EntityViewRenderEvent extends Event this.roll = roll; } } + + /** + * Event that allows mods to alter the raw FOV itself. + * This directly affects to the FOV without being modified. + * */ + public static class FOVModifier extends EntityViewRenderEvent + { + private float fov; + + public FOVModifier(EntityRenderer renderer, Entity entity, Block block, double renderPartialTicks, float fov) { + super(renderer, entity, block, renderPartialTicks); + this.setFOV(fov); + } + + public float getFOV() { + return fov; + } + + public void setFOV(float fov) { + this.fov = fov; + } + } } diff --git a/src/test/java/net/minecraftforge/test/FOVModifierTest.java b/src/test/java/net/minecraftforge/test/FOVModifierTest.java new file mode 100644 index 000000000..c7ded0c58 --- /dev/null +++ b/src/test/java/net/minecraftforge/test/FOVModifierTest.java @@ -0,0 +1,26 @@ +package net.minecraftforge.test; + +import net.minecraft.block.material.Material; +import net.minecraftforge.client.event.EntityViewRenderEvent; +import net.minecraftforge.common.MinecraftForge; +import net.minecraftforge.fml.common.Mod; +import net.minecraftforge.fml.common.Mod.EventHandler; +import net.minecraftforge.fml.common.event.FMLInitializationEvent; +import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; + +/** Simple mod to test fov modifier. */ +@Mod(modid="fovmodifiertest", name="FOV Modifier Test", version="0.0.0") +public class FOVModifierTest { + + @EventHandler + public void init(FMLInitializationEvent event) + { + MinecraftForge.EVENT_BUS.register(this); + } + + @SubscribeEvent + public void getFOVModifier(EntityViewRenderEvent.FOVModifier event) { + if(event.block.getMaterial() == Material.water) + event.setFOV(event.getFOV() / 60.0f * 50.0f); + } +}