Deaktivierung eines Kommandos im Script abfangen

Hier ist der ideale Ort um über Scripts und Mods für X²: Die Bedrohung zu diskutieren.

Moderators: Scripting / Modding Moderators, Moderatoren für Deutsches X-Forum

User avatar
Zhadoom
Posts: 102
Joined: Thu, 17. Feb 05, 16:17
x2

Deaktivierung eines Kommandos im Script abfangen

Post by Zhadoom »

Hallo allezusammen,

ich habe ein Script, dass man in der Stationskommandokonsole starten kann. Nun will ich die Anzahl der Stationen (im Sektor) die dieses Script benutzen. Wie kann ich diesen Wert bekommen?

Und ausserdem hab ich nicht wirklich ne Idee, wie ich verhindern kann, dass dieses Kommando zwei mal in derselben Station gestartet wird.


Bedanke mich schonmal im Voraus,
Hakan
Life is a ****** game... but with excellent graphics :)
laprican
Posts: 196
Joined: Fri, 13. Feb 04, 16:56
x2

Post by laprican »

naja, es gibt da ja die möglichkeit den kram auf einer bestimmten priorität zu starten, denn da gibt es ja abfragen für.
klappt allerdings nur, solange kein anderes script auf der selben läuft.
User avatar
Lucike
Posts: 12969
Joined: Sun, 9. May 04, 21:26
x4

Post by Lucike »

Zhadoom wrote:ich habe ein Script, dass man in der Stationskommandokonsole starten kann. Nun will ich die Anzahl der Stationen (im Sektor) die dieses Script benutzen. Wie kann ich diesen Wert bekommen?
Tja, eine wirklich gute Lösung gibt es nicht. Du könntest mit Prioritäten arbeiten. Benutze mal bitte die Suchfunktion, dort findest Du einiges an Infos.

vielleicht interessante Info:
-> http://www.egosoft.com/x2/forum/viewtopic.php?t=78292
-> http://www.egosoft.com/x2/forum/viewtopic.php?t=55700
Zhadoom wrote:Und ausserdem hab ich nicht wirklich ne Idee, wie ich verhindern kann, dass dieses Kommando zwei mal in derselben Station gestartet wird.
Schau dir mal die Raketenabwehr Moskito an. Ich denke ich habe das ganz gut hinbekommen. ;)

Gruß
Lucike
Image
User avatar
Zhadoom
Posts: 102
Joined: Thu, 17. Feb 05, 16:17
x2

Post by Zhadoom »

Naja... ich beschreib mal mein Problem etwas genauer:

Ich möchte abhängig von der Anzahl der Scripte die in diesem Sektor laufen, etwas auslösen.

Nun hatte ich die Idee für den Sektor eine Lokale Variable zu installieren (mit [SECTOR]->Set local variable name="XYZ" value=soundso)

Jedes Script das gestartet wird ehöht dann diese Variable... soweit sogut. Nur hab ich keine (mir bekannte) möglichkeit, diese Variable um eins zu reduzieren, wenn eines der Scripts deaktiviert wird. Gibt es denn keine Möglichkeit beim beenden des Scripts diese lokale Variable zu verändern?

EDIT:
@Lucike
Oki :D ... und thx

PS: hab die [url=http://forum.egosoft.com/search.php][b]Su[/b]ch[b]Fu[/b]nktion[/url] benutzt... aber anscheinend nicht richtig :roll:


Gruss,
Hakan
Life is a ****** game... but with excellent graphics :)
User avatar
Lucike
Posts: 12969
Joined: Sun, 9. May 04, 21:26
x4

Post by Lucike »

Zhadoom wrote:PS: hab die SuchFunktion benutzt... aber anscheinend nicht richtig :roll:
Mir fällt jetzt auch kein vernünftiges Suchwort außer "Prioritäten" oder "prio" ein. Aber vielleicht wären Tasks doch besser. Wühl dich mal durch.

-> http://www.egosoft.com/x2/forum/viewtopic.php?t=61775

Gruß
Lucike
Image
User avatar
Moonraven
Posts: 968
Joined: Wed, 27. Aug 03, 11:13
x3

Post by Moonraven »

Idee zum Thema nur einmal starten:

Beim normalen Start setzt du eine globale Variable, die du dann abfragen kannst und ggf. aus dem Script springen kannst.
Gruß Moonraven
Wer lesen kann, ist ganz klar im Vorteil.
[ external image ]
laprican
Posts: 196
Joined: Fri, 13. Feb 04, 16:56
x2

Post by laprican »

Das Probllem ist halt nur, dass man die Variable nicht wieder zurücksetzten kann, wenn das Script nicht mehr läüuft.

Was aber unter umständern klappen könnte, wäre in einer Variable in jedem Script durchlauf die aktuelle Spielzeit zu speichern. Und wenn der letzte Eintrag nun einige Zeit her ist davon auszugehen, dass das Script nicht mehr läuft.
User avatar
Moonraven
Posts: 968
Joined: Wed, 27. Aug 03, 11:13
x3

