1
0
Fork 0
muzika-gromche/MuzikaGromche/ScreenFiltersManager.cs

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();
}
}
}
}