Raumfliegen per Script/Mod entfernen
Moderators: Moderatoren für Deutsches X-Forum, Scripting / Modding Moderators
SO. ich habe heute den ganzen tag damit verbracht, manuell ALLE Sektoren abzufliegen und jedes Objekt zu zerstören...
Ohne Erfolg.
Mittlerweile ist aber eingefallen, wo das Problem liegen könnte:
Wahrscheinlich wurde ein "create"_Kommando mit null aufgerufen,
macht man das als Spieler mit einem Schiff, erscheint es in der Liste, aber als Sektor "null".
Die kann man einfach wegscripten, aber die blöden Raumfliegen bekomme ich nicht mit dem Script erfasst.
Tja
Wie gesagt: neues Spiel starten ist keine Option.
Bisher ist nur der SINZA langsam.
Das Savegame hat schon 3 Rechner, 4 Betriebsysteme, 2 PKW, 2 Umzüge und vieles mehr überlebt.
Ich hänge dran.
Ohne Erfolg.
Mittlerweile ist aber eingefallen, wo das Problem liegen könnte:
Wahrscheinlich wurde ein "create"_Kommando mit null aufgerufen,
macht man das als Spieler mit einem Schiff, erscheint es in der Liste, aber als Sektor "null".
Die kann man einfach wegscripten, aber die blöden Raumfliegen bekomme ich nicht mit dem Script erfasst.
Tja
Wie gesagt: neues Spiel starten ist keine Option.
Bisher ist nur der SINZA langsam.
Das Savegame hat schon 3 Rechner, 4 Betriebsysteme, 2 PKW, 2 Umzüge und vieles mehr überlebt.
Ich hänge dran.
Folgendes habe ich noch erfolglos probiert:
- Object Class der RF in der tShips auf M5 ändern
- ID der RF in der tSHips ändenr (gab nicht mal einen Crash...)
- find ship so benutzen, dass es einen M5 bei mit im Sektor findet. Auf Raumfliegen umstellen und ein paar freilassen -> die RF wurden NICHT gefunden, mit demselben Code
Da hat Egosoft mal wieder gezaubert.
Die beidne Scrippte ship.cmd.follow.spacefly und ship.cmd.idle.spacefly enthalten beide eine Entlosschleife ohne Abbruchmöglichkeit.
D.H. sobald irgendwas "außen" schief geht, die RF also nicht wie vorgesehen entfernt werden, wenn man den Sektor verlässt, hat man keine Möglichkeit sie zu beenden...
Da könnte ich mich schon wieder aufregen... Von Egosoft ist natürlich auch keine Hilfe zu erwarten...
Heute werde ich beide Scripte noch so modifizieren, dass sie in der Schleife mein Check-Script aufrufen und sich extern beenden lassen, wenn ich das wünsche. Das gilt natürlich nur für alle neu erstellten Sripte.
Außerdem habe ich den Verdacht, dass es eventuell mit dem unfokussiertem Sprungantrieb zusammenhängt. Dass dort beim Verlassen des Sektors erst der Sektor gelöscht wird und die Objekt liegen bleiben.
Ist natürlich nur ne Theorie, heute Abend weiß ich mehr.
Bin echt genervt...
- Object Class der RF in der tShips auf M5 ändern
- ID der RF in der tSHips ändenr (gab nicht mal einen Crash...)
- find ship so benutzen, dass es einen M5 bei mit im Sektor findet. Auf Raumfliegen umstellen und ein paar freilassen -> die RF wurden NICHT gefunden, mit demselben Code
Da hat Egosoft mal wieder gezaubert.
Die beidne Scrippte ship.cmd.follow.spacefly und ship.cmd.idle.spacefly enthalten beide eine Entlosschleife ohne Abbruchmöglichkeit.
D.H. sobald irgendwas "außen" schief geht, die RF also nicht wie vorgesehen entfernt werden, wenn man den Sektor verlässt, hat man keine Möglichkeit sie zu beenden...
Da könnte ich mich schon wieder aufregen... Von Egosoft ist natürlich auch keine Hilfe zu erwarten...
Heute werde ich beide Scripte noch so modifizieren, dass sie in der Schleife mein Check-Script aufrufen und sich extern beenden lassen, wenn ich das wünsche. Das gilt natürlich nur für alle neu erstellten Sripte.
Außerdem habe ich den Verdacht, dass es eventuell mit dem unfokussiertem Sprungantrieb zusammenhängt. Dass dort beim Verlassen des Sektors erst der Sektor gelöscht wird und die Objekt liegen bleiben.
Ist natürlich nur ne Theorie, heute Abend weiß ich mehr.
Bin echt genervt...
Ich habe noch ein Script gefunden, dass massenhaft (1184x)läuft und nich beendet wird: anarkis.pirate.sig.pb.attacked
Das kommt wohl von der Piratengilde...
Kann mir denn niemand helfen?
Randnotiz: Hab den UNFUG getestet:
Wenn man die Raumfliegenscripte sofort beendet und die Raumfliegen per Script tötet, werden in dem temporären Sektor massenhaft Sonnen generiert (tausende).
Klingt witzig, ist aber ein krasser Seiteneffekt.
Im Temporären Sektor ausgesetzte Fliegen werden korrekt beim Verlassen entfernt.
Daran liegt es also auch nicht.
Gibt es nicht eine Möglichkeit ALLE Objekte im Universum durchzugehen und zu checken, ob eines der Scripte läuft?
Edit: kann man das vlt mit dem MD machen?
Das kommt wohl von der Piratengilde...
Kann mir denn niemand helfen?
Randnotiz: Hab den UNFUG getestet:
Wenn man die Raumfliegenscripte sofort beendet und die Raumfliegen per Script tötet, werden in dem temporären Sektor massenhaft Sonnen generiert (tausende).
Klingt witzig, ist aber ein krasser Seiteneffekt.
Im Temporären Sektor ausgesetzte Fliegen werden korrekt beim Verlassen entfernt.
Daran liegt es also auch nicht.
Gibt es nicht eine Möglichkeit ALLE Objekte im Universum durchzugehen und zu checken, ob eines der Scripte läuft?
Edit: kann man das vlt mit dem MD machen?
|K.O.S.H. wrote:Gibt es nicht eine Möglichkeit ALLE Objekte im Universum durchzugehen und zu checken, ob eines der Scripte läuft?
Code: Select all
maintype = 0
while maintype < 16
subtype = get number of subtypes for maintype
while subtype > 0
dec= subtype
type = get ware from maintype: maintype subtype: subtype
array.objects = find objects ... irgendwie über den type
for each object in array.objects ... destroy it
emd
inc= maintype
end
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
Irren ist menschlich. Aber wenn man richtig Fehler machen will, braucht man einen Computer.
Mission Director Beispiele
new game! was is schon dabei, vllt hat es mit bereits gefixten fehlern vorheriger game-versionen zutun, sparst dir den stress. ggf kannste dir deine properties / besitztümer & ränge "exportieren" als logfile (funktioniert ingame via "write to logfile ..."). achte auf korrekte xml-formatierung, schreib n kleines md-script welches dir diese exportierte datei lädt & deine besitztümer in nem new game wiederherstellt, samt ränge ... ich glaub sowas (exportierscript) gibts bereits, musst mal suchen ... & ggf die "plausibilitäts"-checks der properties verfeinern, sodass NIX im sektor null gespawnt wird
ps: beim new game + rang fix verdienste gleich von beginn soviel wie in deinem jetzigen game-missionen, nur plots musste afaik nochmal machen (oder gleich mit-"fix"-en)
ps: beim new game + rang fix verdienste gleich von beginn soviel wie in deinem jetzigen game-missionen, nur plots musste afaik nochmal machen (oder gleich mit-"fix"-en)
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
Irren ist menschlich. Aber wenn man richtig Fehler machen will, braucht man einen Computer.
Mission Director Beispiele
hmmpf.
also das wäre allllllllerletzte Möglichkeit.
Nach 10 Jahren gebe ich das Save ungerne auf :/
Hab mir schon das Savegame entzippt und angeguckt, aber Egosoft verwendet da ASCII-Steuerzeichen als Wert - unschön...
Ich finde es auch schade, dass sich von Egosoft niemand dazu äußert, aber was anderes erwartet habe ich nicht...
also das wäre allllllllerletzte Möglichkeit.
Nach 10 Jahren gebe ich das Save ungerne auf :/
Hab mir schon das Savegame entzippt und angeguckt, aber Egosoft verwendet da ASCII-Steuerzeichen als Wert - unschön...
Ich finde es auch schade, dass sich von Egosoft niemand dazu äußert, aber was anderes erwartet habe ich nicht...
das zust du doch gar nicht, du "regenerierst" es ...|K.O.S.H. wrote:hmmpf.
also das wäre allllllllerletzte Möglichkeit.
Nach 10 Jahren gebe ich das Save ungerne auf :/
missverständnis!|K.O.S.H. wrote:Hab mir schon das Savegame entzippt und angeguckt, aber Egosoft verwendet da ASCII-Steuerzeichen als Wert - unschön...
du schreibst ein script, welches das tut:
--> get all ships
--> for each ship ...
----> get name, location, hull, shield, etc
----> write to logfile: "<t id="123">newship</t>"
also ne "t-file" zeile, so ne readtext zeile, verstehst schon ...
ein anderes script macht dann:
--> load text: id=ebendeineexportiertedatei
--> entry_count = read text: page: xyz text=1
--> for entry_count
----> create ship: nach weiter ausgelesenen daten ...
hat nix mid der savegame-datei zutun! ist nur n "merkzettel" was du für objekte besitzt, schön formatiert in ne textdatei (xml) geschoben sodass das game es wieder einlesen kann. sowas gibts afaik schon. suchen ...
https://forum.egosoft.com/viewtopic.php?t=218397
vergiss nicht, wir sind hier "auf eigene gefahr" (aka modding) unterwegs|K.O.S.H. wrote:Ich finde es auch schade, dass sich von Egosoft niemand dazu äußert, aber was anderes erwartet habe ich 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
Irren ist menschlich. Aber wenn man richtig Fehler machen will, braucht man einen Computer.
Mission Director Beispiele
- ubuntufreakdragon
- Posts: 5195
- Joined: Thu, 23. Jun 11, 14:57
schon find flying ware: sector=<Var/Sector> maintype=<Var/Number> subtype=<Var/Number> flags=<Var/Number> refobj=<Value> maxdist=<Var/Number> maxnum=<Var/Number>, refpos=<Var/Array> anstatt find ship probiert?
My X3 Mods
XRebirth, things left to patch:
In General; On Firing NPC's; In De Vries; Out Of Zone; And the Antiwishlist
XRebirth, things left to patch:
In General; On Firing NPC's; In De Vries; Out Of Zone; And the Antiwishlist
- Aldebaran_Prime
- Posts: 1386
- Joined: Sat, 20. Feb 10, 17:47
Da ich eher MD Scripte schreibe, habe ich mal etwas recherchiert und eine auch eine Lösung parat und diese getestet.
Bei mir waren vor dem Scriptaufruf ca 20.500 Spacefly-Scripte auf dem Stack.
Beim Aufruf hat das Script gemeldet, dass es 3.500 Spaceflys gekillt hat. Eine Kontrolle im Scripteditor hat ergeben, dass tatsächlich danach nur noch 17.000 Spacefly-Scripte auf dem Stack waren - scheint also zu funktionieren.
Das Script ist so geschrieben, dass es im MD manuell gestartet werden muss.
Zudem ist es aktuell auf die Entfernung von 3 Sprüngen begrenzt, weil es schon bei 9 Sprüngen ewig gebraucht hat.
Wenn man sein ganzes Universum bereinigen möchte, sollte man das Script noch etwas weiterentwickeln, so dass wirklich alle Sektoren erfasst werden. Ich weiß nicht, ob das Spiel vollständig abstürzt wenn man "99" einträgt, oder ob es einfach ewig dauert -so lange wollte ich jetzt nicht warten.
Ich bin gespannt ob das bei |K.O.S.H. auch funktioniert!?
P.S.: habe das Script gerade mal mehrfach laufen lassen und die jumps nach jedem durchlauf um 3 erhöht - am Ende dann auf 99 gesetzt. Dadurch konnte ich die Spacefly-Scripte bis auf 4.100 reduzieren.
Dann hat das MD-Script aber keine weiteren Spaceflys gefunden. Die 4.100 restlichen dümplen also irgendwo in einem abgetrennten Sektor herum, der nicht über "Jumps" ermittelt werden kann. Den Effekt hatte ich zuletzt mit Aldrin.
Gebracht hat das Killen der 16.000 Scripte auf dem Stack aber nur 2-3 FPS
Sorry - habe gerade gesehen, das JSDD das Gleiche schon ein paar Seiten vorher gepostet hat...
Bei mir waren vor dem Scriptaufruf ca 20.500 Spacefly-Scripte auf dem Stack.
Beim Aufruf hat das Script gemeldet, dass es 3.500 Spaceflys gekillt hat. Eine Kontrolle im Scripteditor hat ergeben, dass tatsächlich danach nur noch 17.000 Spacefly-Scripte auf dem Stack waren - scheint also zu funktionieren.
Das Script ist so geschrieben, dass es im MD manuell gestartet werden muss.
Zudem ist es aktuell auf die Entfernung von 3 Sprüngen begrenzt, weil es schon bei 9 Sprüngen ewig gebraucht hat.
Wenn man sein ganzes Universum bereinigen möchte, sollte man das Script noch etwas weiterentwickeln, so dass wirklich alle Sektoren erfasst werden. Ich weiß nicht, ob das Spiel vollständig abstürzt wenn man "99" einträgt, oder ob es einfach ewig dauert -so lange wollte ich jetzt nicht warten.
Code: Select all
<cue name="KillSpacefly">
<condition>
<check_all>
<cue_completed cue="dummy"/>
</check_all>
</condition>
<action>
<do_all>
<find_object class="spacefly" multiple="1" group="SpaceFlyGroup">
<sector x="10" y="10"/>
<jumps max="3"/>
</find_object>
<incoming_message author="Debug" text="Anzahl Raumfliegen zu löschen: {group.object.count@SpaceFlyGroup}"/>
<destroy_group group="SpaceFlyGroup"/>
</do_all>
</action>
</cue>
P.S.: habe das Script gerade mal mehrfach laufen lassen und die jumps nach jedem durchlauf um 3 erhöht - am Ende dann auf 99 gesetzt. Dadurch konnte ich die Spacefly-Scripte bis auf 4.100 reduzieren.
Dann hat das MD-Script aber keine weiteren Spaceflys gefunden. Die 4.100 restlichen dümplen also irgendwo in einem abgetrennten Sektor herum, der nicht über "Jumps" ermittelt werden kann. Den Effekt hatte ich zuletzt mit Aldrin.
Gebracht hat das Killen der 16.000 Scripte auf dem Stack aber nur 2-3 FPS
Sorry - habe gerade gesehen, das JSDD das Gleiche schon ein paar Seiten vorher gepostet hat...
@ ubuntufreakdragon: habe ich leider schon ausprobiert :/ Trotzdem danke!
@ Aldebaran_Prime: Ja, das wurde schon gepostet, aber ich Idiot habe es überlesen und noch nicht getestet...
Ich werde es einfach mal probieren.
Bei dir sieht es aber eher so aus, als ob du wirklich Raumfliegen in echten Sektoren hast. Die würdest du wohl auch mit einem Besucht und verlassen des jeweiligen Sektor wegbekommen (kannst du das bestätigen).
Die 4000 übrigen sind dann wohl dasselbe Problem, wie bei mir.
Das mit den abgetrennten Sektoren ist ein guter Hinweis.
bei mir hat Aldrin jedoch mehrere transorbitale Beschleuniger.
Naja, ich werde es testen, vlt hilft es ja
@ Aldebaran_Prime: Ja, das wurde schon gepostet, aber ich Idiot habe es überlesen und noch nicht getestet...
Ich werde es einfach mal probieren.
Bei dir sieht es aber eher so aus, als ob du wirklich Raumfliegen in echten Sektoren hast. Die würdest du wohl auch mit einem Besucht und verlassen des jeweiligen Sektor wegbekommen (kannst du das bestätigen).
Die 4000 übrigen sind dann wohl dasselbe Problem, wie bei mir.
Das mit den abgetrennten Sektoren ist ein guter Hinweis.
bei mir hat Aldrin jedoch mehrere transorbitale Beschleuniger.
Naja, ich werde es testen, vlt hilft es ja
reden wir hier aneinander vorbei ??
also diese 17.000 oder 69.000 scriptaufrufe sind NICHT instanzen vom script, die gerade laufen, das sollte vorerst mal klar sein. darüber steht "totally called", was "insgesamt aufgerufen" bedeutet & gemeint ist die summe aller jemals aufgerufenen instanzen. die andere kleinere nummer (on stack) DAS ist die aktuell augerufene anzahl an instanzen des scripts. (bei mir waren das etwa 70..80). nach dem killen ALLER fliegen In-Sector (IS) war die zahl 0. ("totally called" ist gleichgeblieben, logischerweise) angenommen, du willst ALLE sektoren nach fliegen absuchen & killen, dann kannst im MD ne doppelschleife [x: 0..23] x [y: 0..19] via <do_all exact="24" counter="cx">...</do_all> befehle im loop ausführen. d.h. über alle sektoren die fliegen erfassen & killen, debug-weise noch zählen (afaik gibts OOS keine fliegen, zuminest schiens mir danach als ichs testete)
das mit den 100 jumps würde funktionieren, wenn alle sektoren verbunden wären, aber da gibts dann noch die khaak sektoren & sonstigen kram. der obige ansatz funktioniert unabhängig davon ...
also diese 17.000 oder 69.000 scriptaufrufe sind NICHT instanzen vom script, die gerade laufen, das sollte vorerst mal klar sein. darüber steht "totally called", was "insgesamt aufgerufen" bedeutet & gemeint ist die summe aller jemals aufgerufenen instanzen. die andere kleinere nummer (on stack) DAS ist die aktuell augerufene anzahl an instanzen des scripts. (bei mir waren das etwa 70..80). nach dem killen ALLER fliegen In-Sector (IS) war die zahl 0. ("totally called" ist gleichgeblieben, logischerweise) angenommen, du willst ALLE sektoren nach fliegen absuchen & killen, dann kannst im MD ne doppelschleife [x: 0..23] x [y: 0..19] via <do_all exact="24" counter="cx">...</do_all> befehle im loop ausführen. d.h. über alle sektoren die fliegen erfassen & killen, debug-weise noch zählen (afaik gibts OOS keine fliegen, zuminest schiens mir danach als ichs testete)
das mit den 100 jumps würde funktionieren, wenn alle sektoren verbunden wären, aber da gibts dann noch die khaak sektoren & sonstigen kram. der obige ansatz funktioniert unabhängig davon ...
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
Irren ist menschlich. Aber wenn man richtig Fehler machen will, braucht man einen Computer.
Mission Director Beispiele
- Aldebaran_Prime
- Posts: 1386
- Joined: Sat, 20. Feb 10, 17:47
also ganz senil bin ich noch nicht - klar meine ich "on stack" - bei mir ca 20.000 - sorry ist aber so...JSDD wrote:reden wir hier aneinander vorbei ??
also diese 17.000 oder 69.000 scriptaufrufe sind NICHT instanzen vom script, die gerade laufen, das sollte vorerst mal klar sein. darüber steht "totally called", was "insgesamt aufgerufen" bedeutet & gemeint ist die summe aller jemals aufgerufenen instanzen. die andere kleinere nummer (on stack) DAS ist die aktuell augerufene anzahl an instanzen des scripts. (bei mir waren das etwa 70..80). nach dem killen ALLER fliegen In-Sector (IS) war die zahl 0. ("totally called" ist gleichgeblieben, logischerweise) angenommen, du willst ALLE sektoren nach fliegen absuchen & killen, dann kannst im MD ne doppelschleife [x: 0..23] x [y: 0..19] via <do_all exact="24" counter="cx">...</do_all> befehle im loop ausführen. d.h. über alle sektoren die fliegen erfassen & killen, debug-weise noch zählen (afaik gibts OOS keine fliegen, zuminest schiens mir danach als ichs testete)
das mit den 100 jumps würde funktionieren, wenn alle sektoren verbunden wären, aber da gibts dann noch die khaak sektoren & sonstigen kram. der obige ansatz funktioniert unabhängig davon ...
- Aldebaran_Prime
- Posts: 1386
- Joined: Sat, 20. Feb 10, 17:47
Ja, sinza geht noch, aber mit reduzierter FPS - statt 40 nur 18
Mod-technisch spiele ich natürlich meine EMC4AP
Durch das Thema hier ist mir ein Fehler in einem meiner eigenen Scripte aufgefallen, der die bei mir so extrem hohen Werte verursacht - das ändere ich gerade - die 4000 restlichen Instanzen liegen aber nicht an meinem eigenen Scripten, sondern bestimmt an etwas Anderem
Mod-technisch spiele ich natürlich meine EMC4AP
Durch das Thema hier ist mir ein Fehler in einem meiner eigenen Scripte aufgefallen, der die bei mir so extrem hohen Werte verursacht - das ändere ich gerade - die 4000 restlichen Instanzen liegen aber nicht an meinem eigenen Scripten, sondern bestimmt an etwas Anderem
Last edited by Aldebaran_Prime on Thu, 15. Feb 18, 23:12, edited 1 time in total.
- Aldebaran_Prime
- Posts: 1386
- Joined: Sat, 20. Feb 10, 17:47
ich habe mir die MD-Dateien in denen create_spacefly vorkommt mal angesehen. In den meisten wird danach aber sauber aufgeräumt wie z.b. in "0.8 Battle Enemy Ships"|K.O.S.H. wrote:Ich habe ja so den Verdacht, dass es sich um ein Vanilla-MD-Script handelt.
Dort werden die Raumfliegen als Platzhalter missbraucht.
Man könnte jetzt mal alle Arten von Missionen annehmen und nachschauen, was sich ändert...
Code: Select all
<create_spacefly name="{param@Cue}.{param@ID} L0M08EntryPoint">...
...
<!--destroy temporary spacefly in knaak case-->
<destroy_object object="{param@Cue}.{param@ID} L0M08EntryPoint" explosion="0" warp="0"/>
...
ist irgendwie schon ein Rätsel...