提供: Minecraft Modding Wiki
この記事は"Minecraft Forge Universal 10.13.0.x~"及び"ComputerCraft 1.75~"を前提MODとしています。 |
この記事は執筆中です。加筆してくださる人を募集しています。 |
ILuaObjectの利用
Java側の独自オブジェクトをLua側から扱えるようにする方法について解説します。
- ILuaObjectの実装
- ILuaObjectの利用
- Lua側での利用
ILuaObjectの実装
ILuaObjectとは、通常Luaでは扱えない独自のオブジェクトをLua側からでも間接的に扱えるようにするためのインターフェイスです。
実装例(周辺機器メソッドの戻り値からLuaへ渡す場合):
public class MyPeripheral implements IPeripheral { /* 略 */ @Override public Object[] callMethod(IComputerAccess computer, ILuaContext context, int method, Object[] arguments) throws LuaException, InterruptedException { /* 略 */ MyObject myObject = new MyObject(); // ILuaObjectで扱うオブジェクト return new Object[] { wrapMyObject(myObject) }; /* 略 */ } private ILuaObject wrapMyObject(final MyObject myObject) { return new ILuaObject() { @Override public String[] getMethodNames() { return new String[] { /* メソッド名の配列 */ }; } @Override public Object[] callMethod(ILuaContext context, int method, Object[] arguments) throws LuaException, InterruptedException { // TODO: myObject を扱うためのメソッドを実装 return null; } }; } }
この例では無名クラスでILuaObjectを実装しましたが、もちろん通常のクラスで実装しても構いません。
Java側のオブジェクトをLua側から扱うためのメソッドは、ILuaObject.getMethodNames()とILuaObject.callMethod()で実装します。
実装方法についてはIPeripheral.getMethodNames()及びIPeripheral.callMethod()と同じなので、「周辺機器メソッドの追加」を参考にしてください。
ILuaObjectの利用
実装したILuaObjectオブジェクトは、以下のようなメソッドの引数・戻り値(のObject配列の要素)としてLua側へ渡すことができます。
- IPeripheral.getMethodNames()の戻り値
- IComputerAccess.queueEvent()の引数
- TurtleCommandResult.success()の引数
Lua側での利用
ILuaObjectオブジェクトはテーブルに変換されてLua側へ渡されます。テーブルの要素はキーがメソッド名の文字列、値がそのメソッドを呼ぶための関数です。