Befehl: find in array -Problem

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

Post Reply
User avatar
Joda
Posts: 217
Joined: Sun, 18. Jan 04, 23:44
xr

Befehl: find in array -Problem

Post by Joda » Tue, 24. Dec 13, 04:48

Hi
ich hab da mit folgendem Code ein paar Probleme. Das ganze Script sucht mir ne Station die Erweiterte Sateliten verkauft
und in dem schipsel soll er - falls schon gedockt, die Station auf die Sateliten prüfen. Falls er sie jedoch nicht findet,
in ein array mit gesperrten Stationen schreiben und ne schleife von vorn starten. Soweit so gut! aber bei der Prüfung
ob die Station im array ist, findet er die Station nicht!????? ich hab das array mal in ein log schreiben lassen und da war sie aber zu 100%!
Der Befehl

Code: Select all

    if not find [DOCKEDAT] in array: $gesperrte.stationen  
scheint da nicht zu funktionieren! Weiß einer woran das liegen könnte? Array ist erstellt worden und sonst hat das Script
wunderbar funktioniert. Nur die paar neuen Zeilen nerven da etwas :evil: :)

Code: Select all

  if [DOCKEDAT]
    if not find [DOCKEDAT] in array: $gesperrte.stationen
      $ware.station.vorhanden = [DOCKEDAT]->get amount of ware {Erweiterter Satellit 4813} in cargo bay
      if $ware.station.vorhanden
        $wunsch.station = [DOCKEDAT]
      else
        append [DOCKEDAT] to array $gesperrte.stationen
        = wait 10 ms
        continue
      end
    end
  end

Guest

Post by Guest » Tue, 24. Dec 13, 05:14

... da ich nicht mehr code sehen kann, kann ich nix konkretes dazu sagen
... aber generell:
--> der befehl funzt problemlos, es gibt 2 mögliche fehlerquellen
1. [DOCKEDAT] ist tatsächlich nicht im array gelistet oder
2. das array existiert nicht

tip: ... schreib´ mal write to player logbook $gesperrte.stationen & prüf´ dann deine logbucheinträge ;)

User avatar
Joda
Posts: 217
Joined: Sun, 18. Jan 04, 23:44
xr

Post by Joda » Tue, 24. Dec 13, 12:45

Das mit dem log hab ich schon mal geprüft, mit erfolg! Wenn ich das wait aus dem obrigen codeschnipsel entferne, hängt sich das Spiel, weil er die Station in dem array nicht findet, auf. Der ganze code ist etwas lang, wesshalb ich ihn nicht gepoasted hab. Aber-
Hier mal der ganze code:

Code: Select all

* =================================================================================================================
* sat.kaufen anzahl ermitteln
* =================================================================================================================
$menge.sats.kaufen = [THIS]->get local variable: name='menge.sats.kaufen'
if $menge.sats.kaufen <= 0
  $menge.sats.kaufen = 10
  [THIS]->set local variable: name='menge.sats.kaufen' value=$menge.sats.kaufen
end

$alt.beschreibung = [THIS]->get destination
$alt.command = [THIS]->get command
$alt.wanted.ware = [THIS]->get wanted ware
$alt.wanted.ware.menge = [THIS]->get wanted ware count

* $feind.flag = [Find.Multiple] | [Find.Enemy]
* $gesperrte.stationen = find station in galaxy: startsector=[SECTOR] class or type=null race=null flags=$feind.flag refobj=[THIS] serial=null max.jumps=1000 num=99999
* skip if $gesperrte.stationen
$gesperrte.stationen = array alloc: size=0

* =================================================================================================================
* Main
* =================================================================================================================
$laderaum.sats = [THIS]->get amount of ware {Erweiterter Satellit 4813} in cargo bay
while $laderaum.sats < 1
    
  * =================================================================================================================
  * Verkaufsstation finden
  * =================================================================================================================
  if [DOCKEDAT]
    if not find [DOCKEDAT] in array: $gesperrte.stationen
      $ware.station.vorhanden = [DOCKEDAT]->get amount of ware {Erweiterter Satellit 4813} in cargo bay
      if $ware.station.vorhanden
        $wunsch.station = [DOCKEDAT]
      else
        append [DOCKEDAT] to array $gesperrte.stationen
        = wait 10 ms
        continue
      end
    end
  end
  
  * hier der test
  $name = sprintf: pageid=8822 textid=2001, $gesperrte.stationen, null, null, null, null
  send incoming message $name to player: display it=[TRUE]
  
  
  skip if $wunsch.station
    $wunsch.station = find station: product {Erweiterter Satellit 4813} with best price:  max.price=100000, amount=1, max.jumps=1000, startsector=[SECTOR], trader=[THIS], exclude array=$gesperrte.stationen
  skip if $wunsch.station
    $wunsch.station = find station sells: resource {Erweiterter Satellit 4813} with best price: max.price=100000, amount=1, max.jumps=1000, startsector=[SECTOR], trader=[THIS], exclude array=$gesperrte.stationen
  
  * =================================================================================================================
  * Wenn keine Station gefunden wird - in Wartestellung gehen
  * =================================================================================================================
  if not $wunsch.station
    $wunsch.station = null
    $wunsch.sektor = null
    $sektor.oder.station = [THIS]->call script 'aaa.xxx.jump.dock.fly.a' : wunsch.station=$wunsch.station  wunsch.sektor=$wunsch.sektor
    = [THIS]->call script 'aaa.xxx.warteschleife' : minutes=10
    
    * $feind.flag = [Find.Multiple] | [Find.Enemy]
    * $gesperrte.stationen = find station in galaxy: startsector=[SECTOR] class or type=null race=null flags=$feind.flag refobj=[THIS] serial=null max.jumps=1000 num=99999
    * skip if $gesperrte.stationen
    $gesperrte.stationen = array alloc: size=0
    continue
  end
  
  * =================================================================================================================
  * Aktuellen Sektor ckecken ob in Blacklisten
  * =================================================================================================================
  $ziel.sektor = $wunsch.station->get sector
  $sperr.sektor = [THIS]->call script 'aaa.xxx.blacklisten' : check.sektor=$ziel.sektor  sperren=null
  if $sperr.sektor
    append $wunsch.station to array $gesperrte.stationen
    = wait 10 ms
    continue
  end
  
  * =================================================================================================================
  * Schiff auf freien Raum fuer 1 Einheit pruefen
  * =================================================================================================================
  $max.kaufen = [THIS]->get free amount of ware {Erweiterter Satellit 4813} in cargo bay
  if $max.kaufen < 1
    return null
  end
  
  * =================================================================================================================
  * Station auf Ware pruefen
  * =================================================================================================================
  $ware.station.vorhanden = $wunsch.station->get amount of ware {Erweiterter Satellit 4813} in cargo bay
  if not $ware.station.vorhanden
    append $wunsch.station to array $gesperrte.stationen
    = wait 10 ms
    continue
  else
    [THIS]->set command: {COMMAND_GET_WARE}  target={Erweiterter Satellit 4813} target2=$wunsch.station par1=$max.kaufen par2=null
    [THIS]->set wanted ware to {Erweiterter Satellit 4813}
    [THIS]->set wanted ware count to $menge.sats.kaufen
    
    $wunsch.station = $wunsch.station
    $wunsch.sektor = null
    $sektor.oder.station = [THIS]->call script 'aaa.xxx.jump.dock.fly.a' : wunsch.station=$wunsch.station  wunsch.sektor=$wunsch.sektor
    
    * =================================================================================================================
    * kaufen in station - wenn dort gelandet!
    * =================================================================================================================
    if [ENVIRONMENT] != $wunsch.station
      append $wunsch.station to array $gesperrte.stationen
      = wait 10 ms
      continue
    else
      check:
      $money = get player money
      $preis.ware = [DOCKEDAT]->get price of ware {Erweiterter Satellit 4813}
      $preis.ware = $preis.ware * 2 + 500000
      
      if $money < $preis.ware
        = [THIS]->call script 'aaa.xxx.warteschleife' : minutes=10
        goto label check
      else
        $max.kaufen = [THIS]->get free amount of ware {Erweiterter Satellit 4813} in cargo bay
        if $max.kaufen > $menge.sats.kaufen
          = [THIS]->buy $menge.sats.kaufen units of {Erweiterter Satellit 4813}
        else
          = [THIS]->buy $max.kaufen units of {Erweiterter Satellit 4813}
        end
        [THIS]->set command: $alt.command
        [THIS]->set destination to $alt.beschreibung
        [THIS]->set wanted ware to $alt.wanted.ware
        [THIS]->set wanted ware count to $alt.wanted.ware.menge
      end
    end
    
  end
  
  * =================================================================================================================
  * ueberpruefen ob kauf erfolgreich war
  * =================================================================================================================
  $laderaum.sats = [THIS]->get amount of ware {Erweiterter Satellit 4813} in cargo bay
  = wait 1000 ms
end


* =================================================================================================================
* =================================================================================================================
return null

User avatar
ubuntufreakdragon
Posts: 5195
Joined: Thu, 23. Jun 11, 14:57
x4

Post by ubuntufreakdragon » Tue, 24. Dec 13, 15:53

Wurde auch mal [DOCKEDAT] ausgeben.
My X3 Mods

XRebirth, things left to patch:
In General; On Firing NPC's; In De Vries; Out Of Zone; And the Antiwishlist

User avatar
Joda
Posts: 217
Joined: Sun, 18. Jan 04, 23:44
xr

Post by Joda » Wed, 25. Dec 13, 02:21

Ja, wurde ausgegeben!
Hab jetzt ne ander Lösung gefunden

Code: Select all

  
  if [DOCKEDAT]
    $ware.station.vorhanden = [DOCKEDAT]->get amount of ware $ware in cargo bay
    if $ware.station.vorhanden
      $wunsch.station = [DOCKEDAT]
    else
      $wunsch.station = null
    end
  end

  skip if $wunsch.station
    $wunsch.station = find station: product $ware with min. jumps:  max.price=99999999, amount=$menge, max.jumps=1000, startsector=[SECTOR], trader=[THIS], exclude array=$gesperrte.stationen
  skip if $wunsch.station
    $wunsch.station = find station sells: resource $ware with min. jumps: max.price=99999999, amount=$menge, max.jumps=1000, startsector=[SECTOR], trader=[THIS], exclude array=$gesperrte.stationen
Da ja bei $wunsch.station == null weiter gesucht wird geht das auch!
Ist nur etwas komisch, das die erste Lösung so nicht funktioniert!?
Evtl kann das ja jemand erklären. Werde da mal ein paar Tests machen :)

Post Reply

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