[Frage zum modden] ai Scripting für neues Handels und Miningscript

Hier ist der ideale Ort um über Scripts und Mods für X Rebirth zu diskutieren.

Moderators: Moderators for English X Forum, Scripting / Modding Moderators

Post Reply
FindolCaleb
Posts: 205
Joined: Sun, 14. Sep 08, 15:34
x3

[Frage zum modden] ai Scripting für neues Handels und Miningscript

Post by FindolCaleb » Sat, 18. Jul 15, 17:54

Hallo Leute,

da ich nun endlich die lua für meinen Mod angepasst habe, wollte ich mich dran setzen ein neues Handels und Miningscript zu schreiben.
Leider hänge ich da gerade etwas fest.
Mein Problem ist, dass es zwar ein Script zum mining gibt, welches sich aber ausschließlich nur auf die Recourcen einer Station stürzt und zB wie ich es brauche Handelswaren ignoriert.
Ich habe bereits versucht im script mining.player.station einen entsprechenden absatz für Handelswaren zu integrieren:

Code: Select all

<add sel="/aiscript/attention[@min='unknown']/actions/do_if[@value='this.ship.commander.isoperational']" pos="after">
<do_elseif value="this.ship.commander.isoperational">
        <set_value name="$tradewares" exact="this.ship.commander.tradewares.list" />
        <do_all exact="$tradewares.count" counter="$i">
          <set_value name="$ware" exact="$tradewares.{$i}" />
          <do_if value="($ware.tags.indexof.{tag.minable}) and (this.ship.cargo.{$ware}.max gt 0)">
            <do_if value="this.ship.units.collect.{$ware}.count gt 0">
              <do_if value="$warebasket.indexof.{$ware}" exact="0">
                <append_to_list name="$warebasket" exact="$ware" />
              </do_if>
            </do_if>
          </do_if>
        </do_all>
        <debug_text text="'updating warebasket on %1(%2) to collect %3'.[this.ship.knownname, this.ship, $warebasket]" chance="$debugchance" />
        <remove_value name="$tradewares" />
 </do_elseif>
 </add>
Leider bewirkt dies nichts weiter. Lasse ich ein Miningschiff beim Manager, so fängt dieses an zu patroullieren.

Weiß jemand rat, wie ich dieses Problem lösen kann ??


Edit: Titel informativer gestaltet. X2-Illuminatus
Last edited by FindolCaleb on Thu, 23. Jul 15, 14:41, edited 1 time in total.

UniTrader
Moderator (Script&Mod)
Moderator (Script&Mod)
Posts: 14571
Joined: Sun, 20. Nov 05, 22:45
x4

Post by UniTrader » Sat, 18. Jul 15, 18:10

ich hab das jetzt nicht im kontext angesehen, aber so kann es nicht funktionieren weil dein eingefügter Code niemals ausgeführt wird:

du fügst ein do_elseif mit derselben bedingung wie das vorige do_if ein - aber wenn dieses bereits zutrifft werden die folgenden do_elseif gar nicht erst geprüft.

ausserdem wäre vielleicht das debuglog hilfreich, wenns an anderer stelle schon scheitert..

a propos neues Script: weshalb kopierst du nicht den bestehenden Vanilla-Code in ein neues Script und passt dir diesen direkt an, wenn du eh ein neues Script schreiben wills? so mache ich es mit meinem Manager/Handelsscript (unveröffentlicht), bis es nötig wird den code neu zu schreiben oder ich lust dazu habe..
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 ;)

FindolCaleb
Posts: 205
Joined: Sun, 14. Sep 08, 15:34
x3

Post by FindolCaleb » Sat, 18. Jul 15, 18:29

Danke Uni, du hast natürlich Recht, das die elseif Funktion schlecht gesetzt ist.

Der debuglog zeigt nichts an, deshalb gab es dort auc nichts zu posten.
Des weiteren scheint das Problem bereits in einem anderen script aufzutreten. Es handelt sich hierbei um das trade.station.player

Hier wird in den einzelnen Teilen geprüft ob es sich um ein Miningschiff oder ein Handesschiff handelt und dementpsrechend die scripte (trade.ship oder mining.ship.station) gestartet Im unteren Teil ist dann noch ein Abschnitt in dem zur patroullie aufgerufen wird.

