Positionsangaben auslesen

Hier ist der ideale Ort um über Scripts und Mods für X²: Die Bedrohung zu diskutieren.

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

Ralf Hansen
Posts: 385
Joined: Sun, 8. Feb 04, 16:41
x2

Positionsangaben auslesen

Post by Ralf Hansen »

Hallöchen

Ich hab follgendes Problem.

Ich möchte in bestimmten Sektoren ($Sek) beim Annähern auf 20000m an einen BESTIMMTEN Asteoriden an folgenden Koordinaten
(z.B. mit X=0, Y=0, Z=50000) eine Aktion ausführen lassen.


Leider finde ich mit

Code: Select all

Get Sektor from Universe Index X=1, Y=3
set postition of sector objekt = $Fundort : x= 0 y = 0 z = 50000

if find asteroid $Sec ..., null ... null, ... null, refobj = Playership , maxdist = 20000, ...null , refpos = $Fundort
JEDEN Asteroiden, welchem ich mit meinem Spielerschiff
auf 20000m nähere, obwohl ich die Position mit $refpos genau
angegeben habe (Constante Nächstes Objekt bei Flags hilft auch nicht).

Wie müsste die Abfrage nach dem Asteroieden an den x,y,z kordinaten genau aussehe, sodass ich wirklich nur den einen Asteroiden als
Ziel angegeben habe ?
Eine Koordinaten Angabe (Anstelle des Asteroiden) wäre auch ok - aber wie ?

Danke im Vorraus

Tschüssi

Ralf
ManfredP
Posts: 115
Joined: Tue, 25. Apr 06, 12:40

Ne Möglichkeit ...

Post by ManfredP »

Hallo,
mach zunächst keinen if für den Asteroid, sondern lese die ID in eine Variable. Erzeuge beim Start eine Variable mit der Objekt-ID des Asteroiden, um den es dir geht. Vergleiche dann die ID aus dem find mit der ID aus dem Param. Et voila ...

Tschüß

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

Post by UniTrader »

ich würde es so lösen:

Code: Select all

$Sec = get sector from Universe Index x:1, Y:3
$Fundort = array alloc: 0
append 0 to array $Fundort
append 0 to array $Fundort
append 50000 to array $Fundort
append $Sec to array $Fundort

$Ast = find asteroid: sector=$Sec resourcetype=null min.yield=null flags=find.nearest refobj=null maxdist=10 maxnum=1 refpos=$Fundort

$dis = get distance betweeen [PLAERSHIP] and $ast
while $dis > 20000
 @wait 0 ms
 $dis = get distance betweeen [PLAERSHIP] and $ast
end
.......................
hier der Teil, der erfolgen soll, wenn der Spieler in Reichweite des Astros ist
.......................
so würde das Script jeden frame prüfen, ob der Spieler in Reichweite des Astros ist und wenn dies der fall ist mit dem Code fortfahren ;)
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 ;)
ManfredP
Posts: 115
Joined: Tue, 25. Apr 06, 12:40

Post by ManfredP »

UniTrader {KBG} wrote:ich würde es so lösen:

Code: Select all

$Sec = get sector from Universe Index x:1, Y:3
$Fundort = array alloc: 0
append 0 to array $Fundort
append 0 to array $Fundort
append 50000 to array $Fundort
append $Sec to array $Fundort

$Ast = find asteroid: sector=$Sec resourcetype=null min.yield=null flags=find.nearest refobj=null maxdist=10 maxnum=1 refpos=$Fundort

$dis = get distance betweeen [PLAERSHIP] and $ast
while $dis > 20000
 @wait 0 ms
 $dis = get distance betweeen [PLAERSHIP] and $ast
end
.......................
hier der Teil, der erfolgen soll, wenn der Spieler in Reichweite des Astros ist
.......................
so würde das Script jeden frame prüfen, ob der Spieler in Reichweite des Astros ist und wenn dies der fall ist mit dem Code fortfahren ;)
Sicher, so geht es auch. Aber: Das Script prüft auf einen festen Ort ($Fundort), weshalb es für jede Änderung (anderer Asteroid) geändert werden müsste. Auch kann man bei mehreren Asteroiden nie ganz sicher sein, dass man die richtige Position angegeben hat (damit auch der richtige Asteroid vom find gefunden wird). Das muss man also bei einer Änderung erst testen.
Geht man statt dessen vom Schiff (seiner Position) aus, wird immer der am nächsten am Schiff stehende Asteroid gefunden. Den kann man dann bezüglich der Objekt-ID prüfen, ob es überhaupt der Richtige ist und dann den Abstand testen (find nearest heist ja nicht, dass das Ding nicht weit weg sein kann -wenn andere noch weiter weg sind ...). Ich vermute, dass geht schneller (das heist, es verbraucht weniger Arbeitszeit). Ein Test vorweg, ob das Schiff überhaupt im richtigen Sektor ist, würde die Sache sogar noch mehr beschleunigen. Dieser Test da in jedem Frame bremst die Kiste doch ziemlich ab. Das funktioniert bei einem Super-Rechner, aber ... hat den denn jeder?

