Spieler in der nähe abfragen

Ab sofort füllen wir den Artikel-Bereich von Native-Network.net regelmäßig mit neuen Inhalten zu verschiedenen Themen! Direkt zu den Artikeln gelangst du

HIER

  • Hallo,


    seit längerem arbeite ich daran, für einen Taktik Server, eine Belebte Stadt zu Simulieren. Das klappt auch soweit. Ich nutze dafür die von CBA gelieferte "CBA_fnc_taskPatrol". Nun zu meinem Kleinen Problem. Die NPC´s sollen, sobald ein Spieler näher als 2 Meter ist, Stehen bleiben. Meine Bisherigen Versuche scheitern.


    Mein aufbau:

    Code: NPC Init
    1. [this, getmarkerpos "npc_town_1", 40, 7, "MOVE", "CARELESS", "BLUE", "LIMITED", "LINE", "this call CBA_fnc_searchNearby", [3,6,9]] call CBA_fnc_taskPatrol; [this]execVM "npcstop.sqf";


    Ich habe erstmal über diag_log mir ausgeben lassen ob es überhaupt Prüft ob der Spieler da ist oder nicht. Das Script Funktioniert zumindest beim Start. Aber nur während die Mission lädt danach wird der Code nicht weiter ausgeführt. Was mach ich Falsch?

    ılıll|̲̅̅●̲̅̅|̲̅̅=̲̅̅|̲̅̅●̲̅̅|llılı Gründer von Beyond-Time ılıll|̲̅̅●̲̅̅|̲̅̅=̲̅̅|̲̅̅●̲̅̅|llılı


    TS: ts.beyond-time.eu

    Forum: https://beyond-time.eu/


    Jeder ist Herzlichst eingeladen in dieser Kalten Jahreszeit sich bei uns in einer netten Gesprächsrunde mit einer Heißen schokolade sich den Tag zu versüßen



    Rechtschreibfehler bitte in einen sack diesen Gut verschließen und in eine Schlucht werfen.

  • 1. mach keine execVM -> definier das Script als Funktion und rufe es über spawn auf.

    2. nutze keine while {true} do sonden for "_i" from 0 to 1 step 0 do - hat Laufzeitgründe...

    3. das mit der forEach ist eklig und man sollte forEach mit count ersetzen wo geht und das geht hier super: ({ isPlayer _x && {alive _x} && {(_x distance2D _ki)<_dist} } count playableUnits) > 0 - gibt true wenn Spieler anwesend oder false wenn nicht

    4. nimm uisleep statt sleep, ist immer genauer und es gibt eigentlich kaum eine stelle wo man es nicht anstelle von sleep verwenden sollte.

  • mit execVM wollt ich erstmal testen ob es überhaupt Funktionier. Hab es jetzt als Funktion eingetragen und per Spawn aufgerufen. Danke für die Tipps. Mein Code sieht aktuell so aus. Er Registriert keinen Spieler in seiner Nähe.

    Code: NPC Init
    1. [this, getmarkerpos "npc_town_2", 40, 7, "MOVE", "CARELESS", "BLUE", "LIMITED", "LINE", "this call CBA_fnc_searchNearby", [3,6,9]] call CBA_fnc_taskPatrol; this call DPG_fnc_randomloudout; [] spawn {
    2. for "_i" from 0 to 1 step 0 do {
    3. uisleep 10; [this]call DPG_fnc_npcstop
    4. };
    5. };


    Ich habe gerade echt ein Brett vor dem Kopf:D

    ılıll|̲̅̅●̲̅̅|̲̅̅=̲̅̅|̲̅̅●̲̅̅|llılı Gründer von Beyond-Time ılıll|̲̅̅●̲̅̅|̲̅̅=̲̅̅|̲̅̅●̲̅̅|llılı


    TS: ts.beyond-time.eu

    Forum: https://beyond-time.eu/


    Jeder ist Herzlichst eingeladen in dieser Kalten Jahreszeit sich bei uns in einer netten Gesprächsrunde mit einer Heißen schokolade sich den Tag zu versüßen



    Rechtschreibfehler bitte in einen sack diesen Gut verschließen und in eine Schlucht werfen.

  • was nein pfui ahhhhhhhh


    if (({ isPlayer _x && {alive _x} && {(_xdistance2D _ki)<_dist} } count playableUnits) > 0) then {

    und jetzt über nearEntities besser machen (hatte ich net aufm Schirm heute morgen B4v4r!4n_Str!k3r :D)

    if (({ isPlayer _x && {alive _x} && {(_xdistance2D _ki)<_dist} } count nearEntities ["Man", _dist]) > 0) then {

  • Ich habe das mal eingefügt und auch mich dran versucht selbst zu lösen. Aber ich bin gerade echt zu blöde zu



    Das ist wie er aktuell ist der Code. Im Anhang ist die aktuell Client RPT wo auch der Fehler drin ist


    MfG

    Dateien

    ılıll|̲̅̅●̲̅̅|̲̅̅=̲̅̅|̲̅̅●̲̅̅|llılı Gründer von Beyond-Time ılıll|̲̅̅●̲̅̅|̲̅̅=̲̅̅|̲̅̅●̲̅̅|llılı


    TS: ts.beyond-time.eu

    Forum: https://beyond-time.eu/


    Jeder ist Herzlichst eingeladen in dieser Kalten Jahreszeit sich bei uns in einer netten Gesprächsrunde mit einer Heißen schokolade sich den Tag zu versüßen



    Rechtschreibfehler bitte in einen sack diesen Gut verschließen und in eine Schlucht werfen.

  • _player = _x;

    muss weg. _x ist undefiniert und _player wird sowieso nicht verwendet.



    if (({ isPlayer _x && {alive _x} && {(_x distance2D _ki) < _dist} } count nearEntities ["Man", _dist]) > 0) then {

    der fett markierte Teil kann weggelassen werden, da auf Distanz schon in nearEntities "gefiltert" wird.


    Außerdem braucht nearEntities eine Position laut Wiki, fügen wir also die Position der KI ein.


    if (({ isPlayer _x && {alive _x} } count (_ki nearEntities ["Man", _dist])) > 0) then {

  • danke für den tipp.


    Jedoch habe ich gerade einen ganz anderen Fehler.


    ılıll|̲̅̅●̲̅̅|̲̅̅=̲̅̅|̲̅̅●̲̅̅|llılı Gründer von Beyond-Time ılıll|̲̅̅●̲̅̅|̲̅̅=̲̅̅|̲̅̅●̲̅̅|llılı


    TS: ts.beyond-time.eu

    Forum: https://beyond-time.eu/


    Jeder ist Herzlichst eingeladen in dieser Kalten Jahreszeit sich bei uns in einer netten Gesprächsrunde mit einer Heißen schokolade sich den Tag zu versüßen



    Rechtschreibfehler bitte in einen sack diesen Gut verschließen und in eine Schlucht werfen.

  • Habe ich gemacht. So ist der Aktuelle Code


    ılıll|̲̅̅●̲̅̅|̲̅̅=̲̅̅|̲̅̅●̲̅̅|llılı Gründer von Beyond-Time ılıll|̲̅̅●̲̅̅|̲̅̅=̲̅̅|̲̅̅●̲̅̅|llılı


    TS: ts.beyond-time.eu

    Forum: https://beyond-time.eu/


    Jeder ist Herzlichst eingeladen in dieser Kalten Jahreszeit sich bei uns in einer netten Gesprächsrunde mit einer Heißen schokolade sich den Tag zu versüßen



    Rechtschreibfehler bitte in einen sack diesen Gut verschließen und in eine Schlucht werfen.

  • Dein diag_log ist falsch. diag_log ["Ki ist bei %1", _pos]; muss diag_log format ["Ki ist bei %1", _pos]; heißen.

    [] spawn {
    for "_i" from 0 to 1 step 0 do {
    uisleep 10; [this]call DPG_fnc_npcstop
    };

    Funktioniert auch nicht.

    Wenn dann so:

    Code
    1. [this] spawn { params ["_ki",objNull,[objNull]];
    2. for "_i" from 0 to 1 step 0 do {
    3. uisleep 10; [_ki]call DPG_fnc_npcstop ;
    4. };


    Besser ist jedoch den Aufruf in der init nur 1x durchzuführen:

    [this] spawn DPG_fnc_npcstop;


    Und dann die Funktion so abändern:



    blackfisch  for "_i" from 0 to 1 step 0 do { anstatt von while {true} do { hat bei mir auch immer den Fehler Error Ungültige Zahl in Ausdruck geworfen. Kannst du mir erklären wieso? Ich komm nicht drauf was falsch ist.

  • so... noch ne kleine Optimierung: alive Abfrage raus bei der nearEntities, da der Befehl nur "lebende" (nicht zerstörte) Entities zurück gibt


    zu deiner Frage B4v4r!4n_Str!k3r kein Plan. ich nutz das ausschließlich und hatte nie Probleme

  • Super hat alles geklappt wie es soll. Das endgültige Script sieht so aus:


    Code: NPC Init
    1. [this, getmarkerpos "npc_town_1", 40, 7, "MOVE", "CARELESS", "BLUE", "LIMITED", "LINE", "this call CBA_fnc_searchNearby", [3,6,9]] call CBA_fnc_taskPatrol; this call DPG_fnc_randomloudout; [this] spawn DPG_fnc_npcstop;


    Diese 2 Datei erstellen und in den Funktions eintragen.

    Wichtig! Achtet darauf das ihr auch den Richtigen tag verwendet. Bei mir ist er DPG. Im Life Framework ist es life. Achtet darauf und ändert es zu eurem Tag.



    Damit laufen die NPC´s in einem umkreis von 40 Meter um den Marker "npc_town_1"


    Hier noch ein paar links zur Erklärung von den einzelne Funktionen. das auch jeder, sofern er es möchte, das nachbauen kann.


    https://cbateam.github.io/CBA_…i/fnc_taskPatrol-sqf.html


    https://community.bistudio.com/wiki/disableAI


    https://community.bistudio.com/wiki/enableAI



    MFG

    taker


    und vielen vielen danke für die Hilfe. Da hatte ich wirklich ein Brett vor dem Kopf. B4v4r!4n_Str!k3r und blackfisch

    ılıll|̲̅̅●̲̅̅|̲̅̅=̲̅̅|̲̅̅●̲̅̅|llılı Gründer von Beyond-Time ılıll|̲̅̅●̲̅̅|̲̅̅=̲̅̅|̲̅̅●̲̅̅|llılı


    TS: ts.beyond-time.eu

    Forum: https://beyond-time.eu/


    Jeder ist Herzlichst eingeladen in dieser Kalten Jahreszeit sich bei uns in einer netten Gesprächsrunde mit einer Heißen schokolade sich den Tag zu versüßen



    Rechtschreibfehler bitte in einen sack diesen Gut verschließen und in eine Schlucht werfen.

  • Du hast da etwas falsch verstanden: while {true} do { hat funktioniert, aber for "_i" from 0 to 1 step 0 do { nicht.


    while (true) do { mit runden Klammern gibt es meines Wissens in ArmA nach gar nicht.

    Ehmmmm. Ich habs in meiner Hud und diese geht auch :D

    MFG Bluetype

    :!:Hinweis:!:





    :!:Ich bin zwar erfahren mit der Sprache SQF, lerne trotzdem noch, definitiv kein Profi:!:

  • Ehmmmm. Ich habs in meiner Hud und diese geht auch :D

    Wäre mir neu, weil while nen code will und mit runden klammern ist es keiner. Whatever,


    #closed da erledigt

  • blackfisch

    Hat das Thema geschlossen