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/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); } 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; 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; + } + } +}