PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Classname als Array benutzen?


Martins
17.08.2016, 21:31
Hallo,

ich befasse mich erst seit ein paar Tagen mit Arma 3 Scripten und hänge momentan an den Arrays fest.
Mir stellt sich jetzt die Frage ob es möglich ist, ein Classname als Array anzugeben.

Grund:
Ich wollte zum Testen ein Radiosender erstellen in dem einiges an Musik im Loop läuft.
Momentan sieht es so aus:
[] spawn{
while {true} do
{
radio_1 say3D "Radiotrack1";
sleep 217;
radio_1 say3D "Radiotrack2";
sleep 205;
};
};


Das funktioniert soweit auch problemlos.
Jetzt wollte ich, das auf allen Radios die ich platziere automatisch das Script läuft. Das Radio hat den Classname Land_FMradio_f.
Ist das so überhaupt machbar? Habe zwar schon nach Lösungen gesucht aber bin nicht fündig geworden.

Gruß Martins

Pfandgiraffe
17.08.2016, 22:47
https://community.bistudio.com/wiki/allMissionObjects
oder
https://community.bistudio.com/wiki/entities


Zweiteres kann direkt den Classname verarbeiten.
Keine Ahnung was am Ende performanter ist. (lässt sich ja auch schnell ermitteln über diag_codePerformance (https://community.bistudio.com/wiki/diag_codePerformance))


Grüße

Martins
18.08.2016, 00:05
Danke für die Antwort aber leider versteh ich das nicht was dort auf den Seiten beschrieben steht.

Ich hab jetzt die ganze Zeit versucht damit etwas hin zu basteln, unter anderen sah es dann so aus:

[] spawn{
while {true} do
{
_allMObjects = allMissionObjects "Land_FMradio_F";
_allMObjects say3D "Radiotrack1";
sleep 217;
};
};

Dann kommt ein Error:
1 Element angegeben, 2 erwartet.

TimmK
18.08.2016, 01:58
allMissionObjects gibt dir ein Array zurück,
say3D kann allerdings nur mit einem einzelnem Object arbeiten.
Mit forEach kannst du ein Script über jeden Eintrag aus einem Array laufen lassen.
https://community.bistudio.com/wiki/forEach

Pfandgiraffe
18.08.2016, 08:39
So könnte das aussehen:

martins_radio = {
private _radio = _this;
while {true} do {
_radio say3D "Radiotrack1";
sleep 217;
_radio say3D "Radiotrack2";
sleep 205;
};
};



_allRadiosArray = allMissionObjects "Land_FMradio_F";

{
_x spawn martins_radio;
true
} count _allRadiosArray;

Martins
18.08.2016, 09:14
danke für die Arbeit, ich dachte schon ich wäre nah dran mit meiner Lösung aber da lag ich wohl daneben.
Naja ich steh ja erst am Anfang beim lernen, irgendwann wird es bestimmt noch :lol:


Ich will nu keine Umstände machen aber was genau machen folgende Zeilen?

...
private _radio = _this;
...
...
...
_x spawn martins_radio;
true

Pfandgiraffe
18.08.2016, 11:07
Der count-Loop (funzt genauso wie der forEach-Loop) cycelt durch jeden Eintrag in _allRadiosArray. Also jedes Radio-Objekt was gefunden wurde. Innerhalb des Loops wird dieses mit der Magic-Variable _x angesprochen. _x ist also bei jedem Durchlauf der Schleife ein anderes Radio.

Dein eigentliches Script zum abspielen deines Sounds habe ich in eine eigene Instanz (martins_radio) ausgelagert. (das könnte auch eine komplett eigene Datei werden) Mit "_x spawn wasAuchImmer" übergebe ich das aktuelle radio in diese Instanz. Dort ist es dann die Magic-Variable _this.

Mit _radio = _this; gebe ich diesem Radio eine in der Instanz lokale Variable. (eben _radio) Und mit dem private davor mache ich diese Variable global in der Instanz. Das stellt sicher, dass der while-Loop auch was mit _radio anfangen kann. Das ist eine Sicherheitsmaßnahme damit die Variable _radio nie Nil sein kann. (also unbekannt) Das könnte z.B. passieren wenn die Ausführung der Instanz länger als ein Frame benötigt. Also in Frame Y wird _radio = _this. Dann ist ist die Zeit für jegliche Ausführung in der sheduled environment zu ende (3ms). In Frame Z wäre die Variable _radio jetzt fremd.

Alles klar?! :ugly:


Grüße

Martins
18.08.2016, 19:05
Es ist mir auf jeden Fall jetzt klarer als vorher, danke :daumen:

Ich hab jetzt noch zu dem befehl say3D ne Frage:
Kann man damit nur eigens eingebundene .ogg's abspielen?
Ich habe damit noch etwas herum gespielt und wollte den Arma Track "This Is War" abspielen. Aber das ging nicht, es kam auch keine Fehlermeldung dazu.

Pfandgiraffe
18.08.2016, 21:41
Keine Ahnung. Probiere es mal mit playSound3D (https://community.bistudio.com/wiki/playSound3D). Ich arbeite immer nur mit dem Befehl.

Drunken Officer
19.08.2016, 06:56
https://community.bistudio.com/wiki/say3D
say3d fordert eine zuvor definierte Variable in der CfgSound der Description.ext.

This is war ist kein sound, sondern Musik. (cfgmusic)

https://community.bistudio.com/wiki/Description.ext#CfgSounds

say3D hat einen lokalen Effekt. Also auf jedem Clienten ausführen, wenn es sich um eine MP Mission handelt

Martins
20.08.2016, 16:50
Nochmals danke für die Infos, ich werde noch ein paar Scripte schreiben und schauen ob ich das so wirklich verstanden habe und umsetzen kann :daumen:

Martins
21.08.2016, 22:27
say3D hat einen lokalen Effekt. Also auf jedem Clienten ausführen, wenn es sich um eine MP Mission handelt

Ich habe bisher noch nichts für eine MP Mission gemacht aber ich hab mir dazu mal einiges durchgelesen.
Ist es richtig dass die Abfrage dann wie folgt laufen müsste?:

if (isDedicated) exitWith {
GC_radio = {
private _radio = _this;
while {true} do {
_radio say3D "Radiotrack10";
...
};
};
_allRadiosArray = allMissionObjects "Land_FMradio_F";

{
_x spawn GC_radio;
true
} count _allRadiosArray;
};

Drunken Officer
22.08.2016, 20:30
Falsch. Der Dedi braucht es eben nicht.
Die Spieler benötigen es.