Skip to content

Commit 5a25713

Browse files
committed
Improve bow first person zoom
Courtesy of NeRdTheNed.
1 parent 1f69811 commit 5a25713

File tree

1 file changed

+65
-1
lines changed

1 file changed

+65
-1
lines changed

src/main/java/drzhark/mocreatures/event/MoCEventHooksClient.java

Lines changed: 65 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,18 @@
55

66
import drzhark.mocreatures.compat.CompatScreen;
77
import drzhark.mocreatures.item.MoCItemBow;
8+
import net.minecraft.client.Minecraft;
89
import net.minecraft.client.gui.GuiMainMenu;
10+
import net.minecraft.client.renderer.block.model.ItemCameraTransforms;
11+
import net.minecraft.client.renderer.GlStateManager;
912
import net.minecraft.entity.player.EntityPlayer;
1013
import net.minecraft.item.Item;
14+
import net.minecraft.util.EnumHand;
15+
import net.minecraft.util.EnumHandSide;
16+
import net.minecraft.util.math.MathHelper;
1117
import net.minecraftforge.client.event.FOVUpdateEvent;
1218
import net.minecraftforge.client.event.GuiOpenEvent;
19+
import net.minecraftforge.client.event.RenderSpecificHandEvent;
1320
import net.minecraftforge.fml.common.Loader;
1421
import net.minecraftforge.fml.common.eventhandler.EventPriority;
1522
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
@@ -26,13 +33,14 @@ public void displayCompatScreen(GuiOpenEvent event) {
2633

2734
// Courtesy of NeRdTheNed
2835
@SubscribeEvent
29-
public void FOV(FOVUpdateEvent event) {
36+
public void bowFOV(FOVUpdateEvent event) {
3037
final EntityPlayer eventPlayer = event.getEntity();
3138
final Item eventItem = eventPlayer.getActiveItemStack().getItem();
3239

3340
if (eventItem instanceof MoCItemBow) {
3441
float finalFov = event.getFov();
3542
final float itemUseCount = ((MoCItemBow) eventItem).getMaxItemUseDuration(eventPlayer.getActiveItemStack()) - eventPlayer.getItemInUseCount();
43+
3644
/*
3745
* First, we have to reverse the standard bow zoom.
3846
* Minecraft helpfully applies the standard bow zoom
@@ -42,6 +50,7 @@ public void FOV(FOVUpdateEvent event) {
4250
* To compensate for this, we just calculate the standard bow zoom,
4351
* and apply it in reverse.
4452
*/
53+
4554
float realBow = itemUseCount / 20.0F;
4655

4756
if (realBow > 1.0F) {
@@ -55,13 +64,16 @@ public void FOV(FOVUpdateEvent event) {
5564
* to calculate the standard bow zoom.
5665
* To reverse this, we just divide it instead.
5766
*/
67+
5868
finalFov /= 1.0F - (realBow * 0.15F);
69+
5970
/*
6071
* We now calculate and apply our custom bow zoom.
6172
* The only difference between standard bow zoom and custom bow zoom
6273
* is that we change the hardcoded value of 20.0F to
6374
* whatever drawTime is.
6475
*/
76+
6577
float drawTime = 20.0F * ((MoCItemBow) eventItem).drawTimeMult;
6678
float customBow = itemUseCount / drawTime;
6779

@@ -76,6 +88,58 @@ public void FOV(FOVUpdateEvent event) {
7688
}
7789
}
7890

91+
// Courtesy of NeRdTheNed
92+
@SubscribeEvent
93+
public void renderBow(RenderSpecificHandEvent event) {
94+
final Minecraft mc = Minecraft.getMinecraft();
95+
final Item eventItem = event.getItemStack().getItem();
96+
97+
// Only handle rendering if we're in first person and drawing back a CustomBow.
98+
if ((mc.gameSettings.thirdPersonView == 0) && mc.player.isHandActive() && (mc.player.getActiveHand() == event.getHand()) && (mc.player.getItemInUseCount() > 0) && (event.getItemStack().getItem() instanceof MoCItemBow)) {
99+
// Cancel rendering so we can render instead
100+
event.setCanceled(true);
101+
GlStateManager.pushMatrix();
102+
103+
final boolean rightHanded = (event.getHand() == EnumHand.MAIN_HAND ? mc.player.getPrimaryHand() : mc.player.getPrimaryHand().opposite()) == EnumHandSide.RIGHT;
104+
final int handedSide = rightHanded ? 1 : -1;
105+
106+
GlStateManager.translate(handedSide * 0.2814318F, -0.3365561F + (event.getEquipProgress() * -0.6F), -0.5626847F);
107+
108+
// Rotate angles
109+
GlStateManager.rotate(-13.935F, 1.0F, 0.0F, 0.0F);
110+
GlStateManager.rotate(handedSide * 35.3F, 0.0F, 1.0F, 0.0F);
111+
GlStateManager.rotate(handedSide * -9.785F, 0.0F, 0.0F, 1.0F);
112+
113+
final float ticks = ((MoCItemBow) eventItem).getMaxItemUseDuration(event.getItemStack()) - ((mc.player.getItemInUseCount() - event.getPartialTicks()) + 1.0F);
114+
float drawTime = 20.0F * ((MoCItemBow) eventItem).drawTimeMult;
115+
float divTicks = ticks / drawTime;
116+
divTicks = ((divTicks * divTicks) + (divTicks * 2.0F)) / 3.0F;
117+
118+
if (divTicks > 1.0F) {
119+
divTicks = 1.0F;
120+
}
121+
122+
// Bow animations and transformations
123+
if (divTicks > 0.1F) {
124+
// Bow shake
125+
GlStateManager.translate(0.0F, MathHelper.sin((ticks - 0.1F) * 1.3F) * (divTicks - 0.1F) * 0.004F, 0.0F);
126+
}
127+
128+
// Backwards motion ("draw back" animation)
129+
GlStateManager.translate(0.0F, 0.0F, divTicks * 0.04F);
130+
131+
// Relative scaling for FOV reasons
132+
GlStateManager.scale(1.0F, 1.0F, 1.0F + (divTicks * 0.2F));
133+
134+
// Rotate bow based on handedness
135+
GlStateManager.rotate(handedSide * 45.0F, 0.0F, -1.0F, 0.0F);
136+
137+
// Let Minecraft do the rest of the item rendering
138+
mc.getItemRenderer().renderItemSide(mc.player, event.getItemStack(), rightHanded ? ItemCameraTransforms.TransformType.FIRST_PERSON_RIGHT_HAND : ItemCameraTransforms.TransformType.FIRST_PERSON_LEFT_HAND, !rightHanded);
139+
GlStateManager.popMatrix();
140+
}
141+
}
142+
79143
/* TODO: Fix rider rotation
80144
@SubscribeEvent
81145
public void renderClimbingRiderPre(RenderLivingEvent.Pre<EntityLivingBase> event) {

0 commit comments

Comments
 (0)