Trantor von Stationstrümmern leeren?
Moderators: Scripting / Modding Moderators, Moderatoren für Deutsches X-Forum
-
- Posts: 2142
- Joined: Mon, 9. Aug 04, 14:49
-
- Posts: 2142
- Joined: Mon, 9. Aug 04, 14:49
Ja ich habs doch es funktioniert nicht!
seht ihr nen fehler?
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
-
- Posts: 4861
- Joined: Wed, 6. Nov 02, 20:31
verändert 002, 006 und 007darklord2 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
Gruß ticaki
Zur Zeit nicht aktiv
-
- Posts: 1190
- Joined: Wed, 6. Nov 02, 20:31
Jaaa. Der Fehler lag bei mir.darklord2 wrote:Ja ich habs doch es funktioniert nicht!
seht ihr nen fehler?

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



Hey ticaki - schlechten Tag heute?ticaki wrote:Code: Select all
001 $counter1 = 10001 002 while $counter1

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.

@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
Last edited by SpaceTycoon on Fri, 3. Dec 04, 11:33, edited 1 time in total.
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 mitund als Augabe kam "4 - 3 - 2 - 1 - 0 - ende" wobei die Striche immer einen neue Nachricht bedeuten.
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'
-
- Posts: 4861
- Joined: Wed, 6. Nov 02, 20:31
@SpaceTycoon
Schöne Theorie

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
Schöne Theorie

1. Ist vom Prinzip her nicht egal, weil es keine negativen sectorobjecte gibt gelleMacGyver8472 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 mitund als Augabe kam "4 - 3 - 2 - 1 - 0 - ende" wobei die Striche immer einen neue Nachricht bedeuten.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'

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
-
- Posts: 1190
- Joined: Wed, 6. Nov 02, 20:31
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 mitund als Augabe kam "4 - 3 - 2 - 1 - 0 - ende" wobei die Striche immer einen neue Nachricht bedeuten.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'
Donnerschlag. Das ist doch zumticaki wrote:@SpaceTycoon
Schöne Theorie
1. Ist vom Prinzip her nicht egal, weil es keine negativen setorobjecte gibt gelle

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.
Das bedarf näherer Erklärung! Warum ist der Befehl nicht zum Benutzen da? Funktioniert er nicht? Oder wie ist das gemeint?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.
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

-
- Posts: 4861
- Joined: Wed, 6. Nov 02, 20:31
Das mit dem while ist extrem logisch 
Begründung:
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

Begründung:
Code: Select all
Integer: 124321 = Boolean TRUE
Integer: 1 = Boolean TRUE
Integer: -2 = Boolean TRUE
Integer: 0 = Boolean 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
Dann schreib es doch einfach hinSpaceTycoon wrote: Donnerschlag. Das ist doch zum![]()
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.

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'
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.
-
- Posts: 1190
- Joined: Wed, 6. Nov 02, 20:31
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: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
Ah, ja! Wieder was gelernt.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.

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?
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
) 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
. Habs noch nicht probiert.

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

-
- Posts: 2142
- Joined: Mon, 9. Aug 04, 14:49
Danke an euch alle doch er funktioniert immer noch nicht!
So sieht er im moment aus:
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
Versuch mal anstatt
mit
Code: Select all
$counter1 -> destruct: show no explosion=[TRUE]
Code: Select all
$objekt -> destruct: show no explosion=[TRUE]
-
- Posts: 1190
- Joined: Wed, 6. Nov 02, 20:31
Danke für den weiter erhellenden Beitrag.MacGyver8472 wrote:Programmiersprachen sind halt 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.
-
- Posts: 1190
- Joined: Wed, 6. Nov 02, 20:31
Gar nix Nuß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...
Das ist wieder mal ne' Nuß....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 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.