PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Globale Variable, senden dann rechnen


JoBro
17.06.2014, 18:35
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:

MeineVariable=10;

[MeineVariable] exec "Skript.sqs";



Skript.sqs

_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;
(_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:

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

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


Skript.sqs

_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, 12:06
Die globale Variable brauchst du nicht als Parameter übergeben, die kann in jedem Skript direkt angesprochen werden.

z.B.

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


MeineVariable = MeineVariable + 1;

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

usw.

Buliwyf
18.06.2014, 14:54
...und vor allem: Hör auf mit SQS zu scripten!

JoBro
19.06.2014, 16: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
_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
_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

_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, 19: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.

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, 21: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:

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, 03:18
Bin eben mit der Antwort auf meine Frage aufgewacht! Verrückt!

da steht:
forEach Bergwerke;
forEach Lager;

In diesem Zusammenhang klar:
exitWith

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

Vienna
20.06.2014, 10:45
Das Unterbewustsein arbeitet durchgehend.

Hier eine Liste der Befehle: https://community.bistudio.com/wiki/Category:Scripting_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, 20: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:
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, 10:37
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, 15:50
Jetzt habe ich grade mit der Array gespiet und da steht ja:

Lager = [[Lager_A,0],[Lager_B,0],[Lager_C,0]];
{
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:
_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, 22: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.