Nicklander's Anti-Desync Guide

» Settlers Map Source Forums » Technische Hilfe » Nicklander's Anti-Desync Guide

Pages: 1 2 Next page

Nicklander
#1
27-02-2016 15:44
Posts: 33

Die Siedler 4: Nicklander's Anti-Desync Guide

Moin Siedler !
Da ich meistens über LAN mit Freunden/Familie spiele habe ich mich dazu entschieden eine kompaktere Version meines Anti-Desync Guides zu schreiben. Ich finds übrigens echt Schade, dass es so wenig Coop-Maps gibt.

Das Prinzip
Desyncs treffen meistens dann auf, wenn man eine MP-Map mit Computern und anderen Menschen spielt. Vermeiden lässt sich das nicht zu 100%. Jedoch kann man einen Desync vermeiden indem man einfach so ca. alle 5 Minuten speichert. So weit, so gut...nur gibt es jetzt ein Paar Probleme.
1) Wer will denn ernsthaft alle 5 Minuten speichern ? Das nervt !
2) Es gibt nur einen Speicherstand, man darf also keinen Fehler machen.
3) Wenn aus irgendwelchen Gründen das Savegame zerschossen ist, ist Ende im Gelände.

Sollte es ein Problem geben, oder sollte ein Desync auftreten. Müssen einfach alle Spieler den Backup Speicherstand (auto. mit Datum und Urzeit ergänzt) aus "Die Siedler IV\Save\Backup" zurück in den Hauptordner "Die Siedler IV\Save" kopieren. Dann einfach im Spiel diesen Speicherstand laden und weiterspielen.

Die Lösung
1) Workarounder auf allen Spieler-PCs installieren
Workarounder Download: http://www.heise.de/download/workarounder-1164871.html

2) Automatisches Speichern einrichten [Nur bei einem Spieler]
- Auf den Tab "Zeit" drücken, dann unten auf "Neues Ereignis"
- Bei "Optional: Aktives Fenster": "Die Siedler IV" eingeben
- Bei Start-Zeit, "alle X Minuten" wählen und daneben "5" eingeben
- "nachhohlen ?" und "bei Leerlauf ?" deaktivieren
- Beim Skript "TypeMessage.vbs" auswählen
- Den Hacken bei "Par?" reinmachen, ein Fenster öffnet sich. Dort den Hacken bei "SendSystemKeys umwandeln" reinmachen, dann auf das Eingabefeld klicken und die Tasten STRG+S drücken. Mit OK bestätigen.

Es sollte nun wie im Bild aussehen : http://www.mediafire.com/view/964f630d4fgbd0h/Unbenannt.PNG#

Nur ein Spieler muss den Hacken bei "Aktiv?" aktiviert haben. Wenn man mit STRG+S speichert, speichert es automatisch bei allen Spielern.

3) Automatische Backups einrichten [Bei allen Spielern notwendig]
- Auf den Tab "Datei" drücken, dann wieder "Neues Ereignis"
- Im ersten Feld wieder "Die Siedler IV" eingeben
- Jetzt bei "Ordner und Bedingungen" den Save Ordner auswählen. (Bei mir ist das C:\BlueByte\Die Siedler IV\Save). Im unteren Feld "*.exe" eingeben.
- Nur einen Hacken bei "Änder" machen
- Bei Skript "Backup.vbs" auswählen
- Den Hacken bei "Aktiv?" reinmachen

Bild: http://www.mediafire.com/view/x4v5h9naa4hdfdn/Unbenannt2.PNG#

- Rechtsklick auf "Backup.vbs" dann im Kontextmenü "Editieren" auswählen. Im Texteditor ein bisschen runterscrollen, dann die folgenden Linien ersetzen :

Verzeichnis= ""


Codes= "1 3"


if (instr(Codes, s(0))) or (ubound(s)=0) then '
  WScript.Sleep 10000
  Backup(s(ubound(s))) '
else



Einfach die Zeile "WScript.Sleep 10000" zwischen den anderen einfügen, wie oben (Abstand beachten). Dadurch wartet das Programm erst 10 Sekunden nach dem speichern bevor es den Speicherstand sichert. Es könnte nämlich sein, dass der Speicherstand halbfertig kopiert wird und somit unbrauchbar ist. Siedler IV braucht ziemlich lange um so einen Speicherstand anzulegen. Sollte es Probleme geben einfach mal den Delay auf 15 Sekunden hochstellen (15000).

