Trantor von Stationstrümmern leeren?

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
Darklord2 [USC]
Posts: 2142
Joined: Mon, 9. Aug 04, 14:49
x3tc

Post by Darklord2 [USC] »

Ich hab ein problem mit zeile 008!
wo finde ich den befehl?
Deleted User

Post by Deleted User »

008? Ich denke du meinst 007 bzw 009 oder?

Trade Commands
5.019 <RetVar> = get maintype of ware <Var/Ware>

General Object Commands
6.083 free sector object <Var/Number>

Ps: Bei 008 mus ein == anstatt = hin.
User avatar
Darklord2 [USC]
Posts: 2142
Joined: Mon, 9. Aug 04, 14:49
x3tc

Post by Darklord2 [USC] »

Es war schon zeile 8. danke!
Deleted User

Post by Deleted User »

Hast du es jetzt? Wenn nicht:

General Commands
1.001 <RetVar/IF><Expression>


Und denk daran das auf Trantor zu begrenzen...
User avatar
Darklord2 [USC]
Posts: 2142
Joined: Mon, 9. Aug 04, 14:49
x3tc

Post by Darklord2 [USC] »

Ja ich habs doch es funktioniert nicht!
seht ihr nen fehler?

Code: Select all

001   $counter1 = 10001
002   while $counter1 >= 0
003    dec $counter1 = 
004    if  exists SectorObject $counter1
005     $objekt =  get object from SectorObject $counter1
006     write to player logbook $maintyp
007     $maintyp =  get maintype of ware $counter1
008     if $maintyp == 20
009      kill sector object $counter1 : reason=null , killer sector object=null
010     end
011    end
012   end
Deleted User

Post by Deleted User »

Also erstmal solltest du 006 und 007 vertauschen da sonst nichts in dein Logbuch geschrieben werden kann.
Sonst sehe ich keinen Fehler aber sowas hab ich noch nicht versucht.
ticaki
Posts: 4861
Joined: Wed, 6. Nov 02, 20:31
x3

Post by ticaki »

darklord2 wrote:Ja ich habs doch es funktioniert nicht!
seht ihr nen fehler?

Code: Select all

001   $counter1 = 10001
002   while $counter1 
003    dec $counter1 = 
004    if  exists SectorObject $counter1
005     $objekt =  get object from SectorObject $counter1
006     $maintyp =  get maintype of ware $objekt
007     write to player logbook $maintyp
008     if $maintyp == 20
009      kill sector object $counter1 : reason=null , killer sector object=null
010     end
011    end
012   end
verändert 002, 006 und 007

Gruß ticaki
Zur Zeit nicht aktiv
User avatar
SpaceTycoon
Posts: 1190
Joined: Wed, 6. Nov 02, 20:31
x4

Post by SpaceTycoon »

darklord2 wrote:Ja ich habs doch es funktioniert nicht!
seht ihr nen fehler?
Jaaa. Der Fehler lag bei mir. :twisted:
Ich hab nochmal geschaut:
1. Die ID's der Sektorobjekte haben alle MEHR als 4 Stellen. Sie haben 5!
Heute sind mir beim Nachschauen nur Objekte mit Nummern in den 40.000'ern untergekommen (43485, 43298, usw.).
Also anstelle der 10001 am Besten testweise mal 50000 einsetzen und anstelle des "while $counter1 >= 0" dann die Zahl 40000 statt der "0".

2. Wenn der Spieler nicht im Sektor ist, haben die ganzen Objekte keine Sektor-ID mehr :!: :cry: Das ist eigentlich das Fieseste an der Sache. Denn dadurch kann man wieder nicht einfach den Sektor per Start-- oder Setup-Script räumen :cry:
ticaki wrote:

Code: Select all

001   $counter1 = 10001
002   while $counter1 
Hey ticaki - schlechten Tag heute? :wink:
Was soll das da oben (Zeile 002) sein?
Das kann nie vernünftig funktionieren. "while $counter1" prüft auf Belegung dieser Variablen (NULL oder mit Wert belegt). Die Variable beginnt aber mit einer in 001 festgelegten Zahl - ist also keinesfalls NULL. Und wird in der Schleife immer weiter runtergezählt. Wenn die "0" erreicht wird, geht's jetzt mit Deinem Code in die negativen Zahlen. Ich bin sehr im Zweifel, ob das nicht einen Überlauf erzeugt, wenn dann mal die Zahl - 4Mrd. (minus 4 Milliarden usw.) erreicht ist. :shock: Und mit dem write to playerlogbook bekommt darklord2 vielleicht 4 Milliarden Logbucheinträge, nachdem die Schleife 4 Mrd. mal durchlief (falls er vorher nicht den PC ausschaltet)

