r2mods/ilspy_dump/ror2_csproj/RoR2.Achievements/HardEliteBossKillAchievemen...

93 lines
2.2 KiB
C#

using System.Collections.Generic;
using UnityEngine;
namespace RoR2.Achievements;
[RegisterAchievement("HardEliteBossKill", "Items.KillEliteFrenzy", null, 3u, typeof(EliteBossKillServerAchievement))]
internal class HardEliteBossKillAchievement : BaseAchievement
{
private class EliteBossKillServerAchievement : BaseServerAchievement
{
private static readonly List<EliteBossKillServerAchievement> instancesList = new List<EliteBossKillServerAchievement>();
public override void OnInstall()
{
base.OnInstall();
instancesList.Add(this);
if (instancesList.Count == 1)
{
GlobalEventManager.onCharacterDeathGlobal += OnCharacterDeath;
}
}
public override void OnUninstall()
{
if (instancesList.Count == 1)
{
GlobalEventManager.onCharacterDeathGlobal -= OnCharacterDeath;
}
instancesList.Remove(this);
base.OnUninstall();
}
private static void OnCharacterDeath(DamageReport damageReport)
{
if (!damageReport.victim)
{
return;
}
CharacterBody body = damageReport.victim.body;
if (!body || !body.isChampion || !body.isElite)
{
return;
}
foreach (EliteBossKillServerAchievement instances in instancesList)
{
GameObject masterObject = instances.serverAchievementTracker.networkUser.masterObject;
if (!masterObject)
{
continue;
}
CharacterMaster component = masterObject.GetComponent<CharacterMaster>();
if ((bool)component)
{
CharacterBody body2 = component.GetBody();
if ((bool)body2 && (bool)body2.healthComponent && body2.healthComponent.alive)
{
instances.Grant();
}
}
}
}
}
public override void OnInstall()
{
base.OnInstall();
NetworkUser.OnPostNetworkUserStart += OnPostNetworkUserStart;
Run.onRunStartGlobal += OnRunStart;
}
public override void OnUninstall()
{
NetworkUser.OnPostNetworkUserStart -= OnPostNetworkUserStart;
Run.onRunStartGlobal -= OnRunStart;
base.OnUninstall();
}
private void UpdateTracking()
{
SetServerTracked((bool)Run.instance && (DifficultyCatalog.GetDifficultyDef(Run.instance.selectedDifficulty)?.countsAsHardMode ?? false));
}
private void OnPostNetworkUserStart(NetworkUser networkUser)
{
UpdateTracking();
}
private void OnRunStart(Run run)
{
UpdateTracking();
}
}