Wie scripte ich ein Schiff ?

Hier können Diskussionen rund ums scripten und modden zu X3 geführt werden.

Moderator: Moderatoren

shinaro
Veteran Klasse 2
Beiträge: 1730
Registriert: Di 06 Jan, 2009 9:24 pm
Lieblings X-Titel:

Beitrag von shinaro »

Naja viel kann ich nicht dazu schreiben, aber wie man Schiffe scriptet, sind bereits vorhanden ohne neue selber zu erstellen und auch ohne cycrows Cheatpaket.

Desweiteren hab ich mal ein Beitrag wie man schiff und Ware erscriptet, aber die ist leider in vergessenheit geraten und bzw. wahrscheinlich kein Interesse oder kompliziert.

Hier wäre mein Beitrag:

http://seizewell.de/viewtopic.php?t=561 ... erscripten

mfg versando
Toby
Rekrut
Beiträge: 64
Registriert: Mo 10 Aug, 2009 1:38 pm
Lieblings X-Titel: X3: Terran Conflict

Beitrag von Toby »

Ja, Waren hinzufügen kann man auch so, wie es Taktkonform erklärt hat:
Taktkonform hat geschrieben:Ich greife hier lieber auf den Befehl

<RetVar/IF><RefObj>install<Var/Number>of<Var/Ware>

zurück.
lg
Benutzeravatar
jakob.fugger
Scharfschützen-Anwärter
Beiträge: 274
Registriert: So 11 Nov, 2007 6:26 am
Lieblings X-Titel: X3 TC

Beitrag von jakob.fugger »

Die Anleitung war in Ordnung. Sogar ich habe ein Schiff gezaubert (in Blau). Er fliegt leider schneller als mein Raumanzug, somit kann ich es noch nicht entern.
Benutzeravatar
Taktkonform
Feldwebel
Beiträge: 3119
Registriert: Di 24 Jun, 2008 4:28 pm
Lieblings X-Titel:
Wohnort: Saxonia

Beitrag von Taktkonform »

jakob.fugger hat geschrieben:Die Anleitung war in Ordnung. Sogar ich habe ein Schiff gezaubert (in Blau). Er fliegt leider schneller als mein Raumanzug, somit kann ich es noch nicht entern.
Du hättest einfach bei Rasse Deinen Spielernamen auswählen müssen, dann wäre das Schiff sofort Dein gewesen. Sofern Du das überhaupt vor gehabt hast.

Demnächst gibt es dann die Anleitung zum automatischen Ausrüsten mit Waffen und Raketen.

noch nen netten Tag
Taktkonform
Komm wir essen Oma - Satzzeichen können Leben retten!
Benutzeravatar
jakob.fugger
Scharfschützen-Anwärter
Beiträge: 274
Registriert: So 11 Nov, 2007 6:26 am
Lieblings X-Titel: X3 TC

Beitrag von jakob.fugger »

Äh, ja. Ich sag es ja. Null Ahnung vom scripten. Habe bisher alles sauer verdienen müssen. Wobei ich mit entern auf Kriegsfuss stehe, schon da ich dummerweise meine Ausprägung als Händler favorisiere.
Aber: es grünt jetzt so schön. Vielen Dank für den Tipp.
Benutzeravatar
Taktkonform
Feldwebel
Beiträge: 3119
Registriert: Di 24 Jun, 2008 4:28 pm
Lieblings X-Titel:
Wohnort: Saxonia

Beitrag von Taktkonform »

Taktkonform hat geschrieben: Demnächst gibt es dann die Anleitung zum automatischen Ausrüsten mit Waffen und Raketen.
Demnächst war vielleicht ein wenig "untertrieben", aber da ich derzeit ein paar Tage Urlaub habe und die Welt draußen im Schnee versinkt, dachte ich mir, ich setze das hier mal fort.

