[DISKUSSION] Allgemeine S&M-Fragen

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

Locked
User avatar
ScRaT_GER
Posts: 1962
Joined: Tue, 8. Jan 08, 18:19
x3tc

Post by ScRaT_GER » Sun, 21. Jun 09, 22:09

Es hört einfach nicht auf:

Jetzt wo zumindest SIGNAL_DOCKED tadellos funktioniert, mucken SIGNAL_BUYWARE und SIGNAL_SELWARE.

Mittels

global secondary signal map: add signal=SIGNAL_BUYWARE race=null class =Schiff script='trov.signal.trade' prio=100 name='trov.signal.buyware'

versuche ich, bei allen Schiffen im Universum das SIGNAL_BUYWARE mit meinem Skript zu verbinden.
Es funktioniert auch, allerdings NUR bei Nichtspielerschiffen.

Bei Spielerschiffen (bzw. ich habe es nur mit dem Spielerschiff getestet) wird das Skript einfach nicht gestartet!

Auf das primäre Signal möchte ich aus Kompatibilitätsgründen nicht (mehr) setzen.

Deswegen an die Experten hier: Woran liegt das und wie kann ich das beheben?

MfG,
ScRaT

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

Post by UniTrader » Sun, 21. Jun 09, 22:26

ScRaT_GER wrote:Es hört einfach nicht auf:

Jetzt wo zumindest SIGNAL_DOCKED tadellos funktioniert, mucken SIGNAL_BUYWARE und SIGNAL_SELWARE.

Mittels

global secondary signal map: add signal=SIGNAL_BUYWARE race=null class =Schiff script='trov.signal.trade' prio=100 name='trov.signal.buyware'

versuche ich, bei allen Schiffen im Universum das SIGNAL_BUYWARE mit meinem Skript zu verbinden.
Es funktioniert auch, allerdings NUR bei Nichtspielerschiffen.

Bei Spielerschiffen (bzw. ich habe es nur mit dem Spielerschiff getestet) wird das Skript einfach nicht gestartet!

Auf das primäre Signal möchte ich aus Kompatibilitätsgründen nicht (mehr) setzen.

Deswegen an die Experten hier: Woran liegt das und wie kann ich das beheben?

MfG,
ScRaT
hast du Waren manuell gekauft oder deinem Schiff einen Handelsbefehl gegeben?? in ersterem fall wundert es mich nicht, weil das Signal afaik nur greift, wenn ein Script den buy/sell Ware-Befehl ausführt, nicht wenn der Spieler Waren manuell transferiert...
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
ScRaT_GER
Posts: 1962
Joined: Tue, 8. Jan 08, 18:19
x3tc

Post by ScRaT_GER » Sun, 21. Jun 09, 22:41

Ich bin momentan dabei mein Skript "Handelsübersicht" neu zu schreiben.

Bei diesem wurden die Skripte an die Primärsignale gekoppelt.
Dabei hat auch beim manuellen Handeln alles funktioniert.

EDIT: Habe es nochmal ausprobiert. SIGNAL_BUYWARE als primäres Signal zu verwenden funktioniert einwandfrei...

EDIT: Im englischen Forum hat Cycrow die Sache geklärt. Bei den Spielerschiffen funktionieren einige Signale nicht aufgrund der Arbeitsweise.
Ist aber auch egal, da er mir gleichzeitig noch gesagt hat, wie ich es trotzdem schaffen kann.

MfG,
ScRaT

Raumkraut93
Posts: 1368
Joined: Wed, 18. Mar 09, 22:20
x3tc

Post by Raumkraut93 » Tue, 23. Jun 09, 13:08

Weiss einer ob es möglich ist das "Prime" von Argon Prime zu bekommen (also mit Aussprache) sódass ich vor das Prime etwas anderes setzen kann (statt Argon Prime dann Split Prime z.b.) im t-file?
"Dies ist alles, was ich über den Krieg weiss: Einer gewinnt, einer verliert
und nichts ist nachher so
wie es vorher war."

"Stellt eure Truppen auf, oh große Generäle,
Der Preis des Sieges übersteigt den Preis der Niederlage."

User avatar
ScRaT_GER
Posts: 1962
Joined: Tue, 8. Jan 08, 18:19
x3tc

Post by ScRaT_GER » Tue, 23. Jun 09, 15:57

Ja, das ist möglich.

