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

フォーラムルール
質問関連フォーラムで質問する時は、必ず次のトピックを一読/厳守お願い致します。
viewtopic.php?f=5&t=999

返信する

CAPTCHA 認証コード
表示されたコードを正確に入力してください。各文字は大文字・小文字の区別があります。

BBCode: OFF
スマイリー: OFF
トピックのレビュー
   

ファイルを添付します

展開ビュー トピックのレビュー: 【総合】トピック立てるまでもない質問【Bukkit Plugin制作】

Re: サーバーのpluginsフォルダに.jarファイルを入れたのに適用されない!

投稿記事 by Gattino » 2018年8月21日(火) 17:00

amata1219 さんが書きました:
Gattino さんが書きました:私は今1.13MinecrafSpigotプラグインを自作しています。
ですが、試しに動作確認をしようとMavenプロジェクトでビルドして、できた.jarファイルをpluginsフォルダに入れてサーバーを起動したのですが、プラグインが適用されません。
赤く表示すらされません。
ほかのプラグインは表示されているのに、自作のものだけが表示されないんです。
どこに問題があるのでしょうか、調べるべき点、原因として考えられる可能性がある事象を教えてください。よろしくお願いします。
ちなみにeclipseを使用しています。


Gattinoさん、こんにちは。
エラーすら表示されないとなると、plugin.ymlがプラグインに含まれていないのかもしれません。
Mavenプロジェクトでresourcesにplugin.ymlを入れている場合、エクスポートでなくMavenプロジェクト→右クリック→実行→Maven installを選択し、workspace/プラグイン名/targetに生成されるjarファイルを導入してみて下さい。

ありがとうございます、やってみます

Re: サーバーのpluginsフォルダに.jarファイルを入れたのに適用されない!

投稿記事 by amata1219 » 2018年8月21日(火) 11:50

Gattino さんが書きました:私は今1.13MinecrafSpigotプラグインを自作しています。
ですが、試しに動作確認をしようとMavenプロジェクトでビルドして、できた.jarファイルをpluginsフォルダに入れてサーバーを起動したのですが、プラグインが適用されません。
赤く表示すらされません。
ほかのプラグインは表示されているのに、自作のものだけが表示されないんです。
どこに問題があるのでしょうか、調べるべき点、原因として考えられる可能性がある事象を教えてください。よろしくお願いします。
ちなみにeclipseを使用しています。


Gattinoさん、こんにちは。
エラーすら表示されないとなると、plugin.ymlがプラグインに含まれていないのかもしれません。
Mavenプロジェクトでresourcesにplugin.ymlを入れている場合、エクスポートでなくMavenプロジェクト→右クリック→実行→Maven installを選択し、workspace/プラグイン名/targetに生成されるjarファイルを導入してみて下さい。

サーバーのpluginsフォルダに.jarファイルを入れたのに適用されない!

投稿記事 by Gattino » 2018年8月20日(月) 19:00

私は今1.13MinecrafSpigotプラグインを自作しています。
ですが、試しに動作確認をしようとMavenプロジェクトでビルドして、できた.jarファイルをpluginsフォルダに入れてサーバーを起動したのですが、プラグインが適用されません。
赤く表示すらされません。
ほかのプラグインは表示されているのに、自作のものだけが表示されないんです。
どこに問題があるのでしょうか、調べるべき点、原因として考えられる可能性がある事象を教えてください。よろしくお願いします。
ちなみにeclipseを使用しています。

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

投稿記事 by amata1219 » 2018年8月10日(金) 17:34

八咫烏 さんが書きました:詰まってしまって、たびたび質問失礼します。
(上記コード参照)
銃を打つ(雪玉を発射する)たびに残りの弾数表示をItemDisplayNameに表示させたいんですけど
Mainクラスでのアイテムの名前変更はできるんですけど
このMainクラスで取得したアイテムスタックをサブクラスに渡して
サブクラスでそのitemmetaを設定しSetItemmetaをした際に
名前の変更が表示されません。(サブクラスに渡している時点でItemStackが別物として扱われるのでしょうか)
よろしくお願いします。


八咫烏さん、こんにちは。
サブクラスに渡そうとItemStackが別物として処理されることはありません。
一応検証に使ったコードがありますので、よければ参考にして下さい。

メインクラス(Check.class)
コード: 全て選択
package amata1219.check;

import org.bukkit.Material;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerInteractEvent;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;
import org.bukkit.plugin.java.JavaPlugin;

public class Check extends JavaPlugin implements Listener{

   @Override
   public void onEnable(){
      getServer().getPluginManager().registerEvents(this, this);
   }

   @Override
   public void onDisable(){

   }

   @EventHandler
   public void onInteract(PlayerInteractEvent e){
      ItemStack item = e.getItem();
      if(item != null && item.getType() != Material.AIR){
         setMeta(item);
         System.out.println(item.getItemMeta().getDisplayName());
         new SubCheck().setMeta(item);
         System.out.println(item.getItemMeta().getDisplayName());
         SubCheck.setMetaa(item);
         System.out.println(item.getItemMeta().getDisplayName());
      }
   }

   public void setMeta(ItemStack item){
      ItemMeta meta = item.getItemMeta();
      meta.setDisplayName("GRASS");
      item.setItemMeta(meta);
   }

}


サブクラス(SubCheck.class)

コード: 全て選択
package amata1219.check;

import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;

public class SubCheck {

   public void setMeta(ItemStack item){
      ItemMeta meta = item.getItemMeta();
      meta.setDisplayName("DIRT");
      item.setItemMeta(meta);
   }

   public static void setMetaa(ItemStack item){
      ItemMeta meta = item.getItemMeta();
      meta.setDisplayName("PODZOL");
      item.setItemMeta(meta);
   }

}


コンソール(出力結果)

コード: 全て選択
[17:25:43] [Server thread/INFO]: GRASS
[17:25:43] [Server thread/INFO]: DIRT
[17:25:43] [Server thread/INFO]: PODZOL


各メソッドを単体で実行した時も問題なく、ゲーム内でも表示名が変更されました。
もしこれでも解決しないようでしたらソースコードを再度貼り付けて下さいー。

CYBORG さんが書きました:特定の剣(アイテム)にエフェクトを追加したいんですが、詰まってしまってできません。


CYBORGさん、こんにちは。
エンチャントの追加方法はプラグインチュートリアルに記載されています。
Plugin Tutorial - Minecraft Modding Wiki #エンチャント
調べればすぐに出てくる内容ですので、最低限ご自身でお調べになった上で質問して下さい_(:3 ∠ )_。

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

投稿記事 by CYBORG » 2018年8月08日(水) 16:44

特定の剣(アイテム)にエフェクトを追加したいんですが、詰まってしまってできません。

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

投稿記事 by 八咫烏 » 2018年7月30日(月) 11:10

詰まってしまって、たびたび質問失礼します。
(上記コード参照)
銃を打つ(雪玉を発射する)たびに残りの弾数表示をItemDisplayNameに表示させたいんですけど
Mainクラスでのアイテムの名前変更はできるんですけど
このMainクラスで取得したアイテムスタックをサブクラスに渡して
サブクラスでそのitemmetaを設定しSetItemmetaをした際に
名前の変更が表示されません。(サブクラスに渡している時点でItemStackが別物として扱われるのでしょうか)
よろしくお願いします。

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

投稿記事 by 八咫烏 » 2018年7月30日(月) 08:49

amata1219 さんが書きました:
八咫烏 さんが書きました:MainClass↓
コード: 全て選択
   private int counter;

   @EventHandler
   public void onWeapon(PlayerInteractEvent e){

      Material m = e.getItem().getType();
      ItemStack itemStack = e.getItem();
      if(m == Material.STICK && itemStack.hasItemMeta() == true && e.getAction() == Action.RIGHT_CLICK_AIR ){


         counter = 5;
         new WeaponTask(this, counter ,e.getPlayer()).runTaskTimer(this, 0, 5);


         }

   }


サブクラス↓

コード: 全て選択
import org.bukkit.Sound;
import org.bukkit.entity.Player;
import org.bukkit.plugin.java.JavaPlugin;
import org.bukkit.scheduler.BukkitRunnable;

public class WeaponTask extends BukkitRunnable{

   private final JavaPlugin plugin;
   private int counter;
   private Player player;

   public WeaponTask(JavaPlugin plugin, int counter , Player player){

      this.plugin = plugin;

      if(counter < 1){

         throw new IllegalArgumentException("counter には1以上を指定してください。");

      }

      else{

         this.player = player;
         this.counter = counter;

      }

   }

   @SuppressWarnings("deprecation")
   @Override
   public void run(){

      if(counter > 0){

         player.throwSnowball();
         player.playSound(player.getLocation(), Sound.BLAZE_HIT, 10, 10);
         counter--;

      }

      else{

         plugin.getServer().broadcastMessage("ラストカウンター: " + counter);
         plugin.getServer().broadcastMessage("END");
         this.cancel();

      }

   }


これで、スノーボール発射するんですけど、右クリックで連射中にもう一度右クリックすると
かぶせて発射されてしまいます(2回分サブクラスが働く)
こうしないためにはどうすればいいんでしょうか。


八咫烏さん、こんにちは。
それでしたら、ループ処理中か確認するコードを追加するだけで簡単に解決出来ます。

1. Mainクラスにpublic List<UUID>を作成(ここでは変数名listとします)。
2. Main#onWeapon(…)のif文に、!list.contains(e.getPlayer().getUniqueId())の条件文を追加。
3. Main#onWeapon(…)でのWeaponTask生成後にlist.add(e.getPlayer().getUniqueId())の記述を追加。
4. WeaponTask#run()のbroadcastMessage("END")の後に、plugin.list.remove(player.getPlayer().getUniqueId())の記述を追加。

Main.class
コード: 全て選択
public List<UUID> list = new ArrayList<UUID>();

@EventHandler
public void onWeapon(PlayerInteractEvent e){
Player p = e.getPlayer();
UUID uuid = p.getUniqueId();
ItemStack itemStack = e.getItem();
if(e.getAction() == Action.RIGHT_CLICK_AIR && !list.contains(uuid) && itemStack.hasItemMeta() && itemStack.getType == Material.STICK){
new WeaponTask(this, 5 , p).runTaskTimer(this, 0, 5);
list.add(uuid);
}
}


WeaponTask.class
コード: 全て選択
import org.bukkit.Sound;
import org.bukkit.entity.Player;
import org.bukkit.plugin.java.JavaPlugin;
import org.bukkit.scheduler.BukkitRunnable;

public class WeaponTask extends BukkitRunnable{

private final JavaPlugin plugin;
private int counter;
private Player player;

public WeaponTask(JavaPlugin plugin, int counter , Player player){
if(counter > 0){
this.plugin = plugin;
this.player = player;
this.counter = counter;
}else{
throw new IllegalArgumentException("counter には1以上を指定してください。");
}
}

@SuppressWarnings("deprecation")
@Override
public void run(){
if(counter > 0){
player.throwSnowball();
//throwSnowball():これはコードを省略されただけでしょうか…?
player.playSound(player.getLocation(), Sound.BLAZE_HIT, 10, 10);
counter--;
}else{
plugin.getServer().broadcastMessage("ラストカウンター: " + counter);
plugin.getServer().broadcastMessage("END");
plugin.list.remove(player.getUniqueId());
this.cancel();
}
}


1~4に従いコードを記述するとこのようになると思います。

1~4以外で個人的に気になる点がいくつかありましたので合わせて修正させて頂きました。

a: Main#counter - 必要無いのでnew WeaponTask(…)に数値をそのまま記述(呼び出し元でメソッドの引数に基本データ型を使用した場合、メソッドではその値のコピーを受け取ります。単純に値のコピーを渡しているだけなので、メソッド内でその値に変更を加えても、呼び出し元には影響しません)。

b: Main#onWeapon(…) - if文の条件「itemStack.hasItemMeta()がtrue」は==trueを記述する必要無し(代入と見間違えたり、コードが冗長になるため)。

c: WeaponTask#WeaponTask - 条件は分かりやすくrun()と同じ記述にし、最初の代入処理(this.plugin = plugin;)はif文内に他の代入処理と一緒に記述。


追記:

後々思いつきましたがループ処理の終了時間が分かっているなら、onWeapon(…)でlist.remove(uuid)を遅延実行処理するという方法もあります(というかこちらの方が楽)。


指摘に合わせ、丁寧な返信ありがとうございました!
無事解決しました。

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

投稿記事 by amata1219 » 2018年7月29日(日) 17:40

八咫烏 さんが書きました:MainClass↓
コード: 全て選択
   private int counter;

   @EventHandler
   public void onWeapon(PlayerInteractEvent e){

      Material m = e.getItem().getType();
      ItemStack itemStack = e.getItem();
      if(m == Material.STICK && itemStack.hasItemMeta() == true && e.getAction() == Action.RIGHT_CLICK_AIR ){


         counter = 5;
         new WeaponTask(this, counter ,e.getPlayer()).runTaskTimer(this, 0, 5);


         }

   }


サブクラス↓

コード: 全て選択
import org.bukkit.Sound;
import org.bukkit.entity.Player;
import org.bukkit.plugin.java.JavaPlugin;
import org.bukkit.scheduler.BukkitRunnable;

public class WeaponTask extends BukkitRunnable{

   private final JavaPlugin plugin;
   private int counter;
   private Player player;

   public WeaponTask(JavaPlugin plugin, int counter , Player player){

      this.plugin = plugin;

      if(counter < 1){

         throw new IllegalArgumentException("counter には1以上を指定してください。");

      }

      else{

         this.player = player;
         this.counter = counter;

      }

   }

   @SuppressWarnings("deprecation")
   @Override
   public void run(){

      if(counter > 0){

         player.throwSnowball();
         player.playSound(player.getLocation(), Sound.BLAZE_HIT, 10, 10);
         counter--;

      }

      else{

         plugin.getServer().broadcastMessage("ラストカウンター: " + counter);
         plugin.getServer().broadcastMessage("END");
         this.cancel();

      }

   }


これで、スノーボール発射するんですけど、右クリックで連射中にもう一度右クリックすると
かぶせて発射されてしまいます(2回分サブクラスが働く)
こうしないためにはどうすればいいんでしょうか。


八咫烏さん、こんにちは。
それでしたら、ループ処理中か確認するコードを追加するだけで簡単に解決出来ます。

1. Mainクラスにpublic List<UUID>を作成(ここでは変数名listとします)。
2. Main#onWeapon(…)のif文に、!list.contains(e.getPlayer().getUniqueId())の条件文を追加。
3. Main#onWeapon(…)でのWeaponTask生成後にlist.add(e.getPlayer().getUniqueId())の記述を追加。
4. WeaponTask#run()のbroadcastMessage("END")の後に、plugin.list.remove(player.getPlayer().getUniqueId())の記述を追加。

Main.class
コード: 全て選択
public List<UUID> list = new ArrayList<UUID>();

@EventHandler
public void onWeapon(PlayerInteractEvent e){
Player p = e.getPlayer();
UUID uuid = p.getUniqueId();
ItemStack itemStack = e.getItem();
if(e.getAction() == Action.RIGHT_CLICK_AIR && !list.contains(uuid) && itemStack.hasItemMeta() && itemStack.getType == Material.STICK){
new WeaponTask(this, 5 , p).runTaskTimer(this, 0, 5);
list.add(uuid);
}
}


WeaponTask.class
コード: 全て選択
import org.bukkit.Sound;
import org.bukkit.entity.Player;
import org.bukkit.plugin.java.JavaPlugin;
import org.bukkit.scheduler.BukkitRunnable;

public class WeaponTask extends BukkitRunnable{

private final JavaPlugin plugin;
private int counter;
private Player player;

public WeaponTask(JavaPlugin plugin, int counter , Player player){
if(counter > 0){
this.plugin = plugin;
this.player = player;
this.counter = counter;
}else{
throw new IllegalArgumentException("counter には1以上を指定してください。");
}
}

@SuppressWarnings("deprecation")
@Override
public void run(){
if(counter > 0){
player.throwSnowball();
//throwSnowball():これはコードを省略されただけでしょうか…?
player.playSound(player.getLocation(), Sound.BLAZE_HIT, 10, 10);
counter--;
}else{
plugin.getServer().broadcastMessage("ラストカウンター: " + counter);
plugin.getServer().broadcastMessage("END");
plugin.list.remove(player.getUniqueId());
this.cancel();
}
}


1~4に従いコードを記述するとこのようになると思います。

1~4以外で個人的に気になる点がいくつかありましたので合わせて修正させて頂きました。

a: Main#counter - 必要無いのでnew WeaponTask(…)に数値をそのまま記述(呼び出し元でメソッドの引数に基本データ型を使用した場合、メソッドではその値のコピーを受け取ります。単純に値のコピーを渡しているだけなので、メソッド内でその値に変更を加えても、呼び出し元には影響しません)。

b: Main#onWeapon(…) - if文の条件「itemStack.hasItemMeta()がtrue」は==trueを記述する必要無し(代入と見間違えたり、コードが冗長になるため)。

c: WeaponTask#WeaponTask - 条件は分かりやすくrun()と同じ記述にし、最初の代入処理(this.plugin = plugin;)はif文内に他の代入処理と一緒に記述。


追記:

後々思いつきましたがループ処理の終了時間が分かっているなら、onWeapon(…)でlist.remove(uuid)を遅延実行処理するという方法もあります(というかこちらの方が楽)。

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

投稿記事 by 八咫烏 » 2018年7月29日(日) 15:11

MainClass↓
コード: 全て選択
   private int counter;

   @EventHandler
   public void onWeapon(PlayerInteractEvent e){

      Material m = e.getItem().getType();
      ItemStack itemStack = e.getItem();
      if(m == Material.STICK && itemStack.hasItemMeta() == true && e.getAction() == Action.RIGHT_CLICK_AIR ){


         counter = 5;
         new WeaponTask(this, counter ,e.getPlayer()).runTaskTimer(this, 0, 5);


         }

   }


サブクラス↓

コード: 全て選択
import org.bukkit.Sound;
import org.bukkit.entity.Player;
import org.bukkit.plugin.java.JavaPlugin;
import org.bukkit.scheduler.BukkitRunnable;

public class WeaponTask extends BukkitRunnable{

   private final JavaPlugin plugin;
   private int counter;
   private Player player;

   public WeaponTask(JavaPlugin plugin, int counter , Player player){

      this.plugin = plugin;

      if(counter < 1){

         throw new IllegalArgumentException("counter には1以上を指定してください。");

      }

      else{

         this.player = player;
         this.counter = counter;

      }

   }

   @SuppressWarnings("deprecation")
   @Override
   public void run(){

      if(counter > 0){

         player.throwSnowball();
         player.playSound(player.getLocation(), Sound.BLAZE_HIT, 10, 10);
         counter--;

      }

      else{

         plugin.getServer().broadcastMessage("ラストカウンター: " + counter);
         plugin.getServer().broadcastMessage("END");
         this.cancel();

      }

   }


これで、スノーボール発射するんですけど、右クリックで連射中にもう一度右クリックすると
かぶせて発射されてしまいます(2回分サブクラスが働く)
こうしないためにはどうすればいいんでしょうか。

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

投稿記事 by takepansan » 2018年7月21日(土) 13:21

TA3 さんが書きました:
takepansan さんが書きました:ExampleTask().runTaskLaterを使用するときに,Mainクラス以外で使うとnew ExampleTask().runTaskLater(this ,100);でエラーが出ます。解決方法はありますか?

JavaPluginを継承しているクラス以外ではPluginのparamとして自クラスのインスタンスを使用することができません。
javaPluginを継承しているMainクラスのインスタンスを保持してそれを使います。
コード: 全て選択
/*    Mainクラス    */
private static Main i;

@Override
public void onEnable(){
    i = this;
}

public static Main getInstance(){
    return i;
}

/*    別のクラス    */
public void delayTaskTest(){
    Main i = Main.getInstance();
    Bukkit.getScheduler().runTaskLater(i, new Runnable(){});
}


ありがとうございます。解決しました。

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

投稿記事 by TA3 » 2018年7月20日(金) 22:33

takepansan さんが書きました:ExampleTask().runTaskLaterを使用するときに,Mainクラス以外で使うとnew ExampleTask().runTaskLater(this ,100);でエラーが出ます。解決方法はありますか?

JavaPluginを継承しているクラス以外ではPluginのparamとして自クラスのインスタンスを使用することができません。
javaPluginを継承しているMainクラスのインスタンスを保持してそれを使います。
コード: 全て選択
/*    Mainクラス    */
private static Main i;

@Override
public void onEnable(){
    i = this;
}

public static Main getInstance(){
    return i;
}

/*    別のクラス    */
public void delayTaskTest(){
    Main i = Main.getInstance();
    Bukkit.getScheduler().runTaskLater(i, new Runnable(){});
}

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

投稿記事 by takepansan » 2018年7月20日(金) 22:23

ExampleTask().runTaskLaterを使用するときに,Mainクラス以外で使うとnew ExampleTask().runTaskLater(this ,100);でエラーが出ます。解決方法はありますか?

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

投稿記事 by amata1219 » 2018年7月18日(水) 17:43

ぺやんぐ さんが書きました:私は、色々なサイトから
コードを引っ張ってきてPluginを作っています。
ですが、エラーが出てしまいました。誰か助けてください(初心者です)
https://gyazo.com/b089aa11161b8cfb3d29c0784fcd93e9


ぺやんぐさん、こんにちは。
提示内容がエラーログだけですと推測は出来ようとも正確な回答が出来ません。
エラー自体は、java.lang.Stringオブジェクトを継承関係でないjava.utl.Mapにキャストしようとしたため発生しています。
エスパー回答はよろしくないのであまり言えませんが、PluginDescriptionFileクラスがエラー内容に散見される辺りplugin.ymlの記述に問題があると思われます。
すみませんが、ソースコードとplugin.ymlを載せた上で再度ご質問下さい。

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

投稿記事 by ぺやんぐ » 2018年7月17日(火) 18:09

私は、色々なサイトから
コードを引っ張ってきてPluginを作っています。
ですが、エラーが出てしまいました。誰か助けてください(初心者です)
https://gyazo.com/b089aa11161b8cfb3d29c0784fcd93e9

Re: 防具立てにプレイヤーが触れた時に発生するイベント

投稿記事 by Gattino » 2018年7月17日(火) 12:31

わかりにくくてすみません
if文の中で、手に持っているアイテムのデータ値を取得しようとして、getDate()を使おうとしたころ非推奨と出たので、返信させて頂きました
気をつけます

amata1219 さんが書きました:
Gattino さんが書きました:MaterialDateが最新版だと非推奨になっているのですが、最新版でも有効なもので、if文の条件式で判定に使えるようなやりかたってありますか?

amata1219 さんが書きました:Gattinoさん、こんにちは。

Gattino さんが書きました:防具立て(透明・重力の影響を受けない)にプレイヤーが触れた時に発生するイベントは、EntityInteractEventでいいのですか?
でも防具立て動いてないしなぁって悩んでます。


防具立ては少々特殊なエンティティですので、EntityInteractEventは発生せず代わりにPlayerArmorStandManipulateEventが発生します。

Gattino さんが書きました:(小さな)シダというアイテムがありますが、小さなシダはMaterialだと何に当たるのですか?
調べたんですけどよく分かりませんでした…


小さなシダは、Material.LONG_GRASSのデータ値2に該当します。
コード: 全て選択
block.setType(Material.LONG_GRASS);
block.setData((byte) 2);

Materialやデータ値等が不明な場合はPlayerInteractEventなんかを利用して表示させると簡単に分かると思います。
コード: 全て選択
@EventHandler
public void onPlayerInteractEvent(PlayerInteractEvent e){
if(e.getAction().toString().matches(".*BLOCK.*")){
System.out.println(e.getClickedBlock().getType());
}
}


block.setData(byte)は、見ての通りMaterialDataでなくbyte型の引数を必要とします。
また、非推奨であろうとBukkit/Spigotのメソッドでは代替出来るものがありませんので、@SuppressWarnings("deprecation")を記述しそのまま使用して下さい。

提示コード中に非推奨処理が一つだけ含まれていましたので回答しましたが、質問内容が非常に曖昧ですので、今後質問する際は具体的に何がどうなっているのか明記した上でお願いしますね。

Re: 防具立てにプレイヤーが触れた時に発生するイベント

投稿記事 by amata1219 » 2018年7月17日(火) 01:34

Gattino さんが書きました:MaterialDateが最新版だと非推奨になっているのですが、最新版でも有効なもので、if文の条件式で判定に使えるようなやりかたってありますか?

amata1219 さんが書きました:Gattinoさん、こんにちは。

Gattino さんが書きました:防具立て(透明・重力の影響を受けない)にプレイヤーが触れた時に発生するイベントは、EntityInteractEventでいいのですか?
でも防具立て動いてないしなぁって悩んでます。


防具立ては少々特殊なエンティティですので、EntityInteractEventは発生せず代わりにPlayerArmorStandManipulateEventが発生します。

Gattino さんが書きました:(小さな)シダというアイテムがありますが、小さなシダはMaterialだと何に当たるのですか?
調べたんですけどよく分かりませんでした…


小さなシダは、Material.LONG_GRASSのデータ値2に該当します。
コード: 全て選択
block.setType(Material.LONG_GRASS);
block.setData((byte) 2);

Materialやデータ値等が不明な場合はPlayerInteractEventなんかを利用して表示させると簡単に分かると思います。
コード: 全て選択
@EventHandler
public void onPlayerInteractEvent(PlayerInteractEvent e){
if(e.getAction().toString().matches(".*BLOCK.*")){
System.out.println(e.getClickedBlock().getType());
}
}


block.setData(byte)は、見ての通りMaterialDataでなくbyte型の引数を必要とします。
また、非推奨であろうとBukkit/Spigotのメソッドでは代替出来るものがありませんので、@SuppressWarnings("deprecation")を記述しそのまま使用して下さい。

提示コード中に非推奨処理が一つだけ含まれていましたので回答しましたが、質問内容が非常に曖昧ですので、今後質問する際は具体的に何がどうなっているのか明記した上でお願いしますね。

Re: 防具立てにプレイヤーが触れた時に発生するイベント

投稿記事 by Gattino » 2018年7月15日(日) 23:11

MaterialDateが最新版だと非推奨になっているのですが、最新版でも有効なもので、if文の条件式で判定に使えるようなやりかたってありますか?

amata1219 さんが書きました:Gattinoさん、こんにちは。

Gattino さんが書きました:防具立て(透明・重力の影響を受けない)にプレイヤーが触れた時に発生するイベントは、EntityInteractEventでいいのですか?
でも防具立て動いてないしなぁって悩んでます。


防具立ては少々特殊なエンティティですので、EntityInteractEventは発生せず代わりにPlayerArmorStandManipulateEventが発生します。

Gattino さんが書きました:(小さな)シダというアイテムがありますが、小さなシダはMaterialだと何に当たるのですか?
調べたんですけどよく分かりませんでした…


小さなシダは、Material.LONG_GRASSのデータ値2に該当します。
コード: 全て選択
block.setType(Material.LONG_GRASS);
block.setData((byte) 2);

Materialやデータ値等が不明な場合はPlayerInteractEventなんかを利用して表示させると簡単に分かると思います。
コード: 全て選択
@EventHandler
public void onPlayerInteractEvent(PlayerInteractEvent e){
if(e.getAction().toString().matches(".*BLOCK.*")){
System.out.println(e.getClickedBlock().getType());
}
}

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

投稿記事 by amata1219 » 2018年7月14日(土) 18:03

Gattino さんが書きました:任意の残留ポーションのItemStack型変数はどうやって作ればいいですか?


Gattinoさん、こんにちは。
アイテム自体は他と同じくMaterial指定でItemStackを生成し、効果はPotionMetaを使って編集します。
コード: 全て選択
ItemStack item = new ItemStack(Material.LINGERING_POTION);

PotionMeta pm = (PotionMeta) item.getItemMeta();

pm.addCustomEffect(new PotionEffect(PotionEffectType.SPEED, 1000, 2), true);
//new PotionEffect(PotionEffectType-効果の指定, int-効果時間の指定(tick単位[1s=20tick]), int-レベルの指定(レベル1は0)), boolean-パーティクルの有無);

pm.addCustomEffect(new PotionEffect(PotionEffectType.JUMP, 1000, 2), true);
//メソッド名にaddとある通り複数追加可能。

pm.setColor(Color.fromRGB(255, 255, 255));
//RGBでポーションカラーを指定

pm.setDisplayName(ChatColor.WHITE + "俊敏+");
//PotionMetaはItemMetaを継承しているので名前設定等も出来ます。

item.setItemMeta(pm);

エリアエフェクトクラウドの滞在時間等はエンティティでのみ設定可能ですので、アイテム側から設定することは出来ません。
それらの処理はLingeringPotionSplashEventを利用するといいと思います。

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

投稿記事 by Gattino » 2018年7月14日(土) 16:43

任意の残留ポーションのItemStack型変数はどうやって作ればいいですか?

Re: 防具立てにプレイヤーが触れた時に発生するイベント

投稿記事 by Gattino » 2018年7月14日(土) 15:52

amata1219 さんが書きました:Gattinoさん、こんにちは。

Gattino さんが書きました:防具立て(透明・重力の影響を受けない)にプレイヤーが触れた時に発生するイベントは、EntityInteractEventでいいのですか?
でも防具立て動いてないしなぁって悩んでます。


防具立ては少々特殊なエンティティですので、EntityInteractEventは発生せず代わりにPlayerArmorStandManipulateEventが発生します。

Gattino さんが書きました:(小さな)シダというアイテムがありますが、小さなシダはMaterialだと何に当たるのですか?
調べたんですけどよく分かりませんでした…


小さなシダは、Material.LONG_GRASSのデータ値2に該当します。
コード: 全て選択
block.setType(Material.LONG_GRASS);
block.setData((byte) 2);

Materialやデータ値等が不明な場合はPlayerInteractEventなんかを利用して表示させると簡単に分かると思います。
コード: 全て選択
@EventHandler
public void onPlayerInteractEvent(PlayerInteractEvent e){
if(e.getAction().toString().matches(".*BLOCK.*")){
System.out.println(e.getClickedBlock().getType());
}
}

ありがとうございましたm(_ _)m

ページトップ

x