Man kann mit dem Workarounder Programm auch manuelle Sicherungen einstellen (zB. mit der F11 Taste). Das ist aber normalerweise nicht nötig (ausser man will wirklich auf Nummer sicher gehen).

Nicklander
#2
01-08-2018 00:59
Posts: 33

EDIT: Der Desync Error und andere Fehler sind in der History Edition von Siedler 4 NICHT behoben.

This posting has been edited by Nicklander: 16-11-2019 at 17:31.

hoosoomooloo
#3
01-12-2018 07:55
Posts: 2

Ist bereits von mir erledigt. In meiner Bibliothek beginnt Strength und Techlevel erst ab 1. Somit wird das dann korrekt auf die Kanonen abgebildet.

____________________
anti stress game

Der_Deutsche
#4
01-12-2018 12:35
Posts: 330

Ich bin mal der Methode mit mehr GB gerade am nachgehen, schicke später die ergebnisse

____________________
Nachbau von Siedler 5 Lobbys "Ubi.Com"

Updatelösungen Siedler 5 Patch 1.06

Creators Update Lösung Windows 10 Siedler 5

Der_Deutsche
#5
01-12-2018 12:49
Posts: 330
Der_Deutsche
#6
01-12-2018 13:22
Posts: 330

Genauso bei dem Speicher in Enconoly AI Desync, Fazit: Buildshit

____________________
Nachbau von Siedler 5 Lobbys "Ubi.Com"

Updatelösungen Siedler 5 Patch 1.06

Creators Update Lösung Windows 10 Siedler 5

Serp
#7
05-12-2018 04:15
Posts: 6

history edition besser?

Hi,

über uplay gibt es nun ja wohl eine hsitory collection mit den Siedler Titeln.
Der einzige Grund warum ich für ein Spiel was ich schon besitze und mit diversen Fanlösungen auch unter Win10 in guter Auflösung spielbar ist, wäre wenn zb für Siedler 4 das desync Problem gefixt wurde.

Ist das desync Problem in der neuen Version gelöst, oder verlangen die Geld für ein weiterhin ungefixtes Spiel? Zumal ja auch die Möglichkeit des Multiplayers über uplay allgemein beworben wurde, wäre es ja sinnvoll.

InstantMuffin
Guest
#8
16-12-2018 01:36

SaveManager

Hey,

nicht unbedingt auf die Desyncs bezogen, sondern allgemein, habe ich letzte Woche ein kleines Programm geschrieben, welches Siedler 4 mitstartet und Quicksaves automatisch mit Datum und Zeit umbenennt, sobald sie erstellt werden. Dadurch entfällt das automatische Überschreiben und Speicherstände lassen sich besser einordnen. Evtl. findet das ja jemand nützlich? Würde es bei Interesse gerne bereitstellen.
Ich hätte das auch gerne erweitert, dass automatisch gespeichert wird (Erkennung ob man im Spiel ist), und der Name des Spielstandes mit dem Kartennamen ergänzt wird. Ich habe dafür aber noch keine schönen Lösungen gefunden.

InstantMuffin
Guest
#9
20-12-2018 17:43

Desync Debugging

Frage:
Hat schon jemand von euch mal dem Spiel vorgetäuscht eine Entwicklerinstallation zu haben damit das Spiel beim Desync einen Tracedump macht?
Evtl. kriegt man so einige Informationen.

Bzw. ist man überhaupt mal hingegangen und hat versucht das ganze zu quantifizieren?
Also standartisiert abzuspeichern um reproduzierbare Szenarien zu haben?
2-3 Spielpartien von irgendwelchen Leuten nach mündlichen Bericht sind ja nicht aussagekräftig um zu gucken ob mehr oder weniger Desyncs auftreten, wenn man etwas tut.

So wie ich das "beurteilen" bzw. erraten kann im Disassembly, wird sowohl periodisch als auch zufällig nach Desyncs geguckt. Bestimmte Werte werden verglichen (ich nehme mal an ein Zeitstempel oder die Tickzahl/berechneten Frames der einzelnen Spielteilnehmer). Insofern ist die Theorie, dass bestimmte Berechnungen bei Spielteilnehmern unterschiedlich sind und/oder unterschiedlich schnell verlaufen und so zu "Rucklern" führen gar nicht mal so falsch.

