https://linen.dev logo
ServerScriptでMinecraft本体のメソッドを使う方法が知りたい
# forum
y
以前からサーバースクリプトで難読化後のMinecraft本体のメソッドが使えることは知っていたのですが、なんとなく真似ているだけでその詳しい方法を知らないため、うまく対象を指定できずにno such functionを連発しています……。 今一度、特定のclassファイルのメソッドをサーバースクリプトで呼び出す方法を、詳細に教えて頂けないでしょうか?
h
Minecraft側で実装されているメソッドを調べたい、ということであればMCP Mapping Viewerを使うと調べられます 使い方の記事を書いているので、よかったら参考にしてみてください https://www.hi03s.com/post/jd-gui%E3%81%A8mcpmappingviewer%E3%81%AE%E4%BD%BF%E3%81%84%E6%96%B9 クラスを読み込む方法についてはいくつか方法があります
Copy code
js
importPackage(Packages.jp.ngt.ngtlib.util);
//この方法ではjp/ngt/ngtlib/utilに含まれるすべてのクラスがクラス名で利用できるようになります
//他のパッケージで同名のクラスが競合しないよう注意する必要があります(Vec3などよくある名前)

var BufferedImage = Packages.java.awt.image.BufferedImage;
//この方法は変数BufferedImageにクラスを割り当てます。以降は
var type = BufferedImage.TYPE_INT_ARGB
var imageTemp = new BufferedImage(width, height, type);
//みたいな感じで、変数が有効な範囲で使用できます

//一箇所だけでしか使わないという場合は
var resource = new Packages.net.minecraft.util.ResourceLocation("minecraft", path);
var stream = Packages.jp.ngt.ngtlib.io.NGTFileLoader.getInputStream(resource);
//というようにフルパスで記述することでも使用できます
もしかしたら勘違いしてるかもなのでおさらいを兼ねて メソッドはクラスの持ち物なので、例えばEntityが持ってるメソッドはTileEntityで使うことはできません(メソッドが存在しません)。 ではEntity.getDistanceSq()とTileEntity.getDistanceSq()は同じではないか?と思うのですが、名前が同じだけで別物になります。 前者の難読化後名はfunc_70092_eなのですが、これで検索するとEntityクラスしか出てきません。後者のfunc_145835_aも同様で、TileEntityクラスしか出てこなくなります。
ではEntityTrainBaseはfunc_70092_eを持たないのか?となりますが、EntityTrainBaseはEntityVehicleBaseを継承、EntityVehicleBaseはEntityを継承して作られているので、EntityTrainBaseは継承元であるEntityのメソッドや変数を持っていることになります。
EntityTrainBaseは親の親がEntityなのでfunc_70092_eを持っているが、func_145835_aはよその家族(TileEntity)の持ち物なので持っていないといった感じです
y
なるほど、継承してない別クラスのメソッドを呼び出していた可能性がありそうです……丁寧に教えていただいてありがとうございます