Anmelden

Archiv verlassen und diese Seite im Standarddesign anzeigen : Hotfix: Mehrsprachige Mods (by Hamers)



Hamers
08.12.2012, 23:34
Hey Jungs :D

Da die Frage nun schon öfters aufgekommen ist, möchte ich an dieser Stelle kurz beschreiben wie man das Problem behebt, dass Crysis keine Dateien im Localized Ordner einer Mod erkennt und es daher unmöglich ist mehrsprachige Mods mithilfe des Crysis Systems zu realisieren.

Für den Fix ist eine Code-Änderung erforderlich. Ich gehe daher davon aus, dass Grundkenntnisse in der C++ Programmierung vorhanden sind. Ich kann auch keine Garantien geben für Korrektheit. Ich werde aber versuchen auf Fragen einzugehen, soweit es meine (begrenzte) Zeit erlaubt.

Ich werde mich daher auch auf das nötigste beschränken und nur zeigen wie man seinen Code anpasst, damit man mehrere Sprachpakete nutzen kann. Wie das Crysis Lokalisations System an sich funktioniert, dauert zu lang zu erklären und sollte jeder für sich selber herausfinden.

Empfehlenswert dafür sind folgende Seiten des Free SDK:

http://freesdk.crydev.net/display/SDKDOC3/Overview+of+the+Localization+System (Achtung: Wie die Seite selber sagt, hat sich einiges geändert mit der Version 3.4.3 des Free SDK. Davor war das System identisch mit Crysis 1 und Crysis Wars)

http://freesdk.crydev.net/display/SDKDOC3/The+Dialog+System


Nun aber zum Code Teil :)
Ich habe versucht möglichst viel zusammenzufassen und unnötiges wegzulassen, damit es einfacher wird. Ein Teil stammt noch aus der Rainy Days Zeit, daher nicht immer ganz ordentlich und perfekt ;)


Notwendige Änderung:

In der Game.cpp in die Funktion CGame::Init vor der Zeile m_pFlashMenuObject = new CFlashMenuObject einfügen:



//Set Mod language based on automatically detected language
ILocalizationManager* pLocMgr = gEnv->pSystem->GetLocalizationManager();

//Get current language
string m_bDetectLanguage = pLocMgr->GetLanguage();

//Wreckage only supports German or English language. Others will be set to English!
if (m_bDetectLanguage != "German" && m_bDetectLanguage != "English")
m_bDetectLanguage = "English";

//Free all data for refresh
gEnv->pSystem->GetLocalizationManager()->FreeData();

//Set language
gEnv->pSystem->GetLocalizationManager()->SetLanguage("../../mods/wreckage/game/localized/" + m_bDetectLanguage);

//Add language pak file to FileSystem
gEnv->pSystem->GetIPak()->OpenPack( "","Mods/Wreckage/Game/Localized/" + m_bDetectLanguage + ".pak");

//Set CVar for Sub-Systems
string sCommand = "g_language";

sCommand.append(" ");
sCommand.append(m_bDetectLanguage);
gEnv->pConsole->ExecuteString(sCommand.c_str());

//Reload all XmlSpreadsheets
gEnv->pSystem->GetLocalizationManager()->LoadExcelXmlSpreadsheet("languages/ui_text_messages.xml", true);
gEnv->pSystem->GetLocalizationManager()->LoadExcelXmlSpreadsheet("languages/ui_dialog_recording_list.xml", true);
gEnv->pSystem->GetLocalizationManager()->LoadExcelXmlSpreadsheet("languages/ui_credit_list.xml", true);
gEnv->pSystem->GetLocalizationManager()->LoadExcelXmlSpreadsheet("languages/ps_basic_tutorial_subtitles.xml", true);
gEnv->pSystem->GetLocalizationManager()->LoadExcelXmlSpreadsheet("languages/movielist.xml", true);
gEnv->pSystem->GetLocalizationManager()->LoadExcelXmlSpreadsheet("languages/game_text_messages.xml", true);
gEnv->pSystem->GetLocalizationManager()->LoadExcelXmlSpreadsheet("languages/game_controls.xml", true);
gEnv->pSystem->GetLocalizationManager()->LoadExcelXmlSpreadsheet("languages/dialog_recording_list.xml", true);
gEnv->pSystem->GetLocalizationManager()->LoadExcelXmlSpreadsheet("languages/ai_dialog_recording_list.xml", true);
Der fertige Code sollte so aussehen:



if (!gEnv->pSystem->IsDedicated())
{
---Der Code von oben---

m_pFlashMenuObject = new CFlashMenuObject;
m_pFlashMenuObject->Load();
}


Bitte darauf achten, dass ihr das Wort Wreckage in den Pfadangaben durch den Namen eurer Mod ersetzt!

Auch gilt es zu beachten, dass in diesem Beispiel der Sprachsupport auf Englisch und Deutsch beschränkt wird. Wenn ihr die eine IF Abfrage entfernt, könnt ihr auch alle Sprachen zulassen, müsst dann aber auch die entsprechenden Sprachpakete bereitstellen. Selbstverständlich kann die Abfrage beliebig erweitert werden, um jede erdenkliche Sprach-Kombination zuzulassen z.B. nur Englisch oder Deutsch, Englisch und Spanisch usw.

Das sollte es bereits gewesen sein. Für Wreckage wurden noch zahlreiche weitere Modifikationen vorgenommen, die aber wahrscheinlich für die meisten nicht sonderlich interessant sind. Das hier sollte ausreichen, damit Crysis eure gewünschten pak Dateien aus eurem "MeineMod->Game->Localized" Ordner lädt und verwendet.

Schönes Wochenende noch :D

Flow groover
09.12.2012, 12:45
Du bist der geilste :!::!::!:
Tausend Dank, zu geil!

Flow groover
08.01.2013, 04:02
So, bin nun dabei die letzten Code Arbeiten bei Vietcry zu machen und wollte jetzt noch zu guter letzt deinen Fix einbauen, blos habe ich Probleme. Nämlich wird die gewünschte *.pak file nicht geladen. Ich bin auch schon so weit, das ich weiß das die ganzen funktionen garnicht ausgelöst werden. Ich habe direkt am Anfang (also ab "if (!gEnv->pSystem->IsDedicated())" direkt mal irgendetwas in die Log schreiben lassen über CryLog(""); und in der Game.log danach gesucht, (log_verbosity und log_file_verbosity beide auf 3) aber nicht gefunden. Das ist das erste mal das ich dein Tut mache, also weis ich auch nicht ob es überhaupt geht oder es einfach nur daran liegt das Vietcry auf Crysis läuft und irgendwas anders ist und geändert werden muss. :?:

Hmm ok, das kann eigentlich nicht sein, immerhin wird ja direkt darauf das Flash Hud indirekt initiert. Hmm..

Edit (5 Uhr morgens):
Okay, ich gehe jetzt schlafen. Ich kam gerade auf die Idee das ich beim letzten mal als ich in der Vietcry Projektmappe was gemacht habe, ich die 32bit dll nachkompiliert hatte. AUSSERDEM NICHT ZURÜCKGESTELLT AUF 64. FUCK.
Und ich wundere mich und wundere mich, warum nichts, aber auch rein gar keine von den Sachen die ich machen will nicht klappt. Tja, wie lang hab ich heute nacht in Visual Studio gesessen? :lol: :wall::wall::wall::wall::wall::wall: :wall: :wall::wall::wall::wall:

Edit 2 (5 Uhr nachmittags):
Und es geht direkt :) Hauptmenü hat jetzt wieder veränderte Lokalisation :) Hamers, du bist ein Held!