Vorbemerkung zu TC
Scripte aus Reunion übernehmen
Seit einigen Tagen besitze ich ja nun endlich auch Terran Conflict und mein erster Weg war es den SE zu erkunden, was sich da so getan hat, und was nicht.
Erstaunlich wenig...
...sieht man mal von einer Menge neuer Befehle ab, die die Bedienbarkeit doch um einiges steigern.^^
Aber die Hauptsache...
...fast alle Scripte aus Reunion funktionieren auch in Terran Conflict.
So funktionieren die hier beschriebenen Methoden auch in TC.

Dazu muß man nur die Engine-Version (engine version - Eintrag im Script) auf 40 bzw 44 (Version 2.5 mit dem Befehlsupgrade) ändern.

Wie mache ich das?
Öffnet das betreffende Script im Windows-Editor und sucht nach folgendem Eintrag:

Code: Alles auswählen

<engineversion>33</engineversion>
Ändert nun die Zahl 33 in 40 oder 44, je nachdem welche Version ihr benutzt, um.

Desweiteren gibt es einen zweiten Eintrag, der geändert werden muß:

Code: Alles auswählen

<sval type="int" val="33"/>
Zu finden ist dieser im Codearray.

Einschränkungen
Scripte, die mit Waren, Warenklassen und Zurordnungen zu Warenklassen jonglieren, sollten nicht 1 zu 1 mit der oben beschriebenen Methode umgesetzt werden.
Der Grund ist simpel...
...es hat sich einiges getan bei den Waren und Produkten, so daß es vorkommen kann, das es die Waren aus Reunion gar nicht mehr gibt, bzw. sich ihre Zuordnung geändert hat.
Bevor man solche Scripte portiert, sollte man sich die Zuordnungen anschauen.

So, genug des Vorgeplänkels. Kommen wir zum Eingemachten.

Schiff mit maximaler Schildanzahl und maximaler Schildstärke ausrüsten

Nachdem ich weiter oben beschrieben habe, wie man ein Schiff überhaupt ins Spiel bekommt, soll nun hier erklärt werden, wie das Schiff auch gleich mit den maximal möglichen Schilden und Schildstärken ausgerüstet wird.

Herausfinden, welchen Schildtyp das Schiff maximal tragen kann

Wie der Titel schon sagt, müssen wir erst einmal herausbekommen, welchen maximalen Schildtyp das zu erstellende Schiff überhaupt benutzen kann.
Das erledigt die folgende Zeile:

Code: Alles auswählen

<RetVar/IF> = <RefObj> -> get max. shield type that can be installed
Diesen Befehl findet man unter General Objects Commands

Wiederum beginnt die Zeile mit einer Variablen <RetVar/IF>, die zuerst definiert werden muß.
Der SE (Script Editor) wird also, nach Auswahl dieser Zeile, zur Eingabe, bzw. Auswahl, einer Variablen oder einer Bedingung (IF) auffordern.

Ich für meinen Teil wähle immer Namen, die irgendwas mit dem Sinn und Zweck der Variablen zu tun haben, das macht es mir leichter, die Variablen später zuzuorden.

Als Nächstes fordert die Zeile ein referenziertes Objekt <RefObj> an.
Dieses Objekt ist das zu erstellende Schiff, bzw. die Variable die dafür erstellt wurde.

Die fertige Zeile, mit den eingetragenen Variablen, sieht dann so aus:

Code: Alles auswählen

$ShieldType = $cship -> get max. shield type that can be installed
Herausfinden, wieviele Schilde das Schiff überhaupt installieren kann

Nachdem wir nun wissen, welchen maximalen Schildtyp das Schiff tragen kann, müssen wir noch herauslesen, wieviele Schilde es überhaupt installieren kann.

Diese Aufgabe erledigt die folgende Zeile:

Code: Alles auswählen

<RetVar/IF> <RefObj> get number of shield bays
Zu finden ist dieser Befehl unter General Objects Commands

