見出し画像

[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;
	}
}

子どもたちの新しい学びの場つくりへ、ご支援よろしくです!