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

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

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

投稿記事by Pucian » 2017年8月31日(木) 16:53

いきなりですみません。 チャット発言時に名前の横にマインクラフトのレベルを表示させるプラグインはありますか?
探しても見つからないんです。
Pucian
ID:281c75ac
 

  • (PostNo.307199)

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

投稿記事by miyabi » 2017年8月31日(木) 17:01

Pucian さんが書きました:いきなりですみません。 チャット発言時に名前の横にマインクラフトのレベルを表示させるプラグインはありますか?
探しても見つからないんです。

質問:開発・制作関連
【総合】トピック立てるまでもない質問【Bukkit Plugin制作

カテゴリ名やトピック名は良く読んで投稿するようにしましょう。
削除依頼、移動依頼は以下からどうぞ。
viewtopic.php?f=16&t=3583
マイクラサーバを立てる前に、PCの基礎知識を身につけましょう。
サーバ管理補助ツール MCSC(Windows専用) の開発をしたり、Minecraft Modding Wikiの管理したりしてます。
アバター
miyabi
ID:91b90127
ブタ飼い
 
記事: 6947
登録日時: 2011年8月07日(日) 14:35
お住まい: さいたまさいたまさいたま!

  • (PostNo.307660)

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

投稿記事by hyoreo » 2017年9月11日(月) 16:27

質問です。
名前の付いた特定のアイテムを右クリックすると雪玉が発射されるプラグインを作っていて、
PlayerInteractEventが発生するたびに雪玉を発射する処理を作ってみたのですが、
この方法だと弾が出る頻度を遅くしたり早くしたりすることができず困っています。
スケジューラを使ってなんとかしようとしたけどうまくいかず・・・orz
何かいい方法があればご教示ください!

コードです↓
コード: 全て選択
   String weapon;

   String gun = "銃";

   @EventHandler
   public void onPlayerInteractEvent(PlayerInteractEvent event) {
      if (!event.hasItem()) return;
      ItemStack playeritem = event.getPlayer().getItemInHand();
      if (!playeritem.hasItemMeta()) return;
      if (!event.getAction().equals(Action.RIGHT_CLICK_AIR) ||
         !event.getAction().equals(Action.RIGHT_CLICK_BLOCK)) return;
      if (playeritem.getItemMeta().getDisplayName().equals(gun)) {
         if (playeritem.getType().equals(Material.IRON_BARDING)){
            event.getPlayer().launchProjectile(Snowball.class);
         }
      }
   }
アバター
hyoreo
ID:a0623564
木を殴ってる
 
記事: 36
登録日時: 2014年1月20日(月) 20:41
お住まい: 大都会岡山

  • (PostNo.307682)

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

投稿記事by amata1219 » 2017年9月11日(月) 21:39

hyoreo さんが書きました:質問です。
名前の付いた特定のアイテムを右クリックすると雪玉が発射されるプラグインを作っていて、
PlayerInteractEventが発生するたびに雪玉を発射する処理を作ってみたのですが、
この方法だと弾が出る頻度を遅くしたり早くしたりすることができず困っています。
スケジューラを使ってなんとかしようとしたけどうまくいかず・・・orz
何かいい方法があればご教示ください!

コードです↓
コード: 全て選択
   String weapon;

   String gun = "銃";

   @EventHandler
   public void onPlayerInteractEvent(PlayerInteractEvent event) {
      if (!event.hasItem()) return;
      ItemStack playeritem = event.getPlayer().getItemInHand();
      if (!playeritem.hasItemMeta()) return;
      if (!event.getAction().equals(Action.RIGHT_CLICK_AIR) ||
         !event.getAction().equals(Action.RIGHT_CLICK_BLOCK)) return;
      if (playeritem.getItemMeta().getDisplayName().equals(gun)) {
         if (playeritem.getType().equals(Material.IRON_BARDING)){
            event.getPlayer().launchProjectile(Snowball.class);
         }
      }
   }


hyoreoさんこんばんは。
雪玉発射処理を遅延実行したいのであればスケジューラを用いるだけで可能でして、以下の様にするだけで遅延実行出来ます。
コード: 全て選択
new BukkitRunnable(){
public void run(){
//ここに遅延実行したい処理を記述
}
}.runTaskLater(plugin, tick)

一応チュートリアルのURLも貼らせて頂きますね。
スケジューラのプログラミング
アバター
amata1219
ID:03e7ab14
木を殴ってる
 
記事: 20
登録日時: 2016年11月18日(金) 16:46
お住まい: 愛知県

  • (PostNo.307685)

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

投稿記事by King(qpwakaba) » 2017年9月11日(月) 21:56

amata1219 さんが書きました:
hyoreo さんが書きました:

多分連射速度、という意味だと思うんで簡単に方法だけ

最初にInteractEventで スケジューラタスクを開始

連射を止める条件を満たすまで、スケジューラタスクでたまを発射し続ける

連射を止める条件を満たしたら、スケジューラタスクを止める


連射中に速度が変わらなければrunTaskTimerを使うと良いかも。
連射中に速度を変えたいのであれば、runTaskLaterを使って、タスクの中でrunTaskLaterするといいかも。
以下サイン
調べて見つからないことを質問して、「そのくらい調べろ」と言われたら それは調べが足りないとき。

投稿画面のBBコード挿入ボタン を追加するユーザースクリプト作りました。良かったらどうぞ。
https://greasyfork.org/ja/scripts/18657
最大描画距離を64チャンクまで伸ばすMod作ってます。
viewtopic.php?t=30697
アバター
King(qpwakaba)
ID:4e8307eb
ダイヤモンド掘り
 
記事: 816
登録日時: 2013年3月26日(火) 10:25

  • (PostNo.307688)

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

投稿記事by amata1219 » 2017年9月11日(月) 22:29

King(qpwakaba) さんが書きました:
amata1219 さんが書きました:
hyoreo さんが書きました:

多分連射速度、という意味だと思うんで簡単に方法だけ

最初にInteractEventで スケジューラタスクを開始

連射を止める条件を満たすまで、スケジューラタスクでたまを発射し続ける

連射を止める条件を満たしたら、スケジューラタスクを止める


連射中に速度が変わらなければrunTaskTimerを使うと良いかも。
連射中に速度を変えたいのであれば、runTaskLaterを使って、タスクの中でrunTaskLaterするといいかも。

ああ、そういう事でしたか。誤解していました…_(:3 ∠ )_。
付け足しありがとうございます。
アバター
amata1219
ID:03e7ab14
木を殴ってる
 
記事: 20
登録日時: 2016年11月18日(金) 16:46
お住まい: 愛知県

  • (PostNo.307797)

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

投稿記事by hyoreo » 2017年9月14日(木) 23:33

amata1219 さんが書きました:

King(qpwakaba) さんが書きました:

ご回答ありがとうございます。
早速書いてみようと思ったのですが、
連射を止める条件をどうやって検知するのかがわかりません。。。
isBlocking()で右クリックを押しているか検知できるかと思ったのですが、できませんでした・・・
プレイヤーが右クリックしているか確認する関数は存在するのでしょうか?
アバター
hyoreo
ID:a0623564
木を殴ってる
 
記事: 36
登録日時: 2014年1月20日(月) 20:41
お住まい: 大都会岡山

  • (PostNo.307799)

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

投稿記事by ことむー » 2017年9月14日(木) 23:55

hyoreo さんが書きました:
amata1219 さんが書きました:

King(qpwakaba) さんが書きました:

ご回答ありがとうございます。
早速書いてみようと思ったのですが、
連射を止める条件をどうやって検知するのかがわかりません。。。
isBlocking()で右クリックを押しているか検知できるかと思ったのですが、できませんでした・・・
プレイヤーが右クリックしているか確認する関数は存在するのでしょうか?


横から失礼( ´_ゝ`)ノ
もし1tickごとに連射っていう感じでやりたいのであれば
右クリックイベント(PlayerInteractEvent)は1/4秒(5tick)間隔で動いてるので
InteractEventが発生

適当な変数に5を代入

タイマーが動くたびに変数をデクリメント(減算)

その変数が0以下になった場合は連射を止める

って感じの処理でやると良いんでないかな?
まぁ後は工夫して自分のやりやすいように頑張って!(´-ω-`)(雑

昔自分もKing氏に同じような動作アドバイスしてもらった
以下それっぽい動きのやつ、可変可能
https://github.com/kotmw0701/Splatoon-i ... ooter.java
アバター
ことむー
ID:658a9697
石炭掘り
 
記事: 155
登録日時: 2014年5月11日(日) 22:01
お住まい: 日本建築の家(じゃなかったらどこの国のひとだ!?ってなるよな)

  • (PostNo.307813)

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

投稿記事by AKM » 2017年9月15日(金) 17:04

質問なのですが、アイテム(剣、斧などの武器)の攻撃速度や攻撃威力を変更することは不可能なのでしょうか。
ItemMetaからは変更できそうになく、海外のサイトで検索をかけても旧バージョンの方法しか出てきません。
APIの変更で設定できなくなってしまったのでしょうか。
方法を知っている方教えてください。よろしくお願いします。
(spigot-ver-1.12.1)
AKM
ID:f86fe74b
 

  • (PostNo.307879)

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

投稿記事by amata1219 » 2017年9月16日(土) 19:52

AKM さんが書きました:質問なのですが、アイテム(剣、斧などの武器)の攻撃速度や攻撃威力を変更することは不可能なのでしょうか。
ItemMetaからは変更できそうになく、海外のサイトで検索をかけても旧バージョンの方法しか出てきません。
APIの変更で設定できなくなってしまったのでしょうか。
方法を知っている方教えてください。よろしくお願いします。
(spigot-ver-1.12.1)


AKMさんこんにちは。
結論から申し上げますと可能です。
ご存知でしたら申し訳ございませんが、攻撃速度や攻撃威力はAttribute ModifiersというNBTタグの一種であり、ItemMetaからの読み書きは出来ません。
そこで、プラグインからのAttribute Modifiers及びNBTの読み書きにはNMSを利用します。
下記コードは攻撃力+50の木の剣をプレイヤーに与えるコードになります。
コメントアウト部の解説と合わせてご参考にして頂ければと思います。
コード: 全て選択
      ItemStack item = new ItemStack(Material.WOOD_SWORD);
      //新しいアイテムを作成。

      net.minecraft.server.v1_12_R1.ItemStack nmsItem= CraftItemStack.asNMSCopy(item);
      //CraftItemStackクラスのasNMSCopyメソッドでnmsItemStackを取得する。

      NBTTagCompound compound = (nmsItem.hasTag()) ? nmsItem.getTag() : new NBTTagCompound();
      //NMSのItemStackコンパウンドはnullに出来るので確認する。

      NBTTagList modifiers = new NBTTagList();
      //書き込む属性を入れるリストを作成する。

      NBTTagCompound dmg = new NBTTagCompound();
      //attackDamage属性を編集するための変数を作成する。

      dmg.set("AttributeName", new NBTTagString("generic.attackDamage"));
      dmg.set("Name", new NBTTagString("generic.attackDamage"));
      //属性を指定する。名称は公式Wikiを参考にしました。

      dmg.set("Amount", new NBTTagInt(50));
      //ここでダメージ量を指定出来ます。ここでの数値1はハート0.5に値します。

      dmg.set("Operation", new NBTTagInt(0));
      //属性の基本値を編集出来ますが基本触らないため0を指定します。

      dmg.set("UUIDLeast", new NBTTagInt(894654));
      dmg.set("UUIDMost", new NBTTagInt(2872));
      //ここの2つは恐らく触ってはいけません。数値は公式Wikiを参考にしました。

      dmg.set("Slot", new NBTTagString("mainhand"));
      //ここでAttributeModifiers効果を有効にするスロットを指定します。指定しないと全スロットで有効になります。

      modifiers.add(dmg);
      //リストに書き込む。

      compound.set("AttributeModifiers", modifiers);
      //nmsItemStackから取得したItemStackコンパウンドに書き込む。

      nmsItem.setTag(compound);
      //アイテムにNBTを書き込む。

      item = CraftItemStack.asBukkitCopy(nmsItem);
      //CraftItemStackクラスのasBukkitCopyメソッドにNBTTag書き込み済みのnmsItemStackを入れる。

      p.getInventory().addItem(item);
      //プレイヤーにアイテムを与える


参考にした記事:
Minecraft公式Wiki - Attribute
またVer.1.11で英語ではありますがAtturibute Modifiersに関連するチュートリアルを見つけましたので記載させて頂きますね。
NBTTags & Attribute チュートリアル
アバター
amata1219
ID:03e7ab14
木を殴ってる
 
記事: 20
登録日時: 2016年11月18日(金) 16:46
お住まい: 愛知県

  • (PostNo.307897)

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

投稿記事by AKM » 2017年9月16日(土) 22:27

丁寧な解説ありがとうございます。
提示していただいた例とサイトを使って頑張って見ます。
ありがとうございました!
AKM
ID:f86fe74b
 

1つ前へ

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

x