r2mods/ilspy_dump/ror2_csproj/RoR2/CharacterSelectSurvivorPrev...

165 lines
4.4 KiB
C#

using System;
using RoR2.Skills;
using UnityEngine;
using UnityEngine.Events;
namespace RoR2;
public class CharacterSelectSurvivorPreviewDisplayController : MonoBehaviour
{
[Serializable]
public struct SkillChangeResponse
{
public SkillFamily triggerSkillFamily;
public SkillDef triggerSkill;
public UnityEvent response;
}
[Serializable]
public struct SkinChangeResponse
{
public SkinDef triggerSkin;
public UnityEvent response;
}
public GameObject bodyPrefab;
public SkillChangeResponse[] skillChangeResponses;
public SkinChangeResponse[] skinChangeResponses;
private Loadout currentLoadout;
public NetworkUser networkUser { get; set; }
private void OnEnable()
{
currentLoadout = Loadout.RequestInstance();
NetworkUser.onLoadoutChangedGlobal += OnLoadoutChangedGlobal;
RoR2Application.onNextUpdate += Refresh;
RunDefaultResponses();
}
private void OnDisable()
{
NetworkUser.onLoadoutChangedGlobal -= OnLoadoutChangedGlobal;
currentLoadout = Loadout.ReturnInstance(currentLoadout);
}
private static int FindSkillSlotIndex(BodyIndex bodyIndex, SkillFamily skillFamily)
{
GenericSkill[] bodyPrefabSkillSlots = BodyCatalog.GetBodyPrefabSkillSlots(bodyIndex);
for (int i = 0; i < bodyPrefabSkillSlots.Length; i++)
{
if (bodyPrefabSkillSlots[i].skillFamily == skillFamily)
{
return i;
}
}
return -1;
}
private static int FindVariantIndex(SkillFamily skillFamily, SkillDef skillDef)
{
SkillFamily.Variant[] variants = skillFamily.variants;
for (int i = 0; i < variants.Length; i++)
{
if (variants[i].skillDef == skillDef)
{
return i;
}
}
return -1;
}
private static bool HasSkillVariantEnabled(Loadout loadout, BodyIndex bodyIndex, SkillFamily skillFamily, SkillDef skillDef)
{
int num = FindSkillSlotIndex(bodyIndex, skillFamily);
int num2 = FindVariantIndex(skillFamily, skillDef);
if (num == -1 || num2 == -1)
{
return false;
}
return loadout.bodyLoadoutManager.GetSkillVariant(bodyIndex, num) == num2;
}
private void Refresh()
{
if ((bool)this && (bool)networkUser)
{
OnLoadoutChangedGlobal(networkUser);
}
}
private void OnLoadoutChangedGlobal(NetworkUser changedNetworkUser)
{
if (changedNetworkUser != networkUser)
{
return;
}
Loadout loadout = Loadout.RequestInstance();
changedNetworkUser.networkLoadout.CopyLoadout(loadout);
BodyIndex bodyIndex = BodyCatalog.FindBodyIndex(bodyPrefab);
if (bodyIndex == BodyIndex.None)
{
return;
}
SkillChangeResponse[] array = skillChangeResponses;
for (int i = 0; i < array.Length; i++)
{
SkillChangeResponse skillChangeResponse = array[i];
bool num = HasSkillVariantEnabled(currentLoadout, bodyIndex, skillChangeResponse.triggerSkillFamily, skillChangeResponse.triggerSkill);
bool flag = HasSkillVariantEnabled(loadout, bodyIndex, skillChangeResponse.triggerSkillFamily, skillChangeResponse.triggerSkill);
if (!num && flag)
{
skillChangeResponse.response?.Invoke();
}
}
SkinChangeResponse[] array2 = skinChangeResponses;
for (int i = 0; i < array2.Length; i++)
{
SkinChangeResponse skinChangeResponse = array2[i];
uint num2 = (uint)SkinCatalog.FindLocalSkinIndexForBody(bodyIndex, skinChangeResponse.triggerSkin);
uint skinIndex = currentLoadout.bodyLoadoutManager.GetSkinIndex(bodyIndex);
uint skinIndex2 = loadout.bodyLoadoutManager.GetSkinIndex(bodyIndex);
if (skinIndex != skinIndex2 && skinIndex2 == num2)
{
skinChangeResponse.response?.Invoke();
}
}
loadout.Copy(currentLoadout);
Loadout.ReturnInstance(loadout);
}
private void RunDefaultResponses()
{
BodyIndex bodyIndex = BodyCatalog.FindBodyIndex(bodyPrefab);
if (bodyIndex == BodyIndex.None)
{
return;
}
SkillChangeResponse[] array = skillChangeResponses;
for (int i = 0; i < array.Length; i++)
{
SkillChangeResponse skillChangeResponse = array[i];
if (HasSkillVariantEnabled(currentLoadout, bodyIndex, skillChangeResponse.triggerSkillFamily, skillChangeResponse.triggerSkill))
{
skillChangeResponse.response?.Invoke();
}
}
SkinChangeResponse[] array2 = skinChangeResponses;
for (int i = 0; i < array2.Length; i++)
{
SkinChangeResponse skinChangeResponse = array2[i];
uint num = (uint)SkinCatalog.FindLocalSkinIndexForBody(bodyIndex, skinChangeResponse.triggerSkin);
if (currentLoadout.bodyLoadoutManager.GetSkinIndex(bodyIndex) == num)
{
skinChangeResponse.response?.Invoke();
}
}
}
}