Fabrikdaten

Hier ist der ideale Ort um über Scripts und Mods für X³: Terran Conflict und X³: Albion Prelude zu diskutieren.

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

User avatar
Generalwest
Posts: 2764
Joined: Thu, 31. May 07, 18:07
x4

Post by Generalwest »

okey :o wenn ich aber so ähnlich arbeiten würde, würde ich echt so um die 2.000 Zeilen pro script brauchen.

Ich hab ein Gegenvorschlag.

001 while [TRUE]
002 ~ @ = wait 20 ms
003 ~ $ware.arry = $stat -> get tradeable ware array from station
004 ~ $ware.size = size of array $ware.arry
005 ~ while $ware.size
006 ~~ dec $ware.size =
007 ~~ $ware = $ware.arry[$ware.size]
008 ~~ $amount = $stat -> get ware storage percentage: ware=$ware
009 ~~ if $amount <= 30
010 ~~~ $stat -> set intermediates sellable to [TRUE]
011 ~~ else
012 ~~~ $stat -> set intermediates sellable to [FALSE]
013 ~~~ break
014 ~~ end
015 ~~
016 ~ end
017 end
018 return null

Ich hab zwar nich getestet was das Script macht, allerdings ist das in etwa 5% von deinem.

ok zum Befehl tradeable ware arry from station solltest du dir ehrlich mal Gedanken machen wie das arbeitet. ich hab hier ne else, und kein skip if. skip if Version wäre dann so in etwa:

001 while [TRUE]
002 ~ @ = wait 20 ms
003 ~ $ware.arry = $stat -> get tradeable ware array from station
004 ~ $ware.size = size of array $ware.arry
005 ~ while $ware.size
006 ~~ dec $ware.size =
007 ~~ $ware = $ware.arry[$ware.size]
008 ~~ $amount = $stat -> get ware storage percentage: ware=$ware
009 ~~
010 ~~ skip if $amount <= 30
011 ~~~ $stat -> set intermediates sellable to [TRUE]
012 ~~
013 ~~ skip if not $amount <= 30
014 ~~~ $stat -> set intermediates sellable to [FALSE]
015 *break
016 ~ end
017 ~
018 end
019 *end
020 return null

das Problem bei skip if ist bei mir immer das man nur eine Zeile überspringen lassen kann.

irwie gefällt mir meine Version noch nicht richtig weil wenn der befehl von Zeile 12/ 10 so funktioniert wie ich denke wird das Script ständig die Option "Andere Völker dürfen hier kaufen" auf Ja und anschließend wieder auf nein stellen. also sollte man eventuell eine Loacal Var einbinden.

Eine Erweiterungsidee:

Du speicherst die Ware in der if abfrage von Zeile 10 beim oberen Beispiel, in einem Arry.

Anschließend Prüfst du nur das Arry ob die Waren Zwischenzeitlich wieder aufgefüllt wurden. Weitere Ideen, bzw das man nur bestimmte waren sperren kann weis / hab ich nicht. Ich persönlich hätte es gleich mit dem "Flieg zu Station & Komm wieder zurück" Teil verknüpft den auf die Art hab ich das ein wenig besser unter Kontrolle was man bei mir Kauft bzw Verkauft. Die Stationen sind idR auf "Dürfen andere Völker hier kaufen" auf "Nein" gestellt.

obwohl eine idee hätt ich schon wie man das machen kann:

als erstes nimmst du den Gegenvorschlag... und baust es so um:

001 while [TRUE]
002 ~ @ = wait 20 ms
003 ~
004 ~ $n = 0
005 ~
006 ~ $ware.arry = $stat -> get tradeable ware array from station
007 ~ $ware.size = size of array $ware.arry
008 ~ $s = $ware.size
009 ~ while $ware.size
010 ~~ dec $ware.size =
011 ~~ $ware = $ware.arry[$ware.size]
012 ~~ $amount = $stat -> get ware storage percentage: ware=$ware
013 ~~
014 ~~ skip if $amount >= 30
015 ~~~ inc $n =
016 ~ end
017 ~
018 ~ if $n == $s
019 ~~ $stat -> set intermediates sellable to [TRUE]
020 ~ else
021 ~~ $stat -> set intermediates sellable to [FALSE]
022 ~ end
023 end
024 return null

