diff --git a/Essentials/src/main/java/com/earth2me/essentials/EssentialsEntityListener.java b/Essentials/src/main/java/com/earth2me/essentials/EssentialsEntityListener.java index 1d1fbff1ee..a7361bc950 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/EssentialsEntityListener.java +++ b/Essentials/src/main/java/com/earth2me/essentials/EssentialsEntityListener.java @@ -272,4 +272,14 @@ public void onEntityTarget(final EntityTargetEvent event) { } } } + @EventHandler(priority = EventPriority.HIGHEST) + public void onPhantomSpawn(final EntitySpawnEvent event) { + if (event.getEntity() instanceof Phantom) { + final Phantom phantom = (Phantom) event.getEntity(); + final User user = ess.getUser((Player) phantom.getTarget()); + if (user.isVanished()) { + event.setCancelled(true); + } + } + } } diff --git a/Essentials/src/main/java/com/earth2me/essentials/EssentialsPlayerListener.java b/Essentials/src/main/java/com/earth2me/essentials/EssentialsPlayerListener.java index 60d3b4c25f..c50977b225 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/EssentialsPlayerListener.java +++ b/Essentials/src/main/java/com/earth2me/essentials/EssentialsPlayerListener.java @@ -21,6 +21,7 @@ import io.papermc.paper.event.player.PlayerServerFullCheckEvent; import net.ess3.api.IEssentials; import net.ess3.api.events.AfkStatusChangeEvent; +import net.ess3.api.events.VanishStatusChangeEvent; import net.ess3.provider.CommandSendListenerProvider; import net.ess3.provider.FormattedCommandAliasProvider; import net.ess3.provider.InventoryViewProvider; @@ -30,12 +31,7 @@ import net.ess3.provider.providers.PaperCommandSendListenerProvider; import net.essentialsx.PaperAdventureSmuggler; import net.essentialsx.api.v2.events.AsyncUserDataLoadEvent; -import org.bukkit.BanEntry; -import org.bukkit.BanList; -import org.bukkit.GameMode; -import org.bukkit.Location; -import org.bukkit.Material; -import org.bukkit.World; +import org.bukkit.*; import org.bukkit.command.Command; import org.bukkit.command.FormattedCommandAlias; import org.bukkit.command.PluginCommand; @@ -70,6 +66,7 @@ import org.bukkit.inventory.InventoryHolder; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.PlayerInventory; +import org.eclipse.sisu.Priority; import java.io.IOException; import java.lang.management.ManagementFactory; @@ -147,6 +144,7 @@ private static boolean isGameEventEvent() { public void registerEvents() { ess.getServer().getPluginManager().registerEvents(this, ess); + ess.getServer().getPluginManager().registerEvents(new VanishListener(), ess); if (isArrowPickupEvent()) { ess.getServer().getPluginManager().registerEvents(new ArrowPickupListener(), ess); @@ -1285,4 +1283,17 @@ private boolean isEssentialsCommand(final String label) { && (ess.getSettings().isCommandOverridden(label) || ess.getAlternativeCommandsHandler().getAlternative(label) == null); } } + private class VanishListener implements Listener { + + @EventHandler(priority = EventPriority.LOWEST) + private void vanishEvent(VanishStatusChangeEvent event) { + User user = ess.getUser(event.getAffected().getUUID()); + if(event.getValue()){ + user.setLastSleptBeforeVanish(user.getBase().getStatistic(Statistic.TIME_SINCE_REST)); + return; + } + user.getBase().setStatistic(Statistic.TIME_SINCE_REST, user.getLastSleptBeforeVanish()); + } + + } } diff --git a/Essentials/src/main/java/com/earth2me/essentials/User.java b/Essentials/src/main/java/com/earth2me/essentials/User.java index ab0281910e..0181127756 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/User.java +++ b/Essentials/src/main/java/com/earth2me/essentials/User.java @@ -103,6 +103,7 @@ public class User extends UserData implements Comparable, IMessageRecipien private transient int flightTick = -1; private String lastLocaleString; private Locale playerLocale; + private int lastSleptBeforeVanish; public User(final Player base, final IEssentials ess) { super(base, ess); @@ -1376,4 +1377,11 @@ public int getFlightTick() { public void setFlightTick(int flightTick) { this.flightTick = flightTick; } + + public void setLastSleptBeforeVanish(int lastSleptBeforeVanish) { + this.lastSleptBeforeVanish = lastSleptBeforeVanish; + } + public int getLastSleptBeforeVanish() { + return this.lastSleptBeforeVanish; + } } diff --git a/Essentials/src/test/java/com/earth2me/essentials/VanishListenerTest.java b/Essentials/src/test/java/com/earth2me/essentials/VanishListenerTest.java new file mode 100644 index 0000000000..22bc140945 --- /dev/null +++ b/Essentials/src/test/java/com/earth2me/essentials/VanishListenerTest.java @@ -0,0 +1,71 @@ +package com.earth2me.essentials; + +import net.ess3.api.IUser; +import net.ess3.api.events.VanishStatusChangeEvent; +import org.bukkit.Statistic; +import org.bukkit.event.entity.PlayerLeashEntityEvent; +import org.bukkit.event.player.PlayerBedEnterEvent; +import org.bukkit.event.player.PlayerBedLeaveEvent; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.mockbukkit.mockbukkit.MockBukkit; +import org.mockbukkit.mockbukkit.ServerMock; +import org.mockbukkit.mockbukkit.entity.PlayerMock; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; + +public class VanishListenerTest { + + private ServerMock server; + private Essentials ess; + private PlayerMock player; + private User user; + private IUser vanishedUser; + + @BeforeEach + public void setUp() { + this.server = MockBukkit.mock(); + Essentials.TESTING = true; + ess = MockBukkit.load(Essentials.class); + player = server.addPlayer("testPlayer"); + ess.getUser(player); + user = ess.getUser(player); + assertNotNull(user); + } + + @AfterEach + public void tearDown() { + MockBukkit.unmock(); + } + + @Test + public void shouldSaveTimeSinceRestWhenEnteringVanish() { + player.setStatistic(Statistic.TIME_SINCE_REST, 1200); + VanishStatusChangeEvent event = new VanishStatusChangeEvent(user, user, true); + assertEquals(user, event.getAffected()); + server.getPluginManager().callEvent(event); + assertEquals(1200, user.getLastSleptBeforeVanish()); + } + + @Test + public void shouldRestoreTimeSinceRestWhenLeavingVanish() { + player.setStatistic(Statistic.TIME_SINCE_REST, 1200); + server.getPluginManager().callEvent(new VanishStatusChangeEvent(user, user, true)); + player.setStatistic(Statistic.TIME_SINCE_REST, 8000); + server.getPluginManager().callEvent(new VanishStatusChangeEvent(user, user, false)); + assertEquals(1200, player.getStatistic(Statistic.TIME_SINCE_REST)); + } + + @Test + public void shouldPreserveTimeSinceRestWhenSleepingWhileVanished() { + player.setStatistic(Statistic.TIME_SINCE_REST, 1200); + server.getPluginManager().callEvent(new VanishStatusChangeEvent(user, user, true)); + server.getPluginManager().callEvent(new PlayerBedEnterEvent(player, player.getLocation().getBlock(), PlayerBedEnterEvent.BedEnterResult.OK)); + server.getScheduler().performTicks(1500); + server.getPluginManager().callEvent(new PlayerBedLeaveEvent(player, player.getLocation().getBlock(), true)); + server.getPluginManager().callEvent(new VanishStatusChangeEvent(user, user, false)); + assertEquals(1200, player.getStatistic(Statistic.TIME_SINCE_REST)); + } +} \ No newline at end of file