From 90d766df2b7df6231e952a1af0cee34dbf3cbb1f Mon Sep 17 00:00:00 2001 From: Josh Roy <10731363+JRoy@users.noreply.github.com> Date: Mon, 3 Mar 2025 14:03:41 -0500 Subject: [PATCH 1/3] Add non-reflection provider for syncCommands On 1.21.4+ Player#updateCommands has the same logic as CraftServer#updateCommands, so we can just use that. --- .../com/earth2me/essentials/Essentials.java | 3 +- .../providers/ModernSyncCommandsProvider.java | 28 +++++++++++++++++++ 2 files changed, 30 insertions(+), 1 deletion(-) create mode 100644 providers/BaseProviders/src/main/java/net/ess3/provider/providers/ModernSyncCommandsProvider.java diff --git a/Essentials/src/main/java/com/earth2me/essentials/Essentials.java b/Essentials/src/main/java/com/earth2me/essentials/Essentials.java index a81daa59794..39c7a596612 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/Essentials.java +++ b/Essentials/src/main/java/com/earth2me/essentials/Essentials.java @@ -86,6 +86,7 @@ import net.ess3.provider.providers.ModernPlayerLocaleProvider; import net.ess3.provider.providers.ModernPotionMetaProvider; import net.ess3.provider.providers.ModernSignDataProvider; +import net.ess3.provider.providers.ModernSyncCommandsProvider; import net.ess3.provider.providers.PaperBiomeKeyProvider; import net.ess3.provider.providers.PaperContainerProvider; import net.ess3.provider.providers.PaperKnownCommandsProvider; @@ -393,7 +394,7 @@ public void onEnable() { providerFactory.registerProvider(BukkitMaterialTagProvider.class, PaperMaterialTagProvider.class); // Sync Commands Provider - providerFactory.registerProvider(ReflSyncCommandsProvider.class); + providerFactory.registerProvider(ReflSyncCommandsProvider.class, ModernSyncCommandsProvider.class); // Persistent Data Provider providerFactory.registerProvider(ReflPersistentDataProvider.class, ModernPersistentDataProvider.class); diff --git a/providers/BaseProviders/src/main/java/net/ess3/provider/providers/ModernSyncCommandsProvider.java b/providers/BaseProviders/src/main/java/net/ess3/provider/providers/ModernSyncCommandsProvider.java new file mode 100644 index 00000000000..d30f13075e1 --- /dev/null +++ b/providers/BaseProviders/src/main/java/net/ess3/provider/providers/ModernSyncCommandsProvider.java @@ -0,0 +1,28 @@ +package net.ess3.provider.providers; + +import net.ess3.provider.SyncCommandsProvider; +import net.essentialsx.providers.ProviderData; +import net.essentialsx.providers.ProviderTest; +import org.bukkit.Bukkit; +import org.bukkit.entity.Player; + +@ProviderData(description = "1.21.4+ Sync Commands Provider", weight = 1) +public class ModernSyncCommandsProvider implements SyncCommandsProvider { + @Override + public void syncCommands() { + for (final Player player : Bukkit.getOnlinePlayers()) { + player.updateCommands(); + } + } + + @ProviderTest + public static boolean test() { + try { + // There isn't a real good way to test this, but we can check if the Creaking class exists. + Class.forName("org.bukkit.entity.Creaking"); + return true; + } catch (final Throwable ignored) { + return false; + } + } +} From 80bdc5269f36ff7e31289b8f1191ebe871ded6e0 Mon Sep 17 00:00:00 2001 From: Josh Roy <10731363+JRoy@users.noreply.github.com> Date: Mon, 3 Mar 2025 11:49:46 -0500 Subject: [PATCH 2/3] Fix wrong SpawnerBlockProvider on 1.21+ 1.21 Adds a new org.bukkit.spawner.Spawner class as a superclass of CreatureSpawner which now contains the setMaxSpawnDelay method. Change our test to look for the method on any superclasses too. --- .../net/ess3/provider/providers/BukkitSpawnerBlockProvider.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/providers/BaseProviders/src/main/java/net/ess3/provider/providers/BukkitSpawnerBlockProvider.java b/providers/BaseProviders/src/main/java/net/ess3/provider/providers/BukkitSpawnerBlockProvider.java index 43494b2d132..043d286ab4a 100644 --- a/providers/BaseProviders/src/main/java/net/ess3/provider/providers/BukkitSpawnerBlockProvider.java +++ b/providers/BaseProviders/src/main/java/net/ess3/provider/providers/BukkitSpawnerBlockProvider.java @@ -20,7 +20,7 @@ public void setMinSpawnDelay(final CreatureSpawner spawner, final int delay) { @ProviderTest public static boolean test() { try { - CreatureSpawner.class.getDeclaredMethod("setMaxSpawnDelay", int.class); + CreatureSpawner.class.getMethod("setMaxSpawnDelay", int.class); return true; } catch (final NoSuchMethodException ignored) { return false; From 43d1e37b8f1229c8e7d07f3f35c6bad6d891ff0a Mon Sep 17 00:00:00 2001 From: Josh Roy <10731363+JRoy@users.noreply.github.com> Date: Sun, 9 Mar 2025 12:13:50 -0400 Subject: [PATCH 3/3] Fix flight ability preservation between worlds (#6079) Fixes #6041 --- .../essentials/EssentialsPlayerListener.java | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/Essentials/src/main/java/com/earth2me/essentials/EssentialsPlayerListener.java b/Essentials/src/main/java/com/earth2me/essentials/EssentialsPlayerListener.java index 753b3b9a0fc..8b6b2d51f16 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/EssentialsPlayerListener.java +++ b/Essentials/src/main/java/com/earth2me/essentials/EssentialsPlayerListener.java @@ -595,8 +595,12 @@ public void onPlayerTeleport(final PlayerTeleportEvent event) { if (tickCountProvider != null && ess.getSettings().isWorldChangePreserveFlying() && VersionUtil.getServerBukkitVersion().isHigherThanOrEqualTo(VersionUtil.v1_17_R01)) { if (user.isAuthorized("essentials.fly")) { //noinspection DataFlowIssue - not real - if (event.getFrom().getWorld() != event.getTo().getWorld() && player.isFlying()) { - user.setFlightTick(tickCountProvider.getTickCount()); + if (event.getFrom().getWorld() != event.getTo().getWorld() && player.getAllowFlight()) { + // If the player is not flying but has the ability to fly, we set the sign of the tick count to -1 + // Later on in the PlayerChangedWorldEvent, we will set the player's flying state to true if the tick count is positive. + // If the tick count is negative, we simply just set the player's flight ability to true. + final int tick = player.isFlying() ? tickCountProvider.getTickCount() : -tickCountProvider.getTickCount(); + user.setFlightTick(tick); } } } @@ -778,9 +782,12 @@ public void onPlayerChangedWorldFlyReset(final PlayerChangedWorldEvent event) { } final TickCountProvider tickCountProvider = ess.provider(TickCountProvider.class); - if (tickCountProvider != null && user.getFlightTick() == tickCountProvider.getTickCount() && user.isAuthorized("essentials.fly")) { + final int flightTick = user.getFlightTick(); + if (tickCountProvider != null && Math.abs(flightTick) == tickCountProvider.getTickCount() && user.isAuthorized("essentials.fly")) { user.getBase().setAllowFlight(true); - user.getBase().setFlying(true); + if (flightTick > 0) { + user.getBase().setFlying(true); + } } user.setFlightTick(-1); }