[BETA] lib.map.getsectors

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

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

User avatar
heromaster
Posts: 21
Joined: Sat, 31. May 03, 03:22
x3

[BETA] lib.map.getsectors

Post by heromaster »

UXA #cfee präsentiert:

lib.map.getsectors

Dieses Script "scannt" das Universum nach Sektoren und legt diese im globalen Array lib.map.getsectors.Array ab.

Vorteil: Einmal von einem Script aufgerufen, müssen nie mehr andere Scripte diese Prozedur wiederholen was wiederum in einer schnelleren Ladezeit des Spielstand resultiert.

Einbindung:

Code: Select all

   $Sectors = get global variable: name='lib.map.getsectors.Sectors'

   if not $Sectors
 @  = [THIS] -> call script 'lib.map.getsectors' : 
    $Sectors = get global variable: name='lib.map.getsectors.Sectors'
   end
Download: http://teurokiller.net/x2/lib.map.getsectors.zip

Eine Readme ist dem Script beigefügt.

EDIT:URL gefixt
Last edited by heromaster on Wed, 27. Apr 05, 13:26, edited 2 times in total.
Sie sind gekommen, um Zeugen des Anbeginns zu sein. Die Wiedergeburt des Paradieses, ausgeplündert von der Menschheit.
Deleted User

Post by Deleted User »

Idee ist ja nicht schlecht aber ich glaube dir ist da ein kleiner Fehler unterlaufen.

Sowohl bei Set Global als auch bei Get Global muss bei dem Parameter Name ein String und keine Variable stehen ausser man hat der Variable vorher einem String zugewiesen was du aber soweit ich sehen kann nicht gemacht hast.

Es müsste

Code: Select all

$Sectors = get global variable: name='lib.map.getsectors.Array'
bzw

Code: Select all

set global variable: name='lib.map.getsector.Array' value=$Sector
lauten.
User avatar
heromaster
Posts: 21
Joined: Sat, 31. May 03, 03:22
x3

Post by heromaster »

:lol:

Es muss eine Variable sein und die wird erst nach dem Aufruf des Scripts global gesetzt. Deswegen in Zeile 3 die If-Bedingung ob $lib.map.getsectors nicht null ist. Wenn die globale Variable nicht gesetzt ist, ist $Sectors == null und die Bedingung wird wahr und damit wird das Script dann in Zeile 4 aufgerufen.
Die Überprüfung ist notwendig, da irgendein Script ja das erste sein wird, welches mein Script aufruft.
Sie sind gekommen, um Zeugen des Anbeginns zu sein. Die Wiedergeburt des Paradieses, ausgeplündert von der Menschheit.
User avatar
StarTrekMarc
Posts: 2143
Joined: Sat, 3. Apr 04, 16:38
x4

Post by StarTrekMarc »

Der Name muss ein String sein, aber natürlich kann dieser auch über eine Variable vergeben werden ;)
User avatar
SpaceTycoon
Posts: 1190
Joined: Wed, 6. Nov 02, 20:31
x4

Post by SpaceTycoon »

heromaster wrote::lol:
Es muss eine Variable sein und die wird erst nach dem Aufruf des Scripts global gesetzt. Deswegen in Zeile 3 die If-Bedingung ob $lib.map.getsectors nicht null ist. Wenn die globale Variable nicht gesetzt ist, ist $Sectors == null und die Bedingung wird wahr und damit wird das Script dann in Zeile 4 aufgerufen.
Die Überprüfung ist notwendig, da irgendein Script ja das erste sein wird, welches mein Script aufruft.
Und Du hast das selbst getestet, ob es so funktioniert, wie Du denkst?
Das würde mich wundern. :roll:

Denn wie MacGyver8472 schon sagte und in seinem Beispiel zeigte, müssen die NAMEN globaler Variable als Zeichenkette (String) ausgelesen oder gesetzt werden.
In Deinem Script "lib.map.getsectors.xml" finde ich nur eine einzige Zeile dazu, wie die Variable heißt:

