[Minecraft-Spigot4]稲妻(いなずま)を落(お)とす剣(けん)!
ゴールドの剣(けん)をふりかざすと、稲妻(いなずま)を落(お)とすプラグインをつくってみます!
[MineCraft-Spigot2]Hello World!プラグインを作(つく)ってみよう!
でつくったプラグインに、プログラムを追加(ついか)します。
まず、カーソルがあるブロックをみつけるメソッドをつくります。
/*
* マウスのカーソルがフォーカスしているブロックを取得(しゅとく)する
*/
private Block getCursorFocusBlock(Player player) {
// 100ブロック先(さき)までを対象(たいしょう)にします
BlockIterator blocks = new BlockIterator(player, 100);
// プライヤーの目(め)の前(まえ)から、
// カーソルのあるブロックまでチェックして、
// AIR(くうき)じゃないブロックが見(み)つかったら、
// そのブロックをかえします
while (blocks.hasNext()) {
// ブロックをひとつひとつ取得(しゅとく)します
Block block = blocks.next();
// ブロックが空気(くうき)じゃないかチェックします
if ( block.getType() != Material.AIR ) {
// もしブロックが空気(くうき)じゃないものだったら返(かえ)してチェックをおわります
return block;
}
}
// 100ブロック先(さき)まで空気(くうき)しかなかったら何(なに)も返(かえ)しません
return null;
}
赤(あか)くエラーになっているところは、ばつ印(しるし)をクリックして候補(こうほ)から選択(せんたく)してエラーを消(け)しましょう。
いくつか「Import」の候補(こうほ)が出(で)てきたら、「org.bukkit」ではじまるものを選(えら)びます。
エラーが消(き)えて、必要(ひつよう)なImport文(ぶん)が追加(ついか)されました。
次(つぎ)に、稲妻(いなずま)を落(お)とすメソッドを追加(ついか)します。このメソッドには「@EventHandler」をつけます。これは、「このメソッドはゲームの中(なか)でイベントがおきると、実行(じっこう)されるメソッドですよ、という印(しるし)です。
/***
* 稲妻(いなずま)を落(お)とす
* @param event
*/
@EventHandler
public void onSummonLightning(PlayerInteractEvent event) {
// イベントを発生(はっせい)させたプレイヤーを取得(しゅとく)します
Player player = event.getPlayer();
// もし、プレイヤーがもっているアイテムがゴールドの剣(けん)なら稲妻(いなずま)を落(お)とします
if (player.getInventory().getItemInMainHand().getType() == Material.GOLD_SWORD) {
// カーソルがあるブロックを取得(しゅとく)します
Block focusBlock = getCursorFocusBlock(player);
// ブロックが空(から)でなければ稲妻(いなずま)を落(お)とします
if (focusBlock != null) {
focusBlock.getWorld().strikeLightning(focusBlock.getLocation());
}
}
}
ばつ印(しるし)のエラーはクリックして候補(こうほ)を選(えら)んで、必要(ひつよう)なImport文(ぶん)を追加(ついか)しましょう。
追加(ついか)した稲妻(いなずま)を落(お)とすメソッドを「イベント」として追加(ついか)します。すると、メソッドが受(う)け取(と)るイベント「PlayerInteractEvent」プライヤーが発生(はっせい)させるイベントが起(お)こると、メソッドが実行(じっこう)されるようになります。
@Override
public void onEnable() {
getServer().getPluginManager().registerEvents(this, this);
}
また、クラスに「implements Listener」をくわえます。これは、「Listener」というしくみを、このクラスは実現(じつげん)しますよ、という宣言(せんげん)のようなものです。
これで完成(かんせい)です!早速(さっそく)マイクラワールドで試(ため)してみましょう。
プラグインのJarファイルの作(つく)り方(かた)やサーバの起動(きどう)方法は、「[MineCraft-Spigot2]Hello World!プラグインを作(つく)ってみよう!」を参考(さんこう)にしてください。
マインクラフトでサーバーにログインして、ゴールドの剣(けん)を持(も)ちます。
左(ひだ)りクリックで稲妻(いなずま)が落(お)ちます。できましたか?
参考:全ソースコード
package com.coderdojoginowan.myplugin;
import org.bukkit.Material;
import org.bukkit.block.Block;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerInteractEvent;
import org.bukkit.plugin.java.JavaPlugin;
import org.bukkit.util.BlockIterator;
public class Main extends JavaPlugin implements Listener {
@Override
public void onEnable() {
getServer().getPluginManager().registerEvents(this, this);
}
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
if(command.getName().equals("hello")) {
Player player = (Player)sender;
// sendTitle(Title,SubTitle,FadeInTime,StayTime,FadeOutTime)
player.sendTitle("Hello World!", "", 10, 70, 20);
}
return false;
}
/***
* 稲妻(いなずま)を落(お)とす
* @param event
*/
@EventHandler
public void onSummonLightning(PlayerInteractEvent event) {
// イベントを発生(はっせい)させたプレイヤーを取得(しゅとく)します
Player player = event.getPlayer();
// もし、プレイヤーがもっているアイテムがゴールドの剣(けん)なら稲妻(いなずま)を落(お)とします
if (player.getInventory().getItemInMainHand().getType() == Material.GOLD_SWORD) {
// カーソルがあるブロックを取得(しゅとく)します
Block focusBlock = getCursorFocusBlock(player);
// ブロックが空(から)でなければ稲妻(いなずま)を落(お)とします
if (focusBlock != null) {
focusBlock.getWorld().strikeLightning(focusBlock.getLocation());
}
}
}
/***
* マウスのカーソルがフォーカスしているブロックを取得(しゅとく)する
*/
private Block getCursorFocusBlock(Player player) {
// 100ブロック先(さき)までを対象(たいしょう)にします
BlockIterator blocks = new BlockIterator(player, 100);
// プライヤーの目(め)の前(まえ)から、
// カーソルのあるブロックまでチェックして、
// AIR(くうき)じゃないブロックが見(み)つかったら、
// そのブロックをかえします
while (blocks.hasNext()) {
// ブロックをひとつひとつ取得(しゅとく)します
Block block = blocks.next();
// ブロックが空気(くうき)じゃないかチェックします
if ( block.getType() != Material.AIR ) {
// もしブロックが空気(くうき)じゃないものだったら返(かえ)してチェックをおわります
return block;
}
}
// 100ブロック先(さき)まで空気(くうき)しかなかったら何(なに)も返(かえ)しません
return null;
}
}