15.11.2011, 09:19 | #41 (permalink) |
Registriert seit: 12.07.2004
Ort: Wien
Beiträge: 1.917
|
Keine Ahnung ob das an mir oder an deinem Post liegt.
Versuche einmal folgendes: .) Füge beim zweiten Teil für den Server/Host eine Pause von 10 Sekunden ein (fette Zeile). .) Dann verlege den Beamteil aus dem ersten Serverteil in den Bereich nach dieser Pause. Falls das funktioniert, so kannst du versuchen die Pausezeit zu kürzen oder überhaupt zu entfernen. Code:
... ... // Synchronisierung des Spielstarts unter den Beteiligten PCs // ========================================================== if(isNil "mission_init") then //wenn diese globale Variable noch nicht vorhanden { mission_init = false; //dann die Variable auf false initialisieren publicVariable "mission_init"; //und zu den anderen PCs übertragen }; waitUntil {!isNil "BIS_fnc_init"}; //warten bis diese System-Variable initialisiert ist if (isServer) then //nur für den Server/Host { sleep 10; //und jetzt hier den Beam-Teil einfügen mission_init = true; //Server/Host setzt die Variable auf true publicVariable "mission_init"; //und überträgt sie zu den anderen PCs }; waitUntil {mission_init}; //warten bis Server/Host Initialisierung abgeschlossen finishMissionInit; //Mitteilung ans System dass die Initialisierung beendet |
15.11.2011, 09:55 | #42 (permalink) |
Registriert seit: 05.11.2010
Ort: Schweiz
Beiträge: 297
|
@Vienna: Habe den Beam gestern beim Testen schon verschoben (allerdings ohne Sleep). Hat auch nichts gebracht.
Interessanterweise scheint es bei Buliwyf zu funktionieren. Ich wäre wirklich froh, wenn sich jemand meine Mission kurz anschauen könnte. P.S: Wenn ich meine Mission downloaden will, bekomme ich übrigens genau dieselbe Meldung wie Du. Scheint also eher ein Problem des Forums zu sein. Soll ich sie im Unterforum "Usermade Missions" hochladen? Oder kann ich Dir sie per Mail schicken? |
16.11.2011, 08:36 | #44 (permalink) |
Registriert seit: 05.11.2010
Ort: Schweiz
Beiträge: 297
|
Erneuter Testlauf gestern Abend:
1. Initialbeamvariante "Auslöserbeam": Hier soll per folgendem Auslöser bei Spielbeginn gebeamt werden: - 10/10m, einmal, jeder, vorhanden, countdown (4/4/4 Sekunden) - BED: this and player in thislist - AKT: player moveInCargo Panzer1 --> Wie in Post #21 und #37 erwähnt, funktioniert diese Variante in etwa 50% der Fälle. 2. Initialbeam via "neuer" init.sqf: Hier sollen die Spieler via init.sqf (Post #34, #36 und Attachment im Post #38) in den Panzer1 gebeamt werden. --> Habe ich bisher nicht zum Laufen gebracht (es wird nur der Host in den Panzer1 gebeamt). Neue Erkenntnisse: Ich habe einen Verdacht, warum Variante 1 nur in 50% der Fälle funktioniert. Dank dem vielen Testen (ich habe mit drei Kumpels den ganzen Abend nichts anderes gemacht, als Missionen gestartet ), ist mir aufgefallen, dass häufig bei Missionsbeginn ein gelbes oder rotes Kettenglied auf dem Bildschirm angezeigt wird. Meine Vermutung: Ist einer der Clients (wegen den angezeigten "Verbindungsunstimmigkeiten") zum Zeitpunkt wo der Auslöser zündet, vom Host nicht als "player" erkannt, wird er nicht in den Panzer1 gebeamt. Alle die eine normale Verbindung haben, werden gebeamt. Sollte dies tatsächlich der Fall sein, könnte ich das evtl. beheben, indem ich den Auslöser wie folgt ändere: - 10/10m, mehrmals, jeder, vorhanden, countdown (0/0/0 Sekunden) - BED: this and player in thislist - AKT: player moveInCargo Panzer1 Ich rechne damit, dass die Clients mit "Verbindungsunstimmigkeiten" dank der Mehrmals-Auslösung in den Panzer1 gebeamt werden, sobald sie wieder eine saubere Verbindung zum Host haben. Was haltet ihr von diesem Versuch (werde das bei nächster Gelegenheit testen)? |
16.11.2011, 11:35 | #45 (permalink) |
Registriert seit: 12.07.2004
Ort: Wien
Beiträge: 1.917
|
Man muss testen ob der Auslöser bei seiner Aktivierung bereits alle Player erkennt.
Erstelle folgenden Auslöser: - 0/0m, keine, einmal - (0/0/0 Sekunden) - BED: true - AKT: den folgenden Code reinkopieren Code:
temp = 0 spawn { private ["_start","_aktiv","_namen","_erst"]; if (isServer) then { _erst = true; while {true} do { _aktiv = 0; _namen = "\n\nNamen der Aktuellen:"; { if(isPlayer _x)then { _aktiv = _aktiv + 1; _namen = _namen + "\n" + name _x } } forEach playableUnits; if (_erst) then {_start = _aktiv; _erst = false}; hint format [ "Aktive Soldaten:\n\nbeim Auslöserstart: %1\n\naktuell: %2%3", _start, _aktiv,_namen ]; sleep 1 } } } Wichtig ist dabei die Anzeige beim Auslöserstart. Ist die Anzahl der Spieler hier beim Host bereits korrekt, egal ob sie ein Verbindungsproblem haben oder nicht, dann wäre ein Abwarten einer Rückmeldung aller Spieler möglich, um erst dann den Spielstart (und das Beamen) freizugeben.Eigentlich habe ich ja erwartet, dass das Funktionsmodul so einen Vorgang beinhaltet. Übrigens, bei deinen Auslösern mit Pause würde ich nicht "Countdown", sondern "Zeitüberschreitung" nehmen. Bei "Countdown" wird nach der Pausezeit immer ausgelöst. Bei "Zeitüberschreitung" nur wenn nach der Zeit noch Anwesenheit vorliegt. Das könnte bei einem Einmal-Auslöser ein Problem beinhalten. Bei BED: muss player in thislist ausreichen. |
16.11.2011, 16:07 | #46 (permalink) |
Registriert seit: 05.11.2010
Ort: Schweiz
Beiträge: 297
|
Das habe ich absichtlich gemacht. Wenn ich "Zeitüberschreitung" wähle, rennen mir die ungeduldigen Spieler aus dem Auslöserbereich (dann kann er nicht mehr zünden). Mit "countdown" spielt das keine Rolle. Ich werde mal versuchen die Anzahl Spieler festzustellen, wie von Dir vorgeschlagen. Ich befürchte aber, dass das Resultat bei jedem Missionsstart anders sein wird (wie sonst ist zu erklären, dass der Beam nur zu 50% funktioniert?). Im Moment muss ich jedoch ehrlich gestehen, dass ich meine Kumpels nicht schon wieder mit Testen belasten kann/will (sie haben mir nun schon vier aufeinanderfolgende Abende dafür geopfert). Ich beginne langsam aber sicher die Flinte ins Korz zu werfen, bzw. andere Missions-Starts ins Auge zu fassen. |
16.11.2011, 16:28 | #47 (permalink) |
Registriert seit: 05.11.2010
Ort: Schweiz
Beiträge: 297
|
Übrigens habe ich noch etwas, das vielleicht weiterhilft. In meiner Verzweiflung suchte ich einen Weg, Einheiten zu beamen, die ganz sicher vorhanden sind (anstatt die player, bei welchen ich nie weiss, ob sie nun da/verbunden sind oder nicht). Ich habe daher folgendes gemacht:
Ich habe die spielbaren Einheiten S1 bis S4 in einer Reihe aufgestellt (wie beim Stafettenlauf) und jedem einen Wegpunkt in 100m Entfernung gegeben (achtlos, vollgas). Danach habe ich bei jeder Einheit einen Auslöser über den Startplatz gelegt: 4x4m, Einmal, Zeitverzögerung, 8/8/8 Sekunden BED: S1 in thislist AKT: S1 moveInCargo Panzer1 So sollte die Einheit mit dem Namen S1 in den Panzer gebeamt werden, wenn sie nach 8 Sekunden noch am Startplatz stand (und das tat sie logischerweise nur, wenn sie nicht KI gesteuert war), Ungeachtet der Tasache, ob sie nun als player "erkannt" wird oder nicht. Das Unglaubliche dabei: Obwohl alle drei Spieler (1 Host, 2 Clients) die Einheiten S1, S2 und S3 besetzten (und diese auch am Startplatz stehen blieben!!!), wurden nicht immer alle in den Panzer gebeamt. Eben abhängig davon, ob das Kettensymbol da war oder nicht. Wie ist DAS denn bitte zu erklären? Ich habe doch dem Auslöser gesagt, dass er S1 beamen soll, nicht "player". Und S1 war da! Ich konnte ihn SEHEN. Ich versteh's einfach nicht.... ---> |
18.11.2011, 09:17 | #49 (permalink) |
Registriert seit: 05.11.2010
Ort: Schweiz
Beiträge: 297
|
Wieder Fehlanzeige! Langsam stellt sich mir die Frage, wie die Auslöser funktionieren. Ich als non-IT Mensch stelle mir das so vor: Ein Student sitzt an einem Tisch mit einer Lampe darauf und einem Knopf daneben. Er hat Anweisung immer dann auf den Knopf zu drücken, wenn die Lampe aufleuchtet. Auf den Beamauslöser umgemünzt heisst das: - Sobald die Lampe aufleuchtet (player in thislist) - Drücke Knopf (player moveInCargo Panzer1) Unterschied Einfacher/Mehrfacher Auslöser: Einfacher Auslöser würde bedeuten, dass der Student nur beim ersten Aufleuchten auf den Knopf drückt. Beim zweiten, dritten und allen weiteren Malen hingegen nicht. Beim mehrfachen Auslöser drückt er jedesmal auf den Knopf, wenn die Lampe aufleuchtet. Aber achtung jetzt kommts: Was passiert, wenn die Lampe schon brennt, wenn der Student ins Zimmer geführt wird? Meiner Meinung nach hat er keinen Anlass auf den Knopf zu drücken, weil der Impuls (das Aufleuchten der Lampe) gar nicht stattfindet. Die Lampe brennt schon! Anders ausgedrückt: Auslöser zünden wahrscheinlich nur dann, wenn sie einen Impuls bekommen (also im Moment, wo sich die Bedingung erfüllt). Ist sie jedoch einmal erfüllt, zündet er nicht ständig. Das scheint auch bei Mehrfachauslöser so zu sein. Anhand eines Mehrfachauslösers (z.B. mit einem angenommenen Radius von 8000m) lässt sich das nachvollziehen: Wenn ich dem Auslöser sage, dass er ein Objekt zu einem fahrenden Auto setzen soll (z.B. mit setpos, getpos), welches sich innerhalb des Auslöserradius bewegt, unter der Bedingung, dass das Objekt im Auslöserbereich ist, so wird das nur genau 1 x gemacht. Das Objekt wandert zum Auto, bleibt aber dann dort stehen, während das Auto weiterfährt. Es wird nicht ständig nachgebeamt. Damit der Mehrfachauslöser wieder seine Aufgabe tut, müsste das Objekt zuerst wieder aus dem Auslöserbereich und wieder hinein (sprich es müsste ein neuer Impuls erfolgen). Lange Rede kurzer Sinn. Ich vermute etwas in dieser Richtung (vielleicht hervorgerufen durch die Verbindungsprobleme/Kettensymbol), das die Auslöser beim Missionsbeginn die Spieler nur teilweise beamen. Mein nächster Versuch: Da in allen meinen bisherigen Versuchen der player bei Missionsbeginn im Auslöserbereich stand, war die Bedingung für den Auslöser (meiner oben genannten Theorie nach) von Anfang an erfüllt. Manchmal erkannte der Auslöser dies als Impuls, manchmal eben nicht. Das ändere ich jetzt. Ich werde nun die Bedingung (player in thislist) erst ein paar Sekunden nach dem Missionsstart "produzieren". Ich möchte jedoch nicht, dass sich die Spieler bei Missionsbeginn irgendwo hin begeben müssen, um in den Auslöserbereich zu gelangen. Deshalb kehre ich den Spiess um. Ich lasse den Auslöser am player vorbeilaufen. Dazu attache ich den Auslöser an eine nicht spielbare KI, die an den potentiellen playern vorbeiläuft, und so den Auslöserbereich über die Player schiebt. So müsste der Impuls für den Auslöser ganz sicher erst nach dem Spielstart geschehen, was hoffentlich einen erfolgreichen Beam zur Folge hat. Sorry für den langen Text. Ich hoffe halt, dass meine Gedanken evtl. zu weiteren Lösungsansätzen führen. |
18.11.2011, 14:50 | #50 (permalink) |
Registriert seit: 05.11.2010
Ort: Schweiz
Beiträge: 297
|
Neue Idee
Was würdet ihr von dieser Methode hier halten? In der init.sqf die globale Variable "beammoeglich" auf true stellen. Auslöser (einfach, 0/0/0) BED: true AKT: [] exec "initialbeam.sqf"; Die "initialbeam.sqf" würde dann etwa so aussehen: Code:
if !(isServer) then { exit }; #start {if ((player not in Panzer1) and beammoeglich) then {player moveInCargo Panzer1} forEach player; ~0.5 goto "start" Code:
BED: (player in Panzer1) forEach player AKT: beammoeglich=false; publicVariable "beammoeglich" Ich vermute zudem, dass meine Codevorschläge jedem einigermassen begabten "Code-Sachverständigen" die Haare zu Berg stehen lassen. Stimmts? |
18.11.2011, 15:08 | #52 (permalink) |
Registriert seit: 05.11.2010
Ort: Schweiz
Beiträge: 297
|
äh, danke Xeno. Ich seh' schon. Ich sollte mich mal ins Thema scripting einlesen. So wird das nix. Mal schauen, ob ich den Mut dazu aufbringe (und Lust habe in sowas zu investieren, obwohl ich "nur" eine Arma-Mission bauen will)... Geändert von Xeno (03.01.2014 um 09:49 Uhr). |
18.11.2011, 16:07 | #53 (permalink) |
Registriert seit: 12.07.2004
Ort: Wien
Beiträge: 1.917
|
Jetzt vergiss für den Spielstart einmal den Auslöser, sondern geh so vor:
Kopiere folgenden Code in die Initialisierungszeile der Soldaten, welche fallweise als Spieler in den Panzer beamen sollen. Code:
temp = [this,Panzer1] spawn { private "_time", _time = 60; while {_time > time} do { if (player==_this select 0 and player==vehicle player) then { player moveInCargo (_this select 1); if (player in crew (_this select 1)) then {_time = 0} }; sleep 1 } } |
21.11.2011, 00:09 | #54 (permalink) |
Registriert seit: 05.11.2010
Ort: Schweiz
Beiträge: 297
|
Hi Vienna Dein Ansatz ist genial. Jetzt schon vielen Dank dafür. Ich habe das sofort in meine beiden betroffenen Missionen eingebaut und am Sonntag Abend mit meinen Kollegen getestet. Nun werden alle Spieler beim Missionsbeginn in den Panzer1 gebeamt... Aber: Einen Haken hat die Sache. Wenn die Spieler im Panzer1 sitzen, sollte doch die Routine beendet werden, oder? Dies klappt bisher nur für den HOST. Sprich, ist der Host im Panzer, kann er aussteigen ohne Probleme. Steigen jedoch die Clients aus, werden sie sofort wieder in den Panzer gebeamt. Sobald die 60 Sekunden um sind, können auch die Clients aus dem Panzer aussteigen. ich vermute, das Problem muss irgendwo bei dieser Zeile liegen: Code:
if (player in crew (_this select 1)) then {_time = 0} Wenn das noch ausgemerzt werden kann, ist es die ultimative Lösung für einen Initialbeam . Ich werde selbst auch weiterhin versuchen an Deinem Codeschnipsel herumzuschrauben. Irgendwann wird's schon klappen. Nochmals Danke und allen einen guten Wochenstart. |
21.11.2011, 09:12 | #55 (permalink) |
Registriert seit: 12.07.2004
Ort: Wien
Beiträge: 1.917
|
Wie du richtig erkannt hast liegt das Problem an dieser Zeile. Offensichtlich hat das Panzer-Objekt bei den Clients nach dem Einsteigen eine andere Identität.
Andere diese Zeile einmal so: if (player != vehicle player) then {_time = 0} |
21.11.2011, 11:24 | #56 (permalink) |
Registriert seit: 12.07.2004
Ort: Wien
Beiträge: 1.917
|
Bei der oben genannten Änderung ist es besser auch die erste Abfrage wie folgt zu ändern:
Code:
temp = [this,Panzer1] spawn { private "_time", _time = 60; while {_time > time} do { if (player == _this select 0) then { player moveInCargo (_this select 1); if (player != vehicle player) then {_time = 0} }; sleep 1 } } |
22.11.2011, 09:10 | #57 (permalink) |
Registriert seit: 05.11.2010
Ort: Schweiz
Beiträge: 297
|
So klappts. Danke Vienna! Habe gestern nochmals mit meinen Kumpels getestet. Zwei Missionen mit diesem Mechanismus ausgerüstet und jede etwa vier oder fünf Mal frisch gestartet. Alle Spieler (2 Clients und 1 Host) wurden jedesmal erfolgreich in den Panzer gebeamt. Auch anschliessendes Aussteigen, wieder Einsteigen und respawnen (ausserhalb und innerhalb des Panzers) funktioniert perfekt. Nochmals 'merci' an alle Beteiligten. Bin wirklich froh, eine Lösung zu haben. Grüsse aus der Schweiz |
Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1) | |
Themen-Optionen | |
Ansicht | |
|
|