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

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

返信する

:
不正プログラムによるアクセスを防ぐため、reCaptcha 認証コードの入力を強制しています。表示されている 2 つのワードをテキストフィールドにご入力ください。

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

ファイルを添付します

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

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

投稿記事 by King(qpwakaba) » 2018年1月12日(金) 02:16

smk7758 さんが書きました:
King(qpwakaba) さんが書きました:((Enum#values() ってのがあるよ)

reloadメソッドにおいての問題として、たとえばfor文にしたとして、Keys.values()で取得しても任意のフィードに代入するには、任意にフィードを指定し代入する他ないため、以下のようにただEnumのvalues()を用いることはできないように思いましたが、どのようにすればよいでしょうか。
コード: 全て選択
public void reload() {
   for (Keys key : Keys.values()) {
      ?(できない) = fc.getString(key);
   }
}

自己解決していますが、別の方法があればご教授いただきたく存じます。


あー,なるほど。そこ見落としてました。Field#getName と Field#setを使うとか,ちょっとごり押しっぽいコード書かないと厳しいかも。

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

投稿記事 by ankou2525 » 2018年1月11日(木) 09:52

フォーラムの過去の質問を参考にしたり調べてみたりしてもわからなかったので質問します。
コード: 全て選択
   @EventHandler
   public void PR(final ProjectileLaunchEvent e){
      if(e.getEntity().getType().equals(EntityType.ARROW)){
         new BukkitRunnable(){
            @Override
            public void run() {
               // TODO 自動生成されたメソッド・スタブ
               if(!e.getEntity().isOnGround()){
                  Location loc = e.getEntity().getLocation();
                  Firework fw = (Firework) e.getEntity().getWorld().spawnEntity(loc, EntityType.FIREWORK);
                  FireworkMeta fwm = fw.getFireworkMeta();
                  fwm.setPower(0);
                  fwm.addEffect(FireworkEffect.builder()
                        .trail(false)
                        .flicker(false)
                        .with(Type.BALL_LARGE)
                        .withColor(Color.BLACK)
                        .withFade(Color.AQUA)
                        .build());
                  fw.setFireworkMeta(fwm);
                  fw.detonate();
               } else {
                  cancel();
               }
            }
         }.runTaskTimer(this, 0L, 1L);
      }
   }

矢を打ったと同時に花火の爆発エフェクトを地面につくまで矢の位置で発生させたいんですが、fw.detonate();を入れると破裂エフェクトが出なくなります。
fw.detonate();を消すとすぐ破裂せず少し上で破裂します。
どうすればいいんでしょうか?お願いします。

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

投稿記事 by smk7758 » 2018年1月11日(木) 01:17

King(qpwakaba) さんが書きました:
smk7758 さんが書きました:Spigotプラグイン制作において、設定ファイルの値をフィードとして保持したいと思って、以下のコードを書きました。
Java8, Spigot-1.12.2-R0.1
コード: 全て選択
import org.bukkit.configuration.file.FileConfiguration;

public class LanguageFile {
   private FileConfigurationEx fc = null;
   public String start, finish, stop, win_runner, win_hunter;

   public LanguageFile(FileConfiguration fc) {
      this.fc = (FileConfigurationEx) fc;
   }

   public enum Keys {
      start, finish, stop, win_runner, win_hunter;
   }

   public void reload() {
      start = fc.getString(Keys.start);
      finish = fc.getString(Keys.finish);
      stop = fc.getString(Keys.stop);
      win_runner = fc.getString(Keys.win_runner);
      win_hunter = fc.getString(Keys.win_hunter);
   }

   public void save() {
      fc.set(Keys.start, start);
   }

   private abstract class FileConfigurationEx extends FileConfiguration {
      private String getString(Keys key) {
         return super.getString(key.toString());
      }

      private void set(Keys key, Object object) {
         super.set(key.toString(), object);
      }
   }
}

このソースのreloadメソッドで、Keys(Enum)の全ての値を持ってきて、親クラスのフィードに代入しているのですが、少し煩雑なように思えます。
たとえば、for文などで短く出来ないでしょうか。
ご意見を頂けたら幸いです。


((Enum#values() ってのがあるよ)

reloadメソッドにおいての問題として、たとえばfor文にしたとして、Keys.values()で取得しても任意のフィードに代入するには、任意にフィードを指定し代入する他ないため、以下のようにただEnumのvalues()を用いることはできないように思いましたが、どのようにすればよいでしょうか。
コード: 全て選択
public void reload() {
   for (Keys key : Keys.values()) {
      ?(できない) = fc.getString(key);
   }
}

自己解決していますが、別の方法があればご教授いただきたく存じます。

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

投稿記事 by King(qpwakaba) » 2018年1月10日(水) 23:24

smk7758 さんが書きました:Spigotプラグイン制作において、設定ファイルの値をフィードとして保持したいと思って、以下のコードを書きました。
Java8, Spigot-1.12.2-R0.1
コード: 全て選択
import org.bukkit.configuration.file.FileConfiguration;

public class LanguageFile {
   private FileConfigurationEx fc = null;
   public String start, finish, stop, win_runner, win_hunter;

   public LanguageFile(FileConfiguration fc) {
      this.fc = (FileConfigurationEx) fc;
   }

   public enum Keys {
      start, finish, stop, win_runner, win_hunter;
   }

   public void reload() {
      start = fc.getString(Keys.start);
      finish = fc.getString(Keys.finish);
      stop = fc.getString(Keys.stop);
      win_runner = fc.getString(Keys.win_runner);
      win_hunter = fc.getString(Keys.win_hunter);
   }

   public void save() {
      fc.set(Keys.start, start);
   }

   private abstract class FileConfigurationEx extends FileConfiguration {
      private String getString(Keys key) {
         return super.getString(key.toString());
      }

      private void set(Keys key, Object object) {
         super.set(key.toString(), object);
      }
   }
}

このソースのreloadメソッドで、Keys(Enum)の全ての値を持ってきて、親クラスのフィードに代入しているのですが、少し煩雑なように思えます。
たとえば、for文などで短く出来ないでしょうか。
ご意見を頂けたら幸いです。


((Enum#values() ってのがあるよ)

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

投稿記事 by smk7758 » 2018年1月10日(水) 23:11

smk7758 さんが書きました:Spigotプラグイン制作において、設定ファイルの値をフィードとして保持したいと思って、以下のコードを書きました。
Java8, Spigot-1.12.2-R0.1
コード: 全て選択
import org.bukkit.configuration.file.FileConfiguration;

public class LanguageFile {
   private FileConfigurationEx fc = null;
   public String start, finish, stop, win_runner, win_hunter;

   public LanguageFile(FileConfiguration fc) {
      this.fc = (FileConfigurationEx) fc;
   }

   public enum Keys {
      start, finish, stop, win_runner, win_hunter;
   }

   public void reload() {
      start = fc.getString(Keys.start);
      finish = fc.getString(Keys.finish);
      stop = fc.getString(Keys.stop);
      win_runner = fc.getString(Keys.win_runner);
      win_hunter = fc.getString(Keys.win_hunter);
   }

   public void save() {
      fc.set(Keys.start, start);
   }

   private abstract class FileConfigurationEx extends FileConfiguration {
      private String getString(Keys key) {
         return super.getString(key.toString());
      }

      private void set(Keys key, Object object) {
         super.set(key.toString(), object);
      }
   }
}

このソースのreloadメソッドで、Keys(Enum)の全ての値を持ってきて、親クラスのフィードに代入しているのですが、少し煩雑なように思えます。
たとえば、for文などで短く出来ないでしょうか。
ご意見を頂けたら幸いです。

自己解決(?)しました。以下のようにすることでちょっとおしゃれになった気がします。

コード: 全て選択
import org.bukkit.configuration.file.FileConfiguration;

public abstract class FileConfigurationEx extends FileConfiguration {
   public String getString(SettingKeys key) {
      return super.getString(key.toString());
   }

   public void set(SettingKeys key) {
      super.set(key.toString(), key.getText());
   }
}

コード: 全て選択
public interface SettingKeys {
   public String getText();

   public void setText(String text);
}

コード: 全て選択
import org.bukkit.configuration.file.FileConfiguration;

public class LanguageFile {
   FileConfigurationEx fc = null;

   public LanguageFile(FileConfiguration fc) {
      this.fc = (FileConfigurationEx) fc;
   }

   public enum LanguageFileKeys implements SettingKeys {
      start(""),
      finish(""),
      stop(""),
      win_runner(""),
      win_hunter("");

      private String text;

      private LanguageFileKeys(String text) {
         this.setText(text);
      }

      public String getText() {
         return text;
      }

      public void setText(String text) {
         this.text = text;
      }
   }

   public void reload() {
      for (LanguageFileKeys key : LanguageFileKeys.values()) {
         key.setText(fc.getString(key));
      }
   }

   public void save() {
      for (LanguageFileKeys key : LanguageFileKeys.values()) {
         fc.set(key);
      }
   }
}

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

投稿記事 by smk7758 » 2018年1月10日(水) 22:29

Spigotプラグイン制作において、設定ファイルの値をフィードとして保持したいと思って、以下のコードを書きました。
Java8, Spigot-1.12.2-R0.1
コード: 全て選択
import org.bukkit.configuration.file.FileConfiguration;

public class LanguageFile {
   private FileConfigurationEx fc = null;
   public String start, finish, stop, win_runner, win_hunter;

   public LanguageFile(FileConfiguration fc) {
      this.fc = (FileConfigurationEx) fc;
   }

   public enum Keys {
      start, finish, stop, win_runner, win_hunter;
   }

   public void reload() {
      start = fc.getString(Keys.start);
      finish = fc.getString(Keys.finish);
      stop = fc.getString(Keys.stop);
      win_runner = fc.getString(Keys.win_runner);
      win_hunter = fc.getString(Keys.win_hunter);
   }

   public void save() {
      fc.set(Keys.start, start);
   }

   private abstract class FileConfigurationEx extends FileConfiguration {
      private String getString(Keys key) {
         return super.getString(key.toString());
      }

      private void set(Keys key, Object object) {
         super.set(key.toString(), object);
      }
   }
}

このソースのreloadメソッドで、Keys(Enum)の全ての値を持ってきて、親クラスのフィードに代入しているのですが、少し煩雑なように思えます。
たとえば、for文などで短く出来ないでしょうか。
ご意見を頂けたら幸いです。

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

投稿記事 by ankou2525 » 2018年1月10日(水) 06:54

elise_blacklab さんが書きました:
ankou2525 さんが書きました:簡単なサンプルとか書いてもらえないでしょうか?
できればお願いします。

コード: 全て選択
int max = 0;
Player topplayer = null;
for (Entry<Player, Integer> entry: map.entrySet()){
    if (entry.getValue() > max){
        max = entry.getValue();
        topplayer = entry.getKey();
    }
}

いまいち書き方が原始的だけどこんな感じ.Entryを一つ一つ走査する.
KeyとValueのセットが欲しいならこれで良い.このくらいは基本的なアルゴリズムとして,Javaのドキュメントを見る前に前提として知っておくと良いと思います.

当然これだと1人しか取得できないので,配列とかで複数人格納できるようにすれば一応完成だけど,正直sort()用にcompareTo()を実装する方が後の参照は楽.
繰り返しになりますがHashMapのソートはPluginに限った話ではないので,まずはggった方が有益な情報がいくらでも見つかります.

ありがとうございます!
今後質問する前にしっかりと調べるようにします。

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

投稿記事 by elise_blacklab » 2018年1月09日(火) 16:18

ankou2525 さんが書きました:簡単なサンプルとか書いてもらえないでしょうか?
できればお願いします。

コード: 全て選択
int max = 0;
Player topplayer = null;
for (Entry<Player, Integer> entry: map.entrySet()){
    if (entry.getValue() > max){
        max = entry.getValue();
        topplayer = entry.getKey();
    }
}

いまいち書き方が原始的だけどこんな感じ.Entryを一つ一つ走査する.
KeyとValueのセットが欲しいならこれで良い.このくらいは基本的なアルゴリズムとして,Javaのドキュメントを見る前に前提として知っておくと良いと思います.

当然これだと1人しか取得できないので,配列とかで複数人格納できるようにすれば一応完成だけど,正直sort()用にcompareTo()を実装する方が後の参照は楽.
繰り返しになりますがHashMapのソートはPluginに限った話ではないので,まずはggった方が有益な情報がいくらでも見つかります.

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

投稿記事 by ankou2525 » 2018年1月09日(火) 11:08

elise_blacklab さんが書きました:ankou2525 さんが書きました:
HashMap<Player, Integer> kill = new HashMap<Player, Integer>();
このマップを使ってプレイヤーがキルしたらプレイヤー値に追加していき、試合が終わった時に最大キルの人を取得したいんですがよくわかりません。
HashMapのValueからkeyを取得する方法を教えていただきたいです。
過去に同じような質問あったらすいません。
お願いします。

別にPlugin固有の疑問じゃないし,entrySetで走査すればいいのでは.

簡単なサンプルとか書いてもらえないでしょうか?
できればお願いします。

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

投稿記事 by elise_blacklab » 2018年1月09日(火) 10:39

ankou2525 さんが書きました:HashMap<Player, Integer> kill = new HashMap<Player, Integer>();
このマップを使ってプレイヤーがキルしたらプレイヤー値に追加していき、試合が終わった時に最大キルの人を取得したいんですがよくわかりません。
HashMapのValueからkeyを取得する方法を教えていただきたいです。
過去に同じような質問あったらすいません。
お願いします。

別にPlugin固有の疑問じゃないし,entrySetで走査すればいいのでは.

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

投稿記事 by ankou2525 » 2018年1月09日(火) 10:00

HashMap<Player, Integer> kill = new HashMap<Player, Integer>();
このマップを使ってプレイヤーがキルしたらプレイヤー値に追加していき、試合が終わった時に最大キルの人を取得したいんですがよくわかりません。
HashMapのValueからkeyを取得する方法を教えていただきたいです。
過去に同じような質問あったらすいません。
お願いします。

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

投稿記事 by smk7758 » 2018年1月07日(日) 12:21

ゲスト さんが書きました:プレイヤーをテレポートせずに、YawとPitchのみを変更する方法はありますか?

TPせず…ではないけど、TP時にx,y,zにプレーヤーの現在位置を指定して、Yaw, Pitchには変更したい値を入れ、実行(コマンドでもプラグインでも)でどうでしょうか。

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

投稿記事 by ankou25255 » 2018年1月02日(火) 14:30

amata1219さんありがとうございます!
返信遅れてしまって申し訳ないです!
おかげで解決しました!

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

投稿記事 by ゲスト » 2017年12月29日(金) 03:21

プレイヤーをテレポートせずに、YawとPitchのみを変更する方法はありますか?

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

投稿記事 by amata1219 » 2017年12月20日(水) 21:41

ankou2525 さんが書きました:久しぶりにプラグインを作り始めて詰まったことがあったので質問させて頂きます。
ビルドパスはspigot1.12.2を通しています。
コード: 全て選択
   @SuppressWarnings("deprecation")
   @Override
   public boolean onCommand(final CommandSender sender, Command command,
         String label, String[] args) {
          Player p = (Player) sender;
      // TODO 自動生成されたメソッド・スタブ
      getCommand("test");{
         this.getServer().getScheduler().scheduleAsyncRepeatingTask(this, new Runnable(){
            int i = 5;
            public void run(){
               if(i!=-1){
                  if(i !=0){
                     Bukkit.broadcastMessage(ChatColor.AQUA+""+ChatColor.BOLD+"チーム分けまで"+ChatColor.YELLOW+i+ChatColor.AQUA+"秒");
                     i--;
                  }else{
                     Bukkit.broadcastMessage(ChatColor.AQUA+""+ChatColor.BOLD+"チーム分けが完了しました!");
                     i--;
                  }
               }
            }
         }, 0L ,20L);
      }
      return super.onCommand(sender, command, label, args);
   }
}

このコードの"チーム分けまで〇秒"と同時にプレイヤー全員にサウンドを鳴らしたいのですが今までの方法でやったらエラーが出てできなく、調べてもわからなかったので分かるから教えてください!
一応試したコードのほうも貼っておきます!よろしくお願いします!

こちらが試したコード
コード: 全て選択
   @SuppressWarnings("deprecation")
   @Override
   public boolean onCommand(final CommandSender sender, Command command,
         String label, String[] args) {
      Player p = (Player) sender;
      // TODO 自動生成されたメソッド・スタブ
      getCommand("test");{
         this.getServer().getScheduler().scheduleAsyncRepeatingTask(this, new Runnable(){
        Player all = (Player) Bukkit.getOnlinePlayers();
            int i = 5;
            public void run(){
               if(i!=-1){
                  if(i !=0){
                     Bukkit.broadcastMessage(ChatColor.AQUA+""+ChatColor.BOLD+"チーム分けまで"+ChatColor.YELLOW+i+ChatColor.AQUA+"秒");
             all.playsound(all.getLocation(),Sound.BLOCK_NOTE_PILING,1,1);
                     i--;
                  }else{
                     Bukkit.broadcastMessage(ChatColor.AQUA+""+ChatColor.BOLD+"チーム分けが完了しました!");
             all.playsound(all.getLocation(),Sound.ENTITY_WITHER_SPAWN,1,3);
                       i--;
                  }
               }
            }
         }, 0L ,20L);
      }
      return super.onCommand(sender, command, label, args);
   }
}


ankou2525さん、こんにちは。
エラーログが無いので推測ですが恐らくエラーが発生しているのは以下のコードかと思われます。
コード: 全て選択
all.playsound(all.getLocation(),Sound.BLOCK_NOTE_PILING,1,1);

getOnlinePlayers()は要素の集合体でありPlayerクラス単体では無いため、for文などを用いて単体に分けて処理する必要があります。
コード: 全て選択
for(Player p : Bukkit.getOnlinePlayers()){
//ここに処理を記述
}

エラーログも合わせて貼って頂けると回答しやすいので、今後も利用する様であればエラーも合わせて貼って下さいね。

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

投稿記事 by ankou2525 » 2017年12月16日(土) 06:29

久しぶりにプラグインを作り始めて詰まったことがあったので質問させて頂きます。
ビルドパスはspigot1.12.2を通しています。
コード: 全て選択
   @SuppressWarnings("deprecation")
   @Override
   public boolean onCommand(final CommandSender sender, Command command,
         String label, String[] args) {
          Player p = (Player) sender;
      // TODO 自動生成されたメソッド・スタブ
      getCommand("test");{
         this.getServer().getScheduler().scheduleAsyncRepeatingTask(this, new Runnable(){
            int i = 5;
            public void run(){
               if(i!=-1){
                  if(i !=0){
                     Bukkit.broadcastMessage(ChatColor.AQUA+""+ChatColor.BOLD+"チーム分けまで"+ChatColor.YELLOW+i+ChatColor.AQUA+"秒");
                     i--;
                  }else{
                     Bukkit.broadcastMessage(ChatColor.AQUA+""+ChatColor.BOLD+"チーム分けが完了しました!");
                     i--;
                  }
               }
            }
         }, 0L ,20L);
      }
      return super.onCommand(sender, command, label, args);
   }
}

このコードの"チーム分けまで〇秒"と同時にプレイヤー全員にサウンドを鳴らしたいのですが今までの方法でやったらエラーが出てできなく、調べてもわからなかったので分かるから教えてください!
一応試したコードのほうも貼っておきます!よろしくお願いします!

こちらが試したコード
コード: 全て選択
   @SuppressWarnings("deprecation")
   @Override
   public boolean onCommand(final CommandSender sender, Command command,
         String label, String[] args) {
      Player p = (Player) sender;
      // TODO 自動生成されたメソッド・スタブ
      getCommand("test");{
         this.getServer().getScheduler().scheduleAsyncRepeatingTask(this, new Runnable(){
        Player all = (Player) Bukkit.getOnlinePlayers();
            int i = 5;
            public void run(){
               if(i!=-1){
                  if(i !=0){
                     Bukkit.broadcastMessage(ChatColor.AQUA+""+ChatColor.BOLD+"チーム分けまで"+ChatColor.YELLOW+i+ChatColor.AQUA+"秒");
             all.playsound(all.getLocation(),Sound.BLOCK_NOTE_PILING,1,1);
                     i--;
                  }else{
                     Bukkit.broadcastMessage(ChatColor.AQUA+""+ChatColor.BOLD+"チーム分けが完了しました!");
             all.playsound(all.getLocation(),Sound.ENTITY_WITHER_SPAWN,1,3);
                       i--;
                  }
               }
            }
         }, 0L ,20L);
      }
      return super.onCommand(sender, command, label, args);
   }
}

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

投稿記事 by mcgo » 2017年12月10日(日) 00:45

Kingさん返信ありがとうございます。
色々試行錯誤した結果getHotbarButton()で出来ました。
コード: 全て選択
if (e.getClickedInventory() instanceof PlayerInventory && config.getIntegerList("lock-slots").contains(e.getHotbarButton()))

助けてくださったお二人の方有難うございました。

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

投稿記事 by King(qpwakaba) » 2017年12月09日(土) 23:30

mcgo さんが書きました:
amata1219 さんが書きました:念の為と思いこちらもInventoryDragEventにキャンセル処理を記述して確認しましたが、そのような事はありませんでした。
BlockBreakEvent等でブロック破壊をキャンセルした時の様に、一瞬だけその動作が発生した様に見えてしまいますがそれ自体に問題はありません。
一度処理をe.setCancelled(true)のみの記述にしてご確認下さい。

返信ありがとうございます。
コード: 全て選択
@EventHandler
    public void onDragItem(InventoryDragEvent e) {
        e.setCancelled(true);
    }

このようにキャンセルだけのコードで試しましたが、やはり思っているような動作ではありませんでした。
キーボードの数字キーを使ってホットバーのアイテムを別のスロットへ移動するのはInventoryDragEventではなくInventoryClickEventが発生していたのでDragは違うような気がします。
もしかしたら自分の勘違いやまだ説明が足りてないのかもしれないので、必要な情報があれば言ってください。


ClickEventのほうの,ClickType == NUMBER とか,Action == HOTBAR_SWAP とかでキャンセル通りませんか?
条件分岐なしのキャンセルだけでもはじけない場合,CraftBukkit/Spigotのバージョンに不具合があるかも?

(ひとまず色んな検証情報が欲しいところ)

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

投稿記事 by mcgo » 2017年12月09日(土) 21:16

amata1219 さんが書きました:念の為と思いこちらもInventoryDragEventにキャンセル処理を記述して確認しましたが、そのような事はありませんでした。
BlockBreakEvent等でブロック破壊をキャンセルした時の様に、一瞬だけその動作が発生した様に見えてしまいますがそれ自体に問題はありません。
一度処理をe.setCancelled(true)のみの記述にしてご確認下さい。

返信ありがとうございます。
コード: 全て選択
@EventHandler
    public void onDragItem(InventoryDragEvent e) {
        e.setCancelled(true);
    }

このようにキャンセルだけのコードで試しましたが、やはり思っているような動作ではありませんでした。
キーボードの数字キーを使ってホットバーのアイテムを別のスロットへ移動するのはInventoryDragEventではなくInventoryClickEventが発生していたのでDragは違うような気がします。
もしかしたら自分の勘違いやまだ説明が足りてないのかもしれないので、必要な情報があれば言ってください。

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

投稿記事 by amata1219 » 2017年12月09日(土) 18:55

mcgo さんが書きました:amata1219さん返信ありがとうございます。
InventoryDragEventを使って試行錯誤しましたが思った通りのことは実現出来ませんでした。

https://gyazo.com/fdaf3989ffe7bd328a1457ae295ab598
今は1番スロット(一番左のホットバー)だけをロックしています。
1番スロットの操作を禁止しているので、1番スロットのアイテムを他のスロットに移動したり、逆に他のスロットから1番スロットにアイテムを移動することも禁止したいのです。
しかしGIFのように9番スロットにカーソルを置き、キーボードの1番を押すと1番スロットのアイテムが9番アイテムのスロットに移動してることがわかります。
この現象は自分の考えてる動作とは違うものでほんとはアイテムの移動は出来なくしたいのです。
念のためチェックを入れてみたらInventoryClickEventが発動していました。
ゲームモードはアドベンチャーです。
解決策ありましたらご教授お願いします。


念の為と思いこちらもInventoryDragEventにキャンセル処理を記述して確認しましたが、そのような事はありませんでした。
BlockBreakEvent等でブロック破壊をキャンセルした時の様に、一瞬だけその動作が発生した様に見えてしまいますがそれ自体に問題はありません。
一度処理をe.setCancelled(true)のみの記述にしてご確認下さい。

ページトップ

x