Wie funktioniert das create.ship genau?
Moderators: Scripting / Modding Moderators, Moderatoren für Deutsches X-Forum
-
- Posts: 39
- Joined: Fri, 30. Jan 04, 20:30
Wie funktioniert das create.ship genau?
Ich habe vor ein Script zu schreiben das Produkte von jeder Station zu einer Zielstation ausliefert(gegen gebühr natürlich).
Nun stehe ich vor den Problem das ich nicht das "Auslieferschiff" erstellen kann. Es soll die waren ausliefern aber keine Befehle von mir bekommen dürfen. Am besten in der station erzeugt werden wo man es braucht oder wenigstens daneben.
1.Wie geht das?
2.Nochwas wieviel Meter bzw. Km sind die angaben die man im Editor angibt? also "stationxachse + 500" wieviel wird es daneben gesetzt?
Falls es sowas schon gibt auch gut, bloß ich will halt das scripten lernen. Das geht am besten wenn man es selber macht und dann nachschaut wie man es auch machen kann.
Nun stehe ich vor den Problem das ich nicht das "Auslieferschiff" erstellen kann. Es soll die waren ausliefern aber keine Befehle von mir bekommen dürfen. Am besten in der station erzeugt werden wo man es braucht oder wenigstens daneben.
1.Wie geht das?
2.Nochwas wieviel Meter bzw. Km sind die angaben die man im Editor angibt? also "stationxachse + 500" wieviel wird es daneben gesetzt?
Falls es sowas schon gibt auch gut, bloß ich will halt das scripten lernen. Das geht am besten wenn man es selber macht und dann nachschaut wie man es auch machen kann.
-
- Posts: 248
- Joined: Fri, 6. Feb 04, 14:47
Hallo Baruter.
Die Entfernungen sind IMO in Metern angegeben. (Korrigiert mich wenn ich mich irre) Also genauso wie du die Entfernung deines Ziels o.a. siehst.
Die kompletten Scriptbefehle siehst du hier:
http://www.egosoft.com/x2/forum/viewtopic.php?t=29054
Und als Auszug:
<RetVar> = Name des Schiffes im script (Variable)
type=<Var/Ship Type> Schiffstyp
owner=<Var/Race> Die Rasse. Setz ein was du brauchst.
addto=<Value> Hier kannst du die Station einsetzen. (Vorher die Var. dafür bestimmen)
x=<Var/Number> y=<Var/Number> z=<Var/Number> Die Koordinaten.
Da kannst du vorher die Koord. der Station abfragen:
<RetVar> = Der Var.Name des Koord.
<RefObj> = Der Variablenname des Objekts dessen Koords. du abfragen willst.
Mit den so erfassten Koordinaten kannst du das Schiff positionieren, in dem du eine der Koordinaten mit
veränderst.
Z.B: $y = $y + 100
Das sind 100 Meter von der Y-Achse der Station.
Noch Fragen? Her damit.
Die Entfernungen sind IMO in Metern angegeben. (Korrigiert mich wenn ich mich irre) Also genauso wie du die Entfernung deines Ziels o.a. siehst.
Die kompletten Scriptbefehle siehst du hier:
http://www.egosoft.com/x2/forum/viewtopic.php?t=29054
Und als Auszug:
Code: Select all
<RetVar> = create ship: type=<Var/Ship Type> owner=<Var/Race> addto=<Value> x=<Var/Number> y=<Var/Number> z=<Var/Number>
type=<Var/Ship Type> Schiffstyp
owner=<Var/Race> Die Rasse. Setz ein was du brauchst.
addto=<Value> Hier kannst du die Station einsetzen. (Vorher die Var. dafür bestimmen)
x=<Var/Number> y=<Var/Number> z=<Var/Number> Die Koordinaten.
Da kannst du vorher die Koord. der Station abfragen:
Code: Select all
<RetVar> = <RefObj>get y position
<RefObj> = Der Variablenname des Objekts dessen Koords. du abfragen willst.
Mit den so erfassten Koordinaten kannst du das Schiff positionieren, in dem du eine der Koordinaten mit
Code: Select all
<RetVar/IF><Expression>
Z.B: $y = $y + 100
Das sind 100 Meter von der Y-Achse der Station.
Noch Fragen? Her damit.
Solong, GothicK
-
- Posts: 39
- Joined: Fri, 30. Jan 04, 20:30
-
- Posts: 248
- Joined: Fri, 6. Feb 04, 14:47
-
- Posts: 39
- Joined: Fri, 30. Jan 04, 20:30
Es funktioniert.
der frachter wird erstellt, er lädt die bestellte ware auf, fliegt zur station und dann verschwindet er wieder (soll er auch machen).
Bloß es wird nicht die ware in der station abgeladen wenn sie die ware nicht halten kann z.b. SKW mit schilden beladen. Das würde ich aber gerne machen, umso ein Lager aufzubauen. Geht das irgentwie?
ich habe auch versucht das script umzuschreiben das M1 und M2 beladen werden. mit den befehl
if $zielstation == M1 OR M2
da ich im Moment noch keine habe, habe ich
else
write to logbook "hier kann man nicht laden"
zugefügt. bloß leider kommt der logbuch eintrag nicht an.
PS. das sind nicht die genauen befehle, war zu faul die Scripte zu öffnen.

der frachter wird erstellt, er lädt die bestellte ware auf, fliegt zur station und dann verschwindet er wieder (soll er auch machen).
Bloß es wird nicht die ware in der station abgeladen wenn sie die ware nicht halten kann z.b. SKW mit schilden beladen. Das würde ich aber gerne machen, umso ein Lager aufzubauen. Geht das irgentwie?
ich habe auch versucht das script umzuschreiben das M1 und M2 beladen werden. mit den befehl
if $zielstation == M1 OR M2
da ich im Moment noch keine habe, habe ich
else
write to logbook "hier kann man nicht laden"
zugefügt. bloß leider kommt der logbuch eintrag nicht an.
PS. das sind nicht die genauen befehle, war zu faul die Scripte zu öffnen.
-
- Posts: 248
- Joined: Fri, 6. Feb 04, 14:47
Es hilft, wenn du das entsprechende Script (auch wenn du zu faul bist) im IExplorer öffnest, inclusive "Argumente" markierst, Kopierst und hier mit
Code: Select all
einfügst.
Dann könnte ich dir eher helfen.
Ich seh aber so schon, das du logische Fehler eingebaut hast.
Jetzt poste aber mal dein Script.
Last edited by GothicK on Thu, 26. Feb 04, 20:56, edited 1 time in total.
Solong, GothicK
-
- Posts: 39
- Joined: Fri, 30. Jan 04, 20:30
Ok hier das script, net das beste aber man lernt ja noch.
Arguments
1: Bestellstation , Var/Station and Product , 'Bestellstation'
2: Bestellmenge , Nummer , 'Bestellmenge'
3: Zielstation , Var/Ship owned by Player , 'Ziel'
Source Text
001 if$Zielstation==Destroyer M2ORBattle Ship M1
002 $station =$Bestellstation[1]
003 $Produkt =$Bestellstation[0]
004 $geldmenge =get player money
005 $produktmenge =get volume of ware$Produkt
006 $einzelpreis =$station ->get price of ware$Produkt
007
008 * Anzahl der Produkte festlegen
009 if$produktmenge<$Bestellmenge
010 $anzahl =$produktmenge
011 end
012 if$Bestellmenge<$produktmenge
013 $anzahl =$Bestellmenge
014 end
015
016 * endpreis ausrechnen
017 $endpreis =$einzelpreis*$anzahl+1500
018 if$geldmenge>$endpreis
019 $lieferungInGang =1
020 @ =[THIS] ->call script'frachterholen.test':Station=$stationgeldmenge=$geldmengeanzahl=$anzahlprodukt=$Produktendpreis=$endpreiszielstation=$ZielstationLieferungInGang=$lieferungInGang
021 end
022 else
023 write to player logbook'Hier kann ich die Ware nicht abliefern.'
024 end
025 returnnull
Arguments
1: Bestellstation , Var/Station and Product , 'Bestellstation'
2: Bestellmenge , Nummer , 'Bestellmenge'
3: Zielstation , Var/Ship owned by Player , 'Ziel'
Source Text
001 if$Zielstation==Destroyer M2ORBattle Ship M1
002 $station =$Bestellstation[1]
003 $Produkt =$Bestellstation[0]
004 $geldmenge =get player money
005 $produktmenge =get volume of ware$Produkt
006 $einzelpreis =$station ->get price of ware$Produkt
007
008 * Anzahl der Produkte festlegen
009 if$produktmenge<$Bestellmenge
010 $anzahl =$produktmenge
011 end
012 if$Bestellmenge<$produktmenge
013 $anzahl =$Bestellmenge
014 end
015
016 * endpreis ausrechnen
017 $endpreis =$einzelpreis*$anzahl+1500
018 if$geldmenge>$endpreis
019 $lieferungInGang =1
020 @ =[THIS] ->call script'frachterholen.test':Station=$stationgeldmenge=$geldmengeanzahl=$anzahlprodukt=$Produktendpreis=$endpreiszielstation=$ZielstationLieferungInGang=$lieferungInGang
021 end
022 else
023 write to player logbook'Hier kann ich die Ware nicht abliefern.'
024 end
025 returnnull
-
- Posts: 39
- Joined: Fri, 30. Jan 04, 20:30
und hier das andere, ich weis es sind vielzuviel argumente die ich nicht brauch
Arguments
1: station , Var/Station , 'Station'
2: geldmenge , Object Command , 'geldmenge'
3: anzahl , Object Command , 'anzahl'
4: produkt , Object Command , 'produkt'
5: endpreis , Object Command , 'endpreis'
6: zielstation , Object Command , 'zielstation'
7: LieferungInGang , Object Command , 'LieferungInGang'
Source Text
001 $stationx =$station ->get x position
002 $stationy =$station ->get y position
003 $stationz =$station ->get z position
004 $stationx500 =$stationx+500
005 $stationy500 =$stationy+500
006
007 * frachter erzeugen
008 $frachter =create ship: type=Paranid Hermesowner=Paranidenaddto=$stationx=$stationx500y=$stationy500z=$stationz
009 =$frachter ->buy$anzahlunits of$produkt
010 $rechnung1 =0-$endpreis
011 add money to player:$rechnung1
012
013 * frachter zum ziel fahen lassen
014 $jetztigerstandort =$frachter ->get sector
015 $zielsector =$zielstation ->get sector
016 if not$jetztigerstandort==$zielsector
017 @ =$frachter ->fly to sector$zielsector
018 end
019 @ =$frachter ->fly to station$zielstation
020 if$frachter ->is docked
021 $dudidum =$station ->add$anzahlunits of$produkt /hier habe ich das mit der Ware probierrt
022 =$frachter ->unload$anzahlunits of$produkt
023 write to player logbook'Ihre Ware ist angekommen. vielen danke fuer ihr vertrauen'
024 $frachter ->destruct: show no explosion=1
025 end
026 returnnull
Arguments
1: station , Var/Station , 'Station'
2: geldmenge , Object Command , 'geldmenge'
3: anzahl , Object Command , 'anzahl'
4: produkt , Object Command , 'produkt'
5: endpreis , Object Command , 'endpreis'
6: zielstation , Object Command , 'zielstation'
7: LieferungInGang , Object Command , 'LieferungInGang'
Source Text
001 $stationx =$station ->get x position
002 $stationy =$station ->get y position
003 $stationz =$station ->get z position
004 $stationx500 =$stationx+500
005 $stationy500 =$stationy+500
006
007 * frachter erzeugen
008 $frachter =create ship: type=Paranid Hermesowner=Paranidenaddto=$stationx=$stationx500y=$stationy500z=$stationz
009 =$frachter ->buy$anzahlunits of$produkt
010 $rechnung1 =0-$endpreis
011 add money to player:$rechnung1
012
013 * frachter zum ziel fahen lassen
014 $jetztigerstandort =$frachter ->get sector
015 $zielsector =$zielstation ->get sector
016 if not$jetztigerstandort==$zielsector
017 @ =$frachter ->fly to sector$zielsector
018 end
019 @ =$frachter ->fly to station$zielstation
020 if$frachter ->is docked
021 $dudidum =$station ->add$anzahlunits of$produkt /hier habe ich das mit der Ware probierrt
022 =$frachter ->unload$anzahlunits of$produkt
023 write to player logbook'Ihre Ware ist angekommen. vielen danke fuer ihr vertrauen'
024 $frachter ->destruct: show no explosion=1
025 end
026 returnnull
-
- Posts: 248
- Joined: Fri, 6. Feb 04, 14:47
Zum ersten:
Willst du an ein Schiff liefern lassen? OK. Warum nicht.
Schon 2 Fehler. Wobei der erste nicht so chlimm ist.
Die Abfrage muss lauten: if Variable == Bedingung1 OR Variable == Bedingung2
Soll das Script nur laufen, wenn das Schiff ein M1 oder M2 ist?
Dann schreib es so:
Also, der Comp soll die nächste Zeile übersehen, wenn die Bedingungen oben zutreffen.
Oder, wenn nicht:
Damit wird das script beendet, wenn Zielstation nicht M1 oder M2 ist.
Klar?
Weiter:
Sorry, aber beides quatsch. (Net bös gmeint)
Was die Variable $Bestellstation ist hast du bei den "Arguments" schon festgelegt. Warum arbeitest du nicht weiter damit?
Und das Produkt einer Station bekommst du mit: aus den Handel>Stationen -Menue
Gut. Aber das wieder
Dieser Befehl fragt eigendlich das Volumen (also die Grösse) eines Stückes der Ware §Produkt ab.
Wenn du eine Anzahl (Menge) wissen willst benutz die "amount"-Befehle.
Wie diesen hier:
<RetVar/IF>Die abgefragte Menge. Diese Variable füllt sich wenn:
<RefObj> Das Objekt dessen Lagerinhalt:
<Var/Ware> einer bestimmten Ware abgefragt wurde.
Verständlich?
Super!
Gut. Aber was wenn nicht.
Besser wäre zu sagen: Wenn die Produktmenge kleiner ist als die Bestellmenge dann reduzier ich die Bestellmenge auf die Grösse der Produktmenge:
Und deinen Kauf tätigst du dann mit der Variable: §Bestellmenge
Damit kannst du dir das Sparen:
Ausserdem macht sich hier ein "skip" besser.
Also:
Beachte: Ich hab das < gegen ein > getauscht.
sorry, aber HÄ?
OK. Die Rechnung versteh ich ja noch. Obwohl es da besser ist
"$einzelpreis*$anzahl" in Klammern zu setzen (zur Sicherheit)
Aber wozu dient das "$lieferungInGang =1"
Du startest doch:
in einer if-then-Schleife.
Und davor:
lässt du das "else" einfach weg.
Code: Select all
Arguments
1: Bestellstation , Var/Station and Product , 'Bestellstation'
2: Bestellmenge , Nummer , 'Bestellmenge'
3: Zielstation , Var/Ship owned by Player , 'Ziel'
Code: Select all
001 if$Zielstation==Destroyer M2ORBattle Ship M1
Die Abfrage muss lauten: if Variable == Bedingung1 OR Variable == Bedingung2
Soll das Script nur laufen, wenn das Schiff ein M1 oder M2 ist?
Dann schreib es so:
Code: Select all
001 skip if $Zielstation==Destroyer M2OR$Zielstation==Battle Ship M1
Oder, wenn nicht:
Code: Select all
002 return null
Klar?
Weiter:
Code: Select all
002 $station =$Bestellstation[1]
003 $Produkt =$Bestellstation[0]
Was die Variable $Bestellstation ist hast du bei den "Arguments" schon festgelegt. Warum arbeitest du nicht weiter damit?
Und das Produkt einer Station bekommst du mit:
Code: Select all
<RetVar/IF> <RefObj> get product ware
Code: Select all
004 $geldmenge =get player money
Code: Select all
005 $produktmenge =get volume of ware$Produkt
Wenn du eine Anzahl (Menge) wissen willst benutz die "amount"-Befehle.
Wie diesen hier:
Code: Select all
<RetVar/IF> <RefObj> get amount of <Var/Ware> in cargo bay
<RefObj> Das Objekt dessen Lagerinhalt:
<Var/Ware> einer bestimmten Ware abgefragt wurde.
Verständlich?
Code: Select all
006 $einzelpreis =$station ->get price of ware$Produkt
Code: Select all
009 if$produktmenge<$Bestellmenge
010 $anzahl =$produktmenge
Besser wäre zu sagen: Wenn die Produktmenge kleiner ist als die Bestellmenge dann reduzier ich die Bestellmenge auf die Grösse der Produktmenge:
Code: Select all
009 if$produktmenge<$Bestellmenge
010 $Bestellmenge =$produktmenge
Damit kannst du dir das Sparen:
Code: Select all
012 if$Bestellmenge<$produktmenge
013 $anzahl =$Bestellmenge
Also:
Code: Select all
009 skip if$produktmenge>$Bestellmenge
010 $Bestellmenge =$produktmenge
Code: Select all
017 $endpreis =$einzelpreis*$anzahl+1500
018 if$geldmenge>$endpreis
019 $lieferungInGang =1
OK. Die Rechnung versteh ich ja noch. Obwohl es da besser ist
"$einzelpreis*$anzahl" in Klammern zu setzen (zur Sicherheit)
Aber wozu dient das "$lieferungInGang =1"
Du startest doch:
Code: Select all
020 @ =[THIS] ->call script'frachterholen.test':
Und davor:
Code: Select all
023 write to player logbook'Hier kann ich die Ware nicht abliefern.'
Solong, GothicK
-
- Posts: 39
- Joined: Fri, 30. Jan 04, 20:30
-
- Posts: 248
- Joined: Fri, 6. Feb 04, 14:47
Stimmt.
Ich mach mal weiter:
Du kannst im ersten Script folgendes aufrufen:
*Was auch immer. Suchs dir aus.
**In der Liste "race" steht nicht Player, sondern Julian. Aber du wolltest eh ne andere Rasse
***Hab ich ja schon erklährt
****Die Koord. Kannst du im selben script noch ermitteln.
Setz einfach wie du es schon hatest §y=§y+500. Das passt.
Weiter:
Funzt so leider nur, wenn er angedockt ist.
Machs anders. Starte:
und dann:
Und anschliessend wieder "move to station" nur diesmal als Ziel $Zielstation.
Dort kommt dann ein :
OK?
Ich mach mal weiter:
Stimmt. Eigendlich brauchst du das ganze Script nicht.Baruter wrote:und hier das andere, ich weis es sind vielzuviel argumente die ich nicht brauch
Du kannst im ersten Script folgendes aufrufen:
Code: Select all
$frachter = create ship: type=BoronTS* owner=player** addto=$environment*** x=0 y=0 z=0****
**In der Liste "race" steht nicht Player, sondern Julian. Aber du wolltest eh ne andere Rasse

***Hab ich ja schon erklährt
****Die Koord. Kannst du im selben script noch ermitteln.
Setz einfach wie du es schon hatest §y=§y+500. Das passt.
Weiter:
Code: Select all
009 =$frachter ->buy$anzahlunits of$produkt
Machs anders. Starte:
Code: Select all
@ = §frachter -> call script '!move.movetostation' : station=$Bestellstation
Code: Select all
<RetVar/IF> <RefObj> buy <Var/Number> units of <Var/Ware> to a max. price of <Var/Number> Cr
Dort kommt dann ein :
Code: Select all
<RetVar/IF> <RefObj> unload <Var/Number> units of <Var/Ware>
Solong, GothicK