InstantMuffin
Guest
#10
20-12-2018 18:36

Der angebliche "neue" Fix von Morphy

Also, ich habe mir im Disassembly die besagte Stelle angeguckt.
Da tritt eine bedingte Abzweigung des Codes auf. Eine Abzweigung sieht rechnerisch deutlich aufwändiger aus als die andere.
Allerdings setzt der "Fix" die falsche Instruktion um diese aufwändige Abzweigung zu vermeiden und geht sie stattdessen immer...
Eigentlich müssten da anstelle eines unkonditionierten Sprunges der Instruktionsbyte und auch die Adresse "ausgeschwärzt" werden um die sparsame Berechnungsroute zu gehen. Da ersetzt man die 75 und die darauf folgende Zahl durch jeweils "00".
Ich habe mir dann die Auswirkungen auf die Bots im SP angesehen mit !win und 30 Minuten vorspulen um die Karte offen zu sehen.
Und siehe da, die Bots bauen keine Türme mehr.
Interessanterweise hat es wohl von Morphy schon einen "Fix" gegeben an dieser Stelle, der zu genau demselben Problem führt. Wieso er dann allerdings hingeht und dann nochmal so einen Fehler macht, keine Ahnung.
Auf jeden Fall ist die vermeintliche Stelle direkt oder indirekt für den Turnbau verantwortlich.
Es kann natürlich sein, dass diese Stelle besonders kostspielig ist, oder verbuggt und verbraucht irgendwann extrem viele Ressourcen.

Testsetup für Interessierte für weitere Daten:
Zunächst wird eine entsprechende Karte erstellt, die Bots schon fertig ausgeweitet hat damit sie genug Land und Ressourcen für sich haben. Es wird ein vordefiniertes Mehrspieler-Match begonnen unter immer gleichen Bedingungen. Die menschlichen Spieler machen dabei rein gar nichts. Zeitanzeige an und abwarten bis zum Desync. Am besten handelt es sich hierbei um ein LAN-Spiel um Netzwerkkram ein bisschen einzukreisen bzw. auszuschließen zwecks Reproduzierbarkeit.

Das führt dann zu drei Versuchsreihen:
1.) Es wird nichts am Spiel verändert
2.) Spielgeschwindigkeit wird hochgesetzt (geht das im MP?)
3.) Der "Patch" um den Turmbau zu stoppen wird benutzt

Mit jeder Variante macht man jeweils 3 oder mehr Partien und misst die Zeit bis zum Desync.
Dann kann man ja weiter sehen was passiert und man evtl. tun könnte.

InstantMuffin
Guest
#11
21-12-2018 23:39

Access violation Absturz - Evtl. Ursache gefunden

Hey,
da ich niemanden habe mit dem ich die Desync-Geschichte erforschen könnte, habe ich mich mal an den Absturz bei Marktplätzen rangesetzt (der denke ich identisch mit dem Hafenabsturz ist).
Der Lesezugriff-Fehler scheint auf eine feste Adresse zu sein.
Also guckte ich mir jene an und stellte fest, dass der Aufruf auf eine Get-Methode einer Klasse erfolgt, und ein Nullpointer als this-Adresse angegeben wird. Die Zugriffsadresse in der Fehlermeldung ist also der Offset einer bestimmten Variable innerhalb eines Objektes.
Daraufhin habe ich mir die Stellen angesehen, an welchen diese Methode aufgerufen wird. Es gibt mehrere, allerdings konnte ich bei drei davon sehen, wie aktiv als this-Adresse null angegeben wird. Ich hatte mich daraufhin gewundert wie einem Entwickler ein so offensichtlicher Fehler unterlaufen kann, schließlich sieht man die falsche Zuweisung ja eine Zeile darüber, und an den anderen Stellen mit korrektem Aufruf wird gerade darauf entsprechend geachtet. Mir fiel dann auf, dass die Objektzuweisung in allen drei Fällen gleich erfolgt (Etwas Vergleichslogik und vom Ergebnis abhängig die Zuweisung). Es scheint so als wäre diese Vergleichszuweisungslogik eine Inlined-Methode gewesen und daher für den Entwickler so nicht direkt sichtbar. Beim Testen ist der Fehler bei denen wohl nie aufgetreten.
Also kurzum. Ich denke ich kann diesen Fehler beheben.
Er müsste allerdings an allen drei Stellen behoben werden, und das unterschiedlich. Ich bin mir gerade nicht sicher ob ich bei allen dreien genug Platz habe um die Instruktionen zu überschreiben.
Nur mal als kurzes Update.

