diff --git a/pom.xml b/pom.xml index 56da438..3028329 100644 --- a/pom.xml +++ b/pom.xml @@ -14,14 +14,7 @@ 8 UTF-8 - - - org.spigotmc - spigot-api - 1.12-R0.1-SNAPSHOT - provided - - + spigotmc-repo @@ -33,4 +26,25 @@ + + + org.spigotmc + spigot-api + 1.8.8-R0.1-SNAPSHOT + provided + + + net.luckperms + api + 5.4 + provided + + + + org.projectlombok + lombok + 1.18.28 + provided + + \ No newline at end of file diff --git a/src/main/java/me/firephoenix/anticheatmanager/AnticheatManager.java b/src/main/java/me/firephoenix/anticheatmanager/AnticheatManager.java index 779659e..07962ff 100644 --- a/src/main/java/me/firephoenix/anticheatmanager/AnticheatManager.java +++ b/src/main/java/me/firephoenix/anticheatmanager/AnticheatManager.java @@ -1,17 +1,53 @@ package me.firephoenix.anticheatmanager; +import lombok.Getter; +import lombok.Setter; +import me.firephoenix.anticheatmanager.cmds.AnticheatManagerGUI; +import me.firephoenix.anticheatmanager.cmds.AnticheatSelector; +import me.firephoenix.anticheatmanager.listener.InvClick; +import net.luckperms.api.LuckPerms; +import org.bukkit.Bukkit; +import org.bukkit.plugin.RegisteredServiceProvider; import org.bukkit.plugin.java.JavaPlugin; +import java.util.logging.Level; + +@Getter +@Setter public final class AnticheatManager extends JavaPlugin { + public static AnticheatManager INSTANCE; + + public LuckPerms luckPermsAPI; + @Override public void onEnable() { // Plugin startup logic + setInstance(this); + saveDefaultConfig(); + + getCommand("anticheatselect").setExecutor(new AnticheatSelector()); + + getCommand("anticheatgui").setExecutor(new AnticheatManagerGUI()); + + getServer().getPluginManager().registerEvents(new InvClick(), this); + + RegisteredServiceProvider provider = Bukkit.getServicesManager().getRegistration(LuckPerms.class); + if (provider != null) { + luckPermsAPI = provider.getProvider(); + } else { + getLogger().log(Level.SEVERE, "LuckPerms API is not available, disabling..."); + onDisable(); + } } @Override public void onDisable() { // Plugin shutdown logic } + + public void setInstance(AnticheatManager INSTANCE) { + AnticheatManager.INSTANCE = INSTANCE; + } } diff --git a/src/main/java/me/firephoenix/anticheatmanager/cmds/AnticheatManagerGUI.java b/src/main/java/me/firephoenix/anticheatmanager/cmds/AnticheatManagerGUI.java index 34f9565..dac96be 100644 --- a/src/main/java/me/firephoenix/anticheatmanager/cmds/AnticheatManagerGUI.java +++ b/src/main/java/me/firephoenix/anticheatmanager/cmds/AnticheatManagerGUI.java @@ -1,8 +1,44 @@ package me.firephoenix.anticheatmanager.cmds; +import me.firephoenix.anticheatmanager.AnticheatManager; +import me.firephoenix.anticheatmanager.util.ItemBuilder; +import org.bukkit.Bukkit; +import org.bukkit.Material; +import org.bukkit.command.Command; +import org.bukkit.command.CommandExecutor; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; +import org.bukkit.inventory.Inventory; + +import java.util.List; + /** * @author NieGestorben * Copyright© (c) 2023, All Rights Reserved. */ -public class AnticheatManagerGUI { +public class AnticheatManagerGUI implements CommandExecutor { + + + @Override + public boolean onCommand(CommandSender commandSender, Command command, String string, String[] args) { + Player player = AnticheatManager.INSTANCE.getServer().getPlayer(commandSender.getName()); + if (player != null) { + List anticheatList = AnticheatManager.INSTANCE.getConfig().getStringList("name-list"); + Inventory inventory = Bukkit.createInventory(player, 27, "Anticheats"); + for (int i = 0; i < inventory.getSize(); i++) { + inventory.setItem(i, new ItemBuilder(Material.STAINED_GLASS_PANE).toItemStack()); + } + for (int i = 0; i < anticheatList.size(); i++) { + Material material = Material.valueOf(AnticheatManager.INSTANCE.getConfig().getString("anticheats." + anticheatList.get(i) + ".material")); + String name = AnticheatManager.INSTANCE.getConfig().getString("anticheats." + anticheatList.get(i) + ".name"); + String version = AnticheatManager.INSTANCE.getConfig().getString("anticheats." + anticheatList.get(i) + ".version"); + String price = AnticheatManager.INSTANCE.getConfig().getString("anticheats." + anticheatList.get(i) + ".price"); + inventory.setItem(i, new ItemBuilder(material).setName(name).addLoreLine("Version: " + version).addLoreLine("Price: " + price).toItemStack()); + } + player.openInventory(inventory); + return true; + } + return false; + } + } diff --git a/src/main/java/me/firephoenix/anticheatmanager/cmds/AnticheatSelector.java b/src/main/java/me/firephoenix/anticheatmanager/cmds/AnticheatSelector.java index 39a3baf..e55fb83 100644 --- a/src/main/java/me/firephoenix/anticheatmanager/cmds/AnticheatSelector.java +++ b/src/main/java/me/firephoenix/anticheatmanager/cmds/AnticheatSelector.java @@ -1,6 +1,75 @@ -package me.firephoenix.anticheatmanager.cmds;/** +package me.firephoenix.anticheatmanager.cmds; + +import me.firephoenix.anticheatmanager.AnticheatManager; +import net.luckperms.api.model.data.NodeMap; +import net.luckperms.api.node.Node; +import net.luckperms.api.node.NodeBuilder; +import net.luckperms.api.node.NodeEqualityPredicate; +import org.bukkit.ChatColor; +import org.bukkit.command.Command; +import org.bukkit.command.CommandExecutor; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; + +import java.util.List; +import java.util.Objects; + +/** * @author NieGestorben * Copyright© (c) 2023, All Rights Reserved. */ - public class AnticheatSelector { +public class AnticheatSelector implements CommandExecutor { + + @Override + public boolean onCommand(CommandSender commandSender, Command command, String string, String[] args) { + Player player = AnticheatManager.INSTANCE.getServer().getPlayer(commandSender.getName()); + if (player == null) return false; + List anticheatList = AnticheatManager.INSTANCE.getConfig().getStringList("name-list"); + if (args.length != 1) { + commandSender.sendMessage(ChatColor.translateAlternateColorCodes('&', "&cUsage: acsel ")); + return true; + } + if (anticheatList.isEmpty()) { + commandSender.sendMessage(ChatColor.translateAlternateColorCodes('&', "&cNo Anticheats configured!")); + return true; + } + if (anticheatList.contains(args[0])) { + anticheatList.remove(args[0]); + + String bypassPermission = AnticheatManager.INSTANCE.getConfig().getString("anticheats." + args[0] + ".bypass-permission"); + + // Manage permissions via luckperms, because that is what I use and this will only be a private plugin + if (AnticheatManager.INSTANCE.getLuckPermsAPI().getUserManager().getUser(player.getUniqueId()) == null) { + commandSender.sendMessage(ChatColor.translateAlternateColorCodes('&', "&cCouldn't manage permissions via the LuckPerms API!")); + return true; + } + Node permissionNode = Node.builder(bypassPermission).negated(true).build(); + NodeMap permissions = AnticheatManager.INSTANCE.getLuckPermsAPI().getUserManager().getUser(player.getUniqueId()).data(); + + String anticheatname = AnticheatManager.INSTANCE.getConfig().getString("anticheats." + args[0] + ".name"); + String anticheatVersion = AnticheatManager.INSTANCE.getConfig().getString("anticheats." + args[0] + ".version"); + + //Remove all other anticheat bypass permissions + + anticheatList.forEach(anticheat -> { + String permission = AnticheatManager.INSTANCE.getConfig().getString("anticheats." + anticheat + ".bypass-permission"); + Node permissionNode2 = Node.builder(permission).negated(true).build(); + permissions.remove(permissionNode2); + }); + + commandSender.sendMessage(ChatColor.translateAlternateColorCodes('&', "&cChanged Anticheat to " + anticheatname + " V" + anticheatVersion)); + + //Add bypass permission for selected anticheat + + permissions.add(permissionNode); + + AnticheatManager.INSTANCE.getLuckPermsAPI().getUserManager().saveUser(Objects.requireNonNull(AnticheatManager.INSTANCE.getLuckPermsAPI().getUserManager().getUser(player.getUniqueId()))); + return true; + } else { + commandSender.sendMessage(ChatColor.translateAlternateColorCodes('&', "&cCouldn't find an anticheat with the name: " + args[0] + ".")); + commandSender.sendMessage(ChatColor.translateAlternateColorCodes('&', "List of all anticheats: " + anticheatList)); + return true; + } + } + } diff --git a/src/main/java/me/firephoenix/anticheatmanager/listener/InvClick.java b/src/main/java/me/firephoenix/anticheatmanager/listener/InvClick.java index ebfb80c..a420ca8 100644 --- a/src/main/java/me/firephoenix/anticheatmanager/listener/InvClick.java +++ b/src/main/java/me/firephoenix/anticheatmanager/listener/InvClick.java @@ -1,8 +1,31 @@ package me.firephoenix.anticheatmanager.listener; +import me.firephoenix.anticheatmanager.AnticheatManager; +import org.bukkit.Material; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.inventory.InventoryClickEvent; + /** * @author NieGestorben * Copyright© (c) 2023, All Rights Reserved. */ -public class InvClick { +public class InvClick implements Listener { + + @EventHandler + public void onInvClick(InventoryClickEvent e) { + Player player = (Player) e.getWhoClicked(); + if (e.getCurrentItem() == null) { + return; + } + AnticheatManager.INSTANCE.getConfig().getStringList("name-list").forEach(name -> { + Material material = Material.valueOf(AnticheatManager.INSTANCE.getConfig().getString("anticheats." + name + ".material")); + String acName = AnticheatManager.INSTANCE.getConfig().getString("anticheats." + name + ".name"); + if (e.getCurrentItem().getType() == material && e.getCurrentItem().getItemMeta().getDisplayName().equals(acName)) { + player.performCommand("acsel " + name); + } + }); + } + } diff --git a/src/main/java/me/firephoenix/anticheatmanager/util/ItemBuilder.java b/src/main/java/me/firephoenix/anticheatmanager/util/ItemBuilder.java index b2af343..41995df 100644 --- a/src/main/java/me/firephoenix/anticheatmanager/util/ItemBuilder.java +++ b/src/main/java/me/firephoenix/anticheatmanager/util/ItemBuilder.java @@ -1,4 +1,4 @@ -package me.firephoenix.anticheatmanager.cmds.util; +package me.firephoenix.anticheatmanager.util; import org.bukkit.Color; import org.bukkit.DyeColor; diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index e69de29..63555ac 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -0,0 +1,9 @@ +name-list: # List of all anticheats, please enter the exact same name as in anticheats.NAME, Max of 9 anticheats is currently supported. + - example +anticheats: + example: # Name of the anticheat, only lowercase characters please + bypass-permission: inferno.bypass # Permission to bypass the anticheat + name: Example # Name of the anticheat but as a string, you can use lower and upper case characters! + version: 1.0.0 # Version of the anticheat + price: Free # Price (free if it's not paid) + material: BLAZE_POWDER # Bukkit Material for GUI, only <=1.8.8 Materials \ No newline at end of file diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index 2b8d011..04c9f7b 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -1,3 +1,14 @@ name: AnticheatManager -version: '${project.version}' +version: '1.0' main: me.firephoenix.anticheatmanager.AnticheatManager +commands: + anticheatselect: + description: Select an anticheat to test + usage: /anticheatsel + aliases: [acsel] + permission: anticheatmanager.select + anticheatgui: + description: Select an anticheat to test + usage: /anticheatgui + aliases: [ acgui ] + permission: anticheatmanager.gui