Add openInventory method to API

This commit is contained in:
HaHaWTH 2024-06-11 07:28:13 +08:00
parent b513fd37cb
commit 0fcc45039d
4 changed files with 50 additions and 3 deletions

View File

@ -15,6 +15,8 @@ import fr.xephi.authme.util.PlayerUtils;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.Location; import org.bukkit.Location;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.InventoryView;
import javax.inject.Inject; import javax.inject.Inject;
import java.time.Instant; import java.time.Instant;
@ -24,6 +26,8 @@ import java.util.List;
import java.util.Locale; import java.util.Locale;
import java.util.Optional; import java.util.Optional;
import static fr.xephi.authme.listener.PlayerListener.PENDING_INVENTORIES;
/** /**
* The current API of AuthMe. * The current API of AuthMe.
* *
@ -32,6 +36,7 @@ import java.util.Optional;
* AuthMeApi authmeApi = AuthMeApi.getInstance(); * AuthMeApi authmeApi = AuthMeApi.getInstance();
* </code> * </code>
*/ */
@SuppressWarnings("unused")
public class AuthMeApi { public class AuthMeApi {
private static AuthMeApi singleton; private static AuthMeApi singleton;
@ -256,6 +261,18 @@ public class AuthMeApi {
return dataSource.saveAuth(auth); return dataSource.saveAuth(auth);
} }
/**
* Open an inventory for the given player at any time.
*
* @param player The player to open the inventory for
* @param inventory The inventory to open
* @return The inventory view
*/
public InventoryView openInventory(Player player, Inventory inventory) {
PENDING_INVENTORIES.add(inventory);
return player.openInventory(inventory);
}
/** /**
* Force a player to login, i.e. the player is logged in without needing his password. * Force a player to login, i.e. the player is logged in without needing his password.
* *

View File

@ -50,9 +50,12 @@ import org.bukkit.event.player.PlayerMoveEvent;
import org.bukkit.event.player.PlayerQuitEvent; import org.bukkit.event.player.PlayerQuitEvent;
import org.bukkit.event.player.PlayerRespawnEvent; import org.bukkit.event.player.PlayerRespawnEvent;
import org.bukkit.event.player.PlayerShearEntityEvent; import org.bukkit.event.player.PlayerShearEntityEvent;
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.InventoryView; import org.bukkit.inventory.InventoryView;
import javax.inject.Inject; import javax.inject.Inject;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale; import java.util.Locale;
import java.util.Set; import java.util.Set;
@ -93,6 +96,7 @@ public class PlayerListener implements Listener {
@Inject @Inject
private QuickCommandsProtectionManager quickCommandsProtectionManager; private QuickCommandsProtectionManager quickCommandsProtectionManager;
public static List<Inventory> PENDING_INVENTORIES = new ArrayList<>();
// Lowest priority to apply fast protection checks // Lowest priority to apply fast protection checks
@EventHandler(priority = EventPriority.LOWEST) @EventHandler(priority = EventPriority.LOWEST)
@ -489,6 +493,17 @@ public class PlayerListener implements Listener {
} }
} }
private boolean isInventoryOpenedByApi(Inventory inventory) {
if (inventory == null) {
return false;
}
if (PENDING_INVENTORIES.contains(inventory)) {
PENDING_INVENTORIES.remove(inventory);
return true;
} else {
return false;
}
}
@SuppressWarnings("all") @SuppressWarnings("all")
private boolean isInventoryWhitelisted(InventoryView inventory) { private boolean isInventoryWhitelisted(InventoryView inventory) {
if (inventory == null) { if (inventory == null) {
@ -515,7 +530,8 @@ public class PlayerListener implements Listener {
public void onPlayerInventoryOpen(InventoryOpenEvent event) { public void onPlayerInventoryOpen(InventoryOpenEvent event) {
final HumanEntity player = event.getPlayer(); final HumanEntity player = event.getPlayer();
if (listenerService.shouldCancelEvent(player) if (listenerService.shouldCancelEvent(player)
&& !isInventoryWhitelisted(event.getView())) { && !isInventoryWhitelisted(event.getView())
&& !isInventoryOpenedByApi(event.getInventory())) {
event.setCancelled(true); event.setCancelled(true);
/* /*

View File

@ -380,7 +380,11 @@ public class BukkitService implements SettingsDependent {
* @param bytes the message * @param bytes the message
*/ */
public void sendVelocityMessage(Player player, byte[] bytes) { public void sendVelocityMessage(Player player, byte[] bytes) {
player.sendPluginMessage(authMe, "authmevelocity:main", bytes); if (player != null) {
player.sendPluginMessage(authMe, "authmevelocity:main", bytes);
} else {
Bukkit.getServer().sendPluginMessage(authMe, "authmevelocity:main", bytes);
}
} }

View File

@ -1,5 +1,6 @@
package fr.xephi.authme.util.message; package fr.xephi.authme.util.message;
import fr.xephi.authme.util.Utils;
import net.kyori.adventure.text.Component; import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.minimessage.MiniMessage; import net.kyori.adventure.text.minimessage.MiniMessage;
import net.kyori.adventure.text.serializer.bungeecord.BungeeComponentSerializer; import net.kyori.adventure.text.serializer.bungeecord.BungeeComponentSerializer;
@ -8,6 +9,15 @@ import net.md_5.bungee.api.chat.BaseComponent;
public class MiniMessageUtils { public class MiniMessageUtils {
private static final MiniMessage miniMessage = MiniMessage.miniMessage(); private static final MiniMessage miniMessage = MiniMessage.miniMessage();
private static final BungeeComponentSerializer bungeeSerializer;
static {
if (Utils.MAJOR_VERSION >= 16) {
bungeeSerializer = BungeeComponentSerializer.get();
} else {
bungeeSerializer = BungeeComponentSerializer.legacy();
}
}
/** /**
* Parse a MiniMessage string into a legacy string. * Parse a MiniMessage string into a legacy string.
@ -28,7 +38,7 @@ public class MiniMessageUtils {
*/ */
public static BaseComponent[] parseMiniMessageToBaseComponent(String message) { public static BaseComponent[] parseMiniMessageToBaseComponent(String message) {
Component component = miniMessage.deserialize(message); Component component = miniMessage.deserialize(message);
return BungeeComponentSerializer.legacy().serialize(component); return bungeeSerializer.serialize(component);
} }
private MiniMessageUtils() { private MiniMessageUtils() {