Hey, ich habe solch ein Programm bereits programmiert, jedoch wurde das Programm nur für einen speziellen Server programmiert und somit kommt eine Veröffentlichung für mich nicht in Frage. Daher ist es super, dass du eine öffentliche, kostenlose Version erstellen möchtest. Es ist verdammt einfach und du solltest das sicherlich ohne Probleme schaffen. Ich habe einige Informationen für dein Vorhaben, damit es nochmal schneller geht. Falls du Hilfe brauchst, kannst du mich gerne privat anschreiben.
Folgendes geht mein Programm durch.
Mit "Objekt" sind .mse, .gr2, .spt & .mde Dateien gemeint.
- Alle Property Dateien im YMIR WORK Ordner finden (.prb, .pre, .prt, .prd)
- Alle gefundenen IDs mit ihren Pfaden & Property Dateien assoziieren
- Alle IDs finden, die in der Map benutzt wurden
- Alle Objektpfade für diese Map erhalten
- MDE Dateien durch die Pfade in den .mse Dateien erhalten
- Sound Dateien finden
So, alle Objekte gefunden, nun die Texturen & Mapsetting Info.
- TextureSet finden
- Environment Texturen & Dateien finden
- SpecialWaterPath finden
- Texturen für die .gr2 Dateien finden
- Texturen für die .mse Dateien finden
- Texturen für die .mde Dateien finden
- Texturen für die .spt Dateien finden
Und am Ende wird alles verschoben in den <mapName>/objects Ordner. Nun kommt eine etwas detailliertere Beschreibung zu allem, damit du hoffentlich keine Probleme auf deinem Weg findest. Einige Dinge sind eher Grob erklärt, aber ich denke du hast genug Erfahrung und verstehst, was ich meine.
Alle Property Dateien im YMIR WORK Ordner finden (.prb, .pre, .prt, .prd)
Ziemlich einfach, ich denke das ich dir das nicht erklären muss. Ich habe hierbei einfach nur alle Dateipfade herausgefunden, welche mit den entsprechenden Formaten enden.
Alle gefundenen IDs mit ihren Pfaden & Property Dateien assoziieren
Ich habe alle Dateien auslesen lassen und die IDs mit den enthaltenden Pfaden verknüpft. In diesem Prozess habe ich auch direkt die Property Dateien mit den IDs verbunden, dass hilft dir später beim verschieben der Property Dateien und spart auch einfach etwas Arbeit.
Alle IDs finden, die in der Map benutzt wurden
Der Map Ordner hat mehrere, nummerierte Ordner. Diese Ordner stellen einfach nur jeweils einen Chunk da und dessen Inhalt. Rein Theoretisch könntest du nur den ersten Ordner auslesen und hättest somit alle Objekte die in der oberen, linken Hälfte der Map stehen. Da du aber alle Objekt IDs haben möchtest die die Map enthält, iterierst du durch alle nummerierten Ordner und liest jeweils die Objekt IDs raus, die in der "areadata.txt" stehen.
Alle Objektpfade für diese Map erhalten
Hierbei habe ich alle Property IDs mit den IDs in der Map verglichen und die Pfade nochmal separat gespeichert. Jetzt haben wir alle Pfade zu den Dateien für die Granny, SPT, & MSE Dateien. MDE fehlt jedoch noch, da diese Dateien durch die .MSEs geladen werden. Für die .gr2 Dateien kannst du auch direkt noch die .mdatr abgefragen (meines Wissens immer im selben Pfad). Die ist für die Collisions verantwortlich.
MDE Dateien durch die Pfade in den .mse Dateien erhalten
Die MDE Dateien kannst du ganz einfach über die .mse Dateien erhalten. Die Pfade dazu findest du unter "Group Mesh". Wenn dort kein absoluter Pfad steht, nimmst du den Pfad aus der du die .mse Datei hast.
TextureSet, Environment & SpecialWaterTexture finden
Die Pfade zu den Texturen, den Environments und die SpecialWaterTexture findest du in der <mapName>/setting.txt. Hier findest du auch den Namen des Environments, welches genutzt wurde und kannst somit auch direkt die Texturenpfade auslesen.
Texturen für die .gr2 Dateien finden
Hierfür nutzt du die granny2.dll. Du Bitte melden Sie sich an, um diesen Link zu sehen. die Library, Bitte melden Sie sich an, um diesen Link zu sehen. sie und ließt alle Pfade aus den Granny Texturen raus (es geht einfacher, aber ich wollte mich damit nicht zu lange beschäftigen). Wenn du dich nicht viel mit Granny beschäftigt hast, findest du in der Material.cpp aus der Metin2Client Binary alles, was du wissen musst oder jedenfalls lernst du genug, um nicht zu verzweifeln. Du kannst durch die Texturen in der Granny Datei iterieren und FromFileName (Texturenpfad) auslesen. Meines Wissens lädt Metin2 nur absolute Texturenpfade, daher musst du hier nichts weiter machen.
Du kannst die Texturen meines Wissens nicht anders aus der Granny Datei auslesen. Mit dem rohen Inhalt der Datei kannst du auch nicht rechnen, da der Inhalt von Granny Dateien keine nützlichen Strings enthält. Aber die oben genannte Methode ist echt einfach und alles notwendige dafür findest du in der verlinkten Github Repo.
Texturen für die .mse Dateien finden
Das ist ebenfalls ziemlich einfach: Einfach die Pfade aus den .mse Dateien auslesen. Auch hier wieder beachten, dass dort nicht immer absolute Pfade stehen und du sie anpassen musst, um sie später verschieben zu können.
Texturen für die .mde Dateien finden
Die Texturpfade kannst du anders als bei Granny Dateien direkt in den .mde Dateien finden. Wenn du es wirklich sauber haben möchtest, kannst du es wie Metin2 machen und dir mal die EffectMesh.cpp anschauen. Dort müsstest du alles notwendige finden. Ich habe es auch beide Arten gemacht, also ist es theoretisch egal wie du es anstellst. Ich würde aber generell darauf verzichten, den Inhalt von Dateien einfach so zu lesen, aber du kannst es so machen wie du möchtest.
Texturen für die .spt Dateien finden
Bitte melden Sie sich an, um dieses Bild zu sehen.
Du kannst die Pfade super einfach in der Datei finden. Ich empfehle dir aber einen vernünftigen Parser zu schreiben oder es so zu machen wie Metin2. Unter SpeedTreeWrapper.cpp findest du verdammt hilfreiche Funktionen und kannst sie etwas umschreiben um es wie bei mir oben einfach auslesen zu können. Dafür brauchst du aber auch die .dll Datei (SpeedTreeRT.dll) aus dem Metin2 Ordner. Was solche Sachen angeht, kann man Metin2 als Dokumentation nutzen. Du musst das Rad nicht neu erfinden.
Wie du oben auch siehst, stehen in den SpeedTree Dateien seltsame Pfade die zu nichts führen. Ich vermute, dass diese dort einfach nur gespeichert werden (kompletter Pfad), damit man sie beim Laden in SpeedTree (Software) wiederfindet. Metin2 schaut sich wahrscheinlich erst den absoluten Pfad an und wenn dort nichts existiert, sucht er im Pfad der .spt Datei. Also kannst du die Texturen theoretisch einfach in den Pfad tun, wo die .spt Datei ist.
Unten in der .spt Datei könnten "Verlinkungen" sein, die zu default Textures führen oder es sind gar nicht erst Pfade und sind nur für SpeedTree da. Jedenfalls ist das meine Theorie. Ich weiß ehrlich gesagt nicht, ob irgendwo Default Images für SpeedTree gespeichert sind.
Ende
Ich hoffe, irgendetwas davon konnte dir irgendwie helfen. Unten siehst du das Ergebnis. Der Output der Konsole ist null optimiert, dort lasse ich nur bisschen Schrott zum Debuggen ausgeben. Ich habe viele Abfragen im Programm um sicher zu stellen, dass alle Dateien 100% existieren. Wenn nicht, sagt dir die Konsole das. Ich wollte hier zukünftig einen Cleaner veröffentlichen, der alle Property Dateien überprüft und alles, was nicht existieren sollte, aus dem YMIR WORK Ordner löscht, eine Property erstellt oder einfach nur dem Nutzer berichtet was abgeht. Du könntest sowas ja auch mal bei Lust & Zeit veröffentlichen, dann werde ich mich da zurückhalten.
Bitte melden Sie sich an, um dieses Medienelement zu sehen.