Entsprechend dieser Codezeilen:

Code: Select all

<create_list name="$collect_warelist" />
        <do_all exact="$warelist.count" counter="$i">
          <set_value name="$ware" exact="$warelist.{$i}" />
          <do_if value="$ware.tags.indexof.{tag.minable}">
            <do_if value="$subordinate.units.collect.{$ware}.count gt 0">
              <append_to_list name="$collect_warelist" exact="$warelist.{$i}" />
            </do_if>
          </do_if>
        </do_all>

        <do_if value="$collect_warelist.count gt 0">
          <debug_text text="'using %1(%2) to gather %3'.[$subordinate.knownname, $subordinate, $collect_warelist]" chance="$debugchance" />
          <start_script name="'mining.ship.station'" object="$subordinate.pilot">
            <param name="warebasket" value="$collect_warelist" />
          </start_script>
        </do_if>
Muss eben die Bedingung, dass in der "collect_warelist" waren enthalten sind, die den tag "minable" in der libary haben. Die Waren hierzu zeiht er sich aus der wareliste, welche vorhergehend durch folgende Zeilen erstellt wird:

Code: Select all

<create_list name="$warelist" />
        <do_all exact="$resources.count" counter="$i">
          <set_value name="$ware" exact="$resources.{$i}" />
          <do_if value="$subordinate.cargo.{$ware}.free gt 0">
            <do_if value="$warelist.indexof.{$ware}" exact="0">
              <append_to_list name="$warelist" exact="$ware" />
            </do_if>
          </do_if>
        </do_all>
        <do_all exact="$products.count" counter="$i">
          <set_value name="$ware" exact="$products.{$i}" />
          <do_if value="$subordinate.cargo.{$ware}.free gt 0">
            <do_if value="$warelist.indexof.{$ware}" exact="0">
              <append_to_list name="$warelist" exact="$ware" />
            </do_if>
          </do_if>
        </do_all>
        <do_all exact="$ammowares.count" counter="$i">
          <set_value name="$ware" exact="$ammowares.{$i}" />
          <do_if value="$subordinate.cargo.{$ware}.free gt 0">
            <do_if value="$warelist.indexof.{$ware}" exact="0">
              <append_to_list name="$warelist" exact="$ware" />
            </do_if>
          </do_if>
        </do_all>
        <!-- <do_all exact="$tradewares.count" counter="$i">
          <set_value name="$ware" exact="$tradewares.{$i}" />
          <do_if value="$subordinate.cargo.{$ware}.free gt 0">
            <do_if value="$warelist.indexof.{$ware}" exact="0">
              <append_to_list name="$warelist" exact="$ware" />
            </do_if>
          </do_if>
        </do_all> -->
Wie zu sehen ist, gibt es dort auch einen Abschnitt der tradewares in die warelist aufnimmt, welcher aber eben nicht registirert wird. Diesen habe ich nachträglich eingefügt, ebenso wie alle vorhergehenden codes, welche mit tradewares zu tun hatten, damit es auch ordentlich ist. Wie gesagt debuglog zeigt keinen fehler an.

Das Patroullienscript wird ausgeführt wenn die anderen Bedingungen nicht zutreffen.

Code: Select all

    <do_else>
          <debug_text text="'ship %1(%2) cannot transport anything useful for us.'.[$subordinate.knownname, $subordinate]" chance="$debugchance" />

          <do_if value="$subordinate.dps.all" min="50.0f">
            <debug_text text="'ship %1(%2) will patrol the station in range %3.'.[$subordinate.knownname, $subordinate, $Object.size/2 + $subordinate.maxradarrange/2]" chance="$debugchance" />
            <start_script name="'move.patrol'" object="$subordinate.pilot">
              <param name="range" value="'station'" comment="this Station" />
              <param name="range_max" value="this.station.size/2 + $subordinate.maxradarrange/2" />
            </start_script>
          </do_if>
          <do_else>
            <debug_text text="'ship %1(%2) is not useful for combat purposes.'.[$subordinate.knownname, $subordinate]" chance="$debugchance" />
            <start_script name="'move.generic'" object="$subordinate.pilot" >
              <param name="destination" value="this.station" />
            </start_script>
          </do_else>
          
          
        </do_else>

