Autor Thema: Submissionen zufällig laden funktioniert nicht  (Gelesen 1928 mal)

0 Mitglieder und 1 Gast betrachten dieses Thema.

Offline seladon11

  • Hallenfeger
  • **
  • Beiträge: 4
Submissionen zufällig laden funktioniert nicht
« am: 13.April.2014, 16:35 »
Hallo,
ich habe mir mit Hilfe des Tuts "Missionen in laufende laden Teil 1" von Kodiak eine Testmission erstellt, bei der 4 Submissionen in eine Laufende geladen werden. Das funktioniert auch.
Nicht funktioniert hat trotz anpassen von
MissionNumberListener = -1;zu
MissionNumberListener = 3;daß nur eine bestimmte Mission, hier die 3. geladen wird. Warum?

Außerdem hätte ich auch gerne, daß nur eine oder auch mehrere Submissionen per Zufall aus den 4 vorhandenen geladen wird. Dazu habe ich eine neue Mission erstellt und Teile des Codes von Teil 4 der Tuts benutzt und davon erstmal die ganzen anderen Trigger usw weggelassen. Das hat leider nicht funktioniert. Hier mein Versuch:
using System;
using System.Collections;
using System.Collections.Generic;
using maddox.game;
using maddox.game.world;

public class Mission : AMission
{
    Random ZufallMission = new Random();

    public override void OnBattleStarted()
    {
        base.OnBattleStarted();
MissionNumberListener = -1;
    }
         
        switch (ZufallMission.Next(1,5))
    {
        case 1:
             GamePlay.gpPostMissionLoad("missions\\Sub\\StartBf109e\\SubStartBf109e1.mis");
        break;
        case 2:
             GamePlay.gpPostMissionLoad("missions\\Sub\\StartBf109e\\SubStartBf109e2.mis");
        break;
        case 3:
             GamePlay.gpPostMissionLoad("missions\\Sub\\StartBf109e\\SubStartBf109e3.mis");
        break;
        case 4:
             GamePlay.gpPostMissionLoad("missions\\Sub\\StartBf109e\\SubStartBf109e4.mis");
        break;
    }
}
Könnte mir bitte auch hier jemand meine Fehler zeigen? An dem Pfad liegt es nicht, der funktioniert.
Danke schonmal im voraus

Offline FG28_Kodiak

  • Blasenteetrinker
  • *****
  • Beiträge: 1.893
Re: Submissionen zufällig laden funktioniert nicht
« Antwort #1 am: 14.April.2014, 12:05 »
MissionNumberListener = -1 gibt an auf welche Ereignisse das Script reagieren soll. -1 heißt eigentlich das auf alle Ereignisse auch auf die der neu hinzugekommenen "Submissionen" reagiert wird. Es hat nichts damit zu tun welche Mission geladen wird.
Wenn du nur eine bestimmte SubMission laden möchtest.
Ändere den switch block in z.B.
switch (3)
für die dritte


bei
public class Mission : AMission
{
    Random ZufallMission = new Random();

    public override void OnBattleStarted()
    {
        base.OnBattleStarted();
MissionNumberListener = -1;
    }
         
        switch (ZufallMission.Next(1,5))
    {
        case 1:
             GamePlay.gpPostMissionLoad("missions\\Sub\\StartBf109e\\SubStartBf109e1.mis");
        break;
        case 2:
             GamePlay.gpPostMissionLoad("missions\\Sub\\StartBf109e\\SubStartBf109e2.mis");
        break;
        case 3:
             GamePlay.gpPostMissionLoad("missions\\Sub\\StartBf109e\\SubStartBf109e3.mis");
        break;
        case 4:
             GamePlay.gpPostMissionLoad("missions\\Sub\\StartBf109e\\SubStartBf109e4.mis");
        break;
    }
}

hast du die Klammern falsch gesetzt. Der Switch Block befindet sich außerhalb der OnBattleStarted() Methode und produziert einen Fehler.
Richtig wäre:
public class Mission : AMission
{
    Random ZufallMission = new Random();

    public override void OnBattleStarted()
    {
        base.OnBattleStarted();
MissionNumberListener = -1;
   
         
        switch (ZufallMission.Next(1,5))
    {
        case 1:
             GamePlay.gpPostMissionLoad("missions\\Sub\\StartBf109e\\SubStartBf109e1.mis");
        break;
        case 2:
             GamePlay.gpPostMissionLoad("missions\\Sub\\StartBf109e\\SubStartBf109e2.mis");
        break;
        case 3:
             GamePlay.gpPostMissionLoad("missions\\Sub\\StartBf109e\\SubStartBf109e3.mis");
        break;
        case 4:
             GamePlay.gpPostMissionLoad("missions\\Sub\\StartBf109e\\SubStartBf109e4.mis");
        break;
    }
}
}
Vorausgesetzt du möchtest das die Zufallsmission dann gestartet wird, wenn du die "Schlacht startest".
« Letzte Änderung: 14.April.2014, 12:08 von FG28_Kodiak »

Offline seladon11

  • Hallenfeger
  • **
  • Beiträge: 4
Re: Submissionen zufällig laden funktioniert nicht
« Antwort #2 am: 14.April.2014, 16:37 »
Sagenhaft, Kodiak, danke für deine schnelle Antwort. Ich werde das heute Abend ausprobieren und dann auch gleich berichten.

Offline seladon11

  • Hallenfeger
  • **
  • Beiträge: 4
Re: Submissionen zufällig laden funktioniert nicht
« Antwort #3 am: 16.April.2014, 10:49 »
Hallo Kodiak,
mir geht es erstmal nur um alle Möglichkeiten wie man Submissionen in bestehende Missionen laden kann.

Ich habe jetzt auch noch hinbekommen wie ich Submissionen laden kann, die bei jedem Start der Hauptmission geladen werden sollen und zusätzlich auch noch eine, die aus einem "Pool"-Ordner mit Submissionen zufällig ausgewählt wird. Die "festen" und die "zufälligen" können ja in unterschiedlichen Ordnern liegen, solange die Pfadangaben stimmen. Hier der aus deinen Tuts zusammengesetzte Code dazu:
using System;
using System.Collections;
using System.Collections.Generic;
using maddox.game;
using maddox.game.world;

public class Mission : AMission
{
    Random ZufallMission = new Random();

    public override void OnBattleStarted()
    {
        base.OnBattleStarted();
MissionNumberListener = -1;

             GamePlay.gpPostMissionLoad("missions\\Sub\\StartBf109e\\SubBf110c1.mis");
             GamePlay.gpPostMissionLoad("missions\\Sub\\StartBf109e\\SubKolonne2.mis");

         
        switch (ZufallMission.Next(1,5))
    {
        case 1:
             GamePlay.gpPostMissionLoad("missions\\Sub\\StartBf109e\\SubStartBf109e1.mis");
        break;
        case 2:
             GamePlay.gpPostMissionLoad("missions\\Sub\\StartBf109e\\SubStartBf109e2.mis");
        break;
        case 3:
             GamePlay.gpPostMissionLoad("missions\\Sub\\StartBf109e\\SubStartBf109e3.mis");
        break;
        case 4:
             GamePlay.gpPostMissionLoad("missions\\Sub\\StartBf109e\\SubStartBf109e4.mis");
        break;
    }

    }
}
Dieses Beispiel funktioniert einwandfrei. Die beiden Submissionen SubBf110c1.mis und SubKolonne2.mis werden jedesmal geladen und dazu noch eine "zufällige" aus den anderen Vier.

Noch 2 Beispiele, die ich nicht zum laufen gebracht habe:
Hier soll eine "feste" Submission geladen werden, die einen passthrough Trigger enthält, der bei Eintritt durch den Player zwei Bf-110 auf der Startbahn spawnen soll. Die Submission wird zwar zu Beginn geladen, doch der Trigger löst nicht aus.
Den Trigger in der Submission habe ich allerdings mit der normalen "Trigger_Neu" Methode im FMB erstellt. Deshalb taucht er auch nur in der .mis Datei auf ([Trigger]Rauch3 TPassThrough 0 318298 195468 700). Die Hauptmission:
using System;
using System.Collections;
using System.Collections.Generic;
using maddox.game;
using maddox.game.world;

public class Mission : AMission
{
    Random ZufallMission = new Random();

    public override void OnBattleStarted()
    {
        base.OnBattleStarted();
MissionNumberListener = -1;

             GamePlay.gpPostMissionLoad("missions\\Sub\\StartBf109e\\SubRauch3.mis");


         
        switch (ZufallMission.Next(1,5))
    {
        case 1:
             GamePlay.gpPostMissionLoad("missions\\Sub\\StartBf109e\\SubStartBf109e1.mis");
        break;
        case 2:
             GamePlay.gpPostMissionLoad("missions\\Sub\\StartBf109e\\SubStartBf109e2.mis");
        break;
        case 3:
             GamePlay.gpPostMissionLoad("missions\\Sub\\StartBf109e\\SubStartBf109e3.mis");
        break;
        case 4:
             GamePlay.gpPostMissionLoad("missions\\Sub\\StartBf109e\\SubStartBf109e4.mis");
        break;
    }

    }
}

