Hallo,
ich spiele im Augenblick so'n bisschen mit den Möglichkeiten des Editors rum und wollte zwei neue Tore einbauen. Doch irgendwie bekomme ich es nicht hin. Die Tore funktionieren nicht. Nun soll man ja bei dem entsprechenden Befehl auch das Gegentor angeben. Will man aber zwei neue Tore erstellen und verbinden, ist ja immer ein Tor vorhanden, zu dem es kein Gegentor gibt (weil man ja mit Einem anfangen muss). Wie kann man dieses Dilemma überhaupt lösen? Oh, richtig, beinahe vergessen: ich spreche vom Script-Editor, nicht vom Galaxie-Editor.
Ach ja, ich hab' da mal vor einiger Zeit was gelesen (als ich was ganz Anderes gesucht habe), das behandelte dieses Thema, aber ich weis nicht, ob die Frage dort beantwortet wurde. Ich hab' danach gesucht, aber ... ich find's nicht mehr wieder. Hab' schon eckige Augen und meine Modem-Verbindung glüht schon. Hoffe, ihr vergebt mir unter diesen Umständen den neuen Thread.
Tschüß und Danke für die Hilfe
ManfredP
Neue Tore einbauen
Moderators: Scripting / Modding Moderators, Moderatoren für Deutsches X-Forum
-
- Posts: 521
- Joined: Thu, 19. May 05, 20:20
-
- Posts: 521
- Joined: Thu, 19. May 05, 20:20
-
- Posts: 115
- Joined: Tue, 25. Apr 06, 12:40
Re: Neue Tore einbauen
Hallo,ManfredP wrote:Hallo,
ich spiele im Augenblick so'n bisschen mit den Möglichkeiten des Editors rum und wollte zwei neue Tore einbauen. Doch irgendwie bekomme ich es nicht hin. Die Tore funktionieren nicht. Nun soll man ja bei dem entsprechenden Befehl auch das Gegentor angeben. Will man aber zwei neue Tore erstellen und verbinden, ist ja immer ein Tor vorhanden, zu dem es kein Gegentor gibt (weil man ja mit Einem anfangen muss). Wie kann man dieses Dilemma überhaupt lösen? Oh, richtig, beinahe vergessen: ich spreche vom Script-Editor, nicht vom Galaxie-Editor.
Ach ja, ich hab' da mal vor einiger Zeit was gelesen (als ich was ganz Anderes gesucht habe), das behandelte dieses Thema, aber ich weis nicht, ob die Frage dort beantwortet wurde. Ich hab' danach gesucht, aber ... ich find's nicht mehr wieder. Hab' schon eckige Augen und meine Modem-Verbindung glüht schon. Hoffe, ihr vergebt mir unter diesen Umständen den neuen Thread.
Tschüß und Danke für die Hilfe
ManfredP
ich bin's selbst wieder. Ich habe Teemetals Stargate benutzt und auch damit rumgespielt, aber es gibt ein Problem

