![]() |
|
#1
|
|||
|
|||
![]()
@ FG28_Kodiak
I am making a simple mission on Steppe map and trying to modify a script by TheEnlightenedFlorist which sends messages to a particular player in MP onPlaceEnter. I want to define a new method to do this in 3 languages, but I do not know how to do it correctly. Also I included a multi-engine aircraft into limited list and wonder if the script would kill its engines correctly. I included my questions into remarks. Would be grateful for any advice. Thank you for all your great help! Code:
using System; using System.Collections; using maddox.game; using maddox.game.world; using System.Collections.Generic; using System.Diagnostics; /** * Parts of the script were taken from: * * Operation Dynamo v2.0 * A multiplayer mission for IL-2 Sturmovik: Cliffs of Dover * @author TheEnlightenedFlorist * http://forum.1cpublishing.eu/showthread.php?t=23579&highlight=operation+dynamo * */ public class Mission : AMission { //allowed and currently flying aircraft int allowed109s = 12; int current109s = 0; int allowedSpit2s = 7; int currentSpit2s = 0; int allowed110s = 4; int current110s = 0; public override void OnBattleStarted() { base.OnBattleStarted(); //listen to events from all missions. MissionNumberListener = -1; } // Makes any FMB trigger/action pair work if they have the same name. //public override void OnTrigger(int missionNumber, string shortName, bool active) //{ // base.OnTrigger(missionNumber, shortName, active); // AiAction action = GamePlay.gpGetAction(ActorName.Full(missionNumber, shortName)); // if (action != null) // action.Do(); //} public override void OnPlaceEnter(Player player, AiActor actor, int placeIndex) { base.OnPlaceEnter(player, actor, placeIndex); // test // notAvailableMsg(); if (actor != null && actor is AiAircraft) { //check limited aircraft switch ((actor as AiAircraft).InternalTypeName()) { case "bob:Aircraft.Bf-109E-4": { current109s++; if (current109s > allowed109s) { (actor as AiAircraft).hitNamed(part.NamedDamageTypes.Eng0TotalFailure); notAvailableMsg(new Player[] { player }); //GamePlay.gpHUDLogCenter(new Player[] { player }, "Aircraft not available! Choose another aircraft."); } break; } case "bob:Aircraft.SpitfireMkIIa": { currentSpit2s++; if (currentSpit2s > allowedSpit2s) { (actor as AiAircraft).hitNamed(part.NamedDamageTypes.Eng0TotalFailure); notAvailableMsg(new Player[] { player }); //GamePlay.gpHUDLogCenter(new Player[] { player }, "Aircraft not available! Choose another aircraft."); } break; } case "bob:Aircraft.Bf-110C-7": { current110s++; if (current110s > allowed110s) { //(actor as AiAircraft).hitNamed(part.NamedDamageTypes.Eng0TotalFailure); // Is this line for single-engined only? только для одномоторных? // Will this do for multi-engine? 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")); } notAvailableMsg(new Player[] { player }); //GamePlay.gpHUDLogCenter(new Player[] { player }, "Aircraft not available! Choose another aircraft."); } break; } } } } // Trying to make a new method... Does it look correct? public void notAvailableMsg(Player player) { switch (player.LanguageName()) { case "de": GamePlay.gpHUDLogCenter(new Player[] { player }, "Too many aircrafts of this type! Choose another aircraft."); break; //need translation please case "ru": GamePlay.gpHUDLogCenter(new Player[] { player }, "Слишком много самолетов данного типа! Выберите другой самолет."); break; default: GamePlay.gpHUDLogCenter(new Player[] { player }, "Too many aircrafts of this type! Choose another aircraft."); break; } } public override void OnPlaceLeave(Player player, AiActor actor, int placeIndex) { base.OnPlaceLeave(player, actor, placeIndex); if (actor != null && actor is AiAircraft) { //check limited aircraft switch ((actor as AiAircraft).InternalTypeName()) { case "bob:Aircraft.Bf-109E-4": current109s--; break; case "bob:Aircraft.SpitfireMkIIa": currentSpit2s--; break; case "bob:Aircraft.Bf-110C-7": current110s--; break; } } } Last edited by Ataros; 10-04-2011 at 10:39 PM. |
#2
|
|||
|
|||
![]()
Script corrected:
Code:
using System; using System.Collections; using maddox.game; using maddox.game.world; using System.Collections.Generic; using System.Diagnostics; /** * Parts of the script were taken from: * * Operation Dynamo v2.0 * A multiplayer mission for IL-2 Sturmovik: Cliffs of Dover * @author TheEnlightenedFlorist * http://forum.1cpublishing.eu/showthread.php?t=23579&highlight=operation+dynamo * */ public class Mission : AMission { //allowed and currently flying aircraft int allowed109s = 12; int current109s = 0; int allowedSpit2s = 7; int currentSpit2s = 0; int allowed110s = 4; int current110s = 0; public override void OnBattleStarted() { base.OnBattleStarted(); //listen to events from all missions. MissionNumberListener = -1; } // Makes any FMB trigger/action pair work if they have the same name. //public override void OnTrigger(int missionNumber, string shortName, bool active) //{ // base.OnTrigger(missionNumber, shortName, active); // AiAction action = GamePlay.gpGetAction(ActorName.Full(missionNumber, shortName)); // if (action != null) // action.Do(); //} public override void OnPlaceEnter(Player player, AiActor actor, int placeIndex) { base.OnPlaceEnter(player, actor, placeIndex); // test // notAvailableMsg(); if (actor != null && actor is AiAircraft) { //check limited aircraft switch ((actor as AiAircraft).InternalTypeName()) { case "bob:Aircraft.Bf-109E-4": { current109s++; if (current109s > allowed109s) { (actor as AiAircraft).hitNamed(part.NamedDamageTypes.Eng0TotalFailure); notAvailableMsg(player); //GamePlay.gpHUDLogCenter(new Player[] { player }, "Aircraft not available! Choose another aircraft."); } break; } case "bob:Aircraft.SpitfireMkIIa": { currentSpit2s++; if (currentSpit2s > allowedSpit2s) { (actor as AiAircraft).hitNamed(part.NamedDamageTypes.Eng0TotalFailure); notAvailableMsg(player); //GamePlay.gpHUDLogCenter(new Player[] { player }, "Aircraft not available! Choose another aircraft."); } break; } case "bob:Aircraft.Bf-110C-7": { current110s++; if (current110s > allowed110s) { //(actor as AiAircraft).hitNamed(part.NamedDamageTypes.Eng0TotalFailure); // Is this line for single-engined only? только для одномоторных? // Will this do for multi-engine? int iNumOfEngines = ((actor as AiAircraft).Group() as AiAirGroup).aircraftEnginesNum(); for (int i = 0; i < iNumOfEngines; i++) { (actor as AiAircraft).hitNamed((part.NamedDamageTypes)Enum.Parse(typeof(part.NamedDamageTypes), "Eng" + i.ToString() + "TotalFailure")); } notAvailableMsg(player); //GamePlay.gpHUDLogCenter(new Player[] { player }, "Aircraft not available! Choose another aircraft."); } break; } } } } public void notAvailableMsg(Player player) { switch (player.LanguageName()) { case "de": GamePlay.gpHUDLogCenter(new Player[] { player }, "Limit für diesen Flugzeugtyp erreicht! Wähle ein anderes Muster!"); break; case "ru": GamePlay.gpHUDLogCenter(new Player[] { player }, "Слишком много самолетов данного типа! Выберите другой самолет."); break; default: GamePlay.gpHUDLogCenter(new Player[] { player }, "Too many aircrafts of this type! Choose another aircraft."); break; } } public override void OnPlaceLeave(Player player, AiActor actor, int placeIndex) { base.OnPlaceLeave(player, actor, placeIndex); if (actor != null && actor is AiAircraft) { //check limited aircraft switch ((actor as AiAircraft).InternalTypeName()) { case "bob:Aircraft.Bf-109E-4": current109s--; break; case "bob:Aircraft.SpitfireMkIIa": currentSpit2s--; break; case "bob:Aircraft.Bf-110C-7": current110s--; break; } } } notAvailableMsg(new Player[] { player }); -to-> notAvailableMsg(player); notAvailableMsg needs a argument from type Player not an array of it. aircraft.hitNamed(...); -to-> (actor as AiAircraft).hitNamed(...) aircraft was not declared - as alternative you can declare AiAircraft aircraft = actor as AiAircraft; ---- //(actor as AiAircraft).hitNamed(part.NamedDamageTypes.Eng0Tot alFailure); // Is this line for single-engined only? Yes, you kill the first engine with it. // Will this do for multi-engine? int iNumOfEngines = ((actor as AiAircraft).Group() as AiAirGroup).aircraftEnginesNum(); for (int i = 0; i < iNumOfEngines; i++) { (actor as AiAircraft).hitNamed((part.NamedDamageTypes)Enum.P arse(typeof(part.NamedDamageTypes), "Eng" + i.ToString() + "TotalFailure")); } Yes its correct. "Too many aircrafts of this type! Choose another aircraft." translated into german: "Limit für diesen Flugzeugtyp erreicht! Wähle ein anderes Muster!" Last edited by FG28_Kodiak; 10-05-2011 at 05:04 AM. |
#3
|
|||
|
|||
![]()
Thank you very much!
|
#4
|
|||
|
|||
![]()
Made some rework on the script:
latest version: http://forum.1cpublishing.eu/showpos...8&postcount=41 Added a exept version: private void sendChatMessageTo(int army, string[] exepttoplayerlanguages, string msg, object[] parms) private void sendScreenMessageTo(int army, string[] exepttoplayerlanguages, string msg, object[] parms) Second Argument is a array of string. so you can enter the languages this message should not be send sendScreenMessageTo(-1, new string[] { "de", "ru" }, "Hello", null); usefull if you have send a Message to for example the german players but dont want send a other language message to them sendScreenMessageTo(-1, "de" }, "Hallo", null); sendScreenMessageTo(-1, new string[] { "de" }, "Hello", null); so the germans (with the german game version) get the german "Hallo" and all other players gets the english "Hello". Last edited by FG28_Kodiak; 10-12-2011 at 11:29 AM. |
#5
|
|||
|
|||
![]()
Just WOW! A lot of work and quality one. I will use it in a new mission version.
BTW can I replace my methods that send messages to individual players with your methods somehow? I use methods like follows: Code:
private void objMsg(Player player) { switch (player.LanguageName()) { case "de": GamePlay.gpLogServer(new Player[] { player }, "Achieve air superiority and attack ground targets in C5, D4 and E3!", null); break; case "ru": GamePlay.gpLogServer(new Player[] { player }, "Обеспечьте превосходство в воздухе и атакуйте наземные цели в квадратах C5, D4 и E3!", null); break; default: GamePlay.gpLogServer(new Player[] { player }, "Achieve air superiority and attack ground targets in C5, D4 and E3!", null); break; } } I will replace "de" message if you give me a translation ![]() |
#6
|
|||
|
|||
![]()
Not at the moment but its no problem to integrate this.
![]() "Achieve air superiority and attack ground targets in C5, D4 and E3!" in german "Luftüberlegenheit erringen und Bodenziele in C5, D4 und E3 angreifen!" Last edited by FG28_Kodiak; 10-07-2011 at 04:06 PM. |
#7
|
|||
|
|||
![]()
So integrated:
latest version: http://forum.1cpublishing.eu/showpos...8&postcount=41 first argument is from type Player, for this example i use the player from OnPlaceEnter(...), so the player sees Hallo if he is german and a english "Hello" he is not. sendScreenMessageTo(player, "de", "Hallo", null); sendChatMessageTo(player, "de", "Hallo", null); sendScreenMessageTo(player, new string[] {"de"}, "Hello", null); sendChatMessageTo(player, new string[] { "de" }, "Hello", null); Last edited by FG28_Kodiak; 10-12-2011 at 11:30 AM. |
![]() |
|
|