1.12.2little maid mob マルチモデルの作成

アバター
SugarCoffee
ID: 1URPRUWZPJ
記事: 148
登録日時: 2019年10月19日(土) 14:21
いいね: 8回
いいねされた回数: 3回

1.12.2little maid mob マルチモデルの作成

投稿記事 by SugarCoffee » 2020年4月10日(金) 21:27

このトピックは少なくともJDK8、IntelliJやeclipseのインストールおよびその日本語化を自力でできる
およびある程度Google等を活用することのできる方を前提としています
なお可能な限り簡単に表記するためツッコミどころが多いと思いますが、ご容赦ください

メイドさんの仕様(覚える必要はそんなにないです…)
  • 大半は他のエンティティと同じ仕様だと思われます
  • メイドさんの座標はminecraftなかでのF3での座標と異なる動きをする
    Xが+の値ならば右に Yが+の値ならば下に Zが+の値ならば奥に
2020-04-10_19.46.19.png
2020-04-10_19.46.19.png (413.45 KiB) 閲覧された回数 25081 回
パーツが持つメソッド
メソッドとはJavaにおいてxxx();みたいにカッコが付いたものです(雑) クラス名.メソッド名で表記します
eyeR(右目)やbipedHead等のメイドさんの体を作るものはModelRenderというクラスに所属しています
以下ModelRendererクラスに所属するものをパーツと表記します

()の中にコンマ","で区切られているものを引数と表記します

0.1fのように"f"が付いているものは小数OKという意味だと考えてください(リテラルと呼ばれますが…)

5のように整数の場合は"f"を省略することができます

ModelRendererクラスのメソッド

bipedBody = new ModelRenderer(this,0,16);
メソッドというか正確にはインスタンス化しているだけですがともに表記します

この文は初期化と考えてください。bipedBodyが使うテクスチャの場所をX座標が0、Y座標が16として初期化したことになります

bipedBody.addChild(eyeR);
eyeRをbipedBodyの子供に指定します。子供になると親にくっついて描画されます(重要)

親がいないパーツは多分表示されない

bipedBody.addBox(1f,2f,3f,4,5,6);
その対象パーツにカッコ内で指定した引数の箱を作成します

最初の1,2,3はオフセット値を表します 後半の4,5,6はサイズを表します

上の例えではbipedBodyにオフセットX=1,Y=2,Z=3、幅4,高さ5奥行6の箱を作るという意味になります

bipedBody.addPlate(0f,-5f,3f,4,4,?)
対象パーツに引数で指定したペラペラの板を作成します
最初の3つでは オフセット値を指定 その後ろ2つでは高さと幅を指定します

?はpFacePlaneと名付けられていますが、どういう効果があるのかはわからないです
?は0でOKだと思います
この例ではbipedBodyにオフセット値X=0,Y=-5,Z=3、高さ4,幅4の正方形の板を追加するという意味になります

bipedBody.setRotationPoint(-0.5f,3.2f,4f);
対象パーツに引数で指定した分の位置(ポジション)値を与えます
ポジション値とオフセット値の違いは後述
この例ではbipedBodyにX=-0.5,Y=3.2,Z=4fのポジション値を与えるという意味になります

bipedBody.setRotateAngleDegX(13f)
対象パーツを引数で指定した角度分回転させます Degとは度数法のことで0~360度の角度に対応しています
この例ではX軸を回転軸にしてbipedBodyを13度回転させるという意味になります Xの部分がZだとZが回転軸になります

bipedBody.setRotateAngleY(0.22689280275926285f)
対象パーツを引数で指定したラジアン分回転させます
この例ではY軸を回転軸にしてbipedBodyを13度回転させるという意味になります

手打ちでラジアンを把握、入力する人はいないと思うので詳しくは省略します

bipedBody.setRotateAngleDeg(14f,0,5.2f)
対象パーツを引数で指定した角度分回転させます
この例ではbipedBodyをX軸を回転軸にして14度、Z軸を回転軸にして5.2度回転させるという意味になります
よく出てくるメソッドはこれくらいで他はあまりないです

メイドさんが持つメソッド

initModel(?,?)
initModel(float psize, float pyoffset){
super.initModel(psize, pyoffset); この中に各パーツの初期化や設定を書き込みます

}

