カウントダウンの残り秒数を表示したい

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

カウントダウンの残り秒数を表示したい

投稿記事by SREUNIMN » 2017年3月02日(木) 15:45

指定された条件下で右クリックで書いてある処理を行い
configから使えない秒数を取得して
それを毎秒1ずつ減らしていき、使えない間に右クリックしたら
残りの秒数を表示する。0になったら再使用可能、というものを
作ろうとしたのですが、残り秒数を表示させる方法が思いつきません。
どのようにすればいいでしょうか。

code 一部抜粋
コード: 全て選択
         public class SkillCast implements Listener{
   
   int count;
-----------------------------------------
右クリック検知
-----------------------------------------
       if(player.hasMetadata("Skill_Cooldown"){
           
          final int cooldown = skills.getInt(upper_skill + ".class" + "." + job_type + ".cooldown");

   new BukkitRunnable(){
      int cool = cooldown;
                           
     @Override
      public void run(){
      if(cool > 0){
      cool--;
      count = cool;
      }
      if(cool == 0){
      player.removeMetadata("Skill_Cooldown", Main.plugin);
      this.cancel();
      }
    }
   }.runTaskTimer(Main.plugin, 0, 20);

      }else if(player.hasMetadata("Skill_Cooldown")){
   player.sendMessage(ChatColor.DARK_RED + name + " は現在クールダウン中です. 残り " + ChatColor.RED +
        count + ChatColor.DARK_RED + "秒");
      }
}


これだと他の同じような処理と被ってしまってうまく動かないんですよね
SREUNIMN
ID:f86fe74b
木を殴ってる
 
記事: 27
登録日時: 2016年5月16日(月) 19:36

  • (PostNo.297140)

Re: カウントダウンの残り秒数を表示したい

投稿記事by Lemon18 » 2017年3月02日(木) 20:54

SREUNIMN さんが書きました:指定された条件下で右クリックで書いてある処理を行い
configから使えない秒数を取得して
それを毎秒1ずつ減らしていき、使えない間に右クリックしたら
残りの秒数を表示する。0になったら再使用可能、というもの

これだと他の同じような処理と被ってしまってうまく動かないんですよね


「これだと他の同じような処理と被ってしまってうまく動かないんですよね」というのがちょっと良くわかりませんが、
クールダウンの残り時間を取得したいのであれば、プレイヤーごとにMapに使った時刻を保存しておいて、
再度使用した時にクールダウンの確認を行うというのはどうでしょうか。
もし時間が十分経っているようであれば通常の処理を、経っていなければ保存しておいた時間から計算して、時間を表示できると思います。(しかもミリ秒単位で表示も可能)

追記: MapじゃなくてSREUNIMNさんが使用しているメタデータでもいいですね。
Bukkitプラグインとか作ったり作らなかったり。
「どのOSでも使える」を目標に日本語入力ツールを作っています。良ければ見てください。
http://forum.minecraftuser.jp/viewtopic.php?f=36&t=31671


Twitter: https://twitter.com/Lemon1806
Minecraft: Applemon
Lemon18
ID:b66be5f3
石掘り
 
記事: 84
登録日時: 2015年6月05日(金) 22:42

  • (PostNo.297165)

Re: カウントダウンの残り秒数を表示したい

投稿記事by SREUNIMN » 2017年3月03日(金) 14:28

回答ありがとうございます
HashMapを使ってこんな感じのコードをテストで作ってみたのですが
途中でNullPointerExceptionが発生してしまいました.

Println結果
1: put clear
2: 13桁の数字
3: null
4: 2とは少し違う13桁の数字
5: 15
~~~~~~
こんな感じです3のここで発生しているのですが
なぜ発生しているのでしょう?
コード: 全て選択
Long tm = cooldown.get(player.getUniqueId().toString());
    System.out.println(tm); ///3


発生した場所
コード: 全て選択
System.out.println((new_tm - tm) / 1000); /// 6


コード: 全て選択
case "Test":{
               final int cooltime = skills.getInt(upper_skill + ".class" + "." + job_type + ".cooldown");
                     final HashMap<String, Long> cooldown = new HashMap<String, Long>();
                     
                     
                     if(!player.hasMetadata("Test")){
                        player.setMetadata("Test", new FixedMetadataValue(Main.plugin, true));
                     cooldown.put(player.getUniqueId().toString(), System.currentTimeMillis());
                        System.out.println("put clear"); ///1
                        Long tm = cooldown.get(player.getUniqueId().toString());
                        System.out.println(tm); ///2
                        
                        new BukkitRunnable(){
                           @Override
                           public void run(){
                              player.removeMetadata("Test", Main.plugin);
                           }
                        }.runTaskLater(Main.plugin, cooltime * 20);
                        
                     }else if(player.hasMetadata("Test")){
                        Long tm = cooldown.get(player.getUniqueId().toString());
                        System.out.println(tm); ///3
                                               
                                                             cooldown.put(player.getUniqueId().toString(),System.currentTimeMillis());
                        Long new_tm = cooldown.get(player.getUniqueId().toString());
                        System.out.println(new_tm); ///4
                        
                        System.out.println(cooltime); ///5
                        System.out.println((new_tm - tm) / 1000); ///6
                        System.out.println(cooltime - ((new_tm - tm) / 1000)); ///7
                        player.sendMessage(ChatColor.DARK_RED + name + " は現在クールダウン中です. 残り " + ChatColor.RED + (cooltime - ((new_tm - tm) / 1000)) + ChatColor.DARK_RED + "秒");
                     }
                  }
SREUNIMN
ID:f86fe74b
木を殴ってる
 
記事: 27
登録日時: 2016年5月16日(月) 19:36

  • (PostNo.297185)

Re: カウントダウンの残り秒数を表示したい

投稿記事by Lemon18 » 2017年3月03日(金) 20:28

SREUNIMN さんが書きました:回答ありがとうございます
HashMapを使ってこんな感じのコードをテストで作ってみたのですが
途中でNullPointerExceptionが発生してしまいました.

Println結果
1: put clear
2: 13桁の数字
3: null
4: 2とは少し違う13桁の数字
5: 15
~~~~~~
こんな感じです3のここで発生しているのですが
なぜ発生しているのでしょう?


エラーの原因はおそらくMapの中身が空だからだと思います(おそらくMapを宣言し直してリセットされているため)

Mapを使うんだったらMetadataとScheduler使う必要ありますかね?
あと気になるのがなぜ直接UUIDを入れずにtoString()してからMapに入れていること と、Mapの宣言の場所が気になります。(メンバ変数にしてください)

私だったら、以下のようにすると思います。

コード: 全て選択
if (マップにプレイヤーのUUIDが見つかった) {
    if ((現在時間 - マップに記録された時間) > クールダウン時間) {
        //通常処理
    } else {
        //クールダウン待ち時間表示
    }
} else {
   //通常処理
}
Bukkitプラグインとか作ったり作らなかったり。
「どのOSでも使える」を目標に日本語入力ツールを作っています。良ければ見てください。
http://forum.minecraftuser.jp/viewtopic.php?f=36&t=31671


Twitter: https://twitter.com/Lemon1806
Minecraft: Applemon
Lemon18
ID:b66be5f3
石掘り
 
記事: 84
登録日時: 2015年6月05日(金) 22:42


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

x