Wie funktioniert das create.ship genau?

Hier ist der ideale Ort um über Scripts und Mods für X²: Die Bedrohung zu diskutieren.

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

Baruter
Posts: 39
Joined: Fri, 30. Jan 04, 20:30
x2

Wie funktioniert das create.ship genau?

Post by Baruter »

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.
User avatar
GothicK
Posts: 248
Joined: Fri, 6. Feb 04, 14:47
x3tc

Post by GothicK »

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:

Code: Select all

 <RetVar> = create ship: type=<Var/Ship Type> owner=<Var/Race> addto=<Value> x=<Var/Number> y=<Var/Number> z=<Var/Number>
<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:

Code: Select all

 <RetVar> = <RefObj>get y position
<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

Code: Select all

<RetVar/IF><Expression>
veränderst.
Z.B: $y = $y + 100
Das sind 100 Meter von der Y-Achse der Station.

Noch Fragen? Her damit.
Solong, GothicK
Baruter
Posts: 39
Joined: Fri, 30. Jan 04, 20:30
x2

Post by Baruter »

Danke, werde ich gleich mal probieren.
Mit den koordinaten habe ich schon herausgefunden. Nur mit dem "addto" musste ich nicht so richtig was anzufangen.
User avatar
GothicK
Posts: 248
Joined: Fri, 6. Feb 04, 14:47
x3tc

Post by GothicK »

addto setzt die Homebase. Oder halt den Sektor als HB.
Solong, GothicK
Baruter
Posts: 39
Joined: Fri, 30. Jan 04, 20:30
x2

Post by Baruter »

Es funktioniert.
:D
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.
User avatar
GothicK
Posts: 248
Joined: Fri, 6. Feb 04, 14:47
x3tc

Post by GothicK »

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
Baruter
Posts: 39
Joined: Fri, 30. Jan 04, 20:30
x2

Post by Baruter »

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
Baruter
Posts: 39
Joined: Fri, 30. Jan 04, 20:30
x2

Post by Baruter »

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
User avatar
GothicK
Posts: 248
Joined: Fri, 6. Feb 04, 14:47
x3tc

Post by GothicK »

Zum ersten:

Code: Select all

Arguments
1: Bestellstation , Var/Station and Product , 'Bestellstation' 
2: Bestellmenge , Nummer , 'Bestellmenge' 
3: Zielstation , Var/Ship owned by Player , 'Ziel' 
Willst du an ein Schiff liefern lassen? OK. Warum nicht.

Code: Select all

001   if$Zielstation==Destroyer M2ORBattle Ship M1
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:

Code: Select all

001 skip if $Zielstation==Destroyer M2OR$Zielstation==Battle Ship M1
Also, der Comp soll die nächste Zeile übersehen, wenn die Bedingungen oben zutreffen.
Oder, wenn nicht:

Code: Select all

002  return null
Damit wird das script beendet, wenn Zielstation nicht M1 oder M2 ist.
Klar?

Weiter:

Code: Select all

002   $station =$Bestellstation[1]
003   $Produkt =$Bestellstation[0]
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:

Code: Select all

<RetVar/IF> <RefObj> get product ware
aus den Handel>Stationen -Menue

Code: Select all

004   $geldmenge =get player money
Gut. Aber das wieder

Code: Select all

005   $produktmenge =get volume of ware$Produkt
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:

Code: Select all

<RetVar/IF> <RefObj> get amount of <Var/Ware> in cargo bay
<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?

Code: Select all

006   $einzelpreis =$station ->get price of ware$Produkt
Super!

Code: Select all

009   if$produktmenge<$Bestellmenge
010   $anzahl =$produktmenge
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:

Code: Select all

 009   if$produktmenge<$Bestellmenge
010   $Bestellmenge =$produktmenge
Und deinen Kauf tätigst du dann mit der Variable: §Bestellmenge
Damit kannst du dir das Sparen:

Code: Select all

012   if$Bestellmenge<$produktmenge
013   $anzahl =$Bestellmenge
Ausserdem macht sich hier ein "skip" besser.
Also:

Code: Select all

 009   skip if$produktmenge>$Bestellmenge
010   $Bestellmenge =$produktmenge
Beachte: Ich hab das < gegen ein > getauscht.

Code: Select all

017   $endpreis =$einzelpreis*$anzahl+1500
018   if$geldmenge>$endpreis
019   $lieferungInGang =1
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:

Code: Select all

020 @ =[THIS] ->call script'frachterholen.test':
in einer if-then-Schleife.
Und davor:

Code: Select all

023   write to player logbook'Hier kann ich die Ware nicht abliefern.'
lässt du das "else" einfach weg.
Solong, GothicK
Baruter
Posts: 39
Joined: Fri, 30. Jan 04, 20:30
x2

Post by Baruter »

Ok, werde am nbesten nochmal neu schreiben. Aus fehlern lernt man :)

Das lieferungInGAng ist noch ein überbleibsel vom ersten anlauf. dort sollte geregelt werden das man warten muss bis der frachter seine Arbeit gemacht hat
User avatar
GothicK
Posts: 248
Joined: Fri, 6. Feb 04, 14:47
x3tc

Post by GothicK »

Stimmt.
Ich mach mal weiter:
Baruter wrote:und hier das andere, ich weis es sind vielzuviel argumente die ich nicht brauch
Stimmt. Eigendlich brauchst du das ganze Script nicht.

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****
*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:

Code: Select all

009 =$frachter ->buy$anzahlunits of$produkt
Funzt so leider nur, wenn er angedockt ist.

Machs anders. Starte:

Code: Select all

 @   = §frachter -> call script '!move.movetostation' :  station=$Bestellstation
und dann:

Code: Select all

<RetVar/IF> <RefObj> buy <Var/Number> units of <Var/Ware> to a max. price of <Var/Number> Cr
Und anschliessend wieder "move to station" nur diesmal als Ziel $Zielstation.
Dort kommt dann ein :

Code: Select all

 <RetVar/IF> <RefObj> unload <Var/Number> units of <Var/Ware>
OK?
Solong, GothicK

Return to “X²: Die Bedrohung - Scripts und Modding”