提供: Minecraft Modding Wiki
移動先: 案内検索

警告: ログインしていません。編集を行うと、あなたの IP アドレスが公開されます。ログインまたはアカウントを作成すれば、あなたの編集はその利用者名とともに表示されるほか、その他の利点もあります。

この編集を取り消せます。 下記の差分を確認して、本当に取り消していいか検証してください。よろしければ変更を保存して取り消しを完了してください。
最新版 編集中の文章
36行目: 36行目:
  
 
Pleiadesを利用する場合、「開発対象用 JDK」と、ビルドツールMavenが実行できるプラグイン「m2e」が同梱されているものを選択してください。<br/>
 
Pleiadesを利用する場合、「開発対象用 JDK」と、ビルドツールMavenが実行できるプラグイン「m2e」が同梱されているものを選択してください。<br/>
(Eclipseを既に利用している場合でも、m2eを後から追加インストールすることは可能です。)
+
(Eclipseを既に利用している場合でも、m2eを後から追加インストールすることは可能です。)<br/>
 
+
以下、m2eが既に導入されている前提で説明します。
spigotなどのBukkitサーバーの実行環境を利用する場合、BuildTools.jar を利用してサーバー実行環境をビルドする必要がありますが、Mavenが利用できる場合は、Mavenが開発用のライブラリを自動でダウンロードするため、BuildTools.jar を使わなくても開発環境を構築することが可能です。<br/>
 
ただし、当然ですが、デバッグ実行するための実行環境は必要になりますから、BuildTools.jar を利用して実行環境も準備しておいてください。このチュートリアルでは、BuildTools.jar を利用した実行環境の構築は割愛いたします。
 
<!--
 
もし、BuildTools.jar を利用した実行環境の構築について、きれいにまとめられている資料があれば、ここにリンクを置いてください。
 
-->
 
  
 
== Plugin用プロジェクトを始めるために ==
 
== Plugin用プロジェクトを始めるために ==
90行目: 85行目:
  
 
Eclipseの画面に戻ると、左側に TutorialPlugin プロジェクトが作成されているはずです。ここまで、うまく作成できましたか?
 
Eclipseの画面に戻ると、左側に TutorialPlugin プロジェクトが作成されているはずです。ここまで、うまく作成できましたか?
 
「ビルドプランを計算できませんでした。」と出た場合、作成したパッケージを右クリックし「実行」から「Maven install」をクリックすることにより、
 
Mavenのインストールが始まりエラーが出なくなります。
 
  
 
=== Bukkit API の参照設定 ===
 
=== Bukkit API の参照設定 ===
100行目: 92行目:
 
[[Image:create_project4.png]]
 
[[Image:create_project4.png]]
  
まず、Java開発環境(JDK)の参照設定をします。<br/>
+
まず、Java実行環境(JRE)の参照設定をします。<br/>
 
一番最後の行に '''</project>''' というタグがありますが、その1行上に、次の内容を挿入してください。<br/>
 
一番最後の行に '''</project>''' というタグがありますが、その1行上に、次の内容を挿入してください。<br/>
(なお、これは Java 7 を参照してビルドするための設定です。もし Java 6 を参照してビルドしたい場合は、sourceタグとtargetタグに書かれている 1.7 のところを 1.6 に変更してください。また、Java 8を参照したい場合は、1.7を1.8に変更してください。)
+
(なお、これは Java 7 を参照してビルドするための設定です。もし Java 6 を参照してビルドしたい場合は、sourceタグとtargetタグに書かれている 1.7 のところを 1.6 に変更してください。)
  
<pre lang="xml">
+
<code>
 
   <build>
 
   <build>
 
     <plugins>
 
     <plugins>
111行目: 103行目:
 
         <artifactId>maven-compiler-plugin</artifactId>
 
         <artifactId>maven-compiler-plugin</artifactId>
 
         <configuration>
 
         <configuration>
           <source>1.7</source>
+
           <nowiki>&lt;</nowiki>source>1.7</source>
 
           <target>1.7</target>
 
           <target>1.7</target>
 
         </configuration>
 
         </configuration>
117行目: 109行目:
 
     </plugins>
 
     </plugins>
 
   </build>
 
   </build>
</pre>
+
</code>
  
次に、Bukkit APIを実装しているSpigotのリポジトリがどこにあるかURLで示します。<br/>
+
次に、BukkitリポジトリのURL設定を追加します。<br/>
 
下記の内容を追記してください。
 
下記の内容を追記してください。
  
<pre lang="xml">
+
<code>
 
   <repositories>
 
   <repositories>
 
     <repository>
 
     <repository>
       <id>spigot-repo</id>
+
       <id>bukkit-repo</id>
       <url>https://hub.spigotmc.org/nexus/content/groups/public</url>
+
       <url>http://repo.bukkit.org/content/groups/public/</url>
 
     </repository>
 
     </repository>
 
   </repositories>
 
   </repositories>
</pre>
+
</code>
  
 
最後に、Bukkit API の参照設定を追加します。<br/>
 
最後に、Bukkit API の参照設定を追加します。<br/>
 
下記の内容を追記してください。
 
下記の内容を追記してください。
  
<pre lang="xml">
+
<code>
 
   <dependencies>
 
   <dependencies>
 
     <dependency>
 
     <dependency>
 
       <groupId>org.bukkit</groupId>
 
       <groupId>org.bukkit</groupId>
 
       <artifactId>bukkit</artifactId>
 
       <artifactId>bukkit</artifactId>
       <version>1.10.2-R0.1-SNAPSHOT</version>
+
       <version>1.6.4-R2.0</version>
 
     </dependency>
 
     </dependency>
 
   </dependencies>
 
   </dependencies>
</pre>
+
</code>
  
この設定では、Bukkit API 1.10.2-R0.1-SNAPSHOT が参照されます。<br/>
+
この設定では、Bukkit API 1.6.4-R2.0 が参照されます。<br/>
 
別のバージョンを参照したい場合は、versionタグの中を変更してください。<br/>
 
