ページ 132132

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

投稿記事Posted: 2018年1月02日(火) 14:30
by ankou25255
amata1219さんありがとうございます!
返信遅れてしまって申し訳ないです!
おかげで解決しました!

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

投稿記事Posted: 2018年1月07日(日) 12:21
by smk7758
ゲスト さんが書きました:プレイヤーをテレポートせずに、YawとPitchのみを変更する方法はありますか?

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

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

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

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

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

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

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

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

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

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

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

投稿記事Posted: 2018年1月09日(火) 16:18
by 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制作】

投稿記事Posted: 2018年1月10日(水) 06:54
by ankou2525
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制作】

投稿記事Posted: 2018年1月10日(水) 22:29
by 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文などで短く出来ないでしょうか。
ご意見を頂けたら幸いです。

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

投稿記事Posted: 2018年1月10日(水) 23:11
by smk7758
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制作】

投稿記事Posted: 2018年1月10日(水) 23:24
by 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() ってのがあるよ)

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

投稿記事Posted: 2018年1月11日(木) 01:17
by smk7758
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制作】

投稿記事Posted: 2018年1月11日(木) 09:52
by ankou2525
フォーラムの過去の質問を参考にしたり調べてみたりしてもわからなかったので質問します。
コード: 全て選択
   @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制作】

投稿記事Posted: 2018年1月12日(金) 02:16
by King(qpwakaba)
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を使うとか,ちょっとごり押しっぽいコード書かないと厳しいかも。