Post by Moonraven »

Klar kann ich die Variable zurücksetzen ... oder ich versteh da irgendwas nich so ganz :)

Ich denk mir das ungefähr so:

Code: Select all

      $globalvar = get global variable name "scriptxyz"
      //ist die variable vorhanden und gesetzt...dann nicht neu starten
       if $globalvar and $globalvar <> NULL then
            return Null
       end
       //ok jetzt laufen hier die normalen aktionen ab
             :
       //Scriptende Variable "Löschen" und raus aus dem script
       set global variable name "scriptxyz" to NULL
       return NULL

Ich hab den code jetzt so aus dem stehgreif getippt...entspricht also nur bedingt der Syntax :)
Gruß Moonraven
Wer lesen kann, ist ganz klar im Vorteil.
[ external image ]
laprican
Posts: 196
Joined: Fri, 13. Feb 04, 16:56
x2

Post by laprican »

ja, wenn das Script nur einmal so durchläuft.
Aber ich glaube kaum, das er das will, denn dann bräuchte er nicht abfragen ob das Script läuft.

Wenn du zB ein script mit "while [TRUE] ... end" hast und es dann beendest wird einfach abgebrochen und der code am Ende nie ausgeführt,
User avatar
Moonraven
Posts: 968
Joined: Wed, 27. Aug 03, 11:13
x3

Post by Moonraven »

Ok...auch hier geht der Lösungsansatz :)

Code: Select all

       $globalvar = get global variable name "scriptxyz"
      //ist die variable vorhanden und gesetzt...dann nicht neu starten
       if $globalvar and $globalvar <> NULL then
            return Null
       end
       //ok jetzt laufen hier die normalen aktionen ab
         While TRUE
              skip if not abbruch
                  break
          END
       //Scriptende Variable "Löschen" und raus aus dem script
       set global variable name "scriptxyz" to NULL
       return NULL 
Break bewirkt das die Schleife verlassen wird und der code nach dem END der While-Schleife ausgeführt wird.
Gruß Moonraven
Wer lesen kann, ist ganz klar im Vorteil.
[ external image ]
laprican
Posts: 196
Joined: Fri, 13. Feb 04, 16:56
x2

Post by laprican »

ich weiß :P

aber wenn du das script im slot einfach beendest wird das nicht passieren
User avatar
Moonraven
Posts: 968
Joined: Wed, 27. Aug 03, 11:13
x3

Post by Moonraven »

Das ist allerdings richtig. Leider bekommt man von der Engine nicht die geringsten "Events" mit in einem Script (außer AL-Plugins).

Ich hoffe mal das sich das in X3 ändert *GG
Gruß Moonraven
Wer lesen kann, ist ganz klar im Vorteil.
[ external image ]
User avatar
SpaceTycoon
Posts: 1190
Joined: Wed, 6. Nov 02, 20:31
x4

Re: Deaktivierung eines Kommandos im Script abfangen

Post by SpaceTycoon »

Zhadoom wrote:Hallo allezusammen,
ich habe ein Script, dass man in der Stationskommandokonsole starten kann. Nun will ich die Anzahl der Stationen (im Sektor) die dieses Script benutzen. Wie kann ich diesen Wert bekommen?
Hierzu wäre es erstmal gut, wenn Du mal sagst, wie das Script auf der Station denn beendet wird.
Beendet es sich selbst? Dann wäre es leicht machbar.
Beendet es der Spieler? Dann wird's schwieriger...
Zhadoom wrote:Und ausserdem hab ich nicht wirklich ne Idee, wie ich verhindern kann, dass dieses Kommando zwei mal in derselben Station gestartet wird.
Dieses Problem ist wirklich eine harte Nuß! Ich habe für meine Tarnvorrichtung http://www.egosoft.com/x2/forum/viewtopic.php?t=81761 folgende Lösung gefunden, damit diese auf einem Schiff nicht zweimal läuft:

Code: Select all

Hole die Prozess-ID dieses laufenden Scriptes:
005   $ProcessID = get PID

Lege die Prozess-ID dieses momentan laufenden Scriptes in eine lokale Variable:
006   [THIS] -> set local variable: name='CamouflageRunning' value=$ProcessID

[...] Weiterer Programmcode

Lese den Inhalt (Prozess-ID) aus der lokalen Variable
057    $DeviceRunning = [THIS] -> get local variable: name='CamouflageRunning'

