08.01.2013, 10:27 | #1 (permalink) |
Registriert seit: 05.11.2010
Ort: Schweiz
Beiträge: 297
|
addaction für player (wenn mehrere beieinander stehen)
Hallo zusammen. Ich habe eine Frage zur Lokalität im MP.
Ich möchte einen Rucksack in meiner Mission einbauen (attached an ein Fahrzeug), an welchem sich die Spieler - mittels Addaction-Eintrag - verarzten können. Quasi analog des Standard-Addactions an einem Vanilla-Sanitätsfahrzeug. Bei meiner Version (siehe unten) befürchte ich jedoch Lokalitäts-Probleme im MP. Und da ich es im Moment mit anderen menschlichen playern nicht testen kann wollte ich hier mal die Cracks fragen (ist für die wahrscheinlich Peanuts). Ich habe bisher einen Auslöser (BLUFOR in thislist, mehrfach) mit der Bedingung: Code:
player addAction ["verarzten","Heilscript.sqf",[],1,true,true,"","_this == player && player distance Sanirucksack < 2"] Code:
player switchMove "animationsname_habe_ich_zuhause_notiert"; player setDamage 0; Offene Fragen:
Grüsse aus der Schweiz Wolkenbeisser Geändert von Wolkenbeisser (08.01.2013 um 10:52 Uhr). Grund: Schreibfehler |
08.01.2013, 12:06 | #3 (permalink) |
Registriert seit: 16.07.2010
Beiträge: 305
|
Dieser Befehl wird nicht übers Netzwerk verteilt und somit sollte es keine Probleme geben (Das steht auf der Seite der Beschreibungen der Befehle meistens oben z.B.: EL). Deine Lösung mit einem zusätzlichen Auslöser ist aber nicht gerade sauber, ich würde alles nur in einen Script machen. Dann könntest du dir auch eine Dauerschleife sparen.
|
08.01.2013, 13:43 | #4 (permalink) |
Registriert seit: 05.11.2010
Ort: Schweiz
Beiträge: 297
|
Tja, stehen tut es da schon, nur mit dem Verstehen haperts manchmal ein bisschen. Mich (als Laienscripter) macht z.B. unsicher, ob es einen Unterschied macht, ob ich im Script direkt Code:
player switchMove "blabla" Code:
_caller = _this select 1 Code:
_caller switchMove "blabla" Oder ist jetzt einfach mein Gebilde als Anwendungsbeispiel von '_caller' ungünstig, weil player schon eine lokale Variable ist? Ich blick hier noch nicht so ganz durch. Ich verstehe es zwar im Ansatz, kann aber die Auswirkungen, bzw. den Unterschied nicht wirklich abschätzen. Ah, und noch etwas: Muss ich hier jetzt dem Script sagen, dass es nur lokal auf jedem Client ausgeführt werden muss (also isServer = exit)? Wie verhält sich ein Script defaultmässig, wenn man solche Dinge nicht definiert? Deshalb nochmals klar gefragt. Funzt mein Beispiel (genau so reibungslos, wie wenn ich mit '_caller' arbeiten würde) demnach so, wie ich mir das vorstelle? Sorry die vielen Fragen. Ich versuche hier natürlich auch gleich etwas zu lernen. |
08.01.2013, 15:44 | #7 (permalink) |
Registriert seit: 16.07.2010
Beiträge: 305
|
Hast du schon mal dieses Zeichen gesehen?
Wenn nicht, dann fahre mit der Maus auf Buliwyf's verlinkte Seite drüber. Dann wirst du sehen, dass dieser addAction Befehl nicht über das Netzwerk verbreitet wird. Das Problem liegt hierbei nicht am Befehl, sondern an dein Auslöser, denn so würde der Server auch den addAction Befehl ausführen, da du in der Bedingung den Server nicht ausschließt. Dein Script würde auf dem Server aber nicht ausgeführt werden, da der Server in der Bedingung des addAction Befehls ausgeschlossen wird. Außerdem: Du kannst Player dafür nehmen, da durch die Bedingung des addAction Befehls nur der Player das Script aufrufen kann. |
08.01.2013, 15:54 | #8 (permalink) |
Registriert seit: 05.11.2010
Ort: Schweiz
Beiträge: 297
|
äh, wie würdest Du das ganze dann starten? In der Init? Oder durch ein angepasstes (wie) verändertes Script? Das sind genau die Dinge, wo mir das knowhow fehlt, bzw. wo ich mit Scripten und der entsprechenden Lokalität nicht klar sehe. Und ich nicht weiss, wonach ich suchen muss (Hallo Google. zeig mir alles was "würde der Server auch den addAction Befehl ausführen, da du in der Bedingung den Server nicht ausschließt. Dein Script würde auf dem Server aber nicht ausgeführt werden, da der Server in der Bedingung des addAction Befehls ausgeschlossen wird" enthält, wird wahrscheinlich kein brauchbares Resultat liefern. Muss das Script evtl. nur auf dem Server ausgeführt werden, damit jeder Client das nur einmal macht? Ich hab grosse Mühe mit dieser vermaledeiten Lokalität... . merkt man's? Deshalb ja auch die Frage danach im ersten Satz meines ersten Posts. Geändert von Wolkenbeisser (08.01.2013 um 16:06 Uhr). |
08.01.2013, 18:33 | #9 (permalink) |
Registriert seit: 12.07.2004
Ort: Wien
Beiträge: 1.917
|
Erstelle im Editor z.B. das Erste-Hilfe-Schild. Dem Schild gibst du die Aktion zum Heilen. Damit ist die Aktion publik für alle vorhanden. Jeder der die Aktion des Schildes aufruft wird geheilt. Das Schild stellst du wo im Abseits auf, es muss den im Skript genannten Namen haben!
Dem Sanitäter gibst du eine Aktion das Schild vor sich aufzustellen und wieder zu entfernen. Dafür nimmst du den Code aus diesem Beispiel: Code:
Auslöser: Achse A und B: 0 Aktivierung : Keiner | Mehrfach Bedingung : alive xxxxxSanitäterNamexxxxx Bei Akt. : Heilen_Spieler = player; Heilen_Aktion = player addAction ["Heilen-Objekt ein/aus", "Heilen_ein_aus.sqf", [], -1, false, true]; Bei Deak. : Heilen_Spieler removeAction Heilen_Aktion //Skript mit Namen Heilen_ein_aus.sqf // um ein Objekt zum Heilen aufzustellen und wieder zu entfernen, // Das Heilen-Objekt muss den Namen Heilen_Objekt haben. //Globale Schalter-Variable erstellen if (isNil "Heilen_ein_aus") then {Heilen_ein_aus = true}; if (Heilen_ein_aus) { //Stellt das Heilen-Objekt in Blickrichtung 1,5m vor dem Spieler auf Heilen_Objekt setPos [ (position player select 0)+1.5*sin(getDir player), (position player select 1)+1.5*cos(getDir player) ]; player groupChat "Heilen-Objket aufgestellt!"; Heilen_ein_aus = false } else { //Stellt das Heilen-Objekt ins Abseits Heilen_Objekt setPos [0,0]; player groupChat "Heilen-Objket entfernt!"; Heilen_ein_aus = true } Die Aktion für das Heilen-Schild und das Skript dazu hast du ja schon. Das Skript des Heilen-Schildes muss jeder Spieler haben. |
09.01.2013, 09:04 | #10 (permalink) |
Registriert seit: 05.11.2010
Ort: Schweiz
Beiträge: 297
|
@ Vienna: Danke für die Erklärung mit dem Schild und dem Sanitäter. Das ist aber nicht das, was ich brauche. Alles was ich möchte, ist ein Rucksack (der schon jetzt in der Mission an einem Auto klebt) mit einem Addaction zu versehen, an dem sich die Spieler heilen können.
Scheint ein schwierigeres Unterfangen zu werden... Ich möchte das wirklich einfach halten. Würde es denn so klappen? In die Init: Code:
player addAction ["verarzten","Heilscript.sqf",[],1,true,true,"","_this == player && player distance Sanirucksack < 2"] Code:
_this select 1 switchMove "animationsname_habe_ich_zuhause_notiert"; _this select 1 setDammage 0; Geändert von Wolkenbeisser (09.01.2013 um 09:21 Uhr). |
09.01.2013, 09:11 | #11 (permalink) |
His Awesomeness!
Registriert seit: 25.07.2006
Ort: Regnum Borussiae
Beiträge: 9.282
|
Nur mal ein bescheuerte Einwurf, aber müsste nach dem Prinzip der Auslöser nicht einfach nur "mitfahren", also wenn er an dem Fahrzeug hängt? Das hieße: Ob es jetzt ein Schild ist, das aufgestellt wird, oder der Rucksack selbst, ist doch eigentlich Hupe?!
Ich mein ich skripte nicht für BIS-Spiele, aber wäre das nicht der Ansatz? Wenn Viennas Beispiel genug mitbringt, müsstest du es eigentlich "nur auf einen Rucksack" anwenden. Im "Scope" des Fahrzeugs hängt der Rucksack (attachTo) und im "Scope" des Rucksacks der Auslöser (execute whatever). |
09.01.2013, 09:31 | #12 (permalink) |
Registriert seit: 05.11.2010
Ort: Schweiz
Beiträge: 297
|
Rockhount meinte aber, dass genau ein Auslöser ungeschickt sei. Wie man es sonst (besser) macht, konnte ich bisher noch nicht herausfinden. Ich habe aber meinen vorigen Post ergänzt. Vielleicht geht es so... |
09.01.2013, 09:46 | #13 (permalink) |
His Awesomeness!
Registriert seit: 25.07.2006
Ort: Regnum Borussiae
Beiträge: 9.282
|
Wie gesagt ich skripte nicht für BIS-Spiele. Aber logisch macht es doch Sinn. Der Rucksack ist der Auslöser und der wird einfach nur an das Fahrzeug gepappt. Damit fährt er mit und seine eigene Instanz behandelt dann auch das Heilen. Also entweder scannt der Rucksack seine Umgebung und bemerkt alles was in seinen Radius läuft, stattet es mit Actionmenü-Befehlen aus wenn die im Bereich sind und verwirft sie, wenn sie aus dem Bereich sind. Oder aber jeder Spieler scannt selbst, ob der Rucksack in der Nähe ist. Man könnte mal profilen was schneller ist. Aber vielleicht ist das auch alles egal, und der Einfluss auf die Framerate ist zu vernachlässigen. Die erste Variante hätte entfernt Ähnlichkeit mit einem "Observer"
Bleibt natürlich die Frage, ob das "skriptbar" ist. |
09.01.2013, 14:18 | #14 (permalink) |
Registriert seit: 12.07.2004
Ort: Wien
Beiträge: 1.917
|
Wenn man im Editor in der Initialisierungszeile eines Objekts eine Aktion einfügt, dann ist diese für alle Spieler vorhanden, welche sich dem Objekt nähern.
Für die Heilen Anwendung würde ich aber nicht einen Rucksack nehmen, weil dieser eine Inventar-Aktion hat. Hier ein Beispiel für ein "Erste-Hilfe Schild" an einem "HMMWV-Fahrzeug": Skript heilen_Aktion.sqf wird in der Initialisierungszeile des Schildes aufgerufen. Code:
//Skript: heilen_Aktion.sqf Hängt das Objekt an ein Fahrzeug an. // Erstellt im Objekt eine Aktion für den Aufruf des Skripts "Heilen.sqf" // //Das Skript ist im Editor in der Initialisierungszeile des Objekts aufzurufen! // Damit ist es für alle Spieler vorhanden. // //Parameter: // 1. this (Objket das die Aktion hat) // 2. Name des Fahrzeuges (an welches das Objekt angehängt wird) // 3. Position des Objekts am Fahrzeug // //Beispiel für das Objekt "Erste-Hilfe Schild" an einem "HMMWV-Fahrzeug": // temp = [this,FahrzeugName,[0,-2.4,-1.5]] execVM "heilen_Aktion.sqf"; private ["_ob1","_ob2","_pos","_aID"]; _ob1 = _this select 0; _ob2 = _this select 1; _pos = _this select 2; //Aktion erstellen _aID = _ob1 addAction ["Heilen","Heilen.sqf",[],1,true,true]; //Objekt an das Fahrzeug binden if (local _ob1) then {_ob1 attachTo [_ob2, _pos]}; //Information der Spieler für den Heilvorgang while {alive _ob1 and alive _ob2} do { if (player distance _ob2 < 7) then { player sideChat "Heil-Aktion beim roten Kreuz des Fahrzeuges!"; waitUntil {player distance _ob2 > 8} }; sleep 1 }; //Aktion löschen if (local _ob1) then {_ob1 removeAction _aID} Skript heilen.sqf wird von der Aktion aufgerufen. Code:
//Skript heilen.sqf wird über Aktion aufgerufen. Heilt den aufrufenden Spieler. private "_obj"; _obj = _this select 1; //aufrufender Spieler //Animation ein _obj switchMove "AinvPknlMstpSnonWrflDnon_medic1"; //Heildauer je nach Verletzung while {getDammage _obj > 0} do { titleText ["Die Verletzungen werden versorgt! Bitte warten...","plain"]; _obj setDammage ((getDammage _obj) - 0.05); sleep 1 }; //Animation aus _obj switchMove "AinvPknlMstpSnonWrflDnon_medicEnd"; titleText ["Heilen abgeschlossen!","plain"] Im Anhang eine Beispielmission. |
09.01.2013, 14:51 | #15 (permalink) |
His Awesomeness!
Registriert seit: 25.07.2006
Ort: Regnum Borussiae
Beiträge: 9.282
|
Ist ja nicht fuer mich, aber trotzdem top! Klingt ja so wie gedacht. Mal ne Frage als Nicht-Skripter: Wenn du sagst Rucksaecke sind unguenstig wegen eigener Aktionen, kann man Standardaktionen wie sie meinetwegen BIS vorgibt entfernen, oder gar ueberschreiben?
|
09.01.2013, 16:51 | #16 (permalink) |
Registriert seit: 12.07.2004
Ort: Wien
Beiträge: 1.917
|
Möglich ist vieles in Arma, aber wenn es dafür keine vorgesehenen Befehle gibt, dann ist eine solche Änderung meist mit Problemen in Multiplayer-Missionen verbunden. Ich kenne keine Befehle, mit denen die eigenen Objekt Aktionen zu ändern oder entfernen sind.
|
09.01.2013, 20:53 | #17 (permalink) |
Registriert seit: 05.11.2010
Ort: Schweiz
Beiträge: 297
|
Gut, neuer Ansatz:
Wie wärs, wenn ich anstelle des players das Sanitätsobjekt mit dem Actioneintrag ausrüste? Dann käme das hier in die Initzeile des Objekts: Code:
this addAction ["verarzten", "Heilung.sqf", [], 0, false, true, "", "(_target distance _this) < 2"] Code:
player switchMove "ainvpknlmstpslaywrfldnon_medic"; player setDamage 0; ...wenn man sowas wenigstens einfach testen könnte. Jedesmal ein Rundtelefon starten ist irgendwie nicht praktisch. |
09.01.2013, 21:35 | #18 (permalink) |
Registriert seit: 12.07.2004
Ort: Wien
Beiträge: 1.917
|
AddAction läuft local. Sie ist nur für alle Spieler publik sichtbar, wenn sie z.B. über ein Objekt im Editor initialisiert wird.
Das Objekt ist nicht der Player, sondern das Erste-Hilfe Schild! Die Aktion des Schildes läuft auf jedem PC lokal, genauso wie die Skripte! Jeder Spieler betätigt "seine" Aktion! Wer das nicht tut, wird nicht geheilt! Der "Caller" kann nur der jeweilige Spieler sein, da eine dem Spieler unterstellte KI die Aktion nicht ausführen kann. |
10.01.2013, 09:42 | #19 (permalink) |
Registriert seit: 05.11.2010
Ort: Schweiz
Beiträge: 297
|
Muss mir das merken. Immerhin habe ich jetzt zu den Actioneinträgen eine klare Aussage, was wo lokal ist. Danke Vienna. Und das wiederum heisst, dass mein Beispiel aus dem vorigen Post funzt, oder? Geändert von Wolkenbeisser (10.01.2013 um 09:51 Uhr). Grund: jaja, Fehler und ungenaue Formulierungen |
10.01.2013, 14:01 | #20 (permalink) |
Registriert seit: 12.07.2004
Ort: Wien
Beiträge: 1.917
|
Dein letztes Beispiel funktioniert, wenn die Aktion im Editor dem Objekt hinzugefügt wurde. Das Skript muss auf jedem PC vorhanden sein.
Wird das Objekt im Programm mit createVehicle erstellt, dann ist die Aktion mit folgenden Befehlen hinzuzufügen bzw. zu aktivieren: http://community.bistudio.com/wiki/setVehicleInit http://community.bistudio.com/wiki/processInitCommands Diese Befehle wirken public. |
Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1) | |
|
|
Ähnliche Themen | ||||
Thema | Autor | Forum | Antworten | Letzter Beitrag |
Unterschied - Player & local Player? | Moerderhoschi | Editing & Scripting | 15 | 09.02.2013 17:18 |
Im Heli als Passagier einsteigen | Maddog_aut | Editing & Scripting | 16 | 22.12.2012 11:54 |
Rucksack | CptMike | Editing & Scripting | 21 | 27.10.2011 23:35 |
Problem mit Briefing im MP | Clawhammer | Editing & Scripting | 13 | 17.09.2010 17:29 |
Heal/Repair Script / Einheiten in einem Radius zufällig generieren lassen | Noobfire | Editing & Scripting | 8 | 06.08.2010 15:22 |