Schiff scripten nach bestimmter Zeit

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

Anubis 358
Posts: 180
Joined: Wed, 20. Aug 08, 16:14
x4

Schiff scripten nach bestimmter Zeit

Post by Anubis 358 »

Hi leuts,
wollte ma wissen ob man ein script schreiben kann bei dessen aktivierung ein schiff nach ca 5 Ingame Tagen gespawnt wird und wenn ja wie... also ich bräuchte nur die commandozeile(weiß net ob des die rcihtige ebschreibung dafür is)in der man die zeit einstellt

gruß Anubis
Gazz wrote:Piloten von Khaak Kleinschiffen steigen genauso aus wie die anderer Rassen.
Ihr Schleudersitz ist nur schlechter konstruiert.
Gazz wrote:Weder in Reunion noch in TC gibts ein M0.
Planeten zu zerstören ist offenbar aus der Mode gekommen.
User avatar
SymTec ltd.
Posts: 5285
Joined: Mon, 11. Apr 05, 21:11
x3tc

Post by SymTec ltd. »

Ja, kann man. Zum Beispiel:

Code: Select all

$minutes = get user input: type=Integer title="Bitte Zeit in Minuten eingeben"
while $minutes > 0
  dec $minutes
  $seconds = 60
  while $seconds > 0
    dec $seconds
@   =wait 1000 ms
  end
end

$ship = create ship: type=Argon Buster sector=Argon Prime x=0 y=0 z=0 owner=Player
$ship : add default wares to ship
$ship : install 2 units of 5MJ shield

return null
Das geht natürlich auch mit Stunden als input (dann $minutes = 60 * $stunden), oder auch mit Stunden oder Minuten als Argument (also nicht den Spieler fragen, sondern Zeit direkt ans Script übergeben).

Die ganzen while-Schleifen (statt eines einzelnen langen waits) sind sinnvoll, weil unter bestimmten Bedingungen ein Wait auch mal abgebrochen wird, und dann ist es besser wenn dabei nur eine Sekunde übersprungen wird, und nicht gleich die gesamte Wartezeit.
User avatar
Sir Squallus
Posts: 691
Joined: Thu, 10. May 07, 17:45
x4

Post by Sir Squallus »

:o :gruebel: Hmm irgendwie verstehe ich nicht ganz wie dieses skript funktioniert, also dec zahlt bei jedem durchlauf 1 runter aber wie das ganze dan funktioniert verstehe ich nicht ganz, bitte kannst du das ganze genauer erklähren, ich könnte solche timer bei einigen funktionen brauchen, und da bin ich sicher nicht alleine
User avatar
Generalwest
Posts: 2764
Joined: Thu, 31. May 07, 18:07
x4

Post by Generalwest »

SymTec ltd. wrote:

Code: Select all

$minutes = get user input: type=Integer title="Bitte Zeit in Minuten eingeben"
while $minutes > 0
  dec $minutes
  $seconds = 60
  while $seconds > 0
    dec $seconds
@   =wait 1000 ms
  end
end

$ship = create ship: type=Argon Buster sector=Argon Prime x=0 y=0 z=0 owner=Player
$ship : add default wares to ship
$ship : install 2 units of 5MJ shield

return null
ist eigentlich ganz simpel.

die schleife in Zeile 2 wird eingeleitet mit der Variablen $minutes die mit Zeile 1 Definiert wird. Ersetzt man das ganze dann durch 40 waitet das script 40 Minuten (pro Schleifendurchlauf 1 Min.)

Zeile 2: ist der Schleifen befehl + eine Abfrage ob Variable $minutes grösser als 0 ist. Lässt man das weg verlängert sich das wait um 1 Minute da 0 für die X Engien 1 ist (angefangen wird hier immer bei 0)
Zeile 3: dec Verringert den Variablenwert $minutes um eins
Zeile 4 definiert den Wert für die Variable $seconds (60 Sec = 1 Minute)
Zeile 5: Gleiche Schleife wie in Zeile 2 mit der selben Prüfung aber diesmal var = $second
Zeile 6: veringert den Var.-wert $seconds um 1
Zeile 7 wait 1000 ms (= 1 Sec)
Zeile 8 + 9: schliest die schleife ab.

Die Schleife die immer 1 Sekunde Wartet pro Durchlauf hat die Sekunden ($second) als Variable die 60 mal durchlaufen wird bevor die Variable $minutes um eins verringert wird. also entspricht 1 Sekunde wait * 60 Sekunden (ist eine Minute) * $minutes (das was der Spieler warten lassen will)
UniTrader
Moderator (Script&Mod)
Moderator (Script&Mod)
Posts: 14571
Joined: Sun, 20. Nov 05, 22:45
x4