Du bräuchtest erstmal eine neue t-file, in der du "Split Prime" speicherst.
"Split" musst du irgendwo bei den Rassennamen in der 0001-L049.xml suchen, für "Prime" gibt es afaik keinen einzelnen Eintrag, sondern immer nur in Verbindung mit "Argon" oder "Paranid", d.h. du musst dir den richtigen Abschnitt aus der 00149.dat (=Sounddatei) raussuchen und einen neuen Eintrag in der 00049.xml machen.

In deiner T-file gibst du dann zuerst einen Referenz zu "Split" und dann zu "Prime".

Wichtig ist dabei, auf welcher Textseite und bei welcher ID diese Informationen stehen.
Die Textseite muss mit der Textseite, auf der "Argon Prime" steht, übereinstimmen. Die TextID muss genau die gleiche wie von "Argon Prime" sein.

Im Spiel lädst du jetzt einfach deine Textdatei, die "Argon Prime" mit "Split Prime" überschreibt und schon sollte es klappen.

Du siehst, es ist eine etwas langwierige Prozedur...

Viel Glück und mfG,
ScRaT

Raumkraut93
Posts: 1368
Joined: Wed, 18. Mar 09, 22:20
x3tc

Post by Raumkraut93 » Tue, 23. Jun 09, 22:39

Aaaalso,

ich hab mal ein wenig in der 00049.xml gesucht

Code: Select all

  <t id="1020402" s="50132276" l="1027"/>
Ist ja Argon Prime.

So, erstmal: Wofür steht "s" und wofür "l"?
Ich hatte gedacht vielleicht "Start" und "Länge"?

In dem Fall, wie wäre es wenn man es einfach mal versucht mit s="50132876" (Startpunkt bei normalem Start + etwas mehr als die Hälfte der Länge) und l="427" ? Würde sowas evt. klappen (man müsste dann ganz oft testen bis es passt)?
d.h. du musst dir den richtigen Abschnitt aus der 00149.dat (=Sounddatei) raussuchen
Wie öffne ich die Datei und wie schaffe ich es den Abschnitt zu finden?
Die Datei hab ich vor ein paar Monaten schoma versucht zu öffnen, mit Audacity, da kam aber nur ein helles lautes schrilles Piepsen für ein paar Sekunden ...

PS: Ich will Argon Prime nicht überschreiben, sondern nur dieses Prime nutzen für einen komplett anderen Sektor! Geht das auch?
"Dies ist alles, was ich über den Krieg weiss: Einer gewinnt, einer verliert
und nichts ist nachher so
wie es vorher war."

"Stellt eure Truppen auf, oh große Generäle,
Der Preis des Sieges übersteigt den Preis der Niederlage."

User avatar
ScRaT_GER
Posts: 1962
Joined: Tue, 8. Jan 08, 18:19
x3tc

Post by ScRaT_GER » Tue, 23. Jun 09, 23:19

Ja, auch das geht.
Ich hatte gedacht vielleicht "Start" und "Länge"?
Ist genau richtig. Dabei ist die Einheit ms.

Du kannst die Sounddatei mit dem VLC Media Player öffnen. Das wird allerdigns nicht viel bringen, da die ms nicht angezeigt werden.

Leider habe ich noch kein kostenloses Programm gefunden, das richtig mit dieser Sounddatei umgehen kann. Als 30-Tage-Testversion kannst du es mit SoundForge von Sony versuchen.
Einfach die Datei zu .mp3 umbennenen und importieren.

Naja, da ich die Möglichkeiten/Programme habe, die entsprechenden Stellen rauszusuchen habe ich mal "Prime" für dich rausgeschrieben.
Ich würde folgende Werte nehmen:
s = 50132813
l = 570
Das ergibt ein ganz gutes "Prime".

Mit neuen Sektoren hab ich das noch nicht versucht, ich bin aber sicher, dass das geht.
Da musst du wohl etwas experimentieren, wo du welche Einträge erstellst, ect.

MfG,
ScRaT

Raumkraut93
Posts: 1368
Joined: Wed, 18. Mar 09, 22:20
x3tc

Post by Raumkraut93 » Wed, 24. Jun 09, 13:27

ScRaT_GER wrote:
Naja, da ich die Möglichkeiten/Programme habe, die entsprechenden Stellen rauszusuchen habe ich mal "Prime" für dich rausgeschrieben.
Ich würde folgende Werte nehmen:
s = 50132813
l = 570
Das ergibt ein ganz gutes "Prime".
Super, vielen Dank für deine Bemühungen. Habe es gerade getestet und es ist perfekt :D
ScRaT wrote:Mit neuen Sektoren hab ich das noch nicht versucht, ich bin aber sicher, dass das geht.
Da musst du wohl etwas experimentieren, wo du welche Einträge erstellst, ect.
Jo war ganz einfach:
Hab eine neue Zeile in die 00049.xml geschrieben:

