提供: Minecraft Modding Wiki
2013年9月22日 (日) 17:56時点におけるUcchy (トーク | 投稿記録)による版 (ページの作成:「= スコアボードシステムの使い方 = MinecraftのScoreboardシステムを、Bukkit API経由で使用する方法をまとめます。 このチュートリ...」)
(差分) ← 古い版 | 最新版 (差分) | 新しい版 → (差分)
移動先: 案内検索

スコアボードシステムの使い方

MinecraftのScoreboardシステムを、Bukkit API経由で使用する方法をまとめます。 このチュートリアルは、こちらの内容を参考に作成しています。

基本的に、Bukkit APIから使用できるScoreboardシステムは、 バニラのサーバーコマンド /scoreboard で実施できることとほとんど同じです。 このチュートリアルを理解するためには、/scoreboard コマンドを試して、 Scoreboardシステムの仕様をよく理解することが一番の近道です。 コマンドの使い方は、こちらこちらを参考にしてみてください。

スコアボードシステムの基本的な使い方

まず、ScoreboardManager を取得します。

ScoreboardManager manager = Bukkit.getScoreboardManager();

次に、Scoreboard を取得します。

Scoreboard board = manager.getMainScoreboard();

Scoreboard に、新しいチームを登録します。

Team team = board.registerNewTeam("teamname");

そして、登録されたチームの設定をいろいろ変更します。

// プレイヤーを追加します。
team.addPlayer(player);

// プレイヤーを削除します。
team.removePlayer(player);

// prefixを登録します。これは、TABキーを押したときのプレイヤーリストと、
// 頭の上のプレイヤー名で、該当チームに所属するプレイヤーの名前の"前"に、
// 指定した文字列が付きます。
// 表示欄は狭いため、長い文字列を指定することは避けるべきです。
// なお、ChatColorによる装飾が指定可能です。
// 例)team.setPrefix(ChatColor.RED.toString());
team.setPrefix("prefix");

// prefixを登録します。これは、TABキーを押したときのプレイヤーリストと、
// 頭の上のプレイヤー名で、該当チームに所属するプレイヤーの名前の"後"に、
// 指定した文字列が付きます。
// なお、prefixでChatColorを使用した場合、suffixでRESETを指定することを推奨します。
// 例)team.setPrefix(ChatColor.RESET.toString());
team.setSuffix("suffix");

// チームの表示名を指定します。
team.setDisplayName("display name");

// チームメンバー同士の攻撃ができるかどうかを設定します。
// true で攻撃が有効になり、false で攻撃が無効になります。
team.setAllowFriendlyFire(false)

// 透明化しているチームメンバーを見えるようにするかどうかを設定します。
// true で透明化しているチームメンバーが見えるようになり、
// false で誰からも見えなくなります。
team.setCanSeeFriendlyInvisibles(true);

"dummy"というCriteriaを設定して、"test"という名前の新しいObjectiveを作成します。

Objective objective = board.registerNewObjective("test", "dummy");

新しく登録したObjectiveの設定も、いろいろ変更してみましょう。

// Objective の表示名を設定します。
objective.setDisplayName("Display Name");

// Objectiveをどこに表示するかを設定します。
// SIDEBAR、PLAYER_LIST、BELOW_NAME が指定できます。
objective.setDisplaySlot(DisplaySlot.BELOW_NAME);

特定のプレイヤーに対するObjectiveでの点数を設定します。

Score score = objective.getScore(player);
score.setScore(42);

ここまでを実装して設定することで、下のスクリーンショットのように表示が確認できていると思います。


特定のプレイヤーのスコアをリセットするには、次のようにします。

board.resetScores(player);


専用のスコアボードシステムの取得と設定

メインのScoreboardシステムを使用してしまうと、他で設定している得点内容を上書きしてしまったり、 Objectiveの名前が衝突してしまったりしないか、心配があります。

自身のプラグイン専用に、Scoreboardシステムを取得したい場合は、 最初のgetMainScoreboard()をgetNewScoreboard()にしてください。

Scoreboard board = manager.getNewScoreboard();

専用のScoreboardシステムでは、デフォルトで表示されません。 各プレイヤーの表示を設定するには、setScoreboardを使用してください。

for ( Player online : Bukkit.getOnlinePlayers() ) {
    online.setScoreboard(board);
}


サイドバーでのカスタム項目の設定

サイドバーにObjectiveを設定している場合、ダミーのOfflinePlayerを登録することで、 カスタム項目を表示することが可能です。 カスタム項目のスコアを登録するには、次のようにします。

Score score = objective.getScore(Bukkit.getOfflinePlayer(name));
score.setScore(99);

カスタム項目のスコアをリセットするには、次のようにします。

board.resetScores(Bukkit.getOfflinePlayer(name));


Score score = objective.getScore(Bukkit.getOfflinePlayer(ChatColor.GREEN + "kills:"));
score.setScore(99);


簡単な実装例

各プレイヤーの頭の下に、現在の体力を表示します。 なお、Criteria に "health" を指定した場合、各プレイヤーの体力が増減するたびに、自動的に更新されます。 (プラグイン側から更新を実施する必要はありません。)

ScoreboardManager manager = Bukkit.getScoreboardManager();
Scoreboard board = manager.getNewScoreboard();

Objective objective = board.registerNewObjective("showhealth", "health");
objective.setDisplaySlot(DisplaySlot.BELOW_NAME);
objective.setDisplayName("/ 20");

for(Player online : Bukkit.getOnlinePlayers()){
    online.setScoreboard(board);
    online.setHealth(online.getHealth());
}