setLivingAnimations(?,?,?,?)
public void setLivingAnimations(IModelCaps pEntityCaps, float par2, float par3, float pRenderPartialTicks) { super.setLivingAnimations(pEntityCaps, par2, par3, pRenderPartialTicks);

この中にアニメーション動作を書き込みます。使ったことないです… }

ポジション値とオフセット値の違い
ポジションはそのパーツの子供を巻き込んで動きます オフセットは子供に影響しません
(オフセットでない限り基本的に子供は親の動きに合わせて動くことになります)
1
1 画像
最後に編集したユーザー SugarCoffee [ 2020年4月12日(日) 12:22 ], 累計 6 回



アバター
SugarCoffee
ID: 1URPRUWZPJ
記事: 148
登録日時: 2019年10月19日(土) 14:21
いいね: 8回
いいねされた回数: 3回

tabulaを利用する

投稿記事 by SugarCoffee » 2020年4月10日(金) 22:38

minecraft 1.12.2 forge2781以上の環境でtabula(マインクラフトの中でエンティティのモデリングができるMOD)を使用してマルチモデルを作成してみます
作成環境
minecraft 1.12.2
forge2768
Tabula-1.12.2-7.1.0.jar
iChunUtil-1.12.2-7.2.2.jar
tabulaおよびblock bench用のメイドさんファイルを作成したので、ダウンロードしてご利用ください
(block benchは変換すると若干手間がかかるのでtabulaがいいかと思います)
利用条件、ライセンスについてですが
MMM666さんが作成されたlittleMaidMobの利用条件と全く同一なものを適用するものとします
商用禁止、責任は取らない

(自分はソースコード見ながらtabulaに自力で入力しただけです。MMM氏、メイドさんのテクスチャを作成された方をはじめとするLMM関係者の方々に感謝します)
利用条件へのリンク

tabulaプロジェクトファイル

block benchプロジェクトファイル


tabula導入後
マインクラフトのタイトル画面にTだけのボタンが表示されていたら無事導入されています
導入を確認したらマインクラフトをいったん終了させます

マインクラフトのゲームディレクトリのmodsのなかにtabulaフォルダーが作成されているので
その中のsavesフォルダにダウンロードしたメイドさんのtabulaプロジェクトファイルを入れます
入れ終わったら再びマインクラフトを起動させます

起動後[T]としか表示されていないボタンを押すとtabulaのモデリング画面に移動します
左上からOpen Projectを選びます(しばらくマウスをアイコンに乗せていると文字が表示されます)
Open ProjectからModel...ver1.1.tblを選択、OK
その後以下のような画面になります
tabulaForlmm.png
tabulaForlmm.png (174.1 KiB) 閲覧された回数 25075 回
あとは新しいパーツを追加、調整をしてマルチモデルを作成していきます
最初にパーツを追加後、右のパーツリストから追加パーツをドラッグアンドドロップで他のパーツの子供にすることをオススメします
最終的に親がいないパーツは反映されないっぽいです
日本語、記号、全角NG テスクチャのサイズを変更した場合はEdit ProjectからTexture width and height(テスクチャの高さと幅)を同じ値に変更します
パーツの大きさによるテスクチャの選ばれる場所UVマッピングに関してはイマイチよくわかってないです


複数のパーツで作成されるものはマウントパーツ(大きさ全て0の見えないパーツ)を親にして追加したほうが触りやすいと思います
画像では猫耳を付けています
作成が終わったら保存します(tabulaはオートセーブもあるから安心)
完成したらそのメイドさんプロジェクトファイルを使ってマルチモデルの本体作成に入ります

1
1 画像
最後に編集したユーザー SugarCoffee [ 2020年9月24日(木) 19:29 ], 累計 1 回

アバター
SugarCoffee
ID: 1URPRUWZPJ
記事: 148
登録日時: 2019年10月19日(土) 14:21
いいね: 8回
いいねされた回数: 3回

メイドさん開発環境を利用する(IntelliJ,Eclipse)

投稿記事 by SugarCoffee » 2020年4月10日(金) 23:52

IntelliJを使っていよいよメイドさんのコードを記述します
tabulaと異なり一気に文字だらけになります

なおIntelliJである必要はないです。正直エクリプスのほうがいいです
最低限JDK8のインストールは済ませる必要があります(エクリプスなら多分不要!)