echnaton
#12
22-12-2018 12:42
Posts: 369

Ist ja interessant was du da machst. Multiplayer spiele ich nicht bis jetzt. Die FE´s im Einzelspiel sind meist durch den versuchten Zugriff auf eine nicht erlaubte und sinnlose Speicheradresse hervorgerufen. Ich habe einige beseitigt indem ich zusätzlich die Adresse geprüft habe und wenn sinnlos den Programmteil verlassen.
Muss gut getestet werden damit nicht neue Probleme entstehen. Würde mich interessieren ob in der neuen Version von S4 die FE so geblieben sind. Geht übrigens auch: eine 2. Version von Siedler startrn und über dieselbe Netzwerkkarte verbinden (eine exe kopieren/umbenennen). Im Programmchunk (heißt das so, jedenfalls überflüssige Bytes vor und hinter dem Programmteil) konnte ich immer genug Bytes finden. Gruss

InstantMuffin
Guest
#13
22-12-2018 15:19

Programmteil verlassen

Hey, wie hast du das denn hinbekommen bzw. welche Software benutzt du?
Ich kriege S4 momentan noch nicht mit einem Debugger am Laufen. das Spiel friert beim Initialisieren des Hauptmenüs ein und nimmt den Debugger gleich mit.
Die Adressen sind wie gesagt sinnlos weil als Objektpointer null übergeben wird.
Ich glaube das waren 4 Stellen (davon drei identisch). Patchen ist nicht das Hauptproblem für mich, ich muss nur wissen welches Verhalten ich hinzufügen muss/soll/darf. Das ist alles innerhalb einer Schleife (entweder wird ein Pfad gesucht oder irgendwas verteilt) und ich möchte natürlich nicht den Spielverlauf korrumpieren. Wenn du sagst, dass du an einigen Stellen rausspringen konntest, würde ich gerne wissen wie und welche Stellen das waren.
Vielleicht können wir uns mal kurzschließen und austauschen.

echnaton
#14
22-12-2018 18:12
Posts: 369

Das geht mit IDA 32bit unter XP, diverse andere Programme stürzen sofort ab. W32Dasm kann manchmal auch noch helfen.
Breakpoints sind aber nicht an jeder Stelle möglich, funktioniert nicht immer die Umschaltung Ida/Spiel.
Im Primzip so:
cmp eax,0
jz Routineende
Da aber auch Parameter übergeben werden und manchmal mehrere "Ausgänge" sind kann das Probleme machen.
Z.B. den Stack durcheinanderbringen.

InstantMuffin
Guest
#15
22-12-2018 18:35

IDA

IDA und das Spiel frieren mir beim Debuggen ein. Da hilft am Ende nur der Taskmanager. Ich habe auch schon versucht bei IDA den Debugger zu wechseln, ohne Erfolg. Mit einer neueren Version schaffte ich es letztenendes ins Spiel zu kommen, aber dann friert er mir auch mittendrin ein. Das wäre mal schön, wenn das funktionieren würde, dann könnte man durch den Callstack herausfinden ob vielleicht nicht alle der 4 Kandidaten hier zu einem Absturz führen.
Hast du vielleicht Steam oder sowas, dann kann ich ja mal Screens vom Disassembly schicken und so meine Beurteilungen und deren Gründe?

echnaton
#16
22-12-2018 19:04
Posts: 369

Hast du evtl. einen anderen Rechner in Reserve? Kann mir vorstellen daß es in anderen Varianten funktioniert. Bei mir jedenfalls so einigermassen. Steam und ähnliches habe ich nicht, mein Internet ist lahm wie mein Rechner IDA ist 4.70.830

InstantMuffin
Guest
#17
23-12-2018 01:47

