【総合】トピック立てるまでもない質問【Mod制作】

Modding・サーバPlugin制作・ツール制作など、開発関連の質問があればこちらにお願い致します。
フォーラムルール
質問関連フォーラムで質問する時は、必ず次のトピックを一読/厳守お願い致します。
viewtopic.php?f=5&t=999
  • (PostNo.316213)

Re: 【総合】トピック立てるまでもない質問【Mod制作】

投稿記事by ho9tocraft » 2018年4月30日(月) 15:59

minecraft1.9以降(使用開発環境は1.12.2)で、剣を振る速度を変えたいです。何をOverrideすればいいですか?
最後に編集したユーザー ho9tocraft [ 2018年5月01日(火) 14:07 ], 累計 1 回
アバター
ho9tocraft
ID:216d90b4
石掘り
 
記事: 99
登録日時: 2017年8月24日(木) 17:01

  • (PostNo.316230)

Re: 【総合】トピック立てるまでもない質問【Mod制作】

投稿記事by Kashiwagi_K » 2018年4月30日(月) 22:18

Kashiwagi_K さんが書きました: 追加したmobにインベントリを追加して、それをGUIに表示するところまではエラーが起こることもなく平和だったのですが、GUIテクスチャがなぜか縦横に伸ばされてしまって綺麗に表示されません。


 自己解決しました。該当記事に添付されているテクスチャを見てもわかりますが、キャンバスサイズが256×256でないのがダメだったようです。
 テクスチャ作成時の参考にデスクトップにいくつか置いたバニラのGUIテクスチャを見て、「やけに画像サイズが均一なような……?」と思い、試しにキャンバスサイズを揃えてみたらビンゴでした。バニラのテクスチャがやけにスカスカだったのには意味が無いわけではなかったようです。
アバター
Kashiwagi_K
ID:978e0246
水から上がったとこ
 
記事: 7
登録日時: 2018年4月13日(金) 00:21

  • (PostNo.316277)

Re: 【総合】トピック立てるまでもない質問【Mod制作】

投稿記事by ho9tocraft » 2018年5月02日(水) 14:28

tasks.withType(Jar) {compileJava.options.encoding = 'UTF-8'}をぶち込む場所が分からないです。バージョン1.12.2、forgeは14.23.3.2673です。
アバター
ho9tocraft
ID:216d90b4
石掘り
 
記事: 99
登録日時: 2017年8月24日(木) 17:01

  • (PostNo.316306)

Re: 【総合】トピック立てるまでもない質問【Mod制作】

投稿記事by spuash918 » 2018年5月03日(木) 14:23

ho9tocraft さんが書きました:tasks.withType(Jar) {compileJava.options.encoding = 'UTF-8'}をぶち込む場所が分からないです。バージョン1.12.2、forgeは14.23.3.2673です。

build.gradle内の適切な場所へ追記してください
プログラム無しでアイテムやブロックを追加できるMOD公開中です!
無機能ブロックから剣、斧に加えツールマテリアルにも対応!
詳しくはMOD配布ページまで!
Twitterやってます。→https://twitter.com/pokora_youtube
よろしければYoutubeもお願いします。
spuash918
ID:a74e6760
鉄鉱掘り
 
記事: 298
登録日時: 2014年11月03日(月) 11:17
お住まい: 東海のどこか

  • (PostNo.316626)

Re: 【総合】トピック立てるまでもない質問【Mod制作】

投稿記事by furrer » 2018年5月15日(火) 22:19

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つの項目が解決するだけでもすごく有り難いのでご教授願います
furrer
ID:7cebef73
 

  • (PostNo.316630)

Re: 【総合】トピック立てるまでもない質問【Mod制作】

投稿記事by ノッホソ » 2018年5月16日(水) 00:32

MOD制作初心者です。
他人が作った、他MODのクラスを継承して新しいアイテムを追加したいのですが、そういったことって可能でしょうか?
もし可能でしたら、継承の手順等ご教示いただけますと幸いです。
ノッホソ
ID:da7a8ff0
 

  • (PostNo.316641)

Re: 【総合】トピック立てるまでもない質問【Mod制作】

投稿記事by defeatedcrow » 2018年5月16日(水) 20:19

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;
   }
最後に編集したユーザー defeatedcrow [ 2018年5月16日(水) 20:27 ], 累計 1 回
カラスの敗残兵です。AppleMilkTea他、少々のMODを作成しています。
トピック: AppleMilkTea(~1.7.10) / HeatAndClimate(1.10.2)
作者Wiki / github / twitter
アバター
defeatedcrow
ID:0790d4e9
ラピスラズリ収集家
 
