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

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

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

投稿記事by amata1219 » 2018年10月02日(火) 21:23

signal さんが書きました:度々失礼いたします。
今盾をシフト+左クリックしたら近くのエンティティにtpして、ダメージを与えようとしていますが、
tpの仕方はわかったけれど反応せず、そしてダメージの与え方がわかりません。教えてください。
コード: 全て選択
public class Shieldskill extends JavaPlugin implements Listener
{
   //起動時
    public void onEnable()
    {
        super.onEnable();
        getServer().getPluginManager().registerEvents(this, this);
    }

    @EventHandler
    public void shield(PlayerInteractEvent event)
    {
       ItemStack item = event.getPlayer().getItemInHand();
       Player player = event.getPlayer();

       if (!event.getPlayer().isSneaking()) {
            return;
        }
       if (item.getType() == Material.SHIELD) {
          if (event.getAction() == Action.LEFT_CLICK_AIR)
          {
             player.getNearbyEntities(10, 10, 10);
             player.teleport((Location) player.getNearbyEntities(10, 10, 10));
          }
       }
    }
}

もしできるのならばプレイヤーを対象外にしたいです。


signalさん、こんにちは。
複数問題点がありますので順に説明させて頂きますね。

1. アイテムのnullチェックをする

プレイヤーが何も持っていない場合、Player#getItemInMainHand()はnullを返します。
そのため、nullチェックを行わずItemStack#getType()等の記述をするとNullPointerExceptionが発生してしまいます。
下記のように先にnullチェックをしておきましょう。
コード: 全て選択
if(item == null)return;


2. player.getNearbyEntities(double, double, double)から取得出来るList<Entity>はEntity単位で処理をする

Listに格納されたオブジェクトは一括で処理出来ませんので、for文を使いEntity単位で処理をしましょう。
コード: 全て選択
for(Entity entity :  player.getNearbyEntities(double, double, double)){
//変数entityを使って処理をする
}


3. Entity#teleport()はEntityまたはLocationを引数に入れる

List<Entity>をLocationでキャストしようとテレポート出来ませんので、2の方法で取得したEntityを引数に使いましょう。
コード: 全て選択
for(Entity entity :  player.getNearbyEntities(double, double, double)){
player.teleport(entity);
}


ダメージを与える処理はDamageable#damage(double)で行えます。
コード: 全て選択
entity.damage(double);


ところでこのままでは周辺のエンティティ全てに高速でテレポートする事になってしまいます。
ですが、ご質問された内容を見る限りではどのように近いのか不明ですので、申し訳ありませんがこれ以上の回答は控えさせて頂きます。
以上の情報とご自身の力、最低限の検索でどうにも出来ないようでしたら、何がどう出来ないのか明確にした上でまたご質問なさって下さい。
最後に編集したユーザー amata1219 [ 2018年10月05日(金) 02:21 ], 累計 1 回
アバター
amata1219
ID:9b64aeb8
石掘り
 
記事: 90
登録日時: 2016年11月18日(金) 16:46
お住まい: Enabling World

  • (PostNo.320775)

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

投稿記事by 匿名希望さん(男) » 2018年10月03日(水) 00:02

プラグインを勉強する上でおすすめのサイトを教えてください。
以前にもトピックを建てたのですが、解決しなければもう一回質問しなおしたほうがいいとのことで....
英語のやつだとちょっとわかりにくくて解決しませんでした
匿名希望さん(男)
ID:464f75a1
木を殴ってる
 
記事: 21
登録日時: 2018年9月18日(火) 18:40

  • (PostNo.320779)

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

投稿記事by natsuri.net » 2018年10月03日(水) 11:25

プレイヤーが向いている方向に0.1ブロックずつlocationを取得したいのですがどうすればいいのでしょうか。
natsuri.net
ID:7801d5b6
水から上がったとこ
 
記事: 3
登録日時: 2018年9月10日(月) 07:43

  • (PostNo.320809)

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

投稿記事by takumi_ » 2018年10月04日(木) 20:54

なんか急にプラグインが使えなくなったのでcodeはってみます。
赤の波線はひかれてません。なぜ使えないのか教えてください

コード: 全て選択
@EventHandler
    public void onPlayerInteractEvent(PlayerInteractEvent event)
   {
            // 手持ちのアイテムを取得
            ItemStack item = event.getPlayer().getItemInHand();
            Block block = event.getClickedBlock();
            double random = Math.random();
            List<String> 武器 = new ArrayList<String>();


            //SSR
            ItemStack SSR1 = new ItemStack(Material.DIAMOND_SWORD);
            ItemMeta SSR1_ = SSR1.getItemMeta();
            SSR1_.setDisplayName(ChatColor.RESET+"§1エ§2タ§3ー§4ナ§5ル§6=§8ソ§9ー§aド");
            武器.add("§8§r>>§e§rステータス");
         武器.add("§r武器タイプ: 片手剣");
         武器.add("§r要求値: 35");
         武器.add("§rダメージ: 25");
         武器.add("§rダメージ: 1260/1260");
         武器.add("§8§r>>§e§r説明");
         武器.add("§rガチャの神より生まれた剣");
         武器.add("§8§r>>§rレア度: SS");
         ((ItemMeta) SSR1).setLore(武器);
            SSR1.setItemMeta(SSR1_);
            //SSR
            ItemStack SSR2 = new ItemStack(Material.DIAMOND_AXE);
            ItemMeta SSR2_ = SSR2.getItemMeta();
            SSR2_.setDisplayName(ChatColor.RESET+"§1エ§2タ§3ー§4ナ§5ル§6=§8ア§9ッ§aク§bス");
            SSR2.setItemMeta(SSR2_);
            //SSR
            ItemStack SSR3 = new ItemStack(Material.SHIELD);
            ItemMeta SSR3_ = SSR3.getItemMeta();
            SSR3_.setDisplayName(ChatColor.RESET+"§1エ§2タ§3ー§4ナ§5ル§6=§8シ§9ー§aル§bド");
            SSR3.setItemMeta(SSR3_);
            //SSR
            ItemStack SSR4 = new ItemStack(Material.DIAMOND_HELMET);
            ItemMeta SSR4_ = SSR4.getItemMeta();
            SSR4_.setDisplayName(ChatColor.RESET+"§1エ§2タ§3ー§4ナ§5ル§6=§8ヘ§9ル§aメ§bッ§cト");
            SSR4.setItemMeta(SSR4_);
            //SSR
            ItemStack SSR5 = new ItemStack(Material.DIAMOND_CHESTPLATE);
            ItemMeta SSR5_ = SSR5.getItemMeta();
            SSR5_.setDisplayName(ChatColor.RESET+"§1エ§2タ§3ー§4ナ§5ル§6=§8チ§9ェ§aス§bト§cプ§dレ§fー§0ト");
            SSR5.setItemMeta(SSR5_);
            //SSR
            ItemStack SSR6 = new ItemStack(Material.DIAMOND_LEGGINGS);
            ItemMeta SSR6_ = SSR6.getItemMeta();
            SSR6_.setDisplayName(ChatColor.RESET+"§1エ§2タ§3ー§4ナ§5ル§6=§8レ§9ギ§aン§bス");
            SSR6.setItemMeta(SSR6_);
            //SSR
            ItemStack SSR7 = new ItemStack(Material.DIAMOND_BOOTS);
            ItemMeta SSR7_ = SSR7.getItemMeta();
            SSR7_.setDisplayName(ChatColor.RESET+"§1エ§2タ§3ー§4ナ§5ル§6=§8ブ§9ー§aツ");
            SSR7.setItemMeta(SSR7_);


            if (event.getHand() == EquipmentSlot.OFF_HAND) {return;}

            // 空気に対する右クリックか?
           if (event.getAction() == Action.RIGHT_CLICK_BLOCK)
            {
              if (block.getType() == Material.ENDER_PORTAL_FRAME){
               //手持ちのアイテムは紙か?
                   if (item.getType() == Material.PAPER)
                   {
                       if(item.getItemMeta().getDisplayName().equals(ChatColor.RESET+"ガチャ券"))
                       {
                          event.getPlayer().getWorld().playSound(event.getPlayer().getLocation(), Sound.BLOCK_CHEST_OPEN,1,1);
                              event.getPlayer().getItemInHand().setAmount(event.getPlayer().getItemInHand().getAmount()-1);
                               if(random *10 >= 9)
                               {
                                  event.getPlayer().getWorld().playSound(event.getPlayer().getLocation(), Sound.ENTITY_ENDERDRAGON_DEATH,1,1);
                                  event.getPlayer().getInventory().addItem(SSR1);
                                  Bukkit.broadcastMessage(event.getPlayer().getDisplayName()+ChatColor.RESET +"が§6ガチャ最高級"+ChatColor.RESET+"の剣を入手しました。");
                               }else if(random *10 >= 7)
                               {
                                  event.getPlayer().getWorld().playSound(event.getPlayer().getLocation(), Sound.ENTITY_ENDERDRAGON_DEATH,1,1);
                                  event.getPlayer().getInventory().addItem(SSR2);
                                  Bukkit.broadcastMessage(event.getPlayer().getDisplayName()+ChatColor.RESET +"が§6ガチャ最高級"+ChatColor.RESET+"の斧を入手しました。");
                               }else if(random *10 >= 5)
                               {   event.getPlayer().getWorld().playSound(event.getPlayer().getLocation(), Sound.ENTITY_ENDERDRAGON_DEATH,1,1);
                                 event.getPlayer().getInventory().addItem(SSR3);
                                  Bukkit.broadcastMessage(event.getPlayer().getDisplayName()+ChatColor.RESET +"が§6ガチャ最高級"+ChatColor.RESET+"の盾を入手しました。");
                                  event.getPlayer().sendMessage("盾に模様がつけられなかったよ...ごめんな");
                                }else if(random *10 >= 4)
                                {
                                  event.getPlayer().getWorld().playSound(event.getPlayer().getLocation(), Sound.ENTITY_ENDERDRAGON_DEATH,1,1);
                                  event.getPlayer().getInventory().addItem(SSR4);
                                   Bukkit.broadcastMessage(event.getPlayer().getDisplayName()+ChatColor.RESET +"が§6ガチャ最高級"+ChatColor.RESET+"のヘルメットを入手しました。");
                                }else if(random *10 >= 3)
                                {
                                  event.getPlayer().getWorld().playSound(event.getPlayer().getLocation(), Sound.ENTITY_ENDERDRAGON_DEATH,1,1);
                                   event.getPlayer().getInventory().addItem(SSR5);
                                    Bukkit.broadcastMessage(event.getPlayer().getDisplayName()+ChatColor.RESET +"が§6ガチャ最高級"+ChatColor.RESET+"のチェストプレートを入手しました。");
                                }else if(random *10 >= 2)
                                {
                                  event.getPlayer().getWorld().playSound(event.getPlayer().getLocation(), Sound.ENTITY_ENDERDRAGON_DEATH,1,1);
                                event.getPlayer().getInventory().addItem(SSR6);
                                 Bukkit.broadcastMessage(event.getPlayer().getDisplayName()+ChatColor.RESET +"が§6ガチャ最高級"+ChatColor.RESET+"のレギンスを入手しました。");
                                }else if(random *10 >= 1)
                                {
                                   event.getPlayer().getWorld().playSound(event.getPlayer().getLocation(), Sound.ENTITY_ENDERDRAGON_DEATH,1,1);
                                 event.getPlayer().getInventory().addItem(SSR7);
                                  Bukkit.broadcastMessage(event.getPlayer().getDisplayName()+ChatColor.RESET +"が§6ガチャ最高級"+ChatColor.RESET+"ブーツを入手しました。");
                                }
                       }else event.getPlayer().sendMessage("その紙はガチャでは使えません");
                   }
              }
            }
   }
takumi_
ID:3592cf64
水から上がったとこ
 
記事: 10
登録日時: 2018年9月24日(月) 20:52

  • (PostNo.320821)

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

投稿記事by amata1219 » 2018年10月05日(金) 01:11

匿名希望さん(男) さんが書きました:プラグインを勉強する上でおすすめのサイトを教えてください。
以前にもトピックを建てたのですが、解決しなければもう一回質問しなおしたほうがいいとのことで....
英語のやつだとちょっとわかりにくくて解決しませんでした


匿名希望さん(男)さん、こんにちは。

日本語訳されたプラグインチュートリアルはご覧になりました?
その他にも、動作するプラグインを作るまでの手順を解説されているチュートリアルは日本語記事でもいくつか存在はします。
ですが、それらに記載されていない内容となりますと基本英語で検索しないと大体どうしようもないと思います。
わかりづらい、を理由に逃げてしまってはそれこそ一向に解決出来ません。
英語が読めないなら読めないなりにGoogle翻訳を使うなりして、貪欲にでも情報を得る努力をしましょう。

ところで、同内容のトピックが立てられたままの状態、即ちマルチポストになっていますので、早いところフォーラムルールに従って解決しておいた方が良いと思います。

natsuri.net さんが書きました:プレイヤーが向いている方向に0.1ブロックずつlocationを取得したいのですがどうすればいいのでしょうか。


natsuri.netさん、こんにちは。

URLの記載だけで申し訳ありませんが、こちらの記事(Hitboxes and Ray Tracing by CJP10)が非常に役立つかと思われます。

takumi_ さんが書きました:なんか急にプラグインが使えなくなったのでcodeはってみます。
赤の波線はひかれてません。なぜ使えないのか教えてください

コード: 全て選択
@EventHandler
    public void onPlayerInteractEvent(PlayerInteractEvent event)
   {
            // 手持ちのアイテムを取得
            ItemStack item = event.getPlayer().getItemInHand();
            Block block = event.getClickedBlock();
            double random = Math.random();
            List<String> 武器 = new ArrayList<String>();


            //SSR
            ItemStack SSR1 = new ItemStack(Material.DIAMOND_SWORD);
            ItemMeta SSR1_ = SSR1.getItemMeta();
            SSR1_.setDisplayName(ChatColor.RESET+"§1エ§2タ§3ー§4ナ§5ル§6=§8ソ§9ー§aド");
            武器.add("§8§r>>§e§rステータス");
         武器.add("§r武器タイプ: 片手剣");
         武器.add("§r要求値: 35");
         武器.add("§rダメージ: 25");
         武器.add("§rダメージ: 1260/1260");
         武器.add("§8§r>>§e§r説明");
         武器.add("§rガチャの神より生まれた剣");
         武器.add("§8§r>>§rレア度: SS");
         ((ItemMeta) SSR1).setLore(武器);
            SSR1.setItemMeta(SSR1_);
            //SSR
            ItemStack SSR2 = new ItemStack(Material.DIAMOND_AXE);
            ItemMeta SSR2_ = SSR2.getItemMeta();
            SSR2_.setDisplayName(ChatColor.RESET+"§1エ§2タ§3ー§4ナ§5ル§6=§8ア§9ッ§aク§bス");
            SSR2.setItemMeta(SSR2_);
            //SSR
            ItemStack SSR3 = new ItemStack(Material.SHIELD);
            ItemMeta SSR3_ = SSR3.getItemMeta();
            SSR3_.setDisplayName(ChatColor.RESET+"§1エ§2タ§3ー§4ナ§5ル§6=§8シ§9ー§aル§bド");
            SSR3.setItemMeta(SSR3_);
            //SSR
            ItemStack SSR4 = new ItemStack(Material.DIAMOND_HELMET);
            ItemMeta SSR4_ = SSR4.getItemMeta();
            SSR4_.setDisplayName(ChatColor.RESET+"§1エ§2タ§3ー§4ナ§5ル§6=§8ヘ§9ル§aメ§bッ§cト");
            SSR4.setItemMeta(SSR4_);
            //SSR
            ItemStack SSR5 = new ItemStack(Material.DIAMOND_CHESTPLATE);
            ItemMeta SSR5_ = SSR5.getItemMeta();
            SSR5_.setDisplayName(ChatColor.RESET+"§1エ§2タ§3ー§4ナ§5ル§6=§8チ§9ェ§aス§bト§cプ§dレ§fー§0ト");
            SSR5.setItemMeta(SSR5_);
            //SSR
            ItemStack SSR6 = new ItemStack(Material.DIAMOND_LEGGINGS);
            ItemMeta SSR6_ = SSR6.getItemMeta();
            SSR6_.setDisplayName(ChatColor.RESET+"§1エ§2タ§3ー§4ナ§5ル§6=§8レ§9ギ§aン§bス");
            SSR6.setItemMeta(SSR6_);
            //SSR
            ItemStack SSR7 = new ItemStack(Material.DIAMOND_BOOTS);
            ItemMeta SSR7_ = SSR7.getItemMeta();
            SSR7_.setDisplayName(ChatColor.RESET+"§1エ§2タ§3ー§4ナ§5ル§6=§8ブ§9ー§aツ");
            SSR7.setItemMeta(SSR7_);


            if (event.getHand() == EquipmentSlot.OFF_HAND) {return;}

            // 空気に対する右クリックか?
           if (event.getAction() == Action.RIGHT_CLICK_BLOCK)
            {
              if (block.getType() == Material.ENDER_PORTAL_FRAME){
               //手持ちのアイテムは紙か?
                   if (item.getType() == Material.PAPER)
                   {
                       if(item.getItemMeta().getDisplayName().equals(ChatColor.RESET+"ガチャ券"))
                       {
                          event.getPlayer().getWorld().playSound(event.getPlayer().getLocation(), Sound.BLOCK_CHEST_OPEN,1,1);
                              event.getPlayer().getItemInHand().setAmount(event.getPlayer().getItemInHand().getAmount()-1);
                               if(random *10 >= 9)
                               {
                                  event.getPlayer().getWorld().playSound(event.getPlayer().getLocation(), Sound.ENTITY_ENDERDRAGON_DEATH,1,1);
                                  event.getPlayer().getInventory().addItem(SSR1);
                                  Bukkit.broadcastMessage(event.getPlayer().getDisplayName()+ChatColor.RESET +"が§6ガチャ最高級"+ChatColor.RESET+"の剣を入手しました。");
                               }else if(random *10 >= 7)
                               {
                                  event.getPlayer().getWorld().playSound(event.getPlayer().getLocation(), Sound.ENTITY_ENDERDRAGON_DEATH,1,1);
                                  event.getPlayer().getInventory().addItem(SSR2);
                                  Bukkit.broadcastMessage(event.getPlayer().getDisplayName()+ChatColor.RESET +"が§6ガチャ最高級"+ChatColor.RESET+"の斧を入手しました。");
                               }else if(random *10 >= 5)
                               {   event.getPlayer().getWorld().playSound(event.getPlayer().getLocation(), Sound.ENTITY_ENDERDRAGON_DEATH,1,1);
                                 event.getPlayer().getInventory().addItem(SSR3);
                                  Bukkit.broadcastMessage(event.getPlayer().getDisplayName()+ChatColor.RESET +"が§6ガチャ最高級"+ChatColor.RESET+"の盾を入手しました。");
                                  event.getPlayer().sendMessage("盾に模様がつけられなかったよ...ごめんな");
                                }else if(random *10 >= 4)
                                {
                                  event.getPlayer().getWorld().playSound(event.getPlayer().getLocation(), Sound.ENTITY_ENDERDRAGON_DEATH,1,1);
                                  event.getPlayer().getInventory().addItem(SSR4);
                                   Bukkit.broadcastMessage(event.getPlayer().getDisplayName()+ChatColor.RESET +"が§6ガチャ最高級"+ChatColor.RESET+"のヘルメットを入手しました。");
                                }else if(random *10 >= 3)
                                {
                                  event.getPlayer().getWorld().playSound(event.getPlayer().getLocation(), Sound.ENTITY_ENDERDRAGON_DEATH,1,1);
                                   event.getPlayer().getInventory().addItem(SSR5);
                                    Bukkit.broadcastMessage(event.getPlayer().getDisplayName()+ChatColor.RESET +"が§6ガチャ最高級"+ChatColor.RESET+"のチェストプレートを入手しました。");
                                }else if(random *10 >= 2)
                                {
                                  event.getPlayer().getWorld().playSound(event.getPlayer().getLocation(), Sound.ENTITY_ENDERDRAGON_DEATH,1,1);
                                event.getPlayer().getInventory().addItem(SSR6);
                                 Bukkit.broadcastMessage(event.getPlayer().getDisplayName()+ChatColor.RESET +"が§6ガチャ最高級"+ChatColor.RESET+"のレギンスを入手しました。");
                                }else if(random *10 >= 1)
                                {
                                   event.getPlayer().getWorld().playSound(event.getPlayer().getLocation(), Sound.ENTITY_ENDERDRAGON_DEATH,1,1);
                                 event.getPlayer().getInventory().addItem(SSR7);
                                  Bukkit.broadcastMessage(event.getPlayer().getDisplayName()+ChatColor.RESET +"が§6ガチャ最高級"+ChatColor.RESET+"ブーツを入手しました。");
                                }
                       }else event.getPlayer().sendMessage("その紙はガチャでは使えません");
                   }
              }
            }
   }


takumi_さん、こんにちは。

質問内容が曖昧過ぎます。
本来どうあるべき処理がどのように使えないのか、エラーが出ているのであればエラーログも併せて提示して頂かないと回答のしようがありません。
アバター
amata1219
ID:e2e59687
石掘り
 
記事: 90
登録日時: 2016年11月18日(金) 16:46
お住まい: Enabling World

  • (PostNo.320844)

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

投稿記事by hmbgh » 2018年10月06日(土) 01:16

アイテムに情報を持たせることはできますか?
また複数の方法があったら他の方法も教えてほしいです...
よろしくお願いします
hmbgh
ID:b93da72c
水から上がったとこ
 
記事: 3
登録日時: 2018年9月09日(日) 00:02

  • (PostNo.320845)

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

投稿記事by TA3 » 2018年10月06日(土) 01:40

hmbgh さんが書きました:アイテムに情報を持たせることはできますか?
また複数の方法があったら他の方法も教えてほしいです...
よろしくお願いします


NBTタグを持たせてみては如何でしょう
以下のページに詳しく掲載されているので興味があればどうぞ
http://sp.ch.nicovideo.jp/ICESOFT42_Blo ... a/ar910831

1.8の記事ですが、nms使用箇所をお使いのバージョンのnmsに書き換えれば動作します。
アバター
TA3
ID:a95d26b2
木を殴ってる
 
記事: 22
登録日時: 2016年8月18日(木) 17:44

  • (PostNo.320850)

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

投稿記事by hmbgh » 2018年10月06日(土) 05:22

TA3 さんが書きました:
hmbgh さんが書きました:アイテムに情報を持たせることはできますか?
また複数の方法があったら他の方法も教えてほしいです...
よろしくお願いします


NBTタグを持たせてみては如何でしょう
以下のページに詳しく掲載されているので興味があればどうぞ
http://sp.ch.nicovideo.jp/ICESOFT42_Blo ... a/ar910831

1.8の記事ですが、nms使用箇所をお使いのバージョンのnmsに書き換えれば動作します。


自分の分かりにくい日本語にもかかわらずこんなに早く回答を頂けて嬉しいです
無事解決しそうです。回答ありがとうございました
hmbgh
ID:b93da72c
水から上がったとこ
 
記事: 3
登録日時: 2018年9月09日(日) 00:02

  • (PostNo.320937)

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

投稿記事by testusuke » 2018年10月08日(月) 12:42

mcgoさんamata1219さん無事解決しました。ありがとうございます
testusuke
ID:04803fb2
木を殴ってる
 
記事: 11
登録日時: 2018年8月07日(火) 15:02

  • (PostNo.320997)

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

投稿記事by signal » 2018年10月10日(水) 20:45

プレイヤーの見ている方向を取得してみたく、検索しましたが、どれも僕にとってはわかりにくいものだったので、考えてやってみようと思った結果
コード: 全て選択
package test;

import org.bukkit.Material;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.block.Action;
import org.bukkit.event.player.PlayerInteractEvent;
import org.bukkit.inventory.ItemStack;
import org.bukkit.plugin.java.JavaPlugin;
import org.bukkit.util.Vector;

public class Test extends JavaPlugin implements Listener
{
   @Override
   public void onEnable(){
       this.getServer().getPluginManager().registerEvents(this, this);
   }

   @EventHandler
    public void shield(PlayerInteractEvent event)
    {
       ItemStack item = event.getPlayer().getItemInHand();
       Player player = event.getPlayer();
       if(item == null)return;

       if (!event.getPlayer().isSneaking()) {
            return;
        }
       if (item.getType() == Material.WOOD_SWORD) {
          if (event.getAction() == Action.RIGHT_CLICK_AIR)
          {
             double yaw = player.getLocation().getYaw();
             if(yaw <= 337.5)
             {
                player.setVelocity(new Vector(1.5, 0, 1.75));
             }
          }
       }
    }
}

こうなりifの後に続くのを永遠にやらないといけなかったので、もう少し簡単な方法があれば教えてください。
signal
ID:3592cf64
木を殴ってる
 
記事: 22
登録日時: 2018年9月25日(火) 20:48

  • (PostNo.320999)

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

投稿記事by spuash918 » 2018年10月10日(水) 20:59

signal さんが書きました:プレイヤーの見ている方向を取得してみたく、検索しましたが、どれも僕にとってはわかりにくいものだったので、考えてやってみようと思った結果
コード: 全て選択
package test;

import org.bukkit.Material;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.block.Action;
import org.bukkit.event.player.PlayerInteractEvent;
import org.bukkit.inventory.ItemStack;
import org.bukkit.plugin.java.JavaPlugin;
import org.bukkit.util.Vector;

public class Test extends JavaPlugin implements Listener
{
   @Override
   public void onEnable(){
       this.getServer().getPluginManager().registerEvents(this, this);
   }

   @EventHandler
    public void shield(PlayerInteractEvent event)
    {
       ItemStack item = event.getPlayer().getItemInHand();
       Player player = event.getPlayer();
       if(item == null)return;

       if (!event.getPlayer().isSneaking()) {
            return;
        }
       if (item.getType() == Material.WOOD_SWORD) {
          if (event.getAction() == Action.RIGHT_CLICK_AIR)
          {
             double yaw = player.getLocation().getYaw();
             if(yaw <= 337.5)
             {
                player.setVelocity(new Vector(1.5, 0, 1.75));
             }
          }
       }
    }
}

こうなりifの後に続くのを永遠にやらないといけなかったので、もう少し簡単な方法があれば教えてください。

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

  • (PostNo.321006)

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

投稿記事by signal » 2018年10月11日(木) 14:03

spuash918 さんが書きました:
signal さんが書きました:プレイヤーの見ている方向を取得してみたく、検索しましたが、どれも僕にとってはわかりにくいものだったので、考えてやってみようと思った結果
コード: 全て選択
package test;

import org.bukkit.Material;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.block.Action;
import org.bukkit.event.player.PlayerInteractEvent;
import org.bukkit.inventory.ItemStack;
import org.bukkit.plugin.java.JavaPlugin;
import org.bukkit.util.Vector;

public class Test extends JavaPlugin implements Listener
{
   @Override
   public void onEnable(){
       this.getServer().getPluginManager().registerEvents(this, this);
   }

   @EventHandler
    public void shield(PlayerInteractEvent event)
    {
       ItemStack item = event.getPlayer().getItemInHand();
       Player player = event.getPlayer();
       if(item == null)return;

       if (!event.getPlayer().isSneaking()) {
            return;
        }
       if (item.getType() == Material.WOOD_SWORD) {
          if (event.getAction() == Action.RIGHT_CLICK_AIR)
          {
             double yaw = player.getLocation().getYaw();
             if(yaw <= 337.5)
             {
                player.setVelocity(new Vector(1.5, 0, 1.75));
             }
          }
       }
    }
}

こうなりifの後に続くのを永遠にやらないといけなかったので、もう少し簡単な方法があれば教えてください。

違っていたら申し訳ないのですが、Player.getLocation().getDirection()にて取得できるようです


.getDirection()で検索したら使い方が出てきました。ありがとうございます。
signal
ID:3592cf64
木を殴ってる
 
記事: 22
登録日時: 2018年9月25日(火) 20:48

  • (PostNo.321009)

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

投稿記事by signal » 2018年10月11日(木) 18:58

度々失礼します。
コード: 全て選択
for(Entity receiver :  player.getNearbyEntities(10, 1, 10))

↑このようなもので半径10?を取得できたのですが、
半径10以下、半径8以上とするにはどうしたらいいですか?
思いつく限りで試したのですがforの前にifをつけるとエラーが出てしまうので...
(言いたいことが伝わらなかった人のために)
自分をxとして、
半径8<=x<=半径10 こういうものを作りたいのです。
追記
上でいうreceiverをプレイヤーにする方法はありませんか?
上のEntityをPlayerにしたら波線が出て...という繰り返しになってしまいます。
signal
ID:3592cf64
木を殴ってる
 
記事: 22
登録日時: 2018年9月25日(火) 20:48

  • (PostNo.321010)

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

投稿記事by 匿名希望さん(男) » 2018年10月11日(木) 19:08

ありがとうございます
これから頑張ります
匿名希望さん(男)
ID:464f75a1
木を殴ってる
 
記事: 21
登録日時: 2018年9月18日(火) 18:40

  • (PostNo.321011)

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

投稿記事by 匿名希望さん(男) » 2018年10月11日(木) 19:11

質問です
コード: 全て選択
package my.test.plugin.tutorialplugin;
 
import org.bukkit.plugin.java.JavaPlugin;
 
public class TutorialPlugin extends JavaPlugin {
 
    @Override
    public void onEnable() {
        // TODO ここにプラグインが実行された時の内容を書く
    }
 
    @Override
    public void onDisable() {
        // TODO ここにプラグインが無効化された時の内容を書く
    }
}

こんな解釈であってるんでしょうか?
また、無効化された時の内容っていまいち想像がつかないんですけど、どういう時に書くんでしょうか
匿名希望さん(男)
ID:464f75a1
木を殴ってる
 
記事: 21
登録日時: 2018年9月18日(火) 18:40

  • (PostNo.321013)

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

投稿記事by 匿名希望さん(男) » 2018年10月11日(木) 19:28

イベントリスナっていうのは、onEnable内に書くんですか?
あと、イベントハンドラーはプラグインの優先順位を書くものですか?
例えばすべてのブロックが破壊できないプラグインと一部のブロックだけ破壊できるプラグインが
あったとして仮に一部のブロックだけ破壊できるプラグインのほうが優先順位が高いとしたら破壊できるみたいな感じですか?
あとイベントリスナの登録って項目がよくわかりません。https://mcmodding.jp/modding/index.php/%E6%96%B0%E3%81%97%E3%81%84EventSystem%E3%81%AE%E4%BD%BF%E3%81%84%E6%96%B9
もう少しよく読んだほうがいいですかね?もしわかりやすく解説してくださる方がいたら解説お願いします。
匿名希望さん(男)
ID:464f75a1
木を殴ってる
 
記事: 21
登録日時: 2018年9月18日(火) 18:40

  • (PostNo.321024)

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

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

signal さんが書きました:度々失礼します。
コード: 全て選択
for(Entity receiver :  player.getNearbyEntities(10, 1, 10))

↑このようなもので半径10?を取得できたのですが、
半径10以下、半径8以上とするにはどうしたらいいですか?
思いつく限りで試したのですがforの前にifをつけるとエラーが出てしまうので...
(言いたいことが伝わらなかった人のために)
自分をxとして、
半径8<=x<=半径10 こういうものを作りたいのです。
追記
上でいうreceiverをプレイヤーにする方法はありませんか?
上のEntityをPlayerにしたら波線が出て...という繰り返しになってしまいます。


signalさん、こんにちは。

半径10m以内に存在するエンティティを取得した上で、各エンティティの座標と中心となるプレイヤーの座標の差が8以上であれば、何らかの処理をするという形にすれば出来ると思います(正直これについてはアイディア的な問題な気もしますが…)。

座標の差はわざわざ計算処理を記述せずとも、Location#distance(Location)を使えば求められます。
コード: 全て選択
for(Entity entity : player.getNearbyEntities(10, 1, 10)){
if(player.getLocation().distance(entity.getLocation()) >= 8){
//何らかの処理
}
}


また、EntityをPlayerとして扱いたい場合はエンティティがプレイヤーであるかを確認した上でキャストしましょう。
コード: 全て選択
if(entity instanceof Player){
//プレイヤーである場合
Player player = (Player) entity;
//これでplayer.sendMessage("");等が行える
}else{
//プレイヤーでない場合
}


ところで、前回のご質問は解決されたのでしょうか?
マナー的な話になりますがせめて結果ぐらい書き残すのと、お礼も言えるようになりましょう。


匿名希望さん(男) さんが書きました:質問です
コード: 全て選択
package my.test.plugin.tutorialplugin;
 
import org.bukkit.plugin.java.JavaPlugin;
 
public class TutorialPlugin extends JavaPlugin {
 
    @Override
    public void onEnable() {
        // TODO ここにプラグインが実行された時の内容を書く
    }
 
    @Override
    public void onDisable() {
        // TODO ここにプラグインが無効化された時の内容を書く
    }
}

こんな解釈であってるんでしょうか?
また、無効化された時の内容っていまいち想像がつかないんですけど、どういう時に書くんでしょうか


匿名希望(男)さん、こんにちは。
onEnable()はプラグインが読み込まれた時(サーバー起動時、リロード時、PlugMan等の他プラグインから起動させされた時)に実行されるメソッドです。
個人的には必要なデータをロードしたりコマンドの登録を行ったりする処理多い場所だと思います。
対してonDisable()はプラグインが読み込まれなくなった時(サーバー終了時、リロード時、PlugMan等の他プラグインから終了させられた時)に実行されるメソッドで、こちらはonEnable()に対してデータのセーブなんかを行う処理が多い場所だと思います。

匿名希望さん(男) さんが書きました:イベントリスナっていうのは、onEnable内に書くんですか?
あと、イベントハンドラーはプラグインの優先順位を書くものですか?
例えばすべてのブロックが破壊できないプラグインと一部のブロックだけ破壊できるプラグインが
あったとして仮に一部のブロックだけ破壊できるプラグインのほうが優先順位が高いとしたら破壊できるみたいな感じですか?
あとイベントリスナの登録って項目がよくわかりません。https://mcmodding.jp/modding/index.php/%E6%96%B0%E3%81%97%E3%81%84EventSystem%E3%81%AE%E4%BD%BF%E3%81%84%E6%96%B9
もう少しよく読んだほうがいいですかね?もしわかりやすく解説してくださる方がいたら解説お願いします。


イベントリスナーはMinecraft内で何らかのアクション(ブロックの破壊、エンティティの死亡、インベントリ操作)が起きた際に発生するイベントを受け取り、メソッド内に記述された処理をするものです。
ですからonEnable()に記述するものではありません。

イベントハンドラーはイベントリスナーを呼び出す優先度を示す物です。
コード: 全て選択
EventPriority.LOWEST
EventPriority.LOW
EventPriority.NORMAL
EventPriority.HIGH
EventPriority.HIGHEST
EventPriority.MONITOR

優先度にはこれだけの種類があり、LOWESTが一番最初に呼び出された後、上から下へ順に呼び出され最後にMONITORが呼び出されます。

下記コードの場合、EventPriority.LOWであるonDamageA()が先に呼び出され、その処理が完了次第onDamageB()が呼び出されます。

コード: 全て選択
@EventHandler(EventPriority.HIGH)
public void onDamageB(EntityDamageByEntityEvent e){

}

@EventHandler(EventPriority.LOW)
public void onDamageA(EntityDamageByEntityEvent e){

}


例えを出すと、AプラグインがonDamageA()でイベントから取得出来る値(ここではダメージ量)を書き換えた場合、BプラグインがonDamageB()でイベントから取得出来る値はAプラグインが書き換えたダメージ量になります。また、Bプラグインがそこでその値を書き換える事も出来ます。その場合、最終的な値はBプラグインが書き換えた値になります。
Minecraft内では対象のエンティティにBプラグインにより設定された値に等しいダメージ量が与えられます。

ちなみに、@EventHandlerと優先度を何も指定せず記述した場合はEventPriority.NORMALと同じ優先度になります。
また、EntityDamageByEntityEventはエンティティがエンティティによりダメージを受けた場合に発生するイベントです。

イベントリスナーの登録とは、イベントに対して処理をするメソッドが実装されたクラスがどれであるかをSpigotに教える処理です。
登録自体はいつでも出来るのですが、onEnable()で登録をする事でMinecraft内で発生したアクションに対して常に処理を行えます。

onDamageA()がEventListenerというクラス内に実装されていた場合、
コード: 全て選択
@Override
public void onEnable(){
getServer().getPluginManager().registerEvents(new EventListener(), this);
}


と記述する事で登録を行えます。

また、EventListenerクラスは下記の様に書き換えておく必要があります(「」は省いて下さい)。
コード: 全て選択
public class EventListener 「implements Listener」 {


「」で囲まれている部分が追記した物になります。
これが記述されていないとイベントを受け取る事が出来ません。
最後に編集したユーザー amata1219 [ 2018年10月12日(金) 19:13 ], 累計 3 回
アバター
amata1219
ID:9b3a9c57
石掘り
 
記事: 90
登録日時: 2016年11月18日(金) 16:46
お住まい: Enabling World

  • (PostNo.321025)

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

投稿記事by 匿名希望さん(男) » 2018年10月12日(金) 18:32

なるほど
わかりやすい解説ありがとうございます
匿名希望さん(男)
ID:464f75a1
木を殴ってる
 
記事: 21
登録日時: 2018年9月18日(火) 18:40

  • (PostNo.321026)

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

投稿記事by signal » 2018年10月12日(金) 18:39

amata1219 さんが書きました:
signal さんが書きました:度々失礼します。
コード: 全て選択
for(Entity receiver :  player.getNearbyEntities(10, 1, 10))

↑このようなもので半径10?を取得できたのですが、
半径10以下、半径8以上とするにはどうしたらいいですか?
思いつく限りで試したのですがforの前にifをつけるとエラーが出てしまうので...
(言いたいことが伝わらなかった人のために)
自分をxとして、
半径8<=x<=半径10 こういうものを作りたいのです。
追記
上でいうreceiverをプレイヤーにする方法はありませんか?
上のEntityをPlayerにしたら波線が出て...という繰り返しになってしまいます。


signalさん、こんにちは。

半径10m以内に存在するエンティティを取得した上で、各エンティティの座標と中心となるプレイヤーの座標の差が8以上であれば、何らかの処理をするという形にすれば出来ると思います(正直これについてはアイディア的な問題な気もしますが…)。

座標の差はわざわざ計算処理を記述せずとも、Location#distance(Location)を使えば求められます。
コード: 全て選択
for(Entity entity : player.getNearbyEntities(10, 1, 10)){
if(player.getLocation().distance(entity.getLocation() >= 8){
//何らかの処理
}
}


また、EntityをPlayerとして扱いたい場合はエンティティがプレイヤーであるかを確認した上でキャストしましょう。
コード: 全て選択
if(entity instanceof Player){
//プレイヤーである場合
Player player = (Player) entity;
//これでplayer.sendMessage("");等が行える
}else{
//プレイヤーでない場合
}



そういえば下書きのままで止まっていました...
それで無事解決いたしました。ありがとうございます。
質問の答えに質問で返すのはなんだかな...と思いましたが、力不足でどうしようもないなと思ったのでお願いします。
演算子 >= は引数の型 Location, int で未定義です。
と出て出来ませんでした。
再度お願いします
signal
ID:ad6fdda5
木を殴ってる
 
記事: 22
登録日時: 2018年9月25日(火) 20:48

  • (PostNo.321027)

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

投稿記事by spuash918 » 2018年10月12日(金) 18:52

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


そういえば下書きのままで止まっていました...
それで無事解決いたしました。ありがとうございます。
質問の答えに質問で返すのはなんだかな...と思いましたが、力不足でどうしようもないなと思ったのでお願いします。
演算子 >= は引数の型 Location, int で未定義です。
と出て出来ませんでした。
再度お願いします

Javaについてどれほど理解されていますか?
プラグインを開発されるのであれば基本的な部分、最低でもメソッドやインスタンスのようなオブジェクト指向までは抑えて置くべきです

ちなみに回答ですが、
コード: 全て選択
if(player.getLocation().distance(entity.getLocation() >= 8)

の「)」が不足しているため、変なところで比較しています
コード: 全て選択
if(player.getLocation().distance(entity.getLocation()) >= 8)

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

1つ前へ次へ

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

x