ページ 128131

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

投稿記事Posted: 2017年4月11日(火) 11:53
by Lemon18
Silvers_Cat さんが書きました:繰り返しすみません、Lemon18氏の言うとおりに第4引数を以下の通りに変更しましたがやはりうまく行きません。
コード: 全て選択
//試しにTESTにしてみるがうまくいかない
PlayerInfoData newPlayerInfoData = new PlayerInfoData(profile, 5, playerInfoData.getGameMode(), WrappedChatComponent.fromText("TEST"));

WrappedChatComponent.formTextの引数を間違えているのでしょうか?


私の方でも試してみましたが、同じ結果でした。そこは関係なかったみたいです、ごめんなさい。

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

投稿記事Posted: 2017年4月23日(日) 02:05
by オリゼリ
プレイヤーごとのループ文の作り方を教えてください

多分これだとサーバー全体のループだと思います
コード: 全て選択
                        BukkitScheduler scheduler; = Bukkit.getServer().getScheduler();
                        task = scheduler.scheduleSyncRepeatingTask(this, new Runnable() {
                            @Override
                            public void run() {
                             //code
                             }
                        }, 0L, 1L);


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

投稿記事Posted: 2017年4月23日(日) 08:30
by amata1219
オリゼリ さんが書きました:プレイヤーごとのループ文の作り方を教えてください

多分これだとサーバー全体のループだと思います
コード: 全て選択
                        BukkitScheduler scheduler; = Bukkit.getServer().getScheduler();
                        task = scheduler.scheduleSyncRepeatingTask(this, new Runnable() {
                            @Override
                            public void run() {
                             //code
                             }
                        }, 0L, 1L);


オリゼリさん、こんにちは。

対象のプレイヤーの状態が不明ですので、ここではオンラインプレイヤーと仮定して説明しますね。
答えは非常に単純明快で、下記コードを参考にしてみてくださいね。
コード: 全て選択
for(Player p : plugin.getServer().getOnlinePlayers()){
         //ここにプレイヤー単位の処理内容を実装
      }

サーバーから全オンラインプレイヤーを取得しプレイヤー単位に分けることで、お望みの動作が実現出来ますよ。

1tick毎に処理を実行する状態になっているようですが大丈夫でしょうか…?
1秒は20tickですので、現在の状態で下手に重い処理でも実装すると、サーバーが落ちる可能性があります。

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

投稿記事Posted: 2017年4月23日(日) 17:24
by オリゼリ
amata1219 さんが書きました:
オリゼリ さんが書きました:プレイヤーごとのループ文の作り方を教えてください

多分これだとサーバー全体のループだと思います
コード: 全て選択
                        BukkitScheduler scheduler; = Bukkit.getServer().getScheduler();
                        task = scheduler.scheduleSyncRepeatingTask(this, new Runnable() {
                            @Override
                            public void run() {
                             //code
                             }
                        }, 0L, 1L);


オリゼリさん、こんにちは。

対象のプレイヤーの状態が不明ですので、ここではオンラインプレイヤーと仮定して説明しますね。
答えは非常に単純明快で、下記コードを参考にしてみてくださいね。
コード: 全て選択
for(Player p : plugin.getServer().getOnlinePlayers()){
         //ここにプレイヤー単位の処理内容を実装
      }

サーバーから全オンラインプレイヤーを取得しプレイヤー単位に分けることで、お望みの動作が実現出来ますよ。

[spoiler]1tick毎に処理を実行する状態になっているようですが大丈夫でしょうか…?
1秒は20tickですので、現在の状態で下手に重い処理でも実装すると、サーバーが落ちる可能性があります。
[/spoiler]

すみませんコードはります
一部抜いて変更してありますがプラグインとしてはコマンドを打ったプレイヤーにアクションバーに文字を連続的に出すプラグインです
なのでプレイヤーごとにループさせプレイヤーごとに止めれるようにしたいのです
まだ説明不足のようでしたら教えてください
1tickなのは大丈夫です
コード: 全て選択
    public boolean onCommand(CommandSender sender, Command command, String c, String[] args) {
        Player player = (Player) sender;
        if (command.getName().equalsIgnoreCase("aaa")) {
            if (sender instanceof Player) {
                if (args.length == 0) {
                        scheduler = Bukkit.getServer().getScheduler();
                        task = scheduler.scheduleSyncRepeatingTask(this, new Runnable() {
        //code
                           sendChatAtionBar(player, aaa);
                        }, 0L, 1L);
                    return true;
                }
            }
        }
        return false;
    }

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

