Skip to content
Closed
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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;
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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());
}

}
}
8 changes: 8 additions & 0 deletions Essentials/src/main/java/com/earth2me/essentials/User.java
Original file line number Diff line number Diff line change
Expand Up @@ -103,6 +103,7 @@ public class User extends UserData implements Comparable<User>, 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);
Expand Down Expand Up @@ -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;
}
}
Original file line number Diff line number Diff line change
@@ -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));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import com.earth2me.essentials.Essentials;
import com.earth2me.essentials.EssentialsLogger;
import com.earth2me.essentials.chat.processing.AntiSpam;
import com.earth2me.essentials.chat.processing.ChatHandler;
import com.earth2me.essentials.chat.processing.PaperChatHandler;
import com.earth2me.essentials.metrics.MetricsWrapper;
Expand All @@ -19,6 +20,7 @@
public class EssentialsChat extends JavaPlugin {
private transient IEssentials ess;
private transient MetricsWrapper metrics = null;
public transient AntiSpam antiSpam = new AntiSpam();

@Override
public void onEnable() {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package com.earth2me.essentials.chat.processing;

import java.util.HashMap;
import java.util.Map;
import java.util.UUID;

public class AntiSpam {
static AntiSpam antiSpam;
public AntiSpam() {
antiSpam = this;
}
//Needs a listener, last message cache, compare to last message,
Map<UUID, String> lastMessage = new HashMap<>();
public boolean newMessage(UUID uuid, String message){
String storedMessage = lastMessage.get(uuid);
if(storedMessage.equalsIgnoreCase(message) || storedMessage.startsWith(message)) {
return true;
}
lastMessage.put(uuid, message);
return false;
}
public static AntiSpam getAntiSpam(){
return antiSpam;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,9 @@ public void onPlayerChat(AsyncPlayerChatEvent event) {
final AbstractChatEvent absEvent = wrap(event);
handleChatPostFormat(absEvent);
handleChatSubmit(absEvent);

event.setCancelled(AntiSpam.getAntiSpam().newMessage(event.getPlayer().getUniqueId(),
event.getMessage()));
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@ public class PaperChatHandler extends AbstractChatHandler {
public PaperChatHandler(Essentials ess, EssentialsChat essChat) {
super(ess, essChat);
}

public void registerListeners() {
final PluginManager pm = essChat.getServer().getPluginManager();
pm.registerEvents(new ChatListener(), essChat);
Expand All @@ -31,6 +30,8 @@ public void onChatNormal(AbstractChatEvent event) {
public void onChatHighest(AbstractChatEvent event) {
handleChatPostFormat(event);
handleChatSubmit(event);
event.setCancelled(AntiSpam.getAntiSpam().newMessage(event.getPlayer().getUniqueId(),
event.getMessage()));
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,8 @@ public class SpigotChatEvent implements AbstractChatEvent {

public SpigotChatEvent(AsyncPlayerChatEvent event) {
this.event = event;
event.setCancelled(AntiSpam.getAntiSpam().newMessage(event.getPlayer().getUniqueId(),
event.getMessage()));
}

@Override
Expand Down Expand Up @@ -69,4 +71,5 @@ public void removeRecipients(Predicate<Player> predicate) {
public void addRecipient(Player player) {
event.getRecipients().add(player);
}

}