別のバージョンを参照したい場合は、versionタグの中を変更してください。<br/>
設定が可能なバージョン番号の一覧は、[https://hub.spigotmc.org/nexus/content/groups/public/org/bukkit/bukkit/ こちら] を参照してください。
+
設定が可能なバージョン番号の一覧は、[http://repo.bukkit.org/content/groups/public/org/bukkit/bukkit/ こちら] を参照してください。
  
 
ここまで編集をすると、pom.xmlは次のようになっているはずです。確認してみてください。
 
ここまで編集をすると、pom.xmlは次のようになっているはずです。確認してみてください。
  
<pre lang="xml">
+
<pre>
 
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 
   xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
 
   xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
163行目: 155行目:
 
         <artifactId>maven-compiler-plugin</artifactId>
 
         <artifactId>maven-compiler-plugin</artifactId>
 
         <configuration>
 
         <configuration>
           <source>1.7</source>
+
           <nowiki>&lt;</nowiki>source>1.7</source>
 
           <target>1.7</target>
 
           <target>1.7</target>
 
         </configuration>
 
         </configuration>
171行目: 163行目:
 
   <repositories>
 
   <repositories>
 
     <repository>
 
     <repository>
       <id>spigot-repo</id>
+
       <id>bukkit-repo</id>
       <url>https://hub.spigotmc.org/nexus/content/groups/public</url>
+
       <url>http://repo.bukkit.org/content/groups/public/</url>
 
     </repository>
 
     </repository>
 
   </repositories>
 
   </repositories>
179行目: 171行目:
 
       <groupId>org.bukkit</groupId>
 
       <groupId>org.bukkit</groupId>
 
       <artifactId>bukkit</artifactId>
 
       <artifactId>bukkit</artifactId>
       <version>1.10.2-R0.1-SNAPSHOT</version>
+
       <version>1.6.4-R2.0</version>
 +
      <type>jar</type>
 +
      <scope>provided</scope>
 
     </dependency>
 
     </dependency>
 
   </dependencies>
 
   </dependencies>
200行目: 194行目:
  
 
[[Image:Create_project6.png]]
 
[[Image:Create_project6.png]]
 
:'''訳者補記''': ダウンロードされた bukkit-x.x.x-Rxx.jar を右クリックし、Maven > Javadoc のダウンロード を実行しておくとよいでしょう。
 
  
 
=== パッケージの作成 ===
 
=== パッケージの作成 ===
219行目: 211行目:
 
次に、プラグインのメインクラスを作成します。<br/>
 
次に、プラグインのメインクラスを作成します。<br/>
 
メインクラスは、JavaPlugin を継承する必要があります。<br/>
 
メインクラスは、JavaPlugin を継承する必要があります。<br/>
(逆に、メインクラス以外のクラスは、直接的にも間接的にも、JavaPlugin を継承しないようにしてください。CraftBukkit 1.7.2-R0.3 以降では、プラグインが正しく動作しなくなります。)<br/>
+
(逆に、メインクラス以外のクラスは、直接的にも間接的にも、'''JavaPlugin を継承しないようにしてください。'''CraftBukkit 1.7.2-R0.3 以降では、プラグインが正しく動作しなくなります。)<br/>
 
メインクラスは、プラグイン名と同じ名前にすることが望ましいです。
 
メインクラスは、プラグイン名と同じ名前にすることが望ましいです。
  
227行目: 219行目:
  
 
名前の欄にクラス名を入力してください。<br/>
 
名前の欄にクラス名を入力してください。<br/>
スーパークラスの欄に「org.bukkit.plugin.java.JavaPlugin」と入力してください。<br/>
+
スーパークラスの欄に「org.bukkit.plugin.java.javaPlugin」と入力してください。<br/>
 
(参照... ボタンを押して、開いたダイアログに「JavaPlugin」と入力して該当クラスを検索して選択しても構いません。)
 
(参照... ボタンを押して、開いたダイアログに「JavaPlugin」と入力して該当クラスを検索して選択しても構いません。)
  
 
完了 を押して、新規クラスが作成されたことを確認して下さい。ソースコードは次のようになっているはずです。
 
完了 を押して、新規クラスが作成されたことを確認して下さい。ソースコードは次のようになっているはずです。
  
<pre lang="java">
+
<source lang="java">
 
package my.test.plugin.tutorialplugin;
 
package my.test.plugin.tutorialplugin;
  
240行目: 232行目:
  
 
}
 
}
</pre>
+
</source>
  
 
{{warning}} メインクラスは、コンストラクタを実行したり、新しいインスタンスを作成したりしないでください。
 
{{warning}} メインクラスは、コンストラクタを実行したり、新しいインスタンスを作成したりしないでください。
264行目: 256行目:
 
''plugin.yml'' に、下記の3行を書いてください。
 
''plugin.yml'' に、下記の3行を書いてください。
  
<syntaxhighlight lang="yaml">
+
<source lang="yaml">
 
name: (あなたのプラグイン名)
 
name: (あなたのプラグイン名)
 
main: (作成したパッケージ名).(作成したメインクラス)
 
main: (作成したパッケージ名).(作成したメインクラス)
 
version: (あなたのプラグインのバージョン)
 
version: (あなたのプラグインのバージョン)
</syntaxhighlight>
+
</source>
  
 
このチュートリアルでは、次のように作成します。
 
このチュートリアルでは、次のように作成します。
  
<syntaxhighlight lang="yml">
+
<source lang="yaml">
 
name: TutorialPlugin
 
name: TutorialPlugin
 
main: my.test.plugin.tutorialplugin.TutorialPlugin
 
main: my.test.plugin.tutorialplugin.TutorialPlugin
 
version: 0.0.1
 
version: 0.0.1
</syntaxhighlight>
+
</source>
  
 
{{note}} メインクラスの設定は、大文字小文字が区別されるので、大文字小文字に注意して設定してください。
 
