5
5
6
6
import drzhark .mocreatures .compat .CompatScreen ;
7
7
import drzhark .mocreatures .item .MoCItemBow ;
8
+ import net .minecraft .client .Minecraft ;
8
9
import net .minecraft .client .gui .GuiMainMenu ;
10
+ import net .minecraft .client .renderer .block .model .ItemCameraTransforms ;
11
+ import net .minecraft .client .renderer .GlStateManager ;
9
12
import net .minecraft .entity .player .EntityPlayer ;
10
13
import net .minecraft .item .Item ;
14
+ import net .minecraft .util .EnumHand ;
15
+ import net .minecraft .util .EnumHandSide ;
16
+ import net .minecraft .util .math .MathHelper ;
11
17
import net .minecraftforge .client .event .FOVUpdateEvent ;
12
18
import net .minecraftforge .client .event .GuiOpenEvent ;
19
+ import net .minecraftforge .client .event .RenderSpecificHandEvent ;
13
20
import net .minecraftforge .fml .common .Loader ;
14
21
import net .minecraftforge .fml .common .eventhandler .EventPriority ;
15
22
import net .minecraftforge .fml .common .eventhandler .SubscribeEvent ;
@@ -26,13 +33,14 @@ public void displayCompatScreen(GuiOpenEvent event) {
26
33
27
34
// Courtesy of NeRdTheNed
28
35
@ SubscribeEvent
29
- public void FOV (FOVUpdateEvent event ) {
36
+ public void bowFOV (FOVUpdateEvent event ) {
30
37
final EntityPlayer eventPlayer = event .getEntity ();
31
38
final Item eventItem = eventPlayer .getActiveItemStack ().getItem ();
32
39
33
40
if (eventItem instanceof MoCItemBow ) {
34
41
float finalFov = event .getFov ();
35
42
final float itemUseCount = ((MoCItemBow ) eventItem ).getMaxItemUseDuration (eventPlayer .getActiveItemStack ()) - eventPlayer .getItemInUseCount ();
43
+
36
44
/*
37
45
* First, we have to reverse the standard bow zoom.
38
46
* Minecraft helpfully applies the standard bow zoom
@@ -42,6 +50,7 @@ public void FOV(FOVUpdateEvent event) {
42
50
* To compensate for this, we just calculate the standard bow zoom,
43
51
* and apply it in reverse.
44
52
*/
53
+
45
54
float realBow = itemUseCount / 20.0F ;
46
55
47
56
if (realBow > 1.0F ) {
@@ -55,13 +64,16 @@ public void FOV(FOVUpdateEvent event) {
55
64
* to calculate the standard bow zoom.
56
65
* To reverse this, we just divide it instead.
57
66
*/
67
+
58
68
finalFov /= 1.0F - (realBow * 0.15F );
69
+
59
70
/*
60
71
* We now calculate and apply our custom bow zoom.
61
72
* The only difference between standard bow zoom and custom bow zoom
62
73
* is that we change the hardcoded value of 20.0F to
63
74
* whatever drawTime is.
64
75
*/
76
+
65
77
float drawTime = 20.0F * ((MoCItemBow ) eventItem ).drawTimeMult ;
66
78
float customBow = itemUseCount / drawTime ;
67
79
@@ -76,6 +88,58 @@ public void FOV(FOVUpdateEvent event) {
76
88
}
77
89
}
78
90
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
+
79
143
/* TODO: Fix rider rotation
80
144
@SubscribeEvent
81
145
public void renderClimbingRiderPre(RenderLivingEvent.Pre<EntityLivingBase> event) {
0 commit comments