ふわ@ふーの人 さんがMinecraft1.12.2用のリトルメイドマルチモデル開発環境を公開されているので利用します
https://github.com/firis-games/LittleMa ... /releases/
上から順番にそれぞれのバージョンを確認してLittleMaidModelProjectという名前が付いた最も新しいファイルをダウンロードします

ダウンロード後
https://github.com/firis-games/LittleMa ... delProject
を参照して手順通りに進めます
すべて完了したら次のステップに進みます

メイドさんをエクスポート
マインクラフトを起動しtabulaの画面に移動します。その後完成したメイドさんのプロジェクトを開きます
左上のボタンからドアと赤い矢印のエクスポートを選びます
その後Java Classを選択、package for classは適当で問題ないです

OKボタンを押すとマインクラフトのゲームディレクトリ、mods、tabulaの中にあるexportフォルダに.javaのファイルが保存されています
そのファイルを使ってメイドさんのコードを記述すると楽だと思います
結果としてメイドさんのコードが記述できれば良いのでtabulaじゃないとダメ!というわけではないです

コード記述
最初にあったbipedBody.addbox(ナントカカントカ)がようやく出てきます
エクリプスなどを使ってtabulaから出力したエクスポートメイド(.java)を開きます。以下exメイドと表記します
メイドさん開発環境にあるModelLittleMaid_SampleMaidModelを以下サンプルメイドと表記します

ここまで来たら差分を抽出してちょっと変えるだけです
ここでの差分抽出とはtabulaメイドさんプロジェクトの普通のメイドさんになくて、あなたが作成したメイドさんが持つ要素だけを取り出すということです

tabulaの普通のメイドさんもエクスポートしておくと楽ですかね…普通メイドさんファイルを上書き保存してしまった場合は再ダウンロードで解決します
最初にthis.パーツ名のthis.が邪魔なので置換機能を使って全て消します
this.があると見にくいだけであっても問題はないです
this,は必要!間違えないこと

例えば猫耳マウントパーツだけを付けるなら以下のものが必要です
public ModelRenderer nekomimiMount;

nekomimiMount = new ModelRenderer(this, 0, 0);
nekomimiMount.setRotationPoint(0.0F, -4.0F, 0.0F);
nekomimiMount.addBox(0.0F, 0.0F, 0.0F, 1, 1, 1, 0.0F);

HeadMount.addChild(nekomimiMount);

コード: 全て選択

package cat;

import net.minecraft.client.model.ModelBase;
import net.minecraft.client.model.ModelRenderer;
import net.minecraft.entity.Entity;

/**
 * ModelLittleMaidBaseVer1 - Undefined
 * Created using Tabula 7.1.0
 */
public class catModelLittleMaidBaseVer1 extends ModelBase {
    public ModelRenderer mainFrame;
    public ModelRenderer bipedTorso;
    public ModelRenderer bipedNeck;
    public ModelRenderer bipedBody;
    public ModelRenderer bipedPelvic;
    public ModelRenderer bipedHead;
    public ModelRenderer bipedRightArm;
    public ModelRenderer bipedLeftArm;
    public ModelRenderer HeadMount;
    public ModelRenderer HeadTop;
    public ModelRenderer nekomimiMount;
    public ModelRenderer nekomimiMountRight;
    public ModelRenderer nekomimiMountLeft;
    public ModelRenderer hadamimiL;
    public ModelRenderer sotomimiL1;
    public ModelRenderer sotomimiL2;
    public ModelRenderer Arms0;
    public ModelRenderer Arms1;
    public ModelRenderer bipedRightLeg;
    public ModelRenderer bipedLeftLeg;
    public ModelRenderer Skirt;

