I'm trying to use a tuple list inside a custom class that wraps some methods from mutliple classes inside a game. I'm getting an 'object reference not set to instance of object error' just after the "ENTERED ADD METHOD A-1" is displayed in the cosole from the 1st Add method of the wrapper class. Clearly, Im not setting up the list correctly, but I can't see where the issue is. Any help would be appreciated as I'm new to working with 'classes'.
// wrappers & classes
KilledActorsWrapper KilledActors = new KilledActorsWrapper();
public class KilledActorsWrapper
#region KilledActorsWrapper class
{
public KilledActorsWrapper()
{ // constructor
if (Type.GetType("KilledActorsWrapper") == null) // check to see if class has been initiated
{ //class with the given name does not exist so instantiate it
List<Tuple<AiActor, AiDamageInitiator, NamedDamageTypes, List<DamagerScore>>> m_KilledActors =
new List<Tuple<AiActor, AiDamageInitiator, NamedDamageTypes, List<DamagerScore>>>();
m_KilledActors.Clear();
ConsoleWriteline("INITIALISED KILLEDACTORS LIST");
}
else
{ // class with the given name exists so show an error, cannot initate the class twice
ColoredConsoleWrite(ConsoleColor.DarkGreen, "INITIALISING KILLEDACTORS LIST FAILED");
throw new Exception("KilledActorsWrapper class already exists. Are you typing to initiate a second instance of this class?");
}
}
public void Add(AiActor killedActor, List<DamagerScore> damages)
{
ConsoleWriteline("ENTERED ADD METHOD A");
Tuple<AiActor, AiDamageInitiator, NamedDamageTypes, List<DamagerScore>> tuple = new Tuple<AiActor, AiDamageInitiator, NamedDamageTypes,
List<DamagerScore>>(killedActor, null, NamedDamageTypes.AirbrakeDriveFailure, damages);
ConsoleWriteline("ENTERED ADD METHOD A-1");
m_KilledActors.Add(tuple);
ConsoleWriteline("ENTERED ADD METHOD A-2");
}
public void Add(AiActor killedActor, AiDamageInitiator initiator, NamedDamageTypes damageType)
{
ConsoleWriteline("ENTERED ADD METHOD B");
Tuple<AiActor, AiDamageInitiator, NamedDamageTypes, List<DamagerScore>> tuple = new Tuple<AiActor, AiDamageInitiator, NamedDamageTypes,
List<DamagerScore>>(killedActor, initiator, damageType, null);
ConsoleWriteline("ENTERED ADD METHOD B-1");
this.m_KilledActors.Add(tuple);
ConsoleWriteline("ENTERED ADD METHOD B-2");
}
public int Count
{
get { return m_KilledActors.Count; }
}
public List<DamagerScore> GetDamagerScore(AiActor killedActor)
{
for (int i = 0; i < m_KilledActors.Count; i++)
{
if (m_KilledActors[i].Item1 == killedActor)
{
return (List<DamagerScore>)m_KilledActors[i].Item1;
}
}
return null;
}
public List<AiDamageInitiator> GetDamageInitiators(AiActor killedActor)
{
List<AiDamageInitiator> damageinitiators = null;
for (int i = 0; i < m_KilledActors.Count; i++)
{
if (m_KilledActors[i].Item1 == killedActor)
{
damageinitiators.Add((AiDamageInitiator)m_KilledActors[i].Item2);
}
}
return damageinitiators;
}
public List<NamedDamageTypes> GetNamedDamageTypes(AiActor actor)
{
List<NamedDamageTypes> nameddamagetypes = null;
for (int i = 0; i < m_KilledActors.Count; i++)
{
if (m_KilledActors[i].Item1 == actor)
{
nameddamagetypes.Add((NamedDamageTypes)m_KilledActors[i].Item3);
}
}
return nameddamagetypes;
}
public void Clear()
{
m_KilledActors.Clear();
}
private List<Tuple<AiActor, AiDamageInitiator, NamedDamageTypes, List<DamagerScore>>> m_KilledActors { get; set; }
}
#endregion
public override void OnActorDead(int missionNumber, string shortName, AiActor actor, List<DamagerScore> damages)
#region process when an actor dies
{
base.OnActorDead(missionNumber, shortName, actor, damages);
KilledActors.Add(actor, damages); // call the wrapper class
}
public override void OnActorDamaged(int missionNumber, string shortName, AiActor actor, AiDamageInitiator initiator, NamedDamageTypes damageType)
{
base.OnActorDamaged(missionNumber, shortName, actor, initiator, damageType);
KilledActors.Add(actor, initiator, damageType); // call the wrapper class
}