Hey, Leute.
Ich bräuchte etwas Hintergrundwissen. Hat wer eine Ahnung, durch was die Warnung "WARNING: Unexpected value "Status"! (in section "Response", after line 1, Round Results)
" ausgelöst wird und was da genau kaputt ist?
Ich arbeite momentan flüchtig am Remake eines kleinen Melees. Das Problem war allerdings, dass bei Beendigung die Engine scheinbar randomly bei den Leuten abgeschmiert ist: "Clonk Rage funktioniert nichtmehr!". Es tauchte nicht nicht beim GameOver() der Runde oder Beginn der Auswertung auf, sondern immer erst beim Wegklicken der Auswertung. Ich habe mich eben mit Scaba ein wenig dran gesetzt und zusammen haben wir daran herumanalysiert, systematisch einzelne Bestandteile des Szenarios gelöscht und weiterprobiert. Was wir herausgefunden haben:
• Die Engine crasht nur bei den Spielern, die verloren haben.
• Die Datei des Scoreboardscripts ist schuld.
• Allein die Existenz der von mir definierten globalen Funktion UpdateScoreboard(plr) sorgt dafür, dass der Crash passiert.
• Der Inhalt von UpdateScoreboard(plr) wurde von uns komplett auskommentiert.
• UpdateScoreboard(plr) muss dazu nicht einmal aufgerufen werden.
• Jedes mal taucht die oben geschriebene Warnung im Clonk.log auf.
• Auf Verdacht habe ich mal in einem neuen Szenario mit LocateFunc() geschaut, ob UpdateScoreboard() nicht schon in der Engine oder sonst wo definiert wurde. Computer sagt nein.
Hat irgendwer eine Ahnung, was die Engine da für Probleme hat?
Die Warnung klingt nach einem Problem mit der Masterserver-Kommunikation. Nach Rundenabschluss senden ja alle Clients ihre Ergebnisse an den Masterserver, wobei eben eine Sektion [Response]
mit dabei ist. Ihr verwendet aber schon den clonk.de Server, bei dem alles funktionieren müsste?
>Ihr verwendet aber schon den clonk.de Server, bei dem alles funktionieren müsste?
Wir haben bei unseren Tests den ganz normalen clonk.de-Masterserver verwendet.
Okay, das Problem ist gelöst. Schuld daran war nicht die Existenz von UpdateScoreboard(), sondern ein Versuch, auf ein bereits gelöschtes Objekt mit AddEffect() zuzugreifen. If-Verschachtelungs-Fail. UpdateScoreboard() hat nur mitgemischt, da durch das nicht vorhanden sein Errors ausgelöst wurden, wodurch der Code nicht bis zum Ende durchlaufen konnte und die kritische Stelle nicht erreicht hat.
Ich finde es trotzdem krass, dass nur die Verlierer einen Crash bekommen haben. x)
An dieser Stelle nochmal herzlichen Dank an Scaba und Kanibal!
Wenn wir schon bei Engine-Crashs sind: Mich würde interessieren, warum Clonk immer und bei jedem nach einer abgeschlossenen Runde "Kasernenstadt II" crasht. Kann man das nicht mal irgendwie beheben?
Das Szenario einmal mit einer Debug-Engine spielen; entweder Du selbst oder ein Mitspieler, der Clonk Rage als Debug-Build hat
Hilfreich wäre auf alle Fälle mal das Log.
"Debug-Engine"? Ist damit gemeint, den Debug-Modus zu aktiveren?
Ich probier's mal heute zu spielen. Geht das auch lokal oder muss jemand über das Netzwerk mitspielen?
Nein, das ist eine speziell kompilierte Engine, die nicht nur den Maschinencode enthält, sondern auch Information, zu welcher C++ Codezeile die einzelnen Anweisungen gehören. Wenn Clonk dann crasht, kann man mithilfe eines Debuggers den Zustand beim Crash analysieren. Ein häufiges Problem ist etwa der Zugriff auf einen ungültigen Speicherbereich, was so zumindest leicht erkennbar ist.
Naja, wenn es lokal auch crasht geht es auch lokal
Und wo bekomm ich diese Engine her? Eine bauen kann ich zumindest (noch) nicht.
Ich wollte nur wissen, ob das mit dem Log dann auch funktioniert oderso.
Ja, es wird normalerweise immer ein Log erzeugt.
Du brauchst dann auch einen Debugger wenn du debuggen willst. Jede anstaendige Entwicklungsumgebung hat einen Debugger integriert, aber wenn du eine Entwicklungsumgebung (wie etwa Visual Studio) hast, dann kannst du auch selbst eine Debug-Engine kompilieren.
>entweder Du selbst oder ein Mitspieler, der Clonk Rage als Debug-Build hat.
Dann spiel ich doch lieber mit jemanden, der das hat. Habe weder die nötige Software noch die Kenntnisse. Hat von jenen jemand Zeit?
Ja - schlag mal nen Termin vor
Cool von dir.
Also ich hätte heute noch Zeit, wann würde es dir denn passen?
Es gibt Menschen die noch Kasernenstadt II spielen wollen? \o/
Schreib mich am besten einfach im IRC an #clonk oder #clonkscript. Wenn ich innerhalb von 3 Minuten antworte, dann hab ich Zeit