Andere Rechner sind schon vorhanden, allerdings auch Win7.
Wie alt bist du denn, wenn ich fragen darf, dass du einen Krückenrechner hast und noch so eine alte Version von IDA?
Ist ja schon recht spezialisiert weil IDA 5 gibt es schon kostenlos. Ich nehme an du hast die Pro?
Die Stellen zu patchen wird sehr ätzend. Diese inline Methode ist im Prinzip Zuweisung abhängig von zwei Oder-Bedingungen in einem ternären Operator, also daher alles schön "optimiert" vom Compiler, scheiße zu lesen und so wenig Platz zu fixen. Habe bis jetzt noch nie eine "leere" Stelle benutzt um etwas zu umgehen. Ich bin bis jetzt nur mit VHooks und Trampolinen über Sourcemod bzw. deren API vertraut. Ja, und halt einfache Opcode-Überschreibungen. Ich würde da am liebsten erstmal eine angenehme Lösung finden und an einer Stelle testen. Wenn du bei dir den Debugger zum Laufen bekommst, kannst du mir vielleicht einen Call Stack übergeben? Dann weiß ich schonmal welche Stelle ich beheben muss (evtl. ist ja nur eine hauptverantwortlich). Speicherstand der nach 30 Sekunden Dank Esel und zwei Markplätzen crasht habe ich auch parat.

echnaton
#18
23-12-2018 02:25
Posts: 369

Das mit dem patchen ist nicht so schlimm, kannst Assemblembler schreiben und IDA übersetzt das in Bytecode. Dann eine dif erzeugen (Unterschiedliche Bytes zwischen original und Änderung). Damit das Programm patchen und testen. Wie alt, 56 Jahre. Ein Pentium 4 mit 2 GHz ist noch kein ganz schlechter Rechner, er erfüllt seinen Zweck. Das Spiel testen geht wohl nur mit Multiplayer? Müsste ich einrichten damit es geht. Die Trace...txt sind hilfreich, da siehst du du alles was wichtig ist. Kannst du mit IDA direkt auf CS:EIP gucken (gehe zu Adresse oder sowas).
---
update
---
.text:19804EFC jnz short loc_19804F1A
.text:19804EFE mov eax, [esi+68h]
.text:19804F01 pop edi
.text:19804F02 add eax, 32h
.text:19804F05 mov [esi+68h], eax
.text:19804F08 xor al, al
.text:19804F0A pop esi
.text:19804F0B mov ecx, [esp+10h]
.text:19804F0F mov large fs:0, ecx
.text:19804F16 add esp, 1Ch
.text:19804F19 retn
.text:19804F1A ; ---------------------------------------------------------------------------
.text:19804F1A
.text:19804F1A loc_19804F1A: ; CODE XREF: sub_19804B10+3ECj
.text:19804F1A mov ecx, [esp+10h]
.text:19804F1E push esi
.text:19804F1F call sub_198046E0
.text:19804F24 mov ecx, [esp+20h+var_8]
.text:19804F28 pop edi
.text:19804F29 test al, al
.text:19804F2B setnz al
.text:19804F2E pop esi
.text:19804F2F mov large fs:0, ecx
.text:19804F36 add esp, 1Ch
.text:19804F39 retn
.text:19804F39 sub_19804B10 endp ; sp = 4
.text:19804F39
.text:19804F39 ; ---------------------------------------------------------------------------
.text:19804F3A align 4

so sieht es da aus, läuft im SP etwa alle 4 Sekunden den unteren
Teil durch. Bräuchte ich noch Fehler. Könnte von .text:19804EFE
kommen, wenn esi 0 ist verabschiedet sich die dll.
Hast mel versucht die economy-dll zu disassemblieren, bytefolge suchen und Breakpoint drauf. Spiel normal starten und attach to active process machen. Geht wunderbar bei mir. Frohes Fest
---
update
---
erstmal Platz gemacht, 10 Bytes:
.text:19804EF4 loc_19804EF4: ; CODE XREF: sub_19804B10+175j
.text:19804EF4 8B+ mov eax, [esi+2Ch]
.text:19804EF7 8B+ mov ecx, [eax+8]
.text:19804EFA 85+ test ecx, ecx
.text:19804EFC 75+ jnz short weiter
.text:19804EFE 8B+ mov eax, [esi+68h]
.text:19804F01 5F pop edi
.text:19804F02 83+ add eax, 32h
.text:19804F05 89+ mov [esi+68h], eax
.text:19804F08 32+ xor al, al
.text:19804F0A 5E pop esi
.text:19804F0B 8B+ mov ecx, [esp+10h]
.text:19804F0F EB+ jmp short ende
.text:19804F0F 1E ; ---------------------------------------------------------------------------
.text:19804F11 90+ align 8
.text:19804F18 90 db 90h ; É
.text:19804F19 90 db 90h ; É
.text:19804F1A ; ---------------------------------------------------------------------------
.text:19804F1A
.text:19804F1A weiter: ; CODE XREF: sub_19804B10+3ECj
.text:19804F1A 8B+ mov ecx, [esp+10h]
.text:19804F1E 56 push esi
.text:19804F1F E8+ call sub_198046E0
.text:19804F24 8B+ mov ecx, [esp+24h+var_C]
.text:19804F28 5F pop edi
.text:19804F29 84+ test al, al
.text:19804F2B 0F+ setnz al
.text:19804F2E 5E pop esi
.text:19804F2F
.text:19804F2F ende: ; CODE XREF: sub_19804B10+3FFj
.text:19804F2F 64+ mov large fs:0, ecx
.text:19804F36 83+ add esp, 1Ch
.text:19804F39 C3 retn
.text:19804F39 sub_19804B10 endp

