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"; Offene Fragen:
Grüsse aus der Schweiz Wolkenbeisser |
Ich schätze HIER steht alles was Du dazu wissen musst... ;)
|
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.
|
Zitat:
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. |
Verwende im Skript einfach : _this select 1 setDammage 0;
Damit wird der Aufrufer der Aktion geheilt. |
Zitat:
Code:
_this select 1 switchMove "animationsname_habe_ich_zuhause_notiert"; |
Hast du schon mal dieses Zeichen gesehen? http://community.bistudio.com/wikida...ects_local.gif
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: Zitat:
|
Zitat:
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. |
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: Die Aktion für das Heilen-Schild und das Skript dazu hast du ja schon. Das Skript des Heilen-Schildes muss jeder Spieler haben. |
@ 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"; |
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). |
Zitat:
|
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. |
Liste der Anhänge anzeigen (Anzahl: 1)
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. Skript heilen.sqf wird von der Aktion aufgerufen. Code:
//Skript heilen.sqf wird über Aktion aufgerufen. Heilt den aufrufenden Spieler. Im Anhang eine Beispielmission. |
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?
|
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.
|
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"; ...wenn man sowas wenigstens einfach testen könnte. Jedesmal ein Rundtelefon starten ist irgendwie nicht praktisch. |
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. |
Zitat:
Und das wiederum heisst, dass mein Beispiel aus dem vorigen Post funzt, oder? |
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. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:46 Uhr. |
Angetrieben durch vBulletin, Entwicklung von Philipp Dörner & Tobias