Aus einem Script andere laufende Scripte erkennen.

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
Lucike
Posts: 12969
Joined: Sun, 9. May 04, 21:26
x4

Aus einem Script andere laufende Scripte erkennen.

Post by Lucike »

Man, habe ich gestern bis Nachts 2 Uhr gefummelt. ;)

Beispiel:

Auf einem SKW in Roter Schein läuft ein Überwachungsscript. Wie erkenne ich genau dieses Script aus einem anderen Script heraus, welches nicht auf diesem Objekt läuft?

Ich habe es bereits mit dem setzten von globalen Variablen versucht. Nur wer löscht diese globale Variable wieder beim Abbruch des zu findenden Scripts. Dazu habe ich keine Möglichkeit gefunden.

Dann habe ich es mit der Variable "Playtime" versucht, in dem ich in eine globale Variable die aktuelle Spielzeit schreiben lassen. Das klappt sogar, da das zweite Script die aktuelle Spielzeit mit der gespeicherten Spielzeit des ersten Scripts vergleichen kann. Das sieht für mich aber ziemlich provisorisch aus.

Viele Scripter erstellen Objekte, wie zB. Schiffe, Baken oder Asteroiden, um einen Zustand festzulegen. Da ist aber wieder das Problem mit dem zerstören des Objekts bei Abbruch.

Viele werden jetzt denken, man ist der doof. Er kann doch die GlobVar bei einem weiteren Start des ersten Script wieder löschen lassen. Nur hätte ich es gerne in den Slots der Fabriken sichtbar, dass dort ein Script läuft. Also eine Schleife mit setzen einer GlobVar. Nur beim Abbruch des Scripts bleibt die GlobVar gesetzt.

Wenn ich jetzt zu blind war oder es wirklich keine Möglichkeit gibt dann bleibe ich bei der Variante Playtime. Das klappt eigentlich ganz gut, sieht halt nur ziemlich provisorisch aus. ;)

Gruß
Lucike
Image
ComMcNeil
Posts: 1430
Joined: Thu, 11. Sep 03, 19:14
x3tc

Post by ComMcNeil »

ich hab mir das jetz 3 mal durchgelesen, aber ich kapier nicht genau WAS du tun willst, bitte erläutere das nochmal, viell. isses eh ganz einfach und ich checks nicht :D
The gods made heavy metal and they saw that is was good
They said to play it louder than Hell
We promised that we would
When losers say it's over with you know that it's a lie
The gods made heavy metal and it's never gonna die
User avatar
Lucike
Posts: 12969
Joined: Sun, 9. May 04, 21:26
x4

Post by Lucike »

ComMcNeil wrote:ich hab mir das jetz 3 mal durchgelesen, aber ich kapier nicht genau WAS du tun willst, bitte erläutere das nochmal, viell. isses eh ganz einfach und ich checks nicht :D
Ok ... ;) ... noch mal ein genaueres Beispiel.

Jeder kennt den bereits vorhandenen automatischen Geldtransfer der Stationen.

Nun will ich das der Transfer nicht automatisch geschieht, sondern manuell aus einem Schiff heraus. Die Konfiguration soll aber sehr ähnlich ablaufen wie bei dem bereits vorhandenen Geldtransferscript. Das heißt man muss jeder Fabrik mitteilen das sie überweisen soll und natürlich wie viel (Limit).

Es soll in den Slots auch sichtbar bleiben und schell zu erkennen sein, das diese Fabrik markiert oder angemeldet ist. Soweit bin ich bereits. Nur wie sieht der Profiweg aus? Wie erkennt das Schiffsscript das laufende Fabrikscript? (s.o. Problematik GlobVar)

Gruß
Lucike
Image
ComMcNeil
Posts: 1430
Joined: Thu, 11. Sep 03, 19:14
x3tc

Post by ComMcNeil »

ich kenn mich beim scripten leider nicht so extrem gut aus, aber schau mal ob scripts viell ne nummer haben, dann könntest dus doch direkt erkennen, oder versteh ich jetz noch immer nicht genau was du willst? :D
The gods made heavy metal and they saw that is was good
They said to play it louder than Hell
We promised that we would
When losers say it's over with you know that it's a lie
The gods made heavy metal and it's never gonna die
MasterUltima
Posts: 144
Joined: Wed, 4. Feb 04, 14:45
x3

Post by MasterUltima »

öhm wenn ich das richtig verstanden habe musst Du im Fabrikscript beim Start eine lokale Variable der Fabrik setzen und beim Beenden wieder löschen. Also z.B.

Code: Select all

* Start
THIS -> set local variable 'Your Script Name.RunningFlag' to <number>1

* Ende
THIS -> set local variable 'Your Script Name.RunningFlag' to <number>0

Im Schiffsscript musst Du dann abfragen

Code: Select all

$RunningFlag = $Factory -> get local variable 'Your Script Name.RunningFlag'
if ($RunningFlag == <number>1)
* Fabrikscript schon am laufen
else
* Fabrikscript noch nicht am laufen
end
User avatar
Lucike
Posts: 12969
Joined: Sun, 9. May 04, 21:26
x4

