0

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

}

1 Answers1

0

Either m_KilledActors or tuple is not defined.

In this case the bug is in your constructor

List<Tuple<AiActor, AiDamageInitiator, NamedDamageTypes, List<DamagerScore>>> m_KilledActors = new List<Tuple<AiActor, AiDamageInitiator, NamedDamageTypes, List<DamagerScore>>>();

This causes a duplicate definition of m_KilledActors.. change it to just

m_KilledActors = new List<Tuple<AiActor, AiDamageInitiator, NamedDamageTypes, List<DamagerScore>>>();
steve cook
  • 2,916
  • 2
  • 24
  • 46
  • Tuple is solid, I've used it extensively elsewhere in the code. It's likely m_KilledActors list in not properly 'persisting' once the class is declared. I missed posting some of the class code, 1st post updated with full class code including List definition. – user3602836 May 05 '14 at 03:29
  • updated answer - its your constructor – steve cook May 05 '14 at 03:54
  • Also this looks very hacky: `if (Type.GetType("KilledActorsWrapper") == null) // check to see if class has been initiated`. If you want a singleton, use a static - its much cleaner. – steve cook May 05 '14 at 03:56
  • Checking your suggested constructor changes, by use of 'static' you mean make the entire class static "public static class KilledActorsWrapper" ? – user3602836 May 05 '14 at 04:08
  • Read this: http://csharpindepth.com/Articles/General/Singleton.aspx – steve cook May 05 '14 at 04:17
  • The Add method now works, the GetNamedDamagesType method now throws a 'object not set to instance of onject' error. Reding singleton implimentations – user3602836 May 05 '14 at 04:34