@darklord2
Und ob der free oder kill Befehl wirkt, muß man auch erst noch checken.
Also so müßte es gehen - aber nur, wenn:
- Die Spezialobjekte auch eine SectorID haben (keine Ahnung ob)
- Der Spieler beim Ausführen des Scriptes selber in Trantor ist

Code: Select all

001   $counter1 = 50000
002   while $counter1 >= 30000
003    dec $counter1 = 
004    if  exists SectorObject $counter1
005     $objekt =  get object from SectorObject $counter1
006     $maintyp =  get maintype of ware $objekt
007   ----- write nach unten und auf objekt (Klartext statt Nummer) bezogen  
008     if $maintyp == 20
009      kill sector object $counter1 : reason=null , killer sector object=null
010      write to player logbook $objekt
010     end
011    end
012   end
Ungetestet... Aber vielleicht probier' ich's morgen selber mal aus...
Last edited by SpaceTycoon on Fri, 3. Dec 04, 11:33, edited 1 time in total.
Deleted User

Post by Deleted User »

ticaki hat schon recht mit Zeile 002 den while Schleifen werden auch bei 0 (die Zahl Null) beendet aber im Prinzip ist es egal.

Habs eben extra nochmal getestet mit

Code: Select all

001   $c = 5
002   while $c
003    dec $c = 
004    write to player logbook $c
005   end
006   write to player logbook 'ende'
und als Augabe kam "4 - 3 - 2 - 1 - 0 - ende" wobei die Striche immer einen neue Nachricht bedeuten.
ticaki
Posts: 4861
Joined: Wed, 6. Nov 02, 20:31
x3

Post by ticaki »

@SpaceTycoon
Schöne Theorie :roll:
MacGyver8472 wrote:ticaki hat schon recht mit Zeile 002 den while Schleifen werden auch bei 0 (die Zahl Null) beendet aber im Prinzip ist es egal.

Habs eben extra nochmal getestet mit

Code: Select all

001   $c = 5
002   while $c
003    dec $c = 
004    write to player logbook $c
005   end
006   write to player logbook 'ende'
und als Augabe kam "4 - 3 - 2 - 1 - 0 - ende" wobei die Striche immer einen neue Nachricht bedeuten.
1. Ist vom Prinzip her nicht egal, weil es keine negativen sectorobjecte gibt gelle ;)
2. kill sector kommando ist nicht zum Benutzen da, sondern ausschließlich zur Zierde. Bitte auf das Object einen destroy benutzen, da sector befehle nichts in einem script zu suchen haben.

Gruß ticaki
Last edited by ticaki on Fri, 3. Dec 04, 11:30, edited 1 time in total.
Zur Zeit nicht aktiv
Deleted User

Post by Deleted User »

Ja, ist ja gut. Ich meinte das es egal ist ob da ein >=0 dahinter steht oder nicht den in beiden Fällen wird die Schleife bei 0 abgebrochen. Obwohl :gruebel: es müsste da >0 stehen den sonst würde noch nach -1 geprüft werden. Habs verstanden was gemeint war Riddler :wink:
User avatar
SpaceTycoon
Posts: 1190
Joined: Wed, 6. Nov 02, 20:31
x4

Post by SpaceTycoon »

MacGyver8472 wrote:ticaki hat schon recht mit Zeile 002 den while Schleifen werden auch bei 0 (die Zahl Null) beendet aber im Prinzip ist es egal.
Habs eben extra nochmal getestet mit

Code: Select all