<RetVar/IF> ist wieder eine Variable die es zu erstellen gilt.
<RefObj> ist wieder das Objekt, auf das sich diese Angabe/Abfrage bezieht.

Fertig sieht die Zeile dann so aus:

Code: Alles auswählen

$ShieldMax = $cship -> get number of shield bays
Installieren der Schilde auf dem Schiff

Nun haben wir alle Informationen, um die Schilde auf dem Schiff zu installieren.
Diese Aufgabe erledigt die folgende Zeile:

Code: Alles auswählen

<RetVar/IF> <RefObj> install <Var/Number> units of <Var/Ware>
Zu finden ist diese Zeile unter Trade Commands

Besonderheit an dieser Zeile ist, das die Eingangsvariable <RetVar/IF> weggelassen wird, also anstatt der Variablen oder Bedingung der Eintrag no returnvalue aus der Liste gewählt wird.

<Var/Number> wird mit der Varibalen $ShieldMax befüllt und
[/color=yellow]<Var/Ware>[/color] mit der Variablen $ShieldType.

Die fertige Zeile sieht dann so aus:

Code: Alles auswählen

= $cship -> install $ShieldMax units of $ShieldType
Das ganze Scriptsegment sieht dann so aus:

Code: Alles auswählen

$ShieldType = $cship -> get max. shield type that can be installed
$ShieldMax = $cship -> get number of shield bays
= $cship -> install $ShieldMax units of $ShieldType
Damit würde das zu erstellende Schiff mit der maximal möglichen Anzahl und Stärke an Schilden bestückt.

Anmerkungen
Dieser Post bezieht sich direkt, was Variablennamen und referenzierte Objekte betrifft, auf den Post, in dem das Erstellen der Schiffe erklärt wird.

Waffen auswählen und installieren
Vorbemerkungen
Nun wird es Ernst. Das Schiff soll Waffen bekommen. Hier tauchen, innerhalb dieses Scripts, zum ersten Mal Schleifen auf, da es ja auch Schiffe gibt, die mehr als ein Turret (Geschützkanzel) haben. Um diese zu bestücken muß dieser Scriptteil mehrfach ausgeführt werden, bis eben alle Turrets mit Waffen versorgt sind.

Was ist eine Schleife?

Eine Programmierschleife ist ein Code, der solange ausgeführt werden soll, bis eine zuvor festgelegte Bedingung erfüllt oder eben nicht erfüllt ist.

Wie mach ich das im SE, bzw. was brauche ich dafür?

Nun, zuerst einmal müssen eine, bzw. mehrere Bedingungen geschaffen werden, damit die Schleife überhaupt weiß, von was sie ausgehen kann und wann sie enden soll.

In meinem Beispiel will ich ja nun das Schiff mit Waffen versorgen. Dazu brauche ich erst einmal eine Grundbedingung, die sagt wo die Schleife ansetzen soll.

Code: Alles auswählen

$Turret = 0
Diese Zeile ist mit dem Befehl <RetVar/IF><Expression>, den der SE unter General Commands führt, erstellt.

Ich habe mir also eine Variable mit dem Namen $Turret erstellt und diese auf den Wert 0 gesetzt.

Als Nächstes muß ich wissen, wann die Schleife beendet werden soll.
Hier also, wenn alle Turrets mit Waffen versorgt sind.
Dazu muß ich erst einmal herausbekommen, wieviele Turrets es denn überhaupt am zu erstellenden Schiff gibt.

Folgende Zeile übernimmt diese Aufgabe:

Code: Alles auswählen

<RetVar/IF> <RefObj> get number of turrets
<RetVar/IF> ist wieder eine Variable, die erstellt werden muß. Ich habe mich hier für den Variablennamen $TurretMax entschieden, weil er mir deutlich sagt, das es sich dabei um die maximale Anzahl der Kanzeln am betreffenden Schiff handelt.
<RefObj> ist wieder das referenzierte Objekt, also unser zu erstellenden Schiff, das ja bekanntermaßen den Variablennamen $cship trägt.

