Skip to content

Instantly share code, notes, and snippets.

@keepoff07
Created July 1, 2015 11:34
Show Gist options
  • Save keepoff07/90e1286a239fe08d59e2 to your computer and use it in GitHub Desktop.
Save keepoff07/90e1286a239fe08d59e2 to your computer and use it in GitHub Desktop.
[Bukkit] PlayerInteractEventでクリックしたブロックの詳しいLocationを取得する | あるふぁ
Location getTouchLocation(PlayerInteractEvent event) {
Action action = event.getAction();
if(!(action.equals(Action.LEFT_CLICK_BLOCK) || action.equals(Action.RIGHT_CLICK_BLOCK))) return null;
Location O = event.getPlayer().getEyeLocation();
Block block = event.getClickedBlock();
Location P = block.getLocation().subtract(O);
double Yaw = (double)O.getYaw();
if(Yaw > 0) Yaw -= 360;
double AngY = Math.toRadians(Math.abs(Yaw));
double AngP = Math.toRadians(O.getPitch()*-1d);
double x = 0,y = 0,z = 0,d = 0;
switch(event.getBlockFace()) {
case UP:
y = P.getY()+1d;
d = y/Math.tan(AngP);
x = Math.sin(AngY)*d;
z = Math.cos(AngY)*d;
break;
case DOWN:
y = P.getY();
d = y/Math.tan(AngP);
x = Math.sin(AngY)*d;
z = Math.cos(AngY)*d;
break;
case NORTH:
z = P.getZ();
x = z * Math.tan(AngY);
y = Math.tan(AngP) * Math.sqrt(x*x + z*z);
break;
case SOUTH:
z = P.getZ()+1d;
x = z * Math.tan(AngY);
y = Math.tan(AngP) * Math.sqrt(x*x + z*z);
break;
case EAST:
x = P.getX()+1d;
z = x / Math.tan(AngY);
y = Math.tan(AngP) * Math.sqrt(x*x + z*z);
break;
case WEST:
x = P.getX();
z = x / Math.tan(AngY);
y = Math.tan(AngP) * Math.sqrt(x*x + z*z);
break;
default: break;
}
Location touch = O.clone().add(x, y, z);
//半ブロだったら~っての付ければいいと思うよ. 他にも形が特殊なブロックに対応してみよう!
return touch;
}
@keepoff07
Copy link
Author

所々で+1をしてるから、getTouchLocation(PlayerInteractEvent).getBlock() はクリックしたブロックとは限らないぞ

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