Skip to content

Commit

Permalink
Merge branch 'crazycat256-paper'
Browse files Browse the repository at this point in the history
  • Loading branch information
LeonMangler committed Aug 13, 2023
2 parents d846cd5 + a9b9770 commit 086278d
Show file tree
Hide file tree
Showing 8 changed files with 219 additions and 14 deletions.
8 changes: 4 additions & 4 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@

<groupId>de.myzelyam</groupId>
<artifactId>SuperVanish</artifactId>
<version>6.2.17</version>
<version>6.2.18</version>

<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
Expand Down Expand Up @@ -80,10 +80,10 @@
</repository>
</repositories>
<dependencies>
<!--Spigot API-->
<!--Paper API-->
<dependency>
<groupId>org.spigotmc</groupId>
<artifactId>spigot-api</artifactId>
<groupId>io.papermc.paper</groupId>
<artifactId>paper-api</artifactId>
<version>1.20.1-R0.1-SNAPSHOT</version>
<scope>provided</scope>
</dependency>
Expand Down
4 changes: 2 additions & 2 deletions src/main/java/de/myzelyam/supervanish/SuperVanish.java
Original file line number Diff line number Diff line change
Expand Up @@ -47,11 +47,11 @@ public class SuperVanish extends JavaPlugin implements SuperVanishPlugin {
public static final String[] NON_REQUIRED_SETTINGS_UPDATES = {"6.0.0", "6.0.1", "6.0.2", "6.0.3",
"6.0.4", "6.0.5", "6.1.0", "6.1.1", "6.1.2", "6.1.3", "6.1.4", "6.1.5", "6.1.6", "6.1.7",
"6.1.8", "6.2.0", "6.2.1", "6.2.2", "6.2.3", "6.2.4", "6.2.5", "6.2.6", "6.2.7", "6.2.8",
"6.2.9", "6.2.10", "6.2.11", "6.2.12", "6.2.13", "6.2.14", "6.2.15", "6.2.16"},
"6.2.9", "6.2.10", "6.2.11", "6.2.12", "6.2.13", "6.2.14", "6.2.15", "6.2.16", "6.2.17"},
NON_REQUIRED_MESSAGES_UPDATES = {"6.0.0", "6.0.1", "6.0.2", "6.0.3", "6.0.4", "6.0.5", "6.1.0",
"6.1.1", "6.1.2", "6.1.3", "6.1.4", "6.1.5", "6.1.6", "6.1.7", "6.1.8", "6.2.0", "6.2.1",
"6.2.2", "6.2.3", "6.2.4", "6.2.5", "6.2.6", "6.2.7", "6.2.8", "6.2.9", "6.2.10", "6.2.11",
"6.2.12", "6.2.13", "6.2.14", "6.2.15", "6.2.16"};
"6.2.12", "6.2.13", "6.2.14", "6.2.15", "6.2.16", "6.2.17"};

@Getter
private boolean useProtocolLib;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,8 @@ public class FeatureMgr {

private static final Requirement<FeatureInfo> protocolLibInstalled = featureInfo -> Bukkit.getPluginManager().isPluginEnabled("ProtocolLib"),
oneDotEightOrHigher = featureInfo -> featureInfo.getPlugin().getVersionUtil().isOneDotXOrHigher(8),
oneDotSeventeenOrHigher = featureInfo -> featureInfo.getPlugin().getVersionUtil().isOneDotXOrHigher(17);
oneDotSeventeenOrHigher = featureInfo -> featureInfo.getPlugin().getVersionUtil().isOneDotXOrHigher(17),
paperServer = featureInfo -> Bukkit.getServer().getName().equals("Paper");
private final Map<String, FeatureInfo> registeredFeatures = new HashMap<>();
private final Set<Feature> activeFeatures = new HashSet<>();
private final SuperVanish plugin;
Expand All @@ -51,6 +52,10 @@ public FeatureMgr(SuperVanish plugin) {
Collections.singletonList(oneDotSeventeenOrHigher)));
registeredFeatures.put("NoRaidTrigger", new FeatureInfo(NoRaidTrigger.class, plugin,
Collections.singletonList(oneDotSeventeenOrHigher)));
registeredFeatures.put("NoMobSpawn", new FeatureInfo(NoMobSpawn.class, plugin,
Collections.singletonList(paperServer)));
registeredFeatures.put("HideAdvancementMessages", new FeatureInfo(HideAdvancementMessages.class, plugin,
Collections.singletonList(paperServer)));
}

public void enableFeatures() {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
package de.myzelyam.supervanish.features;

import de.myzelyam.supervanish.SuperVanish;
import net.kyori.adventure.text.Component;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.player.PlayerAdvancementDoneEvent;

// This feature is paper-only because the PlayerAdvancementDoneEvent#message() method doesn't exist in Spigot
public class HideAdvancementMessages extends Feature {

private boolean suppressErrors = false;

public HideAdvancementMessages(SuperVanish plugin) {
super(plugin);
}

@EventHandler
public void onAdvancementDone(PlayerAdvancementDoneEvent e) {
try {
Player p = e.getPlayer();
Component message = e.message();
if (message == null) return;
if (!plugin.getVanishStateMgr().isVanished(p.getUniqueId())) return;
if (e.message() == null) return;
e.message(null);
p.sendMessage(message);
} catch (Exception er) {
if (!suppressErrors) {
plugin.logException(er);
suppressErrors = true;
}
}
}

@Override
public boolean isActive() {
return plugin.getSettings().getBoolean("MessageOptions.HideAdvancementMessages", true);
}
}
96 changes: 96 additions & 0 deletions src/main/java/de/myzelyam/supervanish/features/NoMobSpawn.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,96 @@
package de.myzelyam.supervanish.features;

import com.destroystokyo.paper.event.entity.PlayerNaturallySpawnCreaturesEvent;
import com.destroystokyo.paper.event.entity.PreSpawnerSpawnEvent;
import com.destroystokyo.paper.event.entity.SkeletonHorseTrapEvent;
import de.myzelyam.supervanish.SuperVanish;
import org.bukkit.Bukkit;
import org.bukkit.GameMode;
import org.bukkit.entity.HumanEntity;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;

import java.util.List;
import java.util.UUID;

public class NoMobSpawn extends Feature {

private boolean suppressErrors = false;

public NoMobSpawn(SuperVanish plugin) {
super(plugin);
}

@EventHandler
public void onSkeletonHorseTrap(SkeletonHorseTrapEvent e) {
try {
List<HumanEntity> humans = e.getEligibleHumans();
int humansCount = humans.size();
for (HumanEntity human : humans) {
if (human instanceof Player) {
Player p = (Player) human;
if (plugin.getVanishStateMgr().isVanished(p.getUniqueId())) {
humansCount--;
}
}
}
if (humansCount == 0)
e.setCancelled(true);
} catch (Exception er) {
if (!suppressErrors) {
plugin.logException(er);
suppressErrors = true;
}
}
}

@EventHandler
public void onEntitySpawn(PlayerNaturallySpawnCreaturesEvent e) {
try {
if (plugin.getVanishStateMgr().isVanished(e.getPlayer().getUniqueId()))
e.setCancelled(true);
} catch (Exception er) {
if (!suppressErrors) {
plugin.logException(er);
suppressErrors = true;
}
}
}

@EventHandler
public void onEntitySpawnerSpawn(PreSpawnerSpawnEvent e) {
try {
// First check if a non-spectator vanished player is in range
boolean vanishedPlayerInRange = false;
for (UUID vanishedUUID : plugin.getVanishStateMgr().getOnlineVanishedPlayers()) {
Player p = Bukkit.getPlayer(vanishedUUID);
if (p == null) continue;
if (p.getWorld().equals(e.getSpawnerLocation().getWorld()) &&
p.getLocation().distanceSquared(e.getSpawnerLocation()) <= 256 &&
p.getGameMode() != GameMode.SPECTATOR)
vanishedPlayerInRange = true;
}
if (!vanishedPlayerInRange) return;

// If so, only cancel if no non-vanished player is in range
for (Player p : Bukkit.getOnlinePlayers()) {
if (p.getWorld().equals(e.getSpawnerLocation().getWorld()) &&
p.getLocation().distanceSquared(e.getSpawnerLocation()) <= 256 &&
p.getGameMode() != GameMode.SPECTATOR &&
!plugin.getVanishStateMgr().isVanished(p.getUniqueId()))
return;
}
e.setCancelled(true);
} catch (Exception er) {
if (!suppressErrors) {
plugin.logException(er);
suppressErrors = true;
}
}
}

@Override
public boolean isActive() {
return plugin.getSettings().getBoolean("InvisibilityFeatures.PreventMobSpawning", true);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
package de.myzelyam.supervanish.visibility;

import com.destroystokyo.paper.event.server.PaperServerListPingEvent;
import com.destroystokyo.paper.profile.PlayerProfile;
import de.myzelyam.supervanish.SuperVanish;
import org.bukkit.Bukkit;
import org.bukkit.configuration.file.FileConfiguration;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;

import java.util.Collection;
import java.util.List;
import java.util.UUID;

public class PaperServerPingListener implements Listener {

private boolean errorLogged = false;

private final SuperVanish plugin;

public PaperServerPingListener(SuperVanish plugin) {
this.plugin = plugin;
}

@EventHandler(priority = EventPriority.HIGH)
public void onServerListPing(PaperServerListPingEvent e) {
try {
final FileConfiguration settings = plugin.getSettings();
if (!settings.getBoolean("ExternalInvisibility.ServerList.AdjustAmountOfOnlinePlayers")
&& !settings.getBoolean("ExternalInvisibility.ServerList.AdjustListOfLoggedInPlayers"))
return;
Collection<UUID> onlineVanishedPlayers = plugin.getVanishStateMgr().getOnlineVanishedPlayers();
int vanishedPlayersCount = onlineVanishedPlayers.size(),
playerCount = Bukkit.getOnlinePlayers().size();
if (settings.getBoolean("ExternalInvisibility.ServerList.AdjustAmountOfOnlinePlayers")) {
e.setNumPlayers(playerCount - vanishedPlayersCount);
}
if (settings.getBoolean("ExternalInvisibility.ServerList.AdjustListOfLoggedInPlayers")) {
List<PlayerProfile> playerSample = e.getPlayerSample();

playerSample.removeIf(profile -> onlineVanishedPlayers.contains(profile.getId()));
}
} catch (Exception er) {
if (!errorLogged) {
plugin.logException(er);
errorLogged = true;
}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@
import java.util.Iterator;
import java.util.List;
import java.util.UUID;
import java.util.logging.Level;

public class ServerListPacketListener extends PacketAdapter {

Expand All @@ -48,10 +49,18 @@ public ServerListPacketListener(SuperVanish plugin, boolean use_legacy) {
}

public static void register(SuperVanish plugin) {
if (plugin.getVersionUtil().isOneDotXOrHigher(19)) {
ProtocolLibrary.getProtocolManager().addPacketListener(new ServerListPacketListener(plugin));
} else {
ProtocolLibrary.getProtocolManager().addPacketListener(new ServerListPacketListener(plugin, true));
// Use Paper event listener if available
try {
Class.forName("com.destroystokyo.paper.event.server.PaperServerListPingEvent");
plugin.getLogger().log(Level.INFO, "Hooked into PaperSpigot for server list ping support");
plugin.getServer().getPluginManager().registerEvents(new PaperServerPingListener(plugin), plugin);
} catch (ClassNotFoundException ignored) {
// Otherwise use ProtocolLib
if (plugin.getVersionUtil().isOneDotXOrHigher(19)) {
ProtocolLibrary.getProtocolManager().addPacketListener(new ServerListPacketListener(plugin));
} else {
ProtocolLibrary.getProtocolManager().addPacketListener(new ServerListPacketListener(plugin, true));
}
}
}

Expand Down Expand Up @@ -86,12 +95,12 @@ public void onPacketSending(PacketEvent e) {
}
}
ping.setPlayers(wrappedGameProfiles);
e.getPacket().getServerPings().write(0, ping);
}
e.getPacket().getServerPings().write(0, ping);
} catch (Exception er) {
if (!errorLogged) {
if (er.getMessage() != null && er.getMessage().contains("Unable to construct new instance using public net.minecraft.network.protocol.status.ServerPing$ServerPingPlayerSample(int,int,java.util.List)")) {
plugin.getLogger().warning("The spigot-sided serverlist features are not supported by ProtocolLib on your server. Please make sure you are using the latest ProtocolLib dev build. (Unable to construct new instance using public net.minecraft.network.protocol.status.ServerPing$ServerPingPlayerSample(int,int,java.util.List))\n");
if (er.getMessage() != null && er.getMessage().contains("Unable to construct new instance using public net.minecraft.network.protocol.status.ServerPing")) {
plugin.getLogger().warning("The spigot-sided serverlist features are not supported by ProtocolLib on your server. Please make sure you are using the latest ProtocolLib dev build. (" + er.getMessage() + ")\n");
} else if (er.getMessage() != null && er.getMessage().contains("Cannot assign field \"online\" because \"this.playerSample\" is null")) {
plugin.getLogger().warning("The spigot-sided serverlist features are not supported yet by ProtocolLib. Please make sure you are using the latest ProtocolLib dev build.");
} else {
Expand Down
4 changes: 4 additions & 0 deletions src/main/resources/config.yml
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,8 @@ InvisibilityFeatures:
DisableDripLeaf: true
# Should vanished players be unable to trigger raids?
PreventRaidTriggering: true
# Should vanished players be unable to make mobs spawn? (paper only)
PreventMobSpawning: true

Fly:
# Should invisible players be able to fly even if they aren't in creative/spectator mode?
Expand Down Expand Up @@ -101,6 +103,8 @@ MessageOptions:

# Should SV hide the real join/leave messages of invisible players?
HideRealJoinQuitMessages: true
# Should SV hide the advancement messages of invisible players (only send it to the player)? (paper only)
HideAdvancementMessages: true
# Should SV hide leave messages for invisible players if 'VanishStateFeatures->ReappearOnQuit' is turned on?
# Overrides 'HideRealJoinQuitMessages'
ReappearOnQuitHideLeaveMsg: true
Expand Down

0 comments on commit 086278d

Please sign in to comment.