Scriptfrage: fighter aus M1 starten lassen?

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
bugatti
Posts: 981
Joined: Sun, 8. Feb 04, 11:21
x3ap

Scriptfrage: fighter aus M1 starten lassen?

Post by bugatti » Mon, 11. Jun 07, 16:12

ich schon wieder :oops: .
ich habe einen m1 per script in einen sector springen lassen, dort soll er dann die zuvor festgelegten ziele vernichten. funktioniert auch tadellos. im m1 sind mehrere fighter (in diesem fall m3+ eklipse) angedockt, welche den m1 als homebase haben. nun zum problem, wie schaffe ich es diese fighter starten zu lassen und ihnen den befehl "beschütze m1" zu geben? ich bastle da schon seit mehreren stunden herum :?
hier mal der code den ich momentan versuche. funktioniert aber auch nicht.

Code: Select all

001   load text: id=7048
002   $ship = [THIS]
003   $sector = $ship -> get sector
004   $fighter = $ship -> find ship: class or type=Eklipse race=Player flags=[DOCKEDAT] refobj=$ship maxnum=200  with homebase=$ship
005   $size.fighter =  size of array $fighter
006   $msg = sprintf: fmt='fighter %s gefunden', $size.fighter, null, null, null, null
007   write to player logbook $msg
008   $i = 0
009   while $i < $size.fighter
010    $fighter.i = $fighter[$i]
011    $home.fighter = $fighter.i -> get homebase
012    if $home.fighter == $ship
013     $fighter.i -> start task 0 with script '!ship.cmd.protect.std' and prio 0: arg1=$ship arg2=null arg3=null arg4=null arg5=null
014    end
015    inc $i = 
016   end
017   $size.ziele =  size of array $ziele
018   $i = 0
019   while $i < $size.ziele
020    $ziele.i = $ziele[$i]
021 @  = $ship -> call script '!ship.cmd.attack.pl' :  victim=$ziele.i
022    inc $i = 
023   end
024   return null

dann habe ich zeile 004 mal gegen folgendes getauscht:

Code: Select all

004   $fighter =  find ship: sector=$sector class or type=Eklipse race=Player flags=[DOCKEDAT] refobj=$ship maxdist=null maxnum=200 refpos=null
geht auch nicht.
bei flags habe ich auch schon verschiedenes getestet, find.mutiple, find.includedock und dieses komische ENVIRONMENT :? .
alles ohne erfolg.
kann mir mal wieder jemand helfen?

PS:
zeile 006 und 007 sind momentan nur eine kontrollausgabe um zu sehen ob irgendwelche fighter gefunden werden. ist aber immer 0.

User avatar
X-Freak Cartman
Posts: 4017
Joined: Mon, 2. Oct 06, 15:08
x3

Post by X-Freak Cartman » Mon, 11. Jun 07, 16:21

Versuchs mal mit dem Befehl "START <Ship> command: COMMAND_PROTECT, arg1=<>, arg2=<>, arg3=, arg4=

Ist unter den Fly commands. Das ist weit bequemer als deine Variante ^^

Wenn du keine Kampfsoftware MK3 oder den englischen Dockscriptfix laufen hast, docken die Schiffe dann sofort ab.

btw: Der Befehl in Zeile 4 müsste heißen "get ship array of ship/station/sector", welcher unter den Universe Commands zu finden ist.

bugatti
Posts: 981
Joined: Sun, 8. Feb 04, 11:21
x3ap

Post by bugatti » Tue, 12. Jun 07, 08:56

danke für die hilfe. nun klappt es.

so langsam nimmt mein sektor angriffscript für spielereigene gks gestallt an :) .
nur mit der variablen auswahl der gks habe ich noch gewaltige probleme, da argumente, welche vom spieler abgefragt werden, ja anscheinend nur im startscript vorkommen.

bugatti
Posts: 981
Joined: Sun, 8. Feb 04, 11:21
x3ap

Post by bugatti » Tue, 12. Jun 07, 13:06

doch noch ein problem.
es funktioniert soweit erstmal alles, sofern der angriff zu gunsten des spielers verläuft. also die ziele vernichtet werden. wenn jedoch der angriff scheitert, also das GKS vernichtet wird, scheint das script sofort beendet zu werden und somit wird die abschlußmeldung mit den verlusten nicht angezeigt.
hier mal der code des eigentlichen angriffscriptes:

Code: Select all

 load text: id=7048
002   $ship = [THIS]
003   $sector = $ship -> get sector
004   $size.ziele =  size of array $ziele
005   $i = 0
006   while $i < $size.ziele
007    $ziele.i = $ziele[$i]
008 @  = $ship -> call script '!ship.cmd.attack.pl' :  victim=$ziele.i
009    inc $i = 
010   end
011   $msg = sprintf: pageid=7048 textid=40, $ship, $sector, $size.ziele, null, null
012   send incoming message $msg to player: display it=[TRUE]
013   return null

wird also das ship zerstört, endet das script scheinbar bei zeile 008 sofort. wie bekomme ich also ein return, wenn das ship zerstört wurde, damit ich das script fortsetzen kann für die abschlußmeldung?

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

Post by Lucike » Tue, 12. Jun 07, 13:25

Auf welchem Objekt läuft das Skript? Auf dem Angreifer?

002 $ship = [THIS]

Wenn das stimmt, dann wird auf jeden Fall das Skript beendet, wenn das Objekt, auf dem es läuft, zerstört wird.

Umgehung: Signal_Killed (oder globales Skript)

Gruß
Lucike
Image

bugatti
Posts: 981
Joined: Sun, 8. Feb 04, 11:21
x3ap

Post by bugatti » Tue, 12. Jun 07, 13:47

jep, es läuft auf zeile 002 $ship = [THIS]

an ein globales script vage ich mich nicht :oops: , dieses Signal_Killed habe ich schonmal gesehen, doch weiß ich nicht so recht wie ich es einbinden kann :?

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

Post by Lucike » Tue, 12. Jun 07, 13:51

bugatti wrote:jep, es läuft auf zeile 002 $ship = [THIS]

an ein globales script vage ich mich nicht :oops: , dieses Signal_Killed habe ich schonmal gesehen, doch weiß ich nicht so recht wie ich es einbinden kann :?
Ein globales Skript ist leichter umzusetzen, keine Bange. Achte nur auf genügend "Waits" und das Skript muss sich selbst beenden können.

Gruß
Lucike
Image

User avatar
X-Freak Cartman
Posts: 4017
Joined: Mon, 2. Oct 06, 15:08
x3

Post by X-Freak Cartman » Tue, 12. Jun 07, 14:24

Mal eine andere Frage...
Was soll das im Endeffekt werden?
Eine Flottenverwaltung?
Ein "Beschütze mich und lande"-Kommando?
Ein persönlicher Script zu Testzwecken für einen größeren Plan?
... oder einfach nur so was?

^^
Die ersten beiden sind imho überflüssig... im englischen Forum schwirren mehr als genug derartige Flottenbefehlsscripts rum.

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

Post by Lucike » Tue, 12. Jun 07, 17:50

X-Freak Cartman [KBG] wrote:^^
Die ersten beiden sind imho überflüssig... im englischen Forum schwirren mehr als genug derartige Flottenbefehlsscripts rum.
Ist doch egal. Learning by doing. ^^

Gruß
Lucike
Image

bugatti
Posts: 981
Joined: Sun, 8. Feb 04, 11:21
x3ap

Post by bugatti » Tue, 12. Jun 07, 18:27

X-Freak Cartman [KBG] wrote:Mal eine andere Frage...
Was soll das im Endeffekt werden?
Eine Flottenverwaltung?
Ein "Beschütze mich und lande"-Kommando?
Ein persönlicher Script zu Testzwecken für einen größeren Plan?
... oder einfach nur so was?

^^
Die ersten beiden sind imho überflüssig... im englischen Forum schwirren mehr als genug derartige Flottenbefehlsscripts rum.
um die frage trotzdem zu beantworten.
ich möchte bis zu 4 spielereigene gks auswählen können, dann einen angriffssektor (erledigt). nun soll geprüft werden ob alle gks einen sprungantrieb haben und ausreichend ez, zusätzlich soll der eigentümer des sektors auf "feind" gestellt werden (erledigt), als nächstes sollen die ziele im sektor festgelegt werden in der reihenfolge: m2, m1 dann alle stationen (erledigt). jetzt soll die flotte in den sektor springen im abstand von 20 bis 30 sekunden und der angriff soll beginnen. ist in der flotte ein m1 mit angedockten jägern, sollen diese starten und am angriff teilnehmen, wobei sich die gesamte flotte zuerst auf eventuell vorhandene gks stürzen soll. händler, zivilschiffe und kleinvieh soll dabei nicht beachtet werden (fast erledigt). ein dazugehöriges t-file soll die verschiedenen meldungen enthalten (erledigt). sollte der m1 der fighter zerstört werden, sollen die fighter für einige zeit im sektor wildern und die überlebenden sich dann zur nächsten feundlichen handelsstation begeben (bisher nur angefangen).
das ganze soll funktionieren wenn der spieler im sektor ist und auch wenn er nicht im sektor ist.
und der sinn der ganzen sache?
wie lucike schon bemerkte:
learning by doing.
in meinem alter hat man nicht allzuviel ahnung von solcher scripterei, da x3 aber mittlerweile langweilig geworden ist und die ganzen scripte mich neugierig gemacht haben, habe ich eben angefangen zumindest die grundzüge des themas zu erlernen (mein erstes script siehe hier:http://forum.egosoft.com/viewtopic.php?t=167802). nachdem mein erstes eigenes script fertig war (und scheinbar auch funktioniert) wollte ich nun ein klein wenig komplexer werden, wenngleich es für einen laien doch ziemlich verwirrend ist, vorallem da bei den meisten erklärungen keine einfachen beispiele dabei sind (am meisten hilft dieses united script tutorial). also verzeiht einem alten mann wenn er gelegentlich ein paar blöde fragen stellt.

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

Post by MichaRose » Tue, 12. Jun 07, 22:54

Lucike wrote:
X-Freak Cartman [KBG] wrote:^^
Die ersten beiden sind imho überflüssig... im englischen Forum schwirren mehr als genug derartige Flottenbefehlsscripts rum.
Ist doch egal. Learning by doing. ^^
Eben, nicht jeder muß sich von der Community die Nüsse kraulen lassen!

@bugatti
Damit der Schlange nicht der Kopf abgeschlagen werden kann, wirst Du bei diesem Vorhaben um ein Global laufendes Script nicht herum kommen.
Alles andere wäre zu kompliziert und zu fehleranfällig. Hier mal ein kleines Beispiel, wie ich es machen würde!

Schiffskommando Script: ship.cmd.meineflotte

Code: Select all

Argumente:
$sector	var/sector
$gks2	var/ship
$gks3	var/ship
$gks4	var/ship

skip if $sector -> is of class sector
  return null

$null = null
@ START $null -> call script: 'plugin.global.meineflotte' $sector=sector gks1=[THIS] gks2=$gks2 gks3=$gks3 gks4=$gks4
while [TRUE]
@ [THIS] -> move around 10000 ms
end
return null
Globales Stuerungscript: plugin.global.meineflotte

Code: Select all

Argumente:
$sector	var/sector
$gks1	var/ship
$gks2	var/ship
$gks3	var/ship
$gks4	var/ship


skip if $sector -> is of class sector
  return null


$ShipList = array alloc: size=0

if $gks1 -> is of class BigShip
  $JumpSector = $gks1 -> get sector
  $JumpToSector = get jumps from sector $JumpSector to sector $sector
  $JumpEnergyMin = $gks1 -> needed jump drive energy for jump to sector $sector
  $JumpEnergyMax = -1
  skip if not $gks1 -> get amount of ware Sprungantrieb in cargo bay
    $JumpEnergyMax = $gks1 -> get amount of ware Energiezellen in cargo bay
  skip if $JumpEnergyMax < $JumpEnergyMin AND $JumpToSector >= 2
    append $gks1 to array $ShipList
end

if $gks2 -> is of class BigShip
  $JumpSector = $gks2 -> get sector
  $JumpToSector = get jumps from sector $JumpSector to sector $sector
  $JumpEnergyMin = $gks2 -> needed jump drive energy for jump to sector $sector
  $JumpEnergyMax = -1
  skip if not $gks2 -> get amount of ware Sprungantrieb in cargo bay
    $JumpEnergyMax = $gks2 -> get amount of ware Energiezellen in cargo bay
  skip if $JumpEnergyMax < $JumpEnergyMin AND $JumpToSector >= 2
    append $gks2 to array $ShipList
end

if $gks3 -> is of class BigShip
  $JumpSector = $gks3 -> get sector
  $JumpToSector = get jumps from sector $JumpSector to sector $sector
  $JumpEnergyMin = $gks3 -> needed jump drive energy for jump to sector $sector
  $JumpEnergyMax = -1
  skip if not $gks3 -> get amount of ware Sprungantrieb in cargo bay
    $JumpEnergyMax = $gks3 -> get amount of ware Energiezellen in cargo bay
  skip if $JumpEnergyMax < $JumpEnergyMin AND $JumpToSector >= 2
    append $gks3 to array $ShipList
end

if $gks4 -> is of class BigShip
  $JumpSector = $gks4 -> get sector
  $JumpToSector = get jumps from sector $JumpSector to sector $sector
  $JumpEnergyMin = $gks4 -> needed jump drive energy for jump to sector $sector
  $JumpEnergyMax = -1
  skip if not $gks4 -> get amount of ware Sprungantrieb in cargo bay
    $JumpEnergyMax = $gks4 -> get amount of ware Energiezellen in cargo bay
  skip if $JumpEnergyMax < $JumpEnergyMin AND $JumpToSector >= 2
    append $gks4 to array $ShipList
end

skip if size of array $ShipList
  return null


$GlobalVarName = 'wir.sind.schon.aktiv.in.' + $sector

skip if not get global variable: name=$GlobalVarName
  return null

set global variable: name=$GlobalVarName value=$ShipList

* Ich speichere absichtlich das Array in der Globalen Variable, da das Script so noch ausbaufähig ist.
* Z.B. könnte man dem Array und somit der Flotte noch weitere Schiffe hinzufügen, wenn man will, auch während der fight schon lange läuft.


start:

$ShipInSector = size of array $ShipList
$ShipNum = $ShipInSector
while $ShipNum
@ = wait 10 ms
  dec $ShipNum =
  $ship = $ShipList[$ShipNum]

  skip if $ship -> is script 'ship.cmd.meineflotte' on stack of task=0
    $ship -> start task 0 with script 'ship.cmd.meineflotte' and prio 0: arg1=$sector arg2=null arg3=null arg4=null arg5=null

  $JumpSector = $ship -> get sector
  skip if not $JumpSector == $sector
    continue

  $JumpToSector = get jumps from sector $JumpSector to sector $sector
  if $JumpToSector >= 2
    $ship -> interrupt task 0 with script '!ship.cmd.jump.pl' and prio 1: arg1=$sector arg2=null arg3=null arg4=null
  else
    $ship -> interrupt task 0 with script '!ship.cmd.movesector.std' and prio 1: arg1=$sector arg2=null arg3=null arg4=null
  end

  dec $ShipInSector =
end

* Ein bischen Warten, bis alle GKS im Angriffssektor sind
$ShipNum = size of array $ShipList
if $ShipInSector < $ShipNum
@ = wait 5000 ms
  goto label start
end



* Rasse des Sektors auf Feind Einstellen, falls noch nicht geschehen (befindet sich innerhalb der großen Schleife).

* Hier der Code, um die Schiffe zu steuern. Als ob Du selbst die Befehle geben würdest!

* Jäger aus GKS starten. Kommando Beschütze Trägerschiff, Greife Ziel an und lande oder was auch immer!
* Lasse die Jäger nicht nach getaener Arbeit im Raum stehen. Sind sonst leichte Ziele für Feinde!

* Um den GKS Schiffen Befehle zu erteilen, arbeite nur mit: 
$ship -> interrupt task 0 with script '!ship.cmd.FooBar' and prio 1: arg1=$arg1 arg2=arg2 arg3=null arg4=null
* Dann bleiben die nach beendigung ihrer Aufgabe nicht im Raum stehen, da in 'ship.cmd.meineflotte' move around 10000 ms in einer Schleife läuft.



$ShipNum = size of array $ShipList
while $ShipNum
@ = wait 10 ms
  dec $ShipNum =
  $ship = $ShipList[$ShipNum]
  if $ship -> exists
    skip if not $ship -> is script 'ship.cmd.meineflotte' on stack of task=0
      continue
  end
  remove element from array $ShipList at index $ShipNum
end

skip if not size of array $ShipList
  goto label start


set global variable: name=$GlobalVarName value=null

return null
Fehler im Code bitte übersehen, hab das nicht im Editor geschrieben!
Gruß,
Michael

Post Reply

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