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

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

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

投稿記事by amata1219 » 2018年12月10日(月) 18:21

signal さんが書きました:保存できるインベントリを作りたいと思い、
コード: 全て選択
FileConfiguration config = getConfig();
      saveDefaultConfig();
      if(e.getInventory().getName().equalsIgnoreCase("§r個人チェスト No.1"))
      {
         for(int x=0; x<=53; x++)
         {
            config.set("zzzzz"+e.getPlayer().getName()+e.getPlayer()+e.getInventory().getName(), e.getInventory().getItem(x));
            saveConfig();
            reloadConfig();
            if(x >= 53) {
               x=0;
            }
         }
      }
      if(e.getInventory().getName().equalsIgnoreCase("§r個人チェスト No.2"))
      {
         for(int x=0; x<=53; x++)
         {
            config.set("zzzzz"+e.getPlayer().getName()+e.getPlayer()+e.getInventory().getName(), e.getInventory().getItem(x));
            saveConfig();
            reloadConfig();
            if(x >= 53) {
               x=0;
            }
         }
      }
      if(e.getInventory().getName().equalsIgnoreCase("§r個人チェスト No.3"))
      {
         for(int x=0; x<=53; x++)
         {
            config.set("zzzzz"+e.getPlayer().getName()+e.getPlayer()+e.getInventory().getName(), e.getInventory().getItem(x));
            saveConfig();
            reloadConfig();
            if(x >= 53) {
               x=0;
            }
         }
      }
      if(e.getInventory().getName().equalsIgnoreCase("§r個人チェスト No.4"))
      {
         for(int x=0; x<=53; x++)
         {
            config.set("zzzzz"+e.getPlayer().getName()+e.getPlayer()+e.getInventory().getName(), e.getInventory().getItem(x));
            saveConfig();
            reloadConfig();
            if(x >= 53) {
               x=0;
            }
         }
      }

こうやって保存をして、読み取りもこれを取り出してという感じで検討してみたのですが、for文を何個も用いていることから落ちてしましました。
そこで調べてみるとBukkitObjectOutputStreamと本体にあるBase64Coderでシリアライズするというようなことがあったのでこれを使い、保存する方法を教えてください。
https://qiita.com/rushuu_r/items/677bf24db821838a7569


signalさん、こんにちは。

まず、ループ処理によってサーバーが落ちてしまうとのことですが、原因はfor文の多さでなく無限ループが発生しているからです。
下記コードを各for文から取り除いて下さい。この記述の通りに処理が実行されますと、for文のループ条件(x <= 53)を外れないうちにxが0となっています。ですので最初のfor文で無限ループが起きてしまいます。
コード: 全て選択
if(x >= 53) {
x=0;
}


次に、アイテムの保存方法の話になりますが、ItemStack自体はそのままコンフィグに保存出来ます。
ですのでわざわざシリアライズ処理を書く必要はありません。
コード: 全て選択
getConfig().set("Item", new ItemStack(Material.GRASS));
//ItemStackをコンフィグに保存
saveConfig();
reloadConfig();

ItemStack item = getConfig().getItemStack("Item");
//コンフィグからItemStackを取得


シリアライズ処理までご自身で実装されたい場合は下記コードと解説をご参考にして頂ければと思います。
コード: 全て選択
   public static String itemToString(ItemStack item){
      try{
         ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
         BukkitObjectOutputStream dataOutput = new BukkitObjectOutputStream(outputStream);
         dataOutput.writeInt(1);
         //ここではItemStackが1つだけなので1に設定
         //引数にItemStack[]をとり、BukkitObjectOutputStream#writeInt(int)に配列長を設定しループ処理でオブジェクトを書き込む事で一纏めに処理する事も出来ます。
         dataOutput.writeObject(item);
         dataOutput.close();
         return Base64Coder.encodeLines(outputStream.toByteArray());
      }catch(Exception e){
         e.printStackTrace();
      }
      return null;
   }


   public static ItemStack stringToItem(String data){
      ItemStack item = null;

      try{
      ByteArrayInputStream inputStream = new ByteArrayInputStream(Base64Coder.decodeLines(data));
      BukkitObjectInputStream dataInput = new BukkitObjectInputStream(inputStream);
         dataInput.readInt();
         item = (ItemStack) dataInput.readObject();
         //書き込み時に複数のItemStackを書き込んでいた場合はこちらもループ処理でオブジェクトを読み込んで下さい。
         dataInput.close();
         return item;
      }catch(ClassNotFoundException e){
         e.printStackTrace();
      }catch(IOException e){
         e.printStackTrace();
      }
        return null;
    }
アバター
amata1219
ID:db54aae6
石掘り
 
記事: 98
登録日時: 2016年11月18日(金) 16:46

  • (PostNo.322561)

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

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

amata1219 さんが書きました:
signal さんが書きました:保存できるインベントリを作りたいと思い、
コード: 全て選択
FileConfiguration config = getConfig();
      saveDefaultConfig();
      if(e.getInventory().getName().equalsIgnoreCase("§r個人チェスト No.1"))
      {
         for(int x=0; x<=53; x++)
         {
            config.set("zzzzz"+e.getPlayer().getName()+e.getPlayer()+e.getInventory().getName(), e.getInventory().getItem(x));
            saveConfig();
            reloadConfig();
            if(x >= 53) {
               x=0;
            }
         }
      }
      if(e.getInventory().getName().equalsIgnoreCase("§r個人チェスト No.2"))
      {
         for(int x=0; x<=53; x++)
         {
            config.set("zzzzz"+e.getPlayer().getName()+e.getPlayer()+e.getInventory().getName(), e.getInventory().getItem(x));
            saveConfig();
            reloadConfig();
            if(x >= 53) {
               x=0;
            }
         }
      }
      if(e.getInventory().getName().equalsIgnoreCase("§r個人チェスト No.3"))
      {
         for(int x=0; x<=53; x++)
         {
            config.set("zzzzz"+e.getPlayer().getName()+e.getPlayer()+e.getInventory().getName(), e.getInventory().getItem(x));
            saveConfig();
            reloadConfig();
            if(x >= 53) {
               x=0;
            }
         }
      }
      if(e.getInventory().getName().equalsIgnoreCase("§r個人チェスト No.4"))
      {
         for(int x=0; x<=53; x++)
         {
            config.set("zzzzz"+e.getPlayer().getName()+e.getPlayer()+e.getInventory().getName(), e.getInventory().getItem(x));
            saveConfig();
            reloadConfig();
            if(x >= 53) {
               x=0;
            }
         }
      }

こうやって保存をして、読み取りもこれを取り出してという感じで検討してみたのですが、for文を何個も用いていることから落ちてしましました。
そこで調べてみるとBukkitObjectOutputStreamと本体にあるBase64Coderでシリアライズするというようなことがあったのでこれを使い、保存する方法を教えてください。
https://qiita.com/rushuu_r/items/677bf24db821838a7569


signalさん、こんにちは。

まず、ループ処理によってサーバーが落ちてしまうとのことですが、原因はfor文の多さでなく無限ループが発生しているからです。
下記コードを各for文から取り除いて下さい。この記述の通りに処理が実行されますと、for文のループ条件(x <= 53)を外れないうちにxが0となっています。ですので最初のfor文で無限ループが起きてしまいます。
コード: 全て選択
if(x >= 53) {
x=0;
}


次に、アイテムの保存方法の話になりますが、ItemStack自体はそのままコンフィグに保存出来ます。
ですのでわざわざシリアライズ処理を書く必要はありません。
コード: 全て選択
getConfig().set("Item", new ItemStack(Material.GRASS));
//ItemStackをコンフィグに保存
saveConfig();
reloadConfig();

ItemStack item = getConfig().getItemStack("Item");
//コンフィグからItemStackを取得


シリアライズ処理までご自身で実装されたい場合は下記コードと解説をご参考にして頂ければと思います。
コード: 全て選択
   public static String itemToString(ItemStack item){
      try{
         ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
         BukkitObjectOutputStream dataOutput = new BukkitObjectOutputStream(outputStream);
         dataOutput.writeInt(1);
         //ここではItemStackが1つだけなので1に設定
         //引数にItemStack[]をとり、BukkitObjectOutputStream#writeInt(int)に配列長を設定しループ処理でオブジェクトを書き込む事で一纏めに処理する事も出来ます。
         dataOutput.writeObject(item);
         dataOutput.close();
         return Base64Coder.encodeLines(outputStream.toByteArray());
      }catch(Exception e){
         e.printStackTrace();
      }
      return null;
   }


   public static ItemStack stringToItem(String data){
      ItemStack item = null;

      try{
      ByteArrayInputStream inputStream = new ByteArrayInputStream(Base64Coder.decodeLines(data));
      BukkitObjectInputStream dataInput = new BukkitObjectInputStream(inputStream);
         dataInput.readInt();
         item = (ItemStack) dataInput.readObject();
         //書き込み時に複数のItemStackを書き込んでいた場合はこちらもループ処理でオブジェクトを読み込んで下さい。
         dataInput.close();
         return item;
      }catch(ClassNotFoundException e){
         e.printStackTrace();
      }catch(IOException e){
         e.printStackTrace();
      }
        return null;
    }

