PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Eventhandler im MP


JoeJoe87577
09.03.2013, 22:37
Hallo,

ich hab da ein Problem mit den Eventhandlern. Ich möchte, dass meiner Einheit im MP ein Eventhandler "Killed" zugewiesen wird. In der init.sqf rufe lasse ich den Eventhandler zuweisen:
{
_x addEventHandler ["Killed", {nul = [_x] execVM "scripts\helpers\player_killed.sqf";}];
} forEach allUnits;
Mein player_killed.sqf sieht so aus:
_unit = _this select 0;

while ({true}) do {

waituntil {!alive _unit};

nul = [_unit] execVM "scripts\equipment\clear_equipment.sqf";

};
Nachdem ich ein bisschen gelesen habe, weiß ich, dass ich für meine Zwecke (ich will einfach alle Waffen, Magazine und Items der Einheit entfernen), keinen MPEventhandler brauche. Weil der Eventhandler ja nur auf der lokalen Maschiene ausgeführt wird.
Wenn dann aber meine Einheit im MP getötet wird wird das Script nicht ausgeführt.
Ich hab auch schon versucht den Eventhandler im Init Feld der Einheit zuzuweisen, selbes Ergebnis.

Wie drehe ich das jetzt so, dass der Eventhandler läuft?

Vienna
10.03.2013, 07:15
_x addEventHandler ["Killed", {_this execVM "scripts\... Die Parameter des EventHandlers sind in der lokalen Variable _this enthalten. So wie bei bei den Skripten.

Die player_killed.sqf funktioniert so nicht! Jede Unit bekommt nach den Tod eine neue ID. Sonst würde es ja Probleme geben wenn sie nach einem Respawn den selben Namen bekommt.

Du solltest das eigentliche Skript direkt im Eventhandler aufrufen:

_x addEventHandler ["Killed", {[_this select 0] execVM "scripts\equipment\clear_equipment.sqf"}]

JoeJoe87577
10.03.2013, 10:47
Die Schleife hat einen Fehler, die soll eigentlich warten bis die Einheit wieder lebt. Der Eventhandler wird ja aufgerufen sobald die Einheit Tod ist. Ich will das aber haben wenn die Einheit neu spawnt.
Das mit der ID wusste ich nicht, wieder was neues gelernt.

Vienna
10.03.2013, 11:40
Wenn das für die Units der Spieler ist, dann brauchst du keinen EventHandler. Da reicht ein Skript mit Endlosschleife. Die ID des Spielers zuvor sichern _player = player; Nach dem Respawn kannst du dann die Tote Unit mit _player ansprechen.

JoeJoe87577
10.03.2013, 11:48
Müsste ich das Script den mit rEXECVM aufrufen? Und die ID gebe ich dann einfach als Parameter mit?

Vienna
10.03.2013, 12:34
In der Übergabe ist nur die momentan aktuelle ID. In player ist immer die aktuelle. Man kann kauch anstelle von player den UnitNamen nehmen. player ist immer der jeweilige Spieler auf seinem PC.

Vienna
10.03.2013, 12:52
Test einmal dieses Skript:

while {true} do
{
waitUntil {!alive player};
removeallWeapons player; //das muss erfolgen bevor die neue Spieler-Unit respawnt.
}

Hier ein Beispiel wie man dem Spieler die Bewaffnung zuweist, welche er unmittelbar vor dem Tod hatte: http://hx3.de/editing-scripting-167/problem-respawn-tod-bewaffnung-19732/#post336309

JoeJoe87577
10.03.2013, 12:55
Ich werde es testen.
Ich beis aber gleich ein Stück Schreibtisch ab und nehm ein Glas Milch dazu. Ich schaffe es nichtmal, dass die Mission auf den Clients beendet wird.

JoeJoe87577
10.03.2013, 13:04
Auch das hat nicht funktioniert

JoeJoe87577
10.03.2013, 13:20
Mehrmals getestet und es hat nicht funktioniert. Weder mit Player noch mit Einheitenname im Parameter.

Vienna
10.03.2013, 13:53
Nachdem ich diesen Code mit einem Auslöser startete, haben die toten Units des Spielers keine Waffen mehr:

temp = 0 spawn
{
if (isDedicated) exitWith {};
while {true} do
{
waitUntil {!alive player};
removeallWeapons player
}
}

In der description.ext ist eingestellt:

Respawn = "INSTANT"; // Respawn an Ort und Stelle.
RespawnDelay = 3; // Respawnzeit

JoeJoe87577
10.03.2013, 15:04
Wie hast du den Auslöser gesetzt? Wenn ich einen setze mit Anybody als Aktivierung spawnen die Einheiten trotzdem mit Waffe.

Vienna
10.03.2013, 16:16
Ich habe das mit einem Funk-Auslöser getestet. Zuerst Respawn ohne und dann mit dem Skript.

Du kannst das auch in der init.sqf starten. Dann aber besser über ein Skript:

NachTod.sqf

//Lokal Player. Spieler nach Tod Waffen entfernen.

if (isDedicated) exitWith {};
while {true} do
{
waitUntil {!alive player};
removeallWeapons player
}
}
Es läuft in Arma 2. Denke nicht, dass sich da in Arma 3 was geändert hat.

In Skripten kannst du das nul = weglassen. z.B.

0 execVM "NachTod.sqf";

Wenn du nur einen Parameter hast, dann brauchst du den nicht in ein Array packen. Im Skript wird der dann nur mit _this abgerufen.

JoeJoe87577
11.03.2013, 18:21
Dann mach ich mit der Initialisierung falsch. Ich hab dein Script eingefügt:
if (isDedicated) exitWith {};
while ({true}) do
{
waitUntil {!alive player};
removeallWeapons player;
}

Und ruf es in der Init.sqf auf
{
0 execVM "scripts\helpers\player_killed.sqf";
0 execVM "scripts\helpers\score_hint.sqf";

} forEach allUnits;

Aber es funktioniert nicht. Wenn ich auf einem Dedizierten Server sterbe und neu spawne hab ich die Standardausrüstung an.

Vienna
11.03.2013, 20:07
Der erste Code löscht nur die Waffen eines toten Spielers. Sie hat keinen Einfluss auf die Bewaffnung nach dem Respawn.

Dafür findest du in Post #7 einen Link zu einem Beispiel, bei welchem die Bewaffnung des Toten der neue Spieler hat.

Falls der zweite Code überhaupt ausgeführt wird, dann ruft er die Skripte auf jedem PC so oft auf wie es Units gibt. Es fehlt hier das _x, welche jeweilige Unit enthält.

JoeJoe87577
11.03.2013, 21:07
Ah, dann hab ich dich falsch verstanden :zahn:. Ich schau mir mal dein Script an.
Jetzt nochmal ne ganz andere Frage, wie beende ich eine Multiplayer Mission? Mit endmission "END1"; beende ich die Mission auf dem Server, aber ich bekomme es nicht hin, dass die Mission auf den Clients beendet wird. Ich habe schon gesehen, dass man remote execute benutzen soll. Aber das kleine Schnipsel was ich drin hatte (war mit rENDMISSION) hatte nicht funktioniert.
Aus dem Wiki habe ich das so verstanden, dass man den Code auf dem Server ausführt und der dann an alle Clients geschickt wird, oder Irre ich da mal wieder.

Vienna
12.03.2013, 01:20
Siehe links oben in der Beschreibung [AL] [EL]: http://community.bistudio.com/wiki/endMission ist eigentlich lokal. Musst sicherstellen, dass dieser Befehl bei allen Clients ausgelöst wird.

JoeJoe87577
12.03.2013, 09:05
Und wie führ ich das aus? Ich hab grade den Syntax nicht im Kopf aber ich habschonmal was mit call re und rEXEC gemacht. Stimmt das zum ausführen?

Tajin
12.03.2013, 09:08
Kannst auch mal die neue "hübsche" Variante probieren:
"END1" call BIS_fnc_endMission;