ob das dann aber auch hinhaut so musst du allein Rausfinden da meine Stationen alle Prope voll sind. Ich hoffe auch das $s = = $waren.size entspricht, weil wenn man die size am ende einer auslese schleife nimmt ist die var 0 ^^ und alles damit hinfällig, ob sich x³ so überlisten lässt wird sich zeigen. wenn nicht würde ich die size Zeile nochmal kopieren und $s get size of arry $waren.arry draus machen dann hast du eben zweimal den befehl get size of arry.
Alewx
Posts: 303
Joined: Sun, 23. Mar 03, 11:09
x4

Post by Alewx »

Ähm ich glaub meine TP und C kentnisse sind inzwischen so eingerostet ich brauch noch ein bisschen bis ich aus deinen kurzen Scripts wirklich alles erkannt habe.

bei mir ist es ja der fall das überprüft wird ob es sich um ein endprodukt handelt oder nicht. Wenn es ein Endprodukt ist soll er es ignorieren. ansonsten überprüft er ob die ware beim Komplex mit recht großem lagerraum zu 10% vorhanden ist. wenn nicht soll der handel an andere völker eingestellt werden ist mehr da soll wieder freigegeben werden. und dauer test hab ich mit meinem script auch noch nicht gemacht muss ich auch nochmal versuchen und deines auch.

klar das ist sicher einfacher zu handhaben wenn man den kauf und verkauf komplett über schiffe regelt aber so ist es vielleicht ja auch etwas neues für die Community.
User avatar
Generalwest
Posts: 2764
Joined: Thu, 31. May 07, 18:07
x4

Post by Generalwest »

naja in einem Komplex hat man auch zwischen Produkte, die vermutlich von der Engien als Produkte geführt werden. Es ist möglich zu Prüfen ob die Ware ein Produkt, eine Primär bzw Sekundär "Rohstoff" ist; Wie X die Zwischenprodukte handhabt ist mir momentan schleierhaft.

<RetVar/IF> <RefObj> uses ware <Var/Ware> as product
<RetVar/IF> <RefObj> uses ware <Var/Ware> as primary resource
<RetVar/IF> <RefObj> uses ware <Var/Ware> as secondary resource
Alewx
Posts: 303
Joined: Sun, 23. Mar 03, 11:09
x4

Post by Alewx »

Ok ich hab da nochmal eine Frage an unsere Profi-Scripter.

ich benutze nun den befehlt

Code: Select all

015   ||$Ziel =  find station: resource $Ware with best price depend on jumps: min.price=null, amount=null, max.jumps=$Range, startsector=$Sector, trader=null, exclude array=null
Hab den Befehl gefunden ich seh den Wald vor bäumen nicht kann ich nur sagen.

aber dennoch fehlt mir nun irgenwie der richtige dateityp für den sector einer Basis. (mal sehen finde ich bestimmt auch noch)
Ja das Problem habe ich nun auch gelöst sicher etwas umständlich aber scheint zu funktionieren.

bleibt am ende noch die frage gibts die chance irgendwie das meine scripts nicht mehr als global tasks auftauchen oder ist das so weil sie redundant sind?
User avatar
Generalwest
Posts: 2764
Joined: Thu, 31. May 07, 18:07
x4

Post by Generalwest »

sorry red und wat?


global Scripts laufen auf dem Universum, Sektor bzw was auch immer
local scripts laufen auf Objekten bzw Objektträger. Beispielsweise:
"START [THIS] -> call script xxx and prio=" dabei ist zu beachten das [THIS] ein Objekt ist. [THIS] wird idR meist bei Kommandokonsolen Scripten genutzt wie beispiel das "Docke an...". Wenn du´s zum testen per SE auf rufst geht das wenn du nach dem "r" Befehl das Objekt auswählst und nicht "null". Es gibt auch noch interupt script calls.

bei Stationen ist das in TC komplizierter geworden da die local Scripts Hardcode immer wieder Beendet werden bei bestimmten Usereinflüssen, beispielsweise wenn man eine Fab in einen Komplex einbindet. Das war in X³R anders und meiner Ansicht nach besser.