Die fertige Zeile sieht dann so aus:

Code: Alles auswählen

$TurretMax = $cship -> get number of turrets
Nun wissen wir, wann die Schleife beginnen soll, und wo sie endet.
Zeit die Schleife zu setzen.

Code: Alles auswählen

while $Turret < $TurretMax
Mit dieser Zeile wird der SE aufgefordert, solange den nachfolgenden Code auszuführen, bis die in dieser Zeile definierte Bedingung, also der Wert aus $Turret kleiner ist als die Gesamtanzahl der Turrets des Schiffs, erfüllt ist.
Erstellt wurde diese Zeile mit dem Befehl <RetVar/IF><Expression>, der unter General Commands zu finden ist.

Soviel erstmal zur Schleife...
...da kommt später noch mehr, denn irgendwie müssen wir dem SE ja auch sagen, wann Schluß ist. ;)

Waffentypen auswählen und gruppieren
Leider gibt es weder in Reunion, noch in TC (zumindest habe ich bisher keinen solchen in TC gefunden), einen so komfortablen Befehl, wie etwa die Auswahl der Schildtypen, für die Waffen. Wir müssen also einen kleinen Umweg gehen und eine Vorauswahl treffen.

Anmerkung
Natürlich kann man auch hier wieder mit Argumenten arbeiten, also dem Spieler die Auswahl des Waffentyps überlassen, aber ich werde hier, aus Gründen der Darstellbarkeit, erst einmal mit festen Waffentypen hantieren.

Um die Laser später auswählen zu können, müssen wir erst einmal eine Variable haben, die je eine Waffe darstellt.

Code: Alles auswählen

$LaserType1 = null
$LaserType1 ist wieder eine Variable, die hier "leer" erstellt wird.
Das erledigt wieder das Kommando <RetVar/IF><Expression>.

Nun da wir die Variable haben, müssen wir ihr auch einen Inhalt zuweisen.
Dazu sollten wir allerdings erst einmal nachschauen, ob denn der gewünschte Inhalt auch in den Turm des gewünschten Schiffes paßt.

Folgende Zeile erledigt diese Arbeit für uns:

Code: Alles auswählen

<RetVar/IF> <RefObj> fits laser <Var/Ware> into turret <Var/Number>
Warum sich nun dieser Befehl im SE unter Fly Commands versteckt, das weiß wahrscheinlich nur der Programmierer der Script Engine.^^

<RetVar/IF> ist diesmal keine Variable, sondern eine Bedingung nähmlich skip if not.
Ausgewählt werden kann diese aber auch über das PopUp-Fenster, das sich nachdem dem Aufruf der Befehlszeile öffnet.
<RefObj> müßte euch nun langsam zum Hals raushängen und klar sein, das damit nur das zu erstellende Schiff, bzw. dessen Variablennamen gemeint sein kann. ;)
<Var/Ware> ist der Waffentyp der gewünscht ist, den man bei Anwahl dieser Option aus der Liste der Waren auswählen kann.
<Var/Number> ist der Variablenname des Turrets.

Die fertige Zeile sieht dann folgendermaßen aus:

Code: Alles auswählen

skip if not $cship -> fits laser Alpha Partikelbeschleuniger into turret $Turret
So, nun haben wir also eine Zeile, die erstmal prüft, ob denn unsere Wunschwaffe überhaupt in den vorgesehen Turm paßt. Paßt sie nicht, dann überspringt der SE die Anweisung (skip if not).

Nun müssen wir noch sagen, das $LaserType1 eben der Alpha Partikelbeschleuniger ist.
Dazu dient die folgende Zeile:

Code: Alles auswählen

§Lasertype1 = Alpha Partikelbeschleuniger
Erstellt wurde diese Zeile wieder mit dem Kommando <RetVar/IF><Expression>.

