在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");