-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathAllyMaster.cs
88 lines (75 loc) · 2.95 KB
/
AllyMaster.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
using RoR2;
using RoR2.Stats;
using System.Reflection;
using UnityEngine;
namespace ProtectTheVIP
{
class AllyMaster : MonoBehaviour
{
public string NameToken { get; set; }
public CharacterMaster Leader { get; set; }
private CharacterMaster master;
public void Awake()
{
master = GetComponent<CharacterMaster>();
if (master)
{
EnsureNameplateUpdated();
// Flip the Ally to the Player Team
master.teamIndex = TeamIndex.Player;
TeamComponent teamComponent = master.GetBodyObject().GetComponent<TeamComponent>();
teamComponent.teamIndex = TeamIndex.Player;
ForceNameplateUpdate();
gameObject.AddComponent<SetDontDestroyOnLoad>();
// This causes the Ally to not spawn in the next stage
//if (master.gameObject.GetComponent<PlayerCharacterMasterController>() == null)
//{
// Debug.LogWarning("Adding PlayerCharacterMasterController to ally");
// master.gameObject.AddComponent<PlayerCharacterMasterController>();
//}
//if (master.gameObject.GetComponent<PlayerStatsComponent>() == null)
//{
// Debug.LogWarning("Adding PlayerStatsComponent to ally");
// master.gameObject.AddComponent<PlayerStatsComponent>();
//}
}
}
public void LateUpdate()
{
if (master)
{
EnsureNameplateUpdated();
}
}
private void EnsureNameplateUpdated()
{
CharacterBody body = master.GetBody();
if (body && !string.IsNullOrWhiteSpace(NameToken) && !body.baseNameToken.Equals(NameToken))
{
Debug.LogWarning($"Updating nameplate: {body.baseNameToken} => {NameToken}");
body.baseNameToken = NameToken;
}
}
private void ForceNameplateUpdate()
{
Debug.LogWarning($"Forcing ally {master.GetBody()?.GetDisplayName()} to have player nameplate.");
TeamComponent team = master.GetBodyObject().GetComponent<TeamComponent>();
if (!team)
{
Debug.LogError("Could not find TeamComponent!");
return;
}
FieldInfo indicatorField = typeof(TeamComponent)
.GetField("indicator", BindingFlags.Instance | BindingFlags.NonPublic);
GameObject indicator = (GameObject)indicatorField.GetValue(team);
if (indicator)
{
Destroy(indicator);
indicatorField.SetValue(team, null);
}
typeof(TeamComponent)
.GetMethod("SetupIndicator", BindingFlags.Instance | BindingFlags.NonPublic)
.Invoke(team, new object[0]);
}
}
}