提供: Minecraft Modding Wiki
この編集を取り消せます。
下記の差分を確認して、本当に取り消していいか検証してください。よろしければ変更を保存して取り消しを完了してください。
最新版 | 編集中の文章 | ||
36行目: | 36行目: | ||
Pleiadesを利用する場合、「開発対象用 JDK」と、ビルドツールMavenが実行できるプラグイン「m2e」が同梱されているものを選択してください。<br/> | Pleiadesを利用する場合、「開発対象用 JDK」と、ビルドツールMavenが実行できるプラグイン「m2e」が同梱されているものを選択してください。<br/> | ||
− | (Eclipseを既に利用している場合でも、m2eを後から追加インストールすることは可能です。) | + | (Eclipseを既に利用している場合でも、m2eを後から追加インストールすることは可能です。)<br/> |
− | + | 以下、m2eが既に導入されている前提で説明します。 | |
− | |||
− | |||
− | |||
− | |||
− | |||
== Plugin用プロジェクトを始めるために == | == Plugin用プロジェクトを始めるために == | ||
90行目: | 85行目: | ||
Eclipseの画面に戻ると、左側に TutorialPlugin プロジェクトが作成されているはずです。ここまで、うまく作成できましたか? | Eclipseの画面に戻ると、左側に TutorialPlugin プロジェクトが作成されているはずです。ここまで、うまく作成できましたか? | ||
− | |||
− | |||
− | |||
=== Bukkit API の参照設定 === | === Bukkit API の参照設定 === | ||
100行目: | 92行目: | ||
[[Image:create_project4.png]] | [[Image:create_project4.png]] | ||
− | + | まず、Java実行環境(JRE)の参照設定をします。<br/> | |
一番最後の行に '''</project>''' というタグがありますが、その1行上に、次の内容を挿入してください。<br/> | 一番最後の行に '''</project>''' というタグがありますが、その1行上に、次の内容を挿入してください。<br/> | ||
− | (なお、これは Java 7 を参照してビルドするための設定です。もし Java 6 を参照してビルドしたい場合は、sourceタグとtargetタグに書かれている 1.7 のところを 1.6 | + | (なお、これは Java 7 を参照してビルドするための設定です。もし Java 6 を参照してビルドしたい場合は、sourceタグとtargetタグに書かれている 1.7 のところを 1.6 に変更してください。) |
− | < | + | <code> |
<build> | <build> | ||
<plugins> | <plugins> | ||
111行目: | 103行目: | ||
<artifactId>maven-compiler-plugin</artifactId> | <artifactId>maven-compiler-plugin</artifactId> | ||
<configuration> | <configuration> | ||
− | <source>1.7</source> | + | <nowiki><</nowiki>source>1.7</source> |
<target>1.7</target> | <target>1.7</target> | ||
</configuration> | </configuration> | ||
117行目: | 109行目: | ||
</plugins> | </plugins> | ||
</build> | </build> | ||
− | </ | + | </code> |
− | + | 次に、BukkitリポジトリのURL設定を追加します。<br/> | |
下記の内容を追記してください。 | 下記の内容を追記してください。 | ||
− | < | + | <code> |
<repositories> | <repositories> | ||
<repository> | <repository> | ||
− | <id> | + | <id>bukkit-repo</id> |
− | <url> | + | <url>http://repo.bukkit.org/content/groups/public/</url> |
</repository> | </repository> | ||
</repositories> | </repositories> | ||
− | </ | + | </code> |
最後に、Bukkit API の参照設定を追加します。<br/> | 最後に、Bukkit API の参照設定を追加します。<br/> | ||
下記の内容を追記してください。 | 下記の内容を追記してください。 | ||
− | < | + | <code> |
<dependencies> | <dependencies> | ||
<dependency> | <dependency> | ||
<groupId>org.bukkit</groupId> | <groupId>org.bukkit</groupId> | ||
<artifactId>bukkit</artifactId> | <artifactId>bukkit</artifactId> | ||
− | <version>1. | + | <version>1.6.4-R2.0</version> |
</dependency> | </dependency> | ||
</dependencies> | </dependencies> | ||
− | </ | + | </code> |
− | この設定では、Bukkit API 1. | + | この設定では、Bukkit API 1.6.4-R2.0 が参照されます。<br/> |
別のバージョンを参照したい場合は、versionタグの中を変更してください。<br/> | 別のバージョンを参照したい場合は、versionタグの中を変更してください。<br/> | ||
− | 設定が可能なバージョン番号の一覧は、[ | + | 設定が可能なバージョン番号の一覧は、[http://repo.bukkit.org/content/groups/public/org/bukkit/bukkit/ こちら] を参照してください。 |
ここまで編集をすると、pom.xmlは次のようになっているはずです。確認してみてください。 | ここまで編集をすると、pom.xmlは次のようになっているはずです。確認してみてください。 | ||
− | <pre | + | <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><</nowiki>source>1.7</source> |
<target>1.7</target> | <target>1.7</target> | ||
</configuration> | </configuration> | ||
171行目: | 163行目: | ||
<repositories> | <repositories> | ||
<repository> | <repository> | ||
− | <id> | + | <id>bukkit-repo</id> |
− | <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. | + | <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]] | ||
− | |||
− | |||
=== パッケージの作成 === | === パッケージの作成 === | ||
219行目: | 211行目: | ||
次に、プラグインのメインクラスを作成します。<br/> | 次に、プラグインのメインクラスを作成します。<br/> | ||
メインクラスは、JavaPlugin を継承する必要があります。<br/> | メインクラスは、JavaPlugin を継承する必要があります。<br/> | ||
− | + | (逆に、メインクラス以外のクラスは、直接的にも間接的にも、'''JavaPlugin を継承しないようにしてください。'''CraftBukkit 1.7.2-R0.3 以降では、プラグインが正しく動作しなくなります。)<br/> | |
メインクラスは、プラグイン名と同じ名前にすることが望ましいです。 | メインクラスは、プラグイン名と同じ名前にすることが望ましいです。 | ||
227行目: | 219行目: | ||
名前の欄にクラス名を入力してください。<br/> | 名前の欄にクラス名を入力してください。<br/> | ||
− | スーパークラスの欄に「org.bukkit.plugin.java. | + | スーパークラスの欄に「org.bukkit.plugin.java.javaPlugin」と入力してください。<br/> |
(参照... ボタンを押して、開いたダイアログに「JavaPlugin」と入力して該当クラスを検索して選択しても構いません。) | (参照... ボタンを押して、開いたダイアログに「JavaPlugin」と入力して該当クラスを検索して選択しても構いません。) | ||
完了 を押して、新規クラスが作成されたことを確認して下さい。ソースコードは次のようになっているはずです。 | 完了 を押して、新規クラスが作成されたことを確認して下さい。ソースコードは次のようになっているはずです。 | ||
− | < | + | <source lang="java"> |
package my.test.plugin.tutorialplugin; | package my.test.plugin.tutorialplugin; | ||
240行目: | 232行目: | ||
} | } | ||
− | </ | + | </source> |
{{warning}} メインクラスは、コンストラクタを実行したり、新しいインスタンスを作成したりしないでください。 | {{warning}} メインクラスは、コンストラクタを実行したり、新しいインスタンスを作成したりしないでください。 | ||
264行目: | 256行目: | ||
''plugin.yml'' に、下記の3行を書いてください。 | ''plugin.yml'' に、下記の3行を書いてください。 | ||
− | < | + | <source lang="yaml"> |
name: (あなたのプラグイン名) | name: (あなたのプラグイン名) | ||
main: (作成したパッケージ名).(作成したメインクラス) | main: (作成したパッケージ名).(作成したメインクラス) | ||
version: (あなたのプラグインのバージョン) | version: (あなたのプラグインのバージョン) | ||
− | </ | + | </source> |
このチュートリアルでは、次のように作成します。 | このチュートリアルでは、次のように作成します。 | ||
− | < | + | <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 | ||
− | </ | + | </source> |
{{note}} メインクラスの設定は、大文字小文字が区別されるので、大文字小文字に注意して設定してください。 | {{note}} メインクラスの設定は、大文字小文字が区別されるので、大文字小文字に注意して設定してください。 | ||
− | |||
373行目: | 364行目: | ||
具体的には、"give"コマンドは既にいくつかのプラグインで利用されています。 | 具体的には、"give"コマンドは既にいくつかのプラグインで利用されています。 | ||
もし独自に"give"コマンドを実装した場合は、 | もし独自に"give"コマンドを実装した場合は、 | ||
− | "give"コマンドを実装している他のプラグインとの互換性は無くなります。 | + | "give"コマンドを実装している他のプラグインとの互換性は無くなります。 |
− | onCommand() | + | 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となる) | + | * 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: | + | 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 - | + | * usage - onCommand()がfalseを返した際に、コマンド実行ユーザに向けて表示されるメッセージの内容。コマンドの使い方を明解に書いてください。 |
− | * permission - | + | * permission - 当コマンドの動作に必要なプラグインの設定を、コマンド実行ユーザに知らせるメッセージ。(主に、コマンド実行に必要なpermissionを書きます) |
− | * permission-message - | + | * permission-message - コマンド実行権限を持たないユーザがコマンドを実行した場合に、その旨を同ユーザに知らせるメッセージ。 |
</blockquote> | </blockquote> | ||
− | + | :'''Note''': ymlファイルには、1個タブを2個のスペースで記述する必要があります。タブ文字は構文エラーとなるため利用できません。 | |
− | |||
− | |||
− | :'''Note''': | ||
=== コンソールコマンドとプレイヤーコマンド === | === コンソールコマンドとプレイヤーコマンド === | ||
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( | + | 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(); | |
// メインクラスの参照です。処理の中でメインクラスのメソッドを利用しない場合は、省略して構いません。 | // メインクラスの参照です。処理の中でメインクラスのメソッドを利用しない場合は、省略して構いません。 | ||
− | |||
− | |||
− | |||
− | |||
− | |||
@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 |
− | |||
} else { | } else { | ||
sender.sendMessage(ChatColor.RED + "ゲーム内から実行してください!"); | sender.sendMessage(ChatColor.RED + "ゲーム内から実行してください!"); | ||
537行目: | 530行目: | ||
} | } | ||
</source> </blockquote> | </source> </blockquote> | ||
− | |||
− | |||
=== コマンドのパラメタ長をチェックする === | === コマンドのパラメタ長をチェックする === | ||
555行目: | 546行目: | ||
=== プレイヤーがオンラインである事を確認する === | === プレイヤーがオンラインである事を確認する === | ||
− | + | 特定のプレイヤーのPlayerインスタンスを利用したい場合、<br/> | |
+ | 必ずそのプレイヤーがオンラインである必要があります。<br/> | ||
オンラインであるかどうかをチェックして下さい。<br/> | オンラインであるかどうかをチェックして下さい。<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 | + | public boolean onCommand(CommandSender sender, Command cmd, String commandLabel, String[] args){ |
− | if ( | + | Player other = getPlayer(args[0]); |
− | sender.sendMessage(" | + | if (other == null) { |
+ | sender.sendMessage(ChatColor.RED + args[0] + "さんはオフラインです!"); | ||
return false; | return false; | ||
} | } | ||
− | Player | + | return false; |
− | + | } | |
− | + | ||
− | + | private Player getPlayer(String name) { | |
− | + | for ( Player player : Bukkit.getOnlinePlayers() ) { | |
− | + | if ( player.getName().equals(name) ) { | |
− | + | return player; | |
+ | } | ||
} | } | ||
+ | return null; | ||
} | } | ||
</source> </blockquote> | </source> </blockquote> | ||
586行目: | 579行目: | ||
== 権限 == | == 権限 == | ||
− | + | Bukkitのパーミッション(権限)APIの利用は、簡単ではありません。 | |
− | + | プレイヤーが特定の権限を持っているかどうかを調べる処理は次のようになります: | |
+ | <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> | ||
− | + | なぜグループの概念が存在しないかと思った方もいるでしょうが、 | |
− | + | そもそも、権限にはグルーピングの概念は不要なのです。 | |
− | + | 元々、グループの主な用途はチャットメッセージをフォーマッティングする事にありました。<br/> | |
− | <blockquote><source lang="java"> | + | これは権限の機能を利用してもっと簡単に行えます。<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")) { | ||
+ | player.sendMessage("You were sent a message"); | ||
+ | } | ||
− | + | }</source> </blockquote> | |
− | |||
− | + | さて、依然として<br/> | |
− | + | 「グループを利用せずに、複数のプレイヤーに権限をセットする良い方法は何なのか?」が疑問かと思いますが・・・<br/> | |
+ | BukkitのAPI自体は、グループの概念を提供していません。<br/> | ||
+ | グループの概念を利用するためには、permissionsBukkitのような<br/> | ||
+ | グループ権限の機能を提供するプラグインを利用する事になります。<br/> | ||
+ | とどのつまり、'''このAPIはインタフェース(Interface)であり、実装(Implementation)ではない'''のです。 | ||
=== 権限の設定 === | === 権限の設定 === | ||
− | + | 権限を利用して細かな制御を行いたい場合は、<br/> | |
− | ''plugin.yml'' | + | デフォルト権限と、子権限の設定を''plugin.yml''に追記する事を検討して下さい。<br/> |
+ | この2種類の設定は、オプション(必須ではなく完全に任意で利用される)項目ではありますが、お勧めします。<br/> | ||
下記は、''plugin.yml''の最後に追加する形で設定する権限です: | 下記は、''plugin.yml''の最後に追加する形で設定する権限です: | ||
− | <blockquote> | + | <blockquote><code><source lang="yaml">permissions: |
− | < | ||
− | 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> |
− | </ | + | </code></blockquote> |
− | </blockquote> | ||
655行目: | 662行目: | ||
==== 子権限 ==== | ==== 子権限 ==== | ||
− | + | 恐らく今までに、''* 権限''を利用してサブ権限を割り当てた事があると思います。<br/> | |
これは、変更されたBukkit APIと、子権限の定義によって実現した機能であり、<br/> | これは、変更されたBukkit APIと、子権限の定義によって実現した機能であり、<br/> | ||
高い柔軟性を提供しています。<br/> | 高い柔軟性を提供しています。<br/> | ||
下記はその実装例です: | 下記はその実装例です: | ||
− | <blockquote> | + | <blockquote><source lang="yaml">permissions: |
− | < | ||
− | 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> | ||
− | + | ||
''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) { |
− | |||
− | public void onPlayerMove(PlayerMoveEvent evt) { | ||
// プレイヤーの位置を取得します。 | // プレイヤーの位置を取得します。 | ||
Location loc = event.getPlayer().getLocation(); | Location loc = event.getPlayer().getLocation(); | ||
804行目: | 805行目: | ||
=== エンチャント === | === エンチャント === | ||
− | + | アイテムに対するエンチャントに触れる前に、[http://ja.minecraftwiki.net/wiki/Data_values Item Code] と [http://ja.minecraftwiki.net/wiki/Enchanting EID]を見てから以下の解説を読んでください。 | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | / | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | // | ||
− | // | ||
− | |||
− | |||
− | |||
− | |||
− | + | エンチャントは、Enchantmentクラスが受け持っている機能ですが、<br/> | |
− | < | + | Enchantmentクラス自体は抽象クラスであるため、インスタンス化('''new Enchantment()''')出来ません。 |
− | + | エンチャントはEnchantmentWrapperクラスから利用する必要があるからです。 | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | + | 元々エンチャントが出来ないアイテムに対して、独自にエンチャントを付与する処理は書けません。<br/> | |
+ | Bukkitサーバ自体が、エンチャント不可能なアイテムに対して、エンチャント情報を付与する仕組みを備えていないからです。<br/> | ||
+ | つまり、Fire AspectedなStick(火のエンチャントが付いた木の棒)はあり得ません。 | ||
<blockquote><source lang="java"> | <blockquote><source lang="java"> | ||
− | + | int itemCode = 280; // StickのItemID | |
− | + | int effectId = 20; // 効果Fire AspectのEID | |
− | + | int enchantmentLevel = 100; // エンチャントのレベル | |
− | ItemStack myItem = new ItemStack( | + | ItemStack myItem = new ItemStack(itemCode); // 木の棒のインスタンスを生成する |
− | + | Enchantment myEnchantment = new EnchantmentWrapper(effectId); // エンチャント効果のインスタンスを生成する | |
− | + | myItem.addEnchantment(myEnchantment, enchantmentLevel); // 木の棒にFireAspectを付与する(ただし付与は成功しない) | |
− | myItem. | ||
</source></blockquote> | </source></blockquote> | ||
956行目: | 927行目: | ||
ここで、正しいバージョンのJDKが選択されていることを確認してください。 | ここで、正しいバージョンのJDKが選択されていることを確認してください。 | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
ビルドがうまくいった場合、プロジェクトのフォルダの中に target フォルダが作成されており、そのフォルダの中にビルドされたJarファイルがあります。 | ビルドがうまくいった場合、プロジェクトのフォルダの中に target フォルダが作成されており、そのフォルダの中にビルドされたJarファイルがあります。 | ||
998行目: | 956行目: | ||
return false; | return false; | ||
} | } | ||
− | + | ||
// 燃やすプレイヤーを取得します。 | // 燃やすプレイヤーを取得します。 | ||
− | Player target = Bukkit. | + | Player target = Bukkit.getServer().getPlayer(args[0]); |
− | + | ||
// 対象プレイヤーが、オンラインかどうかを確認します。 | // 対象プレイヤーが、オンラインかどうかを確認します。 | ||
if (target == null) { | if (target == null) { | ||
1,007行目: | 965行目: | ||
return true; | return true; | ||
} | } | ||
− | + | ||
// 対象プレイヤーを、1000tick(=50秒) の間、燃えるようにします。 | // 対象プレイヤーを、1000tick(=50秒) の間、燃えるようにします。 | ||
target.setFireTicks(1000); | target.setFireTicks(1000); | ||
1,023行目: | 981行目: | ||
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]); | |
− | + | // 対象プレイヤーがオンラインかどうかを確認します。 | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | Player target = | ||
− | |||
if (target == null) { | if (target == null) { | ||
sender.sendMessage(args[0] + " というプレイヤーは見つかりません!"); | sender.sendMessage(args[0] + " というプレイヤーは見つかりません!"); | ||
return true; | return true; | ||
} | } | ||
− | + | target.setHealth(0); | |
− | target. | ||
− | |||
} | } | ||
return false; | return false; | ||
1,046行目: | 995行目: | ||
上記の拡張版として、プレイヤーを爆死させる処理を下記に示します: | 上記の拡張版として、プレイヤーを爆死させる処理を下記に示します: | ||
<blockquote><source lang="java"> | <blockquote><source lang="java"> | ||
− | + | float explosionPower = 4F; //This is the explosion power - TNT explosions are 4F by default | |
− | + | Player target = sender.getWorld().getPlayer(args[0]); | |
− | + | target.getWorld().createExplosion(target.getLocation(), explosionPower); | |
− | + | target.setHealth(0); | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
</source> </blockquote> | </source> </blockquote> | ||
1,075行目: | 1,010行目: | ||
// このイベントは、点火されたTNTにより発生したのかどうかを確認します。 | // このイベントは、点火されたTNTにより発生したのかどうかを確認します。 | ||
− | + | // (つまり、TNTの爆発はこれで無効化されますが、クリーパーの爆発は無効化されません) | |
if (entity instanceof TNTPrimed) { | if (entity instanceof TNTPrimed) { | ||
− | + | entity.getWorld().createExplosion(entity.getLocation(), 0); | |
− | entity.getWorld().createExplosion(entity.getLocation(), 0); | ||
} | } | ||
} | } | ||
1,100行目: | 1,034行目: | ||
// sender instanceof Player の検査が終わっているので、Playerクラスへ安全にキャストできます。 | // sender instanceof Player の検査が終わっているので、Playerクラスへ安全にキャストできます。 | ||
Player s = (Player) sender; | Player s = (Player) sender; | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
// 指定されたプレイヤーを取得します。 | // 指定されたプレイヤーを取得します。 | ||
// 指定されたプレイヤーがサーバーに接続していない場合、targetはnullになります。 | // 指定されたプレイヤーがサーバーに接続していない場合、targetはnullになります。 | ||
− | Player target = Bukkit. | + | 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,047行目: | ||
} | } | ||
return false; | return false; | ||
− | } | + | }</source> |
− | </source> | ||
</blockquote> | </blockquote> | ||
1,132行目: | 1,058行目: | ||
@EventHandler | @EventHandler | ||
public void onPlayerInteractBlock(PlayerInteractEvent event) { | public void onPlayerInteractBlock(PlayerInteractEvent event) { | ||
− | |||
Player player = event.getPlayer(); | Player player = event.getPlayer(); | ||
− | if (player.getItemInHand(). | + | 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> | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | + | GroupIDには筆頭(プラグインのトップ階層)としたいJavaパッケージ名を指定し、ArtifactIDにはパッケージ名の末端の名称(Jarファイルのような成果物の名称として利用されます)を入力します。そして、確認メッセージに'''Y<enter>'''で応答します。 | |
− | |||
− | |||
− | |||
− | + | 例: | |
− | + | <blockquote><source lang="bash"> | |
− | + | 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> | ||
− | + | ArchetypeIDに指定した文字列と同名のフォルダが生成され、配下に'''src'''フォルダと'''pom.xml'''ファイルが配置されます。 | |
− | + | '''src/main/java/<package>'''フォルダに存在する'''<archetypeid>CommandExecuter.java'''ファイルを開き、コード<source lang="java">//Do Something</source>の部分に書きのコードを記述します: | |
− | + | <blockquote><source lang="java"> | |
− | + | Player player = (Player) sender; | |
− | + | player.setHealth(1000f); | |
− | + | </source></blockquote> | |
− | + | ベースのフォルダに移動して下記を実行します: | |
− | + | <blockquote><source lang="bash"> | |
− | + | mvn clean package | |
− | </source> | + | </source></blockquote> |
− | </blockquote> | + | ダウンロード処理が走りますが、他の作業を並行して行っても大丈夫です。 |
+ | ''clean package''処理が完了すると、targetフォルダの中に'''<archetypeid>-1.0-SNAPSHOT.jar'''ファイルが生成されます(これがビルドされたプラグインのJarファイルです)。このファイルをBukkitのpluginsフォルダへコピーして、Bukkitサーバを起動して下さい。 | ||
+ | ゲーム内で'''/<archetypeid>'''コマンドを実行すると、そのプレイヤーのHealthが全快します。 | ||
== プラグインのサンプル兼雛形 == | == プラグインのサンプル兼雛形 == | ||
1,177行目: | 1,120行目: | ||
この内容について質問がある場合、遠慮なく[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''': 当ページは訳文であるため、訳文自体に対する文責は原著者にありません。その点を考慮して必ず原文にも目を通してから質問して下さい。 | ||
− | |||
− |