Brauche kleine hilfestellung

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

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

Post Reply
User avatar
Joda
Posts: 217
Joined: Mon, 19. Jan 04, 00:44
xr

Brauche kleine hilfestellung

Post by Joda » Wed, 29. Aug 07, 23:33

Hi
Gibt es eine möglichkeit von den asteroiden (die kleinen "debris") den mineraliengehalt (ausbeute) per script auszulesen, damit ich den wert weiter verwenden kann?
Bsp: $curenthull = $ship -> get hull______für die schiffshülle da hab ich dann $currenthull
sowas in der art! hab da leider nichts passendes in den befehlen gefunden. der wert heißt ja, glaube ich zumindest Yield oder so?

User avatar
SymTec ltd.
Posts: 4389
Joined: Mon, 11. Apr 05, 21:11
x3tc

Post by SymTec ltd. » Sat, 1. Sep 07, 17:56

Hast du schon versucht, den Befehl
<RetVar> = <RefObj> erhalte Asteroiden-Daten (get asteroid yield)
auf die Debris-Felder anzuwenden?

User avatar
Joda
Posts: 217
Joined: Mon, 19. Jan 04, 00:44
xr

Post by Joda » Sun, 2. Sep 07, 02:22

nein noch nicht!
werde das gleich mal ausprobieren

User avatar
Joda
Posts: 217
Joined: Mon, 19. Jan 04, 00:44
xr

Post by Joda » Sun, 2. Sep 07, 13:26

kann mir bei diesem script mal jemand helfen?
möchte kleinstasteroiden in den frachtraum beamen.

Code: Select all

[THIS] -> set command: COMMAND_COLLECT_DEBRIS target= $sector target2= null par1= null par2= null

= [THIS] -> call script "!move.movetosector" : arg0=$sector,
start :

* now i am in the sector, search for wares
$flags = [Find.Nearest] | [Find.Multiple] | 32768
$sector = 1

* find the 5 nearest wares
$range = [THIS] -> get scanner range
$warearray = find debris: sector= [SECTOR] resource= null min yield= null flags= $flags refobj= [THIS] num= 1 max distance= $range refpos= null

$amount = 0
$sector = $warearray
* check if one of these wares fits into my ship
$numwares = size of array $warearray

$i = 0
$sector = $i < $numwares
$wareobj =  $warearray [ $i ]


$ware = $wareobj -> get resource waretype of asteroid

* skip if [THIS] -> can transport ware $ware
* return null

* skip if $Collectible -> has collectible rocks
* return null

$free = [THIS] -> get free amount of ware $ware in cargo bay
* skip if $free >= $numwares
* return null

$scan = [THIS] -> get amount of ware Frachtscanner in cargo bay
$trans = [THIS] -> get amount of ware Transporter S_1 in cargo bay
* skip if $trans AND $scan
* return null
$resourcezahl = $flags -> get asteroid yield
$dist = get distance between $warearray and [THIS]
if $dist <= 1000
= [THIS] -> add $resourcezahl units of $ware
$warearray -> destruct: show no explosion= [FALSE]
@ = wait 5000 ms
* @ $ret = [THIS] -> move to ware object $wareobj for collecting: timeout= 600000 ms
goto label start

end
return null
EDIT: codetags eingefügt
MADxHAWK

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

Post by UniTrader » Sun, 2. Sep 07, 13:48

wenn du was aus den Browser kopierst ohne ne modifizierte x2Script.xsl zu verwenden wären Code-Tags angeracht, da sieht man die einrückungen für if/while-bedingungen :roll:

nun zu dem was mir auffält:

1.
$flags = [Find.Nearest] | [Find.Multiple] | 32768
wofür soll denn das grün markierte sein?? ich kann mir darauf keinen reim machen...

2.

Code: Select all

$i = 0
$sector = $i < $numwares
$wareobj = $warearray [ $i ]
.......
sieht aus als wolltest du hier ne Schleife machen, aber die funzen in X so nicht...

probiers mal so rum:
$i = size of array $warearray
while $i
| dec $i =
| $wareobj = $warearray [ $i ]
| .....
| das was du mit den einzelnen einträgen des Arrays machen wolltest
| ....
end

ach ja, die Schleife hast du an anderer stelle anders realisiert, und zwar mit goto... ist aber nicht das Optimum, ich verwende das goto nur, wenn ich innerhalb einer Schleife bedingungen prüfe und wenn da was nicht passt wird damit zum neustart vor der schleife gesprungen...

3.
$resourcezahl = $flags -> get asteroid yield
warum willst du von deinen Suchparametern die Ausbeute erhalten?? kommt mir irgendwie sinnlos vor...

mehr finde ich jetzt nicht aber ich werd auch aus dem gesamten Code ned wirklöich schlau...[/code]
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
Joda
Posts: 217
Joined: Mon, 19. Jan 04, 00:44
xr