Post by Lucike »

MasterUltima wrote:öhm wenn ich das richtig verstanden habe musst Du im Fabrikscript beim Start eine lokale Variable der Fabrik setzen und beim Beenden wieder löschen. Also z.B.

Code: Select all

* Start
THIS -> set local variable 'Your Script Name.RunningFlag' to <number>1

* Ende
THIS -> set local variable 'Your Script Name.RunningFlag' to <number>0

Im Schiffsscript musst Du dann abfragen

Code: Select all

$RunningFlag = $Factory -> get local variable 'Your Script Name.RunningFlag'
if ($RunningFlag == <number>1)
* Fabrikscript schon am laufen
else
* Fabrikscript noch nicht am laufen
end
Hm, so weit war ich auch schon. Nur leider werden die Scripts der Slots beim wählen der Funktion "kein" einfach abgebrochen. Das heißt die lokale oder globale Variable wird dabei nicht gelöscht. Man bräuchte also ein 3 Script um die Variable zu löschen. Das will ich natürlich umgehen.

Trotzdem vielen Dank an euch beiden. ;)

Gruß
Lucike
Image
MasterUltima
Posts: 144
Joined: Wed, 4. Feb 04, 14:45
x3

Post by MasterUltima »

Wenn Du sagst, dass bei Drück auf KEIN das Fabrikscript sowieso abgebrochen wird, dann musste das ja sicher auch irgendwo in dem Fabrikscript handeln wenn der dann an der selben Fabriken neugestartet wird. Wenn Du das Schiffsscript dann sagst er soll das Fabrikscript beenden, falls es läuft, und dann einfach neustarten, haste keine Probleme mehr. So müsste das ganz einfach zu lösen sein.
XeHonk
Posts: 1087
Joined: Sun, 7. Mar 04, 23:03
x3tc

Post by XeHonk »

masterultima: Lucike will ne funktion ausführen, wenn ein bestimmtes script auf einem objekt läuft
wenn du das script beendest, dann bringt dir das nicht so wirklich viel, weil dann die information, ob das script lief, ja auf jeden fall verloren ist :] (und wenn du nach jedem ausführen einfach die lokalen variablen löscht, dann wird das script einmal zuviel ausgeführt :|)
User avatar
Lucike
Posts: 12969
Joined: Sun, 9. May 04, 21:26
x4

Post by Lucike »

XeHonk wrote:masterultima: Lucike will ne funktion ausführen, wenn ein bestimmtes script auf einem objekt läuft
Ganz genau.

Stationskonsole:

Slot 1 : Manueller Geldtransfer zum Spielerkonto {GlobVar wird gesetzt}
Slot 2 : kein
Slot 3 : kein

Jetzt kann das Schiffsscript die GlobVar abfragen die diese Station in seine Arbeit mit einbeziehen.

Slot 1 : kein
Slot 2 : kein
Slot 3 : kein

Wird jetzt das Script in Slot 1 beendet, bleibt dabei die GlobVar leider gesetzt. Das Schiffsscript bezieht diese Station immer noch mit ein. Man müsste jetzt ein weiteres Script starten, um die GlobVar zu löschen. :(

Meine Idee war es ein Script in Slot 1 zu betreiben, welches die "Playtime" in eine GlobVar schreibt. Die GlobVar wird vom Schiffsscript ausgelesen und mit der aktuellen "Playtime +-10" verglichen und kann somit erkennen, ob das Stationsscript noch läuft oder nicht. Ich dachte es gibt vielleicht eine nicht so provisorische Lösung. ;)

Gruß
Lucike
Image
Silia
Posts: 60
Joined: Mon, 10. May 04, 12:35
x2

Post by Silia »

Da gibt's schon noch mehr Möglichkeiten.

Die einfachste ist das aktuelle Command abzufragen.
Die Befehle dazu sind:
4.031 <RefObj> set command: <Object Command>
4.032 <RetVar/IF> <RefObj> get command

Das Command wird beim Abruch des Scripts automatisch zurückgesetzt. Leider hab ich noch nicht raus wie man Commands aus den zusätzlichen Slots abfrägt.


Ne andere Möglichkeit wäre es das script nicht von aussen zu erkennen sondern es dazu zu bringen sich zu melden.

Man könnte mit
1.0121 <RefObj> interrupt with script <Script Name> and prio <Var/Number>: arg1=<Value> arg2=<Value> arg3=<Value> arg4=<Value>
ein Script auf der Station Starten, das eine Markierung setzt ([This] -> set local variable: name="meldung.an.schiff" value=$Schiff)

Das hauptscript auf der Station kontrolliert regelmäßig diese Variable und meldet sich sobald die Variable von aussen gesetzt wurde.
User avatar
Lucike
Posts: 12969
Joined: Sun, 9. May 04, 21:26
x4

Post by Lucike »

So, ich habe das mal mit der Playtime gebastelt. Funktioniert auch recht gut. Aber Silia's Vorschlag schaue ich mir in jedem Fall noch mal an. ;)