Post by UniTrader »

ich hab mal 2 Kommentare und unterteilungen eingefügt ;)

Code: Select all

$minutes = get user input: type=Integer title="Bitte Zeit in Minuten eingeben"

* $minutes-mal unten genannte 60 sekunden abwarten (um auf die eingegebene Zeit zu kommen)
while $minutes > 0
  dec $minutes

* -------
* 60mal eine Sekunde lang abwarten (gibt bekanntermassen eine Minute)
  $seconds = 60
  while $seconds > 0
    dec $seconds
@   =wait 1000 ms
  end
* ----------

end


hier übrigens die Variante, die ich zum Warten einer festen, langen Zeit nehmen würde:

Code: Select all

$wartezeit = get user input: type=Integer title="Bitte Zeit in Minuten eingeben"

* rechne $wartezeit in sekunden um
$wartezeit = $wartezeit * 60

* erhalte aktuelle Spielzeit in Sekunden
$istzeit = playing time

* errechne daraus Zeit, wenn das Warten vorbei ist
$sollzeit = $istzeit + $wartezeit

while $istzeit < $sollzeit
 | 
 *errechne Zeit, die noch gewartet werden muss  (funktion von $wartezeit geändert)
 | $wartezeit = ( $sollzeit - $istzeit ) * 1000
 | @ =wait $wartezeit ms
 | 
 | * erhalte aktuelle Spielzeit in Sekunden
 | $istzeit = playing time
end 
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 ;)
User avatar
Sir Squallus
Posts: 691
Joined: Thu, 10. May 07, 17:45
x4

Post by Sir Squallus »

aha,...
also wenn ich dann noch einfüge das $minutes 30 ist wartet das skrip
30 minuten bis es etwas macht
User avatar
Sir Squallus
Posts: 691
Joined: Thu, 10. May 07, 17:45
x4

Post by Sir Squallus »

:thumb_up: Unitrader du bist mein held :D
User avatar
Sir Squallus
Posts: 691
Joined: Thu, 10. May 07, 17:45
x4

Post by Sir Squallus »

Ähm könnte diesen thread auch jemand bei den tutorials spicken, könnte noch jemanden nützlich sein
User avatar
Generalwest
Posts: 2764
Joined: Thu, 31. May 07, 18:07
x4

Post by Generalwest »

das mit dem playing time hab ich nie so wirklich hin bekommen. ka wieso. vielleicht hab ichs doch und habs nur nich gemerkt allerdings ein play sound in ner endlosschleife sollte man eig fast hören.

aba thx für dein muster
User avatar
SymTec ltd.
Posts: 5285
Joined: Mon, 11. Apr 05, 21:11
x3tc

Post by SymTec ltd. »

Generalwest wrote:das mit dem playing time hab ich nie so wirklich hin bekommen. ka wieso. vielleicht hab ichs doch und habs nur nich gemerkt allerdings ein play sound in ner endlosschleife sollte man eig fast hören.
Vielleicht war das Problem eher mit dem Sound als mit der Schleife. Allerdings ist die Playing time gelegentlich schon verwirrend - die kommt in Sekunden, wenn ich mich recht entsinne, während waits in ms sind.
UniTrader
Moderator (Script&Mod)
Moderator (Script&Mod)
Posts: 14571
Joined: Sun, 20. Nov 05, 22:45
x4

Post by UniTrader »

SymTec ltd. wrote:Vielleicht war das Problem eher mit dem Sound als mit der Schleife. Allerdings ist die Playing time gelegentlich schon verwirrend - die kommt in Sekunden, wenn ich mich recht entsinne, während waits in ms sind.
genau so ist es.. aber sei froh, sonst wäre die Spielzeit nicht wirklich eindeutig, weil sie sonst nach spätestens 3 Tagen wieder von vorne beginnt ^^ sorum beginnt die Zählung spätestens nach knapp 3.000 Tagen erst wieder von vorne :D (ich frage mich, ob jemand nen Save hat, was so lange gespielt wurde.. :D )
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 ;)
User avatar
Generalwest
Posts: 2764
Joined: Thu, 31. May 07, 18:07
x4

Post by Generalwest »

SymTec ltd. wrote:
Generalwest wrote:das mit dem playing time hab ich nie so wirklich hin bekommen. ka wieso. vielleicht hab ichs doch und habs nur nich gemerkt allerdings ein play sound in ner endlosschleife sollte man eig fast hören.
Vielleicht war das Problem eher mit dem Sound als mit der Schleife. Allerdings ist die Playing time gelegentlich schon verwirrend - die kommt in Sekunden, wenn ich mich recht entsinne, während waits in ms sind.
das mit dem playingtime wollt ich eigentlich schon unter r probiert haben, allerdings war mir wichtiger al, bbs usw scripten zu können, also war das playingtime das erste was ich in tc versucht habe. als sound verwende ich immer beim scripten 1118 weil er sehr leich zu merken ist :roll:

entweder hab ich wirklich zu kurz gewartet / verträgt sich nicht mit sinza, oder ka....~schulternzuckt~ nun weis ich ja wie es funzen muss.

aprpo schiffe. was mir unter x3r schon auffiel und in tc wieder auftaucht.

Folgende Situation:
Ich erstelle einen TS / TL mit Hombase mit der Rassenzuordnung Freund oder Neutral. Installiert sind /wurden unterschiedliche waren. HombaseStationen sind mit der selben Rassenkennung erzeugt worden. nun trat dann meist folgende Situation ein: Schiff wurde zerstört / angegriffen. Reaktion von X³(R und TC) in einem zufälligen Sektor rings rum (max 5 - 8 jumps) werden Novas erzeugt die dann auf der Hombase des zerstörten schiff landen / wollen. schießt man eine Nova ab, wird einfach eine neue erzeugt. Die Rassenkennung ist auch der Homebase entsprechend. Der Sektor wo das Passiert ist war unterschiedlich (momentan Hatikvas Glaube und aktuell Titan). Ist das "normal" :?:

kann man ausser mit einer exist Prüfung in einer fly to schleife checken ob das Schiff x noch lebt und auf dem weg zur Station xyz ist? oO ich habs jetzt mit ner kleinen lib versucht die das schiff checkt obs noch da ist und fals nicht das schiff dementsprechend ausrüstet und nochmal auf die reise schickt.

aus folgendem Grund will ich dafür keine exist Prüfung benutzen: zu ungenau und unflexibel. Ich will das in folgender schleife unterbringen:

051 ~~~ while [TRUE]
052 ~~~~ @ = wait 60000 ms
053 ~~~~ @ $trader = $stat.check -> call script 'a34' : Hombase=$stat.check erstausrüstung=null Anzahl=null Schifstype=Baldric owner=$owner varsting=$ship.name
054 ~~~~ @ = $trader -> call script '!move.movetostation' : station=$stat.check
055 ~~~~ if $trader -> is docked
056 ~~~~~ break
057 ~~~~ end
058 ~~~ end

Das Problem momentan ist, wenn die schleife aktiv ist, wird zwar a34.xml ausgeführt, allerdings kein neues schiff erzeugt und dementsprechend ausgerüstet. (schiff wurde in der geposteten Schleife manuell von mir als Player abgeschossen)
UniTrader
Moderator (Script&Mod)
Moderator (Script&Mod)
Posts: 14571
Joined: Sun, 20. Nov 05, 22:45
x4

Post by UniTrader »

du willst also prüfen, ob ein Schiff noch existent ist UND darauf ein bestimmtes Kommando läuft?? um <RetVar/IF> <RefObj> exist wirst du warscheinlich nicht herum kommen, und ob ein bestimmtes Kommando noch aktiv ist kannst du mit <RetVar/IF> <RefObj> is script <ScriptName> on stack of task=<Var/Number> prüfen.. (ggf. noch das Ziel mit <RetVar/IF> <RefObj> get destination abfragen, aber das sollte denke ich nicht nötig sein..)
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 ;)
User avatar
Generalwest
Posts: 2764
Joined: Thu, 31. May 07, 18:07
x4

Post by Generalwest »

hmm mir ist aufgefallen das das script auf die noreturn value wartet ich probier das noch aus, bevor ich wirklich das if exist mach. damit fällt allerdings die lib nicht aus, und ich prüf doppelt. eigentlich wollt ich den teil später in einem externen script unterbringen deswegen die lib die die schiffe der Rasse prüft, dann den namen checkt und falls kein spezielles gefunden wird, eins erzeugt. -.- ich mach mal n Demo script vielleicht kann ich so mir n besseren überblick verschaffen. da such ich schon seit dem svs eine vernünftige Lösung für das, also zu prüfen ob´s das schiff das hin und her schippert noch gibt oder nicht.

Edit: mit ner Kombi aus skip if not exist & Prafix Start tut es was es soll. Mit dem Hombase Phänomän :?: weis ich auch nicht wie ich erneut drauf reagieren soll.
User avatar
Gazz
Posts: 13244
Joined: Fri, 13. Jan 06, 16:39
x4

Post by Gazz »

Wenn du deine Spezialschiffe in einem globalen array speicherst dann kannst du doch auch ohne Suche ganz fix fragen
"seid ihr alle daaaaa?"

Strings (Namen) und Tasks und Rassen durchsuchen... tut das Not?
Generalwest wrote:aus folgendem Grund will ich dafür keine exist Prüfung benutzen: zu ungenau und unflexibel.
Das meinst du jetzt aber nicht ernst?
Ob es existiert ist doch recht interessant wenn du wissen willst ob es noch existiert.
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 »

Gazz wrote:Wenn du deine Spezialschiffe in einem globalen array speicherst dann kannst du doch auch ohne Suche ganz fix fragen
"seid ihr alle daaaaa?"

Strings (Namen) und Tasks und Rassen durchsuchen... tut das Not?
Generalwest wrote:aus folgendem Grund will ich dafür keine exist Prüfung benutzen: zu ungenau und unflexibel.
Das meinst du jetzt aber nicht ernst?
Ob es existiert ist doch recht interessant wenn du wissen willst ob es noch existiert.
ich will kein global arry, wenn irgendwas mit der tfile nicht hinhaut dann steht das ding da. unbekanntes objekt ist beispielsweise auch ein schiff und resize arry ist eine Sache für sich. zudem -> ich will das jedes meiner scripte sicher auf jedes erzeugte schiff zugreifen kann. zu der exist Prüfung will ich jedes schiff erstellen können :roll: zu dem soll es nach dem erzeugen bestimmte dinge erledigen, und anschließend etwas idl ^^

und nein ich will das alles nicht von Hand mehr editieren und kopieren und global & local setz ich nur im Notfall ein solange nicht alle Versionen Einträge in der tfile für global haben...nicht auszudenken was passiert wenn jemand die neue eate Version nutzt ohne die neue tfile (sprich nen TFile Downgred) :roll: und nein jedes mal n String schreiben will ich nicht bin Legastheniker........

ja es tut not wenn man kein GL Arry verwenden will...hab zwar schon eins definiert, noch konnte ich´s allerdings auskommentiert lassen.

Und da immer vieeeele Schiffe des gleichen Typs umherkreisen will ich ja nicht irgendeins sondern das zudem will ich gleich von Anfang an ein Zumüllschutz einbauen und nicht so enden wie mit dem Remote NavSat Version 0.1 (in 0.2 ist es auch gefixt)

Ich mach mir hier n Lesezeichen rein damit ichs wiederfinde wenn ich diese Version Online geht und Poste dann den Quelltext damit jeder sieht wieso ich das so machen möchte. :roll:

ach ja. was ich noch sagen wollte. Ich wollte eine unabhängig Prüfen ob das Schiff da ist oder nicht, ob jetzt der Scriptteil aktiv ist oder ein anderer. irwas hab ich vergessen....ka es war zwar wichtig fällt mir dennoch nicht mehr ein.

axo Namensvergleich mehr wie
Übergebene ner Name = $name.ship
get name of Objekt = ship.name

und dann if ship.name == name.ship um von dem String of Plattern wegzukommen.

jetzt weis ich wieder was ich schreiben wollt:

wenn ich if exist verwende kann es sein das es das schiff physikalisch nicht mehr gibt weil´s nicht aktualisiert wurde. Gibt´s das Schiff nicht kann die Endlosschleife nicht mehr unterbrochen werden (da if exist true aber das schiff nur unbekanntes objekt ist) und die Schleife stört unter Umständen die nachfolgende instands, von dem Save schaden mal abzusehen. mach ich´s so wird das schiff an sich als physikalisches objekt aktualisiert und geprüft und genau das will ich eigentlich damit erreichen weil ich oft schon den Fall hatte das das schiff das ich mit if exist abgefragt hatte am ende ein unknow objekt war das nur noch als Leiche existiert. also ähnlich wie beim arry.
Last edited by Generalwest on Tue, 3. Feb 09, 01:37, edited 1 time in total.
User avatar
Ketraar
EGOSOFT
EGOSOFT
Posts: 12166
Joined: Fri, 21. May 04, 17:15
x4

Post by Ketraar »

Dan verbereite ich mal das Wort des Herrn.. ähm des MD.

Code: Select all

    <cue name="Ships_spawn">
      <condition>
        <check_all>
          <check_age value="{player.age}" min="5d"/>
        </check_all>
      </condition>
      <action>
        <do_all>
          <create_ship class="m1" name="this.debugM1_1" race="player" typename="SS_SH_A_M1">
            <position x="0" y="0" z="0"/>
            <sector x="8" y="8"/>
            <equipment loadout="maximum" loadoutmask="all"/>
            <command command="idle"/>
            <pilot shipname="My New M1"/>
          </create_ship>
        </do_all>
      </action>
    </cue>
Wie man sehen kann ist das eigentlich selbst erklärend. Als Wert für die zeit geht auch s (sekunden) m (Minuten) h (Stunden) und wie oben d (Tage).
Der MD kann auch für anderes als Missionen miss-/gebraucht werden. :-D

Der MD sei mit euch.

MFG

Ketraar
Image
User avatar
Jens Ka
Posts: 468
Joined: Thu, 18. Jan 07, 15:32
x4

Post by Jens Ka »

Amen :D

Da hier auch Schleifen in Diskussion stehen mal was kurzes dazu auf Ketraars Code aufbauend.
Um das Schiff zu ersetzen.

Code: Select all

<cue name="Ships_spawn_checkexists" delay="500">
      <condition>
        <object_exists object="Ships_spawn.debugM1_1" negate="1"/>
      </condition>
      <action>
        <reset_cue cue="Ships_spawn"/>
      </action>
    </cue>
und damit dem Schiff nicht die Raketen aus gehen noch diese Kleinigkeit.

Code: Select all

<cue name="Ships_spawn_checkmissile" delay="500">
      <condition>
        <check_value value="{object.cargo.SS_MISSILE_A.exists@Ships_spawn.debugM1_1}" exact="0"/>
      </condition>
      <action>
        <add_cargo object="Ships_spawn.debugM1_1">
          <ware typename="SS_MISSILE_A" exact="100"/>
        </add_cargo>
      </action>
      <cues>
        <cue name="Ships_spawn_checkmissile">
          <condition>
            <cue_is_complete cue="Ships_spawn_checkmissile"/>
          </condition>
          <timing>
            <time exact="10s"/>
          </timing>
          <action>
            <reset_cue cue="Ships_spawn_checkmissile"/>
          </action>
        </cue>
      </cues>
    </cue>
Das kann man natürlich auch mit anderen Raketen typen machen und mehrer zusammen checken.

Da mit wäre dann eine Sektor wache oder ähnliches geschaffen!

MfG

Jens Ka
MD IST NICHT MSCI!!!!
MD ist Eventdriven. Es passiert etwas - du reagierst darauf.
Bin nicht für weitere Mod Projekte zu haben.
ND VSM XTC
Allgemeine MD-Fragen
User avatar
Generalwest
Posts: 2764
Joined: Thu, 31. May 07, 18:07
x4

Post by Generalwest »

:headbang: erst die Scriptptofis und dann die MD Profis. Zu dem MD: Ich werde den höchstens zum einleiten / einbinden von BBS Missionen nutzen, wenn ich herausgefunden habe wie man per MD ein Script callt ^^ (fals das überhaupt möglich ist) aber davor werde ich mir irgendwas MD Technisches runterladen und schauen ob ich´s mit meinem Allzweck prog schreiben kann.

Un nein ich will nicht ein Schiff alle X Sec erstellen um es dann neu auszurüsten und auf die reise quer durchs uni schicken. Ich mach´s doch glaub per !move.jumptostation und zwar allgemei den !move.flytosectorposition macht alles ausser dahin zu fliegen. !move.flytosecotr bekommt TC grad noch hin bevor flytosectorposition eingeleitet wird und das Schiff nach Uranus fliegt obwohl´s schon im Zielsektor ist.

NPC Steuerung ist mehr als mist momentan. Eigene Schiffe zu Kontrollieren ist ja einfach oder mal nen TS per Script zu sagen "Docke hier, docke dort" macht das mal mit nem TL oO obwohl das Bergbaubasis Schiff gute Referencen in KI Steuerung bekommen hat. :headbang:

Ich hoffe etwas Ablenkung wird mir gut tun und mal die neue Version von eate und x5/1 zum betatest freigeben.
UniTrader
Moderator (Script&Mod)
Moderator (Script&Mod)
Posts: 14571
Joined: Sun, 20. Nov 05, 22:45
x4

Post by UniTrader »

kleine Frage: hast du der KI ausdrücklich verboten den TL zu verwenden?? wenn nein macht so ziemlich jedes Schiff nach ner weile was es will...

PS und ja, es ist möglich per MD ein Script laufen zu lassen.. ( run_script oder so...)
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 ;)

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