Code: Select all

  <t id="71317" s="50132813" l="570"/>
Und in den t-file dann

Code: Select all

t id="71317">Prime</t>
t id="1020909>{1000,103} {7,71317}</t>
{1000,103} ist "Split". Und fertig war Split Prime :)

Vielen Dank nochmal! Ich lad mir jetzt mal diese Testversion runter und schaue ob ich das auch irgendwie alleine hinkrieg, dann könnte ich mir nämlich noch ein paar andere Wörter rausholen :)

mfg
raumkraut93
"Dies ist alles, was ich über den Krieg weiss: Einer gewinnt, einer verliert
und nichts ist nachher so
wie es vorher war."

"Stellt eure Truppen auf, oh große Generäle,
Der Preis des Sieges übersteigt den Preis der Niederlage."

Cronos988
Posts: 691
Joined: Mon, 27. Aug 07, 12:34
x3tc

Post by Cronos988 » Thu, 25. Jun 09, 17:17

Gibt es eigentlich eine Möglichkeit Skripts außerhalb von X3 zu bearbeiten?

Einen Stand-alone Skripteditor habe ich noch nicht gefunden.

Ich weiß dass Skripts XML FIles sind, die über die XSL-Formatdatei X2script.xsl angezeigt werden wie im Skript Editor. Nur kann ich in dieser Anzeige nichts ändern. Ich habe einen XML editor, aber der gibt mir die XML-Datei im Rohformat, ohne die XSL Formatierung. Gibt es Prgramme die es erlauben eine XML Datei in der entsprechenden XSL Formatierung zu bearbeiten?

Ich hätte gerne die Möglichkeit a.) ohne Spiel im Hintergrund zu skripten und b.) auch mal unterwegs schnell ein paar Ideen aufzuschreiben.

User avatar
ScRaT_GER
Posts: 1962
Joined: Tue, 8. Jan 08, 18:19
x3tc

Post by ScRaT_GER » Thu, 25. Jun 09, 17:25

Exscriptor.
Sehr zu empfehlen.

MfG,
ScRaT

User avatar
ScRaT_GER
Posts: 1962
Joined: Tue, 8. Jan 08, 18:19
x3tc

Post by ScRaT_GER » Sat, 27. Jun 09, 00:12

Welche Ursachen, außer einem "infinite loop", kann ein Einfrieren des kompletten Spiels beim Starten eines Skripts haben?

Ich habe das Skript jetzt zig Mal durchgeschaut und habe wirklich bei jedem Loop ein Wait von mindestens 1 ms. Da dürfte es dann eigentlich sogar egal sein, ob der Loop unendlich ist (was keiner der Loops sein sollte).

Könnte auch ein falsch "kodierter" Code das Problem sein? Ich frage, weil ich vieles mit einem externen Skripteditor (s.o. Exscriptor) schreibe.
Bei diesem gab es schonmal das Problem, dass die Datatypes nicht erkannt, aber richtig angezeigt wurden.
Allerdings kann ich die Möglichkeit, dass der Exscriptor das Problem verursacht fast ausschließen, da ein kleiner Testcode mit dem Exscriptor geschrieben, keine Probleme machte.
Wenn es also der Exscriptor ist, muss es irgendein bestimmter Befehl sein und diesen herauszufinden dürfte schwer werden.

Deswegen habe ich erstmal im Skript selber gesucht, aber wie gesagt, nichts gefunden. Wo könnte der Fehler sein?

MfG,
ScRaT

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

Post by UniTrader » Sat, 27. Jun 09, 00:41

schalte mal zu beginn des Scriptes die Infinite loop detection ein, dann bekommst du normalerweise nen Hinweis darauf wo das Script sich aufhängt... und Poste mal den Code des Scriptes, vielleicht hast du was übersehen ;) es gibt da auch einige Befehle die bei ungünstigen Parametern und unter ungünstigen Umständen nen Freeze verursachen (und ja, es kann auch an einem Fehler im Exscriptor liegen..)
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
Gazz
Posts: 13244
Joined: Fri, 13. Jan 06, 16:39
x4