投稿記事Posted: 2017年4月25日(火) 09:36
by レイトン
質問なのですが
プレイヤーのレベルアップまでに必要な
経験値量をこっちでいじることって
bukkitにおいて可能なのでしょうか

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

投稿記事Posted: 2017年4月27日(木) 07:05
by amata1219
オリゼリ さんが書きました:
amata1219 さんが書きました:
オリゼリ さんが書きました:プレイヤーごとのループ文の作り方を教えてください

多分これだとサーバー全体のループだと思います
コード: 全て選択
                        BukkitScheduler scheduler; = Bukkit.getServer().getScheduler();
                        task = scheduler.scheduleSyncRepeatingTask(this, new Runnable() {
                            @Override
                            public void run() {
                             //code
                             }
                        }, 0L, 1L);


オリゼリさん、こんにちは。

対象のプレイヤーの状態が不明ですので、ここではオンラインプレイヤーと仮定して説明しますね。
答えは非常に単純明快で、下記コードを参考にしてみてくださいね。
コード: 全て選択
for(Player p : plugin.getServer().getOnlinePlayers()){
         //ここにプレイヤー単位の処理内容を実装
      }

サーバーから全オンラインプレイヤーを取得しプレイヤー単位に分けることで、お望みの動作が実現出来ますよ。

[spoiler]1tick毎に処理を実行する状態になっているようですが大丈夫でしょうか…?
1秒は20tickですので、現在の状態で下手に重い処理でも実装すると、サーバーが落ちる可能性があります。
[/spoiler]

すみませんコードはります
一部抜いて変更してありますがプラグインとしてはコマンドを打ったプレイヤーにアクションバーに文字を連続的に出すプラグインです
なのでプレイヤーごとにループさせプレイヤーごとに止めれるようにしたいのです
まだ説明不足のようでしたら教えてください
1tickなのは大丈夫です
コード: 全て選択
    public boolean onCommand(CommandSender sender, Command command, String c, String[] args) {
        Player player = (Player) sender;
        if (command.getName().equalsIgnoreCase("aaa")) {
            if (sender instanceof Player) {
                if (args.length == 0) {
                        scheduler = Bukkit.getServer().getScheduler();
                        task = scheduler.scheduleSyncRepeatingTask(this, new Runnable() {
        //code
                           sendChatAtionBar(player, aaa);
                        }, 0L, 1L);
                    return true;
                }
            }
        }
        return false;
    }


オリゼリさん、こんにちは。
何回を目安に処理を終了するのかは分かりませんが、スケジューラの処理内容に先日のfor分を組み込めば実装可能です。
コード: 全て選択
    public boolean onCommand(CommandSender sender, Command command, String c, String[] args) {
        Player player = (Player) sender;
        int i = 0;
        if (command.getName().equalsIgnoreCase("aaa")) {
            if (sender instanceof Player) {
                if (args.length == 0) {
                        scheduler = Bukkit.getServer().getScheduler();
                        task = scheduler.scheduleSyncRepeatingTask(this, new Runnable() {
                          i++;
                          if(i > 5){
                              task.cancel();
                         }
        for(Player p : plugin.getServer().getOnlinePlayers()){
         //ここにプレイヤー単位の処理内容を実装
                               }
                        }, 0L, 1L);
                    return true;
                }
            }
        }

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

投稿記事Posted: 2017年4月27日(木) 07:16
by amata1219
レイトン さんが書きました:質問なのですが
プレイヤーのレベルアップまでに必要な
経験値量をこっちでいじることって
bukkitにおいて可能なのでしょうか


レイトンさん、こんにちは。
恐らく不可能です。ただ、一定の経験値量を超えた場合に強制的に経験値量を増加させることで、擬似的にそういったシステムを作り出すことは可能です。

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

投稿記事Posted: 2017年4月30日(日) 22:37
by レモンティー
レイトン さんが書きました:質問なのですが
プレイヤーのレベルアップまでに必要な
経験値量をこっちでいじることって
bukkitにおいて可能なのでしょうか

bukkit単体では恐らく不可能ですが…
SkillAPIというPluginを使えば可能です。
configをいじってあげましょう。

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

投稿記事Posted: 2017年5月05日(金) 13:32
by pico
1.11.2でプラグインを作っているのですが、
打ったコマンドがそのままチャット欄に帰ってきてしまいます。

例:/testと打つ
チャット欄
/test

必要でしたらコードを載せます。
初めてなので何か不備がありましたら教えて下さい。

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

投稿記事Posted: 2017年5月05日(金) 13:40
by miyabi
pico さんが書きました:必要でしたらコードを載せます。
初めてなので何か不備がありましたら教えて下さい。

必要でしたらというか、コードが無いことには何も始まらないと思うのですが…。
今の情報だけで、どういう回答が貰えることを期待しているのでしょうか。

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

投稿記事Posted: 2017年5月05日(金) 13:49
by pico
miyabi さんが書きました:
pico さんが書きました:必要でしたらコードを載せます。
初めてなので何か不備がありましたら教えて下さい。

必要でしたらというか、コードが無いことには何も始まらないと思うのですが…。
今の情報だけで、どういう回答が貰えることを期待しているのでしょうか。


すみません...
コードです。

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

投稿記事Posted: 2017年5月05日(金) 14:28
by miyabi
pico さんが書きました:
miyabi さんが書きました:
pico さんが書きました:必要でしたらコードを載せます。
初めてなので何か不備がありましたら教えて下さい。

必要でしたらというか、コードが無いことには何も始まらないと思うのですが…。
今の情報だけで、どういう回答が貰えることを期待しているのでしょうか。


すみません...
コードです。

画像だと非常に利用しづらいので、コードそのものをBBCodeのCodeタグを利用して貼ってください。

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

投稿記事Posted: 2017年5月05日(金) 14:47
by ucchy
picoさん、

pico さんが書きました:1.11.2でプラグインを作っているのですが、
打ったコマンドがそのままチャット欄に帰ってきてしまいます。

例:/testと打つ
チャット欄
/test


onCommandメソッドで、return false で終わっているときは、plugin.yml に定義したコマンドの usage の内容が画面に表示されます。
おそらく、usage に "/test" と書いているのでしょう。

onCommandメソッドでは、
コード: 全て選択
if (cmd.getName().equalsIgnoreCase("headbuy")) {
// 中略
}
return false;


と実装しているので、/headbuy というコマンドでなければ、常にreturn false で何もせずに終了するように実装されているようです。

解決するには、

コード: 全て選択
if (cmd.getName().equalsIgnoreCase("test")) {


に変更するか、
plugin.yml の commands で、test を headbuy に変更して、/headbuy コマンドを実行してください。

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

投稿記事Posted: 2017年5月05日(金) 15:29
by pico
miyabi さんが書きました:
pico さんが書きました:
miyabi さんが書きました:
pico さんが書きました:必要でしたらコードを載せます。
初めてなので何か不備がありましたら教えて下さい。

必要でしたらというか、コードが無いことには何も始まらないと思うのですが…。
今の情報だけで、どういう回答が貰えることを期待しているのでしょうか。


すみません...
コードです。

画像だと非常に利用しづらいので、コードそのものをBBCodeのCodeタグを利用して貼ってください。


あ、わかりました。
すみません
コード: 全て選択
package picopicoplugin;

import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.Material;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.configuration.file.FileConfiguration;
import org.bukkit.entity.Player;
import org.bukkit.event.Listener;
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.ItemStack;
import org.bukkit.plugin.java.JavaPlugin;
public class Picopicoplugin extends JavaPlugin implements Listener {


    @Override
    public void onEnable() {
        getLogger().info("[でばっくう]正常に起動");

        getCommand("suzukita").setExecutor(this);

FileConfiguration config = this.getConfig();
config.options().copyDefaults(true);
this.saveConfig();
this.getServer().getPluginManager().registerEvents(this, this);
    }

    @Override
    public void onDisable() {
        getLogger().info("[でばっくう]正常に終了");
    }


    public boolean onCommand(Player p,CommandSender sender, Command cmd, String label, String[] args) {
       if (cmd.getName().equalsIgnoreCase("test")) {
          if (!(sender instanceof Player)) {
             sender.sendMessage(ChatColor.AQUA + "サーバー側からは実行できません。");
          } else {
             Inventory inv;
              inv = Bukkit.createInventory(null, 9, "頭の購入");
              p.openInventory(inv);
             return true;
          }
          return true;
       }
       return false;
    }
    }

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

投稿記事Posted: 2017年5月05日(金) 15:32
by pico
ucchy さんが書きました:picoさん、

pico さんが書きました:1.11.2でプラグインを作っているのですが、
打ったコマンドがそのままチャット欄に帰ってきてしまいます。

例:/testと打つ
チャット欄
/test


onCommandメソッドで、return false で終わっているときは、plugin.yml に定義したコマンドの usage の内容が画面に表示されます。
おそらく、usage に "/test" と書いているのでしょう。

onCommandメソッドでは、
コード: 全て選択
if (cmd.getName().equalsIgnoreCase("headbuy")) {
// 中略
}
return false;


と実装しているので、/headbuy というコマンドでなければ、常にreturn false で何もせずに終了するように実装されているようです。

解決するには、

コード: 全て選択
if (cmd.getName().equalsIgnoreCase("test")) {


に変更するか、
plugin.yml の commands で、test を headbuy に変更して、/headbuy コマンドを実行してください。


plugin.ymlの方でもheadbuyにしているのですが...

コード: 全て選択
name: picopicoplugin
main: picopicoplugin.Picopicoplugin
version: 0.0.1
commands:
   headbuy:
      description: buy the head of the player.
      usage: /<command>
      default: true
      permission: picopicoplugin.headbuy
      permission-message: You don't have <permission>

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

投稿記事Posted: 2017年5月05日(金) 15:45
by ucchy
pico さんが書きました:plugin.ymlの方でもheadbuyにしているのですが...


でしたら、/test コマンドではなく、/headbuy コマンドを試してみてください。

それでもうまくいかないようなら、デバッグで出力して、うまく動いているかを確認してみましょう。
例えば、onCommandメソッドの最初の行(ifの前)に、次のように行を挿入してみてください。

コード: 全て選択
    public boolean onCommand(Player p,CommandSender sender, Command cmd, String label, String[] args) {
       System.out.println("デバッグ → " + cmd.getName()); // ←この行を追加
       if (cmd.getName().equalsIgnoreCase("headbuy")) { // ←ここは必ず、plugin.yml の commands に書いたコマンド名と同じにする


これで試してみて、"デバッグ →" とコンソールに表示されないなら、そもそも onCommand メソッドが呼び出されていません。
"デバッグ →" とコンソールに表示されるのに、そのあとに続く名前が headbuy ではないなら、その表示された内容を参考にif文を修正してください。

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

投稿記事Posted: 2017年5月05日(金) 16:05
by pico
ucchy さんが書きました:
pico さんが書きました:plugin.ymlの方でもheadbuyにしているのですが...


でしたら、/test コマンドではなく、/headbuy コマンドを試してみてください。

それでもうまくいかないようなら、デバッグで出力して、うまく動いているかを確認してみましょう。
例えば、onCommandメソッドの最初の行(ifの前)に、次のように行を挿入してみてください。

コード: 全て選択
    public boolean onCommand(Player p,CommandSender sender, Command cmd, String label, String[] args) {
       System.out.println("デバッグ → " + cmd.getName()); // ←この行を追加
       if (cmd.getName().equalsIgnoreCase("headbuy")) { // ←ここは必ず、plugin.yml の commands に書いたコマンド名と同じにする


これで試してみて、"デバッグ →" とコンソールに表示されないなら、そもそも onCommand メソッドが呼び出されていません。
"デバッグ →" とコンソールに表示されるのに、そのあとに続く名前が headbuy ではないなら、その表示された内容を参考にif文を修正してください。


試してみましたがどうやらonCommandメソッドが呼び出されていないようです...
どうすればよいでしょうか?

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

投稿記事Posted: 2017年5月05日(金) 16:10
by ucchy
pico さんが書きました:試してみましたがどうやらonCommandメソッドが呼び出されていないようです...
どうすればよいでしょうか?


まず、他のすべてのプラグインを取り除いて、テストするプラグイン1つだけを導入しましょう。

plugin.yml の commands に書いたコマンド名で、onCommand が呼び出されますので、
必ず同じコマンド名に設定してください(両方とも "headbuy" にする)。

プラグインは1つしか導入していないのに、それでも onCommand が呼び出されないとしたら、
プラグインはそもそもエラーが起こって起動していない可能性があります。
コンソールに書かれているログの内容を注意深く読んで、エラーを解決してみてください。

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

投稿記事Posted: 2017年5月05日(金) 16:18
by pico
ucchy さんが書きました:
pico さんが書きました:試してみましたがどうやらonCommandメソッドが呼び出されていないようです...
どうすればよいでしょうか?


まず、他のすべてのプラグインを取り除いて、テストするプラグイン1つだけを導入しましょう。

plugin.yml の commands に書いたコマンド名で、onCommand が呼び出されますので、
必ず同じコマンド名に設定してください(両方とも "headbuy" にする)。

プラグインは1つしか導入していないのに、それでも onCommand が呼び出されないとしたら、
プラグインはそもそもエラーが起こって起動していない可能性があります。
コンソールに書かれているログの内容を注意深く読んで、エラーを解決してみてください。


プラグインを一つにしてみてもonCommandメソッドが呼び出されていないのですが、onEnableメソッドは呼び出されているのでプラグインは動いてると思います...
本当にどうすればいいのかわからない状態です。

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

投稿記事Posted: 2017年5月05日(金) 16:52
by ucchy
picoさん、onCommandが呼び出されない原因がわかりました。

onCommandメソッドの引数ですが、ここを変更していますね?
ここは変更してはいけません。オーバーロードされて別のonCommandメソッドとして認識されています。

コード: 全て選択
    public boolean onCommand(Player p,CommandSender sender, Command cmd, String label, String[] args) {


ここですが、「Player p」 という引数を勝手に足してはいけません。

コード: 全て選択
    public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) {


に戻してください。

プレイヤーを取得したいのであれば、コマンドの処理の途中に、
コード: 全て選択
Player p = (Player)sender;

を挿入してキャストしてあげてください。

実装例:
コード: 全て選択
package picopicoplugin;

import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.configuration.file.FileConfiguration;
import org.bukkit.entity.Player;
import org.bukkit.event.Listener;
import org.bukkit.inventory.Inventory;
import org.bukkit.plugin.java.JavaPlugin;

public class Picopicoplugin extends JavaPlugin implements Listener {

    @Override
    public void onEnable() {
        getLogger().info("[でばっくう]正常に起動");

        //getCommand("suzukita").setExecutor(this);

        FileConfiguration config = this.getConfig();
        config.options().copyDefaults(true);
        this.saveConfig();
        this.getServer().getPluginManager().registerEvents(this, this);
    }

    @Override
    public void onDisable() {
        getLogger().info("[でばっくう]正常に終了");
    }

    @Override
    public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) {
        if (cmd.getName().equalsIgnoreCase("headbuy")) {
            if (!(sender instanceof Player)) {
                sender.sendMessage(ChatColor.AQUA + "サーバー側からは実行できません。");
            } else {
                Player p = (Player)sender;
                Inventory inv;
                inv = Bukkit.createInventory(null, 9, "頭の購入");
                p.openInventory(inv);
                return true;
            }
            return true;
        }
        return false;
    }
}



なお、コマンド suzukita がplugin.yml に登録されていないと、
コンソールに「[でばっくう]正常に起動」と表示された直後に、NullPointerException が発生しているはずです。これは致命的なエラーで、プラグインは正常に起動していません。
もし、コマンド suzukita が不要であれば、
コード: 全て選択
getCommand("suzukita").setExecutor(this);

の部分を削除しておいてください。