19.10.2010, 18:59 | #1 (permalink) |
Registriert seit: 04.10.2009
Beiträge: 28
|
2 Fragen: bezügl. setObjectTexture u. einem AA-Script
Moin,
ich bastle zurzeit an einer Mission, an deren Anfang ein Briefing stattfinden soll, dazu habe ich eine Leinwand, auf welcher ich über den setObjectTexture-Befehl Grafiken anzeige. Dazu verwende ich außerdem den addAction-Befehl, damit ich die Bilder auswählen kann. Das Problem dabei ist, dass die Grafik dann nur bei mir auftaucht, aber nicht bei den anderen Clients, wodurch jeder selbst die Aktion ausführen müsste, was nicht so ganz das ist was ich wollte. Nun will ich also wissen, wie ich es hinbekomme, dass wenn ein Client die Aktion ausführt, die Grafik bei allen angezeigt wird. Ich verwende 7 .sqf-Datein: 1. Code:
_obj = _this select 0; _diaMapID = _obj addAction ["Dia:Map","scripts\diashow\diamap.sqf",[_obj]]; _diaAAID = _obj addAction ["Dia:AA","scripts\diashow\diaAA.sqf",[_obj]]; _diaInfID = _obj addAction ["Dia:Inf","scripts\diashow\diainf.sqf",[_obj]]; _diaKonvoiID = _obj addAction ["Dia:Konvoi","scripts\diashow\diakonvoi.sqf",[_obj]]; _diaGuerID = _obj addAction ["Dia:Guer","scripts\diashow\diaguer.sqf",[_obj]]; Code:
_obj = _this select 0; _obj setObjectTexture [0,"pictures\lage_auf1_guer.paa"]; Dass funktioniert im Singleplayer auch ganz gut, nur im Multiplayer leider nicht. Ich wollte jetzt wissen wie ich das Multiplayer tauglich bekomme. Hier das Script: Code:
_gun = _this select 0; _xPos = _this select 1; _yPos = _this select 2; _zPos = _this select 3; _sleeptime = _this select 4; _shots = 0; _salvo = 0; _gun doWatch [(getPos _gun select 0)+_xPos,(getPos _gun select 1)+_yPos,_zPos]; sleep _sleeptime; while {alive _gun} do { while {_salvo<=4} do { while {_shots<50} do { _gun fire "2A14"; sleep 0.01; _shots = _shots+1; }; _gun addMagazine "1000Rnd_23mm_2A14_AP"; reload _gun; sleep 5; _gun doWatch [(getPos _gun select 0)+_xPos,(getPos _gun select 1)+_yPos,_zPos]; sleep 15; _shots = 0; _salvo = _salvo + 1; }; _salvo = 0; }; |
19.10.2010, 19:51 | #2 (permalink) |
hallo,
zu deinem diaprojektor: ich empfehle dir folgendes... erstelle dein actionmenü wie bisher, auch das mit den eigentlich recht umstäbndlichen 6 folgescripten. schreibe aber in das script welches über den actionbefehl ausgelöst wird nicht direkt den setObjectRexture befehl. aktiviere stattdessen eine variable. z.b. so: Code:
Action1 = true; publicVariable "action1"; Code:
Action1 ...die lösung ist nicht besonders elegant, aber ich denke es ist wichtiger das du verstehst was da passiert. (und das wird dir auch wichtiger sein als ein ausgefeiltes komplett neues script) ...und denke daran vorher die 6 variablen in der init zu definieren, also so: Code:
if (isServer) then { Action1 = false; Action2 = false; //usw... }; zu deinem 2. problem fehlt die auskunft wie du das script denn ausführst, bzw. es gestartet wird. mfg
__________________
Niemand hat die Absicht eine Tüte zu bauen! ___<<<A3 Wounding System>>>___ |
|
19.10.2010, 21:33 | #5 (permalink) |
Registriert seit: 12.07.2004
Ort: Wien
Beiträge: 1.917
|
Datentransfer zu den Mitspielern oder Server erfolgt mit dem Befehl PublicVariable. Damit können auch Befehle Übertragen werden.
z.B. einen Skriptaufruf: BefehlAnWest = {[2,"Hallo!"] execVM "TestSkript.sqf"}; publicVariable "BefehlAnWest" Jetzt benötigt man auf den PCs noch einen "Empfänger", der den Befehl in der Variablen ausführt. Das Ausführen geht so: call BefehlAnWest Im Beispiel ist so eine Sende- und Empfangsanlage vorhanden. Als "Sender" dienen Funk-Auslöser. Das Senden kann natürlich auch von einem Skript erfolgen. "Empfangen" wird die Variable in einem Auslöser, der nach dem Ausführen der "Sendung" die Variable wieder zurückstellt, damit der "Empfänger" wieder empfangsbereit ist. In deinem Fall könnte die "Sendung" so aussehen: BefehlAnWest = {Objektname setObjectTexture [0,"pictures\lage_auf1_guer.paa"]}; publicVariable "BefehlAnWest" |
17.11.2010, 17:39 | #8 (permalink) |
Registriert seit: 02.04.2003
Ort: San Francisco
Beiträge: 1.919
|
Und was hindert dich daran, den Code einfach so auf dem "sendenden" Rechner auszuführen? So als einfache Scriptzeile.
Der Sinn von mehreren endlos laufenden Triggern erschließt sich mir auch nicht wirklich. Und man könnte auch statt mehrerer Triggern einfach die auszuführenden Clients bzw. den Server als Parameter mit übergeben. |
18.11.2010, 18:18 | #11 (permalink) |
Registriert seit: 02.04.2003
Ort: San Francisco
Beiträge: 1.919
|
Viele Wege führen nach Rom, ja.
Aber den Weg den man wählt kann man vorwärts- oder rückwärtsgehend beschreiten. Wie auch immer, die Trigger-Lösung ist aus mehreren bereits aufgeführten Gründen nicht empfehlenswert. Xeno hat da schon einen sehr guten Grund angesprochen, nämlich die Abstände, mit denen ein Trigger eine Bedingung überprüft. Hier kann es unheimlich leicht dazu kommen, dass Code-Befehle überschrieben werden bevor sie abgearbeitet wurden! Was das für Konsequenzen hat, sollte klar sein. addPublicVariable ist die richtige Lösung, ob sie nun vllt etwas komplizierter umzusetzen ist oder nicht. Ich sehe ehrlich gesagt kaum einen Unterschied zwischen - mehrere Trigger bauen, Aktivierung und Deaktivierung eintragen und - in init.sqf schreiben: "varName" addPublicVariableEventHandler { call compile _this select 1 }; |
18.11.2010, 18:49 | #12 (permalink) |
Registriert seit: 04.10.2009
Beiträge: 28
|
Ist hier ja zu ner richtigen Diskussion ausgereif.
Also ich habe jetzt erstmal die lösung mit den Triggern übernommen, funktioniert auch, dauert halt nur kurz bis das bei den anderen Clients umgesetzt wird. Aber wenn das mit addPublicVariable die bessere Lösung ist, wie müsste das dann aussehen? Muss ich die Variablen, die ich nutze einfach nur wie von dir beschrieben in der init.sqf in den EventHandler einbinden und wäre dass dann immer der selbe befehl? Und wäre das die einzige Veränderung die vorgenommen werden muss? Achso hat eigentl. jemand eine Idee warum das 2. Script (Flak-Script) nicht auf einem Server funktioniert? Und könnte mir evt. wer veraten warum mein QRF-Script nicht funktioniert? Code:
if (isServer) then { _veh = _this select 0; _BLU = _this select 1; if (_BLU!=tv) then { _grpleader = driver _veh; _grp = group _grpleader; [_grp,2] setWaypointPosition [position _BLU, 0]; }; }; Edit: Zu dem QRF-Script habe ich den Fehler vermutlich gefunden. Geändert von Worgal (18.11.2010 um 18:53 Uhr). |
Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1) | |
Themen-Optionen | |
Ansicht | |
|
|
Ähnliche Themen | ||||
Thema | Autor | Forum | Antworten | Letzter Beitrag |
vergangene Zeit in einem Script | Pfandgiraffe | Editing & Scripting | 2 | 10.10.2010 16:46 |
marker über script erzeugen | hypercop | Editing & Scripting | 2 | 28.08.2010 23:40 |
Improved Bullet Cam Script | miromanu | Editing & Scripting | 3 | 21.08.2010 02:01 |
Heal/Repair Script / Einheiten in einem Radius zufällig generieren lassen | Noobfire | Editing & Scripting | 8 | 06.08.2010 16:22 |
Bomb-Cam Script | IntelQ9550Reaktor | Editing & Scripting | 3 | 02.08.2010 14:49 |