UniTrader
Moderator (Script&Mod)
Moderator (Script&Mod)
Posts: 14571
Joined: Sun, 20. Nov 05, 22:45
x4

Post by UniTrader » Sun, 19. Jul 15, 12:04

könnte damit zusamme hängen, dass der part wo die var mit handelswaren gesetzt wird auskommentiret ist:

Code: Select all

        <set_value name="$resources" exact="this.station.resources.list" />
        <set_value name="$products" exact="this.station.products.list" />
        <!-- <set_value name="$tradewares" exact="this.station.tradewares.list" /> -->
        <evaluate_ammo_storage object="this.station" wares="$ammowares" type="missile" />
ein

Code: Select all

<add sel="//evaluate_ammo_storage" pos="before">
         <set_value name="$tradewares" exact="this.station.tradewares.list" />
</add>
sollte das beheben..
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 ;)

FindolCaleb
Posts: 205
Joined: Sun, 14. Sep 08, 15:34
x3

Post by FindolCaleb » Sun, 19. Jul 15, 14:19

Wie erwähnt habe ich das auch schon gemacht, das bewirkt nur leider nichts

UniTrader
Moderator (Script&Mod)
Moderator (Script&Mod)
Posts: 14571
Joined: Sun, 20. Nov 05, 22:45
x4

Post by UniTrader » Sun, 19. Jul 15, 15:20

ah, da hab ich dich falsch verstanden.. hmm, spontan hab ich keine weitere idee, es könnte aber hilfreich sein manuell ein paar einträge ins debuglog zu machen um nachzuvollziehen was überhaupt passiert:

<debug_text filter="general" text="$warelist"/>
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 ;)

FindolCaleb
Posts: 205
Joined: Sun, 14. Sep 08, 15:34
x3

Post by FindolCaleb » Sun, 19. Jul 15, 15:39

wo adde ich das ganze denn in den codezeilen ?

UniTrader
Moderator (Script&Mod)
Moderator (Script&Mod)
Posts: 14571
Joined: Sun, 20. Nov 05, 22:45
x4

Post by UniTrader » Sun, 19. Jul 15, 16:21

einfach an der stelle im Code, wo dich die Werte der variablen interresieren einfügen und alle Werte die dich interresieren rein schreiben lassen.. der Befehl kommt mit so ziemlich jedem input klar, den man irgendwie in lesbaren text verwandeln kann, wobei vorformatiertes warscheinlich am nützlichsten ist, hier z.B. mein standard-debug_text für jeden Konversationsschritt (letzte Zeile des schnippsels):

Code: Select all

    <library name="Comm_Common" instantiate="true">
      <!-- common Handler for all NPC Types (Hired) - includes general Options like Personal Managment and connecting to other people, and the goodbye Section -->
      <params>
        <param name="actor"/>
      </params>
      <conditions>
        <check_any>
          <event_conversation_next_section sectionprefix="comm_personal_" actor="$actor"/>
          <event_conversation_returned_to_section sectionprefix="comm_personal_" actor="$actor"/>
          <event_conversation_next_section sectionprefix="comm_connect_" actor="$actor"/>
          <event_conversation_returned_to_section sectionprefix="comm_connect_" actor="$actor"/>
          <event_conversation_returned_to_section section="comm_goodbye" actor="$actor"/>
          <event_conversation_next_section sectionprefix="comm_debug_" actor="$actor"/>
          <event_conversation_returned_to_section sectionprefix="comm_debug_" actor="$actor"/>
        </check_any>
      </conditions>
      <actions>
        <debug_text filter="general" chance="$actor.$debug * 100" text="'%1 %2 %3:\nevent.param= %4 event.param2= %5 event.param3= %6'.[player.age,$actor.name,event.name,event.param,event.param2,event.param3]"/>
damit kann man via logfile immer nachvollziehen was in der aktuellen konversation so gemacht wurde, zumindest sofern die $debug-variable auf dem $actor gesetzt wurde.. (du kannst <debug_text/> an jeder stelle im code einfügen der ausgeführt wird..)
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 ;)

Post Reply

Return to “X Rebirth - Scripts und Modding”