Updating plugin to meet Songoda standards.

This commit is contained in:
GB6 2019-01-15 13:20:30 +01:00
parent d0a66b933e
commit 50a2c7a066
42 changed files with 1392 additions and 487 deletions

View File

@ -2,7 +2,7 @@
<groupId>com.songoda</groupId>
<artifactId>EpicVouchers</artifactId>
<modelVersion>4.0.0</modelVersion>
<version>1.0.9</version>
<version>2.0</version>
<build>
<defaultGoal>clean package</defaultGoal>
<plugins>

View File

@ -3,7 +3,8 @@ package com.songoda.epicvouchers;
import com.songoda.epicvouchers.command.CommandManager;
import com.songoda.epicvouchers.handlers.Connections;
import com.songoda.epicvouchers.libraries.Bountiful;
import com.songoda.epicvouchers.libraries.FastInv;
import com.songoda.epicvouchers.libraries.inventory.FastInv;
import com.songoda.epicvouchers.libraries.inventory.IconInv;
import com.songoda.epicvouchers.listeners.PlayerCommandListener;
import com.songoda.epicvouchers.listeners.PlayerInteractListener;
import com.songoda.epicvouchers.utils.*;
@ -17,6 +18,7 @@ import org.bukkit.plugin.PluginManager;
import org.bukkit.plugin.java.JavaPlugin;
import java.io.File;
import java.util.LinkedHashMap;
public class EpicVouchers extends JavaPlugin {
@ -24,21 +26,19 @@ public class EpicVouchers extends JavaPlugin {
@Getter private final ServerVersion serverVersion = ServerVersion.fromPackageName(Bukkit.getServer().getClass().getPackage().getName());
@Getter private CommandManager commandManager;
@Getter private Connections connections;
private ConsoleCommandSender console;
@Getter private CoolDownManager cooldowns;
@Getter private Locale locale;
private SettingsManager settingsManager;
@Getter private VoucherExecutor voucherExecutor;
@Getter private VoucherManager voucherManager;
@Getter private ConfigWrapper vouchersFile = new ConfigWrapper(this, "", "vouchers.yml");
@Getter private LinkedHashMap<String, Voucher> vouchers;
@Override
public void onEnable() {
instance = this;
console = getServer().getConsoleSender();
console.sendMessage(Methods.formatText("&a============================="));
console.sendMessage(Methods.formatText("&7EpicVouchers " + this.getDescription().getVersion() + " by &5Brianna <3&7!"));
console.sendMessage(Methods.formatText("&7Action: &aEnabling&7..."));
Bukkit.getConsoleSender().sendMessage(Methods.format("&a============================="));
Bukkit.getConsoleSender().sendMessage(Methods.format("&7EpicVouchers " + this.getDescription().getVersion() + " by &5Songoda <3&7!"));
Bukkit.getConsoleSender().sendMessage(Methods.format("&7Action: &aEnabling&7..."));
// Locales
Locale.init(this);
@ -46,15 +46,16 @@ public class EpicVouchers extends JavaPlugin {
this.locale = Locale.getLocale(getConfig().getString("Locale", "en_US"));
FastInv.init(this);
IconInv.init(this);
Debugger.init(this);
this.settingsManager = new SettingsManager(this);
this.settingsManager.updateSettings();
this.vouchers = new LinkedHashMap<>();
getConfig().options().copyDefaults(true);
saveConfig();
this.commandManager = new CommandManager(this);
this.voucherManager = new VoucherManager();
this.connections = new Connections(this);
this.cooldowns = new CoolDownManager(this);
this.voucherExecutor = new VoucherExecutor(this);
@ -71,14 +72,13 @@ public class EpicVouchers extends JavaPlugin {
loadVouchersFromFile();
// Bukkit.getScheduler().runTaskTimerAsynchronously(this, this::saveToFile, 6000, 6000);
Bountiful.findVersion();
connections.openMySQL();
console.sendMessage(Methods.formatText("&a============================="));
Bukkit.getConsoleSender().sendMessage(Methods.format("&a============================="));
}
private void loadVouchersFromFile() {
vouchers.clear();
/*
* Register Vouchers into VoucherManger from configuration
*/
@ -87,9 +87,11 @@ public class EpicVouchers extends JavaPlugin {
Voucher voucher = new Voucher(key);
ConfigurationSection cs = vouchersFile.getConfig().getConfigurationSection("vouchers." + key);
Material material = cs.getString("material") == null || cs.getString("material").equals("") ? Material.PAPER :
Material.matchMaterial(cs.getString("material")) == null ? Material.PAPER : Material.matchMaterial(cs.getString("material"));
voucher.setPermission(cs.getString("permission", ""));
voucher.setMaterial(Material.valueOf(cs.getString("material", "PAPER")));
voucher.setMaterial(material);
voucher.setData((short) cs.getInt("data", 0));
voucher.setName(cs.getString("name", "default"));
voucher.setLore(cs.getStringList("lore"));
@ -115,29 +117,16 @@ public class EpicVouchers extends JavaPlugin {
voucher.setParticle(cs.getString("particles.particle"));
voucher.setParticleAmount(cs.getInt("particles.amount", 0));
voucher.setEffect(cs.getString("effects.effect"));
voucher.setEffectAmplifer(cs.getInt("effects.amplifier"));
voucher.setEffectAmplifier(cs.getInt("effects.amplifier"));
voucher.setItemStack(cs.getItemStack("itemstack", null));
voucherManager.addVoucher(key, voucher);
vouchers.put(key, voucher);
}
}
}
public void saveToFile(Voucher voucher) {
ConfigurationSection cs = vouchersFile.getConfig().getConfigurationSection("vouchers." + voucher.getKey());
cs.set("material", voucher.getMaterial().name());
cs.set("name", voucher.getName(false));
cs.set("lore", voucher.getLore(false));
if (voucher.getData() != 0)
cs.set("data", voucher.getData());
vouchersFile.saveConfig();
}
public void reload() {
vouchersFile.reloadConfig();
getVoucherManager().getVouchers().forEach(this::saveToFile);
loadVouchersFromFile();
reloadConfig();
@ -147,12 +136,11 @@ public class EpicVouchers extends JavaPlugin {
@Override
public void onDisable() {
getVoucherManager().getVouchers().forEach(this::saveToFile);
connections.closeMySQL();
console.sendMessage(Methods.formatText("&a============================="));
console.sendMessage(Methods.formatText("&7EpicVouchers " + this.getDescription().getVersion() + " by &5Brianna <3&7!"));
console.sendMessage(Methods.formatText("&7Action: &cDisabling&7..."));
console.sendMessage(Methods.formatText("&a============================="));
Bukkit.getConsoleSender().sendMessage(Methods.format("&a============================="));
Bukkit.getConsoleSender().sendMessage(Methods.format("&7EpicVouchers " + this.getDescription().getVersion() + " by &5Songoda <3&7!"));
Bukkit.getConsoleSender().sendMessage(Methods.format("&7Action: &cDisabling&7..."));
Bukkit.getConsoleSender().sendMessage(Methods.format("&a============================="));
}
}

View File

@ -53,7 +53,7 @@ public class CommandManager implements CommandExecutor {
}
}
}
commandSender.sendMessage(instance.getLocale().getMessage("general.nametag.prefix") + Methods.formatText(instance.getLocale().getMessage("command.error.notexist")));
commandSender.sendMessage(instance.getLocale().getMessage("general.nametag.prefix") + Methods.format(instance.getLocale().getMessage("command.error.notexist")));
return true;
}
@ -69,8 +69,8 @@ public class CommandManager implements CommandExecutor {
return;
}
if (returnType == AbstractCommand.ReturnType.SYNTAX_ERROR) {
sender.sendMessage(instance.getLocale().getMessage("general.nametag.prefix") + Methods.formatText("&cInvalid Syntax!"));
sender.sendMessage(instance.getLocale().getMessage("general.nametag.prefix") + Methods.formatText("&7The valid syntax is: &6" + command.getSyntax() + "&7."));
sender.sendMessage(instance.getLocale().getMessage("general.nametag.prefix") + Methods.format("&cInvalid Syntax!"));
sender.sendMessage(instance.getLocale().getMessage("general.nametag.prefix") + Methods.format("&7The valid syntax is: &6" + command.getSyntax() + "&7."));
}
return;
}

View File

@ -29,11 +29,11 @@ public class CommandEditor extends AbstractCommand {
@Override
public String getSyntax() {
return "/epicvouchers editor";
return "/vouchers editor";
}
@Override
public String getDescription() {
return "Edit vouchers in a gui.";
return "Edit vouchers in a GUI.";
}
}

View File

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

View File

@ -3,12 +3,16 @@ package com.songoda.epicvouchers.command.commands;
import com.songoda.epicvouchers.EpicVouchers;
import com.songoda.epicvouchers.command.AbstractCommand;
import com.songoda.epicvouchers.events.ForceRedeemEvent;
import com.songoda.epicvouchers.utils.Debugger;
import com.songoda.epicvouchers.voucher.Voucher;
import org.apache.commons.lang.StringUtils;
import org.bukkit.Bukkit;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
public class CommandForce extends AbstractCommand {
public CommandForce(AbstractCommand parent) {
@ -23,46 +27,43 @@ public class CommandForce extends AbstractCommand {
sender.sendMessage(instance.getLocale().getMessage("command.error.noplayer"));
return ReturnType.FAILURE;
}
Voucher voucher = instance.getVoucherManager().getVoucher(args[2]);
if (voucher == null) {
if (!instance.getVouchers().containsKey(args[2])) {
sender.sendMessage(instance.getLocale().getMessage("command.error.novoucher"));
return ReturnType.FAILURE;
}
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.getName(true), amount, sender);
Bukkit.getServer().getPluginManager().callEvent(event);
if (event.isCancelled()) {
return ReturnType.FAILURE;
}
for (int times = 0; times < amount; times++) {
instance.getVoucherExecutor().redeemVoucher(player, voucher, player.getItemInHand(), false);
}
}
}
} else {
Player player = Bukkit.getPlayer(args[1]);
ForceRedeemEvent event = new ForceRedeemEvent(player, voucher.getName(true), amount, sender);
Bukkit.getServer().getPluginManager().callEvent(event);
if (event.isCancelled()) {
return ReturnType.FAILURE;
}
output = player.getName();
for (int times = 0; times < amount; times++) {
instance.getVoucherExecutor().redeemVoucher(player, voucher, player.getItemInHand(), false);
}
}
String message = instance.getLocale().getMessage("command.force.send", output, voucher.getName(true), String.valueOf(amount));
sender.sendMessage(message);
} catch (Exception error) {
Voucher voucher = instance.getVouchers().get(args[2]);
if (!StringUtils.isNumeric(args[3])) {
sender.sendMessage(instance.getLocale().getMessage("command.error.notnumber"));
Debugger.runReport(error);
return ReturnType.SUCCESS;
}
Collection<Player> players;
String output;
int amount = Integer.parseInt(args[3]);
if(args[1].equalsIgnoreCase("everyone")) {
players = (Collection<Player>) Bukkit.getOnlinePlayers();
output = "everyone";
} else {
players = Collections.singletonList(Bukkit.getPlayer(args[1]));
output = Bukkit.getPlayer(args[1]).getName();
}
players.forEach(player -> {
ForceRedeemEvent event = new ForceRedeemEvent(player, voucher.getName(true), amount, sender);
Bukkit.getServer().getPluginManager().callEvent(event);
if (event.isCancelled()) {
return;
}
for (int times = 0; times < amount; times++) {
instance.getVoucherExecutor().redeemVoucher(player, voucher, player.getItemInHand(), false);
}
});
String message = instance.getLocale().getMessage("command.force.send", output, voucher.getName(true), String.valueOf(amount));
sender.sendMessage(message);
return ReturnType.SUCCESS;
}