なるほど。無限ループしてたんですね...ありがとうございます。
シリアライズするだけにこれだけ書かなければならないのですね。
正直なところ、解説をつけてくださったのはありがたいのですが、それでもまだ意味がわからない領域にあるので今はとりあえず定型文みたいな感じで使用させていただきます。
signal
ID:ad6fdda5
木を殴ってる
 
記事: 23
登録日時: 2018年9月25日(火) 20:48

  • (PostNo.322598)

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

投稿記事by 薄ら氷 雪 » 2018年12月12日(水) 19:00

プレーヤーがサーバーに参加したときにでてくるメッセージをランダムで変えたいんですがどうすればいいですか?
薄ら氷 雪
ID:5e54e56b
水から上がったとこ
 
記事: 7
登録日時: 2018年6月24日(日) 13:03

  • (PostNo.322614)

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

投稿記事by yotasaki » 2018年12月13日(木) 01:34

薄ら氷 雪 さんが書きました:プレーヤーがサーバーに参加したときにでてくるメッセージをランダムで変えたいんですがどうすればいいですか?


こんにちは、薄ら氷 雪 さん。私が提案するのは乱数を使った方法です。

コード: 全て選択
   @EventHandler
   public void onPlayerJoin(PlayerJoinEvent e) {
      Random r = new Random();
      int n = r.nextInt(3);
      switch(n) {
      case 0:
         e.setJoinMessage("こんにちは!");
         break;
      case 1:
         e.setJoinMessage("おはよう!");
         break;
      case 2:
         e.setJoinMessage("こんばんは!");
         break;
      } return;
   }

といったようにすると乱数に指定された数値が一致した際に特定のものが流れるというようにできると思います。
もしかするともっと良い方法があるかもしれませんが私がパッと思いつくのはこれですかね。
(;゚Д゚)ミツカッタ!
yotasaki
ID:65ac8b88
水から上がったとこ
 
記事: 9
登録日時: 2013年12月09日(月) 21:54

  • (PostNo.322620)

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

投稿記事by 薄ら氷 雪 » 2018年12月13日(木) 14:07

yotasaki さん!ありがとうございます!
薄ら氷 雪
ID:5e54e56b
水から上がったとこ
 
記事: 7
登録日時: 2018年6月24日(日) 13:03

  • (PostNo.322622)

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

投稿記事by spuash918 » 2018年12月13日(木) 17:42

yotasaki さんが書きました:
薄ら氷 雪 さんが書きました:プレーヤーがサーバーに参加したときにでてくるメッセージをランダムで変えたいんですがどうすればいいですか?


こんにちは、薄ら氷 雪 さん。私が提案するのは乱数を使った方法です。

コード: 全て選択
   @EventHandler
   public void onPlayerJoin(PlayerJoinEvent e) {
      Random r = new Random();
      int n = r.nextInt(3);
      switch(n) {
      case 0:
         e.setJoinMessage("こんにちは!");
         break;
      case 1:
         e.setJoinMessage("おはよう!");
         break;
      case 2:
         e.setJoinMessage("こんばんは!");
         break;
      } return;
   }

といったようにすると乱数に指定された数値が一致した際に特定のものが流れるというようにできると思います。
もしかするともっと良い方法があるかもしれませんが私がパッと思いつくのはこれですかね。

動作は問題ないと思うのですが、これだと動的に数を増やしたりできないので配列などを使ったほうが良いのでは
例えば
コード: 全て選択
public void onPlayerJoin(PlayerJoinEvent event)
{
      String[] message = new String[] { "Text1", "Text2", "Text3" };//適当に値を入れる
      int number = new Random().nextInt (message.length - 1);//-1してるのはArrayIndexOutOfBoundsException対策

      event.setJoinMessage (message[number]);
}

IDEとかでチェックしてないので動かないかもしれませんが、だいたいこんな感じですかね
変数の名前に「e」や「n」等はあまり好ましくないかと
パット見て何の値なのかわかったほうが良いです
プログラム無しでアイテムやブロックを追加できるMOD公開中です!
無機能ブロックから剣、斧に加えツールマテリアルにも対応!
詳しくはMOD配布ページまで!
Twitterやってます。→https://twitter.com/pokora_youtube
よろしければYoutubeもお願いします。
spuash918
ID:a74e6760
鉄鉱掘り
 
記事: 320
登録日時: 2014年11月03日(月) 11:17

  • (PostNo.322625)

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

投稿記事by yotasaki » 2018年12月13日(木) 19:24

spuash918 さんが書きました:
yotasaki さんが書きました:
薄ら氷 雪 さんが書きました:プレーヤーがサーバーに参加したときにでてくるメッセージをランダムで変えたいんですがどうすればいいですか?


こんにちは、薄ら氷 雪 さん。私が提案するのは乱数を使った方法です。

コード: 全て選択
   @EventHandler
   public void onPlayerJoin(PlayerJoinEvent e) {
      Random r = new Random();
      int n = r.nextInt(3);
      switch(n) {
      case 0:
         e.setJoinMessage("こんにちは!");
         break;
      case 1:
         e.setJoinMessage("おはよう!");
         break;
      case 2:
         e.setJoinMessage("こんばんは!");
         break;
      } return;
   }

といったようにすると乱数に指定された数値が一致した際に特定のものが流れるというようにできると思います。
もしかするともっと良い方法があるかもしれませんが私がパッと思いつくのはこれですかね。

動作は問題ないと思うのですが、これだと動的に数を増やしたりできないので配列などを使ったほうが良いのでは
例えば
コード: 全て選択
public void onPlayerJoin(PlayerJoinEvent event)
{
      String[] message = new String[] { "Text1", "Text2", "Text3" };//適当に値を入れる
      int number = new Random().nextInt (message.length - 1);//-1してるのはArrayIndexOutOfBoundsException対策

      event.setJoinMessage (message[number]);
}

IDEとかでチェックしてないので動かないかもしれませんが、だいたいこんな感じですかね
変数の名前に「e」や「n」等はあまり好ましくないかと
パット見て何の値なのかわかったほうが良いです


spuash918 さん、追加の回答ありがとうございます。その方法を私は思いつかず、私自身も勉強になりました。
「e」や「n」という変数の名前は私の普段使うもので、自身が理解できればいいという理由でつけていますが、おっしゃる通り、説明の場では相手に伝わりにくくなり則さないと思い、反省しております。
(;゚Д゚)ミツカッタ!
yotasaki
ID:65ac8b88
水から上がったとこ
 
記事: 9
登録日時: 2013年12月09日(月) 21:54

  • (PostNo.322626)

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

投稿記事by signal » 2018年12月13日(木) 19:30

この前インベントリを保存するやりかた
コード: 全て選択
public static String itemToString(ItemStack item){
         try{
            ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
            BukkitObjectOutputStream dataOutput = new BukkitObjectOutputStream(outputStream);
            dataOutput.writeInt(54);
            //ここではItemStackが1つだけなので1に設定
            //引数にItemStack[]をとり、BukkitObjectOutputStream#writeInt(int)に配列長を設定しループ処理でオブジェクトを書き込む事で一纏めに処理する事も出来ます。
            dataOutput.writeObject(item);
            dataOutput.close();
            return Base64Coder.encodeLines(outputStream.toByteArray());
         }catch(Exception e){
            e.printStackTrace();
         }
         return null;
      }


      public static ItemStack stringToItem(String data){
         ItemStack item = null;

         try{
         ByteArrayInputStream inputStream = new ByteArrayInputStream(Base64Coder.decodeLines(data));
         BukkitObjectInputStream dataInput = new BukkitObjectInputStream(inputStream);
            dataInput.readInt();
            item = (ItemStack) dataInput.readObject();
            //書き込み時に複数のItemStackを書き込んでいた場合はこちらもループ処理でオブジェクトを読み込んで下さい。
            dataInput.close();
            return item;
         }catch(ClassNotFoundException e){
            e.printStackTrace();
         }catch(IOException e){
            e.printStackTrace();
         }
           return null;
       }

正直これを置くところも曖昧なのでそれも教えてほしいです。

でやってきたのですが、一個以外の保存のやり方がわからず、困っています。自分なりに工夫して
コード: 全て選択
@EventHandler
   public void close(InventoryCloseEvent e)
   {
      FileConfiguration config = getConfig();
      saveDefaultConfig();
      if(e.getInventory().getName().equalsIgnoreCase("§r個人チェスト No1"))
      {
         for(int x=0; x<=53; x++)
         {
            config.set("チェスト"+e.getPlayer().getName()+"_"+e.getPlayer()+e.getInventory().getName()+"_"+x, e.getInventory().getItem(x));
            e.getPlayer().sendMessage(x+"");
            saveConfig();
            reloadConfig();
         }
      }
         }

コード: 全て選択
@EventHandler
   public void open(InventoryOpenEvent e)
   {
      FileConfiguration config = getConfig();
      saveDefaultConfig();
      if(e.getInventory().getName().equalsIgnoreCase("§r個人チェスト No1"))
      {
         for(int x=0; x<=53; x++)
         {
            e.getInventory().addItem((ItemStack) config.get("チェスト"+e.getPlayer().getName()+"_"+e.getPlayer()+e.getInventory().getName()+"_"+x));
            e.getPlayer().sendMessage(x+"");
         }
       }
        }

とやったのですが、これも何故か一個しか保存、読み取りができないので、できれば両方の全部のインベントリを保存する方法を教えていただきたいです。
signal
ID:ad6fdda5
木を殴ってる
 
記事: 23
登録日時: 2018年9月25日(火) 20:48

  • (PostNo.322704)

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

投稿記事by takumi_ » 2018年12月16日(日) 13:29

今インベントリをクリックしたら特定のアイテムの数を-1してそれをconfigに保存するというpluginを作っているのですが、その特定のアイテムの検知の仕方がわからず困っています。
コード: 全て選択
@EventHandler
   public void sell(InventoryClickEvent e) {
      Player pl = (Player) e.getWhoClicked();
      FileConfiguration config = getConfig();
      saveDefaultConfig();
      if (e.getInventory().getName().equalsIgnoreCase("§r§a§lconfig"))
      {
         if(e.isRightClick() || e.isLeftClick()|| e.getAction()==InventoryAction.HOTBAR_SWAP || e.getAction() == InventoryAction.HOTBAR_MOVE_AND_READD || e.getAction() == InventoryAction.DROP_ONE_SLOT ||e.getAction() == InventoryAction.DROP_ALL_SLOT)
         {
            e.setCancelled(true);
            if(e.getRawSlot() == 0) {
               if(pl.getInventory()//ここ) {
                  //アイテムを-1
               }
            }
         }
      }
   }

-1するのはsetAmountを使えばよいとはわかるのですが、やはり特定のアイテムがあるのかというのがわかりません。
一応特定のアイテムはMaterialで探すのではなく、ItemStackで探す方法を教えてほしいです
takumi_
ID:ad6fdda5
木を殴ってる
 
記事: 15
登録日時: 2018年9月24日(月) 20:52

  • (PostNo.322709)

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

投稿記事by signal » 2018年12月16日(日) 15:08

signal さんが書きました:この前インベントリを保存するやりかた
コード: 全て選択
public static String itemToString(ItemStack item){
         try{
            ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
            BukkitObjectOutputStream dataOutput = new BukkitObjectOutputStream(outputStream);
            dataOutput.writeInt(54);
            //ここではItemStackが1つだけなので1に設定
            //引数にItemStack[]をとり、BukkitObjectOutputStream#writeInt(int)に配列長を設定しループ処理でオブジェクトを書き込む事で一纏めに処理する事も出来ます。
            dataOutput.writeObject(item);
            dataOutput.close();
            return Base64Coder.encodeLines(outputStream.toByteArray());
         }catch(Exception e){
            e.printStackTrace();
         }
         return null;
      }


      public static ItemStack stringToItem(String data){
         ItemStack item = null;

         try{
         ByteArrayInputStream inputStream = new ByteArrayInputStream(Base64Coder.decodeLines(data));
         BukkitObjectInputStream dataInput = new BukkitObjectInputStream(inputStream);
            dataInput.readInt();
            item = (ItemStack) dataInput.readObject();
            //書き込み時に複数のItemStackを書き込んでいた場合はこちらもループ処理でオブジェクトを読み込んで下さい。
            dataInput.close();
            return item;
         }catch(ClassNotFoundException e){
            e.printStackTrace();
         }catch(IOException e){
            e.printStackTrace();
         }
           return null;
       }

正直これを置くところも曖昧なのでそれも教えてほしいです。

でやってきたのですが、一個以外の保存のやり方がわからず、困っています。自分なりに工夫して
コード: 全て選択
@EventHandler
   public void close(InventoryCloseEvent e)
   {
      FileConfiguration config = getConfig();
      saveDefaultConfig();
      if(e.getInventory().getName().equalsIgnoreCase("§r個人チェスト No1"))
      {
         for(int x=0; x<=53; x++)
         {
            config.set("チェスト"+e.getPlayer().getName()+"_"+e.getPlayer()+e.getInventory().getName()+"_"+x, e.getInventory().getItem(x));
            e.getPlayer().sendMessage(x+"");
            saveConfig();
            reloadConfig();
         }
      }
         }

コード: 全て選択
@EventHandler
   public void open(InventoryOpenEvent e)
   {
      FileConfiguration config = getConfig();
      saveDefaultConfig();
      if(e.getInventory().getName().equalsIgnoreCase("§r個人チェスト No1"))
      {
         for(int x=0; x<=53; x++)
         {
            e.getInventory().addItem((ItemStack) config.get("チェスト"+e.getPlayer().getName()+"_"+e.getPlayer()+e.getInventory().getName()+"_"+x));
            e.getPlayer().sendMessage(x+"");
         }
       }
        }

とやったのですが、これも何故か一個しか保存、読み取りができないので、できれば両方の全部のインベントリを保存する方法を教えていただきたいです。

すみません。自己解決致しました。何故かはわからないのですがfor文を用いた時に最後に実行されるものにリロード、セーブを付けたら解決しました。
コード: 全て選択
@EventHandler
   public void close(InventoryCloseEvent e)
   {
      Player pl =(Player) e.getPlayer();
      FileConfiguration config = getConfig();
      saveDefaultConfig();
      if(e.getInventory().getName().equalsIgnoreCase("§r個人チェスト No1"))
      {
         for(int x=0; x<=53; x++) {
            config.set(pl.getName()+".チェスト"+e.getInventory().getName()+x, e.getInventory().getItem(x));
            if(x == 53) {
               saveConfig();
               reloadConfig();
            }
         }
      }
   }

   @EventHandler
   public void open(InventoryOpenEvent e)
   {
      Player pl =(Player) e.getPlayer();
      FileConfiguration config = getConfig();
      saveDefaultConfig();
      if(e.getInventory().getName().equalsIgnoreCase("§r個人チェスト No1"))
      {
         for(int x=0; x<=53; x++) {
            e.getInventory().setItem(x, config.getItemStack(pl.getName()+".チェスト"+e.getInventory().getName()+x));
         }
      }
   }
signal
ID:ad6fdda5
木を殴ってる
 
記事: 23
登録日時: 2018年9月25日(火) 20:48

  • (PostNo.322711)

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

投稿記事by takumi_ » 2018年12月16日(日) 16:13

takumi_ さんが書きました:今インベントリをクリックしたら特定のアイテムの数を-1してそれをconfigに保存するというpluginを作っているのですが、その特定のアイテムの検知の仕方がわからず困っています。
コード: 全て選択
@EventHandler
   public void sell(InventoryClickEvent e) {
      Player pl = (Player) e.getWhoClicked();
      FileConfiguration config = getConfig();
      saveDefaultConfig();
      if (e.getInventory().getName().equalsIgnoreCase("§r§a§lconfig"))
      {
         if(e.isRightClick() || e.isLeftClick()|| e.getAction()==InventoryAction.HOTBAR_SWAP || e.getAction() == InventoryAction.HOTBAR_MOVE_AND_READD || e.getAction() == InventoryAction.DROP_ONE_SLOT ||e.getAction() == InventoryAction.DROP_ALL_SLOT)
         {
            e.setCancelled(true);
            if(e.getRawSlot() == 0) {
               if(pl.getInventory()//ここ) {
                  //アイテムを-1
               }
            }
         }
      }
   }

-1するのはsetAmountを使えばよいとはわかるのですが、やはり特定のアイテムがあるのかというのがわかりません。
一応特定のアイテムはMaterialで探すのではなく、ItemStackで探す方法を教えてほしいです

一応アイテムの特定はcontainsでできたのですが、何故か一つしか反応されず困っています。そして一つの時にsetAmountを使おうと思ったら使えずにremoveしかなくて-1ができませんでした。一応src貼っておきます。
コード: 全て選択
ItemStack leather1 = new ItemStack(Material.LEATHER);
               if(pl.getInventory().contains(leather1))

どうしたら一つ以外検出、数を-1できますか
takumi_
ID:ad6fdda5
木を殴ってる
 
記事: 15
登録日時: 2018年9月24日(月) 20:52

  • (PostNo.322735)

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

投稿記事by ゲスト » 2018年12月17日(月) 20:16

