furrer さんが書きました:MOD制作初心者です。
Itemクラスを継承させてOverrideで即時回復アイテムを作ろうとしています。
とりあえず体力をMAXにさせるアイテム自体はできたのですが、救急箱という位置付けにしたいので以下の項目をクリアしたいです。
1,バニラでの食料の”ムシャムシャ”やポーションの”ズズズ”の時間のように、アイテム使用までに数秒かかるようにしたい
2,アイテム使用中に自前のSE素材を鳴らしたい
3,体力MAX時は使用できない仕様にしたい
4,アイテム使用中は移動ができないor移動速度がぐっと落ちるようにしたい
現段階のコードはこんな感じです。
@Override
public ActionResult<ItemStack> onItemRightClick(World world, EntityPlayer player, EnumHand hand){
ItemStack stack = player.getHeldItem(hand);
player.heal(20.0F);
stack.shrink(1);
return new ActionResult(EnumActionResult.SUCCESS, stack);
}
}
ここからどうテコいれしていけばいいでしょうか、1つの項目が解決するだけでもすごく有り難いのでご教授願います
バニラの弓のように、アイテム使用時に”タメ”が必要なものを作れば条件を満たせるかと思います
タメ使用系のアイテムは、右クリック使用がタメ動作に変化し、右クリックを解放した瞬間にタメ終了処理が呼ばれます
これを使えば良いかと
1. 上記の場合、getMaxItemUseDurationメソッドで(Tick単位での)時間調整ができます
2. 独自SE追加は別途、これは私ではわからないので割愛
3. onItemRightClickメソッドで体力満タン時にFAILを返せば使用不可判定になる
4. バニラのタメ動作にはデフォルトで移動速度低下がついているので、それですむんじゃないかと
===つくりかた===
まずonItemRightClickではアイテム効果はまだ追加せず、プレイヤーをアイテム使用状態にするsetActiveHandだけ呼ぶ
体力満タンを条件にしたければここの条件文に条件(boolean)を追加
- コード: 全て選択
@Override
public ActionResult<ItemStack> onItemRightClick(World world, EntityPlayer player, EnumHand hand) {
if (条件文) {
player.setActiveHand(hand);
return new ActionResult(EnumActionResult.SUCCESS, player.getHeldItem(hand));
} else {
return new ActionResult(EnumActionResult.FAIL, player.getHeldItem(hand));
}
}
次にItemの使用タイプをBOW(タメ動作)にし、getMaxItemUseDurationで最大使用時間を設定
- コード: 全て選択
@Override
public int getMaxItemUseDuration(ItemStack stack) {
return 72000;
}
@Override
public EnumAction getItemUseAction(ItemStack stack) {
return EnumAction.BOW;
}
最後に、タメ終了後に発揮する効果を設定
timeLeftにタメの残り時間が渡ってくるので、タメが足りない(この値が大きい)時は失敗するようにすることもできる
- コード: 全て選択
@Override
public void onPlayerStoppedUsing(ItemStack stack, World world, EntityLivingBase living, int timeLeft) {
}
大体こんな流れでできると思います
ブロックをフォーカスして使用すると別の右クリックメソッドが呼ばれてしまうので、あらかじめそちらの処理を潰しておくと安全かと
- コード: 全て選択
@Override
public EnumActionResult onItemUse(EntityPlayer player, World world, BlockPos pos, EnumHand hand, EnumFacing facing,
float hitX, float hitY, float hitZ) {
return EnumActionResult.FAIL;
}