Savegame kompatibel scripten

wenn ich in meinem gebastelten Pack speichere und das savegame lade, stimmen die ein oder anderen Dinge nicht mehr.
Z.b wird das Portrait meines Clonks zurückgesetzt und auch ein Raumschiff aus dem Hazard Ships Pack "Cancer", ist plötzlich falsch zusammengebaut.

Ich glaube die Funktion UpdateTransfer(-Zone) ? ist für savegames zuständig? Bei welcher Art von Änderungen usw muss ein UpdateTransfer in ein Script und was muss darin gemacht werden?

Nein, bei UpdateTransferZone geht es um etwas völlig anderes: Transferbereiche, ein Feature für die Wegfindung. Siehe z.B. SetTransferZone.

achso, danke :slight_smile:

Weißt du oder wer anders, wie man sonst savegame kompatibel skriptet?

Ich glaube du hast auch das ClonkMars Pack mitgestaltet ,oder? (edit. sry, war "Nachtfalter" ^^ , aber ich lass das Beispiel dennoch mal stehen)
Die Version, die ich vor ein paar Monaten gespielt habe, hatte z.b das Problem, dass wenn man ein Savegame geladen hat, dass dann die Feueranimation nicht mehr funktioniert.
Also wenn man sich draußen in der nähe von Lava aufhält, fängt man ja evlt an zu brennen. Nach dem Laden eines Spiels hat man das nicht mehr visuell mitbekommen, sondern nur noch dadurch, dass die LP weniger werden.
Dies nur um ein weiteres Beispiel zu nennen.

UpdateTransferZone war urspruenglich nur gedacht, um die TransferZones in diversen Faellen neu zu setzen; zum Beispiel weil sie in Spielstaenden nicht gespeichert wurden.

Benutzt wird es aber haeufig fuer Kompatibilitaet in Savegames weil es ein Aufruf ist, der auch beim Fortsetzen eines Spielstandes ausgefuehrt wird. Man kann dort kaputte Dinge reparieren. Ob die Scripte, ueber die du sprichst, UpdateTransferZone fuer TransferZones oder fuer Spielstaende benutzen, weiss ich nicht.

okay… wo kann ich mich über savegames und updatetransferzone informieren? Oder kannst du mir dazu mehr sagen?

Was wird bei savegames alles gespeichert bzw. nicht gespeichert? Wann wird UpdateTransferZone aufgerufen (immer direkt nach dem laden in allen objekten?)

Nehmen wir das einfache Beispiel, dass ich mit SetPortrait(Format("%s%d", strGraphics, 1 + Random(iPortraitCount)), pClonk, S_RB, 0, 0); das Portrait eines Clonks beim Anziehen einer Rüstung verändere. Nach dem Laden ist dieses zurückgesetzt.  Muss ich in UpdateTransferZone nun eine Kontrolle einbauen, ob eine Rüstung angezogen ist und wenn ja das Portrait erneut setzen?

> okay.. wo kann ich mich über savegames und updatetransferzone informieren?


Im Enginecode

> Oder kannst du mir dazu mehr sagen?


Nein, zu Clonk Rage habe ich die Details nicht mehr im Kopf. Hat sich zu viel getan in den letzten ~6 Jahren zu OpenClonk.

Also ich hab jetzt mal ins hazardclonk skript updatetransfer() eingebaut.
Und dort wird SetPortrait aufgerufen, was auch ausgeführt wird. Ich hab auch Log("UpdateTransferzone") einträge eingebuat, damit ich sehe ob und wann es ausgeführt wird.

Beim Laden eines Savegames steht im Log dann aber zuerst "UpdateTransferzone" und erst danach "Wiederherstellung Serpens66".
Das Portrait bleibt das Hazardclonk portrait, anstatt das neue portrait…

protected func UpdateTransferZone()
{
    Log("UpdateTransferzone");
    SetPortrait("FutureP", 0, HZCK);  // die grafikdatei befindet sich beim hzck objekt und heißt portraitFutureP. Das funktioniert im laufendem spiel auch einwandfrei.
    return;
}


Also wird das so wohl nichts?

Wie haben denn andere Pack Developer sowas gelöst? Modern Combat, Hazard, Quake usw?

Das Portrait kommt aus dem Spieler. UpdateTransferZone ist vor dem Spielerbeitritt.

Dein SetPortrait kannst du zum Beispiel mit ScheduleCall ein paar Frames verzoegert ausfuehren.

okay, das klappt, danke :slight_smile:

wäre nur gut zu wissen, wenn jemand noch wüsste, worauf man so achten sollte beim skripten, also was alles gespeichert wird, und was nicht.

Denn alle meine Objekte vollständig zu prüfen, ob sie beim Laden noch funktionieren wird zeitlich ziemlich unmöglich sein…