こんにちは。質問させていただきたいことがありますので、どなたかご回答宜しくお願い致します。
現在、あるプラグインを作っているのですが、トグルのやり方が分かりません。
例えば、あるアイテムを右クリックし、プレイヤーを透明化。そして、またそのアイテムをクリックするとプレイヤーを表示するものです。手に持っているアイテムを他のアイテムに替えるのが一番手っ取り早いのですが、出来れば同じアイテムで繰り返したいのです。
諸事情でコードの方はこちらに乗せることができないのですが、トグルの部分だけ教えていただければ幸いです。どなたか、回答のほど宜しくお願い致します。
ゲスト
ID:2120670d
 

  • (PostNo.322743)

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

投稿記事by takumi_ » 2018年12月18日(火) 17:40

ゲスト さんが書きました:こんにちは。質問させていただきたいことがありますので、どなたかご回答宜しくお願い致します。
現在、あるプラグインを作っているのですが、トグルのやり方が分かりません。
例えば、あるアイテムを右クリックし、プレイヤーを透明化。そして、またそのアイテムをクリックするとプレイヤーを表示するものです。手に持っているアイテムを他のアイテムに替えるのが一番手っ取り早いのですが、出来れば同じアイテムで繰り返したいのです。
諸事情でコードの方はこちらに乗せることができないのですが、トグルの部分だけ教えていただければ幸いです。どなたか、回答のほど宜しくお願い致します。

一応透明化するというのまでは作ってみました。これは一応調べたら出てきました。
少し時間がなかったので作れなかったのですが、見えるようにするにはShowPlayerでできるはずなのでやってみてください。
透明化するしないはifを用いてconfigなどでやればいいかと思われます。
コード: 全て選択
@EventHandler
   public void invisible(PlayerInteractEvent e) {
      Player pl = (Player) e.getPlayer();
      ItemStack item = e.getPlayer().getItemInHand();
      for(Player p : Bukkit.getOnlinePlayers()){
         if (e.getHand() == EquipmentSlot.OFF_HAND) {return;}
         if (e.getAction() == Action.RIGHT_CLICK_AIR)
         {
            if (item.getType() == Material.STICK)
            {
               if(item.getItemMeta().getDisplayName().equalsIgnoreCase("§r透明化する棒"))
               {
                  pl.hidePlayer(p);
                  Bukkit.broadcastMessage(pl.getName()+"が透明化しました。");
               }
            }
         }
      }
   }
takumi_
ID:ad6fdda5
木を殴ってる
 
記事: 15
登録日時: 2018年9月24日(月) 20:52

  • (PostNo.322759)

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

投稿記事by takumi_ » 2018年12月19日(水) 17:06

前回までの内容
takumi_ さんが書きました:
takumi_ さんが書きました:今インベントリをクリックしたら特定のアイテムの数を-1してそれをconfigに保存するというpluginを作っているのですが、その特定のアイテムの検知の仕方がわからず困っています。
コード: 全て選択
@EventHandler
   public void sell(InventoryClickEvent e) {
      Player pl = (Player) e.getWhoClicked();
      FileConfiguration config = getConfig();
      saveDefaultConfig();
      if (e.getInventory().getName().equalsIgnoreCase("§r§a§lconfig"))
      {
         if(e.isRightClick() || e.isLeftClick()|| e.getAction()==InventoryAction.HOTBAR_SWAP || e.getAction() == InventoryAction.HOTBAR_MOVE_AND_READD || e.getAction() == InventoryAction.DROP_ONE_SLOT ||e.getAction() == InventoryAction.DROP_ALL_SLOT)
         {
            e.setCancelled(true);
            if(e.getRawSlot() == 0) {
               if(pl.getInventory()//ここ) {
                  //アイテムを-1
               }
            }
         }
      }
   }

-1するのはsetAmountを使えばよいとはわかるのですが、やはり特定のアイテムがあるのかというのがわかりません。
一応特定のアイテムはMaterialで探すのではなく、ItemStackで探す方法を教えてほしいです

一応アイテムの特定はcontainsでできたのですが、何故か一つしか反応されず困っています。そして一つの時にsetAmountを使おうと思ったら使えずにremoveしかなくて-1ができませんでした。一応src貼っておきます。
コード: 全て選択
ItemStack leather1 = new ItemStack(Material.LEATHER);
               if(pl.getInventory().contains(leather1))

どうしたら一つ以外検出、数を-1できますか

考えた結果すぐ上のsignalさんの投稿からアイデアを貰い、for文でInventoryを探して一致するアイテムがあれば...というのはできたのですが、何故かエラーをはかれてしまいます。
src
コード: 全て選択
@EventHandler
   public void sell(InventoryClickEvent e) {
      Player pl = (Player) e.getWhoClicked();
      FileConfiguration config = getConfig();
      saveDefaultConfig();
      if (e.getInventory().getName().equalsIgnoreCase("§r§a§ltest"))
      {
         if(e.isRightClick() || e.isLeftClick()|| e.getAction()==InventoryAction.HOTBAR_SWAP || e.getAction() == InventoryAction.HOTBAR_MOVE_AND_READD || e.getAction() == InventoryAction.DROP_ONE_SLOT ||e.getAction() == InventoryAction.DROP_ALL_SLOT)
         {
            e.setCancelled(true);
               if(e.getRawSlot() == 0)
               {
                  for(int a=0; a<=35; a++) {
                     if(pl.getInventory().getItem(a).getItemMeta().getDisplayName().equals("§r革")) {
                        pl.getInventory().getItem(a).setAmount(pl.getInventory().getItem(a).getAmount()-1);
                        config.set("Item_leather1", config.getInt("Item_leather1")+1);
                        config.set(pl.getName()+".money", config.getInt(pl.getName()+".money")+10);
                        saveConfig();
                        reloadConfig();
                        pl.sendMessage("§a売却しました。");
                        a = 100;
                     } else if(a==35) {
                        pl.sendMessage("§aアイテムが見つかりませんでした。");
                     }
                  }
               }
               if(e.getRawSlot() == 1) {
                  config.set("Item_leather2", config.getInt("Item_leather2")+1);
                  config.set(pl.getName()+".money", config.getInt(pl.getName()+".money")+100);
                  saveConfig();
                  reloadConfig();
                  pl.sendMessage("§a売却しました。");
               }
               if(e.getRawSlot() == 2) {
                  config.set("Item_leather3", config.getInt("Item_leather3")+1);
                  config.set(pl.getName()+".money", config.getInt(pl.getName()+".money")+(int)(500-(config.getInt("Item_leather3")*500*0.003)));
                  saveConfig();
                  reloadConfig();
                  pl.sendMessage("§a売却しました。");
               }
               if(e.getRawSlot() == 3) {
                  config.set("Item_leather4", config.getInt("Item_leather4")+1);
                  config.set(pl.getName()+".money", config.getInt(pl.getName()+".money")+(int)(1500-(config.getInt("Item_leather4")*1500*0.003)));
                  saveConfig();
                  reloadConfig();
                  pl.sendMessage("§a売却しました。");
               }
         }
      }
   }

エラーログ
コード: 全て選択
Could not pass event InventoryClickEvent to Allplugin v1.0.0
org.bukkit.event.EventException: null
        at org.bukkit.plugin.java.JavaPluginLoader$1.execute(JavaPluginLoader.java:306) ~[spigot-1.12.2.jar:git-Spigot-2cf50f0-8166d17]
        at org.bukkit.plugin.RegisteredListener.callEvent(RegisteredListener.java:62) ~[spigot-1.12.2.jar:git-Spigot-2cf50f0-8166d17]
        at org.bukkit.plugin.SimplePluginManager.fireEvent(SimplePluginManager.java:500) [spigot-1.12.2.jar:git-Spigot-2cf50f0-8166d17]
        at org.bukkit.plugin.SimplePluginManager.callEvent(SimplePluginManager.java:485) [spigot-1.12.2.jar:git-Spigot-2cf50f0-8166d17]
        at net.minecraft.server.v1_12_R1.PlayerConnection.a(PlayerConnection.java:1889) [spigot-1.12.2.jar:git-Spigot-2cf50f0-8166d17]
        at net.minecraft.server.v1_12_R1.PacketPlayInWindowClick.a(SourceFile:33) [spigot-1.12.2.jar:git-Spigot-2cf50f0-8166d17]
        at net.minecraft.server.v1_12_R1.PacketPlayInWindowClick.a(SourceFile:10) [spigot-1.12.2.jar:git-Spigot-2cf50f0-8166d17]
        at net.minecraft.server.v1_12_R1.PlayerConnectionUtils$1.run(SourceFile:13) [spigot-1.12.2.jar:git-Spigot-2cf50f0-8166d17]
        at java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source) [?:1.8.0_191]
        at java.util.concurrent.FutureTask.run(Unknown Source) [?:1.8.0_191]
        at net.minecraft.server.v1_12_R1.SystemUtils.a(SourceFile:46) [spigot-1.12.2.jar:git-Spigot-2cf50f0-8166d17]
        at net.minecraft.server.v1_12_R1.MinecraftServer.D(MinecraftServer.java:748) [spigot-1.12.2.jar:git-Spigot-2cf50f0-8166d17]
        at net.minecraft.server.v1_12_R1.DedicatedServer.D(DedicatedServer.java:406) [spigot-1.12.2.jar:git-Spigot-2cf50f0-8166d17]
        at net.minecraft.server.v1_12_R1.MinecraftServer.C(MinecraftServer.java:679) [spigot-1.12.2.jar:git-Spigot-2cf50f0-8166d17]
        at net.minecraft.server.v1_12_R1.MinecraftServer.run(MinecraftServer.java:577) [spigot-1.12.2.jar:git-Spigot-2cf50f0-8166d17]
        at java.lang.Thread.run(Unknown Source) [?:1.8.0_191]