Code: Select all

027   set global variable: name=$lib.map.getsector.Array value=$Sector
Und dies ist wiederum eine Variable, denn sie beginnt mit einem "$". Da diese Variable keine Belegung hat, ist sie "null". Die globale Varaible hätte dann den Namen "null". Daher kann das so gar nicht funktionieren.

Was MacGyver8472 meint, ist folgendes:
Wenn das SO aussähe, wie nachfolgend, würde es funktionieren.

Code: Select all

026  $lib.map.getsectors.Array = 'lib.map.getsectors.Array'
027  set global variable: name=$lib.map.getsector.Array value=$Sector
Also der NAME von globalen (und auch lokalen) Variablen muss eine Zeichenkette (String) sein. Und ist sie dann vorhanden, so kann ihr Inhalt anhand Ihres Namens nur ausgelesen werden, wenn man den Namen als Zeichenkette einsetzt:

NICHT so, denn das würde ein globale Variable lesen wollen, deren Name der Inhalt der Variablen $lib.map.getsectors.Array wäre:

Code: Select all

$Sectors = get global variable: name=$lib.map.getsectors.Array
SONDERN so:

Code: Select all

$Sectors = get global variable: name='lib.map.getsectors.Array'
User avatar
heromaster
Posts: 21
Joined: Sat, 31. May 03, 03:22
x3

Post by heromaster »

Hmm, ich hatte das mal mit nem String ausprobiert, ging aber nicht. Beim Aufruf von get global bekam ich immer null zurück. Will mich da aber nicht streiten, zumal ich erst seit einigen Wochen im Editor rumwerkele :)
So wie das Script jetzt läuft, funktioniert es bei mir und du kennst ja sicherlich auch den Spruch --> "Never change a running system" ;)
Sie sind gekommen, um Zeugen des Anbeginns zu sein. Die Wiedergeburt des Paradieses, ausgeplündert von der Menschheit.
User avatar
StarTrekMarc
Posts: 2143
Joined: Sat, 3. Apr 04, 16:38
x4

Post by StarTrekMarc »

So läuft es bei dir wahrscheinlich nur weil du einmal das Script richtig ausgeführt hast und jetzt wird jedesmal die alte Variable geladen :gruebel: aber irgendwie kapier ich nich wie das gehen soll :roll: Globale Variablen müssen mit einem String benannt werden, dies kann man net ändern!
User avatar
heromaster
Posts: 21
Joined: Sat, 31. May 03, 03:22
x3

Post by heromaster »

Und Du hast das selbst getestet, ob es so funktioniert, wie Du denkst?
Das würde mich wundern. :roll:
Ja,probiers doch einfach aus. Ich schreibe Dir sogar das Testscript gratis dazu. :)

Code: Select all

$Sectors = get global variable: name=$lib.map.getsectors.Array 

   if not $Sectors 
 @  = [THIS] -> call script 'lib.map.getsectors' : 
    $Sectors = get global variable: name=$lib.map.getsectors.Array 
   end
   
    $Sectors.SIZE =  size of array $Sectors
    $Sectors.iterate = 0   while $Sectors.iterate < $Sectors.SIZE

    while $Sectors.iterate < $Sectors.SIZE
         write to log file #8701  append=[TRUE]  value=$Sectors[$Sectors.iterate]
         inc $Sectors.iterate
    end
So und nachdem Du das getan hast, wirst Du feststellen das es funktioniert.
Denn wie MacGyver8472 schon sagte und in seinem Beispiel zeigte, müssen die NAMEN globaler Variable als Zeichenkette (String) ausgelesen oder gesetzt werden.
In Deinem Script "lib.map.getsectors.xml" finde ich nur eine einzige Zeile dazu, wie die Variable heißt:

Code: Select all