Post by Joda » Sun, 2. Sep 07, 13:56

naja im scripten bin ich ein ziemlicher noob!
Das script besteht eigentlich aus 3 scripten die ich irgendwie versucht habe zu vereinen. hab da mal den tip dazu gekrigt, wenn ich mich nicht auskenne bestehende scripts einfach anzupassen.
und naja das ist das resultat :D

User avatar
Lucike
Posts: 12351
Joined: Sun, 9. May 04, 21:26
x4

Post by Lucike » Sun, 2. Sep 07, 14:11

@UniTrader

Die Zahl 32768 soll seine Berechtigung haben. Dadurch soll das finden von Minenfelder schneller gehen. Naja, ist zu vernachlässigen. Falsch ist es aber nicht.

@Joda

Warum schaust Du nicht mal in die EgoSkripte und baust diese ein wenig um? Das habe ich dir hier aber schon mal vorgeschlagen.

EDIT: Ach Gott, wie ich sehen muss hast Du das ja getan.

!ship.cmd.collectrocks.std.xml

Code: Select all

001   [THIS] -> set command: COMMAND_COLLECT_DEBRIS  target=$sector target2=null par1=null par2=null
002   
003 @ = [THIS] -> call script '!move.movetosector' :  sector=$sector
004   
005   * now i am in the sector, search for wares
006   $flags = [Find.Nearest] | [Find.Multiple] | 32768
007   while 1
008    
009   * find the 5 nearest wares
010    $range = [THIS] -> get scanner range
011    $warearray =  find debris: sector=[SECTOR] resource=null min yield=null flags=$flags refobj=[THIS] num=5 max distance=$range refpos=null
012    
013    $amount = 0
014    if $warearray
015   * check if one of these wares fits into my ship
016     $numwares =  size of array $warearray
017     
018     $i = 0
019     while $i < $numwares
020      $wareobj = $warearray[$i]
021      $ware = $wareobj -> get resource waretype of asteroid
022      if [THIS] -> can transport ware $ware
023       if [THIS] -> get free amount of ware $ware in cargo bay
024 @      $amount = [THIS] -> call script '!move.collectrocks' :  GALOBJ of debris=$wareobj
025        break
026       end
027      end
028      $i = $i + 1
029     end
030    end
031    
032    if not $amount
033     $wait =  = random value from 20000 to 30000 - 1
034 @   = [THIS] -> move around $wait ms
035 @   = wait randomly from 100 to 200 ms
036    end
037   end
038   return null
!move.collectrocks.xml

Code: Select all

001 @ = wait randomly from 100 to 200 ms
002   skip if $wareobj -> exists
003    return null
004   skip if $wareobj -> is of class Debris
005    return null
006   
007   * check if debris mineral typ is loadable
008   
009   $ware = $wareobj -> get resource waretype of asteroid
010   
011   skip if [THIS] -> can transport ware $ware
012    return null
013   $free = [THIS] -> get free amount of ware $ware in cargo bay
014   skip if $free
015    return null
016   
017   while 1
018    skip if $wareobj -> exists
019     return null
020    
021    skip if $wareobj -> has collectible rocks
022     return null
023    
024    $sector = $wareobj -> get sector
025    if $sector != [ENVIRONMENT]
026 @   = [THIS] -> call script '!move.movetosector' :  sector=$sector
027 @   = wait randomly from 250 to 500 ms
028     continue
029    end
030    if $ret == FLRET_FIREFREE
031     if $wareobj -> has collectible rocks
032      $catchedamount = [THIS] -> catch ware object $wareobj
033      return $catchedamount
034     end
035     $ret = FLRET_TIMEOUT
036 @   = wait randomly from 100 to 200 ms
037     continue
038    end
039    
040 @  $ret = [THIS] -> move to ware object $wareobj for collecting: timeout=600000 ms
041    if $ret != FLRET_FIREFREE
042     skip if $ret == FLRET_INTERRUPTED
043      return null
044 @   = wait randomly from 100 to 200 ms
045    end
046   end
047   return null

User avatar
Joda
Posts: 217
Joined: Mon, 19. Jan 04, 00:44
xr

Post by Joda » Sun, 2. Sep 07, 18:09

ja das habe ich getan! und versucht diese "umzubauen" was dabei herausgekommen ist das siehst du ja :evil:
habe das was ich versanden hab aus den beiden scripten versucht in dem einen unterzukrigen. ich werd daraus einfach nicht schlau! hab das schon mal so hingekrigt das es waren in den frachtraum gebeamt hat aber es hat den Quell asteroiden nicht zersört und so weiter in den frachtraum eingeladen!
kann mir jemand tipps geben oder mal ne brauchbare LÖSUNG anbieten?


Edit: helft mir mal zum verständnis

$numwares = size of array $warearray

ist doch das selbe wie <RetVar> = <RefObj> erhalte Asteroiden-Daten
oder?