Caused by: java.lang.NullPointerException
        at main.All.sell(All.java:764) ~[?:?]
        at sun.reflect.GeneratedMethodAccessor25.invoke(Unknown Source) ~[?:?]
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) ~[?:1.8.0_191]
        at java.lang.reflect.Method.invoke(Unknown Source) ~[?:1.8.0_191]
        at org.bukkit.plugin.java.JavaPluginLoader$1.execute(JavaPluginLoader.java:302) ~[spigot-1.12.2.jar:git-Spigot-2cf50f0-8166d17]
        ... 15 more
takumi_
ID:ad6fdda5
木を殴ってる
 
記事: 15
登録日時: 2018年9月24日(月) 20:52

  • (PostNo.322779)

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

投稿記事by rona_tombo » 2018年12月20日(木) 02:55

ConfigAPIについて質問です
以下のようなymlがあります
コード: 全て選択
shops:
  '1':
    name: test
    location:
      ==: org.bukkit.Location
      world: c
      x: 197.19432726798703
      y: 4.0
      z: 243.30419029335908
      pitch: 37.050117
      yaw: 91.24944
  '2':
    name: test
    location:
      ==: org.bukkit.Location
      world: c
      x: 197.19432726798703
      y: 4.0
      z: 243.30419029335908
      pitch: 37.050117
      yaw: 91.24944

この時、'1'、'2'…というnameとlocationのまとまりが全部で何個あるかを数えるにはどうすればよろしいでしょうか。
getStringList("shops").size()やgetConfigurationSection("").getRoot().getMapList("shops").size()でもだめでした…
以上よろしくお願いします。
念のために現状のコードをGitHubにPushしておきます
https://github.com/rona-tombo/SkullShop
rona_tombo
ID:198c1c92
木を殴ってる
 
記事: 31
登録日時: 2018年5月04日(金) 23:50

  • (PostNo.322785)

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

投稿記事by amata1219 » 2018年12月20日(木) 12:53

takumi_ さんが書きました:
前回までの内容
takumi_ さんが書きました:
takumi_ さんが書きました:今インベントリをクリックしたら特定のアイテムの数を-1してそれをconfigに保存するというpluginを作っているのですが、その特定のアイテムの検知の仕方がわからず困っています。
コード: 全て選択
@EventHandler
   public void sell(InventoryClickEvent e) {
      Player pl = (Player) e.getWhoClicked();
      FileConfiguration config = getConfig();
      saveDefaultConfig();
      if (e.getInventory().getName().equalsIgnoreCase("§r§a§lconfig"))
      {
         if(e.isRightClick() || e.isLeftClick()|| e.getAction()==InventoryAction.HOTBAR_SWAP || e.getAction() == InventoryAction.HOTBAR_MOVE_AND_READD || e.getAction() == InventoryAction.DROP_ONE_SLOT ||e.getAction() == InventoryAction.DROP_ALL_SLOT)
         {
            e.setCancelled(true);
            if(e.getRawSlot() == 0) {
               if(pl.getInventory()//ここ) {
                  //アイテムを-1
               }
            }
         }
      }
   }

-1するのはsetAmountを使えばよいとはわかるのですが、やはり特定のアイテムがあるのかというのがわかりません。
一応特定のアイテムはMaterialで探すのではなく、ItemStackで探す方法を教えてほしいです

一応アイテムの特定はcontainsでできたのですが、何故か一つしか反応されず困っています。そして一つの時にsetAmountを使おうと思ったら使えずにremoveしかなくて-1ができませんでした。一応src貼っておきます。
コード: 全て選択
ItemStack leather1 = new ItemStack(Material.LEATHER);
               if(pl.getInventory().contains(leather1))

どうしたら一つ以外検出、数を-1できますか

考えた結果すぐ上のsignalさんの投稿からアイデアを貰い、for文でInventoryを探して一致するアイテムがあれば...というのはできたのですが、何故かエラーをはかれてしまいます。
src
コード: 全て選択
@EventHandler
   public void sell(InventoryClickEvent e) {
      Player pl = (Player) e.getWhoClicked();
      FileConfiguration config = getConfig();
      saveDefaultConfig();
      if (e.getInventory().getName().equalsIgnoreCase("§r§a§ltest"))
      {
         if(e.isRightClick() || e.isLeftClick()|| e.getAction()==InventoryAction.HOTBAR_SWAP || e.getAction() == InventoryAction.HOTBAR_MOVE_AND_READD || e.getAction() == InventoryAction.DROP_ONE_SLOT ||e.getAction() == InventoryAction.DROP_ALL_SLOT)
         {
            e.setCancelled(true);
               if(e.getRawSlot() == 0)
               {
                  for(int a=0; a<=35; a++) {
                     if(pl.getInventory().getItem(a).getItemMeta().getDisplayName().equals("§r革")) {
                        pl.getInventory().getItem(a).setAmount(pl.getInventory().getItem(a).getAmount()-1);
                        config.set("Item_leather1", config.getInt("Item_leather1")+1);
                        config.set(pl.getName()+".money", config.getInt(pl.getName()+".money")+10);
                        saveConfig();
                        reloadConfig();
                        pl.sendMessage("§a売却しました。");
                        a = 100;
                     } else if(a==35) {
                        pl.sendMessage("§aアイテムが見つかりませんでした。");
                     }
                  }
               }
               if(e.getRawSlot() == 1) {
                  config.set("Item_leather2", config.getInt("Item_leather2")+1);
                  config.set(pl.getName()+".money", config.getInt(pl.getName()+".money")+100);
                  saveConfig();
                  reloadConfig();
                  pl.sendMessage("§a売却しました。");
               }
               if(e.getRawSlot() == 2) {
                  config.set("Item_leather3", config.getInt("Item_leather3")+1);
                  config.set(pl.getName()+".money", config.getInt(pl.getName()+".money")+(int)(500-(config.getInt("Item_leather3")*500*0.003)));
                  saveConfig();
                  reloadConfig();
                  pl.sendMessage("§a売却しました。");
               }
               if(e.getRawSlot() == 3) {
                  config.set("Item_leather4", config.getInt("Item_leather4")+1);
                  config.set(pl.getName()+".money", config.getInt(pl.getName()+".money")+(int)(1500-(config.getInt("Item_leather4")*1500*0.003)));
                  saveConfig();
                  reloadConfig();
                  pl.sendMessage("§a売却しました。");
               }
         }
      }
   }

エラーログ
コード: 全て選択
Could not pass event InventoryClickEvent to Allplugin v1.0.0
org.bukkit.event.EventException: null
        at org.bukkit.plugin.java.JavaPluginLoader$1.execute(JavaPluginLoader.java:306) ~[spigot-1.12.2.jar:git-Spigot-2cf50f0-8166d17]
        at org.bukkit.plugin.RegisteredListener.callEvent(RegisteredListener.java:62) ~[spigot-1.12.2.jar:git-Spigot-2cf50f0-8166d17]
        at org.bukkit.plugin.SimplePluginManager.fireEvent(SimplePluginManager.java:500) [spigot-1.12.2.jar:git-Spigot-2cf50f0-8166d17]
        at org.bukkit.plugin.SimplePluginManager.callEvent(SimplePluginManager.java:485) [spigot-1.12.2.jar:git-Spigot-2cf50f0-8166d17]
        at net.minecraft.server.v1_12_R1.PlayerConnection.a(PlayerConnection.java:1889) [spigot-1.12.2.jar:git-Spigot-2cf50f0-8166d17]
        at net.minecraft.server.v1_12_R1.PacketPlayInWindowClick.a(SourceFile:33) [spigot-1.12.2.jar:git-Spigot-2cf50f0-8166d17]
        at net.minecraft.server.v1_12_R1.PacketPlayInWindowClick.a(SourceFile:10) [spigot-1.12.2.jar:git-Spigot-2cf50f0-8166d17]
        at net.minecraft.server.v1_12_R1.PlayerConnectionUtils$1.run(SourceFile:13) [spigot-1.12.2.jar:git-Spigot-2cf50f0-8166d17]
        at java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source) [?:1.8.0_191]
        at java.util.concurrent.FutureTask.run(Unknown Source) [?:1.8.0_191]
        at net.minecraft.server.v1_12_R1.SystemUtils.a(SourceFile:46) [spigot-1.12.2.jar:git-Spigot-2cf50f0-8166d17]
        at net.minecraft.server.v1_12_R1.MinecraftServer.D(MinecraftServer.java:748) [spigot-1.12.2.jar:git-Spigot-2cf50f0-8166d17]
        at net.minecraft.server.v1_12_R1.DedicatedServer.D(DedicatedServer.java:406) [spigot-1.12.2.jar:git-Spigot-2cf50f0-8166d17]
        at net.minecraft.server.v1_12_R1.MinecraftServer.C(MinecraftServer.java:679) [spigot-1.12.2.jar:git-Spigot-2cf50f0-8166d17]
        at net.minecraft.server.v1_12_R1.MinecraftServer.run(MinecraftServer.java:577) [spigot-1.12.2.jar:git-Spigot-2cf50f0-8166d17]
        at java.lang.Thread.run(Unknown Source) [?:1.8.0_191]
Caused by: java.lang.NullPointerException
        at main.All.sell(All.java:764) ~[?:?]
        at sun.reflect.GeneratedMethodAccessor25.invoke(Unknown Source) ~[?:?]
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) ~[?:1.8.0_191]
        at java.lang.reflect.Method.invoke(Unknown Source) ~[?:1.8.0_191]
        at org.bukkit.plugin.java.JavaPluginLoader$1.execute(JavaPluginLoader.java:302) ~[spigot-1.12.2.jar:git-Spigot-2cf50f0-8166d17]
        ... 15 more


takumi_さん、こんにちは。

コードの方の行数が不明で怪しい点のリストアップをする程度しか出来ませんので、エラーの読み方だけ説明しますね。

まず、エラーログ中の"Caused by:"に注目して下さい。
そこにエラーの種類が書かれています。
ここではNullPointerException、つまりは存在しないオブジェクトに何かしらの処理をしようとしたが故にエラーが発生した様です。

次に"Caused by:"の下の"at"群に注目して下さい。
そこにはエラーが発生した場所が全て書き出されています。
その中でも"Caused by:"の直ぐ1行下がエラーの原因です。
ここでは、"main.All.sell(All.java:764)"、mainパッケージのAllクラスのsellメソッド(Allクラスの764行目)にエラーの原因となる記述があるようです。

以上を参考にご自身で原因を特定なさって下さい。
何か分からない事がありましたら再度ご質問頂ければと思います。

ちなみにですけど、確実にNullPointerExceptionが発生してしまう記述が一点ありました(下記コード)。
コード: 全て選択
pl.getInventory().getItem(a).getItemMeta().getDisplayName().equals("§r革")

ItemStackがItemMetaを持ってない場合、ItemMetaはnullになります。
そのnullであるItemMetaに何かしらの操作(ここではgetDisplayName())をすると確実にNullPointerExceptionが発生してしまいます。
ですのでItemMetaを持っているか確認する処理を追記しましょう(同様にDisplayNameも持っているか確認します)。
下記コードはfor文中での処理を想定しています。
コード: 全て選択
ItemStack item = pl.getInventory().getItem(a);
if(item == null || item.getType() == Material.AIR)
continue;
//アイテムがnull又は空気であれば次へ

if(!item.hasItemMeta())
continue;
//ItemMetaを持っていなければ次へ

ItemMeta meta = item.getItemMeta();

if(!meta.hasDisplayName())
continue;
//DisplayNameを持っていなければ次へ

//後はmeta.getDisplayName().equals("")など処理出来る。
//説明文も同様にhasLore()で持っているか確認出来る。


rona_tombo さんが書きました:ConfigAPIについて質問です
以下のようなymlがあります
コード: 全て選択
shops:
  '1':
    name: test
    location:
      ==: org.bukkit.Location
      world: c
      x: 197.19432726798703
      y: 4.0
      z: 243.30419029335908
      pitch: 37.050117
      yaw: 91.24944
  '2':
    name: test
    location:
      ==: org.bukkit.Location
      world: c
      x: 197.19432726798703
      y: 4.0
      z: 243.30419029335908
      pitch: 37.050117
      yaw: 91.24944

この時、'1'、'2'…というnameとlocationのまとまりが全部で何個あるかを数えるにはどうすればよろしいでしょうか。
getStringList("shops").size()やgetConfigurationSection("").getRoot().getMapList("shops").size()でもだめでした…
以上よろしくお願いします。
念のために現状のコードをGitHubにPushしておきます
https://github.com/rona-tombo/SkullShop


rona_tomboさん、こんにちは。
ConfigurationSection#getKeys(boolean)のサイズを調べる事で簡単に取得出来ます。
コード: 全て選択
ConfigurationSection section = getConfig().getConfigurationSection("shops");
int size = section.getKeys(false).size();
//getKeys(false)はセクションの1つ下のキーを全て取得します。
//引数にtrueを指定すると、セクション下のキーを全て取得します。
アバター
amata1219
ID:3910b5c7
石掘り
 
記事: 98
登録日時: 2016年11月18日(金) 16:46

  • (PostNo.322791)

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

投稿記事by 薄ら氷 雪 » 2018年12月20日(木) 17:49

@aや@pなどのセレクターやその引数などをPluginに使えるようにする方法はありますか?
薄ら氷 雪
ID:f6485117
水から上がったとこ
 
記事: 7
登録日時: 2018年6月24日(日) 13:03

  • (PostNo.322793)

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

投稿記事by takumi_ » 2018年12月20日(木) 18:37

amata1219 さんが書きました:
takumi_ さんが書きました:
前回までの内容
takumi_ さんが書きました:
takumi_ さんが書きました:今インベントリをクリックしたら特定のアイテムの数を-1してそれをconfigに保存するというpluginを作っているのですが、その特定のアイテムの検知の仕方がわからず困っています。
コード: 全て選択
@EventHandler
   public void sell(InventoryClickEvent e) {
      Player pl = (Player) e.getWhoClicked();
      FileConfiguration config = getConfig();
      saveDefaultConfig();
      if (e.getInventory().getName().equalsIgnoreCase("§r§a§lconfig"))
      {
         if(e.isRightClick() || e.isLeftClick()|| e.getAction()==InventoryAction.HOTBAR_SWAP || e.getAction() == InventoryAction.HOTBAR_MOVE_AND_READD || e.getAction() == InventoryAction.DROP_ONE_SLOT ||e.getAction() == InventoryAction.DROP_ALL_SLOT)
         {
            e.setCancelled(true);
            if(e.getRawSlot() == 0) {
               if(pl.getInventory()//ここ) {
                  //アイテムを-1
               }
            }
         }
      }
   }

-1するのはsetAmountを使えばよいとはわかるのですが、やはり特定のアイテムがあるのかというのがわかりません。
一応特定のアイテムはMaterialで探すのではなく、ItemStackで探す方法を教えてほしいです

一応アイテムの特定はcontainsでできたのですが、何故か一つしか反応されず困っています。そして一つの時にsetAmountを使おうと思ったら使えずにremoveしかなくて-1ができませんでした。一応src貼っておきます。
コード: 全て選択
ItemStack leather1 = new ItemStack(Material.LEATHER);
               if(pl.getInventory().contains(leather1))

どうしたら一つ以外検出、数を-1できますか

考えた結果すぐ上のsignalさんの投稿からアイデアを貰い、for文でInventoryを探して一致するアイテムがあれば...というのはできたのですが、何故かエラーをはかれてしまいます。
src
コード: 全て選択
@EventHandler
   public void sell(InventoryClickEvent e) {
      Player pl = (Player) e.getWhoClicked();
      FileConfiguration config = getConfig();
      saveDefaultConfig();
      if (e.getInventory().getName().equalsIgnoreCase("§r§a§ltest"))
      {
         if(e.isRightClick() || e.isLeftClick()|| e.getAction()==InventoryAction.HOTBAR_SWAP || e.getAction() == InventoryAction.HOTBAR_MOVE_AND_READD || e.getAction() == InventoryAction.DROP_ONE_SLOT ||e.getAction() == InventoryAction.DROP_ALL_SLOT)
         {
            e.setCancelled(true);
               if(e.getRawSlot() == 0)
               {
                  for(int a=0; a<=35; a++) {
                     if(pl.getInventory().getItem(a).getItemMeta().getDisplayName().equals("§r革")) {
                        pl.getInventory().getItem(a).setAmount(pl.getInventory().getItem(a).getAmount()-1);
                        config.set("Item_leather1", config.getInt("Item_leather1")+1);
                        config.set(pl.getName()+".money", config.getInt(pl.getName()+".money")+10);
                        saveConfig();
                        reloadConfig();
                        pl.sendMessage("§a売却しました。");
                        a = 100;
                     } else if(a==35) {
                        pl.sendMessage("§aアイテムが見つかりませんでした。");
                     }
                  }
               }
               if(e.getRawSlot() == 1) {
                  config.set("Item_leather2", config.getInt("Item_leather2")+1);
                  config.set(pl.getName()+".money", config.getInt(pl.getName()+".money")+100);
                  saveConfig();
                  reloadConfig();
                  pl.sendMessage("§a売却しました。");
               }
               if(e.getRawSlot() == 2) {
                  config.set("Item_leather3", config.getInt("Item_leather3")+1);
                  config.set(pl.getName()+".money", config.getInt(pl.getName()+".money")+(int)(500-(config.getInt("Item_leather3")*500*0.003)));
                  saveConfig();
                  reloadConfig();
                  pl.sendMessage("§a売却しました。");
               }
               if(e.getRawSlot() == 3) {
                  config.set("Item_leather4", config.getInt("Item_leather4")+1);
                  config.set(pl.getName()+".money", config.getInt(pl.getName()+".money")+(int)(1500-(config.getInt("Item_leather4")*1500*0.003)));
                  saveConfig();
                  reloadConfig();
                  pl.sendMessage("§a売却しました。");
               }
         }
      }
   }

エラーログ
コード: 全て選択
Could not pass event InventoryClickEvent to Allplugin v1.0.0
org.bukkit.event.EventException: null
        at org.bukkit.plugin.java.JavaPluginLoader$1.execute(JavaPluginLoader.java:306) ~[spigot-1.12.2.jar:git-Spigot-2cf50f0-8166d17]
        at org.bukkit.plugin.RegisteredListener.callEvent(RegisteredListener.java:62) ~[spigot-1.12.2.jar:git-Spigot-2cf50f0-8166d17]
        at org.bukkit.plugin.SimplePluginManager.fireEvent(SimplePluginManager.java:500) [spigot-1.12.2.jar:git-Spigot-2cf50f0-8166d17]
        at org.bukkit.plugin.SimplePluginManager.callEvent(SimplePluginManager.java:485) [spigot-1.12.2.jar:git-Spigot-2cf50f0-8166d17]
        at net.minecraft.server.v1_12_R1.PlayerConnection.a(PlayerConnection.java:1889) [spigot-1.12.2.jar:git-Spigot-2cf50f0-8166d17]
        at net.minecraft.server.v1_12_R1.PacketPlayInWindowClick.a(SourceFile:33) [spigot-1.12.2.jar:git-Spigot-2cf50f0-8166d17]
        at net.minecraft.server.v1_12_R1.PacketPlayInWindowClick.a(SourceFile:10) [spigot-1.12.2.jar:git-Spigot-2cf50f0-8166d17]
        at net.minecraft.server.v1_12_R1.PlayerConnectionUtils$1.run(SourceFile:13) [spigot-1.12.2.jar:git-Spigot-2cf50f0-8166d17]
        at java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source) [?:1.8.0_191]
        at java.util.concurrent.FutureTask.run(Unknown Source) [?:1.8.0_191]
        at net.minecraft.server.v1_12_R1.SystemUtils.a(SourceFile:46) [spigot-1.12.2.jar:git-Spigot-2cf50f0-8166d17]
        at net.minecraft.server.v1_12_R1.MinecraftServer.D(MinecraftServer.java:748) [spigot-1.12.2.jar:git-Spigot-2cf50f0-8166d17]
        at net.minecraft.server.v1_12_R1.DedicatedServer.D(DedicatedServer.java:406) [spigot-1.12.2.jar:git-Spigot-2cf50f0-8166d17]
        at net.minecraft.server.v1_12_R1.MinecraftServer.C(MinecraftServer.java:679) [spigot-1.12.2.jar:git-Spigot-2cf50f0-8166d17]
        at net.minecraft.server.v1_12_R1.MinecraftServer.run(MinecraftServer.java:577) [spigot-1.12.2.jar:git-Spigot-2cf50f0-8166d17]
        at java.lang.Thread.run(Unknown Source) [?:1.8.0_191]
Caused by: java.lang.NullPointerException
        at main.All.sell(All.java:764) ~[?:?]
        at sun.reflect.GeneratedMethodAccessor25.invoke(Unknown Source) ~[?:?]
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) ~[?:1.8.0_191]
        at java.lang.reflect.Method.invoke(Unknown Source) ~[?:1.8.0_191]
        at org.bukkit.plugin.java.JavaPluginLoader$1.execute(JavaPluginLoader.java:302) ~[spigot-1.12.2.jar:git-Spigot-2cf50f0-8166d17]
        ... 15 more


takumi_さん、こんにちは。

コードの方の行数が不明で怪しい点のリストアップをする程度しか出来ませんので、エラーの読み方だけ説明しますね。

まず、エラーログ中の"Caused by:"に注目して下さい。
そこにエラーの種類が書かれています。
ここではNullPointerException、つまりは存在しないオブジェクトに何かしらの処理をしようとしたが故にエラーが発生した様です。

次に"Caused by:"の下の"at"群に注目して下さい。
そこにはエラーが発生した場所が全て書き出されています。
その中でも"Caused by:"の直ぐ1行下がエラーの原因です。
ここでは、"main.All.sell(All.java:764)"、mainパッケージのAllクラスのsellメソッド(Allクラスの764行目)にエラーの原因となる記述があるようです。

以上を参考にご自身で原因を特定なさって下さい。
何か分からない事がありましたら再度ご質問頂ければと思います。

ちなみにですけど、確実にNullPointerExceptionが発生してしまう記述が一点ありました(下記コード)。
コード: 全て選択
pl.getInventory().getItem(a).getItemMeta().getDisplayName().equals("§r革")

ItemStackがItemMetaを持ってない場合、ItemMetaはnullになります。
そのnullであるItemMetaに何かしらの操作(ここではgetDisplayName())をすると確実にNullPointerExceptionが発生してしまいます。
ですのでItemMetaを持っているか確認する処理を追記しましょう(同様にDisplayNameも持っているか確認します)。
下記コードはfor文中での処理を想定しています。
コード: 全て選択
ItemStack item = pl.getInventory().getItem(a);
if(item == null || item.getType() == Material.AIR)
continue;
//アイテムがnull又は空気であれば次へ

if(!item.hasItemMeta())
continue;
//ItemMetaを持っていなければ次へ

ItemMeta meta = item.getItemMeta();

if(!meta.hasDisplayName())
continue;
//DisplayNameを持っていなければ次へ

//後はmeta.getDisplayName().equals("")など処理出来る。
//説明文も同様にhasLore()で持っているか確認出来る。


rona_tombo さんが書きました:ConfigAPIについて質問です
以下のようなymlがあります
コード: 全て選択
shops:
  '1':
    name: test
    location:
      ==: org.bukkit.Location
      world: c
      x: 197.19432726798703
      y: 4.0
      z: 243.30419029335908
      pitch: 37.050117
      yaw: 91.24944
  '2':
    name: test
    location:
      ==: org.bukkit.Location
      world: c
      x: 197.19432726798703
      y: 4.0
      z: 243.30419029335908
      pitch: 37.050117
      yaw: 91.24944

この時、'1'、'2'…というnameとlocationのまとまりが全部で何個あるかを数えるにはどうすればよろしいでしょうか。
getStringList("shops").size()やgetConfigurationSection("").getRoot().getMapList("shops").size()でもだめでした…
以上よろしくお願いします。
念のために現状のコードをGitHubにPushしておきます
https://github.com/rona-tombo/SkullShop


rona_tomboさん、こんにちは。
ConfigurationSection#getKeys(boolean)のサイズを調べる事で簡単に取得出来ます。
コード: 全て選択
ConfigurationSection section = getConfig().getConfigurationSection("shops");
int size = section.getKeys(false).size();
//getKeys(false)はセクションの1つ下のキーを全て取得します。
//引数にtrueを指定すると、セクション下のキーを全て取得します。

ありがとうございます。無事解決致しました。少し気になったのですがcontinueするとき{}がないのですがつけなくてもいいのですか(僕は一応つけましたけど)
takumi_
ID:ad6fdda5
木を殴ってる
 
記事: 15
登録日時: 2018年9月24日(月) 20:52

  • (PostNo.322798)

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

投稿記事by amata1219 » 2018年12月20日(木) 19:24

takumi_ さんが書きました:ありがとうございます。無事解決致しました。少し気になったのですがcontinueするとき{}がないのですがつけなくてもいいのですか(僕は一応つけましたけど)


(Spigotの話でなくJavaの文法の話になってしまいますけど、)
if文の条件を満たした時の処理が1つであれば中括弧を省略出来ます。
例えば下記の記述ですとプレイヤー名がSteveでない場合はHelloと表示されません。
コード: 全て選択
Player player = e.getPlayer();

if(!player.getName().equals("Steve"))
return;

player.sendMessage("Hello");


次の例の場合、プレイヤー名がSteveであればHelloとByeの両方が表示されます。
逆にプレイヤー名がSteveでなければByeとだけ表示されます。
コード: 全て選択
Player player = e.getPlayer();

if(player.getName().equals("Steve"))
player.sendMessage("Hello");

player.sendMessage("Bye");
アバター
amata1219
ID:3910b5c7
石掘り
 
記事: 98
登録日時: 2016年11月18日(金) 16:46

  • (PostNo.322799)

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

投稿記事by rona_tombo » 2018年12月20日(木) 21:21

amata1219さんありがとうございます。
その件については無事解決することができました。
続けての質問申し訳ありませんが引っかかってしまったので質問させていただきます。

Configの読み込みにてエラーが出ています
コード: 全て選択
[21:06:05 ERROR]: [org.bukkit.configuration.serialization.ConfigurationSerialization] Could not call method 'public static org.bukkit.Location org.bukkit.Location.deserialize(java.util.Map)' of class org.bukkit.Location for deserialization
java.lang.IllegalArgumentException: unknown world
        at org.bukkit.Location.deserialize(Location.java:1014) ~[patched_1.12.2.jar:git-Paper-1587]
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_181]
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[?:1.8.0_181]
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.8.0_181]
        at java.lang.reflect.Method.invoke(Method.java:498) ~[?:1.8.0_181]
        at org.bukkit.configuration.serialization.ConfigurationSerialization.deserializeViaMethod(ConfigurationSerialization.java:79) ~[patched_1.12.2.jar:git-Paper-1587]
        at org.bukkit.configuration.serialization.ConfigurationSerialization.deserialize(ConfigurationSerialization.java:119) ~[patched_1.12.2.jar:git-Paper-1587]
        at org.bukkit.configuration.serialization.ConfigurationSerialization.deserializeObject(ConfigurationSerialization.java:197) ~[patched_1.12.2.jar:git-Paper-1587]
        at org.bukkit.configuration.file.YamlConstructor$ConstructCustomObject.construct(YamlConstructor.java:35) ~[patched_1.12.2.jar:git-Paper-1587]
        at org.yaml.snakeyaml.constructor.BaseConstructor.constructObjectNoCheck(BaseConstructor.java:207) ~[patched_1.12.2.jar:git-Paper-1587]
        at org.yaml.snakeyaml.constructor.BaseConstructor.constructObject(BaseConstructor.java:196) ~[patched_1.12.2.jar:git-Paper-1587]
        at org.yaml.snakeyaml.constructor.BaseConstructor.constructMapping2ndStep(BaseConstructor.java:462) ~[patched_1.12.2.jar:git-Paper-1587]
        at org.yaml.snakeyaml.constructor.SafeConstructor.constructMapping2ndStep(SafeConstructor.java:183) ~[patched_1.12.2.jar:git-Paper-1587]
        at org.yaml.snakeyaml.constructor.BaseConstructor.constructMapping(BaseConstructor.java:443) ~[patched_1.12.2.jar:git-Paper-1587]
        at org.yaml.snakeyaml.constructor.SafeConstructor$ConstructYamlMap.construct(SafeConstructor.java:519) ~[patched_1.12.2.jar:git-Paper-1587]
        at org.bukkit.configuration.file.YamlConstructor$ConstructCustomObject.construct(YamlConstructor.java:26) ~[patched_1.12.2.jar:git-Paper-1587]
        at org.yaml.snakeyaml.constructor.BaseConstructor.constructObjectNoCheck(BaseConstructor.java:207) ~[patched_1.12.2.jar:git-Paper-1587]
        at org.yaml.snakeyaml.constructor.BaseConstructor.constructObject(BaseConstructor.java:196) ~[patched_1.12.2.jar:git-Paper-1587]
        at org.yaml.snakeyaml.constructor.BaseConstructor.constructMapping2ndStep(BaseConstructor.java:462) ~[patched_1.12.2.jar:git-Paper-1587]
        at org.yaml.snakeyaml.constructor.SafeConstructor.constructMapping2ndStep(SafeConstructor.java:183) ~[patched_1.12.2.jar:git-Paper-1587]
        at org.yaml.snakeyaml.constructor.BaseConstructor.constructMapping(BaseConstructor.java:443) ~[patched_1.12.2.jar:git-Paper-1587]
        at org.yaml.snakeyaml.constructor.SafeConstructor$ConstructYamlMap.construct(SafeConstructor.java:519) ~[patched_1.12.2.jar:git-Paper-1587]
        at org.bukkit.configuration.file.YamlConstructor$ConstructCustomObject.construct(YamlConstructor.java:26) ~[patched_1.12.2.jar:git-Paper-1587]
        at org.yaml.snakeyaml.constructor.BaseConstructor.constructObjectNoCheck(BaseConstructor.java:207) ~[patched_1.12.2.jar:git-Paper-1587]
        at org.yaml.snakeyaml.constructor.BaseConstructor.constructObject(BaseConstructor.java:196) ~[patched_1.12.2.jar:git-Paper-1587]
        at org.yaml.snakeyaml.constructor.BaseConstructor.constructDocument(BaseConstructor.java:161) ~[patched_1.12.2.jar:git-Paper-1587]
        at org.yaml.snakeyaml.constructor.BaseConstructor.getSingleData(BaseConstructor.java:147) ~[patched_1.12.2.jar:git-Paper-1587]
        at org.yaml.snakeyaml.Yaml.loadFromReader(Yaml.java:524) ~[patched_1.12.2.jar:git-Paper-1587]
        at org.yaml.snakeyaml.Yaml.load(Yaml.java:437) ~[patched_1.12.2.jar:git-Paper-1587]
        at org.bukkit.configuration.file.YamlConfiguration.loadFromString(YamlConfiguration.java:53) ~[patched_1.12.2.jar:git-Paper-1587]
        at org.bukkit.configuration.file.FileConfiguration.load(FileConfiguration.java:162) ~[patched_1.12.2.jar:git-Paper-1587]
        at org.bukkit.configuration.file.FileConfiguration.load(FileConfiguration.java:130) ~[patched_1.12.2.jar:git-Paper-1587]
        at org.bukkit.configuration.file.YamlConfiguration.loadConfiguration(YamlConfiguration.java:178) ~[patched_1.12.2.jar:git-Paper-1587]
        at cf.rona_tombo.skullshop.utils.ConfigManager.loadFiles(ConfigManager.java:36) ~[?:?]
        at cf.rona_tombo.skullshop.SkullShop.onEnable(SkullShop.java:22) ~[?:?]
        at org.bukkit.plugin.java.JavaPlugin.setEnabled(JavaPlugin.java:264) ~[patched_1.12.2.jar:git-Paper-1587]
        at org.bukkit.plugin.java.JavaPluginLoader.enablePlugin(JavaPluginLoader.java:316) ~[patched_1.12.2.jar:git-Paper-1587]
        at org.bukkit.plugin.SimplePluginManager.enablePlugin(SimplePluginManager.java:405) ~[patched_1.12.2.jar:git-Paper-1587]
        at org.bukkit.craftbukkit.v1_12_R1.CraftServer.enablePlugin(CraftServer.java:395) ~[patched_1.12.2.jar:git-Paper-1587]
        at org.bukkit.craftbukkit.v1_12_R1.CraftServer.enablePlugins(CraftServer.java:344) ~[patched_1.12.2.jar:git-Paper-1587]
        at net.minecraft.server.v1_12_R1.MinecraftServer.t(MinecraftServer.java:442) ~[patched_1.12.2.jar:git-Paper-1587]
        at net.minecraft.server.v1_12_R1.MinecraftServer.l(MinecraftServer.java:403) ~[patched_1.12.2.jar:git-Paper-1587]
        at net.minecraft.server.v1_12_R1.MinecraftServer.a(MinecraftServer.java:341) ~[patched_1.12.2.jar:git-Paper-1587]
        at net.minecraft.server.v1_12_R1.DedicatedServer.init(DedicatedServer.java:289) ~[patched_1.12.2.jar:git-Paper-1587]
        at net.minecraft.server.v1_12_R1.MinecraftServer.run(MinecraftServer.java:616) ~[patched_1.12.2.jar:git-Paper-1587]
        at java.lang.Thread.run(Thread.java:748) [?:1.8.0_181]


Locationのデシリアライズにて失敗しているようですが、保存はConfigAPIにて行っており手動編集はしていません。
またConfigManager.javaの36行目は
コード: 全て選択
shops = YamlConfiguration.loadConfiguration(shopFile);

です
なおYMLは以下の形式です
コード: 全て選択
shops:
  '1':
    name: test
    location:
      ==: org.bukkit.Location
      world: c
      x: 198.55628559280308
      y: 4.0
      z: 252.53811453852532
      pitch: 1.050003
      yaw: 184.05072

解決法ご存知の方いらっしゃったらご教授お願いいたします。
rona_tombo
ID:198c1c92
木を殴ってる
 
記事: 31
登録日時: 2018年5月04日(金) 23:50

1つ前へ次へ

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

x