Script ausführen

Hier ist der ideale Ort um über Scripts und Mods für X³: Terran Conflict und X³: Albion Prelude zu diskutieren.

Moderators: Moderatoren für Deutsches X-Forum, Scripting / Modding Moderators

User avatar
Gamingwelle
Posts: 109
Joined: Tue, 14. Mar 17, 15:30
x3ap

Script ausführen

Post by Gamingwelle » Sat, 7. Oct 17, 12:06

Hallo, ich habe ein unfassbares 4-Zeilen-Script geschrieben *yay*.
Dieses Script hat 2 Argumente und 2 Komandos, um einer Station (Werft) einen nicht eingespeicherten Typen, wie z.B. einen Militärischer AP hinzu zufügen.
nun Möchte ich ein Weiteres Script schreiben, was
1) bei einen neuen Spiel automatisch ausgeführt wird (und für meinen aktuellen Savegame manuell ausgeführt werden kann)
und
2) Mein erstes Script "gw.AddObjToShipyard" mit den Atributen $station (var/Station) und $ware (var/Ship Type/Station Type) dann für bestimmte Werften / Stationen ausführt.
Daher:
Wie geht das mit dem Selbstausführen und mit dem Aufruf anderer Scripte?
Zum ersten hab ich leider nichts gefunden, was ich verstanden habe und zum zweiten gar nix =(.
Danke für jede Hilfe!

User avatar
Klaus11
Posts: 859
Joined: Mon, 13. Feb 12, 17:23
x3ap

Post by Klaus11 » Sat, 7. Oct 17, 12:54

Ein Script mit dem Namen „Setup.Scriptname“ wird automatisch gestartet, wenn das Spiel neu gestartet oder ein Spielstand geladen wird. Dabei sollte man darauf achten, dass ungewollte Doppelungen vermieden werden. Auf Argumente sollte verzichtet werden.
Schau mal in deinen Script Ordner. Dort findest Du sicher einige Beispiele.
[ external image ] Dif-tor heh smusma (Lebet lang und in Frieden – vulkanischer Gruß), Cockpitsammlung, Spieler HQ aktivieren, XENON-DAE

User avatar
Gamingwelle
Posts: 109
Joined: Tue, 14. Mar 17, 15:30
x3ap

Post by Gamingwelle » Sat, 7. Oct 17, 13:00

Ok, Danke.
Und wie kann ich ein Script durch ein Anderes ausführen?
Und wie vermeide ich ein mehrfaches Ausführen?
Ich bin mir nicht sicher aber die Stationen sollten sich nicht stapeln =), reicht ja, wenn es pro Werft einen Milit. AP gibt =D
Ich blicke da mit dem set global... und START [THIS] und so nicht durch...
Beispiel: Unser Lieblingscheatpaket.

User avatar
Klaus11
Posts: 859
Joined: Mon, 13. Feb 12, 17:23
x3ap

Post by Klaus11 » Sat, 7. Oct 17, 13:20

Schau in deinem Editor unter „General Commands / Script Calls“ nach.
Entweder entfernst du dein Script nach dem Spielstart einfach oder du nutzt eine globale Variable und fragst diese beim Scriptstart ab.
Hast Du schon mal hier nachgesehen?

"This" bezieht sich auf das ausgewählte Objekt.
[ external image ] Dif-tor heh smusma (Lebet lang und in Frieden – vulkanischer Gruß), Cockpitsammlung, Spieler HQ aktivieren, XENON-DAE

User avatar
Gamingwelle
Posts: 109
Joined: Tue, 14. Mar 17, 15:30
x3ap

Post by Gamingwelle » Sat, 7. Oct 17, 13:25

Danke, ich habe mich schon ein paar mal durch verschiedene Befehlsordner geblättert aber bei der Menge der Befehle merke ich mir eig. kaum welche.
Das mit dem THIS hab ich mir gedacht, ist in Programiersprachen ja auch so.
Und da (Link) hab ich noch nicht rein gesehen, ich habs aber auch nicht gefunden (hab nur mit Google gesucht).

User avatar
Khaakbuster
Posts: 393
Joined: Sun, 8. Jan 06, 18:43
x3tc

Post by Khaakbuster » Sat, 7. Oct 17, 13:28

Um ein Setup nicht mehrfach auszuführen, setzt man üblicherweise eine globale Variable.

Hier mal ein Beispiel eines meiner Setup Scripts:

Code: Select all

$name = 'kb.RefreshPoliceLicense'
$check = get global variable: name=$name

