Variable zuweisen

  • Hallo...


    Ist es möglich einen Fahrzeug was n einem Auslöser steht eine Variable zuzuweisen...und wenn es diesen verlässt, dass die Variable wieder entfernt wird.


    Also ähnlich...is Fahrzeug (alle Landfzg) in Bereich dann weise diesem Variable zu...verlässt es diesen , Variable weg...müsste wiederholbar sein mit der entsprechend selben Variable...


    Danke

  • Bei mehreren Fahrzeugen ist der Auslöser ne schlechte Lösung.
    Mach dir erst mal Gedanken über die Bedingung im Auslöser.
    Wenn z.B. 3 Fahrzeuge im Auslöserbereich sind und einer diesen verläßt, bleibt er immer noch aktiv.

    Der Auslöser soll nur für ein Fahrzeug sein...und es ist auch dort nur Platz für ein Fahrzeug...es geht um eine Stellung die mittels Spawn Befehl mit verschiedenen Fahrzeugen besetzt werden kann. Nur müssen diese Fzg eine Variable erhalten, damit das Script für die FzgSchießbahn funktioniert...sobald das Fzg die Bahn verlässt brauch es die variable nicht mehr...nur das Fzg was im Auslöser steht.

  • Anmerkung:


    Code
    1. {
    2. if (_x in vehicles) then {
    3. ...
    4. };
    5. } forEach thisList

    Sollte eine einfache und effektive Optimierung sein.

    Hab ich mir auch gedacht. Aber die Variable wieder entfernen wenn der Trigger verlassen wird?


    Der Auslöser soll nur für ein Fahrzeug sein...und es ist auch dort nur Platz für ein Fahrzeug...es geht um eine Stellung die mittels Spawn Befehl mit verschiedenen Fahrzeugen besetzt werden kann. Nur müssen diese Fzg eine Variable erhalten, damit das Script für die FzgSchießbahn funktioniert...sobald das Fzg die Bahn verlässt brauch es die variable nicht mehr...nur das Fzg was im Auslöser steht.

    "brauch es die variable nicht mehr" oder "darf es die variable auf keinen Fall mehr gesetzt haben" ? Das wäre ein wichtiger Unterschied.



    On Act:


    C
    1. {
    2. if (_x in thisList) then {
    3. _x setVariable ["VARIABLE",VALUE];
    4. } else {
    5. _x setVariable ["VARIABLE",nil];
    6. };
    7. } count vehicles;

    Das wäre ein Weg. Es gibt sicherlich auch was performanteres.


    Code
    1. {
    2. _x setVariable ["VARIABLE", nil];
    3. } count vehicles - thisList;
    4. {
    5. _x setVariable ["VARIABLE", VALUE];
    6. } count thisList;

    Aber ist immernoch irgendwie doof 2 mal pro sekunde durch fast alle fahrzeuge zu iterieren.

  • OK...ich beschreibe die Situation nochmal. Evtl gibt es auch eine andere Lösung...


    Ich habe 2 Scripte laufen, in die ich so ohne weiteres nicht eingreifen kann. Das eine Spawnt Fahrzeuge an einem gewissen Punkt und das andere ist ein Script für eine Schießbahn. Letzteres benötigt die Variable "FiringRange_vehicle". dies ist quasi das Fahrzeug. Steigt nun der Spieler als Schütze in das Fahrzeug beginnt die Bahn "Hot" zu werden und der Schütze kann sich austoben.


    So...nun soll diese Variable aber nur dem Fahrzeug zugewiesen werden, welches in dem Bereich (Schießstand) steht. Da ich bis dato nur eine Bahn habe reicht es auch für nur ein Fahrzeug.


    Evtl. Anmerkung: Die Variable muss beim Spielstart gesetzt werden, habe ich bis dato realisiert. Und zwar besitzt diese ein Fahrzeug welches auch in einer Garage steht und nicht geöffnet werden kann.


    Am liebsten wäre mir wenn, Fahrzeug2 welches in den Bereich fährt, die Variable von dem Fahrzeug1 (was von Anfang an da ist) bekommt und wenn das Fzg den Bereich wieder verlässt zurückgetauscht wird. So ist die Variable immer vorhanden...


    Beispiel:


    Fahrzeug1 (mit Variable) steht in Garage
    Fahrzeug 2 wird gespawnt


    Fahrzeug 2 steht im Bereich und bekommt Variable von Fahrzeug1 zugewiesen


    Fahrzeug2 verlässt den Bereich
    Fahrzeug1 bekommt seine Variable wieder



    Hoffe konnte das so etwas veranschaulichen...vielen dank für die Hilfe und die Ideen

  • Ja in jeder Sprache das gleiche:


    foo
    bar
    baz


    veh1=foo
    veh2=bar
    baz=veh1


    while (distance veh1 veh2 < 100) do
    baz=veh2


    if (baz) do somthing


    und da "while" immer zu Problemen führt sollte man das in nem Eventhandler machen oder Trigger oder Exit Strategien haben.
    Aber ich bin nur Autodidakt!

    -- Es gibt Tage da verliert man und es gibt Tage da gewinnen die Anderen --

  • ja...ok..und nun?

  • Naja lerne eine Sprache. Grundlagen halt. Vorkauen hilft da nichts, da jedes Problem individuell ist, daher Sprache lernen - Problem finden - nach Problemlösungen suchen - Problemlösungen auf sein eigenes Problem anpassen. "Workflow, neudeutch"

    -- Es gibt Tage da verliert man und es gibt Tage da gewinnen die Anderen --

  • Steigt nun der Spieler als Schütze in das Fahrzeug beginnt die Bahn "Hot" zu werden und der Schütze kann sich austoben.

    Das heißt das ist eigentlich das was du mit dem Setzen der Variable bewirken willst? Dass das entsprechende Skript die Bahn "scharf schaltet"?


    Wie genau wird das denn in entsprechendem Skript gehandhabt mit besagter Variable? Wie und wann wird das denn für ein Fahrzeug geprüft?


    Weil prinzipiell wäre die performateste Lösung die mir einfällt die, dass du einen GetIn-EventHandler (oder wie auch immer der heißt) verwendest und in dem dann überprüfst ob sich das Fahrzeug an gewünschter Position befindet oder nicht und dementsprechend die Variable setzt oder nicht.


    Beim Aussteigen das Selbe und bei Zerstörung des Fahrzeugs die Variable wieder raus schmeißen.


    Dann hättest du nicht dauernd irgendwelche Positionsüberprüfungen die eig gar nicht nötig sind...


    Idealerweise würdest du auch nicht über diese Variable gehen sondern direkt eine Funktion aufrufen, die die Bahn scharf schaltet. Aber du hattest ja gesagt dass du an den verwendeten Skripts nichts ändern willst also belassen wirs mal dabei :)

  • Zu wenig genaue Informationen, deswegen mal ne einfache Lösung per Trigger.


    Trigger setzen,
    Typ: keine
    Aktivierung: Jeder
    Wiederholbar ankreuzen


    in die Bedingung:

    C
    1. vehicle player in thislist && {!isNil {vehicle player getVariable "FiringRange_vehicle"}}

    Bei Aktivierung:

    C
    1. vehicle player setVariable ["FiringRange_vehicle",true]; systemChat "FiringRange_vehicle = true"

    Bei Deaktivierung:

    C
    1. vehicle player setVariable ["FiringRange_vehicle",false]; systemChat "FiringRange_vehicle = false"


    In die Init der ausgewählten Fahrzeuge für die Schießbahn:

    Code
    1. this setVariable ["FiringRange_vehicle",false]


    Ich weiss nicht wie dein Schießbahn-Skript arbeitet, aber warum du jede halbe Sekunde einen Trigger bemühst, um eine popelige Variable auf true oder false zu setzen, ist mir ein Rätsel.
    Da kannste doch gleich ne Position mit "distance" checken.
    Dein Skript wird es egal sein ob
    'tag_Vehicle getVariable "FiringRange_vehicle" '
    oder
    'tag_Vehicle distance2D PlatzAufSchießbahn < 5'
    wahr ist.


    Edit:
    Muß verbessert werden, nicht unbedingt MP-tauglich.
    Ein Trigger ist im MP die schlechteste aller Lösungen.

    2 Mal editiert, zuletzt von Lukullus () aus folgendem Grund: Rechtschreibfehler

  • Muß verbessert werden, nicht unbedingt MP-tauglich.
    Ein Trigger ist im MP die schlechteste aller Lösungen.

    Funktionieren würde es glaube ich schon, aber man hätte nicht die Option den Trigger ausschließlich auf dem Server laufen zu lassen da mit player gearbeitet wird. Dementsprechnd muss der Check dauerhaft auf allen Clients durchgeführt werden...

  • Dann eben MP-tauglich für ein Fahrzeug.


    Trigger setzen,
    Typ: keine
    Aktivierung: keine
    Wiederholbar ankreuzen
    nur Server ankreuzen


    in die Bedingung:

    C
    1. tag_vehicle distance2D thisTrigger < 2

    Bei Aktivierung:

    C
    1. tag_vehicle setVariable ["FiringRange_vehicle",true,true]; "FiringRange_vehicle = true" remoteExec ["systemChat"];

    Bei Deaktivierung:

    Code
    1. tag_vehicle setVariable ["FiringRange_vehicle",false,true]; "FiringRange_vehicle = false" remoteExec ["systemChat"];


    Trigger aktiviert wenn das Fhz mit Namen "tag_vehicle" im 2m Bereich des Triggers steht.

  • Das Schießbahn-Script ist das aus BIs Bootcamp Mission auf Altis...dort steht Anfangs ein Fahrzeug mit der besagten Variable...sobald man in das Vehicle einsteigt beginnt das Script zu arbeiten. Aber irgendwie muss die Variable anfnags schon gesetzt sein...denn einfach entfernen funktioniert ja nicht...


    So...nun will ich aber nicht nur mit einem Fzg schießen...sondern der Schütze soll sich ein Fzg aussuchen können. Dazu kommt das VVS (Virtual Vehicle Spawn) ins Spiel. Nur kann ich in dieses auch nicht eingreifen und noch eine variable spawnen...denn diese muss ja auch schon zum Start da sein...


    Also...die Lösung wäre laut meiner Ansicht:


    Bei Start, Ein Fahrzeug in dem Areal platzieren (nicht im Auslöser) was die besagte Variable hat. Sobald ein Fahrzeug den Schießstand betritt, bekommt das neue Fzg die Variable von dem bereits vorhanden...und dieses eine neue .z.Bsp. Test. So...verlässt das eine Fahrzeug den Schießstand wieder...wechselt die Variable zurück zu test.


    Denkbar wäre auch eine Addaction "Schießstand Scharf schalten"...bei dem die variable wechselt.


    Die Variable muss nicht ständig wechseln...nur wenn ein Fzg auf den Schießstand fährt...


    PROBLEm ist halt nur wenn die Variable fehlt....also muss sie immer da sein auf der MAP...