Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,7 @@
import org.bukkit.event.player.PlayerCommandPreprocessEvent;
import org.bukkit.event.player.PlayerEggThrowEvent;
import org.bukkit.event.player.PlayerFishEvent;
import org.bukkit.event.player.PlayerGameModeChangeEvent;
import org.bukkit.event.player.PlayerInteractEvent;
import org.bukkit.event.player.PlayerJoinEvent;
import org.bukkit.event.player.PlayerLoginEvent;
Expand Down Expand Up @@ -1059,6 +1060,27 @@ public void onPlayerFishEvent(final PlayerFishEvent event) {
user.updateActivityOnInteract(true);
}

@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
public void onPlayerGameModeChange(final PlayerGameModeChangeEvent event) {
if (!ess.getSettings().isGamemodeChangePreserveFlying()) {
return;
}

final User user = ess.getUser(event.getPlayer());
if (!user.isAuthorized("essentials.fly")) {
return;
}

final Player player = event.getPlayer();
if (player.isFlying() && player.getAllowFlight() && user.isAuthorized("essentials.fly")) {
// The gamemode change happens after the event, so we need to delay the flight enable
ess.scheduleSyncDelayedTask(() -> {
player.setAllowFlight(true);
player.setFlying(true);
}, 1);
}
}

private static final class ArrowPickupListener implements Listener {
@EventHandler(priority = EventPriority.LOW)
public void onArrowPickup(final org.bukkit.event.player.PlayerPickupArrowEvent event) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -356,6 +356,8 @@ public interface ISettings extends IConf {

boolean isWorldChangePreserveFlying();

boolean isGamemodeChangePreserveFlying();

boolean isWorldChangeSpeedResetEnabled();

long getCommandCooldownMs(String label);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1964,6 +1964,11 @@ public boolean isWorldChangePreserveFlying() {
return config.getBoolean("world-change-preserve-flying", true);
}

@Override
public boolean isGamemodeChangePreserveFlying() {
return config.getBoolean("gamemode-change-preserve-flying", false);
}

@Override
public boolean isWorldChangeSpeedResetEnabled() {
return config.getBoolean("world-change-speed-reset", true);
Expand Down
5 changes: 5 additions & 0 deletions Essentials/src/main/resources/config.yml
Original file line number Diff line number Diff line change
Expand Up @@ -235,6 +235,11 @@ world-change-fly-reset: true
# This will only work if the player has the 'essentials.fly' permission.
world-change-preserve-flying: true

# Should Essentials preserve a player's flight status when they change game modes?
# When enabled, if a player is flying when switching game modes, their flight will be maintained.
# This will only work if the player has the 'essentials.fly' permission.
gamemode-change-preserve-flying: false

# When a player changes worlds, should Essentials reset their speed according to their permissions?
# This resets the player's speed to the default if they don't have 'essentials.speed'.
# If the player doesn't have 'essentials.speed.bypass', their speed will be reset to the maximum values
Expand Down
Loading