Soweit so gut...
...wir haben also einen Waffentyp definert, geprüft ob der paßt, und wenn nicht, dann eben den Waffentyp ausgeschlossen.

Nun müssen wir noch herausfinden, wieviele Waffenslots der Turm denn eigentlich hat.
Dazu kommt die nächste Zeile ins Spiel:

Code: Alles auswählen

<RetVar/IF> <RefObj> get max. number of lasers in turret <Var/Number>
<RetVar/IF> ist hier wieder eine Variable, die erstellt werden muß.
<RefObj> jaja, das zu erstellende Schiff, bzw. sein Variablenname.
<Var/Number> ist der aktuelle Turret, hier mit seinem Variablenname, also $Turret.

Zu finden ist dieser Befehl ebenfalls unter Fly Commands im SE.

Nun wissen wir also, wieviel Laser der Turm hat, und können uns daran machen, den ausgwählten Waffentyp zu installieren.

Dazu benötigen wir die folgende Zeile, die sich übrigens nicht unter Fly Commands verbirgt, sondern unter Trade Commands:

Code: Alles auswählen

<RetVar/IF> <RefObj> install <Var/Number> units of <Var/Ware>
Da diese Zeile hier schon mehrfach aufgetaucht ist, werde ich sie nicht schon wieder kommentieren, bis auf die Angabe, das hier wieder no returnvalue zum Einsatz kommt, um <RetVar/IF> zu ersetzen.

Nur noch die fertige Version der Zeile:

Code: Alles auswählen

= $cship -> install $lasermax units of $Lasertype1
Nun haben wir also einen Turm ausgewählt, den Waffentyp bestimmt, die Anzahl der Buchten des Turms herausbekommen und den gewählten Waffentyp installiert. Und was ist mit den anderen Türmen des Schiffes?
Richtig, es soll ja Schiffe geben, die mehr als ein Turret haben, wobei die Frontbatterie hier ebenfalls als Turret zählt.

Also kommt unsere Schleife wieder ins Spiel...
...wir haben da bestimmt, das $Turret = 0 ist.
Nun drehen wir einfach am Rad und erhöhen den Wert $Turret um 1.
Das macht die folgende Zeile:

Code: Alles auswählen

inc $Turret=
Nach dem jedem Durchlauf der Schleife wird der Wert der Variablen $Turret um 1 erhöht, solange bis die Bedingung, die wir oben definiert haben (Zur Erinnerung:$Turret < $TurretMax war die Bedingung), erfüllt ist.
Danach sollten wir die Schleife beenden, damit sie nicht endlos weiterdreht.

Ein einfaches schließt diesen Codeteil gegenüber dem restlichen Code im Script ab und beendet die Schleife.

Dieses end versteckt sich im SE unter General Commands-->Flow Control. Genau heißt sie dort end (conditional).

Das gesamte Scriptstück sieht dann so aus:

Code: Alles auswählen

$Turret = 0
 $TurretMax = $cship -> get number of turrets
 while $Turret < $TurretMax
 $Lasertype1 = null
 skip if not $cship -> fits laser Phasenrepetiergeschütz into turret $Turret
  $Lasertype1 = Phasenrepetiergeschütz
 $lasermax = $cship -> get max. number of lasers in turret $Turret
  = $cship -> install $lasermax units of $Lasertype1
 inc $Turret = 
end
Anmerkung
Natürlich kann man auch gleich mehrere Waffentypen erstellen und nacheinander durchprobieren, ob sie in den Turm passen. Ich bin derzeit bei neun verschiedenen $Lasertype angekommen, die nacheinander, mit verschiedenen Bedingungen geprüft und installiert, bzw. eben nicht installiert werden, angekommen.

Das Ganze würde in etwa so aussehen:

Code: Alles auswählen

