Deaktivierung eines Kommandos im Script abfangen
Moderators: Scripting / Modding Moderators, Moderatoren für Deutsches X-Forum
-
- Posts: 102
- Joined: Thu, 17. Feb 05, 16:17
Deaktivierung eines Kommandos im Script abfangen
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
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 

-
- Posts: 196
- Joined: Fri, 13. Feb 04, 16:56
-
- Posts: 12969
- Joined: Sun, 9. May 04, 21:26
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.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?
vielleicht interessante Info:
-> http://www.egosoft.com/x2/forum/viewtopic.php?t=78292
-> http://www.egosoft.com/x2/forum/viewtopic.php?t=55700
Schau dir mal die Raketenabwehr Moskito an. Ich denke ich habe das ganz gut hinbekommen.Zhadoom wrote:Und ausserdem hab ich nicht wirklich ne Idee, wie ich verhindern kann, dass dieses Kommando zwei mal in derselben Station gestartet wird.

Gruß
Lucike

-
- Posts: 102
- Joined: Thu, 17. Feb 05, 16:17
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
... 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
Gruss,
Hakan
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

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

Gruss,
Hakan
Life is a ****** game... but with excellent graphics 

-
- Posts: 12969
- Joined: Sun, 9. May 04, 21:26
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.Zhadoom wrote:PS: hab die SuchFunktion benutzt... aber anscheinend nicht richtig![]()
-> http://www.egosoft.com/x2/forum/viewtopic.php?t=61775
Gruß
Lucike

-
- Posts: 196
- Joined: Fri, 13. Feb 04, 16:56
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.
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.
-
- Posts: 968
- Joined: Wed, 27. Aug 03, 11:13
Klar kann ich die Variable zurücksetzen ... oder ich versteh da irgendwas nich so ganz 
Ich denk mir das ungefähr so:
Ich hab den code jetzt so aus dem stehgreif getippt...entspricht also nur bedingt der Syntax

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

-
- Posts: 196
- Joined: Fri, 13. Feb 04, 16:56
-
- Posts: 968
- Joined: Wed, 27. Aug 03, 11:13
Ok...auch hier geht der Lösungsansatz 
Break bewirkt das die Schleife verlassen wird und der code nach dem END der While-Schleife ausgeführt wird.

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
-
- Posts: 196
- Joined: Fri, 13. Feb 04, 16:56
-
- Posts: 1190
- Joined: Wed, 6. Nov 02, 20:31
Re: Deaktivierung eines Kommandos im Script abfangen
Hierzu wäre es erstmal gut, wenn Du mal sagst, wie das Script auf der Station denn beendet wird.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?
Beendet es sich selbst? Dann wäre es leicht machbar.
Beendet es der Spieler? Dann wird's schwieriger...
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:Zhadoom wrote:Und ausserdem hab ich nicht wirklich ne Idee, wie ich verhindern kann, dass dieses Kommando zwei mal in derselben Station gestartet wird.
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
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.
-
- Posts: 102
- Joined: Thu, 17. Feb 05, 16:17
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.
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
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 UmgehenHierdurch 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.
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 

-
- Posts: 1190
- Joined: Wed, 6. Nov 02, 20:31
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.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.
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).
Das macht keiner oder es wird vergessen. Und schon gibt's wieder Probleme.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.
-
- Posts: 12969
- Joined: Sun, 9. May 04, 21:26
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.
Lucike
Natürlich kannst Du das umgehen. Hier ein Beispiel aus der Warenlogistik.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
Gruß020 $PilotExperience = [THIS] -> get local variable: name='goods.dev.pilotexperience'
021 skip if $PilotLevel
022 $PilotLevel = 0
Lucike
