![]() |
|
|
|
#1
|
|||
|
|||
|
Quote:
Sorry did not get what you mean by KI Starts? If you mean AI, I do not want to limit AI flights. Thank you very much again. |
|
#2
|
|||
|
|||
|
German KünstlicheInteligenz = English ArtificialIntelligence
just a little language mismatch |
|
#3
|
|||
|
|||
|
I see a little problem
How to handle if one side don't have human pilots. Then your formula tries a division by zero and this will results in an error. Last edited by FG28_Kodiak; 10-06-2011 at 02:35 PM. |
|
#4
|
|||
|
|||
|
Quote:
Or maybe divide (1 + friendlyFgtrs + friendlyBmbrs/2) / (1+ enmyFgtrs + enmyBmbrs/2). It will do. Or we can deny premium planes at all if say other side has less than 2 human players. edit What I do not know is how to handle other side players which are still in the menu and not flying. Can they be taken into account? If yes, probably 80% of them should be accounted as fighters and 20% as bombers if you do not mind. But it is not very important I think. Last edited by Ataros; 10-06-2011 at 03:23 PM. |
|
#5
|
|||
|
|||
|
It looks I am in trouble with my script here too.
Again it works for hosted server killing my engine when required but does not work on dedicated server. First I used this line as you can see above in my message Code:
(actor as AiAircraft).hitNamed(part.NamedDamageTypes.Eng0TotalFailure); Then I tried to modify actor-damaging script to destroy player plane. The same thing happens. On a dedicated server this script damages abondoned aircrat but my modified methods do not work. But work on hosted server (when I am the server). OnPlaceEnter check where damagePlayerGroup((actor as AiAircraft)) does not work on a dedi. Code:
//checks limited aircraft
showTestMsg(player);
if (actor != null && actor is AiAircraft)
{
windowOfOp = 10;
switch ((actor as AiAircraft).InternalTypeName())
{
case "bob:Aircraft.Bf-109E-4":
{
current109s++;
showTestMsg(player);
// !!! test !!!
if (current109s > allowed109s) // || current109s > 1) // !!! test !!!
{
damagePlayerGroup((actor as AiAircraft));
Timeout(12, () =>
{
msgTooManyAircraft(player);
showTestMsg(player);
});
}
break;
}
Code:
#region Destroy Actors Methods
// by TheEnlightenedFlorist http://www.airwarfare.com/sow/index.php?option=com_kunena&func=view&catid=43&id=539&Itemid=54
private bool isAiControlledPlane(AiAircraft aircraft)
{
if (aircraft == null)
return false;
//check if a player is in any of the "places"
for (int i = 0; i < aircraft.Places(); i++)
if (aircraft.Player(i) != null)
return false;
return true;
}
private void destroyPlane(AiAircraft aircraft)
{
if (aircraft != null && isAiControlledPlane(aircraft))
aircraft.Destroy();
}
private void damageAiControlledPlane(AiActor actorMain)
{
foreach (AiActor actor in actorMain.Group().GetItems())
{
if (actor == null || !(actor is AiAircraft))
return;
AiAircraft aircraft = (actor as AiAircraft);
if (!isAiControlledPlane(aircraft))
return;
if (aircraft == null)
return;
aircraft.hitNamed(part.NamedDamageTypes.ControlsElevatorDisabled);
aircraft.hitNamed(part.NamedDamageTypes.ControlsAileronsDisabled);
aircraft.hitNamed(part.NamedDamageTypes.ControlsRudderDisabled);
aircraft.hitNamed(part.NamedDamageTypes.FuelPumpFailure);
int iNumOfEngines = (aircraft.Group() as AiAirGroup).aircraftEnginesNum();
for (int i = 0; i < iNumOfEngines; i++)
{
aircraft.hitNamed((part.NamedDamageTypes)Enum.Parse(typeof(part.NamedDamageTypes), "Eng" + i.ToString() + "TotalFailure"));
}
Timeout(240, () =>
{ destroyPlane(aircraft); }
);
}
}
// Ataros method
private void destroyPlayerPlane(AiAircraft aircraft)
{
if (aircraft != null)
aircraft.Destroy();
}
private void damagePlayerGroup(AiActor actorMain)
{
foreach (AiActor actor in actorMain.Group().GetItems())
{
if (actor == null ) // || !(actor is AiAircraft))
return;
AiAircraft aircraft = (actor as AiAircraft);
if (!isAiControlledPlane(aircraft))
{
if (aircraft != null)
{
aircraft.hitNamed(part.NamedDamageTypes.ControlsElevatorDisabled);
aircraft.hitNamed(part.NamedDamageTypes.ControlsAileronsDisabled);
aircraft.hitNamed(part.NamedDamageTypes.ControlsRudderDisabled);
aircraft.hitNamed(part.NamedDamageTypes.FuelPumpFailure);
int iNumOfEngines = (aircraft.Group() as AiAirGroup).aircraftEnginesNum();
for (int i = 0; i < iNumOfEngines; i++)
{
aircraft.hitNamed((part.NamedDamageTypes)Enum.Parse(typeof(part.NamedDamageTypes), "Eng" + i.ToString() + "TotalFailure"));
}
//Timeout(60, () =>
// { destroyPlayerPlane(aircraft); }
// );
}
}
}
}
#endregion
Last edited by Ataros; 10-12-2011 at 10:43 PM. |
|
#6
|
|||
|
|||
|
Its a bug in dedi. As Workaround i use in my penalty script:
Code:
private void DoDamageToAirplane(AiAircraft aircraft)
{
if (!aircraft.IsAirborne())
{
// plane on ground Undercarriage cut off
aircraft.cutLimb(part.LimbNames.WingL0);
aircraft.cutLimb(part.LimbNames.WingL1);
aircraft.cutLimb(part.LimbNames.WingL2);
aircraft.cutLimb(part.LimbNames.WingL3);
aircraft.cutLimb(part.LimbNames.WingL4);
aircraft.cutLimb(part.LimbNames.WingL5);
aircraft.cutLimb(part.LimbNames.WingL6);
aircraft.cutLimb(part.LimbNames.WingL7);
aircraft.cutLimb(part.LimbNames.WingR0);
aircraft.cutLimb(part.LimbNames.WingR1);
aircraft.cutLimb(part.LimbNames.WingR2);
aircraft.cutLimb(part.LimbNames.WingR3);
aircraft.cutLimb(part.LimbNames.WingR4);
aircraft.cutLimb(part.LimbNames.WingR5);
aircraft.cutLimb(part.LimbNames.WingR6);
aircraft.cutLimb(part.LimbNames.WingR7);
}
else
{
// plane in Air Tail cut off
aircraft.cutLimb(part.LimbNames.Tail0);
aircraft.cutLimb(part.LimbNames.Tail1);
aircraft.cutLimb(part.LimbNames.Tail2);
aircraft.cutLimb(part.LimbNames.Tail3);
aircraft.cutLimb(part.LimbNames.Tail4);
aircraft.cutLimb(part.LimbNames.Tail5);
aircraft.cutLimb(part.LimbNames.Tail6);
aircraft.cutLimb(part.LimbNames.Tail7);
}
}
At the moment i working on a script, which remove and add planes (on the fly) to the birthplaces, so its no longer nessesary to damage 'overused' planes. But in the moment its in a early stage. |
|
#7
|
|||
|
|||
|
Thank you!
Maybe you can get Length of LimbNames.Tail from the game same as with engines here and run a loop? Tail would do the job in the air too I think. Code:
int iNumOfEngines = (aircraft.Group() as AiAirGroup).aircraftEnginesNum();
for (int i = 0; i < iNumOfEngines; i++)
{
aircraft.hitNamed((part.NamedDamageTypes)Enum.Parse(typeof(part.NamedDamageTypes), "Eng" + i.ToString() + "TotalFailure"));
}
|
![]() |
|
|