r2mods/ilspy_dump/ror2_csproj/EntityStates.VoidCamp/Idle.cs

142 lines
3.4 KiB
C#

using System.Collections.Generic;
using System.Collections.ObjectModel;
using RoR2;
using RoR2.Audio;
using RoR2.UI;
using UnityEngine;
using UnityEngine.Networking;
namespace EntityStates.VoidCamp;
public class Idle : EntityState
{
private class VoidCampObjectiveTracker : ObjectivePanelController.ObjectiveTracker
{
protected override string GenerateString()
{
int count = TeamComponent.GetTeamMembers(TeamIndex.Void).Count;
return string.Format(Language.GetString("OBJECTIVE_VOIDCAMP"), count);
}
protected override bool IsDirty()
{
return true;
}
}
[SerializeField]
public string baseAnimationLayerName;
[SerializeField]
public string baseAnimationStateName;
[SerializeField]
public string additiveAnimationLayerName;
[SerializeField]
public string additiveAnimationStateName;
[SerializeField]
public float clearCheckRate;
[SerializeField]
public float initialClearCheckDelay;
[SerializeField]
public LoopSoundDef loopSoundDef;
[SerializeField]
public int indicatorMaxTeamCountThreshold;
[SerializeField]
public GameObject indicatorPrefab;
private LoopSoundManager.SoundLoopPtr loopPtr;
private bool hasEnabledIndicators;
private HashSet<NetworkInstanceId> indicatedNetIds;
private float countdown;
public override void OnEnter()
{
base.OnEnter();
PlayAnimation(baseAnimationLayerName, baseAnimationStateName);
PlayAnimation(additiveAnimationLayerName, additiveAnimationStateName);
loopPtr = LoopSoundManager.PlaySoundLoopLocal(base.gameObject, loopSoundDef);
countdown = initialClearCheckDelay;
indicatedNetIds = new HashSet<NetworkInstanceId>();
GetComponent<OutsideInteractableLocker>().enabled = true;
ObjectivePanelController.collectObjectiveSources += OnCollectObjectiveSources;
}
private void OnCollectObjectiveSources(CharacterMaster master, List<ObjectivePanelController.ObjectiveSourceDescriptor> objectiveSourcesList)
{
objectiveSourcesList.Add(new ObjectivePanelController.ObjectiveSourceDescriptor
{
master = master,
objectiveType = typeof(VoidCampObjectiveTracker),
source = base.gameObject
});
}
public override void FixedUpdate()
{
base.FixedUpdate();
countdown -= GetDeltaTime();
if (!(countdown < 0f))
{
return;
}
countdown = clearCheckRate;
ReadOnlyCollection<TeamComponent> teamMembers = TeamComponent.GetTeamMembers(TeamIndex.Void);
int count = teamMembers.Count;
if (count <= 0)
{
outer.SetNextState(new Deactivate());
}
else
{
if (!hasEnabledIndicators && count > indicatorMaxTeamCountThreshold)
{
return;
}
hasEnabledIndicators = true;
foreach (TeamComponent item in teamMembers)
{
if ((bool)item && (bool)item.body && (bool)item.body.master)
{
RequestIndicatorForMaster(item.body.master);
}
}
}
}
public override void OnExit()
{
LoopSoundManager.StopSoundLoopLocal(loopPtr);
GetComponent<OutsideInteractableLocker>().enabled = false;
ObjectivePanelController.collectObjectiveSources -= OnCollectObjectiveSources;
base.OnExit();
}
protected void RequestIndicatorForMaster(CharacterMaster master)
{
if (indicatedNetIds.Contains(master.netId))
{
return;
}
GameObject bodyObject = master.GetBodyObject();
if ((bool)bodyObject)
{
TeamComponent component = bodyObject.GetComponent<TeamComponent>();
if ((bool)component)
{
indicatedNetIds.Add(master.netId);
component.RequestDefaultIndicator(indicatorPrefab);
}
}
}
}