Skip to content

Commit 689d68e

Browse files
committed
Fix zooming not working when the weapon is in offhand
1 parent 4c0c261 commit 689d68e

File tree

2 files changed

+73
-51
lines changed

2 files changed

+73
-51
lines changed

changelog.md

+2-1
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
- Change hemp plants to use the same "half" property as vanilla double flowers (BluSunrize)
1414
- This results in existing hemp looking weird, just break and replace it!
1515
- Change mouse sensitivity based on current zoom level with railgun or revolver (BluSunrize)
16-
- Also hide revolver's & railgun's first-person render while zoomed
16+
- Also hide revolver's & railgun's first-person render while zoomed
1717
- Improve readability of fluid name in the chemthrower HUD (BluSunrize)
1818
- Fix crash with dual codecs (Malte)
1919
- Fix crash when placing toolbox (Malte)
@@ -36,6 +36,7 @@
3636
- Fix arc recycling recipes not showing adjusted outputs in JEI (BluSunrize)
3737
- Fix floodlights deleting their own fake lightsources immediately (voidsong-dragonfly)
3838
- Fix the scope for railgun and revolver just not rendering at all (BluSunrize)
39+
- Fix zooming not working when the weapon is in offhand (BluSunrize)
3940
- Translations Added/Updated: zh_cn (Cactusstudent, SlimeSB, mc-kaishixiaxue, JustAlkaid), tr_tr (RuyaSavascisi)
4041

4142
##### Version 1.21.1-12.0.0-182

src/main/java/blusunrize/immersiveengineering/client/ClientEventHandler.java

+71-50
Original file line numberDiff line numberDiff line change
@@ -94,8 +94,11 @@
9494

9595
import javax.annotation.Nonnull;
9696
import java.util.ArrayList;
97+
import java.util.Arrays;
9798
import java.util.List;
9899
import java.util.Optional;
100+
import java.util.function.BiConsumer;
101+
import java.util.function.Consumer;
99102
import java.util.stream.IntStream;
100103

