![]() |
|
|
|
#1
|
|||
|
|||
|
Quote:
Ok my fault Corrected version: Code:
private void sendScreenMessageTo(int army, string playerlanguage, string msg, object[] parms)
{
if (army != -1)
{
//Singleplayer (for Testing)
if (GamePlay.gpRemotePlayers() == null || GamePlay.gpRemotePlayers().Length <= 0)
{
if (GamePlay.gpPlayer() != null && GamePlay.gpPlayer().Army() == army && GamePlay.gpPlayer().LanguageName().Equals(playerlanguage))
GamePlay.gpHUDLogCenter(null, msg, parms);
}
else // Multiplayer
{
List<Player> Players = new List<Player>();
foreach (Player p in GamePlay.gpRemotePlayers())
{
if (p.Army() == army && p.LanguageName().Equals(playerlanguage))
Players.Add(p);
}
GamePlay.gpHUDLogCenter(Players.ToArray(), msg, parms);
}
}
else
{
List<Player> Players = new List<Player>();
foreach (Player p in GamePlay.gpRemotePlayers())
{
if (p.LanguageName().Equals(playerlanguage))
Players.Add(p);
}
GamePlay.gpHUDLogCenter(Players.ToArray(), msg, parms);
}
}
private void sendChatMessageTo(int army, string playerlanguage, string msg, object[] parms)
{
if (army != -1)
{
//Singleplayer (for Testing)
if (GamePlay.gpRemotePlayers() == null || GamePlay.gpRemotePlayers().Length <= 0)
{
if (GamePlay.gpPlayer() != null && GamePlay.gpPlayer().Army() == army && GamePlay.gpPlayer().LanguageName().Equals(playerlanguage))
GamePlay.gpLogServer(null, msg, parms);
}
else // Multiplayer
{
List<Player> Players = new List<Player>();
foreach (Player p in GamePlay.gpRemotePlayers())
{
if (p.Army() == army && p.LanguageName().Equals(playerlanguage))
Players.Add(p);
}
GamePlay.gpLogServer(Players.ToArray(), msg, parms);
}
}
else
{
List<Player> Players = new List<Player>();
foreach (Player p in GamePlay.gpRemotePlayers())
{
if (p.LanguageName().Equals(playerlanguage))
Players.Add(p);
}
GamePlay.gpLogServer(Players.ToArray(), msg, parms);
}
}
Quote:
Should the script calculate all in game planes too, or only the player controlled? So it should be possible to disable KI Starts if many Players are online. Last edited by FG28_Kodiak; 10-06-2011 at 11:33 AM. |
|
#2
|
|||
|
|||
|
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. |
|
#3
|
|||
|
|||
|
German KünstlicheInteligenz = English ArtificialIntelligence
just a little language mismatch |
|
#4
|
|||
|
|||
|
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. |
|
#5
|
|||
|
|||
|
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. |
|
#6
|
|||
|
|||
|
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. |
|
#7
|
|||
|
|||
|
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. |
![]() |
|
|