Ausrüstung nach Respawn

  • Moin,


    mal wieder stehe ich vor einem Problem und hoffe, dass ihr mir helfen könnt.


    Wie der Titel vermuten lässt, möchte ich, dass man als Spieler die Ausrüstung nach dem Respawn behält, die man vor dem Respawn hatte.
    Also benutze Magazine, Scope, Granaten... quasi alles was man adaptiert oder benutzt hat, soll so übernommen werden.
    Es läuft auch alles soweit, nur habe ich genau ein Problem, man verliert nach dem Respawn seine Hautpwaffe (also sein Gewehr) ?( , alles Andere ist weiter vorhanden, Magazine, Granaten, Verbandskasten..., auch die Anzahl wird richtig übernommen.


    Ich habe schon im Forum und Internet geschaut, onplayerkilled.sqf und onplayerrespawn.sqf, mit einem script, funktionieren garnicht. :huh:
    Ich habe dann versucht es über Auslöser, mit der bedingung "alive" und "not alive" laufen zu lassen und es funktionierte, aber dann war das Gewehr nach dem Respawn weg.


    Folgende scripte hab ich verwendet:


    [player, [missionNamespace, "inventory_var"]] call BIS_fnc_saveInventory;


    [player, [missionNamespace, "inventory_var"]] call BIS_fnc_loadInventory;



    player setUnitLoadout(player getVariable["Saved_Loadout",[]]);



    player setVariable["Saved_Loadout",getUnitLoadout player];





    Ich danke schon mal für eure Hilfe. :)

  • dazu gibt es bereits mehrere Threads. Suchfuktion benutzt? Respawn mit vor dem Tod Ausrüstung


    Deine 2 genannten Scripte sind Eventscripte und ziehen an, wenn entsprechendes Ereignis eintritt.
    beim onplayerkilled.sqf nimmst du
    [player, [player, "inventory_var"]] call BIS_fnc_saveInventory;


    beim onplayerrespawn.sqf nimmst du
    [player, [player, "inventory_var"]] call BIS_fnc_loadInventory;


    Speicherst du es in der Mission, und Spieler 1 stirbt hat eine Verzögerung von 20 Sekungen und in diesen 20 Sekunden stirbt Spieler 2, wird die Variable in der Mission überschrieben

  • Danke für die Antwort,ich habe die Suchfunktion benutzt und genau diesen Vorschlag probiert.
    Er liest zwar die *.sqf Datein, führt aber die Befehle scheinbar nicht aus, da ich mit der Ausrüstung Respawne, die ich ganz am Anfang habe. (Quasi Standard und voll equipt)


    Ich benutze dieses Script in der init.sqf, damit er meine voreingestellte Ausrüstung am Start läd:



    Ich dachte, dass es daran liegen könnte, aber die init läd er ja nur am Anfang und nicht beim Respawn?!

  • Der nach dem respawn Player ist nicht gleich der vor dem respawn Player.
    Sobalt der Spieler stirbt ist zwar sein Loadout in seiner Leiche gespeichert.. Aber wenn er respawned ist er ja in einem neuen Körper. Und der neue Körper hat diese Loadout Variable nicht.
    Anstatt die Variable auf dem Körper des Spielers zu speichern, speichere sie einfach auf einer normalen Variable


    Code
    1. if (hasInterface) then {
    2. [] spawn {
    3. waitUntil {alive player};
    4. Player_Loadout = getUnitLoadout player;
    5. player addEventHandler ["Respawn", {
    6. player setUnitLoadout Player_Loadout;
    7. }];
    8. };
    9. };
  • Variablen werden von der Leiche zum Spielerobjekt beim Respawn kopiert, ABER!
    Das funktioniert nicht, wenn die Respawnzeit auf 0 gesetzt ist. Dann läuft der killed Eventhandler und onPlayerKilled.sqf nachdem das Objekt bereits kopiert wurde und die Variable wird nur auf der Leiche gesetzt.
    Überschrieben wird hier nicht, wenn andere Spieler sterben, da diese Skripte nur auf der Maschine des gestorbenen Spielers ausgeführt werden und die globalen Variablen auch nur diese Werte auf der lokalen Maschine haben.
    So wie das Skript zur Zeit funktioniert, wird das Inventar einmal am Anfang der Mission gelesen. Da ist es kein Wunder, dass das Inventar nicht identisch mit dem vor dem Tod ist.

  • Fatzit:

    Der nach dem respawn Player ist nicht gleich der vor dem respawn Player.
    Sobalt der Spieler stirbt ist zwar sein Loadout in seiner Leiche gespeichert.. Aber wenn er respawned ist er ja in einem neuen Körper. Und der neue Körper hat diese Loadout Variable nicht.
    Anstatt die Variable auf dem Körper des Spielers zu speichern, speichere sie einfach auf einer normalen Variab

    Code
    1. if (hasInterface) then {
    2. [] spawn {
    3. waitUntil {alive player};
    4. Player_Loadout = getUnitLoadout player;
    5. player addEventHandler ["Respawn", {
    6. player setUnitLoadout Player_Loadout;
    7. }];
    8. };
    9. };


    Die spielbaren Einheiten sind modifiziert, andere Ausrüstung und Aussehen. Das Script steht in der init.sqf. Die init.sqf wird nur gelesen, wenn die Mission startet, sie kann und ist nicht das Problem, da ich die Datei, sammt script gelöscht habe, ohne Ergebnis!




    Hab ich auch schon probiert, er übernimmt die Ausrüstung vor dem Tot einfach nicht, man steht quasi full equipt, wie beim Missionsstart am Respawn.
    Diese Scripte funktionieren aber nur, wenn ich sie in jeweils einen Auslöser einbinde, nur dann ist die Hauptwaffe beim Respawn verschwunden!



    Variablen werden von der Leiche zum Spielerobjekt beim Respawn kopiert, ABER!
    Das funktioniert nicht, wenn die Respawnzeit auf 0 gesetzt ist. Dann läuft der killed Eventhandler und onPlayerKilled.sqf nachdem das Objekt bereits kopiert wurde und die Variable wird nur auf der Leiche gesetzt.
    Überschrieben wird hier nicht, wenn andere Spieler sterben, da diese Skripte nur auf der Maschine des gestorbenen Spielers ausgeführt werden und die globalen Variablen auch nur diese Werte auf der lokalen Maschine haben.
    So wie das Skript zur Zeit funktioniert, wird das Inventar einmal am Anfang der Mission gelesen. Da ist es kein Wunder, dass das Inventar nicht identisch mit dem vor dem Tod ist.

    Respawnzeit ist auf 5 Sekunden eingestellt.

  • onPlayerKilled.sqf:

    HTML
    1. params ["_oldUnit","_killer","_respawn","_respawnDelay"];
    2. _loadout = getUnitLoadout _oldUnit;
    3. waitUntil {sleep 0.1;!isNull player};
    4. waitUntil {sleep 0.1;local player};
    5. waitUntil {sleep 0.1;alive player};
    6. player setUnitLoadout [_loadout,false];

    habe damit noch keine Probleme gehabt.

  • Ja, aber nur mit "alive player" abfragen reicht manchmal nicht, dann tritt dieser komische Bug mit der fehlenden Ausrüstung ab und an mal auf.
    (keine prim. und sek. Waffen, aber die items noch im Inventar)


    Das kann aber auch am "sleep 0.1" liegen, den einfach mal auf "sleep 0.3" ändern.

  • Danke für eure Vorschläge, aber ich gebe auf.
    Nichts funktioniert, er scheint die *.sqf Datein nicht richtig auszuführen, bzw. den loadout nicht zu speichern oder zu laden.


    Das Einzige was funktioniert, ist, wenn ich die Zeilen
    [player, [player, "inventory_var"]] call BIS_fnc_saveInventory;
    [player, [player, "inventory_var"]] call BIS_fnc_loadInventory;


    in Auslöser (bei Aktivierung) schreibe und als Bedingung "alive Einheit" oder "not alive Einheit" setzte, wobei dann aber die Hauptwaffe weg ist.


    Ein kleiner Hinweis am Schluss:
    Ich benutze den Eden-Editor und das dort vorhandene Respawnmodul. Eventuell fällt irgendwem ja dazu doch noch eine Lösung ein.

  • Dann teste es mit einer Textausgabe.


    Onplayerkilled.sqf schreibst du mal rein:
    [player, [missionNameSpace, "inventory_var"]] call BIS_fnc_saveInventory;
    SystemChat "Spieler ist tot"
    hint format ["tot: %1",inventory_var];


    OnPlayerRespawn.sqf
    systemChat "Der Spieler ist wieder da"
    hint format ["repspawn: %1",inventory_var];
    [player, [missionNameSpace, "inventory_var"]] call BIS_fnc_saveInventory;

  • Folgenden Fehler zeigt er mir an:


    Diese Fehlermeldungen bekam ich oft, waren aber nach dem zweiten Kill bzw. Respawn nicht mehr vorhanden und ich beachtete sie dann nicht mehr. :/
    Ich benutze einen normalen Texteditor zum editieren der sqf Dateien, was ich jetzt mal als Grund ausschließe...

  • onPlayerKilled.sqf:


    [player, [missionNameSpace, "inventory_var"]] call BIS_fnc_saveInventory;
    SystemChat "Spieler ist tot"
    hint format ["tot: %1",inventory_var];


    onPlayerRespawn.sqf:


    systemChat "Der Spieler ist wieder da"
    hint format ["repspawn: %1",inventory_var];
    [player, [missionNameSpace, "inventory_var"]] call BIS_fnc_saveInventory;


    PS:
    Ich glaube den Fehler gefunden zu haben.
    Es wird daran liegen, dass ich es mit WordPad bearbeitet habe und die Zeilen über copy&paste einfügte.


    Wenn ich sie mit dem Texteditor öffne, dann steht fogendes da:


    {\rtf1\ansi\ansicpg1252\deff0{\fonttbl{\f0\fnil\fcharset0 Calibri;}}
    {\*\generator Msftedit 5.41.21.2510;}\viewkind4\uc1\pard\sa200\sl276\slmult1\lang7\f0\fs22 [player, [missionNameSpace, "inventory_var"]] call BIS_fnc_saveInventory;\par
    SystemChat "Spieler ist tot";\par
    hint format ["tot: %1",inventory_var];\par
    }

  • Nachtrag:


    Den Fehler hab ich jetzt mit dem Texteditor beseitigt, er muss irgendwie die Textformatierunginformationen beim copy&paste, hintergründig mitgeführt haben.
    Dennoch speichert er nicht die Ausrüstung... :/


    Und wenn ich diese Zeilen, für den Systemchat verwende:


    SystemChat "Spieler ist tot"
    hint format ["tot: %1",inventory_var];


    systemChat "Der Spieler ist wieder da"
    hint format ["repspawn: %1",inventory_var];


    Dann kommt wieder ein Fehler in der Zeile mit "hint format"...