05.04.2013, 11:17 | #1 (permalink) |
Registriert seit: 09.12.2006
Beiträge: 84
|
Verschiedene Probleme
Hallo zusammen ,
mittlerweile erstelle ich schon gute Einzelspieler und Multiplayer Missionen, aber es gibt immer wieder kleinere Probleme mit verschiedenen Ideen die ich Umsetzen möchte. Ich hoffe ihr könnt mir bei folgenden Problemen helfen. Das erste Problem was ich habe ist das ich eine Art Waffenkammer gebaut habe in der ein Auslöser prüft ob die Variable Wkaopen (public Variable in der init.sqf auf 1) = 1 oder 0 ist. Ist diese auf 0 ist die Waffenkammer zugänglich, ist diese auf 1 dann wird ein Teleport Script ausgeführt und der Spieler landet wieder 10 Meter vor der Waffenkammer. Dieser Auslöser ist auf jedermann mehrfach eingestellt, bei Aktivierung wird dieser Aufruf gestartet: Code:
if (isServer) then {nul= execVM ""scripts\teleport.sqf""}; Code:
"if (!isDedicated) then {nul= execVM ""scripts\teleport.sqf""}; Hier der Inhalt vom teleportscript: Code:
if (wkaopen==1) then { hint "!!!Halt!!! Sie haben keine Berechtigung zum Zutritt in die Waffenkammer! Gehen Sie zu Ihrem Einheitsfuehrer"; // Auswahlmarker wohin ! _dest = "wka_spawn"; // wka_spawn marker name auf der map // Setzen der Winkelvariable _dir = random 359; // Bewegen der teleportierenden Einheit player SetPos [(getMarkerPos _dest select 0)-1*sin(_dir),(getMarkerPos _dest select 1)-1*cos(_dir)]; } else { hint "Willkommen in der Waffenkammer, bitte nur das befohlene Mission Equipment entnehmen!"; }; Das zweite Problem was ich habe ist, dass ich über einen Trigger dem Einheitsführer Actionseinträge zur Verfügung stelle. Es funktioniert auch das er nur diese Einträge sieht, aber das was mich verzweifeln lässt ist das wenn ein anderer Spieler in die Nähe vom Einheitsführer ist und diesen anschaut plötzlich auch diese Actionseinträge sieht und auch ausführen kann! Schaut dieser wieder in eine andere Richtung sind die Einträge wieder verschwunden ! Ist das ein Bug oder ein Fehler meinerseits ? Nun noch eine letzte frage: Ich habe 50 Fahrzeuge die alle durchnummeriert sind mit f1 -f50 diese möchte ich alle abschliessen per script, diese mach ich momentan über einen Script wo ich jedes Fahrzeug mit: Code:
f1 lock true; f2 lock true; verschliesse. Ich habe versucht das ganze in einem Array zumachen aber habe noch keine Erfahrung mit Arrays, hat jemand eine idee wie ich das machen kann ? Im Voraus Vielen Dank für euere Antworten, Gruß Togo |
05.04.2013, 16:26 | #2 (permalink) |
Registriert seit: 12.07.2004
Ort: Wien
Beiträge: 1.917
|
Ändere den Auslöser wie im Code angeführt und kopiere in das Skript den Code.
Code:
// Aufruf des Skripts in folgendem Auslöser: // // Achse A und B: 10 // Aktivierung : Jeder | Einmal (anstelle von Jeder kann auch eine Seite gewählt werden) // Bedingung : true // Name : Trigger1 // Bei Akt. : temp = [Trigger1, "wka_spawn"] execVM "scripts\teleport.sqf" // // Verwendet public Variable: wkaopen private ["_triggerName","_markerName","_dir"]; _triggerName = _this select 0; // Trigger-Name _markerName = _this select 1; // Marker-Name while {true} do { waitUntil {player in list _triggerName}; if (wkaopen==1) then { hint "!!!Halt!!! Sie haben keine Berechtigung zum Zutritt in die Waffenkammer! Gehen Sie zu Ihrem Einheitsfuehrer"; _dir = random 359; // Setzen der Winkelvariable // Bewegen der teleportierenden Einheit: player SetPos [(getMarkerPos _markerName select 0)-1*sin(_dir),(getMarkerPos _markerName select 1)-1*cos(_dir)] } else { hint "Willkommen in der Waffenkammer, bitte nur das befohlene Mission Equipment entnehmen!"; waitUntil {!(player in list _triggerName)} }; sleep 1 } In den Trigger, der dem Einheitsführer Actionseinträge zur Verfügung stellt, muss in der Bedingung stehen: player == NameDerFüherfigur {_x lock true} forEach [f1, f2 ,usw.]; Geändert von Vienna (06.04.2013 um 17:48 Uhr). |
05.04.2013, 16:34 | #3 (permalink) |
Registriert seit: 11.03.2005
Ort: HH
Alter: 52
Beiträge: 1.930
|
Moin..
Zu 1) Ist klar das jeder gebeamt wird, da im Script PLAYER steht.. und Player ist nunmal jeder, der zur Zeit auf dem Server ist. Du musst also denjenigen rauspicken, der in dem Auslöser steht. Es gibt einige Möglichkeiten dies zu tun... zB: Code:
_unit=TRIGGERNAME select 0; Der addAction-Befehl ist erweiterbar... wie sehr, findest Du im Wiki... ich würds so machen: Code:
ID01 = this addAction ["ActionName", "script.sqf", true, 0, false, true, "", "player == leader (group player)"]; Code:
for "_i" from 1 to 50 do { _varName = call compile format ["'f%1'", _i]; _varName lock true; }; |
06.04.2013, 09:07 | #4 (permalink) |
Registriert seit: 09.12.2006
Beiträge: 84
|
Hallo Vienna, Hallo Buliwyf,
vielen Dank für eure schnelle Antwort, aber ich komme nicht mit euren Lösungsansätzen bezüglich des Trigger / Teleports zurecht. Vienna: Ich kann mir in etwa vorstellen was in der Skript Änderung von Dir passiert, was mir aber nicht einleuchtet ist das mit dem Trigger, hier ist die Größe A10 B10 und Auslösung keiner, klar dieser löst direkt aus durch True und wiederholt das Script alle 1sec.. Soweit so gut, wie nenne ich den Trigger was übermittelt das Player 1 im Bereich ist? In meiner Mission habe ich den ganzen Bereich der Waffenkammer mir einem Trigger belegt mit einer Größe von A15 B25, wenn der Bereich betreten wurde löste der Trigger das Script aus , bei deinem Lösungsansatz fehlt mir dieser Trigger. Buliwyf: Auch dein Lösungsansatz klingt gut aber mit der Umsetzung hapert es. Ich verstehe noch nicht die Arbeit mit Arrays und auch nicht das mit den Variablen _Variablenname. Arbeite ich damit kommt meist die Fehlermeldung: lokale Variable im Globalen Space oder so, das ist mir noch nicht so verständlich. Ich habe mein Missionstemplate mal als Anhang eingefügt. Vielleicht habt jemand auch ein paar Beispiele. Gruß Togo Geändert von Togo (06.04.2013 um 09:12 Uhr). |
06.04.2013, 18:03 | #5 (permalink) |
Registriert seit: 12.07.2004
Ort: Wien
Beiträge: 1.917
|
Bei Aktivierung beim Auslöser ist mir ein Fehler unterlaufen. Es muss "Jeder" oder eine Seite gewählt werden. Ich habe das oben im Post berichtigt.
Die Bedingung des Triggers wird im Skript durch diese Zeile ersetzt: waitUntil {player in list _triggerName}; Das Skript stoppt hier so lange, bis der player (das ist der Spieler auf dem jeweiligen PC) im Triggerbereich ist. Dadurch stoppt das Skript auf den anderen PCs weiterhin, wenn ein Mitspieler im Trigger-Berech ist. Die Abfrage list TriggerName gibt ein Array zurück, welches die Einheiten gemäß der Aktivierung enthält, die sich im Trigger-Bereich aufhalten. |
07.04.2013, 12:37 | #6 (permalink) |
Registriert seit: 12.07.2004
Ort: Wien
Beiträge: 1.917
|
Noch was zu 3), wie es Buliwyf bereits erwähnt hat:
Skript fahrzeugstatus.sqf Code:
private ["_lock","_info","_code"]; if (fahrzeugstatus == 1) then { _lock = "true"; _info = "Fahrzeuge benutzbar" } else { _lock = "false"; _info = "Fahrzeuge abgeschlossen" }; for "_i" from 1 to 47 do { _code = format ["f%1 lock %2", _i, _lock]; call compile _code }; hint _info Die Info kannst du aber mit einem Mehrfach Auslöser verwirklichen, der auf die public Variable fahrzeugstatus anspricht. Die Info ist dort über "Bei Akt" und "Bei Deak" auszugeben. Geändert von Vienna (07.04.2013 um 12:42 Uhr). |
08.04.2013, 20:04 | #7 (permalink) |
Registriert seit: 09.12.2006
Beiträge: 84
|
Hallo Vienna,
habe es gerade alles eingebaut und getestet, funktioniert einwandfrei !!! VIELEN DANK !!!! Hast du vieleicht auch eine Idee wie ich bei Multiplayer eine Art Respawnbegrenzung erstelle ? Ich möchte vor einer Mission festelegen das jeder z.b. nur 5 Leben (Respawn hat). Grüßle Togo |
08.04.2013, 20:50 | #8 (permalink) |
Registriert seit: 12.07.2004
Ort: Wien
Beiträge: 1.917
|
Das Skript soll lokal auf jedem Spieler PC laufen. Wenn die Respawnanzahl überschritten wurde, dann wird der Spieler auf eine Abseitsposition versetzt.
Man könnte das auch so abändern, dass der Spieler nach einer Strafzeit wieder in den Spielbereich versetzt wird. Nach jedem Respawn könnte sich diese Strafzeit auch verlängern. Skript Respawn_anzahl.sqf Code:
//Respawn-Zähler, Skript läuft lokal auf jedem Spieler-PC // //Aufruf in der init.sqf: [RespawnAnzahl,[AbsteitsPosition]] execVM "Respawn_anzahl.sqf"; if (isDedicated) exitWith {}; //Skript nur für PC mit Spieler private ["_r","_p","_t"]; _r = _this select 0; //Anzahl Respawn _p = _this select 1; //Abseitsposition _t = 0; //Respawn-Zähler while {true} do { waitUntil {!alive player}; _t = _t + 1; waitUntil {alive player}; if (_t > _r) then {player setPos _p} } Nach dem 2. waitUntil kannst du z.B. die Bewaffnung nach dem Respawn einbinden. Soll die Bewaffnung bereits beim Spielstart vorhanden sein, dann vor dem 1. waitUntil, |
25.04.2013, 21:31 | #9 (permalink) |
Registriert seit: 25.04.2013
Beiträge: 27
|
Hi,
folgendes Problem. Ich habe eine TVT Mission erstellt: Es gibt 3 Seiten: BLUFOR, OPFOR, CIV OPFOR hat den CIV als Geisel und muss ihn beschützen. BLUFOR muss den CIV von den OPFOR befreien. CIV muss zu einer Sicheren ZONE gebracht werden. Ich habe dafür 3 Auslöser positioniert die das ENDE der Mission auslösen sollen: CIV in ZONE: (funktioniert) Code:
- Auslöser erstellt - Achse A & B = 0 - Aktivierung: Zivilist - Typ: ENDE 1 - Bedingung: civ1 in thislist; - Bei Akt.:titletext["SEAL TEAM hat den Einsatz erfolgreich abgeschlossen!","PLAIN DOWN",1]; CIV wird getötet: (funktioniert) Code:
- Auslöser erstellt - Achse A & B = 0 - Aktivierung: Jeder - Typ: Verlieren - Bedingung: !alive civ1 - Bei Akt.:titletext["Die Rebellen haben keinen Arzt mehr und die NAVY SEALs konnten ihn nicht Retten, für beide Seiten GAME OVER","PLAIN DOWN",1]; BLUFOR wird getötet: (funktioniert nicht) Code:
- Auslöser erstellt - Achse A & B = 0 - Aktivierung: Jeder - Typ: Ende 2 - Bedingung: !alive navy1 && !alive navy2 && !alive navy3 && !alive navy4 && !alive navy5 && !alive navy6 && !alive navy7 && !alive navy8 && !alive navy9 && !alive navy10 - Bei Akt.:titletext["Alle SEALs wurden getötet","PLAIN DOWN",1]; Findet jemand den Fehler und kann mir sagen was ich anders machen sollte. Bin noch ein kleiner Noob mit dem Editor. Danke |
26.04.2013, 07:51 | #10 (permalink) |
Registriert seit: 12.07.2004
Ort: Wien
Beiträge: 1.917
|
Wenn Respawn erfolgt, dann kann die Bedingung so nicht funktionieren, außer alle BLUFOR sterben auf einem Schlag gemeinsam.
In der Datei description.ext die Zeilen mit Respawn und RespawnDelay entfernen, dann sollte kein Respawn mehr erfolgen. |
26.04.2013, 08:55 | #11 (permalink) |
Registriert seit: 25.04.2013
Beiträge: 27
|
Kann dann OPFOR dann noch Respawnen? Weil die brauchen die Fähigkeit. Geteste: OPFOR hat kein Respawn mehr.... BLUFOR = braucht kein Respawn OPFOR = braucht Respawn CIV = braucht kein Respawn Geändert von VidosQ (26.04.2013 um 09:01 Uhr). |
26.04.2013, 13:33 | #12 (permalink) |
Registriert seit: 12.07.2004
Ort: Wien
Beiträge: 1.917
|
Dann verlege den Marker respawn_west auf eine abgelegene Insel oder in ein abgesperrtes Gebiet und erstelle einen Auslöser der feststellt ob alle Westeinheiten in diesem Abseits-Bereich sind.
Der Auslöser und sein Code könnte dann so aussehen: Code:
Auslöser Achse A und B: Größe der Abseitszone Aktivierung : Jeder | Einmal Name : TriggerAbseits Bedingung : true Bei Akt. : hier den unten angeführten Code reinkopieren temp = 0 spawn { private ["_aktiveWestSpieler1","_aktiveWestSpieler2"]; while {true} do { _aktiveWestSpieler1 = []; { if (side _x == west and isPlayer) then { _aktiveWestSpieler1 = _aktiveWestSpieler1 + [_x] } } forEach playableUnits; _aktiveWestSpieler2 = []; { if (side _x == west and isPlayer) then { _aktiveWestSpieler2 = _aktiveWestSpieler2 + [_x] } } forEach list TriggerAbseits; if (count _aktiveWestSpieler1 == count _aktiveWestSpieler2) then { <<<< Spielende hier eintragen >>> }; sleep 1 } }; |
27.04.2013, 11:53 | #14 (permalink) |
Registriert seit: 12.07.2004
Ort: Wien
Beiträge: 1.917
|
Texte sind möglich und das Ende der Mission: http://community.bistudio.com/wiki/endMission
Variable die mit einem _Unterstrich beginnen sind lokale Variable und auf das jeweilige Skript begrenzt. Solche Variable können in Skripten den gleichen Namen haben, ohne sich gegenseitig zu beeinflussen. Du kannst diese Variablen nach belieben umbenennen. Globale Variable sind ohne Unterstrich am Beginn und in allen Skripten und Routinen im Programm auf dem jeweiligen PC sichtbar. Soll eine Wertänderung einer solchen globalen Variablen zu den anderen PCs übertragen werden, dann geschieht das nach der Wertänderung mit: publicVariable "VariableName"; |
Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1) | |
Themen-Optionen | |
Ansicht | |
|
|
Ähnliche Themen | ||||
Thema | Autor | Forum | Antworten | Letzter Beitrag |
Arma OA Arma2 und DayZ Probleme | c4al | DayZ | 19 | 01.07.2012 20:12 |
Probleme mit der A.C.E. Ausrüstung | Warmachine91 | Mods & Addons | 4 | 24.06.2012 12:50 |
ArmA II Probleme im Spiel und Patchen | Basti1254 | Technische Fragen & Probleme | 9 | 20.10.2011 01:41 |
Probleme nach Patch 1.55 | Jack Unger | Technische Fragen & Probleme | 8 | 02.12.2010 19:11 |
OA-KI Probleme u. Animation | c0rtes | Technische Fragen & Probleme | 11 | 03.10.2010 21:26 |