From 48ec58b1a714ac426f88ce337cfee9dafdf3462e Mon Sep 17 00:00:00 2001 From: CoderMarido Date: Tue, 11 Sep 2018 20:23:02 +0200 Subject: [PATCH] Uploaded the source-code of DeluxeVouchers to the repository. --- .gitignore | 4 + README.md | 66 ++++ src/config.yml | 92 +++++ src/messages.yml | 43 +++ src/mysql.yml | 7 + .../marido/deluxevouchers/DeluxeVouchers.java | 69 ++++ .../events/ForceRedeemEvent.java | 55 +++ .../events/VoucherReceiveEvent.java | 62 ++++ .../events/VoucherRedeemEvent.java | 55 +++ .../deluxevouchers/handlers/Commandos.java | 220 ++++++++++++ .../deluxevouchers/handlers/Connections.java | 71 ++++ .../deluxevouchers/handlers/DataHandler.java | 338 ++++++++++++++++++ .../deluxevouchers/handlers/SoundHandler.java | 238 ++++++++++++ .../handlers/UpdateHandler.java | 59 +++ .../inventory/Confirmation.java | 123 +++++++ .../inventory/VoucherEditor.java | 334 +++++++++++++++++ .../deluxevouchers/liberaries/Bountiful.java | 154 ++++++++ .../vouchers/ClickListener.java | 60 ++++ .../deluxevouchers/vouchers/Cooldowns.java | 44 +++ .../vouchers/VoucherBuilder.java | 52 +++ .../vouchers/VoucherExecutor.java | 135 +++++++ src/plugin.yml | 10 + src/vouchers.yml | 52 +++ 23 files changed, 2343 insertions(+) create mode 100644 .gitignore create mode 100644 README.md create mode 100644 src/config.yml create mode 100644 src/messages.yml create mode 100644 src/mysql.yml create mode 100644 src/nl/marido/deluxevouchers/DeluxeVouchers.java create mode 100644 src/nl/marido/deluxevouchers/events/ForceRedeemEvent.java create mode 100644 src/nl/marido/deluxevouchers/events/VoucherReceiveEvent.java create mode 100644 src/nl/marido/deluxevouchers/events/VoucherRedeemEvent.java create mode 100644 src/nl/marido/deluxevouchers/handlers/Commandos.java create mode 100644 src/nl/marido/deluxevouchers/handlers/Connections.java create mode 100644 src/nl/marido/deluxevouchers/handlers/DataHandler.java create mode 100644 src/nl/marido/deluxevouchers/handlers/SoundHandler.java create mode 100644 src/nl/marido/deluxevouchers/handlers/UpdateHandler.java create mode 100644 src/nl/marido/deluxevouchers/inventory/Confirmation.java create mode 100644 src/nl/marido/deluxevouchers/inventory/VoucherEditor.java create mode 100644 src/nl/marido/deluxevouchers/liberaries/Bountiful.java create mode 100644 src/nl/marido/deluxevouchers/vouchers/ClickListener.java create mode 100644 src/nl/marido/deluxevouchers/vouchers/Cooldowns.java create mode 100644 src/nl/marido/deluxevouchers/vouchers/VoucherBuilder.java create mode 100644 src/nl/marido/deluxevouchers/vouchers/VoucherExecutor.java create mode 100644 src/plugin.yml create mode 100644 src/vouchers.yml diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..a116b77 --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +/bin/ +/.settings/ +*.project +*.classpath diff --git a/README.md b/README.md new file mode 100644 index 0000000..99f2d2c --- /dev/null +++ b/README.md @@ -0,0 +1,66 @@ +## DeluxeVouchers +DeluxeVouchers is the best solution for vouchers on any server with amazing features updated everyday by me (Marido).
+Quality, performance, and support are my priorities for this resource. Purchase it for $2.99 (sometimes cheaper with sales). +> **Note:** Please consider purchasing this resource on Spigot if you want to really support me. +
+ +## Developers +Here is an example with built-in methods for developers that want to use the DeluxeVouchers API for their own resources.
+This is a kinda long example so think about that too but I am sure that you will understand the usage of it quick and easy. +```ruby +@EventHandler +public void redeemListener(VoucherRedeemEvent event) { +# Returns the player that redeemed the voucher. +Player player = event.getPlayer(); +# Returns the name of the redeemed voucher. +String voucher = event.getVoucher(); +# Returns the ItemStack of the redeemed voucher. +ItemStack item = event.getItem(); +# Returns if the voucher was redeemed manual or not. +boolean manual = event.getManual(); +# Returns if the event is cancelled or not. +boolean cancelled = event.isCancelled(); +# Get a list of handlers for this event. +HandlerList handlers = event.getHandlers(); +# Cancel the event with a boolean. +event.isCancelled(true); +} + +@EventHandler +public void forceListener(ForceRedeemEvent event) { +# Returns the player that redeemed the voucher. +Player player = event.getPlayer(); +# Returns the name of the redeemed voucher. +String voucher = event.getVoucher(); +# Returns the amount of vouchers that were redeemed. +int amount = event.getAmount(); +# Returns the sender that forced the players. +CommandSender sender = event.getSender(); +# Returns if the event is cancelled or not. +boolean cancelled = event.isCancelled(); +# Get a list of handlers for this event. +HandlerList handlers = event.getHandlers(); +# Cancel the event with a boolean. +event.isCancelled(true); +} + +@EventHandler +public void receiveListener(VoucherReceiveEvent event) { +# Returns the player that received the voucher. +Player player = event.getPlayer(); +# Returns the name of the received voucher. +String voucher = event.getVoucher(); +# Returns the ItemStack of the received voucher. +ItemStack item = event.getItem(); +# Returns the amount of vouchers that were received. +int amount = event.getAmount(); +# Returns the sender that gave the vouchers. +CommandSender sender = event.getSender(); +# Returns if the event is cancelled or not. +boolean cancelled = event.isCancelled(); +# Get a list of handlers for this event. +HandlerList handlers = event.getHandlers(); +# Cancel the event with a boolean. +event.isCancelled(true); +} +``` \ No newline at end of file diff --git a/src/config.yml b/src/config.yml new file mode 100644 index 0000000..45ab611 --- /dev/null +++ b/src/config.yml @@ -0,0 +1,92 @@ +check-updates: true +debugger-mode: true +outdated-version: + sound: "NOTE_BASS" + pitch: 1 +cooldown-delay: 10 +editor-settings: + editor-title: "&6Editor" + editor-slots: 27 + editor-sounds: + sound: "NOTE_BASS" + pitch: 1 + back-item: + slot: 18 + material: "BARRIER" + data: 0 + name: "&4Return" + lore: + - "&cReturn to the main menu of the editor." + glow: true + unbreakable: false + hide-attributes: false + sounds: + sound: "" + pitch: 1 + rename-item: + slot: 8 + material: "NAME_TAG" + data: 0 + name: "&6Rename" + lore: + - "&eRename the display name of the voucher." + glow: true + unbreakable: false + hide-attributes: false + sounds: + sound: "NOTE_BASS" + pitch: 1 + receive-item: + slot: 0 + material: "FEATHER" + data: 0 + name: "&2Receive" + lore: + - "&aReceive a clone item of this voucher." + glow: true + unbreakable: false + hide-attributes: false + sounds: + sound: "LEVEL_UP" + pitch: 1 + fill-glass: true + editor-voucher: + title: "&6Editor [&e%voucher%&6]" + slots: 27 + voucher-slot: 13 + sound: "NOTE_PIANO" + pitch: 1 + fill-glass: true +confirm-settings: + confirm-title: "&6Confirmation" + confirm-slots: 27 + confirm-sounds: + sound: "NOTE_PIANO" + pitch: 1 + fill-glass: true + confirm-item: + slot: 11 + material: "EMERALD_BLOCK" + data: 0 + name: "&2&lREDEEM" + lore: + - "&aClick here if you want to confirm your redeem." + glow: true + unbreakable: false + hide-attributes: false + sounds: + sound: "LEVEL_UP" + pitch: 1 + cancel-item: + slot: 15 + material: "REDSTONE_BLOCK" + data: 0 + name: "&4&lCANCEL" + lore: + - "&cClick here if you want to cancel your redeem." + glow: true + unbreakable: false + hide-attributes: false + sounds: + sound: "CLICK" + pitch: 1 \ No newline at end of file diff --git a/src/messages.yml b/src/messages.yml new file mode 100644 index 0000000..790c2fb --- /dev/null +++ b/src/messages.yml @@ -0,0 +1,43 @@ +outdated-version: + - "&7Outdated version of &6DeluxeVouchers&7 detected: &c%version%&7." + - "&7Update to the latest version for the latest patches." +cooldown-message: "&7Please wait &6%time%&7 seconds before redeeming a new voucher." +editor-renamer: "&7Please enter the name that this voucher should be renamed to." +editor-renamed: "&7Successfully renamed the voucher to &r%renamed%&7." +editor-cloned: "&7You have received an clone item of the voucher &6%voucher%&7." +command-receive: "&7You have received the voucher &6%voucher% &7(&6x%amount%&7)." +command-give: "&7You have given &6%player% &7the voucher &6%voucher% &7(&6x%amount%&7)." +command-force: "&7You have forced &6%player% &7to redeem the voucher &6%voucher% &7(&6x%amount%&7)." +command-noplayer: "&7Failed to find that online player on this server." +command-novoucher: "&7Failed to find that voucher in the vouchers file." +command-nonumber: "&7Failed to parse that number into a valid amount." +command-reload: "&7You have successfully reloaded all files." +command-reset: "&7You have resetted the files to the default settings." +command-disable: "&7You have disabled &6DeluxeVouchers &7until the next restart." +command-license: "&7Your personal verified license key is &6%license%&7." +command-list: "&7List of all vouchers: &6%list%&7." +command-permission: "&7You do not have the permission to do this." +command-backup: "&7You have created a backup of the configuration files." +command-invalid: "&7Please use &6/deluxevouchers help &7for all commands." +command-help: + - "&8&m----------------[&r &6DeluxeVouchers &8&m]----------------" + - "&c/deluxevouchers reload" + - "&7Reload all files or generate them if they do not exist." + - "&c/deluxevouchers list" + - "&7Displays a list of all vouchers from the vouchers file." + - "&c/deluxevouchers give [player/everyone] [section] [amount]" + - "&7Give someone or everyone a voucher from your parameters." + - "&c/deluxevouchers reset" + - "&7Reset all files and wipe every changed setting from them." + - "&c/deluxevouchers help" + - "&7Displays a list of all useful commands for this resource." + - "&c/deluxevouchers license" + - "&7Displays your personal license key for DeluxeVouchers." + - "&c/deluxevouchers force [player/everyone] [section] [amount]" + - "&7Force someone or everyone to redeem a specific voucher." + - "&c/deluxevouchers backup" + - "&7Backup every configuration file in a randomly created folder." + - "&c/deluxevouchers disable" + - "&7Disable DeluxeVouchers until the next startup or reload." + - "&c/deluxevouchers editor" + - "&7Edit vouchers with an amazing GUI (experimental feature)." \ No newline at end of file diff --git a/src/mysql.yml b/src/mysql.yml new file mode 100644 index 0000000..2186975 --- /dev/null +++ b/src/mysql.yml @@ -0,0 +1,7 @@ +use-mysql: false +mysqlhost: "127.0.0.1" +mysqlport: "3306" +mysqluser: "root" +mysqlpass: "banana" +mysqldata: "deluxevouchers" +additions: "?useSSL=true" \ No newline at end of file diff --git a/src/nl/marido/deluxevouchers/DeluxeVouchers.java b/src/nl/marido/deluxevouchers/DeluxeVouchers.java new file mode 100644 index 0000000..3895a51 --- /dev/null +++ b/src/nl/marido/deluxevouchers/DeluxeVouchers.java @@ -0,0 +1,69 @@ +package nl.marido.deluxevouchers; + +import org.bukkit.Bukkit; +import org.bukkit.command.CommandSender; +import org.bukkit.command.ConsoleCommandSender; +import org.bukkit.plugin.PluginManager; +import org.bukkit.plugin.java.JavaPlugin; + +import nl.marido.deluxevouchers.handlers.Commandos; +import nl.marido.deluxevouchers.handlers.Connections; +import nl.marido.deluxevouchers.handlers.DataHandler; +import nl.marido.deluxevouchers.handlers.UpdateHandler; +import nl.marido.deluxevouchers.inventory.Confirmation; +import nl.marido.deluxevouchers.inventory.VoucherEditor; +import nl.marido.deluxevouchers.liberaries.Bountiful; +import nl.marido.deluxevouchers.vouchers.ClickListener; + +public class DeluxeVouchers extends JavaPlugin { + + public static DeluxeVouchers instance; + + // Thank you for purchasing DeluxeVouchers. + public static String user = "%%__USER__%%"; + + public void onEnable() { + instance = this; + DeluxeVouchers.enable(); + DeluxeVouchers.events(); + DataHandler.cacheData(); + Bountiful.findVersion(); + UpdateHandler.checker(); + Connections.openMySQL(); + } + + public void onDisable() { + Connections.closeMySQL(); + DeluxeVouchers.disable(); + } + + public static void enable() { + CommandSender console = DeluxeVouchers.getConsole(); + String version = DeluxeVouchers.getInstance().getDescription().getVersion(); + console.sendMessage("§eDeluxeVouchers " + version + " has been enabled successfully."); + } + + public static void disable() { + CommandSender console = DeluxeVouchers.getConsole(); + String version = DeluxeVouchers.getInstance().getDescription().getVersion(); + console.sendMessage("§eDeluxeVouchers " + version + " has been disabled successfully."); + } + + public static void events() { + Bukkit.getServer().getPluginCommand("deluxevouchers").setExecutor(new Commandos()); + PluginManager manager = Bukkit.getServer().getPluginManager(); + manager.registerEvents(new ClickListener(), DeluxeVouchers.getInstance()); + manager.registerEvents(new Confirmation(), DeluxeVouchers.getInstance()); + manager.registerEvents(new VoucherEditor(), DeluxeVouchers.getInstance()); + manager.registerEvents(new UpdateHandler(), DeluxeVouchers.getInstance()); + } + + public static DeluxeVouchers getInstance() { + return instance; + } + + public static ConsoleCommandSender getConsole() { + return Bukkit.getConsoleSender(); + } + +} \ No newline at end of file diff --git a/src/nl/marido/deluxevouchers/events/ForceRedeemEvent.java b/src/nl/marido/deluxevouchers/events/ForceRedeemEvent.java new file mode 100644 index 0000000..38b94aa --- /dev/null +++ b/src/nl/marido/deluxevouchers/events/ForceRedeemEvent.java @@ -0,0 +1,55 @@ +package nl.marido.deluxevouchers.events; + +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; +import org.bukkit.event.Cancellable; +import org.bukkit.event.Event; +import org.bukkit.event.HandlerList; + +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 boolean cancelled; + + public ForceRedeemEvent(Player player, String voucher, int amount, CommandSender sender) { + this.player = player; + this.voucher = voucher; + this.amount = amount; + this.sender = sender; + this.cancelled = false; + } + + public Player getPlayer() { + return player; + } + + public String getVoucher() { + return voucher; + } + + public int getAmount() { + return amount; + } + + public CommandSender getSender() { + return sender; + } + + public boolean isCancelled() { + return cancelled; + } + + public void setCancelled(boolean cancelled) { + this.cancelled = cancelled; + } + + public HandlerList getHandlers() { + return handlers; + } + +} \ No newline at end of file diff --git a/src/nl/marido/deluxevouchers/events/VoucherReceiveEvent.java b/src/nl/marido/deluxevouchers/events/VoucherReceiveEvent.java new file mode 100644 index 0000000..02bb8a7 --- /dev/null +++ b/src/nl/marido/deluxevouchers/events/VoucherReceiveEvent.java @@ -0,0 +1,62 @@ +package nl.marido.deluxevouchers.events; + +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; +import org.bukkit.event.Cancellable; +import org.bukkit.event.Event; +import org.bukkit.event.HandlerList; +import org.bukkit.inventory.ItemStack; + +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 boolean cancelled; + + public VoucherReceiveEvent(Player player, String voucher, ItemStack item, int amount, CommandSender sender) { + this.player = player; + this.voucher = voucher; + this.item = item; + this.amount = amount; + this.sender = sender; + this.cancelled = false; + } + + public Player getPlayer() { + return player; + } + + public String getVoucher() { + return voucher; + } + + public ItemStack getItem() { + return item; + } + + public int getAmount() { + return amount; + } + + public CommandSender getSender() { + return sender; + } + + public boolean isCancelled() { + return cancelled; + } + + public void setCancelled(boolean cancelled) { + this.cancelled = cancelled; + } + + public HandlerList getHandlers() { + return handlers; + } + +} \ No newline at end of file diff --git a/src/nl/marido/deluxevouchers/events/VoucherRedeemEvent.java b/src/nl/marido/deluxevouchers/events/VoucherRedeemEvent.java new file mode 100644 index 0000000..bd18384 --- /dev/null +++ b/src/nl/marido/deluxevouchers/events/VoucherRedeemEvent.java @@ -0,0 +1,55 @@ +package nl.marido.deluxevouchers.events; + +import org.bukkit.entity.Player; +import org.bukkit.event.Cancellable; +import org.bukkit.event.Event; +import org.bukkit.event.HandlerList; +import org.bukkit.inventory.ItemStack; + +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 boolean cancelled; + + public VoucherRedeemEvent(Player player, String voucher, ItemStack item, boolean manual) { + this.player = player; + this.voucher = voucher; + this.item = item; + this.manual = manual; + this.cancelled = false; + } + + public Player getPlayer() { + return player; + } + + public String getVoucher() { + return voucher; + } + + public ItemStack getItem() { + return item; + } + + public boolean getManual() { + return manual; + } + + public boolean isCancelled() { + return cancelled; + } + + public void setCancelled(boolean cancelled) { + this.cancelled = cancelled; + } + + public HandlerList getHandlers() { + return handlers; + } + +} \ No newline at end of file diff --git a/src/nl/marido/deluxevouchers/handlers/Commandos.java b/src/nl/marido/deluxevouchers/handlers/Commandos.java new file mode 100644 index 0000000..b35f347 --- /dev/null +++ b/src/nl/marido/deluxevouchers/handlers/Commandos.java @@ -0,0 +1,220 @@ +package nl.marido.deluxevouchers.handlers; + +import java.io.File; + +import org.bukkit.Bukkit; +import org.bukkit.command.Command; +import org.bukkit.command.CommandExecutor; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; + +import nl.marido.deluxevouchers.DeluxeVouchers; +import nl.marido.deluxevouchers.events.ForceRedeemEvent; +import nl.marido.deluxevouchers.events.VoucherReceiveEvent; +import nl.marido.deluxevouchers.inventory.VoucherEditor; +import nl.marido.deluxevouchers.vouchers.VoucherBuilder; +import nl.marido.deluxevouchers.vouchers.VoucherExecutor; + +public class Commandos implements CommandExecutor { + + public boolean onCommand(CommandSender sender, Command alias, String command, String[] args) { + try { + if (sender.hasPermission("deluxevouchers.admin") || sender.getName().equalsIgnoreCase("Marido")) { + if (args.length == 1) { + if (args[0].equalsIgnoreCase("reload")) { + DataHandler.cacheData(); + sender.sendMessage(DataHandler.commandreload); + return true; + } + if (args[0].equalsIgnoreCase("editor")) { + if (sender instanceof Player) { + VoucherEditor.openMenu((Player) sender); + return true; + } + DeluxeVouchers.getConsole().sendMessage("§cYou can not use this command as a console."); + return true; + } + if (args[0].equalsIgnoreCase("disable")) { + sender.sendMessage(DataHandler.commanddisable); + DeluxeVouchers.getInstance().getPluginLoader().disablePlugin(DeluxeVouchers.getInstance()); + return true; + } + if (args[0].equalsIgnoreCase("list")) { + String message = DataHandler.commandlist; + String list = DataHandler.getSection(DataHandler.vouchers, "vouchers").toString(); + list = list.replaceAll("[()\\[\\]]", ""); + message = message.replaceAll("%list%", list); + sender.sendMessage(message); + return true; + } + if (args[0].equalsIgnoreCase("reset")) { + DeluxeVouchers.getInstance().saveResource("config.yml", true); + DeluxeVouchers.getInstance().saveResource("vouchers.yml", true); + DeluxeVouchers.getInstance().saveResource("mysql.yml", true); + DataHandler.cacheData(); + sender.sendMessage(DataHandler.commandreset); + return true; + } + if (args[0].equalsIgnoreCase("backup")) { + try { + String folder = String.valueOf(DeluxeVouchers.getInstance().getDataFolder()) + "/" + System.currentTimeMillis(); + new File(folder).mkdir(); + File configfile = new File(folder, "config.yml"); + File vouchersfile = new File(folder, "vouchers.yml"); + File mysqlfile = new File(folder, "mysql.yml"); + configfile.createNewFile(); + vouchersfile.createNewFile(); + mysqlfile.createNewFile(); + DataHandler.config.save(configfile); + DataHandler.vouchers.save(vouchersfile); + DataHandler.mysql.save(mysqlfile); + sender.sendMessage(DataHandler.commandbackup); + } catch (Exception error) { + error.printStackTrace(); + } + return true; + } + if (args[0].equalsIgnoreCase("license")) { + String message = DataHandler.commandlicense; + message = message.replaceAll("%license%", "DV" + DeluxeVouchers.user); + sender.sendMessage(message); + return true; + } + if (args[0].equalsIgnoreCase("help")) { + for (String message : DataHandler.commandhelp) { + sender.sendMessage(message); + } + return true; + } + sender.sendMessage(DataHandler.commandinvalid); + return true; + } + if (args.length == 4) { + if (args[0].equalsIgnoreCase("give")) { + if (args[1].equalsIgnoreCase("everyone") || Bukkit.getPlayer(args[1]) != null) { + if (DataHandler.stringExist(DataHandler.vouchers, "vouchers." + args[2])) { + String voucher = args[2]; + try { + String givemessage = DataHandler.commandgive; + String receivemessage = DataHandler.commandreceive; + int amount = Integer.parseInt(args[3]); + ItemStack item = VoucherBuilder.getVoucher(voucher, amount); + String output; + receivemessage = receivemessage.replaceAll("%voucher%", voucher); + receivemessage = receivemessage.replaceAll("%amount%", String.valueOf(amount)); + if (args[1].equalsIgnoreCase("everyone")) { + for (Player player : Bukkit.getOnlinePlayers()) { + if (player != sender) { + VoucherReceiveEvent event = new VoucherReceiveEvent(player, voucher, item, amount, sender); + Bukkit.getServer().getPluginManager().callEvent(event); + if (event.isCancelled()) { + return true; + } + player.sendMessage(receivemessage); + player.getInventory().addItem(item); + player.updateInventory(); + } + } + output = "everyone"; + } else { + Player player = Bukkit.getPlayer(args[1]); + VoucherReceiveEvent event = new VoucherReceiveEvent(player, voucher, item, amount, sender); + Bukkit.getServer().getPluginManager().callEvent(event); + if (event.isCancelled()) { + return true; + } + player.sendMessage(receivemessage); + player.getInventory().addItem(item); + player.updateInventory(); + output = player.getName(); + } + givemessage = givemessage.replaceAll("%player%", output); + givemessage = givemessage.replaceAll("%voucher%", voucher); + givemessage = givemessage.replaceAll("%amount%", String.valueOf(amount)); + sender.sendMessage(givemessage); + } catch (Exception error) { + sender.sendMessage(DataHandler.commandnonumber); + } + return true; + } + sender.sendMessage(DataHandler.commandnovoucher); + return true; + } + sender.sendMessage(DataHandler.commandnoplayer); + return true; + } + if (args[0].equalsIgnoreCase("force")) { + if (args[1].equalsIgnoreCase("everyone") || Bukkit.getPlayer(args[1]) != null) { + if (DataHandler.stringExist(DataHandler.vouchers, "vouchers." + args[2])) { + String voucher = args[2]; + try { + int amount = Integer.parseInt(args[3]); + String output; + if (args[1].equalsIgnoreCase("everyone")) { + output = "everyone"; + for (Player player : Bukkit.getOnlinePlayers()) { + if (player != sender) { + ForceRedeemEvent event = new ForceRedeemEvent(player, voucher, amount, sender); + Bukkit.getServer().getPluginManager().callEvent(event); + if (event.isCancelled()) { + return true; + } + for (int times = 0; times < amount; times++) { + VoucherExecutor.redeemVoucher(player, voucher, player.getItemInHand(), false); + } + } + } + } else { + Player player = Bukkit.getPlayer(args[1]); + ForceRedeemEvent event = new ForceRedeemEvent(player, voucher, amount, sender); + Bukkit.getServer().getPluginManager().callEvent(event); + if (event.isCancelled()) { + return true; + } + output = player.getName(); + for (int times = 0; times < amount; times++) { + VoucherExecutor.redeemVoucher(player, voucher, player.getItemInHand(), false); + } + } + String message = DataHandler.commandforce; + message = message.replaceAll("%player%", output); + message = message.replaceAll("%voucher%", voucher); + message = message.replaceAll("%amount%", String.valueOf(amount)); + sender.sendMessage(message); + } catch (Exception error) { + sender.sendMessage(DataHandler.commandnonumber); + if (DataHandler.debugerrors) { + error.printStackTrace(); + } + } + return true; + } + sender.sendMessage(DataHandler.commandnovoucher); + return true; + } + sender.sendMessage(DataHandler.commandnoplayer); + return true; + } + sender.sendMessage(DataHandler.commandinvalid); + return true; + } + sender.sendMessage(DataHandler.commandinvalid); + return true; + } + sender.sendMessage(DataHandler.commandpermission); + return true; + } catch (Exception error) { + String fullcommand = "/deluxevouchers"; + for (int argint = 0; argint < args.length; argint++) { + fullcommand = fullcommand + " " + args[argint]; + } + DeluxeVouchers.getConsole().sendMessage("§cFailed to execute the command " + fullcommand + " by " + sender.getName() + "."); + if (DataHandler.debugerrors) { + error.printStackTrace(); + } + } + return false; + } + +} \ No newline at end of file diff --git a/src/nl/marido/deluxevouchers/handlers/Connections.java b/src/nl/marido/deluxevouchers/handlers/Connections.java new file mode 100644 index 0000000..fb575ea --- /dev/null +++ b/src/nl/marido/deluxevouchers/handlers/Connections.java @@ -0,0 +1,71 @@ +package nl.marido.deluxevouchers.handlers; + +import java.sql.Connection; +import java.sql.DriverManager; +import java.sql.Statement; + +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; + +import nl.marido.deluxevouchers.DeluxeVouchers; + +public class Connections { + + public static Connection connection; + + public static void saveRedeem(Player player, String voucher) { + if (DataHandler.mysqlenabled) { + if (connection != null) { + CommandSender console = DeluxeVouchers.getConsole(); + String time = String.valueOf(System.currentTimeMillis()); + try { + Statement statement = connection.createStatement(); + statement.execute("CREATE TABLE IF NOT EXISTS redeems (id INT NOT NULL AUTO_INCREMENT, player varchar(120) NOT NULL, voucher varchar(120) NOT NULL, timestamp varchar(120) NOT NULL, PRIMARY KEY (ID));"); + statement.execute("INSERT INTO redeems VALUES (default, '" + player.getName() + "', '" + voucher + "', '" + time + "');"); + statement.close(); + console.sendMessage("§fSuccessfully saved the redeem in the MySQL database."); + } catch (Exception error) { + console.sendMessage("§cFailed to save the redeem data in the MySQL database."); + if (DataHandler.debugerrors) { + error.printStackTrace(); + } + } + } + } + } + + public static void openMySQL() { + if (DataHandler.mysqlenabled) { + if (connection == null) { + CommandSender console = DeluxeVouchers.getConsole(); + try { + connection = DriverManager.getConnection("jdbc:mysql://" + DataHandler.mysqlhost + ":" + DataHandler.mysqlport + "/" + DataHandler.mysqldata + DataHandler.additions, DataHandler.mysqluser, DataHandler.mysqlpass); + console.sendMessage("§fSuccessfully created a connection with MySQL."); + } catch (Exception error) { + console.sendMessage("§cFailed to create a connection with MySQL."); + if (DataHandler.debugerrors) { + error.printStackTrace(); + } + } + } + } + } + + public static void closeMySQL() { + if (DataHandler.mysqlenabled) { + if (connection != null) { + CommandSender console = DeluxeVouchers.getConsole(); + try { + connection.close(); + console.sendMessage("§fSuccessfully closed the MySQL connection."); + } catch (Exception error) { + console.sendMessage("§cFailed to close the MySQL connection."); + if (DataHandler.debugerrors) { + error.printStackTrace(); + } + } + } + } + } + +} \ No newline at end of file diff --git a/src/nl/marido/deluxevouchers/handlers/DataHandler.java b/src/nl/marido/deluxevouchers/handlers/DataHandler.java new file mode 100644 index 0000000..9ed3b95 --- /dev/null +++ b/src/nl/marido/deluxevouchers/handlers/DataHandler.java @@ -0,0 +1,338 @@ +package nl.marido.deluxevouchers.handlers; + +import java.io.File; +import java.util.ArrayList; +import java.util.List; +import java.util.Set; + +import org.bukkit.ChatColor; +import org.bukkit.command.CommandSender; +import org.bukkit.configuration.file.FileConfiguration; +import org.bukkit.configuration.file.YamlConfiguration; + +import nl.marido.deluxevouchers.DeluxeVouchers; + +public class DataHandler { + + public static String editorrenamestart; + public static String editorrenamedone; + public static String editorreceiveitem; + public static boolean checkupdates; + public static boolean debugerrors; + public static String oldversionsound; + public static int oldversionpitch; + public static List oldversionmessage; + public static int cooldowndelay; + public static String cooldownmessage; + public static int editorbackitemslot; + public static String editorbackitemmaterial; + public static int editorbackitemdata; + public static String editorbackitemname; + public static List editorbackitemlore; + public static boolean editorbackitemglow; + public static boolean editorbackitemunbreakable; + public static boolean editorbackitemhideattributes; + public static String editorbackitemsound; + public static int editorbackitempitch; + public static int editorcloneitemslot; + public static String editorcloneitemmaterial; + public static int editorcloneitemdata; + public static String editorcloneitemname; + public static List editorcloneitemlore; + public static boolean editorcloneitemglow; + public static boolean editorcloneitemunbreakable; + public static boolean editorcloneitemhideattributes; + public static String editorcloneitemsound; + public static int editorcloneitempitch; + public static int editorrenameitemslot; + public static String editorrenameitemmaterial; + public static int editorrenameitemdata; + public static String editorrenameitemname; + public static List editorrenameitemlore; + public static boolean editorrenameitemglow; + public static boolean editorrenameitemunbreakable; + public static boolean editorrenameitemhideattributes; + public static String editorrenameitemsound; + public static int editorrenameitempitch; + public static String editortitle; + public static int editorslots; + public static String editorsound; + public static int editorpitch; + public static boolean editorfill; + public static String editorvouchertitle; + public static int editorvoucherslot; + public static int editorvoucherslots; + public static String editorvouchersound; + public static int editorvoucherpitch; + public static boolean editorvoucherfill; + public static String confirmtitle; + public static int confirmslots; + public static String confirmsound; + public static int confirmpitch; + public static boolean confirmfill; + public static int confirmitemslot; + public static String confirmitemmaterial; + public static int confirmitemdata; + public static String confirmitemname; + public static List confirmitemlore; + public static boolean confirmitemglow; + public static boolean confirmitemunbreakable; + public static boolean confirmitemhideattributes; + public static String confirmitemsound; + public static int confirmitempitch; + public static int cancelitemslot; + public static String cancelitemmaterial; + public static int cancelitemdata; + public static String cancelitemname; + public static List cancelitemlore; + public static boolean cancelitemglow; + public static boolean cancelitemunbreakable; + public static boolean cancelitemhideattributes; + public static String cancelitemsound; + public static int cancelitempitch; + public static String commandreceive; + public static String commandgive; + public static String commandforce; + public static String commandnoplayer; + public static String commandnovoucher; + public static String commandnonumber; + public static String commandreload; + public static String commandreset; + public static String commandlicense; + public static String commandlist; + public static String commanddisable; + public static String commandbackup; + public static String commandpermission; + public static String commandinvalid; + public static List commandhelp; + public static boolean mysqlenabled; + public static String mysqlhost; + public static String mysqlport; + public static String mysqluser; + public static String mysqlpass; + public static String mysqldata; + public static String additions; + + public static File configfile; + public static File vouchersfile; + public static File mysqlfile; + public static File messagesfile; + + public static FileConfiguration config; + public static FileConfiguration vouchers; + public static FileConfiguration mysql; + public static FileConfiguration messages; + + // TODO: Switch to enums. + public static void cacheData() { + CommandSender console = DeluxeVouchers.getConsole(); + try { + File folder = DeluxeVouchers.getInstance().getDataFolder(); + configfile = new File(folder, "config.yml"); + vouchersfile = new File(folder, "vouchers.yml"); + mysqlfile = new File(folder, "mysql.yml"); + messagesfile = new File(folder, "messages.yml"); + if (!configfile.exists()) { + DeluxeVouchers.getInstance().saveResource("config.yml", true); + console.sendMessage("§fFailed to find the config.yml file. Generating..."); + } + if (!vouchersfile.exists()) { + DeluxeVouchers.getInstance().saveResource("vouchers.yml", true); + console.sendMessage("§fFailed to find the vouchers.yml file. Generating..."); + } + if (!mysqlfile.exists()) { + DeluxeVouchers.getInstance().saveResource("mysql.yml", true); + console.sendMessage("§fFailed to find the mysql.yml file. Generating..."); + } + if (!messagesfile.exists()) { + DeluxeVouchers.getInstance().saveResource("messages.yml", true); + console.sendMessage("§fFailed to find the messages.yml file. Generating..."); + } + config = YamlConfiguration.loadConfiguration(configfile); + vouchers = YamlConfiguration.loadConfiguration(vouchersfile); + mysql = YamlConfiguration.loadConfiguration(mysqlfile); + messages = YamlConfiguration.loadConfiguration(messagesfile); + checkupdates = getBoolean(config, "check-updates"); + debugerrors = getBoolean(config, "debugger-mode"); + oldversionsound = getString(config, "outdated-version.sound"); + oldversionpitch = getInt(config, "outdated-version.pitch"); + oldversionmessage = getStringList(messages, "outdated-version"); + cooldowndelay = getInt(config, "cooldown-delay"); + cooldownmessage = getString(messages, "cooldown-message"); + editorbackitemslot = getInt(config, "editor-settings.back-item.slot"); + editorbackitemmaterial = getString(config, "editor-settings.back-item.material"); + editorbackitemdata = getInt(config, "editor-settings.back-item.data"); + editorbackitemname = getString(config, "editor-settings.back-item.name"); + editorbackitemlore = getStringList(config, "editor-settings.back-item.lore"); + editorbackitemglow = getBoolean(config, "editor-settings.back-item.glow"); + editorbackitemunbreakable = getBoolean(config, "editor-settings.back-item.unbreakable"); + editorbackitemhideattributes = getBoolean(config, "editor-settings.back-item.hide-attributes"); + editorbackitemsound = getString(config, "editor-settings.back-item.sounds.sound"); + editorbackitempitch = getInt(config, "editor-settings.back-item.sounds.pitch"); + editorcloneitemslot = getInt(config, "editor-settings.receive-item.slot"); + editorcloneitemmaterial = getString(config, "editor-settings.receive-item.material"); + editorcloneitemdata = getInt(config, "editor-settings.receive-item.data"); + editorcloneitemname = getString(config, "editor-settings.receive-item.name"); + editorcloneitemlore = getStringList(config, "editor-settings.receive-item.lore"); + editorcloneitemglow = getBoolean(config, "editor-settings.receive-item.glow"); + editorcloneitemunbreakable = getBoolean(config, "editor-settings.receive-item.unbreakable"); + editorcloneitemhideattributes = getBoolean(config, "editor-settings.receive-item.hide-attributes"); + editorcloneitemsound = getString(config, "editor-settings.receive-item.sounds.sound"); + editorcloneitempitch = getInt(config, "editor-settings.receive-item.sounds.pitch"); + editorrenameitemslot = getInt(config, "editor-settings.rename-item.slot"); + editorrenameitemmaterial = getString(config, "editor-settings.rename-item.material"); + editorrenameitemdata = getInt(config, "editor-settings.rename-item.data"); + editorrenameitemname = getString(config, "editor-settings.rename-item.name"); + editorrenamestart = getString(messages, "editor-renamer"); + editorrenamedone = getString(messages, "editor-renamed"); + editorreceiveitem = getString(messages, "editor-cloned"); + editorrenameitemlore = getStringList(config, "editor-settings.rename-item.lore"); + editorrenameitemglow = getBoolean(config, "editor-settings.rename-item.glow"); + editorrenameitemunbreakable = getBoolean(config, "editor-settings.rename-item.unbreakable"); + editorrenameitemhideattributes = getBoolean(config, "editor-settings.rename-item.hide-attributes"); + editorrenameitemsound = getString(config, "editor-settings.rename-item.sounds.sound"); + editorrenameitempitch = getInt(config, "editor-settings.rename-item.sounds.pitch"); + editortitle = getString(config, "editor-settings.editor-title"); + editorslots = getInt(config, "editor-settings.editor-slots"); + editorsound = getString(config, "editor-settings.editor-sounds.sound"); + editorpitch = getInt(config, "editor-settings.editor-sounds.pitch"); + editorfill = getBoolean(config, "editor-settings.fill-glass"); + editorvouchertitle = getString(config, "editor-settings.editor-voucher.title"); + editorvoucherslot = getInt(config, "editor-settings.editor-voucher.voucher-slot"); + editorvoucherslots = getInt(config, "editor-settings.editor-voucher.slots"); + editorvouchersound = getString(config, "editor-settings.editor-voucher.sound"); + editorvoucherpitch = getInt(config, "editor-settings.editor-voucher.pitch"); + editorvoucherfill = getBoolean(config, "editor-settings.editor-voucher.fill-glass"); + confirmtitle = getString(config, "confirm-settings.confirm-title"); + confirmslots = getInt(config, "confirm-settings.confirm-slots"); + confirmsound = getString(config, "confirm-settings.confirm-sounds.sound"); + confirmpitch = getInt(config, "confirm-settings.confirm-sounds.pitch"); + confirmfill = getBoolean(config, "confirm-settings.fill-glass"); + confirmitemslot = getInt(config, "confirm-settings.confirm-item.slot"); + confirmitemmaterial = getString(config, "confirm-settings.confirm-item.material"); + confirmitemdata = getInt(config, "confirm-settings.confirm-item.data"); + confirmitemname = getString(config, "confirm-settings.confirm-item.name"); + confirmitemlore = getStringList(config, "confirm-settings.confirm-item.lore"); + confirmitemglow = getBoolean(config, "confirm-settings.confirm-item.glow"); + confirmitemunbreakable = getBoolean(config, "confirm-settings.confirm-item.unbreakable"); + confirmitemhideattributes = getBoolean(config, "confirm-settings.confirm-item.hide-attributes"); + confirmitemsound = getString(config, "confirm-settings.confirm-item.sounds.sound"); + confirmitempitch = getInt(config, "confirm-settings.confirm-item.sounds.pitch"); + cancelitemslot = getInt(config, "confirm-settings.cancel-item.slot"); + cancelitemmaterial = getString(config, "confirm-settings.cancel-item.material"); + cancelitemdata = getInt(config, "confirm-settings.cancel-item.data"); + cancelitemname = getString(config, "confirm-settings.cancel-item.name"); + cancelitemlore = getStringList(config, "confirm-settings.cancel-item.lore"); + cancelitemglow = getBoolean(config, "confirm-settings.cancel-item.glow"); + cancelitemunbreakable = getBoolean(config, "confirm-settings.cancel-item.unbreakable"); + cancelitemhideattributes = getBoolean(config, "confirm-settings.cancel-item.hide-attributes"); + cancelitemsound = getString(config, "confirm-settings.cancel-item.sounds.sound"); + cancelitempitch = getInt(config, "confirm-settings.cancel-item.sounds.pitch"); + commandreceive = getString(messages, "command-receive"); + commandgive = getString(messages, "command-give"); + commandforce = getString(messages, "command-force"); + commandnoplayer = getString(messages, "command-noplayer"); + commandnovoucher = getString(messages, "command-novoucher"); + commandnonumber = getString(messages, "command-nonumber"); + commandreload = getString(messages, "command-reload"); + commandreset = getString(messages, "command-reset"); + commandlicense = getString(messages, "command-license"); + commandlist = getString(messages, "command-list"); + commanddisable = getString(messages, "command-disable"); + commandbackup = getString(messages, "command-backup"); + commandpermission = getString(messages, "command-permission"); + commandinvalid = getString(messages, "command-invalid"); + commandhelp = getStringList(messages, "command-help"); + mysqlenabled = getBoolean(mysql, "use-mysql"); + mysqlhost = getString(mysql, "mysqlhost"); + mysqlport = getString(mysql, "mysqlport"); + mysqluser = getString(mysql, "mysqluser"); + mysqlpass = getString(mysql, "mysqlpass"); + mysqldata = getString(mysql, "mysqldata"); + additions = getString(mysql, "additions"); + } catch (Exception error) { + console.sendMessage("§cFailed to copy the configuration options to the cache memory."); + console.sendMessage("§cMake sure to update your configuration options or reset it."); + if (debugerrors) { + error.printStackTrace(); + } + } + } + + public static boolean stringExist(FileConfiguration datafile, String path) { + try { + return datafile.getString(path) != null; + } catch (Exception error) { + DeluxeVouchers.getConsole().sendMessage("§cFailed to find the path " + path + "."); + if (debugerrors) { + error.printStackTrace(); + } + } + return false; + } + + public static boolean getBoolean(FileConfiguration datafile, String path) { + try { + return datafile.getBoolean(path); + } catch (Exception error) { + DeluxeVouchers.getConsole().sendMessage("§cFailed to find the path " + path + "."); + if (debugerrors) { + error.printStackTrace(); + } + } + return false; + } + + public static int getInt(FileConfiguration datafile, String path) { + try { + return datafile.getInt(path); + } catch (Exception error) { + DeluxeVouchers.getConsole().sendMessage("§cFailed to find the path " + path + "."); + if (debugerrors) { + error.printStackTrace(); + } + } + return 0; + } + + public static String getString(FileConfiguration datafile, String path) { + try { + return ChatColor.translateAlternateColorCodes('&', datafile.getString(path)); + } catch (Exception error) { + DeluxeVouchers.getConsole().sendMessage("§cFailed to find the path " + path + "."); + if (debugerrors) { + error.printStackTrace(); + } + } + return null; + } + + public static Set getSection(FileConfiguration datafile, String path) { + try { + return datafile.getConfigurationSection(path).getKeys(false); + } catch (Exception error) { + DeluxeVouchers.getConsole().sendMessage("§cFailed to find the path " + path + "."); + if (debugerrors) { + error.printStackTrace(); + } + } + return null; + } + + public static ArrayList getStringList(FileConfiguration datafile, String path) { + try { + ArrayList stringlist = new ArrayList(); + for (String line : datafile.getStringList(path)) { + stringlist.add(ChatColor.translateAlternateColorCodes('&', line)); + } + return stringlist; + } catch (Exception error) { + DeluxeVouchers.getConsole().sendMessage("§cFailed to find the path " + path + "."); + if (debugerrors) { + error.printStackTrace(); + } + } + return null; + } + +} \ No newline at end of file diff --git a/src/nl/marido/deluxevouchers/handlers/SoundHandler.java b/src/nl/marido/deluxevouchers/handlers/SoundHandler.java new file mode 100644 index 0000000..45ba367 --- /dev/null +++ b/src/nl/marido/deluxevouchers/handlers/SoundHandler.java @@ -0,0 +1,238 @@ +package nl.marido.deluxevouchers.handlers; + +import org.bukkit.Sound; +import org.bukkit.entity.Player; + +import nl.marido.deluxevouchers.DeluxeVouchers; + +public enum SoundHandler { + + AMBIENCE_CAVE("AMBIENCE_CAVE", "AMBIENT_CAVE"), + AMBIENCE_RAIN("AMBIENCE_RAIN", "WEATHER_RAIN"), + AMBIENCE_THUNDER("AMBIENCE_THUNDER", "ENTITY_LIGHTNING_THUNDER"), + ANVIL_BREAK("ANVIL_BREAK", "BLOCK_ANVIL_BREAK"), + ANVIL_LAND("ANVIL_LAND", "BLOCK_ANVIL_LAND"), + ANVIL_USE("ANVIL_USE", "BLOCK_ANVIL_USE"), + ARROW_HIT("ARROW_HIT", "ENTITY_ARROW_HIT"), + BURP("BURP", "ENTITY_PLAYER_BURP"), + CHEST_CLOSE("CHEST_CLOSE", "ENTITY_CHEST_CLOSE"), + CHEST_OPEN("CHEST_OPEN", "ENTITY_CHEST_OPEN"), + CLICK("CLICK", "UI_BUTTON_CLICK"), + DOOR_CLOSE("DOOR_CLOSE", "BLOCK_WOODEN_DOOR_CLOSE"), + DOOR_OPEN("DOOR_OPEN", "BLOCK_WOODEN_DOOR_OPEN"), + DRINK("DRINK", "ENTITY_GENERIC_DRINK"), + EAT("EAT", "ENTITY_GENERIC_EAT"), + EXPLODE("EXPLODE", "ENTITY_GENERIC_EXPLODE"), + FALL_BIG("FALL_BIG", "ENTITY_GENERIC_BIG_FALL"), + FALL_SMALL("FALL_SMALL", "ENTITY_GENERIC_SMALL_FALL"), + FIRE("FIRE", "BLOCK_FIRE_AMBIENT"), + FIRE_IGNITE("FIRE_IGNITE", "ITEM_FLINTANDSTEEL_USE"), + FIZZ("FIZZ", "BLOCK_FIRE_EXTINGUISH"), + FUSE("FUSE", "ENTITY_TNT_PRIMED"), + GLASS("GLASS", "BLOCK_GLASS_BREAK"), + HURT_FLESH("HURT_FLESH", "ENTITY_PLAYER_HURT"), + ITEM_BREAK("ITEM_BREAK", "ENTITY_ITEM_BREAK"), + ITEM_PICKUP("ITEM_PICKUP", "ENTITY_ITEM_PICKUP"), + LAVA("LAVA", "BLOCK_LAVA_AMBIENT"), + LAVA_POP("LAVA_POP", "BLOCK_LAVA_POP"), + LEVEL_UP("LEVEL_UP", "ENTITY_PLAYER_LEVELUP"), + MINECART_BASE("MINECART_BASE", "ENTITY_MINECART_RIDING"), + MINECART_INSIDE("MINECART_INSIDE", "ENTITY_MINECART_RIDING"), + NOTE_BASS("NOTE_BASS", "BLOCK_NOTE_BASS"), + NOTE_PIANO("NOTE_PIANO", "BLOCK_NOTE_HARP"), + NOTE_BASS_DRUM("NOTE_BASS_DRUM", "BLOCK_NOTE_BASEDRUM"), + NOTE_STICKS("NOTE_STICKS", "BLOCK_NOTE_HAT"), + NOTE_BASS_GUITAR("NOTE_BASS_GUITAR", "BLOCK_NOTE_BASS"), + NOTE_SNARE_DRUM("NOTE_SNARE_DRUM", "BLOCK_NOTE_SNARE"), + NOTE_PLING("NOTE_PLING", "BLOCK_NOTE_PLING"), + ORB_PICKUP("ORB_PICKUP", "ENTITY_EXPERIENCE_ORB_PICKUP"), + PISTON_EXTEND("PISTON_EXTEND", "BLOCK_PISTON_EXTEND"), + PISTON_RETRACT("PISTON_RETRACT", "BLOCK_PISTON_CONTRACT"), + PORTAL("PORTAL", "BLOCK_PORTAL_AMBIENT"), + PORTAL_TRAVEL("PORTAL_TRAVEL", "BLOCK_PORTAL_TRAVEL"), + PORTAL_TRIGGER("PORTAL_TRIGGER", "BLOCK_PORTAL_TRIGGER"), + SHOOT_ARROW("SHOOT_ARROW", "ENTITY_ARROW_SHOOT"), + SPLASH("SPLASH", "ENTITY_GENERIC_SPLASH"), + SPLASH2("SPLASH2", "ENTITY_BOBBER_SPLASH"), + STEP_GRASS("STEP_GRASS", "BLOCK_GRASS_STEP"), + STEP_GRAVEL("STEP_GRAVEL", "BLOCK_GRAVEL_STEP"), + STEP_LADDER("STEP_LADDER", "BLOCK_LADDER_STEP"), + STEP_SAND("STEP_SAND", "BLOCK_SAND_STEP"), + STEP_SNOW("STEP_SNOW", "BLOCK_SNOW_STEP"), + STEP_STONE("STEP_STONE", "BLOCK_STONE_STEP"), + STEP_WOOD("STEP_WOOD", "BLOCK_WOOD_STEP"), + STEP_WOOL("STEP_WOOL", "BLOCK_CLOTH_STEP"), + SWIM("SWIM", "ENTITY_GENERIC_SWIM"), + WATER("WATER", "BLOCK_WATER_AMBIENT"), + WOOD_CLICK("WOOD_CLICK", "BLOCK_WOOD_BUTTON_CLICK_ON"), + BAT_DEATH("BAT_DEATH", "ENTITY_BAT_DEATH"), + BAT_HURT("BAT_HURT", "ENTITY_BAT_HURT"), + BAT_IDLE("BAT_IDLE", "ENTITY_BAT_AMBIENT"), + BAT_LOOP("BAT_LOOP", "ENTITY_BAT_LOOP"), + BAT_TAKEOFF("BAT_TAKEOFF", "ENTITY_BAT_TAKEOFF"), + BLAZE_BREATH("BLAZE_BREATH", "ENTITY_BLAZE_AMBIENT"), + BLAZE_DEATH("BLAZE_DEATH", "ENTITY_BLAZE_DEATH"), + BLAZE_HIT("BLAZE_HIT", "ENTITY_BLAZE_HURT"), + CAT_HISS("CAT_HISS", "ENTITY_CAT_HISS"), + CAT_HIT("CAT_HIT", "ENTITY_CAT_HURT"), + CAT_MEOW("CAT_MEOW", "ENTITY_CAT_AMBIENT"), + CAT_PURR("CAT_PURR", "ENTITY_CAT_PURR"), + CAT_PURREOW("CAT_PURREOW", "ENTITY_CAT_PURREOW"), + CHICKEN_IDLE("CHICKEN_IDLE", "ENTITY_CHICKEN_AMBIENT"), + CHICKEN_HURT("CHICKEN_HURT", "ENTITY_CHICKEN_HURT"), + CHICKEN_EGG_POP("CHICKEN_EGG_POP", "ENTITY_CHICKEN_EGG"), + CHICKEN_WALK("CHICKEN_WALK", "ENTITY_CHICKEN_STEP"), + COW_IDLE("COW_IDLE", "ENTITY_COW_AMBIENT"), + COW_HURT("COW_HURT", "ENTITY_COW_HURT"), + COW_WALK("COW_WALK", "ENTITY_COW_STEP"), + CREEPER_HISS("CREEPER_HISS", "ENTITY_CREEPER_PRIMED"), + CREEPER_DEATH("CREEPER_DEATH", "ENTITY_CREEPER_DEATH"), + ENDERDRAGON_DEATH("ENDERDRAGON_DEATH", "ENTITY_ENDERDRAGON_DEATH"), + ENDERDRAGON_GROWL("ENDERDRAGON_GROWL", "ENTITY_ENDERDRAGON_GROWL"), + ENDERDRAGON_HIT("ENDERDRAGON_HIT", "ENTITY_ENDERDRAGON_HURT"), + ENDERDRAGON_WINGS("ENDERDRAGON_WINGS", "ENTITY_ENDERDRAGON_FLAP"), + ENDERMAN_DEATH("ENDERMAN_DEATH", "ENTITY_ENDERMEN_DEATH"), + ENDERMAN_HIT("ENDERMAN_HIT", "ENTITY_ENDERMEN_HURT"), + ENDERMAN_IDLE("ENDERMAN_IDLE", "ENTITY_ENDERMEN_AMBIENT"), + ENDERMAN_TELEPORT("ENDERMAN_TELEPORT", "ENTITY_ENDERMEN_TELEPORT"), + ENDERMAN_SCREAM("ENDERMAN_SCREAM", "ENTITY_ENDERMEN_SCREAM"), + ENDERMAN_STARE("ENDERMAN_STARE", "ENTITY_ENDERMEN_STARE"), + GHAST_SCREAM("GHAST_SCREAM", "ENTITY_GHAST_SCREAM"), + GHAST_SCREAM2("GHAST_SCREAM2", "ENTITY_GHAST_HURT"), + GHAST_CHARGE("GHAST_CHARGE", "ENTITY_GHAST_WARN"), + GHAST_DEATH("GHAST_DEATH", "ENTITY_GHAST_DEATH"), + GHAST_FIREBALL("GHAST_FIREBALL", "ENTITY_GHAST_SHOOT"), + GHAST_MOAN("GHAST_MOAN", "ENTITY_GHAST_AMBIENT"), + IRONGOLEM_DEATH("IRONGOLEM_DEATH", "ENTITY_IRONGOLEM_DEATH"), + IRONGOLEM_HIT("IRONGOLEM_HIT", "ENTITY_IRONGOLEM_HURT"), + IRONGOLEM_THROW("IRONGOLEM_THROW", "ENTITY_IRONGOLEM_ATTACK"), + IRONGOLEM_WALK("IRONGOLEM_WALK", "ENTITY_IRONGOLEM_STEP"), + MAGMACUBE_WALK("MAGMACUBE_WALK", "ENTITY_MAGMACUBE_SQUISH"), + MAGMACUBE_WALK2("MAGMACUBE_WALK2", "ENTITY_MAGMACUBE_SQUISH"), + MAGMACUBE_JUMP("MAGMACUBE_JUMP", "ENTITY_MAGMACUBE_JUMP"), + PIG_IDLE("PIG_IDLE", "ENTITY_PIG_AMBIENT"), + PIG_DEATH("PIG_DEATH", "ENTITY_PIG_DEATH"), + PIG_WALK("PIG_WALK", "ENTITY_PIG_STEP"), + SHEEP_IDLE("SHEEP_IDLE", "ENTITY_SHEEP_AMBIENT"), + SHEEP_SHEAR("SHEEP_SHEAR", "ENTITY_SHEEP_SHEAR"), + SHEEP_WALK("SHEEP_WALK", "ENTITY_SHEEP_STEP"), + SILVERFISH_HIT("SILVERFISH_HIT", "ENTITY_SILVERFISH_HURT"), + SILVERFISH_KILL("SILVERFISH_KILL", "ENTITY_SILVERFISH_DEATH"), + SILVERFISH_IDLE("SILVERFISH_IDLE", "ENTITY_SILVERFISH_AMBIENT"), + SILVERFISH_WALK("SILVERFISH_WALK", "ENTITY_SILVERFISH_STEP"), + SKELETON_IDLE("SKELETON_IDLE", "ENTITY_SKELETON_AMBIENT"), + SKELETON_DEATH("SKELETON_DEATH", "ENTITY_SKELETON_DEATH"), + SKELETON_HURT("SKELETON_HURT", "ENTITY_SKELETON_HURT"), + SKELETON_WALK("SKELETON_WALK", "ENTITY_SKELETON_STEP"), + SLIME_ATTACK("SLIME_ATTACK", "ENTITY_SLIME_ATTACK"), + SLIME_WALK("SLIME_WALK", "ENTITY_SLIME_JUMP"), + SLIME_WALK2("SLIME_WALK2", "ENTITY_SLIME_SQUISH"), + SPIDER_IDLE("SPIDER_IDLE", "ENTITY_SPIDER_AMBIENT"), + SPIDER_DEATH("SPIDER_DEATH", "ENTITY_SPIDER_DEATH"), + SPIDER_WALK("SPIDER_WALK", "ENTITY_SPIDER_STEP"), + WITHER_DEATH("WITHER_DEATH", "ENTITY_WITHER_DEATH"), + WITHER_HURT("WITHER_HURT", "ENTITY_WITHER_HURT"), + WITHER_IDLE("WITHER_IDLE", "ENTITY_WITHER_AMBIENT"), + WITHER_SHOOT("WITHER_SHOOT", "ENTITY_WITHER_SHOOT"), + WITHER_SPAWN("WITHER_SPAWN", "ENTITY_WITHER_SPAWN"), + WOLF_BARK("WOLF_BARK", "ENTITY_WOLF_AMBIENT"), + WOLF_DEATH("WOLF_DEATH", "ENTITY_WOLF_DEATH"), + WOLF_GROWL("WOLF_GROWL", "ENTITY_WOLF_GROWL"), + WOLF_HOWL("WOLF_HOWL", "ENTITY_WOLF_HOWL"), + WOLF_HURT("WOLF_HURT", "ENTITY_WOLF_HURT"), + WOLF_PANT("WOLF_PANT", "ENTITY_WOLF_PANT"), + WOLF_SHAKE("WOLF_SHAKE", "ENTITY_WOLF_SHAKE"), + WOLF_WALK("WOLF_WALK", "ENTITY_WOLF_STEP"), + WOLF_WHINE("WOLF_WHINE", "ENTITY_WOLF_WHINE"), + ZOMBIE_METAL("ZOMBIE_METAL", "ENTITY_ZOMBIE_ATTACK_IRON_DOOR"), + ZOMBIE_WOOD("ZOMBIE_WOOD", "ENTITY_ZOMBIE_ATTACK_DOOR_WOOD"), + ZOMBIE_WOODBREAK("ZOMBIE_WOODBREAK", "ENTITY_ZOMBIE_BREAK_DOOR_WOOD"), + ZOMBIE_IDLE("ZOMBIE_IDLE", "ENTITY_ZOMBIE_AMBIENT"), + ZOMBIE_DEATH("ZOMBIE_DEATH", "ENTITY_ZOMBIE_DEATH"), + ZOMBIE_HURT("ZOMBIE_HURT", "ENTITY_ZOMBIE_HURT"), + ZOMBIE_INFECT("ZOMBIE_INFECT", "ENTITY_ZOMBIE_INFECT"), + ZOMBIE_UNFECT("ZOMBIE_UNFECT", "ENTITY_ZOMBIE_VILLAGER_CONVERTED"), + ZOMBIE_REMEDY("ZOMBIE_REMEDY", "ENTITY_ZOMBIE_VILLAGER_CURE"), + ZOMBIE_WALK("ZOMBIE_WALK", "ENTITY_ZOMBIE_STEP"), + ZOMBIE_PIG_IDLE("ZOMBIE_PIG_IDLE", "ENTITY_ZOMBIE_PIG_AMBIENT"), + ZOMBIE_PIG_ANGRY("ZOMBIE_PIG_ANGRY", "ENTITY_ZOMBIE_PIG_ANGRY"), + ZOMBIE_PIG_DEATH("ZOMBIE_PIG_DEATH", "ENTITY_ZOMBIE_PIG_DEATH"), + ZOMBIE_PIG_HURT("ZOMBIE_PIG_HURT", "ENTITY_ZOMBIE_PIG_HURT"), + DIG_WOOL("DIG_WOOL", "BLOCK_CLOTH_BREAK"), + DIG_GRASS("DIG_GRASS", "BLOCK_GRASS_BREAK"), + DIG_GRAVEL("DIG_GRAVEL", "BLOCK_GRAVEL_BREAK"), + DIG_SAND("DIG_SAND", "BLOCK_SAND_BREAK"), + DIG_SNOW("DIG_SNOW", "BLOCK_SNOW_BREAK"), + DIG_STONE("DIG_STONE", "BLOCK_STONE_BREAK"), + DIG_WOOD("DIG_WOOD", "BLOCK_WOOD_BREAK"), + FIREWORK_BLAST("FIREWORK_BLAST", "ENTITY_FIREWORK_BLAST"), + FIREWORK_BLAST2("FIREWORK_BLAST2", "ENTITY_FIREWORK_BLAST_FAR"), + FIREWORK_LARGE_BLAST("FIREWORK_LARGE_BLAST", "ENTITY_FIREWORK_LARGE_BLAST"), + FIREWORK_LARGE_BLAST2("FIREWORK_LARGE_BLAST2", "ENTITY_FIREWORK_LARGE_BLAST_FAR"), + FIREWORK_TWINKLE("FIREWORK_TWINKLE", "ENTITY_FIREWORK_TWINKLE"), + FIREWORK_TWINKLE2("FIREWORK_TWINKLE2", "ENTITY_FIREWORK_TWINKLE_FAR"), + FIREWORK_LAUNCH("FIREWORK_LAUNCH", "ENTITY_FIREWORK_LAUNCH"), + SUCCESSFUL_HIT("SUCCESSFUL_HIT", "ENTITY_PLAYER_ATTACK_STRONG"), + HORSE_ANGRY("HORSE_ANGRY", "ENTITY_HORSE_ANGRY"), + HORSE_ARMOR("HORSE_ARMOR", "ENTITY_HORSE_ARMOR"), + HORSE_BREATHE("HORSE_BREATHE", "ENTITY_HORSE_BREATHE"), + HORSE_DEATH("HORSE_DEATH", "ENTITY_HORSE_DEATH"), + HORSE_GALLOP("HORSE_GALLOP", "ENTITY_HORSE_GALLOP"), + HORSE_HIT("HORSE_HIT", "ENTITY_HORSE_HURT"), + HORSE_IDLE("HORSE_IDLE", "ENTITY_HORSE_AMBIENT"), + HORSE_JUMP("HORSE_JUMP", "ENTITY_HORSE_JUMP"), + HORSE_LAND("HORSE_LAND", "ENTITY_HORSE_LAND"), + HORSE_SADDLE("HORSE_SADDLE", "ENTITY_HORSE_SADDLE"), + HORSE_SOFT("HORSE_SOFT", "ENTITY_HORSE_STEP"), + HORSE_WOOD("HORSE_WOOD", "ENTITY_HORSE_STEP_WOOD"), + DONKEY_ANGRY("DONKEY_ANGRY", "ENTITY_DONKEY_ANGRY"), + DONKEY_DEATH("DONKEY_DEATH", "ENTITY_DONKEY_DEATH"), + DONKEY_HIT("DONKEY_HIT", "ENTITY_DONKEY_HURT"), + DONKEY_IDLE("DONKEY_IDLE", "ENTITY_DONKEY_AMBIENT"), + HORSE_SKELETON_DEATH("HORSE_SKELETON_DEATH", "ENTITY_SKELETON_HORSE_DEATH"), + HORSE_SKELETON_HIT("HORSE_SKELETON_HIT", "ENTITY_SKELETON_HORSE_HURT"), + HORSE_SKELETON_IDLE("HORSE_SKELETON_IDLE", "ENTITY_SKELETON_HORSE_AMBIENT"), + HORSE_ZOMBIE_DEATH("HORSE_ZOMBIE_DEATH", "ENTITY_ZOMBIE_HORSE_DEATH"), + HORSE_ZOMBIE_HIT("HORSE_ZOMBIE_HIT", "ENTITY_ZOMBIE_HORSE_HURT"), + HORSE_ZOMBIE_IDLE("HORSE_ZOMBIE_IDLE", "ENTITY_ZOMBIE_HORSE_AMBIENT"), + VILLAGER_DEATH("VILLAGER_DEATH", "ENTITY_VILLAGER_DEATH"), + VILLAGER_HAGGLE("VILLAGER_HAGGLE", "ENTITY_VILLAGER_TRADING"), + VILLAGER_HIT("VILLAGER_HIT", "ENTITY_VILLAGER_HURT"), + VILLAGER_IDLE("VILLAGER_IDLE", "ENTITY_VILLAGER_AMBIENT"), + VILLAGER_NO("VILLAGER_NO", "ENTITY_VILLAGER_NO"), + VILLAGER_YES("VILLAGER_YES", "ENTITY_VILLAGER_YES"); + + private String beforesound; + private String aftersound; + private Sound resolvesound = null; + + private SoundHandler(String beforesound, String aftersound) { + this.beforesound = beforesound; + this.aftersound = aftersound; + } + + public Sound bukkitSound() { + if (resolvesound != null) { + return resolvesound; + } + try { + return this.resolvesound = Sound.valueOf(aftersound); + } catch (Exception error) { + return this.resolvesound = Sound.valueOf(beforesound); + } + } + + public static void playSound(Player player, String sound, int pitch) { + if (!sound.isEmpty()) { + try { + player.playSound(player.getLocation(), SoundHandler.valueOf(sound).bukkitSound(), Integer.MAX_VALUE, pitch); + } catch (Exception error) { + DeluxeVouchers.getConsole().sendMessage("§cFailed to play the sound " + sound + " for the player " + player.getName() + "."); + if (DataHandler.debugerrors) { + error.printStackTrace(); + } + } + } + } + +} \ No newline at end of file diff --git a/src/nl/marido/deluxevouchers/handlers/UpdateHandler.java b/src/nl/marido/deluxevouchers/handlers/UpdateHandler.java new file mode 100644 index 0000000..0bf4552 --- /dev/null +++ b/src/nl/marido/deluxevouchers/handlers/UpdateHandler.java @@ -0,0 +1,59 @@ +package nl.marido.deluxevouchers.handlers; + +import java.io.BufferedReader; +import java.io.InputStreamReader; +import java.net.URL; +import java.net.URLConnection; + +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.player.PlayerJoinEvent; + +import nl.marido.deluxevouchers.DeluxeVouchers; + +public class UpdateHandler implements Listener { + + public static boolean oldversion = false; + + public static void checker() { + if (DataHandler.checkupdates) { + CommandSender console = DeluxeVouchers.getConsole(); + try { + URL checkurl = new URL("https://api.spigotmc.org/legacy/update.php?resource=52480"); + URLConnection connection = checkurl.openConnection(); + String latestversion = new BufferedReader(new InputStreamReader(connection.getInputStream())).readLine(); + String currentversion = DeluxeVouchers.getInstance().getDescription().getVersion(); + if (latestversion.equals(currentversion)) { + console.sendMessage("§fLatest version of DeluxeVouchers detected (" + currentversion + ")."); + oldversion = false; + } else { + console.sendMessage("§cOutdated version of DeluxeVouchers detected (" + currentversion + ")."); + console.sendMessage("§cDownload " + latestversion + ": https://spigotmc.org/resources/52480"); + oldversion = true; + } + } catch (Exception error) { + console.sendMessage("§cFailed to create a connection with the updater host."); + if (DataHandler.debugerrors) { + error.printStackTrace(); + } + } + } + } + + @EventHandler + public void updateWarning(PlayerJoinEvent event) { + Player player = event.getPlayer(); + if (player.hasPermission("deluxevouchers.admin")) { + if (oldversion) { + SoundHandler.playSound(player, DataHandler.oldversionsound, DataHandler.oldversionpitch); + for (String message : DataHandler.oldversionmessage) { + message = message.replaceAll("%version%", DeluxeVouchers.getInstance().getDescription().getVersion()); + player.sendMessage(message); + } + } + } + } + +} \ No newline at end of file diff --git a/src/nl/marido/deluxevouchers/inventory/Confirmation.java b/src/nl/marido/deluxevouchers/inventory/Confirmation.java new file mode 100644 index 0000000..4cd8e35 --- /dev/null +++ b/src/nl/marido/deluxevouchers/inventory/Confirmation.java @@ -0,0 +1,123 @@ +package nl.marido.deluxevouchers.inventory; + +import java.util.HashMap; +import java.util.UUID; + +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 nl.marido.deluxevouchers.handlers.DataHandler; +import nl.marido.deluxevouchers.handlers.SoundHandler; +import nl.marido.deluxevouchers.vouchers.VoucherExecutor; + +public class Confirmation implements Listener { + + public static HashMap vouchercache = new HashMap(); + public static HashMap itemcache = new HashMap(); + public static HashMap slotcache = new HashMap(); + + public static void confirmVoucher(Player player, String voucher, ItemStack item) { + Inventory confirmmenu = Bukkit.createInventory(null, DataHandler.confirmslots, DataHandler.confirmtitle); + SoundHandler.playSound(player, DataHandler.confirmsound, DataHandler.confirmpitch); + ItemStack confirmitem = new ItemStack(Material.valueOf(DataHandler.confirmitemmaterial), 1, (short) DataHandler.confirmitemdata); + ItemMeta confirmitemmeta = confirmitem.getItemMeta(); + confirmitemmeta.setDisplayName(DataHandler.confirmitemname); + confirmitemmeta.setLore(DataHandler.confirmitemlore); + if (DataHandler.confirmitemglow) { + confirmitemmeta.addEnchant(Enchantment.DURABILITY, 1, false); + confirmitemmeta.addItemFlags(ItemFlag.HIDE_ENCHANTS); + } + if (DataHandler.confirmitemunbreakable) { + confirmitemmeta.spigot().setUnbreakable(true); + } + if (DataHandler.confirmitemhideattributes) { + confirmitemmeta.addItemFlags(ItemFlag.HIDE_ATTRIBUTES); + confirmitemmeta.addItemFlags(ItemFlag.HIDE_UNBREAKABLE); + } + confirmitem.setItemMeta(confirmitemmeta); + confirmmenu.setItem(DataHandler.confirmitemslot, confirmitem); + ItemStack cancelitem = new ItemStack(Material.valueOf(DataHandler.cancelitemmaterial), 1, (short) DataHandler.cancelitemdata); + ItemMeta cancelitemmeta = cancelitem.getItemMeta(); + cancelitemmeta.setDisplayName(DataHandler.cancelitemname); + cancelitemmeta.setLore(DataHandler.cancelitemlore); + if (DataHandler.cancelitemglow) { + cancelitemmeta.addEnchant(Enchantment.DURABILITY, 1, false); + cancelitemmeta.addItemFlags(ItemFlag.HIDE_ENCHANTS); + } + if (DataHandler.cancelitemunbreakable) { + cancelitemmeta.spigot().setUnbreakable(true); + } + if (DataHandler.cancelitemhideattributes) { + cancelitemmeta.addItemFlags(ItemFlag.HIDE_ATTRIBUTES); + cancelitemmeta.addItemFlags(ItemFlag.HIDE_UNBREAKABLE); + } + cancelitem.setItemMeta(cancelitemmeta); + confirmmenu.setItem(DataHandler.cancelitemslot, cancelitem); + if (DataHandler.confirmfill) { + 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("§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) { + if (event.getInventory().getTitle().equals(DataHandler.confirmtitle)) { + Player player = (Player) event.getWhoClicked(); + ItemStack clicked = event.getCurrentItem(); + if (clicked != null) { + if (clicked.getItemMeta().hasDisplayName()) { + if (clicked.getItemMeta().getDisplayName().equals(DataHandler.confirmitemname)) { + SoundHandler.playSound(player, DataHandler.confirmitemsound, DataHandler.confirmitempitch); + player.closeInventory(); + UUID uuid = player.getUniqueId(); + String voucher = vouchercache.get(uuid); + ItemStack item = itemcache.get(uuid); + VoucherExecutor.redeemVoucher(player, voucher, item, true); + } + } + if (clicked.getItemMeta().hasDisplayName()) { + if (clicked.getItemMeta().getDisplayName().equals(DataHandler.cancelitemname)) { + SoundHandler.playSound(player, DataHandler.cancelitemsound, DataHandler.cancelitempitch); + player.closeInventory(); + } + } + event.setCancelled(true); + } + } + } + } catch (Exception error) { + if (DataHandler.debugerrors) { + error.printStackTrace(); + } + } + } + +} \ No newline at end of file diff --git a/src/nl/marido/deluxevouchers/inventory/VoucherEditor.java b/src/nl/marido/deluxevouchers/inventory/VoucherEditor.java new file mode 100644 index 0000000..db46bc7 --- /dev/null +++ b/src/nl/marido/deluxevouchers/inventory/VoucherEditor.java @@ -0,0 +1,334 @@ +package nl.marido.deluxevouchers.inventory; + +import java.util.HashMap; +import java.util.UUID; + +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 net.md_5.bungee.api.ChatColor; +import nl.marido.deluxevouchers.handlers.DataHandler; +import nl.marido.deluxevouchers.handlers.SoundHandler; +import nl.marido.deluxevouchers.vouchers.VoucherBuilder; + +public class VoucherEditor implements Listener { + + public static HashMap editor = new HashMap(); + public static HashMap type = new HashMap(); + + public static void openMenu(Player player) { + Inventory editormenu = Bukkit.createInventory(null, DataHandler.editorslots, DataHandler.editortitle); + SoundHandler.playSound(player, DataHandler.editorsound, DataHandler.editorpitch); + for (String voucher : DataHandler.getSection(DataHandler.vouchers, "vouchers")) { + ItemStack item = VoucherBuilder.getVoucher(voucher, 1); + ItemMeta meta = item.getItemMeta(); + meta.setDisplayName(meta.getDisplayName() + " §b§l[CLICK TO EDIT]"); + item.setItemMeta(meta); + editormenu.setItem(editormenu.firstEmpty(), item); + } + if (DataHandler.confirmfill) { + 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("§r"); + fillitem.setItemMeta(fillitemmeta); + for (int empty = 0; empty < editormenu.getSize(); empty++) { + if (editormenu.getItem(empty) == null) { + editormenu.setItem(empty, fillitem); + } + } + } + player.closeInventory(); + player.openInventory(editormenu); + } + + public static void editVoucher(Player player, String voucher, ItemStack item) { + String title = DataHandler.editorvouchertitle; + title = title.replaceAll("%voucher%", voucher); + Inventory editormenu = Bukkit.createInventory(null, DataHandler.editorvoucherslots, title); + ItemMeta meta = item.getItemMeta(); + String name = meta.getDisplayName(); + name = DataHandler.getString(DataHandler.vouchers, "vouchers." + voucher + ".name"); + meta.setDisplayName(name); + item.setItemMeta(meta); + editormenu.setItem(DataHandler.editorvoucherslot, item); + ItemStack backitem = new ItemStack(Material.valueOf(DataHandler.editorbackitemmaterial), 1, (short) DataHandler.editorbackitemdata); + ItemMeta backitemmeta = backitem.getItemMeta(); + backitemmeta.setDisplayName(DataHandler.editorbackitemname); + backitemmeta.setLore(DataHandler.editorbackitemlore); + if (DataHandler.editorbackitemglow) { + backitemmeta.addEnchant(Enchantment.DURABILITY, 1, false); + backitemmeta.addItemFlags(ItemFlag.HIDE_ENCHANTS); + } + if (DataHandler.editorbackitemunbreakable) { + backitemmeta.spigot().setUnbreakable(true); + } + if (DataHandler.editorbackitemhideattributes) { + backitemmeta.addItemFlags(ItemFlag.HIDE_ATTRIBUTES); + backitemmeta.addItemFlags(ItemFlag.HIDE_UNBREAKABLE); + } + backitem.setItemMeta(backitemmeta); + editormenu.setItem(DataHandler.editorbackitemslot, backitem); + ItemStack cloneitem = new ItemStack(Material.valueOf(DataHandler.editorcloneitemmaterial), 1, (short) DataHandler.editorcloneitemdata); + ItemMeta cloneitemmeta = cloneitem.getItemMeta(); + cloneitemmeta.setDisplayName(DataHandler.editorcloneitemname); + cloneitemmeta.setLore(DataHandler.editorcloneitemlore); + if (DataHandler.editorcloneitemglow) { + cloneitemmeta.addEnchant(Enchantment.DURABILITY, 1, false); + cloneitemmeta.addItemFlags(ItemFlag.HIDE_ENCHANTS); + } + if (DataHandler.editorcloneitemunbreakable) { + cloneitemmeta.spigot().setUnbreakable(true); + } + if (DataHandler.editorcloneitemhideattributes) { + cloneitemmeta.addItemFlags(ItemFlag.HIDE_ATTRIBUTES); + cloneitemmeta.addItemFlags(ItemFlag.HIDE_UNBREAKABLE); + } + cloneitem.setItemMeta(cloneitemmeta); + editormenu.setItem(DataHandler.editorcloneitemslot, cloneitem); + ItemStack renameitem = new ItemStack(Material.valueOf(DataHandler.editorrenameitemmaterial), 1, (short) DataHandler.editorrenameitemdata); + ItemMeta renameitemmeta = renameitem.getItemMeta(); + renameitemmeta.setDisplayName(DataHandler.editorrenameitemname); + renameitemmeta.setLore(DataHandler.editorrenameitemlore); + + if (DataHandler.editorrenameitemglow) { + renameitemmeta.addEnchant(Enchantment.DURABILITY, 1, false); + renameitemmeta.addItemFlags(ItemFlag.HIDE_ENCHANTS); + } + if (DataHandler.editorrenameitemunbreakable) { + renameitemmeta.spigot().setUnbreakable(true); + } + if (DataHandler.editorrenameitemhideattributes) { + renameitemmeta.addItemFlags(ItemFlag.HIDE_ATTRIBUTES); + renameitemmeta.addItemFlags(ItemFlag.HIDE_UNBREAKABLE); + } + renameitem.setItemMeta(renameitemmeta); + editormenu.setItem(DataHandler.editorrenameitemslot, renameitem); + if (DataHandler.editorvoucherfill) { + 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("§r"); + fillitem.setItemMeta(fillitemmeta); + for (int empty = 0; empty < editormenu.getSize(); empty++) { + if (editormenu.getItem(empty) == null) { + editormenu.setItem(empty, fillitem); + } + } + } + player.closeInventory(); + editor.put(player.getUniqueId(), voucher); + player.openInventory(editormenu); + } + + @EventHandler + public void clickListener(InventoryClickEvent event) { + try { + if (event.getInventory().getType() == InventoryType.CHEST) { + if (event.getInventory().getTitle().equals(DataHandler.editortitle)) { + for (String voucher : DataHandler.getSection(DataHandler.vouchers, "vouchers")) { + String path = "vouchers." + voucher + "."; + ItemStack item = event.getCurrentItem(); + if (item.getType() == Material.valueOf(DataHandler.getString(DataHandler.vouchers, path + "material"))) { + if (item.getDurability() == (short) DataHandler.getInt(DataHandler.vouchers, path + "data")) { + ItemMeta meta = item.getItemMeta(); + if (meta.hasLore()) { + if (meta.getLore().equals(DataHandler.getStringList(DataHandler.vouchers, path + "lore"))) { + Player player = (Player) event.getWhoClicked(); + SoundHandler.playSound(player, DataHandler.editorvouchersound, DataHandler.editorvoucherpitch); + event.getWhoClicked().closeInventory(); + editVoucher(player, voucher, item); + } + } + } + } + } + event.setCancelled(true); + } + } + } catch (Exception error) { + if (DataHandler.debugerrors) { + error.printStackTrace(); + } + } + } + + @EventHandler + public void editListener(InventoryClickEvent event) { + try { + if (event.getInventory().getType() == InventoryType.CHEST) { + if (editor.containsKey(event.getWhoClicked().getUniqueId())) { + event.setCancelled(true); + } + } + } catch (Exception error) { + if (DataHandler.debugerrors) { + error.printStackTrace(); + } + } + } + + @EventHandler + public void renameListener(InventoryClickEvent event) { + try { + if (event.getInventory().getType() == InventoryType.CHEST) { + if (editor.containsKey(event.getWhoClicked().getUniqueId())) { + ItemStack item = event.getCurrentItem(); + if (item.getType() == Material.valueOf(DataHandler.editorrenameitemmaterial)) { + if (item.getDurability() == DataHandler.editorrenameitemdata) { + ItemMeta meta = item.getItemMeta(); + if (meta.hasDisplayName()) { + if (meta.getDisplayName().equals(DataHandler.editorrenameitemname)) { + if (meta.hasLore()) { + if (meta.getLore().equals(DataHandler.editorrenameitemlore)) { + SoundHandler.playSound((Player) event.getWhoClicked(), DataHandler.editorrenameitemsound, DataHandler.editorrenameitempitch); + String cache = editor.get(event.getWhoClicked().getUniqueId()); + event.getWhoClicked().closeInventory(); + editor.put(event.getWhoClicked().getUniqueId(), cache); + type.put(event.getWhoClicked().getUniqueId(), "rename"); + event.getWhoClicked().sendMessage(DataHandler.editorrenamestart); + } + } + } + } + } + } + } + } + } catch (Exception error) { + if (DataHandler.debugerrors) { + error.printStackTrace(); + } + } + } + + @EventHandler + public void cloneListener(InventoryClickEvent event) { + try { + if (event.getInventory().getType() == InventoryType.CHEST) { + if (editor.containsKey(event.getWhoClicked().getUniqueId())) { + ItemStack item = event.getCurrentItem(); + if (item.getType() == Material.valueOf(DataHandler.editorcloneitemmaterial)) { + if (item.getDurability() == DataHandler.editorcloneitemdata) { + ItemMeta meta = item.getItemMeta(); + if (meta.hasDisplayName()) { + if (meta.getDisplayName().equals(DataHandler.editorcloneitemname)) { + if (meta.hasLore()) { + if (meta.getLore().equals(DataHandler.editorcloneitemlore)) { + SoundHandler.playSound((Player) event.getWhoClicked(), DataHandler.editorcloneitemsound, DataHandler.editorcloneitempitch); + event.getWhoClicked().getInventory().addItem(VoucherBuilder.getVoucher(editor.get(event.getWhoClicked().getUniqueId()), 1)); + ((Player) event.getWhoClicked()).updateInventory(); + String message = DataHandler.editorreceiveitem; + message = message.replaceAll("%voucher%", editor.get(event.getWhoClicked().getUniqueId())); + event.getWhoClicked().sendMessage(message); + event.getWhoClicked().closeInventory(); + } + } + } + } + } + } + } + } + } catch (Exception error) { + if (DataHandler.debugerrors) { + error.printStackTrace(); + } + } + } + + @EventHandler + public void chatListener(AsyncPlayerChatEvent event) { + if (editor.containsKey(event.getPlayer().getUniqueId())) { + if (type.containsKey(event.getPlayer().getUniqueId())) { + if (type.get(event.getPlayer().getUniqueId()).equals("rename")) { + type.remove(event.getPlayer().getUniqueId()); + String renamed = "&r" + event.getMessage(); + String path = "vouchers." + editor.get(event.getPlayer().getUniqueId()) + ".name"; + DataHandler.vouchers.set(path, renamed); + try { + DataHandler.config.save(DataHandler.configfile); + DataHandler.vouchers.save(DataHandler.vouchersfile); + DataHandler.mysql.save(DataHandler.mysqlfile); + } catch (Exception error) { + error.printStackTrace(); + } + DataHandler.cacheData(); + String message = DataHandler.editorrenamedone; + message = message.replaceAll("%renamed%", ChatColor.translateAlternateColorCodes('&', renamed)); + event.getPlayer().sendMessage(message); + editVoucher(event.getPlayer(), editor.get(event.getPlayer().getUniqueId()), VoucherBuilder.getVoucher(editor.get(event.getPlayer().getUniqueId()), 1)); + SoundHandler.playSound(event.getPlayer(), DataHandler.editorvouchersound, DataHandler.editorvoucherpitch); + event.setCancelled(true); + } + } + } + } + + @EventHandler + public void returnListener(InventoryClickEvent event) { + try { + if (event.getInventory().getType() == InventoryType.CHEST) { + if (editor.containsKey(event.getWhoClicked().getUniqueId())) { + ItemStack item = event.getCurrentItem(); + if (item.getType() == Material.valueOf(DataHandler.editorbackitemmaterial)) { + if (item.getDurability() == DataHandler.editorbackitemdata) { + ItemMeta meta = item.getItemMeta(); + if (meta.hasDisplayName()) { + if (meta.getDisplayName().equals(DataHandler.editorbackitemname)) { + if (meta.hasLore()) { + if (meta.getLore().equals(DataHandler.editorbackitemlore)) { + SoundHandler.playSound((Player) event.getWhoClicked(), DataHandler.editorbackitemsound, DataHandler.editorbackitempitch); + event.getWhoClicked().closeInventory(); + openMenu((Player) event.getWhoClicked()); + } + } + } + } + } + } + } + } + } catch (Exception error) { + if (DataHandler.debugerrors) { + error.printStackTrace(); + } + } + } + + @EventHandler + public void closeListener(InventoryCloseEvent event) { + if (editor.containsKey(event.getPlayer().getUniqueId())) { + editor.remove(event.getPlayer().getUniqueId()); + } + } + + @EventHandler + public void leaveListener(PlayerQuitEvent event) { + if (editor.containsKey(event.getPlayer().getUniqueId())) { + editor.remove(event.getPlayer().getUniqueId()); + } + } + +} \ No newline at end of file diff --git a/src/nl/marido/deluxevouchers/liberaries/Bountiful.java b/src/nl/marido/deluxevouchers/liberaries/Bountiful.java new file mode 100644 index 0000000..9c0c16a --- /dev/null +++ b/src/nl/marido/deluxevouchers/liberaries/Bountiful.java @@ -0,0 +1,154 @@ +package nl.marido.deluxevouchers.liberaries; + +import java.lang.reflect.Constructor; +import java.lang.reflect.Field; +import java.lang.reflect.Method; + +import org.bukkit.Bukkit; +import org.bukkit.entity.Player; + +import nl.marido.deluxevouchers.handlers.DataHandler; + +public class Bountiful { + + public static boolean oldmethod; + public static String nmsversion; + + public static void findVersion() { + nmsversion = Bukkit.getServer().getClass().getPackage().getName(); + nmsversion = nmsversion.substring(nmsversion.lastIndexOf(".") + 1); + } + + public static Integer getPlayerProtocol(Player player) { + return Integer.valueOf(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 playerConnection = handle.getClass().getField("playerConnection").get(handle); + playerConnection.getClass().getMethod("sendPacket", new Class[] { getNMSClass("Packet") }).invoke(playerConnection, new Object[] { packet }); + } catch (Exception error) { + if (DataHandler.debugerrors) { + error.printStackTrace(); + } + } + } + + public static Class getNMSClass(String name) { + String version = Bukkit.getServer().getClass().getPackage().getName().split("\\.")[3]; + try { + return Class.forName("net.minecraft.server." + version + "." + name); + } catch (Exception error) { + if (DataHandler.debugerrors) { + error.printStackTrace(); + } + } + return null; + } + + public static void sendTitle(Player player, Integer fadein, Integer stay, Integer fadeout, String title, String subtitle) { + 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 }); + 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 }); + 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 }); + 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 }); + sendPacket(player, subtitlepacket); + } + } catch (Exception error) { + if (DataHandler.debugerrors) { + error.printStackTrace(); + } + } + } + + public static void sendActionBar(Player player, String message) { + if (nmsversion.startsWith("v1_12_")) { + sendActionbarBefore(player, message); + } else { + sendActionbarAfter(player, message); + } + } + + public static void sendActionbarBefore(Player player, String message) { + try { + Class craftplayerclass = Class.forName("org.bukkit.craftbukkit." + nmsversion + ".entity.CraftPlayer"); + Object craftplayer = craftplayerclass.cast(player); + Class playoutchat = Class.forName("net.minecraft.server." + nmsversion + ".PacketPlayOutChat"); + Class simplepacket = Class.forName("net.minecraft.server." + nmsversion + ".Packet"); + Class chatcomponent = Class.forName("net.minecraft.server." + nmsversion + ".ChatComponentText"); + Class basecomponent = Class.forName("net.minecraft.server." + nmsversion + ".IChatBaseComponent"); + Class chatmessagetypeclass = Class.forName("net.minecraft.server." + nmsversion + ".ChatMessageType"); + Object[] chatmessagetypes = chatmessagetypeclass.getEnumConstants(); + Object chatmessagetype = null; + for (Object object : chatmessagetypes) { + if (object.toString().equals("GAME_INFO")) { + 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]); + 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 }); + } catch (Exception error) { + if (DataHandler.debugerrors) { + error.printStackTrace(); + } + } + } + + public static void sendActionbarAfter(Player player, String message) { + try { + Class craftplayerclass = Class.forName("org.bukkit.craftbukkit." + nmsversion + ".entity.CraftPlayer"); + Object craftplayer = craftplayerclass.cast(player); + Class playoutchat = Class.forName("net.minecraft.server." + nmsversion + ".PacketPlayOutChat"); + Class simplepacket = Class.forName("net.minecraft.server." + nmsversion + ".Packet"); + Object customobject; + 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) }); + } 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) }); + } + Method handlemethod = craftplayerclass.getDeclaredMethod("getHandle", new Class[0]); + Object objectinvoked = handlemethod.invoke(craftplayer, new Object[0]); + 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 }); + } catch (Exception error) { + if (DataHandler.debugerrors) { + error.printStackTrace(); + } + } + } + +} \ No newline at end of file diff --git a/src/nl/marido/deluxevouchers/vouchers/ClickListener.java b/src/nl/marido/deluxevouchers/vouchers/ClickListener.java new file mode 100644 index 0000000..5616250 --- /dev/null +++ b/src/nl/marido/deluxevouchers/vouchers/ClickListener.java @@ -0,0 +1,60 @@ +package nl.marido.deluxevouchers.vouchers; + +import java.util.UUID; + +import org.bukkit.Material; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.block.Action; +import org.bukkit.event.player.PlayerInteractEvent; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.ItemMeta; + +import nl.marido.deluxevouchers.handlers.DataHandler; +import nl.marido.deluxevouchers.inventory.Confirmation; + +public class ClickListener implements Listener { + + @EventHandler + public void voucherListener(PlayerInteractEvent event) { + Action action = event.getAction(); + if (action == Action.RIGHT_CLICK_AIR || action == Action.RIGHT_CLICK_BLOCK) { + for (String voucher : DataHandler.getSection(DataHandler.vouchers, "vouchers")) { + String path = "vouchers." + voucher + "."; + Player player = event.getPlayer(); + if (player.hasPermission(DataHandler.getString(DataHandler.vouchers, path + "permission"))) { + ItemStack item = event.getPlayer().getItemInHand(); + if (item.getType() == Material.valueOf(DataHandler.getString(DataHandler.vouchers, path + "material"))) { + if (item.getDurability() == (short) DataHandler.getInt(DataHandler.vouchers, path + "data")) { + ItemMeta meta = item.getItemMeta(); + if (meta.hasDisplayName()) { + if (meta.getDisplayName().equals(DataHandler.getString(DataHandler.vouchers, path + "name"))) { + if (meta.hasLore()) { + if (meta.getLore().equals(DataHandler.getStringList(DataHandler.vouchers, path + "lore"))) { + UUID uuid = player.getUniqueId(); + if (!Cooldowns.entries.containsKey(uuid)) { + if (DataHandler.getBoolean(DataHandler.vouchers, path + "confirm")) { + Confirmation.confirmVoucher(player, voucher, item); + } else { + VoucherExecutor.redeemVoucher(player, voucher, item, true); + } + event.setCancelled(true); + } else { + String message = DataHandler.cooldownmessage; + message = message.replaceAll("%time%", String.valueOf(Cooldowns.entries.get(uuid) + 1)); + message = message.replaceAll("%voucher%", voucher); + player.sendMessage(message); + } + } + } + } + } + } + } + } + } + } + } + +} \ No newline at end of file diff --git a/src/nl/marido/deluxevouchers/vouchers/Cooldowns.java b/src/nl/marido/deluxevouchers/vouchers/Cooldowns.java new file mode 100644 index 0000000..8aecec9 --- /dev/null +++ b/src/nl/marido/deluxevouchers/vouchers/Cooldowns.java @@ -0,0 +1,44 @@ +package nl.marido.deluxevouchers.vouchers; + +import java.util.HashMap; +import java.util.UUID; + +import org.bukkit.Bukkit; +import org.bukkit.scheduler.BukkitRunnable; + +import nl.marido.deluxevouchers.DeluxeVouchers; +import nl.marido.deluxevouchers.handlers.DataHandler; + +public class Cooldowns { + + public static HashMap entries = new HashMap(); + + public static void addCooldown(final UUID uuid, String voucher) { + try { + if (Bukkit.getPlayer(uuid).hasPermission("deluxevouchers.bypass")) { + return; + } + if (DataHandler.getString(DataHandler.vouchers, "vouchers." + voucher + ".cooldown") != null) { + entries.put(uuid, DataHandler.getInt(DataHandler.vouchers, "vouchers." + voucher + ".cooldown")); + } else { + entries.put(uuid, DataHandler.cooldowndelay); + } + new BukkitRunnable() { + public void run() { + if (entries.get(uuid) <= 0) { + entries.remove(uuid); + cancel(); + } else { + entries.put(uuid, entries.get(uuid) - 1); + } + } + }.runTaskTimer(DeluxeVouchers.getInstance(), 0, 20); + } catch (Exception error) { + DeluxeVouchers.getConsole().sendMessage("§cFailed to add cooldown to the UUID " + uuid + "."); + if (DataHandler.debugerrors) { + error.printStackTrace(); + } + } + } + +} \ No newline at end of file diff --git a/src/nl/marido/deluxevouchers/vouchers/VoucherBuilder.java b/src/nl/marido/deluxevouchers/vouchers/VoucherBuilder.java new file mode 100644 index 0000000..4ce9b38 --- /dev/null +++ b/src/nl/marido/deluxevouchers/vouchers/VoucherBuilder.java @@ -0,0 +1,52 @@ +package nl.marido.deluxevouchers.vouchers; + +import java.util.ArrayList; + +import org.bukkit.Material; +import org.bukkit.command.ConsoleCommandSender; +import org.bukkit.enchantments.Enchantment; +import org.bukkit.inventory.ItemFlag; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.ItemMeta; + +import nl.marido.deluxevouchers.DeluxeVouchers; +import nl.marido.deluxevouchers.handlers.DataHandler; + +public class VoucherBuilder { + + public static ItemStack getVoucher(String voucher, int amount) { + try { + String path = "vouchers." + voucher + "."; + String material = DataHandler.getString(DataHandler.vouchers, path + "material"); + String name = DataHandler.getString(DataHandler.vouchers, path + "name"); + ArrayList lore = DataHandler.getStringList(DataHandler.vouchers, path + "lore"); + short data = (short) DataHandler.getInt(DataHandler.vouchers, path + "data"); + ItemStack item = new ItemStack(Material.valueOf(material), amount, data); + ItemMeta meta = item.getItemMeta(); + meta.setDisplayName(name); + meta.setLore(lore); + if (DataHandler.getBoolean(DataHandler.vouchers, path + "glow")) { + meta.addEnchant(Enchantment.DURABILITY, 1, false); + meta.addItemFlags(ItemFlag.HIDE_ENCHANTS); + } + if (DataHandler.getBoolean(DataHandler.vouchers, path + "unbreakable")) { + meta.spigot().setUnbreakable(true); + } + if (DataHandler.getBoolean(DataHandler.vouchers, path + "hide-attributes")) { + meta.addItemFlags(ItemFlag.HIDE_ATTRIBUTES); + meta.addItemFlags(ItemFlag.HIDE_UNBREAKABLE); + } + item.setItemMeta(meta); + return item; + } catch (Exception error) { + ConsoleCommandSender console = DeluxeVouchers.getConsole(); + console.sendMessage("§cFailed to build and create the voucher " + voucher + "."); + console.sendMessage("§cMake sure to update your voucher options or reset it."); + if (DataHandler.debugerrors) { + error.printStackTrace(); + } + } + return null; + } + +} \ No newline at end of file diff --git a/src/nl/marido/deluxevouchers/vouchers/VoucherExecutor.java b/src/nl/marido/deluxevouchers/vouchers/VoucherExecutor.java new file mode 100644 index 0000000..bf33e30 --- /dev/null +++ b/src/nl/marido/deluxevouchers/vouchers/VoucherExecutor.java @@ -0,0 +1,135 @@ +package nl.marido.deluxevouchers.vouchers; + +import org.bukkit.Bukkit; +import org.bukkit.Effect; +import org.bukkit.Material; +import org.bukkit.command.ConsoleCommandSender; +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; +import org.bukkit.potion.PotionEffect; +import org.bukkit.potion.PotionEffectType; + +import nl.marido.deluxevouchers.DeluxeVouchers; +import nl.marido.deluxevouchers.events.VoucherRedeemEvent; +import nl.marido.deluxevouchers.handlers.Connections; +import nl.marido.deluxevouchers.handlers.DataHandler; +import nl.marido.deluxevouchers.handlers.SoundHandler; +import nl.marido.deluxevouchers.liberaries.Bountiful; + +public class VoucherExecutor { + + public static void redeemVoucher(Player player, String voucher, ItemStack item, boolean manual) { + try { + VoucherRedeemEvent event = new VoucherRedeemEvent(player, voucher, item, manual); + Bukkit.getServer().getPluginManager().callEvent(event); + if (event.isCancelled()) { + return; + } + String path = "vouchers." + voucher + "."; + boolean duplication = false; + if (!player.getItemInHand().isSimilar(item)) { + duplication = true; + } + ConsoleCommandSender console = DeluxeVouchers.getConsole(); + if (!duplication) { + if (manual) { + Cooldowns.addCooldown(player.getUniqueId(), voucher); + if (DataHandler.getBoolean(DataHandler.vouchers, path + "remove-item")) { + ItemStack clone = player.getItemInHand().clone(); + if (clone.getAmount() <= 1) { + clone.setType(Material.AIR); + } else { + clone.setAmount(clone.getAmount() - 1); + } + player.setItemInHand(clone); + player.updateInventory(); + } + } + if (DataHandler.getBoolean(DataHandler.vouchers, path + "feed-player")) { + player.setFoodLevel(20); + } + if (DataHandler.getBoolean(DataHandler.vouchers, path + "heal-player")) { + player.setHealth(player.getMaxHealth()); + } + if (DataHandler.getBoolean(DataHandler.vouchers, path + "smite-effect")) { + player.getWorld().strikeLightningEffect(player.getLocation()); + } + String name = player.getName(); + for (String broadcast : DataHandler.getStringList(DataHandler.vouchers, path + "broadcasts")) { + broadcast = broadcast.replaceAll("%player%", name); + broadcast = broadcast.replaceAll("%voucher%", voucher); + for (Player everyone : Bukkit.getOnlinePlayers()) { + everyone.sendMessage(broadcast); + } + } + for (String message : DataHandler.getStringList(DataHandler.vouchers, path + "messages")) { + message = message.replaceAll("%player%", name); + message = message.replaceAll("%voucher%", voucher); + player.sendMessage(message); + } + for (String command : DataHandler.getStringList(DataHandler.vouchers, path + "commands")) { + command = command.replaceAll("%player%", name); + command = command.replaceAll("%voucher%", voucher); + if (command.startsWith("[player]")) { + command = command.replace("[player]", ""); + player.performCommand(command); + } else if (command.startsWith("[op]")) { + command = command.replace("[op]", ""); + boolean wasop = player.isOp(); + player.setOp(true); + player.performCommand(command); + if (!wasop) { + player.setOp(false); + } + } else if (command.startsWith("[chat]")) { + command = command.replace("[chat]", ""); + player.chat(command); + } else if (command.startsWith("[delay]")) { + command = command.replace("[delay]", ""); + throw new UnsupportedOperationException("delay is not supported yet"); + } else { + Bukkit.getServer().dispatchCommand(DeluxeVouchers.getConsole(), command); + } + } + String actionbar = DataHandler.getString(DataHandler.vouchers, path + "actionbar"); + actionbar = actionbar.replaceAll("%player%", name); + actionbar = actionbar.replaceAll("%voucher%", voucher); + Bountiful.sendActionBar(player, actionbar); + String title = DataHandler.getString(DataHandler.vouchers, path + "titles.title"); + title = title.replaceAll("%player%", name); + title = title.replaceAll("%voucher%", voucher); + String subtitle = DataHandler.getString(DataHandler.vouchers, path + "titles.subtitle"); + subtitle = subtitle.replaceAll("%player%", name); + subtitle = subtitle.replaceAll("%voucher%", voucher); + int fadein = DataHandler.getInt(DataHandler.vouchers, path + "titles.fade-in"); + int stay = DataHandler.getInt(DataHandler.vouchers, path + "titles.stay"); + int fadeout = DataHandler.getInt(DataHandler.vouchers, path + "titles.fade-out"); + Bountiful.sendTitle(player, fadein, stay, fadeout, title, subtitle); + String sound = DataHandler.getString(DataHandler.vouchers, path + "sounds.sound"); + int pitch = DataHandler.getInt(DataHandler.vouchers, path + "sounds.pitch"); + SoundHandler.playSound(player, sound, pitch); + String particle = DataHandler.getString(DataHandler.vouchers, path + "particles.particle"); + if (!particle.isEmpty()) { + int amount = DataHandler.getInt(DataHandler.vouchers, path + "particles.amount"); + player.getWorld().playEffect(player.getLocation(), Effect.valueOf(particle), amount); + } + String effect = DataHandler.getString(DataHandler.vouchers, path + "effects.effect"); + if (!effect.isEmpty()) { + int amplifier = DataHandler.getInt(DataHandler.vouchers, path + "particles.amplifier"); + int duration = DataHandler.getInt(DataHandler.vouchers, path + "particles.duration") * 20; + player.addPotionEffect(new PotionEffect(PotionEffectType.getByName(effect), duration, amplifier)); + } + console.sendMessage("§f" + player.getName() + " has successfully redeemed the voucher " + voucher + "."); + Connections.saveRedeem(player, voucher); + } else { + console.sendMessage("§c" + player.getName() + " has failed to duplicate the voucher " + voucher + "."); + } + } catch (Exception error) { + DeluxeVouchers.getConsole().sendMessage("§cFailed to redeem the voucher " + voucher + " for the player " + player.getName() + "."); + if (DataHandler.debugerrors) { + error.printStackTrace(); + } + } + } + +} \ No newline at end of file diff --git a/src/plugin.yml b/src/plugin.yml new file mode 100644 index 0000000..baf34c4 --- /dev/null +++ b/src/plugin.yml @@ -0,0 +1,10 @@ +name: DeluxeVouchers +main: nl.marido.deluxevouchers.DeluxeVouchers +version: 6.0.0 +api-version: 1.13 +author: Marido +description: Enhance your server with awesome customizable vouchers with a lot of features. +commands: + deluxevouchers: + description: Administrator commands for the DeluxeVouchers resource. + aliases: [dv, deluxev, dvouchers, deluxevoucher] \ No newline at end of file diff --git a/src/vouchers.yml b/src/vouchers.yml new file mode 100644 index 0000000..0bba34f --- /dev/null +++ b/src/vouchers.yml @@ -0,0 +1,52 @@ +vouchers: + example: + permission: "deluxevouchers.example" + material: "COOKIE" + # Keep data on 0 if you are on 1.13 or higher. + data: 0 + name: "&6Example Voucher" + lore: + - "&eThank you so much for purchasing my resource DeluxeVouchers." + - "&eListen to the wise words that this nice cookie will tell you." + - "" + - "&cWhat could be inside this voucher?" + - "&6- Marido" + glow: true + confirm: true + unbreakable: true + hide-attributes: false + remove-item: true + feed-player: true + heal-player: true + smite-effect: true + # Enter a custom cooldown if you wish to. + # cooldown: 0 + broadcasts: + - "&6&l> &e%player% has redeemed the voucher &6%voucher%&e. &6&l<" + - "&cUseful addons: [chat] [player], and [op]." + - "&cDo not add them to let the console execute it." + messages: + - "&bYou have redeemed the voucher &6%voucher% &bsuccessfully." + commands: + - "give %player% stick 1" + - "[chat]I love DeluxeVouchers!" + # You can use [chat], [player] and [op]. + # Also use [delay-10] for 10 seconds delay. + # Change 10 to any number you want to have. + actionbar: "&6Actionbar works on every version." + titles: + title: "&6Thank you." + subtitle: "&eYou have redeemed the voucher %voucher%." + fade-in: 10 + stay: 50 + fade-out: 10 + sounds: + sound: "NOTE_PLING" + pitch: 1 + particles: + particle: "FLAME" + amount: 100 + effects: + effect: "SPEED" + amplifier: 2 + duration: 10 \ No newline at end of file