Und hier noch ein missglückter Versuch um mit OnTickGame eine "feste" Submission erst nach 20Sek laden zu lassen:
using System;
using System.Collections;
using System.Collections.Generic;
using maddox.game;
using maddox.game.world;

public class Mission : AMission
{
    Random ZufallMission = new Random();

    public override void OnTickGame()
    {
       
        if (Time.tickCounter() % 666 == 0)
        {
             GamePlay.gpPostMissionLoad("missions\\Sub\\StartBf109e\\SubRauch3.mis");
        }     

       
        switch (ZufallMission.Next(1,5))
    {
        case 1:
             GamePlay.gpPostMissionLoad("missions\\Sub\\StartBf109e\\SubStartBf109e1.mis");
        break;
        case 2:
             GamePlay.gpPostMissionLoad("missions\\Sub\\StartBf109e\\SubStartBf109e2.mis");
        break;
        case 3:
             GamePlay.gpPostMissionLoad("missions\\Sub\\StartBf109e\\SubStartBf109e3.mis");
        break;
        case 4:
             GamePlay.gpPostMissionLoad("missions\\Sub\\StartBf109e\\SubStartBf109e4.mis");
        break;
    }

    }
}

Und hier auch noch weitere Fragen:

Wie kann man beim laden mit der Zufallsmethode nicht nur eine, sondern auch zwei oder noch mehr Submissionen aus dem Pool_Ordner laden?

Wie kann ich eine Submission durch einen Trigger in der Hauptmission laden?

Interessant wäre auch noch ein Beispiel, wie man geladene Submission auch wieder beim verlassen des Triggers "ausladen" kann.

Ich weiß, es ist ein bisschen viel. Um etwas mitzuhelfen könnte ich auch gerne zum Abschluß entsprechende Beispielmissionen hier zum Download für andere User einstellen.
Und auch diesmal wieder ein herzliches Dankeschön im voraus,
seladon

Offline FG28_Kodiak

  • Blasenteetrinker
  • *****
  • Beiträge: 1.893
Re: Submissionen zufällig laden funktioniert nicht
« Antwort #4 am: 16.April.2014, 11:37 »
Zu dem Trigger, wird ein Script verwendet funktioniert die normale Methode nicht mehr. Man muss den Code um folgendes erweitern um die alte Funktionalität zu gewährleisten:
    public override void OnTrigger(int missionNumber, string shortName, bool active)
    {
        base.OnTrigger(missionNumber, shortName, active);

        AiAction action = GamePlay.gpGetAction(shortName);

        if (action != null)
            action.Do();
    }

Dein Code sollte dann so aussehen:
using System;
using System.Collections;
using System.Collections.Generic;
using maddox.game;
using maddox.game.world;

public class Mission : AMission
{
    Random ZufallMission = new Random();

    public override void OnBattleStarted()
    {
        base.OnBattleStarted();

MissionNumberListener = -1;

        GamePlay.gpPostMissionLoad("missions\\Sub\\StartBf109e\\SubRauch3.mis");
       
        switch (ZufallMission.Next(1,5))
        {
           case 1:
                GamePlay.gpPostMissionLoad("missions\\Sub\\StartBf109e\\SubStartBf109e1.mis");
           break;
           case 2:
                GamePlay.gpPostMissionLoad("missions\\Sub\\StartBf109e\\SubStartBf109e2.mis");
           break;
           case 3:
                GamePlay.gpPostMissionLoad("missions\\Sub\\StartBf109e\\SubStartBf109e3.mis");
           break;
           case 4:
                GamePlay.gpPostMissionLoad("missions\\Sub\\StartBf109e\\SubStartBf109e4.mis");
           break;
        }
    }

    public override void OnTrigger(int missionNumber, string shortName, bool active)
    {
        base.OnTrigger(missionNumber, shortName, active);

        AiAction action = GamePlay.gpGetAction(shortName);

        if (action != null)
            action.Do();
    }
}

Zu OnTickGame()

        if (Time.tickCounter() % 666 == 0)
        {
             GamePlay.gpPostMissionLoad("missions\\Sub\\StartBf109e\\SubRauch3.mis");
        }

