Compare commits

..
26 Commits
Author SHA1 Message Date
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
28 changed files with 243 additions and 104 deletions

No files matched your search

+1 -1
View File
@@ -6,7 +6,7 @@
<groupId>de.rayzs.pat</groupId>
<artifactId>ProAntiTab</artifactId>
<version>2.0.15</version>
<version>2.0.17</version>
<properties>
<maven.compiler.source>8</maven.compiler.source>
@@ -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;
}
@@ -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;
@@ -302,6 +290,7 @@ 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 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();
}
}
@@ -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;
@@ -35,7 +35,9 @@ import java.util.*;
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;
@@ -185,7 +187,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
@@ -333,6 +335,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 +417,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) {
@@ -38,7 +38,7 @@ import java.util.*;
@Plugin(name = "ProAntiTab",
id = "proantitab",
version = "2.0.15",
version = "2.0.17",
authors = "Rayzs_YT",
description = "Hide more than just your plugins. Hide almost everything!",
url = "https://www.rayzs.de/products/proantitab/page",
@@ -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,
@@ -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");
@@ -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);
@@ -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}; }
@@ -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,9 +1,6 @@
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.group.GroupManager;
@@ -20,7 +17,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) {
@@ -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.17
main: de.rayzs.pat.plugin.BungeeLoader
softDepends: [LuckPerms, PAPIProxyBridge]
@@ -54,6 +54,15 @@ handle-through-proxy:
# 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
# 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.17
api-version: 1.13
folia-supported: true
main: de.rayzs.pat.plugin.BukkitLoader