Skip to content

Instantly share code, notes, and snippets.

@ucchyocean
Last active August 29, 2015 14:20
Show Gist options
  • Save ucchyocean/d88e5c1bfcafc2c6297b to your computer and use it in GitHub Desktop.
Save ucchyocean/d88e5c1bfcafc2c6297b to your computer and use it in GitHub Desktop.
ストップウオッチプラグイン
name: StopWatch
version: 0.0.1
main: org.bitbucket.ucchy.sw.StopWatch
Description: stop watch plugin
author: ucchy
/*
* @author ucchy
* @license LGPLv3
* @copyright Copyright ucchy 2015
*/
package org.bitbucket.ucchy.sw;
import java.util.HashMap;
import org.bukkit.Material;
import org.bukkit.block.Block;
import org.bukkit.block.BlockFace;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.block.Action;
import org.bukkit.event.player.PlayerInteractEvent;
import org.bukkit.plugin.java.JavaPlugin;
/**
* カボチャの上に置いた感圧板を踏むと計測を開始し、
* ジャックオランタンの上に置いた感圧板を踏むと計測終了する
* ストップウォッチのプラグイン
* @author ucchy
*/
public class StopWatch extends JavaPlugin implements Listener {
// 計測開始時間を保存するマップ
private HashMap<String, Long> startTime;
/**
* プラグインが有効化されると呼び出されるメソッド
* @see org.bukkit.plugin.java.JavaPlugin#onEnable()
*/
@Override
public void onEnable() {
// イベントリスナー登録
getServer().getPluginManager().registerEvents(this, this);
// マップ変数の初期化
startTime = new HashMap<String, Long>();
}
/**
* プレイヤーがクリックしたり感圧板に乗ったりすると発生するイベントのリスナー
* @param event
*/
@EventHandler
public void onPlayerInteract(PlayerInteractEvent event) {
// 感圧板のイベントじゃないなら、無視する。
if ( event.getAction() != Action.PHYSICAL ) {
return;
}
Block block = event.getClickedBlock();
if ( block.getType() != Material.WOOD_PLATE
&& block.getType() != Material.STONE_PLATE
&& block.getType() != Material.IRON_PLATE
&& block.getType() != Material.GOLD_PLATE ) {
return;
}
if ( block.getRelative(BlockFace.DOWN).getType() == Material.PUMPKIN ) {
// 感圧板の下のブロックがカボチャなら、計測を開始
// System.currentTimeMillis() を実行すると、現在の時刻を示す数値が取得できる。
// 単位はミリ秒(1/1000秒)。
long start = System.currentTimeMillis();
// プレートを踏んだプレイヤーのプレイヤー名とセットで、開始時刻を保存する。
startTime.put(event.getPlayer().getName(), start);
event.getPlayer().sendMessage("計測を開始しました。");
} else if ( block.getRelative(BlockFace.DOWN).getType() == Material.JACK_O_LANTERN ) {
// 感圧板の下のブロックがジャックオランタンなら、計測を終了
// そもそも開始時刻が記録されていないプレイヤーなら、無視する。
if ( !startTime.containsKey(event.getPlayer().getName()) ) {
return;
}
// 現在の時刻と、開始時刻の差を求める。
// ミリ秒なので、1000で割ると1秒あたりの時間になる。
long time = System.currentTimeMillis() - startTime.get(event.getPlayer().getName());
double seconds = (double)time / 1000;
event.getPlayer().sendMessage("計測を終了しました。タイムは " + seconds + "秒です。");
// 開始時刻を消去しておく。
startTime.remove(event.getPlayer().getName());
}
}
}
@ucchyocean
Copy link
Author

このプラグインの完成品サンプル
https://dl.dropboxusercontent.com/u/34781847/StopWatch_001/StopWatch.zip

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment