[WIP][Tutorial] XRebirth - Modding-Grundkurs

Hier ist der ideale Ort um über Scripts und Mods für X Rebirth zu diskutieren.

Moderators: Scripting / Modding Moderators, Moderators for English X Forum

Post Reply
UniTrader
Moderator (Script&Mod)
Moderator (Script&Mod)
Posts: 14571
Joined: Sun, 20. Nov 05, 22:45
x4

[WIP][Tutorial] XRebirth - Modding-Grundkurs

Post by UniTrader » Mon, 25. Aug 14, 19:57

Ich werde hier mal anfangen einen Deutschen Modding-Guide für X-Rebirth zu erstellen, um den Anfang zu erleichtern und vor allem damit man seine Erweiterungen von anfang an richtig umsetzt - denn es gibt mittlerweile genug, die weniger gut umgesetzt sind *hust*-prefersinglefiles*/hust* - die Zusammenstelleng wird allerdings ein bisschen dauern, da dies das dritte vorhaben für XR auf meiner Prioritätenliste ist.

Als Grundvorraussetzung setze ich an dieser Stelle einen XML-Editor wie z.B. Notepad++ vorraus, ein gewöhnlicher Texteditor wie das normale Notepad reicht zwar auch aus, aber viele einfache Fehler wie z.B. in der Syntax werden damit nicht automatisch erkannt sondern die Erweiterung funktioniert einfach nicht wie gedacht. XML-Begriffe und -Pfade werde ich wenn sie neu sind oder schon länger nicht mehr benutzt wurden in längerer Form aufschreiben (keine vollständige erklärung sondern nur so weit, dass man aus dem kontext heraus versteht was gemeint ist) und mich ansonsten eher kurz fassen

Da mir das Modding in XR und der einstieg darin eher leicht fiel, aber mir gleichzeitig klar ist dass das nicht auf jeden zutrifft und sämtliche Tutorials für die Vorgänger nicht mehr zutreffen bitte ich darum, bei unklarheiten zu fragen und auch verbessserungsvorschläge zu bringen. Und damit starten wir auch gleich mit dem ersten (und relativ kurzen) Abschnitt:


Anlegen einer neuen Extension/Erweiterung
-------------------------------------------------------------------------------------------------------------------------------------
Zuerst muss man dafür ins Rebirth-Stammverzeichnis gehen (standardmässig zu finden unter "C:\Program Files (x86)\Steam\SteamApps\common\X Rebirth") und dort, sofern noch nicht vorhanden, einen neuen Ordner Namens » Extensions « anlegen. In diesem Ordner sind alle Erweiterungen in einem eigenen Ordner enthalten, die das Spiel kennt. Deswegen legen wir hier auch gleich einen neuen Ordner an, und nennen ihn erst einmal » Beispielerweiterung «.
Das reicht zwar, damit Rebirth eine neue Erweiterung anzeigt (NOTE TO SELF: InGame nachprüfen; die 7z-Dateien werden schliesslich auch nicht mehr gelistet), allerdings gehen da noch ein paar Sachen mehr.
Dafür wird jetzt eine neue Datei namens content.xml in unserem Erweiterungsordner angelegt und der folgende Abschnitt rein kopiert:

Code: Select all

<?xml version="1.0" encoding="utf-8"?>
<content id="ExampleExtension" name="Example Extension" description="An Exmaple how to make an Extension" author="YOU" date="" version="100" save="false" enabled="true">
  <text language="49" name="Beispielerweiterung" description="Ein Beispiel wie man eine Erweiterung erstellt." author="DU" />
</content>
Hier eine aufschlüsselung, was InGame was ändert sowie ein passend kolorierter Screenshot:
/content/@id (id-Attribut im content-Node):Eindeutige ID der Erweiterung, damit diese vom Spiel zugeordnet werden kann. (nicht für die Nutzer der Erweiterung sichtbar)
/content/@name (name-Attribut im content-node):Name der Erweiterung, der InGame angezeigt wird wenn für die für das Spiel eingestellte Sprache kein Eintrag vorhanden ist
/content/@description : Beschreibung der Erweiterung, wenn keine Sprachspezifische definiert ist
/content/@author : Autor/Ersteller der Erweiterung, der InGame angezeigt wird wenn für die eingestellte Sprache kein Eintrag vorhanden ist
/content/text/(@name|@description|@author) (Die name; description und author-Attribute im text-Node im content-Node): die Drei vorigen Punkte noch einmal, diesmal allerdings Sprachspezifisch (für welche Sprache wird hiermit ( /content/text/@language ) festgelegt - wie in vorigen Spielen wird hierfür die Ländervorwahl genommen, also (0)49 für Deutschland)
Mit diesem Attribut kann man bestimmen, ob eine Erweiterung zukünftig für das Savegame zwingend erforderlich ist. Standardeinstellung bei nichtgebrauch ist Ja.
Mit diesem Attribut wirt bestimmt, ob eine Erweiterung Standardmässig (sprich wenn das Spiel sie noch nicht kennt) Aktiv sein soll. Standardeinstellung bei nichtgebrauch ist Ja.

Damit wäre das Thema Anlegen einer Neuen Erweiterung erledigt, weiter gehts mit (IN ARBEIT)
A) die Spieldateien betrachten und/oder entpacken
B) bestehende XML-Dateien modifizieren (Punkt A sollte vorher gelesen werden)
C) dem Spiel neue XML-Dateien bekannt geben und diese in bestehenden nutzen (Punkt A und B sollten vorher gelesen werden)


Dieses Tutorial ist in Arbeit und wird später fortgesetzt. Fragen & kommentare vorerst per PM an mich.
if not stated otherwise everything i post is licensed under WTFPL

Ich mache keine S&M-Auftragsarbeiten, aber wenn es fragen gibt wie man etwas umsetzen kann helfe ich gerne weiter ;)

I wont do Script&Mod Request work, but if there are questions how to do something i will GLaDly help ;)

UniTrader
Moderator (Script&Mod)
Moderator (Script&Mod)
Posts: 14571
Joined: Sun, 20. Nov 05, 22:45
x4

Post by UniTrader » Mon, 25. Aug 14, 20:18

Teil 2: Die Egosoft-Cat-Tools nutzen; Die X Rebirth-Spieldaten entpacken und betrachten
-------------------------------------------------------------------------------------------------------------------------------------

Hier werde ich mich relativ kurz fassen und nur erklären, wie man Daten extrahiert und einen kleinen einblick in eine der vielen XML-Dateien im Spiel geben.

Zuerst einmal brauchen wir die offiziellen Cat/Dat-Tools von Egosoft, welche man entweder durch einen klick [url=steam://install/282160]hier[/url] oder über Steam Rechtsklick auf » Bibliothek « und im aufklappenden Menü auf » Tools «, anschliessend in der angezeigten Liste herunterscrollen und die X Rebirth Tools via Doppelklick installieren.

Anschliessend müssten noch die Spieldaten extrahiert werden. Es gibt zwar auch ein Grafisches Tool dafür, aber ich persönlich bevorzuge es alle Spieldaten direkt erreichbar zu haben, weil man sie so z.B. auch durchsuchen lassen kann. Darür wechseln wir jetzt in den Ordner, wo sich die X Rebirth Tools befinden (standardmässig zu finden unter "C:\Program Files (x86)\Steam\SteamApps\common\X Rebirth Tools", also in einem vom Spiel seperaten Ordner)
Um alle Spieldateien auf einmal zu entpacken habe ich bereits ein kleines Script geschrieben, kopiert diesen Code einfach in eine neue Bat-Datei » XR extrahieren.bat « (zum erstellen eine neue Textdatei anlegen und die Dateinamenerweiterung durch .bat ersetzen; um die Datei anschliessend zum Einfügen des Codes zu editieren einen Rechtsklick darauf machen und [ Bearbeiten ] wählen):

Code: Select all

mkdir "..\X Rebirth\XR_extracted"
XRcatTool.exe -in "..\X Rebirth\01.cat" "..\X Rebirth\02.cat" "..\X Rebirth\03.cat" "..\X Rebirth\04.cat" "..\X Rebirth\05.cat" "..\X Rebirth\06.cat" "..\X Rebirth\07.cat" "..\X Rebirth\08.cat" "..\X Rebirth\09.cat" -out "..\X Rebirth\XR_extracted"
und führt in anschliessend mit einem Doppelklick auf die Datei aus. Das Extrahieren dauert ca. 15 Minuten und anschliessend findet ihr die Entpackten Spieldaten unter XR_extracted im XR-Stammverzeichnis.

Falls neue Patches erscheinen sollte der XR_extracted-Ordner gelöscht werden und das vorige Script nochmals ausgeführt werden, damit die Spieldaten die betrachtet werden immer auf dem neuesten Stand sind. (das Spiel selber verwendet immer noch die Daten, die sich ich den Cats/Dats befinden)

Um diesen Abschnitt etwas länger zu machen betrachten wir auch gleich mal eine der Spieldateien - in diesem fall die Balancierten MK4-Triebwerke, welche im nächsten Kapitel mittels unserer Erweiterung verändert werden.
assets/props/EngineSystems/macros/engine_player_bal_mk4_macro.xml
Das ist eines der möglichen Antriebssysteme für das Spielerschiff. Allgemein für alle Macros ist hier folgendes definiert:
/macros/macro/@name: der Name des macros, ist in der regel derselbe wie der Dateiname, nur ohne xml (bzw. der component; vereinfacht kann man sagen dass ein Macro die Technischen daten wie Hülle, Leistung etc. eines Bauteils beinhaltet und die components den räumlichen zusammenhang, wo bauteile montiert sind oder angehängt werden können**)
/macros/macro/@class: zu welcher Klasse das jeweilige Bauteil gehört; bestimmt unter anderem was es kann/für eigenschaften hat und ob man es auswählen kann sowie wie es in diesem fall dargestellt wird. (ein Werbeschild hat z.B. keine Geschwindigkeit oder beschleunigung*, ein Triebwerk wie dieses hier dagegen schon)
/macros/macro/properties/identification: Die Attribute dieses Nodes legen den Namen ( @name ) bzw. die Beschreibung ( @description ) dieses Macros fest, wie er im Spiel angezeigt wird. Dieser Teil ist nicht zwingend, es gibt auch einige unbenannte Macros - aber die meisten haben ihn ;) Die Texte werden aus den Sprachdateien / t-files jeweils für die eingestellte Sprache dynamisch eingefügt - mehr dazu später im zugehörigen Kapitel.
/macros/macro/connections: Dieser Node ist auch sehr oft zu finden. Hier ist festgelegt, welche weiteren Macros/Bauteile an diesem Macro "angebaut" sind. wie schon zuvor erwähnt ist die Position von diesen nicht heir festgelegt sondern in der weiter oben erwähnten component ( /macros/macros/component/@ref ), zumindest sofern benötigt. Wie man an diesem beispiel sieht haben die Triebwerke noch einen zusätzlichen Booster eingebaut.

Dies war ein kurzer Überblick zum Thema Macros, welche, mit den ähnlichen aber nicht gleichen components, den grössten Teil der Spieldaten ausmachen, es gibt auch noch andere aber deren Modding funktioniert, sofern es xml-Dateien sind im prinzip genauso wie in den folgenden Teilen erklärt.



*könnte aber bei bedarf trotzdem klappen, ich habe dies im speziellen noch nicht probiert :D

**erklärung bedarf besserer Formulierung
Last edited by UniTrader on Mon, 1. Sep 14, 16:36, edited 4 times in total.
if not stated otherwise everything i post is licensed under WTFPL

Ich mache keine S&M-Auftragsarbeiten, aber wenn es fragen gibt wie man etwas umsetzen kann helfe ich gerne weiter ;)

I wont do Script&Mod Request work, but if there are questions how to do something i will GLaDly help ;)

UniTrader
Moderator (Script&Mod)
Moderator (Script&Mod)
Posts: 14571
Joined: Sun, 20. Nov 05, 22:45
x4

Post by UniTrader » Tue, 26. Aug 14, 16:57

Teil 3: Einfache Änderungen an Spieldateien
-------------------------------------------------------------------------------------------------------------------------------------

Um Spieldateien zu verändern werden diese nicht wie in den vorgängern ersetzt sondern wir verwenden stattdessen XML-Diff Dateien gemäß RFC5261 - kling erst einmal kompliziert ist aber prinzipiell eine simple sache.

Betrachten wir noch einmal die MK4-Engine aus dem vorigen Teil:
\assets\props\SurfaceElements\Macros\engine_player_bal_mk4_macro.xml

Code: Select all

<?xml version="1.0" encoding="utf-8"?>
<!--Exported by: Michael (192.168.3.144) at 14.05.2014_13-46-22-->
<macros>
  <macro name="engine_player_bal_mk4_macro" class="engine">
    <component ref="props_enginesystems_player_bal_mk1" />
    <properties>
      <identification name="{20108,301}" description="{20108,302}" />
      <acceleration forward="90" reverse="135" strafe="180" pitch="250" yaw="250" roll="180" />
      <angular />
      <speed forward="270" reverse="-90" strafe="135" pitch="85" yaw="85" roll="90" />
      <typeinfo mk="4" type="1" />
      <hull min="250" max="1000" hittable="0" />
      <efficiency>
        <threshold threshold="1" value="1" />
        <threshold threshold="0.5" value="0.9" />
        <threshold threshold="0.25" value="0.8" />
      </efficiency>
      <sounds>
        <ambient ref="eng_player_ambient" />
      </sounds>
    </properties>
    <connections>
      <connection ref="enginebooster">
        <macro ref="enginebooster_player_01_macro" connection="engine" />
      </connection>
    </connections>
  </macro>
</macros>
Wir wollen, dass diese schneller werden, also dass das Spiel nicht das oben sieht sondern das hier


Dafür erstellenen wir in unserer Beispielerweiterung eine Datei mit demselben Pfad und Namen wie die Datei oben, aber statt da eine Kopie des obigen rein zu schreiben kommt das hier rein:

Code: Select all

<?xml version="1.0" encoding="utf-8"?>
<diff>
  <replace sel='/macros/macro/properties/speed'>
    <speed forward="500" reverse="-150" strafe="250" pitch="85" yaw="85" roll="90" />
  </replace>