Hier das Script, welches auf der Station läuft:

Code: Select all

Script plugin.admin.mntpa
Version: 1
for Script Engine Version: 25

Description
Manueller Geldtransfer zum Spielerkonto
Arguments
1: CreditLimit , Var/Number , 'CreditLimit' 
Source Text

001   $Station.ID = [THIS] -> get ID code
002   $GlobVar1 = 'ADMIN1-' + $Station.ID
003   $GlobVar2 = 'ADMIN2-' + $Station.ID
004   set global variable: name=$GlobVar1 value=$CreditLimit
005   while [TRUE]
006    $Playtime = playing time
007    set global variable: name=$GlobVar2 value=$Playtime
008 @  = wait 5000 ms
009   end
010   return null
Hier das Schiffsscript:

Code: Select all

Script plugin.admin.crtransferast
Version: 1
for Script Engine Version: 25

Description
Credits aller angemeldeten Stationen transferieren
Arguments
Source Text

001   $Station.List =  array alloc: size=0
002   $MaxSecX = get max sectors in x direction
003   $MaxSecY = get max sectors in y direction
004   
005   $SecX = 0
006   while $SecX < $MaxSecX
007    $SecY = 0
008    while $SecY < $MaxSecY
009     $SelSec = get sector from universe index: x=$SecX, y=$SecY
010     if $SelSec != null
011      $Station =  find station: sector=$SelSec class or type=null race=Player flags=[Find.Multiple] refobj=null maxdist=null maxnum=500 refpos=null
012      $Station.size =  size of array $Station
013      $work1 = 0
014      while $work1 < $Station.size
015       $work2 = $Station[$work1]
016       append $work2 to array $Station.List
017       inc $work1 = 
018      end
019     end
020     inc $SecY = 
021    end
022    inc $SecX = 
023   end
024   
025   $Station.size =  size of array $Station.List
026   $work1 = 0
027   $TotalTransfer = 0
028   while $work1 < $Station.size
029    $Station = $Station.List[$work1]
030    $Station.ID = $Station -> get ID code
031    $GlobVar1 = 'ADMIN1-' + $Station.ID
032    $GlobVar2 = 'ADMIN2-' + $Station.ID
033    $CreditLimit = get global variable: name=$GlobVar1
034    $Playtime1 = playing time
035    $Playtime2 = get global variable: name=$GlobVar2
036    if ( $Playtime2 + 10000 ) > $Playtime1
037     $CreditStation = $Station -> get money
038     $Difference = $CreditStation - $CreditLimit
039     if $Difference > 0
040      $TotalTransfer = $TotalTransfer + $Difference
041      add money to player: $Difference
042      $Difference = 0 - $Difference
043      $Station -> add money: $Difference
044     end
045    end
046    inc $work1 = 
047   end
048   
049   write to player logbook: printf: pageid=8000 textid=100, $TotalTransfer, null, null, null, null
050   return null
Gruß
Lucike
Image
Silia
Posts: 60
Joined: Mon, 10. May 04, 12:35
x2

Post by Silia »

Wie wärs damit:

Auf dem Schiff läuft das:

Code: Select all

Script plugin.admin.crtransferast 
Version: 1 
for Script Engine Version: 25 

Description 
Credits aller angemeldeten Stationen transferieren 
Arguments 
Source Text 

001   $Playtime = playing time
002   set global variable: name="Zahltag" value=$Playtime
003   return NULL
und auf den Stationen dasda

Code: Select all

Script plugin.admin.mntpa 
Version: 1 
for Script Engine Version: 25 

Description 
Manueller Geldtransfer zum Spielerkonto 
Arguments 
1: CreditLimit , Var/Number , 'CreditLimit' 
Source Text 

001   $letzte.Auszahlung = playing time
002   while [true]
003      $Zahltag = get global variable: name="Zahltag"
004      if $Zahltag > $letzte.Auszahlung
005        $CreditStation = $Station -> get money 
006        $Difference = $CreditStation - $CreditLimit 
007        if $Difference > 0 
008          $TotalTransfer = $TotalTransfer + $Difference 
009          add money to player: $Difference 
010          $Difference = 0 - $Difference 
011          $Station -> add money: $Difference 
012        end 
013        $letzte.Auszahlung = playing time
014     end
015 @  = wait 60000 ms 
016   end
017   return NULL

Dauert zwar ne Minute bis das GEld von allen Stationen da ist aber geht nicht ganz so auf die Performance.
User avatar
Lucike
Posts: 12969
Joined: Sun, 9. May 04, 21:26
x4

Post by Lucike »

Silia wrote:Dauert zwar ne Minute bis das Geld von allen Stationen da ist aber geht nicht ganz so auf die Performance.
Auch nicht schlecht. ;) Aber geht meine Variante echt so auf die Performance? Ich habe die Sache auf 150 Fabriken laufen und konnte absolut keinen Performance-Einbruch erkennen.

Das mit der einen Minute könnte man sogar ins Spiel einbinden. Überweisung ins Ausland dauern ja auch länger. ;)

Gruß
Lucike
Image

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