Frage(n) zum Scripteditor (aktuell: Searchflags und "find flying ware")

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

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

User avatar
SymTec ltd.
Posts: 5285
Joined: Mon, 11. Apr 05, 21:11
x3tc

Post by SymTec ltd. »

Es gibt außer der "incoming question" und z.B. der Installation bestimmter Erweiterungen und weiterer Kommandoslots keinen Weg, innerhal eines Scripts weitere Daten einzubringen. :)
User avatar
Ogerboss
Posts: 1465
Joined: Sat, 5. Aug 06, 22:05
x3tc

Post by Ogerboss »

Also eure vielen hilfreichen Antworten haben ja schon zu halbwegs brauchbaren Ergebnissen geführt, denn es stehen bereits ein Setupscript, ein -file und 4 weitere Scripts bereit, die bis auf ein kleines Problem (warum sonst würde ich hier posten :roll: ) auch erstmal wunderbar funktionieren. Folgendes Script speichert beim ersten Aufruf die Argumente nach den Prüfungen doppelt in den Arrays ab, wenn ich es aber aufrufe, nachdem bereits mindestens 1 (oder leider 2 :( ) Elemente in den Arrays sind, funktioniert es wie geplant und alle Argumente werden nur einmal in den Arrays abgespeichert.

Code: Select all

Arguments
1: ware , Var/Ware , 'Ware angeben' 
2: menge , Var/Number , 'Menge angeben' 
3: prozent , Var/Number , 'Mindestlagerbestand in % angeben' 
Source Text

001   * Überprüfung, ob die drei Arrays für dieses Schiff bereits als lokale Variablen
002   * vorhanden sind, gegebenenfalls deren Definierung, Aufruf der globalen Warenliste
003   $string.array1 = 'array.warenliste'
004   $string.array2 = 'array.mengenliste'
005   $string.array3 = 'array.prozentliste'
006   $string.array4 = 'array.globalewarenliste'
007   $array.warenliste = [THIS] -> get local variable: name=$string.array1
008   $array.mengenliste = [THIS] -> get local variable: name=$string.array2
009   $array.prozentliste = [THIS] -> get local variable: name=$string.array3
010   $array.globalewarenliste = get global variable: name=$string.array4
011   if $array.warenliste == null AND $array.mengenliste == null AND $array.prozentliste == null
012    $array.warenliste =  array alloc: size=0
013    $array.mengenliste =  array alloc: size=0
014    $array.prozentliste =  array alloc: size=0
015   end
016   * Prüfung, ob das Schiff die Ware transportieren kann und auf deren Gültigkeit
017   if [THIS] -> can transport ware $ware
018    $Y =  size of array $array.warenliste
019   * Abbruch, falls die Ware bereits im  Array ist
020    while $Y > 0
021     dec $Y = 
022     $arrayelement.warenliste = $array.warenliste[$Y]
023     if $ware == $arrayelement.warenliste
024      return null
025     end
026    end
027    $X =  size of array $array.globalewarenliste
028    while $X > 0
029     dec $X = 
030     $arrayelement.globalewarenliste = $array.globalewarenliste[$X]
031     if $arrayelement.globalewarenliste == $ware
032   * Prüfung, ob der freie Frachtraum ausreicht um alle bereits angegebenen Waren in
033   * der gewünschten Menge zu laden
034      $Y =  size of array $array.warenliste
035      $frachtraum.frei = [THIS] -> get free volume of cargo bay
036      $frachtraum.zubelegen = 0
037      $frachtraum.belegt = 0
038      while $Y > 0
039       dec $Y = 
040       $arrayelement.warenliste = $array.warenliste[$Y]
041       $arrayelement.mengenliste = $array.mengenliste[$Y]
042       $warenvolumen.array = get volume of ware $arrayelement.warenliste
043       $frachtraum.zubelegen = $frachtraum.zubelegen + ( $warenvolumen.array * $arrayelement.mengenliste )
044       $frachtraum.bereitsbelegt = [THIS] -> get volume of ware $arrayelement.warenliste in cargo bay
045       $frachtraum.belegt = $frachtraum.belegt + $frachtraum.bereitsbelegt
046      end
047      $warenvolumen = get volume of ware $ware
048      $frachtraum.warebelegt = [THIS] -> get volume of ware $ware in cargo bay
049      $frachtraum.zubelegen = $frachtraum.zubelegen + ( $warenvolumen * $menge ) - $frachtraum.warebelegt
050      if $frachtraum.frei >= $frachtraum.zubelegen - $frachtraum.belegt
051   * nach positiven Prüfungen Abspeichern der Werte in den drei Arrays und deren
052   * als lokale Variablen; Anpassung des Prozentsatz auf den Bereich von 0 bis 100
053       skip if $prozent >= 0
054        $prozent = 0
055       skip if $prozent <= 100
056        $prozent = 100
057       append $ware to array $array.warenliste
058       append $menge to array $array.mengenliste
059       append $prozent to array $array.prozentliste
060      end
061     end
062    end
063   end
064   [THIS] -> set local variable: name=$string.array1 value=$array.warenliste
065   [THIS] -> set local variable: name=$string.array2 value=$array.mengenliste
066   [THIS] -> set local variable: name=$string.array3 value=$array.prozentliste
067   return null
Hat irgendjemand eine Idee, wieso das passiert?
Wie versprochen diesmal mit Kommentaren, damit man den Überblick behält :) .

p.s. Gibt's ne Möglichkeit im Scriptcode (Egoforum) noch mit Farben oder sozu arbeiten?
[ external image ]
***modified*** und stolz drauf
User avatar
Ogerboss
Posts: 1465
Joined: Sat, 5. Aug 06, 22:05
x3tc

Post by Ogerboss »

Das Problem mit der doppelten Abspeicherung hat sich inzwischen erledigt. Danke an UniTrader {KGB} für's Debugging-Tutorial :mrgreen: .
[ external image ]
***modified*** und stolz drauf
User avatar
Ogerboss
Posts: 1465
Joined: Sat, 5. Aug 06, 22:05
x3tc

Post by Ogerboss »

Hab ein neues Problem: Wie sage ich, dass ein Script, dass über die Extrabefehlslots der Schiffskommandokonsole aufgerufen wird, alle X Sekunden ausgeführt wird und diesen Task auch belegt, damit man sieht, das es aktiv ist? Bei mir klappt's bisher leider nicht :cry: .
[ external image ]
***modified*** und stolz drauf
3ddz
Posts: 139
Joined: Mon, 15. Mar 04, 15:52
x3

Post by 3ddz »

Würde jetzt sagen das du dein Skript einfach in eine Schleife packst und noch ein wait einfügst das dann X sekunden wartet bevor dann die Schleife
wieder durchlaufen wird.
User avatar
Ogerboss
Posts: 1465
Joined: Sat, 5. Aug 06, 22:05
x3tc

Post by Ogerboss »

Hab ich schon probiert...... :roll:


Ergebnis: X3 hat sich aufgehangen :cry: .
[ external image ]
***modified*** und stolz drauf
3ddz
Posts: 139
Joined: Mon, 15. Mar 04, 15:52
x3

Post by 3ddz »

Das kann schnell passieren, du musst immer genau schauen das immer ein wait vorhanden ist und nicht eine Schleife ohne pause ständig durchlaufen
wird sonst lastet dein Skript so X3 aus das nichts mehr geht. Poste dir mal ein kleines Skript das ich ständig auf einem Task laufen habe,
so lange bis es extern wieder beendet wird.

Code: Select all

001   while [THIS] -> exists
002    $enemy = [THIS] -> find nearest enemy ship: max.dist=$range
003    if $enemy -> exists
004     [THIS] -> interrupt task 0 with script 'plugin.3ddz.avoidenemycon' and prio 100: arg1=$range arg2=$enemy arg3=null arg4=null
005   * Hilfe anfordern
006     if $callhelp == 1
007      write to player logbook 'Hilfe angefordert Stufe 1'
008     end
009 @   = wait 30000 ms
010     $running = [THIS] -> is script 'plugin.3ddz.avoidenemycon' on stack of task=0
011     while $running == 1
012 @    = wait 60000 ms
013      $running = [THIS] -> is script 'plugin.3ddz.avoidenemycon' on stack of task=0
014     end
015    end
016 @  = wait 10000 ms
017   end
018   return null
User avatar
Ogerboss
Posts: 1465
Joined: Sat, 5. Aug 06, 22:05
x3tc

Post by Ogerboss »

@3ddz
Könntest du bitte die bei Gelegenheit das dazugehörige Setupscript posten?

p.s. Mein Script hatte eine Pause :roll: .
[ external image ]
***modified*** und stolz drauf
UniTrader
Moderator (Script&Mod)
Moderator (Script&Mod)
Posts: 14571
Joined: Sun, 20. Nov 05, 22:45
x4

Post by UniTrader »

dann Poste du mal den Code ;) evtl. können wir dir ja sagen worans lag ;)
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 ;)
User avatar
Ogerboss
Posts: 1465
Joined: Sat, 5. Aug 06, 22:05
x3tc

Post by Ogerboss »

Dein Wunsch ist mir Befehl, UniTrader.

Code: Select all

001   [THIS] -> set local variable: name='aktiv' value=[TRUE]
002   $aktiv = [THIS] -> get local variable: name='aktiv'
003   while $aktiv == [TRUE]
004    $staffel = [THIS] -> get formation leader
005    if $staffel == null
006     $staffel = [THIS]
007    end
008    $patrolsec = $staffel -> is script 'plugin.patrol.bas.single' on stack of task=0
009    $patrolsecs = $staffel -> is script 'plugin.patrol.bas.single' on stack of task=0
010    $faul = $staffel -> is task 0 in use
011    if $patrolsec == [TRUE] OR $patrolsecs == [TRUE] OR $faul == [FALSE]
012     $kampf = $staffel -> is script '!fight.attack.object' on stack of task=0
013     if $kampf == [FALSE]
014      $array.warenliste = [THIS] -> get local variable: name='array.warenliste'
015      $arraylaenge =  size of array $array.warenliste
016      if $arraylaenge > 0
017 @     $Y = [THIS] -> call script 'plugin.autonachladen.warencheck' : 
018      end
019 @    = wait 30000 ms
020     end
021    end
022   end
023   return null
Hab's auch schon mit "while [THIS] exists" am Anfang probiert, das Ergebnis war aber immer dasselbe: nichts oder Absturz :cry: .
Nach dem letzten Scriptaufruf soll, wenn Y > 0, noch ein weiteres Script aufgerufen werden, dieses ist aber noch nicht ganz fertig.
[ external image ]
***modified*** und stolz drauf
UniTrader
Moderator (Script&Mod)
Moderator (Script&Mod)
Posts: 14571
Joined: Sun, 20. Nov 05, 22:45
x4

Post by UniTrader »

du hast da momenan so ne Struktur:

Code: Select all

$aktiv = [TRUE]
while $aktiv // Schleife wird nie beendet, da $aktiv nicht aktualisiert wird
 if...
  ...
 end
 if....
  if...
   if...
    ....
    end
   @ wait.... //es wird nur bedingt gewartet
  end
 end
end
im prinzip wird nur gewartet, wenn das Schiff im Kampf ist :roll: also ist die Pause an der falschen stelle... das wait sollte direkt nach das while oder vor das end, das zum while gehört ;)
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 ;)
3ddz
Posts: 139
Joined: Mon, 15. Mar 04, 15:52
x3

Post by 3ddz »

Das Problem ist das wenn $kampf == TRUE ist deine Wait nicht ausgeführt wird....
Stell noch ein Wait vor das letzte end in deinem Code, wie es jetzt ist läuft das ganze ohne wait ständig durch wenn eben $kampf nicht false ist
was dann dazu führt das X nicht mehr reagiert.
Ausserdem ist deine while Schleife die aktiv abfragt wirkungslos, du setzt aktiv auf true dann gehst du in die while Schleife, in der du aber aktiv
nicht mehr abfragst, also ist in der Schleife aktiv immer True.

Mein Skript hat noch kein dazugehöriges setupskript damit habe ich mich noch nicht befasst skripte auch erst seit 3 tagen...
Das Skript wird bis jetzt einfach aus einem anderen Skript mit start Task auf einem Task ausgeführt.

Edit: UniTrader {KBG} war schneller :) ...
Last edited by 3ddz on Wed, 21. Mar 07, 18:59, edited 1 time in total.
User avatar
Ogerboss
Posts: 1465
Joined: Sat, 5. Aug 06, 22:05
x3tc

Post by Ogerboss »

Kann mal bitte jemand schauen ob dieses Setup-script bei der Versionsabfrage so funzt wie ich denke (hab keinere neuere VErsion zum Vergleich :roll: ).

Code: Select all

001   $version = get global variable: name='version'
002   $versionaktuell = get script version
003   if $version != $versionaktuell
004    load text: id=8554
005    global script map: set: key=Konfiguration Automatisertes Nachladen, class=Fighter, race=Player, script='plugin.autonachladen.hauptkonfig', prio=0
006    global script map: set: key=Konfiguration Automatisertes Nachladen, class=M6, race=Player, script='plugin.autonachladen.hauptkonfig', prio=0
007    global script map: set: key=COMMAND_AUTORELOAD, class=Fighter, race=Player, script='plugin.autonachladen.befehlcheck', prio=0
008    global script map: set: key=COMMAND_AUTORELOAD, class=M6, race=Player, script='plugin.autonachladen.befehlcheck', prio=0
009    set script command upgrade: command=COMMAND_AUTORELOAD  upgrade=Flottenunterstützungssoftware
010    set script command upgrade: command=Konfiguration Automatisertes Nachladen  upgrade=Flottenunterstützungssoftware
011    $global = null
012    skip if get global variable: name='array.globalewarenliste'
013 @   = $global -> call script 'plugin.autonachladen.globwarlist' : 
014    set global variable: name='version' value=$versionaktuell
015   end
016   return null
Danke im Voraus.
[ external image ]
***modified*** und stolz drauf
User avatar
SymTec ltd.
Posts: 5285
Joined: Mon, 11. Apr 05, 21:11
x3tc

