Added a bypass for dupeban

This commit is contained in:
TheTrouper
2024-02-27 14:33:26 -06:00
parent 347a5d0ea8
commit 4611464e40
28 changed files with 263 additions and 135 deletions

2
.gitignore vendored
View File

@@ -1 +1,3 @@
/.idea/
/.gradle/
/build/

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -0,0 +1,2 @@
#Tue Feb 27 07:35:11 CST 2024
gradle.version=8.2-rc-2

View File

@@ -1,66 +0,0 @@
package io.github.thetrouper.ultradupe.cmds;
import io.github.itzispyder.pdk.Global;
import io.github.itzispyder.pdk.commands.Args;
import io.github.itzispyder.pdk.commands.CommandRegistry;
import io.github.itzispyder.pdk.commands.CustomCommand;
import io.github.itzispyder.pdk.commands.Permission;
import io.github.itzispyder.pdk.commands.completions.CompletionBuilder;
import io.github.thetrouper.ultradupe.UltraDupe;
import io.github.thetrouper.ultradupe.data.DupeBanStorage;
import io.github.thetrouper.ultradupe.data.GUIs.DupeBanGUI;
import io.github.thetrouper.ultradupe.server.functions.DupeBanCheck;
import io.github.thetrouper.ultradupe.server.sound.SoundPlayer;
import io.github.thetrouper.ultradupe.server.util.Text;
import net.kyori.adventure.text.Component;
import org.bukkit.Material;
import org.bukkit.Sound;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
@CommandRegistry(value = "dupebans", permission = @Permission("ultradupe.dupebans"), printStackTrace = true)
public class DupeBansCommand implements CustomCommand {
@Override
public void dispatchCommand(CommandSender sender, Args args) {
Player p = (Player) sender;
switch (args.get(0).toString()) {
case "add" -> {
if (!p.hasPermission("ultradupe.dupebans.edit")) return;
Material m = p.getInventory().getItemInMainHand().getType();
if (UltraDupe.dupeBanStorage.dupeBans.contains(m)) {
p.sendMessage(Component.text(Text.prefix("&7The material &c%s&7 is already on the dupe ban listr.".formatted(Text.cleanName(m.toString())))));
return;
}
UltraDupe.dupeBanStorage.dupeBans.add(m);
p.sendMessage(Component.text(Text.prefix("&7You have added &c%s&7 to the dupe ban list.".formatted(Text.cleanName(m.toString())))));
UltraDupe.dupeBanStorage.save();
}
case "remove" -> {
if (!p.hasPermission("ultradupe.dupebans.edit")) return;
Material m = p.getInventory().getItemInMainHand().getType();
if (!UltraDupe.dupeBanStorage.dupeBans.contains(m)) {
p.sendMessage(Component.text(Text.prefix("&7The material &c%s&7 is not on the dupe ban list.".formatted(Text.cleanName(m.toString())))));
return;
}
UltraDupe.dupeBanStorage.dupeBans.remove(m);
p.sendMessage(Component.text(Text.prefix("&7You have removed &a%s&7 from the dupe ban list.".formatted(Text.cleanName(m.toString())))));
UltraDupe.dupeBanStorage.save();
}
default -> {
StringBuilder dupeBanList = new StringBuilder(Text.prefix("&7There are currently &e%s&7 dupe bans.".formatted(UltraDupe.dupeBanStorage.dupeBans.size())));
for (Material dupeBan : UltraDupe.dupeBanStorage
.dupeBans) {
dupeBanList.append(Global.instance.color("\n&6 - &c%s".formatted(Text.cleanName(dupeBan.toString()))));
}
p.sendMessage(dupeBanList.toString());
}
}
}
@Override
public void dispatchCompletions(CompletionBuilder b) {
b.then(b.arg("add","remove"));
}
}

View File

@@ -1,13 +1,14 @@
package io.github.thetrouper.ultradupe;
package me.trouper.ultradupe;
import io.github.itzispyder.pdk.PDK;
import io.github.itzispyder.pdk.utils.misc.JsonSerializable;
import io.github.thetrouper.ultradupe.cmds.DupeBansCommand;
import io.github.thetrouper.ultradupe.cmds.DupeCommand;
import io.github.thetrouper.ultradupe.cmds.MultiplyCommand;
import io.github.thetrouper.ultradupe.data.DupeBanStorage;
import io.github.thetrouper.ultradupe.data.config.Config;
import io.github.thetrouper.ultradupe.events.GuiEvents;
import me.trouper.ultradupe.cmds.DupeBansCommand;
import me.trouper.ultradupe.cmds.DupeCommand;
import me.trouper.ultradupe.cmds.MultiplyCommand;
import me.trouper.ultradupe.cmds.UltraDupeCommand;
import me.trouper.ultradupe.data.DupeBanStorage;
import me.trouper.ultradupe.data.config.Config;
import me.trouper.ultradupe.events.GuiEvents;
import org.bukkit.Bukkit;
import org.bukkit.plugin.PluginManager;
import org.bukkit.plugin.java.JavaPlugin;
@@ -22,8 +23,6 @@ public final class UltraDupe extends JavaPlugin {
private static final File dupeBans = new File("plugins/UltraDupe/dupebans.json");
public static Config config = JsonSerializable.load(cfgfile, Config.class, new Config());
public static DupeBanStorage dupeBanStorage = JsonSerializable.load(dupeBans, DupeBanStorage.class, new DupeBanStorage());
public static final PluginManager manager = Bukkit.getPluginManager();
public static final Logger log = Bukkit.getLogger();
/**
@@ -53,6 +52,7 @@ public final class UltraDupe extends JavaPlugin {
new DupeCommand().register();
new DupeBansCommand().register();
new MultiplyCommand().register();
new UltraDupeCommand().register();
// Events
new GuiEvents().register();

View File

@@ -0,0 +1,43 @@
package me.trouper.ultradupe.cmds;
import io.github.itzispyder.pdk.Global;
import io.github.itzispyder.pdk.commands.Args;
import io.github.itzispyder.pdk.commands.CommandRegistry;
import io.github.itzispyder.pdk.commands.CustomCommand;
import io.github.itzispyder.pdk.commands.Permission;
import io.github.itzispyder.pdk.commands.completions.CompletionBuilder;
import me.trouper.ultradupe.UltraDupe;
import me.trouper.ultradupe.server.util.Text;
import net.kyori.adventure.text.Component;
import org.bukkit.Material;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
@CommandRegistry(value = "dupebans", permission = @Permission("ultradupe.dupebans"), printStackTrace = true)
public class DupeBansCommand implements CustomCommand {
@Override
public void dispatchCommand(CommandSender sender, Args args) {
Player p = (Player) sender;
handleListBans(p);
}
@Override
public void dispatchCompletions(CompletionBuilder b) {
b.then(b.arg("item")
.then(b.arg("add","remove"))
.then(b.arg("material")
.then(b.arg("add","remove"))));
}
protected static void handleListBans(Player p) {
StringBuilder dupeBanList = new StringBuilder(Text.prefix("&7There are currently &e%s&7 dupe bans.".formatted(UltraDupe.dupeBanStorage.bannedMaterials.size())));
for (Material dupeBan : UltraDupe.dupeBanStorage
.bannedMaterials) {
dupeBanList.append(Global.instance.color("\n&6 - &c%s".formatted(Text.cleanName(dupeBan.toString()))));
}
p.sendMessage(dupeBanList.toString());
}
}

View File

@@ -1,4 +1,4 @@
package io.github.thetrouper.ultradupe.cmds;
package me.trouper.ultradupe.cmds;
import io.github.itzispyder.pdk.commands.Args;
import io.github.itzispyder.pdk.commands.CommandRegistry;
@@ -6,18 +6,17 @@ import io.github.itzispyder.pdk.commands.CustomCommand;
import io.github.itzispyder.pdk.commands.Permission;
import io.github.itzispyder.pdk.commands.completions.CompletionBuilder;
import io.github.itzispyder.pdk.utils.SchedulerUtils;
import io.github.thetrouper.ultradupe.server.functions.DupeBanCheck;
import io.github.thetrouper.ultradupe.server.sound.SoundPlayer;
import io.github.thetrouper.ultradupe.server.util.Text;
import me.trouper.ultradupe.UltraDupe;
import me.trouper.ultradupe.server.functions.DupeBanCheck;
import me.trouper.ultradupe.server.sound.SoundPlayer;
import me.trouper.ultradupe.server.util.Text;
import net.kyori.adventure.text.Component;
import org.bukkit.Sound;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
import java.util.concurrent.CompletableFuture;
@CommandRegistry(value = "ultradupe", permission = @Permission("ultradupe.dupe"), printStackTrace = true)
@CommandRegistry(value = "duplicate", permission = @Permission("ultradupe.dupe"), printStackTrace = true)
public class DupeCommand implements CustomCommand {
DupeBanCheck check = new DupeBanCheck();
@@ -33,9 +32,15 @@ public class DupeCommand implements CustomCommand {
return;
}
int factor = args.get(0).toInt();
if (factor > UltraDupe.config.plugin.maxDupe) {
p.sendMessage(Component.text(Text.prefix("&7You are not allowed to dupe with a factor greater than &c%s&7!".formatted(UltraDupe.config.plugin.maxDupe))));
return;
}
ItemStack i = p.getInventory().getItemInMainHand().clone();
if (check.itemPasses(i)) {
if (check.itemPasses(i) || (p.hasPermission("ultradupe.bypass.bans") && UltraDupeCommand.bypassingBans.contains(p.getUniqueId()))) {
if (factor == 0) factor = i.getAmount();
SchedulerUtils.loop(1,factor,(time)->{
i.setAmount(1);

View File

@@ -1,4 +1,4 @@
package io.github.thetrouper.ultradupe.cmds;
package me.trouper.ultradupe.cmds;
import io.github.itzispyder.pdk.commands.Args;
import io.github.itzispyder.pdk.commands.CommandRegistry;
@@ -6,9 +6,10 @@ import io.github.itzispyder.pdk.commands.CustomCommand;
import io.github.itzispyder.pdk.commands.Permission;
import io.github.itzispyder.pdk.commands.completions.CompletionBuilder;
import io.github.itzispyder.pdk.utils.SchedulerUtils;
import io.github.thetrouper.ultradupe.server.functions.DupeBanCheck;
import io.github.thetrouper.ultradupe.server.sound.SoundPlayer;
import io.github.thetrouper.ultradupe.server.util.Text;
import me.trouper.ultradupe.UltraDupe;
import me.trouper.ultradupe.server.functions.DupeBanCheck;
import me.trouper.ultradupe.server.sound.SoundPlayer;
import me.trouper.ultradupe.server.util.Text;
import net.kyori.adventure.text.Component;
import org.bukkit.Sound;
import org.bukkit.command.CommandSender;
@@ -26,22 +27,29 @@ public class MultiplyCommand implements CustomCommand {
SoundPlayer no = new SoundPlayer(p.getLocation(), Sound.BLOCK_NOTE_BLOCK_BASS, 10,1);
if (p.getInventory().getItemInMainHand().isEmpty()) {
p.sendMessage(Component.text(Text.prefix("That was air... it was duped, but you still didn't get anything.")));
p.sendMessage(Component.text(Text.prefix("That was air... it was multiplied, but you still didn't get anything.")));
no.play(p);
return;
}
int factor = args.get(0).toInt();
int exponent = args.get(0).toInt();
if (exponent > UltraDupe.config.plugin.maxMult) {
p.sendMessage(Component.text(Text.prefix("&7You are not allowed to multiply with an exponent greater than &c%s&7!".formatted(UltraDupe.config.plugin.maxMult))));
return;
}
ItemStack i = p.getInventory().getItemInMainHand().clone();
if (check.itemPasses(i)) {
if (factor == 0) factor = i.getAmount();
SchedulerUtils.loop(1,factor,(time)->{
if (check.itemPasses(i) || (p.hasPermission("ultradupe.bypass.bans") && UltraDupeCommand.bypassingBans.contains(p.getUniqueId()))) {
if (exponent == 0) exponent = i.getAmount();
SchedulerUtils.loop(1,exponent,(time)->{
yes.play(p);
p.getInventory().addItem(i);
});
p.sendMessage(Component.text(Text.prefix("&7You have duped &a%s %s&7.".formatted(factor, Text.cleanName(i.getType().toString())))));
p.sendMessage(Component.text(Text.prefix("&7You have multiply &a%s %s&7.".formatted(exponent, Text.cleanName(i.getType().toString())))));
} else {
p.sendMessage(Component.text(Text.prefix("&cYou are not allowed to dupe &7%s&c.".formatted(Text.cleanName(i.getType().toString())))));
p.sendMessage(Component.text(Text.prefix("&cYou are not allowed to multiply &7%s&c.".formatted(Text.cleanName(i.getType().toString())))));
no.play(p);
}
}

View File

@@ -0,0 +1,123 @@
package me.trouper.ultradupe.cmds;
import io.github.itzispyder.pdk.commands.Args;
import io.github.itzispyder.pdk.commands.CommandRegistry;
import io.github.itzispyder.pdk.commands.CustomCommand;
import io.github.itzispyder.pdk.commands.Permission;
import io.github.itzispyder.pdk.commands.completions.CompletionBuilder;
import io.github.itzispyder.pdk.utils.SchedulerUtils;
import me.trouper.ultradupe.UltraDupe;
import me.trouper.ultradupe.server.functions.DupeBanCheck;
import me.trouper.ultradupe.server.sound.SoundPlayer;
import me.trouper.ultradupe.server.util.Text;
import net.kyori.adventure.text.Component;
import org.bukkit.Material;
import org.bukkit.Sound;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
@CommandRegistry(value = "ultradupe", permission = @Permission("ultradupe.admin"), printStackTrace = true)
public class UltraDupeCommand implements CustomCommand {
public static List<UUID> bypassingBans = new ArrayList<>();
@Override
public void dispatchCommand(CommandSender sender, Args args) {
Player p = (Player) sender;
switch (args.get(0).toString()) {
case "dupebans" -> {
switch (args.get(1).toString()) {
case "item" -> handleItemEdit(p,args);
case "material" -> handleMaterialEdit(p,args);
default -> DupeBansCommand.handleListBans(p);
}
}
case "toggle" -> {
switch (args.get(1).toString()) {
case "debug" -> {
UltraDupe.config.debugMode = !UltraDupe.config.debugMode;
UltraDupe.config.save();
}
case "bypass" -> {
if (!bypassingBans.contains(p.getUniqueId())) {
bypassingBans.add(p.getUniqueId());
} else {
bypassingBans.remove(p.getUniqueId());
}
p.sendMessage(Component.text(Text.prefix("&7You are now %s dupe bans".formatted(bypassingBans.contains(p.getUniqueId()) ? "&aBypassing&7" : "&cObeying&7"))));
}
}
}
}
}
@Override
public void dispatchCompletions(CompletionBuilder b) {
b.then(b.arg("[<INT>]"));
}
private void handleItemEdit(Player p, Args args) {
if (!p.hasPermission("ultradupe.dupebans.edit")) {
DupeBansCommand.handleListBans(p);
return;
}
switch (args.get(2).toString()) {
case "add" -> {
ItemStack i = p.getInventory().getItemInMainHand().clone();
if (UltraDupe.dupeBanStorage.bannedItems.contains(i)) {
p.sendMessage(Component.text(Text.prefix("&7The material &c%s&7 is already on the dupe ban list.".formatted(Text.cleanName(i.getType().toString())))));
return;
}
UltraDupe.dupeBanStorage.bannedItems.add(i);
p.sendMessage(Component.text(Text.prefix("&7You have added &c%s&7 to the dupe ban list.".formatted(Text.cleanName(i.getType().toString())))));
UltraDupe.dupeBanStorage.save();
}
case "remove" -> {
ItemStack i = p.getInventory().getItemInMainHand().clone();
if (!UltraDupe.dupeBanStorage.bannedItems.contains(i)) {
p.sendMessage(Component.text(Text.prefix("&7The material &c%s&7 is not on the dupe ban list.".formatted(Text.cleanName(i.getType().toString())))));
return;
}
UltraDupe.dupeBanStorage.bannedItems.remove(i);
p.sendMessage(Component.text(Text.prefix("&7You have removed &a%s&7 from the dupe ban list.".formatted(Text.cleanName(i.getType().toString())))));
UltraDupe.dupeBanStorage.save();
}
}
}
private void handleMaterialEdit(Player p, Args args) {
if (!p.hasPermission("ultradupe.dupebans.edit")) {
DupeBansCommand.handleListBans(p);
return;
}
switch (args.get(2).toString()) {
case "add" -> {
Material m = p.getInventory().getItemInMainHand().getType();
if (UltraDupe.dupeBanStorage.bannedMaterials.contains(m)) {
p.sendMessage(Component.text(Text.prefix("&7The material &c%s&7 is already on the dupe ban list.".formatted(Text.cleanName(m.toString())))));
return;
}
UltraDupe.dupeBanStorage.bannedMaterials.add(m);
p.sendMessage(Component.text(Text.prefix("&7You have added &c%s&7 to the dupe ban list.".formatted(Text.cleanName(m.toString())))));
UltraDupe.dupeBanStorage.save();
}
case "remove" -> {
Material m = p.getInventory().getItemInMainHand().getType();
if (!UltraDupe.dupeBanStorage.bannedMaterials.contains(m)) {
p.sendMessage(Component.text(Text.prefix("&7The material &c%s&7 is not on the dupe ban list.".formatted(Text.cleanName(m.toString())))));
return;
}
UltraDupe.dupeBanStorage.bannedMaterials.remove(m);
p.sendMessage(Component.text(Text.prefix("&7You have removed &a%s&7 from the dupe ban list.".formatted(Text.cleanName(m.toString())))));
UltraDupe.dupeBanStorage.save();
}
}
}
}

View File

@@ -1,7 +1,9 @@
package io.github.thetrouper.ultradupe.data;
package me.trouper.ultradupe.data;
import io.github.itzispyder.pdk.utils.misc.JsonSerializable;
import me.trouper.ultradupe.data.GUIs.GuiItems;
import org.bukkit.Material;
import org.bukkit.inventory.ItemStack;
import java.io.File;
import java.util.Arrays;
@@ -16,8 +18,13 @@ public class DupeBanStorage implements JsonSerializable<DupeBanStorage> {
return file;
}
public int bannedModelData = 1111;
public List<Material> dupeBans = Arrays.asList(
Material.AZALEA,
Material.BIG_DRIPLEAF
public List<Material> bannedMaterials = Arrays.asList(
Material.ANCIENT_DEBRIS,
Material.NETHERITE_INGOT,
Material.TOTEM_OF_UNDYING
);
public List<ItemStack> bannedItems = Arrays.asList(
GuiItems.backArrow,
GuiItems.nextArrow
);
}

View File

@@ -1,15 +1,11 @@
package io.github.thetrouper.ultradupe.data.GUIs;
package me.trouper.ultradupe.data.GUIs;
import io.github.itzispyder.pdk.Global;
import io.github.itzispyder.pdk.plugin.builders.ItemBuilder;
import io.github.itzispyder.pdk.plugin.gui.CustomGui;
import io.github.itzispyder.pdk.utils.misc.SoundPlayer;
import io.github.thetrouper.ultradupe.UltraDupe;
import io.github.thetrouper.ultradupe.data.DupeBanStorage;
import org.bukkit.Material;
import org.bukkit.Sound;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
import java.util.ArrayList;
import java.util.List;

View File

@@ -1,4 +1,4 @@
package io.github.thetrouper.ultradupe.data.GUIs;
package me.trouper.ultradupe.data.GUIs;
import io.github.itzispyder.pdk.Global;
import io.github.itzispyder.pdk.plugin.builders.ItemBuilder;

View File

@@ -1,4 +1,4 @@
package io.github.thetrouper.ultradupe.data.config;
package me.trouper.ultradupe.data.config;
import io.github.itzispyder.pdk.utils.misc.JsonSerializable;
@@ -18,6 +18,8 @@ public class Config implements JsonSerializable<Config> {
public Plugin plugin = new Plugin();
public class Plugin {
public int dupeCooldown = 0;
public int multCooldown = 0;
public int maxDupe = 128;
public int maxMult = 10;
}

View File

@@ -1,10 +1,9 @@
package io.github.thetrouper.ultradupe.events;
package me.trouper.ultradupe.events;
import io.github.itzispyder.pdk.events.CustomListener;
import io.github.thetrouper.ultradupe.data.GUIs.DupeBanGUI;
import me.trouper.ultradupe.data.GUIs.DupeBanGUI;
import org.bukkit.event.EventHandler;
import org.bukkit.event.inventory.InventoryCloseEvent;
import org.bukkit.event.player.AsyncPlayerChatEvent;
public class GuiEvents implements CustomListener {
@EventHandler

View File

@@ -1,15 +1,13 @@
package io.github.thetrouper.ultradupe.server.functions;
package me.trouper.ultradupe.server.functions;
import io.github.thetrouper.ultradupe.UltraDupe;
import io.github.thetrouper.ultradupe.data.DupeBanStorage;
import io.github.thetrouper.ultradupe.server.util.ServerUtils;
import me.trouper.ultradupe.UltraDupe;
import me.trouper.ultradupe.server.util.ServerUtils;
import org.bukkit.Material;
import org.bukkit.block.BlockState;
import org.bukkit.block.Container;
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.BlockStateMeta;
import org.bukkit.inventory.meta.ItemMeta;
public class DupeBanCheck {
private boolean isContainer(ItemStack itemStack) {
@@ -66,7 +64,7 @@ public class DupeBanCheck {
return false;
}
}
if (UltraDupe.dupeBanStorage.dupeBans.contains(i.getType())) {
if (UltraDupe.dupeBanStorage.bannedMaterials.contains(i.getType())) {
ServerUtils.verbose("DUPEBANS: No pass T");
return false;
}

View File

@@ -6,9 +6,9 @@
*/
package io.github.thetrouper.ultradupe.server.sound;
package me.trouper.ultradupe.server.sound;
import io.github.thetrouper.ultradupe.UltraDupe;
import me.trouper.ultradupe.UltraDupe;
import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.Sound;

View File

@@ -1,4 +1,4 @@
package io.github.thetrouper.ultradupe.server.util;
package me.trouper.ultradupe.server.util;
import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;

View File

@@ -1,6 +1,6 @@
package io.github.thetrouper.ultradupe.server.util;
package me.trouper.ultradupe.server.util;
import io.github.thetrouper.ultradupe.UltraDupe;
import me.trouper.ultradupe.UltraDupe;
import java.io.File;
public class FileUtils {

View File

@@ -1,4 +1,4 @@
package io.github.thetrouper.ultradupe.server.util;
package me.trouper.ultradupe.server.util;
import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;

View File

@@ -1,4 +1,4 @@
package io.github.thetrouper.ultradupe.server.util;
package me.trouper.ultradupe.server.util;
import java.text.SimpleDateFormat;
import java.util.ArrayList;

View File

@@ -1,6 +1,6 @@
package io.github.thetrouper.ultradupe.server.util;
package me.trouper.ultradupe.server.util;
import io.github.thetrouper.ultradupe.UltraDupe;
import me.trouper.ultradupe.UltraDupe;
import net.md_5.bungee.api.ChatMessageType;
import net.md_5.bungee.api.chat.TextComponent;
import org.bukkit.Bukkit;

View File

@@ -1,7 +1,7 @@
package io.github.thetrouper.ultradupe.server.util;
package me.trouper.ultradupe.server.util;
import io.github.thetrouper.ultradupe.UltraDupe;
import me.trouper.ultradupe.UltraDupe;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

View File

@@ -1,24 +1,35 @@
name: UltraDupe
version: '${version}'
main: io.github.thetrouper.ultradupe.UltraDupe
main: me.trouper.ultradupe.UltraDupe
api-version: 1.19
authors: [ TheTrouper ]
description: Detect Block and Ban players who attempt to grief your server.
description: The only acceptable dupe plugin.
website: https://thetrouper.github.io/
softdepend: [ ProtocolLib ]
permissions:
ultradupe.multiply:
default: op
description: Access to the multiply/exponential dupe feature
ultradupe.dupe:
description: Access to the dupe
default: op
ultradupe.dupebans.edit:
description: edit the dupe ban list
description: Access to the dupe feature
ultradupe.bypass.mult-cooldown:
default: op
description: Bypass the multiply cooldown
ultradupe.bypass.dupe-cooldown:
default: op
description: Bypass the dupe cooldown
ultradupe.bypass.bans:
default: op
description: Bypass all the dupe bans
ultradupe.dupebans:
description: see the dupe ban list
default: op
description: see the dupe ban list
ultradupe.dupebans.edit:
default: op
description: edit the dupe ban list
commands:
ultradupe:
duplicate:
description: A command for testing.
usage: /ultradupe
permission: ultradupe.info
@@ -26,7 +37,6 @@ commands:
aliases:
- dupe
- d
- ud
multiply:
description: A command for testing.
usage: /ultradupe
@@ -35,7 +45,6 @@ commands:
aliases:
- mult
- m
- um
dupebans:
description: dupe bans
usage: /dupebans [add|remove]