if $check == null

	set global variable: name=$name value=[TRUE]

@	START [THIS]-> call script 'plugin.kb.RefreshPoliceLicense' :

	[PLAYERSHIP]-> send incoming message: text='Refresh Police License installed' temporary=[FALSE]

end

return null
Im Beispiel heißt die globale Variable "kb.RefreshPoliceLicense" und wenn das Setup das erste Mal läuft, ist sie anfangs noch nicht definiert und der "get global variable" Befehl liefert "null" zurück. Deshalb ist die Bedingung für "check == null" erfüllt und die Befehle im if Block werden abgearbeitet. Als erstes wird die Variable da auf TRUE gesetzt, sodaß beim nächsten Spielstart "get global variable" eben nicht "null" sondern "TRUE" zurückliefert und die Befehle im if Block nicht nochmals abgearbeitet werden.

Der Befehl "START" startet ein Script, ohne auf einen Rückgabewert zu warten. In meinem Beispiel ist das notwendig, weil das Script "plugin.kb.RefreshPoliceLicense" in Dauerschleife läuft und daher nichts zurückgibt, wodurch das Setup sonst an der Stelle hängenbleiben würde.
Falls Argumente übergeben werden sollen, müssen diese nach dem Doppelpunkt angefügt werden.

"send incoming message" gibt dem Spieler einfach nur eine Rückmeldung, daß das Script erfolgreich installiert wurde.

User avatar
Gamingwelle
Posts: 109
Joined: Tue, 14. Mar 17, 15:30
x3ap

Post by Gamingwelle » Sat, 7. Oct 17, 13:41

Also ich lege eine Variable an, frage sie ab und weise ihr DANN einen Wert zu. Diese Variable wird mit dem Savegame gespeichert.
Wird ein Savegame geladen, wo es diese Variable schon gibt, stellt die Abfrage das fest und überspringt alles.
Danach rufe ich mein Script für die verschiedenen Werfen und Stationen auf
und beim nächsten mal (im gleichen Savegame) nicht mehr.
Ok, wenn das richtig ist, ist das nice.
Ich versuchs mal und melde mich dann später wieder, danke!

User avatar
Gamingwelle
Posts: 109
Joined: Tue, 14. Mar 17, 15:30
x3ap

Post by Gamingwelle » Sat, 7. Oct 17, 15:39

Nochmal Hilfe: das Spiel speichert mein Script nicht.
Ich habs überprüft, die Datei ist nicht da (addon/scripts).
Wenn ich den Spielstand speicher und neu lade, ist das Script nicht mehr da!
Was ist los?
Ich hab langsam keinen Bock mehr, hab das Ganze nun 4 mal getippt und der nimmt das einfach nicht!

User avatar
X2-Illuminatus
Moderator (Deutsch)
Moderator (Deutsch)
Posts: 24965
Joined: Sun, 2. Apr 06, 16:38
x4

Post by X2-Illuminatus » Sat, 7. Oct 17, 15:51

Wenn das Script nicht gespeichert wird, ist dies im Allgemeinen ein Zeichen dafür, dass du spezifische Objekte ausgewählt hast (z.B. ein bestimmtes Schiff oder eine bestimmte Station von der Karte). Das ist ein Sicherheitsmechanismus, der verhindern soll, das Scripte ausgeführt werden, deren Referenzobjekte nicht mehr vorhanden sind. Um dies zu umgehen, musst du entweder mit Konstanten (wie z.B. [PLAYERSHIP]) arbeiten oder das gewünschte Objekte suchen und im jeweiligen Spiel finden (siehe hierzu z.B. die unterschiedlichen "Find"-Befehle in den Universe and Sector Commands).
Nun verfügbar! X3: Farnham's Legacy - Ein neues Kapitel für einen alten Favoriten

Die komplette X-Roman-Reihe jetzt als Kindle E-Books! (Farnhams Legende, Nopileos, X3: Yoshiko, X3: Hüter der Tore, X3: Wächter der Erde)

Neuauflage der fünf X-Romane als Taschenbuch

The official X-novels Farnham's Legend, Nopileos, X3: Yoshiko as Kindle e-books!

User avatar
Gamingwelle
Posts: 109
Joined: Tue, 14. Mar 17, 15:30
x3ap

Post by Gamingwelle » Sat, 7. Oct 17, 16:01

kann ich bei find station in sector alles außer sektor und typ leer lassen (null) oder muss ich alles ausfüllen und wenn ja was kommt wo rein?

User avatar
Klaus11
Posts: 859
Joined: Mon, 13. Feb 12, 17:23
x3ap

Post by Klaus11 » Sat, 7. Oct 17, 16:23

Poste doch mal einen Beispiel Cod. Dann wird das Antworten einfacher.
[ external image ] Dif-tor heh smusma (Lebet lang und in Frieden – vulkanischer Gruß), Cockpitsammlung, Spieler HQ aktivieren, XENON-DAE

User avatar
Gamingwelle
Posts: 109
Joined: Tue, 14. Mar 17, 15:30
x3ap

Post by Gamingwelle » Sat, 7. Oct 17, 16:43

Code: Select all

  $station = find station: sector= Wolkenbasis SO  class or type= Argonen Argon Schiffswerft  race= Argonen  flags= <?>  refobj= <?>  maxdist= <?>  maxnum= <?>  refpos= <?>
  START [THIS] -> call script gw.AddObjToShipyard :  Station= $station  shipStation= Millitärischer Außenposten
Das ist die XL Werft, die ich gewählt habe (diese habe ich vorher mit dem Cheatpaket gespawnt, um sicher zu gehen).
Was muss ich noch bei den <?> eintragen, wo kann "null" rein und alles, damit ic jewals die XL werft bekomme (klar, dass ich Sektor und Werft ändern muss, falls ich bei anderen (Vöklern) bin)?
Ich möchte von den Völkern in ihren XL Werften die Militärischen APs, bei den Terranern bei Mond die ganzen orbitalen und USC Stationen und die jewaligen HQs verkaufen lassen.

User avatar
Klaus11
Posts: 859
Joined: Mon, 13. Feb 12, 17:23
x3ap

Post by Klaus11 » Sat, 7. Oct 17, 17:11

ArietisTV wrote:

Code: Select all

  $station = find station: sector= Wolkenbasis SO  class or type= Argonen Argon Schiffswerft  race= Argonen  flags= <?>  refobj= <?>  maxdist= <?>  maxnum= <?>  refpos= <?>
  START [THIS] -> call script gw.AddObjToShipyard :  Station= $station  shipStation= Millitärischer Außenposten
Das ist die XL Werft, die ich gewählt habe (diese habe ich vorher mit dem Cheatpaket gespawnt, um sicher zu gehen).
Was muss ich noch bei den <?> eintragen, wo kann "null" rein und alles, damit ic jewals die XL werft bekomme (klar, dass ich Sektor und Werft ändern muss, falls ich bei anderen (Vöklern) bin)?
Ich möchte von den Völkern in ihren XL Werften die Militärischen APs, bei den Terranern bei Mond die ganzen orbitalen und USC Stationen und die jewaligen HQs verkaufen lassen.
An Stelle der Fragezeichen kannst du "null" eintragen.
Einfacher wäre, du skriptest eine neue Werft mit den gewünschten Stationen und Schiffen.
Hier findest Du Beispiele.

Bei "refobj= <?>" muss noch das Objekt eingetragen werden.
Ich habe dir per PN ein Beispiel Script geschickt.
[ external image ] Dif-tor heh smusma (Lebet lang und in Frieden – vulkanischer Gruß), Cockpitsammlung, Spieler HQ aktivieren, XENON-DAE

User avatar
Gamingwelle
Posts: 109
Joined: Tue, 14. Mar 17, 15:30
x3ap

Post by Gamingwelle » Sat, 7. Oct 17, 17:26

Danke,
Würde sich sicher am Beryll HQ gut machen. Dann noch Xenonkram rein und läuft ;)
Macht es einen Unterschied, welcher Fraktion ich die Werft anhänge?
Oder ist die Kaufbarkeit an die Beliebtheit des Volkes gekoppelt, denen das Schiff gehört (nicht die Werft)?
Macht es einen Unterschied, von welchem Volk ich den Mili AP nehme? Preis ist gleich, keine Beliebtheitsanforderung und ich weiß, das die Terraniche (nicht genutzte) Variante ne Argon Handelsstation ist, daher meine ich nur von Argonen, Split und so?
Welche Rasse muss ich wählen, um immer Freund zu sein? Sind das die Rassen Freundlich, Neutral, Feindl. ect. (also hier Freunde)?
Last edited by Gamingwelle on Sat, 7. Oct 17, 17:33, edited 1 time in total.

User avatar
JSDD
Posts: 1378
Joined: Fri, 21. Mar 14, 20:51
x3tc

Post by JSDD » Sat, 7. Oct 17, 17:29

ArietisTV wrote:Macht es einen Unterschied, von welchem Volk ich den Mili AP nehme?
nein, sind alle gleich

ArietisTV wrote:Ich möchte von den Völkern in ihren XL Werften die Militärischen APs, bei den Terranern bei Mond die ganzen orbitalen und USC Stationen und die jeweiligen HQs verkaufen lassen.
am besten du machst es mit "arrays", d.h. "listen"

Code: Select all

Liste.Werften = get station array of race: Argon class/type: Schiffswerft
befehl ist zu finden in universe commands
der befehl erfasst ALLE werften von den argonen
wieviele gefunden wurden, fragst du dann ab mit

Code: Select all

Anzahl.Werften = size of array: Liste.Werften
befehl ist zu finden in array commands
eine bestimmte werft erfasst du mit:

Code: Select all

Werft = Anzahl.Werften[0]
wobei 0 ne zahl von 0 bis (Anzahl.Werften - 1) sein kann
befehl ist zu finden in array commands

--------------------------------------------------

z.B.

Code: Select all

Liste.Werften = get station array of race: Argon class/type: Schiffswerft
Anzahl.Werften = size of array: Liste.Werften

Index = 0

while Index < Anzahl.Werften ...
Werft = Liste.Werften[Index]

// tue irgendwas mit werft

inc= Index 
end
so behandelst du alle werften der argonen, z.B. sagst du:

Code: Select all

Typ = Militaerischer Aussenposten...
Werft -> add product to factory/dock: Typ
= Werft -> add 1 units of Typ
damit fügst du jeder argon werft das produkt (und gleichzeitig 1 einheit, damit man es kaufen kann) "Militaerischer Aussenposten" zu.

--------------------------------------------------

listen kannste auch selbst erstellen:

Code: Select all

Liste.Volk = array alloc: size = 0
erstellt ne leere liste, befehl ist zu finden in array commands

Code: Select all

append Argon to array Liste.Volk
append Boron to array Liste.Volk
append Split to array Liste.Volk
append Paranid to array Liste.Volk
append Teladi to array Liste.Volk
fügt 5 völker zur liste hinzu, befehl ist zu finden in array commands

wie gehabt: jedes einzelne listen-element (volk) erfasst du mit:

Code: Select all

Liste.Volk = array alloc: size = 0
append Argon to array Liste.Volk
append Boron to array Liste.Volk
append Split to array Liste.Volk
append Paranid to array Liste.Volk
append Teladi to array Liste.Volk
Anzahl.Volk = size of array: Liste.Volk 

Index.Volk = 0

while Index.Volk < Anzahl.Volk ...
Volk = Liste.Volk [Index.Volk]

// tue irgendwas mit volk
Liste.Werften = get station array of race: Volk class/type: Schiffswerft
Anzahl.Werften = size of array: Liste.Werften

Index = 0

while Index < Anzahl.Werften ...
Werft = Liste.Werften[Index]

// tue irgendwas mit werft
Typ = Militaerischer Aussenposten...
Werft -> add product to factory/dock: Typ
= Werft -> add 1 units of Typ

inc= Index 
end

inc= Index.Volk
end
somit fügst du allen teladi / split / argon / boron / paranid werften den militärischen außenposten zum verkauf zu
Last edited by JSDD on Sat, 7. Oct 17, 17:41, edited 3 times in total.
To err is human. To really foul things up you need a computer.
Irren ist menschlich. Aber wenn man richtig Fehler machen will, braucht man einen Computer.


Mission Director Beispiele

User avatar
Gamingwelle
Posts: 109
Joined: Tue, 14. Mar 17, 15:30
x3ap

Post by Gamingwelle » Sat, 7. Oct 17, 17:36

Ich glaube, ich gehe vollständig auf die eigene Werft.
Bleibt die Frage nach der Rasse aber danke für den Tipp.
Wenn wir hier ducht sind, kann dieser Thread in die Scriptingtipps Liste aufgenommen werden =)

User avatar
Klaus11
Posts: 859
Joined: Mon, 13. Feb 12, 17:23
x3ap

Post by Klaus11 » Sat, 7. Oct 17, 18:23

ArietisTV wrote:Bleibt die Frage nach der Rasse aber danke für den Tipp.
Die selben, die JSDD schon genannt hat.

Übrigens, ein tolles Beispiel von JSDD. :D
[ external image ] Dif-tor heh smusma (Lebet lang und in Frieden – vulkanischer Gruß), Cockpitsammlung, Spieler HQ aktivieren, XENON-DAE

User avatar
Gamingwelle
Posts: 109
Joined: Tue, 14. Mar 17, 15:30
x3ap

Post by Gamingwelle » Sat, 7. Oct 17, 18:38

Ich meine die Rasse meiner Schiffswerft.
Die soll keinem der nurmalen Völkern gehören, wo mn sich erst beliebt machen muss. Die Werft soll von einer Rasse sein, die von allen geliebt wird.
In der Liste der Rassen gibts ja neben Argonen und so auch Rasse 1, Rasse 2, Freund, Feind, Unbekannt...

User avatar
Gamingwelle
Posts: 109
Joined: Tue, 14. Mar 17, 15:30
x3ap

Post by Gamingwelle » Sat, 7. Oct 17, 19:55

So, das ganze funktioniert jetzt ABER ich kann Stationen kaufen und auch setzen jedoch friert das Spiel ein, wenn die Station ein Schiff verkauft.
Genauer:
Solange die Station nur Stationen verkauft, läuft alles suip.
Sobald die Station Schiffe verkauft, friert das Spiel beim Docken ein, über den Handelscomputer kann ich die Schiffe jedoch problemlos kaufen.

Code: Select all

setup.gw.extendShipyards

*src*

$test = 'gw.extededShipyards'
$check = get global variable: name=$test
if $check == null
  set global variable: name=$test value=[TRUE]
  START [THIS]->call script 'gw.addShipyard' :
end
return null

Code: Select all

gw.AddObjToShipyard

*attribute*

station (Var/Station) - Station
ware (Var/Ship Type/Station Type) - ShipStation

*src*

$station->add product to factory or dock: $ware
return null

Code: Select all

gw.addShipyard

*src*

* Alte Station entfernen
$old = find station: sector={SECTOR} class or type={Xenon Xenon Schiffswerft} race=null flags=null refobj=null maxdist=null maxnum=null refpos=null
if $old != null
  $old->destruct: show no explosion=1
end
* *Neue Station erzeugen
$station = create station: type={Xenon Xenon Schiffswerft} owner={Freunde} addto={SECTOR} x=-50000 y=0 z=12500
= $station->install 200 units of {200 MJ  Schild}
$station->set current shield strength to 40000000
$station->set name to 'Beryll Werft'
set global variable: name='gw.shipyard' value=$station
* "Waren" hinzu fügen
START [THIS]->call script 'gw.AddObjToShipyard' : station=$station  ware={Paraniden Militärischer Außenposten}
START [THIS]->call script 'gw.AddObjToShipyard' : station=$station  ware={Yaki Hauptquartier 5_61}
START [THIS]->call script 'gw.AddObjToShipyard' : station=$station  ware={Terraner Orbitale Patrouillenbasis}
START [THIS]->call script 'gw.AddObjToShipyard' : station=$station  ware={Terraner Orbitale Verteidigungsstation}
START [THIS]->call script 'gw.AddObjToShipyard' : station=$station  ware={Terraner USC Orbitale Versorgungsstation}
START [THIS]->call script 'gw.AddObjToShipyard' : station=$station  ware={Terraner USC Orbitale Verteilerbasis}
START [THIS]->call script 'gw.AddObjToShipyard' : station=$station  ware={Terraner USC Orbitales Logistikzentrum}
START [THIS]->call script 'gw.AddObjToShipyard' : station=$station  ware={Xenon Xenon Station 5_5}
START [THIS]->call script 'gw.AddObjToShipyard' : station=$station  ware={Terraner Baldric}
$station->station trade and production tasks: on=[TRUE]
return null
Was ist da noch falsch gelaufen?
Danke für jede Hilfe!

User avatar
Klaus11
Posts: 859
Joined: Mon, 13. Feb 12, 17:23
x3ap

Post by Klaus11 » Sat, 7. Oct 17, 20:16

Könnte der Fehler die von dir ausgesuchte Rasse (Freund) sein? Wir haben dir nicht ausversehen die anderen Völker empfohlen.

Ich würde die Bestückung der Werft in einem Script unterbringen und die häufigen Aufrufe vermeiden. :roll:
Schau mal weiter unten bei „Die Marodeur Schiffswerft von Teladidrone“ rein. Dort ist auch ein schönes Beispiel.
[ external image ] Dif-tor heh smusma (Lebet lang und in Frieden – vulkanischer Gruß), Cockpitsammlung, Spieler HQ aktivieren, XENON-DAE

Post Reply

Return to “X³: Terran Conflict / Albion Prelude - Scripts und Modding”