Post by Gazz » Sat, 27. Jun 09, 10:40

ScRaT_GER wrote:Welche Ursachen, außer einem "infinite loop", kann ein Einfrieren des kompletten Spiels beim Starten eines Skripts haben?

Ich habe das Skript jetzt zig Mal durchgeschaut und habe wirklich bei jedem Loop ein Wait von mindestens 1 ms.
Ist das vielleicht ein setup script?

Bei denen erzeugt das Wait keinen interrupt. Ein setup script wird ohne Unterbrechung bis zum Ende durchlaufen.
Waits helfen dort also nicht. Eher im Gegenteil.
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.

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

Post by UniTrader » Sat, 27. Jun 09, 10:55

Gazz wrote:
ScRaT_GER wrote:Welche Ursachen, außer einem "infinite loop", kann ein Einfrieren des kompletten Spiels beim Starten eines Skripts haben?

Ich habe das Skript jetzt zig Mal durchgeschaut und habe wirklich bei jedem Loop ein Wait von mindestens 1 ms.
Ist das vielleicht ein setup script?

Bei denen erzeugt das Wait keinen interrupt. Ein setup script wird ohne Unterbrechung bis zum Ende durchlaufen.
Waits helfen dort also nicht. Eher im Gegenteil.
hat sich das etwa seit Reunion geändert?? ich kann mich da an ein paar experten erinnern, die ne Endlosschleife in nem Setup-script realisiert haben - einen Freeze gab es nicht aber dafür wurden alle Setup-Scripts die danach ausgeführt werden sollten einfach nicht ausgeführt - weil alle setups nacheinander ausgeführt werden und eben dieses niemals beendet 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 ;)

User avatar
Gazz
Posts: 13244
Joined: Fri, 13. Jan 06, 16:39
x4

Post by Gazz » Sat, 27. Jun 09, 11:00

Naja sie warten schon, aber es gibt eben keinen interrupt, der die Kontrolle einem anderen (setup) script übergibt.
Vielleicht wird darurch "irgendwas" verzögert?

Ich rate auch nur rum bis irgendwer die richtige Frage stellt. =P
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
ScRaT_GER
Posts: 1962
Joined: Tue, 8. Jan 08, 18:19
x3tc

Post by ScRaT_GER » Sat, 27. Jun 09, 12:29

Nein, es ist kein Setup-Skript.

Ich konnte aber den Fehler auf folgenden Code eingrenzen:

209 $size.log = size of array $log.ware.buy
210 while $size.log
211 |dec $size.log =
212 |
213 |$ware = $log.ware.buy[$size.log]
214 |$time = $log.buy[$size.log][1]
215 |$index = get index of $ware in array $log.ware.sell offset=null + 1
216 |$amount.buy = $log.amount.buy[$size.log]
217 |
218 |if $index >= 0
219 ||
220 ||$time.comp = $log.sell[$index][1]
221 ||
222 ||if $time < $time.comp
223 |||
224 |||$amount.sell = $log.amount.sell[$index]
225 |||$amount.dummy = $amount.buy - $amount.sell
226 |||$amount.buy = $amount.sell
227 |||
228 * calculate values for new entry
229 |||$price.buy = $log.buy[$size.log][4]
230 |||$price.sell = $log.sell[$index][4]
231 |||$price.dummy = $price.sell + $price.buy
232 |||$profit = $amount.buy * $price.dummy
233 |||$time = $log.buy[$size.log][1]
234 |||
235 |||append $time to array $log.time
236 |||
237 |||$time = format time: $time
238 |||
239 |||gosub FlightInfo
240 |||
241 * delete used entries
242 |||remove element from array $log.ware.buy at index $size.log
243 |||remove element from array $log.ware.sell at index $index
244 |||remove element from array $log.amount.buy at index $size.log
245 |||remove element from array $log.amount.sell at index $index
246 |||remove element from array $log.buy at index $size.log
247 |||remove element from array $log.sell at index $index
248 |||
249 * append new entries
250 |||if not $amount.dummy == 0
251 ||||$array = $log.buy[$size.log]
252 ||||$array.dummy = clone array $array : index 0 ... 5
253 ||||$array.dummy[5] = $amount.dummy
254 ||||
255 ||||append $array.dummy to array $log.buy
256 ||||append $ware to array $log.ware.buy
257 ||||append $amount.dummy to array $log.amount.buy
258 ||||
259 ||||inc $size.log =
260 |||end
261 |||
262 * create entry
263 |||
264 |||$amount.buy = convert number $amount.buy to string
265 |||$profit = convert number $profit to string
266 |||
267 |||$text = sprintf: pageid=$PageID textid=300, $time, $amount.buy, $ware, $price.dummy, $profit
268 |||add custom menu item to array $log.object: text=$text returnvalue=$subarray
269 |||
270 ||end
271 ||
272 * ---------------------
273 ||
274 |else
275 ||
276 * calculate values for new entry
277 ||
278 ||$time = $log.buy[$size.log][1]
279 ||
280 ||append $time to array $log.time
281 ||
282 ||$time = format time: $time
283 ||$price.buy = $log.buy[$size.log][4]
284 ||$profit = $amount.buy * $price.buy
285 ||
286 ||gosub FlightInfo
287 ||
288 * delete used entries
289 ||remove element from array $log.ware.buy at index $size.log
290 ||remove element from array $log.amount.buy at index $size.log
291 ||remove element from array $log.buy at index $size.log
292 ||
293 * create entry
294 ||
295 ||$amount.buy = convert number $amount.buy to string
296 ||$profit = convert number $profit to string
297 ||
298 ||$text = sprintf: pageid=$PageID textid=301, $time, $amount.buy, $ware, $price.buy, $profit
299 ||add custom menu item to array $log.object: text=$text returnvalue=$subarray
300 ||
301 |end
302 |
303 @ |= wait 10 ms
304 end


