From dfeeaf6999c4cf9f9cab2117414746482a5acaa2 Mon Sep 17 00:00:00 2001 From: EpicKnarvik97 Date: Wed, 6 Mar 2024 14:59:09 +0100 Subject: [PATCH] Adds proper geyser checking --- pom.xml | 10 ++++++ .../listener/PlayerEventListener.java | 31 +++++++++++++++++-- .../listener/PortalEventListener.java | 3 ++ 3 files changed, 42 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 23d01ae..167e35f 100644 --- a/pom.xml +++ b/pom.xml @@ -43,6 +43,10 @@ minebench-repo https://repo.minebench.de/ + + opencollab-snapshot + https://repo.opencollab.dev/main/ + @@ -112,6 +116,12 @@ 1.7.1-SNAPSHOT compile + + org.geysermc.geyser + api + 2.2.0-SNAPSHOT + provided + diff --git a/src/main/java/net/knarcraft/stargate/listener/PlayerEventListener.java b/src/main/java/net/knarcraft/stargate/listener/PlayerEventListener.java index 462357c..e33d6fa 100644 --- a/src/main/java/net/knarcraft/stargate/listener/PlayerEventListener.java +++ b/src/main/java/net/knarcraft/stargate/listener/PlayerEventListener.java @@ -36,10 +36,12 @@ import org.bukkit.event.player.PlayerMoveEvent; import org.bukkit.inventory.EquipmentSlot; import org.bukkit.inventory.ItemStack; import org.bukkit.util.Vector; +import org.geysermc.geyser.api.GeyserApi; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.util.HashMap; +import java.util.HashSet; import java.util.Map; import java.util.Set; @@ -227,16 +229,41 @@ public class PlayerEventListener implements Listener { return null; } + // If END_GATEWAY and END_PORTAL cannot appear, skip further checks Set entranceMaterials = MaterialHelper.specifiersToMaterials(entrancePortal.getGate().getPortalOpenMaterials()); + if (!entranceMaterials.contains(Material.END_GATEWAY) && !entranceMaterials.contains(Material.END_PORTAL)) { + return null; + } - if ((player.getName().matches("^[a-zA-Z0-9_]{2,16}$") || !entranceMaterials.contains(Material.END_GATEWAY)) && - (!entrancePortal.getOptions().isBungee() || !entranceMaterials.contains(Material.END_PORTAL))) { + // Get the real materials in the entrance, as END_GATEWAY or END_PORTAL may be available, but not chosen + Set materialsInEntrance = new HashSet<>(); + for (BlockLocation location : entrancePortal.getStructure().getEntrances()) { + materialsInEntrance.add(location.getType()); + } + + // Abort if not a special case + if ((!materialsInEntrance.contains(Material.END_GATEWAY) || !isGeyserPlayer(player)) && + (!entrancePortal.getOptions().isBungee() || !materialsInEntrance.contains(Material.END_PORTAL))) { return null; } return entrancePortal; } + /** + * Checks whether the given player is connected through Geyser + * + * @param player

The player to check

+ * @return

True if the player is connected through Geyser

+ */ + private boolean isGeyserPlayer(@NotNull Player player) { + try { + return GeyserApi.api().connectionByUuid(player.getUniqueId()) != null; + } catch (NoClassDefFoundError error) { + return false; + } + } + /** * This event handler detects if a player clicks a button or a sign * diff --git a/src/main/java/net/knarcraft/stargate/listener/PortalEventListener.java b/src/main/java/net/knarcraft/stargate/listener/PortalEventListener.java index 41d2d9b..8cf3086 100644 --- a/src/main/java/net/knarcraft/stargate/listener/PortalEventListener.java +++ b/src/main/java/net/knarcraft/stargate/listener/PortalEventListener.java @@ -103,6 +103,9 @@ public class PortalEventListener implements Listener { public void onRespawn(@NotNull PlayerRespawnEvent event) { Player respawningPlayer = event.getPlayer(); FromTheEndTeleportation teleportation = playersFromTheEnd.remove(respawningPlayer); + if (teleportation == null) { + return; + } Portal exitPortal = teleportation.exitPortal(); //Overwrite respawn location to respawn in front of the portal