MD erzeugt Schleife, wie Abbrechen?

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

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

Post Reply
Sulchin
Posts: 28
Joined: Tue, 18. Sep 12, 15:09

MD erzeugt Schleife, wie Abbrechen?

Post by Sulchin » Tue, 3. Mar 15, 23:56

Hab nochmal ne Frage:
Ich hab mal nen bischen an der "Buy Blueprints" rumgebastelt, da die ja von Egosoft nie beendet wurde. Es fehlt die Abfrage ob der zu kaufende Plan schon im HQ vorhanden ist.
Problem is hierbei, dass die Blueprints im HQ nicht einfach über nen lookup abgefragt werden können.
Ich hab das gelößt, in dem ich alle einzeln nacheinander mit ner Schleife Abfrage:

Code: Select all

 <cue name="L2M161Blueprints1">
              <condition>
                <conversation_completed answer="accept1" conversation="L2OfferBuyCustom1" actor="L2M161 Offer.Guide"/>
              </condition>
              <timing>
                <count exact="{player.headquarters.blueprints.count}"/>
                <time min="2"/>
                <interval exact="1"/>
              </timing>
              <action>
                <do_all>
                  <set_value name="this.counter" exact="{index@this}"/>
                  <!--Überprüfungsmessage zur Ausgabe der Variablen-->
                  <!--<incoming_message text="{8738,3}" popup="1"/>-->
                  <do_choose>
                    <do_when value="{lookup.type.name@{player.headquarters.blueprints.{value@L2M161Blueprints1.counter}}}" exact="{lookup.type.name@{value@L2M161.ShipType1}}">
                      <play_text priority="99">
                        <line pageid="13" textid="56"/>
                      </play_text>
                      <remove_offer actor="L2M161 Offer.Guide" conversation="L2OfferBuyCustom1" discipline="XXXT"/>
                      <destroy_actor actor="L2M161 Offer.Guide"/>
                      <cancel_cue cue="L2M161"/>
                    </do_when>
                  </do_choose>
                </do_all>
              </action>
Das Funktioniert auch soweit. Wenn ich die Blueprints schon habe bricht er ab und zieht mir kein Geld ab, und entfernt den Actor.
Wenn ich die Blueprints nicht habe lässt er mich auch weiter zu folgender Cue (die ist nahezu orginal von Egosoft)

Code: Select all

<cue name="L2M161 Accepted 1" instantiate="static">
              <condition>
                <check_all>
                  <!--<conversation_completed answer="accept1" conversation="L2OfferBuyCustom1" actor="L2M161 Offer.Guide"/>-->
                  <cue_is_complete cue="L2M161Blueprints1"/>
                </check_all>
              </condition>
              <timing>
                <time min="3s" max="5s"/>
              </timing>
              <action>
                <do_all>
                  <set_value name="L2M161Blueprints1.counter" exact="({player.headquarters.blueprints.count}+1)"/>
                  <do_choose>
                    <do_when value="{player.money}" min="{value@L2M161.Cost 1}">
                      <set_value name="L2M161.Notoriety" exact="1"/>
                      <do_if value="{value@L2M161.OfferRace}" list="{lookup.race@pirate}|{lookup.race@yaki}" negate="1">
                        <set_value name="L2M161.HasNotoriety" exact="{player.notoriety.{value@L2M161.OfferRace}}+{lookup.type.minnotoriety@{value@L2M161.ShipType1}}"/>
                      </do_if>
                      <do_choose>
                        <do_when value="{value@L2M161.HasNotoriety}" min="1">
                          <reward_player>
                            <money exact="-{value@L2M161.Cost 1}"/>
                          </reward_player>
                          <add_blueprints_to_headquarters typename="{value@L2M161.ShipType1}"/>
                          <play_text priority="99">
                            <line actor="L2M161 Offer.Guide" textid="825"/>
                            <!--<line pageid="13" textid="1332"/>-->
                          </play_text>
                          <set_value name="L2M161.Accepted2" exact="1"/>
                          <remove_offer actor="L2M161 Offer.Guide" conversation="L2OfferBuyCustom1" discipline="XXXT"/>
                          <destroy_actor actor="L2M161 Offer.Guide"/>
                          <cancel_cue cue="L2M161 Accepted 1"/>
                        </do_when>
                        <do_otherwise>
                          <reward_player>
                            <money exact="-{value@L2M161.Cost 1}"/>
                          </reward_player>
                          <add_blueprints_to_headquarters typename="{value@L2M161.ShipType1}"/>
                          <play_text priority="99">
                            <line actor="L2M161 Offer.Guide" textid="825"/>
                            <!--<line pageid="13" textid="1332"/>-->
                          </play_text>
                          <set_value name="L2M161.Accepted2" exact="1"/>
                          <remove_offer actor="L2M161 Offer.Guide" conversation="L2OfferBuyCustom1" discipline="XXXT"/>
                          <destroy_actor actor="L2M161 Offer.Guide"/>
                          <cancel_cue cue="L2M161 Accepted 1"/>
                        </do_otherwise>
                      </do_choose>
                    </do_when>
                    <do_otherwise>
                      <play_text priority="99">
                        <line pageid="13" textid="1254"/>
                        <line actor="L2M161 Offer.Guide" textid="21"/>
                      </play_text>
                    </do_otherwise>
                  </do_choose>
                </do_all>
              </action>
            </cue>

