お久しぶりです。デルメタです。
研究が再開して、mod開発に裂ける時間が少なくなってきました。
今回はKRFCmod第2弾「メダルと2重モデルと方針変更」と題した「カブト&オーズ&エグゼイド編」、最後は仮面ライダーカブトの紹介です。
本来は第2弾が終わったこの段階で動画投稿もしておきたかったのですが、修論執筆などやることが多い時期に入ってしまったため先にブログの方を出しました。
動画はちょっとずつ進めて年度内の投稿を目指します。
また、社会人生活の中でmod開発と動画制作を両立させるのは困難そうなので、動画投稿は#2で一旦休止とし、今後はブログ中心の更新となる見込みです。
-
変身&キャストオフ
ベルトを装着するとカブトゼクターが飛来!
装備してマスクドフォームに変身!
カブトゼクターは家にあったDX版(当時品)を参考にモデリングしています。
我ながら結構イイ出来かと。
そして例によってマスクドアーマーをキャストオフ(手動)するとライダーフォームに変身!
…
さらにガタックのライダーベルトでも変身可能!
『ジオウ』にて第1話から13年越しに加賀美がカブトに変身したシーンも再現できます。 手抜きではない
…
カブトについては以上です。
マスクドアーマーという2重モデルつながりだけで選んだので、アイデンティティーたるクロックアップもキャストオフもロクに実装できてない…
そもそも平成一期中盤勢には本modの根幹である「フォームチェンジ」があまりないので、モデル制作が大変な割に紹介できるネタがない…
ということで今回は具体的なコードも交えながら、本modの機能を改めて紹介していくことにします。
誰かの参考になれば幸いです。
-
変身プロセスの再現
まずは変身。装備中に呼ばれるonArmorTick()で変数を変化させて、Model側でその値に応じて表示を変えています。
他にも、変身ベルトを装備していない時にはモデルを表示させなかったり、カブトではマスクドフォーム時に角を表示させない等の制御をしています。
コードはそれぞれこんな感じ。
・ItemArmor側
public static int MaskedIn=0;
(中略)
@Override
public void onArmorTick(World world, EntityPlayer player, ItemStack item)
{
if(player.inventory.armorItemInSlot(1) != null)
{
if(player.inventory.armorItemInSlot(1).getItem()==<特定の防具>)
{
MaskedIn=1;
}
else{MaskedIn=0; }//<特定の防具>を装備していない
}
else{MaskedIn=0;}//スロットがnull
}
・Model側
public ModelRenderer AntenaBase;
(中略)@Override
public void render(Entity entity, float f, float f1, float f2, float f3, float f4, float f5)
{if(ArmorKabutoRider.MaskedIn==1) //ArmorKabutoRider=ItemArmor側
{
this. AntenaBase.showModel=false;
if (entity.isSneaking())
{ //ブロックの倍率(特にZ軸)を
this.ZectorLeg1.showModel=false; //変えるとスニーク中の表示が
} //おかしくなるので非表示に
else
{
this.ZectorLeg1.showModel=true;
}
} else {
if (entity.isSneaking()){this.ZectorOpen.showModel=false;}
else
{
this.ZectorOpen.showModel=true;
this.ZectorHornOpen1.showModel=true;
}
}
このコードではゲーム内にあるモデル全ての表示を制御しているため、防具立てや他のプレイヤーが装備しているものまで表示が変更されてしまいます。
カブトで言うとマスクドアーマー装備状態(マスクドフォーム)では頭部の角やベルトの展開したゼクターを非表示にしているため、プレイヤーがマスクドフォームの状態だと防具立てのカブトも角やゼクターが無くなってしまいます。
-
防具の入れ替え装備/追加装備・武器転送
追加装備は防具アイテムのonRightClickで同時にスロットに入れています。
変身ベルトが無い場合は使っても装備されないようにもしています(インベントリからはできますが)。
武器転送…もとい装備時に武器が手元に来るのは(理屈はイマイチ分かっていませんが)returnで別のItemStackを返すとその使用後にそのアイテムが手元に来るようです。
複数個スタックできるアイテムでコレをやると上書きされてしまうので、本Modの変身アイテムは軒並みスタックできないようになっています。
ItemArmor側のコードはこんな感じ。
@Override//使用時効果 装備+アイテム追加
public ActionResult<ItemStack> onItemRightClick(World worldIn, EntityPlayer playerIn, EnumHand handIn)
{
ItemStack itemstack = playerIn.getHeldItem(handIn);//今持ってるアイテム=このアイテム
EntityEquipmentSlot entityequipmentslot = EntityLiving.getSlotForItemStack(itemstack);//防具スロット参照
ItemStack itemstack1 = playerIn.getItemStackFromSlot(entityequipmentslot);//参照スロットに装備中のアイテム
ItemStack itemstack2 = new ItemStack(<追加アイテム>, 1);//追加アイテム
ItemStack itemstack3 = new ItemStack(<追加装備>, 1);//追加装備とスロット
EntityEquipmentSlot entityequipmentslot2 = EntityLiving.getSlotForItemStack(itemstack3);
if(playerIn.inventory.armorItemInSlot(1) != null)
{if(playerIn.inventory.armorItemInSlot(1).getItem()==<特定の装備>)//変身ベルトの判別
{
if (itemstack1.isEmpty())//スロットが空いてる場合
{
playerIn.setItemStackToSlot(entityequipmentslot, itemstack.copy());//手持ちアイテムをスロットへ
itemstack.setCount(0);//手持ちアイテムを消去
playerIn.setItemStackToSlot(entityequipmentslot2, itemstack3.copy());//追加装備をスロットへ
return new ActionResult<ItemStack>(EnumActionResult.SUCCESS, itemstack2);//追加アイテムを持つ
} else//空いてない場合・上書き装備 {
playerIn.setItemStackToSlot(entityequipmentslot, itemstack.copy());//手持ちアイテムをスロットへ
itemstack.setCount(0);//手持ちアイテムを消去
playerIn.setItemStackToSlot(entityequipmentslot2, itemstack3.copy());//追加装備をスロットへ
return new ActionResult<ItemStack>(EnumActionResult.SUCCESS, itemstack2);//追加アイテムを持つ
}
} else { return new ActionResult<ItemStack>(EnumActionResult.FAIL, itemstack); }
} else { return new ActionResult<ItemStack>(EnumActionResult.FAIL, itemstack); }
}
3/3追記:
ActionResultでitemstack1を使って返すことで、入れ替え装備とすることができました。
それに伴い、ver.0.26以降は追加アイテムをオフハンドに持たせる仕様としています。
-
おわりに
結局githubはうまく更新できなかった(mainが更新できない)ため、こんな形でのコード公開(?)をしてみました。
分からないことがありましたらコメントまでどうぞ。
3月までは大がかりなmod製作は一旦中断し、実家にある諸々を参考にできるうちにモデリングしておこうかと思います。
そして第3弾は社会人になってから初の更新ということで、試しに新規モデル1体をノルマとしてみます。
社会人の忙しさが問われる…!
それでは。ついて来れるなら…