55
66import drzhark .mocreatures .compat .CompatScreen ;
77import drzhark .mocreatures .item .MoCItemBow ;
8+ import net .minecraft .client .Minecraft ;
89import net .minecraft .client .gui .GuiMainMenu ;
10+ import net .minecraft .client .renderer .block .model .ItemCameraTransforms ;
11+ import net .minecraft .client .renderer .GlStateManager ;
912import net .minecraft .entity .player .EntityPlayer ;
1013import net .minecraft .item .Item ;
14+ import net .minecraft .util .EnumHand ;
15+ import net .minecraft .util .EnumHandSide ;
16+ import net .minecraft .util .math .MathHelper ;
1117import net .minecraftforge .client .event .FOVUpdateEvent ;
1218import net .minecraftforge .client .event .GuiOpenEvent ;
19+ import net .minecraftforge .client .event .RenderSpecificHandEvent ;
1320import net .minecraftforge .fml .common .Loader ;
1421import net .minecraftforge .fml .common .eventhandler .EventPriority ;
1522import 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