101104
import static blusunrize.immersiveengineering.ImmersiveEngineering.rl;
@@ -116,7 +119,7 @@ public void onResourceManagerReload(@Nonnull ResourceManager resourceManager)
116119
public void onPlayerTick(PlayerTickEvent.Post event)
117120
{
118121
final var player = event.getEntity();
119-
if(player==null||!player.level().isClientSide||player!=ClientUtils.mc().player)
122+
if(!player.level().isClientSide||player!=ClientUtils.mc().player)
120123
return;
121124
if(this.shieldToggleTimer > 0)
122125
this.shieldToggleTimer--;
@@ -165,6 +168,7 @@ public void onPlayerTick(PlayerTickEvent.Post event)
165168
if(steps!=null&&steps.length > 0)
166169
ZoomHandler.fovZoom = steps[ZoomHandler.getCurrentZoomStep(steps)];
167170
}
171+
break;
168172
}
169173
}
170174
}
@@ -307,10 +311,23 @@ else if(equipped instanceof RailgunItem||equipped instanceof IEShieldItem)
307311
@SubscribeEvent
308312
public void onRenderOverlayPre(RenderGuiLayerEvent.Pre event)
309313
{
310-
ItemStack equipped = ClientUtils.mc().player.getItemInHand(InteractionHand.MAIN_HAND);
311-
// early exit if not handling a zoom tool
312-
if(!(event.getName().equals(VanillaGuiLayers.CROSSHAIR)&&ZoomHandler.isZooming&&equipped.getItem() instanceof IZoomTool tool))
314+
// early exit if not handling zooming
315+
if(!event.getName().equals(VanillaGuiLayers.CROSSHAIR)||!ZoomHandler.isZooming)
313316
return;
317+
318+
// check for a zoom tool and get its step array
319+
Player player = ClientUtils.mc().player;
320+
float[] zoomSteps = Arrays.stream(InteractionHand.values())
321+
.map(player::getItemInHand)
322+
.mapMulti((BiConsumer<ItemStack, Consumer<float[]>>)(itemStack, consumer) -> {
323+
if(itemStack.getItem() instanceof IZoomTool zoomTool&&zoomTool.canZoom(itemStack, player))
324+
consumer.accept(zoomTool.getZoomSteps(itemStack, player));
325+
}).findFirst().orElse(null);
326+
327+
if(zoomSteps==null||zoomSteps.length <= 1)
328+
return;
329+
330+
// cancel default crosshair
314331
event.setCanceled(true);
315332

316333
GuiGraphics graphics = event.getGuiGraphics();
@@ -338,44 +355,40 @@ public void onRenderOverlayPre(RenderGuiLayerEvent.Pre event)
338355
graphics.blitSprite(ieLoc("hud/scope"), 0, 0, resMin, resMin);
339356
RenderSystem.disableBlend();
340357

341-
float[] steps = tool.getZoomSteps(equipped, ClientUtils.mc().player);
342-
if(steps!=null&&steps.length > 1)
358+
// draw gauge on the right side
359+
transform.translate(218/256f*resMin, 64/256f*resMin, 0);
360+
graphics.blitSprite(ieLoc("hud/gauge_vertical"), 0, 0, Math.round(24/256f*resMin), Math.round(128/256f*resMin));
361+
362+
float stepLength = 118/(float)zoomSteps.length;
363+
float stepOffset = (stepLength-7)/2f;
364+
// move inside the gauge
365+
RenderSystem.enableBlend();
366+
transform.translate(5/256f*resMin, (5+stepOffset)/256f*resMin, 0);
367+
368+
// draw markers for the possible steps
369+
int curStep = -1;
370+
float dist = 0;
371+
int innerWidth = Math.round(14/256f*resMin);
372+
int innerHeight = Math.round(7/256f*resMin);
373+
374+
for(int i = 0; i < zoomSteps.length; i++)
343375
{
344-
// draw gauge on the right side
345-
transform.translate(218/256f*resMin, 64/256f*resMin, 0);
346-
graphics.blitSprite(ieLoc("hud/gauge_vertical"), 0, 0, Math.round(24/256f*resMin), Math.round(128/256f*resMin));
347-
348-
float stepLength = 118/(float)steps.length;
349-
float stepOffset = (stepLength-7)/2f;
350-
// move inside the gauge
351-
RenderSystem.enableBlend();
352-
transform.translate(5/256f*resMin, (5+stepOffset)/256f*resMin, 0);
353-
354-
// draw markers for the possible steps
355-
int curStep = -1;
356-
float dist = 0;
357-
int innerWidth = Math.round(14/256f*resMin);
358-
int innerHeight = Math.round(7/256f*resMin);
359-
360-
for(int i = 0; i < steps.length; i++)
376+
graphics.blitSprite(ieLoc("hud/gauge_vertical_step"), 0, 0, innerWidth, innerHeight);
377+
transform.translate(0, stepLength/256*resMin, 0);
378+
if(curStep==-1||Math.abs(zoomSteps[i]-ZoomHandler.fovZoom) < dist)
361379
{
362-
graphics.blitSprite(ieLoc("hud/gauge_vertical_step"), 0, 0, innerWidth, innerHeight);
363-
transform.translate(0, stepLength/256*resMin, 0);
364-
if(curStep==-1||Math.abs(steps[i]-ZoomHandler.fovZoom) < dist)
365-
{
366-
curStep = i;
367-
dist = Math.abs(steps[i]-ZoomHandler.fovZoom);
368-
}
380+
curStep = i;
381+
dist = Math.abs(zoomSteps[i]-ZoomHandler.fovZoom);
369382
}
370-
transform.translate(0, -118/256f*resMin, 0);
371-
372-
// draw the pointer and text for current level
373-
transform.translate(0, curStep*stepLength/256*resMin, 0);
374-
graphics.blitSprite(ieLoc("hud/gauge_vertical_pointer"), 0, 0, innerWidth, innerHeight);
375-
transform.translate(16/256f*resMin, 1/256f*resMin, 0);
376-
graphics.drawString(ClientUtils.font(), (1/steps[curStep])+"x", 0, 0, 0xffffff, false);
377-
RenderSystem.disableBlend();
378383
}
384+
transform.translate(0, -118/256f*resMin, 0);
385+
386+
// draw the pointer and text for current level
387+
transform.translate(0, curStep*stepLength/256*resMin, 0);
388+
graphics.blitSprite(ieLoc("hud/gauge_vertical_pointer"), 0, 0, innerWidth, innerHeight);
389+
transform.translate(16/256f*resMin, 1/256f*resMin, 0);
390+
graphics.drawString(ClientUtils.font(), (1/zoomSteps[curStep])+"x", 0, 0, 0xffffff, false);
391+
RenderSystem.disableBlend();
379392
transform.popPose();
380393
}
381394

