Modding API

    Unser Forum verwendet Cookies. Durch die Nutzung unserer Seite erklärst du dich damit einverstanden, dass wir Cookies setzen. Datenschutzerklärung.


    Entscheidet mit wie es mit dem Forum in Zukunft weitergehen soll -> Status & Umfrage

      Modding API

      Modding API

      Die Modding API wird aus grundlegend 4 Programmen bestehen:
      • ModLoader.exe
        Die ModLoader.exe stellt den Injector dar. Er lädt alle Daten des Mods in die aktuellen DLL Dateien. Natürlich backupped er die originalen Dateien und so ist es möglich, verschiedene Modkombinationen auszuprobieren.
      • CreateModLib.exe
        Die CreateModLib.exe bewerktstelligt die Versionsunabhängigkeit der Modding API. Sie erstellt für jede neue Spielversion eine passende Modding Library. Hierzu zählen auch die Modding Library Tools. Dort sind Funktionen wie etwa Logging und bearbeitbarer Konfigurationen enthalten. Später wird es hier auch möglich sein, neue Rezepte in das Survival Book einzutragen oder andere tolle Funktionen.
      • DevTools/CreateModProject.exe
        Die CreateModProject.exe erstellt auf Basis der aktuellen Mod Library ein Mod Projekt. Dieses Projekt kann in MonoDevelop oder anderen Programmen, welche .csproj Dateien öffnen können, geöffnet werden.
      • DevTools/CreateMod.exe
        Die CreateMod.exe erstellt aus einer kompilierten DLL Datei (inklusive ModInfo.xml Resource) eine fertige .mod Datei. Die kann vom ModLoader in die DLL Datei injected werden.

      CreateModLib.exe
      Die CreateModLib.exe erstellt eine versionsunabhängige ModLib.dll. Für jede Version muss eine neue ModLib.dll erstellt werden. Nachdem man das Programm CreateModLib.exe ausgewählt hat, muss man zunächst das Spiel auswählen.


      Sollte das Spiel nicht automatisch gefunden werden, wird das Programm danach fragen, ob Du den Pfad zur TheForest.exe per Hand eingeben möchtest. Danach erscheint ein Datei öffnen Dialog, indem Du nur noch die richtige TheForest.exe auswählen müsst.

      Als nächstes siehst Du dann den Parsing Bildschirm.


      Sollte ein Problem auftauchen, klicke bitte auf "Show Log" und kopiere den Inhalt auf pastebin.com und teile mir den Link mit. Ich bedanke mich für jede Unterstützung.


      Modding
      DevTools\CreateModProject.exe
      Wenn Du dir ein fertiges ModProjekt erstellen lassen möchtest, kannst du die CreateModProject.exe verwenden. Im Formular gibst du den Modnamen ein und den Ort, an dem das Projekt erstellt werden soll.


      Sollte alles in Ordnung sein, sollte ein Hinweisfenster erscheinen, welches darauf hinweit, dass das Projekt erfolgreich erstellt wurde.
      Nun kannst du die erstellte .csproj Datei in deiner IDE öffnen.

      Konfigurationsdateien
      Jeder Mod muss eine Konfiguration beinhalten. Die Daten müssen in der Resource "ModInfo.xml" in der DLL vorhanden sein. Solltest Du die CreateMod.exe verwendet haben, ist dafür bereits alles vorbereitet.

      Folgend einige möglichen Konfigurationen:

      Quellcode

      1. <mod>
      2. <!-- Gibt den Namen an. Multilingual-Support mit ISO-3166-2 Ländercodes -->
      3. <name>
      4. <EN>MyMod</EN>
      5. <DE>MeinMod</DE>
      6. </name>
      7. <!-- Versionsnummer unterstützt jedes numerische Format inkl. a-z -->
      8. <version>0.1.20</version>
      9. <!-- Ein Mod, der für diesen Mod vorrausgesetzt wird. Min und max sind optionale Versionsangaben -->
      10. <requiredMod name="Mod2" min="0.1.0" max="0.1.9" />
      11. <!-- Die Angabe, für welche Spielversion der Mod funktioniert. max und min sind jeweils optional. -->
      12. <gameVersion min="0.05" max="0.05" />
      13. <!-- Ein Untermod, der einzeln aktivierbar ist mit dem Namen NoClip.
      14. Die Kategorie wird im Code durch das Attribut [InjectCategory(id="NoClip")] festgelegt. -->
      15. <category name="NoClip">
      16. <!-- Auch hier multilingualer Support per ISO-3166-2 Ländercodes -->
      17. <EN>NoClip</EN>
      18. <DE>NoClip</DE>
      19. <!-- Kategoriespezifische Inkompatibilität.
      20. Min und Max sind optionale Versionsangaben -->
      21. <incompatible name="OtherNoClipMod" min="0.1.0" max="0.1.9" />
      22. </category>
      23. <!-- Modübergreifende Inkompatibilitäten -->
      24. <incompatible name="OtherSuperMod" min="0.1.0" max="0.1.9" />
      25. <!-- Absolut inkompatibel zu jeder Mod.
      26. Nur aktivieren, wenn heftige Veränderungen am Code vorgenommen worden. -->
      27. <incompatible with-all />
      28. </mod>


      Chaining
      Für jede Methode kann ein Attribut [ModAPI.Priority(int32)] gesetzt werden. Desto höher die Prioriät, desto früher in der Chain wird diese Methode aufgerufen. Es gibt keinen Maximalwert. Die Priorität sollte nur hochgesetzt werden, wenn dadurch z.B. Inkompatibilitäten mit anderen Mods umgangen werden können.

      Jedes Chain Element wird einzeln in einem try-catch ausgeführt. Sollte ein Mod ein Fehler werfen, wird mit dem nächsten Mod in der Chain fortgesetzt.

      z.B. sieht folgender Code:

      Quellcode

      1. [ModLib.Priority(10)]
      2. public override void TimeLapse() {
      3. // Prio:10
      4. base.TimeLapse();
      5. }
      6. [ModLib.Priority(5)]
      7. public override void TimeLapse() {
      8. // Prio:5
      9. base.TimeLapse();
      10. }

      am Ende so aus:

      Quellcode

      1. public void TimeLapse() {
      2. try
      3. {
      4. TimeLapse_0();
      5. }
      6. catch (Exception e)
      7. {
      8. TimeLapse_1();
      9. }
      10. }
      11. public void TimeLapse_0() {
      12. // Prio:10
      13. try
      14. {
      15. TimeLapse_1();
      16. }
      17. catch (Exception e)
      18. {
      19. TimeLapse_2();
      20. }
      21. }
      22. public void TimeLapse_1() {
      23. // Prio:10
      24. try
      25. {
      26. TimeLapse_2();
      27. }
      28. catch (Exception e)
      29. {
      30. TimeLapse_Original();
      31. }
      32. }
      33. public void TimeLapse_2() {
      34. // Prio:5
      35. try
      36. {
      37. TimeLapse_Original();
      38. }
      39. catch (Exception e) {}
      40. }
      41. public void TimeLapse_Original()
      42. {
      43. }


      Dieser Beitrag wurde bereits 12 mal editiert, zuletzt von „Souldrinker“ ()

      Und ein kleines Update. :)

      Aus:

      Quellcode

      1. protected override bool isDaytime()
      2. {
      3. Log.Write("ABC");
      4. return base.isDaytime();
      5. }


      wird im fertigen Assembly-CSharp.dll folgendes gemacht:

      Quellcode

      1. private bool isDaytime()
      2. {
      3. bool flag1;
      4. try
      5. {
      6. Log.Write("ABC", "Test1");
      7. flag1 = this.isDaytime_Original();
      8. }
      9. catch (Exception ex)
      10. {
      11. Log.Write(((object) ex).ToString(), "Test1_Exceptions");
      12. flag1 = this.isDaytime_Original();
      13. }
      14. return flag1;
      15. }
      16. private bool isDaytime_Original()
      17. {
      18. bool flag = false;
      19. if ((double) this.LdotUp > 0.0)
      20. flag = true;
      21. if ((double) this.LdotDown > 0.0)
      22. flag = false;
      23. return flag;
      24. }


      Problematisch wird es nur, wenn der Code von Endnight Games Exceptions wirft. Dadurch wird ihr kaputter Code dann 2 mal aufgerufen. ^^

      In der Exceptions Log könnte folgendes stehen:

      Quellcode

      1. System.NullReferenceException: Object reference not set to an instance of an object
      2. at TheForestAtmosphere.TimeLapse_0 () [0x00000] in <filename unknown>:0


      Da aber jede Mod eine eigene Exceptions Log bekommt, ist der Übeltäter schnell gefunden. ;)

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Souldrinker“ ()

      FOR DEVS ONLY (DONT FORGET TO BACKUP YOUR GAME)
      Pre-Alpha:
      souldrinker.de/ModAPI_preAlpha.zip

      Notizen zur Nutzung:
      Kommandozeile nutzen (CMD.exe)
      Zuerst muss die ModLib erstellt werden:
      CreateModLib.exe /Config:"The Forest" "PathToTheForest"
      z.B.
      CreateModLib.exe /Config:"The Forest" "C:\Steam\steamapps\common\The Forest\TheForest.exe"

      Anschließend kann ein Mod Project erstellt werden.
      CreateModProject.exe Projektname
      z.B.
      CreateModProject.exe MeinErsterMod

      Im neuen Projekt kann man von allen Klassen aus The Forest erben, um so einzelne Methoden zu "überschreiben". Ein Aufruf auf base.MethodenName() fügt den ursprünglichen Code an diese Stelle ein.

      Um etwas zu loggen, einfach die ModAPI.Log.Write(string s) Methode nutzen.
      ModAPI.CurrentMod ist derzeit nicht funktionstüchtig.

      Neue Klassen können einfach hinzugefügt werden. Ebenfalls neue Felder oder neue Methoden in den Klassen.
      Neue Klassen können aus jeder Assembly benutzt werden.

      Nachdem man die DLL Datei der Mod kompiliert hat, muss ein Mod erstellt werden.
      CreateMod.exe DLLFile.dll
      z.B.
      CreateMod.exe MeineTolleMod.dll

      Jetzt muss nur noch der ModLoader benutzt werden, um die Mod im Spiel zu testen.
      ModLoader.exe ModName_Version{cat=Category}
      z.B.
      ModLoader.exe MeineTolleMod_1.0

      Anschließend kann das Spiel gestartet werden.

      Folgendes gibt es noch zu beachten:
      Standard Values von Feldern funktionieren derzeit nicht.
      Man darf überschriebene Methoden nicht selbst aufrufen. (Der Mod wird nicht geladen)


      Ergänzung:
      Da die ModLib alle Methoden auf protected schaltet (damit sie überschrieben werden können), muss man darauf achten, dass man keine Methoden anderer Klassen aufruft, die eigentlich private sind. Vllt werde ich später einfach einbauen, dass alle private Methoden und Felder auch im Spiel auf protected geschaltet werden. Kaputt machen dürfte das nichts.

      Wenn man dies derzeit dennoch tut, wird das Spiel abstürzen.

      Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „Souldrinker“ ()