03.08.2013, 15:16 | #1 (permalink) |
Registriert seit: 26.09.2012
Beiträge: 120
|
Script wird nicht vollständig ausgeführt
Hallo Zusammen, habe zwei kleine Problemchen und hoffe mir kann jemand helfen.
Ich habe ein kleines Script für ein Auto geschrieben das diesem eine neue Aktion hinzufügt "Licht Flackern". Das Script funktioniert, es schaltet in einer Endlosschleife das Licht ein und wieder aus, funktioniert soweit ganz gut. Problem I: Ich dachte mir ich versuche es das diese Aktion genau dann automatisch ausgeführt wird, wenn ich mit dem Auto einen bestimmten Auslöser betrete. Doch leider wird das Script nach dem betreten des Auslösers nur bis an die Stelle ausgeführt wo die Bildschirmausgabe "LICHTER FLACKERN" erscheint? Es kommt keine Fehlermeldung, das Script wird wie gesagt gestartet, aber die For-Schleife wird scheinbar zu keinem Zeitpunkt betreten, ansonsten würden die Lichter doch flackern? Kann mir bitte jemand verraten weshalb das Script vom Auto aus ausgelöst komplett funktioniert, aber vom Auslöser ausgelöst aufeinmal nicht??? :/ Der Auslöser ist wie folgt konfiguriert: Das Auto ist an den Auslöser gruppiert. Unter "On Activate" steht folgendes: [] exec "script.sqf"; Hier das Script: Code:
//Variablen deklarieren und initialisieren _i = 0; player globalChat format["%1","LICHTER FLACKERN!"]; for [{_i=1}, {_i < 10}, {_i=_i+1}] do { player action ["lightOn", Auto]; //Verzögerungsschleife for [{_i=1}, {_i < 5000}, {_i=_i+1}] do { }; player action ["lightOff", Auto]; //Verzögerungsschleife for [{_i=1}, {_i < 5000}, {_i=_i+1}] do { }; //Schleife zu einer Endlosschleife machen If (_i > 8) then { _i = 1; }; }; //Variablen zerstören _i = nil; Wie ihr bestimmt schon gesehen habt ist dieses Script eine Endlosschleife, da ich möchte dass das Licht NICHT nach einer gewissen Zeit ausgeht. Hat jemand eine Idee wie ich ich das Flackern wieder beenden kann, vielleicht mit einer Aktion "Flackern beenden"? Danke für jede Hilfe! Geändert von MagicStyle (03.08.2013 um 17:39 Uhr). |
03.08.2013, 20:11 | #2 (permalink) |
Registriert seit: 26.09.2012
Beiträge: 120
|
Problem I. Gelöst
Habe ein paar Stunden recherchiert und bin dann doch noch in einem englischem Forum auf die Lösung gestoßen ||
Das Problem liegt an der Anweisung im Auslöser die richtig so lauten muss: _variable = [Name_des_Autos] execVM "scriptname.sqf"; LG MagicStyle PS: Mit Problem II. kämpfe ich leider noch immer. Geändert von MagicStyle (03.08.2013 um 20:25 Uhr). |
05.08.2013, 01:45 | #3 (permalink) |
Registriert seit: 14.02.2013
Beiträge: 28
|
Dann werde ich mich mal um Problem 2 kümmern.
Code:
aus = 0; player globalChat "LICHTER FLACKERN!"; while {aus == 0} do //bis der Spieler das Licht ausschaltet, wird das Licht flackern { player action ["lightOn", Auto]; sleep random 0.5; player action ["lightOff", Auto]; sleep random 0.5; }; Ich weiß ehrlich gesagt nicht, was es mit den Verzögerungswarteschleifen auf sich hatte, aber die sleep Befehle sind eine erheblich simplere Methode. Außerdem habe ich keine feste Wartezeit eingestellt, sondern eine zufällige, wodurch es mehr nach einem Flackern, als nach einem Alarmanlagenblinken aussieht. Falls unerwünscht, dann einfach das random entfernen und den gewünschten Wert hin schreiben (anstelle 0.5). Damit sich diese Schleife auflöst, muss die Variable "aus" auf eine andere Zahl als 0 gestellt werden. Dafür fügst du in den Auslöser, der das Licht auslöst, (oder in einen anderen) das ein: player addAction ["Flackern beenden!", "aus.sqf"]; In der aus.sqf steht dann Folgendes drin: Code:
aus = 1; player removeAction 0; |
07.08.2013, 15:57 | #4 (permalink) |
Registriert seit: 26.09.2012
Beiträge: 120
|
Hi, Danke für deine Hilfe !
Hatte nicht daran gedacht eine while Schleife zu verwenden. "Sleep" war mit meiner For-Schleife irgendwie nicht kompatibel deswegen habe ich Verzögerungsschleifen eingesetzt. Achtung Noobfragen! Kannst du mir bitte erklären warum hinter random, "0.5" steht? Ich dachte der Wert ist doch eh zufällig wieso muss man dann noch 0.5 angeben? Ach ja, und weshalb benötige ich im script "aus.sqf" die zweite Zeile, also: "player removeAction 0;" ? Es reicht doch vollkommen wenn man nur "aus = 1;" schreibt, oder nicht? Danke nochmal! Geändert von MagicStyle (07.08.2013 um 16:06 Uhr). |
08.08.2013, 09:51 | #5 (permalink) |
Registriert seit: 14.02.2013
Beiträge: 28
|
0.5 steht dafür, dass ein Zufallswert von 0 bis 0.5 Sekunden ausgewählt wird. Da kannst du natürlich auch jede andere Zahl einsetzen.
Ansonsten steht noch beim Player da, die Aktion nochmal einzusetzen (ich meine dieses Aktionsfeld), obwohl es nichts bringt, daher ist es doch besser die Aktion wieder zu entfernen, nachdem sie verwendet wurde. PS: Keine Sorge, ich bin auch bloß ein Noob Geändert von BlitzPacman (08.08.2013 um 13:23 Uhr). |
09.08.2013, 08:54 | #7 (permalink) |
Registriert seit: 05.11.2011
Beiträge: 235
|
Das Skript
Hallo MagicStyle,
wenn Du dein Skript fertig hast, kannst Du mir das dann bitte mal zeigen? Was Du machst, könnte ich auch ganz gut gebrauchen :-) Grüße Sol.LrMartyn
__________________
Achtung! Betrachtung des Quellcodes auf eigene Gefahr. Für Übelkeit, Erbrechen oder Kopfschmerzen übernehme ich keine Haftung ------ https://www.sol-diers.com |
09.08.2013, 18:13 | #8 (permalink) |
Registriert seit: 26.09.2012
Beiträge: 120
|
Brauch doch noch Hilfe .(
Hi Sol.LrMartyn,
ich habe dieses Script nur erstellt um diverse dinge zu begreifen. Da ist nichts interessantes dabei. Habe lediglich mehrere Fahrzeuge aufgestellt und die Lichter beginnen aufeinmal alle zu flackern sobald ich einen Auslöser betrete. Habe das mit den mehreren Autos außerdem primitiv gelöst da ich leider noch nicht weiss wie ich es besser machen könnte, vielleicht könntest du oder jemand anderes mir hierbei kurz helfen ? Hier das Script, nochmal danke an BlitzPacman : Code:
aus = 0; player globalChat "LICHTER FLACKERN!"; while {aus == 0} do //bis der Spieler das Licht ausschaltet, wird das Licht flackern { player action ["lightOn", Auto01]; player action ["lightOn", Auto02]; player action ["lightOn", Auto03]; player action ["lightOn", Auto04]; player action ["lightOn", Auto05]; player action ["lightOn", Auto06]; player action ["lightOn", Auto07]; player action ["lightOn", Auto08]; player action ["lightOn", Auto09]; player action ["lightOn", Auto10]; player action ["lightOn", Auto11]; player action ["lightOn", Auto12]; player action ["lightOn", Auto13]; player action ["lightOn", Auto14]; player action ["lightOn", Auto15]; sleep random 0.5; player action ["lightOff", Auto01]; player action ["lightOff", Auto02]; player action ["lightOff", Auto03]; player action ["lightOff", Auto04]; player action ["lightOff", Auto05]; player action ["lightOff", Auto06]; player action ["lightOff", Auto07]; player action ["lightOff", Auto08]; player action ["lightOff", Auto09]; player action ["lightOff", Auto10]; player action ["lightOff", Auto11]; player action ["lightOff", Auto12]; player action ["lightOff", Auto13]; player action ["lightOff", Auto14]; player action ["lightOff", Auto15]; sleep random 0.5; }; Gruß M.S. Geändert von MagicStyle (09.08.2013 um 18:15 Uhr). |
10.08.2013, 05:53 | #9 (permalink) |
Registriert seit: 12.07.2004
Ort: Wien
Beiträge: 1.917
|
Code:
Licht_ein_aus = true; player globalChat "LICHTER FLACKERN!"; _autos = [Auto01,Auto02,Auto03, usw.]; while {Licht_ein_aus} do //bis der Spieler das Licht ausschaltet, wird das Licht flackern { {player action ["lightOn", _x]} forEach _autos; sleep random 0.5; {player action ["lightOff", _x]} forEach _autos; sleep random 0.5 }; |
10.08.2013, 11:35 | #10 (permalink) |
Registriert seit: 26.09.2012
Beiträge: 120
|
THX ! So geht das also!
Das Problem das man für Array alle Autos durchnummerieren muss besteht aber leider weiterhin. Vielleicht schreibe ich später mal nen Visual Basic Programm das mir das löst. Danke! Geändert von MagicStyle (10.08.2013 um 12:21 Uhr). |
10.08.2013, 12:49 | #11 (permalink) |
Registriert seit: 12.07.2004
Ort: Wien
Beiträge: 1.917
|
Es geht natürlich noch einfacher, aber sich wollte dich nicht überfordern. Mit call compile kann man einen String als Code ausführen.
Du musst deine Autos von Auto1 bis Auto15 durchnummerieren. Code:
for "_i" from 1 to 15 do { call compile (format["player action ['lightOn', Auto%1]",_i]) }; |
12.08.2013, 07:09 | #13 (permalink) |
Registriert seit: 05.11.2011
Beiträge: 235
|
Code:
for "_i" from 1 to 15 do
__________________
Achtung! Betrachtung des Quellcodes auf eigene Gefahr. Für Übelkeit, Erbrechen oder Kopfschmerzen übernehme ich keine Haftung ------ https://www.sol-diers.com |
12.08.2013, 14:27 | #15 (permalink) |
Registriert seit: 05.11.2011
Beiträge: 235
|
Beispiel kommt sobald ich wieder daheim bin :-)
__________________
Achtung! Betrachtung des Quellcodes auf eigene Gefahr. Für Übelkeit, Erbrechen oder Kopfschmerzen übernehme ich keine Haftung ------ https://www.sol-diers.com |
01.09.2013, 11:51 | #17 (permalink) |
Registriert seit: 05.11.2011
Beiträge: 235
|
Also wenn ich mich jetzt noch recht entsinne () dann könnte Dir folgendes Beispiel helfen:
PHP-Code:
Hinweis: In diesem Skript ist grade ein Helikopter von ArmA 3 "eingebaut".
__________________
Achtung! Betrachtung des Quellcodes auf eigene Gefahr. Für Übelkeit, Erbrechen oder Kopfschmerzen übernehme ich keine Haftung ------ https://www.sol-diers.com |
04.09.2013, 11:12 | #19 (permalink) |
Registriert seit: 05.11.2011
Beiträge: 235
|
Ich hab ja extra gemeint -> Wenn ich wieder daheim bin...
__________________
Achtung! Betrachtung des Quellcodes auf eigene Gefahr. Für Übelkeit, Erbrechen oder Kopfschmerzen übernehme ich keine Haftung ------ https://www.sol-diers.com |
04.09.2013, 14:11 | #20 (permalink) |
Jop das Beispiel sieht gut aus, Standardfall für eine Schleife über alle Inhalte eines Elementes. Du kannst alternativ die Kurzschreibweise für die for-Schleife nehmen, die finde ich inzwischen schöner und soll ja angeblich auch schneller sein
also Code:
for "_i" from 0 to (count array)-1 do { wasauchimmer; }; Code:
{ position_temp = _x; machewasauchimmer; } forEach array; Fazit: Du würdest Sol.LrMartyn Codes niemals mit einer for-Schleife machen *g* Aber das weißt du ja schon, hier wird der Thread langsam unübersichtlich, es ging ja darum, das Array automatisch durch eine for-Schleife erstellen zu lassen, damit du quasi die Variablen Auto1 bis Auto15 automatisch anlegen kannst, ohne sie per Hand schreiben zu müssen. Da hilft dir auch Sol.LrMartyn Code nicht weiter, denn auch da zähle ich ja nur den Inhalt. Also am besten bei mehreren Objekten: 1. Im Editor einen gleichen Namen mit einer laufenden Nummer geben 2. im Skript oder in der Init.sqf einmal das Array durch eine for-Schleife anlegen mithilfe von format. 3. Im weiteren Verlauf nur mit der Länge über count array arbeiten. Geändert von [GNC]JamesRyan (04.09.2013 um 14:17 Uhr). |
|
Stichworte |
auslöser, auto, endlosschleife, flackern, licht |
Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1) | |
Themen-Optionen | |
Ansicht | |
|
|
Ähnliche Themen | ||||
Thema | Autor | Forum | Antworten | Letzter Beitrag |
Beta-Patch für OpA erschienen | det99 | Community | 1429 | 18.07.2014 16:51 |
Script wirklich nur auf Server ausgeführt? | Sol.LrMartyn | Editing & Scripting | 1 | 02.08.2013 14:11 |
Day & Weather Script | Moerderhoschi | Editing & Scripting | 13 | 02.12.2012 10:29 |
Ammobox Script problem | G36Firestorm | Editing & Scripting | 11 | 18.07.2011 15:04 |
marker über script erzeugen | hypercop | Editing & Scripting | 2 | 28.08.2010 22:40 |