Wenn die Prozess-ID der lokalen Variable nicht mehr mit der zuvor ausgelesenen Prozess-ID übereinstimmt, beende das Script:
058    skip if $DeviceRunning == $ProcessID
059     return null
Ein zweiter Start des Scriptes überschreibt den Inhalt der lokalen Variable mit einer anderen Prozess-ID (Zeile 006). Natürlich stehen die Zeilen 57 bis 59 innerhalb einer Schleife, so daß die ID bei jedem Durchlauf überprüft wird. Und wenn die ID durch den zweiten Scriptstart nicht mehr übereinstimmt, beendet sich das erste Script.
Hierdurch ist zwar (leider) nicht zu erreichen, daß das Script nicht ein zweites Mal gestartet werden kann; aber zumindest ist gewährleistet, daß es nur einmal läuft und nicht doppelt. Der zweite Start des Scriptes in einem Kommandoslot bewirkt einfach ein Beenden des schon im anderen Slot laufenden Scriptes.
Alle anderen Lösungsmöglichkeiten sind bei mir jedesmal an dem Umstand gescheitert, daß die lokale Variable nicht verschwindet oder nicht verändert werden kann, wenn der Spieler das Script manuell beendet. Insofern kann man die Sache nicht einfach an der Existenz oder dem Inhalt der lokalen Variable festmachen. Würde man das tun, ließe sich das Script nur einmal starten und nach manuellem Beenden durch den Spieler nicht mehr erneut starten.
User avatar
Zhadoom
Posts: 102
Joined: Thu, 17. Feb 05, 16:17
x2

Post by Zhadoom »

Also das Script sollte in einer Stationskommandokonsole laufen... und beenden tut es sich selbst nie (While TRUE Schleife). Aber wenn der Spieler es beendet treten genau die Probleme auf die SpaceTycoon beschrieben hat.
Hierdurch ist zwar (leider) nicht zu erreichen, daß das Script nicht ein zweites Mal gestartet werden kann; aber zumindest ist gewährleistet, daß es nur einmal läuft und nicht doppelt. Der zweite Start des Scriptes in einem Kommandoslot bewirkt einfach ein Beenden des schon im anderen Slot laufenden Scriptes.
Das könnte bei mir Schwierigkeiten bereiten, da das Script bei neustart das lokale Array löscht, das vom Spieler (mittels eines anderen Kommandos) angegeben wird. Aber evt. könnte ich das Umgehen

PS @SpaceTycoon:
Man könnte doch dafür sorgen, dass ein 2. Script sich sofort beendet, wenn es merkt, dass die lokale Variable mit der eigenen ProcessID nicht übereinstimmt.
Und wenn der Spieler das Script manuell beendet, müsste er dann mittels eines weiteren Kommandos (z.B. ResetLocalVariableProcessID) die localen Variablen zurücksetzen.

Gruss,
Hakan
Life is a ****** game... but with excellent graphics :)
User avatar
SpaceTycoon
Posts: 1190
Joined: Wed, 6. Nov 02, 20:31
x4

Post by SpaceTycoon »

Zhadoom wrote:PS @SpaceTycoon:
Man könnte doch dafür sorgen, dass ein 2. Script sich sofort beendet, wenn es merkt, dass die lokale Variable mit der eigenen ProcessID nicht übereinstimmt.
Du kannst es ja mal probieren. Jedoch muß dann das laufende Script ständig neu seine ID in die Variable schreiben. Und das zweite Script (ist ja genau dasselbe Script und macht insofern genau dasselbe) ebenfalls. Da die Scriptbefehle im Millisekundenbereich abgearbeitet werden, kommt man da schon in Timingprobleme. Und schon passiert es, daß entweder beide erstmal parallel laufen oder sich sogar beide beenden.
Und falls die Variable durch das laufende und das neu gestartete Script zufällig mal in derselben Millisekunde beschrieben würde, sind die Auswirkungen auf das gesamte X2-Spiel nicht vorhersehbar (Absturz, Einfrieren, was auch immer).
Zhadoom wrote:Und wenn der Spieler das Script manuell beendet, müsste er dann mittels eines weiteren Kommandos (z.B. ResetLocalVariableProcessID) die localen Variablen zurücksetzen.
Das macht keiner oder es wird vergessen. Und schon gibt's wieder Probleme.
User avatar
Lucike
Posts: 12969
Joined: Sun, 9. May 04, 21:26
x4

Post by Lucike »

Hakan, hast Du überhaupt mal die Links von mir angeschaut? Dieses Problem ist so alt wie der SE selbst. Ich habe das damals mit der Playtime gelöst und würde es wahrscheinlich heute wieder so machen.
Das könnte bei mir Schwierigkeiten bereiten, da das Script bei neustart das lokale Array löscht, das vom Spieler (mittels eines anderen Kommandos) angegeben wird. Aber evt. könnte ich das Umgehen
Natürlich kannst Du das umgehen. Hier ein Beispiel aus der Warenlogistik.
020 $PilotExperience = [THIS] -> get local variable: name='goods.dev.pilotexperience'
021 skip if $PilotLevel
022 $PilotLevel = 0
Gruß
Lucike
Image

Return to “X²: Die Bedrohung - Scripts und Modding”