[EDIT]Konkret-Häftiges-Array-Problem?(Script.Prob.NICHT erledigt)(TECH.Prob.ERLEDIGT)

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

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

Post Reply
User avatar
SuperVegeta
Posts: 1611
Joined: Tue, 20. Dec 05, 11:13
x3tc

[EDIT]Konkret-Häftiges-Array-Problem?(Script.Prob.NICHT erledigt)(TECH.Prob.ERLEDIGT)

Post by SuperVegeta » Thu, 10. Aug 06, 21:50

Kennt das Jemand, kennt jemand den Grund, weiß einer ne Lösung ?

Also mit dem gehts los:
es erzeugt eine Flotte (habs hier jetz auf eins gekürtzt)

zeile 013 == Install Shiptunings: Laderaum + Ruder + Triebwerk
zeile 014 == Install Softwares (Kampfsoft, Handelssoft......)
zeile 015 == Install Waffen und Shild je nach ShipType
zeile 016 == give a Command (Leadership == Patrol // Wings == Prateckt Leadership)(indem Fall LeaderShip == Patrol)

Code: Select all

Script x534.plugin.fleet5.sv
Version: 5
for Script Engine Version: 32

Description
X534 (GAMMA) Fleet5 Ships
Arguments
Source Text

001   * ==================================================================
002   * Script by SuperVegeta at 07.08.2006
003   * ==================================================================
004   
005   $sektor = get sector from universe index: x=16, y=0
006   $xenon = Xenon
007   
008   
009   * Enemy Defend Fleet (Fleet=Xenon P / L / M / N)
010   * Feindschiff = Xenon P = 2
011 @ = wait 50 ms
012   $XM6.1 =  create ship: type=P owner=Xenon addto=$sektor x=20500 y=null z=null
013 @ START $XM6.1 -> call script 'x534.install.shiptuning.03' : 
014 @ START $XM6.1 -> call script 'x534.xfleet.install.TI.02' : 
015 @ START $XM6.1 -> call script 'x534.xfleet.install.WS.01.sv' :  Ship.Type=P
016 @ START [THIS] -> call script 'x534.enemyfleet3.cmd.3.1.sv' :  Leader=$XM6.1  Sektor=$sektor
017 @ = wait 50 ms
018    return null


Nächst Script
soll solang laufen wie Leadership existiert und Race Xenon ist.

macht es auch nich ???????


zeile 005 set Ralation to Feind, all Race without Xenon and Neutral
zeile 018 set Command Patrol in Sektor
zeile 028 Suche FeindShip innerhalb von Dist zum Leader und nicht Race Xenon or Neutral, gieb es ans Script.x534.enemyfleet3.cmd.3.1.sv zurück.

zeile 035 Leader Attack the FeindShip und folge nicht in anderen Sektor.
zeile 069 Suche FeindStation in Dist zum Leader die nicht Race Xenon or Neutral ist und gieb sie ans Script.x534.enemyfleet3.cmd.3.1.sv zurück

zeile 076 Leader Attack FeindStation und folge nicht in andern Sektor.
zeile 096 Suche während des Kampfes mit der FeindStation, FeindShips in Dist zum Leader die nicht Race Xenon or Neutral sind und gieb es ans Script.x534.enemyfleet3.cmd.3.1.sv zurück.
----> wenn FeindShip exist === Script begind von vorn !!!

Code: Select all

Script x534.enemyfleet3.cmd.3.1.sv
Version: 0
for Script Engine Version: 32

Description
x534 (GAMMA) enemyfleet cmd X-Fleet M6 cmd
Arguments
1: Leader , Var/Ship , 'Leader' 
2: Sektor , Var/Sector , 'Sektor' 
Source Text

001   * ==================================================================
002   * Script by SuperVegeta at 08.08.2006
003   * ==================================================================
004   $Leader -> set race logic control enabled to [FALSE]
005 @ START $Leader -> call script 'x534.Relation.X.sv' : 
006   $Xenon = Xenon
007   
008   while $Leader -> exists
009    
010   Patrol:
011 @  = wait 1000 ms
012    $Leader.Race = $Leader -> get owner race
013    if $Leader.Race != $Xenon
014     return null
015    end
016    
017
018 @  START $Leader -> call script '!ship.cmd.patrol.std' :  Sector=$Sektor
019    
020   * ==================================================================
021    
022   next.Ship:
023    $Leader.Race = $Leader -> get owner race
024    if $Leader.Race != $Xenon
025     return null
026    end
027    
028 @  $Feind.Ships = [THIS] -> call script 'x534.enemyfleet.ship.sv' :  Sektor=$Sektor  Race=$Xenon  Leader=$Leader  Meter=5000
029    
030    if $Feind.Ships == null
031     goto label next.Station
032    end
033    
034    if $Feind.Ships != null
035 @   START $Leader -> call script '!fight.attack.object' :  the victim=$Feind.Ships  follow in new sector=[FALSE]
036    end
037    
038    write to player logbook $Feind.Ships
039    
040    while $Feind.Ships != null
041     $Leader.Race = $Leader -> get owner race
042     if $Leader.Race != $Xenon
043      return null
044     end
045     
046     $Race.Feind.Ship = $Feind.Ships -> get owner race
047     if $Race.Feind.Ship == $Xenon OR $Race.Feind.Ship == Neutrale
048      goto label next.Ship
049     end
050     
051     $Dist.Ship = get distance between $Leader and $Feind.Ships
052     if $Dist.Ship > 5000
053      goto label next.Ship
054     end
055 @   = wait 1000 ms
056    end
057    
058    
059   * ==================================================================
060    
061    
062   next.Station:
063 @  = wait 1000 ms
064    $Leader.Race = $Leader -> get owner race
065    if $Leader.Race != $Xenon
066     return null
067    end
068    
069 @  $Feind.Station = [THIS] -> call script 'x534.enemyfleet.station.sv' :  Leader=$Leader  Sektor=$Sektor  Race=$Xenon  Meter=7500
070    
071    if $Feind.Station == null
072     goto label Patrol
073    end
074    
075    if $Feind.Station != null
076 @   START $Leader -> call script '!fight.attack.object' :  the victim=$Feind.Station  follow in new sector=[FALSE]
077    end
078    
079    write to player logbook $Feind.Station
080    
081    while $Feind.Station != null
082     $Leader.Race = $Leader -> get owner race
083     if $Leader.Race != $Xenon
084      return null
085     end
086     
087     $Dist.Station = get distance between $Leader and $Feind.Station
088     if $Dist.Station > 7500
089      goto label Patrol
090     end
091     
092 @   $Feind.Ships = [THIS] -> call script 'x534.enemyfleet.ship.sv' :  Sektor=$Sektor  Race=$Xenon  Leader=$Leader  Meter=5000
093     
094     if $Feind.Ships != null
095      goto label Patrol
096     end
097 @   = wait 2000 ms
098    end
099    
100    
101 @  = wait 1000 ms
102   end
103   
104   
105   return null

Die Scripte die Station oder Ship suchen sind gleich,
außer: Ship Array fom Sektor // Station Array from Sektor

Nächstes Script
Sucht Ship oder Station
1. innerhalb einer bestimmten Distance vom Leader ist.
2. Ship was nicht Race Neutral ist oder Race Xenon ist

3. dann wright ins playerlook Ship
4. und dann giebt es das gefundene Ship an das Startscript zurück

Code: Select all

Script x534.enemyfleet.get.Ship.sv
Version: 0
for Script Engine Version: 32

Description
Description
Arguments
1: Leader , Var/Ship , 'Leader' 
2: Sektor , Var/Sector , 'Sektor' 
3: Race , Var/Race , 'Race' 
4: Meter , Var/Number , 'Meter' 
Source Text

001   * ==================================================================
002   * Script by SuperVegeta at 10.08.2006
003   * ==================================================================
004 @ = wait 10 ms
005   $Array = $Sektor -> get ship array from sector/ship/station
006   $Array.size =  size of array $Array
007   while $Array.size
008    dec $Array.size = 
009    $Objeckt = $Array[$Array.size]
010    
011    if $Objeckt -> exists
012    
013     
014     $dist = get distance between $Leader and $Objeckt
015     if $dist < $Meter
016      
017      $owner = $Objeckt -> get owner race
018      if $owner != Neutrale
019       if $owner != $Race
020        
021        write to player logbook $Objeckt
022        return $Objeckt
023        
024       end
025 @     = wait 10 ms
026      end
027 @    = wait 10 ms
028     end
029 @   = wait 10 ms
030    end
031 @  = wait 10 ms
032   end
033   
034   
035   return null

nun zum Prob:

mit der return $Objekt

dürfte nur ein objekt angegeben werden............JA :?:

im Playerlook wird geschrieben:
"Unbekanntes Objekt"

"Unbekanntes Objekt"

"Unbekanntes Objekt"

"Ship"

"Unbekanntes Objekt"

"Unbekanntes Objekt"



1. obwohl garkein "Unbekanntes Objekt" dah ist.
2. ohne die return $Ship in der mitte

kommen nochmehr "Unbekanntes Objekt" + die Vuale==Ships

"Unbekanntes Objekt" ungefähr wie Ships im gesammten Sektor :?: :!:


####wenn die Ausgabewerte keinen ortentlichen wert haben
kann man ja nicht wirklich was mit dem Arrays anfangen####



hab ich auch mit Station.Array probiert.
selbst mit mein Goner.Map.Updata.Service

---->das gleiche in grün :?:

ich hab den GMUS auf X3 V.1.4.2 geschrieben
---> dah lief er einwandfrei


jetz hab ich X3 V.1.4.3
----> und jetz spinnen die Arrays :evil:



Normal für X3 V.1.4.3 ?????
Kennt das einer ????
Ist das bekannt ????
Giebts ne Lösung ???
irgendwas ?????
Last edited by SuperVegeta on Sat, 12. Aug 06, 17:09, edited 2 times in total.

fennry
Posts: 1611
Joined: Wed, 6. Nov 02, 20:31
x3

Post by fennry » Fri, 11. Aug 06, 01:30

Ich spekuliere mal

Ist es möglich das die unbekannten vieleicht die Bröckchen sind die in manchen Sektoren rumfliegen?


Warum nutzt du nicht "Find Schip in Sektor" Flags "find Nearst" Wenn du eh nur ein Schiff suchst? Da läst sich dann auch festlegen, das man nur bestimmte Schiffe haben will (z.B. Leichte Kampfschiffe)

Sindwiller [ITF]
Posts: 713
Joined: Sun, 29. Feb 04, 12:36

Post by Sindwiller [ITF] » Fri, 11. Aug 06, 11:03

Bist du dir sicher das die neutral-race Abfrage nötig ist? Versuchs ma ohnel if $owner != Neutrale .

Mfg, Sindwiller

EDIT: Ahja, bevor ichs noch vergesse: Bitte benutz weniger grosse Schrift und achte auf deine Rechtschreibung und Grammatik. :roll:
Deutsches X3-Modding Wiki und Forum
#dev-kammer auf irc.gamesurge.net

User avatar
Lucike
Posts: 12969
Joined: Sun, 9. May 04, 21:26
x4

Post by Lucike » Fri, 11. Aug 06, 11:52

Sindwiller [ITF] wrote:EDIT: Ahja, bevor ichs noch vergesse: Bitte benutz weniger grosse Schrift und achte auf deine Rechtschreibung und Grammatik. :roll:
Genau, und binde dir die Schuhe vernünftig zu. Och Mensch, käm' mal deine Haare. :D

Ne, Sindwiller hat natürlich Recht. ;) Ich mach' das mal eben.

Gruß
Lucike

PS zum Thema: Das Aufrufskript würde mich mal interessieren.
Image

Deleted User

Post by Deleted User » Fri, 11. Aug 06, 12:10

Da ich mich mit Scripting nicht wirklich auskenne muss ich mal blöd fragen, was das Script genau können soll?

MFG
Beli

Sindwiller [ITF]
Posts: 713
Joined: Sun, 29. Feb 04, 12:36

Post by Sindwiller [ITF] » Fri, 11. Aug 06, 14:22

Dieses Script sucht ein Schif DAS:

1. Sich innerhalb einer bestimmten Distanz zum Leaderschiff befindet.
2. Nicht zur Rasse "Neutral" oder zur Rasse des Leaderschiffes gehört.
Dieses Schiff wird dann ins Spielerlog geschrieben und ans Startscript zurückgegeben
So sollte es glaub ich heissen. *hust* *hust* :roll:

Mfg, Sindwiller
Deutsches X3-Modding Wiki und Forum
#dev-kammer auf irc.gamesurge.net

User avatar
Orka
Posts: 817
Joined: Wed, 7. Apr 04, 15:19
xr

Post by Orka » Fri, 11. Aug 06, 14:55

fennry wrote: Warum nutzt du nicht "Find Schip in Sektor" Flags "find Nearst" Wenn du eh nur ein Schiff suchst? Da läst sich dann auch festlegen, das man nur bestimmte Schiffe haben will (z.B. Leichte Kampfschiffe)
Die "find ship" Funktion würde ich dir auch empfehlen. Die Distanzprüfung kann die Funktion auch gleich mit übernehmen.

