[Scr in Arbeit] Stationen auf Lagergröße,Produkte usw. abfragen

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

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

michi_oss
Posts: 600
Joined: Sat, 14. Oct 06, 15:02
x4

Post by michi_oss »

So, ich habe das Script mal etwas umgeschrieben, und ein neues Problem. Vom Maintype 16 (also Tech) sollen nur bestimmte Subtypes erfasst werden (weil man ja z.B. nicht mit nem Sprungantrieb handeln kann...).

Ich habe alle Subtype-nummer, die erfasst werden sollen in ein array geschrieben. Nun möchte ich in einer IF Abfrage, dass die Nummer des Subtype der aktuellen Ware mit den Nummern in dem Array abgeglichen werden. Nur wie macht man das in einer IF? Einfach nur den Arraynamen hinschreiben ergibt immer ein False.

Alle Nummer in eine IF Abfrage packen funktioniert nicht. Bei 11 Nummer ging das noch, bei mehr wird immer ein False produziert.

(Darf ein Array eine Zahl im Namen haben? Liegt da der Fehler?...)


Achja: Momentan habe ich noch eine else abfrage, die mir "fehlende" einträge (also einträge die mit der if halt nicht erfasst werden) mit nem Hinweis in die log schreibt.

Code:

Code: Select all

write to log file 1 append=[False] value=''

$array.erl.sub.16 = array alloc: size=0
append 0 to array $array.erl.sub.16
append 1 to array $array.erl.sub.16
append 2 to array $array.erl.sub.16
append 3 to array $array.erl.sub.16
append 4 to array $array.erl.sub.16
append 7 to array $array.erl.sub.16
append 8 to array $array.erl.sub.16
append 9 to array $array.erl.sub.16
append 10 to array $array.erl.sub.16
append 42 to array $array.erl.sub.16
append 45 to array $array.erl.sub.16
append 80 to array $array.erl.sub.16
append 91 to array $array.erl.sub.16
append 92 to array $array.erl.sub.16
append 93 to array $array.erl.sub.16
append 94 to array $array.erl.sub.16
append 95 to array $array.erl.sub.16
append 96 to array $array.erl.sub.16
append 97 to array $array.erl.sub.16
append 98 to array $array.erl.sub.16
append 99 to array $array.erl.sub.16
append 100 to array $array.erl.sub.16
append 101 to array $array.erl.sub.16
append 109 to array $array.erl.sub.16
append 110 to array $array.erl.sub.16


$max.x = get max sectors in x direction
while $max.x
  dec $max.x =
  $max.y = get max sectors in y direction
  while $max.y
    dec $max.y =
    $sector = get sector from universe index: x=$max.x, y=$max.y
    if $sector->exists
      $race.sector = $sector->get owner race
      if $race.sector != {Kha'ak 7} AND $race.sector != {Xenon}
        $array.station = find station: sector=$sector class or type=null race=null flags=[Find.Multiple] refobj=null maxdist=null maxnum=999999 refpos=null
        $n = size of array $array.station
        
        while $n
          dec $n =
          
          $station = $array.station[$n]
          $race = $station->get owner race
          $class.station = $station->get object class
          if $race != {Spieler} AND $class.station != {Schiffswerft} AND $class.station != {Große Schiffswerft}
            
            
            
            $array.ware = $station->get tradeable ware array from station
            $m = size of array $array.ware
            $array.product = array alloc: size=0
            while $m
              dec $m =
              $ware = $array.ware[$m]
              if $station->uses ware $ware as product
                $maintype.number = get maintype of ware $ware
                $subtype.number = get subtype of ware $ware
                $product = $station->get max. store amount of ware $ware
                
                if $maintype.number == 8
                  $maintype.ware = 'Waffen'
                else if $maintype.number == 9
                  $maintype.ware = 'Schilde'
                else if $maintype.number == 10
                  $maintype.ware = 'Raketen'
                else if $maintype.number == 11
                  $maintype.ware = 'Energie'
                else if $maintype.number == 12
                  $maintype.ware = 'Natürlich'
                else if $maintype.number == 13
                  $maintype.ware = 'Bio'
                else if $maintype.number == 14
                  $maintype.ware = 'Nahrung'
                else if $maintype.number == 15
                  $maintype.ware = 'Mineralien'
                else if $maintype.number == 16
                  $maintype.ware = 'Tech'
                end
                
                if (( $maintype.number == 16 AND  $subtype.number == $array.erl.sub.16 ) OR $maintype.number < 16 )
                  $sum = $maintype.ware + ' - ' + $ware + ' - ' + $product
                  append $sum to array $array.product
                else
                  $sum = 'FEHLEND:' + $maintype.ware + $subtype.number + ' - ' + $ware + ' - ' + $product
                  append $sum to array $array.product
                  
                end
                
              end
            end
            
            $array.resource = array alloc: size=0
            $m = size of array $array.ware
            while $m
              dec $m =
              $ware = $array.ware[$m]
              if not $station->uses ware $ware as product
                $maintype.number = get maintype of ware $ware
                $subtype.number = get subtype of ware $ware
                $resource = $station->get max. store amount of ware $ware
                
                if $maintype.number == 8
                  $maintype.ware = 'Waffen'
                else if $maintype.number == 9
                  $maintype.ware = 'Schilde'
                else if $maintype.number == 10
                  $maintype.ware = 'Raketen'
                else if $maintype.number == 11
                  $maintype.ware = 'Energie'
                else if $maintype.number == 12
                  $maintype.ware = 'Natürlich'
                else if $maintype.number == 13
                  $maintype.ware = 'Bio'
                else if $maintype.number == 14
                  $maintype.ware = 'Nahrung'
                else if $maintype.number == 15
                  $maintype.ware = 'Mineralien'
                else if $maintype.number == 16
                  $maintype.ware = 'Tech'
                end
                
                if (( $maintype.number == 16 AND  $subtype.number == $array.erl.sub.16 ) OR $maintype.number < 16 )
                  $sum = $maintype.ware + ' - ' + $ware + ' - ' + $resource
                  append $sum to array $array.resource
                else
                  $sum = 'FEHLEND:' + $maintype.ware + $subtype.number + ' - ' + $ware + ' - ' + $resource
                  append $sum to array $array.resource
                  
                end
                
              end
            end
            
            
            $log = $station + '; ' + $race + '; ' + $array.product + '; ' + $array.resource
            write to log file 1  append=[TRUE]  value=$log
            
            
            
          end
        end
      end
    end
  end
  
  
end


$msg = 'Scanvorgang abgeschlossen'
display subtitle text: text=$msg duration=6000 ms
write to player logbook $msg



return null

Last edited by michi_oss on Sat, 31. Oct 09, 20:45, edited 2 times in total.
Die Kraft einer Kerze ist die Flamme, aber sie brennt nur so lange wie der Docht.
UniTrader
Moderator (Script&Mod)
Moderator (Script&Mod)
Posts: 14571
Joined: Sun, 20. Nov 05, 22:45
x4

Post by UniTrader »

du machst es viel zu kompliziert ;) schau mal ganz unten in die Trade Commands, da gibt es ne Abfrage ob eine Ware eine Erweiterung bzw. ein Tuning, also nicht handelbar, ist ;)
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 ;)
michi_oss
Posts: 600
Joined: Sat, 14. Oct 06, 15:02
x4

Post by michi_oss »

Ah, danke. Gut zu wissen :D

Also eine If Abfrage auf ware ist nicht equipment und nicht upgrade. Mal suchen...

Gefunden habe ich bis jetzt "<RetVar/IF> is upgrade: ware=<Var/Ware>"

Code: Select all

if not $ware -> is upgrade
ne, so schon mal nicht.


Aber mal für eventuelle andere Fälle: Kann man in einer If Abfrage eine Variable mit allen Werten eines Array abgleichen?
Die Kraft einer Kerze ist die Flamme, aber sie brennt nur so lange wie der Docht.
UniTrader
Moderator (Script&Mod)
Moderator (Script&Mod)
Posts: 14571
Joined: Sun, 20. Nov 05, 22:45
x4

Post by UniTrader »

michi_oss wrote:Aber mal für eventuelle andere Fälle: Kann man in einer If Abfrage eine Variable mit allen Werten eines Array abgleichen?
ja -> in einer Schleife, in der jeder Wert einzeln abgefragt wird..
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 ;)
michi_oss
Posts: 600
Joined: Sat, 14. Oct 06, 15:02
x4

Post by michi_oss »

Also so akzeptiert der Editor es schonmal:

Code: Select all

if not is upgrade: ware=$ware
Aber wie bekomme ich da

Code: Select all

if not is equipment: ware=$ware
mit ran?

als verschachteltes IF wäre es vermutlich möglich, aber nicht elegant:

Code: Select all

if not is upgrade: ware=$ware
               if not is equipment: ware=$ware
                  $sum = $maintype.ware + ' - ' + $ware + ' - ' + $resource
                  append $sum to array $array.resource
               end
                  
           end
Die Kraft einer Kerze ist die Flamme, aber sie brennt nur so lange wie der Docht.
User avatar
ScRaT_GER
Posts: 1962
Joined: Tue, 8. Jan 08, 18:19
x3tc

Post by ScRaT_GER »

Das geht nicht. Du kannst die bestehenden Befehle nicht erweitern.

Du könntest es folgendermaßen machen (vielleicht ist das deiner Ansicht nach eleganter):

Code: Select all

