08.08.2015, 16:10 | #1 (permalink) |
Registriert seit: 08.08.2015
Beiträge: 46
|
Array juchey
Hallo!
Ich verzweifele langsam und sicher daran, dass ich nicht begreife, wie ich Einheiten, die ich gespawnt habe, wieder anspreche. Sinn soll sein, dass man an einem Punkt beliebig oft Einheiten spawnen kann, vielleicht im eigenen Menü, vielleicht an einem Whiteboard, wie auch immer. Die Einheiten sollen dann spawnen und ich will die Kontrolle darüber haben, sprich z.B. möchte ich auch alle gespawnten Einheiten wieder löschen können (aber eben nur diese). Das Skript sieht bis jetzt so aus: PHP-Code:
Kann einer der Skriptbegabten einen Noob mal auf die richtige Spur bringen? Vermutlich ist es völlig einfach und ich renne nur mit dem Kopf immer gegen den Laternenpfahl ... cheers! Wolkenstuermer |
09.08.2015, 12:47 | #2 (permalink) |
Registriert seit: 10.10.2006
Beiträge: 263
|
Code:
private ["_grp1","_list1","_unit"]; _grp1 = createGroup EAST; _list1 = []; { _unit = [getMarkerPos "spawn", EAST, [_x],[],[],[],[],[],180] call BIS_fnc_spawnGroup; _list1 = _list1 + units _unit; [_unit] join _grp1; } forEach ["O_Soldier_F"]; sleep 3; {deleteVehicle _x;} forEach _list1; Schaue dir aber mal denn Befehl an https://community.bistudio.com/wiki/createUnit_array der ist genau das was du brauchst |
10.08.2015, 11:59 | #3 (permalink) |
Registriert seit: 08.08.2015
Beiträge: 46
|
Hi Nokman,
vielen Dank für die Erhellung Muss noch viel lernen und manchmal sehe ich das Byte vor lauter Bit nicht mehr. Das mit dem CreateUnitArray ist sehr interessant, damit werde ich wohl mal rumpfuschen. Danke nochmal! cheers! |
10.08.2015, 13:17 | #4 (permalink) |
Registriert seit: 08.08.2015
Beiträge: 46
|
Zwei Fragen hätte ich noch:
Das mit den privates hast du eingefügt, damit die Werte beim erneuten Aufrufen nicht überschrieben werden, oder? Und: Wenn ich nun in einem weiteren Skript die Liste löschen möchte, wie mache ich das? Die Variablen sind ja alle lokal. Muss ich mich da mit Strings und compile auseinandersetzen oder gibt es eine einfache Lösung? Sinn wäre: In einem Skript Einheiten spawnen, im anderen Skript diese gespawnten Einheiten wieder löschen, indem ich sie direkt anspreche. |
11.08.2015, 13:21 | #5 (permalink) |
Registriert seit: 15.05.2011
Beiträge: 1.109
|
globaleVariable nutzen. z.b. der Aufruf in Script 1: grp = ...... call BIS_fnc_spawngroup Löschen im Script 2: {_x setdammage 1 } forEach units grp Nachtrag: Ansonsten kann ich mich Nokman anschließen, da dein Code "komisch" ist. Entweder zu erstellst eine Gruppe und läßt die alle übertreten oder einen Soldaten. 1. Gruppe mit 3 Leuten Code:
private ["_grp1","_list1"]; _list1 = []; _grp1 = [getMarkerPos "spawn", EAST, ["O_Soldier_F", "O_Soldier_F","O_Soldier_F"],[],[],[],[],[],180] call BIS_fnc_spawnGroup; { _list1 = _list1 + [_x]; } forEach units _grp; Code:
private ["_grp1","_list1"]; _list1 = []; _grp1 = [getMarkerPos "spawn", east, configfile >> "CfgGroups" >> "EAST" >> "caf_ag_me_t" >> "Infantry" >> "6_men_me_t")] call BIS_fnc_spawnGroup; { _list1 = _list1 + [_x]; } forEach units _grp; 3. Gruppe erstellen und 30 Leute rein: Code:
private ["_grp","_list1","_unit"]; _list1 = []; _grp = creategroup east; for "_i" from 1 to 30 do { _unit = _grp createUnit ["O_Soldier_F", getMArkerPos "spawn", [], 0, "FORM"]; _list1 = _list1 + [_unit]; };
__________________
Bewegende Momente bei ArmA 3 Geändert von Drunken Officer (11.08.2015 um 14:00 Uhr). |
11.08.2015, 16:20 | #6 (permalink) |
Registriert seit: 08.08.2015
Beiträge: 46
|
Hallo Drunken,
danke für die Tipps! Aber das ist ja das Problem, ich kriege es mit globalen Variablen nicht gebacken. Ich will das Skript ja mehrfach aufrufen können. In dem Fall würde er die globale Variable ja überschreiben. Mein Script ist sicherlich komisch, ich versuche damit nur zu begreifen, wie ich Einheiten in einer Liste speichern und diese dann wieder entfernen kann. Das ist kein sinnvolles Skript für irgendwas, sondern soll meiner Matschbirne endlich ein Heureka entlocken (bin kein Programmierer und lerne das quasi von Adam und Eva an) Wunsch: Ich habe in einer Mission z.B. eine Flagge. An dieser kann ich Einheiten spawnen lassen. Ich kann das Skript mehrmals aufrufen, dann werden eben n Einheiten gespawnt. Egal ob nun eine Einheit oder n Einheiten, ich möchte dann mit einem zweiten Skript ALLE Einheiten wieder entfernen können, die ich mit dem ersten in die Liste geschrieben/gespawnt habe. Noch blicke ich nicht, was ich falsch mache. Global geht es nicht, da dann der zweite Soldat den ersten "überschreibt" (oder liege ich da falsch?) und lokal geht es auch nicht, da er meine Variable aus dem ersten Skript nicht wiederfindet. Aber es muss doch irgendwie gehen, man muss doch irgendwie Listen in einem Skript an andere übergeben können, ohne sich übergeben zu müssen Bzw. wie wäre denn eine sinnvolle Lösung für meine Spawn/Despawn Kombi? |
11.08.2015, 19:24 | #7 (permalink) |
Registriert seit: 15.05.2011
Beiträge: 1.109
|
Dann baue einen globalen Array. Z.B. in der Init.sqf
Unitsarray = []; Danach füllst du den Array. Bis jetzt wurde dafür _list1 genommen. _list1 ist aber eine lokale Varibable und wird nur in dem Script verwendet. Mit unitsarray wird dieser immer weiter gefüllt. Zum löschen der Einheiten wurde ja bereits geschrieben: {_x setdammage 1} forEach unitsarray BEISPIEL: SEtze deinen Spieler Setze einen Marker und benenne diesen "spawn" setze eine Flagge in die Init der Flagge schreibst du: Code:
unitarray = []; this addaction ["SPAWN", { ["spawn", 12] spawn { private ["_grp","_unit"]; _grp = creategroup east; for "_i" from 1 to (_This select 1) do { _unit = _grp createUnit ["O_Soldier_F", getMArkerPos (_this select 0), [], 0, "FORM"]; unitarray = unitarray + [_unit]; }; }; }]; {_x setdammage 1} forEach unitarray --> Lasse Einheiten spawnen. Mit dem Funktrigger kannst du sie alle auf einmal töten
__________________
Bewegende Momente bei ArmA 3 Geändert von Drunken Officer (11.08.2015 um 19:42 Uhr). |
12.08.2015, 10:55 | #8 (permalink) |
Registriert seit: 10.10.2006
Beiträge: 263
|
um es einfach zu sagen, Ich habe die Definiert das es die gibt weil er sonst ausserhalb der foreach nicht weis das die einen Wert hat. Foreach ist ein anderer Raum(bereiche im Script) in der Wohnung(gesamte Script). Ohne das Ich dir jetzt sage(private [""]) das jemand im nebenraum ist weist du es nicht ausser du schaust nach. Wie Drunken Officer schon als beispiel sagte gibt es neben denn noch 100 weitere möglichkeiten. du kanst eine globale variable verwenden MeineSoldaten = []; { hier werden die einheiten erstellt und in _list1 geschrieben } MeineSoldaten pushback _list1; Somit würden die soldaten aus _list1 (lokal) in die MeineSoldaten(global) reingeschoben werden ans ende. Dann kanst du zb da alle löschen lassen mit {deleteVehicle _x;} forEach forEach MeineSoldaten; // da sind alle weg Du kanst es auch in bereiche nach erstellung sortieren Jetzt wird jedes mal wenn du den Script aufrufst ne neuer bereich in der Globalen erstellt. MeineSoldaten pushback [_list1]; dann heist der löschbefehl {deleteVehicle _x;} forEach (MeineSoldaten select ZAHL); Wichtig ist zu denn was ich dir hier sage Schaue dir https://community.bistudio.com/wiki/...ommands_Arma_3 an darin stehen die ganzen befehle und was die machen wie select foreach etc. einfach suchfunktion des browser (strg +f) verwenden. Code:
private ["_grp1","_list1","_unit","_ki"]; if (isnil "MeineSoldaten") then { //isnil MeinSoldat sobald der einmal ausgeführt wurde überspringt er denn bereich. MeineSoldaten = []; kiloeschen = { //ist die Funktion (ist in einer {} )die in Addaction ausgeführt werden soll private ["_c","_del"]; _del = []; if (count MeineSoldaten isequalto 0) exitwith {Hint 'Keine Einheiten erstellt'}; //soll aus den Script wieder Springen wenn es keine Ki zum löschen gibt for "_c" from 1 to (count MeineSoldaten) do { //eine For Schleife if ([format['Es gibt %1 Ki Gruppen möchtest Du Gruppe %2 Löschen mit %3 KI´s?',count MeineSoldaten,_c,count (MeineSoldaten select (_c -1))],'Ki Löschen','Ja','Nein']call bis_fnc_guimessage) then { // funktion GUI Message {deleteVehicle _x;} foreach (MeineSoldaten select (_c-1)); _del = _del + [(_c -1)]; //speichert sich lokal die Bereiche welche gelöscht wurden in MeinSoldat }; }; reverse _del; //Dreht die speicherung um damit wir von hinten her die Meinsoldat aufräumen können {MeineSoldaten deleteAt _x} foreach _del; //räumt auf }; player addAction ["Ki Löschen",kiloeschen]; //Fügt hinzu die Addaction }; // jetzt das wird immer ausgeführt. Es werden Zwischen 0(da er aufrunden soll ceil ist es immer 1) und 20 KI´s Erstelt _grp1 = createGroup EAST; _list1 = []; _ki = []; for "_i" from 1 to (ceil(random 20)) do { _ki = _ki + ["O_Soldier_F"]; (Hier baut er die Anzahl der soldaten zusammen) }; _unit = [getMarkerPos "spawn", EAST, _ki,[],[],[],[],[],random 360] call BIS_fnc_spawnGroup; _list1 = _list1 + units _unit; [_unit] join _grp1; Meinesoldaten = MeineSoldaten + [_list1];// hinzufügen zu MeineSoldaten Es ist nicht der Beste Script. ps: Arma mit -showScriptErrors starten als paramater |
12.08.2015, 14:32 | #9 (permalink) |
Registriert seit: 08.08.2015
Beiträge: 46
|
Hmm ... vielen Dank erstmal ihr beiden - jetzt raucht zwar der Kopf, aber ich werde mir das alles mal versuchen zu begreifen.
Finde ich super, dass es hier so kompetente Hilfe gibt! Ich glaube das Schlimme für Skriptanfänger ist gerade, dass es soviele Wege gibt Ich bin gestern z.B. schon daran gescheitert, das Beispiel von Drunken einfach für ein Skript umzusetzen (anstatt als AddAction im Fahnenmast). Schätze, da fehlen noch ordentlich Grundlagen (an denen ich immer wieder verzweifele). Ich schaue die Befehle auch immer im Wiki nach, nur ist das für Anfänger trotzdem sehr schwer, zu begreifen, wann man was wie mit wem verwendet. Nochmal danke Jungs. |
12.08.2015, 14:52 | #10 (permalink) |
Registriert seit: 10.10.2006
Beiträge: 263
|
Natürlich kein problem,
Jeder muss mal fragen und jeder hat mal angefangen, slange man sich aber bemüht und nicht einfach ankommt mit der Frage "Hier ich will ne Super geiles Teil haben macht mal schnell" dann hilft man auch. Vieles kommt auch nur duch Probieren. Du kanst den Script von mir zb auch einfach in die Konsole eingeben dazu musst du aber alle //TEXT entfernen sonst gibt es einen fehler. Danach ausführen. und wenn du die Scripterrors anhast wirste auch ganz schnell sehen was nicht geht wenn was nicht geht. Als Idee kanste auch gerne den Script von mir so umbauen das Du nach dem ersten ausführen eine addaction bekommst zum erstellen der KI. Dazu den Befehlsblock wie die kiloesch script bearbeiten. Das wird schon. |
13.08.2015, 11:03 | #11 (permalink) |
Registriert seit: 08.08.2015
Beiträge: 46
|
Danke Nokman.
Das mit dem Probieren ist so eine Sache Manchmal probiere ich sehr lange rum und bin frustriert, weil gar nix geht. Ist aber vermutlich das Los des Anfängers Die schwierigsten Sachen sind am Anfang (zumindest für mich) die Lokalitäten, dass alles dann auch noch im MP läuft, Unterschiede zwischen lokal und global und wann man was nimmt, dann entdeckt man im Wiki auch noch, dass die Befehle teils lokal, teils global anwendbar sind und teils eben auch nicht Aber gut. Dennoch macht es Spaß, zu sehen, wenn was läuft. Kommt am Anfang eben leider nicht allzu oft vor |
13.08.2015, 12:57 | #12 (permalink) |
Registriert seit: 15.05.2011
Beiträge: 1.109
|
Bei den Befehlen immer links oben in die Ecke schauen!
__________________
Bewegende Momente bei ArmA 3 |
14.08.2015, 18:00 | #13 (permalink) |
Registriert seit: 08.08.2015
Beiträge: 46
|
Brrr ... ich verstehe es leider immer noch nicht.
Ich habe nun ein kleines Schnipsel namens spawn.sqf: PHP-Code:
PHP-Code:
Jedoch: Es wird die letzte Einheit gelöscht. Alle anderen bleiben stehen, in etwa so ratlos wie ich Wo ist mein Fehler? Oder kann ich Einheiten nur über AddAction so erzeugen und in ein Array schreiben, dass das Array auch befüllt wird (denn es klappt ja, wenn ich exakt das Gleiche schreibe, es nur über ein spawn in ein AddAction einbette und von einem Objekt aus aufrufe ...) Ist es entscheidend, "wer" das Skript aufruft? |
16.08.2015, 18:55 | #14 (permalink) |
Registriert seit: 15.05.2011
Beiträge: 1.109
|
Führst du soldierarray = []; jedesmal mit neu aus? Denn das darfst du nicht.
Ich denke genau das machst du aber. Übersetzt heißet es: Erstelle leeren Array Erstelle Gruppe Erstelle Einheit und schmeiße diese in den Array. .. Erneute Ausführung Erstelle bzw. leere den Array !!! bla bla bla Somit hat dein Array nur eine Einheit gespeichert, nämlich die letzte erzeugte Einheit. Die Vordefinition darf nur einmal ausgeführt werden. Der Rest vom Spawn-Script stimmt, auch wenn eigentilich for "_i" from... richtiger wäre.
__________________
Bewegende Momente bei ArmA 3 Geändert von Drunken Officer (16.08.2015 um 18:57 Uhr). |
Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1) | |
Themen-Optionen | |
Ansicht | |
|
|
Ähnliche Themen | ||||
Thema | Autor | Forum | Antworten | Letzter Beitrag |
Find in Array | Nokman | Editing & Scripting | 6 | 13.06.2014 07:51 |
Array für COS abfragen | Wolkenbeisser | Editing & Scripting | 4 | 13.05.2014 09:58 |
Problem mit Helmand Karte und Aiaktalik - Help please! | FlashAUT | Mods & Addons | 8 | 24.11.2011 09:05 |
Linux Server aufsetzen . Vorgehen ? | Nightshift | Multiplayer | 2 | 29.08.2011 21:37 |
Frage Array | Ghost_Aut | Editing & Scripting | 3 | 13.04.2011 17:57 |