$Turret = 0
022   $TurretMax = $cship -> get number of turrets
023   while $Turret < $TurretMax
024   |$Lasertype1 = null
025   |$Lasertype2 = null
026   |$Lasertype3 = null
027   |$Lasertype4 = null
028   |$Lasertype5 = null
029   |skip if not $cship -> fits laser Flakartillerie into turret $Turret
030   ||$Lasertype1 = Flakartillerie
031   |skip if not $cship -> fits laser Energieplasmawerfer into turret $Turret
032   ||$Lasertype2 = Energieplasmawerfer
033   |skip if not $cship -> fits laser Phasenrepetiergeschütz into turret $Turret
034   ||$Lasertype3 = Phasenrepetiergeschütz
035   |skip if not $cship -> fits laser Energiepulskanone into turret $Turret
036   ||$Lasertype4 = Energiepulskanone
037   |skip if not $cship -> fits laser Photonenimpulskanone into turret $Turret
038   ||$Lasertype4 = Photonenimpulskanone
039   |$lasermax = $cship -> get max. number of lasers in turret $Turret
040   |skip if not $Lasertype1
041   ||= $cship -> install $lasermax units of $Lasertype1
042   |skip if not $Lasertype1 AND ! $Lasertype2
043   ||= $cship -> install $lasermax units of $Lasertype2
044   |skip if not $Lasertype1 AND $Lasertype2
045   ||= $cship -> install $lasermax units of $Lasertype2
046   |skip if not $Lasertype3
047   ||= $cship -> install $lasermax units of $Lasertype3
048   |skip if not $Lasertype4
049   ||= $cship -> install $lasermax units of $Lasertype4
050   |skip if not $Lasertype5
051   ||= $cship -> install $lasermax units of $Lasertype5
052   |inc $Turret = 
053   end
Die Bedingungsprüfung ist dabei ganz und gar Eurer Phantasie überlassen.
Ohne Bedingung wird nur überprüft, ob die Waffe in den Turm passt und dann installiert. Ist der Turm beim nächsten Durchlauf der Schleife schon mit Waffen belegt, und die nächste Waffengruppe ließe sich auch installieren, wird das Script die benötigte Anzahl von Waffen der neuen Waffengruppe(n) in den Lagerraum des Schiffes stellen.
Ist dieser voll, wird jede weitere Anweisung ignoriert.

Ähm, der letzte Auszug stammt bereits aus Terran Conflict, also nicht wegen der Waffentypen wundern. ;)

Ich hoffe, ich konnte mich einigermaßen verständlich machen und wünsche Euch

noch nen netten Tag
Taktkonform
Komm wir essen Oma - Satzzeichen können Leben retten!
Benutzeravatar
Taktkonform
Feldwebel
Beiträge: 3119
Registriert: Di 24 Jun, 2008 4:28 pm
Lieblings X-Titel:
Wohnort: Saxonia

Beitrag von Taktkonform »

Fang ich mal mit einer Frage an...
...kann ich eigentlich einen Post zwei Attachments verpassen? Und wenn ja, wie?

Nun zum eigentlichen Thema:

Mein Postfach lief in letzter Zeit über mit der Bitte, das Schiff-erstellen-Script doch bitte mit einem Kommandoslot zu verbinden, um es "benuterfreundlicher" zu machen.

Ich habe mich zwar lange geweigert das zu tun, einfach weil ich einen Cheat nicht ganz sooo einfach ins Spiel einbringen wollte, aber nun ist der Punkt erreicht, wo ich mich nicht mehr wehren kann. ;)

Im Anhang ist jetzt das Script mit einem Kommandoslot versehen. Installation und Bedienung stehen in der beigefügten Readme.

Technisches:

Scriptdateien
aa.create.player.ship.xml
setup.ship.create.cheat.xml

T-File
497376.xml

Sonstiges
readme.txt

Kommandoslot
COMMAND_PIRACY_34

Page-ID
7376

noch nen netten Tag
Taktkonform

Hier ist der Downloadlink.
Komm wir essen Oma - Satzzeichen können Leben retten!
Antworten