Post by SymTec ltd. »

:)

Die keys und load texts müssen bei jedem Start geladen werden, sonst werden sie entfernt. Zeilen 005 und 006 sind mir unverständlich; ist "Konfiguration Automatisertes Nachladen" der Name deiner Erweiterung? Die Zeilen tun das gleiche wie danach mit "COMMAND_AUTORELOAD", sind das zwei unterschiedliche Kommandoslots?

Zeile 013 braucht ein "Prefix: START", um nicht die ganze Geschichte zum Absturz zu bringen ;)

STL
3ddz
Posts: 139
Joined: Mon, 15. Mar 04, 15:52
x3

Post by 3ddz »

Hab da auch mal ne Frage, wo finde ich denn die blöde Konstante PLAYER für Race=....
Hab das im moment noch so gemacht die Rasse des Spielerschiffs abzufragen und die dann zu verwenden ist ja aber nicht soo super...
UniTrader
Moderator (Script&Mod)
Moderator (Script&Mod)
Posts: 14571
Joined: Sun, 20. Nov 05, 22:45
x4

Post by UniTrader »

wenn du irgendwo ne Spielerrasse brauchst wähle "Select Race" -> Spielername (Im Story-Spiel "Julian"), das wird dann automatisch durch "Player" ersetzt ;)
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 ;)
User avatar
Ogerboss
Posts: 1465
Joined: Sat, 5. Aug 06, 22:05
x3tc

Post by Ogerboss »

Wieso brauch Zeile 13 ein Präfix: START, oder besser gefragt was bedeutet das eigentlich (hat bisher auch ohne START gefunzt)?

Und offensichtlich war meine Frage in der Eile (noch Unterricht gehabt :roll: ) mal wieder unklar formuliert: Wenn der Benutzer jetzt eine neue Version der Scripts installiert und dann den Spielstand lädt, wird dann die neue Version auf den Schiffen, die dieses Kommando bereits verwenden, ab sofort die neue Version benutzt? Und falls nein welche Änderungen muss ich dafür noch vornehmen?

@SymTec ltd.
Was Zeile 5/6 bzw. 7/8 angeht schau mal bei class nach :wink: .
[ external image ]
***modified*** und stolz drauf
3ddz
Posts: 139
Joined: Mon, 15. Mar 04, 15:52
x3

Post by 3ddz »

Das was er meinte war denke ich, das du jedesmal das loadtext ausführen musst und jedesmal die Kommandos zuweisen musst.
Was bei deinem Skript so wie es jetzt ist passiert ist das die Kommandos nur zugewiesen werden wenn es eine neue Version gibt, wenn die Version gleichbleibt wird die load text Anweisung nicht ausgeführt also deine Kommandos werden nicht geladen und zugewiesen, jedenfalls soweit ich das sehe hab auch heut zum erstenmal mit diesem Kram gearbeitet.

@UniTrader {KBG}:
Ah danke, habe mal gelesen das es Probleme gibt wenn man Sachen aus dem aktuellen Spiel als Konstanten einsetzt, deshalb hab ich auch nie meinen Spieler dafür gewählt, aber wenn das dann durch Player ersetzt wird ist das ja ok :)
User avatar
SymTec ltd.
Posts: 5285
Joined: Mon, 11. Apr 05, 21:11
x3tc

Post by SymTec ltd. »

Ogerboss wrote:Wieso brauch Zeile 13 ein Präfix: START, oder besser gefragt was bedeutet das eigentlich (hat bisher auch ohne START gefunzt)?
Das heißt, dass das neue Script gestartet wird, ohne dass das alte darauf wartet, dass es fertig wird... sollte bei setups immer sein, die ja sowieso global laufen...
ogerboss wrote:Was Zeile 5/6 bzw. 7/8 angeht schau mal bei class nach :wink: .
Hab ich. Du setzt aber trotzdem zwei Keys; zwei für M6, zwei für Fighter. Wenn du aber nicht zwei Keys haben willst, ist das nicht richtig.
User avatar
Ogerboss
Posts: 1465
Joined: Sat, 5. Aug 06, 22:05
x3tc

Post by Ogerboss »

@SymTec ltd.
Es sind zwei Kommandos, eins zum Ausführen und eins zum Konfigurieren; der Teil stimmt also. Aber meine Hauptfrage hast du nicht beantwortet :( .
[ external image ]
***modified*** und stolz drauf

Return to “X³: Reunion - Scripts und Modding”