Zugriffserweiterung
Die Zugriffserweiterung ist eine Art von Klassenoptimierung, mit der die Zugriffsbeschränkungen von Klassen, Methoden und Feldern gelockert und diese Änderung im dekompilierten Quellcode widergespiegelt werden. Dazu gehört, dass sie öffentlich, erweiterbar und/oder veränderbar sind.
Einträge in Zugriffserweiterern können transitiv sein, damit Änderungen auch für Mods sichtbar werden, die von deinem Mod abhängen.
Um auf Felder oder Methoden zuzugreifen, ist es oft sicherer und einfacher, Zugriffs-Mixins zu verwenden, doch gibt es zwei Situationen, in denen diese Art des Zugriffs nicht ausreicht und eine Zugriffserweiterung erforderlich ist:
- Wenn du auf eine
private,protectedoder package-private Klasse zugreifen musst. - Wenn du eine
final-Methode, eine Unterklasse oder einefinal-Klasse überschreiben musst.
Im Gegensatz zu Zugriffs-Mixins funktioniert die Klassenoptimierung jedoch nur bei den Standardklassen von Minecraft und nicht bei anderen Mods.
Zugriffsrichtlinien
Einträge von Zugriffserweiterern beginnen mit einem von drei richtlinienbasierten Schlüsselwörtern, um die Art der vorzunehmenden Änderung anzugeben.
Zugänglich
accessible kann auf Klassen, Methoden oder Felder abzielen:
- Felder und Klassen werden öffentlich gemacht.
- Methoden werden öffentlich gemacht und sind final, wenn sie ursprünglich privat waren.
Wenn man eine Methode oder ein Feld zugänglich macht, wird auch die zugehörige Klasse zugänglich.
Erweiterbar
extendable kann auf Klassen oder Methoden abzielen:
- Klassen werden öffentlich und nicht-final gemacht.
- Methoden werden protected und nicht-final gemacht.
Wenn man eine Methode erweiterbar macht, wird auch die zugehörige Klasse erweiterbar.
Veränderbar
mutable kann Felder nicht-final machen.
Um ein privates, finales Feld sowohl zugänglich als auch veränderbar zu machen, musst du zwei getrennte Einträge in der Datei machen.
Ziele spezifizieren
Bei der Optimierung von Klassen verwenden Klassen und Interfaces ihre internen Namen. Für Felder und Methoden musst du ihren Klassennamen, ihren Namen und ihre Bytecode-Bezeichnung angeben.
Format:
classtweaker
<accessible / extendable> class <className>Beispiel:
classtweaker
# Makes the inner class MenuSupplier in MenuType public
accessible class net/minecraft/world/inventory/MenuType$MenuSupplierEinträge generieren
Das manuelle Schreiben von Einträgen von Zurgriffserweiterern ist zeitaufwendig und anfällig für menschliche Fehler. Schauen wir uns nun Werkzeuge an, die einen Teil des Prozesses vereinfachen, indem sie es ermöglichen, Einträge zu erstellen und zu kopieren.
mcsrc.dev
Verfügbar für alle Versionen mit einer unverschleierten JAR-Datei, nämlich 1.21.11 und höher, mcsrc ermöglicht es dir, den Minecraft-Quellcode im Browser zu dekompilieren und zu durchsuchen sowie Mixin-, Zugriffserweiterer- oder Zugriffstransformatoren-Ziele in die Zwischenablage zu kopieren.
Um einen Zugriffserweiterer Eintrag zu kopieren, navigiere zunächst zu der Klasse, die du bearbeiten möchtest, und klicke mit der rechten Maustaste auf das gewünschte Ziel, um das Kontextmenü zu öffnen.

Klicke anschließend auf Copy Class Tweaker / Access Widener und daraufhin sollte oben auf der Seite eine Bestätigungsmeldung erscheinen.

Du kannst dann den Eintrag in deine Klassenoptimierer Datei einfügen.
Minecraft Development Plugin (IntelliJ IDEA)
Das Minecraft Development Plugin, auch bekannt als MCDev, ist ein IntelliJ IDEA-Plugin, das bei verschiedenen Aspekten der Entwicklung von Minecraft-Mods hilft. Du kannst beispielsweise Einträge für Zugriffserweiterer aus dem dekompilierten Quellziel in die Zwischenablage kopieren.
Um einen Zugriffserweiterer Eintrag zu kopieren, navigiere zunächst zu der Klasse, die du bearbeiten möchtest, und klicke mit der rechten Maustaste auf das gewünschte Ziel, um das Kontextmenü zu öffnen.

Dann, klicke auf Copy / Paste Special und AW Entry.

Es sollte nun eine Bestätigungsmeldung auf dem Element erscheinen, auf das du mit der rechten Maustaste geklickt hast.

Du kannst dann den Eintrag in deine Klassenoptimierer Datei einfügen.
Änderungen anwenden
Damit deine Änderungen übernommen werden, musst du dein Gradle-Projekt aktualisieren, indem du die Quellen neu generierst. Die von dir ausgewählten Elemente sollten entsprechend deren Zugriffsbeschränkungen angepasst werden. Wenn die Änderungen nicht angezeigt werden, kannst du versuchen, die Datei zu validieren und zu prüfen, ob irgendwelche Fehler auftreten.
























