Compare commits

..
30 Commits
Author SHA1 Message Date
rayzsyt 7f91b85d6e Fixed wrong tab-completion of available commands 2025-11-23 22:36:29 +01:00
rayzsyt 80beacaef9 Improved 2025-11-23 05:04:18 +01:00
rayzsyt 9f0521f9de Shorten 2025-11-23 04:53:10 +01:00
rayzsyt 3e1fffcfbb Added reload function 2025-11-23 04:44:29 +01:00
rayzsyt c0e77efad6 Set ignoreColons to false by default 2025-11-23 04:44:08 +01:00
rayzsyt 490f6f420b Set default ignoreColons value to false 2025-11-23 04:43:24 +01:00
rayzsyt 228185291d Added new converters 2025-11-23 04:42:59 +01:00
rayzsyt ab17861e7c Shorten 2025-11-23 04:42:38 +01:00
rayzsyt 567ca5192c Implemented Code 2025-11-23 04:42:25 +01:00
rayzsyt 442a0797a2 Added 2025-11-23 04:42:05 +01:00
rayzsyt c1be977abd Improved 2025-11-23 04:42:00 +01:00
rayzsyt a6f670dcfb Fixed wrong default value 2025-11-20 01:27:48 +01:00
rayzsyt 1d3e72aae2 Fixed error 2025-11-19 21:19:18 +01:00
rayzsyt 513fce2059 Prevent permissions reload if uuid is null 2025-11-19 21:16:22 +01:00
rayzsyt 6247aee871 Added secondary injection attempt. 2025-11-19 21:14:37 +01:00
rayzsyt fc0e230ca5 Stop attempt of working with invalid uuids 2025-11-19 21:14:23 +01:00
rayzsyt d2972f602f More refined information to work with 2025-11-19 21:13:57 +01:00
rayzsyt 0f3b858a75 Fixed missing "usage" message 2025-11-19 17:15:02 +01:00
rayzsyt 70b449e83d Changed message 2025-11-19 17:14:37 +01:00
rayzsyt 2a58b6644e Changed warning message 2025-11-19 16:57:26 +01:00
rayzsyt 96f4386f7a Shorten and improve logic 2025-11-19 16:57:14 +01:00
rayzsyt 3e9de4e859 Added messages 2025-11-19 16:56:57 +01:00
rayzsyt dad2db500c Fixed wrong display of group commands 2025-11-19 16:03:58 +01:00
rayzsyt 9bd33477b1 Apply parameter 2025-11-19 15:23:43 +01:00
rayzsyt 01c680b69a Added format parameter 2025-11-19 15:23:33 +01:00
rayzsyt d20c3c2820 Add 2025-11-19 14:58:51 +01:00
rayzsyt dcb73b1672 Implement more save way to iterate through list 2025-11-19 14:58:43 +01:00
rayzsyt 389f006d02 Added Convert and Extract Command 2025-11-19 14:58:19 +01:00
rayzsyt 0266a6c5f9 Initialized StorageConverter 2025-11-19 14:58:02 +01:00
rayzsyt 9b53123e92 Update version 2025-11-19 14:56:54 +01:00
39 changed files with 795 additions and 118 deletions

No files matched your search

+1 -1
View File
@@ -6,7 +6,7 @@
<groupId>de.rayzs.pat</groupId>
<artifactId>ProAntiTab</artifactId>
<version>2.1.1</version>
<version>2.1.2</version>
<properties>
<maven.compiler.source>8</maven.compiler.source>
@@ -59,7 +59,7 @@ public class LegacyPacketHandler implements BukkitPacketHandler {
}
if (!cancelsBeforeHand) {
cancelsBeforeHand = Storage.ConfigSections.Settings.CUSTOM_PLUGIN.isTabCompletable(input) || Storage.ConfigSections.Settings.CUSTOM_VERSION.isTabCompletable(input);
cancelsBeforeHand = Storage.ConfigSections.Settings.CUSTOM_PLUGIN.isCommand(input) || Storage.ConfigSections.Settings.CUSTOM_VERSION.isCommand(input);
}
for (Field field : Reflection.getFields(packetObj)) {
@@ -1,10 +1,7 @@
package de.rayzs.pat.api.netty.proxy;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
import com.velocitypowered.api.proxy.Player;
@@ -73,20 +70,27 @@ public class VelocityPacketAnalyzer {
channel = (Channel) Reflection.getMethodsByName(minecraftConnectionClass, "getChannel").get(0).invoke(minecraftConnectionObj);
if(channel == null) {
if (channel == null) {
Logger.warning("Failed to inject " + player.getUsername() + "! Channel is null.");
return false;
}
if(channel.pipeline().names().contains(VelocityPacketAnalyzer.PIPELINE_NAME))
if (channel.pipeline().names().contains(VelocityPacketAnalyzer.PIPELINE_NAME))
uninject(player);
channel.pipeline().addBefore(VelocityPacketAnalyzer.HANDLER_NAME, VelocityPacketAnalyzer.PIPELINE_NAME, new PacketDecoder(player));
VelocityPacketAnalyzer.INJECTED_PLAYERS.put(player, channel);
} catch (NoSuchElementException e) {
Logger.warning("Failed to find 'handler' inside player pipeline! (name=" + player.getUsername() + ", uuid=" + player.getUniqueId() + ", version=" + player.getProtocolVersion() + ", brand=" + player.getClientBrand() + " )");
return false;
} catch (Throwable throwable) {
throwable.printStackTrace();
return false;
} return true;
}
return true;
}
public static void uninject(Player player) {
@@ -3,12 +3,16 @@ package de.rayzs.pat.api.storage;
import java.util.*;
import java.util.concurrent.TimeUnit;
import de.rayzs.pat.api.brand.CustomServerBrand;
import de.rayzs.pat.api.communication.BackendUpdater;
import de.rayzs.pat.api.communication.Communicator;
import de.rayzs.pat.api.netty.proxy.BungeePacketAnalyzer;
import de.rayzs.pat.api.storage.config.messages.*;
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;
import de.rayzs.pat.utils.configuration.updater.ConfigUpdater;
import de.rayzs.pat.utils.permission.PermissionPlugin;
import org.bukkit.entity.Player;
@@ -16,21 +20,6 @@ import de.rayzs.pat.api.event.PATEventHandler;
import de.rayzs.pat.api.storage.blacklist.BlacklistCreator;
import de.rayzs.pat.api.storage.blacklist.impl.GeneralBlacklist;
import de.rayzs.pat.api.storage.blacklist.impl.GeneralIgnoredServers;
import de.rayzs.pat.api.storage.config.messages.BlacklistSection;
import de.rayzs.pat.api.storage.config.messages.CommandFailedSection;
import de.rayzs.pat.api.storage.config.messages.GroupSection;
import de.rayzs.pat.api.storage.config.messages.HelpSection;
import de.rayzs.pat.api.storage.config.messages.InfoSection;
import de.rayzs.pat.api.storage.config.messages.NoPermissionSection;
import de.rayzs.pat.api.storage.config.messages.NotificationSection;
import de.rayzs.pat.api.storage.config.messages.OnlyForProxySection;
import de.rayzs.pat.api.storage.config.messages.PermsCheckSection;
import de.rayzs.pat.api.storage.config.messages.PostDebugSection;
import de.rayzs.pat.api.storage.config.messages.PrefixSection;
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.placeholders.commands.general.ListCommandsPlaceholder;
import de.rayzs.pat.api.storage.placeholders.commands.general.ListReversedCommandsPlaceholder;
import de.rayzs.pat.api.storage.placeholders.commands.general.ListSizeCommandsPlaceholder;
@@ -174,6 +163,30 @@ public class Storage {
ConfigSections.PLACEHOLDERS.forEach(PlaceholderStorage::load);
}
public static void reload() {
boolean proxy = Reflection.isProxyServer();
boolean backend = Storage.ConfigSections.Settings.HANDLE_THROUGH_PROXY.ENABLED && !proxy;
ConfigUpdater.initialize();
Storage.loadAll(Reflection.isProxyServer() || !backend);
CustomServerBrand.initialize();
GroupManager.clearAllGroups();
GroupManager.initialize();
if (!proxy) {
BackendUpdater.stop();
BackendUpdater.start();
}
if (!backend) {
Storage.handleChange();
}
ConfigUpdater.broadcastMissingParts();
Storage.getLoader().handleReload();
}
public static void handleChange() {
handleChange(null);
}
@@ -353,6 +366,8 @@ public class Storage {
public static PrefixSection PREFIX = new PrefixSection();
public static BlacklistSection BLACKLIST = new BlacklistSection();
public static CommandFailedSection COMMAND_FAILED = new CommandFailedSection();
public static ConvertSection CONVERT = new ConvertSection();
public static ExtractSection EXTRACT = new ExtractSection();
public static GroupSection GROUP = new GroupSection();
public static HelpSection HELP = new HelpSection();
public static InfoSection INFO = new InfoSection();
@@ -629,7 +644,7 @@ public class Storage {
String command = type.toString() + unmodifiedCommand;
if (server == null || !isIgnoredServer(server)) {
listed = BLACKLIST.isListed(command, !turn);
listed = BLACKLIST.isListed(command, false/*!turn*/);
}
if (server == null) {
@@ -650,7 +665,7 @@ public class Storage {
break;
}
listed = blacklist.isListed(command, turn);
listed = blacklist.isListed(command, false/*turn*/);
}
if (!listed && type != BlockType.BOTH) {
@@ -0,0 +1,25 @@
package de.rayzs.pat.api.storage.config.messages;
import de.rayzs.pat.api.storage.storages.ConfigStorage;
import de.rayzs.pat.utils.configuration.helper.ConfigSectionHelper;
import de.rayzs.pat.utils.configuration.helper.MultipleMessagesHelper;
public class ConvertSection extends ConfigStorage {
public MultipleMessagesHelper MESSAGE;
public ConvertSection() {
super("convert");
}
public String INVALID_CONVERTER, SUCCESS;
@Override
public void load() {
super.load();
INVALID_CONVERTER = new ConfigSectionHelper<String>(this, "converter-not-found", "&cConverter or necessary files could not be found!").getOrSet();
SUCCESS = new ConfigSectionHelper<String>(this, "success", "&aSuccessfully converted &e%converter% &ainto the PAT storage.yml!").getOrSet();
}
}
@@ -0,0 +1,31 @@
package de.rayzs.pat.api.storage.config.messages;
import de.rayzs.pat.api.storage.storages.ConfigStorage;
import de.rayzs.pat.utils.Reflection;
import de.rayzs.pat.utils.configuration.helper.ConfigSectionHelper;
import de.rayzs.pat.utils.configuration.helper.MultipleMessagesHelper;
public class ExtractSection extends ConfigStorage {
public MultipleMessagesHelper MESSAGE;
public ExtractSection() {
super("extract");
}
public String USAGE, PLUGIN_NOT_FOUND, SUCCESS;
@Override
public void load() {
super.load();
if (Reflection.isProxyServer()) {
return;
}
USAGE = new ConfigSectionHelper<String>(this, "usage", "&7Usage: &f/pat extract [plugin] <use-colon> &7or &f<group> <use-colon>").getOrSet();
PLUGIN_NOT_FOUND = new ConfigSectionHelper<String>(this, "plugin-not-found", "&cPlugin %plugin% not found!").getOrSet();
SUCCESS = new ConfigSectionHelper<String>(this, "success", "&aSuccessfully extracted &e%amount% &anew commands from %plugin%!").getOrSet();
}
}
@@ -16,6 +16,7 @@ public class HelpSection extends ConfigStorage {
@Override
public void load() {
super.load();
MESSAGE = new MultipleMessagesHelper(this, null, Reflection.isProxyServer() ?
Arrays.asList(
"&7Available commands are: &f/%label%&7..."
@@ -26,6 +27,8 @@ public class HelpSection extends ConfigStorage {
, "&f postdebug &7to post the PAT logs"
, "&f update <player> &7to update player(s) permissions"
, "&f perms <player> &7to check a player's permissions"
, "&f extract (plugin) &7to extract all plugin commands"
, "&f convert (plugin) &7converts into a PAT storage.yml"
, "&f creategroup (group) &7Create a group"
, "&f deletegroup (group) &7Delete a group"
, "&f setpriority (group) (priority) &7to set the priority"
@@ -44,6 +47,7 @@ public class HelpSection extends ConfigStorage {
, "&f postdebug &7to post the PAT logs"
, "&f update <player> &7to update player(s) permissions"
, "&f perms <player> &7to check a player's permissions"
, "&f extract (plugin) &7to extract all plugin commands"
, "&f creategroup (group) &7Create a group"
, "&f deletegroup (group) &7Delete a group"
, "&f setpriority (group) (priority) &7to set the priority"
@@ -1,6 +1,7 @@
package de.rayzs.pat.api.storage.config.settings;
import de.rayzs.pat.api.storage.storages.ConfigStorage;
import de.rayzs.pat.utils.StringUtils;
import de.rayzs.pat.utils.configuration.helper.*;
import java.util.*;
@@ -31,13 +32,8 @@ public class CustomPluginsSection extends ConfigStorage {
public boolean isCommand(String command) {
if(!ENABLED) return false;
command = StringUtils.getFirstArg(command);
if (command.contains(" ")) {
String[] split = command.split(" ");
if (split.length > 0)
command = split[0];
command = command.split(" ")[0];
}
for (String currentCommand : COMMANDS.getLines()) {
if (currentCommand.equalsIgnoreCase(command))
return true;
@@ -26,6 +26,6 @@ public class HandleThroughProxySection extends ConfigStorage {
TOKEN = new ConfigSectionHelper<String>(this, "token", "insert-token-of-proxy-here").getOrSet();
LOAD_FROM_ENV = new ConfigSectionHelper<Boolean>(this, "load-from-env.enabled", false).getOrSet();
ENV_NAME = new ConfigSectionHelper<String>(this, "load-from-env.name", false).getOrSet();
ENV_NAME = new ConfigSectionHelper<String>(this, "load-from-env.name", "PAT_TOKEN").getOrSet();
}
}
@@ -1,8 +1,6 @@
package de.rayzs.pat.api.storage.storages;
import de.rayzs.pat.utils.StringUtils;
import de.rayzs.pat.utils.permission.PermissionUtil;
import de.rayzs.pat.plugin.logger.Logger;
import de.rayzs.pat.api.storage.*;
import java.io.Serializable;
@@ -17,7 +15,7 @@ public class BlacklistStorage extends StorageTemplate implements Serializable {
}
public boolean isListed(String command) {
return isListed(command, !Storage.ConfigSections.Settings.TURN_BLACKLIST_TO_WHITELIST.ENABLED);
return isListed(command, false/*!Storage.ConfigSections.Settings.TURN_BLACKLIST_TO_WHITELIST.ENABLED*/);
}
public boolean isListed(String command, boolean ignoreColons) {
@@ -1,6 +1,7 @@
package de.rayzs.pat.plugin;
import de.rayzs.pat.api.brand.CustomServerBrand;
import de.rayzs.pat.plugin.converter.StorageConverter;
import de.rayzs.pat.plugin.modules.SubArgsModule;
import de.rayzs.pat.plugin.process.CommandProcess;
import de.rayzs.pat.api.netty.bukkit.BukkitPacketAnalyzer;
@@ -136,6 +137,8 @@ public class BukkitLoader extends JavaPlugin implements PluginLoader {
ActionHandler.initialize();
SubArgsModule.initialize();
StorageConverter.initialize();
PATScheduler.createScheduler(this::loadAllCommands);
}
@@ -376,12 +379,16 @@ public class BukkitLoader extends JavaPlugin implements PluginLoader {
}
@Override
public List<String> getPluginNames() {
public List<String> getPluginNames(String format) {
List<String> pluginNames = new ArrayList<>();
for (Plugin plugin : Bukkit.getPluginManager().getPlugins()) {
PluginDescriptionFile description = plugin.getDescription();
pluginNames.add(description.getName() + " (" + description.getVersion() + ")");
pluginNames.add(
format.replace("%n", description.getName())
.replace("%v", description.getVersion())
);
}
return pluginNames;
@@ -451,6 +458,10 @@ public class BukkitLoader extends JavaPlugin implements PluginLoader {
BukkitLoader.disallowedCommands = commands.stream().filter(command -> !allowedCommands.contains(command)).toList();
}
public static Map<String, Command> getCommandsMap() {
return commandsMap;
}
public static boolean useSuggestions() {
return suggestions;
}
@@ -2,6 +2,7 @@ package de.rayzs.pat.plugin;
import de.rayzs.pat.api.brand.CustomServerBrand;
import de.rayzs.pat.plugin.converter.StorageConverter;
import de.rayzs.pat.plugin.process.CommandProcess;
import de.rayzs.pat.plugin.modules.SubArgsModule;
import de.rayzs.pat.api.netty.proxy.BungeePacketAnalyzer;
@@ -102,6 +103,8 @@ public class BungeeLoader extends Plugin implements PluginLoader {
ActionHandler.initialize();
SubArgsModule.initialize();
StorageConverter.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);
@@ -254,12 +257,16 @@ public class BungeeLoader extends Plugin implements PluginLoader {
}
@Override
public List<String> getPluginNames() {
public List<String> getPluginNames(String format) {
List<String> pluginNames = new ArrayList<>();
for (Plugin plugin : ProxyServer.getInstance().getPluginManager().getPlugins()) {
PluginDescription description = plugin.getDescription();
pluginNames.add(description.getName() + " (" + description.getVersion() + ")");
pluginNames.add(
format.replace("%n", description.getName())
.replace("%v", description.getVersion())
);
}
return pluginNames;
@@ -41,5 +41,10 @@ public interface PluginLoader {
List<String> getOnlinePlayerNames();
List<String> getOfflinePlayerNames();
List<String> getPluginNames();
/**
* <pre>
* %n = Plugin name
* %v = Plugin version
*/
List<String> getPluginNames(String format);
}
@@ -6,6 +6,7 @@ import com.velocitypowered.api.proxy.ServerConnection;
import com.velocitypowered.api.proxy.server.RegisteredServer;
import de.rayzs.pat.api.brand.CustomServerBrand;
import de.rayzs.pat.api.event.PATEventHandler;
import de.rayzs.pat.plugin.converter.StorageConverter;
import de.rayzs.pat.plugin.modules.SubArgsModule;
import de.rayzs.pat.plugin.process.CommandProcess;
import de.rayzs.pat.utils.CommandsCache;
@@ -37,7 +38,7 @@ import java.util.*;
@Plugin(name = "ProAntiTab",
id = "proantitab",
version = "2.1.1",
version = "2.1.2",
authors = "Rayzs_YT",
description = "Hide more than just your plugins. Hide almost everything!",
url = "https://www.rayzs.de/products/proantitab/page",
@@ -121,6 +122,8 @@ public class VelocityLoader implements PluginLoader {
ActionHandler.initialize();
SubArgsModule.initialize();
StorageConverter.initialize();
}
public static org.slf4j.Logger getPluginLogger() {
@@ -132,7 +135,6 @@ public class VelocityLoader implements PluginLoader {
server.getScheduler().buildTask(VelocityLoader.instance, () -> {
PermissionUtil.reloadPermissions();
Storage.getLoader().updateCommandCache();
}).delay(1, TimeUnit.SECONDS).schedule();
}
@@ -278,7 +280,7 @@ public class VelocityLoader implements PluginLoader {
}
@Override
public List<String> getPluginNames() {
public List<String> getPluginNames(String format) {
List<String> pluginNames = new ArrayList<>();
for (PluginContainer plugin : server.getPluginManager().getPlugins()) {
PluginDescription description = plugin.getDescription();
@@ -286,7 +288,10 @@ public class VelocityLoader implements PluginLoader {
String pluginName = description.getName().orElse("/");
String version = description.getVersion().orElse("/");
pluginNames.add(pluginName + " (" + version + ")");
pluginNames.add(
format.replace("%n", pluginName)
.replace("%v", version)
);
}
return pluginNames;
@@ -0,0 +1,46 @@
package de.rayzs.pat.plugin.converter;
import de.rayzs.pat.api.storage.storages.BlacklistStorage;
import de.rayzs.pat.utils.configuration.ConfigurationBuilder;
import de.rayzs.pat.utils.configuration.Configurator;
import de.rayzs.pat.utils.sender.CommandSender;
import java.io.File;
import java.util.List;
public abstract class Converter {
private final String pluginName, fileName, folderPath;
protected final ConfigurationBuilder config;
public Converter(String pluginName, String folderName, String fileName) {
this.pluginName = pluginName;
this.fileName = fileName;
this.folderPath = "./plugins/" + folderName;
this.config = exists() ? Configurator.get(fileName, folderPath) : null;
}
public String getPluginName() {
return pluginName;
}
public boolean exists() {
return new File(folderPath, fileName + ".yml").exists();
}
protected void applyStorage(BlacklistStorage storage, List<String> commands) {
for (String command : commands) {
boolean exist = command.contains(" ")
? storage.getCommands().contains(command)
: storage.isListed(command);
if (exist) continue;
storage.add(command);
}
storage.save();
}
public abstract void apply(CommandSender sender);
}
@@ -0,0 +1,40 @@
package de.rayzs.pat.plugin.converter;
import de.rayzs.pat.plugin.converter.converters.*;
import org.jetbrains.annotations.NotNull;
import java.util.*;
public class StorageConverter {
private StorageConverter() {}
private static final Map<String, Converter> converters = new HashMap<>();
public static void initialize() {
if (!converters.isEmpty()) {
return;
}
registerConverter(new AdvancedPlHideConverter());
registerConverter(new CommandWhitelistConverter());
registerConverter(new PluginHiderPlus());
registerConverter(new PlHideFree());
registerConverter(new PlHidePro());
}
public static Set<String> getConverters() {
return converters.keySet();
}
public static Converter getConverter(@NotNull String name) {
return converters.get(name);
}
public static void registerConverter(@NotNull Converter converter) {
if (!converter.exists()) return;
converters.putIfAbsent(converter.getPluginName(), converter);
}
}
@@ -0,0 +1,40 @@
package de.rayzs.pat.plugin.converter.converters;
import de.rayzs.pat.api.storage.Storage;
import de.rayzs.pat.api.storage.storages.BlacklistStorage;
import de.rayzs.pat.plugin.converter.Converter;
import de.rayzs.pat.utils.group.Group;
import de.rayzs.pat.utils.group.GroupManager;
import de.rayzs.pat.utils.sender.CommandSender;
import java.util.ArrayList;
import java.util.List;
public class AdvancedPlHideConverter extends Converter {
public AdvancedPlHideConverter() {
super("AdvancedPlHide", "AdvancedPlHide", "config");
}
@Override
public void apply(CommandSender sender) {
List<String> groups = config.getKeys("groups", false).stream().toList();
for (String groupName : groups) {
List<String> commands = (ArrayList<String>) config.get("groups."+ groupName + ".tabcomplete");
BlacklistStorage storage;
if (groupName.equalsIgnoreCase("default")) {
storage = Storage.Blacklist.getBlacklist();
} else {
Group group = GroupManager.registerAndGetGroup(groupName);
storage = group.getGeneralGroupBlacklist();
}
applyStorage(storage, commands);
}
sender.sendMessage("&e&lNotice: &7AdvanedPlHide works based on permissions whether to whitelist or blacklist commands from a group. Due to the fact that this cannot be detected by PAT and formatted in the exact way, all commands have been interpreted as whitelisted commands instead. Also, since PAT groups are only intended to whitelist commands, all created groups based on AdvancedPlHide have been created with the intention of whitelisting commands instead. If you wish to change that, please check out the GitHub wiki on how to use the storage.yml of PAT the intended way. (https://github.com/RayzsYT/ProAntiTab/wiki/How-to#introduction)");
}
}
@@ -0,0 +1,44 @@
package de.rayzs.pat.plugin.converter.converters;
import de.rayzs.pat.api.storage.Storage;
import de.rayzs.pat.api.storage.storages.BlacklistStorage;
import de.rayzs.pat.plugin.converter.Converter;
import de.rayzs.pat.utils.group.Group;
import de.rayzs.pat.utils.group.GroupManager;
import de.rayzs.pat.utils.sender.CommandSender;
import java.util.ArrayList;
import java.util.List;
public class CommandWhitelistConverter extends Converter {
public CommandWhitelistConverter() {
super("CommandWhitelist", "CommandWhitelist", "config");
}
@Override
public void apply(CommandSender sender) {
List<String> groups = config.getKeys("groups", false).stream().toList();
for (String groupName : groups) {
List<String> commands = new ArrayList<>();
final List<String> l1 = (ArrayList<String>) config.get("groups." + groupName + ".commands");
final List<String> l2 = (ArrayList<String>) config.get("groups." + groupName + ".subcommands");
commands.addAll(l1);
commands.addAll(l2);
BlacklistStorage storage;
if (groupName.equalsIgnoreCase("default")) {
storage = Storage.Blacklist.getBlacklist();
} else {
Group group = GroupManager.registerAndGetGroup(groupName);
storage = group.getGeneralGroupBlacklist();
}
applyStorage(storage, commands);
}
}
}
@@ -0,0 +1,58 @@
package de.rayzs.pat.plugin.converter.converters;
import de.rayzs.pat.api.storage.Storage;
import de.rayzs.pat.api.storage.storages.BlacklistStorage;
import de.rayzs.pat.plugin.converter.Converter;
import de.rayzs.pat.utils.group.Group;
import de.rayzs.pat.utils.group.GroupManager;
import de.rayzs.pat.utils.sender.CommandSender;
import java.util.ArrayList;
import java.util.List;
public class PlHideFree extends Converter {
public PlHideFree() {
super("PlHide", "Pl-Hide-Free", "config");
}
@Override
public void apply(CommandSender sender) {
List<String> groups = config.getKeys("groups", false).stream().toList();
for (String groupName : groups) {
List<String> execution = (ArrayList<String>) config.get("groups." + groupName + ".commands");
List<String> commands = execution.stream().filter(s -> !s.startsWith("!") && !s.equalsIgnoreCase("*")).map(this::translate).toList();
BlacklistStorage storage;
if (groupName.equalsIgnoreCase("default")) {
storage = Storage.Blacklist.getBlacklist();
} else {
Group group = GroupManager.registerAndGetGroup(groupName);
storage = group.getGeneralGroupBlacklist();
}
applyStorage(storage, commands);
}
sender.sendMessage("§e§lNotice: §7Since PAT is mainly focussed on either blocking or whitelisting commands entirely, PAT is viewing and converting the file such that commands are only working in whitelist mode. If you wish to use ProAntiTab in blacklist mode instead, then please checkout the wiki! (https://github.com/RayzsYT/ProAntiTab/wiki/How-to#introduction)");
}
private String translate(String input) {
if (input.contains(" ")) {
if (input.endsWith("~")) {
return translate(input.substring(0, input.length() - 1) + "_-");
}
if (input.endsWith("*")) {
return input.substring(0, input.length() - 2);
} else if (input.contains("*")) {
return input.substring(0, input.indexOf('*') - 1);
}
}
return input;
}
}
@@ -0,0 +1,99 @@
package de.rayzs.pat.plugin.converter.converters;
import de.rayzs.pat.api.storage.Storage;
import de.rayzs.pat.api.storage.storages.BlacklistStorage;
import de.rayzs.pat.plugin.converter.Converter;
import de.rayzs.pat.utils.group.Group;
import de.rayzs.pat.utils.group.GroupManager;
import de.rayzs.pat.utils.sender.CommandSender;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class PlHidePro extends Converter {
public PlHidePro() {
super("PlHidePro", "Pl-Hide-Pro", "config");
}
@Override
public void apply(CommandSender sender) {
boolean updateGroupPerWorld = (boolean) config.get("per_world_group_updates");
Storage.ConfigSections.Settings.UPDATE_GROUPS_PER_WORLD.getConfig().setAndSave("update-groups-per-world", updateGroupPerWorld);
boolean autoLowercaseCommands = (boolean) config.get("auto_lowercase_base_commands");
Storage.ConfigSections.Settings.AUTO_LOWERCASE_COMMANDS.getConfig().setAndSave("auto-lowercase-commands.enabled", autoLowercaseCommands);
boolean f3brand = (boolean) config.get("replace-f3-server-brand");
String f3brandString = (String) config.get("f3-server-brand");
Storage.ConfigSections.Settings.CUSTOM_BRAND.getConfig().setAndSave("custom-server-brand.enabled", f3brand);
if (f3brand) {
Storage.ConfigSections.Settings.CUSTOM_BRAND.getConfig().setAndSave("custom-server-brand.repeat-delay", -1);
Storage.ConfigSections.Settings.CUSTOM_BRAND.getConfig().setAndSave("custom-server-brand.brands", new ArrayList<>(Collections.singletonList(f3brandString.replace("§", "&"))));
}
List<String> groups = config.getKeys("groups", false).stream().toList();
for (String groupName : groups) {
List<String> commands = new ArrayList<>();
final List<String> execution = (ArrayList<String>) config.get("groups." + groupName + ".commands");
final List<String> tabCompletion = (ArrayList<String>) config.get("groups." + groupName + ".tabcomplete");
for (String s : execution) {
if (s.equalsIgnoreCase("*")) {
tabCompletion.remove("*");
continue;
}
if (!s.contains(" ") && s.startsWith("!")) {
tabCompletion.remove(s);
continue;
}
if (tabCompletion.contains(s)) {
commands.add(s);
tabCompletion.remove(s);
continue;
}
commands.add("[CMD]" + s);
}
commands.addAll(tabCompletion.stream().map(s -> "[TAB]" + s).toList());
commands = commands.stream().map(this::translate).toList();
BlacklistStorage storage;
if (groupName.equalsIgnoreCase("default")) {
storage = Storage.Blacklist.getBlacklist();
} else {
Group group = GroupManager.registerAndGetGroup(groupName);
storage = group.getGeneralGroupBlacklist();
}
applyStorage(storage, commands);
}
sender.sendMessage("§e§lNotice: §7Since PAT is mainly focussed on either blocking or whitelisting commands entirely, PAT is viewing and converting the file such that commands are only working in whitelist mode. If you wish to use ProAntiTab in blacklist mode instead, then please checkout the wiki! (https://github.com/RayzsYT/ProAntiTab/wiki/How-to#introduction)");
}
private String translate(String input) {
if (input.contains(" ")) {
if (input.endsWith("~")) {
return translate(input.substring(0, input.length() - 1) + "_-");
}
if (input.endsWith("*")) {
return input.substring(0, input.length() - 2);
} else if (input.contains("*")) {
return input.substring(0, input.indexOf('*') - 1);
}
}
return input;
}
}
@@ -0,0 +1,32 @@
package de.rayzs.pat.plugin.converter.converters;
import de.rayzs.pat.api.storage.Storage;
import de.rayzs.pat.plugin.converter.Converter;
import de.rayzs.pat.utils.sender.CommandSender;
import java.util.ArrayList;
import java.util.List;
public class PluginHiderPlus extends Converter {
public PluginHiderPlus() {
super("PluginHider+", "PluginHiderPlus", "config");
}
@Override
public void apply(CommandSender sender) {
boolean blacklist = (boolean) config.get("reverse-suggestionsWhitelist");
Storage.ConfigSections.Settings.TURN_BLACKLIST_TO_WHITELIST.getConfig().setAndSave("turn-blacklist-to-whitelist", !blacklist);
List<String> commands = (ArrayList<String>) config.get("suggestionsWhitelist");
if (blacklist) {
List<String> blockedCommands = (ArrayList<String>) config.get("blockedCommands.everyone.commands");
commands.addAll(blockedCommands);
}
applyStorage(Storage.Blacklist.getBlacklist(), commands);
sender.sendMessage("&e&lNotice: &7Since PluginHider+ both blocks certain commands and whitelist a few, the conversion into PAT's storage.yml format won't be accurate. Only whitelisted commands have been added, and blocked commands for everyone if the plugin was used in blacklist mode.");
}
}
@@ -5,6 +5,7 @@ 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.proxy.VelocityPacketAnalyzer;
import de.rayzs.pat.plugin.logger.Logger;
import de.rayzs.pat.utils.message.MessageTranslator;
import de.rayzs.pat.utils.permission.PermissionUtil;
import com.velocitypowered.api.event.Subscribe;
@@ -14,6 +15,7 @@ import de.rayzs.pat.api.storage.Storage;
import com.velocitypowered.api.proxy.*;
import de.rayzs.pat.utils.sender.CommandSender;
import de.rayzs.pat.utils.sender.CommandSenderHandler;
import net.kyori.adventure.text.Component;
import java.util.concurrent.TimeUnit;
@@ -55,8 +57,20 @@ public class VelocityConnectionListener {
public void onServerSwitch(ServerConnectedEvent event) {
Player player = event.getPlayer();
if (!VelocityPacketAnalyzer.isInjected(player))
VelocityPacketAnalyzer.inject(player);
if (!VelocityPacketAnalyzer.isInjected(player)) {
if (!VelocityPacketAnalyzer.inject(player)) {
Logger.warning("Attempting delayed injection for " + player.getUsername());
server.getScheduler().buildTask(loader, () -> {
if (!VelocityPacketAnalyzer.inject(player)) {
Logger.warning("Second injection for " + player.getUsername() + " failed as well!");
player.disconnect(Component.text("Failed to inject player!"));
}
}).delay(1, TimeUnit.SECONDS).schedule();
}
}
if (Storage.ConfigSections.Settings.UPDATE_GROUPS_PER_SERVER.ENABLED) {
CommandSender sender = CommandSenderHandler.from(player);
@@ -99,7 +99,7 @@ public class Logger {
.append("\n");
builder.append("Installed plugins: \n ")
.append(String.join("\n ", Storage.getLoader().getPluginNames()))
.append(String.join("\n ", Storage.getLoader().getPluginNames("%n (%v)")))
.append("\n\n");
builder.append("Detected supported plugins:")
@@ -35,6 +35,12 @@ public class CommandProcess {
COMMANDS.add(new RemoveCommand());
COMMANDS.add(new ClearCommand());
COMMANDS.add(new ConvertCommand());
if (!Reflection.isProxyServer()) {
COMMANDS.add(new ExtractCommand());
}
COMMANDS.add(new CreateGroupCommand());
COMMANDS.add(new DeleteGroupCommand());
@@ -107,7 +107,9 @@ public class AddCommand extends ProCommand {
if (Reflection.isProxyServer())
return null;
return BukkitLoader.getDisallowedCommands();
return Storage.ConfigSections.Settings.TURN_BLACKLIST_TO_WHITELIST.ENABLED
? BukkitLoader.getDisallowedCommands()
: BukkitLoader.getAllowedCommands();
}
String fullString = String.join(" ", args);
@@ -0,0 +1,51 @@
package de.rayzs.pat.plugin.process.impl.local.modify;
import de.rayzs.pat.api.command.ProCommand;
import de.rayzs.pat.api.storage.Storage;
import de.rayzs.pat.plugin.converter.Converter;
import de.rayzs.pat.plugin.converter.StorageConverter;
import de.rayzs.pat.utils.StringUtils;
import de.rayzs.pat.utils.sender.CommandSender;
import java.util.List;
public class ConvertCommand extends ProCommand {
public ConvertCommand() {
super(
"convert",
""
);
}
@Override
public boolean execute(CommandSender sender, String[] args) {
if (args.length != 1)
return false;
String converterName = args[0];
Converter converter = StorageConverter.getConverter(converterName);
if (converter == null) {
sender.sendMessage(StringUtils.replace(Storage.ConfigSections.Messages.CONVERT.INVALID_CONVERTER,
"%converter%", converterName)
);
return true;
}
converterName = converter.getPluginName();
sender.sendMessage(StringUtils.replace(Storage.ConfigSections.Messages.CONVERT.SUCCESS,
"%converter%", converterName)
);
converter.apply(sender);
Storage.reload();
return true;
}
@Override
public List<String> tabComplete(CommandSender sender, String[] args) {
return StorageConverter.getConverters().stream().toList();
}
}
@@ -0,0 +1,147 @@
package de.rayzs.pat.plugin.process.impl.local.modify;
import de.rayzs.pat.api.command.ProCommand;
import de.rayzs.pat.api.storage.Storage;
import de.rayzs.pat.api.storage.storages.BlacklistStorage;
import de.rayzs.pat.plugin.BukkitLoader;
import de.rayzs.pat.plugin.converter.Converter;
import de.rayzs.pat.plugin.converter.StorageConverter;
import de.rayzs.pat.utils.StringUtils;
import de.rayzs.pat.utils.group.Group;
import de.rayzs.pat.utils.group.GroupManager;
import de.rayzs.pat.utils.sender.CommandSender;
import org.bukkit.Bukkit;
import org.bukkit.command.Command;
import org.bukkit.plugin.Plugin;
import org.bukkit.plugin.PluginManager;
import java.util.*;
public class ExtractCommand extends ProCommand {
public ExtractCommand() {
super(
"extract",
""
);
}
@Override
public boolean execute(CommandSender sender, String[] args) {
if (args.length < 1) {
sender.sendMessage(Storage.ConfigSections.Messages.EXTRACT.USAGE);
return true;
}
String pluginName = args[0].toLowerCase();
boolean failed = false, useColons = false;
Group group = null;
if (args.length == 2) {
group = GroupManager.getGroupByName(args[1]);
if (group == null) {
useColons = Boolean.parseBoolean(args[1]);
if (!useColons && !args[1].equalsIgnoreCase("false")) {
failed = true;
}
}
try {
useColons = Boolean.parseBoolean(args[1]);
} catch (Exception exception) {
group = GroupManager.getGroupByName(args[1]);
failed = group == null;
}
} else if (args.length == 3) {
group = GroupManager.getGroupByName(args[1]);
if (group == null) {
failed = true;
} else {
try {
useColons = Boolean.parseBoolean(args[2]);
} catch (Exception exception) {
failed = true;
}
}
}
if (failed) {
sender.sendMessage(Storage.ConfigSections.Messages.EXTRACT.USAGE);
return true;
}
List<String> pluginNames = Storage.getLoader().getPluginNames("%n");
boolean pluginFound = false;
for (String name : pluginNames) {
if (name.equalsIgnoreCase(pluginName)) {
pluginFound = true;
break;
}
}
if (!pluginFound) {
sender.sendMessage(StringUtils.replace(Storage.ConfigSections.Messages.EXTRACT.PLUGIN_NOT_FOUND,
"%plugin%", pluginName)
);
return true;
}
List<String> commands = new ArrayList<>();
for (Map.Entry<String, Command> entry : BukkitLoader.getCommandsMap().entrySet()) {
if (entry.getKey().toLowerCase().startsWith(pluginName + ":")) {
String command = entry.getKey().substring(args[0].length() + 1);
commands.add(command);
if (useColons) {
commands.add(entry.getKey());
}
}
}
BlacklistStorage storage = group == null
? Storage.Blacklist.getBlacklist()
: group.getGeneralGroupBlacklist();
commands = commands.stream().filter(command -> !storage.isListed(command)).toList();
commands.forEach(storage::add);
storage.save();
sender.sendMessage(StringUtils.replace(Storage.ConfigSections.Messages.EXTRACT.SUCCESS,
"%amount%", String.valueOf(commands.size()),
"%plugin%", pluginName
));
return true;
}
@Override
public List<String> tabComplete(CommandSender sender, String[] args) {
final int length = args.length;
if (length <= 1) {
return Storage.getLoader().getPluginNames("%n");
}
List<String> result = new ArrayList<>();
if (length == 2 || length == 3 && GroupManager.getGroupByName(args[1]) != null) {
result.add("true");
result.add("false");
}
if (length == 2) {
result.addAll(GroupManager.getGroupNames());
}
return result;
}
}
@@ -51,7 +51,7 @@ public class ListCommand extends ProCommand {
String message = Storage.ConfigSections.Messages.GROUP.LIST_MESSAGE;
message = StringUtils.replace(message,
"%group%", groupName,
"%size%", String.valueOf(Storage.Blacklist.getBlacklist().getCommands().size()),
"%size%", String.valueOf(group.getCommands().size()),
"%commands%", commandsListMessage
);
@@ -22,30 +22,8 @@ public class ReloadCommand extends ProCommand {
@Override
public boolean execute(CommandSender sender, String[] args) {
boolean proxy = Reflection.isProxyServer();
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();
GroupManager.clearAllGroups();
GroupManager.initialize();
if (!proxy) {
BackendUpdater.stop();
BackendUpdater.start();
}
if (!backend) {
Storage.handleChange();
}
ConfigUpdater.broadcastMissingParts();
Storage.getLoader().handleReload();
Storage.reload();
sender.sendMessage(Storage.ConfigSections.Messages.RELOAD.DONE);
return true;
}
@@ -42,28 +42,31 @@ public class CommandsCache {
}
public void handleCommands(List<String> commands, String server) {
if(!isOutdated(commands))
if (!isOutdated(commands))
return;
LinkedList<String> tmpFilteredCommands = new LinkedList<>();
List<String> tmpAllCommands = new ArrayList<>(commands);
List<String> tmpAllCommands = Collections.unmodifiableList(commands);
allCommands = tmpAllCommands;
for (String command : tmpAllCommands) {
command = StringUtils.getFirstArg(command);
final int length = allCommands.size();
for (int i = 0; i < length; i++) {
if (i >= tmpAllCommands.size())
break;
String command = StringUtils.getFirstArg(tmpAllCommands.get(i));
Storage.Blacklist.BlockType type = Storage.Blacklist.BlockTypeFetcher.getType(command);
if (type != Storage.Blacklist.BlockType.BOTH && type != Storage.Blacklist.BlockType.TAB)
continue;
if (isFilterListAvailable()) {
if (filteredCommands.contains(command))
if (filteredCommands.contains(command))
continue;
if (!Storage.Blacklist.isBlockedTab(command, server))
filteredCommands.add(command);
tmpFilteredCommands.add(command);
}
}
filteredCommands = tmpFilteredCommands;
@@ -34,6 +34,12 @@ public class LuckPermsAdapter {
public static User getUser(UUID uuid) {
if (uuid == null) {
Logger.warning("Attempted to get LuckPerms user with null UUID!");
return null;
}
return PROVIDER.getUserManager().getUser(uuid);
}
@@ -81,14 +81,9 @@ public class BukkitConfigurationBuilder implements ConfigurationBuilder {
if (result != null)
return result;
if (fileName.equals("config")) {
if (!ConfigUpdater.shouldAutoUpdate()) {
ConfigUpdater.addMissingPart((!path.isBlank() ? path + "." : "") + target);
return object;
}
set(path, target, object);
return get(path, target);
if (fileName.equals("config") && !ConfigUpdater.shouldAutoUpdate()) {
ConfigUpdater.addMissingPart((!path.isBlank() ? path + "." : "") + target);
return object;
}
set(path, target, object);
@@ -103,14 +98,9 @@ public class BukkitConfigurationBuilder implements ConfigurationBuilder {
if (result != null)
return result;
if (fileName.equals("config")) {
if (!ConfigUpdater.shouldAutoUpdate()) {
ConfigUpdater.addMissingPart(target);
return object;
}
set(target, object);
return get(target);
if (fileName.equals("config") && !ConfigUpdater.shouldAutoUpdate()) {
ConfigUpdater.addMissingPart(target);
return object;
}
set(target, object);
@@ -88,14 +88,9 @@ public class ProxyConfigurationBuilder implements ConfigurationBuilder {
if (result != null)
return result;
if (fileName.equals("config")) {
if (!ConfigUpdater.shouldAutoUpdate()) {
ConfigUpdater.addMissingPart((!path.isBlank() ? path + "." : "") + target);
return object;
}
set(path, target, object);
return get(path, target);
if (fileName.equals("config") && !ConfigUpdater.shouldAutoUpdate()) {
ConfigUpdater.addMissingPart((!path.isBlank() ? path + "." : "") + target);
return object;
}
set(path, target, object);
@@ -110,14 +105,9 @@ public class ProxyConfigurationBuilder implements ConfigurationBuilder {
if (result != null)
return result;
if (fileName.equals("config")) {
if (!ConfigUpdater.shouldAutoUpdate()) {
ConfigUpdater.addMissingPart(target);
return object;
}
set(target, object);
return get(target);
if (fileName.equals("config") && !ConfigUpdater.shouldAutoUpdate()) {
ConfigUpdater.addMissingPart(target);
return object;
}
set(target, object);
@@ -101,13 +101,20 @@ public class ConfigUpdater {
}
Logger.warning(" ");
Logger.warning("The config.yml is missing a few parts.");
Logger.warning("What can be done to solve this issue? There are two options:");
Logger.warning("Hey, the config.yml is missing a few parts.");
Logger.warning("This most likely happened because PAT added a new feature or message.");
Logger.warning(" ");
Logger.warning("No worries though! This isn't a bad or dangerous thing.");
Logger.warning("You can even ignore or disable this warning entirely by disabling 'announce-missing-parts'.");
Logger.warning(" ");
Logger.warning("But more importantly. If you want to fill the missing parts,");
Logger.warning("then you would have three options on how to do so:");
Logger.warning(" ");
Logger.warning("Option 1: Delete your current config.yml and restart the server.");
Logger.warning("Option 2: Set the missing parts/sections yourself in the config.yml.");
Logger.warning("Option 3: Enable 'auto-update-config'. But *please* read the warning message above that option.");
Logger.warning(" ");
Logger.warning("To simplify that process, a new file with the newest config.yml content has been created as comparison. (plugins/ProAntiTab/comparable-config.yml)");
Logger.warning("To simplify this process, a new file with the newest config.yml content has been created as comparison. (plugins/ProAntiTab/comparable-config.yml)");
Logger.warning(" ");
Logger.warning("Following parts are missing:");
@@ -116,7 +123,9 @@ public class ConfigUpdater {
});
Logger.warning(" ");
Logger.warning("How to read? Check out the newly generated " + HOW_TO_READ_FILE_NAME + " file. ^^");
Logger.warning("You don't know how to interpret the missing parts? No worries.");
Logger.warning("A new file has been created which explains with examples on how to read and apply the missing parts.");
Logger.warning("-> ./plugins/ProAntiTab/" + HOW_TO_READ_FILE_NAME);
Logger.warning(" ");
}
}
@@ -3,6 +3,7 @@ package de.rayzs.pat.utils.permission;
import java.util.*;
import de.rayzs.pat.api.storage.Storage;
import de.rayzs.pat.plugin.logger.Logger;
import de.rayzs.pat.utils.Reflection;
import de.rayzs.pat.utils.adapter.GroupManagerAdapter;
import de.rayzs.pat.utils.group.GroupManager;
@@ -24,6 +25,10 @@ public class PermissionUtil {
}
public static void reloadPermissions(UUID uuid) {
if (uuid == null) {
return;
}
resetPermissions(uuid);
setPlayerPermissions(uuid);
+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.1.1
version: 2.1.2
main: de.rayzs.pat.plugin.BungeeLoader
softDepends: [LuckPerms, PAPIProxyBridge]
@@ -271,6 +271,15 @@ perms-check:
player-is-missing: "&cPlease specify the player whose permission you want to check."
player-not-online: "&c%player% is not online!"
extract:
usage: '&7Usage: &f/pat extract [plugin] <use-colon> &7or &f<group> <use-colon>'
plugin-not-found: '&cPlugin %plugin% not found!'
success: '&aSuccessfully extracted &e%amount% &anew commands from %plugin%!'
convert:
converter-not-found: '&cConverter or necessary files could not be found!'
success: '&aSuccessfully converted &e%converter% &ainto the PAT storage.yml!'
help:
- '&7Available commands are: &f/%label%&7... &8[&fBUKKIT&8]'
- '&7Format: &8<optional> (required)'
@@ -280,6 +289,8 @@ help:
- '&f postdebug &7to post the PAT logs'
- '&f update <player> &7to update player(s) permissions'
- "&f perms <player> &7to check a player's permissions"
- "&f extract (plugin) &7to extract all plugin commands"
- "&f convert (plugin) &7converts into a PAT storage.yml"
- '&f add/rem (command) &8<group> &7to manage the list'
- '&f clear &8<group> &7to clear the list'
- '&f creategroup (group) &7to create a group'
@@ -236,6 +236,10 @@ perms-check:
player-is-missing: "&cPlease specify the player whose permission you want to check."
player-not-online: "&c%player% is not online!"
convert:
converter-not-found: '&cConverter or necessary files could not be found!'
success: '&aSuccessfully converted &e%converter% &ainto the PAT storage.yml!'
help:
- '&7Available commands are: &f/%label%&7... &8[&fPROXY&8]'
- '&7Format: &8<optional> (required)'
@@ -245,6 +249,7 @@ help:
- '&f postdebug &7to post the PAT logs'
- '&f update <player> &7to update player(s) permissions'
- "&f perms <player> &7to check a player's permissions"
- "&f convert (plugin) &7converts into a PAT storage.yml"
- '&f add/rem (command) &8<group> &7to manage the list'
- '&f clear &8<group> &7to clear the list'
- '&f creategroup (group) &7to create a group'
+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.1.1
version: 2.1.2
api-version: 1.13
folia-supported: true
main: de.rayzs.pat.plugin.BukkitLoader