Remove all actions in einem script

  • Weiß jemand wie man den removeallactions Ding1 Befehl in einem script verwenden kann, sodass keiner der SPieler mehr den Addaction ausführen kann, so wird jeweils nur die Action Entfernt, bei dem Spieler der sie auch ausgelöst hat, das bedeutet, sie kann jeweils einmal von jedem Spieler aktiviert werden, was aber nicht der Fall sein soll

  • removeAllActions ist eine schlechte Idee, denn dann verschwinden ja alle Aktionen aller anderen Skripte und Mods.


    Stattdessen sollte man der User Action eine Bedingung geben wie eine globale Variable. Die globale Variable wird dann einfach beim erstmaligen Ausführen der Aktion auf allen Klienten gesetzt, sodass die Aktion verschwindet. Das Skript dazu sollte auf dem Server laufen, sodass zwei Klienten die die User Action gleichzeitig ausführen nicht beide auslösen, während die besagte Variable noch nicht über das Netzwerk synchronisiert ist!

  • Mit remoteExec funktioniert es soweit danke.


    Commy könntest du das evtl weiter erklären? Ich verstehe das jetzt so, dass ich eine globale Variable mit


    player setVariable ["VARIABLE1",VALUE];


    an jeden Spieler hefte? Und wie frage ich jetzt wo ab ob die Variable vorhande ist?

  • Und ich hätte direkt noch ein Problem was mich persönlich sehr nervt!


    Wenn man in einer Mission ein Arsenal in einer Munitionskiste entwirft, sodass eigentlich nur diese Ausrüstung zur Verfügung stehen soll, so kann man im Multiplayer, vorgefertigte Loadouts laden, die nichtmal im Arsenal verfügbar sind. Wie kann man jegliche andere Ausrüstung für jeden Spieler sperren, die nicht im Arsenal aufgelistet ist?

  • >Wie kann man jegliche andere Ausrüstung für jeden Spieler sperren, die nicht im Arsenal aufgelistet ist?


    Ich würde einfach den LOAD-Button deaktivieren:


    >Ich verstehe das jetzt so, dass ich eine globale Variable mit player setVariable ["VARIABLE1",VALUE]; an jeden Spieler hefte?


    Nein, mit der Zeile schreibt man eine globale Variable auf den lokalen Spieler. Die globale Variable wird nicht mit anderen Klienten synchronisiert. Wenn man die Zeile nun in einem Skript ausführt, das auf jeder Maschine läuft, dann heftet man auf allen Maschinen die globale Variable auf den jeweiligen lokalen Spieler. Allerdings ist die Variable nur für den eigenen Spieler gesetzt. Auf remote Spielern (remote = Objekte, die von anderen Maschinen im Multiplayer kontrolliert werden) ist keine Variable gesetzt. Außerdem geht die Variable verloren, wenn der Spieler gewechselt wird (z.B. selectPlayer). Für respawnende Personen geht die Variable auf das neue Objekt über.


    Die ursprüngliche Frage ist für mich nicht ganz verständlich und auch nicht der Zusammenhang zum Inhalt des letzten Posts. Wenn du eine Aktion auf einem Objekt haben möchtest, die von jedem Spieler ausgeführt werden kann, aber nur einmal pro Mission, also nur "der erste gewinnt" sozusagen, dann müsste man das Ausführen der Aktion auf jeden Fall durch den Server validieren lassen. Ansonsten führen einfach zwei bis fünf Spieler die Aktion gleichzeitig aus. Die Latenz von Teamspeak ist schließlich geringer als die von Arma...


    Das benötigt dann eine Art simplen Servive Bus:


    Die Aktion schickt Anfrage an Server. Ist Aktion noch aktiviert, dann wird die Aktion auf allen Maschinen deaktiviert. Außerdem lässt der Server auf dem Klienten, der die Aktion als erster ausgeführt hat (dessen Anfrage auf Server zuerst eintraf), ein Skript ausführen.


    Wenn du allerdings eine Aktion haben möchtest, die von jedem Spieler ausgeführt werden kann, aber von jedem Spieler nur einmal, dann braucht man den Server natürlich nicht und das ganze ist eigentlich trivial einfach:


    Das Deaktivieren der Aktion wird über die Bedingung der Aktion realisiert. Dazu wird in jedem Fall eine Variable auf "false" gesetzt, die wenn undefiniert als "true" angenommen wird.
    Natürlich könnte man das ganze auch über removeAction machen. Allerdings finde ich das dann aufwendiger, besonders dann, wenn man die Aktion unter anderen Bedingungen dann doch wieder sichtbar haben möchte. Dann müsste man addAction erneut ausführen etc, statt einfach die jeweilige Variable zu setzten. Man könnte auch Aktionen, die nie wieder auftauchen so und Aktionen die vorrübergehend verschwinden so schreiben. Aber ich habe es lieber alles gleich und damit einfach.


    removeAllActions ist immer dämlich, da einfach alle Aktionen entfernt werden, auf diejenigen die ich überhaupt nicht hinzugefügt habe, sondern von sonstwo (BI, andere Autoren der Mission oder Mods, mein vergangenes Selbst..., mein zukünftiges Selbst!) stammen und ich somit meinen Kompetenzbereich des Skripts verlasse (es wechselwirkt unvorhersehbar mit anderen Skripten und ist damit nicht mehr modular).

  • Da es hierzu öfter Fragen gibt und es so ist wie @Montie weiter oben schon sagte etwas über "kurze fragen kurze antworten" hinaus geht, mal den ganzen Block in ein neues Thema ausgelagert.

    Passwords are like underwear. You should change them often (okay, maybe not every day). Don’t share them. Don’t leave them out for others to see (no sticky notes!). Oh, and they should be sexy. Wait, sorry, I mean they should be mysterious. In other words, make your password a total mystery to others.
    :thumbsup:

  • private _var = player getvariable "Variable";


    if(isNil "_var")then{ // wenn nicht vorhanden mache nachfolgenden Code
    player setVariable ["Variable",1,true]; // so läuft dein nur 1x hier je Spieler


    //dein Code, was auch immer hier passieren soll


    }

  • Greni, wenn jetzt 3 Spieler gleichzeitig die gleiche Aktion auf dem selben Objekt ausführen, dann ist die "Variable"-Variable noch nicht synchronisiert und das Script läuft auf allen 3 Maschinen. Du hast meinen Post vollkommen ignoriert.