ページ 11

[1.12.2]鉱石が破壊されたときに1分後に復活するプラグインについて

Posted: 2019年11月14日(木) 20:26
by WakameJP
件名のようなプラグインを作りたいのですが、Java初心者のため全くわかりません。
Javaできるかた、詳しく書いてくださると助かります。

Re: [1.12.2]鉱石が破壊されたときに1分後に復活するプラグインについて

Posted: 2019年11月16日(土) 14:19
by じゃんまき
importやpackageは省いています。

まずは、例から
メインクラス(JavaPluginを継承しているクラス)のonEnableに

コード: 全て選択

Bukkit.getPluginManager().registerEvents(new OreBreakListener(this), this);
を追加します。
そして、OreBreakListener.javaを新規作成し、以下のコードをコピペしてください。

コード: 全て選択

public final class OreBreakListener implements Listener {
	private Plugin plugin;

	public OreBreakListener(Plugin plugin) {
		this.plugin = plugin;
	}

	@EventHandler
	public void onBreak(BlockBreakEvent event){
		Material material = event.getBlock().getType();
		if (!material.toString().contains("ORE")){
			return;
		}
		new BukkitRunnable() {
			@Override
			public void run(){
				event.getBlock().setType(material);
			}
		}.runTaskLater(plugin,1200);
	}
}
これで、基本的な形は完成です。

以下は説明です。

コード: 全て選択

Bukkit.getPluginManager().registerEvents(new OreBreakListener(this), this);
まずはここで、OreBreakListenerをインスタンス化及びリスナーの登録をしています。

OreBreakListener.java

コード: 全て選択

private Plugin plugin;

public OreBreakListener(Plugin plugin) {
	this.plugin = plugin;
}
ここではOreBreakListenrクラスがインスタンス化された場合にメインクラスを引数として受け取りそれをクラス内の変数に代入をしています。

コード: 全て選択

@EventHandler
public void onBreak(BlockBreakEvent event){
・・・
}
BlockBreakEventはブロックが壊れた場合に呼び出されます。

コード: 全て選択

Material material = event.getBlock().getType();
if (!material.toString().contains("ORE")){
	return;
}
ここでは、壊されたブロックのMaterialの文字列に"ORE"が含まれていない。即ち、鉱石ではない場合に処理を中断するように記述されています。

コード: 全て選択

new BukkitRunnable() {
	@Override
	public void run(){
		event.getBlock().setType(material);
	}
}.runTaskLater(plugin,1200);
ここではBukkitRunnableを使用して1分( 1200tick )を経過させたのちに、ブロックのタイプをもとに戻す処理をしています。