Reward bei Erfüllen von Tasks?

  • Multiplayer

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Reward bei Erfüllen von Tasks?

    Hallo zusammen.
    Ich bastel gerade an einem Script, welches ich als Basis für eine MP Mission nutzen möchte.
    Ich erstelle eine Feindliche Gruppe, dann einen Task und frage danach in einer Schleife ab, ob der Task erfüllt ist oder nicht. Das läuft so bisher eigentlich ganz gut.
    Jetzt hätte ich aber gerne, dass der Spieler oder die Spieler Gruppe, welche den Task erfüllt eine Belohnung dafür bekommt. Zum Testen ein Medikit oder sonst etwas.
    Für normal teste ich immer selbst länger herum bevor ich hier dumme Fragen stelle :D
    Im Moment habe ich aber keine Ahnung, wie das auch nur im Ansatz funktionieren soll.


    Quellcode

    1. if (isServer) then {
    2. Task_1_Schleife = true;
    3. _Pos_1 = [4603.049,10139.879,0];
    4. GroupOne_Airfield = [_Pos_1, east, ["O_Soldier_F", "O_Soldier_F"]] call BIS_fnc_spawnGroup;
    5. hint "Task erstellt";
    6. Airfield_Tast = player createSimpleTask ["Airfield"];
    7. Airfield_Tast setSimpleTaskType "attack";
    8. Airfield_Tast setSimpleTaskAlwaysVisible true;
    9. Airfield_Tast setSimpleTaskDestination _Pos_1;
    10. Airfield_Tast setSimpleTaskDescription [
    11. "Auf dem Airfield wurden zahlreiche Kräfte gesichtet.",
    12. "Feindkräfte gesichtet",
    13. "Aierfield 2"
    14. ];
    15. Airfield_Tast setTaskState "CREATED";
    16. _null = []spawn {
    17. while {Task_1_Schleife} do {
    18. sleep 5;
    19. if ({alive _x} count units GroupOne_Airfield < 1) then {
    20. Airfield_Tast setTaskState "Succeeded";
    21. sleep 10;
    22. player removeSimpleTask Airfield_Tast;
    23. Task_1_Schleife = false;
    24. hint "Task abgeschlossen";
    25. { deleteVehicle _x }forEach units (GroupOne_Airfield);
    26. deleteGroup GroupOne_Airfield;
    27. sleep 3;
    28. terminate Task_1;
    29. }
    30. else {};
    31. };
    32. };
    33. sleep 60;
    34. Task_1_Schleife = false;
    35. Airfield_Tast setTaskState "Failed";
    36. sleep 10;
    37. player removeSimpleTask Airfield_Tast;
    38. hint "Task fehlgeschlagen";
    39. { deleteVehicle _x }forEach units (GroupOne_Airfield);
    40. deleteGroup GroupOne_Airfield;
    41. sleep 3;
    42. terminate Task_1;
    43. };
    Alles anzeigen
    Das Script ist noch nicht fertig und ich bau noch einiges drum herum aber das soll quasi die Basis für alle folgenden Tasks in meiner Mission werden.
    Ich bin auch abseits meiner eigentliche Frage immer offen wenn es etwas zu verbessern gäbe.

    viel Grüße Mind
  • Wenn das für MP sein soll, dann musst du das aber alles komplett anders machen. Dein gesamter Code-Block wird nur auf dem Server ausgeführt (isServer in Zeile 1), was ja auch richtig ist, schließlich soll nicht jeder Client eine Gruppe mit BIS_fnc_spawnGroup erstellen. Aber createSimpleTask hat nur auf der lokalen Maschine eine Wirkung. Damit wird der Task nur auf dem Server erstellt. Auf einem Dedicated Server ist player aber immer das Null-Objekt und damit wird überhaupt kein Task erstellt. Du solltest dich von dem Konzept "Ich stecke alles in ein Skript mit Schleife" verabschieden. Außerdem kann das ganze so wie du das geschrieben hast gleichzeitig den Task als erfolgreich erledigt markieren und dann sofort als gescheitert. Was du mit dem terminate Befehl erreichen willst ist auch schleierhaft.

    Ich rate auch gegen MPKilled. Benutze den normalen Killed stattdessen.
  • Danke für eure Antworten. Für mein eigentliches Vorhaben bin ich jetzt wie folgt vorgegangen. Es ist noch nicht ganz was ich wollte und mit dem MPKilled kam ich bislang leider nicht zurecht aber es funktioniert immerhin... Kleiner Erfolg :)

    Quellcode

    1. {_x addEventHandler ["Killed",
    2. {
    3. params ["_killed", "_killer", "_instigator"];
    4. {if(_killed == _x) then{ hint "geht";}} forEach units GroupOne_Airfield;
    5. }];
    6. } forEach units GroupOne_Airfield;
    Ich lasse das Script aktuell noch über die init.sqf starten.
    Task_1 = execVM "Scripte\Tasks\task_1.sqf";
    Später lasse ich die Missionen in einem extra Script random auswählen und nach beenden kann es sein, dass es eben noch einmal dran kommt. Deswegen der terminate Befehl damit es beendet wird.
    Warum sollte mein Task gleichzeitig erfolgreich und gescheitert sein? Wenn die Schleife durch ist, wird doch das Script beendet und dadurch kann es nicht mehr scheitern. Anders herum ist es, wenn es scheitert, wird die schleife beendet und es kann nicht mehr erfolgreich sein. Oder übersehe ich da einfach meinen Fehler?

    Das createSimpleTask nur auf der lokalen Maschine läuft war mir nicht klar... da muss ich alles wohl umbauen.
  • Zunächst mal beendet dein terminate nicht die Instanz von Zeile 19 bis 35, da es eine andere Skriptinstanz ist als das Mainscope deines Skripts (eigenes spawn).

    Dann wird außerdem das Skript 3 Sekunden (sleep 3) bis 30 Minuten später... (Scheduler). Dann hat dein while-Block selbst ein sleep 5. Wenn Erfolgt und Scheitern nah genug beisammen liegen, werden beide Fälle eintreten.

    Das kannst du auch aufgrund des Schedulers nicht ändern, ohne alles neu zu schreiben. Der Scheduler hält dein Skript an wenn er will, besonders lang und häufig bei den niedrigen FPS eines Servers. Das ganze wird in die Hose gehen.

    {if(_killed == _x) then{ hint "geht";}} forEach units GroupOne_Airfield;

    Das schreibt man so:

    Quellcode

    1. if (_killed in units GroupOne_Airfield) then {
    2. hint "geht";
    3. };
    Außerdem fehlen da noch einige, verschiedene Klammern.
  • Ich habe mir mal zu Herzen genommen was du geschrieben hast und hab alles versucht so anzupassen, wie ich glaube das es passt.
    Danke btw. dass du dir die Zeit genommen und Mühe gemacht hast meinen Code anzusehen!


    Quellcode

    1. if (isServer) then {
    2. Task_1_Schleife = true;
    3. Airfield_Tast_Cleanup = false;
    4. _Pos_1 = [4603.049,10139.879,0];
    5. GroupOne_Airfield = [_Pos_1, east, ["O_Soldier_F", "O_Soldier_F"]] call BIS_fnc_spawnGroup;
    6. [GroupOne_Airfield, _Pos_1, 150] call bis_fnc_taskPatrol;
    7. hint "Task erstellt";
    8. {_x addEventHandler ["Killed",
    9. {
    10. params ["_killed", "_killer", "_instigator"];
    11. if (_killed in units GroupOne_Airfield) then {
    12. hint format ["Spieler %1 hat %2 getötet",_killer, _killed];
    13. };
    14. }];
    15. } forEach units GroupOne_Airfield;
    16. if (!isDedicated) then {
    17. Airfield_Tast = player createSimpleTask ["Airfield"];
    18. Airfield_Tast setSimpleTaskType "attack";
    19. Airfield_Tast setSimpleTaskAlwaysVisible true;
    20. Airfield_Tast setSimpleTaskDestination _Pos_1;
    21. Airfield_Tast setSimpleTaskDescription [
    22. "Auf dem Airfield wurden zahlreiche Kräfte gesichtet.",
    23. "Feindkräfte gesichtet",
    24. "Aierfield 2"
    25. ];
    26. Airfield_Tast setTaskState "CREATED";
    27. };
    28. _Instanz_1 = []spawn {
    29. _incomeCount = -1;
    30. _limit = 5;
    31. while {(Task_1_Schleife) && (_incomeCount) < (_limit)} do {
    32. if ({alive _x} count units GroupOne_Airfield < 1) then {
    33. Airfield_Tast_Cleanup = true;
    34. if (!isDedicated) then {
    35. Airfield_Tast setTaskState "Succeeded";
    36. Task_1_Schleife = false;
    37. };
    38. };
    39. sleep 5;
    40. _incomeCount = _incomeCount + 1;
    41. hint format ["Limit %1",_incomeCount ];
    42. if (_incomeCount == _limit) then {
    43. sleep 5;
    44. Task_1_Schleife = false;
    45. Airfield_Tast_Cleanup = true;
    46. if (!isDedicated) then {
    47. Airfield_Tast setTaskState "Failed";
    48. hint "Task gescheitert";
    49. };
    50. };
    51. };
    52. };
    53. waitUntil {Airfield_Tast_Cleanup};
    54. sleep 20;
    55. Task_1_Schleife = false;
    56. { deleteVehicle _x }forEach units (GroupOne_Airfield);
    57. deleteGroup GroupOne_Airfield;
    58. sleep 10;
    59. if (!isDedicated) then {
    60. player removeSimpleTask Airfield_Tast;
    61. hint "Alles aufgeräumt";
    62. };
    63. terminate Task_1;
    64. terminate _Instanz_1;
    65. };
    Alles anzeigen
  • Das Skript hat immer noch das gleiche Problem. Der Scheduler kann dein Skript nach jeder Zeile anhalten und das kann dafür sorgen, dass beide Ereignisse eintreten. Wie ich bereits gesagt habe ist das ein prinzipielles Problem deines Ansatzen mit Schleifen.

    Statt !isDedicated solltest du immer hasInterface benutzen. Das schließt dann nämlich headless clients mit aus - die brauchen auch keine Tasks. Selbst wenn du die nicht benutzt hat isDedicated, einfach null Vorteile und deshalb muss man das auch im Forum erwähnen.

    Dieses Skript muss ja auch für JIP Klienten laufen. Aber nachdem der Task erfüllt oder gescheitert ist, und jemand verbindet, werden bei dem die Tasks als neu gesetzt.