Restore game mode flag logic to pre-refactor version.

Fixes WORLDGUARD-3320.
This commit is contained in:
sk89q 2015-01-19 11:36:15 -08:00
parent 9998a6c930
commit 73dea11de2
2 changed files with 20 additions and 15 deletions

View File

@ -87,7 +87,8 @@ public void onPlayerGameModeChange(PlayerGameModeChangeEvent event) {
GameModeFlag handler = plugin.getSessionManager().get(player).getHandler(GameModeFlag.class);
if (handler != null && wcfg.useRegions && !plugin.getGlobalRegionManager().hasBypass(player, player.getWorld())) {
GameMode expected = handler.getSetGameMode();
if (expected != event.getNewGameMode()) {
if (handler.getOriginalGameMode() != null && expected != null && expected != event.getNewGameMode()) {
log.info("Game mode change on " + player.getName() + " has been blocked due to the regionw GAMEMODE flag");
event.setCancelled(true);
}
}

View File

@ -28,6 +28,8 @@
import org.bukkit.World;
import org.bukkit.entity.Player;
import javax.annotation.Nullable;
public class GameModeFlag extends FlagValueChangeHandler<GameMode> {
private GameMode originalGameMode;
@ -37,19 +39,27 @@ public GameModeFlag(Session session) {
super(session, DefaultFlag.GAME_MODE);
}
public GameMode getOriginalGameMode() {
return originalGameMode;
}
public GameMode getSetGameMode() {
return setGameMode;
}
private void updateGameMode(Player player, GameMode newValue, World world) {
if (player.getGameMode() != newValue) {
if (originalGameMode == null) {
private void updateGameMode(Player player, @Nullable GameMode newValue, World world) {
if (!getSession().getManager().hasBypass(player, world) && newValue != null) {
if (player.getGameMode() != newValue) {
originalGameMode = player.getGameMode();
}
if (!getSession().getManager().hasBypass(player, world)) {
player.setGameMode(newValue);
setGameMode = newValue;
} else if (originalGameMode == null) {
originalGameMode = player.getServer().getDefaultGameMode();
}
} else {
if (originalGameMode != null) {
GameMode mode = originalGameMode;
originalGameMode = null;
player.setGameMode(mode);
}
}
}
@ -67,13 +77,7 @@ protected boolean onSetValue(Player player, Location from, Location to, Applicab
@Override
protected boolean onAbsentValue(Player player, Location from, Location to, ApplicableRegionSet toSet, GameMode lastValue, MoveType moveType) {
if (originalGameMode != null) {
if (player.getGameMode() == setGameMode) {
player.setGameMode(originalGameMode);
}
originalGameMode = null;
}
updateGameMode(player, null, player.getWorld());
return true;
}