【Spigot】Bukkitプラグインの作り方講座 - テレポート、ベクトル操作
今回は、エンティティを移動します。
エンティティをテレポートさせる
エンティティをテレポートさせるには、
entity.teleport(entity)
entity.teleport(location)
を使います。
引数にEntity型を入れる場合は、そのエンティティの場所に、
Location型(org.bukkit.Location)を入れる場合は、その場所に瞬間移動します。
エンティティの座標を取得するには、entity.getLocation()
を使います。
@EventHandler
public void onEntityDamage(EntityDamageEvent e) {
Entity entity = e.getEntity();
Location loc = entity.getLocation();
loc.setY(loc.getY() + 3);
entity.teleport(loc);
}
上の例では、getY()で取得したY座標に3を足して、loc.setY(y)
でY座標を設定しています。
つまり、エンティティがダメージを受けると、3ブロック上に瞬間移動します。
瞬間移動なので、木に埋まったりしてしまいます。
ベクトルを操作して、移動させる
最後に、ベクトルを操作して、移動させます。
ベクトルは、数学では「大きさと向きを持った量」とされています。
平面で例えると、
原点から点[vx,vy]まで矢印が伸びているとします。
この矢印をベクトルと言います。
この時、原点から点までのvx量とvy量がベクトルの持つ大きさです。
そしてこの量によって向きが決まるわけです。
ベクトルは3Dでも使われており、 x,y,z で構成されています。
xは横方向、yは縦方向、zは前後方向の量です。
ベクトルがよくわからない人はこちら: ベクトル解析 - [物理のかぎしっぽ]
@EventHandler
public void onEntityDamage(EntityDamageEvent e) {
Entity entity = e.getEntity();Entity entity = e.getEntity();
entity.setVelocity(new Vector(0f, 2f, 0f));
}
上の例ではダメージを受けたエンティティがトンでいきます。
ベクトル量の調整がちょっと難しかったりします。(1だとなかなか飛びません。10だと果てしなくトンでいきます)
他にも出来ることは山ほどあるので、色々試してみて下さい。
【Spigot】Bukkitプラグインの作り方講座 - ダメージを与える
今回はEventシステムを使って、エンティティにダメージを与えます。
エンティティにダメージを与える
Entity entity = e.getEntity();
if (entity instanceof LivingEntity) {
double damage = 1.0;
((LivingEntity) entity).damage(damage);
}
エンティティにダメージを与えるには、LivingEntityにキャストする必要があります。
LivingEntity.damage(double damage)
でダメージを与えることが出来ます。
LivingEntity.damage(double damage, Entity damager)
でダメージを与えるエンティティを指定することも出来ます。
【Spigot】Bukkitプラグインの作り方講座 - ダメージの制御
今回はEventシステムを使って、エンティティのダメージを制御します。
エンティティのダメージを制御する
@EventHandler
public void onEntityDamage(EntityDamageEvent e) {
double damage = e.getDamage();
e.setDamage(damage * 2);
}
いきなりコードです。
上のコードではEntityDamageEventを使用しています。
EntityDamageEventはエンティティがダメージを受けた時に発動するイベントです。
上のコードではエンティティが受けるダメージを二倍にしています。
ダメージを受けるエンティティを取得するには、e.getEntity()
でEntityインターフェースを返します。
ダメージが関係していますが、返すのはLivingEntityインターフェースではないので注意して下さい。
エンティティの種類を取得するには、
Entity entity = e.getEntity();
EntityType type = entity.getType();
又は、e.getEntityType()
でEntityType型を返します。
当然ですがこのイベントでダメージを受けるエンティティはプレイヤーも含まれます。
先程のコードではプレイヤーも二倍のダメージを受けてしまいます。
プレイヤーを除外するには以下のようなコードになります。
@EventHandler
public void onEntityDamage(EntityDamageEvent e) {
double damage = e.getDamage();
EntityType type = e.getEntityType();
if (type != EntityType.PLAYER) {
e.setDamage(damage * 2);
}
}
また前回同様、多くのイベントでイベントのキャンセルをすることが出来ます。
これを使用してプレイヤーが攻撃を受けないようにする事もできます。
if (type == EntityType.PLAYER) {
e.setCancelled(true);
}
このイベントは攻撃する側がどんなものであっても発動します。
攻撃する側をエンティティに限定したい場合は、EntityDamageByEntityEventを使うと良いです。
逆にエンティティ以外に限定したい場合は、EntityDamageByBlockEventを使います。
EntityDamageEventで、攻撃するものが何なのか調べたい場合は、e.getCause()
を使用します。
EntityDamageByEntityEventの場合は、e.getDamager()
を使って攻撃したエンティティを取得できます。
EntityDamageByBlockEntityではサボテンに刺された時や、奈落に落ちた時などに発生します。
サボテンの場合など、e.getDamager()
でブロックを取得できますが、
奈落などの場合は対象のブロックがない場合があるので注意が必要です。
【Spigot】Bukkitプラグインの作り方講座 - Eventシステムの利用
Eventシステムとは、「プレイヤーがログインした」、「ブロックが破壊された」、「エンティティがダメージを受けた」などといったイベント発生時に行う処理を記載できます。
Eventシステムを使う
まず、org.bukkit.event.Listener
インターフェースを継承したクラスを作成して下さい。
(メインクラスに継承しても構いません)
そしたら、onEnable()
内に以下のコードを書いて下さい。
getServer().getPluginManager().registerEvents(this, this);
第一引数はListener、第二引数はJavaPlugin(メインクラス)です。
これでプラグインにEventシステムが使えるようになりました。
次に、「Listenerを継承したクラス」にイベントを追加します。
新しく関数を追加します。この時の関数名はなんでも良いです。
新しく追加した関数の引数にはイベントのクラスを書きます。
最後に関数に@EventHandler
アノテーションを追加して下さい。
今回はPlayerJoinEvent
を使用してプレイヤーのログインメッセージを変更します。
@EventHandler
public void onPlayerJoin(PlayerJoinEvent e) {
e.setJoinMessage("プレイヤーがログインしました: " + e.getPlayer().getName());
}
PlayerJoinEvent.setJoinMessage(String)でログインメッセージを変更しています。
e.getPlayer()でプレイヤーを取得し、getName()でプレイヤー名を取得しています。
getName()はプレイヤーの本来の名前です。プレイヤーの表示名はgetDisplayName()で取得できます。
プレイヤーの表示名を設定するにはsetDisplayName(String)を使用します。
メインクラスに書いた場合の例:
package io.github.densyakun.bukkit.test;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerJoinEvent;
import org.bukkit.plugin.java.JavaPlugin;
public class Main extends JavaPlugin implements Listener {
@Override
public void onEnable() {
getServer().getPluginManager().registerEvents(this, this);
System.out.println("プラグインが有効になりました");
}
@Override
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
if (label.equalsIgnoreCase("test")) {
sender.sendMessage("コマンドが実行されました");
}
return true;
}
@Override
public void onDisable() {
System.out.println("プラグインが無効になりました");
}
@EventHandler
public void onPlayerJoin(PlayerJoinEvent e) {
e.setJoinMessage("プレイヤーがログインしました: " + e.getPlayer().getName());
}
}
これでイベントを追加することが出来ました。
エクスポートして、プラグインをサーバーに入れます。
このように表示されていればOKです。
Eventシステムの活用
最後に、Eventシステムを活用します。
このようなイベントを追加して下さい。
@EventHandler
public void onPlayerJoin(BlockBreakEvent e) {
Block b = e.getBlock();
if (b.getType() == Material.GRASS) {
e.setCancelled(true);
b.setType(Material.SAND);
}
}
BlockBreakEvent
はプレイヤーがブロックを破壊した時に実行されるイベントです。
これを使って草ブロックを破壊すると砂に変わります。
ブロックに関係するイベントはBlockEvent
を継承しています。
BlockEvent.getBlock()
でブロックを取得できます。
Block.getType()
はブロックの素材をMaterial
型で返します。
if (b.getType() == Material.GRASS)
Material.GRASS
と判定して草ブロックであるかどうかを判別しています。
e.setCancelled(true);
イベントをキャンセルすることで砂に変える時にブロックを破壊されないようになります。
b.setType(material);
これを使ってブロックの素材を砂に設定します。
マテリアルの一覧はこちら(バージョンにより異なる可能性があります)
実際にやってみます。
※暗い。
今回はEventシステムの活用について解説しました。
【Spigot】Bukkitプラグインの作り方講座 - 記事一覧
こんにちは、Densyakunです。
いつも見ていただきありがとうございます。
Bukkitプラグインの作り方講座では、
Bukkitプラグイン(以下、プラグイン)の作り方について、
初心者に分かりやすく解説しています。
記事一覧
基礎編
プレイヤー
- プレイヤーの移動と回転の検出 【New!】
ブロック
エンティティ
- エンティティの種類
- ダメージの制御
- ダメージを与える
- テレポート、ベクトル操作
- エンティティをスポーンさせる
- エンティティを乗り物に乗らせる
インベントリ
サーバー
- サーバーの操作とConsoleCommandSender
- JavaPlugin
中級編
質問や、新しい記事の話題があれば是非コメントをください。
【Spigot】Bukkitプラグインの作り方講座 - プラグインの作成(Eclipse)
Bukkitプラグインを作る
次に、実際に「Bukkitプラグイン」を作っていきます。
この手順はプラグインを作るたびに行いますので、覚えてください。
プロジェクトの作成
まず、eclipseでプロジェクトを作成します。
私はmavenやgradleについてよく知らないので、
この記事ではそれらを使用せず、より簡単なeclipseでの方法を紹介します。
上のメニューから ファイル>新規>Java プロジェクト を押すか、又は下の画像のようにアイコンの▼を選択して下さい。
アイコンを選択したら「Java プロジェクト」を選択して下さい。
「新規 Java プロジェクト」画面が出てくるので、お好みでプロジェクト名を入力して下さい。
プログラミングをしているとついプロジェクトが増えてしまうので、
他のプロジェクトを判別できる名前にしておくと便利です。
プロジェクト名を入力したら完了を押し、プロジェクトを作成します。
作成したプロジェクトは左側の「パッケージ・エクスプローラー」に表示されています。
プロジェクトの中には「src」(ソースフォルダ)と「JRE システム・ライブラリー」があります。
ソースフォルダには自分の作成した「ソース」を入れておくフォルダです。
「JRE システム・ライブラリー」は簡単に言うとJavaです。特に気にしなくて大丈夫です。
ビルドパスの設定
このままではプロジェクトはただのJava プロジェクトでしか無いので、
Bukkit(Spigot)を読み込む必要があります。
プロジェクトを右クリックして下の方にある「Windows エクスプローラー」を選択すると、プロジェクトのフォルダがWindows標準のエクスプローラーで開かれます。
プロジェクトのフォルダの中には「bin」や「src」フォルダがあります。
プロジェクトのフォルダの中に「lib」と言うフォルダを作成して下さい。
そしたらその「lib」フォルダの中に先程ダウンロードしたサーバーjarをコピーします。
eclipseで見てみると、サーバーjarが反映されず表示されていないため、F5キーを押して反映させます。(その際にプロジェクトを選択して下さい)
そしたらeclipseからlibフォルダの中のサーバーjarを右クリックして、 ビルドパス>ビルドパスに追加 を押します。
これでプロジェクトでBukkit(Spigot)が使えるようになりました。
パッケージの作成
ここからが本番です。次にパッケージを作成します。
パッケージにはクラスファイルなどのプログラムを入れておくフォルダのことです。
Javaのパッケージについてはこちらをご覧ください:
https://ja.wikipedia.org/wiki/%E3%83%91%E3%83%83%E3%82%B1%E3%83%BC%E3%82%B8_(Java)
srcフォルダを右クリックして、 新規>パッケージ を選択します。
パッケージの名前ですが、
一般的に、自分のサイトなどのアドレスを逆にしたもの(「densyakun.github.io」であればio.github.densyakun
)にプラグイン名を付けたものが多いです。(io.github.author.plugin
といった感じです。author=作者)
また、パッケージ名はできれば全て小文字にして下さい。※Javaの制約です)
プログラミングをしているとパッケージが増えていきますので他のとかぶらないように名前を付ける必要があります。
私はプラグイン開発以外にも色々やっているので、io.github.densyakun.bukkit.plugin
といった感じにしています。
完了を押すとsrcフォルダの中にパッケージが作成されます。
クラスの作成
次にパッケージの中にクラスを作成します。
先程作ったパッケージを右クリックして、 新規>クラス を選択します。
クラスの名前はお好みで大丈夫です。(ここでは「Main」とします。クラス名の頭文字は大文字にして下さい。※Javaの制約です。メインクラスの名前はプラグイン名にするのがおすすめです)
完了を押すとパッケージの中にクラスファイルが作成され、画面中央の内蔵テキストエディタで作成したクラスファイルが編集できます。
すでにこのようなプログラムが書かれているはずです。
(プログラミングの基礎知識が必要です。分からない方はJavaを少し勉強して下さい)
package io.github.author.bukkit.testplugin;
public class Main {
}
これから書く内容の完成形です。めんどくさい方はコピペして下さい。
package io.github.author.bukkit.testplugin;
import org.bukkit.plugin.java.JavaPlugin;
public class Main extends JavaPlugin {
@Override
public void onEnable() {
System.out.println("プラグインが有効になりました");
}
@Override
public void onDisable() {
System.out.println("プラグインが無効になりました");
}
}
まずMainクラスにJavaPluginクラスを継承します。
public class Main
をpublic class Main extends JavaPlugin
に書き換えて下さい。
すると、JavaPluginがインポートされていないため "JavaPlugin" に赤い下線が表示されエラーが出ています。
その場合はJavaPluginにカーソルを合わせて「JavaPluginをインポートする」を選択して下さい。eclipseの便利な機能です。
次はMainの中にカーソルを置き、Ctrl+Spaceを押すとコンテンツ・アシストが表示されます。こちらもeclipseの便利な機能です。
onEnable()を選択してonEnable関数を作成して下さい。
そしたらもう一度、コンテンツ・アシストを表示してonDisable関数も作成して下さい。
onEnable関数とonDisable関数の中に自動生成されたもの(super.onEnable()、super.onDisable()含む)は削除して、
onEnable関数の中にはSystem.out.println(“プラグインが有効になりました”);
、
onDisable関数の中にはSystem.out.println(“プラグインが無効になりました”);
を書いて下さい。
これでクラスは完成です。
plugin.ymlの作成
次に「plugin.yml」を作成します。
srcフォルダを右クリックして、 新規>ファイル を選択します。
ファイル名を”plugin.yml”にして完了を押します。
すると画面中央の内蔵テキストエディタにplugin.ymlが表示されます。
ちなみにymlはYAMLと言う文法で書きます。
plugin.ymlに以下の文章を入力して下さい。
name: プラグイン名
main: パッケージ.メインクラス
version: バージョン
author: 作者名
description: 説明
記入例:
name: TestPlugin
main: io.github.author.bukkit.testplugin.Main
version: 0.1
author: Author
description: Test Plugin
nameにはプラグイン名、
versionにバージョンとauthorに作者名、
descriptionにプラグインの説明を書いて下さい。
mainにはパッケージ名.メインクラス
を書きます。上の記入例はパッケージがio.github.author.bukkit.testplugin
でメインクラス(先ほど作成したクラス)が「Main」である場合の例です。
name、main、version以外は省略可能です。
plugin.ymlについてはこちらをご覧ください:https://bukkit.gamepedia.com/Plugin_YAML
Jarファイルの作成
plugin.ymlが完成したら、これでプラグインが動くようになりました。
次はプラグインをビルドして JARファイル を作成します。
プロジェクトを右クリックして、 エクスポート を選択して下さい。
JAR ファイル を押して下さい。こんな画面が出てきます。
右上の .classpath と .project のチェックを外してエクスポートから除外して下さい。
このファイルはeclipseのファイルで、プラグインには必要ありません。
左側でプロジェクトを開き、中にあるlibフォルダもチェックを外して除外して下さい。
これは、エクスポートする際には必ず確認して下さい。
エクスポート先をサーバーのpluginsフォルダの中にファイルを作成するようにして、
完了を押すとjarファイルが作成されます。
プラグインを動かす
次にサーバーを起動します。
サーバーが開いている場合は /reload コマンドを実行して下さい。
このようにログに「プラグインが有効になりました」と表示されていれば成功です。
次にサーバーにログインします。
接続元と接続先が同じPCである場合はサーバーアドレスを「localhost」にすることで接続できます。
/plコマンドを入力して、プラグイン一覧に作成したプラグインが追加されていれば完成です。
/version [プラグイン名] と入力するとプラグインのバージョンや説明文などが見れます。
今度はサーバーを閉じてみましょう。
このように「プラグインが無効になりました」と表示されていれば完成です。
おわりに
これでプラグインを作ることが出来ました。
ここまで手順通りに行い、簡単にできたと思います。
実際に作ったプラグインが動いているのを見ると達成感を感じますね。
次は、作成したプラグインをいじって、機能を追加していきましょう!
【Spigot】Bukkitプラグインの作り方講座の今後について
こんにちは、電車君です。
Bukkitプラグインの作り方講座ですが、
今まで「第n回」という形式でやっておりましたが、内容ごとに記事を分けることにしました。
2年ほど前から第3回で止まっており、第5回まで下書きにずっとあったのですが、
放置していました。すみません。
というのも、順番を決めることができなかったので、
内容ごとに分けることで容易に記事を作成することができるようにするためです。
実は、本にしようと思って2年ほど前から作っておりましたが、
やはりブログよりも本にする意味がわからず、そもそも今まで私は本をほぼ読まなかった人なので、
ブログの方に投稿することにしました。
既存の記事から「第n回」の表記を消し、記事一覧のまとめページを作ります。
今後はそのページから参照することをお願いします。