HX3 Foren

HX3 Foren (https://hx3.de/)
-   Editing & Scripting (https://hx3.de/editing-scripting-187/)
-   -   Classname als Array benutzen? (https://hx3.de/editing-scripting-187/classname-array-benutzen-25510/)

Martins 17.08.2016 21:31

Classname als Array benutzen?
 
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:
Code:

[] 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)


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:

Code:

[] 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:

Code:

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?
Code:

...
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. 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/....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

Zitat:

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?:

Code:

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.


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:11 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