HX3 Foren

HX3 Foren (https://hx3.de/)
-   Editing & Scripting (https://hx3.de/editing-scripting-167/)
-   -   Globale Variable, senden dann rechnen (https://hx3.de/editing-scripting-167/globale-variable-senden-dann-rechnen-23963/)

JoBro 17.06.2014 19:35

Globale Variable, senden dann rechnen
 
Ich möchte eine Globale Variable festlegen und an eine andere Datei senden und dann mit dieser rechnen, zu dieser Zahl z.B. 1 addieren usw.:

Was ich kann:

Code:

MeineVariable=10;

[MeineVariable] exec "Skript.sqs";


Skript.sqs

Code:

_zahl  = _this select 0;
_neu = 0;

if (_Zahl  == 10) then {hint "gut";} else {};


_neu = _neu + _ zahl ;

if (_neu == 10) then {hint "gut";} else {};

Aber was nicht geht, was ich einfach nicht finden/lösen kann, ist wie folgendes;
Code:

(_this select 0) = (_this select 0)+1;

if (MeineVariable == 11) then {hint "gut";} else {hint "schlecht";};

geht nicht!


Mir fallen nur umständliche Sachen ein, wie eine zusätzliche Nummer mit senden:

Code:

MeineVariable1=10;
MeineVariable2=50;
MeineVariable3=70;
....

[1, MeineVariable1] exec "Skript.sqs";

Skript.sqs

Code:

_nr  = _this select 0;

_zahl  = _this select 1;

if (_nr == 1) then { MeineVariable1 = MeineVariable1 +1;} else {};
if (_nr == 2) then { MeineVariable2 = MeineVariable2 +1;} else {};
...

Das kann ja nicht die Lösung sein.

Ich weiß, dass die eckige Klammer [] ein Array ist!

Kann man da nicht was drehen??? Oder gibt es da ein einfachen Trick?

Danke im Voraus

Vienna 18.06.2014 13:06

Die globale Variable brauchst du nicht als Parameter übergeben, die kann in jedem Skript direkt angesprochen werden.

z.B.
Code:

if (MeineVariable == 10) then {hint "gut";} else {};


MeineVariable = MeineVariable + 1;

if (MeineVariable == 11) then {hint "gut";} else {};

usw.


Buliwyf 18.06.2014 15:54

...und vor allem: Hör auf mit SQS zu scripten!

JoBro 19.06.2014 17:31

Erst einmal danke für die Antworten.

Sorry, konnte nicht sofort darauf eingehen, weil ich erstmal viel lesen musste.
Ich möchte ungerne das Fragen, was andere schon gefragt haben.

Ich hab noch nie was mit SQF gemacht. Ich schau mir halt so einige Sachen von anderen an und SQF sah schon fast bedrohlich aus .... z.B. UPS (Unbegreiflicher Psycho Skript)
OK Kritik/Vorschlag verdaut - Ab jetzt Kein SQS...

  • Ich habe mehrere Bergwerke in denen Eisen gefördert wird (1 tonne pro Minute)
  • Ich habe mehrere Lager
  • LKWs fahren zum Bergwerk, laden das Eisen auf und bring es zu einem Lager, Ein LKW pro Bergwerk

Also, so gut es geht in SQF:

Die Förderung/Produktion:

Produktion.sqf
Code:

_loop=true;
while {_loop} do {
If (getdammage BergWerk1 == 1) then {

        } else {
        BergWerk1Eisen = BergWerk1Eisen + 1;
                };
If (getdammage BergWerk2 == 1) then {

        } else {
        BergWerk2Eisen = BergWerk2Eisen + 1;
                };
sleep 60;
};

Und der Rohstoff-Transport:

Rohstoff_Transport.sqf
Code:

_beladen=0;
_loop=true;
while {_loop} do {
If (_beladen == 0) then {
If (BergWerk1LKW distance BergWerk1 <= 100) then {
        _beladen = _beladen + BergWerk1Eisen;
        sleep 0.1;
        BergWerk1Eisen = 0;
        };

};
If (_beladen >= 1) then {
If (BergWerk1LKW distance Lager1 <= 100) then {
        Lager1Eisen = Lager1Eisen + _beladen;
        sleep 0.1;
        _beladen = 0;
        };

};
sleep 10;
}

Was aber, wenn es mehrere Lager gibt, die ein LKW anfahren kann.
Ich wurde das mit mindestens [Lager1] oder [Lager2] .. usw. starten

Code:

_lager=_this select 0;
_beladen=0;
_loop=true;
while {_loop} do {
If (_beladen == 0) then {
If (BergWerk1LKW distance BergWerk1 <= 100) then {
        _beladen = _beladen + BergWerk1Eisen;
        sleep 1;
        BergWerk1Eisen = 0;
        };

};
If (_beladen >= 1) then {
If (BergWerk1LKW distance _lager <= 100) then {
        Lager1Eisen = Lager1Eisen + _beladen;
        sleep 1;
        _beladen = 0;
        };

};
sleep 10;
}

aber Lager1Eisen stimmt dann nicht bei Lager2!!!
Klar kann man für jedes Lager mit entsprechenden Bergwerk kopieren und einfügen ... Würde man das Ganze nicht anders machen?

Ich hoffe, dass da nicht alles Falsch ist und auf eine baldige Antwort.
Danke.

Vienna 19.06.2014 20:06

Mit dieser Routine kann jeder LKW jedes Bergwerk und jedes Lager anfahren.

Ein Beispiel für jeweils 3 Objekte, die Anzal kann beliebieg geändert werden.
Code:

private ["_lkwName","_lkwLadung"];

TransportSchleife = true; //mit false wird das Skript beendet


//Initialisieren von Bergwerken, Lager und LKWs

 //in Array mehrdimensionales Array für jedes Bergwerk: [Bergwerk-Name,Inhalt]
 Bergwerke = [[Bergwerk_A,100],[Bergwerk_B,100],[Bergwerk_C,100]];
 //in Array mehrdimensionales Array für jedes Lager: [Lager-Name,Inhalt]
 Lager    = [[Lager_A,0],[Lager_B,0],[Lager_C,0]];
 //in Array mehrdimensionales Array für jeden LKW: [LKW-Name,Inhalt]
 LKWs      = [[LKW_A,0],[LKW_B,0],[LKW_C,0]];

while {TransportSchleif} do
 {
  //Abfrage ob LKW zum Laden bei einem Bergwerk oder zum Entladen in einem Lager ist
  for "_i" from 0 to count LKWs - 1 do //durchläuft alle LKWs
  {
    _lkwName  = (LKWs select _i)select 0;
    _lkwLadung = (LKWs select _i)select 1;
    if (_lkwLadung == 0) then //LKW leer auf dem Weg zu einem Bergwerk
    {
      {
      if(_lkwName distance _x select 0 < 20)exitWith //LKW bei einem Bergwerk eingetroffen?
        {
        if (_x select 1 > 0) then            //Bergwerk-Inalt > 0 ?
          {
          LKWs select _i set [1,1];          //LKW mit 1 beladen
          _x set [1,(_x select 1)-1] //Bergwerk-Inhalt -1
          }
        }
      }forEach Bergwerke; //durchläuft alle Bergwerke 
    }
    else //LKW ist beladen auf dem Weg zu einem Lager
    {
      {
      if(_lkwName distance _x select 0 < 20)exitWith //LKW bei einem Lager eingetroffen?
        {
        LKWs select _i set [1,0];          //LKW entladen
        _x set [1,(_x select 1)+1] //Lager-Inhalt +1
        }
      }forEach Lager; //durchläuft alle Lager 
    }
  }
 };

Ist nicht getestet, sollte aber so funktionieren.

JoBro 19.06.2014 22:50

Cool, danke!

Das ist eine Lösung: mehrdimensionale Array.
Ich schau mir das genau an, weil ich da viele Ideen habe, die ich da super einbringen kann. Außerdem brauch ich das Wissen für andere Sachen auch.

Kling Komisch, aber auf die schnell verstehe ich die Array mit den Parametern ganz gut, aber:

Code:

exitWith
Wenn das nicht der Fall ist, beende den Abschnitt ???
Oder
Wenn das der Fall ist, beende den Abschnitt mit dem Folgenden???
Bitte erklären.
Die andere Fragen versuche ich erstmal selber zu beantworten.

PS: Sollte es nicht funktionieren und ich finde den Fehler nicht, dann habe ich das nicht ganz verstanden. Ich schau mal in den nächsten Tagen, wenn ich Zeit habe. (Erinnert mich an Matrizen)

JoBro 20.06.2014 04:18

Bin eben mit der Antwort auf meine Frage aufgewacht! Verrückt!

da steht:
Code:

forEach Bergwerke;
forEach Lager;

In diesem Zusammenhang klar:
exitWith

Ist plötzlich selbsterklärend, was das da soll!!!

Vienna 20.06.2014 11:45

Das Unterbewustsein arbeitet durchgehend.

Hier eine Liste der Befehle: https://community.bistudio.com/wiki/...Commands_ArmA2


In der Hauptschleife ist ein Fehler! Die Initialisierungszeilen der Arrays gehören aus diesere Schleife natürlich raus.

Habe ich oben korrigiert.

JoBro 20.06.2014 21:01

Man kann echt viel machen, nicht nur Geiseln retten usw. sondern was neues.
Auch wenn man nur zwei Sachen, die es schon gibt, kombinieren:
Code:

  if (PlumpsKloManagerWirtschaft and Arma2taktischesVorgehen) then {
          Durchgeknallt=true;
        Patient = Patient +1;
        hint "Sie werden eingewiesen";
        }

Ok, muss man das Thema jetzt irgend wie als beantwortet abhacken?

Und noch mal danke

Vienna 22.06.2014 11:37

Globale Variable, senden dann rechnen
 
Senden brauchst du die globalen Variablen nur im Mehrspielermodus, falls erforderlich. Diese Variablen sind nur auf dem jeweiligen PC global. Soll eine Inhaltsänderung einer globalen Variablen auch den anderen PCs mitgeteilt werden, dann geht das z.B. mit:

https://community.bistudio.com/wiki/publicVariable

JoBro 25.06.2014 16:50

Jetzt habe ich grade mit der Array gespiet und da steht ja:

Code:

Lager    = [[Lager_A,0],[Lager_B,0],[Lager_C,0]];
Code:

          {
      if(_lkwName distance _x select 0 < 20)exitWith //das _x select 0 ist irgend ein Lager
        {
        LKWs select _i set [1,0];          //LKW entladen
        _x select 1 set [1,(_x select 1)+1] //das _x select 1 ist doch schon der Inhalt
        }
      }forEach Lager;

Müsste da nicht so was stehen:
Code:

          _x set [1,(_x select 1)+1]
            }
      }forEach Lager;

Ich kam nicht da zu das auszuprobieren, weil ich grade die ganzen Lektüren durchgehen und leider auch nicht so viel Zeit hatte.

Vienna 25.06.2014 23:19

Da hast du Recht! _x ist das jeweilige mehrdimensionale Array, der Index steht im ersten Feld von set.

Ich habe das wieder oben berichtigt.


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:54 Uhr.

Angetrieben durch vBulletin, Entwicklung von Philipp Dörner & Tobias


SEO by vBSEO 3.2.0 ©2008, Crawlability, Inc.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119