forked from nikita/muzika-gromche
147 lines
4.8 KiB
C#
147 lines
4.8 KiB
C#
using System.Collections;
|
|
using HarmonyLib;
|
|
using UnityEngine;
|
|
|
|
namespace MuzikaGromche
|
|
{
|
|
static class ScreenFiltersManager
|
|
{
|
|
private const float VibilityThreshold = 0.01f;
|
|
|
|
private static bool drunknessChangedThisFrame = false;
|
|
private static float drunkness = 0f;
|
|
public static float Drunkness
|
|
{
|
|
get => drunkness;
|
|
set
|
|
{
|
|
drunkness = value;
|
|
drunknessChangedThisFrame = true;
|
|
ScheduleUpdate();
|
|
}
|
|
}
|
|
|
|
private static bool helmetCondensationDropsChangedThisFrame = false;
|
|
private static float helmetCondensationDrops = 0f;
|
|
public static float HelmetCondensationDrops
|
|
{
|
|
get => helmetCondensationDrops;
|
|
set
|
|
{
|
|
helmetCondensationDrops = value;
|
|
helmetCondensationDropsChangedThisFrame = true;
|
|
ScheduleUpdate();
|
|
}
|
|
}
|
|
|
|
private static Coroutine? scheduledUpdate = null;
|
|
|
|
private static void ScheduleUpdate()
|
|
{
|
|
CancelScheduledUpdate();
|
|
scheduledUpdate = HUDManager.Instance.StartCoroutine(ScheduledUpdate());
|
|
}
|
|
|
|
private static void CancelScheduledUpdate()
|
|
{
|
|
if (scheduledUpdate != null)
|
|
{
|
|
HUDManager.Instance.StopCoroutine(scheduledUpdate);
|
|
scheduledUpdate = null;
|
|
}
|
|
}
|
|
|
|
private static IEnumerator ScheduledUpdate()
|
|
{
|
|
try
|
|
{
|
|
yield return new WaitForEndOfFrame();
|
|
Update();
|
|
}
|
|
finally
|
|
{
|
|
scheduledUpdate = null;
|
|
}
|
|
}
|
|
|
|
private static void Update()
|
|
{
|
|
CancelScheduledUpdate();
|
|
var hud = HUDManager.Instance;
|
|
|
|
if (!drunknessChangedThisFrame)
|
|
{
|
|
// animated roll-off
|
|
drunkness = Mathf.Clamp(drunkness - Time.deltaTime / 2f, 0f, 1f);
|
|
}
|
|
drunknessChangedThisFrame = false;
|
|
if (drunkness > VibilityThreshold)
|
|
{
|
|
var moddedDrunknessFilterWeight = StartOfRound.Instance.drunknessSideEffect.Evaluate(drunkness);
|
|
var moddedGasImageAlphaAlpha = moddedDrunknessFilterWeight * 1.5f;
|
|
// set the final value to the greatest of the two, so that we don't accidentally undo TZP's visual effect.
|
|
hud.drunknessFilter.weight = Mathf.Max(hud.drunknessFilter.weight, moddedDrunknessFilterWeight);
|
|
hud.gasImageAlpha.alpha = Mathf.Max(hud.gasImageAlpha.alpha, moddedGasImageAlphaAlpha);
|
|
// Image alpha only makes sense if the animator is running
|
|
hud.gasHelmetAnimator.SetBool("gasEmitting", value: true);
|
|
}
|
|
else
|
|
{
|
|
ClearDrunkness();
|
|
}
|
|
|
|
if (!helmetCondensationDropsChangedThisFrame)
|
|
{
|
|
// animated roll-off
|
|
helmetCondensationDrops = Mathf.Clamp(helmetCondensationDrops - Time.deltaTime / 6f, 0f, 1f);
|
|
}
|
|
helmetCondensationDropsChangedThisFrame = false;
|
|
if (helmetCondensationDrops > VibilityThreshold)
|
|
{
|
|
// HelmetCondensationDrops
|
|
Color color = hud.helmetCondensationMaterial.color;
|
|
// set the final value to the greatest of the two, so that we don't accidentally undo steam's visual effect.
|
|
color.a = Mathf.Clamp(Mathf.Max(color.a, helmetCondensationDrops), 0f, 0.27f);
|
|
hud.helmetCondensationMaterial.color = color;
|
|
}
|
|
else
|
|
{
|
|
ClearCondensation();
|
|
}
|
|
}
|
|
|
|
public static void Clear()
|
|
{
|
|
ClearDrunkness();
|
|
ClearCondensation();
|
|
}
|
|
|
|
private static void ClearDrunkness()
|
|
{
|
|
drunkness = 0f;
|
|
// Only the stop animation if vanilla doesn't animate TZP right now.
|
|
if (GameNetworkManager.Instance.localPlayerController.drunkness == 0f)
|
|
{
|
|
HUDManager.Instance.gasHelmetAnimator.SetBool("gasEmitting", value: false);
|
|
}
|
|
// Vanilla will set drunknessFilter.weight and gasImageAlpha.alpha on the next Update anyway.
|
|
}
|
|
|
|
private static void ClearCondensation()
|
|
{
|
|
helmetCondensationDrops = 0f;
|
|
}
|
|
|
|
[HarmonyPatch(typeof(HUDManager))]
|
|
internal static class HUDManagerScreenFiltersPatch
|
|
{
|
|
[HarmonyPatch(nameof(HUDManager.SetScreenFilters))]
|
|
[HarmonyPostfix]
|
|
static void SetScreenFiltersPostfix(HUDManager __instance)
|
|
{
|
|
Update();
|
|
}
|
|
}
|
|
}
|
|
}
|