This posting has been edited by echnaton: 23-12-2018 at 15:59.

InstantMuffin
Guest
#19
23-12-2018 17:46

Mit IDA zu editieren ist mir noch nicht so gelungen. Ich lasse mir einfach die Opcode Bytes anzeigen und zieh mir eine Signatur raus, die ich dann im Hex-Editor suche. Da setze ich dann die Bytes um, die ich nachgegooglet habe.
In der Tracedatei sehe ich nur die Adresse bei der der Fehler eintritt, nicht den Callstack. Bzw. der ist "leer".
"Stack dump: 0023:00468bd0 0x00000000 0x00000000 0x00000000 0x00000000"
So kam ich ja überhaupt erst auf die Stelle.
Woher hast du denn den von dir geposteten ASM? S4 fängt bei mir erst bei 0x00400000 an und geht auch nur bis etwas 0x0059...
Ich beziehe mich jetzt ausschließlich auf den Access Violation Absturz. Um ehrlich zu sein bezweifle ich, dass die Desyncs fixbar sind von uns aus.
Wenn der Abschnitt von S4_Main.exe kommt, poste mal die Opcode Bytes dazu, du weißt ja wie das geht, sind ja bei dir unten bei. Dann kann ich das bequem bei mir finden.

Ich sehe gerade du postet Ausschnitte aus der Economy ddl.
Also noch mal zur Übersicht.
Ich beziehe mich gerade auf den Access Violation Absturz in der S4_Main.exe, der durch Marktplätze und Häfen verursacht wird.
Fehlerentstehung ist ein Getter der mit Nullzeiger aufgerufen wird.
Hier der auslösende Ausschnitt (das mov)
.text:00468BD0 ; int __thiscall Concurrency::details::SchedulingRing::Id(Concurrency::details::SchedulingRing *__hidden this)
.text:00468BD0 [email protected]@[email protected]@@QBEHXZ proc near
.text:00468BD0 ; CODE XREF: sub_43E4E0+11F↑p
.text:00468BD0 ; sub_43EE50+146↑p ...
.text:00468BD0 mov eax, [ecx+0B8h]
.text:00468BD6 retn
.text:00468BD6 [email protected]@[email protected]@@QBEHXZ endp
.text:00468BD6

4 Stellen rufen das auf. Drei davon sind sehr ähnlich im Ablauf. Hier ein Beispiel im Pseudocode.
switch ( *(_DWORD *)(v5 + v2 + 4) )
{
case 1:
v10 = (int)*(&dword_738A4C + v6);
if ( v10 )
v11 = (Concurrency::details::SchedulingRing *)((*(_BYTE *)(v10 + 10) == 2 || *(_BYTE *)(v10 + 10) == 4) != 0 ? v10 : 0);
else
v11 = 0;
if ( !*((_BYTE *)v11 + 189) && Concurrency::details::SchedulingRing::Id(v11) == 2 )
sub_4687D0(a2);
break;
case 2:
v9 = (int)*(&dword_738A4C + v6);
if ( !v9 || *(_BYTE *)(v9 + 10) != 1 )
v9 = 0;
if ( !*(_BYTE *)(*(_DWORD *)(v9 + 100) + 104) && sub_449340(*(_DWORD *)(v9 + 100)) == 2 )
sub_448DC0(a2);
break;
case 3:
v8 = (int)*(&dword_738A4C + v6);
if ( v8 && (*(_BYTE *)(v8 + 10) == 2 || *(_BYTE *)(v8 + 10) == 4) )
{
if ( sub_461BB0(*(&dword_738A4C + v6)) == 2 )
sub_461910(a2);
}
else
{
sub_43D230(v6, v7);
}
break;
}

