Salmo
May-03-2014, 20:17
Many scripters have asked how they can get the damage initiator actors when an actor is killed. The OnActorDead event returns the missionNumber, actor killed, and a list of damagescores, but it does not provide a list of actors initiating the damages that killed the actor.
Here's a new wrapper-class that will allow scripters to access the damage initiator, damager score & nameddamagetypes for the killed actor.
How it works:
1. Place the class at the end of you code, just above the last curly bracket. (That's all the code from the public class KilledActorsWrapper line to the second last closed-curly bracket)
2. Initiate one instance of the class when your battle starts.
3. Place the one line code calls to the class in both your OnActorDamaged & your OnActorDead methods.
4. You should now have access to damage initiator, damager score & nameddamagetypes by refernce to you class call. ie The following new methods are available when you use this class:
Clear() // clear the list of damage initiators, damagetypes, damagescores. eg KilledActors.Clear();
Count // returns an integer value indicating the length of the KilledActor's list eg. KilledActors.Count;
GetDamagerScore // returns a List<DamagerScore> for the killed actor eg KilledActors.GetDamagerScore(killedActor);
GetDamageInitiators // returns the List<AiDamageInitiator> eg KilledActors.GetDamagerScore(killedActor);
GetNamedDamageTypes; // returns the List<NamedDamageTypes> for the killed actor. eg .GetNamedDamageTypes(killedActor);
NOTE: TESTING UNDERWAY, IT'S THROWING A NOT-SET OBJECT ERROR SO DON'T USE THE SCRIPT FOR TIME BEING
public class Mission : AMission
{
KilledActorsWrapper KilledActors = new KilledActorsWrapper(); // declare instance of wrappper 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
// rest of your code here if needed
}
public override void OnActorDead(int missionNumber, string shortName, AiActor actor, List<DamagerScore> damages)
{
base.OnActorDead(missionNumber, shortName, actor, damages);
KilledActors.Add(actor, damages); // Call the wrapper class
// rest of your code here if needed
}
public class KilledActorsWrapper
#region KilledActorsWrapper class
{
public KilledActorsWrapper()
{ // constructor
m_KilledActors = new List<Tuple<AiActor, AiDamageInitiator, NamedDamageTypes, List<DamagerScore>>>();
}
private static readonly KilledActorsWrapper instance = new KilledActorsWrapper(); // only one instance of class allowed
public static KilledActorsWrapper Instance
{
get { return instance; }
}
public void Add(AiActor killedActor, List<DamagerScore> damages)
{
ColoredConsoleWrite(ConsoleColor.DarkGreen, "ENTERED ADD METHOD A");
Tuple<AiActor, AiDamageInitiator, NamedDamageTypes, List<DamagerScore>> tuple = new Tuple<AiActor, AiDamageInitiator, NamedDamageTypes,
List<DamagerScore>>(killedActor, null, NamedDamageTypes.AirbrakeDriveFailure, damages);
ColoredConsoleWrite(ConsoleColor.DarkGreen, "ENTERED ADD METHOD A-1");
m_KilledActors.Add(tuple);
ColoredConsoleWrite(ConsoleColor.DarkGreen, "ENTERED ADD METHOD A-2");
}
public void Add(AiActor killedActor, AiDamageInitiator initiator, NamedDamageTypes damageType)
{
ColoredConsoleWrite(ConsoleColor.DarkGreen, "ENTERED ADD METHOD B");
Tuple<AiActor, AiDamageInitiator, NamedDamageTypes, List<DamagerScore>> tuple = new Tuple<AiActor, AiDamageInitiator, NamedDamageTypes,
List<DamagerScore>>(killedActor, initiator, damageType, null);
ColoredConsoleWrite(ConsoleColor.DarkGreen, "ENTERED ADD METHOD B-1");
this.m_KilledActors.Add(tuple);
ColoredConsoleWrite(ConsoleColor.DarkGreen, "ENTERED ADD METHOD B-2");
}
public int Count
{
get { return m_KilledActors.Count; }
}
public List<DamagerScore> GetDamagerScore(AiActor killedActor)
{
List<DamagerScore> damagerscore = new List<DamagerScore>();
for (int i = 0; i < m_KilledActors.Count; i++)
{
if (m_KilledActors[i].Item1 == killedActor)
{
damagerscore.Add((DamagerScore)m_KilledActors[i].Item1);
}
}
return damagerscore;
}
public List<AiDamageInitiator> GetDamageInitiators(AiActor killedActor)
{
List<AiDamageInitiator> damageinitiators = new List<AiDamageInitiator>();
for (int i = 0; i < m_KilledActors.Count; i++)
{
if (m_KilledActors[i].Item1 == killedActor)
{
damageinitiators.Add((AiDamageInitiator)m_KilledAc tors[i].Item2);
}
}
return damageinitiators;
}
public List<NamedDamageTypes> GetNamedDamageTypes(AiActor actor)
{
List<NamedDamageTypes> nameddamagetypes = new List<NamedDamageTypes>();
for (int i = 0; i < m_KilledActors.Count; i++)
{
if (m_KilledActors[i].Item1 == actor)
{
nameddamagetypes.Add((NamedDamageTypes)m_KilledAct ors[i].Item3);
}
}
return nameddamagetypes;
}
public void Clear()
{
m_KilledActors.Clear();
}
private List<Tuple<AiActor, AiDamageInitiator, NamedDamageTypes, List<DamagerScore>>> m_KilledActors { get; set; }
}
#endregion
}
Here's a new wrapper-class that will allow scripters to access the damage initiator, damager score & nameddamagetypes for the killed actor.
How it works:
1. Place the class at the end of you code, just above the last curly bracket. (That's all the code from the public class KilledActorsWrapper line to the second last closed-curly bracket)
2. Initiate one instance of the class when your battle starts.
3. Place the one line code calls to the class in both your OnActorDamaged & your OnActorDead methods.
4. You should now have access to damage initiator, damager score & nameddamagetypes by refernce to you class call. ie The following new methods are available when you use this class:
Clear() // clear the list of damage initiators, damagetypes, damagescores. eg KilledActors.Clear();
Count // returns an integer value indicating the length of the KilledActor's list eg. KilledActors.Count;
GetDamagerScore // returns a List<DamagerScore> for the killed actor eg KilledActors.GetDamagerScore(killedActor);
GetDamageInitiators // returns the List<AiDamageInitiator> eg KilledActors.GetDamagerScore(killedActor);
GetNamedDamageTypes; // returns the List<NamedDamageTypes> for the killed actor. eg .GetNamedDamageTypes(killedActor);
NOTE: TESTING UNDERWAY, IT'S THROWING A NOT-SET OBJECT ERROR SO DON'T USE THE SCRIPT FOR TIME BEING
public class Mission : AMission
{
KilledActorsWrapper KilledActors = new KilledActorsWrapper(); // declare instance of wrappper 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
// rest of your code here if needed
}
public override void OnActorDead(int missionNumber, string shortName, AiActor actor, List<DamagerScore> damages)
{
base.OnActorDead(missionNumber, shortName, actor, damages);
KilledActors.Add(actor, damages); // Call the wrapper class
// rest of your code here if needed
}
public class KilledActorsWrapper
#region KilledActorsWrapper class
{
public KilledActorsWrapper()
{ // constructor
m_KilledActors = new List<Tuple<AiActor, AiDamageInitiator, NamedDamageTypes, List<DamagerScore>>>();
}
private static readonly KilledActorsWrapper instance = new KilledActorsWrapper(); // only one instance of class allowed
public static KilledActorsWrapper Instance
{
get { return instance; }
}
public void Add(AiActor killedActor, List<DamagerScore> damages)
{
ColoredConsoleWrite(ConsoleColor.DarkGreen, "ENTERED ADD METHOD A");
Tuple<AiActor, AiDamageInitiator, NamedDamageTypes, List<DamagerScore>> tuple = new Tuple<AiActor, AiDamageInitiator, NamedDamageTypes,
List<DamagerScore>>(killedActor, null, NamedDamageTypes.AirbrakeDriveFailure, damages);
ColoredConsoleWrite(ConsoleColor.DarkGreen, "ENTERED ADD METHOD A-1");
m_KilledActors.Add(tuple);
ColoredConsoleWrite(ConsoleColor.DarkGreen, "ENTERED ADD METHOD A-2");
}
public void Add(AiActor killedActor, AiDamageInitiator initiator, NamedDamageTypes damageType)
{
ColoredConsoleWrite(ConsoleColor.DarkGreen, "ENTERED ADD METHOD B");
Tuple<AiActor, AiDamageInitiator, NamedDamageTypes, List<DamagerScore>> tuple = new Tuple<AiActor, AiDamageInitiator, NamedDamageTypes,
List<DamagerScore>>(killedActor, initiator, damageType, null);
ColoredConsoleWrite(ConsoleColor.DarkGreen, "ENTERED ADD METHOD B-1");
this.m_KilledActors.Add(tuple);
ColoredConsoleWrite(ConsoleColor.DarkGreen, "ENTERED ADD METHOD B-2");
}
public int Count
{
get { return m_KilledActors.Count; }
}
public List<DamagerScore> GetDamagerScore(AiActor killedActor)
{
List<DamagerScore> damagerscore = new List<DamagerScore>();
for (int i = 0; i < m_KilledActors.Count; i++)
{
if (m_KilledActors[i].Item1 == killedActor)
{
damagerscore.Add((DamagerScore)m_KilledActors[i].Item1);
}
}
return damagerscore;
}
public List<AiDamageInitiator> GetDamageInitiators(AiActor killedActor)
{
List<AiDamageInitiator> damageinitiators = new List<AiDamageInitiator>();
for (int i = 0; i < m_KilledActors.Count; i++)
{
if (m_KilledActors[i].Item1 == killedActor)
{
damageinitiators.Add((AiDamageInitiator)m_KilledAc tors[i].Item2);
}
}
return damageinitiators;
}
public List<NamedDamageTypes> GetNamedDamageTypes(AiActor actor)
{
List<NamedDamageTypes> nameddamagetypes = new List<NamedDamageTypes>();
for (int i = 0; i < m_KilledActors.Count; i++)
{
if (m_KilledActors[i].Item1 == actor)
{
nameddamagetypes.Add((NamedDamageTypes)m_KilledAct ors[i].Item3);
}
}
return nameddamagetypes;
}
public void Clear()
{
m_KilledActors.Clear();
}
private List<Tuple<AiActor, AiDamageInitiator, NamedDamageTypes, List<DamagerScore>>> m_KilledActors { get; set; }
}
#endregion
}