feat(pocket-base): start flying on flight portal entry
This commit is contained in:
@@ -107,7 +107,18 @@ final class BaseFlightController implements Runnable, Listener {
|
||||
}
|
||||
|
||||
void grantPocketPortalFlight(Player player, UUID ownerId) {
|
||||
if (player.getGameMode() != GameMode.SURVIVAL || pocketBases == null
|
||||
|| !pocketBases.ownerForPocketWorld(player.getWorld().getUID())
|
||||
.filter(ownerId::equals).isPresent()) {
|
||||
return;
|
||||
}
|
||||
portalFlight.put(player.getUniqueId(), ownerId);
|
||||
if (applyPocketFlight(player, ownerId)) {
|
||||
player.setFlying(true);
|
||||
player.sendMessage(ChatColor.GREEN + "Pocket dimension flight enabled!");
|
||||
} else {
|
||||
portalFlight.remove(player.getUniqueId());
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -220,14 +231,14 @@ final class BaseFlightController implements Runnable, Listener {
|
||||
}
|
||||
}
|
||||
|
||||
private void applyPocketFlight(Player player, UUID ownerId) {
|
||||
private boolean applyPocketFlight(Player player, UUID ownerId) {
|
||||
PocketBaseState pocket = pocketBases.state(ownerId);
|
||||
boolean ownerFlight = ownerId.equals(player.getUniqueId())
|
||||
&& pocket.flightUnlocked() && pocket.flightEnabled();
|
||||
boolean temporaryFlight = ownerId.equals(portalFlight.get(player.getUniqueId()));
|
||||
if ((!ownerFlight && !temporaryFlight) || pocket.level() < 1) {
|
||||
removeGrantedFlight(player);
|
||||
return;
|
||||
return false;
|
||||
}
|
||||
int halfSize = pocketBases.policy().size(pocket.level()) / 2;
|
||||
int x = player.getLocation().getBlockX();
|
||||
@@ -237,7 +248,7 @@ final class BaseFlightController implements Runnable, Listener {
|
||||
|| z < -halfSize - POCKET_FLIGHT_BUFFER
|
||||
|| z >= halfSize + POCKET_FLIGHT_BUFFER) {
|
||||
removeGrantedFlight(player);
|
||||
return;
|
||||
return false;
|
||||
}
|
||||
if (!player.getAllowFlight()) {
|
||||
player.setAllowFlight(true);
|
||||
@@ -257,6 +268,7 @@ final class BaseFlightController implements Runnable, Listener {
|
||||
} else {
|
||||
warned.remove(player.getUniqueId());
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
private void clearPortalFlight(Player player) {
|
||||
|
||||
@@ -246,7 +246,8 @@ final class PocketBaseController implements Listener, Runnable {
|
||||
if (isIntact(portal, Material.GOLD_BLOCK)
|
||||
&& PocketPortalGeometry.isInterior(
|
||||
portal, position(destination)
|
||||
)) {
|
||||
) && (event.getFrom() == null
|
||||
|| !PocketPortalGeometry.isInterior(portal, position(event.getFrom())))) {
|
||||
flightController.grantPocketPortalFlight(player, ownerId);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -232,10 +232,28 @@ final class BaseFlightControllerTest {
|
||||
new PocketBasePolicy(PluginSettings.from(Map.of()))
|
||||
);
|
||||
|
||||
when(player.getGameMode()).thenReturn(org.bukkit.GameMode.CREATIVE);
|
||||
pocketController.grantPocketPortalFlight(player, ownerId);
|
||||
verify(player, never()).setFlying(true);
|
||||
verify(player, never()).sendMessage(anyString());
|
||||
|
||||
when(player.getGameMode()).thenReturn(org.bukkit.GameMode.SURVIVAL);
|
||||
when(location.getBlockX()).thenReturn(10000);
|
||||
pocketController.grantPocketPortalFlight(player, ownerId);
|
||||
verify(player, never()).setFlying(true);
|
||||
verify(player, never()).sendMessage(anyString());
|
||||
|
||||
when(location.getBlockX()).thenReturn(0);
|
||||
pocketController.grantPocketPortalFlight(player, ownerId);
|
||||
pocketController.run();
|
||||
|
||||
verify(player).setAllowFlight(true);
|
||||
verify(player).setFlying(true);
|
||||
verify(player).sendMessage(org.bukkit.ChatColor.GREEN + "Pocket dimension flight enabled!");
|
||||
|
||||
when(player.getAllowFlight()).thenReturn(true);
|
||||
pocketController.grantPocketPortalFlight(player, ownerId);
|
||||
verify(player, times(2)).setFlying(true);
|
||||
verify(player, times(2)).sendMessage(org.bukkit.ChatColor.GREEN + "Pocket dimension flight enabled!");
|
||||
}
|
||||
|
||||
@Test
|
||||
|
||||
@@ -456,6 +456,15 @@ final class PocketBaseControllerTest {
|
||||
controller.onMove(event);
|
||||
|
||||
verify(flightController).grantPocketPortalFlight(guest, ownerId);
|
||||
|
||||
when(event.getFrom()).thenReturn(destination);
|
||||
controller.onMove(event);
|
||||
verify(flightController).grantPocketPortalFlight(guest, ownerId);
|
||||
|
||||
when(event.getFrom()).thenReturn(new Location(pocketWorld, 5, 66, 8));
|
||||
controller.onMove(event);
|
||||
verify(flightController, org.mockito.Mockito.times(2))
|
||||
.grantPocketPortalFlight(guest, ownerId);
|
||||
}
|
||||
|
||||
@Test
|
||||
|
||||
Reference in New Issue
Block a user