Скрипт "Антивулч" для Репок
Можно пока потестить на существующих картах.
Код:
using System.Collections.Generic;
using maddox.game;
using maddox.game.world;
using maddox.GP;
public class Mission : AMission
{
List<AvZone> av_points = new List<AvZone>();
public override void OnBattleStarted()
{
base.OnBattleStarted();
av_points.Add(new AvZone(52615, 52732, 9, 900, 500)); // добавляем зону антивулча (координаты по трем осям, радиус, ограничение по высоте)
}
public override void OnAircraftDamaged(int missionNumber, string shortName, AiAircraft aircraft, AiDamageInitiator initiator, part.NamedDamageTypes damageType)
{
base.OnAircraftDamaged(missionNumber, shortName, aircraft, initiator, damageType);
if (initiator.Actor is AiAircraft && initiator.Tool.Type == AiDamageToolType.Cannon) // если атакующий - самолет и стрелял пушками/пулеметами
{
AiAircraft attacker = (AiAircraft)initiator.Actor;
if (InAvZone(aircraft)) // проверяем, находится ли жертва в пределах антивулча
{
attacker.cutLimb(part.LimbNames.WingL0); // цинично ломаем редиске левое крыло...
attacker.cutLimb(part.LimbNames.WingR0); // и не менее цинично, правое.
}
}
}
public bool InAvZone(AiAircraft attacker)
{
foreach (AvZone zone in av_points)
{
Point3d point = attacker.Pos();
if (zone.Has(point))
{
return true;
}
}
return false;
}
}
public struct AvZone
{
Point3d point;
double radius;
double zMax;
public AvZone(double x, double y, double z, double radius, double zMax)
{
point = new Point3d(x, y, z);
this.radius = radius;
this.zMax = zMax;
}
public bool Has(Point3d pos)
{
if (pos.z - point.z > zMax) return false;
if (pos.distance(ref point) > radius)
{
return false;
}
else
{
return true;
}
}
}
Звено стодесятых на проверке эпично шмякнулось об землю при попытке атаковать взлетающие самолеты.