001   $c = 5
002   while $c
003    dec $c = 
004    write to player logbook $c
005   end
006   write to player logbook 'ende'
und als Augabe kam "4 - 3 - 2 - 1 - 0 - ende" wobei die Striche immer einen neue Nachricht bedeuten.
ticaki wrote:@SpaceTycoon
Schöne Theorie :roll:
1. Ist vom Prinzip her nicht egal, weil es keine negativen setorobjecte gibt gelle ;)
Donnerschlag. Das ist doch zum :rant:
Schon wieder sowas unlogisches. Das finde ich eigentlich unsauber. Von der reinen Logik sollte es SO eigentlich nicht sein. Und wenn ich mal mit genau so einer Schleife in einen negativen Zahlenbereich rein will?
Schon klar, daß es keine negativen Sektorobjekte gibt. Aber es gibt negative Zahlen. Und wenn ich mit einem Bereich negativer und positiver Zahlen arbeiten will? Da erscheint mir das mit dem "while $counter1" ohne weitere Definition des exakten Wertes von $counter1, bei dem die Schleife verlassen werden soll, gar nicht sauber.
ticaki wrote:2. kill sector kommando ist nicht zum Benutzen da, sondern ausschließlich zur Zierde. Bitte auf das Object einen destroy benutzen, da sector befehle nichts in einem script zu suchen haben.
Das bedarf näherer Erklärung! Warum ist der Befehl nicht zum Benutzen da? Funktioniert er nicht? Oder wie ist das gemeint?
Und wie ist das mit "sector befehle nichts in einem Script zu suchen haben"? Warum nicht?
Einfach so ein paar Brocken hinwerfen - ohne weitere Info - das ist nicht fein :cry: Da wüßte man doch gerne ein paar Worte mehr darüber.
ticaki
Posts: 4861
Joined: Wed, 6. Nov 02, 20:31
x3

Post by ticaki »

Das mit dem while ist extrem logisch ;)
Begründung:

Code: Select all

Integer: 124321 = Boolean TRUE
Integer: 1 = Boolean TRUE
Integer: -2 = Boolean TRUE
Integer: 0 = Boolean FALSE
0 ist in den meisten Programmiersprachen gleichzusetzen mit FALSE.

Weshalb keine Sektorobjekte benutzen:
Da du damit nur das Sektorobjekt beeinflusst, jedoch nicht das Object welches benutzt wird wenn du oos bist. Wohingegen die nicht Sektorbefehle beide Objekte beeinflussen. Davon ist der "get setorobject id" Befehl mal ausgenommen, der macht wirklich Sinn.

Sektorobjektbefehle arbeiten auf einem zu niedrigen Level.

Gruß ticaki
Zur Zeit nicht aktiv
Deleted User

Post by Deleted User »

SpaceTycoon wrote: Donnerschlag. Das ist doch zum :rant:
Schon wieder sowas unlogisches. Das finde ich eigentlich unsauber. Von der reinen Logik sollte es SO eigentlich nicht sein. Und wenn ich mal mit genau so einer Schleife in einen negativen Zahlenbereich rein will?
Schon klar, daß es keine negativen Sektorobjekte gibt. Aber es gibt negative Zahlen. Und wenn ich mit einem Bereich negativer und positiver Zahlen arbeiten will? Da erscheint mir das mit dem "while $counter1" ohne weitere Definition des exakten Wertes von $counter1, bei dem die Schleife verlassen werden soll, gar nicht sauber.
Dann schreib es doch einfach hin :wink:

Code: Select all

001   $c = 5 
002   while $c > -5
003    dec $c = 
004    write to player logbook $c 
005   end 
006   write to player logbook 'ende'
Ausgabe: 4, 3, 2, 1, 0, -1, -2, -3, -4, -5, ende (, = neue Nachricht)
Begründung: Die Abbruchbedingung wurde verändert.

Nur mal so nebenbei. Das macht jede andere Programmiersprache die ich kenne (VB, C++, PHP als Bsp) auch so.
User avatar
SpaceTycoon
Posts: 1190
Joined: Wed, 6. Nov 02, 20:31
x4

Post by SpaceTycoon »

ticaki wrote:Das mit dem while ist extrem logisch ;)
Begründung:

Code: Select all

Integer: 124321 = Boolean TRUE
Integer: 1 = Boolean TRUE
Integer: -2 = Boolean TRUE
Integer: 0 = Boolean FALSE
Das leuchtet mir ein. Trotzdem wäre es IMHO noch weit logischer, wenn die Prüfung einer Variablen nur dann ein FALSE ergäbe, wenn die Variable mit gar nichts belegt ist (=null). Und wenn sie einen Wert zugewiesen hat, auch wenn dieser 0 ist, TRUE ergäbe.
ticaki wrote:Weshalb keine Sektorobjekte benutzen:
Da du damit nur das Sektorobjekt beeinflusst, jedoch nicht das Object welches benutzt wird wenn du oos bist. Wohingegen die nicht Sektorbefehle beide Objekte beeinflussen. Davon ist der "get setorobject id" Befehl mal ausgenommen, der macht wirklich Sinn.
Sektorobjektbefehle arbeiten auf einem zu niedrigen Level.
Ah, ja! Wieder was gelernt. :) Daß Objekte keine Sector-ID haben, wenn der Spieler OOS ist, hatte ich ja schon festgestellt. Und der Unterschied ob der Spieler im Sektor ist oder nicht, ist ja schon bekannt. Jetzt wissen wir aber auch, wo sich das im Scripteditor festmacht.