{{note}} メインクラスの設定は、大文字小文字が区別されるので、大文字小文字に注意して設定してください。
{{note}} コロン(:)のあとにワンスペース( )あるのに注意してください。
 
  
  
373行目: 364行目:
 
具体的には、"give"コマンドは既にいくつかのプラグインで利用されています。
 
具体的には、"give"コマンドは既にいくつかのプラグインで利用されています。
 
もし独自に"give"コマンドを実装した場合は、
 
もし独自に"give"コマンドを実装した場合は、
"give"コマンドを実装している他のプラグインとの互換性は無くなります。<ref group="注">実際には、相互のコマンドを呼び分けるために特定のプレフィクスがコマンドの前に付与されます。しかしそれでも、単にgiveコマンドを呼んだだけではどのコマンドが呼ばれるかわからないことには変わりありません。</ref>
+
"give"コマンドを実装している他のプラグインとの互換性は無くなります。
  
onCommand()は、常にboolean型の値<ref group="注">trueかfalseのどちらか</ref>を戻り値として返さねばなりません。
+
onCommand()は、常にboolean型の値としてtrue,falseのどちらかを戻り値として返さねばなりません。
 
trueを返した場合は、情報表示のためのイベントは発生しません。
 
trueを返した場合は、情報表示のためのイベントは発生しません。
 
falseを返した場合は、プラグインファイルを"usage: property"に戻し、コマンドを実行したプレイヤーに、コマンドの利用方法を通知するメッセージを表示します。
 
falseを返した場合は、プラグインファイルを"usage: property"に戻し、コマンドを実行したプレイヤーに、コマンドの利用方法を通知するメッセージを表示します。
384行目: 375行目:
 
* Command cmd - 実行されたコマンドの内容
 
* Command cmd - 実行されたコマンドの内容
 
* String commandLabel - 利用されたコマンドエイリアス
 
* String commandLabel - 利用されたコマンドエイリアス
* String[] args - コマンドの引数を格納した配列(例:/hello abc defコマンドが入力された場合の内容は、args[0]がabc、args[1]がdefとなる)<ref group="注">半角空白 (U+0020)で分割されて、配列に格納される</ref>
+
* String[] args - コマンドの引数を格納した配列(例:/hello abc defコマンドが入力された場合の内容は、args[0]がabc、args[1]がdefとなる)
  
 
=== コマンドの設定 ===
 
=== コマンドの設定 ===
413行目: 404行目:
 
       description: This is a demo command.
 
       description: This is a demo command.
 
       usage: /<command> [player]
 
       usage: /<command> [player]
       permission: tutorialplugin.basic
+
       permission: <plugin name>.basic
 
       permission-message: You don't have <permission>
 
       permission-message: You don't have <permission>
 
</source>
 
</source>
* basic - コマンド名。
+
* basic - コマンド名
* description - コマンドの説明文。
+
* description - コマンドの説明文
* usage - コマンドの使い方。onCommand() でfalseを返したときに、コマンド実行ユーザに向けて表示されるメッセージの内容。あなたの作ろうとしているコマンドの使い方を、わかりやすく説明してください。
+
* usage - onCommand()がfalseを返した際に、コマンド実行ユーザに向けて表示されるメッセージの内容。コマンドの使い方を明解に書いてください。
* permission - コマンドの実行権限。このコマンドの実行に必要なパーミッションノードを設定します。あなたのプラグイン名と、コマンド名を、ピリオド(.)でつなげたパーミッションノードを設定することを推奨します(例:myplugin.test)。
+
* permission - 当コマンドの動作に必要なプラグインの設定を、コマンド実行ユーザに知らせるメッセージ。(主に、コマンド実行に必要なpermissionを書きます)
* permission-message - 上で設定したコマンド実行権限を持たないユーザがコマンドを実行した場合に、実行権限が無いことを同ユーザに知らせるメッセージ。
+
* permission-message - コマンド実行権限を持たないユーザがコマンドを実行した場合に、その旨を同ユーザに知らせるメッセージ。
 
</blockquote>
 
</blockquote>
  
なお、usage の欄では <command>、permission-message の欄では <permission> というキーワードをそのまま指定できます。それぞれ、設定したコマンド名と、設定したパーミッションノードに置き換えられます。<br>
+
:'''Note''': ymlファイルには、1個タブを2個のスペースで記述する必要があります。タブ文字は構文エラーとなるため利用できません。
詳しい書き方は、[[plugin.ymlの設定一覧#コマンドのオプション設定|plugin.ymlの書き方の、コマンドのオプション設定の節]] を参照してください。
 
 
 
:'''Note''': ymlファイルには、インデントに2個以上の半角スペースを記述する必要があります。タブ文字は構文エラーとなるため利用できません。
 
  
 
=== コンソールコマンドとプレイヤーコマンド ===
 
=== コンソールコマンドとプレイヤーコマンド ===
482行目: 470行目:
 
MyPlugin.java (プラグインのメインクラス):
 
MyPlugin.java (プラグインのメインクラス):
 
<blockquote><source lang="java">
 
<blockquote><source lang="java">
 +
private static Plugin instance;
 +
 
@Override
 
@Override
 
public void onEnable() {
 
public void onEnable() {
 +
instance = this;
 +
// ...
 +
 
// plugin.yml に basic というコマンドを定義していないと、
 
// plugin.yml に basic というコマンドを定義していないと、
 
         //実行した時にNullPointerExceptionが発生します。注意してください。
 
         //実行した時にNullPointerExceptionが発生します。注意してください。
getCommand("basic").setExecutor(new MyPluginCommandExecutor(this));
+
getCommand("basic").setExecutor(new MyPluginCommandExecutor());
 +
 
 +
// ...
 +
}
 +
 
 +
public static Plugin getInstance() {
 +
return instance;
 
}
 
}
 
</source></blockquote>
 
</source></blockquote>
493行目: 492行目:
 
<blockquote><source lang="java">
 
<blockquote><source lang="java">
 
public class MyPluginCommandExecutor implements CommandExecutor {
 
public class MyPluginCommandExecutor implements CommandExecutor {
 
+
private Plugin instance = MyPlugin.getInstance();
 
         // メインクラスの参照です。処理の中でメインクラスのメソッドを利用しない場合は、省略して構いません。
 
         // メインクラスの参照です。処理の中でメインクラスのメソッドを利用しない場合は、省略して構いません。
private final MyPlugin instance;
 
 
public MyPluginCommandExecutor(MyPlugin plugin) {
 
this.plugin = plugin;
 
}
 
  
 
@Override
 
@Override
526行目: 520行目:
 
@Override
 
@Override
 
public boolean onCommand(CommandSender sender, Command cmd, String commandLabel, String[] args){
 
public boolean onCommand(CommandSender sender, Command cmd, String commandLabel, String[] args){
     if (sender instanceof Player) {
+
     if ((sender instanceof Player)) {
 
         Player player = (Player) sender;
 
         Player player = (Player) sender;
         // ここに、処理を実装する。
+
         // doSomething
        return true;
 
 
     } else {
 
     } else {
 
         sender.sendMessage(ChatColor.RED + "ゲーム内から実行してください!");
 
         sender.sendMessage(ChatColor.RED + "ゲーム内から実行してください!");
537行目: 530行目:
 
}
 
}
 
</source> </blockquote>
 
</source> </blockquote>
 
このように、'''<code>if (sender instanceof Player)</code>''' で必ずPlayerであることをチェックしないと、プレイヤーでないコマンド実行者(例えばコンソール)がコマンドを実行したときに、'''<code>Player player = (Player) sender</code>''' のところで処理が失敗してしまいます。
 
  
 
=== コマンドのパラメタ長をチェックする ===
 
=== コマンドのパラメタ長をチェックする ===
555行目: 546行目:
  
 
=== プレイヤーがオンラインである事を確認する ===
 
=== プレイヤーがオンラインである事を確認する ===
特定のプレイヤーのPlayerインスタンスを利用したい場合、必ずそのプレイヤーがオンラインである必要があります。<br/>
+
特定のプレイヤーのPlayerインスタンスを利用したい場合、<br/>
 +
必ずそのプレイヤーがオンラインである必要があります。<br/>
 
オンラインであるかどうかをチェックして下さい。<br/>
 
オンラインであるかどうかをチェックして下さい。<br/>
Bukkit.getPlayer(プレイヤー名) または、Bukkit.getPlayerExact(プレイヤー名) で、オンラインのプレイヤーを取得できます。<br/>
 
(Bukkit.getPlayer はプレイヤー名と前方一致で、Bukkit.getPlayerExact は完全一致で、プレイヤーを取得します。)<br/>
 
もし、指定したプレイヤーがオフラインだった場合は、nullが返されます。<br/>
 
 
処理例:
 
処理例:
  
 +
<!-- ucchy 2014.05.13記 ここのサンプル実装は、CraftBukkit 1.7.9-R0.1 で一旦depricatedされた内容を避けて書いるため、原文のものと異なります。再翻訳時には原文を参照して更新してください。 -->
 
<blockquote><source lang="java">
 
<blockquote><source lang="java">
 
@Override
 
@Override
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
+
public boolean onCommand(CommandSender sender, Command cmd, String commandLabel, String[] args){
     if (args.length < 1) {
+
    Player other = getPlayer(args[0]);
         sender.sendMessage("コマンドの後にプレイヤー名を指定してください!");
+
     if (other == null) {
 +
         sender.sendMessage(ChatColor.RED + args[0] + "さんはオフラインです!");
 
         return false;
 
         return false;
 
     }
 
     }
     Player target = Bukkit.getPlayerExact(args[0]);
+
     return false;
     if ( target == null ) {
+
}
         sender.sendMessage(ChatColor.RED + args[0] + "さんはオフラインです!");
+
 
        return true;
+
private Player getPlayer(String name) {
    } else {
+
     for ( Player player : Bukkit.getOnlinePlayers() ) {
        sender.sendMessage(ChatColor.AQUA + args[0] + "さんはオンラインです!");
+
         if ( player.getName().equals(name) ) {
        return true;
+
            return player;
 +
        }
 
     }
 
     }
 +
    return null;
 
}
 
}
 
</source> </blockquote>  
 
</source> </blockquote>  
586行目: 579行目:
  
 
== 権限 ==
 
== 権限 ==
:'''Note''': この節は、日本語読者向けに独自の内容を記述しています。
+
Bukkitのパーミッション(権限)APIの利用は、簡単ではありません。
  
Bukkitにおける権限の利用は、とっても簡単です!
+
プレイヤーが特定の権限を持っているかどうかを調べる処理は次のようになります:
 +
<blockquote><source lang="java">if(player.hasPermission("some.pointless.permission")) {
 +
  //Do something
 +
}else{
 +
  //Do something else
 +
}</source></blockquote>
  
権限がセットされているか、いない(Javaの'''null'''と同等)かを調べるには以下のメソッドを利用します:
+
権限がセットされているか、いない(Javaの'''null'''と同等)かを調べる処理は次のようになります:
 
<blockquote><source lang="java">boolean isPermissionSet(String name)</source></blockquote>  
 
<blockquote><source lang="java">boolean isPermissionSet(String name)</source></blockquote>  
  
また、権限を持っているかどうかを調べるには以下のメソッドを利用します:
+
なぜグループの概念が存在しないかと思った方もいるでしょうが、
<blockquote><source lang="java">boolean hasPermission(String name)</source></blockquote>
+
そもそも、権限にはグルーピングの概念は不要なのです。
 +
 
 +
元々、グループの主な用途はチャットメッセージをフォーマッティングする事にありました。<br/>
 +
これは権限の機能を利用してもっと簡単に行えます。<br/>
 +
例えば、チャットプラグインの設定において、権限とプレフィクスの関連を定義する事が該当します。<br/>
 +
具体的には、権限'''"someChat.prefix.admin"'''をプレフィクス'''[Admin]'''に対応させる定義を行い、<br/>
 +
プレイヤーがチャットで発言する度に、プレイヤー名の先頭に'''[Admin]'''が付くようになる機能が挙げられます。
 +
 
 +
他にも、グループに所属する複数のユーザに、<br/>
 +
メッセージを送信するような機能を実現するために利用する事が考えられます。<br/>
 +
この例を、権限を利用した処理で記述すると以下のようになります:  
 +
<blockquote><source lang="java">for(Player player: getServer().getOnlinePlayers()) {
  
これを利用してプレイヤーが特定の権限を持っているかどうかを調べる処理は次のようになります:
+
    if(player.hasPermission("send.recieve.message")) {
<blockquote><source lang="java">if(player.hasPermission("some.pointless.permission")) {
+
        player.sendMessage("You were sent a message");
  player.sendMessage("あなたは権限を持っています。");
+
    }
}else{
 
  player.sendMessage("あなたは権限を持っていません。");
 
}</source></blockquote>
 
  
2メソッドの違いは、権限がセットされていなくてもデフォルトで与えられていれば権限を持っているという扱いになるかどうかです。<br>
+
}</source> </blockquote>  
hasPermissionでは デフォルトで与えられていればtrueが返ります。
 
  
PermissionsExなどで 権限はグループとして扱われることが多いですが、Bukkitには権限をグループとして扱う機能はありません。<br/>
+
さて、依然として<br/>
グループとして扱う場合は、別途 上記のようなプラグインを使うか、自分で作る必要があります。
+
「グループを利用せずに、複数のプレイヤーに権限をセットする良い方法は何なのか?」が疑問かと思いますが・・・<br/>
 +
BukkitのAPI自体は、グループの概念を提供していません。<br/>
 +
グループの概念を利用するためには、permissionsBukkitのような<br/>
 +
グループ権限の機能を提供するプラグインを利用する事になります。<br/>
 +
とどのつまり、'''このAPIはインタフェース(Interface)であり、実装(Implementation)ではない'''のです。
  
 
=== 権限の設定 ===
 
=== 権限の設定 ===
  
デフォルトで権限を付与させたり、OPにのみデフォルトで付与させたい場合は、<br>
+
権限を利用して細かな制御を行いたい場合は、<br/>
''plugin.yml''を使うと簡単にできます。
+
デフォルト権限と、子権限の設定を''plugin.yml''に追記する事を検討して下さい。<br/>
 +
この2種類の設定は、オプション(必須ではなく完全に任意で利用される)項目ではありますが、お勧めします。<br/>
  
 
下記は、''plugin.yml''の最後に追加する形で設定する権限です:
 
下記は、''plugin.yml''の最後に追加する形で設定する権限です:
<blockquote>
+
<blockquote><code><source lang="yaml">permissions:
<syntaxhighlight lang="yaml">
 
permissions:
 
 
     doorman.*:
 
     doorman.*:
 
         description: Gives access to all doorman commands
 
         description: Gives access to all doorman commands
635行目: 643行目:
 
         default: true
 
         default: true
 
     doorman.denied:
 
     doorman.denied:
         description: Prevents this user from entering the door
+
         description: Prevents this user from entering the door</source>
</syntaxhighlight>
+
</code></blockquote>
</blockquote>
 
  
  
655行目: 662行目:
 
==== 子権限 ====
 
==== 子権限 ====
  
権限を設定するときに''* 権限''を利用すると、その権限の子権限すべてを操作することができます。<br/>
+
恐らく今までに、''* 権限''を利用してサブ権限を割り当てた事があると思います。<br/>
 
これは、変更されたBukkit APIと、子権限の定義によって実現した機能であり、<br/>
 
これは、変更されたBukkit APIと、子権限の定義によって実現した機能であり、<br/>
 
高い柔軟性を提供しています。<br/>
 
高い柔軟性を提供しています。<br/>
 
下記はその実装例です:
 
下記はその実装例です:
<blockquote>
+
<blockquote><source lang="yaml">permissions:
<syntaxhighlight lang="yaml">
 
permissions:
 
 
     doorman.*:
 
     doorman.*:
 
         description: Gives access to all doorman commands
 
         description: Gives access to all doorman commands
669行目: 674行目:
 
             doorman.knock: true
 
             doorman.knock: true
 
             doorman.denied: false</source>
 
             doorman.denied: false</source>
</syntaxhighlight>
+
 
 
''doorman.*''権限は、いくつかの子権限を含んでいます。
 
''doorman.*''権限は、いくつかの子権限を含んでいます。
 
''doorman.*''権限がtrueである場合に、
 
''doorman.*''権限がtrueである場合に、
676行目: 681行目:
 
その子権限のデフォルト権限は、全て反転(trueが定義値ならfalseになる)された状態で機能します。
 
その子権限のデフォルト権限は、全て反転(trueが定義値ならfalseになる)された状態で機能します。
 
</blockquote>  
 
</blockquote>  
 
ねっ、簡単でしょ?
 
  
 
=== 独自の権限設定 ===
 
=== 独自の権限設定 ===
704行目: 707行目:
 
まずはそのブロックを取得した上で、変更を加えることになります。<br/>
 
まずはそのブロックを取得した上で、変更を加えることになります。<br/>
 
PlayerMoveイベントの処理中でこれを行う例を示します:
 
PlayerMoveイベントの処理中でこれを行う例を示します:
<blockquote><source lang="java">
+
<blockquote><source lang="java">public void onPlayerMove(PlayerMoveEvent evt) {
@EventHandler
 
public void onPlayerMove(PlayerMoveEvent evt) {
 
 
     // プレイヤーの位置を取得します。
 
     // プレイヤーの位置を取得します。
 
     Location loc = event.getPlayer().getLocation();
 
     Location loc = event.getPlayer().getLocation();
803行目: 804行目:
  
 
=== エンチャント ===
 
=== エンチャント ===
 +
 +
<!-- ucchy 2014.05.13記 エンチャントIDと、EnchantmentWrapperを利用する方法は、現在では非推奨ですが、原文もまだ古いままです。訳文だけ先行して修正しますが、原文が更新されたら修正してください。 -->
 +
 +
<!--
 +
アイテムに対するエンチャントに触れる前に、[http://ja.minecraftwiki.net/wiki/Data_values Item Code] と [http://ja.minecraftwiki.net/wiki/Enchanting EID]を見てから以下の解説を読んでください。
 +
 +
エンチャントは、Enchantmentクラスが受け持っている機能ですが、<br/>
 +
Enchantmentクラス自体は抽象クラスであるため、インスタンス化('''new Enchantment()''')出来ません。
 +
エンチャントはEnchantmentWrapperクラスから利用する必要があるからです。
 +
-->
  
 
アイテムにエンチャントを付与するには、ItemStackクラスの '''addEnchantment(Enchantment enchant, int level)''' メソッドを使用します。
 
アイテムにエンチャントを付与するには、ItemStackクラスの '''addEnchantment(Enchantment enchant, int level)''' メソッドを使用します。
809行目: 820行目:
 
もし、通常ありえないエンチャントを設定したい場合は、addEnchantment()メソッドの代わりにaddUnsafeEnchantment()メソッドを使ってください。
 
もし、通常ありえないエンチャントを設定したい場合は、addEnchantment()メソッドの代わりにaddUnsafeEnchantment()メソッドを使ってください。
  
Sharpness 1 エンチャントを石の剣に付与する例を示します。
 
 
<blockquote><source lang="java">
 
<blockquote><source lang="java">
// 新しい石の剣を生成します。
+
// 木の棒のインスタンスを生成する
ItemStack myItem = new ItemStack(Material.STONE_SWORD);
 
 
 
// エンチャントを付与します。
 
myItem.addEnchantment(Enchantment.DAMAGE_ALL, 1); 
 
</source></blockquote>
 
 
 
次に、火属性 100 を、木の棒に付与する例を示します。
 
<blockquote><source lang="java">
 
// 新しい木の棒を生成します。
 
 
ItemStack myItem = new ItemStack(Material.STICK);
 
ItemStack myItem = new ItemStack(Material.STICK);
  
// 木の棒にFireAspectレベル100を付与します。
+
// 木の棒にFireAspectレベル100を付与する
// ただしFireAspectレベル100は通常存在しないので、addEnchantment を使うと失敗します。
+
//(ただしFireAspectレベル100は通常存在しないので、付与は成功しない)
// ありえないエンチャントを設定したい場合は、addUnsafeEnchantment を使ってください。
+
myItem.addEnchantment(Enchantment.FIRE_ASPECT, 100);   
myItem.addUnsafeEnchantment(Enchantment.FIRE_ASPECT, 100);   
 
</source></blockquote>
 
 
 
=== ItemMeta ===
 
 
 
アイテムの表示名を変更するには、次のようにします。
 
<blockquote><source lang="java">
 
String myDisplayName = "すごい剣";
 
 
ItemStack myItem = new ItemStack(Material.DIAMOND_SWORD);  //アイテムを生成します。
 
ItemMeta im = myItem.getItemMeta(); //ItemStackから、ItemMetaを取得します。
 
im.setDisplayName(myDisplayName); //アイテム表示名を設定します。
 
myItem.setItemMeta(im); //元のItemStackに、変更したItemMetaを設定します。
 
</source></blockquote>
 
 
 
次に、loreを設定してみましょう。loreは、ゲーム内でアイテムにカーソルを合わせたときに表示される説明文のことです。
 
<blockquote><source lang="java">
 
List<String> lores = new ArrayList<String>();
 
lores.add("loreのテストです。");
 
lores.add("これは2行目です。");
 
 
 
ItemStack myItem = new ItemStack(Material.DIAMOND_SWORD);  //アイテムを生成します。
 
ItemMeta im = myItem.getItemMeta(); //ItemStackから、ItemMetaを取得します。
 
im.setLore(lores); //loreを設定します。
 
myItem.setItemMeta(im); //元のItemStackに、変更したItemMetaを設定します。
 
 
</source></blockquote>
 
</source></blockquote>
  
956行目: 932行目:
 
ここで、正しいバージョンのJDKが選択されていることを確認してください。
 
ここで、正しいバージョンのJDKが選択されていることを確認してください。
  
このチュートリアルで紹介したJDKが同梱のPleiadesを利用している場合で、
 
<blockquote>
 
[ERROR] Unable to locate the Javac Compiler in:<br/>
 
[ERROR] C:\pleiades\java\7\..\lib\tools.jar
 
</blockquote>
 
のようなエラーが出ることがあります。これは上記のメッセージの通り、最初から同梱されているJDKにtools.jarが含まれているのに参照設定されていないからです。<br/>
 
これを解決するには、次のようにします。
 
*Pleiadesのメニューから、ウィンドウ > 設定 と選び、設定ダイアログを表示します。
 
*設定ダイアログの左側で、java > インストール済みのJRE と選びます。
 
*使用しているJRE(先ほどのエラーメッセージに含まれるファイルパスと、ロケーションが、一致するもの)を選択し、「編集...」を押します。
 
*JREの編集ダイアログで、「外部Jar追加...」を押し、tools.jarを探して選択します。例えばエラーメッセージが「C:\pleiades\java\7\..\lib\tools.jar」なら、「C:\pleiades\java\7\lib\tools.jar」に見つかるはずです。
 
*「OK」を押して、設定ダイアログを閉じます。
 
*再度、「mvn install」を実行して、今度は正常にビルドができることを確認してください。
 
  
 
ビルドがうまくいった場合、プロジェクトのフォルダの中に target フォルダが作成されており、そのフォルダの中にビルドされたJarファイルがあります。
 
ビルドがうまくいった場合、プロジェクトのフォルダの中に target フォルダが作成されており、そのフォルダの中にビルドされたJarファイルがあります。
998行目: 961行目:
 
             return false;
 
             return false;
 
         }
 
         }
   
+
 
         // 燃やすプレイヤーを取得します。
 
         // 燃やすプレイヤーを取得します。
         Player target = Bukkit.getPlayerExact(args[0]);
+
         Player target = Bukkit.getServer().getPlayer(args[0]);
   
+
 
         // 対象プレイヤーが、オンラインかどうかを確認します。
 
         // 対象プレイヤーが、オンラインかどうかを確認します。
 
         if (target == null) {
 
         if (target == null) {
1,007行目: 970行目:
 
             return true;
 
             return true;
 
         }
 
         }
   
+
 
         // 対象プレイヤーを、1000tick(=50秒) の間、燃えるようにします。
 
         // 対象プレイヤーを、1000tick(=50秒) の間、燃えるようにします。
 
         target.setFireTicks(1000);
 
         target.setFireTicks(1000);
1,023行目: 986行目:
 
public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args){
 
public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args){
 
     if(cmd.getName().equalsIgnoreCase("KillPlayer")){
 
     if(cmd.getName().equalsIgnoreCase("KillPlayer")){
        // コマンドのパラメータに、殺害するプレイヤーが指定されているかどうかを
+
         Player target = sender.getServer().getPlayer(args[0]);
        // 確認します。
+
        // 対象プレイヤーがオンラインかどうかを確認します。
        if (args.length != 1) {
 
            // onCommandでfalseを戻すと、plugin.ymlのusageに設定したメッセージを
 
            // コマンド実行者の画面に表示します。
 
            return false;
 
        }
 
         Player target = Bukkit.getPlayerExact(args[0]);
 
        // 対象プレイヤーがオンラインかどうかを確認します。
 
 
         if (target == null) {
 
         if (target == null) {
 
             sender.sendMessage(args[0] + " というプレイヤーは見つかりません!");
 
             sender.sendMessage(args[0] + " というプレイヤーは見つかりません!");
 
             return true;
 
             return true;
 
         }
 
         }
        // 対象に1000ダメージを与えます。
+
         target.setHealth(0);  
         target.damage(1000);
 
        return true;
 
 
     }
 
     }
 
     return false;
 
     return false;
1,046行目: 1,000行目:
 
上記の拡張版として、プレイヤーを爆死させる処理を下記に示します:  
 
上記の拡張版として、プレイヤーを爆死させる処理を下記に示します:  
 
<blockquote><source lang="java">
 
<blockquote><source lang="java">
@Override
+
float explosionPower = 4F; //This is the explosion power - TNT explosions are 4F by default
public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) {
+
Player target = sender.getWorld().getPlayer(args[0]);
    if(cmd.getName().equalsIgnoreCase("KillPlayer")){
+
target.getWorld().createExplosion(target.getLocation(), explosionPower);
        Player target = Bukkit.getPlayerExact(args[0]);
+
target.setHealth(0);
        // 対象プレイヤーがオンラインかどうかを確認します。
 
        if (target == null) {
 
            sender.sendMessage(args[0] + " というプレイヤーは見つかりません!");
 
            return true;
 
        }
 
        float explosionPower = 4F; // 爆発の大きさです。1Fでガストの火球、3Fでクリーパーの爆発、4FでTNTの爆発 に相当します。
 
 
 
        // 爆発を起こしつつ、対象に1000ダメージを与えます。
 
        target.getWorld().createExplosion(target.getLocation(), explosionPower);
 
        target.damage(1000);
 
        return true;
 
    }
 
    return false;
 
}
 
 
</source> </blockquote>
 
</source> </blockquote>
  
1,075行目: 1,015行目:
  
 
     // このイベントは、点火されたTNTにより発生したのかどうかを確認します。
 
     // このイベントは、点火されたTNTにより発生したのかどうかを確認します。
    // (つまり、TNTの爆発はこれで無効化されますが、クリーパーの爆発は無効化されません)
+
    // (つまり、TNTの爆発はこれで無効化されますが、クリーパーの爆発は無効化されません)
 
     if (entity instanceof TNTPrimed) {
 
     if (entity instanceof TNTPrimed) {
        event.setCancelled(true); // イベントをキャンセルして、爆発を無かったことにする
+
         entity.getWorld().createExplosion(entity.getLocation(), 0);
         entity.getWorld().createExplosion(entity.getLocation(), 0); // 偽物の爆発を発生させる
 
 
     }
 
     }
 
}
 
}
1,100行目: 1,039行目:
 
         // sender instanceof Player の検査が終わっているので、Playerクラスへ安全にキャストできます。
 
         // sender instanceof Player の検査が終わっているので、Playerクラスへ安全にキャストできます。
 
         Player s = (Player) sender;
 
         Player s = (Player) sender;
 
        // コマンドのパラメータに、対象のプレイヤーが指定されているかどうかを確認します。
 
        if (args.length != 1) {
 
            // onCommandでfalseを戻すと、plugin.ymlのusageに設定したメッセージを
 
            // コマンド実行者の画面に表示します。
 
            return false;
 
        }
 
  
 
         // 指定されたプレイヤーを取得します。
 
         // 指定されたプレイヤーを取得します。
 
         // 指定されたプレイヤーがサーバーに接続していない場合、targetはnullになります。
 
         // 指定されたプレイヤーがサーバーに接続していない場合、targetはnullになります。
         Player target = Bukkit.getPlayerExact(args[0]);
+
         Player target = Bukkit.getServer().getPlayer(args[0]);
 
         if (target == null) {
 
         if (target == null) {
             sender.sendMessage("Player " + args[0] + " というプレイヤーは見つかりません!");
+
             sender.sendMessage("Player " + args[0] + " is not online.");
 
             return true;
 
             return true;
 
         }
 
         }
1,120行目: 1,052行目:
 
     }
 
     }
 
     return false;
 
     return false;
}
+
}</source>
</source>
 
 
</blockquote>
 
</blockquote>
  
1,132行目: 1,063行目:
 
@EventHandler
 
@EventHandler
 
public void onPlayerInteractBlock(PlayerInteractEvent event) {
 
public void onPlayerInteractBlock(PlayerInteractEvent event) {
 
 
     Player player = event.getPlayer();
 
     Player player = event.getPlayer();
  
     if (player.getItemInHand().getType() == Material.FISHING_ROD) {
+
     if (player.getItemInHand().getTypeId() == Material.FISHING_ROD.getId()) {
 
         // プレイヤーが見ている場所に雷をおとします。
 
         // プレイヤーが見ている場所に雷をおとします。
 +
        // 距離が200ブロック以内なら、ターゲットブロックを取得することができます。
 +
        player.getWorld().strikeLightning(player.getTargetBlock(null, 200).getLocation());
 +
    }
 +
}</source>
 +
</blockquote>
 +
 +
== リクエストに応じて書かれた記事 ==
 +
 +
=== mavenを利用したプラグイン開発 ===
 +
gitのリポジトリ上にある'''BukkitPluginArchetype'''をcloneし、それをビルドする:
 +
<blockquote><source lang="bash">
 +
git clone git://github.com/keyz182/BukkitPluginArchetype.git
 +
cd BukkitPluginArchetype
 +
mvn clean install
 +
</source></blockquote>
 +
 +
作成するプラグインのフォルダに移動して下記のコマンドを実行します:
 +
<blockquote><source lang="bash">mvn archetype:generate -DarchetypeCatalog=local</source></blockquote>
 +
 +
プロンプトに表示されたリストから下記を選択します:
 +
<blockquote>uk.co.dbyz:bukkitplugin (bukkitplugin) </blockquote>
  
        Block target = getTargetBlock(player);
 
        if (target != null) {
 
            target.getWorld().strikeLightning(target.getLocation());
 
        }
 
    }
 
}
 
  
private Block getTargetBlock(Player player) {
+
GroupIDには筆頭(プラグインのトップ階層)としたいJavaパッケージ名を指定し、ArtifactIDにはパッケージ名の末端の名称(Jarファイルのような成果物の名称として利用されます)を入力します。そして、確認メッセージに'''Y&lt;enter&gt;'''で応答します。
   
 
    // 視線上のブロックを100ブロック先まで取得
 
    BlockIterator it = new BlockIterator(player, 100);
 
  
    // 手前側から検証を行う。
+
例:
    // Blockが取得できた時点でreturnして終了する。
+
<blockquote><source lang="bash">
    while ( it.hasNext() ) {
+
Define value for property 'groupId': : uk.co.dbyz.mc
 +
Define value for property 'artifactId': : plugin
 +
Define value for property 'version': 1.0-SNAPSHOT:
 +
Define value for property 'package': uk.co.dbyz.mc:
 +
</source></blockquote>
  
        Block block = it.next();
+
ArchetypeIDに指定した文字列と同名のフォルダが生成され、配下に'''src'''フォルダと'''pom.xml'''ファイルが配置されます。
  
        if ( block.getType() != Material.AIR ) {
+
'''src/main/java/&lt;package&gt;'''フォルダに存在する'''&lt;archetypeid&gt;CommandExecuter.java'''ファイルを開き、コード<source lang="java">//Do Something</source>の部分に書きのコードを記述します:
            // ブロックが見つかった
+
<blockquote><source lang="java">
            return block;
+
Player player = (Player) sender;
        }
+
player.setHealth(1000f);
    }
+
</source></blockquote>
  
    // 最後までブロックがみつからなかった
+
ベースのフォルダに移動して下記を実行します:
    return null;
+
<blockquote><source lang="bash">
}
+
mvn clean package
</source>
+
</source></blockquote>  
</blockquote>
+
ダウンロード処理が走りますが、他の作業を並行して行っても大丈夫です。
 +
''clean package''処理が完了すると、targetフォルダの中に'''&lt;archetypeid&gt;-1.0-SNAPSHOT.jar'''ファイルが生成されます(これがビルドされたプラグインのJarファイルです)。このファイルをBukkitのpluginsフォルダへコピーして、Bukkitサーバを起動して下さい。
  
 +
ゲーム内で'''/&lt;archetypeid&gt;'''コマンドを実行すると、そのプレイヤーのHealthが全快します。
  
 
== プラグインのサンプル兼雛形 ==
 
== プラグインのサンプル兼雛形 ==
1,177行目: 1,125行目:
 
この内容について質問がある場合、遠慮なく[http://forums.bukkit.org/members/adamki11s.42417/ Adamki11s]か[http://wiki.bukkit.org/IRC BukkitDevのIRCチャンネル](当Wikiの原文を掲載しているサイトのIRCチャンネルです)で聞いてください。
 
この内容について質問がある場合、遠慮なく[http://forums.bukkit.org/members/adamki11s.42417/ Adamki11s]か[http://wiki.bukkit.org/IRC BukkitDevのIRCチャンネル](当Wikiの原文を掲載しているサイトのIRCチャンネルです)で聞いてください。
 
:'''Note''': 当ページは訳文であるため、訳文自体に対する文責は原著者にありません。その点を考慮して必ず原文にも目を通してから質問して下さい。
 
:'''Note''': 当ページは訳文であるため、訳文自体に対する文責は原著者にありません。その点を考慮して必ず原文にも目を通してから質問して下さい。
 
[[カテゴリ:Bukkitチュートリアル|*]]
 

Minecraft Modding Wikiへの投稿はすべて、他の投稿者によって編集、変更、除去される場合があります。 自分が書いたものが他の人に容赦なく編集されるのを望まない場合は、ここに投稿しないでください。
また、投稿するのは、自分で書いたものか、パブリック ドメインまたはそれに類するフリーな資料からの複製であることを約束してください(詳細はMinecraft Modding Wiki:著作権を参照)。 著作権保護されている作品は、許諾なしに投稿しないでください!

このページを編集するには、下記の確認用の質問に回答してください (詳細):

取り消し 編集の仕方 (新しいウィンドウで開きます)

このページで使用されているテンプレート: