リーチハック、意外とたちが悪いハックです。
これに遭遇したら攻撃が当たりません!
エンティティがダメージを受けた時にそのソース元(プレイヤー)からの距離を計算し、規定の値以上の時はリーチハックとして警告するプラグインを作ってみます。
対策方法
エンティティがダメージを受けた時のイベント
EntityDamageByEntityEventを使用します。
// 最大のリーチ
public static double final MAX_REACH = 3.45D;
@EventHandler
public void onDamage(EntityDamageByEntityEvent event){
// 攻撃元がプレイヤーであるか
if (event.getDamager() instanceof Player) {
// プレイヤーであったとき、
// 対象との距離を計算する
double range = event.getDamager().getLocation().distance(event.getEntity().getLocation());
if (range > MAX_REACH) {
// 最大のリーチを超えてます
Bukkit.broadcastMessage("Reach !!!");
}
}
}
このコードは高低差を考慮していないものになります。
高低差を考慮するには以下のようなコードを加える必要があります。
// 高低差の確認
double rangeY = Math.abs(event.getDamager().getLocation().getY() - event.getEntity().getLocation().getY());
if (rangeY > MAX_REACH) {
// これはハック
} else {
// 単純な距離を計算する
}