User avatar
Lucike
Posts: 12351
Joined: Sun, 9. May 04, 21:26
x4

Post by Lucike » Sun, 2. Sep 07, 20:11

Joda wrote:Edit: helft mir mal zum verständnis

$numwares = size of array $warearray

ist doch das selbe wie <RetVar> = <RefObj> erhalte Asteroiden-Daten
oder?
Naja, nicht ganz. Mit "size of array" bekommst du die Anzahl der Elemente in einer Tabelle.

Mein Vorschlag. Ob die ganzen Befehle mit einem Debris funktionieren muss man testen. Auch sollte man die Menge des Minerales mit dem normalen Einsammeln vergleichen.

Code: Select all

001   [THIS] -> set command: COMMAND_COLLECT_DEBRIS  target=$sector target2=null par1=null par2=null
002   
003 @ = [THIS] -> call script '!move.movetosector' :  sector=$sector
004   
005   * now i am in the sector, search for wares
006   $flags = [Find.Nearest] | [Find.Multiple] | 32768
007   while 1
008    
009   * find the 5 nearest wares
010    $range = [THIS] -> get scanner range
011    $warearray =  find debris: sector=[SECTOR] resource=null min yield=null flags=$flags refobj=[THIS] num=5 max distance=$range refpos=null
012    
013    $amount = 0
014    if $warearray
015   * check if one of these wares fits into my ship
016     $numwares =  size of array $warearray
017     
018     $i = 0
019     while $i < $numwares
020      $wareobj = $warearray[$i]
021      $ware = $wareobj -> get resource waretype of asteroid
022      if [THIS] -> can transport ware $ware
023       if [THIS] -> get free amount of ware $ware in cargo bay
024        
025        if [THIS] -> get amount of ware Transporter in cargo bay
026         $amount = null
027 @       = [THIS] -> follow object $wareobj with precision 5000 m
028         $distance = get distance between [THIS] and $wareobj
029         if $distance <= 6000
030          $wareobjamount = $wareobj -> erhalte Asteroiden-Daten
031          $wareobj -> destruct: show no explosion=[TRUE]
032          skip if $wareobj -> exists
033           $amount = [THIS] -> add $wareobjamount units of $ware
034         end
035         break
036        else
037 @       $amount = [THIS] -> call script '!move.collectrocks' :  GALOBJ of debris=$wareobj
038         break
039        end
040        
041       end
042      end
043      $i = $i + 1
044     end
045    end
046    
047    if not $amount
048     $wait =  = random value from 20000 to 30000 - 1
049 @   = [THIS] -> move around $wait ms
050 @   = wait randomly from 100 to 200 ms
051    end
052   end
053   return null

User avatar
Joda
Posts: 217
Joined: Mon, 19. Jan 04, 00:44
xr

Post by Joda » Mon, 3. Sep 07, 00:46

das funktioniert einwandfrei :D
er sammelt nur auch nicht sammelbare asteroiden das könnte man doch mit dem befehl " if $wareobj-> has collectible rocks" verhindern oder? einfach in zeile 24 einfügen zu den abfragen!? kann das erst morgen abend nach der arbeit testen aber trotzdem
danke danke danke!!!!!!!!!!!!!!!!!!

User avatar
Lucike
Posts: 12351
Joined: Sun, 9. May 04, 21:26
x4

Post by Lucike » Mon, 3. Sep 07, 01:05

Joda wrote:... das könnte man doch mit dem befehl " if $wareobj-> has collectible rocks" verhindern oder? einfach in zeile 24 einfügen zu den abfragen!?
Genau, diese Abfrage kommt ja erst im Skript !move.collectrocks.xml. Für den Mineralstaubsauger brauchen wir das bereits im Skript ship.cmd.collectrocks.std.xml. ;)

Gruß
Lucike

User avatar
Joda
Posts: 217
Joined: Mon, 19. Jan 04, 00:44
xr

Post by Joda » Sun, 9. Sep 07, 16:03

noch mal ne kleine frage

wie krigt man es hin das ein kommando im special menü schon vorhanden ist aber es man erst bei einem bestimmten uprade anwählen kann, so wie bei sammle mineralien in sektor?
wenn ich es so

$key = COMMAND_TYPE_SPECIAL_49
set script command upgrade: command= $key upgrade= Spezialsoftware Mk1
global script map: set: key= $key , class= Ship , race= Player , script= "astro.sammler.std" , prio= 0
return null

mache kommt das command erst wenn ich spezialsoftware mk1 installiere.
die text dateien habe ich schon erstellt und wenn das jetzt hinhaut stell ich es mal als download zur verfügung wenn lucike es mir gestattet :D
das script ist wirklich sehr nützlich und man kann ne menge an resourcen sammeln! es funktioniert wunderbar zusammen mit dem mineraliensprengmeister aus dem bonuspack auch oos!

Post Reply

Return to “X³: Reunion - Scripts und Modding”