#1280 Add NOTHING as possible flight restore type

This commit is contained in:
ljacqu
2017-07-10 21:40:14 +02:00
parent ce2138a65c
commit e1826c75c8
6 changed files with 91 additions and 24 deletions
@@ -2,8 +2,6 @@ package fr.xephi.authme.data.limbo;
import org.bukkit.entity.Player;
import java.util.function.Function;
/**
* Possible types to restore the "allow flight" property
* from LimboPlayer to Bukkit Player.
@@ -11,24 +9,41 @@ import java.util.function.Function;
public enum AllowFlightRestoreType {
/** Set value from LimboPlayer to Player. */
RESTORE(LimboPlayer::isCanFly),
RESTORE {
@Override
public void restoreAllowFlight(Player player, LimboPlayer limbo) {
player.setAllowFlight(limbo.isCanFly());
}
},
/** Always set flight enabled to true. */
ENABLE(l -> true),
ENABLE {
@Override
public void restoreAllowFlight(Player player, LimboPlayer limbo) {
player.setAllowFlight(true);
}
},
/** Always set flight enabled to false. */
DISABLE(l -> false);
DISABLE {
@Override
public void restoreAllowFlight(Player player, LimboPlayer limbo) {
player.setAllowFlight(false);
}
},
private final Function<LimboPlayer, Boolean> valueGetter;
/** Always set flight enabled to false. */
NOTHING {
@Override
public void restoreAllowFlight(Player player, LimboPlayer limbo) {
// noop
}
/**
* Constructor.
*
* @param valueGetter function with which the value to set on the player can be retrieved
*/
AllowFlightRestoreType(Function<LimboPlayer, Boolean> valueGetter) {
this.valueGetter = valueGetter;
}
@Override
public void processPlayer(Player player) {
// noop
}
};
/**
* Restores the "allow flight" property from the LimboPlayer to the Player.
@@ -37,7 +52,15 @@ public enum AllowFlightRestoreType {
* @param player the player to modify
* @param limbo the limbo player to read from
*/
public void restoreAllowFlight(Player player, LimboPlayer limbo) {
player.setAllowFlight(valueGetter.apply(limbo));
public abstract void restoreAllowFlight(Player player, LimboPlayer limbo);
/**
* Processes the player when a LimboPlayer instance is created based on him. Typically this
* method revokes the {@code allowFlight} property to be restored again later.
*
* @param player the player to process
*/
public void processPlayer(Player player) {
player.setAllowFlight(false);
}
}
@@ -4,6 +4,7 @@ import fr.xephi.authme.ConsoleLogger;
import fr.xephi.authme.permission.PermissionsManager;
import fr.xephi.authme.settings.Settings;
import fr.xephi.authme.settings.SpawnLoader;
import fr.xephi.authme.settings.properties.LimboSettings;
import fr.xephi.authme.settings.properties.RestrictionSettings;
import org.bukkit.Location;
import org.bukkit.entity.Player;
@@ -59,7 +60,8 @@ class LimboServiceHelper {
*/
void revokeLimboStates(Player player) {
player.setOp(false);
player.setAllowFlight(false);
settings.getProperty(LimboSettings.RESTORE_ALLOW_FLIGHT)
.processPlayer(player);
if (!settings.getProperty(RestrictionSettings.ALLOW_UNAUTHED_MOVEMENT)) {
player.setFlySpeed(0.0f);
@@ -45,8 +45,9 @@ public final class LimboSettings implements SettingsHolder {
newProperty(SegmentSize.class, "limbo.persistence.distributionSize", SegmentSize.SIXTEEN);
@Comment({
"Whether the player is allowed to fly: RESTORE, ENABLE, DISABLE.",
"RESTORE sets back the old property from the player."
"Whether the player is allowed to fly: RESTORE, ENABLE, DISABLE, NOTHING.",
"RESTORE sets back the old property from the player. NOTHING will prevent AuthMe",
"from modifying the 'allow flight' property on the player."
})
public static final Property<AllowFlightRestoreType> RESTORE_ALLOW_FLIGHT =
newProperty(AllowFlightRestoreType.class, "limbo.restoreAllowFlight", AllowFlightRestoreType.RESTORE);
@@ -6,6 +6,7 @@ import org.junit.Test;
import static org.mockito.BDDMockito.given;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.verifyZeroInteractions;
/**
* Test for {@link AllowFlightRestoreType}.
@@ -64,6 +65,42 @@ public class AllowFlightRestoreTypeTest {
verify(player2).setAllowFlight(false);
}
@Test
public void shouldNotInteractWithPlayer() {
// given
LimboPlayer limboWithFly = newLimboWithAllowFlight(true);
LimboPlayer limboWithoutFly = newLimboWithAllowFlight(false);
Player player1 = mock(Player.class);
Player player2 = mock(Player.class);
// when
AllowFlightRestoreType.NOTHING.restoreAllowFlight(player1, limboWithFly);
AllowFlightRestoreType.NOTHING.restoreAllowFlight(player2, limboWithoutFly);
// then
verifyZeroInteractions(player1, player2);
}
@Test
public void shouldRemoveFlightExceptForNothingType() {
// given
AllowFlightRestoreType noInteractionType = AllowFlightRestoreType.NOTHING;
for (AllowFlightRestoreType type : AllowFlightRestoreType.values()) {
Player player = mock(Player.class);
// when
type.processPlayer(player);
// then
if (type == noInteractionType) {
verifyZeroInteractions(player);
} else {
verify(player).setAllowFlight(false);
}
}
}
private static LimboPlayer newLimboWithAllowFlight(boolean allowFlight) {
LimboPlayer limbo = mock(LimboPlayer.class);
given(limbo.isCanFly()).willReturn(allowFlight);
@@ -84,6 +84,7 @@ public class LimboServiceTest {
given(spawnLoader.getPlayerLocationOrSpawn(player)).willReturn(playerLoc);
given(permissionsManager.hasGroupSupport()).willReturn(true);
given(permissionsManager.getGroups(player)).willReturn(Collections.singletonList("permgrwp"));
given(settings.getProperty(LimboSettings.RESTORE_ALLOW_FLIGHT)).willReturn(AllowFlightRestoreType.ENABLE);
// when
limboService.createLimboPlayer(player, true);
@@ -114,6 +115,7 @@ public class LimboServiceTest {
Location playerLoc = mock(Location.class);
given(spawnLoader.getPlayerLocationOrSpawn(player)).willReturn(playerLoc);
given(permissionsManager.hasGroupSupport()).willReturn(false);
given(settings.getProperty(LimboSettings.RESTORE_ALLOW_FLIGHT)).willReturn(AllowFlightRestoreType.RESTORE);
// when
limboService.createLimboPlayer(player, false);
@@ -143,6 +145,7 @@ public class LimboServiceTest {
LimboPlayer existingLimbo = mock(LimboPlayer.class);
getLimboMap().put("carlos", existingLimbo);
Player player = newPlayer("Carlos");
given(settings.getProperty(LimboSettings.RESTORE_ALLOW_FLIGHT)).willReturn(AllowFlightRestoreType.ENABLE);
// when
limboService.createLimboPlayer(player, false);