package me.skymc.taboolib.player; import com.google.common.collect.ImmutableList; import org.bukkit.Bukkit; import org.bukkit.GameMode; import org.bukkit.block.Block; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; import java.lang.reflect.Method; import java.util.Collection; import java.util.Collections; import java.util.HashSet; /** * @author sky */ public class PlayerUtils { private static boolean setup; private static boolean useReflection; private static Method oldGetOnlinePlayersMethod; public static Collection getOnlinePlayers() { try { if (!setup) { oldGetOnlinePlayersMethod = Bukkit.class.getDeclaredMethod("getOnlinePlayers"); if (oldGetOnlinePlayersMethod.getReturnType() == Player[].class) { useReflection = true; } setup = true; } if (!useReflection) { return Bukkit.getOnlinePlayers(); } else { Player[] playersArray = (Player[]) oldGetOnlinePlayersMethod.invoke(null); return ImmutableList.copyOf(playersArray); } } catch (Exception e) { return Collections.emptyList(); } } /** * 获取目标方块 * * @param player 玩家 * @param max 最大视野 * @return */ public static Block getTargetBlock(Player player, int max) { HashSet bytes = new HashSet<>(); bytes.add((byte) 0); return player.getTargetBlock(bytes, max); } /** * 重写数据 * * @param player 玩家 * @param scoreboard 是否清理计分板 */ public static void resetData(Player player, boolean scoreboard) { if (player.isDead()) { player.spigot().respawn(); } player.closeInventory(); player.setGameMode(GameMode.SURVIVAL); player.getInventory().setArmorContents(new ItemStack[4]); player.getInventory().setContents(new ItemStack[0]); player.setAllowFlight(false); player.setFlying(false); player.setExp(0.0F); player.setLevel(0); player.setSneaking(false); player.setSprinting(false); player.setFoodLevel(20); player.setSaturation(10.0F); player.setExhaustion(0.0F); player.setMaxHealth(20.0D); player.setHealth(20.0D); player.setFireTicks(0); player.setItemOnCursor(null); player.getActivePotionEffects().clear(); player.getEnderChest().clear(); player.updateInventory(); if (scoreboard) { player.setScoreboard(Bukkit.getScoreboardManager().getNewScoreboard()); } } }