Compare commits

..
47 Commits
Author SHA1 Message Date
rayzsyt f870625551 Add GroupManager support 2025-10-10 02:57:35 +02:00
rayzsyt 993aa1e439 Update version 2025-10-09 03:31:51 +02:00
rayzsyt 44822601ee Fixed 1.8.8 issues 2025-10-09 03:25:59 +02:00
rayzsyt 19e698cce4 Update SubArgument commands for 1.8.8 2025-10-09 03:25:37 +02:00
rayzsyt f393156471 More generalised with BukkitLoader methods 2025-10-09 03:25:08 +02:00
rayzsyt 08e996d8df Improved 2025-10-09 03:24:48 +02:00
rayzsyt afffeed10f Fix 1.8.8 issues 2025-10-09 03:24:06 +02:00
rayzsyt ac7efd60de Added methods and implement body of getPlayerIds method 2025-10-09 03:23:24 +02:00
rayzsyt f0db105e7f Moved to BukkitLoader 2025-10-09 03:23:00 +02:00
rayzsyt e07a8bdebb Small adjustment 2025-10-08 19:14:17 +02:00
rayzsyt 84cff08785 Update version 2025-10-08 19:05:19 +02:00
rayzsyt 0f8740c54b Reverted some api updates 2025-10-08 19:04:48 +02:00
rayzsyt 35e1c9aca2 Add new config section 2025-10-08 18:36:06 +02:00
rayzsyt 98848cffd1 Small default-settings adjustments 2025-10-08 18:25:17 +02:00
rayzsyt df6b6f447d Add UpdateCommandsPerWorld feature 2025-10-08 18:23:59 +02:00
rayzsyt ae59f6c84b Updated moved class import 2025-10-08 18:20:28 +02:00
rayzsyt 74ee1fa94c Moved class 2025-10-08 18:19:57 +02:00
rayzsyt 9e11143b88 Code cleanup 2025-10-08 18:19:16 +02:00
rayzsyt 9786e3e472 Add 2025-10-08 18:16:36 +02:00
rayzsyt 468c7d9bd7 Rename Listener class 2025-10-08 18:16:30 +02:00
rayzsyt 640d428d70 Update api 2025-10-08 18:16:09 +02:00
rayzsyt 9a8b78ce9c Updated version name 2025-09-30 23:07:35 +02:00
rayzsyt 87e13ea777 New method 2025-09-30 23:06:51 +02:00
rayzsyt 8e70558363 Wrong display of commands 2025-09-30 23:06:43 +02:00
rayzsyt 5764842f52 Reload existing proxy commands after specific iterations 2025-09-27 01:46:01 +02:00
rayzsyt c2634da6af Relocated proxy-commands load into separate function instead 2025-09-20 00:00:07 +02:00
rayzsyt bf04109e91 Added delayed reload of proxy-commands 2025-09-19 23:59:03 +02:00
rayzsyt ebc46247ad Fixed wrong display of missing parts after plugin-reload 2025-09-14 19:35:54 +02:00
rayzsyt bac1361f98 Removed unnecessary part 2025-09-14 19:26:41 +02:00
rayzsyt b26b1eacba Minor change to missing-parts format 2025-09-14 19:21:57 +02:00
rayzsyt 367357821e Minor change 2025-09-14 19:21:29 +02:00
rayzsyt 030154a135 Improved tutorial 2025-09-14 19:05:18 +02:00
rayzsyt b0bb78acdd Add BaseCommandCaseSensitive option 2025-09-14 18:50:58 +02:00
rayzsyt f98aafa8d1 Add BaseCommandCaseSensitive option 2025-09-14 18:50:54 +02:00
rayzsyt 805a041474 Remove lowercasing the commands 2025-09-14 18:50:16 +02:00
rayzsyt 3f5a0ae4a0 Update version name 2025-09-14 18:26:01 +02:00
rayzsyt 27caf727de Added Software-API info 2025-09-14 18:15:07 +02:00
rayzsyt 31a7d9bc9f Shorten Folia-Check 2025-09-14 18:09:02 +02:00
rayzsyt 3eaf2549e8 Integrated toggleInjection method 2025-09-14 18:07:15 +02:00
rayzsyt 6f0d290d0d Add toggleInjection method 2025-09-14 18:07:08 +02:00
rayzsyt a03da1bbd3 Experimental removal for unnecessary copy-operation 2025-09-14 17:42:39 +02:00
rayzsyt 35d6bd9ead Avoided modifying an iterating list 2025-09-14 17:42:23 +02:00
rayzsyt 97e7b712c7 Added try-catch to identify errors more precise 2025-09-14 17:41:48 +02:00
rayzsyt fcdcb8fa1c Small adjustment 2025-09-13 19:10:27 +02:00
rayzsyt 71b64d74e6 Improve check 2025-09-13 19:09:12 +02:00
rayzsyt bd411e3239 Test to avoid ArrayOutOfBounds issue 2025-09-13 18:24:05 +02:00
rayzsyt 91ce9326b2 Test to avoid ArrayOutOfBounds issue 2025-09-13 18:17:20 +02:00
36 changed files with 581 additions and 270 deletions

No files matched your search