$is.upgrade = is upgrade: ware=$ware
$is.equipment = is equipment: ware=$ware
if not $is.upgrade AND $is.equipment
....
end
Diese Methode ist vielleicht etwas leichter zu lesen und hat den Vorteil, dass du "is.upgrade" und "is.uquipment" später wiederverwenden kannst.
Die Zeilenanzahl ist die gleiche.

MfG,
ScRaT
michi_oss
Posts: 600
Joined: Sat, 14. Oct 06, 15:02
x4

Post by michi_oss »

Ah, Danke. :)


Gibt es hier im Forum eigentlich ne Liste der Main- und Subtypen? Sonst würde ich mal eine reinstellen, scanne derzeit auch alles auf main und subtypen und lass es mir ausgeben... (könnte ich bei Interesse dann hier posten) (aber müsste ja eig?!)

Von Reunion gibt es ja eine bei MSCI, von TC hab ich noch keine gesehen.
Last edited by michi_oss on Sat, 31. Oct 09, 22:34, edited 1 time in total.
Die Kraft einer Kerze ist die Flamme, aber sie brennt nur so lange wie der Docht.
UniTrader
Moderator (Script&Mod)
Moderator (Script&Mod)
Posts: 14571
Joined: Sun, 20. Nov 05, 22:45
x4

Post by UniTrader »

probiers mal so, dass die aktuelle Schleife von vorne beginnt (mit der nächsten Ware) wenn es Tuning oder Ausrüstung ist ;)

Code: Select all

skip if not is equipment: ware=$ware
| continue
skipif not is upgrade: ware=$ware
| continue
(zur info: das continue hat denselben effekt als würde die aktuelle while-schleife ein end erreichen - nur kann es mitten in einer Schleife verwendet werden, um den aktuellen durchlauf zu beenden ;))

EDIT: zu spät...
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 ;)
michi_oss
Posts: 600
Joined: Sat, 14. Oct 06, 15:02
x4

Post by michi_oss »

So, zwei Fragen hab ich dann noch mal.

1. Wie lese ich den Namen einer Station ohne Alpha, beta, gamma, delta, epsilon aus?

Ich weiß, dass ich mit

Code: Select all

<RetVar> = <RefObj> -> get name
den gesamten Namen der Station bekomme und mit

Code: Select all

<RetVar/IF> = <RefObj> -> get serial name of station
das Anhängsel Alpha usw. auslesen kann.
Aber kann man Strings voneinander subtrahieren?


2. Wie bekommt man es hin, dass ein Script im Hintergrund läuft? Das Script lässt X3 für Sekunden komplett einfrieren. Erstmal nicht schlimm, nur wenn man ein Script bastelt, dass 20 Sekunden benötigt, wäre es ja nicht schlecht, wen man zwischendurch ausgeben könnte, dass das Spiel noch lebt. Der WVH scannt ja auch Fabriken ohne X3 einzufrieren...
Die Kraft einer Kerze ist die Flamme, aber sie brennt nur so lange wie der Docht.
User avatar
Saetan
Posts: 3223
Joined: Wed, 1. Feb 06, 19:26
x4

Post by Saetan »

michi_oss wrote:2. Wie bekommt man es hin, dass ein Script im Hintergrund läuft? Das Script lässt X3 für Sekunden komplett einfrieren. Erstmal nicht schlimm, nur wenn man ein Script bastelt, dass 20 Sekunden benötigt, wäre es ja nicht schlecht, wen man zwischendurch ausgeben könnte, dass das Spiel noch lebt.
Ein wait über ein paar ms in der Schlaufe sollte hier Abhilfe schaffen.
UniTrader
Moderator (Script&Mod)
Moderator (Script&Mod)
Posts: 14571
Joined: Sun, 20. Nov 05, 22:45
x4

Post by UniTrader »

zu 1. du willst den stationstypen haben?
-> get ware type code of object

zu 2. wie Saetan gesagt hat ein wait in die am weitesten eingerückte Schleife rein.. die Zeit ist eigentlich egal bzw. 1 ms reicht völlig.. (wird dann immer auf die länge von einem Frame gestreckt ;) )
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 ;)
michi_oss
Posts: 600
Joined: Sat, 14. Oct 06, 15:02
x4

Post by michi_oss »

ok, so geht das schonmal.
Gibt es noch ne weitere Möglichkeit den Namen abzufragen? Mit obigen gibt er jetzt ja auch die Rasse vor dem Namen mit an... :D

Oder muss ich mit dem einen oder anderen Leben?


Also am Besten wäre eine Ausgabe wie folgend:

Kristallfabrik M

oder

Sonnenkraftwerk XL


PS: weiter solch allgemein zu gebrauchenen Fragen stelle ich dann wohl lieber in dem "allgemeine S&M Fragen" Thema.
Die Kraft einer Kerze ist die Flamme, aber sie brennt nur so lange wie der Docht.

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