</diff>
zur erklärung:
<diff>-root-Node: damit dem Spiel klar ist, dass dies keine Merge-Date oder neue Datei ist (dazu später mehr) sondern dass diese Datei Änderungen an bestehen Dateien vornehmen soll.
<replace>-Node: damit wird gesagt, dass ein teil der ursprungsdatei ersetzt werden soll (es gibt noch add und delete, die behandeln wir später in diesem Teil).
sel=-Attribut: Dies wählt aus, welcher teil erssetzt werden soll. Nodes werden wie Ordner ausgewählt (mit / als Trenner)
Hier noch einmal in Farbiger Hervorhebung, welcher Teil was auswählt: /macros/macro/properties/speed - im prinzip funktioniert das ganze wie eine Ordnerstruktur, es sind aber auch mehrere gleichnamige Ordner/Nodes im selben Ordner/Node erlaubt, die sich dann durch Attribute und/oder beinhaltete Nodes unterscheiden (oder auch durch die Reihenfolge in der Datei).
Inhalt des <replace>-Nodes: das, was anstatt des Ausgewählten Inhaltes eingefügt werden soll, in diesem fall werden die Leistungsdaten so ersetzt, dass das Triebwerk jetzt vorwärts 500 macht, rückwärts 150 und Seitwärts 250, statt der vorigen 270/90/135.


Natürlich sind auch andere Selektionen denkbar, hier ein paar weitere Beispiele, die jeweils eine ander Option der Auswahlsyntax aufzeigen:
-> Direktes Auswählen/ersetzen eines Attributes, ohne die anderen zu ändern (Beispiel: die Vorwärtsbeschleunigung halbieren)

Code: Select all

<diff>
  <replace sel='/macros/macro/properties/acceleration/@forward'>45</replace>
</diff>
wobei der Sel-Attribut nacheinander diese Nodes und zum schluss ein Attribut auswählt: /macros/macro/properties/acceleration/@forward. der trick hierbei ist das @, wie @ttribut ;)

-> einen Node direkt auswählen, ohne den kompletten Pfad einzugeben (Beispiel: vervielfachen der Hüllenwerte/Hitpoints x10 ):

Code: Select all

<diff>
  <replace sel='//hull'>
    <hull min="2500" max="10000" hittable="0" />
  </replace>
</diff>
in diesem fall wählt //hull den hull-Knoten direkt aus, ohne den kompletten Pfad zu beschreiben. der trick dabei ist das doppelte //. Das vereinfacht zwar sehr viele dinge, aber man muss bedenken dass die XPath-Pfade immer eindeutig sein müssen. für das genannte Beispiel würde //threshold zum beispiel nicht funktionieren, weil es diesen Knoten mehrmals gibt, aber auch hier ist eindeutigkeit möglich:

-> einen Node basierend auf den Werten seiner Attribute auswählen (Beispiel: Effizienz der Triebwerke auf 50% herabsetzen wenn diese nur noch 25% Hülle haben; mehrere Beispiele wie man das hin bekommt; effekt ist bei allen exakt derselbe)
1. Vollständigen Pfad beschreiben und bei den threshold-Nodes diese durch das value-Attribut auseinanderhalten:

Code: Select all

<diff>
  <replace sel='/macros/macro/properties/efficiency/threshold[@value="0.8"]'>
    <threshold threshold="0.25 value="0.5" />
  </replace>
</diff>
Hier wird über die angaben in den [] ein bestimmter Node von mehreren in frage kommenden ausgewählt. Mögliche Merkmale sind ein auseinanderhalten über die Werte von Attributen (wie dieses Beispiel hier), oder auch der wievielte Node in der Datei dies ist (in diesem fall wäre das [3] ), wobei ich ausser in ausnahmefällen davon abrate, dies zu nutzen weil damit keine eindutigkeit über mehrere Versionen und mit mehreren Mods garantiert ist.

2. Direktes addresieren des Nodes und Attributes, der ersetzt werden soll:

Code: Select all

<diff>
  <replace sel='//threshold[@value="0.8"]/@value'>0.5</replace>
</diff>
beachtet hierbei das doppelte @value, zuerst zum auswählen/unterscheiden des Nodes, dann die wahl des Attributes selber.

3. Addresieren des Nodes nach einem anderen Wert als der, der ersetzt werden soll:

Code: Select all

<diff>
  <replace sel='//treshold[@threshold="0.25"]/@value'>0.5</replace>
</diff>
wie man sieht müssen die Attribute zum wählen des Nodes und zum Addresieren, welches Attribut ersetzt werden soll nicht dieselben sein - und in den vielen fällen wird dies auch nötig sein, da die zu ändernden Werte von mehreren Nodes dieselben sind und andere Attribute der einzige Unterschied.

4. Auswahl nach Attributen allein:

Code: Select all

<diff>
  <replace sel='//*[@threshold="0.25"]/@value'>0.5</replace>
</diff>
wie man hier sieht ist die angabe eines Node-namens unnötig (kann durch den platzhalter * ersetzt werden), ich würde diesen aber zwecks verständlichkeit trotzdem immer mit angeben.


***** wird später fortgesetzt / ergänzt - kann gerade nicht auswendig weiter machen *****

Zudem kann man nicht nur Werte verändern sondern diese auch hinzufügen oder löschen. Modifizieren wir einfach hierfür mal das Reparaturdock, was man auf Schiffen und Stationen findet (Triebwerke sind zwar schön kurz, aber entsprechend kann man da nicht viel mehr machen)
Die relevanten Daten für Objekte im Spiel sind immer in mehreren Dateien, davon 2 xmls: macro und component;
-> die component beschreibt dabei ein einzelnes Bauteil, also wo lichter sind, an welchen stellen man etwas anbauen kann, wie diie einzelnen Teile des Objektes selber liegen etc.
-> das macro ist ein Bauplan der beschreibt welches Bauteil wo am Objekt angebaut wurde - hierbei können auch andere macros/baupläne referenziert werden, ohne einzeln zu beschreiben was daran verbaut ist (so sind z.B. die Targon-Tracer/Waffenplatformen an alle Stationen montiert) oder auch einzelne components direkt verbaut werden ohne über ein (benanntes) macro zu gehen

so viel zur Einführung, dann fangen wir einmal damit an die Skunk vom Rep-dock/der Landeplatform zu entfernen und daraus ne Aussichtsplatform zu machen.
Öffnet dafür zur Referenz gleich mal die
assets\interiors\rooms\macros\interiors_rooms_dockingbay_repairdock_macro.xml
(aufgrund der Länge dieser Datei werde ich sie nicht vollständig hier rein kopieren sondern nur ddie relevanten Abschnitte)
Hier befinden sich 3 Teile, welche die Skunk auf der Platform darstellen:
-> die Skunk selber
-> die Ausgangstür (seperat, da animiert)
-> der Schalter für die Tür (dito)
hier die diesbezüglichen Ausschnitte aus dem macro:

Code: Select all

…
    <connections>
      <connection ref="ConnectionFor_interiors_rooms_ar_albionskunk">
        <macro>
          <component ref="interiors_rooms_ar_albionskunk" connection="space" />
        </macro>
      </connection> 
……
      <connection ref="ConnectionFor_interiors_rooms_swa_button_01">
        <macro>
          <component ref="interiors_rooms_swa_button_01" connection="space" />
        </macro>
      </connection>
      <connection ref="ConnectionFor_interiors_rooms_swa_skunk_exit">
        <macro>
          <component ref="interiors_rooms_swa_skunk_exit" connection="space" />
        </macro>
      </connection>
    </connections>
……
Um diese zu entfernen legen wir nun eine Neue Datei in unserer Extension an und dort kommt folgendes rein:

Code: Select all

<diff>
  <remove sel=’//connection[@ref="ConnectionFor_interiors_rooms_ar_albionskunk"]' />
  <remove sel='//connnection[@ref="ConnectionFor_interiors_rooms_swa_button_01"]' />
  <remove sel='//connection[macro/component/@ref="interiors_rooms_swa_skunk_exit"] />
</diff>
wie zu sehen ist kann man auch mehrere Patchaktionen in einem diff-file zusammen fasssen. ***** Braucht bestätigung ***** Ausserdem sticht sicher der extrem lange XPath beim letzten remove ins Auge - ich habe diesen extra ein wenig koplizierter als nötig gemacht um zu zeigen, wie man einen Node basierend auf den Werten der child-Nodes Addresieren kann - die [] werden hierfür an der stelle des Pfades geöffnet, den man Addresieren will und darin wird dann der weitere Pfad zum eindeutigen identifier beschrieben (alternativ kann man hier auch einen Pfad rein schreiben der einmalig ist) ***** /Braucht Bestätigung ****

Als nächstes werde ich den Add-Node erklären, indem wir einen Plüsch-Jeb auf den Holoprojektor setzen. Anschliessend machen wir zudem eine richtige Aussichtsplatform aus dem Landepad, indem die Hütte im Boden versenkt wird, sämtliche Kisten entfernt werden und vielleicht noch ein paar Blickfänge platzieren, wie nen Aquarium oder so. Ausserdem noch die NPC umpositionieren, sodass sie zur neuen Einrichtung passen - aber nicht mehr heute.


Personal note: Die Component des Landepads noch hierher kopieren...


--------------------------------------------------------------------------------
nur zur persönlichen Referenz:

\assets\props\SurfaceElements\Macros

Code: Select all

<?xml version="1.0" encoding="utf-8"?>
<!--Exported by: Michael (192.168.3.144) at 14.05.2014_13-46-22-->
<macros>
  <macro name="engine_player_bal_mk4_macro" class="engine">
    <component ref="props_enginesystems_player_bal_mk1" />
    <properties>
      <identification name="{20108,301}" description="{20108,302}" />
      <acceleration forward="90" reverse="135" strafe="180" pitch="250" yaw="250" roll="180" />
      <angular />
      <speed forward="270" reverse="-90" strafe="135" pitch="85" yaw="85" roll="90" />
      <typeinfo mk="4" type="1" />
      <hull min="250" max="1000" hittable="0" />
      <efficiency>
        <threshold threshold="1" value="1" />
        <threshold threshold="0.5" value="0.9" />
        <threshold threshold="0.25" value="0.8" />
      </efficiency>
      <sounds>
        <ambient ref="eng_player_ambient" />
      </sounds>
    </properties>
    <connections>
      <connection ref="enginebooster">
        <macro ref="enginebooster_player_01_macro" connection="engine" />
      </connection>
    </connections>
  </macro>
</macros>
\assets\interiors\rooms\macros

Code: Select all

<?xml version="1.0" encoding="utf-8"?>
<!--Exported by: Owen (192.168.3.121) at 02.06.2014_14-56-30-->
<macros>
  <macro name="interiors_rooms_dockingbay_repairdock_macro" class="dockingbay">
    <component ref="interiors_rooms_dockingbay_repairdock" />
    <properties>
      <identification unique="0" />
      <dock detail="1" />
      <sounds>
        <ambient ref="amb_int_repairdock_01" />
      </sounds>
      <wall opaque="0" />
    </properties>
    <connections>
      <connection ref="ConnectionFor_interiors_rooms_ar_albionskunk">
        <macro>
          <component ref="interiors_rooms_ar_albionskunk" connection="space" />
        </macro>
      </connection>
      <connection ref="ConnectionFor_interiors_rooms_ar_baseplate_01">
        <macro>
          <component ref="interiors_rooms_ar_baseplate_01" connection="space" />
        </macro>
      </connection>
      <connection ref="ConnectionFor_interiors_rooms_ar_boxes">
        <macro>
          <component ref="interiors_rooms_ar_boxes" connection="space" />
        </macro>
      </connection>
      <connection ref="ConnectionFor_interiors_rooms_ar_boxes1">
        <macro>
          <component ref="interiors_rooms_ar_boxes" connection="space" />
        </macro>
      </connection>
      <connection ref="ConnectionFor_interiors_rooms_ar_boxes2">
        <macro>
          <component ref="interiors_rooms_ar_boxes" connection="space" />
        </macro>
      </connection>
      <connection ref="ConnectionFor_interiors_rooms_ar_boxes3">
        <macro>
          <component ref="interiors_rooms_ar_boxes" connection="space" />
        </macro>
      </connection>
      <connection ref="ConnectionFor_interiors_rooms_ar_boxes4">
        <macro>
          <component ref="interiors_rooms_ar_boxes" connection="space" />
        </macro>
      </connection>
      <connection ref="ConnectionFor_interiors_rooms_ar_boxes5">
        <macro>
          <component ref="interiors_rooms_ar_boxes" connection="space" />
        </macro>
      </connection>
      <connection ref="ConnectionFor_interiors_rooms_ar_boxes6">
        <macro>
          <component ref="interiors_rooms_ar_boxes" connection="space" />
        </macro>
      </connection>
      <connection ref="ConnectionFor_interiors_rooms_ar_boxes7">
        <macro>
          <component ref="interiors_rooms_ar_boxes" connection="space" />
        </macro>
      </connection>
      <connection ref="ConnectionFor_interiors_rooms_ar_boxes8">
        <macro>
          <component ref="interiors_rooms_ar_boxes" connection="space" />
        </macro>
      </connection>
      <connection ref="ConnectionFor_interiors_rooms_ar_boxes9">
        <macro>
          <component ref="interiors_rooms_ar_boxes" connection="space" />
        </macro>
      </connection>
      <connection ref="ConnectionFor_interiors_rooms_ar_container_xl">
        <macro>
          <component ref="interiors_rooms_ar_container_xl" connection="space" />
        </macro>
      </connection>
      <connection ref="ConnectionFor_interiors_rooms_ar_container_xl1">
        <macro>
          <component ref="interiors_rooms_ar_container_xl" connection="space" />
        </macro>
      </connection>
      <connection ref="ConnectionFor_interiors_rooms_ar_container_xl2">
        <macro>
          <component ref="interiors_rooms_ar_container_xl" connection="space" />
        </macro>
      </connection>
      <connection ref="ConnectionFor_interiors_rooms_ar_container_xl3">
        <macro>
          <component ref="interiors_rooms_ar_container_xl" connection="space" />
        </macro>
      </connection>
      <connection ref="ConnectionFor_interiors_rooms_ar_container_xl4">
        <macro>
          <component ref="interiors_rooms_ar_container_xl" connection="space" />
        </macro>
      </connection>
      <connection ref="ConnectionFor_interiors_rooms_ar_elephant">
        <macro>
          <component ref="interiors_rooms_ar_elephant" connection="space" />
        </macro>
      </connection>
      <connection ref="ConnectionFor_interiors_rooms_ar_elephant1">
        <macro>
          <component ref="interiors_rooms_ar_elephant" connection="space" />
        </macro>
      </connection>
      <connection ref="ConnectionFor_interiors_rooms_ar_light_gen">
        <macro>
          <component ref="interiors_rooms_ar_light_gen" connection="space" />
        </macro>
      </connection>
      <connection ref="ConnectionFor_interiors_rooms_ar_light_gen1">
        <macro>
          <component ref="interiors_rooms_ar_light_gen" connection="space" />
        </macro>
      </connection>
      <connection ref="ConnectionFor_interiors_rooms_ar_light_gen2">
        <macro>
          <component ref="interiors_rooms_ar_light_gen" connection="space" />
        </macro>
      </connection>
      <connection ref="ConnectionFor_interiors_rooms_ar_smallbox">
        <macro>
          <component ref="interiors_rooms_ar_smallbox" connection="space" />
        </macro>
      </connection>
      <connection ref="ConnectionFor_interiors_rooms_ar_smallbox1">
        <macro>
          <component ref="interiors_rooms_ar_smallbox" connection="space" />
        </macro>
      </connection>
      <connection ref="ConnectionFor_interiors_rooms_ar_smallbox2">
        <macro>
          <component ref="interiors_rooms_ar_smallbox" connection="space" />
        </macro>
      </connection>
      <connection ref="ConnectionFor_interiors_rooms_ar_smallbox3">
        <macro>
          <component ref="interiors_rooms_ar_smallbox" connection="space" />
        </macro>
      </connection>
      <connection ref="ConnectionFor_interiors_rooms_ar_smallbox4">
        <macro>
          <component ref="interiors_rooms_ar_smallbox" connection="space" />
        </macro>
      </connection>
      <connection ref="ConnectionFor_interiors_rooms_ar_smallbox5">
        <macro>
          <component ref="interiors_rooms_ar_smallbox" connection="space" />
        </macro>
      </connection>
      <connection ref="ConnectionFor_interiors_rooms_ar_smallbox6">
        <macro>
          <component ref="interiors_rooms_ar_smallbox" connection="space" />
        </macro>
      </connection>
      <connection ref="ConnectionFor_interiors_rooms_ar_smallbox7">
        <macro>
          <component ref="interiors_rooms_ar_smallbox" connection="space" />
        </macro>
      </connection>
      <connection ref="ConnectionFor_interiors_rooms_holodisplay">
        <macro>
          <component ref="interiors_rooms_holodisplay" connection="space" />
        </macro>
      </connection>
      <connection ref="ConnectionFor_interiors_rooms_swa_button_01">
        <macro>
          <component ref="interiors_rooms_swa_button_01" connection="space" />
        </macro>
      </connection>
      <connection ref="ConnectionFor_interiors_rooms_swa_skunk_exit">
        <macro>
          <component ref="interiors_rooms_swa_skunk_exit" connection="space" />
        </macro>
      </connection>
    </connections>
  </macro>
</macros>
Last edited by UniTrader on Mon, 19. Jan 15, 16:55, edited 2 times in total.
if not stated otherwise everything i post is licensed under WTFPL

Ich mache keine S&M-Auftragsarbeiten, aber wenn es fragen gibt wie man etwas umsetzen kann helfe ich gerne weiter ;)

I wont do Script&Mod Request work, but if there are questions how to do something i will GLaDly help ;)

UniTrader
Moderator (Script&Mod)
Moderator (Script&Mod)
Posts: 14571
Joined: Sun, 20. Nov 05, 22:45
x4

Post by UniTrader » Wed, 3. Sep 14, 17:58

***Reserve-Post für Kapitel Neue Dateien ins Spiel einbinden***
if not stated otherwise everything i post is licensed under WTFPL

Ich mache keine S&M-Auftragsarbeiten, aber wenn es fragen gibt wie man etwas umsetzen kann helfe ich gerne weiter ;)

I wont do Script&Mod Request work, but if there are questions how to do something i will GLaDly help ;)

UniTrader
Moderator (Script&Mod)
Moderator (Script&Mod)
Posts: 14571
Joined: Sun, 20. Nov 05, 22:45
x4

Post by UniTrader » Wed, 3. Sep 14, 17:59

***Reserve-Post für Kapitel Sprachdateien - sowohl Text als auch Gesprochenes***
if not stated otherwise everything i post is licensed under WTFPL

Ich mache keine S&M-Auftragsarbeiten, aber wenn es fragen gibt wie man etwas umsetzen kann helfe ich gerne weiter ;)

I wont do Script&Mod Request work, but if there are questions how to do something i will GLaDly help ;)

UniTrader
Moderator (Script&Mod)
Moderator (Script&Mod)
Posts: 14571
Joined: Sun, 20. Nov 05, 22:45
x4

Post by UniTrader » Wed, 3. Sep 14, 18:00

Teil 0815: Debuglog vom Spiel erzeugen lassen und auswerten
----------------------------------------------------------

Dieser Teil richtet sich nicht nur an Mod und Script-Ersteller sondern auch an die User, wenn es darum geht fehler zu berichten, die der Autor nicht nachvollziehen kann.

1. Debuglog Aktivieren
Zuerst einmal muss das Debuglog aktiviert werden. Rechtklickt dafür in Steam auf X Rebirth und wählt im aufklappenden Menü den untersten punkt Eigenschaften.
Im Aufklappenden Fenster wählt ihr dann [STARTOPTIONEN FESTLEGEN] und gebt im darauffolgenden Fenster
-logfile debuglog.txt
ein und bestätigt anschliessend mit [OK] und [SCHLIESSEN].

