Files
Continentis/Assets/OtherPlugins/DamageNumbersPro/Scripts/Internal/DNPUpdater.cs

123 lines
4.0 KiB
C#
Raw Normal View History

2025-10-03 00:02:43 -04:00
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
namespace DamageNumbersPro.Internal
{
public class DNPUpdater : MonoBehaviour
{
// Dicitonary
2026-03-20 11:56:50 -04:00
private static Dictionary<float, DNPUpdater> unscaledUpdaters;
private static Dictionary<float, DNPUpdater> scaledUpdaters;
2025-10-03 00:02:43 -04:00
// Static
public static Vector3 upVector;
public static Vector3 rightVector;
public static bool vectorsNeedUpdate;
public static Quaternion cameraRotation;
// Settings
2026-03-20 11:56:50 -04:00
public bool isUnscaled;
2025-10-03 00:02:43 -04:00
public float updateDelay = 0.0125f;
public HashSet<DamageNumber> activePopups;
2026-03-20 11:56:50 -04:00
private float delta;
2025-10-03 00:02:43 -04:00
// Internal
2026-03-20 11:56:50 -04:00
private float lastUpdateTime;
public HashSet<DamageNumber> removedPopups;
private float time;
2025-10-03 00:02:43 -04:00
2026-03-20 11:56:50 -04:00
private void Start()
2025-10-03 00:02:43 -04:00
{
StartCoroutine(UpdatePopups());
}
2026-03-20 11:56:50 -04:00
private IEnumerator UpdatePopups()
2025-10-03 00:02:43 -04:00
{
// Delay
2026-03-20 11:56:50 -04:00
var delay = new WaitForSecondsRealtime(updateDelay);
2025-10-03 00:02:43 -04:00
2026-03-20 11:56:50 -04:00
while (true)
2025-10-03 00:02:43 -04:00
{
// Vector Update
vectorsNeedUpdate = true;
// Update
2026-03-20 11:56:50 -04:00
foreach (var popup in activePopups)
if (popup != null)
2025-10-03 00:02:43 -04:00
popup.UpdateDamageNumber(delta, time);
else
removedPopups.Add(popup);
// Clean Up
2026-03-20 11:56:50 -04:00
if (removedPopups.Count > 0)
2025-10-03 00:02:43 -04:00
{
2026-03-20 11:56:50 -04:00
foreach (var removed in removedPopups) activePopups.Remove(removed);
2025-10-03 00:02:43 -04:00
removedPopups = new HashSet<DamageNumber>();
}
// Wait
if (isUnscaled)
{
lastUpdateTime = Time.unscaledTime;
yield return delay;
time = Time.unscaledTime;
delta = time - lastUpdateTime;
}
else
{
lastUpdateTime = Time.time;
yield return delay;
time = Time.time;
delta = time - lastUpdateTime;
}
}
}
public static void RegisterPopup(bool unscaledTime, float updateDelay, DamageNumber popup)
{
2026-03-20 11:56:50 -04:00
ref var updaters = ref unscaledTime ? ref unscaledUpdaters : ref scaledUpdaters;
2025-10-03 00:02:43 -04:00
2026-03-20 11:56:50 -04:00
if (updaters == null) updaters = new Dictionary<float, DNPUpdater>();
2025-10-03 00:02:43 -04:00
2026-03-20 11:56:50 -04:00
var containsKey = updaters.ContainsKey(updateDelay);
2025-10-03 00:02:43 -04:00
if (containsKey && updaters[updateDelay] != null)
{
updaters[updateDelay].activePopups.Add(popup);
}
else
{
2026-03-20 11:56:50 -04:00
if (containsKey) updaters.Remove(updateDelay);
2025-10-03 00:02:43 -04:00
2026-03-20 11:56:50 -04:00
var newUpdater = new GameObject("");
2025-10-03 00:02:43 -04:00
newUpdater.hideFlags = HideFlags.HideInHierarchy;
2026-03-20 11:56:50 -04:00
var dnpUpdater = newUpdater.AddComponent<DNPUpdater>();
2025-10-03 00:02:43 -04:00
dnpUpdater.activePopups = new HashSet<DamageNumber>();
dnpUpdater.removedPopups = new HashSet<DamageNumber>();
dnpUpdater.isUnscaled = unscaledTime;
dnpUpdater.updateDelay = updateDelay;
DontDestroyOnLoad(newUpdater);
updaters.Add(updateDelay, dnpUpdater);
dnpUpdater.activePopups.Add(popup);
}
}
public static void UnregisterPopup(bool unscaledTime, float updateDelay, DamageNumber popup)
{
2026-03-20 11:56:50 -04:00
var updaters = unscaledTime ? unscaledUpdaters : scaledUpdaters;
2025-10-03 00:02:43 -04:00
2026-03-20 11:56:50 -04:00
if (updaters != null && updaters.ContainsKey(updateDelay) &&
updaters[updateDelay].activePopups.Contains(popup)) updaters[updateDelay].removedPopups.Add(popup);
2025-10-03 00:02:43 -04:00
}
public static void UpdateVectors(Transform popup)
{
vectorsNeedUpdate = false;
upVector = popup.up;
rightVector = popup.right;
}
}
2026-03-20 11:56:50 -04:00
}