Man achte auf die Zuweisung von v11 in Abhängigkeit von v10. Das wurde durch den Compiler schön optimiert durch den ternären Vergleich. Der kommt übrigens mit dem ummantelnden If auch noch an zwei weiteren Stellen vor. Die (doppelte) Nullzuweisung ist so eigentlich sehr offensichtlich. Deswegen erkläre ich mir ein Übersehen des Programmierers so, dass das if und der ternäre Vergleich mal in eine inlined Methode ausgelagert wurde.
Kann ich denn in IDA Opcodes hinzufügen und die Offsets werden alle automatisch angepasst? Das könnte das Fixen und die evtl. Suche einer Codecave überflüssig machen.

InstantMuffin
Guest
#20
23-12-2018 17:54

Kleiner Nachtrag:
Der von mir zitierte Abschnitt führt wohl nicht zu dem Absturz, den ich mit meinem Testsave habe. Wie man oben sieht, müsste das Spiel schon bei !*(v11 + 189) abstürzen.
Die anderen Stellen haben diese zusätzliche Bedingung nicht. Das obige Beispiel ist aber nur als Exemplar für die wahrscheinliche inline Methode bzw. den Programmierfehler zu sehen.

echnaton
#21
23-12-2018 19:49
Posts: 369

Viele Probleme auf einmal.
Der Breakpoint war ja schon in der dll als ich das attached habe.
Kam ich direkt in die dll.
Wenn ich den Fehler nicht nachvollziehbar habe kann ich nicht viel machen, nur raten.
War wohl der ursprüngliche desync ein anderes Problem?
Gerade mit Häfen stürzt das Spiel gern ab oder spinnt.
Habe zwar ein dif fertig für das desync Problem, nicht getestet bis jetzt.

InstantMuffin
Guest
#22
23-12-2018 20:00

Also ich rede die ganze Zeit von den Häfen-Marktplatz Problem(en).
Desync kann ich ja eh nicht testen.
Ich kann mir für die Desyncs keinen Fix vorstellen. Nur evtl. Workarounds. Du kannst ja mit Shift+F12 in IDA die Strings einsehen, die Desync-Nachrichten raussuchen und da die XRefs sehen. Dann kann man erahnen, dass es sowohl periodische Desync-Überprüfungen gibt, als auch zufällige (zumindest den Beschreibungen in den Strings nach zu urteilen). Evtl. gibt es von sich aus schon Kompensationsmechanismen und man kann das Problem umgehen indem man die periodischen Überprüfungen öfters machen lässt.

InstantMuffin
#23
23-12-2018 20:04
Posts: 9

Was hast du denn wo verändert in deinem Diff bzgl. des Desync-Problems bzw. was ist da deine Theorie/dein Ansatz?

echnaton
#24
23-12-2018 20:30
Posts: 369

Wie kann ich denn so einen desync provozieren? Reicht es über Netzwerkkarte lange genug zu spielen? Wenn das in der neuen Version behoben sein sollte lohnt es sich nicht eigentlich nicht mehr. Dein Hafenproblem ist in der S4 exe? Mach doch mal eine Email für solche Sachen, dann könntest du den save schicken. Es waren schon ganz arge Fehler in S4, kannst du nichts machen wenn nicht mal das Errorlog erstellt wird. Wenn cs:eip vorhanden ist ist wenigstens noch eine Chance.

Serp
#25
23-12-2018 22:06
Posts: 6

Hab grad mal gegoogelt und bin auf das ubi forum gestoßen, in dem berichtet wird, dass das desync problem wohl gefixt wurde.
https://forums-de.ubi.com/showthread.php/191815-Alte-Fehler-behoben/page8

Bzw hier stehts sogar im offiziellen changelog:
https://forums-de.ubi.com/showthread.php/200503-TSHC-Changelog-19-12

ob der hafen bug auch gefixt wurde bzw aufm schirm ist hab ich noch nicht gesehen, hab den thread und die changelogs aber auch noch nicht durch.

Pages: 1 2 Next page

SiteEngine v1.5.0 by nevermind, ©2005-2007
Design by SpiderFive (www.siedler-games.de) - English translation by juja

Impressum