027   set global variable: name=$lib.map.getsector.Array value=$Sector
Und dies ist wiederum eine Variable, denn sie beginnt mit einem "$". Da diese Variable keine Belegung hat, ist sie "null". Die globale Varaible hätte dann den Namen "null". Daher kann das so gar nicht funktionieren.
Du weißt schon worüber Du da gerade redest? $lib.map.getsectors.Array ist eine globale Variable die eine Referenz auf das Array $Sectors besitzt. Und als String muss das nicht übergeben werden, es kann nämlich auch solch eine Variable sein. ;)

EDIT: Smilies eingefügt. Sollte nicht so offensiv klingen
Last edited by heromaster on Tue, 26. Apr 05, 14:49, edited 1 time in total.
Sie sind gekommen, um Zeugen des Anbeginns zu sein. Die Wiedergeburt des Paradieses, ausgeplündert von der Menschheit.
User avatar
SpaceTycoon
Posts: 1190
Joined: Wed, 6. Nov 02, 20:31
x4

Post by SpaceTycoon »

heromaster wrote:So wie das Script jetzt läuft, funktioniert es bei mir und du kennst ja sicherlich auch den Spruch --> "Never change a running system" ;)
Nun ja, möglicherweise wird eine globale Variable, die den Namen "null" und den Inhalt der Sektoren hat gesetzt. Du liest sie mit dem Namen "null" auch wieder aus. Das paßt zusammen, solange das nur einmal gemacht wird. Sobald noch eine globale Variable auf diese Weise mit dem Namen "null", aber einem anderen Inhalt gesetzt wird, klappts sicher nicht mehr.
User avatar
StarTrekMarc
Posts: 2143
Joined: Sat, 3. Apr 04, 16:38
x4

Post by StarTrekMarc »

Tut mir Leid, aber ich teste es nicht, da es NICHT funktionieren kann, außer wenn die Variable des Namen ein STRING ist, ich habe das selbst mal so gemacht. ES ging nicht! :roll: :P :roll:

Edit:
SpaceTycoon wrote:
heromaster wrote:So wie das Script jetzt läuft, funktioniert es bei mir und du kennst ja sicherlich auch den Spruch --> "Never change a running system" ;)
Nun ja, möglicherweise wird eine globale Variable, die den Namen "null" und den Inhalt der Sektoren hat gesetzt. Du liest sie mit dem Namen "null" auch wieder aus. Das paßt zusammen, solange das nur einmal gemacht wird. Sobald noch eine globale Variable auf diese Weise mit dem Namen "null", aber einem anderen Inhalt gesetzt wird, klappts sicher nicht mehr.
Das wird es sein ;)
User avatar
enenra
Posts: 7150
Joined: Fri, 8. Apr 05, 19:09
x4

Post by enenra »

Eine Frage, was nützt dieses Script eigentlich?? :?
Ich meine, was nutzt es einem, wenn ein Script das Universum nach Sektoren scannt? (ja ich kenne mich nicht so aus :oops: )
User avatar
StarTrekMarc
Posts: 2143
Joined: Sat, 3. Apr 04, 16:38
x4

Post by StarTrekMarc »

Damit spart man sich den minimalen Aufwand das selbst zu schreiben, aber es spart auch CPU Leistung :roll: eventuell

Weiß aber auch nicht was eine Liste mit den Sektornamen bringt...
User avatar
heromaster
Posts: 21
Joined: Sat, 31. May 03, 03:22
x3

Post by heromaster »

Ich werde das nochmal durchtesten. Wie gesagt bei mir funktionierte es eben nicht wenn ich eine String übergebe. Die Erklärung jedenfalls scheint logisch zu sein :P

)
Damit spart man sich den minimalen Aufwand das selbst zu schreiben, aber es spart auch CPU Leistung eventuell

