Tutorial: Wie hänge ich ein eigenes Script in die Menüs ein

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

Post Reply
Nemesi$
Posts: 120
Joined: Wed, 12. Nov 03, 19:05
x4

Tutorial: Wie hänge ich ein eigenes Script in die Menüs ein

Post by Nemesi$ » Tue, 27. Jan 04, 15:09

Sodele..dann will ich mich mal hier an die Übersetzung von Revens Tutorial wagen. Das Original ist unter http://www.egosoft.com/x2/forum/viewtopic.php?t=21585 aufzufinden.
Alles was ich geändert habe, oder einfach meine Meinung dazu schreibe bekommt die Farbe Orange
-----------------------------------------------------------------


Einleitung
Wir alle kennen die InGame-Kommandomenüs der Schiffe. Navigation, Kampf, Handeln und Spezial. Egosoft hat X² extrem erweiterbar gemacht, inklusive dieser Menüs. Viele von uns haben sich Scripte aus dem Web geholt die die Funktionalität von X² erweitern. Und wenn es auch nur BurnIt's neue Trade Command Extension MK3 mit seinem "Start Sector Trader" Kommando ist. Hier werde ich nun eine (vom Original leicht erweiterte) Schritt-für-Schritt Anleitung schreiben, wie man seine eigenen Scripte in die vorhandenen Menüs von X² einhängt.

In diesem Tutorial wird ein Script von Reven als Beispiel verwendet, das er selber geschrieben hat, und das ins Trademenü eingehängt wird. Dieses Script versucht die Anzahl der Produkte einer Fabrik auf einem vorgegebenen Füllstand zu halten. Das ist dann von Vorteil wenn man eine Fabrik hat, die nur eine minimale Anzahle ihrer Produkte bereit halten kann und man nicht ständig von Hand die Produkte in einen Frachter transferieren will. Eine detaillierte Beschreibung des Script und dem Grund hinter diesem Script findet man hier (in Englisch)

Anforderungen
  • Eine Kopie der Beispielscripte von Frag-Warez.org
  • Ein XML-Editor wäre praktisch, ist aber kein muss. Reven empfiehlt da den simplen Peter's XML Editor
  • Ich selber habe den XMLMind XML Editor, habe aber meine ersten Gehversuche mit X²-Scripting und diesem Tutorial mit dem in X² eingebauten Editor gemacht.
Vorgehensweise
Es sind hauptsächlich 3 Schritte notwendig um ein Script in die Menüs einzuhängen. Als erstes benötigt man natürlich das Script welches man einhängen will. Zweitens braucht man eine XML-Sprachdatei die den Text enthält, den man zum Spiel hinzufügt. Und als drittes und letztes braucht man ein Script welches automatisch von X² aufgerufen wird und das eigentliche Script in den Menübaum einhängt.

1. Schritt
Das eigentliche Script. Da dies kein Tutorial über Scripting allgemein ist werde ich hier nicht wirklich in die Tiefe gehen. Soviel sei aber über Scripting gesagt, das der beste Weg es zu lernen ist, wenn man sich einfach vorhandene Scripte anschaut. Als Anregung wären da die original Egosoft-Scripte. Dazu braucht man den X2Modder von OlisJ um die Egosoft-Scripte auszupacken. Alternativ dazu kann man auch den X² Archiver benutzen. Der kommt nämlich auch ohne das .NET Frameset 1.1 aus. Egosoft war so nett uns ein hübsches XSL-Stylesheet zu überlassen, mit dem man die Scripte einfach per Doppelklick zB. im Internet-Explorer anschauen kann, sobald sie einmal entpackt sind.

2. Schritt
Hier kommen wir zum eigentlichen Kern der Sache. Die meisten Spieltexte für so ziemlich alles, angefangen von Gütern bis zu den Schiffsbeschreibungen und Menükommandos sind in externen XML-Sprachsdateien abgelegt. Diese Dateien sind an 2 Orten anzutreffen: Entweder im "X2\t" Verzeichniss oder innerhalb der Kontainerdateien (die Zip-Dateien entsprechen aber keine Zips sind). Das meiste der bisherigen Spieltexte sind ind den XML-Sprachdateien innerhalb der *.CAT/*.DAT Dateipaare im eigentlichen X² Verzeichniss. Jede Datei innerhalb dieser Kontainer wird wie eine Datei in den "normalen" Unterverzeichnissen von X² behandelt. Man kann mit X2Modder eben diese Kontainer entpacken und schauen was sie so alles enthalten. Wenn X² auf die Version 1.2 gepatcht ist enthält das 03.CAT/03.DAT Dateipaar die aktuellsten XML-Sprachdateien des Spieltextes. Das wären dann die Dateien 440001.XML und 440002.XML. Wenn BurnIt's Trade Command Sofware MK3 installiert wurde dann kann man in "X2\t" die 440003.XML finden. Diese Datei enthält die Texte für dieses neue Script.

Vielleicht hat der aufmerksame Leser bemerkt das ein Muster in den Dateinamen steckt. Die ersten zwei Stellen bezeichnen den Sprachcode; 44 ist Englisch. BurnIt's Erweiterung hat zusätzlich noch eine Datei mit '49' installiert, welche die deutschen Texte enthält. Wenn das neu eingehängte Script in mehreren Sprachen funktionieren soll muss man die XML-Sprachateien für jede Sprache mitliefern. Das mag keine dumme Idee sein, selbst wenn der Text in den anderen Sprachdateien der gleiche ist. Englisch ist da natürlich bevorzugt, da das die meisten Spieler verstehen

Nach dem Sprachcode enthält der Dateiname einfach eine Nummer um die Datei für alle Scripte, die die Datei benötigen, zu identifizieren. Diese Nummer wird benötigt um die den Text einer Sprachdatei von einem Script aus zu laden.

Wenn der Sprachcode und die ID-Nummer zusammengesetzt werden erhalten wir den ganzen Dateinamen "440003.XML".

Viele Leute schreiben Scripte mit Install-Routinen die die eigentliche 440003.XML modifizieren um ihre Texte zu speichern. Das ist der falsche Weg um das zu erreichen. Ich gehe mal davon aus das Sie diesen Weg gewählt haben, weil sie den korrekten Weg wie man Dateien zu X² hinzufügt, nicht kennen. Der ganze Sinn hinter der Möglichkeit mehrere Sprachdateien zu haben ist, das man sich nicht mit anderen (evtl. von anderen Scriptern) angelegten Sprachdateien rumschlagen muss. Man fügt einfach ein neue Datei ein.

Für eine neue Datei muss man sich eine ID raussuchen. Wichtig ist dabei, das die ID nicht in Konflikt mit anderen IDs kommt, die unter Umständen von einem anderen Script oder Mod benutzt werden. Es wird zwar bisher die Anstrengung unternommen dafür eine zentrale Stelle einzurichten, die einem diese IDs zuweist, allerdings ist das bisher noch nicht umgsetzt worden. Bis dahin empfehle Ich die folgende Richtlinie einzuhalten:
  • Am besten keine niedrigen IDs verwenden. 440001.XML bis 440003.XML wurden schon von Egosoft belegt. Und man kann ziemlich sicher davon ausgehen das offizielle Egosoft-Erweiterungen, die noch erscheinen werden, noch mehr dieser LowIDs belegen werden.
  • Wenn mehrere Scripts von einer Person geschrieben und veröffentlicht werden sollte man dafür nur eine Sprachdatei verwenden. Auf den Punkt gebracht bedeutet das: Man hat nur eine XML-Sprachdatei für ALLE seine Scripte. Wenn man die Scripte veröffentlicht, dann am Besten in 2 Teilen -> die Scripte getrennt von der Sprachdatei. Nach dieser Methode bekommt jeder immer die aktuellste Sprachdatei, die mit all euren veröffentlichen Scripten funktioniert. Obwohl das bedeuten kann, dass in der Sprachdatei ein Text für ein Script vorhanden ist, das diese Person gar nicht nutzt. Obwohl mehr IDs zur Verfügung stehen als in den XML-Sprachdateien benutzt werden wird es über kurz oder lang Konflikte zwischen verschiedenen Scripten geben, die die gleiche ID benutzen. Und genau deshalb wird eine zentrale Verwaltung benötigt.
So...jetzt aber genug über die Sprachdateien. Nun zu den eigentlichen Anforderungen, die an uns gestellt werden um ein Kommando in den Menübaum zu hängen (Ein kleiner Blick in die Beispieldatei 440021.XML (440069.XML) an diesem Punkt könnte nicht schaden). Dort müssen 2 Textstücke eingtragen werden: Der lange Namen des Kommandos und die dazugehörige, kurze Version. Jenachdem in welchen Menüs man sich gerade im Spiel aufhält sieht man die lange order die kurze Version. Im eigentlichen Menüsystem sieht man beide, wie folgende Illustration zeigt.

[ external image ]

In diesem Beispiel verwende Ich "Maintain Product Quantity" für den langen Namen und "MaintainQuant" für den kurzen.

Die Sprachdateien verwenden einen XML "PAGE" Tag um den Text für die verschiedenen Verwendungsmöglichkeiten zu identifizieren. Ein "PAGE" Tag mit einem ID Attribut von 2010 identifiziert den Text für einen langen Namen eines Kommandos, wohingegen 2011 den kurzen Namen des Kommandos identifiziert. Man sollte auch beachten das der "t" Text Tag, mit dem wir den Text bezeichnen ein ID Attribut von 421 (213) hat. Und das es bei beiden die gleiche ID ist, langer Name wir kurzer. Das wird in Schritt 3 wichtig.

Um nur ein Kommando einzuhängen ist das alles was man in der XML-Sprachdatei haben muss.

3. Schritt
Wir haben das Script, das wir für unser neues Kommando benutzen woll, und wir haben die zugehörige XML-Sprachdatei, die für den Text in den Menüs benötigt wird. Jetzt brauchen wir blos noch ein kleines Script, das diese 2 später im Spiel miteinander verknüpft. Und genau dafür benutzt man dann init-Scripte.

Jedes Script das im Dateinamen mit "init" beginnt ist automatisch ein init-Script und wird automatisch bei jedem Start von X² ausgeführt. Es ist absolut wichtig das man damit sehr vorsichtig umgeht. Ein Bug in einem der init-Scripte kann später beträchtliche Konsequenzen haben. Das Beispielscript hierzu hat den Namen "init.cmd.maintprod.xml".

Unser init-Script hat 3 Aufgaben: Es muss die XML-Sprachdatei laden, dem Spiel sagen welcher der Güter mit unserem Script verknüpft ist (Optional -> siehe mein Codebeispiel, wenn das Script immer verfügbar sein soll) und es muss unser Script noch mit einem Kommando verknüft werden und dem Spiel erklären welche Schiffe dieses Kommando verwenden können.

Als erstes wird die XML-Sprachdatei geladen. Der erste Ausdruck im Bespiel dafür ist:
Reven Code:

Code: Select all

load text: id=21
Nemesi$ Code:

Code: Select all

load text: id=69
Erinnert ihr euch an den XML-Sprachdateinamen, wie er den Sprachcode (44 für Englisch) und die ID am Ende hat, mit der wir die Datei laden wollen? Tja...das ist genau was diese Codezeile macht. Die englische Version von X² wird dann die Datei "440021.XML" ("4400069.XML")laden, die deutsche dagegen "490021.XML" ("490069.XML").

Jetzt müssen wir noch unser Script (Beispielscript: "ship.cmd.maintprod") mit einem Kommando vom Spiel verknüpfen. Ein X² "Kommando" ist einfach ein InGame Aktion die man durch die Menüsysteme erreichen kann. Es gibt (offensichtlich) eine ganze Menge vordefinierte InGame-Kommandos in X² -> und alle sind mit Scripten verbunden durch die im Spiel mitgelieferten init-Scripte. Es ist zwar möglich eigene Kommandos zu erstellen, aber das bringt auch wieder einen haufen Aufwand in die ganze Prozedur. Glücklicherweise müssen wir das aber nicht, denn Egosoft war so nett und hat uns 32 Extrakommandos für jeden Typ bereitgestellt. Das sind Kommandos, die noch mit keinem Script verknüpft sind -> der einzige Sinn dahinter ist, das sie von Leuten wie uns benutzt werden um unsere Scripte einzuhängen.

Um einen dieser Kommandos zu benutzen müssen wir dem Spiel erst erklären welches der Güter unser Kommando "enthält". Das bedeutet, was eine Person für ein Upgrade kaufen muss um das Kommando benutzen zu können. In diesem Fall wird die "Trade Command Software MK1" benötigt. So machen wir dem Spiel klar das jedes Schiff, das die "Trade Command Software MK1" eingebaut hat unser neues Kommando benutzen kann. Wie das geht? Nun, die nächtste Codezeile im init-Script will das verdeutlichen:

Reven Code:

Code: Select all

set ship command upgrade: command=COMMAND_TYPE_TRADE_21  upgrade=Trade Command Software MK1
Nemesi$ Code:

Code: Select all

set ship command upgrade: command=COMMAND_TYPE_NAV_13  upgrade=[TRUE]
Bei meinem Codebeispiel ist das Kommando ohne irgendwelche Vorraussetzungen verfügbar.

Erinnert ihr euch daran wie wir gesagt haben, das der Text ID Tag (412) (213) in der Sprachdatei später wichtig wird? Das ist er nämlich jetzt. ID #421 gehört zum Kommando COMMAND_TYPE_TRADE_21. Die "4" bezieht sich auf die Tradekommandos, die 21 auf die Nummer 21 (von 0 bis 31) aus der Kommandoliste.
ID #213 gehört zum Kommando COMMAND_TYPE_NAV_13. Die "2" bezieht sich auf die Navigationskommandos, die 13 auf die Nummer 13 (von 0 bis 31) aus der Kommandoliste.
Wenn wir zum Beispiel ein Commando zum Spezialmenü hinzufügen wollen, anstatt dem Handelsmenü, müssten wir im ID Tag der Sprachdatei "521" und das Kommando COMMAND_TYPE_SPECIAL_21 verwenden.
  • Nav hat ID "2"
  • Combat hat ID "3"
  • Trade hat ID "4"
  • Special hat ID "5"
Bisher haben wir die Sprachdatei geladen und dem Spiel erklärt das wir ein neues Kommando hinzugefügt haben, und wo dieses seinen Text findet. Ales was wir jetzt noch machen müssen ist unser eigentliches Script mit dem Kommando verknüpfen.

Reven Code:

Code: Select all

global ship map: set: key=COMMAND_TYPE_TRADE_21, class=Ship, race=Player, script='ship.cmd.maintprod', prio=0 
global ship map: ignore: key=COMMAND_TYPE_TRADE_21, class=Big Ship, race=Player
Nemesi$ Code:

Code: Select all

global ship map: set: key=COMMAND_TYPE_NAV_13, class=Ship, race=Player, script='ship.cmd.maintprod', prio=0 
global ship map: ignore: key=COMMAND_TYPE_NAV_13, class=Fight Drone, race=Player
In diesem Beispiel sind 2 Ausdrücke um unser Ziel zu erreichen. Der erste bedeutet: Erlaube das Kommando COMMAND_TYPE_TRADE_21 für alle Objekte der Klasse ship (die Klasse ship enthält alle Schiffe) die der Rasse Player gehören (das ist der Spieler) und das wir das Script "ship.cmd.maintprod" mit dem Kommando verknüpfen wollen. Zusaätzlich wird mit prio die Priorität festgelegt, mit der das Script ausgeführt werden soll wenn es aufgerufen wird (0 = normal).

Da dieses Kommando aber recht Nutzlos für ein Schiff der Klasse M6 oder grösser ist (da diese Schiffe sowieso nicht an Fabriken docken können), sagen wir in der zweiten Zeile dass der Verknüpfungsbefehl zwar für alle Schiffe gilt, aber eben nicht bei denen die der Klasse "Big Ships" angehören.

Wir hätten die auch anders machen können, indem wir einfach für jedes Schiff (M5, M4, M3, TS, TL, Goner) einzeln den Befehl ausgeführt hätten. Unsere Variante ist einfach ein wenig kürzer. ber man kann selber völlig frei entscheiden wierum man das ganze macht und was am besten für das eigene Script passt.

Installation
Jetzt haben wir ein Script, eine Sprachdatei für das zugehörige Kommando und haben das Kommando mit dem Script verknüpft. Alles was wir jetzt noch tun müssen ist unser neues Kommando an die passenden Orte kopieren. Die Scripte gehören nach "X2/scripts", die Sprachdatei nach "X2/t". Das wars schon. Wenn alles richtig gemacht wurde sollte man ein Menü wie das Folgende bekommen:
[ external image ]

Anmerkung
Ich habe die Nummer 21 hier zweimal benutzt. Einmal um die ID für die Sprachdatei festzulegen, und einmal um zu bezeichnen um welches Extra Trade Kommando es sich handelt. Das war möglicherweise eine schlechte Wahl und wird wohl bei so manchem etwas Verwirrung stiften. Wer mit dem Unterschied der zwei IDs nicht so ganz klar kommt sollte nochmal ganz sorgfältig den text durchgehen.
Und genau wegen dieser möglichen Fehlerquelle habe ich meine Orangefarbigen IDs noch hinzugefügt. Wer sich mit denen ein bisschen ausseinandersetzt sollte recht schnell auf den Trichter kommen.

Wer Fehler findet solls mir per PM oder hier im Topic mitteilen. Ich märze die dann nach Möglichkeit aus.

Und jetzt wünsche ich allen viel Spass beim ausprobieren ;]

Nemesi$


/edit 23.03.'04 -> Links gefixt.
Last edited by Nemesi$ on Tue, 23. Mar 04, 19:14, edited 4 times in total.

Deleted User

Post by Deleted User » Tue, 27. Jan 04, 17:03

super echt nochmal vielen dank für die mühe :D :D :D

@ Mods - könntet ihr das bitte bitte pinnen damit es nicht nach unten rutscht. :roll: :roll: :roll:

Kill4Free
Posts: 19
Joined: Tue, 30. Dec 03, 17:59
x4

Post by Kill4Free » Tue, 10. Feb 04, 12:34

Der Link zu den Beispirlscripts funktioniert nicht bitte an mich per PN einmal schicken!

User avatar
Cube[BS]
Posts: 947
Joined: Wed, 6. Nov 02, 20:31
x3tc

Post by Cube[BS] » Sat, 14. Feb 04, 18:52

ok,mal ne frage:
wozu steht der id"44" wert in der sprachfile?
2010 für den langen und 2011 für den kurzen,aber die 44 irritiert mich :?

edit:axo steht für den sprachcode^^
beim nächsten mal les ich gleich richtig^^

User avatar
Zero_Project
Posts: 17
Joined: Sun, 20. Apr 03, 20:56
x2

Die ID 44

Post by Zero_Project » Thu, 26. Feb 04, 21:34

Möglicherweise hat das was mit dem Ländercode zutun.
Wenn ich mich nicht täusche dann ist +44 für England. @cube
*kurz mal anrufen* :D
Kein Anschluss unter dieser Nummer :cry:

User avatar
GothicK
Posts: 248
Joined: Fri, 6. Feb 04, 14:47
x3tc

Post by GothicK » Thu, 26. Feb 04, 22:05

X² benutzt 49 für deutsche und 44 für die englishe Version.

Wenn diese Zahl nicht korrekt in der Datei steht funzt das ganze nicht.
Auch wenn der DateiNAME korrekt ist.
Solong, GothicK

User avatar
lenny5000
Posts: 892
Joined: Mon, 29. Sep 03, 19:06
x3

Post by lenny5000 » Tue, 23. Mar 04, 17:16

Hm.... der Link zu den Beispielscripten funzt irgendwie nicht.... :(
Greets
lenny5000

Nemesi$
Posts: 120
Joined: Wed, 12. Nov 03, 19:05
x4

Post by Nemesi$ » Tue, 23. Mar 04, 19:14

Habs eben gefixt. Reven hat das File bei sich umbenannt. Im Org-Topic von ihm war aber der passende Link zu finden ;]
Die Zehn Gebote haben 279 Wörter, die amerikanische Unabhängigkeitserklärung hat 300 Wörter. Die EU-Verordnung zur Einfuhr von Karamelbonbons hat 25911 Wörter. [Bodo H. Hauser]

Kaplan
Posts: 14
Joined: Mon, 23. Feb 04, 09:34
x4

Post by Kaplan » Tue, 23. Mar 04, 21:14

Hallo Leute,
bin noch ziemlich neu im script geschäft und da es mich unheimlich intressiert würd ich natürlich einiges erfahren wollen.
Konnte bisher den script Editor oeffnen , aber ich finde keine scrips wenn ich versuche welche zu oeffnen.
Habe mir auch schon jede menge message angeschaut , aber irgentwie bin ich zu bloed dafuer was zu oeffnen.
Kann mir bitte jemand in verstaendlicher weise erklaeren wie ich mir von dem offiziellen x2 spiel scripst von ego-soft anschauen kann ,das wuerde mich schon weiter bringen , danke :D .

User avatar
lenny5000
Posts: 892
Joined: Mon, 29. Sep 03, 19:06
x3

Post by lenny5000 » Wed, 24. Mar 04, 15:28

dazu musst du sie mit den Moddingtools entpacken.
Lade dir am besten das ModdinKIT von egosoft runter - da steht alles drin (Englisch)
Greets
lenny5000

Nemesi$
Posts: 120
Joined: Wed, 12. Nov 03, 19:05
x4

Post by Nemesi$ » Wed, 24. Mar 04, 17:07

und wenn sie entpackt sind an 3 stellen das "!" wegmachen.

1. im Filenname
2. ziemlich am Anfang des Scripts
3. irgendwo am Ende des Scripts

Danach können diese modifizierten Scripte auch im Editor angeschaut bzw. bearbeitet werden.
Die Zehn Gebote haben 279 Wörter, die amerikanische Unabhängigkeitserklärung hat 300 Wörter. Die EU-Verordnung zur Einfuhr von Karamelbonbons hat 25911 Wörter. [Bodo H. Hauser]

Kaplan
Posts: 14
Joined: Mon, 23. Feb 04, 09:34
x4

Post by Kaplan » Wed, 24. Mar 04, 17:28

Vielen Dank auch mal werds gleich mal versuchen! :D

User avatar
Spotxxl
Posts: 583
Joined: Tue, 10. Feb 04, 17:29
x3tc

Post by Spotxxl » Sat, 10. Apr 04, 12:56

:? :? :?
Ich kapier kein Wort
:? :? :?

PS: Ich habs 7 mal gelesen
Ein Drache ist ne feine Sache :)

Vassenego
Posts: 4797
Joined: Fri, 20. Dec 02, 19:30
x2

Post by Vassenego » Tue, 4. May 04, 16:44

Aus Gründen der Übersichtlichkeit abgehängt. Ein Link zum Thema findet sich ab sofort im weiterhin gepinnten UST.

:)


Alles wird aufgeräumt
Vassenego
"Bereitet euch darauf vor, relativistisch Absurdes zu werden ..." (Isaac)

don't click :spam:

--<= back (for good?) =>--

Post Reply

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