- Joined
- Jul 11, 2020
- Messages
- 0
- Reaction score
- 25
- Points
- 0
Hallo,
Da es länger keine größeren Beiträge von meiner Seite aus gab, habe ich mich mal dazu entschieden, ein kleines Tutorial zu schreiben, wie man am einfachsten in Java einen Injection Client schreibt.
Vorraussetzungen
Als erstes muss Forge aufgesetzt werden.
Nachdem ihr das MDK heruntergeladen und entpackt habt, seht ihr mehrere Ordner und Dateien.
Alles außer die folgenden Dateien könnt ihr ohne Probleme löschen:
Der gradle wrapper lädt die entsprechende gradle Version herunter (damit man das nicht selber tun muss und weil nicht jede gradle Version bei forge bspw. funktioniert) und führt dann die entsprechende Aufgabe aus.
Nun öffnet ein Kommandozeilenfenster in dem Forge MDK Ordner und gebt folgendes ein:
Linux:
Windows:
Dieser Vorgang dauert je nach Internet und Rechnerleistung 5-10 Minuten.
Als nächstes öffnet ihr mit eurer IDE das entstandene Projekt.
Mit Intellij einfach auf "Projekt importieren" und dann build.gradle auswählen,
Für Eclipse müsst ihr zusätzlich folgenden Befehl in der Kommandozeile eingeben:
Linux:
Windows:
Dies lädt noch zusätzlich Artefakte herunter, die für Eclipse notwendig sind.
Falls ihr mit Intellij das Projekt importiert habt, müsst ihr noch zusätzlich diesen Befehl eingeben:
Linux:
Windows:
Dies konfiguriert die IDE, sodass ihr den Client mit Gradle starten könnt.
Eine ausführliche Anleitung gibt es hier:
https://mcforge.readthedocs.io/en/latest/gettingstarted/
Nachdem nun Forge erfolgreich konfiguriert wurde, muss Mixin noch zum Projekt hinzugefügt werden.
Dazu muss als erstes das Github Projekt von Mixin kopiert werden.
Dies geht mit dem Befehl:
Um Mixin nun mit Gradle zu kompilieren und entsprechend die Bibliotheken zu erstellen ist folgender Befehl erfordlerlich:
(Hierfür müsst ihr erst in den entstandenen Ordner navigieren)
Linux:
Windows:
in Mixin\build\libs befinden sich nun 5 .jar Dateien.
Diese müssen jeweils in der IDE dem Projekt hinzugefügt werden.
Verwendung
In eurer IDE müsst ihr als erstes alle Beispiele entfernen.
Heißt das Paket mit dem Namen com.examplemod und alles was dazugehört.
Auch mcmod.info und weitere Resources werden nicht benötigt.
Jetzt könnt ihr anfangen eure Client Base und alles weitere zu schreiben.
Wichtig ist jetzt, wie bekommen wir unsere "Mod" jetzt zum laden?
Erstellt dafür eine Klasse namens MixinMinecraft oder ähnlich.
Über der Klassendekleration fügen wir die Annotation
hinzu.
Als Argument übergeben wir die Klasse, in die wir in den späteren Funktionen injecten wollen.
Jetzt erstellen wir eine Funktion, die aufgerufen wird, wenn Minecraft initialisiert wird.
Oder konkreter, wenn der Minecraft Konstruktor ganz am Start aufgerufen wird.
Diese Funktion sieht mit der @Inject Annotation so aus:
Als Argument geben wir die Methode und den "Ort" des Methodensprungs über.
<init> steht hier für den Konstruktoraufruf und "Return" dafür, dass wir am Ende des Konstruktoraufrufs injecten wollen.
Man sollte nicht den Fehler machen und jetzt sämtliche Cheat Komponenten laden, da die Minecraft Komponenten an sich noch nicht geladen wurden.
Dafür erstellen wir eine zweite Funktion, die aufgerufen wird, wenn das Fenster von Minecraft erstellt wird.
Die Annotationsargumente sollten jetzt selbsterklärend sein.
Das V am Ende des target Arguments gibt den Rückgabedatentyp der Funktion an.
In diesem Falle steht V für void.
L gibt den Paketpfad zur Klasse an.
Nun wird das ganze noch nicht funktionieren, da Mixin selber nicht initialisiert wurde.
Dafür erstellt man eine neue Klasse mit einer Methode die folgendes beinhaltet:
https://hastebin.com/uwidinufit.java
In einer Zeile heißt es, dass wir eine Konfiguration hinzufügen.
Diese Konfigurationsdatei muss noch erstellt werden mit dem folgendem Inhalt
https://hastebin.com/ukabimevoz.json
Nun seit ihr fast Startklar.
Damit FML euren Loader auch startet, müsst ihr als VM Argument noch folgendes eingeben:
Hier natürlich euren eigentlichen Paketpfad angeben.
Jetzt startet ihr von der IDE aus den Client mittels der Run Konfiguration, die gradle für euch erstellt hat und insofern ihr keine Fehler bekommt, habt ihr euren Injection Client fertig!
Ich werde dieses Tutorial evtl. noch erweitern, indem ich zeige, wie ihr am besten mit Events umgeht usw... aber vorerst rate ich euch einen Blick in meine Github Repo zu werfen, falls ihr nicht weiterkommt oder Anregung sucht.
Diese wird die Tage auch noch erweitert.
https://github.com/IntenceYT/NoTence
Ich hoffe alles war übersichtlich erklärt und wünsche euch noch viel Spaß beim rumprobieren!
Weitere Informationen gibt es hier:
https://github.com/SpongePowered/Mixin/wiki
Da es länger keine größeren Beiträge von meiner Seite aus gab, habe ich mich mal dazu entschieden, ein kleines Tutorial zu schreiben, wie man am einfachsten in Java einen Injection Client schreibt.
Vorraussetzungen
- Minecraft (1.8 und aufwärts ist empfehlenswert. Ihr müsst die Version mindestens einmal im Launcher gestartet haben
- Forge (Ihr benötigt das MDK, welches ihr hier herunterladen könnt)
- Mixin (Das Injection Framework gibt es hier)
- JDK 8
- Git (hier)
Als erstes muss Forge aufgesetzt werden.
Nachdem ihr das MDK heruntergeladen und entpackt habt, seht ihr mehrere Ordner und Dateien.
Alles außer die folgenden Dateien könnt ihr ohne Probleme löschen:
- build.gradle
- gradlew.bat
- gradlew
- gradle Ordner
- gradle Konfigurationdatei
Der gradle wrapper lädt die entsprechende gradle Version herunter (damit man das nicht selber tun muss und weil nicht jede gradle Version bei forge bspw. funktioniert) und führt dann die entsprechende Aufgabe aus.
Nun öffnet ein Kommandozeilenfenster in dem Forge MDK Ordner und gebt folgendes ein:
Linux:
Code:
./gradlew setupDecompWorkspace
Windows:
Code:
.\gradlew.bat setupDecompWorkspace
Dieser Vorgang dauert je nach Internet und Rechnerleistung 5-10 Minuten.
Als nächstes öffnet ihr mit eurer IDE das entstandene Projekt.
Mit Intellij einfach auf "Projekt importieren" und dann build.gradle auswählen,
Für Eclipse müsst ihr zusätzlich folgenden Befehl in der Kommandozeile eingeben:
Linux:
Code:
./gradlew eclipse
Windows:
Code:
.\gradlew.bat eclipse
Dies lädt noch zusätzlich Artefakte herunter, die für Eclipse notwendig sind.
Falls ihr mit Intellij das Projekt importiert habt, müsst ihr noch zusätzlich diesen Befehl eingeben:
Linux:
Code:
./gradlew genIntellijRuns
Windows:
Code:
.\gradlew.bat genIntellijRuns
Dies konfiguriert die IDE, sodass ihr den Client mit Gradle starten könnt.
Eine ausführliche Anleitung gibt es hier:
https://mcforge.readthedocs.io/en/latest/gettingstarted/
Nachdem nun Forge erfolgreich konfiguriert wurde, muss Mixin noch zum Projekt hinzugefügt werden.
Dazu muss als erstes das Github Projekt von Mixin kopiert werden.
Dies geht mit dem Befehl:
Code:
git clone https://github.com/SpongePowered/Mixin.git
Um Mixin nun mit Gradle zu kompilieren und entsprechend die Bibliotheken zu erstellen ist folgender Befehl erfordlerlich:
(Hierfür müsst ihr erst in den entstandenen Ordner navigieren)
Linux:
Code:
./gradlew build
Windows:
Code:
.\gradlew.bat build
in Mixin\build\libs befinden sich nun 5 .jar Dateien.
Diese müssen jeweils in der IDE dem Projekt hinzugefügt werden.
Verwendung
In eurer IDE müsst ihr als erstes alle Beispiele entfernen.
Heißt das Paket mit dem Namen com.examplemod und alles was dazugehört.
Auch mcmod.info und weitere Resources werden nicht benötigt.
Jetzt könnt ihr anfangen eure Client Base und alles weitere zu schreiben.
Wichtig ist jetzt, wie bekommen wir unsere "Mod" jetzt zum laden?
Erstellt dafür eine Klasse namens MixinMinecraft oder ähnlich.
Über der Klassendekleration fügen wir die Annotation
Code:
@Mixin(Minecraft.class)
Als Argument übergeben wir die Klasse, in die wir in den späteren Funktionen injecten wollen.
Jetzt erstellen wir eine Funktion, die aufgerufen wird, wenn Minecraft initialisiert wird.
Oder konkreter, wenn der Minecraft Konstruktor ganz am Start aufgerufen wird.
Diese Funktion sieht mit der @Inject Annotation so aus:
Code:
@Inject(method = "<init>", at = @At(value = "RETURN"))
private void init(CallbackInfo ci) {
// Hier könnt ihr euren Konstruktor aufrufen
}
<init> steht hier für den Konstruktoraufruf und "Return" dafür, dass wir am Ende des Konstruktoraufrufs injecten wollen.
Man sollte nicht den Fehler machen und jetzt sämtliche Cheat Komponenten laden, da die Minecraft Komponenten an sich noch nicht geladen wurden.
Dafür erstellen wir eine zweite Funktion, die aufgerufen wird, wenn das Fenster von Minecraft erstellt wird.
Code:
@Inject(method = "createDisplay", at = @At(value = "RETURN", target = "Lnet/minecraft/client/Minecraft;createDisplay()V"))[/SIZE][/SIZE][/SIZE][/SIZE]
[SIZE=5][SIZE=4][SIZE=5][SIZE=4] private void startClient(CallbackInfo ci) {
// Jetzt könnt ihr eure Cheat Komponenten laden
}
Die Annotationsargumente sollten jetzt selbsterklärend sein.
Das V am Ende des target Arguments gibt den Rückgabedatentyp der Funktion an.
In diesem Falle steht V für void.
L gibt den Paketpfad zur Klasse an.
Nun wird das ganze noch nicht funktionieren, da Mixin selber nicht initialisiert wurde.
Dafür erstellt man eine neue Klasse mit einer Methode die folgendes beinhaltet:
https://hastebin.com/uwidinufit.java
In einer Zeile heißt es, dass wir eine Konfiguration hinzufügen.
Diese Konfigurationsdatei muss noch erstellt werden mit dem folgendem Inhalt
https://hastebin.com/ukabimevoz.json
Nun seit ihr fast Startklar.
Damit FML euren Loader auch startet, müsst ihr als VM Argument noch folgendes eingeben:
Code:
-Dfml.coreMods.load=de.client.Loader
Jetzt startet ihr von der IDE aus den Client mittels der Run Konfiguration, die gradle für euch erstellt hat und insofern ihr keine Fehler bekommt, habt ihr euren Injection Client fertig!
Ich werde dieses Tutorial evtl. noch erweitern, indem ich zeige, wie ihr am besten mit Events umgeht usw... aber vorerst rate ich euch einen Blick in meine Github Repo zu werfen, falls ihr nicht weiterkommt oder Anregung sucht.
Diese wird die Tage auch noch erweitert.
https://github.com/IntenceYT/NoTence
Ich hoffe alles war übersichtlich erklärt und wünsche euch noch viel Spaß beim rumprobieren!
Weitere Informationen gibt es hier:
https://github.com/SpongePowered/Mixin/wiki
Last edited by a moderator: