ボタンの作り方

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

ボタンの作り方

投稿記事by minecart » 2018年7月20日(金) 13:12

ver1.7.10でバニラのボタンでいいので、作り方を教えてください。
爆破耐性をつけたくて、普通のブロックでは出来たのですが、ボタンを作ろうとしたけれどやり方がわかりません。
お願いします。

あと、できれば、ボタンを持ってるときだけそのボタン表示する方法も教えてください。
minecart
ID:da05adc8
 

  • (PostNo.318316)

Re: ボタンの作り方

投稿記事by 新人もっだー » 2018年7月25日(水) 20:38

バニラのボタンっていうか、一から作らず継承&オーバーライドという解釈をさせていただきました。
とりあえず↓のコードで挙動するとおもいます。
ボタンを持ってるときだけそのボタン表示する方法は…描画に足突っ込むなんて怖くて力足らずでお答えできませんが。。。

(最近kotlinしか触ってないので文法ミスあしからず)

コード: 全て選択
public class HogeButton extends BlockButton {

   public HogeButton() {
   
      super(true)//trueなら木製、falseなら石製と同じ時間出力をします。
      //~~~
   
   }

   public IIcon getIcon(int side, int meta) {
     
      return Blocks.obsidian.getBlockTextureFromSide(1)//今回は黒曜石のテクスチャで。obsidianの部分変えて対応してください。
     
   }

}
instance().instance().instance() = null;
アバター
新人もっだー
ID:f4092567
石掘り
 
記事: 143
登録日時: 2015年6月22日(月) 17:58

  • (PostNo.318333)

Re: ボタンの作り方

投稿記事by minecart » 2018年7月26日(木) 14:48

できました!
ありがとうございます!
minecart
ID:da05adc8
 

  • (PostNo.318711)

Re: ボタンの作り方

投稿記事by minecart » 2018年8月05日(日) 16:39

もう一つ質問です
同じブロックを持っている時だけ、破壊できるようにするっていうのはできないでしょうか。
minecart
ID:2d6a4c90
 

  • (PostNo.318815)

Re: ボタンの作り方

投稿記事by 草あんこ » 2018年8月08日(水) 16:00

同じブロックを持ってるときだけという処理は以下のコードを追加すれば実現できます
他にあるかもしれませんが...
コード: 全て選択
@Override
public float getPlayerRelativeBlockHardness(EntityPlayer player, World world, int x, int y, int z) {
   ItemStack stack = player.inventory.getCurrentItem();
   if(stack!=null&&stack.getItem() instanceof ItemBlock) {
      ItemBlock item = (ItemBlock) stack.getItem();
      if(item.field_150939_a==this) {
         return ForgeHooks.blockStrength(this, player, world, x, y, z);
      }
   }
   return 0.0f;
}
草あんこ
ID:eacf050c
水から上がったとこ
 
記事: 8
登録日時: 2016年10月07日(金) 17:22

  • (PostNo.318841)

Re: ボタンの作り方

投稿記事by minecart » 2018年8月09日(木) 06:59

ありがとうございます。
そういえばこの方と同じ質問をしてました。すみません。
viewtopic.php?f=39&t=36585
minecart
ID:2d6a4c90
 

  • (PostNo.318847)

Re: ボタンの作り方

投稿記事by minecart » 2018年8月09日(木) 09:08

たびたびすみませんが、
仮に、ある別のアイテム(ブロックでない)を持っている時だけ、そのブロックを破壊できるというふうにすることはできますか?

if(item.field_150939_a==this)
ここの、thisをいじればできると思うのですが、ブロックならうまくいったものの、アイテムだとできませんでした。
多分(stack!=null&&stack.getItem() instanceof ItemBlock)のところで引っかかってると思うのですが、ItemBlockを消したりItemに変更してもうまくいかないんですよね。
お願いします
minecart
ID:2d6a4c90
 

  • (PostNo.318858)

Re: ボタンの作り方

投稿記事by 草あんこ » 2018年8月09日(木) 14:38

コメント付きのソース載せときますね。
コード: 全て選択
@Override
public float getPlayerRelativeBlockHardness(EntityPlayer player, World world, int x, int y, int z) {
   //プレイヤーの持っているアイテムの取得
   ItemStack stack = player.inventory.getCurrentItem();
   //アイテムがItemBlockかどうかの判定。stack!=nullは不要だったことに気づいたので消します。
   if(stack.getItem() instanceof ItemBlock) {
      //さっき取得したプレイヤーの持っているアイテムをItemBlockに変換
      ItemBlock item = (ItemBlock) stack.getItem();
      //アイテムは何のブロックを設置するものなのかを取得し、それがこのブロックであるかどうかの判定
      if(item.field_150939_a==this) {
         return ForgeHooks.blockStrength(this, player, world, x, y, z);
      }
   }
   return 0.0f;
}

if(item.field_150939_a==this)この部分はItemBlockのブロックがどうなのか判定しているところなのでブロックであれば何でもいけます。
ちなみにItemBlockとはブロックのアイテム状態のもののことです。
ItemBlockのfield_150939_aには何のブロックかが入っているのでif文で判定しています。
アイテムにしたい場合は
コード: 全て選択
@Override
public float getPlayerRelativeBlockHardness(EntityPlayer player, World world, int x, int y, int z) {
   //プレイヤーの持っているアイテムの取得
   ItemStack stack = player.inventory.getCurrentItem();
   //アイテムを持っているかどうかの判定とアイテムが指定したアイテムと一致しているかどうか。Items.arrowの部分を変えてください。
   if(stack.getItem()!=null&&stack.getItem()==Items.arrow) {
      return ForgeHooks.blockStrength(this, player, world, x, y, z);
   }
   return 0.0f;
}

ちなみにForgeHooks.blockStrength(this, player, world, x, y, z);はブロック、プレイヤー、ワールド、座標を入れれば破壊にかかる時間を返してくれる関数です。
草あんこ
ID:eacf050c
水から上がったとこ
 
記事: 8
登録日時: 2016年10月07日(金) 17:22

  • (PostNo.318884)

Re: ボタンの作り方

投稿記事by minecart » 2018年8月10日(金) 05:33

なるほど、よくわかりました。
ぜひトライしてみます。
minecart
ID:2d6a4c90
 

  • (PostNo.319004)

Re: ボタンの作り方

投稿記事by minecart » 2018年8月12日(日) 13:06

またすみません。
持っている時だけ破壊できるブロックをマルチで使うと、たたいた時にたまにクラッシュしてしまうのですが、直せますか?
minecart
ID:2d6a4c90
 

  • (PostNo.319005)

Re: ボタンの作り方

投稿記事by minecart » 2018年8月12日(日) 13:08

素手でたたくとクラッシュします。
minecart
ID:2d6a4c90
 

  • (PostNo.319009)

Re: ボタンの作り方

投稿記事by minecart » 2018年8月12日(日) 15:14

マルチでなくシングルでもクラッシュしました。
素手の状態でそのブロックを左クリックをするとクラッシュします。
minecart
ID:2d6a4c90
 

  • (PostNo.319010)

Re: ボタンの作り方

投稿記事by 新人もっだー » 2018年8月12日(日) 15:17

stack.getItem()!=nullのところで、stackがnull=素手だとヌルポが発生してしまうからではないかと思います。stack != null && ...というように付け加えてみてください。
instance().instance().instance() = null;
アバター
新人もっだー
ID:f4092567
石掘り
 
記事: 143
登録日時: 2015年6月22日(月) 17:58

  • (PostNo.319018)

Re: ボタンの作り方

投稿記事by minecart » 2018年8月12日(日) 16:07

クラッシュしなくなりました。
ありがとうございます。
minecart
ID:2d6a4c90
 

  • (PostNo.319046)

Re: ボタンの作り方

投稿記事by 草あんこ » 2018年8月12日(日) 20:47

すみません...そこは盲点でした
草あんこ
ID:0e108bd4
水から上がったとこ
 
記事: 8
登録日時: 2016年10月07日(金) 17:22


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

x