@@ -415,8 +428,9 @@ public void onFOVUpdate(ComputeFovModifierEvent event)
415428
Player player = ClientUtils.mc().player;
416429

417430
// Check if player is holding a zoom-allowing item
418-
ItemStack equipped = player.getItemInHand(InteractionHand.MAIN_HAND);
419-
boolean mayZoom = equipped.getItem() instanceof IZoomTool&&((IZoomTool)equipped.getItem()).canZoom(equipped, player);
431+
boolean mayZoom = Arrays.stream(InteractionHand.values())
432+
.map(player::getItemInHand)
433+
.anyMatch(s -> s.getItem() instanceof IZoomTool zoomTool&&zoomTool.canZoom(s, player));
420434
// Set zoom if allowed, otherwise stop zooming
421435
if(ZoomHandler.isZooming)
422436
{
@@ -436,10 +450,12 @@ public void onPlayerTurn(CalculatePlayerTurnEvent event)
436450
{
437451
if(event.getCinematicCameraEnabled())
438452
return;
453+
439454
// Check if player is holding a zoom-allowing item and using them
440455
Player player = ClientUtils.mc().player;
441-
ItemStack equipped = player.getItemInHand(InteractionHand.MAIN_HAND);
442-
boolean mayZoom = equipped.getItem() instanceof IZoomTool&&((IZoomTool)equipped.getItem()).canZoom(equipped, player);
456+
boolean mayZoom = Arrays.stream(InteractionHand.values())
457+
.map(player::getItemInHand)
458+
.anyMatch(s -> s.getItem() instanceof IZoomTool zoomTool&&zoomTool.canZoom(s, player));
443459
if(ZoomHandler.isZooming&&mayZoom)
444460
{
445461
// final math is: (m*0.6 + 0.2)³ * 8; where m is the mouse sensitivity
@@ -459,21 +475,26 @@ public void onMouseEvent(MouseScrollingEvent event)
459475
Player player = ClientUtils.mc().player;
460476
if(event.getScrollDeltaY()!=0&&ClientUtils.mc().screen==null&&player!=null)
461477
{
462-
ItemStack equipped = player.getItemInHand(InteractionHand.MAIN_HAND);
463-
// Handle zoom steps
464-
if(equipped.getItem() instanceof IZoomTool&&((IZoomTool)equipped.getItem()).canZoom(equipped, player)&&ZoomHandler.isZooming)
478+
// Handle zooming in and out
479+
if(ZoomHandler.isZooming)
465480
{
466-
float[] steps = ((IZoomTool)equipped.getItem()).getZoomSteps(equipped, player);
467-
if(steps!=null&&steps.length > 0)
481+
float[] zoomSteps = Arrays.stream(InteractionHand.values())
482+
.map(player::getItemInHand)
483+
.mapMulti((BiConsumer<ItemStack, Consumer<float[]>>)(itemStack, consumer) -> {
484+
if(itemStack.getItem() instanceof IZoomTool zoomTool&&zoomTool.canZoom(itemStack, player))
485+
consumer.accept(zoomTool.getZoomSteps(itemStack, player));
486+
}).findFirst().orElse(null);
487+
if(zoomSteps!=null&&zoomSteps.length > 0)
468488
{
469-
int curStep = ZoomHandler.getCurrentZoomStep(steps);
489+
int curStep = ZoomHandler.getCurrentZoomStep(zoomSteps);
470490
int newStep = curStep+(event.getScrollDeltaY() > 0?-1: 1);
471-
if(newStep >= 0&&newStep < steps.length)
472-
ZoomHandler.fovZoom = steps[newStep];
491+
if(newStep >= 0&&newStep < zoomSteps.length)
492+
ZoomHandler.fovZoom = zoomSteps[newStep];
473493
event.setCanceled(true);
474494
}
475495
}
476496

497+
ItemStack equipped = player.getItemInHand(InteractionHand.MAIN_HAND);
477498
// Handle sneak + scrolling
478499
if(player.isShiftKeyDown())
479500
{

0 commit comments

Comments
 (0)