Da du es auf einer Station laufen lassen willst (ich geh jetzt einfach mal vom obigen Beispiel aus) empfiehlt es sich, es nur auf Komplex Hubs laufen zu lassen. Find Station ist eigentlich mehr der Transporter Part und wird aller Voraussicht nur mit dem TS Haupttask sinnvoll sein da das Schiff ja "Ferngesteuert" fliegen bzw zu den Stationen schippern soll.
Alewx
Posts: 303
Joined: Sun, 23. Mar 03, 11:09
x4

Post by Alewx »

Redundant spricht es überprüft immer wieder und wieder und wieder bis es tot ist. (Verkehrsflugzeuge haben 3fach redundante Bordcomputer ein SpaceShuttle 7fach redundante Systeme)


Ja hab nun langsam gemerkt das es mit der Station nicht klappen kann weil sobald eines der Produkte über den Prozentsatz rüber kommt wird der Handel für alle Waren freigegeben und das ist nicht so ganz sinnig also gehe ich nun doch zur Frachtervariante über und hab da auch ein Script das scheinbar funktioniert, aber nur scheinbar. Dennr immer wenn das Schiff auf dem das Script läuft in einen Sektor kommt in dem ich schon bin friert es den Rechner tot.
Hab auch so manche probleme schon selbst darin gefunden.

Code: Select all

Arguments
1: Frachter , Var/Ship , 'Frachter' 
2: ZielstationProdukt , Var/Station and Product , 'Station und Produkt wählen' 
Source Text

001   $Produkt = $ZielstationProdukt[0]
002   $ZielStation = $ZielstationProdukt[1]
003   $Heimat = $Frachter -> get homebase
004   
005   while [TRUE]
006   |$Prozent = $Heimat -> get ware storage percentage: ware=$Produkt
007   |$MaxMenge = $Frachter -> get max amount of ware $Produkt that can be stored in cargo bay
008   |while $Prozent <= 50
009 @ ||= $Frachter -> fly to station $ZielStation
010 @ ||= wait 1000 ms
011   ||= $Frachter -> buy $MaxMenge units of $Produkt
012   ||
013 @ ||= $Frachter -> fly to station $Heimat
014   ||$MengeVorhanden = $Frachter -> get amount of ware $Produkt in cargo bay
015   ||= $Frachter -> unload $MengeVorhanden units of $Produkt
016   ||$MengeRest = $Frachter -> get amount of ware $Produkt in cargo bay
017   ||while $MengeRest != 0
018   |||$MengeVorhanden = $Frachter -> get amount of ware $Produkt in cargo bay
019   |||= $Frachter -> unload $MengeVorhanden units of $Produkt
020   |||$MengeRest = $Frachter -> get amount of ware $Produkt in cargo bay
021 @ |||= wait 1000 ms
022   ||end
023 @ ||= wait 1000 ms
024   |end
025   end
026   return null
Wäre erstmal gut zu wissen wie es anstellbar ist das nicht gleich immer der Pc ex geht wenn ich so ein Schiff treffe.
User avatar
Generalwest
Posts: 2764
Joined: Thu, 31. May 07, 18:07
x4

Post by Generalwest »

Zu aller erst ein wait in die Endlosschleife von Zeile 005 packen (bestenfalls Zeile 006 ^^) Beispielsweise so:

005 while [TRUE]
006 @ |= wait 10000 ms

Zeile 009 - 011 bzw 013 - 015 oder wo auch immer umbaun in etwaiiges schema.

031 ||||while [TRUE]
032 @ |||||= wait 1000 ms
033 @ |||||= [THIS] -> fly to station $stat
034 |||||if [THIS] -> is docked
035 ||||||break
036 |||||end
037 ||||end

mann kann auch while [THIS] fly to station machen allerdings hab ich bei den Codes immer Probleme das die Schiffe dann überhaupt mehrfach was tun. Irwie komisch war aber in R auch schon so.