Tschüß

ManfredP
Ralf Hansen
Posts: 385
Joined: Sun, 8. Feb 04, 16:41
x2

Lösung gefunden

Post by Ralf Hansen »

Hallo

Ich habe es mir recht einfach gemacht und das Problem folgendermassen gelöst:

if find ship: Sektor=$Sec class of type=(Playership) race=Player flags=null maxdist=null maxnum=null refpos=null
.$Distanz = (Playership) -> get distance to: x=$X y=$Y z=$Z
..if $ Distanz < 20000
...juhu, gefunden - mache das, was getan werden soll
...wait 100
..end
.end
end
x, y und z ist die Position vom Asteroiden. So kann ich auch Nebel oder sonstiges ohne viel Aufwand abfragen.
Das ganze frage ich ständig über ne Schleife an 40 Postitionen ab, ohne das es zu merklichen Aussetzern kommt im Spiel.

Troztdem Dank für die Tips

Gerade mit Arrays kenne ich mich überhaupt nicht aus, und könnte mehr infos dazu gut gebrauchen...

Tschüssi

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

Post by UniTrader »

ManfredP wrote:.....
Dieser Test da in jedem Frame bremst die Kiste doch ziemlich ab. Das funktioniert bei einem Super-Rechner, aber ... hat den denn jeder?
....

1. könnte man die Wartezeit natürlich erhöhen

2. geht das afaik net wirklich auf die Performance, ich hab da ne umfangreichere Schleife in meinem Schiffsnamensscript für X3 gemacht und hab keinen merklichen aussetzer, hier der Codeteil:
001 $pageID = get global variable: name='cssn.text.id'
002 $TextID = 0
003 $TextID2 = 500
004
005 while $TextID <= 499
006 $substitute = read text: page=$pageID id=$TextID
007 $pattern = read text: page=$pageID id=$TextID2
008 $text = substitute in string $text: pattern $pattern with $substitute
009 inc $TextID =
010 inc $TextID2 =
011 end
012 return $text
ausserdem hab ich ein anderes Script gemacht, welches das Spieler-HQ in rotation versetz, da wird die drehung in JEDEM frame etwas geändert und ich habe noch keinen einfluss auf die Performance gespürt ;) (ich glaube, diese Schleife war sogar noch umfangreicher, da ich noch einige abfragen eingebaut 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 ;)
LordZsar1
Posts: 630
Joined: Mon, 6. Jun 05, 14:25
x3tc

Post by LordZsar1 »

Es liegt daran, dass jedes ausgeführte Script in X² (und sicherlich auch in X³) einen eigenen Prozess darstellt, der eine eigene Priorität besitzt (diese ist durch einen Befehl im ersten Befehlsorder des Editors änderbar).
Das bedeutet, dass ein Script mit Endlosschleife für seine ordnungsgemäße Ausführung zwar eine sehr große Menge an Rechenkapazität bräuchte... Diese aber ganz einfach nicht erhält, weil die verfügbare Kapazität unter allen Prozessen gleicher Priorität aufgeteilt wird und jene mit höherer Priorität ohnehin Vorrang haben.

Übrigens eine gute Idee bei allen Problemen mit sehr rechenintensiven Scripts: Einfach die Priorität senken.
Dann würde die Anweisung möglicherweise zwar nicht so spontan ausgeführt wie gewollt (das Script "ruckelt" sozusagen - aber hey, besser das Script als das ganze Spiel), aber zumindest so spontan, wie es der Computer eben schafft.
... Natürlich liefe dies darauf hinaus, dass beispielsweise bei einer Jägersteuerung jene mit besseren Computern auch bessere Computergegner hätten...

Return to “X²: Die Bedrohung - Scripts und Modding”