#111
|
|||
|
|||
Quote:
I am trying to run this script with reduced delays for testing purposes and it does not load any submission or prints any message at all. Please try to run it if you have time to see. Mission is attached. Code:
// v.1_17_05. script by oreva, zaltys, small_bee using System; using maddox.game; using maddox.game.world; using System.Collections.Generic; public class Mission : AMission { // loading sub-missions public override void OnTickGame() { if (Time.tickCounter() % 1800 == 1000) // 54000=30 min repeat. 12600=7 min delay. { // randomly selects 1 of several submissions Random RandomIncident = new Random(); switch (RandomIncident.Next(1,4)) { case 1: GamePlay.gpPostMissionLoad("missions/Multi/Dogfight/BoF1/BoF1_air01.mis"); GamePlay.gpHUDLogCenter("mission 1 objectives loaded..."); double initTime = 0.0; Timeout(initTime += 600, () => { GamePlay.gpHUDLogCenter("Attention! Enemy activity is expected at E3!"); }); Timeout(initTime += 600, () => { GamePlay.gpHUDLogCenter("Attention! Help is needed at E3/D4!"); }); break; case 2: GamePlay.gpPostMissionLoad("missions/Multi/Dogfight/BoF1/BoF1_sea01.mis"); GamePlay.gpHUDLogCenter("mission 2 objectives loaded..."); double initTime = 0.0; Timeout(initTime += 500, () => { GamePlay.gpHUDLogCenter("Attention! Cover your shipping at C4!"); }); Timeout(initTime += 300, () => { GamePlay.gpHUDLogCenter("Attention! Ships are under attack at C4!"); }); break; case 3: GamePlay.gpPostMissionLoad("missions/Multi/Dogfight/BoF1/BoF1_air02.mis"); GamePlay.gpHUDLogCenter("mission 3 objectives loaded..."); double initTime = 0.0; Timeout(initTime += 600, () => { GamePlay.gpHUDLogCenter("Attention! Enemy activity is expected at E2!"); }); Timeout(initTime += 300, () => { GamePlay.gpHUDLogCenter("Attention! All airgroups please proceed to E2/D3!"); }); break; } } /////////////////////// //loads small submissions w/o messages if (Time.tickCounter() % 216000 == 108000) // 216000=120 min repeat. 108000=60 min delay. { GamePlay.gpPostMissionLoad("missions/Multi/Dogfight/BoF1/BoF1_small01.mis"); } if (Time.tickCounter() % 216000 == 215999) // 216000=120 min repeat. 215999=120 min delay. { GamePlay.gpPostMissionLoad("missions/Multi/Dogfight/BoF1/BoF1_small02.mis"); } } //////////////////////////////////////////////////////////////////////////////////////////////////// // destroys aircraft abandoned by a player. private bool isAiControlledPlane (AiAircraft aircraft) { if (aircraft == null) { return false; } Player [] players = GamePlay.gpRemotePlayers (); foreach (Player p in players) { if (p != null && (p.Place () is AiAircraft) && (p.Place () as AiAircraft) == aircraft) { return false; } } return true; } private void destroyPlane (AiAircraft aircraft) { if (aircraft != null) { aircraft.Destroy (); } } private void explodeFuelTank (AiAircraft aircraft) { if (aircraft != null) { aircraft.hitNamed (part.NamedDamageTypes.FuelTank0Exploded); } } private void destroyAiControlledPlane (AiAircraft aircraft) { if (isAiControlledPlane (aircraft)) { destroyPlane (aircraft); } } private void damageAiControlledPlane (AiActor actor) { 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, () => {explodeFuelTank (aircraft);} ); * ***/ Timeout (300, () => {destroyPlane (aircraft);} ); } ////////////////////////////////////////// public override void OnPlaceLeave (Player player, AiActor actor, int placeIndex) { base.OnPlaceLeave (player, actor, placeIndex); Timeout (1, () => {damageAiControlledPlane (actor);} ); } public override void OnAircraftCrashLanded (int missionNumber, string shortName, AiAircraft aircraft) { base.OnAircraftCrashLanded (missionNumber, shortName, aircraft); Timeout (300, () => { destroyPlane(aircraft); } ); } public override void OnAircraftLanded (int missionNumber, string shortName, AiAircraft aircraft) { base.OnAircraftLanded(missionNumber, shortName, aircraft); Timeout(300, () => { destroyPlane(aircraft); } ); } ////////////////////////////////////////////////////////////////////////////////////////////////// //Listen to events of every mission public override void Init(maddox.game.ABattle battle, int missionNumber) { base.Init(battle, missionNumber); MissionNumberListener = -1; //Listen to events of every mission } ////////////////////////////////////////////////////////////////////////////////////////////////// //Ground objects (except AA Guns) will die after 55 min when counted from their birth public override void OnActorCreated(int missionNumber, string shortName, AiActor actor) { base.OnActorCreated(missionNumber, shortName, actor); //Ground objects (except AA Guns) will die after 55 min when counted from their birth if (actor is AiGroundActor) if ((actor as AiGroundActor).Type() != maddox.game.world.AiGroundActorType.AAGun) Timeout(3300, () => { if (actor != null) { (actor as AiGroundActor).Destroy(); } } ); } /**** //Ground objects will die after 55 min when counted from their birth public override void OnActorCreated(int missionNumber, string shortName, AiActor actor) { base.OnActorCreated(missionNumber, shortName, actor); //Ground objects will die after 55 min when counted from their birth if (actor is AiGroundActor) Timeout(3300, () => { if (actor != null) { (actor as AiGroundActor).Destroy(); } } ); } ****/ } |
#112
|
|||
|
|||
Quote:
I'm not at my desktop so I can't run your mission, but I can't see why that code wouldn't work. |
#113
|
|||
|
|||
@Ataros
Code:
switch (RandomIncident.Next(1,4)) { case 1: GamePlay.gpPostMissionLoad("missions/Multi/Dogfight/BoF1/BoF1_air01.mis"); GamePlay.gpHUDLogCenter("mission 1 objectives loaded..."); double initTime = 0.0; Timeout(initTime += 600, () => { GamePlay.gpHUDLogCenter("Attention! Enemy activity is expected at E3!"); }); Timeout(initTime += 600, () => { GamePlay.gpHUDLogCenter("Attention! Help is needed at E3/D4!"); }); break; case 2: GamePlay.gpPostMissionLoad("missions/Multi/Dogfight/BoF1/BoF1_sea01.mis"); GamePlay.gpHUDLogCenter("mission 2 objectives loaded..."); double initTime = 0.0; Timeout(initTime += 500, () => { GamePlay.gpHUDLogCenter("Attention! Cover your shipping at C4!"); }); Timeout(initTime += 300, () => { GamePlay.gpHUDLogCenter("Attention! Ships are under attack at C4!"); }); break; case 3: GamePlay.gpPostMissionLoad("missions/Multi/Dogfight/BoF1/BoF1_air02.mis"); GamePlay.gpHUDLogCenter("mission 3 objectives loaded..."); double initTime = 0.0; Timeout(initTime += 600, () => { GamePlay.gpHUDLogCenter("Attention! Enemy activity is expected at E2!"); }); Timeout(initTime += 300, () => { GamePlay.gpHUDLogCenter("Attention! All airgroups please proceed to E2/D3!"); }); break; It should look like: Code:
public override void OnTickGame() { double initTime; if (Time.tickCounter() % 1800 == 1000) // 54000=30 min repeat. 12600=7 min delay. { // randomly selects 1 of several submissions Random RandomIncident = new Random(); switch (RandomIncident.Next(1,4)) { case 1: GamePlay.gpPostMissionLoad("missions/Multi/Dogfight/BoF1/BoF1_air01.mis"); GamePlay.gpHUDLogCenter("mission 1 objectives loaded..."); initTime = 0.0; Timeout(initTime += 600, () => { GamePlay.gpHUDLogCenter("Attention! Enemy activity is expected at E3!"); }); Timeout(initTime += 600, () => { GamePlay.gpHUDLogCenter("Attention! Help is needed at E3/D4!"); }); break; case 2: GamePlay.gpPostMissionLoad("missions/Multi/Dogfight/BoF1/BoF1_sea01.mis"); GamePlay.gpHUDLogCenter("mission 2 objectives loaded..."); initTime = 0.0; Timeout(initTime += 500, () => { GamePlay.gpHUDLogCenter("Attention! Cover your shipping at C4!"); }); Timeout(initTime += 300, () => { GamePlay.gpHUDLogCenter("Attention! Ships are under attack at C4!"); }); break; case 3: GamePlay.gpPostMissionLoad("missions/Multi/Dogfight/BoF1/BoF1_air02.mis"); GamePlay.gpHUDLogCenter("mission 3 objectives loaded..."); initTime = 0.0; Timeout(initTime += 600, () => { GamePlay.gpHUDLogCenter("Attention! Enemy activity is expected at E2!"); }); Timeout(initTime += 300, () => { GamePlay.gpHUDLogCenter("Attention! All airgroups please proceed to E2/D3!"); }); break; } } Last edited by FG28_Kodiak; 05-17-2011 at 01:03 PM. |
#114
|
|||
|
|||
Quote:
Would it be hard to exclude the last mission flown from random selection for the next round? As I am getting case #3 like 4 times in a row, than case 2 2 times. It can become boring for players. (I am planning to add more various missions to it in the future.) We will test the script on Repka 2 for some time and then move it to Repka 1. Welcome to our servers! |
#115
|
|||
|
|||
It's possible to avoid repeating of last mission:
Code:
public class Mission : AMission { int LastMissionLoaded=0; // loading sub-missions public override void OnTickGame() { if (Time.tickCounter() % 1800 == 1000) // 54000=30 min repeat. 12600=7 min delay. { // randomly selects 1 of several submissions Random RandomIncident = new Random(); int CurrentMissionSelected; do { CurrentMissionSelected = RandomIncident.Next(1,4); } while (LastMissionLoaded == CurrentMissionSelected); LastMissionLoaded = CurrentMissionSelected; switch (CurrentMissionSelected) { Last edited by FG28_Kodiak; 05-17-2011 at 03:44 PM. |
#116
|
||||
|
||||
I use C# everyday and I can't imagine using any of the .NET stuff to code a flight sim.
|
#117
|
|||
|
|||
Thank you so much again! I love this beautiful C# language. I had only some very limited acquaintance with Basiс long time ago (
Tested offline and now put up on Repka 2 for online test. Randomization will give us possibility to add more missions and overlap them randomly in time to make the airwar environment absolutely unpredictable. I consider Repka server as a sandbox or a demo for the game-engine possibilities hoping that more people from community would be involved in mission-building and even in creation of online wars like ADW, Bellum or AFW as soon as they see how far the engine allows them to go compared to limited IL-2 COOPs or Dogfights. Unfortunately I do not have enough knowledge in C# myself. Your help is highly appreciated. Complete code as of today for Repka 2. Code:
// v.1_17_05. script by FG28_Kodiak, ZaltysZ, oreva, small_bee using System; using maddox.game; using maddox.game.world; using System.Collections.Generic; public class Mission : AMission { int LastMissionLoaded = 0; double initTime; // loading sub-missions public override void OnTickGame() { if (Time.tickCounter() % 45000 == 9000) // 45000=25 min repeat. 9000=5 min delay. { // randomly selects 1 of several submissions excluding the recent one Random RandomIncident = new Random(); int CurrentMissionSelected; do { CurrentMissionSelected = RandomIncident.Next(1, 4); } while (LastMissionLoaded == CurrentMissionSelected); LastMissionLoaded = CurrentMissionSelected; switch (CurrentMissionSelected) { case 1: GamePlay.gpPostMissionLoad("missions/Multi/Dogfight/BoF1/BoF1_air01.mis"); GamePlay.gpHUDLogCenter("mission objectives updated."); //600 initTime = 0.0; Timeout(initTime += 600, () => { GamePlay.gpHUDLogCenter("Attention! Enemy activity is expected at E3!"); }); Timeout(initTime += 600, () => { GamePlay.gpHUDLogCenter("Attention! Help is needed at E3/D4!"); }); break; case 2: GamePlay.gpPostMissionLoad("missions/Multi/Dogfight/BoF1/BoF1_sea01.mis"); GamePlay.gpHUDLogCenter("mission objectives updated.."); //500 initTime = 0.0; Timeout(initTime += 500, () => { GamePlay.gpHUDLogCenter("Attention! Cover your shipping at C4!"); }); Timeout(initTime += 300, () => { GamePlay.gpHUDLogCenter("Attention! Ships are under attack at C4!"); }); break; case 3: GamePlay.gpPostMissionLoad("missions/Multi/Dogfight/BoF1/BoF1_air02.mis"); GamePlay.gpHUDLogCenter("mission objectives updated..."); //600 initTime = 0.0; Timeout(initTime += 600, () => { GamePlay.gpHUDLogCenter("Attention! Enemy activity is expected at E2!"); }); Timeout(initTime += 300, () => { GamePlay.gpHUDLogCenter("Attention! All airgroups please proceed to E2/D3!"); }); break; } } /////////////////////// //loads small submissions w/o messages if (Time.tickCounter() % 216000 == 108000) // 216000=120 min repeat. 108000=60 min delay. { GamePlay.gpPostMissionLoad("missions/Multi/Dogfight/BoF1/BoF1_small01.mis"); } if (Time.tickCounter() % 216000 == 215999) // 216000=120 min repeat. 215999=120 min delay. { GamePlay.gpPostMissionLoad("missions/Multi/Dogfight/BoF1/BoF1_small02.mis"); } } //////////////////////////////////////////////////////////////////////////////////////////////////// // destroys aircraft abandoned by a player. private bool isAiControlledPlane (AiAircraft aircraft) { if (aircraft == null) { return false; } Player [] players = GamePlay.gpRemotePlayers (); foreach (Player p in players) { if (p != null && (p.Place () is AiAircraft) && (p.Place () as AiAircraft) == aircraft) { return false; } } return true; } private void destroyPlane (AiAircraft aircraft) { if (aircraft != null) { aircraft.Destroy (); } } private void explodeFuelTank (AiAircraft aircraft) { if (aircraft != null) { aircraft.hitNamed (part.NamedDamageTypes.FuelTank0Exploded); } } private void destroyAiControlledPlane (AiAircraft aircraft) { if (isAiControlledPlane (aircraft)) { destroyPlane (aircraft); } } private void damageAiControlledPlane (AiActor actor) { 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, () => {explodeFuelTank (aircraft);} ); * ***/ Timeout (300, () => {destroyPlane (aircraft);} ); } ////////////////////////////////////////// public override void OnPlaceLeave (Player player, AiActor actor, int placeIndex) { base.OnPlaceLeave (player, actor, placeIndex); Timeout (1, () => {damageAiControlledPlane (actor);} ); } public override void OnAircraftCrashLanded (int missionNumber, string shortName, AiAircraft aircraft) { base.OnAircraftCrashLanded (missionNumber, shortName, aircraft); Timeout (300, () => { destroyPlane(aircraft); } ); } public override void OnAircraftLanded (int missionNumber, string shortName, AiAircraft aircraft) { base.OnAircraftLanded(missionNumber, shortName, aircraft); Timeout(300, () => { destroyPlane(aircraft); } ); } ////////////////////////////////////////////////////////////////////////////////////////////////// //Listen to events of every mission public override void Init(maddox.game.ABattle battle, int missionNumber) { base.Init(battle, missionNumber); MissionNumberListener = -1; //Listen to events of every mission } ////////////////////////////////////////////////////////////////////////////////////////////////// //Ground objects (except AA Guns) will die after 55 min when counted from their birth public override void OnActorCreated(int missionNumber, string shortName, AiActor actor) { base.OnActorCreated(missionNumber, shortName, actor); //Ground objects (except AA Guns) will die after 55 min when counted from their birth if (actor is AiGroundActor) if ((actor as AiGroundActor).Type() != maddox.game.world.AiGroundActorType.AAGun) Timeout(3300, () => { if (actor != null) { (actor as AiGroundActor).Destroy(); } } ); } /**** //Ground objects will die after 55 min when counted from their birth public override void OnActorCreated(int missionNumber, string shortName, AiActor actor) { base.OnActorCreated(missionNumber, shortName, actor); //Ground objects will die after 55 min when counted from their birth if (actor is AiGroundActor) Timeout(3300, () => { if (actor != null) { (actor as AiGroundActor).Destroy(); } } ); } ****/ } |
#118
|
|||
|
|||
I can understand this thread just enough to get excited by the possibilities for online wars. Otherwise you guys might as well be doing voodoo for all I can tell
Great stuff! I may one day even move myself to borrow a C# for Dummies! |
#119
|
|||
|
|||
Well, I've been messing around with changing spawn points for a while and I've got it mostly working except for one huge problem. The new spawn points don't update until I switch teams. For example, if I'm on red team and BirthPlace_1 switches to blue, I can still spawn there until I switch to blue and then back to red. I suspect it has something to do with the first mission still running after the second one is started, or the code isn't destroying BirthPlaces properly. It destroys "AiBirthPlaces". Do players use "AiBirthPlaces", or is that only for the AI. I saw no way to get a list of player "BirthPlaces".
Here's the code and the missions attached. If anybody sees any problems with it, please tell me. The spawn points and front lines will change sixty seconds after the mission starts. Code:
using System; using System.Collections; using maddox.game; using maddox.game.world; public class Mission : AMission { // MissionMarker class. Equivalent to "Front Markers" in FMB internal class MissionMarker { internal double x; //x coordinate internal double y; //y coordinate internal int army; //army that "owns" the marker. 1 is red. 2 is blue. internal MissionMarker(double x, double y, int army) { this.x = x; this.y = y; this.army = army; } } //create mission markers private MissionMarker[] MissionMarkers = new MissionMarker[] { new MissionMarker(12741, 16068, 1), new MissionMarker(17372, 11070, 1), new MissionMarker(23349, 23045, 2), new MissionMarker(29122, 22331, 2) }; //wheter or not markers have been initialized bool markersNotInitialized = true; public override void OnTickGame() { //if markers are not initialized, they won't show up on the player's map if (markersNotInitialized) { //just setting the markers army equal to it's current army for (int i = 0; i < MissionMarkers.Length; i++) GamePlay.gpPostMissionLoad(CreateNewFrontLineMission(i, MissionMarkers[i].army)); markersNotInitialized = false; } } internal ISectionFile CreateNewFrontLineMission(int markerNum, int newArmy) { //change the mission markers army to the new army MissionMarkers[markerNum].army = newArmy; //destroy all existing BirthPlaces/SpawnPoints, but only if the markers have been initialized if (!markersNotInitialized) { foreach (AiBirthPlace bp in GamePlay.gpBirthPlaces()) { if (bp != null) bp.destroy(); } } //?? This must be the code that turns MissionMarkers into FrontMarkers ISectionFile f = GamePlay.gpCreateSectionFile(); string sect; string key; string value; sect = "FrontMarker"; for (int i = 0; i < MissionMarkers.Length; i++) { key = "FrontMarker" + i.ToString(); value = MissionMarkers[i].x.ToString(System.Globalization.CultureInfo.InvariantCulture.NumberFormat) + " " + MissionMarkers[i].y.ToString(System.Globalization.CultureInfo.InvariantCulture.NumberFormat) + " " + MissionMarkers[i].army.ToString(); f.add(sect, key, value); } return f; } public override void OnTrigger(int missionNumber, string shortName, bool active) { //call base classes OnTrigger method. base.OnTrigger(missionNumber, shortName, active); //if the trigger that was called is the trigger that we're looking for if (shortName.Equals("trigger1") && active) { GamePlay.gpHUDLogCenter("Trigger1"); //change the mission marker at 0 to blue army GamePlay.gpPostMissionLoad(CreateNewFrontLineMission(0, 2)); //load new mission to change base ownership GamePlay.gpPostMissionLoad("missions/Multi/Dogfight/triggerTest/changeBase.mis"); } //not sure what this does either. Do some action. From where? AiAction action = GamePlay.gpGetAction(ActorName.Full(missionNumber, shortName)); if (action != null) action.Do(); } } |
#120
|
||||
|
||||
Quote:
I suspect that BirthPlace has not much to do with creating planes, except as mean for UI making decision where it should show spawn points on map. Probably, we won't be able to handle this nicely until we get access to client UI (i.e. force refresh of UI). I don't think "Ai" is artificial intelligence in this case. Players should use AiBirthPlaces. Last edited by ZaltysZ; 05-18-2011 at 06:30 AM. |
|
|