Also kann darklord2 sein Problem mittels der Abfrage der Sector-IDs nicht global lösen. Wahrscheinlich wieder mal so ein Problem, für das es keine Lösung per Scripteditor gibt?
Deleted User

Post by Deleted User »

Das 0 = FALSE und (im allgemein) 1 = TRUE ist kommt noch von den anfängen der Programmierung als es nur maschienennahe Programmiersprachen (Assembler - konnte ich mal :roll:) gab und wurde so in die moderneren übernommen. Programmiersprachen sind halt nicht immer logisch.

Ein Beispiel:
x = 100
x = x + 100
Laut Mathematik wäre die Gleichung falsch aber bei der Programmierung würde x = 200 dabei rauskommen.

In C++ haben die sich was neues einfallen lassen was es so in der Mathematik nicht gibt.
x ist immer 100
x += 100 (= 200)
x -= 100 (= 0)
x *= 100 (= 10000)
x /= 100 (=1)

Da stellt sich mir gerade die Frage ob das im Scripteditor von X² auch funktioniert :gruebel:. Habs noch nicht probiert.
User avatar
Darklord2 [USC]
Posts: 2142
Joined: Mon, 9. Aug 04, 14:49
x3tc

Post by Darklord2 [USC] »

Danke an euch alle doch er funktioniert immer noch nicht!
So sieht er im moment aus:

Code: Select all

001   $counter1 = 50000
002   while $counter1 >= 40000
003    dec $counter1 = 
004    if  exists SectorObject $counter1
005     $objekt =  get object from SectorObject $counter1
006     $maintyp =  get maintype of ware $counter1
007     if $maintyp == 20
008      $counter1 -> destruct: show no explosion=[TRUE]
009     end
010    end
011   end
Deleted User

Post by Deleted User »

Versuch mal anstatt

Code: Select all

$counter1 -> destruct: show no explosion=[TRUE] 
mit

Code: Select all

$objekt -> destruct: show no explosion=[TRUE]
User avatar
SpaceTycoon
Posts: 1190
Joined: Wed, 6. Nov 02, 20:31
x4

Post by SpaceTycoon »

MacGyver8472 wrote:Programmiersprachen sind halt nicht immer logisch.
Danke für den weiter erhellenden Beitrag. :) Genau mit dem Obigen habe ich dadurch so meine Probleme. Höhere Programmiersprachen sind tatsächlich nicht immer logisch.
Mir macht immer Schwierigkeiten, daß zwei tatsächlich verschiedene Zustände einer Variablen (einmal völlig unbelegt, einmal mit Wert 0 belegt) dasselbe Ergebnis bringen.
User avatar
SpaceTycoon
Posts: 1190
Joined: Wed, 6. Nov 02, 20:31
x4

Post by SpaceTycoon »

SpaceTycoon wrote:Hiermit hab ich das jetzt hinbekommen, schonmal alle Sektor-Objekte (Raumfliegen, Schiffe, Stationstrümmer, usw.) zu finden. Witzigerweise wird mir als Maintype aber die Sektor-Objekt ID ausgegeben... :?

Code: Select all

002   $counter1 = 50000
003   while $counter1 >= 0
004    dec $counter1 = 
005    if  exists SectorObject $counter1
006     $object =  get object from SectorObject $counter1
007     $maintype =  get maintype of ware $object
008     $message = $object + '     ' + $maintype
009     write to player logbook $message
010    end
011   end
012   return null
Das ist wieder mal ne' Nuß....
Gar nix Nuß :headbang: :headbang: :headbang: :lol:
Das kommt davon, wenn man ursprünglich (siehe vorher) ein Beispielscript aus dem Gedächtnis schreibt und nicht per Scripteditor. Die Trümmer sind ja KEINE NORMALE WARE!
Daher klappt der Befehl 007 $maintype = get maintype of ware $object
natürlich nicht.
In Zeile 007 muß ein anderer Befehl verendet werden, dann erwischt man auch den richtigen Maintype. Daher:

Code: Select all

007     $maintype =  $object -> get maintype
Last edited by SpaceTycoon on Fri, 3. Dec 04, 20:56, edited 2 times in total.

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