generated from MrSphay/codex-agent-repository-kit
126 lines
4.2 KiB
Java
126 lines
4.2 KiB
Java
/*
|
|
* Decompiled with CFR 0.152.
|
|
*/
|
|
package com.vinlanx.explosionoverhaul.client;
|
|
|
|
import net.minecraft.client.Minecraft;
|
|
import net.minecraft.client.player.LocalPlayer;
|
|
import net.minecraft.util.Mth;
|
|
import net.minecraftforge.api.distmarker.Dist;
|
|
import net.minecraftforge.api.distmarker.OnlyIn;
|
|
|
|
@OnlyIn(value=Dist.CLIENT)
|
|
public class CameraShakeConcussionEffect {
|
|
private static final int FADE_IN_TICKS = 40;
|
|
private static final int FADE_OUT_TICKS = 40;
|
|
private static Phase phase = Phase.IDLE;
|
|
private static int ticksInPhase = 0;
|
|
private static int holdTicks = 0;
|
|
private static float currentIntensity = 0.0f;
|
|
private static float targetIntensity = 0.0f;
|
|
private static float lastYawOffset = 0.0f;
|
|
private static float lastPitchOffset = 0.0f;
|
|
|
|
public static boolean isActive() {
|
|
return phase != Phase.IDLE;
|
|
}
|
|
|
|
public static void start(int seconds, float intensity) {
|
|
int newHoldTicks = Mth.m_14045_((int)seconds, (int)1, (int)100) * 20;
|
|
float newIntensity = Math.max(0.0f, intensity);
|
|
if (phase != Phase.IDLE) {
|
|
targetIntensity += newIntensity;
|
|
holdTicks = Math.min(2000, holdTicks + newHoldTicks);
|
|
if (phase == Phase.FADE_OUT) {
|
|
phase = Phase.HOLD;
|
|
ticksInPhase = 0;
|
|
}
|
|
} else {
|
|
targetIntensity = newIntensity;
|
|
holdTicks = newHoldTicks;
|
|
ticksInPhase = 0;
|
|
phase = Phase.FADE_IN;
|
|
currentIntensity = 0.0f;
|
|
}
|
|
}
|
|
|
|
public static void onClientTick() {
|
|
Minecraft mc = Minecraft.m_91087_();
|
|
if (mc.m_91104_()) {
|
|
return;
|
|
}
|
|
LocalPlayer player = mc.f_91074_;
|
|
if (player == null) {
|
|
CameraShakeConcussionEffect.stop();
|
|
return;
|
|
}
|
|
player.m_19884_((double)(-lastYawOffset), (double)(-lastPitchOffset));
|
|
lastYawOffset = 0.0f;
|
|
lastPitchOffset = 0.0f;
|
|
if (phase == Phase.IDLE) {
|
|
return;
|
|
}
|
|
++ticksInPhase;
|
|
switch (phase) {
|
|
case FADE_IN: {
|
|
float t = (float)ticksInPhase / 40.0f;
|
|
currentIntensity = CameraShakeConcussionEffect.easeInOutCubic(t) * targetIntensity;
|
|
if (ticksInPhase < 40) break;
|
|
phase = Phase.HOLD;
|
|
ticksInPhase = 0;
|
|
break;
|
|
}
|
|
case HOLD: {
|
|
currentIntensity = targetIntensity;
|
|
if (ticksInPhase < holdTicks) break;
|
|
phase = Phase.FADE_OUT;
|
|
ticksInPhase = 0;
|
|
break;
|
|
}
|
|
case FADE_OUT: {
|
|
float t = (float)ticksInPhase / 40.0f;
|
|
currentIntensity = targetIntensity * CameraShakeConcussionEffect.easeInOutCubic(1.0f - t);
|
|
if (ticksInPhase < 40) break;
|
|
CameraShakeConcussionEffect.stop();
|
|
return;
|
|
}
|
|
}
|
|
if (currentIntensity > 0.0f) {
|
|
CameraShakeConcussionEffect.applySway(player, (float)player.f_19797_ + mc.m_91296_());
|
|
}
|
|
}
|
|
|
|
private static void applySway(LocalPlayer player, float totalTicks) {
|
|
float horizontalSway = Mth.m_14031_((float)(totalTicks * 0.04f)) * 1.5f + Mth.m_14031_((float)(totalTicks * 0.025f)) * 1.0f;
|
|
float verticalSway = Mth.m_14089_((float)(totalTicks * 0.035f)) * 0.8f + Mth.m_14031_((float)(totalTicks * 0.015f)) * 0.5f;
|
|
float yawChange = horizontalSway * currentIntensity * 50.0f;
|
|
float pitchChange = verticalSway * currentIntensity * 30.0f;
|
|
player.m_19884_((double)yawChange, (double)pitchChange);
|
|
lastYawOffset = yawChange;
|
|
lastPitchOffset = pitchChange;
|
|
}
|
|
|
|
public static void stop() {
|
|
phase = Phase.IDLE;
|
|
ticksInPhase = 0;
|
|
holdTicks = 0;
|
|
currentIntensity = 0.0f;
|
|
targetIntensity = 0.0f;
|
|
lastYawOffset = 0.0f;
|
|
lastPitchOffset = 0.0f;
|
|
}
|
|
|
|
private static float easeInOutCubic(float t) {
|
|
return t < 0.5f ? 4.0f * t * t * t : 1.0f - (float)Math.pow(-2.0f * t + 2.0f, 3.0) / 2.0f;
|
|
}
|
|
|
|
private static enum Phase {
|
|
IDLE,
|
|
FADE_IN,
|
|
HOLD,
|
|
FADE_OUT;
|
|
|
|
}
|
|
}
|
|
|