Weiß aber auch nicht was eine Liste mit den Sektornamen bringt...
Ja, unter anderem sind dies die Vorteile. Es ist keine Liste von Sektornamen sondern die Sektoren als Objekte.
Sie sind gekommen, um Zeugen des Anbeginns zu sein. Die Wiedergeburt des Paradieses, ausgeplündert von der Menschheit.
User avatar
StarTrekMarc
Posts: 2143
Joined: Sat, 3. Apr 04, 16:38
x4

Post by StarTrekMarc »

Na und, im Prinzip ist das das selbe, nur das halt die Sektoren auch als Variable dienen können, gut, man kann dann z.b. daraus nen Zufalls Sektor kriegen, per var. Array Index, aber mehr bringt es net....
User avatar
SpaceTycoon
Posts: 1190
Joined: Wed, 6. Nov 02, 20:31
x4

Post by SpaceTycoon »

StarTrekMarc wrote:Na und, im Prinzip ist das das selbe, nur das halt die Sektoren auch als Variable dienen können, gut, man kann dann z.b. daraus nen Zufalls Sektor kriegen, per var. Array Index, aber mehr bringt es net....
Doch, es bringt noch etwas.
Ein Script läuft auch in einem Mod-Universum, wo es andere Sektoren mit anderen Koordinaten geben könnte.
heromaster wrote:Ich werde das nochmal durchtesten. Wie gesagt bei mir funktionierte es eben nicht wenn ich eine String übergebe. Die Erklärung jedenfalls scheint logisch zu sein :P
Schau Dir mal meine Tarnvorrichtung (Topic hier im Forum momentan auf der ersten Seite) an. Dort findest Du in den beiden Scripten intensives Handling mit lokalen Variablen. Globale Variable funktionieren genauso
User avatar
StarTrekMarc
Posts: 2143
Joined: Sat, 3. Apr 04, 16:38
x4

Post by StarTrekMarc »

SpaceTycoon wrote:
StarTrekMarc wrote:Na und, im Prinzip ist das das selbe, nur das halt die Sektoren auch als Variable dienen können, gut, man kann dann z.b. daraus nen Zufalls Sektor kriegen, per var. Array Index, aber mehr bringt es net....
Doch, es bringt noch etwas.
Ein Script läuft auch in einem Mod-Universum, wo es andere Sektoren mit anderen Koordinaten geben könnte.
Naja, das kriegt man aber auch mit ner Schleife schnell hin ;)

Aber als lib. ist es schon in Ordnung, wenns den klappen würde :P
User avatar
heromaster
Posts: 21
Joined: Sat, 31. May 03, 03:22
x3

Post by heromaster »

Ok, ich hab das Script jetzt geändert und neu hochgeladen. Sieht so aus, als habt Ihr beiden Recht gehabt :P
DanKe für den Hinweis.

Nochmal die Erklärung, warum überhaupt dieses Script:

1. Wenn das Script einmal ausgeführt ist, wird das Array im Spielstand gespeichert und keine anderen Scripte müssen diese Prozedur wiederholen. Nachdem ich testweise einige Scripte umgeschrieben, die das X-Universum scannen, resultierte es in einer etwas schnelleren Ladezeit beim Laden des Spielstands.

2. Funktioniert für das originale X-Universum ebenso wie für Mod-Universen

3. Weniger Arbeit für Scripter (Ja, ich bin faul. Ich benutze lieber etwas, was es schon gibt als das Rad neu zu erfinden ;) )
Sie sind gekommen, um Zeugen des Anbeginns zu sein. Die Wiedergeburt des Paradieses, ausgeplündert von der Menschheit.
User avatar
Lucike
Posts: 12969
Joined: Sun, 9. May 04, 21:26
x4

Post by Lucike »

Ich muss sagen, ich hätte lieber mehr freien Speicher, als eine schnellere Ladezeit. Ich dachte auch 1000 Array-Einträge wären nicht so schlimm, aber ich musste mich eines besseren belehren lassen. ;)

Gruß
Lucike
Image

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