"Haltbarkeit" nur 7 Jahre?!

Rund um die Technik 55i

Moderator: Mods - Sphere

Antworten
Nachricht
Autor
Medea

"Haltbarkeit" nur 7 Jahre?!

#1 Beitrag von Medea » 18 Aug 2008 18:29

Hallo ihr!

Unser Freeshard (Astaroth) hat seit geraumer Zeit mehrere Probleme.
Wie aus dem Nichts tauchten plötzlich mehrere "Bugs" auf, die für uns zuerst völlig rätselhaft waren - Der Server an sich warf auch nicht den geringsten Fehler.

Beispiele der Probleme:
- .weg zeigt diese automatischen "abwesend"-Meldungen nicht mehr
- Server hängt, zeigt beim Status inaktuelle Werte
- Spieler die nicht eingeloggt sind, sind für andere Spieler als eingeloggt zu sehen.
- Spawns spawnen nicht mehr
- einige Staffbefehle gehen nicht mehr, z.B. .summon
- Magie, Kampf und Handwerk scheint grundsätzlich nicht zu funktionieren; es erscheint immer die Meldung: "Sie sind dafür zu beschäftigt." (Beispiel: Nach der Schmiedemenüauswahl passiert nichts mehr.)

Die neuste Erkenntnis dank des Admins eines anderen Shards, der die selben Probleme hatte ist, dass alles am Timer liegt.
Unser Shard ist an die 7 Jahre alt und das soll der Knackpunkt sein - ab dem Alter von 6,8 Jahren fängt der Sphere 55i Server an zu spinnen, der Timer geht ins Minus und viele Scripts, die von Timern abhängen, spinnen (Ich bin da absoluter Laie - keine Ahnung vom Scripten).

Auf jeden Fall forschen wir nun nach der effizientesten Lösung.
Hat irgendjemand Erfahrung mit dieser Geschichte? Was können wir tun, um den Schaden zu minimieren? Ist vielleicht sogar eine richtige Lösung bekannt? Reicht es einfach den Timer aller Save .scps und Charakter .scps manuell zu verändern?

MfG
Medea

nazghul

#2 Beitrag von nazghul » 18 Aug 2008 21:46

Tatsächlich läuft der Timer nach 6,8 Jahren über. Daran ist nunmal kaum etwas zu ändern - die Zeit-Ticks werden in einer LONG-Variable gespeichert, und voll ist voll. LONG ist zudem der größte Integer-Wert, mit dem .55i umgehen kann.

Das Problem betrifft nicht nur .55i, sondern auch .56b (wo sich einige Leute derzeit den Kopf wegen Abhilfe zerbrechen, was aber alles andere als trivial ist: Zwar könnte man theoretisch den Zähler in eine Long64-Form übertragen, aber Sphere ist ein "natürlich gewachsenes" Projekt - jemand eine Vorstellung, WO überall im Code auf diesen Zähler referenziert, mit ihm gerechnet, er de- und inkrementiert, addiert, geteilt... wird?)

Bei .55i gibt es keinen mir bekannten auch nur halbwegs vollständigen Code mehr -> nix Änderung.

Abhilfe schaffen kann nur, den Haupt-Timer zurückzusetzen. Sein Wert steht ziemlich oben in allen Save-Files. Nachteil: Skripte, die z.B. auf das absolute Char-Alter (CREATE) referenzieren zeigen dann natürlich falsche Werte an. Solange die Anzahl dieser Skripte überschaubar ist, kann man sie ändern und den entsprechenden Wert in ein TAG auslagern (das ist ein String und damit erstmal ohne Größenbegrenzung); bei .56b kann man dann die Skripte so ändern, dass sie zum Berechnen FLOAT verwenden - nicht elegant, aber wirksam. Oder aber man arbeitet mit zwei 32bit Variablen - die Rechnerei für das Skript wird da etwas aufwändiger, aber das ist nicht weltbewegend.

In jedem Fall muss anschließend natürlich der Systemtimer zurückgesetzt werden.

Rubrik "dumm gelaufen" - an shards, die 7 Jahre und länger laufen, hat Menace wohl genausowenig gedacht wie die Programmierer der 80er Jahre an den Jahrtausendwechsel.

Also, mein Tip: Skripte finden, die auf "absolutes Alter" referenzieren (ist ja meist nur das Charakter-Alter). Die entsprechenden Variablen in allen Chars (CREATE) um einen festen Wert verringern, wenn er drüber ist (z.B. 2^31), und dann ein Tag auf "1" setzen (was bedeutet: Addier zu dem Wert in CREATE 2^31 hinzu). Die mit dem Alter spielenden Skripte von dieser Regelung informieren. Damit hat man dann wieder einige Jahre gewonnen, bis man das Tag auf "2" setzen muss :)

Wenn es Euch mit den Skripten allerdings genauso geht wie den Sphere-Devs mit ihrem Source, dann viel Vergnügen: Wo bitte wird überall auf diesen Zähler Bezug genommen?

Antworten