Beim rest ists so das du dir erst den Laderaum voll haust und dann immer wieder auslädst, wenn ich das richtig überflogen habe. Irgendwie ist das ein Fab Gruppen Importer wenn du das so machst, allerdings könntest du auch automatisch bzw autonom die Fabs suchen und anfliegen lassen. Tradable ware arry erledigt den bedarf und wenn du es mit einem Kommando einhängst, brauchst du gar kein Argument mehr da du get hombase verwendest.
Alewx
Posts: 303
Joined: Sun, 23. Mar 03, 11:09
x4

Post by Alewx »

Also meines Wissens nach unterbricht doch nein Break den kompletten ablauf von etwas?

Deswegen erschließt sich mir nun die schleife bei dir mit den zeilen 31-37 nicht ganz. Nur das wenn das Schiff gedockt ist eine Unterbrechung rein haust.
User avatar
Generalwest
Posts: 2764
Joined: Thu, 31. May 07, 18:07
x4

Post by Generalwest »

wie du hab ich das in einer globalen while lafen. Wenn du mit dem fly befehl so arbeitest wird er zu 99 % immer nur ein frame zur Station fliegen, versuchen was in den Laderaum zu haun und dann wieder versuchtn was auszuladen. Und das ständig was dann ähnlich aussieht als ob das ding da hinfliegt.

brake unterbricht die fly schleife nur wenn er angedockt hat. danach soll er ein bzw ausladen. Was so ja eigentlich sein sollte.

Der komplette Ablauf währe dann das fly while. Das brak in dem Flywhile unterbricht das Flywhile nicht alles.
Alewx
Posts: 303
Joined: Sun, 23. Mar 03, 11:09
x4

Post by Alewx »

Ok wenn du das so sagst als Erfahrener weil hab es mal so um die 2 stunden auf 24 frachtern laufen lassen, ohne das es probleme gab. also werde ich das mal entsprechend anpassen. Meine Frage wie lang ist dann die unterbrechung durch das break?


und damit das ganze mal wieder auf eine Fabrik zurück kommt dann noch mal ein anderes Script von mir das nur dafür sorgen soll das man mir die bude nicht ständig leer kauft.

Code: Select all

Arguments
Source Text

001   $MaxPreis = get max price of ware Kristalle
002   
003   while [TRUE]
004   |$station =  find station: sector=null class or type=Argonen Kristallfabrik M race=Player flags=null refobj=null maxdist=null maxnum=null refpos=null
005   |$NormalPreis = $station -> get price of ware Kristalle
006   |
007   |$MengeDa = $station -> get ware storage percentage: ware=Kristalle
008   |while $MengeDa < 25
009   ||$station -> set price of ware Kristalle to $MaxPreis Cr
010   |end
011   |while $MengeDa >= 25
012   ||$station -> set price of ware Kristalle to $NormalPreis Cr
013   |end
014 @ |= wait 100 ms
015   end
016   return null
Vom gedanken her sicher klar was passieren soll aber er ändert nichts an den Stationseinstellungen.
User avatar
Generalwest
Posts: 2764
Joined: Thu, 31. May 07, 18:07
x4

Post by Generalwest »

008 |while $MengeDa < 25
009 ||$station -> set price of ware Kristalle to $MaxPreis Cr
010 |end

ab dem Zeitpunkt wo das Script an der Stelle ist macht es nur noch das.

das gleiche ists bei den anderen Schleifen weil $MengeDa nicht mehr aktuallisiert wird bleibt es für das Script immer das selbe
zusätzlich enthält $Menga Da einen Zahlenwert das würde für das aktuelle Beispiel bedeuten:


Stationsvorat = 20000

while 20000 ohne dec = $mengada (also die Reduktion der Variablen $mengeda um den Zahlenwert 1 ) kommt am ende While TRUE raus. da es immer 20.000 sein werden und nie verändert werden.

am besten du baust das script ein wenig um eventuell so:

$Max Preis
$Min Preis
$normal Preis (da es feste konstanten sind die nur mit modmitteln verändert werden können ist eine Aktualisierung der variablen nicht erforderlich)

while TRUE
wait 1000 ms (1 Sec ist durchaus ausreichend würde auch alle 5 Sec tun dann frist das Script nicht so viel CPU Leistung)

