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

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

返信する

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

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

ファイルを添付します

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

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

投稿記事 by なつ@krkm_tp » 2018年2月21日(水) 00:32

blacklistを作成するpluginを作っていまして、
わからない点が少しあるので質問させていただきます。

Configを扱うのが今回初めてです。
serverに接続したことのある、ないを問わずコマンドでPlayerNameを打つとUUIDがconfigに保存され、コマンドでUUIDをplayernameで出してくる方法がわかりません。
わかる方教えてください。よろしくお願いいたします。

途中のコードです。
コード: 全て選択
               else if(args[0].equals("add")) {
                  //configにargs[0]で打ったPlayerNameのUUIDを追加する処理
                  return true;
               }
               else if(args[0].equals("remove")) {
                  //configの中からargs[0]で打ったPlayerNameのUUIDを削除する処理
                  return true;
               }
               else if(args[0].equals("check")) {
                  //configにあるコマンドで打ったPlayerNameのUUIDがあるか確認する処理
                  return true;
               }
               else if((args[0].equals("list"))|(args[0].equals("l"))) {
                  //configにあるUUIDをPlayernameで全て表示させる処理

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

投稿記事 by nobody » 2018年2月17日(土) 07:45

>amata1219さん
何度もどうもありがとうございます!
こんなあっさりしたアプローチがあったとは不覚でした……

試してみたのですが、教えて頂いたコードだと英名で表示されます。
ChatMessageType.ACTION_BAR を ChatMessageType.CHAT に変えると、チャット欄に出てきた文字列は和名になっているのでちょっと不可解。
教えて頂いた方向でもう少し探ってみます。

どうもありがとうございました。

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

投稿記事 by amata1219 » 2018年2月16日(金) 22:09

nobody さんが書きました:たびたび質問させていただき恐縮です。
spigot1.12で開発しております。

MC1.11から追加されたアクションバーに、翻訳されたアイテム名を表示する方法があればご教示頂く事は出来ますでしょうか。

こちらで2回ほど質問させていただき、翻訳されたアイテム名をチャットに表示する事までは出来たのですが、
次の段階として同じ文字列をアクションバーに表示させたいです。
以下、足搔いたコードになります。

コード: 全て選択
@EventHandler(ignoreCancelled = true)
public void onPlayerMoveEvent(PlayerMoveEvent event) {

   // プレイヤーの向いている方向にあるブロックを取得
   Player player = event.getPlayer();
   Block block = player.getTargetBlock((Set<Material>)null, 5);

   // ブロックのアイテム名を取得
   Material material = block.getType();
   net.minecraft.server.v1_12_R1.ItemStack item = CraftItemStack.asNMSCopy(new ItemStack(material));
   String name = item.getItem().a(item) + ".name";
   TranslatableComponent component = new TranslatableComponent(name);
   
   // アイテム名をチャットに表示
//   player.spigot().sendMessage(component);

   // アイテム名をアクションバーに表示
   String message = component.getTranslate();
   CraftPlayer p = (CraftPlayer) player;
   IChatBaseComponent cbc = ChatSerializer.a("{\"text\": \"" + message + "\"}");
   PacketPlayOutChat ppoc = new PacketPlayOutChat(cbc, ChatMessageType.GAME_INFO);
   p.getHandle().playerConnection.sendPacket(ppoc);
}


上記だと、「item.****.name」と言うID名(?)がアクションバーに表示されます。
以前こちらで伺ったアイテム名の翻訳は、spigotの機能を使ったものだったので、もしかしてアクションバーで同じことをするのは無理なのかもしれないと思いつつ……

ちなみにアクションバーを使っているのは丁度良い位置と大きさがアクションバーのそれだからなので、
タイトル機能(アクションバー機能)以外で、アクションバーの位置に翻訳されたアイテム名を表示できるのであれば、別の手段を使う事も考慮したいです。

たびたびお騒がせして申し訳ありませんが、以上よろしくお願いいたします。


nobodyさん、こんにちは。
下記コードで送信した場合は上手くいきますでしょうか?
NMSも必要とせず、簡潔な記述になりますし動作するならこちらが良いかと思われます。
未検証ですので正常に動作しなかった場合は申し訳ありません_(:3 ∠ )_。

コード: 全て選択
import net.md_5.bungee.api.ChatMessageType;
import net.md_5.bungee.api.chat.TranslatableComponent;

Player p = e.getPlayer();
TranslatableComponent component = new TranslatableComponent("item.swordDiamond.name");
p.spigot().sendMessage(ChatMessageType.ACTION_BAR, component);

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

投稿記事 by TA3 » 2018年2月16日(金) 21:29

sendMessageでcomponentをそのまま出力しているのでアクションバーにもcomponentを送れば良いんじゃないんです...?

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

投稿記事 by nobody » 2018年2月16日(金) 21:05

たびたび質問させていただき恐縮です。
spigot1.12で開発しております。

MC1.11から追加されたアクションバーに、翻訳されたアイテム名を表示する方法があればご教示頂く事は出来ますでしょうか。

こちらで2回ほど質問させていただき、翻訳されたアイテム名をチャットに表示する事までは出来たのですが、
次の段階として同じ文字列をアクションバーに表示させたいです。
以下、足搔いたコードになります。

コード: 全て選択
@EventHandler(ignoreCancelled = true)
public void onPlayerMoveEvent(PlayerMoveEvent event) {

   // プレイヤーの向いている方向にあるブロックを取得
   Player player = event.getPlayer();
   Block block = player.getTargetBlock((Set<Material>)null, 5);

   // ブロックのアイテム名を取得
   Material material = block.getType();
   net.minecraft.server.v1_12_R1.ItemStack item = CraftItemStack.asNMSCopy(new ItemStack(material));
   String name = item.getItem().a(item) + ".name";
   TranslatableComponent component = new TranslatableComponent(name);
   
   // アイテム名をチャットに表示
//   player.spigot().sendMessage(component);

   // アイテム名をアクションバーに表示
   String message = component.getTranslate();
   CraftPlayer p = (CraftPlayer) player;
   IChatBaseComponent cbc = ChatSerializer.a("{\"text\": \"" + message + "\"}");
   PacketPlayOutChat ppoc = new PacketPlayOutChat(cbc, ChatMessageType.GAME_INFO);
   p.getHandle().playerConnection.sendPacket(ppoc);
}


上記だと、「item.****.name」と言うID名(?)がアクションバーに表示されます。
以前こちらで伺ったアイテム名の翻訳は、spigotの機能を使ったものだったので、もしかしてアクションバーで同じことをするのは無理なのかもしれないと思いつつ……

ちなみにアクションバーを使っているのは丁度良い位置と大きさがアクションバーのそれだからなので、
タイトル機能(アクションバー機能)以外で、アクションバーの位置に翻訳されたアイテム名を表示できるのであれば、別の手段を使う事も考慮したいです。

たびたびお騒がせして申し訳ありませんが、以上よろしくお願いいたします。

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

投稿記事 by nobody » 2018年2月15日(木) 22:42

>amata1219さん
回答、どうもありがとうございました!
お陰で期待していた動作をする事が出来るようになりました。

大変助かりました。
どうもありがとうございました。

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

投稿記事 by amata1219 » 2018年2月15日(木) 18:23

nobody さんが書きました:申し訳ありません、再び質問させていただきます……

toyblocksさんに教えて貰ったやり方である程度実装できたのですが、
取得したItemStackをTranslatableComponentに通す時、Material.toString()の値のままでは期待通り翻訳してくれない事が分かりました。
(ダイヤ剣ならitem.swordDiamond.nameと言う文字列に変換する必要がある)

上記の様な、「Material.DIAMOND_SWORD」を「item.swordDiamond.name」に変換する方法についてご教示頂く事は出来ますでしょうか。

独自に調べてCraftItemStackを使うとうまく行きそう?な気はしていますが、どうも期待通りに動いてくれませんでした。
以下、試行コードです。

コード: 全て選択
@EventHandler(ignoreCancelled = true)
public void onPlayerMoveEvent(PlayerMoveEvent event) {

   // プレイヤーの向いている方向にあるブロックを取得
   Player player = event.getPlayer();
   Block block = player.getTargetBlock((Set<Material>)null, 5);

   // ブロックのアイテム名を表示
   Material material = block.getType();
   ItemStack item = new ItemStack(material);
   String str = CraftItemStack.asNMSCopy(item).getName();
   TranslatableComponent component = new TranslatableComponent(str);

   player.spigot().sendMessage(component);
}


このコードだと、文字列strには単純にアイテムの英名が入るようです。
「item.swordDiamond.name」のような形にはなってくれませんでした。

以上、よろしくお願いいたします。



nobodyさん、こんにちは。
その様な文字列は、net.minecraft.server.v1_12_R1.Itemクラスのメソッドより取得する事が可能です。

コード: 全て選択
net.minecraft.server.v1_12_R1.ItemStack item = CraftItemStack.asNMSCopy(new ItemStack(Material.DIAMOND_SWORD));
System.out.println(item.getItem().a(item) + ".name");


item.getItem().a(item)から文字列"item.swordDiamond"を取得し、".name"を付け加えるだけで大丈夫です。

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

投稿記事 by nobody » 2018年2月15日(木) 12:56

申し訳ありません、再び質問させていただきます……

toyblocksさんに教えて貰ったやり方である程度実装できたのですが、
取得したItemStackをTranslatableComponentに通す時、Material.toString()の値のままでは期待通り翻訳してくれない事が分かりました。
(ダイヤ剣ならitem.swordDiamond.nameと言う文字列に変換する必要がある)

上記の様な、「Material.DIAMOND_SWORD」を「item.swordDiamond.name」に変換する方法についてご教示頂く事は出来ますでしょうか。

独自に調べてCraftItemStackを使うとうまく行きそう?な気はしていますが、どうも期待通りに動いてくれませんでした。
以下、試行コードです。

コード: 全て選択
@EventHandler(ignoreCancelled = true)
public void onPlayerMoveEvent(PlayerMoveEvent event) {

   // プレイヤーの向いている方向にあるブロックを取得
   Player player = event.getPlayer();
   Block block = player.getTargetBlock((Set<Material>)null, 5);

   // ブロックのアイテム名を表示
   Material material = block.getType();
   ItemStack item = new ItemStack(material);
   String str = CraftItemStack.asNMSCopy(item).getName();
   TranslatableComponent component = new TranslatableComponent(str);

   player.spigot().sendMessage(component);
}


このコードだと、文字列strには単純にアイテムの英名が入るようです。
「item.swordDiamond.name」のような形にはなってくれませんでした。

以上、よろしくお願いいたします。

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

投稿記事 by nobody » 2018年2月15日(木) 11:01

>toyblocksさん
回答ありがとうございました。
サーバー側で扱えない理由も納得です。
教えて頂いたTranslatableComponentを調べてみようと思います。

大変助かりました。
どうもありがとうございました。

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

投稿記事 by toyblocks » 2018年2月15日(木) 00:43

nobody さんが書きました:手法が良く分からなかったため、質問させていただきます。
使用環境は spigot 1.12.2 です。

プレイヤーが見ているブロックの名前を画面に表示するpluginを作成しています。

実際にプレイヤーが見ているブロックの情報を取得する事は出来たのですが、そのブロックの名前を取得する場所で躓いています。
以下のような形で試行したのですが、うまく取得できませんでした。

コード: 全て選択
@EventHandler(ignoreCancelled = true)
public void onPlayerMoveEvent(PlayerMoveEvent event) {

    // プレイヤーの向いている方向にあるブロックを取得
    Player player = event.getPlayer();
    Block block = player.getTargetBlock((Set<Material>)null, 5);

    // ブロックのアイテム名を取得
    Material material = block.getType();
    ItemStack item = new ItemStack(material);
    String name = item.getItemMeta().getDisplayName();
    
    // ブロック名を表示
    player.sendMessage(name);
}
 


上記だと、空文字になりました。
どうやらMetaItemから引けるgetDisplayName()は、例えば金床で付けた名前しか取得できず、初期の名前を持ってくるのには不向きのようです。
material.toString()も試してみましたが、こちらは定数名をそのまま文字列にしたものしか取得できませんでした。

取得したいアイテム名としては、例えばホットバーでアイテムにカーソルを合わせた時、ホットバー上部に表示されるアイテム名と同じ文字列を希望しています。
これを取得する方法について、ご教示頂けませんでしょうか。
※例えばswitch-caseを使ってmaterial定数に合致する文字列をコード上に書き込むような手法はなるべく避けたいです。

以上、よろしくお願いいたします。


nobodyさん、質問の趣旨と多少異なるかもしれませんが、少しヒントになるかもしれないので書き込みをさせて頂きます。

現在のマインクラフトサーバーは、クライアントに対して素の状態のアイテムの「名前」は送信していません。というのも、英語のプレイヤーには「Stone」、日本語のプレイヤーには「石」といった風に、あるアイテムがどう表示されるかはクライアント依存であるからです。そのため、サーバーからはアイテムIDが埋め込まれた、特殊な形式のテキストが送信されているだけで、そのテキストをクライアントが必要な個所を翻訳するという形となっています。

もしあなたが、サーバー側でその「名前」を使った処理をする必要性がなく、ただ単にクライアント側に表示させることだけを目的にしているのであれば、TranslatableComponentの利用をお勧めします。BukkitではなくSpigotのみでしか利用できない機能ですが、こちらのjavadocのメソッドから、`net.md_5.bungee.api.chat.TranslatableComponent`を流し込むことで、クライアントサイドでの翻訳を可能にします。

ここで詳細を語らずとも、検索すれば関連ドキュメントを発見できるかと思いますので、もし興味があるようでしたらお試しください。
またわからないことがあった際には、質問して頂ければと思います。

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

投稿記事 by nobody » 2018年2月14日(水) 14:50

手法が良く分からなかったため、質問させていただきます。
使用環境は spigot 1.12.2 です。

プレイヤーが見ているブロックの名前を画面に表示するpluginを作成しています。

実際にプレイヤーが見ているブロックの情報を取得する事は出来たのですが、そのブロックの名前を取得する場所で躓いています。
以下のような形で試行したのですが、うまく取得できませんでした。

コード: 全て選択
@EventHandler(ignoreCancelled = true)
public void onPlayerMoveEvent(PlayerMoveEvent event) {

    // プレイヤーの向いている方向にあるブロックを取得
    Player player = event.getPlayer();
    Block block = player.getTargetBlock((Set<Material>)null, 5);

    // ブロックのアイテム名を取得
    Material material = block.getType();
    ItemStack item = new ItemStack(material);
    String name = item.getItemMeta().getDisplayName();
    
    // ブロック名を表示
    player.sendMessage(name);
}
 


上記だと、空文字になりました。
どうやらMetaItemから引けるgetDisplayName()は、例えば金床で付けた名前しか取得できず、初期の名前を持ってくるのには不向きのようです。
material.toString()も試してみましたが、こちらは定数名をそのまま文字列にしたものしか取得できませんでした。

取得したいアイテム名としては、例えばホットバーでアイテムにカーソルを合わせた時、ホットバー上部に表示されるアイテム名と同じ文字列を希望しています。
これを取得する方法について、ご教示頂けませんでしょうか。
※例えばswitch-caseを使ってmaterial定数に合致する文字列をコード上に書き込むような手法はなるべく避けたいです。

以上、よろしくお願いいたします。

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

投稿記事 by minecraftidk » 2018年2月12日(月) 11:23

MCCore v1.64 SKillAPI v3.103 Bukkit v1.11.2 Java8です
自作pluginからSKILLAPIのプレイヤーの職業(CLASS)の名前を取得する方法が欲しいです。
PlayerクラスのgetPlayerListからTABキーに表示されている職業+名前を取得しようと考えましたが取得できるのは
名前だけでした。またSKILLAPIのGITHUBやAPIも確認してみましたがわからなかったため質問させていただきました。
職業を取得するのはそもそも可能なんですかね?
足りてない情報がありましたら指摘お願いします。

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

投稿記事 by ゲスト » 2018年2月07日(水) 12:45

>>TA3さん
ありがとうございました。期待通りの実装ができました。

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

投稿記事 by TA3 » 2018年2月06日(火) 23:26

ゲスト さんが書きました:Bukkit1.12.2,Java8です。
自作プラグインから、その他のプラグインのコマンドを実行する方法を教えて下さい。
具体的な使用方法は、自作プラグインでイベントを監視し、発火したところでPermissionEXの権限設定用のコマンドをコンソールに実行させたいのです。
ご返答よろしくお願いします。


コマンドを実行させるだけなら Bukkit.dispatchCommand(Bukkit.getConsoleSender(), "/pex ...."); で可能です。

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

投稿記事 by ゲスト » 2018年2月06日(火) 22:47

Bukkit1.12.2,Java8です。
自作プラグインから、その他のプラグインのコマンドを実行する方法を教えて下さい。
具体的な使用方法は、自作プラグインでイベントを監視し、発火したところでPermissionEXの権限設定用のコマンドをコンソールに実行させたいのです。
ご返答よろしくお願いします。

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);
      }
   }
}

ページトップ

x