Nun mein Problem:
Dadurch dass ich die Abfrage für "Ist die Blaupause schon vorhanden" über ne schleife mache, wird die zweite Cue, die mir die Blaupause gibt und geld abzieht so häufig ausgeführt wie ich Blueprints im HQ habe (bei mir derzeit 150), sprich mir wird nicht einmal der Kaufpreis abgezogen sondern bis zu 150x der Kaufpreis, jenachdem wie schnell die cue gecancelt wird...

Hab ihr ne Idee, wie ich aus der schleife wieder rauskomme, oder ne andere Lösung für die Abfrage, ob die Blueprint im HQ schon vorhanden sind?

User avatar
JSDD
Posts: 1378
Joined: Fri, 21. Mar 14, 20:51
x3tc

Post by JSDD » Wed, 4. Mar 15, 01:27

... wäre es nicht geschickter, erst gar nicht typen als blueprint anzubieten, wenn der player sie schon hat ??
... ich würde versuchen, die aufgabe per walkaround mit dem script editor zu lösen, sprich:
=> script aufrufen
=> via script die angebotenen typen raussuchen
=> gefundenen typ an md zurückgeben

hier is etwas fantasie gefragt: die einen regeln "kommunikation" zwischen MD und SE über n gecheateten TL, indem man
waren transferiert & diese interpretiert, andere über positions-koordinaten von gecheateten schiffen etc.
in dem beispiel würd ich sagen: einfach den schiffsnamen eines gecheateten schiffs nehmen

ungefähr so:
1. md erstellt TL (im sektor (0|0) an position y=4000km)
2. md checkt existenz des TL, wenn zerstört, dann ist was schief gelaufen: cancel mission
3. script sucht nen gescheiten schiffstyp raus, den der player noch nicht als blueprint hat
3. script ist fertig, "rückgabewert" = erzeuge schiff des gefundenen typs, ignoriere kollisionen, setze position auf TL-position
4. md checkt ob ein schiff in der nähe ist (via <count_ships>), wenn nach 5 sekunden kein schiff in der nähe => cancel mission
dann schiffstyp speichern, schiffe zerstören via md, weitermachen in der mission ...

ps: im script editor kann man mit nur 1 zeile checken ob HQ bestimmtes blueprint hat, darum lohnt sich der aufwandt ;)
(im md brauchts dazu über 400 schleifendurchläufe)
To err is human. To really foul things up you need a computer.
Irren ist menschlich. Aber wenn man richtig Fehler machen will, braucht man einen Computer.


Mission Director Beispiele

Sulchin
Posts: 28
Joined: Tue, 18. Sep 12, 15:09

Post by Sulchin » Thu, 5. Mar 15, 00:38

ps: im script editor kann man mit nur 1 zeile checken ob HQ bestimmtes blueprint hat, darum lohnt sich der aufwandt Wink
(im md brauchts dazu über 400 schleifendurchläufe)
ja, das ist mir beim Programmieren der Abfrage beswusst geworden....

Ich bin leider überhaupt kein scripter, hab nichtmal das einfache "Erstelle Schiff" anständig hinbekommen......

Hatte auch schon überlegt, ob ich als condition für die zweite Cue irgedn so was Abgefahrenes nehme, wie existiert Schiff xyz oder so, doch haben bislang alle versuche immer nur dazu geführt, dass die Mission zwar funktioniert, mir aber immer zu viel Geld abgezogen wird....

User avatar
JSDD
Posts: 1378
Joined: Fri, 21. Mar 14, 20:51
x3tc

Post by JSDD » Thu, 5. Mar 15, 11:16

Sulchin wrote:Ich bin leider überhaupt kein scripter, hab nichtmal das einfache "Erstelle Schiff" anständig hinbekommen......
sieh dir die videos von ketraar an, danach lies dir mal die pdf durch, hier noch ne erklärung im schnelldurchlauf ;)
// spätestens dann kannste selbstständig kleinigkeiten scripten, bei größeren / komplexeren geschichten ist erfahrung hilfreich ...

... achja: visual web developer ist pflicht !!

Sulchin wrote:Hatte auch schon überlegt, ob ich als condition für die zweite Cue irgedn so was Abgefahrenes nehme, wie existiert Schiff xyz oder so, doch haben bislang alle versuche immer nur dazu geführt, dass die Mission zwar funktioniert, mir aber immer zu viel Geld abgezogen wird....
... ich werd später mal etwas genauer drauf schauen, die mission ist nämlich echt noch nich fertig ^^
... genau genommen passt der aufruf der library "SRST" nicht ganz da rein, denn SRST = select random ship type = wählt irgendein zufälligen typ raus
... ABER: man braucht ne andere library, die auch checkt, ob blueprint schon vorhanden (so eine gibt's [noch] nicht ...)
To err is human. To really foul things up you need a computer.
Irren ist menschlich. Aber wenn man richtig Fehler machen will, braucht man einen Computer.


Mission Director Beispiele

Sulchin
Posts: 28
Joined: Tue, 18. Sep 12, 15:09

Post by Sulchin » Thu, 5. Mar 15, 12:50

sieh dir die videos von ketraar an, danach lies dir mal die pdf durch, hier noch ne erklärung im schnelldurchlauf Wink
// spätestens dann kannste selbstständig kleinigkeiten scripten, bei größeren / komplexeren geschichten ist erfahrung hilfreich ...
Da misverstehst du mich. MD ist kein problem, hab schon so manche Mission selbst geschrieben. mit dem SE komm ich nicht klar....
.. ich werd später mal etwas genauer drauf schauen, die mission ist nämlich echt noch nich fertig ^^
Das ist eigentlich orginal die Mission, die Egosoft so vorgegeben hat, und oben in den ToDos stand auch dirn, dass die Abfrage , ob die Blueprint vorhanden ist fehlt. Ich wollte die halt nachhohlen, da ich sonst immer mit ner Liste daneben sitze auf der alle Schiffstypen stehen die ich schon hab...

Ne eigene Libary für die Abfrage hab ich jetzt nicht gemacht, da mir auch nichts einfällt, wo ich diese Abfrage nochmal gebrauchen könnte, darum hab ich sie einfach als normale Cue eingefügt.
Würde dass den das problem mit der schleife lösen, wenn ich die Abrfrage-Cue einfach als Libary auslagere? würde nicht trotzdem der wert für "Cue ist fertig, kein match" übergeben werden nd damit die darauffolgende Cue mehrfach ausgeführt werden?

PS: Vielleicht kannst du mir das Erklären, aus der MD internen hilfe werd ich nicht schlau und Onkel Google spuckt irgendwie auch nix gescheites aus:
Was ist der Unterschied zwischen "Cue completet" und "Cue is Complete"?
bzw. auch:
"Cancel Cue" und "Destroy Cue"?

User avatar
JSDD
Posts: 1378
Joined: Fri, 21. Mar 14, 20:51
x3tc

Post by JSDD » Thu, 5. Mar 15, 15:10

... aaachso !! :D dachte, der md wär das problem, an den script editor dachte ich gar nicht
(weil der relativ gesehen für die meisten vieeel einfacher / verständlicher ist ^^)
... jepp ich weiß, ist die original mission, selbst weiter unten steht:

Code: Select all

check if player already has blueprints?
<do_when value="{player.blueprints.{value@L2M161.ShipType1}}" exact="1">
</do_when>
nur funzt diese abfrage nicht im md (bzw. die variable "{player.blueprints.blablabla}" existiert afaik nicht)

ich hab eben ne library gemacht, die das problem via script editor umgeht ... muss nur noch geschwind unter vanilla testen, dann lad ich's hoch (incl. angepasste ego mission)
EDIT: *link*
... ein paar unschönheiten sind dabei, z.B. dass prototypen / plotschiffe etc angeboten werden
=> die alternative dazu lautet: eigene schiffstypenliste (für erlaubte schiffe) anlegen


ob das auslagern in ne lib das problem löst ??
=> wenn es korrekt umgesetzt ist: ja ^^

die meisten libs haben nen "schalter" der besagt, ob lib fertig oder nicht, umgesetzt via cancel_cue, d.h. du erstellst n dummy-cue das nix tut (ergo status ständig active/complete ist, aber NICHT cancelled), die lib cancelt dann das cue erst wenn es fertig ist

<cancel_cue cue="L2M161 Accepted 1"/> steht so aber nicht drin

<timing>
<time min="3s" max="5s"/>
</timing>

hab nich richtig durchschaut wieso du <time min="3s" max="5s"/> verwendest ... vllt liegts daran ?? (dass mehrere instanze gleichzeitig aktiviert sein können :? no clue)

cue_completed = event, d.h. NUR verwendbar ohne delay im cue (weil diese condition jede frame gecheckt werden muss)
cue_is_complete = zustand, der ist auch später noch checkbar, d.h. delay zulässig
(mehrere delay-lose cues können die performance beeinflussen)

cancel_cue = stoppt das cue, später kann es wieder aktiviert werden (über reset_cue)
destroy_cue entfernt das (oft fehlerhafte) cue komplett vom game, lässt sich später also nicht mehr wieder aktivieren
(soweit mein hablwissen, getestet hab ichs nicht ^^ alles aus ketraars videos)

ps: noch so ne idee ... es kann sein, dass die play_text instruktionen auch delays verursachen, solange gesprochen wird, hängt afaik der md an der stelle fest, wenn also später erst gecancellt wird, könnten mehrere cue-instanzen bereits ihre actions durchgeführt haben
ähnliches gilt bei run_script: da muss man task="1" setzen, sonst spinnt der md rum (& führt das script 9999 mal aus ^^)
To err is human. To really foul things up you need a computer.
Irren ist menschlich. Aber wenn man richtig Fehler machen will, braucht man einen Computer.


Mission Director Beispiele

Post Reply

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