記事: 1049
登録日時: 2014年1月08日(水) 13:48
お住まい: 北関東

  • (PostNo.316642)

Re: 【総合】トピック立てるまでもない質問【Mod制作】

投稿記事by defeatedcrow » 2018年5月16日(水) 20:25

ノッホソ さんが書きました:MOD制作初心者です。
他人が作った、他MODのクラスを継承して新しいアイテムを追加したいのですが、そういったことって可能でしょうか?
もし可能でしたら、継承の手順等ご教示いただけますと幸いです。


対象のModを開発用ライブラリに組み込めば継承やメソッド参照で利用できるようになります
(バニラクラスのようにextendsもできる)
継承の手順自体はJava製であればForgeやバニラのクラスと変わらないとは思いますが、Modによって勝手が変わるので作者が提示している使用方法、導入方法に従うべきかと
もちろんライセンスにもよります
(継承に本体ではなくAPIを使うことを推奨しているModもあるし、使用に条件がつく場合もあるので)
カラスの敗残兵です。AppleMilkTea他、少々のMODを作成しています。
トピック: AppleMilkTea(~1.7.10) / HeatAndClimate(1.10.2)
作者Wiki / github / twitter
アバター
defeatedcrow
ID:0790d4e9
ラピスラズリ収集家
 
記事: 1049
登録日時: 2014年1月08日(水) 13:48
お住まい: 北関東

  • (PostNo.316649)

Re: 【総合】トピック立てるまでもない質問【Mod制作】

投稿記事by ho9tocraft » 2018年5月17日(木) 09:00

ho9tocraft さんが書きました:minecraft1.9以降(使用開発環境は1.12.2)で、剣を振る速度を変えたいです。何をOverrideすればいいですか?

要するに、ver.1.7.10位の速度にしたいです。怪しいところは把握しているのですが、そこからなかなか進展しない為にここに乗せました(これだけなので、「わざわざトピック立てるまでもない」と評価しました)。
アバター
ho9tocraft
ID:216d90b4
石掘り
 
記事: 99
登録日時: 2017年8月24日(木) 17:01

  • (PostNo.316652)

Re: 【総合】トピック立てるまでもない質問【Mod制作】

投稿記事by Furrer » 2018年5月17日(木) 13:52

3つから5つほど前の投稿で即時回復アイテムの作り方について質問した者です。
回答してくださった方の解説が非常にわかりやすく、無事右クリック長押し100tick後に自動で回復効果の発揮されるアイテムができました。
結果的にコードはこのようになったのですが…

@Override
public int getMaxItemUseDuration(ItemStack stack) {
return 100;//Itemが使用中になる時間を設定(tick??)
}

@Override
public EnumAction getItemUseAction(ItemStack stack) {
return EnumAction.BLOCK;//Item使用中のアクションを設定(BOW→弓/BLOCK→盾などいろいろある)
}
@Override
public ItemStack onItemUseFinish(ItemStack stack, World worldIn,
EntityLivingBase living)
//onItemUseFinishメソッドでアイテムが使い終わった時に呼ばれる効果を追加できる。
{
living.heal(15.0F);
stack.shrink(1);
return ItemStack.EMPTY;
}
@Override
public EnumActionResult onItemUse(EntityPlayer player, World world, BlockPos pos, EnumHand hand, EnumFacing facing,
float hitX, float hitY, float hitZ) {
return EnumActionResult.FAIL;
}

@Override
public ActionResult<ItemStack> onItemRightClick(World world, EntityPlayer player, EnumHand hand){
boolean isInjured;
float health = player.getHealth();
isInjured = (health < 20);

if (isInjured) {
player.setActiveHand(hand);
return new ActionResult(EnumActionResult.SUCCESS, player.getHeldItem(hand));
} else {
return new ActionResult(EnumActionResult.FAIL, player.getHeldItem(hand));
//右クリックされたときにアイテムが使用中という状態になるだけのプログロム、アイテムの使用終了時に効果が呼ばれる仕様なのでここにはアイテム効果は書かない。
}
}

このようにするとSEがないこともあいまってか、効果発揮までの無音の待機時間に"本当に操作これであってる??"というような不安な間ができてしまったように感じられます。
そこでアクションバー(夜になるまで眠れませんが出る欄)に効果発動までのカウントダウンを表示させられるようにしたいのですが、
Googleやあまたのサイト(海外サイトを含む)を見ても初心者の自分にはちんぷんかんぷんで、どのクラス、メソッドを使えばいいのかわかりませんでした。
長文になってしまい申し訳ありません、わかる方がいましたら是非ご教授ください。

イメージとしてはRPGなどのアイテムのクールタイム、FPSのリロード時のカウントダウンのような感じです。
Furrer
ID:7cebef73
 

  • (PostNo.316678)

Re: 【総合】トピック立てるまでもない質問【Mod制作】

投稿記事by defeatedcrow » 2018年5月18日(金) 00:27

Furrer さんが書きました:3つから5つほど前の投稿で即時回復アイテムの作り方について質問した者です。
回答してくださった方の解説が非常にわかりやすく、無事右クリック長押し100tick後に自動で回復効果の発揮されるアイテムができました。
結果的にコードはこのようになったのですが…

@Override
public int getMaxItemUseDuration(ItemStack stack) {
return 100;//Itemが使用中になる時間を設定(tick??)
}

@Override
public EnumAction getItemUseAction(ItemStack stack) {
return EnumAction.BLOCK;//Item使用中のアクションを設定(BOW→弓/BLOCK→盾などいろいろある)
}
@Override
public ItemStack onItemUseFinish(ItemStack stack, World worldIn,
EntityLivingBase living)
//onItemUseFinishメソッドでアイテムが使い終わった時に呼ばれる効果を追加できる。
{
living.heal(15.0F);
stack.shrink(1);
return ItemStack.EMPTY;
}
@Override
public EnumActionResult onItemUse(EntityPlayer player, World world, BlockPos pos, EnumHand hand, EnumFacing facing,
float hitX, float hitY, float hitZ) {
return EnumActionResult.FAIL;
}

@Override
public ActionResult<ItemStack> onItemRightClick(World world, EntityPlayer player, EnumHand hand){
boolean isInjured;
float health = player.getHealth();
isInjured = (health < 20);

if (isInjured) {
player.setActiveHand(hand);
return new ActionResult(EnumActionResult.SUCCESS, player.getHeldItem(hand));
} else {
return new ActionResult(EnumActionResult.FAIL, player.getHeldItem(hand));
//右クリックされたときにアイテムが使用中という状態になるだけのプログロム、アイテムの使用終了時に効果が呼ばれる仕様なのでここにはアイテム効果は書かない。
}
}

このようにするとSEがないこともあいまってか、効果発揮までの無音の待機時間に"本当に操作これであってる??"というような不安な間ができてしまったように感じられます。
そこでアクションバー(夜になるまで眠れませんが出る欄)に効果発動までのカウントダウンを表示させられるようにしたいのですが、
Googleやあまたのサイト(海外サイトを含む)を見ても初心者の自分にはちんぷんかんぷんで、どのクラス、メソッドを使えばいいのかわかりませんでした。
長文になってしまい申し訳ありません、わかる方がいましたら是非ご教授ください。

イメージとしてはRPGなどのアイテムのクールタイム、FPSのリロード時のカウントダウンのような感じです。


独自SEではなく、とりあえずバニラにある既存SEのピッチ変えなどで代用できるのであれば、既存SEを鳴らしてしまって良いのではないかと思います。
SEの鳴らし方は、引数にworldが渡ってくるタイミングであれば、playSoundメソッドで演奏できます
コード: 全て選択
world.playSound(player, player.posX, player.posY, player.posZ,
                  SoundEvents.ENTITY_ARROW_SHOOT, SoundCategory.NEUTRAL, 1.0F, 1.0F / (itemRand.nextFloat() *
                        0.4F + 1.2F) + 0.5F);

上記を、例えば右クリック中に継続して呼ばれるメソッドであるonItemRightClickメソッド内に書いておけば、タメ中は繰り返し呼ばれますので、ずっとSEが鳴っているような状態になります
SoundEvents.ENTITY_ARROW_SHOOTを別のSEに変えればバニラにあるものなら好きな音を鳴らせます


あるいは、効果発揮時にSEを鳴らしても良いかと


効果発動までのカウントダウン表示はあまりおすすめできません
やるためには現在の経過時間をどこかに保存しておく必要があります。Itemにも、ItemStackのデータタグ(NBTタグ)に読み書きすることで経過時間のカウントダウン自体は可能なのですが、NBTタグを更新する際にタメが途切れてしまう現象などが起きたりするので、難しいかもしれません


ほか、少し気になったところの追記

・Tickとは
このゲーム内で使われている時間の単位です
だいたい20tick=1秒とみなせます

・効果発揮時のこの記述
コード: 全て選択
         stack.shrink(1);
         return ItemStack.EMPTY;

shrink(1)は「1個減らす処理」です
ですので、減らした後は
コード: 全て選択
return stack;

で、現象処理後のstackを返せば大丈夫です
スタック数が0個になった場合に空のアイテムに替えてやりたいのであれば、
コード: 全て選択
stack.shrink(1);
if (stack.getCount() < 1){
    stack = ItemStack.EMPTY;
}

等にして、0個のときだけEMPTYに変えればいいです

今の記述だと、スタック数がいくつあってもEMPTYに変えられてしまう(スタックをまとめて使い切ってしまう)挙動になります
カラスの敗残兵です。AppleMilkTea他、少々のMODを作成しています。
トピック: AppleMilkTea(~1.7.10) / HeatAndClimate(1.10.2)
作者Wiki / github / twitter
アバター
defeatedcrow
ID:0790d4e9
ラピスラズリ収集家
 
記事: 1049
登録日時: 2014年1月08日(水) 13:48
お住まい: 北関東

  • (PostNo.316715)

Re: 【総合】トピック立てるまでもない質問【Mod制作】

投稿記事by Furrer » 2018年5月19日(土) 00:53

うううぅぅまたも丁寧な解説を本当にありがとうございます!提示して頂いた方法を無事再現することができました。
当方java含めて本当の駆け出しなので自分で気にもしていなかった部分(スタックの仕組みなど)にも指摘をいただけるのも本当に助かります。またここで質問させてもらうこともありそうですが、今回はありがとうございました…!
Furrer
ID:bb088948
 

  • (PostNo.316749)

Re: 【総合】トピック立てるまでもない質問【Mod制作】

投稿記事by Furrer » 2018年5月20日(日) 05:14

何度もすみません。
左クリックと右クリックで異なる2つの効果を持つアイテムを作ろうと思い、itemクラスを継承したオブジェクトを用意した上で
左クリックの動作用として試しにまずこのようなコードを書きました。

@Override
public boolean onEntitySwing(EntityLivingBase entityLiving, ItemStack stack){
if(Mouse.isButtonDown(0))
{
entityLiving.heal(1.0F);
}
return true;
}

使ってみるとすんなり効果を発揮(回復)してくれたのですが、ブロックに手が届く範囲で左クリックをした場合そのブロックを掘り始めてしまうため、その間は左クリックの処理が継続されてしまいます。
なのでハート半分しか回復できないはずのentityLiving.heal(1.0F);の効果がすごいスピードで連続して発生し、一瞬で体力MAXまで回復してしまう、という状態です。
ブロックをターゲットしていても採掘処理に入らないような方法がありましたらどうか教えてください。
Furrer
ID:6cd91ca0
 

  • (PostNo.316789)

Re: 【総合】トピック立てるまでもない質問【Mod制作】

投稿記事by TAN90 » 2018年5月21日(月) 14:37

1.12.2で接触したエンティティを一定方向に加速させるようなブロックと接触すると運動のベクトルをそっくり反転させるを追加するMODをつくりたいんですが全然上手くいかなくて...
調べてもテレポート系しか出てこなくて参ってます...
何か良い方法はありますか?
アバター
TAN90
ID:90f2912d
水から上がったとこ
 
記事: 2
登録日時: 2018年5月06日(日) 16:21

  • (PostNo.316898)

Re: 【総合】トピック立てるまでもない質問【Mod制作】

投稿記事by ShuperDark » 2018年5月26日(土) 18:14

こんにちは。
お久しぶりです。
1.12.2でMod開発をしているのですが、LivingUpdateEventで司書の村人を取得したいのですが、何かいい方法はありませんか?製図家ではなく、司書のみでしたいです(´・ω・`)
アバター
ShuperDark
ID:85d166a0
大工さん
 
記事: 43
登録日時: 2017年4月15日(土) 20:35

  • (PostNo.317032)

Re: 【総合】トピック立てるまでもない質問【Mod制作】

投稿記事by テヘラン » 2018年6月01日(金) 10:48

こんにちは。
プレイヤーのペット等を保護する用途で、エンティティを登録し、アイテムを使用することで登録したエンティティをその場に召喚するMODを作成しています。
対象のエンティティのUDIDを登録するところまでは上手くいったのですが、召喚が上手くいかず困っております。
worldIn.getMinecraftServer().getEntityFromUuid(UUID) エンティティを取得しようとしたところ、シングルプレイでは上手くいったのですが
マルチプレイだと取得することが出来ませんでした。
マルチプレイでUUIDからエンティティを取得する手段はありますでしょうか?
テヘラン
ID:5bf3eed4
 

1つ前へ

Return to 質問:開発・制作関連

x