Add bedrock player check

This commit is contained in:
xaw3ep 2021-02-28 23:12:39 +07:00
parent a155415182
commit 0a811c7351
8 changed files with 331 additions and 66 deletions

View File

@ -0,0 +1,4 @@
name: CompatNoCheatPlus
main: me.asofold.bpl.cncp.bungee.CompatNoCheatPlus
version: ${project.version}-${buildDescription}
author: asofold, xaw3ep

Binary file not shown.

View File

@ -2,7 +2,7 @@
<modelVersion>4.0.0</modelVersion>
<groupId>CompatNoCheatPlus</groupId>
<artifactId>CompatNoCheatPlus</artifactId>
<version>6.6.6-SNAPSHOT</version>
<version>6.6.7-SNAPSHOT</version>
<name>CompatNoCheatPlus</name>
@ -13,35 +13,27 @@
<url>https://github.com/asofold/${project.name}</url>
</scm>
<!-- Repositories -->
<!-- Repositories -->
<repositories>
<repository>
<id>spigot-repo</id>
<url>http://hub.spigotmc.org/nexus/content/repositories/snapshots</url>
</repository>
<repository>
<id>md_5-snapshots</id>
<url>http://repo.md-5.net/content/repositories/snapshots/</url>
</repository>
<repository>
<id>md_5-releases</id>
<url>http://repo.md-5.net/content/repositories/releases/</url>
</repository>
<repository>
<id>cititensnpcs</id>
<url>http://repo.citizensnpcs.co/</url>
</repository>
<repository>
<id>repo-public</id>
<url>https://repo.codemc.org/repository/maven-public/</url>
</repository>
<repository>
<id>opencollab-snapshot-repo</id>
<url>https://repo.opencollab.dev/maven-snapshots/</url>
</repository>
<repository>
<id>repo-nms</id>
<url>https://repo.codemc.org/repository/nms/</url>
</repository>
</repositories>
<!-- Dependencies -->
<dependencies>
<dependency>
<groupId>org.bukkit</groupId>
<artifactId>bukkit</artifactId>
<groupId>org.spigotmc</groupId>
<artifactId>spigot</artifactId>
<version>1.8.8-R0.1-SNAPSHOT</version>
<scope>provided</scope>
</dependency>
@ -51,61 +43,95 @@
<version>2.1.158</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>fr.neatmonster</groupId>
<artifactId>nocheatplus</artifactId>
<version>3.16.1-SNAPSHOT</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>net.citizensnpcs</groupId>
<artifactId>citizensapi</artifactId>
<version>2.0.16-SNAPSHOT</version>
<version>2.0.26-SNAPSHOT</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.benzoft.gravitytubes</groupId>
<artifactId>gravitytubes</artifactId>
<version>1.0</version>
<scope>system</scope>
<systemPath>${basedir}/libs/GravityTubes.jar</systemPath>
<dependency>
<groupId>com.benzoft.gravitytubes</groupId>
<artifactId>gravitytubes</artifactId>
<version>1.0</version>
<scope>system</scope>
<systemPath>${basedir}/libs/GravityTubes.jar</systemPath>
</dependency>
<dependency>
<groupId>com.Zrips.CMI</groupId>
<artifactId>CMI</artifactId>
<version>1.0</version>
<scope>system</scope>
<systemPath>${basedir}/libs/CMIAPI7.6.2.0.jar</systemPath>
<dependency>
<groupId>com.Zrips.CMI</groupId>
<artifactId>CMI</artifactId>
<version>1.0</version>
<scope>system</scope>
<systemPath>${basedir}/libs/CMIAPI7.6.2.0.jar</systemPath>
</dependency>
<dependency>
<groupId>fr.neatmonster</groupId>
<artifactId>nocheatplus</artifactId>
<version>3.17-SNAPSHOT-Updated</version>
<scope>system</scope>
<systemPath>${basedir}/libs/NoCheatPlus.jar</systemPath>
</dependency>
<dependency>
<groupId>org.geysermc</groupId>
<artifactId>connector</artifactId>
<version>1.2.0-SNAPSHOT</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.geysermc</groupId>
<artifactId>floodgate-bukkit</artifactId>
<version>1.0-SNAPSHOT</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.geysermc</groupId>
<artifactId>floodgate-bungee</artifactId>
<version>1.0-SNAPSHOT</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.github.steveice10</groupId>
<artifactId>mcprotocollib</artifactId>
<version>1.16.4-2-20210115.210558-6</version>
</dependency>
<dependency>
<groupId>net.md-5</groupId>
<artifactId>bungeecord-api</artifactId>
<version>1.16-R0.5-20210213.224112-6</version>
</dependency>
<dependency>
<groupId>net.md-5</groupId>
<artifactId>bungeecord-event</artifactId>
<version>1.16-R0.5-20210213.224052-6</version>
</dependency>
</dependencies>
<!-- Build Description Profiles -->
<profiles>
<profile>
<id>timestamp</id>
<activation>
<property>
<name>!env.BUILD_NUMBER</name>
</property>
</activation>
<properties>
<buildDescription>${maven.build.timestamp}</buildDescription>
</properties>
</profile>
<profile>
<id>dynamic_build_number</id>
<activation>
<property>
<name>env.BUILD_NUMBER</name>
</property>
</activation>
<properties>
<buildDescription>b${env.BUILD_NUMBER}</buildDescription>
</properties>
</profile>
</profiles>
<profiles>
<profile>
<id>timestamp</id>
<activation>
<property>
<name>!env.BUILD_NUMBER</name>
</property>
</activation>
<properties>
<buildDescription>${maven.build.timestamp}</buildDescription>
</properties>
</profile>
<profile>
<id>dynamic_build_number</id>
<activation>
<property>
<name>env.BUILD_NUMBER</name>
</property>
</activation>
<properties>
<buildDescription>b${env.BUILD_NUMBER}</buildDescription>
</properties>
</profile>
</profiles>
<!-- Building -->
<!-- Building -->
<build>
<defaultGoal>clean package</defaultGoal>
<sourceDirectory>${basedir}/src</sourceDirectory>
@ -117,6 +143,7 @@
<includes>
<include>plugin.yml</include>
<include>LICENSE.txt</include>
<include>bungee.yml</include>
</includes>
</resource>
</resources>

View File

@ -13,6 +13,7 @@ import org.bukkit.Bukkit;
import org.bukkit.Server;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.configuration.file.YamlConfiguration;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
@ -22,11 +23,11 @@ import org.bukkit.plugin.PluginDescriptionFile;
import org.bukkit.plugin.PluginManager;
import org.bukkit.plugin.java.JavaPlugin;
import org.bukkit.scheduler.BukkitScheduler;
import fr.neatmonster.nocheatplus.NCPAPIProvider;
import fr.neatmonster.nocheatplus.components.registry.feature.IDisableListener;
import fr.neatmonster.nocheatplus.hooks.NCPHook;
import fr.neatmonster.nocheatplus.hooks.NCPHookManager;
import me.asofold.bpl.cncp.bedrock.BedrockPlayerListener;
import me.asofold.bpl.cncp.config.Settings;
import me.asofold.bpl.cncp.config.compatlayer.CompatConfig;
import me.asofold.bpl.cncp.config.compatlayer.NewConfig;
@ -52,6 +53,8 @@ public class CompatNoCheatPlus extends JavaPlugin implements Listener {
private final Settings settings = new Settings();
private boolean bungee;
/** Hooks registered with cncp */
private static final Set<Hook> registeredHooks = new HashSet<Hook>();
@ -243,6 +246,18 @@ public class CompatNoCheatPlus extends JavaPlugin implements Listener {
// Register own listener:
final PluginManager pm = getServer().getPluginManager();
pm.registerEvents(this, this);
pm.registerEvents(new BedrockPlayerListener(), this);
getServer().getMessenger().registerIncomingPluginChannel(this, "cncp:geyser", new BedrockPlayerListener());
try {
bungee = getServer().spigot().getConfig().getBoolean("settings.bungeecord");
// sometimes not work, try the hard way
if (!bungee) {
bungee = YamlConfiguration.loadConfiguration(new File("spigot.yml")).getBoolean("settings.bungeecord");
}
} catch (Throwable t) {
bungee = false;
}
super.onEnable();
// Add Hooks:
@ -351,6 +366,7 @@ public class CompatNoCheatPlus extends JavaPlugin implements Listener {
unregisterNCPHooks(); // Just in case.
enabled = false;
instance = null; // Set last.
getServer().getMessenger().unregisterIncomingPluginChannel(this, "cncp:geyser");
super.onDisable();
}
@ -475,4 +491,11 @@ public class CompatNoCheatPlus extends JavaPlugin implements Listener {
return pdf.getFullName();
}
public Settings getSettings() {
return settings;
}
public boolean isBungeeEnabled() {
return bungee;
}
}

View File

@ -0,0 +1,80 @@
package me.asofold.bpl.cncp.bedrock;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerJoinEvent;
import org.bukkit.plugin.Plugin;
import org.bukkit.plugin.messaging.PluginMessageListener;
import org.geysermc.connector.GeyserConnector;
import org.geysermc.connector.network.session.GeyserSession;
import org.geysermc.floodgate.FloodgateAPI;
import com.github.steveice10.mc.auth.data.GameProfile;
import com.github.steveice10.mc.protocol.MinecraftProtocol;
import com.google.common.io.ByteArrayDataInput;
import com.google.common.io.ByteStreams;
import fr.neatmonster.nocheatplus.checks.CheckType;
import fr.neatmonster.nocheatplus.checks.moving.MovingData;
import fr.neatmonster.nocheatplus.players.DataManager;
import fr.neatmonster.nocheatplus.players.IPlayerData;
import me.asofold.bpl.cncp.CompatNoCheatPlus;
import me.asofold.bpl.cncp.config.Settings;
public class BedrockPlayerListener implements Listener, PluginMessageListener {
private Plugin floodgate = Bukkit.getPluginManager().getPlugin("floodgate-bukkit");
private Plugin geyser = Bukkit.getPluginManager().getPlugin("Geyser-Spigot");
private final Settings settings = CompatNoCheatPlus.getInstance().getSettings();
@EventHandler(priority=EventPriority.MONITOR)
public void onPlayerJoin(PlayerJoinEvent event) {
final Player player = event.getPlayer();
if (floodgate != null && floodgate.isEnabled()) {
if (FloodgateAPI.isBedrockPlayer(player.getUniqueId())) {
processExemption(player);
}
} else
if (geyser != null && geyser.isEnabled()) {
if (GeyserConnector.getInstance().getPlayers().stream()
.map(GeyserSession::getProtocol)
.map(MinecraftProtocol::getProfile)
.map(GameProfile::getName)
.anyMatch(name -> player.getName().equals(name))) {
processExemption(player);
}
}
}
private void processExemption(final Player player) {
final IPlayerData pData = DataManager.getPlayerData(player);
if (pData != null) {
for (CheckType check : settings.extemptChecks) pData.exempt(check);
MovingData data = pData.getGenericInstance(MovingData.class);
data.bedrockPlayer = true;
}
}
private void processExemption(final String playername) {
final IPlayerData pData = DataManager.getPlayerData(playername);
if (pData != null) {
for (CheckType check : settings.extemptChecks) pData.exempt(check);
MovingData data = pData.getGenericInstance(MovingData.class);
data.bedrockPlayer = true;
}
}
@Override
public void onPluginMessageReceived(String channel, Player player, byte[] data) {
if (CompatNoCheatPlus.getInstance().isBungeeEnabled() && channel.equals("cncp:geyser")) {
geyser = null;
floodgate = null;
ByteArrayDataInput input = ByteStreams.newDataInput(data);
String playerName = input.readUTF();
processExemption(playerName);
}
}
}

View File

@ -0,0 +1,86 @@
package me.asofold.bpl.cncp.bungee;
import java.io.ByteArrayOutputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.util.concurrent.TimeUnit;
import org.geysermc.connector.GeyserConnector;
import org.geysermc.connector.network.session.GeyserSession;
import org.geysermc.floodgate.FloodgateAPI;
import com.github.steveice10.mc.auth.data.GameProfile;
import com.github.steveice10.mc.protocol.MinecraftProtocol;
import net.md_5.bungee.api.ProxyServer;
import net.md_5.bungee.api.connection.ProxiedPlayer;
import net.md_5.bungee.api.connection.Server;
import net.md_5.bungee.api.event.PluginMessageEvent;
import net.md_5.bungee.api.event.ServerSwitchEvent;
import net.md_5.bungee.api.plugin.Listener;
import net.md_5.bungee.api.plugin.Plugin;
import net.md_5.bungee.event.EventHandler;
public class CompatNoCheatPlus extends Plugin implements Listener {
private boolean floodgate;
private boolean geyser;
@Override
public void onEnable() {
geyser = checkGeyser();
floodgate = checkFloodgate();
getLogger().info("Registering listeners");
getProxy().getPluginManager().registerListener(this, this);
getProxy().registerChannel("cncp:geyser");
getLogger().info("cncp Bungee mode with Geyser : " + geyser + ", Floodgate : " + floodgate);
}
@EventHandler
public void onMessageReceive(PluginMessageEvent event) {
if (event.getTag().equalsIgnoreCase("cncp:geyser")) {
// Message sent from client, cancel it
if (event.getSender() instanceof ProxiedPlayer) {
event.setCancelled(true);
}
}
}
private boolean checkFloodgate() {
return ProxyServer.getInstance().getPluginManager().getPlugin("floodgate-bungee") != null;
}
private boolean checkGeyser() {
return ProxyServer.getInstance().getPluginManager().getPlugin("Geyser-BungeeCord") != null;
}
private boolean isBedrockPlayer(ProxiedPlayer player) {
if (floodgate) {
return FloodgateAPI.isBedrockPlayer(player.getUniqueId());
} else if (geyser) {
return GeyserConnector.getInstance().getPlayers().stream()
.map(GeyserSession::getProtocol)
.map(MinecraftProtocol::getProfile)
.map(GameProfile::getName)
.anyMatch(name -> player.getName().equals(name));
}
return false;
}
@EventHandler
public void onChangeServer(ServerSwitchEvent event) {
ProxiedPlayer player = event.getPlayer();
Server server = player.getServer();
if (!isBedrockPlayer(player)) return;
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
try {
DataOutputStream dataOutputStream = new DataOutputStream(outputStream);
dataOutputStream.writeUTF(player.getName());
getProxy().getScheduler().schedule(this, () -> {
server.sendData("cncp:geyser", outputStream.toByteArray());
}, 1L, TimeUnit.SECONDS);
} catch (IOException e) {
e.printStackTrace();
}
}
}

View File

@ -7,6 +7,7 @@ import java.util.Set;
import org.bukkit.Bukkit;
import fr.neatmonster.nocheatplus.checks.CheckType;
import me.asofold.bpl.cncp.config.compatlayer.CompatConfig;
import me.asofold.bpl.cncp.config.compatlayer.ConfigUtil;
import me.asofold.bpl.cncp.config.compatlayer.NewConfig;
@ -16,6 +17,7 @@ public class Settings {
public Set<String> forceEnableLater = new LinkedHashSet<String>();
public Set<String> loadPlugins = new LinkedHashSet<String>();
public Set<CheckType> extemptChecks = new LinkedHashSet<CheckType>();
public static Set<String> preventAddHooks = new HashSet<String>();
@ -23,6 +25,19 @@ public class Settings {
CompatConfig cfg = new NewConfig(null);
cfg.set("plugins.force-enable-later", new LinkedList<String>()); // ConfigUtil.asList(new String[]{ "NoCheatPlus" }));
cfg.set("plugins.ensure-enable", new LinkedList<String>()); // ConfigUtil.asList(new String[]{ "WorldGuard" }));
cfg.set("plugins.bedrock-extempt-checks", ConfigUtil.asList(new String[]{
"BLOCKINTERACT_VISIBLE",
"BLOCKINTERACT_DIRECTION",
"BLOCKINTERACT_REACH",
"BLOCKBREAK_DIRECTION",
"BLOCKBREAK_NOSWING",
"BLOCKBREAK_REACH",
"BLOCKPLACE_NOSWING",
"BLOCKPLACE_DIRECTION",
"BLOCKPLACE_REACH",
"BLOCKPLACE_SCAFFOLD",
"FIGHT_DIRECTION",
}));
cfg.set("hooks.prevent-add", new LinkedList<String>());
cfg.set("configversion", configVersion);
return cfg;
@ -61,7 +76,9 @@ public class Settings {
// plugins to force enabling after this plugin.
ConfigUtil.readStringSetFromList(cfg, "plugins.force-enable-later", forceEnableLater, true, true, false);
ConfigUtil.readStringSetFromList(cfg, "plugins.ensure-enable", loadPlugins, true, true, false);
ConfigUtil.readCheckTypeSetFromList(cfg, "plugins.bedrock-extempt-checks", extemptChecks, true, true, true);
// General
ConfigUtil.readStringSetFromList(cfg, "hooks.prevent-add", preventAddHooks, true, true, false);
return true;

View File

@ -5,6 +5,8 @@ import java.util.List;
import java.util.Map;
import java.util.Set;
import fr.neatmonster.nocheatplus.checks.CheckType;
public class ConfigUtil {
public static final int canaryInt = Integer.MIN_VALUE +7;
@ -114,6 +116,32 @@ public class ConfigUtil {
}
}
}
/**
* Add StringList entries to a set.
* @param cfg
* @param path
* @param set
* @param clear If to clear the set.
* @param trim
* @param upperCase
*/
public static void readCheckTypeSetFromList(CompatConfig cfg, String path, Set<CheckType> set, boolean clear, boolean trim, boolean upperCase){
if (clear) set.clear();
List<String> tempList = cfg.getStringList(path , null);
if (tempList != null){
for (String entry : tempList) {
if (trim) entry = entry.trim();
if (upperCase) entry = entry.toUpperCase();
try {
final CheckType checkType = CheckType.valueOf(entry);
set.add(checkType);
} catch (Exception e) {
System.out.print("[cncp] Unknow check " + entry + " is. Skipping!");
}
}
}
}
/**
* Return an ArrayList.