Ich habe zum Auschließen einer Endlosschleife das Ende folgendermaßen
verändert:

303 |return null
304 @ |= wait 10 ms
305 end

Also "return null" eingefügt. Dadurch müsste sich ja das Skript automatisch beenden, sobald es diese Stelle erreicht. Stattdessen kommt es wieder zum Freeze.

Vielleicht leide ich an Betriebsblindheit, aber ich kann den Fehler, der zum Freeze führt, einfach nicht finden.

Im Sub "FlightInfo" gibt es übrigens keine Schleifen. Dort wird nur der $subarray erstellt (returnvalue).

Und die Inkrementierung von $size.log in Zeile 259 dürfte auch nicht der Grund sein, es gibt ja schließlich einen Wait.

MfG,
ScRaT

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

Post by Lucike » Sat, 27. Jun 09, 12:46

ScRaT_GER wrote:211 |dec $size.log =
259 ||||inc $size.log =
Wahrscheinlich geht die Schleife nicht vorran. Ich hab's nur kurz überflogen ...

Gruß
Lucike
Image

User avatar
Gazz
Posts: 13244
Joined: Fri, 13. Jan 06, 16:39
x4

Post by Gazz » Sat, 27. Jun 09, 12:48

Funktioniert Z. 215?
null + 1 ergibt Unsinn.

Normalerweise wird dort -1 eingesetzt.
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
ScRaT_GER
Posts: 1962
Joined: Tue, 8. Jan 08, 18:19
x3tc

Post by ScRaT_GER » Sat, 27. Jun 09, 12:55

Danke für die Antworten.

@Lucike

Eigentlich sollte es vorran gehen. Und selbst wenn nicht wäre da ja noch der Wait.

@Gazz
null +1 ist tatsächlich Unsinn, aber mit -1 bekommt man falsche Werte. :?
Zumindest ist es bei mir so, dass die Werte mit "null + 1" immer richtig waren. Man könnte wahrscheinlich auch "0 + 1" nehmen, das Resultat ist das gleiche. Finde ich auch etwas seltsam, da es auch in der MSCI Onlinereferenz anders erklärt wird: <RetVar> = get index of <Value> in array <Var/Array> offset <Var/Number>+1

Habe es auch gerade mit "-1 +1" ausprobiert und es ist trotzdem eingefroren.

MfG,
ScRaT

User avatar
Gazz
Posts: 13244
Joined: Fri, 13. Jan 06, 16:39
x4

Post by Gazz » Sat, 27. Jun 09, 13:09

0 (und möglicherweise null) bedeutet, daß nur indizes 1 - max durchsucht werden.
In der Regel will man aber das ganze Array durchsuchen.

ScRaT_GER wrote:Und die Inkrementierung von $size.log in Zeile 259 dürfte auch nicht der Grund sein, es gibt ja schließlich einen Wait.
Laß die Schleife doch einfach in ein Logfile laufen.
Dann siehst du ja ob es da hängt und wie der Index runtergezählt wird.
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.

Locked

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