View File

@ -17,16 +17,22 @@ public class CommandGive extends AbstractCommand {
@Override
protected ReturnType runCommand(EpicVouchers instance, CommandSender sender, String... args) {
if (args.length != 4) return ReturnType.SYNTAX_ERROR;
if (args.length != 4) {
return ReturnType.SYNTAX_ERROR;
}
if (!args[1].equalsIgnoreCase("everyone") && Bukkit.getPlayer(args[1]) == null) {
sender.sendMessage(instance.getLocale().getMessage("command.error.noplayer"));
return ReturnType.FAILURE;
}
Voucher voucher = instance.getVoucherManager().getVoucher(args[2]);
if (voucher == null) {
if (!instance.getVouchers().containsKey(args[2])) {
sender.sendMessage(instance.getLocale().getMessage("command.error.novoucher"));
return ReturnType.FAILURE;
}
Voucher voucher = instance.getVouchers().get(args[2]);
try {
String givemessage = instance.getLocale().getMessage("command.give.send");
String receivemessage = instance.getLocale().getMessage("command.give.receive");

View File

@ -4,6 +4,8 @@ import com.songoda.epicvouchers.EpicVouchers;
import com.songoda.epicvouchers.command.AbstractCommand;
import org.bukkit.command.CommandSender;
import java.util.stream.Collectors;
public class CommandList extends AbstractCommand {
public CommandList(AbstractCommand parent) {
@ -12,12 +14,12 @@ public class CommandList extends AbstractCommand {
@Override
protected ReturnType runCommand(EpicVouchers instance, CommandSender sender, String... args) {
if (args.length != 1) return ReturnType.SYNTAX_ERROR;
if (args.length != 1) {
return ReturnType.SYNTAX_ERROR;
}
String message = instance.getLocale().getMessage("command.list.list");
String list = instance.getVoucherManager().getVouchers().toString();
list = list.replaceAll("[()\\[\\]]", "");
message = message.replaceAll("%list%", list);
String list = String.join(", ", instance.getVouchers().keySet());
String message = instance.getLocale().getMessage("command.list.list").replaceAll("%list%", list);
sender.sendMessage(message);
return ReturnType.SUCCESS;
@ -31,11 +33,11 @@ public class CommandList extends AbstractCommand {
@Override
public String getSyntax() {
return "/epicvouchers list";
return "/vouchers list";
}
@Override
public String getDescription() {
return "Displays a list of all vouchers from the vouchers file.";
return "Displays all vouchers";
}
}

View File

@ -28,7 +28,7 @@ public class CommandReload extends AbstractCommand {
@Override
public String getSyntax() {
return "/epicvouchers reload";
return "/vouchers reload";
}
@Override

View File

@ -29,9 +29,9 @@ public class Connections {
connection = DriverManager.getConnection("jdbc:mysql://" + mysqlIP + ":" + mysqlPort + "/" + mysqlDatabase + "?useSSL=true?autoReconnect=true", mysqlUsername, mysqlPassword);
System.out.println(Methods.formatText("&fSuccessfully created a connection with MySQL."));
System.out.println(Methods.format("&fSuccessfully created a connection with MySQL."));
} catch (Exception error) {
System.out.println(Methods.formatText("&cFailed to create a connection with MySQL."));
System.out.println(Methods.format("&cFailed to create a connection with MySQL."));
Debugger.runReport(error);
}
}
@ -42,9 +42,9 @@ public class Connections {
}
try {
connection.close();
System.out.println(Methods.formatText("&fSuccessfully closed the MySQL connection."));
System.out.println(Methods.format("&fSuccessfully closed the MySQL connection."));
} catch (Exception error) {
System.out.println(Methods.formatText("&cFailed to close the MySQL connection."));
System.out.println(Methods.format("&cFailed to close the MySQL connection."));
Debugger.runReport(error);
}
}
@ -61,9 +61,9 @@ public class Connections {
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();
System.out.println(Methods.formatText("&fSuccessfully saved the redeem in the MySQL database."));
System.out.println(Methods.format("&fSuccessfully saved the redeem in the MySQL database."));
} catch (Exception error) {
System.out.println(Methods.formatText("&cFailed to save the redeem data in the MySQL database."));
System.out.println(Methods.format("&cFailed to save the redeem data in the MySQL database."));
Debugger.runReport(error);
}
}

View File

@ -29,8 +29,6 @@ public class AbstractAnvilGUI {
private static Class<?> ChatMessage;
private static Class<?> EntityHuman;
private static boolean loadedClasses = false;
private Sound closeSound = Sound.ENTITY_PLAYER_LEVELUP;
@SuppressWarnings("unused")
private AnvilClickEventHandler handler;
private Inventory inv;
private Map<AnvilSlot, ItemStack> items = new HashMap<>();
@ -85,7 +83,6 @@ public class AbstractAnvilGUI {
if (!inv.equals(AbstractAnvilGUI.this.inv)) return;
inv.clear();
OnClose onClose = getOnClose();
player.playSound(player.getLocation(), closeSound, 1F, 1F);
Bukkit.getScheduler().scheduleSyncDelayedTask(instance, () -> {
if (onClose != null) onClose.OnClose(player, inv);
destroy();
@ -117,8 +114,9 @@ public class AbstractAnvilGUI {
return player;
}
public void setSlot(AnvilSlot slot, ItemStack item) {
public AbstractAnvilGUI setSlot(AnvilSlot slot, ItemStack item) {
items.put(slot, item);
return this;
}
public void open() {
@ -191,12 +189,9 @@ public class AbstractAnvilGUI {
return onClose;
}
public void setOnClose(OnClose onClose) {
public AbstractAnvilGUI setOnClose(OnClose onClose) {
this.onClose = onClose;
}
public void setCloseSound(Sound sound) {
closeSound = sound;
return this;
}
public enum AnvilSlot {
@ -206,7 +201,7 @@ public class AbstractAnvilGUI {
private int slot;
private AnvilSlot(int slot) {
AnvilSlot(int slot) {
this.slot = slot;
}

View File

@ -14,7 +14,7 @@ import org.bukkit.potion.PotionEffectType;
import java.util.*;
/**
* A complete {@link ItemStack} builder for FastInv (only works on 1.8+).
* A complete {@link ItemStack} inventory for FastInv (only works on 1.8+).
*
* The project is on <a href="https://github.com/MrMicky-FR/FastInv">GitHub</a>
*
@ -130,6 +130,10 @@ public class ItemBuilder {
return this;
}
public ItemBuilder addGlow() {
return enchant(Enchantment.DURABILITY, 1).addFlags(ItemFlag.HIDE_ENCHANTS);
}
/*
* Flags:
*/

View File

@ -1,4 +1,4 @@
package com.songoda.epicvouchers.libraries;
package com.songoda.epicvouchers.libraries.inventory;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
@ -138,13 +138,12 @@ public class FastInv implements InventoryHolder {
* Add an {@link ItemStack} to the menus on specific slot with a {@link FastInvClickListener} to handle clicks.
*
* @param slot The slot of the item.
* @param item The item to add.
* @param listener The FastInvClickListener for the item.
* @param itemStack The icon to add.
* @return This FastInv instance, for chaining.
*/
public FastInv addItem(int slot, ItemStack item, FastInvClickListener listener) {
public FastInv addItem(int slot, ItemStack itemStack, FastInvClickListener listener) {
runSync(() -> {
inventory.setItem(slot, item);
inventory.setItem(slot, itemStack);
if (listener != null) {
itemListeners.put(slot, listener);
@ -174,7 +173,7 @@ public class FastInv implements InventoryHolder {
* @param slotFrom Starting slot to put the item in.
* @param slotTo Ending slot to put the item in.
* @param item The item to add.
* @param listener The FastInvClickListener for the item.
* @param listener The IconClickListener for the item.
* @return This FastInv instance, for chaining.
*/
public FastInv addItem(int slotFrom, int slotTo, ItemStack item, FastInvClickListener listener) {
@ -220,7 +219,7 @@ public class FastInv implements InventoryHolder {
*
* @param slots The slots to place the item.
* @param item The item to add.
* @param listener The FastInvClickListener for the item.
* @param listener The IconClickListener for the item.
* @return This FastInv instance, for chaining.
*/
public FastInv addItem(int[] slots, ItemStack item, FastInvClickListener listener) {

View File

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

View File

@ -0,0 +1,24 @@
package com.songoda.epicvouchers.libraries.inventory.icons;
import com.songoda.epicvouchers.libraries.inventory.IconInv.IconClickEvent;
import org.bukkit.inventory.ItemStack;
import java.util.function.Consumer;
public class Icon {
private ItemStack itemStack;
private Consumer<IconClickEvent> consumer;
public Icon(ItemStack itemStack) {
this(itemStack, event -> {});
}
public Icon(ItemStack item, Consumer<IconClickEvent> consumer) {
this.itemStack = item;
this.consumer = consumer;
}
public void run(IconClickEvent e) { consumer.accept(e); }
public ItemStack getItemStack() { return itemStack; }
}

View File

@ -0,0 +1,14 @@
package com.songoda.epicvouchers.libraries.inventory.icons;
import com.songoda.epicvouchers.EpicVouchers;
import org.apache.commons.lang.StringUtils;
import org.bukkit.Material;
import org.bukkit.entity.Player;
import java.util.function.BiConsumer;
public class IntegerIcon extends StringIcon {
public IntegerIcon(EpicVouchers instance, String string, int current, BiConsumer<Player, Integer> consumer) {
super(instance, Material.IRON_INGOT, string, "" + current, (player, edited) -> consumer.accept(player, Integer.parseInt(edited)), StringUtils::isNumeric);
}
}

View File

@ -0,0 +1,34 @@
package com.songoda.epicvouchers.libraries.inventory.icons;
import com.songoda.epicvouchers.EpicVouchers;
import com.songoda.epicvouchers.libraries.AbstractAnvilGUI;
import com.songoda.epicvouchers.libraries.ItemBuilder;
import com.songoda.epicvouchers.utils.Tuple;
import org.bukkit.entity.Player;
import org.bukkit.event.inventory.ClickType;
import java.util.function.BiConsumer;
import static com.songoda.epicvouchers.libraries.AbstractAnvilGUI.AnvilSlot.INPUT_LEFT;
import static org.bukkit.ChatColor.GRAY;
import static org.bukkit.ChatColor.YELLOW;
import static org.bukkit.Material.PAPER;
public class ListEntryIcon extends Icon {
public ListEntryIcon(EpicVouchers instance, String entry, BiConsumer<Player, String> onRemove, BiConsumer<Player, Tuple<String, String>> onEdit) {
super(new ItemBuilder(PAPER).name(YELLOW + entry).lore(GRAY + "Right click to edit",
GRAY + "Left click to remove").build(), event -> {
if (event.getClickType() == ClickType.LEFT) {
onRemove.accept(event.getPlayer(), entry);
return;
}
AbstractAnvilGUI anvilGUI = new AbstractAnvilGUI(instance, event.getPlayer(), anvilEvent -> onEdit.accept(event.getPlayer(), new Tuple<>(entry, anvilEvent.getName())));
anvilGUI.setSlot(INPUT_LEFT, new ItemBuilder(PAPER).name(entry).build());
anvilGUI.open();
});
}
}

View File

@ -0,0 +1,67 @@
package com.songoda.epicvouchers.libraries.inventory.icons;
import com.songoda.epicvouchers.EpicVouchers;
import com.songoda.epicvouchers.libraries.AbstractAnvilGUI;
import com.songoda.epicvouchers.libraries.ItemBuilder;
import org.bukkit.ChatColor;
import org.bukkit.Material;
import org.bukkit.entity.Player;
import org.bukkit.event.inventory.ClickType;
import org.bukkit.inventory.ItemStack;
import java.util.function.BiConsumer;
import java.util.function.Predicate;
import static com.songoda.epicvouchers.libraries.AbstractAnvilGUI.AnvilSlot.INPUT_LEFT;
import static com.songoda.epicvouchers.utils.Methods.format;
import static org.bukkit.ChatColor.GRAY;
import static org.bukkit.ChatColor.WHITE;
import static org.bukkit.Material.SIGN;
public class StringIcon extends Icon {
public StringIcon(EpicVouchers instance, String string, String current, BiConsumer<Player, String> consumer) {
this(instance, string, current, consumer, s -> true);
}
public StringIcon(EpicVouchers instance, Material material, String string, String current, BiConsumer<Player, String> consumer, Predicate<String> predicate) {
this(instance, new ItemBuilder(material).name(ChatColor.YELLOW + string)
.lore(GRAY + "Current: " + WHITE + current, GRAY + "Right click to edit", GRAY + "Left click to clear").build(), current, consumer, predicate, false);
}
public StringIcon(EpicVouchers instance, String string, String current, BiConsumer<Player, String> consumer, Predicate<String> predicate) {
this(instance, new ItemBuilder(SIGN).name(ChatColor.YELLOW + string)
.lore(GRAY + "Current: " + WHITE + current, GRAY + "Right click to edit", GRAY + "Left click to clear").build(), current, consumer, predicate, false);
}
public StringIcon(EpicVouchers instance, String string, String current, BiConsumer<Player, String> consumer, Predicate<String> predicate, boolean noLeft) {
this(instance, new ItemBuilder(SIGN).name(ChatColor.YELLOW + string)
.lore(GRAY + "Current: " + WHITE + current, GRAY + "Right click to edit", GRAY + "Left click to clear").build(), current, consumer, predicate, noLeft);
}
public StringIcon(EpicVouchers instance, ItemStack itemStack, String current, BiConsumer<Player, String> consumer) {
this(instance, itemStack, current, consumer, s -> true, false);
}
public StringIcon(EpicVouchers instance, ItemStack itemStack, String current, BiConsumer<Player, String> consumer, Predicate<String> predicate, boolean noLeft) {
super(itemStack, event -> {
if (!noLeft && event.getClickType() == ClickType.LEFT) {
consumer.accept(event.getPlayer(), "");
event.getPlayer().sendMessage(format("&7Successfully cleared&7."));
} else {
AbstractAnvilGUI anvilGUI = new AbstractAnvilGUI(instance, event.getPlayer(), anvilEvent -> {
if (!predicate.test(anvilEvent.getName())) {
event.getPlayer().sendMessage(format("&cFailed to set value to: " + anvilEvent.getName()));
return;
}
consumer.accept(event.getPlayer(), anvilEvent.getName());
event.getPlayer().sendMessage(format("&7Successfully set to &r{changed}&7.", "{changed}", anvilEvent.getName()));
});
anvilGUI.setSlot(INPUT_LEFT, new ItemBuilder(SIGN).name(current).build());
anvilGUI.open();
}
});
}
}

View File

@ -0,0 +1,19 @@
package com.songoda.epicvouchers.libraries.inventory.icons;
import com.songoda.epicvouchers.EpicVouchers;
import com.songoda.epicvouchers.libraries.ItemBuilder;
import com.songoda.epicvouchers.menus.sub.StringListMenu;
import com.songoda.epicvouchers.voucher.Voucher;
import org.bukkit.ChatColor;
import org.bukkit.Material;
import java.util.List;
public class StringListIcon extends Icon {
public StringListIcon(EpicVouchers instance, List<String> list, String name, Voucher voucher) {
super(new ItemBuilder(Material.BOOK)
.name(ChatColor.YELLOW + name)
.lore(ChatColor.GRAY + "Click to view")
.build(), event -> new StringListMenu(instance, name, list, name, voucher).open(event.getPlayer()));
}
}

View File

@ -0,0 +1,25 @@
package com.songoda.epicvouchers.libraries.inventory.icons;
import com.songoda.epicvouchers.libraries.ItemBuilder;
import com.songoda.epicvouchers.libraries.inventory.IconInv.IconClickEvent;
import org.bukkit.ChatColor;
import org.bukkit.Material;
import java.util.function.Consumer;
public class ToggleableIcon extends Icon {
private Consumer<IconClickEvent> consumer;
public ToggleableIcon(String displayname, Consumer<IconClickEvent> consumer, boolean state) {
super(new ItemBuilder(Material.PAPER)
.name(ChatColor.YELLOW + displayname)
.lore(state ? ChatColor.GREEN + "ENABLED" : ChatColor.RED + "DISABLED")
.build(), event -> {});
this.consumer = consumer;
}
@Override
public void run(IconClickEvent event) {
consumer.accept(event);
}
}

View File

@ -27,7 +27,7 @@ public class PlayerInteractListener implements Listener {
return;
}
for (Voucher voucher : instance.getVoucherManager().getVouchers()) {
for (Voucher voucher : instance.getVouchers().values()) {
Player player = event.getPlayer();
if (!player.hasPermission(voucher.getPermission())) {
continue;
@ -35,15 +35,22 @@ public class PlayerInteractListener implements Listener {
ItemStack item = event.getPlayer().getItemInHand();
if (item.getType() != voucher.getMaterial() || item.getDurability() != voucher.getData()) {
continue;
if (voucher.getItemStack() != null) {
if(!voucher.getItemStack().isSimilar(item)) {
continue;
}
} else {
if (item.getType() != voucher.getMaterial() || item.getDurability() != voucher.getData()) {
continue;
}
ItemMeta meta = item.getItemMeta();
if (!item.hasItemMeta() || !meta.hasDisplayName() || !meta.getDisplayName().equals(voucher.getName(true)) || !meta.getLore().equals(voucher.getLore(true))) {
continue;
}
}
ItemMeta meta = item.getItemMeta();
if (!meta.hasDisplayName() || !meta.getDisplayName().equals(voucher.getName(true)) || !meta.getLore().equals(voucher.getLore(true))) {
continue;
}
UUID uuid = player.getUniqueId();

View File

@ -1,65 +0,0 @@
package com.songoda.epicvouchers.menus;
import com.songoda.epicvouchers.EpicVouchers;
import com.songoda.epicvouchers.libraries.FastInv;
import com.songoda.epicvouchers.libraries.ItemBuilder;
import com.songoda.epicvouchers.voucher.Voucher;
import org.bukkit.Material;
import java.util.Collections;
import static org.bukkit.ChatColor.*;
import static org.bukkit.enchantments.Enchantment.DURABILITY;
import static org.bukkit.inventory.ItemFlag.HIDE_ENCHANTS;
public class BooleanEditor extends FastInv {
public BooleanEditor(EpicVouchers instance, Voucher voucher) {
super(9, instance.getLocale().getMessage("interface.boolean.title"));
addItem(0, new ItemBuilder(Material.BARRIER)
.name(instance.getLocale().getMessage("interface.editvoucher.backtitle"))
.lore(Collections.singletonList(instance.getLocale().getMessage("interface.editvoucher.backlore")))
.enchant(DURABILITY, 1)
.addFlags(HIDE_ENCHANTS)
.build(), event -> new EditorMenu(instance, voucher).open(event.getPlayer()));
addItem(new ItemBuilder(Material.PAPER).name(YELLOW + "Glow").lore(
voucher.isGlow() ? GREEN + "ENABLED" : RED + "DISABLED"
).build(), event -> voucher.setGlow(!voucher.isGlow()).saveSetting("glow", voucher.isGlow()));
addItem(new ItemBuilder(Material.PAPER).name(YELLOW + "Confirm").lore(
voucher.isConfirm() ? GREEN + "ENABLED" : RED + "DISABLED"
).build(), event -> voucher.setConfirm(!voucher.isConfirm()).saveSetting("confirm", voucher.isConfirm()));
addItem(new ItemBuilder(Material.PAPER).name(YELLOW + "Unbreakable").lore(
voucher.isUnbreakable() ? GREEN + "ENABLED" : RED + "DISABLED"
).build(), event -> voucher.setUnbreakable(!voucher.isUnbreakable()).saveSetting("unbreakable", voucher.isUnbreakable()));
addItem(new ItemBuilder(Material.PAPER).name(YELLOW + "Hide Attributes").lore(
voucher.isHideAttributes() ? GREEN + "ENABLED" : RED + "DISABLED"
).build(), event -> voucher.setHideAttributes(!voucher.isHideAttributes()).saveSetting("hide-attributes", voucher.isHideAttributes()));
addItem(new ItemBuilder(Material.PAPER).name(YELLOW + "Remove Item").lore(
voucher.isRemoveItem() ? GREEN + "ENABLED" : RED + "DISABLED"
).build(), event -> voucher.setRemoveItem(!voucher.isRemoveItem()).saveSetting("remove-item", voucher.isRemoveItem()));
addItem(new ItemBuilder(Material.PAPER).name(YELLOW + "Feed Player").lore(
voucher.isFeedPlayer() ? GREEN + "ENABLED" : RED + "DISABLED"
).build(), event -> voucher.setFeedPlayer(!voucher.isFeedPlayer()).saveSetting("feed-player", voucher.isFeedPlayer()));
addItem(new ItemBuilder(Material.PAPER).name(YELLOW + "Heal Player").lore(
voucher.isHealPlayer() ? GREEN + "ENABLED" : RED + "DISABLED"
).build(), event -> voucher.setHealPlayer(!voucher.isHealPlayer()).saveSetting("heal-player", voucher.isHealPlayer()));
addItem(new ItemBuilder(Material.PAPER).name(YELLOW + "Smite Effect").lore(
voucher.isSmiteEffect() ? GREEN + "ENABLED" : RED + "DISABLED"
).build(), event -> voucher.setSmiteEffect(!voucher.isSmiteEffect()).saveSetting("smite-effect", voucher.isSmiteEffect()));
onClick(event -> {
if(event.getItem() != null && event.getSlot() != 0) {
new BooleanEditor(instance, voucher).open(event.getPlayer());
}
});
}
}

View File

@ -1,7 +1,7 @@
package com.songoda.epicvouchers.menus;
import com.songoda.epicvouchers.EpicVouchers;
import com.songoda.epicvouchers.libraries.FastInv;
import com.songoda.epicvouchers.libraries.inventory.FastInv;
import com.songoda.epicvouchers.libraries.ItemBuilder;
import com.songoda.epicvouchers.utils.ServerVersion;
import com.songoda.epicvouchers.utils.SoundUtils;
@ -20,10 +20,7 @@ public class ConfirmMenu extends FastInv {
addItem(11, new ItemBuilder(Material.EMERALD)
.name(instance.getLocale().getMessage("interface.confirmsettings.confirmitemname"))
.lore(instance.getLocale().getMessage("interface.confirmsettings.confirmitemlore"))
.enchant(DURABILITY, 1)
.addFlags(HIDE_ENCHANTS)
.build(), event -> {
SoundUtils.playSound(event.getPlayer(), "LEVEL_UP", 1);
.addGlow().build(), event -> {
event.getPlayer().closeInventory();
instance.getVoucherExecutor().redeemVoucher(event.getPlayer(), voucher, event.getPlayer().getItemInHand(), true);
});

View File

@ -1,96 +0,0 @@
package com.songoda.epicvouchers.menus;
import com.songoda.epicvouchers.EpicVouchers;
import com.songoda.epicvouchers.libraries.AbstractAnvilGUI;
import com.songoda.epicvouchers.libraries.FastInv;
import com.songoda.epicvouchers.libraries.ItemBuilder;
import com.songoda.epicvouchers.utils.Methods;
import com.songoda.epicvouchers.utils.ServerVersion;
import com.songoda.epicvouchers.utils.SoundUtils;
import com.songoda.epicvouchers.voucher.Voucher;
import org.bukkit.ChatColor;
import org.bukkit.Material;
import org.bukkit.inventory.ItemStack;
import java.util.Collections;
import java.util.HashMap;
import java.util.UUID;
import static com.songoda.epicvouchers.libraries.AbstractAnvilGUI.AnvilSlot.INPUT_LEFT;
import static org.bukkit.Material.NAME_TAG;
import static org.bukkit.Material.PAPER;
import static org.bukkit.Material.STONE;
import static org.bukkit.enchantments.Enchantment.DURABILITY;
import static org.bukkit.inventory.ItemFlag.HIDE_ENCHANTS;
public class EditorMenu extends FastInv {
public EditorMenu(EpicVouchers instance, Voucher voucher) {
super(27, instance.getLocale().getMessage("interface.editvoucher.title").replaceAll("%voucher%", voucher.getKey()));
addItem(13, new ItemBuilder(voucher.toItemStack()).name(Methods.formatText(voucher.getName(true))).build());
addItem(18, new ItemBuilder(Material.BARRIER)
.name(instance.getLocale().getMessage("interface.editvoucher.backtitle"))
.lore(Collections.singletonList(instance.getLocale().getMessage("interface.editvoucher.backlore")))
.enchant(DURABILITY, 1)
.addFlags(HIDE_ENCHANTS)
.build(), event -> new VoucherMenu(instance).open(event.getPlayer()));
addItem(0, new ItemBuilder(Material.FEATHER)
.name(instance.getLocale().getMessage("interface.editvoucher.recivetitle"))
.lore(Collections.singletonList(instance.getLocale().getMessage("interface.editvoucher.recivelore")))
.enchant(DURABILITY, 1)
.addFlags(HIDE_ENCHANTS)
.build(), event -> {
SoundUtils.playSound(event.getPlayer(), "LEVEL_UP", 1);
event.getPlayer().getInventory().addItem(voucher.toItemStack());
String message = instance.getLocale().getMessage("interface.editvoucher.recivemessage").replaceAll("%voucher%", voucher.getName(true));
event.getPlayer().sendMessage(message);
});
addItem(8, new ItemBuilder(NAME_TAG)
.name(instance.getLocale().getMessage("interface.editvoucher.renametitle"))
.lore(Collections.singletonList(instance.getLocale().getMessage("interface.editvoucher.renamelore")))
.enchant(DURABILITY, 1)
.addFlags(HIDE_ENCHANTS)
.build(), event -> {
SoundUtils.playSound(event.getPlayer(), "NOTE_BASS", 1);
event.getPlayer().sendMessage(instance.getLocale().getMessage("interface.editvoucher.renamemessage"));
AbstractAnvilGUI gui = new AbstractAnvilGUI(instance, event.getPlayer(), anvilEvent -> {
voucher.setName(anvilEvent.getName());
event.getPlayer().sendMessage(Methods.formatText(instance.getLocale().getMessage("interface.editvoucher.renamefinish", anvilEvent.getName())));
new EditorMenu(instance, voucher).open(event.getPlayer());
instance.saveToFile(voucher);
});
gui.setOnClose((player, inv) -> new EditorMenu(instance, voucher).open(player));
gui.setSlot(INPUT_LEFT, voucher.toItemStack());
gui.open();
});
addItem(2, new ItemBuilder(STONE)
.name(instance.getLocale().getMessage("interface.editvoucher.itemtitle"))
.lore(Collections.singletonList(instance.getLocale().getMessage("interface.editvoucher.itemlore")))
.enchant(DURABILITY, 1)
.addFlags(HIDE_ENCHANTS)
.build(), event -> new SetItemMenu(instance, voucher).open(event.getPlayer()));
addItem(6, new ItemBuilder(PAPER)
.name(instance.getLocale().getMessage("interface.boolean.itemtitle"))
.lore(Collections.singletonList(instance.getLocale().getMessage("interface.boolean.itemlore")))
.enchant(DURABILITY, 1)
.addFlags(HIDE_ENCHANTS)
.build(), event -> new BooleanEditor(instance, voucher).open(event.getPlayer()));
if (instance.getConfig().getBoolean("Interface.Fill Interfaces With Glass")) {
ItemStack fillItem = instance.getServerVersion().isServerVersionAtLeast(ServerVersion.V1_13) ? new ItemStack(Material.valueOf("GRAY_STAINED_GLASS_PANE")) :
new ItemStack(Material.valueOf("STAINED_GLASS_PANE"), 1, (short) 7);
fill(new ItemBuilder(fillItem).name(ChatColor.RESET.toString()).build());
}
}
}

View File

@ -0,0 +1,52 @@
package com.songoda.epicvouchers.menus;
import com.songoda.epicvouchers.EpicVouchers;
import com.songoda.epicvouchers.libraries.ItemBuilder;
import com.songoda.epicvouchers.libraries.inventory.FastInv;
import com.songoda.epicvouchers.menus.sub.SetItemMenu;
import com.songoda.epicvouchers.utils.ServerVersion;
import com.songoda.epicvouchers.voucher.Voucher;
import org.bukkit.ChatColor;
import org.bukkit.Material;
import org.bukkit.inventory.ItemStack;
import static com.songoda.epicvouchers.utils.Methods.format;
import static org.bukkit.ChatColor.GRAY;
import static org.bukkit.ChatColor.YELLOW;
import static org.bukkit.Material.BOOK;
import static org.bukkit.Material.STONE;
public class OptionMenu extends FastInv {
public OptionMenu(EpicVouchers instance, Voucher voucher) {
super(27, "Options: " + voucher.getKey());
addItem(13, new ItemBuilder(voucher.toItemStack()).name(format(voucher.getName(true))).build());
addItem(18, new ItemBuilder(Material.BARRIER)
.name(YELLOW + "Return")
.lore(GRAY + "Return to the editor")
.addGlow().build(), event -> new VoucherMenu(instance).open(event.getPlayer()));
addItem(0, new ItemBuilder(Material.FEATHER)
.name(format("&6Receive voucher"))
.lore(format("&eReceive a copy of the voucher"))
.addGlow()
.build(), event -> event.getPlayer().getInventory().addItem(voucher.toItemStack()));
addItem(26, new ItemBuilder(STONE)
.name(format("&6Set item"))
.lore(format("&eSet the item of your voucher."))
.addGlow().build(), event -> new SetItemMenu(instance, voucher).open(event.getPlayer()));
addItem(8, new ItemBuilder(BOOK)
.name(format("&6Change all options"))
.lore(format("&eSet the options of your voucher."))
.build(), event -> new VoucherEditorMenu(instance, voucher).open(event.getPlayer()));
fill(new ItemBuilder(instance.getServerVersion().isServerVersionAtLeast(ServerVersion.V1_13) ?
new ItemStack(Material.valueOf("GRAY_STAINED_GLASS_PANE")) :
new ItemStack(Material.valueOf("STAINED_GLASS_PANE"), 1, (short) 7)).name(ChatColor.RESET.toString()).build());
}
}

View File

@ -1,77 +0,0 @@
package com.songoda.epicvouchers.menus;
import com.songoda.epicvouchers.EpicVouchers;
import com.songoda.epicvouchers.libraries.FastInv;
import com.songoda.epicvouchers.libraries.ItemBuilder;
import com.songoda.epicvouchers.utils.ServerVersion;
import com.songoda.epicvouchers.voucher.Voucher;
import org.bukkit.ChatColor;
import org.bukkit.Material;
import org.bukkit.inventory.ItemStack;
import java.util.Collections;
import static org.bukkit.enchantments.Enchantment.DURABILITY;
import static org.bukkit.inventory.ItemFlag.HIDE_ENCHANTS;
public class SetItemMenu extends FastInv {
private final EpicVouchers instance;
public SetItemMenu(EpicVouchers instance, Voucher voucher) {
super(27, instance.getLocale().getMessage("interface.setitem.title"));
this.instance = instance;
setDefaultCancel(false);
ItemStack fillItem = instance.getServerVersion().isServerVersionAtLeast(ServerVersion.V1_13) ? new ItemStack(Material.valueOf("GRAY_STAINED_GLASS_PANE")) :
new ItemStack(Material.valueOf("STAINED_GLASS_PANE"), 1, (short) 7);
fill(fillItem, event -> event.setCancelled(true));
addItem(13, null);
addItem(18, new ItemBuilder(Material.BARRIER)
.name(instance.getLocale().getMessage("interface.editvoucher.backtitle"))
.lore(Collections.singletonList(instance.getLocale().getMessage("interface.editvoucher.backlore")))
.enchant(DURABILITY, 1)
.addFlags(HIDE_ENCHANTS)
.build(), event -> {
event.setCancelled(true);
new EditorMenu(instance, voucher).open(event.getPlayer());
});
addItem(26, new ItemBuilder(Material.ANVIL).name(ChatColor.GREEN + "Confirm").build(), event -> {
event.setCancelled(true);
if (event.getInventory().getInventory().getItem(13) == null) {
new EditorMenu(instance, voucher).open(event.getPlayer());
return;
}
ItemStack itemStack = event.getInventory().getInventory().getItem(13);
voucher.setMaterial(itemStack.getType());
if (itemStack.getDurability() != 0) {
voucher.setData(itemStack.getDurability());
}
if (!itemStack.hasItemMeta()) {
new EditorMenu(instance, voucher).open(event.getPlayer());
return;
}
if (itemStack.getItemMeta().hasDisplayName()) {
voucher.setName(itemStack.getItemMeta().getDisplayName());
}
if (itemStack.getItemMeta().hasLore()) {
voucher.setLore(itemStack.getItemMeta().getLore());
}
new EditorMenu(instance, voucher).open(event.getPlayer());
instance.saveToFile(voucher);
});
}
}

View File

@ -0,0 +1,109 @@
package com.songoda.epicvouchers.menus;
import com.songoda.epicvouchers.EpicVouchers;
import com.songoda.epicvouchers.libraries.ItemBuilder;
import com.songoda.epicvouchers.libraries.inventory.IconInv;
import com.songoda.epicvouchers.libraries.inventory.icons.Icon;
import com.songoda.epicvouchers.libraries.inventory.icons.StringIcon;
import com.songoda.epicvouchers.libraries.inventory.icons.StringListIcon;
import com.songoda.epicvouchers.libraries.inventory.icons.ToggleableIcon;
import com.songoda.epicvouchers.menus.sub.EffectsMenu;
import com.songoda.epicvouchers.menus.sub.ParticlesMenu;
import com.songoda.epicvouchers.menus.sub.SoundsMenu;
import com.songoda.epicvouchers.menus.sub.TitlesMenu;
import com.songoda.epicvouchers.voucher.Voucher;
import org.bukkit.Material;
import org.bukkit.entity.Player;
import org.bukkit.event.inventory.ClickType;
import static org.bukkit.ChatColor.GRAY;
import static org.bukkit.ChatColor.YELLOW;
import static org.bukkit.Material.BOOK;
public class VoucherEditorMenu extends IconInv {
private final EpicVouchers instance;
private final Voucher voucher;
public VoucherEditorMenu(EpicVouchers instance, Voucher voucher) {
super(36, "Voucher options");
this.instance = instance;
this.voucher = voucher;
//Booleans
addIcon(0, new ToggleableIcon("Glow", event -> voucher.setGlow(!voucher.isGlow()).saveSetting("glow", voucher.isGlow()), voucher.isGlow()));
addIcon(1, new ToggleableIcon("Confirm", event -> voucher.setConfirm(!voucher.isConfirm()).saveSetting("confirm", voucher.isConfirm()), voucher.isConfirm()));
addIcon(2, new ToggleableIcon("Unbreakable", event -> voucher.setUnbreakable(!voucher.isUnbreakable()).saveSetting("unbreakable", voucher.isUnbreakable()), voucher.isUnbreakable()));
addIcon(3, new ToggleableIcon("Hide Attributes", event -> voucher.setHideAttributes(!voucher.isHideAttributes()).saveSetting("hide-attributes", voucher.isHideAttributes()), voucher.isHideAttributes()));
addIcon(4, new ToggleableIcon("Remove Item", event -> voucher.setRemoveItem(!voucher.isRemoveItem()).saveSetting("remove-item", voucher.isRemoveItem()), voucher.isRemoveItem()));
addIcon(5, new ToggleableIcon("Feed Player", event -> voucher.setFeedPlayer(!voucher.isFeedPlayer()).saveSetting("feed-player", voucher.isFeedPlayer()), voucher.isFeedPlayer()));
addIcon(6, new ToggleableIcon("Heal Player", event -> voucher.setHealPlayer(!voucher.isHealPlayer()).saveSetting("heal-player", voucher.isHealPlayer()), voucher.isHealPlayer()));
addIcon(7, new ToggleableIcon("Smite Effect", event -> voucher.setSmiteEffect(!voucher.isSmiteEffect()).saveSetting("smite-effect", voucher.isSmiteEffect()), voucher.isSmiteEffect()));
//Strings
addIcon(9, new StringIcon(instance, "Permission", voucher.getPermission(), (player, editString) -> {
voucher.setPermission(editString).saveSetting("permission", editString);
reopen(player);
}));
addIcon(10, new StringIcon(instance, "Actionbar", voucher.getActionBar(), (player, editString) -> {
voucher.setActionBar(editString).saveSetting("actionbar", editString);
reopen(player);
}));
addIcon(11, new StringIcon(instance, "Material", voucher.getMaterial().toString(), (player, editString) -> {
voucher.setMaterial(Material.valueOf(editString)).saveSetting("material", editString);
reopen(player);
}, string -> !string.isEmpty() && Material.matchMaterial(string) != null, true));
addIcon(12, new StringIcon(instance, "Name", voucher.getName(false), (player, editString) -> {
voucher.setName(editString).saveSetting("name", editString);
reopen(player);
}));
// Sections
addIcon(18, new StringListIcon(instance, voucher.getCommands(), "Commands", voucher));
addIcon(19, new StringListIcon(instance, voucher.getBroadcasts(false), "Broadcasts", voucher));
addIcon(20, new StringListIcon(instance, voucher.getMessages(false), "Messages", voucher));
addIcon(21, new StringListIcon(instance, voucher.getLore(false), "Lore", voucher));
addIcon(22, new Icon(new ItemBuilder(BOOK).name(YELLOW + "Titles").lore(GRAY + "Click to view").build(), event -> new TitlesMenu(instance, voucher).open(event.getPlayer())));
addIcon(23, new Icon(new ItemBuilder(BOOK).name(YELLOW + "Sounds").lore(GRAY + "Click to view").build(), event -> new SoundsMenu(instance, voucher).open(event.getPlayer())));
addIcon(24, new Icon(new ItemBuilder(BOOK).name(YELLOW + "Particles").lore(GRAY + "Click to view").build(), event -> new ParticlesMenu(instance, voucher).open(event.getPlayer())));
addIcon(25, new Icon(new ItemBuilder(BOOK).name(YELLOW + "Effects").lore(GRAY + "Click to view").build(), event -> new EffectsMenu(instance, voucher).open(event.getPlayer())));
// Misc
addIcon(getInventory().getSize() - 5, voucher.toItemStack());
addIcon(getInventory().getSize() - 9, new ItemBuilder(Material.BARRIER)
.name(YELLOW + "Return")
.lore(GRAY + "Return to the editor")
.build(), event -> new OptionMenu(instance, voucher).open(event.getPlayer()));
onClick(event -> {
if (event.getItem() != null && event.getClickType() != ClickType.RIGHT && event.getSlot() < 18) {
reopen(event.getPlayer());
}
});
}
private void reopen(Player player) {
new VoucherEditorMenu(instance, voucher).open(player);
}
}

View File

@ -1,40 +1,59 @@
package com.songoda.epicvouchers.menus;
import com.songoda.epicvouchers.EpicVouchers;
import com.songoda.epicvouchers.libraries.FastInv;
import com.songoda.epicvouchers.libraries.AbstractAnvilGUI;
import com.songoda.epicvouchers.libraries.ItemBuilder;
import com.songoda.epicvouchers.utils.Methods;
import com.songoda.epicvouchers.libraries.inventory.IconInv;
import com.songoda.epicvouchers.libraries.inventory.icons.Icon;
import com.songoda.epicvouchers.utils.ServerVersion;
import com.songoda.epicvouchers.utils.SoundUtils;
import com.songoda.epicvouchers.voucher.Voucher;
import org.bukkit.ChatColor;
import org.bukkit.Material;
import org.bukkit.inventory.ItemStack;
public class VoucherMenu extends FastInv {
import static com.songoda.epicvouchers.libraries.AbstractAnvilGUI.AnvilSlot.INPUT_LEFT;
import static com.songoda.epicvouchers.utils.Methods.format;
import static org.bukkit.Material.PAPER;
public class VoucherMenu extends IconInv {
public VoucherMenu(EpicVouchers instance) {
super(Math.ceil(instance.getVoucherManager().getVouchers().size() / 9.0) > 81 ? 81 : (int) Math.ceil(instance.getVoucherManager().getVouchers().size() / 9.0) * 9,
instance.getLocale().getMessage("interface.editor.title"));
for (Voucher voucher : instance.getVoucherManager().getVouchers()) {
ItemBuilder item = new ItemBuilder(voucher.toItemStack());
item.name(item.getName() + Methods.formatText(" &b&l[CLICK TO EDIT]"));
super((int) (Math.ceil(instance.getVouchers().size() / 9.0) * 9 + (instance.getVouchers().size() % 9 == 0 ? 9 : 0)), "Vouchers");
for (Voucher voucher : instance.getVouchers().values()) {
if (getInventory().firstEmpty() != -1) {
addItem(getInventory().firstEmpty(), item.build(), event -> {
SoundUtils.playSound(event.getPlayer(), "NOTE_PIANO", 1);
new EditorMenu(instance, voucher).open(event.getPlayer());
});
addIcon(getInventory().firstEmpty(), voucher.toItemStack(), event -> new OptionMenu(instance, voucher).open(event.getPlayer()));
}
}
if (instance.getConfig().getBoolean("Interface.Fill Interfaces With Glass")) {
ItemStack fillItem = instance.getServerVersion().isServerVersionAtLeast(ServerVersion.V1_13) ? new ItemStack(Material.valueOf("GRAY_STAINED_GLASS_PANE")) :
new ItemStack(Material.valueOf("STAINED_GLASS_PANE"), 1, (short) 7);
addIcon(getInventory().getSize() - 1, new Icon(new ItemBuilder(PAPER)
.name(format("&6New voucher"))
.lore(format("&eCreate a new voucher with set id.")).build(), event -> {
AbstractAnvilGUI anvilGUI = new AbstractAnvilGUI(instance, event.getPlayer(), anvilEvent -> {
if (instance.getVouchers().containsKey(anvilEvent.getName())) {
event.getPlayer().sendMessage(format("&cAlready a voucher registered with the id: " + anvilEvent.getName()));
new VoucherMenu(instance).open(event.getPlayer());
return;
}
fill(new ItemBuilder(fillItem).name(ChatColor.RESET.toString()).build());
}
Voucher voucher = new Voucher(anvilEvent.getName());
voucher.setMaterial(PAPER);
voucher.setName("&f" + anvilEvent.getName());
instance.getVouchers().put(anvilEvent.getName(), voucher);
instance.getVouchersFile().getConfig().set("vouchers." + anvilEvent.getName() + ".material", voucher.getMaterial().toString());
instance.getVouchersFile().getConfig().set("vouchers." + anvilEvent.getName() + ".name", voucher.getName(false));
instance.getVouchersFile().saveConfig();
event.getPlayer().sendMessage(format("&7Successfully created voucher with id &r{id}&7.", "{id}", anvilEvent.getName()));
new VoucherMenu(instance).open(event.getPlayer());
});
anvilGUI.setSlot(INPUT_LEFT, new ItemBuilder(PAPER).name("Insert id").build());
anvilGUI.open();
}));
fill(new Icon(new ItemBuilder(instance.getServerVersion().isServerVersionAtLeast(ServerVersion.V1_13) ?
new ItemStack(Material.valueOf("GRAY_STAINED_GLASS_PANE")) :
new ItemStack(Material.valueOf("STAINED_GLASS_PANE"), 1, (short) 7)).name(ChatColor.RESET.toString()).build()));
}
}

View File

@ -0,0 +1,41 @@
package com.songoda.epicvouchers.menus.sub;
import com.songoda.epicvouchers.EpicVouchers;
import com.songoda.epicvouchers.libraries.ItemBuilder;
import com.songoda.epicvouchers.libraries.inventory.IconInv;
import com.songoda.epicvouchers.libraries.inventory.icons.IntegerIcon;
import com.songoda.epicvouchers.libraries.inventory.icons.StringIcon;
import com.songoda.epicvouchers.menus.VoucherEditorMenu;
import com.songoda.epicvouchers.voucher.Voucher;
import org.bukkit.Material;
import org.bukkit.potion.PotionEffectType;
import static org.bukkit.ChatColor.GRAY;
import static org.bukkit.ChatColor.YELLOW;
public class EffectsMenu extends IconInv {
public EffectsMenu(EpicVouchers instance, Voucher voucher) {
super(9, "Titles");
addIcon(1, new StringIcon(instance, "Effect", voucher.getEffect(), (player, editString) -> {
voucher.setEffect(editString).saveSetting("effects.effect", editString);
new EffectsMenu(instance, voucher).open(player);
}));
addIcon(2, new IntegerIcon(instance, "Effect Amplifier", voucher.getEffectAmplifier(), (player, number) -> {
voucher.setEffectAmplifier(number).saveSetting("effects.amplifier", number);
new EffectsMenu(instance, voucher).open(player);
}));
addIcon(3, new IntegerIcon(instance, "Duration", voucher.getEffectDuration(), (player, number) -> {
voucher.setEffectDuration(number).saveSetting("effects.duration", number);
new EffectsMenu(instance, voucher).open(player);
}));
addIcon(0, new ItemBuilder(Material.BARRIER)
.name(YELLOW + "Return")
.lore(GRAY + "Return to the editor")
.build(), event -> new VoucherEditorMenu(instance, voucher).open(event.getPlayer()));
}
}

View File

@ -0,0 +1,35 @@
package com.songoda.epicvouchers.menus.sub;
import com.songoda.epicvouchers.EpicVouchers;
import com.songoda.epicvouchers.libraries.ItemBuilder;
import com.songoda.epicvouchers.libraries.inventory.IconInv;
import com.songoda.epicvouchers.libraries.inventory.icons.IntegerIcon;
import com.songoda.epicvouchers.libraries.inventory.icons.StringIcon;
import com.songoda.epicvouchers.menus.VoucherEditorMenu;
import com.songoda.epicvouchers.voucher.Voucher;
import org.bukkit.Material;
import static org.bukkit.ChatColor.GRAY;
import static org.bukkit.ChatColor.YELLOW;
public class ParticlesMenu extends IconInv {
public ParticlesMenu(EpicVouchers instance, Voucher voucher) {
super(9, "Particles");
addIcon(1, new StringIcon(instance, "Particle", voucher.getParticle(), (player, editString) -> {
voucher.setParticle(editString).saveSetting("particles.particle", editString);
new ParticlesMenu(instance, voucher).open(player);
}));
addIcon(2, new IntegerIcon(instance, "Stay", voucher.getParticleAmount(), (player, number) -> {
voucher.setParticleAmount(number).saveSetting("particles.amount", number);
new ParticlesMenu(instance, voucher).open(player);
}));
addIcon(0, new ItemBuilder(Material.BARRIER)
.name(YELLOW + "Return")
.lore(GRAY + "Return to the editor")
.build(), event -> new VoucherEditorMenu(instance, voucher).open(event.getPlayer()));
}
}

View File

@ -0,0 +1,88 @@
package com.songoda.epicvouchers.menus.sub;
import com.songoda.epicvouchers.EpicVouchers;
import com.songoda.epicvouchers.libraries.ItemBuilder;
import com.songoda.epicvouchers.libraries.inventory.FastInv;
import com.songoda.epicvouchers.menus.OptionMenu;
import com.songoda.epicvouchers.utils.ServerVersion;
import com.songoda.epicvouchers.voucher.Voucher;
import org.bukkit.ChatColor;
import org.bukkit.Material;
import org.bukkit.event.inventory.ClickType;
import org.bukkit.inventory.ItemStack;
import java.util.ArrayList;
import static com.songoda.epicvouchers.utils.Methods.format;
import static org.bukkit.ChatColor.GRAY;
import static org.bukkit.ChatColor.YELLOW;
public class SetItemMenu extends FastInv {
public SetItemMenu(EpicVouchers instance, Voucher voucher) {
super(27, "Set item");
setDefaultCancel(false);
fill(new ItemBuilder(instance.getServerVersion().isServerVersionAtLeast(ServerVersion.V1_13) ?
new ItemStack(Material.valueOf("GRAY_STAINED_GLASS_PANE")) :
new ItemStack(Material.valueOf("STAINED_GLASS_PANE"), 1, (short) 7))
.name(ChatColor.RESET.toString()).build(), event -> event.setCancelled(true));
addItem(13, null);
addItem(18, new ItemBuilder(Material.BARRIER)
.name(YELLOW + "Return")
.lore(GRAY + "Return to the editor")
.addGlow().build(), event -> {
event.setCancelled(true);
new OptionMenu(instance, voucher).open(event.getPlayer());
});
addItem(26, new ItemBuilder(Material.ANVIL)
.name(ChatColor.GREEN + "Confirm")
.lore(GRAY + "Left click to save without NBT", GRAY + "Right click to save with NBT")
.build(), event -> {
event.setCancelled(true);
if (event.getInventory().getInventory().getItem(13) == null) {
new OptionMenu(instance, voucher).open(event.getPlayer());
return;
}
ItemStack itemStack = event.getInventory().getInventory().getItem(13);
if(event.getClickType() == ClickType.RIGHT) {
new OptionMenu(instance, voucher).open(event.getPlayer());
voucher.setName("");
voucher.setLore(null);
voucher.setItemStack(itemStack);
voucher.saveSetting("itemstack", itemStack);
}
voucher.setMaterial(itemStack.getType());
voucher.saveSetting("material", itemStack.getType().toString());
if (itemStack.getDurability() != 0) {
voucher.setData(itemStack.getDurability());
}
if (!itemStack.hasItemMeta()) {
new OptionMenu(instance, voucher).open(event.getPlayer());
return;
}
if (itemStack.getItemMeta().hasDisplayName()) {
voucher.setName(itemStack.getItemMeta().getDisplayName());
voucher.saveSetting("name", itemStack.getItemMeta().getDisplayName());
}
if (itemStack.getItemMeta().hasLore()) {
voucher.setLore(itemStack.getItemMeta().getLore());
voucher.saveSetting("lore", itemStack.getItemMeta().getLore());
}
new OptionMenu(instance, voucher).open(event.getPlayer());
});
}
}

View File

@ -0,0 +1,38 @@
package com.songoda.epicvouchers.menus.sub;
import com.google.common.base.Enums;
import com.songoda.epicvouchers.EpicVouchers;
import com.songoda.epicvouchers.libraries.ItemBuilder;
import com.songoda.epicvouchers.libraries.inventory.IconInv;
import com.songoda.epicvouchers.libraries.inventory.icons.IntegerIcon;
import com.songoda.epicvouchers.libraries.inventory.icons.StringIcon;
import com.songoda.epicvouchers.menus.VoucherEditorMenu;
import com.songoda.epicvouchers.utils.SoundUtils;
import com.songoda.epicvouchers.voucher.Voucher;
import org.bukkit.Material;
import org.bukkit.Sound;
import static org.bukkit.ChatColor.GRAY;
import static org.bukkit.ChatColor.YELLOW;
public class SoundsMenu extends IconInv {
public SoundsMenu(EpicVouchers instance, Voucher voucher) {
super(9, "Sound");
addIcon(1, new StringIcon(instance, "Sound", voucher.getSound(), (player, editString) -> {
voucher.setSound(editString).saveSetting("sounds.sound", editString);
new SoundsMenu(instance, voucher).open(player);
}, string -> Enums.getIfPresent(SoundUtils.class, string).isPresent()));
addIcon(2, new IntegerIcon(instance, "Pitch", voucher.getSoundPitch(), (player, number) -> {
voucher.setSoundPitch(number).saveSetting("sounds.pitch", number);
new SoundsMenu(instance, voucher).open(player);
}));
addIcon(0, new ItemBuilder(Material.BARRIER)
.name(YELLOW + "Return")
.lore(GRAY + "Return to the editor")
.build(), event -> new VoucherEditorMenu(instance, voucher).open(event.getPlayer()));
}
}

View File

@ -0,0 +1,61 @@
package com.songoda.epicvouchers.menus.sub;
import com.songoda.epicvouchers.EpicVouchers;
import com.songoda.epicvouchers.libraries.AbstractAnvilGUI;
import com.songoda.epicvouchers.libraries.ItemBuilder;
import com.songoda.epicvouchers.libraries.inventory.IconInv;
import com.songoda.epicvouchers.libraries.inventory.icons.ListEntryIcon;
import com.songoda.epicvouchers.menus.VoucherEditorMenu;
import com.songoda.epicvouchers.voucher.Voucher;
import org.bukkit.Material;
import org.bukkit.inventory.ItemStack;
import java.util.List;
import java.util.stream.Collectors;
import static com.songoda.epicvouchers.libraries.AbstractAnvilGUI.AnvilSlot.INPUT_LEFT;
import static org.bukkit.ChatColor.*;
import static org.bukkit.Material.PAPER;
public class StringListMenu extends IconInv {
public StringListMenu(EpicVouchers instance, String key, List<String> list, String toEdit, Voucher voucher) {
super((int) ((list.isEmpty() ? 9 : Math.ceil(list.size() / 9.0) * 9) + 9), key);
int size = getInventory().getSize();
addIcon(size - 9, new ItemBuilder(Material.BARRIER)
.name(YELLOW + "Return")
.lore(GRAY + "Return to the editor")
.build(), event -> new VoucherEditorMenu(instance, voucher).open(event.getPlayer()));
addIcon(size - 5, new ItemBuilder(Material.BOOK)
.name(YELLOW + "Editing: " + GRAY + toEdit)
.lore(list.stream().map(s -> DARK_GRAY + "- " + GRAY + s).collect(Collectors.toList()))
.build());
addIcon(size - 1, new ItemBuilder(PAPER).name(GREEN + "Add to list").build(), event -> {
AbstractAnvilGUI anvilGUI = new AbstractAnvilGUI(instance, event.getPlayer(), anvilEvent -> {
list.add(anvilEvent.getName());
voucher.saveSetting(key.toLowerCase(), list);
new StringListMenu(instance, key, list, toEdit, voucher).open(event.getPlayer());
});
anvilGUI.setSlot(INPUT_LEFT, new ItemStack(PAPER));
anvilGUI.open();
});
for (int i = 0; i < list.size(); i++) {
String entry = list.get(i);
addIcon(new ListEntryIcon(instance, entry, (player, removeString) -> {
list.remove(removeString);
voucher.saveSetting(key.toLowerCase(), list);
new StringListMenu(instance, key, list, toEdit, voucher).open(player);
}, (player, tuple) -> {
list.set(list.indexOf(tuple.x), tuple.y);
voucher.saveSetting(key.toLowerCase(), list);
new StringListMenu(instance, key, list, toEdit, voucher).open(player);
}));
}
}
}

View File

@ -0,0 +1,50 @@
package com.songoda.epicvouchers.menus.sub;
import com.songoda.epicvouchers.EpicVouchers;
import com.songoda.epicvouchers.libraries.ItemBuilder;
import com.songoda.epicvouchers.libraries.inventory.IconInv;
import com.songoda.epicvouchers.libraries.inventory.icons.IntegerIcon;
import com.songoda.epicvouchers.libraries.inventory.icons.StringIcon;
import com.songoda.epicvouchers.menus.VoucherEditorMenu;
import com.songoda.epicvouchers.voucher.Voucher;
import org.bukkit.Material;
import static org.bukkit.ChatColor.GRAY;
import static org.bukkit.ChatColor.YELLOW;
public class TitlesMenu extends IconInv {
public TitlesMenu(EpicVouchers instance, Voucher voucher) {
super(9, "Titles");
addIcon(1, new StringIcon(instance, "Title", voucher.getTitle(), (player, editString) -> {
voucher.setTitle(editString).saveSetting("titles.title", editString);
new TitlesMenu(instance, voucher).open(player);
}));
addIcon(2, new StringIcon(instance, "Subtitle", voucher.getSubTitle(), (player, editString) -> {
voucher.setTitle(editString).saveSetting("titles.title", editString);
new TitlesMenu(instance, voucher).open(player);
}));
addIcon(3, new IntegerIcon(instance, "Fade in", voucher.getTitleFadeIn(), (player, number) -> {
voucher.setTitleFadeIn(number).saveSetting("titles.fade-in", number);
new TitlesMenu(instance, voucher).open(player);
}));
addIcon(4, new IntegerIcon(instance, "Fade out", voucher.getTitleFadeOut(), (player, number) -> {
voucher.setTitleFadeOut(number).saveSetting("titles.fade-out", number);
new TitlesMenu(instance, voucher).open(player);
}));
addIcon(5, new IntegerIcon(instance, "Stay", voucher.getTitleStay(), (player, number) -> {
voucher.setTitleStay(number).saveSetting("titles.stay", number);
new TitlesMenu(instance, voucher).open(player);
}));
addIcon(0, new ItemBuilder(Material.BARRIER)
.name(YELLOW + "Return")
.lore(GRAY + "Return to the editor")
.build(), event -> new VoucherEditorMenu(instance, voucher).open(event.getPlayer()));
}
}

View File

@ -2,20 +2,18 @@ package com.songoda.epicvouchers.utils;
import org.bukkit.ChatColor;
import javax.annotation.Nullable;
public class Methods {
public static String formatText(String text) {
public static String format(String text) {
if (text == null || text.equals(""))
return "";
return formatText(text, false);
return format(text, "", null);
}
public static String formatText(String text, boolean cap) {
if (text == null || text.equals(""))
return "";
if (cap)
text = text.substring(0, 1).toUpperCase() + text.substring(1);
return ChatColor.translateAlternateColorCodes('&', text);
public static String format(String text, String toReplace, @Nullable Object object) {
return ChatColor.translateAlternateColorCodes('&', text).replace(toReplace, object == null ? "" : object.toString());
}
}

View File

@ -216,7 +216,7 @@ public enum SoundUtils {
} catch (Exception ignore) {
}
}
System.out.println(Methods.formatText("&cFailed to find the sound enum called " + cached + "."));
System.out.println(Methods.format("&cFailed to find the sound enum called " + cached + "."));
return null;
}

View File

@ -0,0 +1,10 @@
package com.songoda.epicvouchers.utils;
public class Tuple<X, Y> {
public final X x;
public final Y y;
public Tuple(X x, Y y) {
this.x = x;
this.y = y;
}
}

View File

@ -5,6 +5,7 @@ import com.songoda.epicvouchers.utils.Methods;
import lombok.Getter;
import lombok.Setter;
import lombok.experimental.Accessors;
import org.bukkit.Bukkit;
import org.bukkit.Material;
import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.enchantments.Enchantment;
@ -14,25 +15,29 @@ import org.bukkit.inventory.meta.ItemMeta;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
import static com.songoda.epicvouchers.utils.Methods.format;
import static org.bukkit.Material.PAPER;
@Accessors(chain = true)
public class Voucher {
@Getter private final String key;
@Getter @Setter private String permission;
@Getter @Setter private Material material = Material.COOKIE;
@Getter @Setter private String permission = "";
@Getter @Setter private Material material = PAPER;
@Getter @Setter private short data = 0;
@Getter @Setter private int cooldown = 0;
@Setter private String name;
@Setter private List<String> lore = new ArrayList<>();
@Getter @Setter private boolean glow = true;
@Getter @Setter private boolean confirm = true;
@Getter @Setter private boolean unbreakable = true;
@Getter @Setter private boolean unbreakable = false;
@Getter @Setter private boolean hideAttributes = false;
@Getter @Setter private boolean removeItem = true;
@Getter @Setter private boolean feedPlayer = true;
@Getter @Setter private boolean healPlayer = true;
@Getter @Setter private boolean smiteEffect = true;
@Getter @Setter private boolean feedPlayer = false;
@Getter @Setter private boolean healPlayer = false;
@Getter @Setter private boolean smiteEffect = false;
@Setter private List<String> broadcasts = new ArrayList<>();
@Setter private List<String> messages = new ArrayList<>();
@ -40,21 +45,23 @@ public class Voucher {
@Setter private String actionBar;
@Setter private String title = "&6Thank you.";
@Setter private String subTitle = "&eYou have redeemed the voucher %voucher%.";
@Getter @Setter private int titleFadeIn = 10;
@Getter @Setter private int titleStay = 50;
@Getter @Setter private int titleFadeOut = 10;
@Setter private String title = "";
@Setter private String subTitle = "";
@Getter @Setter private int titleFadeIn = 0;
@Getter @Setter private int titleStay = 0;
@Getter @Setter private int titleFadeOut = 0;
@Getter @Setter private String sound = "NOTE_PLING";
@Getter @Setter private int soundPitch = 1;
@Getter @Setter private String sound = "";
@Getter @Setter private int soundPitch = 0;
@Getter @Setter private String particle = "FLAME";
@Getter @Setter private int particleAmount = 100;
@Getter @Setter private String particle = "";
@Getter @Setter private int particleAmount = 0;
@Getter @Setter private String effect = "SPEED";
@Getter @Setter private int effectAmplifer = 2;
@Getter @Setter private int effectDuration = 10;
@Getter @Setter private String effect = "";
@Getter @Setter private int effectAmplifier = 0;
@Getter @Setter private int effectDuration = 0;
@Getter @Setter private ItemStack itemStack;
public Voucher(String key) {
this.key = key;
@ -65,19 +72,30 @@ public class Voucher {
}
public ItemStack toItemStack(int amount) {
ItemStack item = new ItemStack(material, amount, data);
ItemStack item = itemStack == null ? new ItemStack(material, amount, data) : itemStack;
ItemMeta meta = item.getItemMeta();
meta.setDisplayName(Methods.formatText(name));
if(meta == null) {
meta = Bukkit.getItemFactory().getItemMeta(material);
}
if(!name.isEmpty()) {
meta.setDisplayName(format(name));
}
if (lore != null) {
meta.setLore(getLore(true));
}
if (glow) {
meta.addEnchant(Enchantment.DURABILITY, 1, false);
meta.addItemFlags(ItemFlag.HIDE_ENCHANTS);
}
if (unbreakable) {
meta.spigot().setUnbreakable(true);
}
if (hideAttributes) {
meta.addItemFlags(ItemFlag.HIDE_ATTRIBUTES);
meta.addItemFlags(ItemFlag.HIDE_UNBREAKABLE);
@ -87,35 +105,19 @@ public class Voucher {
}
public String getName(boolean applyFormatting) {
if (!applyFormatting) return name;
return Methods.formatText(name);
return applyFormatting ? format(name) : name;
}
public List<String> getLore(boolean applyFormatting) {
if (!applyFormatting) return lore;
List<String> itemLore = new ArrayList<>();
for (String line : lore) {
itemLore.add(Methods.formatText(line));
}
return itemLore;
return applyFormatting ? lore.stream().map(Methods::format).collect(Collectors.toList()) : lore;
}
public List<String> getBroadcasts(boolean applyFormatting) {
if (!applyFormatting) return broadcasts;
List<String> itemBroadcasts = new ArrayList<>();
for (String line : broadcasts) {
itemBroadcasts.add(Methods.formatText(line));
}
return itemBroadcasts;
return applyFormatting ? broadcasts.stream().map(Methods::format).collect(Collectors.toList()) : broadcasts;
}
public List<String> getMessages(boolean applyFormatting) {
if (!applyFormatting) return messages;
List<String> itemMessages = new ArrayList<>();
for (String line : messages) {
itemMessages.add(Methods.formatText(line));
}
return itemMessages;
return applyFormatting ? messages.stream().map(Methods::format).collect(Collectors.toList()) : messages;
}
public void saveSetting(String key, Object value) {
@ -130,15 +132,15 @@ public class Voucher {
}
public String getActionBar() {
return Methods.formatText(actionBar);
return format(actionBar);
}
public String getSubTitle() {
return Methods.formatText(subTitle);
return format(subTitle);
}
public String getTitle() {
return Methods.formatText(title);
return format(title);
}
}

View File

@ -4,6 +4,7 @@ import com.songoda.epicvouchers.EpicVouchers;
import com.songoda.epicvouchers.events.VoucherRedeemEvent;
import com.songoda.epicvouchers.libraries.Bountiful;
import com.songoda.epicvouchers.listeners.PlayerCommandListener;
import com.songoda.epicvouchers.utils.Debugger;
import com.songoda.epicvouchers.utils.Methods;
import com.songoda.epicvouchers.utils.SoundUtils;
import org.bukkit.Bukkit;
@ -109,12 +110,12 @@ public class VoucherExecutor {
Bukkit.getServer().dispatchCommand(Bukkit.getConsoleSender(), command);
}
}
if(voucher.getActionBar() != null &&!voucher.getActionBar().isEmpty()) {
if (voucher.getActionBar() != null && !voucher.getActionBar().isEmpty()) {
String actionbar = voucher.getActionBar().replaceAll("%player%", name).replaceAll("%voucher%", voucher.getName(true));
Bountiful.sendActionBar(player, actionbar);
}
if(voucher.getTitle() != null &&!voucher.getTitle().isEmpty()) {
if (voucher.getTitle() != null && !voucher.getTitle().isEmpty()) {
String title = voucher.getTitle().replaceAll("%player%", name).replaceAll("%voucher%", voucher.getName(true));
String subtitle = voucher.getSubTitle().replaceAll("%player%", name).replaceAll("%voucher%", voucher.getName(true));
@ -125,7 +126,7 @@ public class VoucherExecutor {
Bountiful.sendTitle(player, fadein, stay, fadeout, title, subtitle);
}
if(voucher.getSound() != null && !voucher.getSound().isEmpty()) {
if (voucher.getSound() != null && !voucher.getSound().isEmpty()) {
String sound = voucher.getSound();
int pitch = voucher.getSoundPitch();
SoundUtils.playSound(player, sound, pitch);
@ -141,20 +142,20 @@ public class VoucherExecutor {
String effect = voucher.getEffect();
if (effect != null && !effect.isEmpty()) {
int amplifier = voucher.getEffectAmplifer();
int amplifier = voucher.getEffectAmplifier();
int duration = voucher.getEffectDuration() * 20;
player.addPotionEffect(new PotionEffect(PotionEffectType.getByName(effect), duration, amplifier));
}
instance.getLogger().log(Level.INFO, Methods.formatText("&f" + player.getName() + " has successfully redeemed the voucher " + voucher.getKey() + "."));
instance.getLogger().log(Level.INFO, Methods.format("&f" + player.getName() + " has successfully redeemed the voucher " + voucher.getKey() + "."));
instance.getConnections().saveRedeem(player, voucher.getName(true));
} else {
instance.getLogger().log(Level.WARNING, Methods.formatText("&c" + player.getName() + " has failed to duplicate the voucher " + voucher.getKey() + "."));
instance.getLogger().log(Level.WARNING, Methods.format("&c" + player.getName() + " has failed to duplicate the voucher " + voucher.getKey() + "."));
}
} catch (Exception error) {
error.printStackTrace();
instance.getLogger().log(Level.SEVERE, Methods.formatText("&cFailed to redeem the voucher " + voucher.getKey() + " for the player " + player.getName() + "."));
// Debugger.runReport(error);
instance.getLogger().log(Level.SEVERE, Methods.format("&cFailed to redeem the voucher " + voucher.getKey() + " for the player " + player.getName() + "."));
Debugger.runReport(error);
}
}

View File

@ -1,24 +0,0 @@
package com.songoda.epicvouchers.voucher;
import java.util.*;
public class VoucherManager {
private final Map<String, Voucher> registeredVouchers = new HashMap<>();
public void addVoucher(String name, Voucher voucher) {
registeredVouchers.put(name, voucher);
}
public Voucher getVoucher(String name) {
for (Voucher voucher : registeredVouchers.values()) {
if (voucher.getKey().equalsIgnoreCase(name.trim())) return voucher;
}
return null;
}
public List<Voucher> getVouchers() {
return new ArrayList<>(registeredVouchers.values());
}
}

View File

@ -9,25 +9,6 @@ interface.confirmsettings.confirmitemname= "&2&lREDEEM"
interface.confirmsettings.confirmitemlore= "&aClick here if you want to confirm your redeem."
interface.confirmsettings.cancelitemname= "&4&lCANCEL"
interface.confirmsettings.cancelitemlore= "&cClick here if you want to cancel your redeem."
interface.setitem.title= "&6Set item"
interface.boolean.title= "&6Edit booleans"
interface.editor.title= "&6Editor"
interface.editvoucher.title= "&6Editor [&e%voucher%&6]";
interface.editvoucher.backtitle= "&4Return";
interface.editvoucher.backlore= "&cReturn to the main menu of the editor."
interface.editvoucher.recivetitle= "&2Receive"
interface.editvoucher.recivelore= "&aReceive a clone item of this voucher."
interface.editvoucher.recivemessage= "&7You have received the voucher &6%voucher%&7."
interface.editvoucher.renametitle= "&6Rename"
interface.editvoucher.renamelore= "&eRename the display name of the voucher."
interface.editvoucher.renamemessage= "&7Please enter the name that this voucher should be renamed to."
interface.editvoucher.renamefinish= "&7Successfully renamed the voucher to &r%renamed%&7."
interface.editvoucher.itemtitle= "&6Set item"
interface.editvoucher.itemlore= "&eSet the item of your voucher."
interface.boolean.itemlore= "&eSet boolean values."
interface.boolean.itemtitle= "&eEdit the boolean values of your voucher."
#Command Messages
@ -35,7 +16,7 @@ command.error.noplayer= "&7That user either does not exist or is not online";
command.error.novoucher= "&cThat voucher does not exist.";
command.error.notexist= "&7The command you entered does not exist or is spelt incorrectly."
command.error.notnumber= "&7Failed to parse that number into a valid amount."
command.reload.success= "&7Config Reloaded"
command.reload.success= "&7Reloaded all config files and vouchers."
command.give.send= "&7You have received the voucher &6%voucher% &7(&6x%amount%&7)."
command.give.receive= "&7You have given &6%player% &7the voucher &6%voucher% &7(&6x%amount%&7)."
command.force.send= "&7You have forced &6%player% &7to redeem the voucher &6%voucher% &7(&6x%amount%&7).";

View File

@ -1,6 +1,6 @@
name: EpicVouchers
main: com.songoda.epicvouchers.EpicVouchers
version: 1.0.9
version: ${project.version}
author: Songoda
website: https://songoda.host/epicvouchers
description: Enhance your server with awesome customizable vouchers with a lot of features.