    public catModelLittleMaidBaseVer1() {
        textureWidth = 64;
        textureHeight = 32;
        bipedPelvic = new ModelRenderer(this, 0, 0);
        bipedPelvic.setRotationPoint(0.0F, 7.0F, 0.0F);
        bipedPelvic.addBox(0.0F, 0.0F, 0.0F, 1, 1, 1, 0.0F);
        nekomimiMount = new ModelRenderer(this, 0, 0);
        nekomimiMount.setRotationPoint(0.0F, -4.0F, 0.0F);
        nekomimiMount.addBox(0.0F, 0.0F, 0.0F, 1, 1, 1, 0.0F);
        bipedNeck = new ModelRenderer(this, 0, 0);
        bipedNeck.setRotationPoint(0.0F, 0.0F, 0.0F);
        bipedNeck.addBox(0.0F, 0.0F, 0.0F, 0, 0, 0, 0.0F);
        sotomimiL1 = new ModelRenderer(this, 8, 0);
        sotomimiL1.setRotationPoint(-0.4F, -1.3F, -0.1F);
        sotomimiL1.addBox(0.0F, 0.0F, 0.0F, 3, 1, 1, 0.0F);
        setRotateAngle(sotomimiL1, 0.0F, 0.0F, 0.19303341527057286F);
        nekomimiMountRight = new ModelRenderer(this, 0, 0);
        nekomimiMountRight.setRotationPoint(0.0F, 0.0F, 0.0F);
        nekomimiMountRight.addBox(0.0F, 0.0F, 0.0F, 1, 1, 1, 0.0F);
        HeadTop = new ModelRenderer(this, 0, 0);
        HeadTop.setRotationPoint(0.0F, -13.0F, 0.0F);
        HeadTop.addBox(0.0F, 0.0F, 0.0F, 0, 0, 0, 0.0F);
        hadamimiL = new ModelRenderer(this, 17, 4);
        hadamimiL.setRotationPoint(0.0F, 0.0F, 0.0F);
        hadamimiL.addBox(0.0F, 0.0F, 0.0F, 2, 2, 1, 0.0F);
        bipedLeftLeg = new ModelRenderer(this, 32, 19);
        bipedLeftLeg.mirror = true;
        bipedLeftLeg.setRotationPoint(1.0F, 0.0F, 0.0F);
        bipedLeftLeg.addBox(-1.0F, 0.0F, -2.0F, 3, 9, 4, 0.0F);
        Arms1 = new ModelRenderer(this, 0, 0);
        Arms1.setRotationPoint(1.0F, 5.0F, -1.0F);
        Arms1.addBox(0.0F, 0.0F, 0.0F, 0, 0, 0, 0.0F);
        nekomimiMountLeft = new ModelRenderer(this, 0, 0);
        nekomimiMountLeft.setRotationPoint(0.6F, 0.5F, 0.0F);
        nekomimiMountLeft.addBox(0.0F, 0.0F, 0.0F, 0, 0, 0, 0.0F);
        setRotateAngle(nekomimiMountLeft, 0.0F, 0.0F, -0.8466592201424491F);
        Arms0 = new ModelRenderer(this, 0, 0);
        Arms0.setRotationPoint(-1.0F, 5.0F, -1.0F);
        Arms0.addBox(0.0F, 0.0F, 0.0F, 0, 0, 0, 0.0F);
        Skirt = new ModelRenderer(this, 0, 16);
        Skirt.setRotationPoint(0.0F, 0.0F, 0.0F);
        Skirt.addBox(-4.0F, -2.0F, -4.0F, 8, 8, 8, 0.0F);
        sotomimiL2 = new ModelRenderer(this, 8, 0);
        sotomimiL2.setRotationPoint(1.5F, -1.0F, 0.1F);
        sotomimiL2.addBox(0.0F, 0.0F, 0.0F, 1, 3, 1, 0.0F);
        HeadMount = new ModelRenderer(this, 0, 0);
        HeadMount.setRotationPoint(0.0F, -4.0F, 0.0F);
        HeadMount.addBox(0.0F, 0.0F, 0.0F, 0, 0, 0, 0.0F);
        bipedHead = new ModelRenderer(this, 0, 0);
        bipedHead.setRotationPoint(0.0F, 0.0F, 0.0F);
        bipedHead.addBox(-4.0F, -8.0F, -4.0F, 8, 8, 8, 0.0F);
        bipedRightLeg = new ModelRenderer(this, 32, 19);
        bipedRightLeg.setRotationPoint(-1.0F, 0.0F, 0.0F);
        bipedRightLeg.addBox(-2.0F, 0.0F, -2.0F, 3, 9, 4, 0.0F);
        bipedRightArm = new ModelRenderer(this, 48, 0);
        bipedRightArm.setRotationPoint(-3.0F, 1.5F, 0.0F);
        bipedRightArm.addBox(-2.0F, -1.0F, -1.0F, 2, 8, 2, 0.0F);
        bipedLeftArm = new ModelRenderer(this, 56, 0);
        bipedLeftArm.setRotationPoint(3.0F, 1.5F, 0.0F);
        bipedLeftArm.addBox(0.0F, -1.0F, -1.0F, 2, 8, 2, 0.0F);
        bipedTorso = new ModelRenderer(this, 0, 0);
        bipedTorso.setRotationPoint(0.0F, 0.0F, 0.0F);
        bipedTorso.addBox(0.0F, 0.0F, 0.0F, 0, 0, 0, 0.0F);
        mainFrame = new ModelRenderer(this, 0, 0);
        mainFrame.setRotationPoint(0.0F, 0.0F, 0.0F);
        mainFrame.addBox(0.0F, 0.0F, 0.0F, 0, 0, 0, 0.0F);
        bipedBody = new ModelRenderer(this, 32, 8);
        bipedBody.setRotationPoint(0.0F, 0.0F, 0.0F);
        bipedBody.addBox(-3.0F, 0.0F, -2.0F, 6, 7, 4, 0.0F);
        bipedTorso.addChild(bipedPelvic);
        HeadMount.addChild(nekomimiMount);
        bipedTorso.addChild(bipedNeck);
        nekomimiMountLeft.addChild(sotomimiL1);
        nekomimiMount.addChild(nekomimiMountRight);
        bipedHead.addChild(HeadTop);
        nekomimiMountLeft.addChild(hadamimiL);
        bipedPelvic.addChild(bipedLeftLeg);
        bipedLeftArm.addChild(Arms1);
        nekomimiMount.addChild(nekomimiMountLeft);
        bipedRightArm.addChild(Arms0);
        bipedPelvic.addChild(Skirt);
        nekomimiMountLeft.addChild(sotomimiL2);
        bipedHead.addChild(HeadMount);
        bipedNeck.addChild(bipedHead);
        bipedPelvic.addChild(bipedRightLeg);
        bipedNeck.addChild(bipedRightArm);
        bipedNeck.addChild(bipedLeftArm);
        mainFrame.addChild(bipedTorso);
        bipedTorso.addChild(bipedBody);
    }

