PDA

View Full Version : sal's Useful Scripts [Getting damage initiators]



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
}

RAF74_Buzzsaw
May-04-2014, 00:55
Thanks for that Salmo. :thumbsup: