|
11 | 11 | import net.md_5.bungee.api.chat.ComponentBuilder; |
12 | 12 | import org.bukkit.ChatColor; |
13 | 13 | import org.bukkit.GameMode; |
| 14 | +import org.bukkit.Location; |
14 | 15 | import org.bukkit.Material; |
15 | 16 | import org.bukkit.block.Block; |
16 | 17 | import org.bukkit.block.BlockFace; |
17 | 18 | import org.bukkit.entity.Arrow; |
18 | 19 | import org.bukkit.entity.EnderDragon; |
| 20 | +import org.bukkit.entity.Entity; |
19 | 21 | import org.bukkit.entity.Player; |
20 | 22 | import org.bukkit.event.EventHandler; |
21 | 23 | import org.bukkit.event.Listener; |
@@ -161,4 +163,58 @@ private String getHeartLevel(Player player) { |
161 | 163 |
|
162 | 164 | return rHeart + lHeart.toString(); |
163 | 165 | } |
| 166 | + |
| 167 | + @EventHandler |
| 168 | + private void onCompassInteract(PlayerInteractEvent event) { |
| 169 | + if (event.getItem() == null) return; |
| 170 | + if (!event.getItem().isSimilar(new ItemStack(Material.COMPASS))) return; |
| 171 | + |
| 172 | + final Player player = event.getPlayer(); |
| 173 | + final Player nearestPlayer = getNearest(player, 300.0); |
| 174 | + final Material material = event.getMaterial(); |
| 175 | + |
| 176 | + if (player.getCooldown(material) != 0) return; |
| 177 | + |
| 178 | + final GameUser user = GameUserManager.getGameUser(player); |
| 179 | + |
| 180 | + player.setCooldown(material, 60); |
| 181 | + |
| 182 | + if (nearestPlayer == null) { |
| 183 | + user.sendActionBar("&c範囲300ブロック以内のプレイヤーを見つけられませんでした"); |
| 184 | + return; |
| 185 | + } |
| 186 | + |
| 187 | + final String checkPosition = getPosition(player, nearestPlayer); |
| 188 | + |
| 189 | + player.setCompassTarget(nearestPlayer.getLocation()); |
| 190 | + user.sendActionBar("近くのプレイヤーを指しています。" + checkPosition); |
| 191 | + } |
| 192 | + |
| 193 | + public Player getNearest(Player p, Double range) { |
| 194 | + final GameUser user = GameUserManager.getGameUser(p); |
| 195 | + double distance = Double.POSITIVE_INFINITY; // To make sure the first |
| 196 | + // player checked is closest |
| 197 | + for (Entity entity : p.getNearbyEntities(range, range, range)) { |
| 198 | + if (entity instanceof Player player) { |
| 199 | + if (player == p) continue; //Added this check so you don't target yourself. |
| 200 | + if (player.getGameMode() == GameMode.SPECTATOR) continue; |
| 201 | + if (game.getTeamUsers(user).contains(GameUserManager.getGameUser(player))) continue; |
| 202 | + double distanceto = p.getLocation().distance(player.getLocation()); |
| 203 | + if (distanceto > distance) |
| 204 | + continue; |
| 205 | + return player; |
| 206 | + } |
| 207 | + } |
| 208 | + return null; |
| 209 | + } |
| 210 | + |
| 211 | + public String getPosition(Player player, Player nearestPlayer) { |
| 212 | + final Location playerLoc = player.getLocation(); |
| 213 | + final Location nearestPlayerLoc = nearestPlayer.getLocation(); |
| 214 | + |
| 215 | + if (playerLoc.getY() == nearestPlayerLoc.getY()) return "-"; |
| 216 | + if (playerLoc.getY() <= nearestPlayerLoc.getY()) return "↑"; |
| 217 | + |
| 218 | + return "↓"; |
| 219 | + } |
164 | 220 | } |
0 commit comments