Files
TabooLib/src/main/java/me/skymc/taboolib/player/PlayerUtils.java
坏黑 6069ea9ad0 更新插件时检测在线玩家,如果有玩家则不会更新。
修复 /tlib iteminfo 命令的一些语法错误。
2018-07-04 22:23:15 +08:00

92 lines
2.7 KiB
Java

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<? extends Player> 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<Byte> 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());
}
}
}