最新版 |
編集中の文章 |
8行目: |
8行目: |
| このチュートリアルを理解するためには、/scoreboard コマンドを試して、 | | このチュートリアルを理解するためには、/scoreboard コマンドを試して、 |
| Scoreboardシステムの仕様をよく理解することが一番の近道です。 | | Scoreboardシステムの仕様をよく理解することが一番の近道です。 |
− | コマンドの使い方は、[http://ch.nicovideo.jp/minecrafter/blomaga/ar95807 こちら]や[http://www.nicovideo.jp/watch/sm20410540 こちら]を参考にしてみて | + | コマンドの使い方は、[http://ch.nicovideo.jp/minecrafter/blomaga/ar95807 こちら]や[http://www.nicovideo.jp/watch/sm20410540 こちら]を参考にしてみてください。 |
| | | |
− | =スコアボードシステムの基本的な使い方!= | + | =スコアボードシステムの基本的な使い方= |
| | | |
| まず、ScoreboardManager を取得します。 | | まず、ScoreboardManager を取得します。 |
43行目: |
43行目: |
| team.setPrefix("prefix"); | | team.setPrefix("prefix"); |
| | | |
− | // suffixを登録します。これは、TABキーを押したときのプレイヤーリストと、 | + | // prefixを登録します。これは、TABキーを押したときのプレイヤーリストと、 |
| // 頭の上のプレイヤー名で、該当チームに所属するプレイヤーの名前の"後"に、 | | // 頭の上のプレイヤー名で、該当チームに所属するプレイヤーの名前の"後"に、 |
| // 指定した文字列が付きます。 | | // 指定した文字列が付きます。 |
55行目: |
55行目: |
| // チームメンバー同士の攻撃ができるかどうかを設定します。 | | // チームメンバー同士の攻撃ができるかどうかを設定します。 |
| // true で攻撃が有効になり、false で攻撃が無効になります。 | | // true で攻撃が有効になり、false で攻撃が無効になります。 |
− | team.setAllowFriendlyFire(false); | + | team.setAllowFriendlyFire(false) |
| | | |
| // 透明化しているチームメンバーを見えるようにするかどうかを設定します。 | | // 透明化しているチームメンバーを見えるようにするかどうかを設定します。 |
80行目: |
80行目: |
| 特定のプレイヤーに対するObjectiveでの点数を設定します。 | | 特定のプレイヤーに対するObjectiveでの点数を設定します。 |
| <source lang = "java"> | | <source lang = "java"> |
− | // ※ CraftBukkit 1.7.5 以前の場合
| |
| Score score = objective.getScore(player); | | Score score = objective.getScore(player); |
− | score.setScore(42);
| |
− |
| |
− | // ※ CraftBukkit 1.7.8 以降の場合は、getScoreメソッドにはStringを使ってください。
| |
− | Score score = objective.getScore(player.getName());
| |
| score.setScore(42); | | score.setScore(42); |
| </source> | | </source> |
95行目: |
90行目: |
| 特定のプレイヤーのスコアをリセットするには、次のようにします。 | | 特定のプレイヤーのスコアをリセットするには、次のようにします。 |
| <source lang = "java"> | | <source lang = "java"> |
− | // ※ CraftBukkit 1.7.5 以前の場合
| |
| board.resetScores(player); | | board.resetScores(player); |
− |
| |
− | // ※ CraftBukkit 1.7.8 以降の場合
| |
− | board.resetScores(player.getName());
| |
| </source> | | </source> |
| | | |
110行目: |
101行目: |
| 最初のgetMainScoreboard()をgetNewScoreboard()にしてください。 | | 最初のgetMainScoreboard()をgetNewScoreboard()にしてください。 |
| | | |
− | <source lang = "java"> | + | <pre> |
| Scoreboard board = manager.getNewScoreboard(); | | Scoreboard board = manager.getNewScoreboard(); |
− | </source> | + | </pre> |
| | | |
| 専用のScoreboardシステムでは、デフォルトで表示されません。 | | 専用のScoreboardシステムでは、デフォルトで表示されません。 |
− | 各プレイヤーに、自分のプラグインで作成したスコアボードを表示したい時は、setScoreboardを使用してスコアボードを設定してください。
| + | 各プレイヤーの表示を設定するには、setScoreboardを使用してください。 |
| | | |
− | <source lang = "java"> | + | <pre> |
− | for ( Player player : Bukkit.getOnlinePlayers() ) { | + | for ( Player online : Bukkit.getOnlinePlayers() ) { |
− | player.setScoreboard(board); | + | online.setScoreboard(board); |
| } | | } |
− | </source> | + | </pre> |
| | | |
| | | |
| =サイドバーでのカスタム項目の設定= | | =サイドバーでのカスタム項目の設定= |
| | | |
− | サイドバーにObjectiveを設定している場合、ダミーの項目を登録することで、
| + | サイドバーにObjectiveを設定している場合、ダミーのOfflinePlayerを登録することで、 |
| カスタム項目を表示することが可能です。 | | カスタム項目を表示することが可能です。 |
| カスタム項目のスコアを登録するには、次のようにします。 | | カスタム項目のスコアを登録するには、次のようにします。 |
| | | |
− | <source lang = "java"> | + | <pre> |
− | // ※ CraftBukkit 1.7.5 以前の場合は、OfflinePlayerを生成して設定してください。
| |
| Score score = objective.getScore(Bukkit.getOfflinePlayer(name)); | | Score score = objective.getScore(Bukkit.getOfflinePlayer(name)); |
| score.setScore(99); | | score.setScore(99); |
− | | + | </pre> |
− | // ※ CraftBukkit 1.7.8 以降の場合は、そのままStringを指定してください。
| |
− | Score score = objective.getScore(name);
| |
− | score.setScore(99);
| |
− | </source> | |
| | | |
| カスタム項目のスコアをリセットするには、次のようにします。 | | カスタム項目のスコアをリセットするには、次のようにします。 |
− | <source lang = "java"> | + | <pre> |
− | // ※ CraftBukkit 1.7.5 以前の場合
| |
| board.resetScores(Bukkit.getOfflinePlayer(name)); | | board.resetScores(Bukkit.getOfflinePlayer(name)); |
− | | + | </pre> |
− | // ※ CraftBukkit 1.7.8 以降の場合
| |
− | board.resetScores(name);
| |
− | </source> | |
| | | |
| | | |
| 例 | | 例 |
− | <source lang = "java"> | + | <pre> |
− | // ※ CraftBukkit 1.7.8 以降の場合
| + | Score score = objective.getScore(Bukkit.getOfflinePlayer(ChatColor.GREEN + "kills:")); |
− | Score score = objective.getScore(ChatColor.GREEN + "kills:"); | |
| score.setScore(99); | | score.setScore(99); |
− | </source> | + | </pre> |
| | | |
| [[Image:scoreboard2.png]] | | [[Image:scoreboard2.png]] |
| + | |
| + | |
| | | |
| =簡単な実装例= | | =簡単な実装例= |
| | | |
− | ==体力表示プラグイン==
| + | 各プレイヤーの頭の下に、現在の体力を表示します。 |
− | 各プレイヤーの頭の上に、現在の体力を表示します。
| |
| なお、Criteria に "health" を指定した場合、各プレイヤーの体力が増減するたびに、自動的に更新されます。 | | なお、Criteria に "health" を指定した場合、各プレイヤーの体力が増減するたびに、自動的に更新されます。 |
| (プラグイン側から更新を実施する必要はありません。) | | (プラグイン側から更新を実施する必要はありません。) |
| | | |
− | <source lang = "java"> | + | <pre> |
− | import org.bukkit.Bukkit;
| + | ScoreboardManager manager = Bukkit.getScoreboardManager(); |
− | import org.bukkit.entity.Player;
| + | Scoreboard board = manager.getNewScoreboard(); |
− | import org.bukkit.event.Listener;
| |
− | import org.bukkit.plugin.java.JavaPlugin;
| |
− | import org.bukkit.scoreboard.DisplaySlot;
| |
− | import org.bukkit.scoreboard.Objective;
| |
− | import org.bukkit.scoreboard.Scoreboard;
| |
− | import org.bukkit.scoreboard.ScoreboardManager;
| |
| | | |
− | /**
| + | Objective objective = board.registerNewObjective("showhealth", "health"); |
− | * 各プレイヤーの頭の上に、現在の体力を表示するプラグイン
| + | objective.setDisplaySlot(DisplaySlot.BELOW_NAME); |
− | */
| + | objective.setDisplayName("/ 20"); |
− | public class ScoreboardHealthPlugin extends JavaPlugin {
| |
− | | |
− | /** オブジェクティブの名前 */
| |
− | private static final String OBJECTIVE_NAME = "showhealth";
| |
− |
| |
− | /**
| |
− | * プラグインが有効化されたときに呼び出されます
| |
− | * @see org.bukkit.plugin.java.JavaPlugin#onEnable()
| |
− | */
| |
− | @Override
| |
− | public void onEnable() {
| |
− |
| |
− | // メインスコアボードを取得します。
| |
− | ScoreboardManager manager = Bukkit.getScoreboardManager();
| |
− | Scoreboard board = manager.getMainScoreboard();
| |
| | | |
− | // オブジェクティブが既に登録されているかどうか確認し、
| + | for(Player online : Bukkit.getOnlinePlayers()){ |
− | // 登録されていないなら新規作成します。
| + | online.setScoreboard(board); |
− | Objective objective = board.getObjective(OBJECTIVE_NAME);
| + | online.setHealth(online.getHealth()); |
− | if ( objective == null ) {
| |
− | objective = board.registerNewObjective(OBJECTIVE_NAME, "health");
| |
− | objective.setDisplaySlot(DisplaySlot.BELOW_NAME);
| |
− | objective.setDisplayName("/ 20");
| |
− | }
| |
− |
| |
− | // 全プレイヤーの現在の体力を反映します
| |
− | for (Player player : Bukkit.getOnlinePlayers()) {
| |
− | objective.getScore(player).setScore((int)player.getHealth());
| |
− | }
| |
− | }
| |
| } | | } |
− | </source> | + | </pre> |
− | | |
− | ==チーム分けプラグイン==
| |
− | プレイヤーを2チームに分けるサンプルです。
| |
− | | |
− | TABキーの名前リストと、頭の上の名前表示に、チームの色が付きます。
| |
− | また、チームメンバー間の攻撃が無効になります。
| |
− | | |
− | <source lang = "java">
| |
− | import org.bukkit.Bukkit;
| |
− | import org.bukkit.ChatColor;
| |
− | import org.bukkit.command.Command;
| |
− | import org.bukkit.command.CommandSender;
| |
− | import org.bukkit.entity.Player;
| |
− | import org.bukkit.plugin.java.JavaPlugin;
| |
− | import org.bukkit.scoreboard.Scoreboard;
| |
− | import org.bukkit.scoreboard.ScoreboardManager;
| |
− | import org.bukkit.scoreboard.Team;
| |
− | | |
− | /**
| |
− | * 2チームに分けるためのプラグイン
| |
− | */
| |
− | public class ScoreboardTeamPlugin extends JavaPlugin {
| |
− |
| |
− | /** 赤チームの名前 */
| |
− | private static final String TEAM_RED_NAME = "team_red";
| |
− | /** 青チームの名前 */
| |
− | private static final String TEAM_BLUE_NAME = "team_blue";
| |
− |
| |
− | /** 赤チーム */
| |
− | private Team teamRed;
| |
− | /** 青チーム */
| |
− | private Team teamBlue;
| |
− |
| |
− | /**
| |
− | * このメソッドは、プラグインが有効化されたときに呼び出されます
| |
− | * @see org.bukkit.plugin.java.JavaPlugin#onEnable()
| |
− | */
| |
− | @Override
| |
− | public void onEnable() {
| |
− |
| |
− | // メインスコアボードを取得します。
| |
− | ScoreboardManager manager = Bukkit.getScoreboardManager();
| |
− | Scoreboard board = manager.getMainScoreboard();
| |
− | | |
− | // チームが既に登録されているかどうか確認し、
| |
− | // 登録されていないなら新規作成します。
| |
− | teamRed = board.getTeam(TEAM_RED_NAME);
| |
− | if ( teamRed == null ) {
| |
− | teamRed = board.registerNewTeam(TEAM_RED_NAME);
| |
− | teamRed.setPrefix(ChatColor.RED.toString());
| |
− | teamRed.setSuffix(ChatColor.RESET.toString());
| |
− | teamRed.setDisplayName("team red");
| |
− | teamRed.setAllowFriendlyFire(false);
| |
− | }
| |
− | teamBlue = board.getTeam(TEAM_BLUE_NAME);
| |
− | if ( teamBlue == null ) {
| |
− | teamBlue = board.registerNewTeam(TEAM_BLUE_NAME);
| |
− | teamBlue.setPrefix(ChatColor.BLUE.toString());
| |
− | teamBlue.setSuffix(ChatColor.RESET.toString());
| |
− | teamBlue.setDisplayName("team blue");
| |
− | teamBlue.setAllowFriendlyFire(false);
| |
− | }
| |
− | }
| |
− | | |
− | /**
| |
− | * このメソッドは、コマンドが実行された時に呼び出されます
| |
− | * @see org.bukkit.plugin.java.JavaPlugin#onCommand(org.bukkit.command.CommandSender, org.bukkit.command.Command, java.lang.String, java.lang.String[])
| |
− | */
| |
− | @Override
| |
− | public boolean onCommand(
| |
− | CommandSender sender, Command command, String label, String[] args) {
| |
− |
| |
− | // コマンドの引数が足りない場合は、エラーを表示します
| |
− | if ( args.length <= 1 ) {
| |
− | sender.sendMessage("コマンドの引数が足りません。");
| |
− | sender.sendMessage("'/" + label + " (チーム名) (プレイヤー名)' のように実行してください。");
| |
− | return true;
| |
− | }
| |
− |
| |
− | // 1番目の引数に無効な文字列が指定された時に、エラーを表示します
| |
− | if ( !args[0].equalsIgnoreCase("red") && !args[0].equalsIgnoreCase("blue") ) {
| |
− | sender.sendMessage("指定されたチーム名 " + args[0] + " が無効です。");
| |
− | sender.sendMessage("red または blue を指定してください。");
| |
− | return true;
| |
− | }
| |
− |
| |
− | // 2番目の引数に無効なプレイヤー名が指定された時に、エラーを表示します
| |
− | Player target = Bukkit.getPlayerExact(args[1]);
| |
− | if ( target == null ) {
| |
− | sender.sendMessage("プレイヤー " + args[1] + " が見つかりません。");
| |
− | return true;
| |
− | }
| |
− | | |
− | // 指定されたプレイヤーをチームに加えます
| |
− | Team team;
| |
− | if ( args[0].equalsIgnoreCase("red") ) {
| |
− | team = teamRed;
| |
− | } else {
| |
− | team = teamBlue;
| |
− | }
| |
− | team.addPlayer(target);
| |
− | sender.sendMessage("プレイヤー " + args[1] + " を " + args[0] + " に加えました。");
| |
− | return true;
| |
− | }
| |
− | }
| |
− | </source>
| |
− | | |
− | 慣れてきたら、いろいろ工夫してみましょう。<br/>
| |
− | 例えば、チームから離脱するコマンドを追加してみてください。
| |
− | | |
− | =TIPS=
| |
− | | |
− | オブジェクティブ名には、17文字以上の名前を指定しないでください。<br/>
| |
− | オブジェクティブの表示名には、33文字以上の名前を指定しないでください。<br/>
| |
− | チーム名には、17文字以上の名前を指定しないでください。<br/>
| |
− | チームの表示名には、33文字以上の名前を指定しないでください。<br/>
| |
− | チームのprefix、suffixには、33文字以上の名前を指定しないでください。<br/>
| |
− | サイドバーにダミーで登録するオフラインプレイヤー名には、17文字以上の名前を指定しないでください。<br/>
| |
− | <br/>
| |
− | メインスコアボードを強制的にクリアするには、CraftBukkitを停止して、「world/data/scoreboard.dat」ファイルを削除してください。
| |