https://linen.dev logo
サーバーサイドでのModelSetの取得について
# forum
h
1.7.10のサーバー環境において、ModelSetを取得するメソッド(ModelPackManager.INSTANCE.getModelSet)がクラッシュしてしまいます。おそらくサーバー側にない処理が噛んでいるからだと予想するのですが、これ以外にモデル名からModelSetを取得する(もしくは車両の長さを取得する)方法はありますでしょうか? あるいは処理部分をRTMからスクリプトに移植する他ないのでしょうか? 該当プログラムの抜き出し部分です。 ModelSetは車両の長さを取得するために使用しています。
Copy code
js
    ︙
    var modelName = item.func_77942_o() ? item.func_77978_p().func_74779_i("ModelName") : null;
    if (!modelName) continue;
    setting.model.push(modelName);

    var subType = item.func_77952_i();
    switch (subType) {
        case 1: subType = 0; break;//EC
        case 0: subType = 1; break;//DC
        case 2: subType = 2; break;//CC
        default: subType = 0; break;
    }
    setting.type.push(subType);

    setting.dir.push(itemStackSize === 2 ? 1 : 0);

    var modelSet = ModelPackManager.INSTANCE.getModelSet("ModelTrain", modelName); //ここでエラー発生
    if (modelSet) {
        setting.distance = modelSet.getConfig().trainDistance * 2; 
    }
    ︙
クラッシュレポート抜き出し
p
的外れなこと言っていたらすみません。 jp.ngt.rtm.entity.train.EntityTrainBaseにある、getDefaultDistanceToConnectedTrainを使用してはだめでしょうか。 このメソッドは2つのEntityTrainBaseの"TrainDistance"で設定した数値を足すものなので、 entity.getDefaultDistanceToConnectedTrain(entity)/2といった形で1つの車両の"TrainDistance"の数値に変形できます。 ※モデル名からは無理でしたね
u
ModelPackManagerの45行目付近に存在する、
Copy code
java
private final Map<String, IModelNGT> modelFileMap = new ConcurrentHashMap<>();
が原因と思われます。Nashornから呼び出した際のDynalinkでIModelNGTクラスの呼び出しがかかり、IModelNGTはクライアント側のみのクラスであるため、NoClassDefFoundErrorが発生している模様です。また、リフレクションを使用した方法でも、```java ModelPackManager.INSTANCE
Copy code
までの呼び出しでクラッシュが発生するため代替不可能です。

そのため、かなり冗長な方法となりますが、一時的に車両エンティティをスポーンせずに生成してModelSetのみを取り出すことで同様の処理の実現が可能です。
```js
importPackage(Packages.jp.ngt.rtm.entity.train);

var train
switch (subType) {
    case 2:
        train = new EntityFreightCar(world, "");
        break;
    case 3:
        train = new EntityTanker(world, "");
        break;
    default:
        train = new EntityTrain(world, "");
}
train.setModelName(modelName);
var modelSet = train.getModelSet();
h
回答ありがとうございました。無事にサーバー側で動作させることができました!