更新
This commit is contained in:
@@ -24,6 +24,7 @@ import me.skymc.taboolib.message.MsgUtils;
|
||||
import me.skymc.taboolib.mysql.protect.MySQLConnection;
|
||||
import me.skymc.taboolib.nms.item.DabItemUtils;
|
||||
import me.skymc.taboolib.other.NumberUtils;
|
||||
import me.skymc.taboolib.packet.PacketUtils;
|
||||
import me.skymc.taboolib.permission.PermissionUtils;
|
||||
import me.skymc.taboolib.playerdata.DataUtils;
|
||||
import me.skymc.taboolib.sign.SignUtils;
|
||||
@@ -223,12 +224,10 @@ public class Main extends JavaPlugin implements Listener {
|
||||
TimeCycleManager.load();
|
||||
// 启动脚本
|
||||
JavaShell.javaShellSetup();
|
||||
// 载入语言文件
|
||||
exampleLanguage2 = new Language2("Language2", this);
|
||||
// 注册脚本
|
||||
SkriptHandler.getInst();
|
||||
// 注册昵称
|
||||
TagAPI.inst();
|
||||
// 载入语言文件
|
||||
exampleLanguage2 = new Language2("Language2", this);
|
||||
|
||||
// 启动数据库储存方法
|
||||
if (getStorageType() == StorageType.SQL) {
|
||||
@@ -253,6 +252,9 @@ public class Main extends JavaPlugin implements Listener {
|
||||
if (Bukkit.getPluginManager().getPlugin("PlaceholderAPI") != null) {
|
||||
new SupportPlaceholder(getInst(), "taboolib").hook();
|
||||
}
|
||||
if (PacketUtils.isProtocolLibEnabled()) {
|
||||
TagAPI.inst();
|
||||
}
|
||||
// 载入 SpecialItem 接口
|
||||
SpecialItem.getInst().loadItems();
|
||||
// 载入 TLM 接口
|
||||
|
||||
@@ -1,8 +1,6 @@
|
||||
package me.skymc.taboolib.anvil;
|
||||
|
||||
import com.ilummc.tlib.util.asm.AsmClassTransformer;
|
||||
import me.skymc.taboolib.nms.NMSUtils;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
/**
|
||||
|
||||
@@ -46,7 +46,7 @@ public class AnvilContainerAPI implements Listener {
|
||||
meta.setDisplayName(str);
|
||||
item.setItemMeta(meta);
|
||||
|
||||
p.getOpenInventory().setItem(0, item);
|
||||
p.getOpenInventory().getTopInventory().setItem(0, item);
|
||||
p.playSound(p.getLocation(), Sound.BLOCK_ANVIL_PLACE, 1, 1);
|
||||
}
|
||||
|
||||
|
||||
@@ -106,10 +106,41 @@ public class TabooLibMainCommand extends BaseMainCommand {
|
||||
return new CommandArgument[0];
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onCommand(CommandSender sender, Command command, String label, String[] args) {
|
||||
new InfoCommand(sender, args);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@CommandRegister(priority = 3.1)
|
||||
void infoList() {
|
||||
registerSubCommand(new BaseSubCommand() {
|
||||
|
||||
@Override
|
||||
public String getLabel() {
|
||||
return "itemList";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getDescription() {
|
||||
return TLocale.asString("COMMANDS.TABOOLIB.ITEMLIST.DESCRIPTION");
|
||||
}
|
||||
|
||||
@Override
|
||||
public CommandArgument[] getArguments() {
|
||||
return new CommandArgument[0];
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onCommand(CommandSender sender, Command command, String label, String[] args) {
|
||||
new ItemListCommand(sender, args);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean ignoredLabel() {
|
||||
return false;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
@@ -19,7 +19,7 @@ public class InfoCommand extends SubCommand {
|
||||
TLocale.sendTo(sender, "COMMANDS.TABOOLIB.INFO.INVALID-ITEM");
|
||||
} else {
|
||||
NBTItem nbt = new NBTItem(player.getItemInHand());
|
||||
TLocale.sendTo(sender, "COMAMNDS.TABOOLIB.INFO.ITEM-INFO",
|
||||
TLocale.sendTo(sender, "COMMANDS.TABOOLIB.INFO.ITEM-INFO",
|
||||
player.getItemInHand().getType().name(),
|
||||
ItemUtils.getCustomName(player.getItemInHand()),
|
||||
player.getItemInHand().getTypeId() + ":" + player.getItemInHand().getDurability(),
|
||||
|
||||
@@ -27,12 +27,11 @@ public class TagDeleteCommand extends SubCommand {
|
||||
return;
|
||||
}
|
||||
|
||||
TagManager.getInst().removeData(player);
|
||||
TagManager.getInst().unloadData(player);
|
||||
TagAPI.removePlayerDisplayName(player);
|
||||
|
||||
if (sender instanceof Player) {
|
||||
TLocale.sendTo(sender, "COMMANDS.TABOOLIB.PLAYERTAG.SUCCESS-DELETE", args[1]);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -34,13 +34,19 @@ public class ListenerSoundsCommand implements Listener {
|
||||
SoundLibraryHolder holder = new SoundLibraryHolder(page, search);
|
||||
Inventory inventory = Bukkit.createInventory(holder, 54, TLocale.asString("COMMANDS.TABOOLIB.SOUNDS.MENU.TITLE", String.valueOf(page)));
|
||||
List<Sound> soundFilter = Arrays.stream(Sound.values()).filter(sound -> search == null || sound.name().contains(search.toUpperCase())).collect(Collectors.toList());
|
||||
List<String> soundLore = TLocale.asStringList("COMMANDS.TABOOLIB.SOUNDS.MENU.LORE");
|
||||
|
||||
int loop = 0;
|
||||
for (Sound sound : soundFilter) {
|
||||
if (loop >= (page - 1) * 28) {
|
||||
if (loop < page * 28) {
|
||||
int slot = InventoryUtil.SLOT_OF_CENTENTS.get(loop - ((page - 1) * 28));
|
||||
inventory.setItem(slot, getSoundItem(sound.name()));
|
||||
ItemStack item = new ItemStack(Material.MAP);
|
||||
ItemMeta meta = item.getItemMeta();
|
||||
meta.setDisplayName("§f§n" + sound);
|
||||
meta.setLore(soundLore);
|
||||
item.setItemMeta(meta);
|
||||
inventory.setItem(slot, item);
|
||||
holder.SOUNDS_DATA.put(slot, sound);
|
||||
} else {
|
||||
break;
|
||||
@@ -62,15 +68,6 @@ public class ListenerSoundsCommand implements Listener {
|
||||
player.openInventory(inventory);
|
||||
}
|
||||
|
||||
private static ItemStack getSoundItem(String sound) {
|
||||
ItemStack item = new ItemStack(Material.MAP);
|
||||
ItemMeta meta = item.getItemMeta();
|
||||
meta.setDisplayName("§f§n" + sound);
|
||||
meta.setLore(TLocale.asStringList("COMMANDS.TABOOLIB.SOUNDS.MENU.LORE"));
|
||||
item.setItemMeta(meta);
|
||||
return item;
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void inventoryClick(InventoryClickEvent e) {
|
||||
if (e.getInventory().getHolder() instanceof SoundLibraryHolder) {
|
||||
|
||||
@@ -1,22 +1,49 @@
|
||||
package me.skymc.taboolib.display;
|
||||
|
||||
import com.ilummc.tlib.nms.ActionBar;
|
||||
import me.skymc.taboolib.TabooLib;
|
||||
import me.skymc.taboolib.nms.NMSUtils;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
import java.lang.reflect.Constructor;
|
||||
|
||||
/**
|
||||
* @author Bkm016
|
||||
* @since 2018-04-26
|
||||
*/
|
||||
public class ActionUtils {
|
||||
|
||||
private static Class<?> Packet = NMSUtils.getNMSClass("Packet");
|
||||
private static Class<?> ChatComponentText = NMSUtils.getNMSClass("ChatComponentText");
|
||||
private static Class<?> ChatMessageType = NMSUtils.getNMSClass("ChatMessageType");
|
||||
private static Class<?> PacketPlayOutChat = NMSUtils.getNMSClass("PacketPlayOutChat");
|
||||
private static Class<?> IChatBaseComponent = NMSUtils.getNMSClass("IChatBaseComponent");
|
||||
|
||||
public static void send(Player player, String action) {
|
||||
if (player == null) {
|
||||
return;
|
||||
}
|
||||
try {
|
||||
ActionBar.sendActionBar(player, action);
|
||||
} catch (Throwable ignored) {
|
||||
Object ab = ChatComponentText.getConstructor(String.class).newInstance(action);
|
||||
Constructor<?> ac;
|
||||
Object abPacket;
|
||||
if (TabooLib.getVerint() > 11100) {
|
||||
ac = PacketPlayOutChat.getConstructor(IChatBaseComponent, ChatMessageType);
|
||||
abPacket = ac.newInstance(ab, ChatMessageType.getMethod("a", Byte.TYPE).invoke(null, (byte) 2));
|
||||
} else {
|
||||
ac = PacketPlayOutChat.getConstructor(IChatBaseComponent, Byte.TYPE);
|
||||
abPacket = ac.newInstance(ab, (byte) 2);
|
||||
}
|
||||
sendPacket(player, abPacket);
|
||||
} catch (Exception ignored) {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private static void sendPacket(Player player, Object packet) {
|
||||
try {
|
||||
Object handle = player.getClass().getMethod("getHandle", new Class[0]).invoke(player);
|
||||
Object playerConnection = handle.getClass().getField("playerConnection").get(handle);
|
||||
playerConnection.getClass().getMethod("sendPacket", Packet).invoke(playerConnection, packet);
|
||||
} catch (Exception ignored) {
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -2,13 +2,31 @@ package me.skymc.taboolib.packet;
|
||||
|
||||
import com.comphenix.protocol.PacketType;
|
||||
import com.comphenix.protocol.ProtocolLibrary;
|
||||
import com.comphenix.protocol.ProtocolManager;
|
||||
import com.comphenix.protocol.events.PacketContainer;
|
||||
import com.comphenix.protocol.wrappers.WrappedDataWatcher;
|
||||
import com.google.common.base.Preconditions;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.entity.Entity;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
/**
|
||||
* @author sky
|
||||
*/
|
||||
public class PacketUtils {
|
||||
|
||||
public static void checkProtocolLib() {
|
||||
Preconditions.checkArgument(isProtocolLibEnabled(), "Plugin \"ProtocolLib\" cannot found!");
|
||||
}
|
||||
|
||||
public static boolean isProtocolLibEnabled() {
|
||||
return Bukkit.getPluginManager().getPlugin("ProtocolLib") != null && Bukkit.getPluginManager().getPlugin("ProtocolLib").isEnabled();
|
||||
}
|
||||
|
||||
public static ProtocolManager getManager() {
|
||||
return ProtocolLibrary.getProtocolManager();
|
||||
}
|
||||
|
||||
public static void sendPacketEntityStatus(Entity entity, EntityStatus status, Player... players) {
|
||||
PacketContainer packet = ProtocolLibrary.getProtocolManager().createPacket(PacketType.Play.Server.ENTITY_METADATA);
|
||||
packet.getIntegers().write(0, entity.getEntityId());
|
||||
|
||||
@@ -31,7 +31,7 @@ public class ArrayUtils {
|
||||
|
||||
public static String[] removeFirst(String[] args) {
|
||||
if (args.length <= 1) {
|
||||
return null;
|
||||
return new String[0];
|
||||
}
|
||||
List<String> list = asList(args);
|
||||
list.remove(0);
|
||||
|
||||
@@ -135,6 +135,7 @@ public class TagAPI implements Listener {
|
||||
AsyncPlayerReceiveNameTagEvent newEvent = new AsyncPlayerReceiveNameTagEvent(destinationPlayer, namedPlayer, getPlayerDisplayName(namedPlayer), UUID.fromString(builtUUID.toString()));
|
||||
Bukkit.getServer().getPluginManager().callEvent(newEvent);
|
||||
|
||||
updatePlayerTag(namedPlayer, newEvent);
|
||||
return new WrappedGameProfile(newEvent.getUUID(), newEvent.getTag().substring(0, Math.min(newEvent.getTag().length(), 16)));
|
||||
}
|
||||
|
||||
@@ -147,4 +148,14 @@ public class TagAPI implements Listener {
|
||||
public void onQuit(PlayerQuitEvent event) {
|
||||
entityIdMap.remove(event.getPlayer().getEntityId());
|
||||
}
|
||||
|
||||
private static void updatePlayerTag(Player namedPlayer, AsyncPlayerReceiveNameTagEvent newEvent) {
|
||||
TagManager.PlayerData playerData = TagManager.getInst().getPlayerData(namedPlayer);
|
||||
if (playerData.isEmpty()) {
|
||||
return;
|
||||
}
|
||||
TagManager.getInst().unloadData(namedPlayer);
|
||||
playerData.setName(newEvent.getTag());
|
||||
TagManager.getInst().uploadData(namedPlayer);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
package me.skymc.taboolib.team;
|
||||
|
||||
import com.ilummc.tlib.util.Strings;
|
||||
import me.skymc.taboolib.Main;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.entity.Player;
|
||||
@@ -11,6 +12,7 @@ import org.bukkit.scoreboard.Scoreboard;
|
||||
import org.bukkit.scoreboard.Team;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.UUID;
|
||||
|
||||
/**
|
||||
* @author sky
|
||||
@@ -20,7 +22,7 @@ public class TagManager implements Listener {
|
||||
|
||||
private static TagManager inst;
|
||||
|
||||
private HashMap<String, PlayerData> playerdata = new HashMap<>();
|
||||
private HashMap<UUID, PlayerData> playerData = new HashMap<>();
|
||||
|
||||
private TagManager() {
|
||||
Bukkit.getPluginManager().registerEvents(this, Main.getInst());
|
||||
@@ -35,8 +37,8 @@ public class TagManager implements Listener {
|
||||
return inst;
|
||||
}
|
||||
|
||||
public HashMap<String, PlayerData> getPlayerdata() {
|
||||
return playerdata;
|
||||
public HashMap<UUID, PlayerData> getPlayerData() {
|
||||
return playerData;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -87,52 +89,44 @@ public class TagManager implements Listener {
|
||||
* @param player 玩家
|
||||
* @return {@link PlayerData}
|
||||
*/
|
||||
private PlayerData getPlayerData(Player player) {
|
||||
return playerdata.computeIfAbsent(player.getName(), k -> new PlayerData(player.getName()));
|
||||
public PlayerData getPlayerData(Player player) {
|
||||
return playerData.computeIfAbsent(player.getUniqueId(), k -> new PlayerData(player));
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除该玩家的称号数据
|
||||
* 注销称号数据
|
||||
*
|
||||
* @param player
|
||||
* @param targetPlayer
|
||||
*/
|
||||
public void removeData(Player player) {
|
||||
playerdata.remove(player.getName());
|
||||
for (Player _player : Bukkit.getOnlinePlayers()) {
|
||||
Scoreboard scoreboard = _player.getScoreboard();
|
||||
if (scoreboard != null) {
|
||||
Team team = scoreboard.getTeam(player.getName());
|
||||
if (team != null) {
|
||||
team.unregister();
|
||||
}
|
||||
public void unloadData(Player targetPlayer) {
|
||||
PlayerData data = getPlayerData(targetPlayer);
|
||||
for (Player player : Bukkit.getOnlinePlayers()) {
|
||||
Scoreboard scoreboard = getScoreboard(player);
|
||||
Team team = scoreboard.getTeam(data.getName());
|
||||
if (team != null) {
|
||||
team.unregister();
|
||||
}
|
||||
}
|
||||
data.reset();
|
||||
}
|
||||
|
||||
/**
|
||||
* 将该玩家的数据向服务器所有玩家更新
|
||||
*
|
||||
* @param player 玩家
|
||||
* @param targetPlayer 玩家
|
||||
*/
|
||||
public void uploadData(Player player) {
|
||||
PlayerData data = getPlayerData(player);
|
||||
public void uploadData(Player targetPlayer) {
|
||||
PlayerData data = getPlayerData(targetPlayer);
|
||||
String prefix = data.getPrefix().length() > 16 ? data.getPrefix().substring(0, 16) : data.getPrefix();
|
||||
String suffix = data.getSuffix().length() > 16 ? data.getSuffix().substring(0, 16) : data.getSuffix();
|
||||
// 如果没有称号数据
|
||||
if (prefix.isEmpty() && suffix.isEmpty()) {
|
||||
unloadData(targetPlayer);
|
||||
return;
|
||||
}
|
||||
|
||||
for (Player _player : Bukkit.getOnlinePlayers()) {
|
||||
Scoreboard scoreboard = _player.getScoreboard();
|
||||
if (scoreboard == null) {
|
||||
_player.setScoreboard(Bukkit.getScoreboardManager().getNewScoreboard());
|
||||
}
|
||||
Team team = scoreboard.getTeam(player.getName());
|
||||
if (team == null) {
|
||||
team = scoreboard.registerNewTeam(player.getName());
|
||||
team.addEntry(player.getName());
|
||||
}
|
||||
for (Player player : Bukkit.getOnlinePlayers()) {
|
||||
Scoreboard scoreboard = getScoreboard(player);
|
||||
Team team = getTeam(scoreboard, data);
|
||||
team.setPrefix(prefix);
|
||||
team.setSuffix(suffix);
|
||||
}
|
||||
@@ -141,28 +135,19 @@ public class TagManager implements Listener {
|
||||
/**
|
||||
* 下载服务器内的称号数据到该玩家
|
||||
*
|
||||
* @param player 玩家
|
||||
* @param targetPlayer 玩家
|
||||
*/
|
||||
public void downloadData(Player player) {
|
||||
Scoreboard scoreboard = player.getScoreboard();
|
||||
if (scoreboard == null) {
|
||||
player.setScoreboard(Bukkit.getScoreboardManager().getNewScoreboard());
|
||||
}
|
||||
|
||||
for (Player _player : Bukkit.getOnlinePlayers()) {
|
||||
PlayerData data = getPlayerData(_player);
|
||||
public void downloadData(Player targetPlayer) {
|
||||
Scoreboard scoreboard = getScoreboard(targetPlayer);
|
||||
for (Player player : Bukkit.getOnlinePlayers()) {
|
||||
PlayerData data = getPlayerData(player);
|
||||
String prefix = data.getPrefix().length() > 16 ? data.getPrefix().substring(0, 16) : data.getPrefix();
|
||||
String suffix = data.getSuffix().length() > 16 ? data.getSuffix().substring(0, 16) : data.getSuffix();
|
||||
// 如果没有称号数据
|
||||
if (prefix.isEmpty() && suffix.isEmpty()) {
|
||||
continue;
|
||||
}
|
||||
|
||||
Team team = scoreboard.getTeam(_player.getName());
|
||||
if (team == null) {
|
||||
team = scoreboard.registerNewTeam(_player.getName());
|
||||
team.addEntry(_player.getName());
|
||||
}
|
||||
Team team = getTeam(scoreboard, data);
|
||||
team.setPrefix(prefix);
|
||||
team.setSuffix(suffix);
|
||||
}
|
||||
@@ -175,25 +160,52 @@ public class TagManager implements Listener {
|
||||
|
||||
@EventHandler
|
||||
public void onQuit(PlayerQuitEvent e) {
|
||||
removeData(e.getPlayer());
|
||||
unloadData(e.getPlayer());
|
||||
}
|
||||
|
||||
private Scoreboard getScoreboard(Player player) {
|
||||
Scoreboard scoreboard = player.getScoreboard();
|
||||
if (scoreboard == null) {
|
||||
player.setScoreboard(Bukkit.getScoreboardManager().getNewScoreboard());
|
||||
}
|
||||
return scoreboard;
|
||||
}
|
||||
|
||||
private Team getTeam(Scoreboard scoreboard, PlayerData data) {
|
||||
Team team = scoreboard.getTeam(data.getName());
|
||||
if (team == null) {
|
||||
team = scoreboard.registerNewTeam(data.getName());
|
||||
team.addEntry(data.getName());
|
||||
}
|
||||
return team;
|
||||
}
|
||||
|
||||
static class PlayerData {
|
||||
|
||||
private UUID uuid;
|
||||
private String name;
|
||||
private String prefix;
|
||||
private String suffix;
|
||||
|
||||
public PlayerData(String name) {
|
||||
this.name = name;
|
||||
public PlayerData(Player player) {
|
||||
this.uuid = player.getUniqueId();
|
||||
this.name = player.getName();
|
||||
this.prefix = "";
|
||||
this.suffix = "";
|
||||
}
|
||||
|
||||
public UUID getUuid() {
|
||||
return uuid;
|
||||
}
|
||||
|
||||
public String getName() {
|
||||
return name;
|
||||
}
|
||||
|
||||
public void setName(String name) {
|
||||
this.name = name;
|
||||
}
|
||||
|
||||
public String getPrefix() {
|
||||
return prefix;
|
||||
}
|
||||
@@ -209,5 +221,14 @@ public class TagManager implements Listener {
|
||||
public void setSuffix(String suffix) {
|
||||
this.suffix = suffix;
|
||||
}
|
||||
|
||||
public boolean isEmpty() {
|
||||
return Strings.isEmpty(suffix) && Strings.isEmpty(prefix);
|
||||
}
|
||||
|
||||
public void reset() {
|
||||
prefix = "";
|
||||
suffix = "";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user