der % Operator ist der modulo (http://de.wikipedia.org/wiki/Modulo#Modulo) Operator in C# das bedeutet das diese If-Abfrage immer wahr wird wenn der Wert von tickCounter geteilt durch 666 keinen Rest (0) erzeugt. Somit wird diese If-Abfrage alle 20 Sekunden ausgeführt, statt nur einmal. Willst du diese nur einmal ausgeführt haben, kannst du dir mit einem Flag oder Stopwatch (über .Net) behelfen.  Der Switch - Block wird jeden Tick, also alle 1/30sec ausgeführt auch hier kannst du dir mit einem Flag behelfen, der Code könnte dann so aussehen:
using System;
using System.Collections;
using System.Collections.Generic;
using maddox.game;
using maddox.game.world;

public class Mission : AMission
{
    Random ZufallMission = new Random();
    private bool MissionGestartet = false;
    private bool ZufallsmissionGestartet = false;

    public override void OnTickGame()
    {

        if (!MissionGestartet && Time.tickCounter() % 666 == 0)
        {
            GamePlay.gpPostMissionLoad("missions\\Sub\\StartBf109e\\SubRauch3.mis");
            MissionGestartet = true;
        }

        if (!ZufallsmissionGestartet)
        {
            switch (ZufallMission.Next(1, 5))
            {
                case 1:
                    GamePlay.gpPostMissionLoad("missions\\Sub\\StartBf109e\\SubStartBf109e1.mis");
                    break;
                case 2:
                    GamePlay.gpPostMissionLoad("missions\\Sub\\StartBf109e\\SubStartBf109e2.mis");
                    break;
                case 3:
                    GamePlay.gpPostMissionLoad("missions\\Sub\\StartBf109e\\SubStartBf109e3.mis");
                    break;
                case 4:
                    GamePlay.gpPostMissionLoad("missions\\Sub\\StartBf109e\\SubStartBf109e4.mis");
                    break;
            }
            ZufallsmissionGestartet = true;
        }

    }
}


Hier ein kleines Beispiel mit Stopwatch:
using System;
using maddox.game;
using maddox.game.world;
using System.Diagnostics; // Wird für die Stopwatch benötigt

public class Mission : AMission
{
    // Hier werden die Stopuhren global erzeugt für die Mission
    Stopwatch MissionTimer1 = new Stopwatch();
    Stopwatch MissionTimer2 = new Stopwatch();
   
    public override void OnBattleStarted()
    {
        base.OnBattleStarted();

        MissionNumberListener = -1;

        // die Stopuhren werden gestartet
        MissionTimer1.Start();
        MissionTimer2.Start();
    }
   
    public override void OnTickGame()
    {
        base.OnTickGame();

       
        if (MissionTimer1.Elapsed.Minutes >= 1) // 1 Minuten
        {
            MissionTimer1.Restart(); // die Stopuhr wird resettet und beginnt wieder bei Null, somit wird die If-Abfrage nach einer Minute erneut aufgerufen
            GamePlay.gpLogServer(null, "MissionTimer1 alle 1min", new object[] { }); //Testmeldung
            // Hier der Eintrag zum laden einer Mission etc.
        }
   
        if (MissionTimer2.Elapsed.Minutes >= 2) // 2 Minuten
        {
            MissionTimer2.Reset(); // Uhr wird auf 0 gesetzt und die Zeitmessung beendet, diese If-Abfrage wird also nur einmal aufgerufen
            GamePlay.gpLogServer(null, "MissionTimer2 nach 2min", new object[] { }); //Testmeldung
            // Hier der Eintrag zum laden einer Mission etc.
        }
    }
}   

Für die Zeitabfrage kann man z.B. (MissionTimer1 ist die Stopwatch)
            MissionTimer1.Elapsed.Days
            MissionTimer1.Elapsed.Hours
            MissionTimer1.Elapsed.Minutes
            MissionTimer1.Elapsed.Seconds
            MissionTimer1.Elapsed.Milliseconds
            MissionTimer1.Elapsed.Ticks
            MissionTimer1.Elapsed.TotalDays
            MissionTimer1.Elapsed.TotalHours
            MissionTimer1.Elapsed.TotalMinutes
            MissionTimer1.Elapsed.TotalSeconds
            MissionTimer1.Elapsed.TotalMilliseconds
verwenden.

Dazu noch eine Anmerkung:
MissionTimer1.Elapsed.Minutes hat z.B. den Bereich von -59 bis 59 Minuten, gibt nur den Minutenanteil der Gesamtzeit an. bei 2h 43m 12s wären das die 43.
MissionTimer1.Elapsed.TotalMinutes liefert z.B. die Gesamtanzahl der Minuten seit Start. Bei 2h 43m 12s dann 163,12min.


Methoden
            MissionTimer1.Start(); // Startet die Zeitmessung oder führt sie fort
            MissionTimer1.Stop(); // Hält die Zeitmessung an, kann dann mit Start() wieder fortgesetzt werden
            MissionTimer1.Restart(); // Startet die Zeitmessung bei 0 neu
            MissionTimer1.Reset(); // Setzt die Zeitmessung auf 0 zurück und beendet die Zeitmessung
            MissionTimer1.IsRunning; // bool zeigt an ob die Zeitmessung läuft (true) oder nicht (false)


Nachteil dieser Methode ist natürlich das die Zeitraffer-Funktion nicht berücksichtigt wird, also mehr für Multiplayer Missionen geeignet.


Mit Hilfe eines Triggers eine Mission Laden:
using System;
using maddox.game;
using maddox.game.world;


public class Mission : AMission
{

    public override void OnTrigger(int missionNumber, string shortName, bool active)
    {
        base.OnTrigger(missionNumber, shortName, active);

        GamePlay.gpLogServer(null, "TriggerName: {0}", new object[] {GamePlay.gpGetTrigger(shortName).Name}); //Test entfernen wenn nicht benötigt.


        if ("TriggerName1".Equals(shortName) && active)
        {
            GamePlay.gpPostMissionLoad("missions\\Sub\\test1.mis");
            GamePlay.gpGetTrigger(shortName).Enable = false;
        }
    }
}
TriggerName1 ist der Name des Triggers den du in der Mission festgelegt hast.

Den Rest der Fragen beantworte ich heute Abend, da ich für das meiste schon mal Beispiele gemacht habe muss ich die nur noch zusammensuchen ;)
 
« Letzte Änderung: 16.April.2014, 16:20 von FG28_Kodiak »

Offline FG28_Kodiak

  • Blasenteetrinker
  • *****
  • Beiträge: 1.893
Re: Submissionen zufällig laden funktioniert nicht
« Antwort #5 am: 17.April.2014, 10:56 »
Wie kann man beim laden mit der Zufallsmethode nicht nur eine, sondern auch zwei oder noch mehr Submissionen aus dem Pool_Ordner laden?


Folgendes Codebeispiel liest die vorhandenen Mis-Dateinamen aus einem angegebenen Verzeichnis ein, und lädt dann drei davon zufällig beim Missionsstart.
using System;
using System.Collections.Generic;
using System.IO;
using maddox.game;
using maddox.game.world;


public class Mission : AMission
{

    private static string userdocpath = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
    private static string SubMissionPath = userdocpath + @"\1C SoftClub\il-2 sturmovik cliffs of dover - MOD\missions\Sub";

    List<string> SubMissionsPool = new List<string>();
    Random zufallMissionNR = new Random();


    public override void OnBattleStarted()
    {
        base.OnBattleStarted();

        if (Directory.Exists(SubMissionPath))
        {
            try
            {
                SubMissionsPool.AddRange(Directory.GetFiles(SubMissionPath, "*.mis"));
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
                GamePlay.gpLogServer(null, "Fehler beim Einlesen der Missionen", new object[] { });
            }
        }
        else GamePlay.gpLogServer(null, "Das angegebene Verzeichnis existiert nicht", new object[]{});

       
        int r = SubMissionsPool.Count;
       
        // Drei Missionen aus dem Pool laden, wenn mehr als drei Missionen vorhanden, ansonsten so viele Missionen laden wie vorhanden.
        if (r > 3)
                r = 3;
       
        for (int i = 0; i < r; i++)
                SubmissionZufaelligLaden();
    }


    private void SubmissionZufaelligLaden()
    {

        if (SubMissionsPool.Count > 0)
        {
            int missionNummer = zufallMissionNR.Next(0, SubMissionsPool.Count);
           
            GamePlay.gpLogServer(null, "Lade File: {0}", new[] { SubMissionsPool[missionNummer] }); //Testmeldung (entfernen wenn nicht erwünscht)
           
            GamePlay.gpPostMissionLoad(SubMissionsPool[missionNummer]);
           
            //Geladene Mission aus dem Pool entfernen, umzu verhindern das sie erneut geladen wird
            SubMissionsPool.RemoveAt(missionNummer);
        }
    }
}


Offline seladon11

  • Hallenfeger
  • **
  • Beiträge: 4
Re: Submissionen zufällig laden funktioniert nicht
« Antwort #6 am: 18.April.2014, 08:05 »
Vielen Dank Kodiak,
ich brauche allerdings ein paar Tage um das durchzugehen und werde nächste Woche das Ergebnis posten.
Schöne Feiertage,
seladon