    @Override
    public void render(Entity entity, float f, float f1, float f2, float f3, float f4, float f5) { 
        mainFrame.render(f5);
    }

    /**
     * This is a helper function from Tabula to set the rotation of model parts
     */
    public void setRotateAngle(ModelRenderer modelRenderer, float x, float y, float z) {
        modelRenderer.rotateAngleX = x;
        modelRenderer.rotateAngleY = y;
        modelRenderer.rotateAngleZ = z;
    }
}

とりあえず追加したパーツが出てこない行を全て削除します
下の方の.addChildは複雑で削除ミスしやすいので気を付けてください

独自のパーツのみを抽出したもの

コード: 全て選択


    public ModelRenderer nekomimiMount;
    public ModelRenderer nekomimiMountRight;
    public ModelRenderer nekomimiMountLeft;
    public ModelRenderer hadamimiL;
    public ModelRenderer sotomimiL1;
    public ModelRenderer sotomimiL2;


        nekomimiMount = new ModelRenderer(this, 0, 0);
        nekomimiMount.setRotationPoint(0.0F, -4.0F, 0.0F);
        nekomimiMount.addBox(0.0F, 0.0F, 0.0F, 1, 1, 1, 0.0F);
 
        sotomimiL1 = new ModelRenderer(this, 8, 0);
        sotomimiL1.setRotationPoint(-0.4F, -1.3F, -0.1F);
        sotomimiL1.addBox(0.0F, 0.0F, 0.0F, 3, 1, 1, 0.0F);
        setRotateAngle(sotomimiL1, 0.0F, 0.0F, 0.19303341527057286F);
        
        nekomimiMountRight = new ModelRenderer(this, 0, 0);
        nekomimiMountRight.setRotationPoint(0.0F, 0.0F, 0.0F);
        nekomimiMountRight.addBox(0.0F, 0.0F, 0.0F, 1, 1, 1, 0.0F);

        hadamimiL = new ModelRenderer(this, 17, 4);
        hadamimiL.setRotationPoint(0.0F, 0.0F, 0.0F);
        hadamimiL.addBox(0.0F, 0.0F, 0.0F, 2, 2, 1, 0.0F);

        nekomimiMountLeft = new ModelRenderer(this, 0, 0);
        nekomimiMountLeft.setRotationPoint(0.6F, 0.5F, 0.0F);
        nekomimiMountLeft.addBox(0.0F, 0.0F, 0.0F, 0, 0, 0, 0.0F);
        setRotateAngle(nekomimiMountLeft, 0.0F, 0.0F, -0.8466592201424491F);

        sotomimiL2 = new ModelRenderer(this, 8, 0);
        sotomimiL2.setRotationPoint(1.5F, -1.0F, 0.1F);
        sotomimiL2.addBox(0.0F, 0.0F, 0.0F, 1, 3, 1, 0.0F);
        
        HeadMount.addChild(nekomimiMount);
        nekomimiMountLeft.addChild(sotomimiL1);
        nekomimiMount.addChild(nekomimiMountRight);
        nekomimiMountLeft.addChild(hadamimiL);
        nekomimiMount.addChild(nekomimiMountLeft);
        nekomimiMountLeft.addChild(sotomimiL2);
削除が終わったらpublic ModelRendererにあるパーツ行とaddChildのパーツ行を数えます
一致しなければどこかを間違って削除しているかと思います

差分を移動させる
削除完了したらサンプルメイド(開発環境側)にexメイド(tabulaエクスポート)のコードを移していきます
public ModelRenderer パーツ名;はすべて
public class ModelLittleMaid_SampleMaidModel extends ModelLittleMaid_SR2 {
この中に入れます
public ModelRenderer nekomimiMount;

public ModelLittleMaid_SampleMaidModel() {
super();
}
他はすべて
@Override
public void initModel(float psize, float pyoffset) {
super.initModel(psize, pyoffset);
この中に入れます
nekomimiMount = new ModelRenderer(this, 0, 0);
nekomimiMount.setRotationPoint(0.0F, -4.0F, 0.0F);
nekomimiMount.addBox(0.0F, 0.0F, 0.0F, 1, 1, 1, 0.0F);

HeadMount.addChild(nekomimiMount);


}
コードの書き換え
.addbox(.... ,0.0F);の最後の0.0Fはパーツ拡大率を表すようなので,0.0fを削除します
setRotationPointはそのまま

角度変更した場合にあるsetRotateAngle(sotomimiL1, 0.0F, 0.0F, 0.19303341527057286F);などは
sotomimiL1.setRotateAngle(0.0F, 0.0F, 0.19303341527057286F);に入れ替えます

ここまできたらコード部分も完成です

ビルド
LMMModelProjectの説明の一番最後にある5.メイドモデルをzip化にそって行います
なお名前変更に関してはサンプルメイドのサンプルマルチモデル定義のコメントに説明があります
// コメント
/*
これとかがコメントです
*/
名前変更する場合はエクリプス等のリファクタリング(名前変更)を使ってください

かなり急ぎ足で作成したので変な箇所があるかもしれません
意見は是非。
このトピックだけではなくマルチモデル作成のサイトはあるので、他の情報も検索してみてください
ただし、利用規約などは順守してください

メモ書き: 今まで気がついていませんでしたがinitModel辺りは開発環境で自動生成したメソッドでした。
配布されているモデルプロジェクトではメソッドが存在しないため生成か追加する必要があります。

不明確な部分なので金曜日の夜に修正します
0
最後に編集したユーザー SugarCoffee [ 2021年10月01日(金) 22:14 ], 累計 2 回

アバター
SugarCoffee
ID: 2KOMLSQD42
記事: 148
登録日時: 2019年10月19日(土) 14:21
いいね: 8回
いいねされた回数: 3回

Re: 1.12.2little maid mob マルチモデルの作成

投稿記事 by SugarCoffee » 2021年5月07日(金) 19:44

テクスチャのサイズ変更する際の注意点

1.12.2以降でデフォルトの画像サイズを変更したい場合は
2つめのコンストラクタ(コンストラクタとはpublic class XXXと同じ名前で括弧がついたメソッドのことです)

コード: 全て選択

public class ModelLittleMaid_SampleMaidModel extends ModelLittleMaid_SR2 {