$station ersetzen mit einer find station class or type + einer owner abfrage if "owner" == Player.

$amount.global -> get amount of ware

skip if $amount.global > 25 AND $amount.global < 70
set price.... to $Normalprice

skip if $amount.global
...
end

skip if ist hier etwas schwer zu definieren für mich, da er´s ja überspringen soll wenn der angegebene zustand wahr ist, man spart sich aber dann das end. kommen aber mindestens zwei zeilen nach der Abfrage sollte / muss mans mit if machen das ist dann auch einfacher zu definieren.

wie:

if $amount.global < 25
|set price ... $Max Price
end

if (möglich ist auch else if allerdings arbeite ich mit else if nicht gern und mir ist deswegen auch schon manches script abgeschmiert) $amount.global >= 25 AND amount.global < 70
|set price...$Normal.Price
end

if amount.global > 70
|..$Minprice
end

wie lang die Unterbrechung andauert? Oo im obigen beispiel wird nur die fly while "gebrochen" und so bald das Script unten angekommen ist und sich zu der Zeile vorgearbeitet hat, startet die neue fly while. das Script arbeitet sich sozusagen von oben nach unten durch. Normalerweise läuft ein brake in einem Frame.
User avatar
Gazz
Posts: 13244
Joined: Fri, 13. Jan 06, 16:39
x4

Post by Gazz »

Generalwest wrote:skip if ist hier etwas schwer zu definieren für mich, da er´s ja überspringen soll wenn der angegebene zustand wahr ist
Ich benutze Skip if recht gerne aber Skip If Not habe ich per TFile umbenannt in Do If.
Liest sich leichter. =)

Die Befehle sind ja nicht in Stein gemeißelt. Wenn ich beim Lesen zu oft um die Ecke denken muß dann wird der Befehl einfach umbenannt und feddich.
Last edited by Gazz on Fri, 30. Jan 09, 15:40, edited 1 time in total.
My complete script download page. . . . . . I AM THE LAW!
There is no sense crying over every mistake. You just keep on trying till you run out of cake.
User avatar
Generalwest
Posts: 2764
Joined: Thu, 31. May 07, 18:07
x4

Post by Generalwest »

ich nutze auch gern skip if da man nicht mit den schleifen ends kollidiert. setzt man das end an der falschen stelle bei grösseren Projekten funktioniert gar nichts mehr und der TS will einfach nur noch zu den Xenon :) deswegen schlag ich´s immer vor.
User avatar
Gazz
Posts: 13244
Joined: Fri, 13. Jan 06, 16:39
x4

Post by Gazz »

Wenn man zuviele Ends einspart aber mit Skip/Goto arbeitet wirds schnell gruselig. =P
My complete script download page. . . . . . I AM THE LAW!
There is no sense crying over every mistake. You just keep on trying till you run out of cake.
Alewx
Posts: 303
Joined: Sun, 23. Mar 03, 11:09
x4

Post by Alewx »

Hmm ja ok aber woher beziehst du denn die $MaxPreis, $MinPreis und $NormalPreis?? so aus der sicht wären es ja dann festlegbare argumente, seh ich das so richtig?


ich dachte aber das while [true] sorgt dafür das es immer wieder geprüft wird weil halt true kein vergleich ist mit etwas.

ab er ok baue ich nach dem essen mal um.
User avatar
Generalwest
Posts: 2764
Joined: Thu, 31. May 07, 18:07
x4

Post by Generalwest »

Gazz wrote:Wenn man zuviele Ends einspart aber mit Skip/Goto arbeitet wirds schnell gruselig. =P


gruslig ists meiner Ansicht nach nur zum lesen und definieren :) vieles kann man aber nicht mit skip if bewerkstelligen, dann kommen auch bei mir ifs zum Einsatz bzw if not (eigentlich nur bei global / loacal var abfragen als if Bedingung) weil null als wert mir nicht geheuer scheint.

eine schleife (while) wird nur ausgeführt wenn,s TRUE ist. setz ich den wert TRUE als Argument dann ists eine Dauerschleife solange bis der befehl continue (nutz ich nicht weil ich eigentlich immer wenn ichs einsetz ein cdt bekomme) oder bis ein brake kommt. das brake bricht auch nur die aktive schleife,

bau ich aber eine Schleife die nur 5 mal laufen soll, kommt while $variabledie5enthält und ein dec = $variabledie5enthält. ist while 0 bzw dann null ist die Schleifen abfrage false. (gilt im allgemeinen c++ / java / javascript) fehlt nun dieses dec = ist die variable immer 5 und die schleife läuft dann immer "5 mal durch" da die variable nicht auf 4 gesetzt wird. genau das gleiche währe es wenn ich anstatt dec =, inc = nehme. dann wird die schleifen anzahl immer wieder erhöht bis zu Overflow. was dann x3 mit macht hab ich aber noch nicht getestet.

Naja ich erschreck mich immer das mich niemand berichtigt ^^

anders ists bei while not. Dann wird nur die schleife ausgeführt wenn´s False bzw unwahr ist. Setz ich aber idR nicht ein.
UniTrader
Moderator (Script&Mod)
Moderator (Script&Mod)
Posts: 14571
Joined: Sun, 20. Nov 05, 22:45
x4

Post by UniTrader »

Generalwest wrote:bau ich aber eine Schleife die nur 5 mal laufen soll, kommt while $variabledie5enthält und ein dec = $variabledie5enthält. ist while 0 bzw dann null ist die Schleifen abfrage false. (gilt im allgemeinen c++ / java / javascript) fehlt nun dieses dec = ist die variable immer 5 und die schleife läuft dann immer "5 mal durch" da die variable nicht auf 4 gesetzt wird. genau das gleiche währe es wenn ich anstatt dec =, inc = nehme. dann wird die schleifen anzahl immer wieder erhöht bis zu Overflow. was dann x3 mit macht hab ich aber noch nicht getestet.
bei etwas über 2 Milliarden gehts bei MINUS 2 Milliarden weiter bis der Zähler bei 0 ankommt... denn negative Zahlen sind für X3 auch wahr ^^
if not stated otherwise everything i post is licensed under WTFPL

Ich mache keine S&M-Auftragsarbeiten, aber wenn es fragen gibt wie man etwas umsetzen kann helfe ich gerne weiter ;)

I wont do Script&Mod Request work, but if there are questions how to do something i will GLaDly help ;)
Alewx
Posts: 303
Joined: Sun, 23. Mar 03, 11:09
x4

Post by Alewx »

Hmm also hab mal etwas umgebaut aber irgendwie scheint nichts zu passieren. denn wenn das Script den Preis ändert müsste ich das doch bei den Besitztümern im Preis sehen können. da passiert aber nichts, demnach hauts nicht hin. (leicht verzweifel).

Code: Select all

Arguments
Source Text

001   while [TRUE]
002 @ |= wait 5000 ms
003   |$Station =  find station: sector=null class or type=Argonen Kristallfabrik M race=null flags=null refobj=null maxdist=null maxnum=null refpos=null
004   |if [OWNER] == Player
005   ||
006   ||$MaxPreis = $Station -> get price of ware Kristalle
007   ||$NormalPreis = $MaxPreis - ( $MaxPreis * 5 / 100 )
008   ||$MinPreis = $MaxPreis - ( $MaxPreis * 10 / 100 )
009   ||
010   ||$WarenMenge = $Station -> get ware storage percentage: ware=Kristalle
011   ||if $WarenMenge <= 33
012   |||$Station -> set price of ware Kristalle to $MinPreis Cr
013   |||$WarenMenge = $Station -> get ware storage percentage: ware=Kristalle
014   ||end
015   ||
016   ||if $WarenMenge < 66 AND $WarenMenge > 33
017   |||$Station -> set price of ware Kristalle to $NormalPreis Cr
018   |||$WarenMenge = $Station -> get ware storage percentage: ware=Kristalle
019   ||end
020   ||
021   ||if $WarenMenge >= 66
022   |||$Station -> set price of ware Kristalle to $MaxPreis Cr
023   |||$WarenMenge = $Station -> get ware storage percentage: ware=Kristalle
024   ||end
025   |end
026   |$WarenMenge = $Station -> get ware storage percentage: ware=Kristalle
027   end
028   return null
Klar ich könnte das so machen das es über ein Argument geregelt ist welche Station so die Preise anpassen soll. Aber das wäre lästig dann ist irgendwann die Globalscript liste extrem überfüllt bei mehreren Stationen. Deswegen werde ich auch wohl Morgen Abend oder Sonntag mal gucken und nachhacken wie ich mein Script noch in die Handels/Sonstigen Befehle einarbeiten kann.

edit:
So sieht es dann aus wenn ich das über ein Argument regel.

Code: Select all

Arguments
1: ZielStation , Var/Station and Product , 'Station und Produkt wählen' 
Source Text

001   $Ware = $ZielStation[0]
002   $Station = $ZielStation[1]
003   $NormalPreis = $Station -> get price of ware $Ware
004   $MaxPreis = $NormalPreis + ( $NormalPreis * 10 / 100 )
005   $MinPreis = $NormalPreis - ( $NormalPreis * 10 / 100 )
006   
007   while [TRUE]
008 @ |= wait 5000 ms
009   |$WarenMenge = $Station -> get ware storage percentage: ware=$Ware
010   |if $WarenMenge <= 33
011   ||$Station -> set price of ware $Ware to $MaxPreis Cr
012   |end
013   |
014   |if $WarenMenge < 66 AND $WarenMenge > 33
015   ||$Station -> set price of ware $Ware to $NormalPreis Cr
016   |end
017   |
018   |if $WarenMenge >= 66
019   ||$Station -> set price of ware $Ware to $MinPreis Cr
020   |end
021   end
022   return null
man könnte das Produkt ja noch aufteilen in beides einzeln
so das es von einem anderen Script übergeben wird das es gleich mehrfach nutzbar wird, in dem wird dann ein

Code: Select all

||$Ziel =  find station: product $Ware with best price depend on jumps: max.price=null, amount=null, max.jumps=null, startsector=null, trader=null, exclude array=null
problem bleibt dann aber immernoch der sektor so wie ich mir das denke
User avatar
Generalwest
Posts: 2764
Joined: Thu, 31. May 07, 18:07
x4

Post by Generalwest »

ob $Station null ist? sektor=null macht mir arge Bauschmerzen.

selbst wenn $Station mit sektor= null geht, kommt immer noch ein Arry raus, vorausgesetzt es sind mehr als eine Kristalfab in deinem Besitz. Ist nur eine in deinem Besitz würde es theoretisch auch mit einer Arry auslese Schleife gehen. Bin mir da aber nicht sicher, deshalb hab ich vorgeschlagen mit diesem befehl <RetVar> = get station array: of race=<Var/Race> class/type=<Value> da weiß man sicher was zurückkommt und wie man´s in X³ verarbeiten kann.

Wenn die Station als Arry zurückgegeben wird, kann X³ die Var (eigentlich ein Arry) nicht verarbeiten und fällt damit eigentlich komplett aus somit geht der Bezug auf die Station verloren und set price wird irgendwo ausgeführt.

einbinden kannst du Kommandos so:

008 *set script command upgrade: command=COMMAND_TYPE_STATION_SelfDestruct_Station upgrade=[TRUE]
009 *global script map: set: key=COMMAND_TYPE_STATION_SelfDestruct_Station, class=Station, race=Player, script=aaaaaaaaaaaaaaaaaaaselfdestruckt, prio=500 (naja auskommentieren wegdenken :roll: ) mit global script map: ignore kann man der engien sagen auf welchen Schiffen / Objekten das Scriptkommando nicht angezeigt werden soll / darf (Beispielsweise Kampfdrohnen)

mit 006 set script command upgrade: command=$comand.one upgrade=[TRUE] script='plugin.eate.warenprfung'

kann man auf bestimmte waren geprüft werden die anbord sein müssen. Dabei würde ich immer noch gerne wissen wie man es komplett ausblenden kann. in der maxhawk MSCI Bef.Ref gibt es eine etwaiige Aufstellung welche Konstante was bewirkt.

edit zu deinem edit: Oben haben wir ja bereits rausgefunden das "Arguments
1: ZielStation , Var/Station and Product , 'Station und Produkt wählen'" ein Arry ergibt, also solltest du es auch wie eins behandeln.

||$Ziel = find station: product $Ware with best price depend on jumps: max.price=null, amount=null, max.jumps=null, startsector=null, trader=null, exclude array=null

- startsektor für die suche ist "null"? kann schlecht funktionieren. Trader ist der Händler / Marchant oder wie sich das ding nennt.
- amount ist wieviel auf der station frei sein muss
- max pris ist der maximale preis den die station verlangen darf bevor sie ignoriert wird.
und ausser dem ist das mehr ein befehl für einen Einkäufer.

PS: Ich hab das set sellbabl script noch etwas modifiziert und so geht es halbwegs. Allerdings kann man nur den Verkauf von Sekundär Produkten steuern, und nicht alle waren. Wenn das dein Gedanke war dann funzt das so:

001 while [TRUE]
002 ~ @ = wait 20 ms
003 ~
004 ~ $n = 0
005 ~
006 ~ $ware.arry = $stat -> get tradeable ware array from station
007 ~ $ware.size = size of array $ware.arry
008 ~ $s = $ware.size
009 ~ while $ware.size
010 ~~ dec $ware.size =
011 ~~ $ware = $ware.arry[$ware.size]
012 ~~ $amount = $stat -> get ware storage percentage: ware=$ware
013 ~~
014 ~~ skip if $amount >= 90
015 ~~~ inc $n =
016 ~ end
017 ~
018 ~
019 ~ if $n == $s
020 ~~ $stat -> set intermediates sellable to [TRUE]
021 ~ else
022 ~~ $stat -> set intermediates sellable to [FALSE]
023 ~~
024 ~ end
025 end
026 return null

sobald eine Ware unter 90 prozent Fällt (was man in Zeile 014 ändern kann) setzt es den Verkauf aus. Wenn man mal kauf & Verkauf hatte schaltet das Script automatisch auf Kauf und wieder zurück auf Kauf & Verkauf wenn alle Waren wieder über 90 % sind.

Imo weis ich auch nicht wie man den "Andere Völker dürcfen hier kaufen" menüpunkt auf "Nein" stellen kann per script den den betreffenden "set" befehl hab ich nicht gefunden. Gibts den Überhaupt weis das einer?
Alewx
Posts: 303
Joined: Sun, 23. Mar 03, 11:09
x4

Post by Alewx »

Bin mir da aber nicht sicher, deshalb hab ich vorgeschlagen mit diesem befehl <RetVar> = get station array: of race=<Var/Race> class/type=<Value> da weiß man sicher was zurückkommt und wie man´s in X³ verarbeiten kann.
Ok hab ich nun gefunden und mal ausgelesen und festgestellt er sammelt wirkliche alle Stationen ein auch die die in einem Komplex sind, aber daran kann ich mich versuchen. das sollte möglich sein.

Ach und beinahe vergessen den Eintrag für fremde völker gibts wohl nicht selbst, hab auch nur die Zwischenprodukte gefunden oder halt das man ausliest ob ein objekt bei einem anderen kaufen darf aber Völker recht gibts wohl so nicht zum festlege.


Was das Selling-Script für Zwischenprodukte angeht welche Argumente nutzt du denn da?

und was hat es mit dem inc<variable> und dem dec<variable> auf sich das dec kommt ja sicher von einem declare und legt eine variable fest. aber inc sagt mir mal nix.

Und beim Command_Type_Station hat das Kind von dir ja noch einen Namen bekommen wie schafft man das denn?

und dann ist noch die Frage wie ich die Namen vergebe für die Commandos das es nicht heißt Fremd und was heißt das
ReadText2010-700 [ReadText2011-700]
??

Das ich dann einen Script anlege wo ich die Commands alle festlege mit ihren Scripts, und das der Script im Namen an erster Stelle ein ! haben muss das hab ich mir schon gemerkt damit es immer geladen wird auch ohne das es maneuell im script Editor Gestartet wird.

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