Wie oben schon erwähnt, gibt es ja bei den beiden Toren das Problem, dass ein Tor generiert werden muss, solange das Zweite noch nicht da ist. Im Befehl werden aber zwei IDs benutzt, die laut Handbuch eindeutig für den jeweiligen Sektor sein müssen. Die ID zu dem Tor, dass noch fehlt, existiert infolgedessen noch nicht. Man kommt also beim Henne-und-Ei Problem an: womit soll man anfangen?
Teemetal löst es so, indem er die sog. SectorObjectID benutzt, eine Zahl, die jedem Objekt in einem Sektor zugeordnet ist und es der Spieleengine erlaubt, der Grafikengine mitzuteilen, was sie wo platzieren soll und wie es aussehen muss. Ich vermute, dass es diese Nummern für jedes Objekt im X-Universum gibt, sie sind aber nicht eindeutig für das Universum -jeder Sektor fängt wieder bei Null an. Der Editor allerdings kann nur die Nummern benutzen, die zu dem momentan gerenderten Sektor gehören, also dem Spieler-Aufenthalts-Sektor (inwieweit es das auch für die von Navigationssatelliten oder anderen, eigenen Schiffen und Stationen erfassten Sektoren gibt, weis ich nicht -immerhin müssen ja die Positionen der Objekte berechnet werden, um die Karte zu erstellen; eventuell macht das aber nicht die Grafikengine, sondern die Spieleengine selbst -dann braucht sie nur die Objekt-ID, die sowieso universumweit existiert). Hinzu kommt, dass die Tore ja erst existieren (und damit auch im Spieler-Sektor erst erscheinen und folglich eine ID haben), wenn sie kreiert wurden -und selbst dann natürlich nur maximal ein Tor, da ja nur Eines im Spieler-Sektor sein kann; eventuell auch gar keins, denn es ist auch die Verwendung des Scripts möglich, wenn man nicht in einem der Sektoren drin ist, die man verbinden möchte.
Teemetal macht das so:
Code: Select all
$ID1 = $Tor1 -> get SectorObject ID
$ID2 = $Tor2 -> get SectorObject ID
...
$Tor1 = create gate: type= .... gateid=$ID1 .... dstgateid=$ID2 ....
$Tor2 = create gate: type= .... gateid=$ID2 .... dstgateid=$ID1 ....
Nach einigem Überlegen kam ich auch drauf, wieso: ID1 und ID2 werden in dem obigen Codefragment über die Objekt-Zeiger der beiden Tore erstellt. Diese Objektzeiger sind zu diesem Zeitpunkt aber noch nicht belegt, also <null>. Wie bei den Editor-Funktionen üblich, verursacht dass keine Fehlermeldung, sondern es wird gemacht, was eben geht. Da <null> gleich <null> ist, wird also ID1 gleich ID2 sein, was aber nicht stört, da die Dinger in verschiedenen Sektoren sind.
Sobald man aber zwei Tore im gleichen Sektor erstellt, funktioniert das nicht mehr. Denn dann gilt ja auch (selbst, wenn das verschiedene Scriptläufe sind), dass <null> gleich <null> ist, es kommt also immer die gleiche ID heraus (die muss nicht unbedingt Null sein, da man nicht weis, wie die Funktion auf einen ungültigen Pointer reagiert -ich hab's bisher noch nicht nachgeprüft, da es relativ unwichtig ist). Damit haben die beiden Tore im Sektor die gleiche ID und das haut nicht hin. Es kommt zu "Verwechslungen" der Tore, nicht nur von außen, sondern auch durch zum Beispiel den Autopiloten beim Anflug in diesem Sektor. Dadurch verfliegen sich die KI-Schiffe kolossal.
Deshalb habe ich Verschiedenes durchprobiert, aber nichts half. Viele IDs (wie die Object-ID) sind keine reinen Zahlen, sondern Zeichenfolgen (wie etwa IM2XL-21), also an dieser Stelle ungeeignet, denn dies sind hier Zahlen. Die vorgefertigten Tore haben IDs von 0 bis 3, das sind einfach die Typcodes (die die Richtung bestimmen). So steht es im Handbuch, auch, dass sie sektorweit eindeutig sein müssen. Die Formulierung sah so aus, als würde das nur in Bezug auf die Gate-IDs gelten, dann wäre es ja einfach: Man gibt eine ID ein, dass kann sogar zweimal die Gleiche sein, da die Tore einer Verbindung ja in verschiedenen Sektoren liegen. Doch so einfach ist es auch wieder nicht. Es sieht so aus, als müsste es eine ID sein, die das Tor auch von anderen Objekten im Sektor unterscheidet. Die IDs 0 bis 3 sind in vorgefertigten Sektoren ja tatsächlich möglicherweise immer reserviert -die Dinger dürften mit das Erste sein, was in einem Sektor erzeugt wird. Tore hingegen, die es nicht gibt, hinterlassen wahrscheinlich keine freien IDs -die sind dann von anderen Objekten benutzt. Ich habe es auch versucht, indem ich zunächst ein Tor erzeugte, das dann mit einem Zweiten verband, das Erste wieder löschte und dann mit den alten Daten des Ersten und den Daten des neu erzeugten Zweiten das erste Tor ein zweites Mal erzeugte; funktioniert auch nicht.
Ich komme irgendwie nicht mehr weiter. Jemand 'ne Idee?
Tschüß und Danke
ManfredP
Ergänzung: Es geht so'n bisschen mit 'nem Trick: Statt die ID's beide vom SectorObject-ID her zu bestimmen (wodurch die ja beide gleich werden), kann man eine SectorObject ID und die um Eins höhere benutzen -wieso das auf einmal geht, weis ich nicht, aber es geht -zumindest, soweit ich es ausprobiert habe. Dann allerdings geht es beim zweiten Tor im gleichen Sektor wieder schief, weil ja eben die SectorObject ID zu einem Objekt, dass es noch gar nicht gibt, immer gleich ist. Dabei kann man allerdings etwas ändern: Man verlässt den Sektor, in dem man schon ein neues Tor gebaut hat und geht da hin, wo das zweite Tor hin soll (also den Sektor, wo man mit dem neuen Tor hin will). Da ist bisher noch kein neues Tor entstanden (zumindest bei mir war das so) und damit geht es wieder, denn die zweite ID (bei mir immer die von dem Tor, dass als Zweites entsteht) ist ja um Eins erhöht. Habe ich die erste Verbindung von dem Sektor mit den zwei neuen (geplanten zu dem Zeitpunkt noch) Toren erstellt, hat das Tor dort die ID Null (oder was auch immer bei get SectorObject id (null) so rauskommt) und das Andere die Eins (oder so). Die zweite Verbindung geht von dem anderen Sektor aus und erzeugt die ID Null (s.o.) im anderen Sektor und die ID Eins (oder so) dort, wo schon ein Tor neu ist. Damit sind die ID's in dem Sektor verschieden und es geht. Ist natürlich nur ein Work-Around und klappt auch nur bei zwei Toren -bei noch mehr hilft das auch nicht mehr. Da wäre also in jedem Fall eine allgemeine Lösung gut.
Tschüß
ManfredP