Code:
public static class Extensions : IGamePlay, IBattle, IBriefing, IGame, IGameSingle, IGameServer
{
#region AIAIRCRAFT CLASS EXTENSIONS
internal class Damage
{
public string EDamageType { get; set; }
public Damage(string eDamageType)
{
this.EDamageType = eDamageType;
}
}
public static void RandomSystemFailure(this AiAircraft aircraft, double liklihood)
{ // Purpose: Causes random aircraft system failure
// Use: aircraft.RandomSystemFailure(n);
// where n is the probability of failure (0 - 1)
// zero means no chance to occur 1 means 100% chance to occur
// eg. aircraft.RandomSystemFailure(aircraft, 0.01); means (0.01 * 100) = 1% chance to occur
Random random = new Random(Guid.NewGuid().GetHashCode());
if (random.NextDouble() > liklihood) RandomSystemFailure(aircraft);
}
private static void RandomSystemFailure(this AiAircraft aircraft)
{ // RandomSystemFailure helper function
if (aircraft == null || !(aircraft is AiAircraft)) return;
Random random = new Random(Guid.NewGuid().GetHashCode());
List<Damage> DamageList = new List<Damage>
{
// electrical systems
new Damage ("ElecBatteryFailure"),
new Damage ("ElecGeneratorFailure"),
new Damage ("ElecIlluminationFailure"),
new Damage ("ElecMasterCompassFailure"),
new Damage ("ElecPrimaryFailure"),
new Damage ("ElecPriNavigationFailure"),
new Damage ("ElecSecNavigationFailure"),
new Damage ("ElecSecondaryFailure"),
new Damage ("ElecTransceiverFailure"),
new Damage ("ElecWeaponryFailure"),
new Damage ("Eng0Magneto1Failure"),
new Damage ("Eng0Magneto2Failure"),
// fuel systems
new Damage ("FuelPumpFailure"),
new Damage ("FuelTank0PumpFailure"),
new Damage ("FuelTank1PumpFailure"),
new Damage ("FuelTank2PumpFailure"),
new Damage ("FuelTank3PumpFailure"),
new Damage ("FuelTank4PumpFailure"),
new Damage ("FuelTank5PumpFailure"),
new Damage ("FuelTank6PumpFailure"),
new Damage ("FuelTank7PumpFailure"),
// hydrolic & pneumatic systems
new Damage ("HydraulicsPumpFailure"),
new Damage ("PneumaticsCompressorFailure"),
// pumps failures
new Damage ("Eng0OilPumpFailure"),
new Damage ("Eng0CompressorFailure"),
new Damage ("Eng0FuelPumpFailure"),
new Damage ("Eng0OilPumpFailure"),
new Damage ("Eng0FuelPumpFailure"),
new Damage ("Eng0WaterPumpFailure"),
// engine failures
new Damage ("Eng0CarbFailure"),
new Damage ("Eng0CompressorGovernorFailure"),
new Damage ("Eng0ExhaustHeadFailure"),
new Damage ("Eng0GovernorFailure"),
new Damage ("Eng0Plug00Failure"),
// controls failures
new Damage ("Eng0CarbControlsFailure"),
new Damage ("FuelTank7PumpFailure"),
new Damage ("FuelTank7PumpFailure"),
};
// do the failure
string damage = null;
int rnd = random.Next(DamageList.Count);
damage = DamageList[rnd].EDamageType;
if (DamageList[rnd].EDamageType.Contains("Eng"))
{
int i = random.Next((aircraft.Group() as AiAirGroup).aircraftEnginesNum());
string[] parts = DamageList[rnd].EDamageType.Split(new string[] { "Eng" }, StringSplitOptions.None);
damage = parts[0] + "Eng" + i.ToString() + parts[1];
// aircraft.hitNamed((part.NamedDamageTypes)Enum.Parse(typeof(part.NamedDamageTypes), "Eng" + i.ToString() + "TotalFailure"));
// Eng0Plug00Failure
if (damage.Contains("Plug00"))
{
parts = damage.Split(new string[] { "Plug00" }, StringSplitOptions.None);
damage = parts[0] + "Plug" + random.Next(18).ToString("00") + parts[1];
}
}
// do the failure
part.NamedDamageTypes TheDamage = (part.NamedDamageTypes)Enum.Parse(typeof(part.NamedDamageTypes), damage, true);
aircraft.hitNamed(TheDamage);
}
#region WITHOUT DELEGATES
public static double AltitudeM(this AiAircraft aircraft)
{ // Purpose: Returns the altitude in metres of the aircraft Use: aircraft.Altitude();
return aircraft.Pos().z;
}
public static double AltitudeF(this AiAircraft aircraft)
{ // Purpose: Returns the altitude in feet of the aircraft. Use: aircraft.Altitude();
return aircraft.Pos().z * 3.28084;
}
public static bool IsMoving(this AiAircraft aircraft)
{ // Purpose: Returns true if the aircraft is moving. Use: aircraft.IsMoving();
return aircraft.getParameter(part.ParameterTypes.Z_VelocityTAS, -1) > 0;
}
public static bool IsEnginesOff(this AiAircraft aircraft)
{ // Purpose: Returns true if the aircraft engines are turned off. Use: aircraft.IsEnginesOn();
return (aircraft as AiAirGroup).Idle;
}
public static double TurnRate(this AiAircraft aircraft)
{ // Purpose: Returns the turn rate of the aircraft. Use: aircraft.TurnRate();
return aircraft.getParameter(part.ParameterTypes.I_Turn, -1);
}
public static double AirspeedTAS(this AiAircraft aircraft)
{ // Purpose: Returns the true airspeed of the aircraft. Use: aircraft.AirspeedTAS();
return aircraft.getParameter(part.ParameterTypes.Z_VelocityTAS, -1);
}
public static double AirspeedIAS(this AiAircraft aircraft)
{ // Purpose: Returns the indicated airspeed of the aircraft. Use: aircraft.AirspeedIAS();
return aircraft.getParameter(part.ParameterTypes.Z_VelocityIAS, -1);
}
public static double AltitudeAGL(this AiAircraft aircraft)
{ // Purpose: Returns the altitude in metres above ground level of the aircraft. Use: aircraft.AltitudeAGL();
return aircraft.getParameter(part.ParameterTypes.Z_AltitudeAGL, -1);
}
public static double AltitudeMSL(this AiAircraft aircraft)
{ // Purpose: Returns the altitude in metres above mean sea level of the aircraft. Use: aircraft.AltitudeMSL();
return aircraft.getParameter(part.ParameterTypes.Z_AltitudeMSL, -1);
}
public static double AirTempAmbient(this AiAircraft aircraft)
{ // Purpose: Returns the ambient air teperature in degrees C at the aircraft's position. Use: aircraft.AirTempAmbient();
return aircraft.getParameter(part.ParameterTypes.Z_AmbientAirTemperature, -1);
}
public static int NumberOfAirCrew(this AiAircraft aircraft)
{ // Purpose: Returns the number of aircrew in the aircraft. Use: aircraft.NumberOfAirCrew();
return aircraft.Places();
}
public static int NumberOfEngines(this AiAircraft aircraft)
{ // Purpose: Returns the number of engines in the aircraft. // Use: aircraft.NumberOfEngines();
return (aircraft.Group() as AiAirGroup).aircraftEnginesNum();
}
public static void ReturnToHomeBase(this AiAircraft aircraft)
{ // Purpose: sets aircraft to RTB. Use: aircraft.ReturnToHomeBase();
(aircraft as AiAirGroup).setTask(AiAirGroupTask.RETURN, aircraft as AiAirGroup);
}
public static bool IsAirborne(this AiAircraft aircraft)
{ // Purpose: Return true if aircraft is in th air. Use: aircraft.IsAirborne();
return (aircraft as AiAirGroup).IsAirborne();
}
public static bool EnginesStart(this AiAircraft aircraft)
{ // Purpose: starts the specifed aircraft's engines Use: aircraft.EnginesStart();
return (aircraft as AiAirGroup).Idle = false;
}
public static void EnginesStop(this AiAircraft aircraft)
{ // Purpose: stops the specifed aircraft's engines Use: aircraft.EnginesStop();
(aircraft as AiAirGroup).Idle = true;
}
public static bool HasCrewFunction(this AiAircraft aircraft, CrewFunction function)
{
for (int i = 0; i < aircraft.Places(); i++)
{
if (aircraft.CrewFunctionPlace(i) == function) return true;
}
return false;
}
public static int CrewPlaceFunction(this AiAircraft aircraft, CrewFunction function)
{ // Purpose: Returns to place number for the specified crew function
// Returns -1 if the specified aircraft does not have the named crew function
// Use: aircraft.CrewPlaceFunction(function);
for (int i = 0; i < aircraft.Places(); i++)
{
if (aircraft.CrewFunctionPlace(i) == function)
return i;
}
return -1;
}
public static int NumberOfPilots(this AiAircraft aircraft)
{ // Purpose: Returns the number of pilots (pilot & copilot) in specified aircraft
// Use: aircraft.NumberOfPilots();
int result = 0;
for (int i = 0; i < aircraft.Places(); i++)
{
if (aircraft.CrewFunctionPlace(i) == CrewFunction.Pilot ||
aircraft.CrewFunctionPlace(i) == CrewFunction.CoPilot)
result += 1;
}
return result;
}
public static int NumberOfGunners(this AiAircraft aircraft)
{ // Purpose: Returns the number of gunners in specified aircraft
// Use: aircraft.NumberOfGunners();
int result = 0;
for (int i = 0; i < aircraft.Places(); i++)
{
if (aircraft.CrewFunctionPlace(i) == CrewFunction.Gunner ||
aircraft.CrewFunctionPlace(i) == CrewFunction.NoseGunner ||
aircraft.CrewFunctionPlace(i) == CrewFunction.RearGunner ||
aircraft.CrewFunctionPlace(i) == CrewFunction.VentralGunner ||
aircraft.CrewFunctionPlace(i) == CrewFunction.WaistGunner ||
aircraft.CrewFunctionPlace(i) == CrewFunction.TopGunner)
result += 1;
}
return result;
}
public static CrewFunction PlayerFunction(this AiAircraft aircraft)
{ // Purpose: Returns the crew function of the first human player in specified aircraft
// Returns Nil if no humans in the aircraft
// Use: aircraft.PlayerFunction();
AiCart cart = aircraft as AiCart;
if (cart != null)
{
for (int i = 0; i < aircraft.Places(); i++)
{
if (aircraft.Person(i) != null) return cart.CrewFunctionPlace(i);
}
}
return CrewFunction.Nil;
}
public static int PlayerPlace(this AiAircraft aircraft)
{ // Purpose: Returns the place number of first human player in specified aircraft
// Returns -1 if no humans in the aircraft
// Use: aircraft.PlayerFunction();
for (int i = 0; i < aircraft.Places(); i++)
{
if (aircraft.Player(i) != null)
return i;
}
return -1;
}
public static float AirCrewHealth(this AiAircraft aircraft, CrewFunction function)
{ // Purpose: Returns the health of the AiPerson in the specified aircrew position
// Returns -1 if the aircraft does not have the specified crew function
// Use: aircraft.AirCrewHealth(function);
AiCart cart = aircraft as AiCart;
for (int i = 0; i < cart.Places(); i++)
{
if (cart != null && cart.CrewFunctionPlace(i) == function)
{
AiPerson p = aircraft.Player(i) as AiPerson;
if (p != null) return p.Health;
}
}
return -1;
}
public static bool HasCrewFunction(this AiAircraft aircraft, CrewFunction function)
{ // Purpose: Returns true if the aircraft has the specified aircrew position/function
// Use: aircraft.HasCrewFunction(function);
AiCart cart = aircraft as AiCart;
for (int i = 0; i < cart.Places(); i++)
{
if (cart != null && cart.CrewFunctionPlace(i) == function)
return true;
}
return false;
}
public static AiPerson Pilot(this AiAircraft aircraft)
{ // Purpose: Returns the pilot of the aircraft as an AiPerson.
// Use: aircraft.Pilot();
AiCart cart = aircraft as AiCart;
if (cart != null)
{
for (int i = 0; i < aircraft.Places(); i++)
{
if (cart.CrewFunctionPlace(i) == CrewFunction.Pilot) return aircraft.Person(i);
}
}
return null;
}
public static AiPerson CoPilot(this AiAircraft aircraft)
{ // Purpose: Returns the co-pilot of the aircraft as an AiPerson
// Returns null if aircraft does not have co-pilot
// Use: aircraft.CoPilot();
AiCart cart = aircraft as AiCart;
if (cart != null)
{
for (int i = 0; i < aircraft.Places(); i++)
{
if (cart.CrewFunctionPlace(i) == CrewFunction.CoPilot) return aircraft.Person(i);
}
}
return null;
}
public static bool IsAiControlle(this AiAircraft aircraft)
{ // Purpose: Returns true if aircraft is AI controlled (no humans aboard)
// Use: aircraft.IsAiControlled();
if (aircraft == null) return false;
for (int i = 0; i < aircraft.Places(); i++) if (aircraft.Player(i) != null) return false;
return true;
}
public static AiPerson[] AirCrew(this AiAircraft aircraft)
{ // Purpose: Returns an array of type AiPerson of the aircraft's aircrew
// Use: aircraft.AirCrew();
List<AiPerson> result = new List<AiPerson>();
for (int i = 0; i < aircraft.Places(); i++) result.Add(aircraft.Player(i) as AiPerson);
return result.ToArray();
}
public static int NumberOfAirCrewHuman(this AiAircraft aircraft)
{ // Purpose: Returns the number of aircrew in the aircraft that are human players
// Use: aircraft.NumberOfAirCrewHuman();
int result = 0;
for (int i = 0; i < aircraft.Places(); i++)
{
if (aircraft.Player(i) != null) result++;
}
return result;
}
public static double Heading(this AiAircraft aircraft)
{ // Purpose: Returns the heading in degree of the aircraft
// Return -1 if calculations fail
// Use: aircraft.Heading();
AiAirGroup airgroup = aircraft as AiAirGroup;
if (airgroup != null)
{
Vector2d v = new Vector2d(airgroup.Vwld().x, airgroup.Vwld().y);
double radians = v.direction();
return radians * (180 / Math.PI);
}
return -1;
}
public static double Speed(this AiAircraft aircraft)
{ // Purpose: Returns the speed of the aircraft
// Return -1 if calculations fail
// Use: aircraft.Speed();
AiAirGroup airgroup = aircraft as AiAirGroup;
if (airgroup != null)
{
Vector2d v = new Vector2d(airgroup.Vwld().x, airgroup.Vwld().y);
return v.length();
}
return -1;
}
public static double Pitch(this AiAircraft aircraft)
{ // Purpose: Returns the pitch of the aircraft
// Return -1 if calculations fail
// Use: aircraft.Pitch();
AiAirGroup airgroup = aircraft as AiAirGroup;
if (airgroup != null)
{
Vector3d v = new Vector3d(airgroup.Vwld().x, airgroup.Vwld().y, airgroup.Vwld().z);
return Math.Asin(v.y) * (180 / Math.PI); // pitch = asin(-d.Y);
}
return -1;
}
public static double Yaw(this AiAircraft aircraft)
{ // Purpose: Returns the Yaw of the aircraft
// Return -1 if calculations fail
// Use: aircraft.Yaw();
AiAirGroup airgroup = aircraft as AiAirGroup;
if (airgroup != null)
{
Vector3d v = new Vector3d(airgroup.Vwld().x, airgroup.Vwld().y, airgroup.Vwld().z);
return Math.Atan2(v.x, v.z) * (180 / Math.PI); // yaw = atan2(d.X, d.Z)
}
return -1;
}
public static double Roll(this AiAircraft aircraft)
{ // Purpose: Returns the Roll of the aircraft
// Return -1 if calculations fail
// Use: aircraft.Roll();
AiAirGroup airgroup = aircraft as AiAirGroup;
if (airgroup != null)
{
Vector3d v = new Vector3d(airgroup.Vwld().x, airgroup.Vwld().y, airgroup.Vwld().z);
return Math.Atan2(v.y, v.z) * (180 / Math.PI); //
}
return -1;
}
#endregion
}
Bookmarks