在MinecraftForge中获取和更改私有变量的方法

Minecraftのmodを作っていたらMinecraft側のコードにあるprivate変数を取得したくなります。
そんな時にこの方法を使います。

获取数据

代码示例

我想获取Minecraft默认类ChatScreen的defaultInputFieldText。

public class ChatScreen extends Screen {
     (省略)
     private String defaultInputFieldText = "";
     (省略)
}

そんなとき、ObfuscationReflectionHelper.getPrivateValueを使用します。
引数にはクラスオブジェクト、インスタンス、変数名をStringで指定します。

String  str  = ObfuscationReflectionHelper.getPrivateValue(
             ChatScreen.class,
             chatScreen,
             "defaultInputFieldText");

使用时需要注意的事项

しかし、このままのコードをビルドすると実際の環境で動かないという問題が発生します。
これは実際のコードは難読化されていて、開発環境の変数名と違うからです。
そのため、目的の変数が難読化された後の変数名を知る必要があります。

難読化後の変数名を知るためにはMCPbotを利用します。

基本的には安定版リストから、欲しいバージョンがリストになければSnapshotからcsvファイルをダウンロードします。
zipを回答すると3つのcsvが入っています。変数はfields.csv、関数はmethods.csv、引数はparams.csvで、それらを開いて検索し、難読化後の名前を特定します。
難読化後の名前がわかればgetPrivateValueの引数を差し替えます。

public class Example{
     public String GetDefaultInputFieldText(ChatScreen chatScreen){
            String  str  = ObfuscationReflectionHelper.getPrivateValue(
                        ChatScreen.class,
                        chatScreen,
                        "field_146409_v");
            return str;
     }
}

数据的修改 de

使用ObfuscationReflectionHelper.setPrivateValue来进行操作。
以相同的方式获取变量名称。

ObfuscationReflectionHelper.setPrivateValue(ChatScreen.class,chatScreen,"テスト","field_146409_v");
广告
将在 10 秒后关闭
bannerAds