6
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

MinecraftForgeでprivate変数を取得、変更する方法

Last updated at Posted at 2021-05-20

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

データの取得

コード例

MinecraftデフォルトのクラスであるChatScreenのdefaultInputFieldTextを取得したい

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

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

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

使用時の注意点

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

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

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

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

データの変更

ObfuscationReflectionHelper.setPrivateValueを使用します。
上記と同じように変数名の取得をします。

Example.java
ObfuscationReflectionHelper.setPrivateValue(ChatScreen.class,chatScreen,"テスト","field_146409_v");
6
1
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?