2. Logfile erstellen
Je nachdem um was für eine Art von fehler es sich handelt ist es sinnvoll das Spiel länger oder kürzer zu starten. Oftmals reicht es, das Spiel bis zum Hauptmenü starten zu lassen und es dann gleich wieder zu beenden um ein Aussagekräftiges Log zu erhalten, bei verzwickteren Fehlern dagegen sollte man das Spiel spielen bis der Fehler auftritt und es dann sofort beenden. Bedenkt auch, dass das Logfile nach jedem Spielstart neu erstellt wird und alte gelöscht werden.

3. Logfile finden
Das Logfile findet sich anschliessend in einem der nummerierten Unterordner in
%USERPROFILE%\Documents\Egosoft\X Rebirth
(den Pfad hier könnt ihr einfach oben in die Adresszeile rein kopieren ;)
jeder dieser nummerierten Unterordner steht für einen aneren Steam-Account der mit diesem Windows-Nutzeraccount verwendet wurde, normalerweise sollte hier nur einer enthalten sein.
Für User: Öffnet dann die darin enthaltene Datei debuglog.txt und, wenn sie kurz ist, kopiert den Inhalt in euren Post. Bei langen Logdateien empfhielt es sich diese bei einem Filehoster hochzuladen, um unnötige Scrollerei zu vermeiden, denn die Logfiles können je nach qualität der verwendeten Mods ziemlich lang werden.

4. Logfiles auswerten
Das meiste hier ist ziemlich eindeutig wenn man ein Englisch-Wörterbuch hat, ich werde hier eine Liste mit den ein wenig verwirrenden sachen anlegen:

Code: Select all

[=ERROR=] Cannot match path '/////////' in patch file '///////'. Skipping node.
Diese Fehlermeldung kann nicht nur bedeuten dass der Pfad gar nicht gefunden wurde sondern auch, dass es mehr als eine möglichkeit gibt wohin er verweisen könnte - sel-Pfade in xml-diff-Dateien müssen eindeutig sein.

Code: Select all

[=ERROR=] AI::AIDirector::LoadAIScript(): Ignoring root node 'diff' in XML file '/////////'. 
Dieser "Fehler" kann beruhigt ignoriert werden. X Rebirth versucht hier xml-Diff-Dateien für AI- oder MD-Scripte als AI/MD-Scripte selber zu interpretieren, was nicht klappen kann. ist nicht sch14ön aber harmlos ;)

Code: Select all

[=ERROR=] GetText(pageid=////////, textid=///////) TextID not found!
Hier klappt die Suche nach einem Text nicht. Am besten die bestehenden Sprachdateien/t-files nach der erwähnten pageid durchsuchen und prüfen ob a)die Sprachdatei auch für die Deutsche Version verfügbar ist (Suffix -L049 beim Dateinamen oder nur der Dateiname 0001.xml ohne Sprach-Suffix) und ob darin die angegebene t id vorhanden ist.

Weitere Details werden hinzugefügt, sobald ich darüber stolpere.
Last edited by UniTrader on Fri, 3. Apr 15, 02:08, edited 3 times in total.
if not stated otherwise everything i post is licensed under WTFPL

Ich mache keine S&M-Auftragsarbeiten, aber wenn es fragen gibt wie man etwas umsetzen kann helfe ich gerne weiter ;)

I wont do Script&Mod Request work, but if there are questions how to do something i will GLaDly help ;)

UniTrader
Moderator (Script&Mod)
Moderator (Script&Mod)
Posts: 14571
Joined: Sun, 20. Nov 05, 22:45
x4

Post by UniTrader » Wed, 3. Sep 14, 18:00

****Reserve-Post****
if not stated otherwise everything i post is licensed under WTFPL

Ich mache keine S&M-Auftragsarbeiten, aber wenn es fragen gibt wie man etwas umsetzen kann helfe ich gerne weiter ;)

I wont do Script&Mod Request work, but if there are questions how to do something i will GLaDly help ;)

UniTrader
Moderator (Script&Mod)
Moderator (Script&Mod)
Posts: 14571
Joined: Sun, 20. Nov 05, 22:45
x4

Post by UniTrader » Wed, 3. Sep 14, 18:04

***Reserve-Post***


Tuto ist für erste Anläufe in Sachen Rebirth-Modding jetzt geradeso ausreichend, ich hab hier aber irgendwie gerade ne künsterlische blockade, weil ich nicht weiss, wie ich weiter machen soll.. deswegen mache ich erstmal an einem anderen Projekt weiter ;) ich werde das ganze natürlich bald fortsetzen ;)
if not stated otherwise everything i post is licensed under WTFPL

Ich mache keine S&M-Auftragsarbeiten, aber wenn es fragen gibt wie man etwas umsetzen kann helfe ich gerne weiter ;)

I wont do Script&Mod Request work, but if there are questions how to do something i will GLaDly help ;)

Post Reply

Return to “X Rebirth - Scripts und Modding”