Frage zur Handhabung der Funktion BIS_fnc_hasItem

  • Hallo Zusammen,


    Situation: Der Spieler soll ein Laptop sicherstellen (im Inventar haben). Das habe ich mit [player, "Laptop_Closed"] call BIS_fnc_hasItem; versucht. Da wird wohl eine Variable auf true gesetzt. Wie kann ich diese variable im script weiterverarbeiten?


    meine Idee: if ([player, "Laptop_Closed"] call BIS_fnc_hasItem;) then {....}, aber ich bin leider dermaßen Weit weg vom Thema scripting, habe Arma 3 seit zig Jahren nicht angefasst und wollte mal wieder rumbasteln.

    Danke und viele Grüße Saint, aka Onkel Bo

  • Moin Saint,


    interessanter Ansatz.

    Wie hast Du denn das Laptop in das Inventory der Einheit bekommen?

    Ich kenne das nur, wenn es sich über typische Items handelt mit denen der Spieler auch arbeiten kann


    Das Laptop wäre ansich ein Objekt, was so eigentlich nicht in der Unitorm, Weste oder Rucksack vorgesehen


    Um das Inventory zu prüfen

    _items = items player; //Hier entsteht ein Array, welches alle Gegenstände des Spielers enthält

    -> in items // in der if Abfrage wird das Array nach dem genannten Gegenstand durchsucht und geht nur dann weiter, wenn der Gegenstand auch gefunden wird -> also true

    Wenn es nicht gefunden wird, wird die if Abfrage übersprungen


    if ("Laptop_Closed" in _items) then {

    // hier würde dann das als Skript folgen, was immer dann passieren soll

    };


    Falls Du uns mitteilst, warum das Laptop zwingend in Unitorm, Weste oder Rucksack soll, könnte man weiter ansetzen oder Alternativen vorschlagen umd das abzufragen

  • Hallo Greni,


    das Laptop ist tatsächlich ein aufnehmbares Item. Es taucht nach erfolgter Aufnahme im Inventar des Spielers auf. Eine funktionierende Lösung mittels Auslöser habe ich gefunden. Der Funktionsaufruf [player, "Laptop_Closed"] call BIS_fnc_hasItem gibt entweder false oder true wieder. Aus der mission.sqm

    class Item20

    {

    dataType="Trigger";

    position[]={5677.1089,92.866005,11066.566};

    class Attributes

    {

    condition="[player, ""Laptop_Closed""] call BIS_fnc_hasItem;";

    onActivation="hint ""der spieler hat das laptop gefunden""";

    sizeA=0;

    sizeB=0;

    activationBy="ANY";

    };

    id=99;

    type="EmptyDetector";

    atlOffset=9.9960022;

    };


    Der Lösungsansatz funktioniert gut soweit. Meine Frage dazu ist, wie ich den Funktionsaufruf [player, "Laptop_Closed"] call BIS_fnc_hasItem in eine Schleife o. Ä. in einem Script einbaue. Sobald die Funktion dann true ausgibt, sollen Variablen per setvariable und getvariable verarbeitet werden, bspw:

    [player getVariable "laptopVar"] params [["_laptopVar", "", [""]]];


    das ist die grobe Idee. Warum der Laptop unbedingt als Item im Inventar sein muss, muss nicht unbedingt, würde ich aber "immersiv" finden.

  • Hallo Greni,

    zum Missionsstart hat der Spieler das Laptop ja noch nicht, der Wert ist entsprechend false, und wird per hint auch entsprechend ausgegeben. Nimmt der Spieler es auf, dann passiert nix, kein hint. Müsste die Abfrage in eine/r while do schleife bzw. waituntil bedindingung eingebunden werden?

  • Ich antworte mal auf meinen eigenen letzten Post, falls das ok ist.

    Code
    1. private _laptopvariable = player getVariable ["_laptopvariable", false];
    2. hint format ["Wert = %1",_laptopvariable];//debug
    3. waitUntil {[player, "Laptop_Closed"] call BIS_fnc_hasItem;};
    4. missionNamespace setvariable ["_laptopvariable", true];
    5. hint format ["Wert = %1",_laptopvariable];//debug
    6. // ab hier kann dann alles mögliche passieren, neue tasks generiert, usw.

    Das ist eine denkbare Lösung, funktioniert soweit. Keine Ahnung in wie Weit so eine waituntil Schleife performance raubt.

    Nochmal zur Erklärung warum das Laptop unbedingt ein Inventar Item sein muss: In meiner Missionsidee trägt es ein "Bösewicht" mit sich im Inventar (Umhängetasche), dieser Bösewicht "flieht" unter bestimmten Bedingungen, sprich das sicherzustellende Laptap ist dann unterwegs irgendwo, was das sicherstellen schwierig macht.


    Vielen Dank für den Denkanstoß Greni. :thumbup:

  • Code
    1. actionID = laptop addAction ["<t color='#33cc33'>Starten</t>",{laptop removeAction actionID;execVM "laptop_grabbed.sqf; "},[],1,false,true,"","_this distance _target < 5"];}


    grabLaptop.sqf

    Code
    1. laptopGrabbed = true;
    2. publicVariable "laptopGrabbed";
    3. player setVariable ["hasLaptop",1,true];

    Hier kannst Du dann dem Spieler das Laptop in den Rucksack dann packen oder auch bereits in der addaction oder auch die Codezeilten komplett da einfügen, dann brauchst Du die sqf nicht


    Wie es dann weitergeht kann ich nur erahnen ... Laptop muss irgendwo abgegeben werden?


    das würde ich dann über einen Trigger im Zielbereich lösen ...


    Wiederholbar


    Bedingung

    vehicle player in thisList && laptopGrabbed


    Bei Aktivierung

    Code
    1. {
    2. if (isPlayer _X) {
    3. private _gotLaptop = _X getvariable "hasLaptop";
    4. if(isNil "_gotLaptop")then
    5. {
    6. //Mission complete?Dem Auftraggeber das Teil auf den Tisch knallen? ;)
    7. }
    8. }
    9. } foreach thisList