Recoded pretty much everything and fixed the editor.

Closes SD-1024 and SD-696
This commit is contained in:
GB6 2019-01-02 20:21:21 +01:00
parent ac1ff21e02
commit c45d0b9a99
33 changed files with 1318 additions and 988 deletions

119
pom.xml
View File

@ -24,132 +24,33 @@
</resources>
<sourceDirectory>src/main/java</sourceDirectory>
</build>
<repositories>
<repository>
<id>private</id>
<url>http://repo.songoda.com/repository/private</url>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>org.spigotmc</groupId>
<artifactId>spigot</artifactId>
<version>1.13.1</version>
<version>1.13.2</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.songoda</groupId>
<artifactId>arconix</artifactId>
<version>LATEST</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org</groupId>
<artifactId>kingdoms</artifactId>
<version>LATEST</version>
</dependency>
<dependency>
<groupId>net.milkbowl</groupId>
<artifactId>vault</artifactId>
<version>LATEST</version>
</dependency>
<dependency>
<groupId>me.ryanhamshire</groupId>
<artifactId>GriefPrevention</artifactId>
<version>LATEST</version>
</dependency>
<dependency>
<groupId>com.sk89q</groupId>
<artifactId>worldedit</artifactId>
<version>LATEST</version>
</dependency>
<dependency>
<groupId>com.sk89q</groupId>
<artifactId>worldguard</artifactId>
<version>7.0.0</version>
</dependency>
<dependency>
<groupId>com</groupId>
<artifactId>plotsquared</artifactId>
<version>RELEASE</version>
</dependency>
<dependency>
<groupId>com.palmergames.bukkit</groupId>
<artifactId>towny</artifactId>
<version>LATEST</version>
</dependency>
<dependency>
<groupId>com.wasteofplastic</groupId>
<artifactId>askyblock</artifactId>
<version>3.0.6.8</version>
</dependency>
<dependency>
<groupId>us.talabrek</groupId>
<artifactId>ultimateskyblock</artifactId>
<version>LATEST</version>
</dependency>
<dependency>
<groupId>me.markeh</groupId>
<artifactId>factionsframework</artifactId>
<version>1.2.0</version>
</dependency>
<dependency>
<groupId>br.net.fabiozumbi12</groupId>
<artifactId>RedProtect</artifactId>
<version>7.3.0</version>
</dependency>
<dependency>
<groupId>com.songoda</groupId>
<artifactId>epicspawners</artifactId>
<version>LATEST</version>
</dependency>
<dependency>
<groupId>com.gmail.nossr50</groupId>
<artifactId>mcmmo</artifactId>
<version>LATEST</version>
</dependency>
<dependency>
<groupId>com.gamingmesh</groupId>
<artifactId>jobs</artifactId>
<version>LATEST</version>
</dependency>
<dependency>
<groupId>me.botsko</groupId>
<artifactId>prism</artifactId>
<version>LATEST</version>
</dependency>
<dependency>
<groupId>de.diddiz</groupId>
<artifactId>logblock</artifactId>
<version>LATEST</version>
</dependency>
<dependency>
<groupId>net</groupId>
<artifactId>coreprotect</artifactId>
<version>LATEST</version>
</dependency>
<dependency>
<groupId>uk.antiperson</groupId>
<artifactId>stackmob</artifactId>
<version>LATEST</version>
</dependency>
<dependency>
<groupId>net.sothatsit</groupId>
<artifactId>blockstore</artifactId>
<version>LATEST</version>
</dependency>
<dependency>
<groupId>org.black_ixx</groupId>
<artifactId>playerpoints</artifactId>
<version>2.1.4</version>
</dependency>
<dependency>
<groupId>xyz.wildseries</groupId>
<artifactId>wildstacker</artifactId>
<version>b6</version>
</dependency>
<dependency>
<groupId>me.clip</groupId>
<artifactId>placeholderapi</artifactId>
<version>2.5.1</version>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.2</version>
</dependency>
</dependencies>
</project>

View File

@ -2,19 +2,14 @@ package com.songoda.epicvouchers;
import com.songoda.epicvouchers.command.CommandManager;
import com.songoda.epicvouchers.handlers.Connections;
import com.songoda.epicvouchers.handlers.PreventHacks;
import com.songoda.epicvouchers.inventory.Confirmation;
import com.songoda.epicvouchers.inventory.VoucherEditor;
import com.songoda.epicvouchers.liberaries.Bountiful;
import com.songoda.epicvouchers.utils.ConfigWrapper;
import com.songoda.epicvouchers.utils.Methods;
import com.songoda.epicvouchers.utils.ServerVersion;
import com.songoda.epicvouchers.utils.SettingsManager;
import com.songoda.epicvouchers.voucher.ClickListener;
import com.songoda.epicvouchers.voucher.Cooldowns;
import com.songoda.epicvouchers.voucher.Voucher;
import com.songoda.epicvouchers.voucher.VoucherManager;
import org.apache.commons.lang.ArrayUtils;
import com.songoda.epicvouchers.libraries.Bountiful;
import com.songoda.epicvouchers.libraries.FastInv;
import com.songoda.epicvouchers.listeners.ChatListener;
import com.songoda.epicvouchers.listeners.PlayerCommandListener;
import com.songoda.epicvouchers.listeners.PlayerInteractListener;
import com.songoda.epicvouchers.utils.*;
import com.songoda.epicvouchers.voucher.*;
import lombok.Getter;
import org.bukkit.Bukkit;
import org.bukkit.Material;
import org.bukkit.command.ConsoleCommandSender;
@ -26,29 +21,21 @@ import java.io.File;
public class EpicVouchers extends JavaPlugin {
private static EpicVouchers INSTANCE;
private ConsoleCommandSender console;
private CommandManager commandManager;
private References references;
private Locale locale;
private VoucherEditor voucherEditor;
private Confirmation confirmation;
private VoucherManager voucherManager;
private Connections connections;
private Cooldowns cooldowns;
@Getter private CommandManager commandManager;
@Getter private Locale locale;
@Getter private VoucherManager voucherManager;
@Getter private Connections connections;
@Getter private CoolDownManager cooldowns;
@Getter private VoucherExecutor voucherExecutor;
private SettingsManager settingsManager;
private ConfigWrapper vouchersFile = new ConfigWrapper(this, "", "vouchers.yml");
private ServerVersion serverVersion = ServerVersion.fromPackageName(Bukkit.getServer().getClass().getPackage().getName());
public static EpicVouchers getInstance() {
return INSTANCE;
}
@Getter private final ServerVersion serverVersion = ServerVersion.fromPackageName(Bukkit.getServer().getClass().getPackage().getName());
@Override
public void onEnable() {
INSTANCE = this;
console = this.getServer().getConsoleSender();
console.sendMessage(Methods.formatText("&a============================="));
console.sendMessage(Methods.formatText("&7EpicVouchers " + this.getDescription().getVersion() + " by &5Brianna <3&7!"));
@ -60,29 +47,29 @@ public class EpicVouchers extends JavaPlugin {
Locale.saveDefaultLocale("en_US");
this.locale = Locale.getLocale(getConfig().getString("Locale", "en_US"));
FastInv.init(this);
Debugger.init(this);
this.settingsManager = new SettingsManager(this);
this.settingsManager.updateSettings();
getConfig().options().copyDefaults(true);
saveConfig();
this.references = new References();
this.voucherEditor = new VoucherEditor(this);
this.commandManager = new CommandManager(this);
this.confirmation = new Confirmation(this);
this.voucherManager = new VoucherManager();
this.connections = new Connections(this);
this.cooldowns = new Cooldowns();
this.cooldowns = new CoolDownManager(this);
this.voucherExecutor = new VoucherExecutor(this);
PluginManager manager = Bukkit.getServer().getPluginManager();
manager.registerEvents(new ClickListener(this), EpicVouchers.getInstance());
manager.registerEvents(voucherEditor, EpicVouchers.getInstance());
manager.registerEvents(new Confirmation(this), EpicVouchers.getInstance());
manager.registerEvents(new PreventHacks(), EpicVouchers.getInstance());
manager.registerEvents(new PlayerInteractListener(this), this);
manager.registerEvents(new PlayerCommandListener(), this);
manager.registerEvents(new ChatListener(this), this);
File folder = getDataFolder();
File voucherfile = new File(folder, "vouchers.yml");
if (!voucherfile.exists()) {
File voucherFile = new File(folder, "vouchers.yml");
if (!voucherFile.exists()) {
saveResource("vouchers.yml", true);
}
@ -183,7 +170,6 @@ public class EpicVouchers extends JavaPlugin {
this.vouchersFile = new ConfigWrapper(this, "", "vouchers.yml");
loadVouchersFromFile();
locale.reloadMessages();
references = new References();
reloadConfig();
saveConfig();
}
@ -200,52 +186,4 @@ public class EpicVouchers extends JavaPlugin {
}
public ServerVersion getServerVersion() {
return serverVersion;
}
public boolean isServerVersion(ServerVersion version) {
return serverVersion == version;
}
public boolean isServerVersion(ServerVersion... versions) {
return ArrayUtils.contains(versions, serverVersion);
}
public boolean isServerVersionAtLeast(ServerVersion version) {
return serverVersion.ordinal() >= version.ordinal();
}
public Locale getLocale() {
return locale;
}
public References getReferences() {
return references;
}
public Confirmation getConfirmation() {
return confirmation;
}
public CommandManager getCommandManager() {
return commandManager;
}
public VoucherEditor getVoucherEditor() {
return voucherEditor;
}
public VoucherManager getVoucherManager() {
return voucherManager;
}
public Cooldowns getCooldowns() {
return cooldowns;
}
public Connections getConnections() {
return connections;
}
}

View File

@ -34,6 +34,7 @@ public class Locale {
private final File file;
private final String name, region;
private final String prefix;
private Locale(String name, String region) {
if (plugin == null)
@ -44,6 +45,7 @@ public class Locale {
String fileName = name + "_" + region + FILE_EXTENSION;
this.file = new File(localeFolder, fileName);
this.prefix = getMessage("general.nametag.prefix") + " ";
if (this.reloadMessages()) return;
@ -314,7 +316,7 @@ public class Locale {
public String getMessage(String node, Object... args) {
String message = getMessage(node);
for (Object arg : args) {
message = message.replaceFirst("\\%.*?\\%", arg.toString());
message = message.replaceFirst("%.*?%", arg.toString());
}
return message;
}
@ -372,4 +374,7 @@ public class Locale {
return true;
}
public String getPrefix() {
return prefix;
}
}

View File

@ -1,14 +0,0 @@
package com.songoda.epicvouchers;
public class References {
private String prefix;
public References() {
prefix = EpicVouchers.getInstance().getLocale().getMessage("general.nametag.prefix") + " ";
}
public String getPrefix() {
return this.prefix;
}
}

View File

@ -14,9 +14,9 @@ import java.util.List;
public class CommandManager implements CommandExecutor {
private EpicVouchers instance;
private final EpicVouchers instance;
private List<AbstractCommand> commands = new ArrayList<>();
private final List<AbstractCommand> commands = new ArrayList<>();
public CommandManager(EpicVouchers instance) {
this.instance = instance;
@ -53,7 +53,7 @@ public class CommandManager implements CommandExecutor {
}
}
}
commandSender.sendMessage(instance.getReferences().getPrefix() + Methods.formatText(instance.getLocale().getMessage("command.error.notexist")));
commandSender.sendMessage(instance.getLocale().getPrefix() + Methods.formatText(instance.getLocale().getMessage("command.error.notexist")));
return true;
}
@ -69,12 +69,12 @@ public class CommandManager implements CommandExecutor {
return;
}
if (returnType == AbstractCommand.ReturnType.SYNTAX_ERROR) {
sender.sendMessage(instance.getReferences().getPrefix() + Methods.formatText("&cInvalid Syntax!"));
sender.sendMessage(instance.getReferences().getPrefix() + Methods.formatText("&7The valid syntax is: &6" + command.getSyntax() + "&7."));
sender.sendMessage(instance.getLocale().getPrefix() + Methods.formatText("&cInvalid Syntax!"));
sender.sendMessage(instance.getLocale().getPrefix() + Methods.formatText("&7The valid syntax is: &6" + command.getSyntax() + "&7."));
}
return;
}
sender.sendMessage(instance.getReferences().getPrefix() + instance.getLocale().getMessage("event.general.nopermission"));
sender.sendMessage(instance.getLocale().getPrefix() + instance.getLocale().getMessage("event.general.nopermission"));
}
public List<AbstractCommand> getCommands() {

View File

@ -2,6 +2,7 @@ package com.songoda.epicvouchers.command.commands;
import com.songoda.epicvouchers.EpicVouchers;
import com.songoda.epicvouchers.command.AbstractCommand;
import com.songoda.epicvouchers.menus.VoucherMenu;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
@ -16,7 +17,7 @@ public class CommandEditor extends AbstractCommand {
if (args.length != 1) return ReturnType.SYNTAX_ERROR;
instance.reload();
instance.getVoucherEditor().openMenu((Player) sender);
new VoucherMenu(instance).open((Player) sender);
return ReturnType.SUCCESS;
}

View File

@ -14,7 +14,7 @@ public class CommandEpicVouchers extends AbstractCommand {
@Override
protected ReturnType runCommand(EpicVouchers instance, CommandSender sender, String... args) {
sender.sendMessage("");
sender.sendMessage(Methods.formatText(instance.getReferences().getPrefix() + "&7Version " + instance.getDescription().getVersion() + " Created with <3 by &5&l&oBrianna"));
sender.sendMessage(Methods.formatText(instance.getLocale().getPrefix() + "&7Version " + instance.getDescription().getVersion() + " Created with <3 by &5&l&oBrianna"));
for (AbstractCommand command : instance.getCommandManager().getCommands()) {
if (command.getPermissionNode() == null || sender.hasPermission(command.getPermissionNode())) {

View File

@ -5,7 +5,6 @@ import com.songoda.epicvouchers.command.AbstractCommand;
import com.songoda.epicvouchers.events.ForceRedeemEvent;
import com.songoda.epicvouchers.utils.Debugger;
import com.songoda.epicvouchers.voucher.Voucher;
import com.songoda.epicvouchers.voucher.VoucherExecutor;
import org.bukkit.Bukkit;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
@ -42,7 +41,7 @@ public class CommandForce extends AbstractCommand {
return ReturnType.FAILURE;
}
for (int times = 0; times < amount; times++) {
VoucherExecutor.redeemVoucher(player, voucher, player.getItemInHand(), false);
instance.getVoucherExecutor().redeemVoucher(player, voucher, player.getItemInHand(), false);
}
}
}
@ -55,7 +54,7 @@ public class CommandForce extends AbstractCommand {
}
output = player.getName();
for (int times = 0; times < amount; times++) {
VoucherExecutor.redeemVoucher(player, voucher, player.getItemInHand(), false);
instance.getVoucherExecutor().redeemVoucher(player, voucher, player.getItemInHand(), false);
}
}
String message = instance.getLocale().getMessage("command.force.send", output, voucher.getName(true), String.valueOf(amount));

View File

@ -10,10 +10,10 @@ public class ForceRedeemEvent extends Event implements Cancellable {
private static final HandlerList handlers = new HandlerList();
private Player player;
private String voucher;
private int amount;
private CommandSender sender;
private final Player player;
private final String voucher;
private final int amount;
private final CommandSender sender;
private boolean cancelled;
public ForceRedeemEvent(Player player, String voucher, int amount, CommandSender sender) {

View File

@ -11,11 +11,11 @@ public class VoucherReceiveEvent extends Event implements Cancellable {
private static final HandlerList handlers = new HandlerList();
private Player player;
private String voucher;
private ItemStack item;
private int amount;
private CommandSender sender;
private final Player player;
private final String voucher;
private final ItemStack item;
private final int amount;
private final CommandSender sender;
private boolean cancelled;
public VoucherReceiveEvent(Player player, String voucher, ItemStack item, int amount, CommandSender sender) {

View File

@ -10,10 +10,10 @@ public class VoucherRedeemEvent extends Event implements Cancellable {
private static final HandlerList handlers = new HandlerList();
private Player player;
private String voucher;
private ItemStack item;
private boolean manual;
private final Player player;
private final String voucher;
private final ItemStack item;
private final boolean manual;
private boolean cancelled;
public VoucherRedeemEvent(Player player, String voucher, ItemStack item, boolean manual) {

View File

@ -9,7 +9,7 @@ import java.sql.*;
public class Connections {
private EpicVouchers instance;
private final EpicVouchers instance;
private Connection connection;
public Connections(EpicVouchers instance) {

View File

@ -1,114 +0,0 @@
package com.songoda.epicvouchers.inventory;
import com.songoda.epicvouchers.EpicVouchers;
import com.songoda.epicvouchers.utils.Debugger;
import com.songoda.epicvouchers.utils.Methods;
import com.songoda.epicvouchers.utils.SoundUtils;
import com.songoda.epicvouchers.voucher.Voucher;
import com.songoda.epicvouchers.voucher.VoucherExecutor;
import org.bukkit.Bukkit;
import org.bukkit.Material;
import org.bukkit.enchantments.Enchantment;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.inventory.InventoryClickEvent;
import org.bukkit.event.inventory.InventoryType;
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.ItemFlag;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;
import java.util.Arrays;
import java.util.HashMap;
import java.util.UUID;
public class Confirmation implements Listener {
private EpicVouchers instance;
private static HashMap<UUID, Voucher> vouchercache = new HashMap<>();
private static HashMap<UUID, ItemStack> itemcache = new HashMap<>();
public Confirmation(EpicVouchers instance) {
this.instance = instance;
}
public void confirmVoucher(Player player, Voucher voucher, ItemStack item) {
Inventory confirmmenu = Bukkit.createInventory(null, 27, instance.getLocale().getMessage("interface.confirmsettings.title"));
SoundUtils.playSound(player, "NOTE_PIANO", 1);
ItemStack confirmitem = new ItemStack(Material.EMERALD, 1, (short) 0);
ItemMeta confirmitemmeta = confirmitem.getItemMeta();
confirmitemmeta.setDisplayName(instance.getLocale().getMessage("interface.confirmsettings.confirmitemname"));
confirmitemmeta.setLore(Arrays.asList(instance.getLocale().getMessage("interface.confirmsettings.confirmitemlore")));
confirmitemmeta.addEnchant(Enchantment.DURABILITY, 1, false);
confirmitemmeta.addItemFlags(ItemFlag.HIDE_ENCHANTS);
confirmitem.setItemMeta(confirmitemmeta);
confirmmenu.setItem(11, confirmitem);
ItemStack cancelitem = new ItemStack(Material.REDSTONE_BLOCK, 1, (short) 0);
ItemMeta cancelitemmeta = cancelitem.getItemMeta();
cancelitemmeta.setDisplayName(instance.getLocale().getMessage("interface.confirmsettings.cancelitemname"));
cancelitemmeta.setLore(Arrays.asList(instance.getLocale().getMessage("interface.confirmsettings.cancelitemlore")));
cancelitemmeta.addEnchant(Enchantment.DURABILITY, 1, false);
cancelitemmeta.addItemFlags(ItemFlag.HIDE_ENCHANTS);
cancelitem.setItemMeta(cancelitemmeta);
confirmmenu.setItem(15, cancelitem);
if (instance.getConfig().getBoolean("Interface.Fill Interfaces With Glass")) {
ItemStack fillitem;
try {
fillitem = new ItemStack(Material.valueOf("STAINED_GLASS_PANE"), 1, (short) 7);
} catch (Exception error) {
fillitem = new ItemStack(Material.valueOf("GRAY_STAINED_GLASS_PANE"));
}
ItemMeta fillitemmeta = fillitem.getItemMeta();
fillitemmeta.setDisplayName(Methods.formatText("&r"));
fillitem.setItemMeta(fillitemmeta);
for (int empty = 0; empty < confirmmenu.getSize(); empty++) {
if (confirmmenu.getItem(empty) == null) {
confirmmenu.setItem(empty, fillitem);
}
}
}
UUID uuid = player.getUniqueId();
vouchercache.put(uuid, voucher);
itemcache.put(uuid, item);
player.openInventory(confirmmenu);
}
@EventHandler
public void clickListener(InventoryClickEvent event) {
try {
if (event.getInventory().getType() != InventoryType.CHEST || !event.getInventory().getTitle().equals(instance.getLocale().getMessage("interface.confirmsettings.title"))) {
return;
}
Player player = (Player) event.getWhoClicked();
ItemStack clicked = event.getCurrentItem();
if (clicked == null) return;
event.setCancelled(true);
if (!clicked.getItemMeta().hasDisplayName())
return;
if (clicked.getItemMeta().getDisplayName().equals(instance.getLocale().getMessage("interface.confirmsettings.confirmitemname"))) {
SoundUtils.playSound(player, "LEVEL_UP", 1);
player.closeInventory();
UUID uuid = player.getUniqueId();
Voucher voucher = vouchercache.get(uuid);
ItemStack item = itemcache.get(uuid);
VoucherExecutor.redeemVoucher(player, voucher, item, true);
} else if (clicked.getItemMeta().getDisplayName().equals(instance.getLocale().getMessage("interface.confirmsettings.cancelitemname"))) {
UUID uuid = player.getUniqueId();
vouchercache.remove(uuid);
itemcache.remove(uuid);
SoundUtils.playSound(player, "CLICK", 1);
player.closeInventory();
}
} catch (Exception error) {
Debugger.runReport(error);
}
}
}

View File

@ -1,219 +0,0 @@
package com.songoda.epicvouchers.inventory;
import com.songoda.epicvouchers.EpicVouchers;
import com.songoda.epicvouchers.utils.Debugger;
import com.songoda.epicvouchers.utils.Methods;
import com.songoda.epicvouchers.utils.SoundUtils;
import com.songoda.epicvouchers.voucher.Voucher;
import org.bukkit.Bukkit;
import org.bukkit.Material;
import org.bukkit.enchantments.Enchantment;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.inventory.InventoryClickEvent;
import org.bukkit.event.inventory.InventoryCloseEvent;
import org.bukkit.event.inventory.InventoryType;
import org.bukkit.event.player.AsyncPlayerChatEvent;
import org.bukkit.event.player.PlayerQuitEvent;
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.ItemFlag;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;
import java.util.Collections;
import java.util.HashMap;
import java.util.UUID;
public class VoucherEditor implements Listener {
private HashMap<UUID, Voucher> editor = new HashMap<>();
private HashMap<UUID, String> type = new HashMap<>();
public EpicVouchers instance;
public VoucherEditor(EpicVouchers instance) {
this.instance = instance;
}
public void openMenu(Player player) {
Inventory editormenu = Bukkit.createInventory(null, 27, instance.getLocale().getMessage("interface.editor.title"));
SoundUtils.playSound(player, "NOTE_BASS", 1);
for (Voucher voucher : instance.getVoucherManager().getVouchers()) {
ItemStack item = voucher.toItemStack();
ItemMeta meta = item.getItemMeta();
meta.setDisplayName(meta.getDisplayName() + Methods.formatText(" &b&l[CLICK TO EDIT]"));
item.setItemMeta(meta);
editormenu.setItem(editormenu.firstEmpty(), item);
}
if (instance.getConfig().getBoolean("Interface.Fill Interfaces With Glass")) {
ItemStack fillitem;
try {
fillitem = new ItemStack(Material.valueOf("STAINED_GLASS_PANE"), 1, (short) 7);
} catch (Exception error) {
fillitem = new ItemStack(Material.valueOf("GRAY_STAINED_GLASS_PANE"));
}
ItemMeta fillitemmeta = fillitem.getItemMeta();
fillitemmeta.setDisplayName(Methods.formatText("&r"));
fillitem.setItemMeta(fillitemmeta);
for (int empty = 0; empty < editormenu.getSize(); empty++) {
if (editormenu.getItem(empty) == null) {
editormenu.setItem(empty, fillitem);
}
}
}
player.openInventory(editormenu);
}
private void editVoucher(Player player, Voucher voucher, ItemStack item) {
String title = instance.getLocale().getMessage("interface.editvoucher.title");
title = title.replaceAll("%voucher%", voucher.getKey());
Inventory editormenu = Bukkit.createInventory(null, 27, title);
ItemMeta meta = item.getItemMeta();
meta.setDisplayName(Methods.formatText(voucher.getName(true)));
item.setItemMeta(meta);
editormenu.setItem(13, item);
ItemStack backitem = new ItemStack(Material.BARRIER, 1, (short) 0);
ItemMeta backitemmeta = backitem.getItemMeta();
backitemmeta.setDisplayName(instance.getLocale().getMessage("interface.editvoucher.backtitle"));
backitemmeta.setLore(Collections.singletonList(instance.getLocale().getMessage("interface.editvoucher.backlore")));
backitemmeta.addEnchant(Enchantment.DURABILITY, 1, false);
backitemmeta.addItemFlags(ItemFlag.HIDE_ENCHANTS);
backitem.setItemMeta(backitemmeta);
editormenu.setItem(18, backitem);
ItemStack cloneitem = new ItemStack(Material.FEATHER, 1, (short) 0);
ItemMeta cloneitemmeta = cloneitem.getItemMeta();
cloneitemmeta.setDisplayName(instance.getLocale().getMessage("interface.editvoucher.recivetitle"));
cloneitemmeta.setLore(Collections.singletonList(instance.getLocale().getMessage("interface.editvoucher.recivelore")));
cloneitemmeta.addEnchant(Enchantment.DURABILITY, 1, false);
cloneitemmeta.addItemFlags(ItemFlag.HIDE_ENCHANTS);
cloneitem.setItemMeta(cloneitemmeta);
editormenu.setItem(0, cloneitem);
ItemStack renameitem = new ItemStack(Material.NAME_TAG, 1, (short) 0);
ItemMeta renameitemmeta = renameitem.getItemMeta();
renameitemmeta.setDisplayName(instance.getLocale().getMessage("interface.editvoucher.renametitle"));
renameitemmeta.setLore(Collections.singletonList(instance.getLocale().getMessage("interface.editvoucher.renamelore")));
renameitemmeta.addEnchant(Enchantment.DURABILITY, 1, false);
renameitemmeta.addItemFlags(ItemFlag.HIDE_ENCHANTS);
renameitem.setItemMeta(renameitemmeta);
editormenu.setItem(8, renameitem);
if (instance.getConfig().getBoolean("Interface.Fill Interfaces With Glass")) {
ItemStack fillitem;
try {
fillitem = new ItemStack(Material.valueOf("STAINED_GLASS_PANE"), 1, (short) 7);
} catch (Exception error) {
fillitem = new ItemStack(Material.valueOf("GRAY_STAINED_GLASS_PANE"));
}
ItemMeta fillitemmeta = fillitem.getItemMeta();
fillitemmeta.setDisplayName(Methods.formatText("&r"));
fillitem.setItemMeta(fillitemmeta);
for (int empty = 0; empty < editormenu.getSize(); empty++) {
if (editormenu.getItem(empty) == null) {
editormenu.setItem(empty, fillitem);
}
}
}
player.openInventory(editormenu);
editor.put(player.getUniqueId(), voucher);
}
@EventHandler
public void click2Listener(InventoryClickEvent event) {
try {
if (event.getInventory().getType() != InventoryType.CHEST || !event.getInventory().getTitle().equals(instance.getLocale().getMessage("interface.editor.title"))) {
return;
}
event.setCancelled(true);
for (Voucher voucher : instance.getVoucherManager().getVouchers()) {
ItemStack item = event.getCurrentItem();
//ToDO: this is awful
if (item == null) return;
if (item.getType() != voucher.getMaterial() ||
item.getDurability() != voucher.getData()) {
continue;
}
ItemMeta meta = item.getItemMeta();
if (!meta.hasLore() || !meta.getLore().equals(voucher.getLore(true))) {
continue;
}
Player player = (Player) event.getWhoClicked();
SoundUtils.playSound(player, "NOTE_PIANO", 1);
editVoucher(player, voucher, item);
}
} catch (Exception error) {
Debugger.runReport(error);
}
}
@EventHandler
public void clickListener(InventoryClickEvent event) {
try {
Player player = (Player) event.getWhoClicked();
if (event.getInventory().getType() != InventoryType.CHEST || !editor.containsKey(player.getUniqueId())) {
return;
}
event.setCancelled(true);
ItemStack item = event.getCurrentItem();
if (item == null || !item.hasItemMeta()) return;
ItemMeta meta = item.getItemMeta();
if (!meta.hasDisplayName() || !meta.hasLore()) {
return;
}
if (meta.getDisplayName().equals(instance.getLocale().getMessage("interface.editvoucher.recivetitle"))) {
SoundUtils.playSound(player, "LEVEL_UP", 1);
player.getInventory().addItem(editor.get(player.getUniqueId()).toItemStack());
player.updateInventory();
String message = instance.getLocale().getMessage("interface.editvoucher.recivemessage");
message = message.replaceAll("%voucher%", editor.get(player.getUniqueId()).getName(true));
player.sendMessage(message);
} else if (meta.getDisplayName().equals(instance.getLocale().getMessage("interface.editvoucher.backtitle"))) {
openMenu(player);
} else if (meta.getDisplayName().equals(instance.getLocale().getMessage("interface.editvoucher.renametitle"))) {
SoundUtils.playSound((Player) event.getWhoClicked(), "NOTE_BASS", 1);
Voucher cache = editor.get(event.getWhoClicked().getUniqueId());
event.getWhoClicked().closeInventory();
editor.put(event.getWhoClicked().getUniqueId(), cache);
type.put(event.getWhoClicked().getUniqueId(), "rename");
event.getWhoClicked().sendMessage(instance.getLocale().getMessage("interface.editvoucher.renamemessage"));
}
} catch (Exception error) {
Debugger.runReport(error);
}
}
@EventHandler
public void chatListener(AsyncPlayerChatEvent event) {
if (!editor.containsKey(event.getPlayer().getUniqueId())
|| !type.containsKey(event.getPlayer().getUniqueId())
|| !type.get(event.getPlayer().getUniqueId()).equals("rename")) {
return;
}
type.remove(event.getPlayer().getUniqueId());
Voucher voucher = editor.get(event.getPlayer().getUniqueId());
voucher.setName(event.getMessage());
String message = instance.getLocale().getMessage("interface.editvoucher.renamefinish", event.getMessage());
message = Methods.formatText(message);
event.getPlayer().sendMessage(message);
editVoucher(event.getPlayer(), editor.get(event.getPlayer().getUniqueId()), voucher.toItemStack());
SoundUtils.playSound(event.getPlayer(), "NOTE_PIANO", 1);
event.setCancelled(true);
}
@EventHandler
public void closeListener(InventoryCloseEvent event) {
editor.remove(event.getPlayer().getUniqueId());
}
@EventHandler
public void leaveListener(PlayerQuitEvent event) {
editor.remove(event.getPlayer().getUniqueId());
}
}

View File

@ -1,4 +1,4 @@
package com.songoda.epicvouchers.liberaries;
package com.songoda.epicvouchers.libraries;
import com.songoda.epicvouchers.utils.Debugger;
import org.bukkit.Bukkit;
@ -19,14 +19,14 @@ public class Bountiful {
}
public static Integer getPlayerProtocol(Player player) {
return Integer.valueOf(47);
return 47;
}
public static void sendPacket(Player player, Object packet) {
try {
Object handle = player.getClass().getMethod("getHandle", new Class[0]).invoke(player, new Object[0]);
Object handle = player.getClass().getMethod("getHandle", new Class[0]).invoke(player);
Object playerConnection = handle.getClass().getField("playerConnection").get(handle);
playerConnection.getClass().getMethod("sendPacket", new Class[] { getNMSClass("Packet") }).invoke(playerConnection, new Object[] { packet });
playerConnection.getClass().getMethod("sendPacket", new Class[] { getNMSClass("Packet") }).invoke(playerConnection, packet);
} catch (Exception error) {
Debugger.runReport(error);
}
@ -46,26 +46,26 @@ public class Bountiful {
try {
if (title != null) {
Object field = getNMSClass("PacketPlayOutTitle").getDeclaredClasses()[0].getField("TIMES").get(null);
Object chattitle = getNMSClass("IChatBaseComponent").getDeclaredClasses()[0].getMethod("a", new Class[] { String.class }).invoke(null, new Object[] { "{\"text\":\"" + title + "\"}" });
Constructor<?> subtitleconstructor = getNMSClass("PacketPlayOutTitle").getConstructor(new Class[] { getNMSClass("PacketPlayOutTitle").getDeclaredClasses()[0], getNMSClass("IChatBaseComponent"), Integer.TYPE, Integer.TYPE, Integer.TYPE });
Object titlepacket = subtitleconstructor.newInstance(new Object[] { field, chattitle, fadein, stay, fadeout });
Object chattitle = getNMSClass("IChatBaseComponent").getDeclaredClasses()[0].getMethod("a", new Class[] { String.class }).invoke(null, "{\"text\":\"" + title + "\"}");
Constructor<?> subtitleconstructor = getNMSClass("PacketPlayOutTitle").getConstructor(getNMSClass("PacketPlayOutTitle").getDeclaredClasses()[0], getNMSClass("IChatBaseComponent"), Integer.TYPE, Integer.TYPE, Integer.TYPE);
Object titlepacket = subtitleconstructor.newInstance(field, chattitle, fadein, stay, fadeout);
sendPacket(player, titlepacket);
field = getNMSClass("PacketPlayOutTitle").getDeclaredClasses()[0].getField("TITLE").get(null);
chattitle = getNMSClass("IChatBaseComponent").getDeclaredClasses()[0].getMethod("a", new Class[] { String.class }).invoke(null, new Object[] { "{\"text\":\"" + title + "\"}" });
subtitleconstructor = getNMSClass("PacketPlayOutTitle").getConstructor(new Class[] { getNMSClass("PacketPlayOutTitle").getDeclaredClasses()[0], getNMSClass("IChatBaseComponent") });
titlepacket = subtitleconstructor.newInstance(new Object[] { field, chattitle });
chattitle = getNMSClass("IChatBaseComponent").getDeclaredClasses()[0].getMethod("a", new Class[] { String.class }).invoke(null, "{\"text\":\"" + title + "\"}");
subtitleconstructor = getNMSClass("PacketPlayOutTitle").getConstructor(getNMSClass("PacketPlayOutTitle").getDeclaredClasses()[0], getNMSClass("IChatBaseComponent"));
titlepacket = subtitleconstructor.newInstance(field, chattitle);
sendPacket(player, titlepacket);
}
if (subtitle != null) {
Object field = getNMSClass("PacketPlayOutTitle").getDeclaredClasses()[0].getField("TIMES").get(null);
Object chatsubtitle = getNMSClass("IChatBaseComponent").getDeclaredClasses()[0].getMethod("a", new Class[] { String.class }).invoke(null, new Object[] { "{\"text\":\"" + title + "\"}" });
Constructor<?> subtitleconstructor = getNMSClass("PacketPlayOutTitle").getConstructor(new Class[] { getNMSClass("PacketPlayOutTitle").getDeclaredClasses()[0], getNMSClass("IChatBaseComponent"), Integer.TYPE, Integer.TYPE, Integer.TYPE });
Object subtitlepacket = subtitleconstructor.newInstance(new Object[] { field, chatsubtitle, fadein, stay, fadeout });
Object chatsubtitle = getNMSClass("IChatBaseComponent").getDeclaredClasses()[0].getMethod("a", new Class[] { String.class }).invoke(null, "{\"text\":\"" + title + "\"}");
Constructor<?> subtitleconstructor = getNMSClass("PacketPlayOutTitle").getConstructor(getNMSClass("PacketPlayOutTitle").getDeclaredClasses()[0], getNMSClass("IChatBaseComponent"), Integer.TYPE, Integer.TYPE, Integer.TYPE);
Object subtitlepacket = subtitleconstructor.newInstance(field, chatsubtitle, fadein, stay, fadeout);
sendPacket(player, subtitlepacket);
field = getNMSClass("PacketPlayOutTitle").getDeclaredClasses()[0].getField("SUBTITLE").get(null);
chatsubtitle = getNMSClass("IChatBaseComponent").getDeclaredClasses()[0].getMethod("a", new Class[] { String.class }).invoke(null, new Object[] { "{\"text\":\"" + subtitle + "\"}" });
subtitleconstructor = getNMSClass("PacketPlayOutTitle").getConstructor(new Class[] { getNMSClass("PacketPlayOutTitle").getDeclaredClasses()[0], getNMSClass("IChatBaseComponent"), Integer.TYPE, Integer.TYPE, Integer.TYPE });
subtitlepacket = subtitleconstructor.newInstance(new Object[] { field, chatsubtitle, fadein, stay, fadeout });
chatsubtitle = getNMSClass("IChatBaseComponent").getDeclaredClasses()[0].getMethod("a", new Class[] { String.class }).invoke(null, "{\"text\":\"" + subtitle + "\"}");
subtitleconstructor = getNMSClass("PacketPlayOutTitle").getConstructor(getNMSClass("PacketPlayOutTitle").getDeclaredClasses()[0], getNMSClass("IChatBaseComponent"), Integer.TYPE, Integer.TYPE, Integer.TYPE);
subtitlepacket = subtitleconstructor.newInstance(field, chatsubtitle, fadein, stay, fadeout);
sendPacket(player, subtitlepacket);
}
} catch (Exception error) {
@ -97,14 +97,14 @@ public class Bountiful {
chatmessagetype = object;
}
}
Object object = chatcomponent.getConstructor(new Class[] { String.class }).newInstance(new Object[] { message });
Object customobject = playoutchat.getConstructor(new Class[] { basecomponent, chatmessagetypeclass }).newInstance(new Object[] { object, chatmessagetype });
Method method = craftplayerclass.getDeclaredMethod("getHandle", new Class[0]);
Object invokedmethod = method.invoke(craftplayer, new Object[0]);
Object object = chatcomponent.getConstructor(new Class[] { String.class }).newInstance(message);
Object customobject = playoutchat.getConstructor(new Class[] { basecomponent, chatmessagetypeclass }).newInstance(object, chatmessagetype);
Method method = craftplayerclass.getDeclaredMethod("getHandle");
Object invokedmethod = method.invoke(craftplayer);
Field field = invokedmethod.getClass().getDeclaredField("playerConnection");
Object packetchat = field.get(invokedmethod);
Method methodclass = packetchat.getClass().getDeclaredMethod("sendPacket", new Class[] { simplepacket });
methodclass.invoke(packetchat, new Object[] { customobject });
Method methodclass = packetchat.getClass().getDeclaredMethod("sendPacket", simplepacket);
methodclass.invoke(packetchat, customobject);
} catch (Exception error) {
Debugger.runReport(error);
}
@ -120,21 +120,21 @@ public class Bountiful {
if (oldmethod) {
Class<?> chatserializer = Class.forName("net.minecraft.server." + nmsversion + ".ChatSerializer");
Class<?> basecomponent = Class.forName("net.minecraft.server." + nmsversion + ".IChatBaseComponent");
Method method = chatserializer.getDeclaredMethod("a", new Class[] { String.class });
Object baseinvoke = basecomponent.cast(method.invoke(chatserializer, new Object[] { "{\"text\": \"" + message + "\"}" }));
customobject = playoutchat.getConstructor(new Class[] { basecomponent, Byte.TYPE }).newInstance(new Object[] { baseinvoke, Byte.valueOf((byte) 2) });
Method method = chatserializer.getDeclaredMethod("a", String.class);
Object baseinvoke = basecomponent.cast(method.invoke(chatserializer, "{\"text\": \"" + message + "\"}"));
customobject = playoutchat.getConstructor(new Class[] { basecomponent, Byte.TYPE }).newInstance(baseinvoke, (byte) 2);
} else {
Class<?> componenttext = Class.forName("net.minecraft.server." + nmsversion + ".ChatComponentText");
Class<?> chatbase = Class.forName("net.minecraft.server." + nmsversion + ".IChatBaseComponent");
Object object = componenttext.getConstructor(new Class[] { String.class }).newInstance(new Object[] { message });
customobject = playoutchat.getConstructor(new Class[] { chatbase, Byte.TYPE }).newInstance(new Object[] { object, Byte.valueOf((byte) 2) });
Object object = componenttext.getConstructor(new Class[] { String.class }).newInstance(message);
customobject = playoutchat.getConstructor(new Class[] { chatbase, Byte.TYPE }).newInstance(object, (byte) 2);
}
Method handlemethod = craftplayerclass.getDeclaredMethod("getHandle", new Class[0]);
Object objectinvoked = handlemethod.invoke(craftplayer, new Object[0]);
Method handlemethod = craftplayerclass.getDeclaredMethod("getHandle");
Object objectinvoked = handlemethod.invoke(craftplayer);
Field field = objectinvoked.getClass().getDeclaredField("playerConnection");
Object fieldinvoked = field.get(objectinvoked);
Method methodclass = fieldinvoked.getClass().getDeclaredMethod("sendPacket", new Class[] { simplepacket });
methodclass.invoke(fieldinvoked, new Object[] { customobject });
Method methodclass = fieldinvoked.getClass().getDeclaredMethod("sendPacket", simplepacket);
methodclass.invoke(fieldinvoked, customobject);
} catch (Exception error) {
Debugger.runReport(error);
}

View File

@ -0,0 +1,526 @@
package com.songoda.epicvouchers.libraries;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.inventory.*;
import org.bukkit.event.server.PluginDisableEvent;
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.InventoryHolder;
import org.bukkit.inventory.ItemStack;
import org.bukkit.plugin.Plugin;
import org.bukkit.scheduler.BukkitTask;
import java.util.*;
/**
* A fast API to easily create advanced GUI.
* The project is on <a href="https://github.com/MrMicky-FR/FastInv">GitHub</a>
*
* @author MrMicky
* @version 2.0.3 - Now supports async operations
*/
public class FastInv implements InventoryHolder {
private static Plugin plugin = null;
private boolean cancelTasksOnClose = true;
private Set<FastInvCloseListener> closeListeners = new HashSet<>();
private Set<FastInvClickListener> clickListeners = new HashSet<>();
private Map<Integer, FastInvClickListener> itemListeners = new HashMap<>();
private Set<BukkitTask> tasks = new HashSet<>();
private Inventory inventory;
/**
* Create a new FastInv with a custom size.
*
* @param size The size of the menus.
*/
public FastInv(int size) {
this(size, InventoryType.CHEST.getDefaultTitle());
}
/**
* Create a new FastInv with a custom size and title.
*
* @param size The size of the menus.
* @param title The title (name) of the menus.
*/
public FastInv(int size, String title) {
this(size, InventoryType.CHEST, title);
}
/**
* Create a new FastInv with a custom type.
*
* @param type The type of the menus.
*/
public FastInv(InventoryType type) {
this(type, type.getDefaultTitle());
}
/**
* Create a new FastInv with a custom type and title.
*
* @param type The type of the menus.
* @param title The title of the menus.
* @throws IllegalStateException if FastInv is not init with FastInv.init(Plugin plugin)
*/
public FastInv(InventoryType type, String title) {
this(0, type, title);
}
private FastInv(int size, InventoryType type, String title) {
if (plugin == null) {
throw new IllegalStateException("FastInv is not initialised");
}
runSync(() -> {
if (type == InventoryType.CHEST && size > 0) {
inventory = Bukkit.createInventory(this, size, title);
} else {
inventory = Bukkit.createInventory(this, type, title);
}
});
}
/**
* Register your FastInv instance.
*
* @param plugin The plugin that uses FastInv.
*/
public static void init(Plugin plugin) {
if (FastInv.plugin == null) {
FastInv.plugin = plugin;
Bukkit.getPluginManager().registerEvents(getListener(), plugin);
}
}
/**
* Add an {@link ItemStack} to the menus.
*
* @param item The item to add
* @return This FastInv instance, for chaining.
*/
public FastInv addItem(ItemStack item) {
return addItem(item, null);
}
/**
* Add an {@link ItemStack} to the menus with a {@link FastInvClickListener} to handle clicks.
*
* @param item The item to add.
* @param listener The {@link FastInvClickListener} for the item.
* @return This FastInv instance, for chaining.
*/
public FastInv addItem(ItemStack item, FastInvClickListener listener) {
runSync(() -> {
int slot = inventory.firstEmpty();
if (slot >= 0) {
addItem(slot, item, listener);
}
});
return this;
}
/**
* Add an {@link ItemStack} to the menus on a specific slot.
*
* @param slot The slot of the item.
* @param item The item to add.
* @return This FastInv instance, for chaining.
*/
public FastInv addItem(int slot, ItemStack item) {
return addItem(slot, item, null);
}
/**
* Add an {@link ItemStack} to the menus on specific slot with a {@link FastInvClickListener} to handle clicks.
*
* @param slot The slot of the item.
* @param item The item to add.
* @param listener The FastInvClickListener for the item.
* @return This FastInv instance, for chaining.
*/
public FastInv addItem(int slot, ItemStack item, FastInvClickListener listener) {
runSync(() -> {
inventory.setItem(slot, item);
if (listener != null) {
itemListeners.put(slot, listener);
} else {
itemListeners.remove(slot);
}
});
return this;
}
/**
* Add an {@link ItemStack} to the menus on a range of slots.
*
* @param slotFrom Starting slot to put the item in.
* @param slotTo Ending slot to put the item in.
* @param item The item to add.
* @return This FastInv instance, for chaining.
*/
public FastInv addItem(int slotFrom, int slotTo, ItemStack item) {
return addItem(slotFrom, slotTo, item, null);
}
/**
* Add an {@link ItemStack} to the menus on a range of slots with a {@link FastInvClickListener} to handle clicks.
*
* @param slotFrom Starting slot to put the item in.
* @param slotTo Ending slot to put the item in.
* @param item The item to add.
* @param listener The FastInvClickListener for the item.
* @return This FastInv instance, for chaining.
*/
public FastInv addItem(int slotFrom, int slotTo, ItemStack item, FastInvClickListener listener) {
for (int i = slotFrom; i <= slotTo; i++) {
addItem(i, item, listener);
}
return this;
}
/**
* Add an {@link ItemStack} to the menus on multiple slots.
*
* @param slots The slot of the item.
* @param item The item to add.
* @return This FastInv instance, for chaining.
*/
public FastInv addItem(int[] slots, ItemStack item) {
return addItem(slots, item, null);
}
/**
* Add an {@link ItemStack} to the menus on the edges.
*
* @param item The item to add.
* @return This FastInv instance, for chaining.
*/
public FastInv edge(ItemStack item) {
int height = inventory.getSize() / 9;
addItem(0, 9, item);
addItem(inventory.getSize() - 9, inventory.getSize() - 1, item);
for (int i = 0; i < height; i++) {
addItem(i * 9, item);
addItem(i * 9 + 8, item);
}
return this;
}
/**
* Add an {@link ItemStack} to the menus on multiples slots with a {@link FastInvClickListener} to handle click.
*
* @param slots The slots to place the item.
* @param item The item to add.
* @param listener The FastInvClickListener for the item.
* @return This FastInv instance, for chaining.
*/
public FastInv addItem(int[] slots, ItemStack item, FastInvClickListener listener) {
for (int slot : slots) {
addItem(slot, item, listener);
}
return this;
}
public FastInv fill(ItemStack itemStack) {
runSync(() -> {
for (int i = 0; i < inventory.getSize(); i++) {
if (inventory.getItem(i) == null) {
addItem(i, itemStack);
}
}
});
return this;
}
/**
* Add a {@link FastInvCloseListener} to listen on menus close.
*
* @param listener The {@link FastInvCloseListener} to add.
* @return This FastInv instance, for chaining.
*/
public FastInv onClose(FastInvCloseListener listener) {
closeListeners.add(listener);
return this;
}
/**
* Add a {@link FastInvClickListener} to listen on menus click.
*
* @param listener The {@link FastInvClickListener} to add.
* @return This FastInv instance, for chaining.
*/
public FastInv onClick(FastInvClickListener listener) {
clickListeners.add(listener);
return this;
}
/**
* Schedule a task to run.
*
* @param period Delay between each run.
* @param runnable The {@link Runnable} task to run.
* @return This FastInv instance, for chaining.
*/
public FastInv onUpdate(long period, Runnable runnable) {
return onUpdate(period, period, runnable);
}
/**
* Schedule a task to run with a delay before starting.
*
* @param delay Ticks to wait before starting the task.
* @param period Delay between each run.
* @param runnable The {@link Runnable} task to run.
* @return This FastInv instance, for chaining
*/
public FastInv onUpdate(long delay, long period, Runnable runnable) {
tasks.add(Bukkit.getScheduler().runTaskTimer(plugin, runnable, delay, period));
return this;
}
/**
* Open the menus to a player.
*
* @param player The player to open the menu.
*/
public void open(Player player) {
Bukkit.getScheduler().runTask(plugin, () -> player.openInventory(inventory));
}
/**
* Open the menus to players.
*
* @param players The players to open the menu.
*/
public void open(Player... players) {
Bukkit.getScheduler().runTask(plugin, () -> {
for (Player p : players) {
p.openInventory(inventory);
}
});
}
/**
* Cancel all tasks.
*/
public void cancelTasks() {
tasks.forEach(BukkitTask::cancel);
tasks.clear();
}
/**
* Run a task on the server primary thread.
*
* @param runnable The runnable to run on the main thread
*/
public void runSync(Runnable runnable) {
if (Bukkit.isPrimaryThread()) {
runnable.run();
} else {
Bukkit.getScheduler().runTask(plugin, runnable);
}
}
public interface FastInvClickListener {
void onClick(FastInvClickEvent event);
}
public interface FastInvCloseListener {
void onClose(FastInvCloseEvent event);
}
public static abstract class FastInvEvent {
private Player player;
private FastInv inventory;
private boolean cancelled;
FastInvEvent(Player player, FastInv inventory, boolean cancelled) {
this.player = player;
this.inventory = inventory;
this.cancelled = cancelled;
}
/**
* Get the FastInv menus.
*
* @return This associated FastInv instance.
*/
public FastInv getInventory() {
return inventory;
}
/**
* Get the {@link Player} who clicked.
*
* @return the player who clicked.
*/
public Player getPlayer() {
return player;
}
/**
* Get if the event is cancelled or not.
*
* @return Whether the event was cancelled.
*/
public boolean isCancelled() {
return cancelled;
}
/**
* Set if the event will be cancel or not.
*
* @param cancel Whether the event should be cancelled.
*/
public void setCancelled(boolean cancel) {
this.cancelled = cancel;
}
}
public static class FastInvClickEvent extends FastInvEvent {
private int slot;
private ItemStack item;
private InventoryAction action;
private ClickType clickType;
private FastInvClickEvent(Player player, FastInv inventory, int slot, ItemStack item,
boolean cancelled, InventoryAction action, ClickType clickType) {
super(player, inventory, cancelled);
this.slot = slot;
this.item = item;
this.action = action;
this.clickType = clickType;
}
/**
* Gets the {@link InventoryAction}
*
* @return The action of the event
*/
public InventoryAction getAction() {
return this.action;
}
/**
* Gets the {@link ClickType} of the event.
*
* @return The click type
*/
public ClickType getClickType() {
return this.clickType;
}
/**
* Get the clicked {@link ItemStack}
*
* @return The clicked item
*/
public ItemStack getItem() {
return this.item;
}
/**
* Get the number of the clicked slot
*
* @return The slot number
*/
public int getSlot() {
return this.slot;
}
}
public static class FastInvCloseEvent extends FastInvEvent {
private FastInvCloseEvent(Player player, FastInv inventory, boolean cancelled) {
super(player, inventory, cancelled);
}
}
/**
* Get the Bukkit menus associated with this FastInv instance.
*
* @return The Bukkit {@link Inventory}.
*/
@Override
public Inventory getInventory() {
return inventory;
}
private static Listener getListener() {
return new Listener() {
@EventHandler
public void onClick(InventoryClickEvent event) {
if (event.getInventory().getHolder() instanceof FastInv && event.getWhoClicked() instanceof Player) {
int slot = event.getRawSlot();
FastInv inv = (FastInv) event.getInventory().getHolder();
FastInvClickEvent clickEvent = new FastInvClickEvent((Player) event.getWhoClicked(), inv, slot,
event.getCurrentItem(), true, event.getAction(), event.getClick());
if (inv.itemListeners.containsKey(slot)) {
inv.itemListeners.get(slot).onClick(clickEvent);
}
inv.clickListeners.forEach(listener -> listener.onClick(clickEvent));
if (clickEvent.isCancelled()) {
event.setCancelled(true);
}
}
}
@EventHandler
public void onClose(InventoryCloseEvent event) {
if (event.getInventory().getHolder() instanceof FastInv && event.getPlayer() instanceof Player) {
Player player = (Player) event.getPlayer();
FastInv inv = (FastInv) event.getInventory().getHolder();
FastInvCloseEvent closeEvent = new FastInvCloseEvent(player, inv, false);
inv.closeListeners.forEach(listener -> listener.onClose(closeEvent));
Bukkit.getScheduler().runTask(plugin, () -> {
// Tiny delay to prevent errors.
if (closeEvent.isCancelled() && player.isOnline()) {
player.openInventory(inv.getInventory());
} else if (inv.getInventory().getViewers().isEmpty() && inv.cancelTasksOnClose) {
inv.cancelTasks();
}
});
}
}
@EventHandler
public void onDisable(PluginDisableEvent event) {
if (event.getPlugin().equals(plugin)) {
for (Player player : Bukkit.getOnlinePlayers()) {
if (player.getOpenInventory().getTopInventory().getHolder() instanceof FastInv) {
player.closeInventory();
}
}
}
}
};
}
/**
* Set if the tasks will be cancel on menus close.
*
* @param cancelTasksOnClose Set if the tasks will be cancel
* @return This FastInv instance, for chaining.
*/
public FastInv setCancelTasksOnClose(boolean cancelTasksOnClose) {
this.cancelTasksOnClose = cancelTasksOnClose;
return this;
}
}

View File

@ -0,0 +1,279 @@
package com.songoda.epicvouchers.libraries;
import org.bukkit.Color;
import org.bukkit.DyeColor;
import org.bukkit.Material;
import org.bukkit.block.banner.Pattern;
import org.bukkit.enchantments.Enchantment;
import org.bukkit.inventory.ItemFlag;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.*;
import org.bukkit.potion.PotionEffect;
import org.bukkit.potion.PotionEffectType;
import java.util.*;
/**
* A complete {@link ItemStack} builder for FastInv (only works on 1.8+).
*
* The project is on <a href="https://github.com/MrMicky-FR/FastInv">GitHub</a>
*
* @author MrMicky
*/
public class ItemBuilder {
private final ItemStack item;
private ItemMeta meta;
/*
* Constructors:
*/
public ItemBuilder(Material material) {
this(new ItemStack(material));
}
public ItemBuilder(Material material, int amount) {
this(new ItemStack(material, amount));
}
public ItemBuilder(Material material, byte data) {
this(new ItemStack(material, 1, data));
}
public ItemBuilder(Material material, int amount, byte data) {
this(new ItemStack(material, amount, data));
}
public ItemBuilder(ItemStack item) {
this.item = item;
this.meta = item.getItemMeta();
}
/*
* Meta:
*/
public boolean hasMeta() {
return getMeta() != null;
}
public ItemMeta getMeta() {
return meta;
}
public ItemBuilder meta(ItemMeta meta) {
this.meta = meta;
return this;
}
/*
* Name:
*/
public boolean hasName() {
return meta.hasDisplayName();
}
public String getName() {
return meta.getDisplayName();
}
public ItemBuilder name(String name) {
meta.setDisplayName(name);
return this;
}
/*
* Lore:
*/
public boolean hasLore() {
return meta.hasLore();
}
public List<String> getLore() {
return meta.getLore();
}
public ItemBuilder lore(String... lore) {
return lore(Arrays.asList(lore));
}
public ItemBuilder lore(List<String> lore) {
meta.setLore(lore);
return this;
}
/*
* Enchantments:
*/
public boolean hasEnchants() {
return meta.hasEnchants();
}
public boolean hasEnchant(Enchantment enchantment) {
return meta.hasEnchant(enchantment);
}
public boolean hasConflictingEnchant(Enchantment enchantment) {
return meta.hasConflictingEnchant(enchantment);
}
public Map<Enchantment, Integer> getEnchants() {
return meta.getEnchants();
}
public ItemBuilder enchant(Enchantment enchantment, int level) {
meta.addEnchant(enchantment, level, true);
return this;
}
public ItemBuilder removeEnchant(Enchantment enchantment) {
meta.removeEnchant(enchantment);
return this;
}
/*
* Flags:
*/
public boolean hasFlag(ItemFlag flag) {
return meta.hasItemFlag(flag);
}
public Set<ItemFlag> getFlags() {
return meta.getItemFlags();
}
public ItemBuilder addFlags(ItemFlag... flags) {
meta.addItemFlags(flags);
return this;
}
public ItemBuilder removeFlags(ItemFlag... flags) {
meta.removeItemFlags(flags);
return this;
}
/*
* Unbreakability:
*/
public boolean isUnbreakable() {
return meta.spigot().isUnbreakable();
}
public ItemBuilder unbreakable() {
return unbreakable(true);
}
@SuppressWarnings("deprecation")
public ItemBuilder unbreakable(boolean unbreakable) {
meta.spigot().setUnbreakable(unbreakable);
return this;
}
/*
* ==========================
*
* SPECIFIC META
*
* ==========================
*/
/*
* Banners:
*/
public DyeColor getBannerBaseColor() {
return ((BannerMeta) meta).getBaseColor();
}
public List<Pattern> getBannerPatterns() {
return ((BannerMeta) meta).getPatterns();
}
@SuppressWarnings("deprecation")
public ItemBuilder bannerBaseColor(DyeColor color) {
((BannerMeta) meta).setBaseColor(color);
return this;
}
public ItemBuilder bannerPatterns(List<Pattern> patterns) {
((BannerMeta) meta).setPatterns(patterns);
return this;
}
public ItemBuilder bannerPattern(int i, Pattern pattern) {
((BannerMeta) meta).setPattern(i, pattern);
return this;
}
public ItemBuilder addBannerPatterns(Pattern pattern) {
((BannerMeta) meta).addPattern(pattern);
return this;
}
public ItemBuilder removeBannerPattern(int i) {
((BannerMeta) meta).removePattern(i);
return this;
}
/*
* Leather armor:
*/
public Color getLeatherArmorColor() {
return ((LeatherArmorMeta) meta).getColor();
}
public ItemBuilder leatherArmorColor(Color color) {
((LeatherArmorMeta) meta).setColor(color);
return this;
}
/*
* Skulls:
*/
public boolean hasSkullOwner() {
return ((SkullMeta) meta).hasOwner();
}
@SuppressWarnings("deprecation")
public String getSkullOwner() {
return ((SkullMeta) meta).getOwner();
}
@SuppressWarnings("deprecation")
public ItemBuilder skullOwner(String owner) {
item.setDurability((short) 3);
((SkullMeta) meta).setOwner(owner);
return this;
}
public ItemBuilder durability(int durability) {
item.setDurability((short) durability);
return this;
}
/*
* Potions:
*/
public boolean hasPotionEffect(PotionEffectType type) {
return ((PotionMeta) meta).hasCustomEffect(type);
}
public boolean hasPotionEffects() {
return ((PotionMeta) meta).hasCustomEffects();
}
public List<PotionEffect> getPotionEffects() {
return ((PotionMeta) meta).getCustomEffects();
}
public ItemBuilder addPotionEffect(PotionEffect effect, boolean overwrite) {
((PotionMeta) meta).addCustomEffect(effect, overwrite);
return this;
}
/*
* Build the ItemStack.
*/
public ItemStack build() {
item.setItemMeta(meta);
return item;
}
}

View File

@ -0,0 +1,35 @@
package com.songoda.epicvouchers.listeners;
import com.songoda.epicvouchers.EpicVouchers;
import com.songoda.epicvouchers.menus.EditorMenu;
import com.songoda.epicvouchers.utils.Methods;
import com.songoda.epicvouchers.utils.SoundUtils;
import com.songoda.epicvouchers.voucher.Voucher;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
import org.bukkit.event.player.AsyncPlayerChatEvent;
public class ChatListener implements Listener {
private final EpicVouchers instance;
public ChatListener(EpicVouchers instance) {
this.instance = instance;
}
@EventHandler(ignoreCancelled = true, priority = EventPriority.HIGHEST)
public void onAsyncPlayerChat(AsyncPlayerChatEvent event) {
if(!EditorMenu.getRename().containsKey(event.getPlayer().getUniqueId())) {
return;
}
Voucher voucher = EditorMenu.getRename().remove(event.getPlayer().getUniqueId());
voucher.setName(event.getMessage());
event.getPlayer().sendMessage(Methods.formatText(instance.getLocale().getMessage("interface.editvoucher.renamefinish", event.getMessage())));
new EditorMenu(instance, voucher).open(event.getPlayer());
SoundUtils.playSound(event.getPlayer(), "NOTE_PIANO", 1);
event.setCancelled(true);
}
}

View File

@ -1,4 +1,4 @@
package com.songoda.epicvouchers.handlers;
package com.songoda.epicvouchers.listeners;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
@ -7,9 +7,9 @@ import org.bukkit.event.player.PlayerCommandPreprocessEvent;
import java.util.HashMap;
import java.util.UUID;
public class PreventHacks implements Listener {
public class PlayerCommandListener implements Listener {
private static HashMap<UUID, String> commands = new HashMap<UUID, String>();
private static final HashMap<UUID, String> commands = new HashMap<>();
@EventHandler
public static void preventCommands(PlayerCommandPreprocessEvent event) {
@ -27,5 +27,4 @@ public class PreventHacks implements Listener {
commands.remove(uuid);
}
}

View File

@ -1,6 +1,8 @@
package com.songoda.epicvouchers.voucher;
package com.songoda.epicvouchers.listeners;
import com.songoda.epicvouchers.EpicVouchers;
import com.songoda.epicvouchers.menus.ConfirmMenu;
import com.songoda.epicvouchers.voucher.Voucher;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
@ -11,46 +13,53 @@ import org.bukkit.inventory.meta.ItemMeta;
import java.util.UUID;
public class ClickListener implements Listener {
public class PlayerInteractListener implements Listener {
private final EpicVouchers instance;
public ClickListener(EpicVouchers instance) {
public PlayerInteractListener(EpicVouchers instance) {
this.instance = instance;
}
@EventHandler
public void voucherListener(PlayerInteractEvent event) {
Action action = event.getAction();
if (action != Action.RIGHT_CLICK_AIR && action != Action.RIGHT_CLICK_BLOCK) {
if (event.getAction() != Action.RIGHT_CLICK_AIR && event.getAction() != Action.RIGHT_CLICK_BLOCK) {
return;
}
for (Voucher voucher : instance.getVoucherManager().getVouchers()) {
Player player = event.getPlayer();
if (!player.hasPermission(voucher.getPermission())) {
continue;
}
ItemStack item = event.getPlayer().getItemInHand();
if (item.getType() != voucher.getMaterial() || item.getDurability() != voucher.getData()) {
continue;
}
ItemMeta meta = item.getItemMeta();
if (!meta.hasDisplayName() || !meta.getDisplayName().equals(voucher.getName(true)) || !meta.getLore().equals(voucher.getLore(true))) {
continue;
}
UUID uuid = player.getUniqueId();
if (!instance.getCooldowns().getEntries().containsKey(uuid)) {
if (voucher.isConfirm()) {
EpicVouchers.getInstance().getConfirmation().confirmVoucher(player, voucher, item);
} else {
VoucherExecutor.redeemVoucher(player, voucher, item, true);
}
event.setCancelled(true);
} else {
String message = instance.getLocale().getMessage("event.general.cooldown", String.valueOf(instance.getCooldowns().getEntries().get(uuid) + 1), voucher.getName(true));
player.sendMessage(message);
if (instance.getCooldowns().isOnCoolDown(uuid)) {
player.sendMessage(instance.getLocale().getMessage("event.general.cooldown", instance.getCooldowns().getTime(uuid), voucher.getName(true)));
return;
}
event.setCancelled(true);
if (voucher.isConfirm()) {
new ConfirmMenu(instance, voucher).open(player);
return;
}
instance.getVoucherExecutor().redeemVoucher(player, voucher, item, true);
}
}
}

View File

@ -0,0 +1,48 @@
package com.songoda.epicvouchers.menus;
import com.songoda.epicvouchers.EpicVouchers;
import com.songoda.epicvouchers.libraries.FastInv;
import com.songoda.epicvouchers.libraries.ItemBuilder;
import com.songoda.epicvouchers.utils.ServerVersion;
import com.songoda.epicvouchers.utils.SoundUtils;
import com.songoda.epicvouchers.voucher.Voucher;
import org.bukkit.ChatColor;
import org.bukkit.Material;
import org.bukkit.inventory.ItemStack;
import static org.bukkit.enchantments.Enchantment.DURABILITY;
import static org.bukkit.inventory.ItemFlag.HIDE_ENCHANTS;
public class ConfirmMenu extends FastInv {
public ConfirmMenu(EpicVouchers instance, Voucher voucher) {
super(27, instance.getLocale().getMessage("interface.confirmsettings.title"));
addItem(11, new ItemBuilder(Material.EMERALD)
.name(instance.getLocale().getMessage("interface.confirmsettings.confirmitemname"))
.lore(instance.getLocale().getMessage("interface.confirmsettings.confirmitemlore"))
.enchant(DURABILITY, 1)
.addFlags(HIDE_ENCHANTS)
.build(), event -> {
SoundUtils.playSound(event.getPlayer(), "LEVEL_UP", 1);
event.getPlayer().closeInventory();
instance.getVoucherExecutor().redeemVoucher(event.getPlayer(), voucher, event.getPlayer().getItemInHand(), true);
});
addItem(15, new ItemBuilder(Material.REDSTONE_BLOCK)
.name(instance.getLocale().getMessage("interface.confirmsettings.cancelitemname"))
.lore(instance.getLocale().getMessage("interface.confirmsettings.cancelitemlore"))
.enchant(DURABILITY, 1)
.addFlags(HIDE_ENCHANTS)
.build(), event -> {
SoundUtils.playSound(event.getPlayer(), "CLICK", 1);
event.getPlayer().closeInventory();
});
if (instance.getConfig().getBoolean("Interface.Fill Interfaces With Glass")) {
ItemStack fillItem = instance.getServerVersion().isServerVersionAtLeast(ServerVersion.V1_13) ? new ItemStack(Material.valueOf("GRAY_STAINED_GLASS_PANE")) :
new ItemStack(Material.valueOf("STAINED_GLASS_PANE"), 1, (short) 7);
fill(new ItemBuilder(fillItem).name(ChatColor.RESET.toString()).build());
}
}
}

View File

@ -0,0 +1,74 @@
package com.songoda.epicvouchers.menus;
import com.songoda.epicvouchers.EpicVouchers;
import com.songoda.epicvouchers.libraries.FastInv;
import com.songoda.epicvouchers.libraries.ItemBuilder;
import com.songoda.epicvouchers.utils.Methods;
import com.songoda.epicvouchers.utils.ServerVersion;
import com.songoda.epicvouchers.utils.SoundUtils;
import com.songoda.epicvouchers.voucher.Voucher;
import org.bukkit.ChatColor;
import org.bukkit.Material;
import org.bukkit.inventory.ItemStack;
import java.util.Collections;
import java.util.HashMap;
import java.util.UUID;
import static org.bukkit.Material.NAME_TAG;
import static org.bukkit.enchantments.Enchantment.DURABILITY;
import static org.bukkit.inventory.ItemFlag.HIDE_ENCHANTS;
public class EditorMenu extends FastInv {
private static final HashMap<UUID, Voucher> rename = new HashMap<>();
public EditorMenu(EpicVouchers instance, Voucher voucher) {
super(27, instance.getLocale().getMessage("interface.editvoucher.title").replaceAll("%voucher%", voucher.getKey()));
addItem(13, new ItemBuilder(voucher.toItemStack()).name(Methods.formatText(voucher.getName(true))).build());
addItem(18, new ItemBuilder(Material.BARRIER)
.name(instance.getLocale().getMessage("interface.editvoucher.backtitle"))
.lore(Collections.singletonList(instance.getLocale().getMessage("interface.editvoucher.backlore")))
.enchant(DURABILITY, 1)
.addFlags(HIDE_ENCHANTS)
.build(), event -> new VoucherMenu(instance).open(event.getPlayer()));
addItem(0, new ItemBuilder(Material.FEATHER)
.name(instance.getLocale().getMessage("interface.editvoucher.recivetitle"))
.lore(Collections.singletonList(instance.getLocale().getMessage("interface.editvoucher.recivelore")))
.enchant(DURABILITY, 1)
.addFlags(HIDE_ENCHANTS)
.build(), event -> {
SoundUtils.playSound(event.getPlayer(), "LEVEL_UP", 1);
event.getPlayer().getInventory().addItem(voucher.toItemStack());
String message = instance.getLocale().getMessage("interface.editvoucher.recivemessage").replaceAll("%voucher%", voucher.getName(true));
event.getPlayer().sendMessage(message);
});
addItem(8, new ItemBuilder(NAME_TAG)
.name(instance.getLocale().getMessage("interface.editvoucher.renametitle"))
.lore(Collections.singletonList(instance.getLocale().getMessage("interface.editvoucher.renamelore")))
.enchant(DURABILITY, 1)
.addFlags(HIDE_ENCHANTS)
.build(), event -> {
SoundUtils.playSound(event.getPlayer(), "NOTE_BASS", 1);
event.getPlayer().closeInventory();
rename.put(event.getPlayer().getUniqueId(), voucher);
event.getPlayer().sendMessage(instance.getLocale().getMessage("interface.editvoucher.renamemessage"));
});
if (instance.getConfig().getBoolean("Interface.Fill Interfaces With Glass")) {
ItemStack fillItem = instance.getServerVersion().isServerVersionAtLeast(ServerVersion.V1_13) ? new ItemStack(Material.valueOf("GRAY_STAINED_GLASS_PANE")) :
new ItemStack(Material.valueOf("STAINED_GLASS_PANE"), 1, (short) 7);
fill(new ItemBuilder(fillItem).name(ChatColor.RESET.toString()).build());
}
}
public static HashMap<UUID, Voucher> getRename() {
return rename;
}
}

View File

@ -0,0 +1,40 @@
package com.songoda.epicvouchers.menus;
import com.songoda.epicvouchers.EpicVouchers;
import com.songoda.epicvouchers.libraries.FastInv;
import com.songoda.epicvouchers.libraries.ItemBuilder;
import com.songoda.epicvouchers.utils.Methods;
import com.songoda.epicvouchers.utils.ServerVersion;
import com.songoda.epicvouchers.utils.SoundUtils;
import com.songoda.epicvouchers.voucher.Voucher;
import org.bukkit.ChatColor;
import org.bukkit.Material;
import org.bukkit.inventory.ItemStack;
public class VoucherMenu extends FastInv {
public VoucherMenu(EpicVouchers instance) {
super(Math.ceil(instance.getVoucherManager().getVouchers().size() / 9.0) > 81 ? 81 : (int) Math.ceil(instance.getVoucherManager().getVouchers().size() / 9.0) * 9,
instance.getLocale().getMessage("interface.editor.title"));
for (Voucher voucher : instance.getVoucherManager().getVouchers()) {
ItemBuilder item = new ItemBuilder(voucher.toItemStack());
item.name(item.getName() + Methods.formatText(" &b&l[CLICK TO EDIT]"));
if (getInventory().firstEmpty() != -1) {
addItem(getInventory().firstEmpty(), item.build(), event -> {
SoundUtils.playSound(event.getPlayer(), "NOTE_PIANO", 1);
new EditorMenu(instance, voucher).open(event.getPlayer());
});
}
}
if (instance.getConfig().getBoolean("Interface.Fill Interfaces With Glass")) {
ItemStack fillItem = instance.getServerVersion().isServerVersionAtLeast(ServerVersion.V1_13) ? new ItemStack(Material.valueOf("GRAY_STAINED_GLASS_PANE")) :
new ItemStack(Material.valueOf("STAINED_GLASS_PANE"), 1, (short) 7);
fill(new ItemBuilder(fillItem).name(ChatColor.RESET.toString()).build());
}
}
}

View File

@ -6,7 +6,11 @@ import com.songoda.epicvouchers.EpicVouchers;
* Created by songoda on 3/21/2017.
*/
public class Debugger {
private static EpicVouchers instance;
public static void init(EpicVouchers plugin) {
instance = plugin;
}
public static void runReport(Exception e) {
if (isDebug()) {
@ -24,8 +28,7 @@ public class Debugger {
}
public static boolean isDebug() {
EpicVouchers plugin = EpicVouchers.getInstance();
return plugin.getConfig().getBoolean("System.Debugger Enabled");
return instance.getConfig().getBoolean("System.Debugger Enabled");
}
}

View File

@ -1,5 +1,7 @@
package com.songoda.epicvouchers.utils;
import org.apache.commons.lang.ArrayUtils;
public enum ServerVersion {
UNKNOWN("unknown_server_version"),
@ -14,7 +16,7 @@ public enum ServerVersion {
private final String packagePrefix;
private ServerVersion(String packagePrefix) {
ServerVersion(String packagePrefix) {
this.packagePrefix = packagePrefix;
}
@ -23,4 +25,16 @@ public enum ServerVersion {
if (packageName.startsWith(version.packagePrefix)) return version;
return ServerVersion.UNKNOWN;
}
}
public boolean isServerVersion(ServerVersion version) {
return this == version;
}
public boolean isServerVersion(ServerVersion... versions) {
return ArrayUtils.contains(versions, this);
}
public boolean isServerVersionAtLeast(ServerVersion version) {
return this.ordinal() >= version.ordinal();
}
}

View File

@ -35,8 +35,8 @@ public class SettingsManager implements Listener {
DEBUGGER_ENABLED("System.Debugger Enabled", false);
private String setting;
private Object option;
private final String setting;
private final Object option;
settings(String setting, Object option) {
this.setting = setting;

View File

@ -200,7 +200,7 @@ public enum SoundUtils {
VILLAGER_NO("VILLAGER_NO", "ENTITY_VILLAGER_NO"),
VILLAGER_YES("VILLAGER_YES", "ENTITY_VILLAGER_YES");
private String[] versionname;
private final String[] versionname;
private Sound cached = null;
SoundUtils(String... versionname) {
@ -213,7 +213,7 @@ public enum SoundUtils {
for (String name : versionname) {
try {
return cached = Sound.valueOf(name);
} catch (Exception error) {
} catch (Exception ignore) {
}
}
System.out.println(Methods.formatText("&cFailed to find the sound enum called " + cached + "."));

View File

@ -0,0 +1,50 @@
package com.songoda.epicvouchers.voucher;
import com.songoda.epicvouchers.EpicVouchers;
import org.bukkit.Bukkit;
import java.util.HashMap;
import java.util.UUID;
public class CoolDownManager {
private final HashMap<UUID, Long> entries = new HashMap<>();
private final EpicVouchers instance;
public CoolDownManager(EpicVouchers instance) {
this.instance = instance;
}
void addCooldown(final UUID uuid, Voucher voucher) {
if (Bukkit.getPlayer(uuid).hasPermission("epicvouchers.bypass")) {
return;
}
if (voucher.getCooldown() != 0) {
entries.put(uuid, System.currentTimeMillis() + voucher.getCooldown() * 1000);
} else {
entries.put(uuid, System.currentTimeMillis() + instance.getConfig().getInt("Main.Cooldown Delay") * 1000);
}
}
public boolean isOnCoolDown(UUID uuid) {
if(!entries.containsKey(uuid)) {
return false;
}
if(entries.get(uuid) >= System.currentTimeMillis()) {
return true;
}
entries.remove(uuid);
return false;
}
public long getTime(UUID uuid) {
if(!entries.containsKey(uuid)) {
return 0L;
}
return (entries.get(uuid) - System.currentTimeMillis()) / 1000;
}
}

View File

@ -1,45 +0,0 @@
package com.songoda.epicvouchers.voucher;
import com.songoda.epicvouchers.EpicVouchers;
import com.songoda.epicvouchers.utils.Debugger;
import com.songoda.epicvouchers.utils.Methods;
import org.bukkit.Bukkit;
import org.bukkit.scheduler.BukkitRunnable;
import java.util.HashMap;
import java.util.UUID;
public class Cooldowns {
private HashMap<UUID, Integer> entries = new HashMap<UUID, Integer>();
void addCooldown(final UUID uuid, Voucher voucher) {
try {
if (Bukkit.getPlayer(uuid).hasPermission("epicvouchers.bypass")) {
return;
}
if (voucher.getCooldown() != 0) {
entries.put(uuid, voucher.getCooldown());
} else {
entries.put(uuid, EpicVouchers.getInstance().getConfig().getInt("Main.Cooldown Delay"));
}
new BukkitRunnable() {
public void run() {
if (entries.get(uuid) <= 0 && entries.containsKey(uuid)) {
entries.remove(uuid);
cancel();
} else {
entries.put(uuid, entries.get(uuid) - 1);
}
}
}.runTaskTimer(EpicVouchers.getInstance(), 0, 20);
} catch (Exception error) {
System.out.println(Methods.formatText("&cFailed to add cooldown to the UUID " + uuid + "."));
Debugger.runReport(error);
}
}
HashMap<UUID, Integer> getEntries() {
return new HashMap<>(entries);
}
}

View File

@ -1,6 +1,8 @@
package com.songoda.epicvouchers.voucher;
import com.songoda.epicvouchers.utils.Methods;
import lombok.Getter;
import lombok.Setter;
import org.bukkit.Material;
import org.bukkit.enchantments.Enchantment;
import org.bukkit.inventory.ItemFlag;
@ -12,43 +14,43 @@ import java.util.List;
public class Voucher {
private final String key;
private String permission;
private Material material = Material.COOKIE;
private short data = 0;
private int cooldown = 0;
private String name;
private List<String> lore = new ArrayList();
private boolean glow = true;
private boolean confirm = true;
private boolean unbreakable = true;
private boolean hideAttributes = false;
private boolean removeItem = true;
private boolean feedPlayer = true;
private boolean healPlayer = true;
private boolean smiteEffect = true;
@Getter private final String key;
@Getter @Setter private String permission;
@Getter @Setter private Material material = Material.COOKIE;
@Getter @Setter private short data = 0;
@Getter @Setter private int cooldown = 0;
@Setter private String name;
@Setter private List<String> lore = new ArrayList<>();
@Getter @Setter private boolean glow = true;
@Getter @Setter private boolean confirm = true;
@Getter @Setter private boolean unbreakable = true;
@Getter @Setter private boolean hideAttributes = false;
@Getter @Setter private boolean removeItem = true;
@Getter @Setter private boolean feedPlayer = true;
@Getter @Setter private boolean healPlayer = true;
@Getter @Setter private boolean smiteEffect = true;
private List<String> broadcasts = new ArrayList();
private List<String> messages = new ArrayList<>();
private List<String> commands = new ArrayList<>();
@Setter private List<String> broadcasts = new ArrayList<>();
@Setter private List<String> messages = new ArrayList<>();
@Setter @Getter private List<String> commands = new ArrayList<>();
private String actionBar;
@Setter private String actionBar;
private String title = "&6Thank you.";
private String subTitle = "&eYou have redeemed the voucher %voucher%.";
private int titleFadeIn = 10;
private int titleStay = 50;
private int titleFadeOut = 10;
@Setter private String title = "&6Thank you.";
@Setter private String subTitle = "&eYou have redeemed the voucher %voucher%.";
@Getter @Setter private int titleFadeIn = 10;
@Getter @Setter private int titleStay = 50;
@Getter @Setter private int titleFadeOut = 10;
private String sound = "NOTE_PLING";
private int soundPitch = 1;
@Getter @Setter private String sound = "NOTE_PLING";
@Getter @Setter private int soundPitch = 1;
private String particle = "FLAME";
private int particleAmount = 100;
@Getter @Setter private String particle = "FLAME";
@Getter @Setter private int particleAmount = 100;
private String effect = "SPEED";
private int effectAmplifer = 2;
private int effectDuration = 10;
@Getter @Setter private String effect = "SPEED";
@Getter @Setter private int effectAmplifer = 2;
@Getter @Setter private int effectDuration = 10;
public Voucher(String key) {
this.key = key;
@ -80,43 +82,11 @@ public class Voucher {
return item;
}
public String getKey() {
return key;
}
public String getPermission() {
return permission;
}
public void setPermission(String permission) {
this.permission = permission;
}
public Material getMaterial() {
return material;
}
public void setMaterial(Material material) {
this.material = material;
}
public short getData() {
return data;
}
public void setData(short data) {
this.data = data;
}
public String getName(boolean applyFormatting) {
if (!applyFormatting) return name;
return Methods.formatText(name);
}
public void setName(String name) {
this.name = name;
}
public List<String> getLore(boolean applyFormatting) {
if (!applyFormatting) return lore;
List<String> itemLore = new ArrayList<>();
@ -126,74 +96,6 @@ public class Voucher {
return itemLore;
}
public void setLore(List<String> lore) {
this.lore = lore;
}
public boolean isGlow() {
return glow;
}
public void setGlow(boolean glow) {
this.glow = glow;
}
public boolean isConfirm() {
return confirm;
}
public void setConfirm(boolean confirm) {
this.confirm = confirm;
}
public boolean isUnbreakable() {
return unbreakable;
}
public void setUnbreakable(boolean unbreakable) {
this.unbreakable = unbreakable;
}
public boolean isHideAttributes() {
return hideAttributes;
}
public void setHideAttributes(boolean hideAttributes) {
this.hideAttributes = hideAttributes;
}
public boolean isRemoveItem() {
return removeItem;
}
public void setRemoveItem(boolean removeItem) {
this.removeItem = removeItem;
}
public boolean isFeedPlayer() {
return feedPlayer;
}
public void setFeedPlayer(boolean feedPlayer) {
this.feedPlayer = feedPlayer;
}
public boolean isHealPlayer() {
return healPlayer;
}
public void setHealPlayer(boolean healPlayer) {
this.healPlayer = healPlayer;
}
public boolean isSmiteEffect() {
return smiteEffect;
}
public void setSmiteEffect(boolean smiteEffect) {
this.smiteEffect = smiteEffect;
}
public List<String> getBroadcasts(boolean applyFormatting) {
if (!applyFormatting) return broadcasts;
List<String> itemBroadcasts = new ArrayList<>();
@ -203,18 +105,6 @@ public class Voucher {
return itemBroadcasts;
}
public void setBroadcasts(List<String> broadcasts) {
this.broadcasts = broadcasts;
}
public int getCooldown() {
return cooldown;
}
public void setCooldown(int cooldown) {
this.cooldown = cooldown;
}
public List<String> getMessages(boolean applyFormatting) {
if (!applyFormatting) return messages;
List<String> itemMessages = new ArrayList<>();
@ -224,125 +114,21 @@ public class Voucher {
return itemMessages;
}
public void setMessages(List<String> messages) {
this.messages = messages;
}
public List<String> getCommands() {
return commands;
}
public void setCommands(List<String> commands) {
this.commands = commands;
@Override
public String toString() {
return key;
}
public String getActionBar() {
return Methods.formatText(actionBar);
}
public void setActionBar(String actionBar) {
this.actionBar = actionBar;
public String getSubTitle() {
return Methods.formatText(subTitle);
}
public String getTitle() {
return Methods.formatText(title);
}
public void setTitle(String title) {
this.title = title;
}
public String getSubTitle() {
return Methods.formatText(subTitle);
}
public void setSubTitle(String subTitle) {
this.subTitle = subTitle;
}
public int getTitleFadeIn() {
return titleFadeIn;
}
public void setTitleFadeIn(int titleFadeIn) {
this.titleFadeIn = titleFadeIn;
}
public int getTitleStay() {
return titleStay;
}
public void setTitleStay(int titleStay) {
this.titleStay = titleStay;
}
public int getTitleFadeOut() {
return titleFadeOut;
}
public void setTitleFadeOut(int titleFadeOut) {
this.titleFadeOut = titleFadeOut;
}
public String getSound() {
return sound;
}
public void setSound(String sound) {
this.sound = sound;
}
public int getSoundPitch() {
return soundPitch;
}
public void setSoundPitch(int soundPitch) {
this.soundPitch = soundPitch;
}
public String getParticle() {
return particle;
}
public void setParticle(String particle) {
this.particle = particle;
}
public int getParticleAmount() {
return particleAmount;
}
public void setParticleAmount(int particleAmount) {
this.particleAmount = particleAmount;
}
public String getEffect() {
return effect;
}
public void setEffect(String effect) {
this.effect = effect;
}
public int getEffectAmplifer() {
return effectAmplifer;
}
public void setEffectAmplifer(int effectAmplifer) {
this.effectAmplifer = effectAmplifer;
}
public int getEffectDuration() {
return effectDuration;
}
public void setEffectDuration(int effectDuration) {
this.effectDuration = effectDuration;
}
@Override
public String toString() {
return key;
}
}

View File

@ -2,9 +2,8 @@ package com.songoda.epicvouchers.voucher;
import com.songoda.epicvouchers.EpicVouchers;
import com.songoda.epicvouchers.events.VoucherRedeemEvent;
import com.songoda.epicvouchers.handlers.PreventHacks;
import com.songoda.epicvouchers.liberaries.Bountiful;
import com.songoda.epicvouchers.utils.Debugger;
import com.songoda.epicvouchers.libraries.Bountiful;
import com.songoda.epicvouchers.listeners.PlayerCommandListener;
import com.songoda.epicvouchers.utils.Methods;
import com.songoda.epicvouchers.utils.SoundUtils;
import org.bukkit.Bukkit;
@ -15,20 +14,30 @@ import org.bukkit.inventory.ItemStack;
import org.bukkit.potion.PotionEffect;
import org.bukkit.potion.PotionEffectType;
public class VoucherExecutor {
import java.util.logging.Level;
public static void redeemVoucher(Player player, Voucher voucher, ItemStack item, boolean manual) {
EpicVouchers instance = EpicVouchers.getInstance();
public class VoucherExecutor {
private final EpicVouchers instance;
public VoucherExecutor(EpicVouchers instance) {
this.instance = instance;
}
public void redeemVoucher(Player player, Voucher voucher, ItemStack item, boolean manual) {
try {
VoucherRedeemEvent event = new VoucherRedeemEvent(player, voucher.getName(true), item, manual);
Bukkit.getServer().getPluginManager().callEvent(event);
if (event.isCancelled()) {
return;
}
boolean duplication = false;
if (!player.getItemInHand().isSimilar(item)) {
duplication = true;
}
if (!duplication) {
if (manual) {
instance.getCooldowns().addCooldown(player.getUniqueId(), voucher);
@ -43,16 +52,21 @@ public class VoucherExecutor {
player.updateInventory();
}
}
if (voucher.isFeedPlayer()) {
player.setFoodLevel(20);
}
if (voucher.isHealPlayer()) {
player.setHealth(player.getMaxHealth());
}
if (voucher.isSmiteEffect()) {
player.getWorld().strikeLightningEffect(player.getLocation());
}
String name = player.getName();
for (String broadcast : voucher.getBroadcasts(true)) {
broadcast = broadcast.replaceAll("%player%", name);
broadcast = broadcast.replaceAll("%voucher%", voucher.getName(true));
@ -60,74 +74,82 @@ public class VoucherExecutor {
everyone.sendMessage(broadcast);
}
}
for (String message : voucher.getMessages(true)) {
message = message.replaceAll("%player%", name);
message = message.replaceAll("%voucher%", voucher.getName(true));
player.sendMessage(message);
}
for (String command : voucher.getCommands()) {
command = command.replaceAll("%player%", name);
command = command.replaceAll("%voucher%", voucher.getName(false));
command = command.replaceAll("%player%", name).replaceAll("%voucher%", voucher.getName(false));
if (command.startsWith("[player]")) {
command = command.replace("[player]", "");
player.performCommand(command);
} else if (command.startsWith("[op]")) {
command = command.replace("[op]", "");
boolean wasop = player.isOp();
PreventHacks.addCommand(player.getUniqueId(), command);
boolean wasOp = player.isOp();
PlayerCommandListener.addCommand(player.getUniqueId(), command);
player.setOp(true);
player.performCommand(command);
if (!wasop) {
if (!wasOp) {
player.setOp(false);
}
PreventHacks.removeCommand(player.getUniqueId());
PlayerCommandListener.removeCommand(player.getUniqueId());
} else if (command.startsWith("[chat]")) {
command = command.replace("[chat]", "");
player.chat(command);
} else if (command.startsWith("[delay]")) {
command = command.replace("[delay]", "");
//command = command.replace("[delay]", "");
throw new UnsupportedOperationException("delay is not supported yet");
} else {
Bukkit.getServer().dispatchCommand(Bukkit.getConsoleSender(), command);
}
}
String actionbar = voucher.getActionBar();
actionbar = actionbar.replaceAll("%player%", name);
actionbar = actionbar.replaceAll("%voucher%", voucher.getName(true));
String actionbar = voucher.getActionBar().replaceAll("%player%", name).replaceAll("%voucher%", voucher.getName(true));
Bountiful.sendActionBar(player, actionbar);
String title = voucher.getTitle();
title = title.replaceAll("%player%", name);
title = title.replaceAll("%voucher%", voucher.getName(true));
String subtitle = voucher.getSubTitle();
subtitle = subtitle.replaceAll("%player%", name);
subtitle = subtitle.replaceAll("%voucher%", voucher.getName(true));
String title = voucher.getTitle().replaceAll("%player%", name).replaceAll("%voucher%", voucher.getName(true));
String subtitle = voucher.getSubTitle().replaceAll("%player%", name).replaceAll("%voucher%", voucher.getName(true));
int fadein = voucher.getTitleFadeIn();
int stay = voucher.getTitleStay();
int fadeout = voucher.getTitleFadeOut();
Bountiful.sendTitle(player, fadein, stay, fadeout, title, subtitle);
String sound = voucher.getSound();
int pitch = voucher.getSoundPitch();
SoundUtils.playSound(player, sound, pitch);
String particle = voucher.getParticle();
if (particle != null && !particle.isEmpty()) {
int amount = voucher.getParticleAmount();
player.getWorld().playEffect(player.getLocation(), Effect.valueOf(particle), amount);
}
String effect = voucher.getEffect();
if (!effect.isEmpty()) {
int amplifier = voucher.getEffectAmplifer();
int duration = voucher.getEffectDuration() * 20;
player.addPotionEffect(new PotionEffect(PotionEffectType.getByName(effect), duration, amplifier));
}
System.out.println(Methods.formatText("&f" + player.getName() + " has successfully redeemed the voucher " + voucher.getKey() + "."));
instance.getLogger().log(Level.INFO, Methods.formatText("&f" + player.getName() + " has successfully redeemed the voucher " + voucher.getKey() + "."));
instance.getConnections().saveRedeem(player, voucher.getName(true));
} else {
System.out.println(Methods.formatText("&c" + player.getName() + " has failed to duplicate the voucher " + voucher.getKey() + "."));
instance.getLogger().log(Level.WARNING, Methods.formatText("&c" + player.getName() + " has failed to duplicate the voucher " + voucher.getKey() + "."));
}
} catch (Exception error) {
System.out.println(Methods.formatText("&cFailed to redeem the voucher " + voucher.getKey() + " for the player " + player.getName() + "."));
Debugger.runReport(error);
error.printStackTrace();
instance.getLogger().log(Level.SEVERE, Methods.formatText("&cFailed to redeem the voucher " + voucher.getKey() + " for the player " + player.getName() + "."));
// Debugger.runReport(error);
}
}

View File

@ -1,20 +1,13 @@
package com.songoda.epicvouchers.voucher;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.*;
public class VoucherManager {
private final Map<String, Voucher> registeredVouchers = new HashMap<>();
public Voucher addVoucher(String name, Voucher voucher) {
return registeredVouchers.put(name, voucher);
}
public Voucher removeVoucher(Voucher voucher) {
return registeredVouchers.remove(voucher);
public void addVoucher(String name, Voucher voucher) {
registeredVouchers.put(name, voucher);
}
public Voucher getVoucher(String name) {

View File

@ -1,39 +1,39 @@
#General Messages
general.nametag.prefix = "&8[&6EpicVouchers&8]"
general.nametag.prefix= "&8[&6EpicVouchers&8]"
#Interface Messages
interface.confirmsettings.title = "&6Confirmation"
interface.confirmsettings.confirmitemname = "&2&lREDEEM"
interface.confirmsettings.confirmitemlore = "&aClick here if you want to confirm your redeem."
interface.confirmsettings.cancelitemname = "&4&lCANCEL"
interface.confirmsettings.cancelitemlore = "&cClick here if you want to cancel your redeem."
interface.editor.title = "&6Editor"
interface.editvoucher.title = "&6Editor [&e%voucher%&6]";
interface.editvoucher.backtitle = "&4Return";
interface.editvoucher.backlore = "&cReturn to the main menu of the editor."
interface.editvoucher.recivetitle = "&2Receive"
interface.editvoucher.recivelore = "&aReceive a clone item of this voucher."
interface.editvoucher.recivemessage = "&7You have received the voucher &6%voucher%&7."
interface.editvoucher.renametitle = "&6Rename"
interface.editvoucher.renamelore = "&eRename the display name of the voucher."
interface.editvoucher.renamemessage = "&7Please enter the name that this voucher should be renamed to."
interface.editvoucher.renamefinish = "&7Successfully renamed the voucher to &r%renamed%&7."
interface.confirmsettings.title= "&6Confirmation"
interface.confirmsettings.confirmitemname= "&2&lREDEEM"
interface.confirmsettings.confirmitemlore= "&aClick here if you want to confirm your redeem."
interface.confirmsettings.cancelitemname= "&4&lCANCEL"
interface.confirmsettings.cancelitemlore= "&cClick here if you want to cancel your redeem."
interface.editor.title= "&6Editor"
interface.editvoucher.title= "&6Editor [&e%voucher%&6]";
interface.editvoucher.backtitle= "&4Return";
interface.editvoucher.backlore= "&cReturn to the main menu of the editor."
interface.editvoucher.recivetitle= "&2Receive"
interface.editvoucher.recivelore= "&aReceive a clone item of this voucher."
interface.editvoucher.recivemessage= "&7You have received the voucher &6%voucher%&7."
interface.editvoucher.renametitle= "&6Rename"
interface.editvoucher.renamelore= "&eRename the display name of the voucher."
interface.editvoucher.renamemessage= "&7Please enter the name that this voucher should be renamed to."
interface.editvoucher.renamefinish= "&7Successfully renamed the voucher to &r%renamed%&7."
#Command Messages
command.error.noplayer = "&7That user either does not exist or is not online";
command.error.novoucher = "&cThat voucher does not exist.";
command.error.notexist = "&7The command you entered does not exist or is spelt incorrectly."
command.error.notnumber = "&7Failed to parse that number into a valid amount."
command.reload.success = "&7Config Reloaded"
command.give.send = "&7You have received the voucher &6%voucher% &7(&6x%amount%&7)."
command.give.receive = "&7You have given &6%player% &7the voucher &6%voucher% &7(&6x%amount%&7)."
command.force.send = "&7You have forced &6%player% &7to redeem the voucher &6%voucher% &7(&6x%amount%&7).";
command.list.list = "&7List of all vouchers: &6%list%&7."
command.error.noplayer= "&7That user either does not exist or is not online";
command.error.novoucher= "&cThat voucher does not exist.";
command.error.notexist= "&7The command you entered does not exist or is spelt incorrectly."
command.error.notnumber= "&7Failed to parse that number into a valid amount."
command.reload.success= "&7Config Reloaded"
command.give.send= "&7You have received the voucher &6%voucher% &7(&6x%amount%&7)."
command.give.receive= "&7You have given &6%player% &7the voucher &6%voucher% &7(&6x%amount%&7)."
command.force.send= "&7You have forced &6%player% &7to redeem the voucher &6%voucher% &7(&6x%amount%&7).";
command.list.list= "&7List of all vouchers: &6%list%&7."
#Event Messages
event.general.nopermission = "&cYou do not have permission to do that."
event.general.cooldown = "&7Please wait &6%time%&7 seconds before redeeming a new voucher."
event.general.nopermission= "&cYou do not have permission to do that."
event.general.cooldown= "&7Please wait &6%time%&7 seconds before redeeming a new voucher."