MichaRose
Posts: 328
Joined: Sat, 28. Feb 04, 19:25
x3

Post by MichaRose » Fri, 11. Aug 06, 15:19

Das Array kann man benutzen, mache ich auch in einigen Scripts!

Ich denke, das dein Problem in 'if $owner != Neutrale' zu finden ist. Neutrale ist ja keine wirkliche Rasse und soll wohl eher abfragen, ob die Rasse Neutral zu dir ist.

Aber egal, um ein Schiff zu finden, ist ein durchlaufen einer Schleife gar nicht nötig. Spart Zeit!

Daher schließe ich mich Orkas, und fennrys Meinung an.

Als Argumente brauchst Du nur den 'leader' und die 'meter' angeben, das kann unter Umständen auch sinnvoller sein, da man sich mit dem Sektor auch mal irren kann. (Bug vorbeugend)

Suchst Du Freunde oder Feinde? Ich nehme mal letzteres an!

Da reicht eigentlich schon:

Code: Select all

001   $ship = $leader -> find nearest enemy ship: max.dist=$meter
002   skip if not $ship
003    write to player logbook $ship
004   return $ship
oder, wenn es ein zufälliges Feindschiff sein soll:

Code: Select all

001   $sektor = $leader -> get sector
002   
003   $flags = [Find.Random] | [Find.Enemy]
004   
005   $ship =  find ship: sector=$sektor class or type=Ship race=null flags=$flags refobj=$leader maxdist=$meter maxnum=1 refpos=null
006   skip if not $ship
007    write to player logbook $ship
008   return $ship
Suchst Du freundliche Schiffe, kannst Du die Flags im zweiten Code ändern. Tausche [Find.Enemy] mit [Find.Friend] aus. Kannst auch [Find.Random] mit [Find.Nearest] austauschen, um das naheliegenste Schiff zu finden.

EDIT: Habe mal eben eine überflüssige Zeile aus dem zweiten Code entfehrnt.
Gruß,
Michael

User avatar
SuperVegeta
Posts: 1611
Joined: Tue, 20. Dec 05, 11:13
x3tc

Post by SuperVegeta » Fri, 11. Aug 06, 20:46

Danke für die Antworten :D


Ich hab den ganzen Script Baum ins erste Feld ausgestellt :!:

die wright to playerlooks sind logisch nur für Prüfzwecke, weils nich funzt hat

Zumindest Theoretisch sollte es funzen ????????


Das mit der "find ship in sektor................." währe auch nur eine behandlung der Symptome
Es funzt ja dann nicht nur dieses Array nicht sondern all Arrays gehen nicht mehr richtig :!:

ich habe die Arrays auch ohne Argument, allein und ohne rausfiltern laufen lassen nur eine "if XXX exist" und trotzdem kommen lauter "Unbekannte Objekte" die garnicht da sind raus :!:


Hier mal ne Liste was anders ist, seit dem ich den GMUS geschrieben hab der einwandfrei lief, dahmals.

Code: Select all

früher                                                        jetzt
X3 V.1.4.2.[BETA]                                     X3 V.1.4.3
(X3 V.1.1 -> V.1.2.1 -> V.1.3                  X3.V.1.1 -> V.1.2.1 -> V.1.4.3
-> V.1.4.1 -> V.1.4.2.[BETA]
kein Mod                                        Nebel abschalt Mod 480km 
                                                          (im Mod Ordner)
                                                    Asteoriden abschalt Mod als 07 cat/dat
                                                    Ego 07 zu 08 cat/dat gemacht
so richtig haut mein gameversion ehe nich hin:

ich hab 2x Argon Eins in ArgonPrime ????????



PS: ich lade mir grade V.1.3 und später noch V.1.4 hoffe das ist die 1.4.2.[BETA], runter
schmeiß den Nebel Mod raus mal sehn ?????

werds auch einfach mal ohne Mods proben

aber am Script layout liegt nich das es nich funzt, außer das es vielleicht
nicht direkt auf dem LeaderShip läuft sondern nur über ihn (Leader als $Var übergeben (kann man schlecht beschreiben (vom ersten Script zum zweiten)))

fennry
Posts: 1611
Joined: Wed, 6. Nov 02, 20:31
x3

Post by fennry » Fri, 11. Aug 06, 22:47

Wenn du es genau wissen willst was du da gefunden hast, dann frag die Objekt ID ab von $Objeckt ab und lass sie dir mit ins Log schreiben.

User avatar
Orka
Posts: 817
Joined: Wed, 7. Apr 04, 15:19
xr

Post by Orka » Sat, 12. Aug 06, 00:57

und frag mal den maintype und subtype auch ab und mit logen.

MichaRose
Posts: 328
Joined: Sat, 28. Feb 04, 19:25
x3

Post by MichaRose » Sat, 12. Aug 06, 12:39

Mir ist in deinen Scripts aufgefallen, das Du sehr häufig das hier benutzt:

Code: Select all

018 @  START $Leader -> call script '...' : 
Kann mich auch irren, aber mir ist mal bei meinen Scriptversuchen aufgefallen, das wenn man so mehrere Scripte gleichzeitig auf einem Objekt laufen lässt, das dann nicht alle Scripte bis zum schluß durchlaufen und abgebrochen werden.

Besser wäre den Leader auch als Argument mit zu übergeben und Steuerungsscripte Global laufen zu lassen:

Code: Select all

001   $call = null
002 @  START $call -> call script '...' : Leader=$Leader ...
und Kommandos, wie das patrol, oder attack sollten dann so gestartet werden:

Code: Select all

032   START $Leader -> command COMMAND_BLA: arg1=null, arg2=null, arg3=null, arg4=null

Zweiter Punkt, der mir aufgefallen ist. Wenn Du für ein Schiff ein Feindliches Ziel benötigst, dann wähle nicht irgendein Schiff aus und frage die Rasse ab:

Code: Select all

046     $Race.Feind.Ship = $Feind.Ships -> get owner race 
047     if $Race.Feind.Ship == $Xenon OR $Race.Feind.Ship == Neutrale 
048      goto label next.Ship 
049     end 
denn somit definierst Du auch Freunde als Feinde. Das geht viel einfacher und vor allem genauer:

Code: Select all

031   skip if $Leader -> is $Feind.Ship a enemy
032       goto label next.Ship 
Aber die goto Anweisungen innerhalb einer while Schleife würde ich lassen. Benutze stattdessen break, um die aktuelle Schleife abzubrechen.


Dritter Punkt die Feindauswahl im Script 'x534.enemyfleet3.cmd.3.1.sv' ab Zeile 28. Sorry, aber viel zu umständlich und zu ungenau gelöst. Dieses Script kann man bestimmt um die Hälfte an Zeilen kürzen und dabei effektiver gestallten.

Dieses Script findet wirklich nur Feinde vom Leader! Egal ob es ein Schiff, oder eine Station ist.

Code: Select all

Script x534.enemyfleet3.cmd.3.1.sv 
Version: 0 
for Script Engine Version: 32 

Description 
x534 (GAMMA) enemyfleet cmd X-Fleet M6 cmd 
Arguments 
1: Leader , Var/Ship , 'Leader' 
2: Sektor , Var/Sector , 'Sektor' 
Source Text 

001   * ================================================================== 
002   * Script by SuperVegeta at 08.08.2006 
003   * Modified by MichaRose at 12.08.2006 LOL
004   * ================================================================== 
005    
006   $Leader -> set race logic control enabled to [FALSE]
007   $Xenon = Xenon 
008
009 @ START $Leader -> call script 'x534.Relation.X.sv' : 
010
011   START $Leader -> command COMMAND_PATROL: arg1=$Sektor, arg2=null, arg3=null, arg4=null 
012
013   Patrol: 
014 @  = wait 1000 ms
015
016   skip if $Leader -> exists 
017     return null
018
019    $Leader.Race = $Leader -> get owner race 
020    skip if $Leader.Race == $Xenon 
021     return null 
022  
023   $Enemy = $Leader -> find nearest enemy ship: max.dist=5000
024   skip if $Enemy
025    $Enemy = $Leader -> find nearest enemy station: max.dist=7500
026
024   skip if not $Enemy
025     $Leader -> interrupt task 0 with script '!fight.attack.object' and prio 10: arg1=$Enemy arg2=[FALSE] arg3=null arg4=null
026
027   while $Enemy -> exists
028 @   = wait 1000 ms 
029    
030    skip if $Leader -> exists 
031     return null
032
033    $Leader.Race = $Leader -> get owner race 
034    skip if $Leader.Race == $Xenon 
035     return null 
036   
037    skip if $Leader -> is $Enemy a enemy
038     break
039
040    $Distance = get distance between $Leader and $Enemy
041    if $Enemy -> is of class Ship
042     skip if $Distance <= 5000 
043      break
044    else if $Enemy -> is of class Station
045     skip if $Distance <= 7500 
046      break
047    end 
048
049   end 
050    
051 @   = wait 9000 ms 
052   goto label Patrol
054
055   return null 
Dieser Code sollte genau das gleiche machen, wie dein Script. Fehler meinerseits sind nicht ausgeschlossen, da ich es nicht im Editor erstellt habe und daher auch nicht testen konnte.

Das feine daran ist, wenn ein feindliches Objekt zerstört wurde, dann wird der Leader seine ursprüngliche Aufgabe, nämlich das Patrolieren im Sektor, wieder aufnehmen und nicht stehenbleiben. Zum Beispiel bei einem unvorhergesehenen Scriptabbruch.

Vorrausgesetzt, ihm wurde durch ein anderes Script nicht ein anderer Befehl erteilt! Denn dann würde er diesen fortsetzen.

Den Scriptaufruf in Zeile 9 würde ich noch einmal überdenken, ob es wirklich auf dem Leader ausgeführt werden muß. Denn Feinde sind Feinde und muß man nicht erst noch auf feindlich setzen. Würde ich also auch weglassen!


Jetzt brauche ich aber erst einmal einen Kaffee!
Gruß,
Michael

User avatar
SuperVegeta
Posts: 1611
Joined: Tue, 20. Dec 05, 11:13
x3tc

Post by SuperVegeta » Sat, 12. Aug 06, 17:06

also das Primere TECH Prob mit den "Unbekannten Objekts" iss weg

ich die Nebel und Asteoriden Mod rausgenomm
naja das wars egentlich schon

entweder hatte mein Save ne klatsche :?:
oder irgendne verquickung mit den Mods :?:




at Relation:
Xenon // Kha'ak // Piraten haben nicht alle Rassen als Feind
(so wie Neutral, Race 1, Race 2, Race 3, Unbekannt, UFO......und andere solche nicht nähr deffinierten)
(Terraner ?, Freund ?, Goner ?)

und [PLAYERSHIP] und Race Player ist auch ein unterschied :!:

---> das Script Relation...... setzt alle Fraktionen zu Feind außer Race des Objekts und Race Neutral.


@ MichaRose
ich hab da noch ein par fragen zu deiner version meines Scripts
1. Die $Leader interrupt Task 0 with Script .........bla
kanst mir sagen was der unterschied is zu
START $Leader call script:!fight.attack...............
und warum das besser ist :?:

2. break
werden alle Whils oder nur die in ders steht abgebrochen :?:


3. schau dir mal mein aktuelles Script an und mein Prob dazu.

hier mein derzeitiges Script:
Prob nachdem eine Feind.Station vernichtet wurde sollte eigentlich "goto label Patrol" ausgeführt werden
und wenn $Leader nicht Command Patrol hat soll er das machen.

sprich es soll von vorn beginnen,
aber es bricht ab :?:


Code: Select all

Script x534.enemyfleet3.cmd.1.sv
Version: 0
for Script Engine Version: 32

Description
Description
Arguments
1: Leader , Var/Ship , 'Leader' 
Source Text

001   * ==================================================================
002   * Script by SuperVegeta
003   * ==================================================================
004   $Leader -> set race logic control enabled to [FALSE]
005 @ = $Leader -> call script 'x534.Relation.X.sv' : 
006   
007   $Sektor = $Leader -> get sector
008   $Race.Leader = $Leader -> get owner race
009   
010   write to player logbook $Leader
011   
012   
013   while $Leader -> exists
014   Patrol:
015   
016    $cmd = $Leader -> get command
017    if not $cmd == COMMAND_PATROL
018     
019   
020     START $Leader -> command COMMAND_PATROL : arg1=$Sektor, arg2=null, arg3=null, arg4=null
021     $cmd = $Leader -> get command
022 @   = wait 1000 ms
023     write to player logbook $cmd
024    end
025    
026   Feind.Ship:
027    
028 @  $Feind.Ship = [THIS] -> call script 'x534.enemyfleet.get.Ship.sv' :  Leader=$Leader  Meter=7500
029   
030    
031    if $Feind.Ship == null
032 @   = wait 1000 ms
033     goto label Station
034    end
035    
036   
037 @  START $Leader -> call script '!fight.attack.object' :  the victim=$Feind.Ship  follow in new sector=[FALSE]
038 @  = wait 1000 ms
039    
040    $cmd = $Leader -> get command
041    write to player logbook $cmd
042    write to player logbook $Feind.Ship
043    
044  
045    while $Feind.Ship
046     $New.Leader.Race = $Leader -> get owner race
047     if $New.Leader.Race != $Race.Leader
048      return null
049     end
050     
051     if $Race.Feind.Ship == Neutrale
052 @    = wait 1000 ms
053      goto label Feind.Ship
054     end
055     
056     $Feind.Ship.Sektor = $Feind.Ship -> get sector
057     if $Feind.Ship.Sektor != $Sektor
058 @    = wait 1000 ms
059      goto label Feind.Ship
060     end
061 @   = wait 1000 ms
062    end
063 @  = wait 1000 ms
064    goto label Feind.Ship
065    
066    
067    
068   Station:
069    
070 @  $Feind.Station = [THIS] -> call script 'x534.enemyfleet.station.sv' :  Leader=$Leader  Meter=10000
071   
072    
073    if $Feind.Station == null
074 @   = wait 1000 ms
075     goto label Patrol
076    end
077    
078   
079    START $Leader -> command COMMAND_ATTACK : arg1=$Feind.Station, arg2=null, arg3=null, arg4=null
080   
081    
082 @  = wait 1000 ms
083    $cmd = $Leader -> get command
084    write to player logbook $cmd
085    write to player logbook $Feind.Station
086    
087   
088    while $Feind.Station
089     
090     $New.Leader.Race = $Leader -> get owner race
091     if $New.Leader.Race != $Race.Leader
092      return null
093     end
094     
095 @   $Feind.Ship = [THIS] -> call script 'x534.enemyfleet.get.Ship.sv' :  Leader=$Leader  Meter=7500
096   
097     if $Feind.Ship != null
098 @    = wait 1000 ms
099      goto label Feind.Ship
100     end
101     
102     
103 @   = wait 1000 ms
104    end
105    
106    
107 @  = wait 1000 ms
108    goto label Patrol
109   end
110   
111   
112 @ = wait 1000 ms
113   goto label Patrol
114   
115   return null

MichaRose
Posts: 328
Joined: Sat, 28. Feb 04, 19:25
x3

Post by MichaRose » Sun, 13. Aug 06, 00:41

[PLAYERSHIP] und Race Player ist auch ein unterschied
Natürlich! [PLAYERSHIP] ist ein Schiff und Race Player eine Rasse. Schiffe sind keine Rassen.


Zu 1:
Der Unterschied ist der, das Du dem Schiff ein korrektes Kommando erteilst, auf Task 0 und nicht irgendwo, an dem Schiff gebunden, ein Script laufen läßt.

Mit interrupt unterbrichst Du das aktuelle Kommando, das auf Task 0 läuft, mit einem anderen Script. Wird dann dieses Script beendet, wird das Kommando wieder aktiv.

Noch ein Grund ist der. Wenn Du ein Script hast, das einem Schiff befiehlt, ein anderes Schiff zu folgen und folgenden Fehler machst:

Code: Select all

001 @   $START = $Leader -> call script 'folge.dem.ziel' :  Ziel=$target.A
002
003 @   $START = $Leader -> call script 'folge.dem.ziel' :  Ziel=$target.B
dann versucht er wahrscheinlich beiden Zielen gleichzeitig zu folgen. Oder bricht die verfolgung zum $target.A ab, da das Script ungewollt beendet wird, weil es zufällig auf dem selben Task gestartet wird.

Mit einer richtigen Kommandosteuerung und der interrupt Methode wird er $target.B folgen und wenn er damit fertig ist, macht er dann mit $target.A weiter.

Blödes Beispiel, soll aber verdeutlichen, wie sich zwei Scripte beißen können, wenn sie nicht gezielt (auf einem Objekt) gestartet werden. Ich hatte da schon so einige Probleme mit.

Zu 2:
Immer nur in der While Schleife, in der die break Anweisung steht. Übergeordnete Schleifen werden dann fortgesetzt.

Zu 3:
In Zeile 88 ist die While Schleife falsch. Die Variable $Feind.Station hat einen Wert und die Schleife wird solange laufen, solange der Wert vorhanden ist. Da diese Variable aber nicht bearbeitet wird, kann sich der Wert auch nicht ändern. Die Schleife wird erst abgebrochen, wenn ein neues $Feind.Ship gefunden wurde, auch wenn die Station schon vor Stunden zerstört ist.

Der Leader bleibt also nach der zerstörung stehen und wartet auf ein neues Feindschiff. Das sieht so aus, als wäre das Script abgebrochen, ist es aber nicht. Mußt Du nur wie folgt ändern:

Code: Select all

088   while $Feind.Station -> exists
Gruß,
Michael

Post Reply

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