	public ModelLittleMaid_SampleMaidModel() {
		super();
	}
	public ModelLittleMaid_SampleMaidModel(float psize) {
		super(psize);
	}
	public ModelLittleMaid_SampleMaidModel(float psize, float pyoffset, int pTextureWidth, int pTextureHeight) {
		super(psize, pyoffset, pTextureWidth, pTextureHeight);
	}
}
上を

コード: 全て選択

public class ModelLittleMaid_SampleMaidModel extends ModelLittleMaid_SR2 {

	public ModelLittleMaid_SampleMaidModel() {
		super();
	}
	public ModelLittleMaid_SampleMaidModel(float psize) {
		super(psize, 0f, 横ピクセル数, 縦ピクセル数);
	}
	public ModelLittleMaid_SampleMaidModel(float psize, float pyoffset, int pTextureWidth, int pTextureHeight) {
		super(psize, pyoffset, pTextureWidth, pTextureHeight);
	}
}
に置き換えてください。


その後、initModel(){
// この中に
textureWidth = 横ピクセル数;
textureHeight = 縦ピクセル数;
}
も追加してください。

textureWidth = なんとか2つはできるだけ{に近い先頭に置くこと推奨です。
※ただしinitModel(){}の中にあるsuper();より必ず後に記述すること

親クラスのinitModel()を意図的に呼びたくない場合とかは問題ありません。
0

アバター
SugarCoffee
ID: 47UOIAO2JJ
記事: 148
登録日時: 2019年10月19日(土) 14:21
いいね: 8回
いいねされた回数: 3回

1.8.x little Maid Mob マルチモデルを1.12.2環境で無理やりビルドする

投稿記事 by SugarCoffee » 2021年7月11日(日) 11:07

先日、Minecraft 1.8.9のmdkとIntelliJを使って1.8~1.17対応のリトルメイドマルチモデルを出力しようとしたところ、gradlew setupDecompWorkspaceのdecompileMCで必ずOut Of Momeryが発生し、環境構築ができない状態になってしまいました。
(多分おま環だとは思いますが)

IntelliJでMinecraft 1.8.x対応のメイドさんを出力できないと困るので、色々試したところforge1.12.2 2768下で強引にビルドできるようなので、備忘録もかねて記述します。

※対象のリトルメイドがLMMfirisPatchの処理に依存しており、かつMinecraftに依存していない必要があります。
LMMfirisPatchとMinecraft共に依存していなければ、LMMfirisPatchの機能を用いて過去バージョンに対応した.classを出力することができるので、強引にビルドする必要はありません。
-> つまり、LMMFPでLMMFPに依存したマルチモデルを作成しており、かつほかのバージョンに対応させたいが環境構築ができないといったレアケースを対象としています。

※IntelliJのインストールやJDKのインストール、環境変数の設定等は済んでいるものとします。
※また、LMMFPを要求するリトルメイドマルチモデルのプロジェクトやソースコードが手元にあることが前提です。
  1. Minecraft Forgeから1.12.2 2768のmdkをダウンロード
  2. ダウンロードしたmdkを任意の場所に解凍(以下解凍したフォルダをrootDirと表記)
  3. rootDir/gradle/wrapper/gradle-wrapper.propertiesをメモ帳などで開く

    コード: 全て選択

    distributionUrl=https\://services.gradle.org/distributions/gradle-何とか-bin.zipを
    distributionUrl=https\://services.gradle.org/distributions/gradle-3.0-bin.zip
    に変更し、上書き保存
    
  4. ふわふーさんが公開しているLittleMaidModelProject/build.gradleを開き、Ctrl + A -> Ctrl + Cで全選択し、クリップボードにコピーします。
  5. rootDir/build.gradleをメモ帳などで開き、Ctrl +A -> Deleteで -> Ctrl + V、で中身を全て消し、クリップボードの中身を貼り付け、LittleMaidModelProject/build.gradleと同一なファイルにし、上書き保存
  6. rootDir/srcを削除、LMMFPに依存しているリトルメイドのsrcフォルダをコピーしrootDir/に貼り付け、入れ替えます
  7. rootDir/下にmodsフォルダを作成
  8. rootDir/modsに旧バージョンのLMMや前提modを配置

    コード: 全て選択

    rootDir
    ├─mods
    │      EBLib-EL3B13-1.8.x.jar
    │      LittleMaidMobNX-NX5B84-1.8.x.jar
    
  9. IntelliJを起動し、OpenでrootDirを開く(プロジェクトとして開けそうなフォルダは-マークがついています)
  10. 開こうとすると何かを聞いてくるので、水色のTrust 何たらみたいな選択肢を選ぶ(多分Gradleのプロジェクトとして開くのか、単にフォルダとして開くのかを聞いているのだと思います)
  11. IntelliJがGradle関連の作業を始めるので、終わるまで放置(下の方に作業中のバー見たいなものが表示されているはずです)
  12. 終了後、右にあるGradleボタン(象アイコン)をクリックし、Gradleウィンドウを出す
  13. >象マークrootDirの左にある折り畳みボタン(>)を押し展開、Tasksを展開、build, forgegradleを展開する
  14. buildにあるcleanをダブルクリックで実行する(以下「ダブルクリックし、実行し終了するまで待機」を「実行完了」と表記)
  15. forgegradleのcleanCache -> setupDecompWorkspace(数分程度とかなり時間がかかる) -> setupDevWorkspace -> genIntelliJRunsを順番通りに実行完了させる。
  16. IntelliJを一回閉じ、再起動する
  17. 「rootDir/src/...省略」にあるリトルメイドマルチモデル.javaを開く
  18. 上の方にあるimport ...をすべて削除
  19. エラーが発生するので、発生場所にカーソルを合わせ、選択肢のImport classを押す
  20. クラスによっては、forgeの方かリトルメイドの方なのか聞いてくるので、リトルメイドの方を選択する
  21. 赤字エラーが全て消えたことを確認する
  22. IntelliJでrootDir/build.gradleを開く
  23. コードウィンドウ内に「象マーク+更新アイコン」みたいなボタンが表示されている場合、クリックし実行完了させる。
  24. ふわふーさんが公開しているLittleMaidReengaged Firis's Patchマルチモデル作成環境構築手順の5.メイドモデルをzip化 を参考に、zipファイル名を適切なものへ変更する
  25. 下の方にあるtask zipBuild(type: Zip, dependsOn: jar) {の行の左に緑三角マークの実行ボタンがあるので、クリックし、実行する
  26. rootDir/modsにあるLMMに依存したマルチモデルzipがrootDir/distributionsに出力されます。
上記の手順でforge 2768環境下で強引にlittleMaidMobNX(この例のLMMNXではソースなどがあるdevjarではなく、普通に配布されているコンパイル済jarを使用しています)等に依存したリトルメイドマルチモデルを作成することができます。

当然ですが、rootDir/modsにforge 2768から見て不正なバージョンのmodsが含まれるため、runClient等は動きません。

コンパイルに失敗しそうな気もしますが、マルチモデルがrootDir/modsのjarだけに依存しており、かつrootDir/modsのコードは確認しないことで、IntelliJがマルチモデル <->LMM <-> forge間の依存関係をチェックせず、マルチモデルとLMM間は適切と判断しているのかわかりませんが、強引にビルドすることができます。

出力したマルチモデルjarはforge 1.12.2 2768 + 1.12.2以外のforgeに対応したLMM環境下でビルドされることになるので、何かしらの不具合があるかもしれませんが、取りあえずLMMFPからほかのバージョンに移植したい手順としては有効そうなので記述しました。
(一応、出力済jarを逆コンパイルしてみましたが、リトルメイドのマルチモデルはMETA-INFなどは存在しないので特に問題はなさそうなコードになっています。)

追記: JavaのProcessBuilderからのzipBuildやcmdからのgradlew zipBuildを試してみましたが、Java compileで失敗するので、
やはりIntelliJ側で何かしら対応をしてくれている感じがします。
0

Keokeo
ID: 2FVR0FJPLY
記事: 2
登録日時: 2023年5月03日(水) 12:19
Minecraft ID: Shinography

Re: 1.12.2little maid mob マルチモデルの作成

投稿記事 by Keokeo » 2023年7月22日(土) 15:34

initModelの部分のコードを教えていただけると大変助かります。
0

返信する