+10 -3
View File
@@ -6,7 +6,7 @@
<groupId>de.rayzs.pat</groupId>
<artifactId>ProAntiTab</artifactId>
<version>2.0.15</version>
<version>2.0.19</version>
<properties>
<maven.compiler.source>8</maven.compiler.source>
@@ -119,6 +119,13 @@
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.github.ElgarL</groupId>
<artifactId>groupmanager</artifactId>
<version>3.2</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.mojang</groupId>
<artifactId>brigadier</artifactId>
@@ -220,14 +227,14 @@
<dependency>
<groupId>net.kyori</groupId>
<artifactId>adventure-text-minimessage</artifactId>
<version>4.20.0</version>
<version>4.25.0</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>net.kyori</groupId>
<artifactId>adventure-api</artifactId>
<version>4.20.0</version>
<version>4.25.0</version>
<scope>compile</scope>
</dependency>
@@ -47,8 +47,8 @@ public class BukkitPacketAnalyzer {
try {
Channel channel = Reflection.getPlayerChannel(player);
if (channel == null) {
Logger.warning("Failed to inject " + player.getName() + "! Channel is null.");
return false;
}
@@ -57,8 +57,22 @@ public class BukkitPacketAnalyzer {
channel.pipeline().addBefore(BukkitPacketAnalyzer.PIPELINE_NAME, BukkitPacketAnalyzer.HANDLER_NAME, new PacketDecoder(player));
BukkitPacketAnalyzer.INJECTED_PLAYERS.put(player.getUniqueId(), channel);
} catch (Throwable throwable) {
throwable.printStackTrace();
} catch (IndexOutOfBoundsException indexOutOfBoundsException) {
Reflection.toggleInjectionMethod();
Logger.info("Injection failed. Switching to secondary injection method.");
boolean success = inject(player);
if (success) {
Logger.info("Secondary injection method was successful.");
} else {
Logger.warning("Secondary injection method failed!");
}
return success;
} catch (Exception exception) {
exception.printStackTrace();
return false;
}
@@ -4,8 +4,8 @@ import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
import de.rayzs.pat.utils.StringUtils;
import org.bukkit.entity.Player;
import de.rayzs.pat.api.event.PATEventHandler;
@@ -13,7 +13,6 @@ import de.rayzs.pat.api.event.events.FilteredTabCompletionEvent;
import de.rayzs.pat.api.netty.bukkit.BukkitPacketAnalyzer;
import de.rayzs.pat.api.netty.bukkit.BukkitPacketHandler;
import de.rayzs.pat.api.storage.Storage;
import de.rayzs.pat.plugin.BukkitLoader;
import de.rayzs.pat.plugin.logger.Logger;
import de.rayzs.pat.utils.Reflection;
@@ -34,75 +33,78 @@ public class LegacyPacketHandler implements BukkitPacketHandler {
@Override
public boolean handleOutgoingPacket(Player player, Object packetObj) throws Exception {
String input = BukkitPacketAnalyzer.getPlayerInput(player);
final String rawInput = BukkitPacketAnalyzer.getPlayerInput(player);
if(input == null)
if(rawInput == null)
return false;
boolean cancelsBeforeHand;
int spaces = 0;
String input = rawInput;
boolean cancelsBeforeHand = false;
if (input.startsWith("/")) {
input = input.replace("/", "");
if (!input.startsWith("/")) {
return true;
}
if (input.contains(" ")) {
String[] split = input.split(" ");
spaces = split.length;
if (spaces > 0)
input = split[0];
}
input = input.substring(1);
cancelsBeforeHand = Storage.Blacklist.canPlayerAccessTab(player, input);
if (!cancelsBeforeHand)
cancelsBeforeHand = Storage.ConfigSections.Settings.CUSTOM_VERSION.isTabCompletable(input) || Storage.ConfigSections.Settings.CUSTOM_PLUGIN.isTabCompletable(input);
} else return true;
final boolean doesBypassNamespace = Storage.ConfigSections.Settings.BLOCK_NAMESPACE_COMMANDS.doesBypass(player);
final boolean spaces = input.contains(" ");
if (Storage.ConfigSections.Settings.BLOCK_NAMESPACE_COMMANDS.isCommand(input) && !doesBypassNamespace) {
cancelsBeforeHand = true;
}
if (!cancelsBeforeHand && !input.isEmpty()) {
cancelsBeforeHand = !Storage.Blacklist.canPlayerAccessTab(player, StringUtils.getFirstArg(input));
}
if (!cancelsBeforeHand) {
cancelsBeforeHand = Storage.ConfigSections.Settings.CUSTOM_PLUGIN.isTabCompletable(input) || Storage.ConfigSections.Settings.CUSTOM_VERSION.isTabCompletable(input);
}
for (Field field : Reflection.getFields(packetObj)) {
field.setAccessible(true);
Object result = field.get(packetObj);
if (!(result instanceof String[]))
if (!(result instanceof String[])) {
continue;
List<String> newResultList = new ArrayList<>();
String[] tR = (String[]) result;
String tempName;
boolean doesBypassNamespace = Storage.ConfigSections.Settings.BLOCK_NAMESPACE_COMMANDS.doesBypass(player);
if (spaces == 0) {
for (String s : tR) {
if (!BukkitLoader.isLoaded())
continue;
if (!s.startsWith("/")) {
newResultList.add(s);
continue;
}
tempName = s.replaceFirst("/", "");
if (!doesBypassNamespace && Storage.ConfigSections.Settings.BLOCK_NAMESPACE_COMMANDS.isCommand(tempName))
continue;
if (!Storage.Blacklist.canPlayerAccessTab(player, tempName))
newResultList.add(s);
}
} else {
if (!cancelsBeforeHand) {
FilteredTabCompletionEvent filteredTabCompletionEvent = PATEventHandler.callFilteredTabCompletionEvents(player.getUniqueId(), input, Arrays.asList(tR));
if (!filteredTabCompletionEvent.isCancelled()) {
List<String> suggestions = Arrays.stream(tR).filter(s -> filteredTabCompletionEvent.getCompletion().contains(s)).collect(Collectors.toList());
newResultList.addAll(suggestions);
}
}
}
field.set(packetObj, newResultList.toArray(new String[0]));
String[] tR = (String[]) result;
List<String> suggestions = new ArrayList<>(Arrays.asList(tR));
if (spaces) {
if (cancelsBeforeHand) {
suggestions.clear();
field.set(packetObj, suggestions.toArray(new String[0]));
return true;
}
FilteredTabCompletionEvent filteredTabCompletionEvent = PATEventHandler.callFilteredTabCompletionEvents(player.getUniqueId(), rawInput, new ArrayList<>(suggestions));
if (filteredTabCompletionEvent.isCancelled()) {
suggestions.clear();
} else {
suggestions.removeIf(s -> !filteredTabCompletionEvent.getCompletion().contains(s));
}
} else {
suggestions.removeIf(s -> {
String cpy = s;
if (cpy.startsWith("/")) {
cpy = cpy.substring(1);
}
if (Storage.ConfigSections.Settings.CUSTOM_PLUGIN.isTabCompletable(cpy) || Storage.ConfigSections.Settings.CUSTOM_VERSION.isTabCompletable(cpy)) {
return false;
}
return !Storage.Blacklist.canPlayerAccessTab(player, cpy);
});
}
field.set(packetObj, suggestions.toArray(new String[0]));
}
return true;
@@ -47,9 +47,13 @@ public class BungeePacketAnalyzer {
private static Class<?> channelWrapperClass, serverConnectionClass;
private static final List<String> PROXY_COMMANDS;
private static List<String> PROXY_COMMANDS;
static {
loadProxyCommands();
}
public static void loadProxyCommands() {
PROXY_COMMANDS = ProxyServer.getInstance().getPluginManager().getCommands().stream().map(entry -> {
String key = entry.getKey();
return key.startsWith("/") ? key.substring(1) : key;
@@ -146,7 +150,7 @@ public class BungeePacketAnalyzer {
CommandsCache commandsCache = cache.get(serverName);
List<String> commandsAsString = new ArrayList<String>(PROXY_COMMANDS);
List<String> commandsAsString = new ArrayList<>(PROXY_COMMANDS);
commandsAsString.addAll(helper.getChildrenNames());
commandsCache.handleCommands(commandsAsString, serverName);
@@ -163,14 +167,16 @@ public class BungeePacketAnalyzer {
if (commands.getRoot().getChild(command.getKey()) != null)
continue;
if (!command.getValue().hasPermission(player))
if (!command.getValue().hasPermission(player)) {
continue;
}
String commandName = command.getKey();
commandName = commandName.startsWith("/") ? commandName.substring(1) : commandName;
if (!playerCommands.contains(commandName))
if (!playerCommands.contains(commandName)) {
continue;
}
CommandNode dummy = createDummyCommandNode(command.getKey());
commands.getRoot().addChild(dummy);
@@ -4,6 +4,7 @@ import java.util.*;
import java.util.concurrent.TimeUnit;
import de.rayzs.pat.api.communication.Communicator;
import de.rayzs.pat.api.storage.config.settings.*;
import de.rayzs.pat.plugin.listeners.bukkit.BukkitAntiTabListener;
import de.rayzs.pat.plugin.logger.Logger;
import de.rayzs.pat.plugin.modules.SubArgsModule;
@@ -28,19 +29,6 @@ import de.rayzs.pat.api.storage.config.messages.ReloadSection;
import de.rayzs.pat.api.storage.config.messages.ServerListSection;
import de.rayzs.pat.api.storage.config.messages.StatsSection;
import de.rayzs.pat.api.storage.config.messages.UpdatePermissionsSection;
import de.rayzs.pat.api.storage.config.settings.AutoLowercaseCommandsSection;
import de.rayzs.pat.api.storage.config.settings.BlockNamespaceCommandsSection;
import de.rayzs.pat.api.storage.config.settings.CancelCommandSection;
import de.rayzs.pat.api.storage.config.settings.CustomBrandSection;
import de.rayzs.pat.api.storage.config.settings.CustomPluginsSection;
import de.rayzs.pat.api.storage.config.settings.CustomProtocolPingSection;
import de.rayzs.pat.api.storage.config.settings.CustomUnknownCommandSection;
import de.rayzs.pat.api.storage.config.settings.CustomVersionSection;
import de.rayzs.pat.api.storage.config.settings.DisableSyncSection;
import de.rayzs.pat.api.storage.config.settings.HandleThroughProxySection;
import de.rayzs.pat.api.storage.config.settings.PatchExploitSection;
import de.rayzs.pat.api.storage.config.settings.TurnBlacklistToWhitelistSection;
import de.rayzs.pat.api.storage.config.settings.UpdateSection;
import de.rayzs.pat.api.storage.placeholders.commands.general.ListCommandsPlaceholder;
import de.rayzs.pat.api.storage.placeholders.commands.general.ListReversedCommandsPlaceholder;
import de.rayzs.pat.api.storage.placeholders.commands.general.ListSizeCommandsPlaceholder;
@@ -82,7 +70,7 @@ public class Storage {
public static String TOKEN = "", SERVER_NAME = null, CURRENT_VERSION = "", NEWER_VERSION = "";
public static boolean OUTDATED = false, SEND_CONSOLE_NOTIFICATION = true;
public static Object PLUGIN_OBJECT;
public static boolean USE_LUCKPERMS = false, USE_PLACEHOLDERAPI = false, USE_PAPIPROXYBRIDGE = false, USE_VIAVERSION = false, USE_VELOCITY = false, USE_SIMPLECLOUD;
public static boolean USE_LUCKPERMS = false, USE_GROUPMANAGER = false, USE_PLACEHOLDERAPI = false, USE_PAPIPROXYBRIDGE = false, USE_VIAVERSION = false, USE_VELOCITY = false, USE_SIMPLECLOUD;
public static long LAST_SYNC = System.currentTimeMillis();
public static void initialize(PluginLoader loader, String currentVersion) {
@@ -229,7 +217,17 @@ public class Storage {
PermissionUtil.reloadPermissions();
if (Reflection.getMinor() >= 13) {
if (Reflection.getMinor() < 13) {
final List<UUID> playerIds = Storage.getLoader().getPlayerIds();
final List<String> commands = new ArrayList<>(Blacklist.BLACKLIST.getCommands());
playerIds.forEach(playerId -> {
List<String> playerCommands = new ArrayList<>(commands);
playerCommands.addAll(SubArgsModule.getGroupCommands(playerId));
PATEventHandler.callUpdatePlayerCommandsEvents(playerId, playerCommands, true);
});
} else {
BukkitAntiTabListener.handleTabCompletion();
}
}
@@ -302,6 +300,8 @@ public class Storage {
public static CustomProtocolPingSection CUSTOM_PROTOCOL_PING = new CustomProtocolPingSection();
public static CustomUnknownCommandSection CUSTOM_UNKNOWN_COMMAND = new CustomUnknownCommandSection();
public static TurnBlacklistToWhitelistSection TURN_BLACKLIST_TO_WHITELIST = new TurnBlacklistToWhitelistSection();
public static BaseCommandCaseSensitiveSection BASE_COMMAND_CASE_SENSITIVE = new BaseCommandCaseSensitiveSection();
public static UpdateCommandsPerWorldSection UPDATE_COMMANDS_PER_WORLD = new UpdateCommandsPerWorldSection();
public static UpdateSection UPDATE = new UpdateSection();
public static void initialize() {}
@@ -0,0 +1,22 @@
package de.rayzs.pat.api.storage.config.settings;
import de.rayzs.pat.api.storage.storages.ConfigStorage;
import de.rayzs.pat.utils.configuration.helper.ConfigSectionHelper;
import de.rayzs.pat.utils.configuration.helper.MultipleMessagesHelper;
import java.util.Collections;
public class BaseCommandCaseSensitiveSection extends ConfigStorage {
public boolean ENABLED;
public BaseCommandCaseSensitiveSection() {
super("base-command-case-sensitive");
}
@Override
public void load() {
super.load();
ENABLED = new ConfigSectionHelper<Boolean>(this, null, true).getOrSet();
}
}
@@ -0,0 +1,24 @@
package de.rayzs.pat.api.storage.config.settings;
import de.rayzs.pat.api.storage.storages.ConfigStorage;
import de.rayzs.pat.utils.Reflection;
import de.rayzs.pat.utils.configuration.helper.ConfigSectionHelper;
public class UpdateCommandsPerWorldSection extends ConfigStorage {
public boolean ENABLED;
public UpdateCommandsPerWorldSection() {
super("update-commands-per-world");
}
@Override
public void load() {
super.load();
if (Reflection.isProxyServer())
return;
ENABLED = new ConfigSectionHelper<Boolean>(this, null, false).getOrSet();
}
}
@@ -21,6 +21,8 @@ public class BlacklistStorage extends StorageTemplate implements Serializable {
}
public boolean isListed(String command, boolean ignoreColons) {
final boolean caseSensitive = Storage.ConfigSections.Settings.BASE_COMMAND_CASE_SENSITIVE.ENABLED;
if (commands == null || command.isEmpty()) {
return false;
}
@@ -40,8 +42,15 @@ public class BlacklistStorage extends StorageTemplate implements Serializable {
command = command.substring(command.indexOf(':'));
}
if (StringUtils.getFirstArg(listedCommand).equalsIgnoreCase(StringUtils.getFirstArg(command)))
return true;
if (caseSensitive) {
if (StringUtils.getFirstArg(listedCommand).equals(StringUtils.getFirstArg(command))) {
return true;
}
} else {
if (StringUtils.getFirstArg(listedCommand).equalsIgnoreCase(StringUtils.getFirstArg(command))) {
return true;
}
}
}
return false;
@@ -5,6 +5,7 @@ import de.rayzs.pat.plugin.modules.SubArgsModule;
import de.rayzs.pat.plugin.process.CommandProcess;
import de.rayzs.pat.api.netty.bukkit.BukkitPacketAnalyzer;
import de.rayzs.pat.api.communication.BackendUpdater;
import de.rayzs.pat.utils.adapter.GroupManagerAdapter;
import de.rayzs.pat.utils.configuration.Configurator;
import de.rayzs.pat.utils.configuration.updater.ConfigUpdater;
import de.rayzs.pat.utils.group.TinyGroup;
@@ -22,6 +23,7 @@ import de.rayzs.pat.plugin.metrics.bStats;
import de.rayzs.pat.plugin.logger.Logger;
import de.rayzs.pat.utils.response.action.ActionHandler;
import org.bukkit.OfflinePlayer;
import org.bukkit.entity.Entity;
import org.bukkit.plugin.java.JavaPlugin;
import de.rayzs.pat.api.storage.Storage;
import de.rayzs.pat.utils.scheduler.*;
@@ -32,10 +34,13 @@ import org.bukkit.command.*;
import org.bukkit.plugin.*;
import org.bukkit.Bukkit;
import java.util.*;
import java.util.stream.Collectors;
public class BukkitLoader extends JavaPlugin implements PluginLoader {
private static List<String> commands = new ArrayList<>(), allowedCommands = new ArrayList<>();
private static List<String> commands = new ArrayList<>(),
allowedCommands = new ArrayList<>(),
disallowedCommands = new ArrayList<>();
private static Plugin plugin;
private static java.util.logging.Logger logger;
@@ -89,7 +94,7 @@ public class BukkitLoader extends JavaPlugin implements PluginLoader {
BukkitPacketAnalyzer.injectAll();
} else BackendUpdater.handle();
manager.registerEvents(new BukkitPlayerConnectionListener(), this);
manager.registerEvents(new BukkitPlayerListener(), this);
manager.registerEvents(new BukkitBlockCommandListener(), this);
if (Reflection.getMinor() >= 13) {
@@ -110,6 +115,12 @@ public class BukkitLoader extends JavaPlugin implements PluginLoader {
Bukkit.getOnlinePlayers().forEach(player -> PermissionUtil.setPlayerPermissions(player.getUniqueId()));
}
final Plugin groupManagerPlugin = getServer().getPluginManager().getPlugin("GroupManager");
if (groupManagerPlugin != null) {
GroupManagerAdapter.initialize(groupManagerPlugin);
Bukkit.getOnlinePlayers().forEach(player -> PermissionUtil.setPlayerPermissions(player.getUniqueId()));
}
if (getServer().getPluginManager().getPlugin("ViaVersion") != null)
ViaVersionAdapter.initialize();
@@ -185,7 +196,7 @@ public class BukkitLoader extends JavaPlugin implements PluginLoader {
@Override
public boolean doesPlayerExist(String playerName) {
return ArrayUtils.containsIgnoreCase(getPlayerNames(), playerName);
return isPlayerOnline(playerName) || ArrayUtils.containsIgnoreCase(getPlayerNames(), playerName);
}
@Override
@@ -205,7 +216,7 @@ public class BukkitLoader extends JavaPlugin implements PluginLoader {
@Override
public List<UUID> getPlayerIds() {
return null;
return Bukkit.getOnlinePlayers().stream().map(Entity::getUniqueId).collect(Collectors.toList());
}
@Override
@@ -244,6 +255,14 @@ public class BukkitLoader extends JavaPlugin implements PluginLoader {
return List.of();
}
public static void delayedPermissionsReload() {
PATScheduler.createScheduler(PermissionUtil::reloadPermissions, 40);
}
public static void userPermissionsReload(UUID uuid) {
Bukkit.getServer().getScheduler().scheduleSyncDelayedTask(BukkitLoader.getPlugin(), () -> PermissionUtil.reloadPermissions(uuid));
}
public void startUpdaterTask() {
if (!Storage.ConfigSections.Settings.UPDATE.ENABLED)
return;
@@ -333,6 +352,10 @@ public class BukkitLoader extends JavaPlugin implements PluginLoader {
return new ArrayList<>(allowedCommands);
}
public static List<String> getDisallowedCommands() {
return disallowedCommands;
}
@Override
public List<String> getPluginNames() {
List<String> pluginNames = new ArrayList<>();
@@ -411,6 +434,7 @@ public class BukkitLoader extends JavaPlugin implements PluginLoader {
BukkitLoader.commands = result;
BukkitLoader.allowedCommands = allowedCommands;
BukkitLoader.disallowedCommands = commands.stream().filter(command -> !allowedCommands.contains(command)).toList();
}
public static boolean useSuggestions() {
@@ -97,6 +97,11 @@ public class BungeeLoader extends Plugin implements PluginLoader {
ConfigUpdater.broadcastMissingParts();
ActionHandler.initialize();
SubArgsModule.initialize();
// Reload proxy commands after 1, 5, and 15 seconds.
for (int i : new Integer[] { 1, 5, 15 }) {
ProxyServer.getInstance().getScheduler().schedule(this, BungeePacketAnalyzer::loadProxyCommands, i, TimeUnit.SECONDS);
}
}
@Override
@@ -113,7 +118,9 @@ public class BungeeLoader extends Plugin implements PluginLoader {
}
@Override
public void handleReload() {}
public void handleReload() {
BungeePacketAnalyzer.loadProxyCommands();
}
@Override
public boolean doesCommandExist(String command) {
@@ -21,7 +21,6 @@ import de.rayzs.pat.utils.adapter.LuckPermsAdapter;
import com.velocitypowered.api.proxy.ProxyServer;
import de.rayzs.pat.plugin.listeners.velocity.*;
import de.rayzs.pat.utils.group.GroupManager;
import de.rayzs.pat.utils.ConnectionBuilder;
import de.rayzs.pat.utils.VersionComparer;
import de.rayzs.pat.plugin.logger.Logger;
import com.velocitypowered.api.plugin.*;
@@ -38,7 +37,7 @@ import java.util.*;
@Plugin(name = "ProAntiTab",
id = "proantitab",
version = "2.0.15",
version = "2.0.19",
authors = "Rayzs_YT",
description = "Hide more than just your plugins. Hide almost everything!",
url = "https://www.rayzs.de/products/proantitab/page",
@@ -69,14 +69,6 @@ public class BukkitAntiTabListener implements Listener {
// --------------- LUCKPERMS SECTIONS --------------- //
public static void luckpermsNetworkSync() {
Bukkit.getServer().getScheduler().scheduleSyncDelayedTask(BukkitLoader.getPlugin(), PermissionUtil::reloadPermissions, 40);
}
public static void luckpermsNetworkUserSync(UUID uuid) {
Bukkit.getServer().getScheduler().scheduleSyncDelayedTask(BukkitLoader.getPlugin(), () -> PermissionUtil.reloadPermissions(uuid));
}
public static void updateCommands() {
Bukkit.getOnlinePlayers().forEach(BukkitAntiTabListener::updateCommands);
}
@@ -74,7 +74,7 @@ public class BukkitBlockCommandListener implements Listener {
command = StringUtils.getFirstArg(command);
final String displayName = StringUtils.replaceTriggers(command, "", "\\", "<", ">", "&");
command = command.toLowerCase();
//command = command.toLowerCase();
List<String> notificationMessage = MessageTranslator.replaceMessageList(
Storage.ConfigSections.Messages.NOTIFICATION.ALERT,
@@ -1,84 +1,113 @@
package de.rayzs.pat.plugin.listeners.bukkit;
import de.rayzs.pat.api.brand.CustomServerBrand;
import de.rayzs.pat.api.event.PATEventHandler;
import de.rayzs.pat.api.event.events.ServerPlayersChangeEvent;
import de.rayzs.pat.api.netty.bukkit.BukkitPacketAnalyzer;
import de.rayzs.pat.api.communication.BackendUpdater;
import de.rayzs.pat.plugin.logger.Logger;
import de.rayzs.pat.utils.message.MessageTranslator;
import de.rayzs.pat.utils.permission.PermissionUtil;
import de.rayzs.pat.api.storage.Storage;
import de.rayzs.pat.utils.scheduler.PATScheduler;
import de.rayzs.pat.utils.sender.CommandSender;
import de.rayzs.pat.utils.sender.CommandSenderHandler;
import org.bukkit.event.player.*;
import org.bukkit.entity.Player;
import org.bukkit.event.*;
public class BukkitPlayerConnectionListener implements Listener {
@EventHandler
public void onPlayerJoin(PlayerJoinEvent event) {
Player player = event.getPlayer();
PATEventHandler.callServerPlayersChangeEvents(player, ServerPlayersChangeEvent.Type.JOINED);
if (Storage.ConfigSections.Settings.HANDLE_THROUGH_PROXY.ENABLED)
BackendUpdater.handle();
PermissionUtil.setPlayerPermissions(player.getUniqueId());
CustomServerBrand.preparePlayer(player);
if (CustomServerBrand.isEnabled())
CustomServerBrand.sendBrandToPlayer(player);
if (!Storage.USE_LUCKPERMS && !Storage.ConfigSections.Settings.HANDLE_THROUGH_PROXY.ENABLED) {
PATScheduler.createScheduler(() -> {
CommandSender sender = CommandSenderHandler.from(player);
assert sender != null;
PermissionUtil.reloadPermissions(sender);
BukkitAntiTabListener.handleTabCompletion(player.getUniqueId());
}, 20);
}
if (!BukkitPacketAnalyzer.inject(player)) {
PATScheduler.createScheduler(() -> {
if (player.isOnline()) {
if (!BukkitPacketAnalyzer.inject(player)) {
Logger.warning("Failed to inject into player! (" + player.getName() + ")" );
player.kickPlayer("Failed to inject player!");
}
}
}, 10);
}
if(Storage.OUTDATED && PermissionUtil.hasPermission(player, "joinupdate")) {
PATScheduler.createScheduler(() -> {
if (player.isOnline()) {
MessageTranslator.send(player, Storage.ConfigSections.Settings.UPDATE.OUTDATED.getLines());
}
}, 20);
}
}
@EventHandler (priority = EventPriority.LOWEST)
public void onPlayerQuit(PlayerQuitEvent event) {
Player player = event.getPlayer();
PATEventHandler.callServerPlayersChangeEvents(player, ServerPlayersChangeEvent.Type.LEFT);
BukkitPacketAnalyzer.uninject(player.getUniqueId());
PermissionUtil.resetPermissions(player.getUniqueId());
if(Storage.ConfigSections.Settings.CUSTOM_BRAND.REPEAT_DELAY != -1) return;
}
@EventHandler (priority = EventPriority.LOWEST)
public void onPlayerChangedWorld(PlayerChangedWorldEvent event) {
Player player = event.getPlayer();
if(Storage.ConfigSections.Settings.CUSTOM_BRAND.REPEAT_DELAY != -1) return;
CustomServerBrand.sendBrandToPlayer(player);
}
}
package de.rayzs.pat.plugin.listeners.bukkit;
import de.rayzs.pat.api.brand.CustomServerBrand;
import de.rayzs.pat.api.event.PATEventHandler;
import de.rayzs.pat.api.event.events.ServerPlayersChangeEvent;
import de.rayzs.pat.api.netty.bukkit.BukkitPacketAnalyzer;
import de.rayzs.pat.api.communication.BackendUpdater;
import de.rayzs.pat.plugin.logger.Logger;
import de.rayzs.pat.plugin.modules.SubArgsModule;
import de.rayzs.pat.utils.Reflection;
import de.rayzs.pat.utils.message.MessageTranslator;
import de.rayzs.pat.utils.permission.PermissionUtil;
import de.rayzs.pat.api.storage.Storage;
import de.rayzs.pat.utils.scheduler.PATScheduler;
import de.rayzs.pat.utils.sender.CommandSender;
import de.rayzs.pat.utils.sender.CommandSenderHandler;
import org.bukkit.event.player.*;
import org.bukkit.entity.Player;
import org.bukkit.event.*;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
public class BukkitPlayerListener implements Listener {
@EventHandler
public void onPlayerJoin(PlayerJoinEvent event) {
final Player player = event.getPlayer();
final UUID uuid = player.getUniqueId();
PATEventHandler.callServerPlayersChangeEvents(player, ServerPlayersChangeEvent.Type.JOINED);
if (Storage.ConfigSections.Settings.HANDLE_THROUGH_PROXY.ENABLED) {
BackendUpdater.handle();
}
PermissionUtil.setPlayerPermissions(player.getUniqueId());
CustomServerBrand.preparePlayer(player);
if (CustomServerBrand.isEnabled()) {
CustomServerBrand.sendBrandToPlayer(player);
}
if (!Storage.USE_LUCKPERMS && !Storage.ConfigSections.Settings.HANDLE_THROUGH_PROXY.ENABLED) {
PATScheduler.createScheduler(() -> {
CommandSender sender = CommandSenderHandler.from(player);
assert sender != null;
PermissionUtil.reloadPermissions(sender);
if (Reflection.getMinor() >= 13) {
BukkitAntiTabListener.handleTabCompletion(player.getUniqueId());
}
}, 20);
}
if (!BukkitPacketAnalyzer.inject(player)) {
PATScheduler.createScheduler(() -> {
if (player.isOnline()) {
if (!BukkitPacketAnalyzer.inject(player)) {
Logger.warning("Failed to inject into player! (" + player.getName() + ")" );
player.kickPlayer("Failed to inject player!");
}
}
}, 10);
}
if (Reflection.getMinor() < 13) {
List<String> playerCommands = new ArrayList<>(SubArgsModule.getServerCommands(uuid));
playerCommands.addAll(SubArgsModule.getGroupCommands(uuid));
PATEventHandler.callUpdatePlayerCommandsEvents(uuid, playerCommands, false);
}
if (Storage.OUTDATED && PermissionUtil.hasPermission(player, "joinupdate")) {
PATScheduler.createScheduler(() -> {
if (player.isOnline()) {
MessageTranslator.send(player, Storage.ConfigSections.Settings.UPDATE.OUTDATED.getLines());
}
}, 20);
}
}
@EventHandler (priority = EventPriority.LOWEST)
public void onPlayerQuit(PlayerQuitEvent event) {
Player player = event.getPlayer();
PATEventHandler.callServerPlayersChangeEvents(player, ServerPlayersChangeEvent.Type.LEFT);
BukkitPacketAnalyzer.uninject(player.getUniqueId());
PermissionUtil.resetPermissions(player.getUniqueId());
}
@EventHandler (priority = EventPriority.LOWEST)
public void onPlayerChangedWorld(PlayerChangedWorldEvent event) {
Player player = event.getPlayer();
if (Storage.ConfigSections.Settings.CUSTOM_BRAND.REPEAT_DELAY == -1) {
CustomServerBrand.sendBrandToPlayer(player);
}
if (Storage.ConfigSections.Settings.UPDATE_COMMANDS_PER_WORLD.ENABLED) {
CommandSender sender = CommandSenderHandler.from(player);
assert sender != null;
PermissionUtil.reloadPermissions(sender);
if (Reflection.getMinor() >= 13) {
BukkitAntiTabListener.handleTabCompletion(player);
}
}
}
}
@@ -38,7 +38,7 @@ public class BungeeBlockCommandListener implements Listener {
final String displayCommand = StringUtils.replaceTriggers(command, "", "\\", "<", ">", "&");
command = command.toLowerCase();
//command = command.toLowerCase();
List<String> notificationMessage = MessageTranslator.replaceMessageList(
Storage.ConfigSections.Messages.NOTIFICATION.ALERT,
@@ -43,46 +43,56 @@ public class VelocityAntiTabListener {
@Subscribe (order = PostOrder.LAST)
public void onPlayerAvailableCommands(PlayerAvailableCommandsEvent event) {
Player player = event.getPlayer();
try {
Player player = event.getPlayer();
if(event.getRootNode().getChildren().isEmpty() || !player.getCurrentServer().isPresent())
return;
if (event.getRootNode().getChildren().isEmpty() || !player.getCurrentServer().isPresent()) {
return;
}
String serverName = player.getCurrentServer().get().getServer().getServerInfo().getName();
String serverName = player.getCurrentServer().get().getServer().getServerInfo().getName();
Map<String, CommandsCache> cache = Storage.getLoader().getCommandsCacheMap();
Map<String, CommandsCache> cache = Storage.getLoader().getCommandsCacheMap();
if(!cache.containsKey(serverName))
cache.put(serverName, new CommandsCache());
if (!cache.containsKey(serverName)) {
cache.put(serverName, new CommandsCache());
}
CommandsCache commandsCache = cache.get(serverName);
CommandsCache commandsCache = cache.get(serverName);
List<String> commandsAsString = new ArrayList<>();
event.getRootNode().getChildren().stream().filter(command -> command != null && command.getName() != null).forEach(command -> commandsAsString.add(command.getName()));
commandsCache.handleCommands(commandsAsString, serverName);
List<String> commandsAsString = new ArrayList<>();
event.getRootNode().getChildren().stream().filter(command -> command != null && command.getName() != null).forEach(command -> commandsAsString.add(command.getName()));
commandsCache.handleCommands(commandsAsString, serverName);
if (PermissionUtil.hasBypassPermission(player))
return;
if (PermissionUtil.hasBypassPermission(player)) {
return;
}
final boolean newer = player.getProtocolVersion().getProtocol() > 340, argsChildrenExist = event.getRootNode().getChild("args") != null;
final List<String> playerCommands = commandsCache.getPlayerCommands(commandsAsString, player, player.getUniqueId(), serverName);
final boolean newer = player.getProtocolVersion().getProtocol() > 340, argsChildrenExist = event.getRootNode().getChild("args") != null;
final List<String> playerCommands = commandsCache.getPlayerCommands(commandsAsString, player, player.getUniqueId(), serverName);
if (event.getRootNode().getChildren().size() == 1
&& newer && argsChildrenExist
&& event.getRootNode().getChild("args").getChildren().isEmpty()) {
return;
if (event.getRootNode().getChildren().size() == 1
&& newer && argsChildrenExist
&& event.getRootNode().getChild("args").getChildren().isEmpty()) {
return;
}
if (event.getRootNode().getChildren().size() == 1 && newer && argsChildrenExist) {
return;
}
event.getRootNode().getChildren().removeIf(command -> {
if (command == null || command.getName() == null)
return true;
if (command.getName().equals("args"))
return false;
return !playerCommands.contains(command.getName());
});
} catch (Exception exception) {
System.out.println("An error occurred while processing commands in PAT: " + exception.getMessage());
exception.printStackTrace();
}
if(event.getRootNode().getChildren().size() == 1 && newer && argsChildrenExist) return;
event.getRootNode().getChildren().removeIf(command -> {
if (command == null || command.getName() == null)
return true;
if (command.getName().equals("args"))
return false;
return !playerCommands.contains(command.getName());
});
}
}
@@ -47,7 +47,7 @@ public class VelocityBlockCommandListener {
final String displayCommand = StringUtils.replaceTriggers(command, "", "\\", "<", ">", "&");
command = command.toLowerCase();
//command = command.toLowerCase();
List<String> notificationMessage = MessageTranslator.replaceMessageList(
@@ -89,7 +89,15 @@ public class Logger {
.append(Storage.ConfigSections.Settings.TURN_BLACKLIST_TO_WHITELIST.ENABLED ? "WHITELIST" : "BLACKLIST")
.append("\n");
builder.append("Installed: \n ")
builder.append("Detected Software-API: ")
.append(Reflection.isProxyServer()
? Reflection.isPaper() ? "Waterfall" :
Reflection.isVelocityServer() ? "Velocity" : "Bungeecord"
: Reflection.isFoliaServer() ? "Folia"
: Reflection.isPaper() ? "Paper" : "Spigot")
.append("\n");
builder.append("Installed plugins: \n ")
.append(String.join("\n ", Storage.getLoader().getPluginNames()))
.append("\n\n");
@@ -9,6 +9,7 @@ import de.rayzs.pat.plugin.process.impl.local.modify.list.ListPrioritiesCommand;
import de.rayzs.pat.plugin.process.impl.local.system.NotifyCommand;
import de.rayzs.pat.plugin.process.impl.local.system.PostDebugCommand;
import de.rayzs.pat.plugin.process.impl.local.system.ReloadCommand;
import de.rayzs.pat.plugin.process.impl.local.system.UpdateCommand;
import de.rayzs.pat.plugin.process.impl.server.ServAddCommand;
import de.rayzs.pat.plugin.process.impl.server.ServClearCommand;
import de.rayzs.pat.plugin.process.impl.server.ServRemoveCommand;
@@ -107,7 +107,7 @@ public class AddCommand extends ProCommand {
if (Reflection.isProxyServer())
return null;
return BukkitLoader.getAllowedCommands();
return BukkitLoader.getDisallowedCommands();
}
String fullString = String.join(" ", args);
@@ -26,6 +26,7 @@ public class ReloadCommand extends ProCommand {
boolean backend = Storage.ConfigSections.Settings.HANDLE_THROUGH_PROXY.ENABLED && !proxy;
sender.sendMessage(Storage.ConfigSections.Messages.RELOAD.LOADING);
ConfigUpdater.initialize();
Storage.loadAll(Reflection.isProxyServer() || !backend);
CustomServerBrand.initialize();
@@ -37,13 +38,12 @@ public class ReloadCommand extends ProCommand {
BackendUpdater.start();
}
ConfigUpdater.broadcastMissingParts();
if (!backend) {
Storage.handleChange();
}
ConfigUpdater.initialize();
ConfigUpdater.broadcastMissingParts();
Storage.getLoader().handleReload();
sender.sendMessage(Storage.ConfigSections.Messages.RELOAD.DONE);
@@ -1,4 +1,4 @@
package de.rayzs.pat.plugin.process.impl.local.info;
package de.rayzs.pat.plugin.process.impl.local.system;
import de.rayzs.pat.plugin.listeners.bukkit.BukkitAntiTabListener;
import de.rayzs.pat.utils.Reflection;
@@ -35,7 +35,7 @@ public class UpdateCommand extends ProCommand {
}
});
if (!Reflection.isProxyServer()) {
if (!Reflection.isProxyServer() && Reflection.getMinor() >= 13) {
BukkitAntiTabListener.handleTabCompletion();
}
@@ -64,7 +64,7 @@ public class UpdateCommand extends ProCommand {
PermissionUtil.reloadPermissions(targetSender);
if (!Reflection.isProxyServer()) {
if (!Reflection.isProxyServer() && Reflection.getMinor() >= 13) {
BukkitAntiTabListener.handleTabCompletion(uuid);
}
@@ -4,6 +4,7 @@ import java.util.*;
import de.rayzs.pat.api.event.PATEventHandler;
import de.rayzs.pat.api.storage.Storage;
import de.rayzs.pat.plugin.logger.Logger;
public class CommandsCache {
@@ -72,11 +73,23 @@ public class CommandsCache {
public List<String> getPlayerCommands(Collection<String> unfilteredCommands, Object targetObj, UUID uuid, String serverName) {
List<String> playerCommands = new LinkedList<>(unfilteredCommands);
List<String> localFilteredCommands = filteredCommands == null ? null : new LinkedList<>(filteredCommands);
List<String> localFilteredCommands = filteredCommands == null ? null : new LinkedList<>();
if (localFilteredCommands == null)
return playerCommands;
final int max = filteredCommands.size();
for (int i = 0; i < max; i++) {
try {
String command = filteredCommands.get(i);
filteredCommands.add(command);
} catch (ArrayIndexOutOfBoundsException outOfBoundsException) {
System.out.println("Array is out of bounds " + i + "/" + max + "! " + outOfBoundsException.getMessage());
break;
}
}
boolean hasNamespaceBypass = Storage.ConfigSections.Settings.BLOCK_NAMESPACE_COMMANDS.doesBypass(targetObj);
@@ -25,10 +25,10 @@ public class Reflection {
proxy = false;
} catch (Throwable ignored) { proxy = true; }
if(!proxy) {
if (!proxy) {
try {
Class.forName("com.destroystokyo.paper.proxy.VelocityProxy");
folia = versionName.toLowerCase().contains("folia");
Class.forName("io.papermc.paper.threadedregions.RegionizedServer");
folia = true;
} catch (Throwable throwable) {
folia = false;
}
@@ -46,7 +46,7 @@ public class Reflection {
}
}
if(proxy) {
if (proxy) {
try {
Class.forName("com.velocitypowered.api.proxy.ProxyServer");
velocity = true;
@@ -58,6 +58,10 @@ public class Reflection {
oldChannelMethod = folia || paper && Reflection.isWeird();
}
public static void toggleInjectionMethod() {
oldChannelMethod = !oldChannelMethod;
}
public static String getVersionPackageName() {return versionPackageName;}
public static int[] getAges() { return new int[]{major, minor, release}; }
@@ -0,0 +1,77 @@
package de.rayzs.pat.utils.adapter;
import de.rayzs.pat.api.storage.Storage;
import de.rayzs.pat.plugin.BukkitLoader;
import de.rayzs.pat.plugin.listeners.bukkit.BukkitAntiTabListener;
import de.rayzs.pat.utils.Reflection;
import de.rayzs.pat.utils.permission.PermissionUtil;
import de.rayzs.pat.utils.scheduler.PATScheduler;
import org.anjocaido.groupmanager.GroupManager;
import org.anjocaido.groupmanager.events.GMGroupEvent;
import org.anjocaido.groupmanager.events.GMSystemEvent;
import org.anjocaido.groupmanager.events.GMUserEvent;
import org.anjocaido.groupmanager.permissions.AnjoPermissionsHandler;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.plugin.Plugin;
import java.util.UUID;
public class GroupManagerAdapter implements Listener {
private static GroupManager manager;
public static void initialize(Plugin plugin) {
manager = (GroupManager) plugin;
Storage.USE_GROUPMANAGER = true;
Bukkit.getServer().getPluginManager().registerEvents(new GroupManagerListener(), BukkitLoader.getPlugin());
}
public static void setPermissions(UUID uuid) {
final Player player = Bukkit.getPlayer(uuid);
if (player == null) {
return;
}
final AnjoPermissionsHandler handler = manager.getWorldsHolder().getWorldPermissions(player);
handler.getAllPlayersPermissions(player.getName()).stream()
.filter(permission -> permission.startsWith("proantitab."))
.forEach(permission -> PermissionUtil.setPermission(uuid, permission, true));
if (Reflection.getMinor() >= 13) {
BukkitAntiTabListener.handleTabCompletion(uuid);
}
}
private static class GroupManagerListener implements Listener {
@EventHandler
public void onGMUser(GMUserEvent event) {
PATScheduler.createScheduler(() -> {
BukkitLoader.userPermissionsReload(event.getUser().getBukkitPlayer().getUniqueId());
}, 10);
}
@EventHandler
public void onGMGroup(GMGroupEvent event) {
PATScheduler.createScheduler(() -> {
Bukkit.getOnlinePlayers().forEach(player -> {
BukkitLoader.userPermissionsReload(player.getUniqueId());
});
}, 10);
}
@EventHandler
public void onGMSystem(GMSystemEvent event) {
PATScheduler.createScheduler(() -> {
Bukkit.getOnlinePlayers().forEach(player -> {
BukkitLoader.userPermissionsReload(player.getUniqueId());
});
}, 10);
}
}
}
@@ -29,9 +29,7 @@ public class LuckPermsAdapter {
eventBus.subscribe(Storage.PLUGIN_OBJECT, NodeMutateEvent.class, LuckPermsAdapter::onNoteMutate);
if (!Reflection.isProxyServer()) {
if (BukkitLoader.useSuggestions())
eventBus.subscribe(Storage.PLUGIN_OBJECT, PreNetworkSyncEvent.class, event -> BukkitAntiTabListener.luckpermsNetworkSync());
eventBus.subscribe(Storage.PLUGIN_OBJECT, PreNetworkSyncEvent.class, event -> BukkitLoader.delayedPermissionsReload());
} else {
@@ -107,10 +105,7 @@ public class LuckPermsAdapter {
UUID uuid = user.getUniqueId();
if (!Reflection.isProxyServer()) {
if (Reflection.getMinor() >= 13)
BukkitAntiTabListener.luckpermsNetworkUserSync(user.getUniqueId());
BukkitLoader.userPermissionsReload(user.getUniqueId());
return;
}
@@ -83,7 +83,7 @@ public class BukkitConfigurationBuilder implements ConfigurationBuilder {
if (fileName.equals("config")) {
if (!ConfigUpdater.shouldAutoUpdate()) {
ConfigUpdater.addMissingPart(path + "." + target);
ConfigUpdater.addMissingPart((!path.isBlank() ? path + "." : "") + target);
return object;
}
@@ -90,7 +90,7 @@ public class ProxyConfigurationBuilder implements ConfigurationBuilder {
if (fileName.equals("config")) {
if (!ConfigUpdater.shouldAutoUpdate()) {
ConfigUpdater.addMissingPart(path + "." + target);
ConfigUpdater.addMissingPart((!path.isBlank() ? path + "." : "") + target);
return object;
}
@@ -13,8 +13,7 @@ import java.util.*;
public class ConfigUpdater {
private static List<String> NEWEST_CONFIG_INPUT = new ArrayList<>(),
MISSING_PARTS = new ArrayList<>();
private static final List<String> MISSING_PARTS = new ArrayList<>();
private static boolean LOADED = false, AUTO_UPDATE = false, ANNOUNCE = false;
@@ -22,19 +21,19 @@ public class ConfigUpdater {
HOW_TO_READ_FILE_NAME = "How-To-Read.txt";
public static void initialize() {
try {
MISSING_PARTS.clear();
LOADED = false;
MISSING_PARTS.clear();
try {
ConfigurationBuilder config = Configurator.get("config");
ANNOUNCE = (boolean) config.getOrSet("updater.announce-missing-parts", true);
AUTO_UPDATE = (boolean) config.getOrSet("updater.auto-update-config", false);
LOADED = true;
} catch (Exception exception) {
Logger.warning("Failed to find section 'updater.auto-config-updater' in config.yml!");
}
LOADED = true;
}
public static boolean shouldAutoUpdate() {
@@ -69,9 +68,6 @@ public class ConfigUpdater {
if (!ANNOUNCE)
return;
List<String> configInput = new LinkedList<>(Arrays.asList("# WARNING: This file is auto generated and its sole purpose is to be used as comparison!\n# WARNING: It will be deleted once this file is no longer needed.", " ", " "));
configInput.addAll(NEWEST_CONFIG_INPUT);
Configurator.createResourcedFile(
"files\\" + (Reflection.isProxyServer() ? "proxy" : "bukkit") + "-config.yml",
COMPARABLE_FILE_NAME,
@@ -1,11 +1,9 @@
package de.rayzs.pat.utils.permission;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Set;
import java.util.UUID;
import java.util.*;
import de.rayzs.pat.api.storage.Storage;
import de.rayzs.pat.utils.adapter.GroupManagerAdapter;
import de.rayzs.pat.utils.group.GroupManager;
import de.rayzs.pat.utils.sender.CommandSender;
import de.rayzs.pat.utils.sender.CommandSenderHandler;
@@ -20,7 +18,8 @@ public class PermissionUtil {
}
public static void reloadPermissions() {
MAP.keySet().forEach(PermissionUtil::reloadPermissions);
List<UUID> uuids = new ArrayList<>(MAP.keySet());
uuids.forEach(PermissionUtil::reloadPermissions);
}
public static void reloadPermissions(UUID uuid) {
@@ -59,6 +58,8 @@ public class PermissionUtil {
public static void setPlayerPermissions(CommandSender sender) {
if (Storage.USE_LUCKPERMS) {
LuckPermsAdapter.setPermissions(sender.getUniqueId());
} else if (Storage.USE_GROUPMANAGER) {
GroupManagerAdapter.setPermissions(sender.getUniqueId());
} else {
GroupManager.getGroups().forEach(group -> group.hasPermission(sender));
}
@@ -67,6 +68,8 @@ public class PermissionUtil {
public static void setPlayerPermissions(UUID uuid) {
if (Storage.USE_LUCKPERMS) {
LuckPermsAdapter.setPermissions(uuid);
} else if (Storage.USE_GROUPMANAGER) {
GroupManagerAdapter.setPermissions(uuid);
} else {
GroupManager.getGroups().forEach(group -> group.hasPermission(uuid));
}
@@ -12,9 +12,12 @@ public class ArgumentSource {
public final HashMap<String, ArgumentStack> ARGUMENT_STACKS = new HashMap<>();
public ArgumentBuilder getGeneralArgument() {
/* Experimental removal
ArgumentBuilder copiedGeneralArguments = new ArgumentBuilder(this);
GENERAL.getInputs().forEach(copiedGeneralArguments::buildArgumentStacks);
return copiedGeneralArguments;
*/
return GENERAL;
}
public List<String> getOptions(String input) {
+1 -1
View File
@@ -3,7 +3,7 @@ description: Hide more than just your plugins. Hide almost everything!
website: https://www.rayzs.de/products/proantitab/page
author: Rayzs_YT
version: 2.0.15
version: 2.0.19
main: de.rayzs.pat.plugin.BungeeLoader
softDepends: [LuckPerms, PAPIProxyBridge]
@@ -48,12 +48,34 @@ handle-through-proxy:
enabled: false
name: "PAT_TOKEN"
#>> HTP
# This is a very necessary feature if you have way too many commands to block and instead decide
# to whitelist specific commands.
# Enabling this will disable ALL commands except for those that are in the (group-)list.
turn-blacklist-to-whitelist: true
# This decides whether PAT ignores or detects whether a command is written in upper/-lower cased letters.
# Here are a few examples if this option is enabled:
# Example with allowing the command "HelP"
# /help --> Blocked
# /Help --> Blocked
# /HelP --> Allowed
# Pro tip: You can also just use auto-lowercase-commands feature instead. ^^
base-command-case-sensitive: true
# (!) Warning:
# Enabling this could lead to performance issues if many players
# change worlds frequently in short amount of time.
#
# This decides whether PAT updates the commands for a player after changing worlds.
# Enabling this allows you to make per-world commands using PAT's group system by
# giving a user/group the PAT group permission using a LuckPerms world as context.
#
# Example command:
# lp (...) permission set proantitab.group.<group> world=<world>
update-commands-per-world: false
# Here you can customize the server version that is displayed on a ping. (The text at the player-count)
# (!) Warning: It's required to use Paper or Purpur to use this feature!
# (!) Supported server versions: 1.12.2 - latest
+50 -14
View File
@@ -1,28 +1,33 @@
Confused about the display of missing parts in the console?
It's actually quite easy to read and I'll show you how its done! :D
Let's take the for the following missing path:
Missing parts are written in this format right here: xyz.zyx.idk
A more befitting example would be something like:
--> test-feature.enabled
In the config.yml, this would look like this:
test-feature:
enabled: true
test-feature:
enabled: true
Now another example with something more fitting to your case:
Here's another example of this format:
--> info.version.updated
In the config.yml, this would look like this:
info:
version:
updated: ...
info:
version:
updated: ...
-----------------------------------------------------------------------
Then what should I copy or how should I transfer the information from the one to the other config.yml?
Now that we know how things from the missing parts look like in the config.yml, let's go over to the more important part.
Inserting the missing parts to your current config.yml. But how and what exactly?
Well, it's actually quite easy. Just take a look on what is missing.
If PAT says, something like this is missing:
- test-feature.enabled
@@ -31,14 +36,45 @@ If PAT says, something like this is missing:
Then this basically just means, that the entire section for "test-feature" is missing.
In other words, check the "comparable-config.yml" and look for the "test-feature" section.
It would look like this:
It would look like this for example:
test-feature:
enabled: true
message: "Hello World"
failed: "Error ;c"
test-feature:
enabled: true
message: "Hello World"
failed: "Error ;c"
Just copy the entire thing and paste it somewhere in the config.yml.
Once you've reloaded the plugin then, using "/(b)pat reload", everything should work fine.
If something went wrong, PAT will let you know! ^^
If something went wrong, PAT will let you know! ^^
Here's a more close to your case example. Let's say your config.yml looks like this:
handle-through-proxy:
...
turn-blacklist-to-whitelist: true
custom-protocol-ping:
...
and now let's say PAT says that "base-command-case-sensitive" is missing.
Then this would be what PAT is looking for as solution:
handle-through-proxy:
...
turn-blacklist-to-whitelist: true
base-command-case-sensitive: true/false
custom-protocol-ping:
...
On how exactly it needs to be implemented can be seen in the comparison-config.yml file,
as this is the original version which would be generated by default.
@@ -40,6 +40,14 @@ disable-sync: false
# Enabling this will disable ALL commands except for those that are in the (group-)list.
turn-blacklist-to-whitelist: true
# This decides whether PAT ignores or detects whether a command is written in upper/-lower cased letters.
# Here are a few examples if this option is enabled:
# Example with allowing the command "HelP"
# /help --> Blocked
# /Help --> Blocked
# /HelP --> Allowed
base-command-case-sensitive: true
# Here you can customize the server version that is displayed on a ping. (The text at the player-count)
custom-protocol-ping:
enabled: true
+1 -1
View File
@@ -3,7 +3,7 @@ description: Hide more than just your plugins. Hide almost everything!
website: https://www.rayzs.de/products/proantitab/page
author: Rayzs_YT
version: 2.0.15
version: 2.0.19
api-version: 1.13
folia-supported: true
main: de.rayzs.pat.plugin.BukkitLoader