Added Javadoc

This commit is contained in:
Eric 2016-06-30 21:59:06 +02:00
parent f52be003ab
commit 80a32bf0dc
22 changed files with 535 additions and 47 deletions

View File

@ -39,6 +39,13 @@ public class Commands extends BukkitCommand {
this.perm = plugin.getPermission();
}
/**
* Register a command to ShopChest
*
* @param command Command to register
* @param plugin Instance of ShopChest
* @throws ReflectiveOperationException
*/
public static void registerCommand(Command command, ShopChest plugin) throws ReflectiveOperationException {
Method commandMap = plugin.getServer().getClass().getMethod("getCommandMap");
Object cmdmap = commandMap.invoke(plugin.getServer());
@ -131,10 +138,14 @@ public class Commands extends BukkitCommand {
}
/**
* A given player checks for updates
* @param player The command executor
*/
private void checkUpdates(Player player) {
player.sendMessage(LanguageUtils.getMessage(LocalizedMessage.Message.UPDATE_CHECKING));
UpdateChecker uc = new UpdateChecker(ShopChest.getInstance(), ShopChest.getInstance().getDescription().getWebsite());
UpdateChecker uc = new UpdateChecker(ShopChest.getInstance());
UpdateCheckerResult result = uc.updateNeeded();
if (result == UpdateCheckerResult.TRUE) {
@ -190,10 +201,20 @@ public class Commands extends BukkitCommand {
}
/**
* A given player reloads the shops
* @param player The command executor
*/
private void reload(Player player) {
player.sendMessage(LanguageUtils.getMessage(LocalizedMessage.Message.RELOADED_SHOPS, new LocalizedMessage.ReplacedRegex(Regex.AMOUNT, String.valueOf(ShopUtils.reloadShops()))));
}
/**
* A given player creates a shop
* @param args Arguments of the entered command
* @param shopType The {@link ShopType}, the shop will have
* @param p The command executor
*/
private void create(String[] args, ShopType shopType, Player p) {
int amount;
double buyPrice, sellPrice;
@ -307,21 +328,33 @@ public class Commands extends BukkitCommand {
}
}
ClickType.addPlayerClickType(p, new ClickType(EnumClickType.CREATE, itemStack, buyPrice, sellPrice, shopType));
ClickType.setPlayerClickType(p, new ClickType(EnumClickType.CREATE, itemStack, buyPrice, sellPrice, shopType));
p.sendMessage(LanguageUtils.getMessage(LocalizedMessage.Message.CLICK_CHEST_CREATE));
}
/**
* A given player removes a shop
* @param p The command executor
*/
private void remove(Player p) {
p.sendMessage(LanguageUtils.getMessage(LocalizedMessage.Message.CLICK_CHEST_REMOVE));
ClickType.addPlayerClickType(p, new ClickType(EnumClickType.REMOVE));
ClickType.setPlayerClickType(p, new ClickType(EnumClickType.REMOVE));
}
/**
* A given player retrieves information about a shop
* @param p The command executor
*/
private void info(Player p) {
p.sendMessage(LanguageUtils.getMessage(LocalizedMessage.Message.CLICK_CHEST_INFO));
ClickType.addPlayerClickType(p, new ClickType(EnumClickType.INFO));
ClickType.setPlayerClickType(p, new ClickType(EnumClickType.INFO));
}
/**
* Sends the basic help message to a given player
* @param player Player who will receive the message
*/
private void sendBasicHelpMessage(Player player) {
player.sendMessage(ChatColor.GREEN + "/" + Config.main_command_name + " create <amount> <buy-price> <sell-price> [normal|admin] - " + LanguageUtils.getMessage(LocalizedMessage.Message.COMMAND_DESC_CREATE));
player.sendMessage(ChatColor.GREEN + "/" + Config.main_command_name + " remove - " + LanguageUtils.getMessage(LocalizedMessage.Message.COMMAND_DESC_REMOVE));

View File

@ -3,11 +3,11 @@ package de.epiceric.shopchest;
import de.epiceric.shopchest.config.Config;
import de.epiceric.shopchest.config.LanguageConfiguration;
import de.epiceric.shopchest.config.Regex;
import de.epiceric.shopchest.listeners.*;
import de.epiceric.shopchest.interfaces.JsonBuilder;
import de.epiceric.shopchest.interfaces.jsonbuilder.*;
import de.epiceric.shopchest.language.LanguageUtils;
import de.epiceric.shopchest.language.LocalizedMessage;
import de.epiceric.shopchest.listeners.*;
import de.epiceric.shopchest.shop.Shop;
import de.epiceric.shopchest.shop.Shop.ShopType;
import de.epiceric.shopchest.sql.Database;
@ -50,10 +50,19 @@ public class ShopChest extends JavaPlugin {
private String[] broadcast = null;
private LanguageConfiguration langConfig;
/**
* Get an instance of ShopChest
*
* @return
*/
public static ShopChest getInstance() {
return instance;
}
/**
* Sets up the economy of Vault
* @return
*/
private boolean setupEconomy() {
RegisteredServiceProvider<Economy> rsp = getServer().getServicesManager().getRegistration(Economy.class);
if (rsp == null) {
@ -63,12 +72,19 @@ public class ShopChest extends JavaPlugin {
return econ != null;
}
/**
* Sets up the permissions of Vault
* @return
*/
private boolean setupPermissions() {
RegisteredServiceProvider<Permission> rsp = getServer().getServicesManager().getRegistration(Permission.class);
perm = rsp.getProvider();
return perm != null;
}
/**
* Initializes the language configuration
*/
private void initLanguageConfig() {
langConfig = new LanguageConfiguration(this);
File langFolder = new File(getDataFolder(), "lang");
@ -246,7 +262,7 @@ public class ShopChest extends JavaPlugin {
lockette = getServer().getPluginManager().getPlugin("Lockette") != null;
lwc = getServer().getPluginManager().getPlugin("LWC") != null;
UpdateChecker uc = new UpdateChecker(this, getDescription().getWebsite());
UpdateChecker uc = new UpdateChecker(this);
UpdateCheckerResult result = uc.updateNeeded();
if (Config.enable_broadcast) broadcast = uc.getBroadcast();
@ -352,63 +368,112 @@ public class ShopChest extends JavaPlugin {
}
}
/**
* Initializes the shops
*/
private void initializeShops() {
int count = ShopUtils.reloadShops();
getLogger().info("Initialized " + String.valueOf(count) + " Shops");
}
/**
* @return ShopChest's {@link LanguageConfiguration}
*/
public LanguageConfiguration getLanguageConfig() {
return langConfig;
}
/**
* @return Registered Economy of Vault
*/
public Economy getEconomy() {
return econ;
}
/**
* @return Registered Permission of Vault
*/
public Permission getPermission() {
return perm;
}
/**
* @return ShopChest's shop database
*/
public Database getShopDatabase() {
return database;
}
/**
* @return Whether LWC is available
*/
public boolean hasLWC() {
return lwc;
}
/**
* @return Whether Lockette is available
*/
public boolean hasLockette() {
return lockette;
}
/**
* @return Whether an update is needed (will return false if not checked)
*/
public boolean isUpdateNeeded() {
return isUpdateNeeded;
}
/**
* Set whether an update is needed
* @param isUpdateNeeded Whether an update should be needed
*/
public void setUpdateNeeded(boolean isUpdateNeeded) {
this.isUpdateNeeded = isUpdateNeeded;
}
/**
* @return The latest version of ShopChest (will return null if not checked or if no update is available)
*/
public String getLatestVersion() {
return latestVersion;
}
/**
* Set the latest version
* @param latestVersion Version to set as latest version
*/
public void setLatestVersion(String latestVersion) {
this.latestVersion = latestVersion;
}
/**
* @return The download link of the latest version (will return null if not checked or if no update is available)
*/
public String getDownloadLink() {
return downloadLink;
}
/**
* Set the download Link of the latest version (will return null if not checked or if no update is available)
* @param downloadLink Link to set as Download Link
*/
public void setDownloadLink(String downloadLink) {
this.downloadLink = downloadLink;
}
/**
* @return The broadcast message as a string array of lines (will return null if not checked or if no message is available)
*/
public String[] getBroadcast() {
return broadcast;
}
/**
* Set the broadcast message
* @param broadcast Broadcast message as a string array of lines to set
*/
public void setBroadcast(String[] broadcast) {
this.broadcast = broadcast;
}

View File

@ -12,46 +12,84 @@ public class Config {
private static ShopChest plugin = ShopChest.getInstance();
/**
* The hostname used in ShopChest's MySQL database
**/
public static String database_mysql_host = plugin.getConfig().getString("database.mysql.hostname");
/** The port used for ShopChest's MySQL database **/
public static int database_mysql_port = plugin.getConfig().getInt("database.mysql.port");
/** The database used for ShopChest's MySQL database **/
public static String database_mysql_database = plugin.getConfig().getString("database.mysql.database");
/** The username used in ShopChest's MySQL database **/
public static String database_mysql_username = plugin.getConfig().getString("database.mysql.username");
/** The password used in ShopChest's MySQL database **/
public static String database_mysql_password = plugin.getConfig().getString("database.mysql.password");
/** The database type used for ShopChest. **/
public static Database.DatabaseType database_type = Database.DatabaseType.valueOf(plugin.getConfig().getString("database.type"));
/**
* <p>The minimum prices for certain items</p>
* This returns a key set, which contains e.g "STONE", "STONE:1", of the <i>minimum-prices</i> section in ShopChest's config.
* To actually retrieve the price for an item, you have to get the Double <i>minimum-prices.<b>key</b></i>.
**/
public static Set<String> minimum_prices = (plugin.getConfig().getConfigurationSection("minimum-prices") == null) ? new HashSet<String>() : plugin.getConfig().getConfigurationSection("minimum-prices").getKeys(true);
/**
* <p>The shop limits of certain groups</p>
* This returns a key set, which contains the group names, of the <i>shop-limits.group</i> section in ShopChest's config.
* To actually retrieve the limits for a group, you have to get the Integer <i>shop-limits.group.<b>key</b></i>.
**/
public static Set<String> shopLimits_group = (plugin.getConfig().getConfigurationSection("shop-limits.group") == null) ? new HashSet<String>() : plugin.getConfig().getConfigurationSection("shop-limits.group").getKeys(true);
/**
* <p>The shop limits of certain players</p>
* This returns a key set, which contains the player names, of the <i>shop-limits.player</i> section in ShopChest's config.
* To actually retrieve the limits for a player, you have to get the Integer <i>shop-limits.player.<b>key</b></i>.
**/
public static Set<String> shopLimits_player = (plugin.getConfig().getConfigurationSection("shop-limits.player") == null) ? new HashSet<String>() : plugin.getConfig().getConfigurationSection("shop-limits.player").getKeys(true);
/**
* <p>List containing items, of which players can't create a shop</p>
* If this list contains an item (e.g "STONE", "STONE:1"), it's in the blacklist.
**/
public static List<String> blacklist = (plugin.getConfig().getStringList("blacklist") == null) ? new ArrayList<String>() : plugin.getConfig().getStringList("blacklist");
/** Whether the buy price of a shop must be greater than or equal the sell price **/
public static boolean buy_greater_or_equal_sell = plugin.getConfig().getBoolean("buy-greater-or-equal-sell");
/** Whether shops should be protected by hoppers **/
public static boolean hopper_protection = plugin.getConfig().getBoolean("hopper-protection");
/** Whether shops should be protected by explosions **/
public static boolean explosion_protection = plugin.getConfig().getBoolean("explosion-protection");
/** Whether broadcast messages should be enabled **/
public static boolean enable_broadcast = plugin.getConfig().getBoolean("enable-broadcast");
/** Whether admin shops should be excluded of the shop limits **/
public static boolean exclude_admin_shops = plugin.getConfig().getBoolean("shop-limits.exclude-admin-shops");
/** The maximum distance between a player and a shop to see the hologram **/
public static double maximal_distance = plugin.getConfig().getDouble("maximal-distance");
/** The price a player has to pay in order to create a normal shop **/
public static double shop_creation_price_normal = plugin.getConfig().getDouble("shop-creation-price.normal");
/** The price a player has to pay in order to create an admin shop **/
public static double shop_creation_price_admin = plugin.getConfig().getDouble("shop-creation-price.admin");
/** The default shop limit for players and groups that are not listed in {@link #shopLimits_player} or in {@link #shopLimits_group} **/
public static int default_limit = plugin.getConfig().getInt("shop-limits.default");
/** The main command of ShopChest <i>(default: shop)</i> **/
public static String main_command_name = plugin.getConfig().getString("main-command-name");
/** The language file to use (e.g <i>en_US</i>, <i>de_DE</i>) **/
public static String language_file = plugin.getConfig().getString("language-file");
}

View File

@ -4,20 +4,39 @@ package de.epiceric.shopchest.interfaces;
import org.bukkit.Location;
import org.bukkit.OfflinePlayer;
import java.util.List;
public interface Hologram {
/**
* @return Location of the hologram
*/
Location getLocation();
/**
* @param p Player to which the hologram should be shown
*/
void showPlayer(OfflinePlayer p);
/**
* @param p Player from which the hologram should be hidden
*/
void hidePlayer(OfflinePlayer p);
/**
* @param p Player to check
* @return Whether the hologram is visible to the player
*/
boolean isVisible(OfflinePlayer p);
/**
* @return Whether the hologram exists and is not dead
*/
boolean exists();
/**
* Removes the hologram. <br>
* Hologram will be hidden from all players and will be killed
*/
void remove();
}

View File

@ -5,27 +5,27 @@ import org.bukkit.entity.Player;
public interface JsonBuilder {
public JsonBuilder parse(String text);
JsonBuilder parse(String text);
public JsonBuilder withText(String text);
JsonBuilder withText(String text);
public JsonBuilder withColor(ChatColor color);
JsonBuilder withColor(ChatColor color);
public JsonBuilder withColor(String color);
JsonBuilder withColor(String color);
public JsonBuilder withClickEvent(ClickAction action, String value);
JsonBuilder withClickEvent(ClickAction action, String value);
public JsonBuilder withHoverEvent(HoverAction action, String value);
JsonBuilder withHoverEvent(HoverAction action, String value);
public String toString();
String toString();
public void sendJson(Player p);
void sendJson(Player p);
public enum ClickAction {
enum ClickAction {
RUN_COMMAND, SUGGEST_COMMAND, OPEN_URL
}
public enum HoverAction {
enum HoverAction {
SHOW_TEXT
}

View File

@ -4,8 +4,15 @@ import org.bukkit.entity.EntityType;
public abstract class SpawnEggMeta {
/**
* @return The NBT Tag <i>EntityTag.id</i> of the Spawn Egg
*/
public abstract String getNBTEntityID();
/**
* @param nbtEntityID EntityID returned by {@link #getNBTEntityID()}
* @return The {@link EntityType} the Spawn Egg will spawn or <b>null</b> if <i>nbtEntityID</i> is null
*/
public EntityType getEntityTypeFromNBTEntityID(String nbtEntityID) {
if (nbtEntityID == null) return null;

View File

@ -12,11 +12,16 @@ public class EnchantmentName {
this.localizedName = localizedName;
}
/**
* @return Enchantment linked to the name
*/
public Enchantment getEnchantment() {
return enchantment;
}
/**
* @return Name linked to the enchantment
*/
public String getLocalizedName() {
return localizedName;
}
@ -30,10 +35,16 @@ public class EnchantmentName {
this.localizedName = localizedName;
}
/**
* @return Level linked to the name
*/
public int getLevel() {
return level;
}
/**
* @return Name linked to the level
*/
public String getLocalizedName() {
return localizedName;
}

View File

@ -12,10 +12,16 @@ public class EntityName {
this.localizedName = localizedName;
}
/**
* @return EntityType linked to the name
*/
public EntityType getEntityType() {
return entityType;
}
/**
* @return Name linked to the EntityType
*/
public String getLocalizedName() {
return localizedName;
}

View File

@ -20,14 +20,23 @@ public class ItemName {
this.localizedName = localizedName;
}
/**
* @return Material linked to the name
*/
public Material getMaterial() {
return material;
}
/**
* @return Sub ID linked to the name
*/
public int getSubID() {
return subID;
}
/**
* @return Name linked to the item
*/
public String getLocalizedName() {
return localizedName;
}

View File

@ -34,6 +34,7 @@ public class LanguageUtils {
public static void load() {
// Add Block Names
itemNames.add(new ItemName(Material.STONE, langConfig.getString("tile.stone.stone.name", "Stone")));
itemNames.add(new ItemName(Material.STONE, 1, langConfig.getString("tile.stone.granite.name", "Granite")));
itemNames.add(new ItemName(Material.STONE, 2, langConfig.getString("tile.stone.graniteSmooth.name", "Polished Granite")));
@ -338,6 +339,7 @@ public class LanguageUtils {
itemNames.add(new ItemName(Material.ACACIA_FENCE, langConfig.getString("tile.acaciaFence.name", "Acacia Fence")));
if (Utils.getMajorVersion() >= 9) {
// Add Block Names of 1.9
itemNames.add(new ItemName(Material.END_ROD, langConfig.getString("tile.endRod.name", "End Rod")));
itemNames.add(new ItemName(Material.CHORUS_PLANT, langConfig.getString("tile.chorusPlant.name", "Chorus Plant")));
itemNames.add(new ItemName(Material.CHORUS_FLOWER, langConfig.getString("tile.chorusFlower.name", "Chorus Flower")));
@ -353,6 +355,7 @@ public class LanguageUtils {
}
if (Utils.getMajorVersion() >= 10) {
// Add Block Names of 1.10
itemNames.add(new ItemName(Material.MAGMA, langConfig.getString("tile.magma.name", "Magma Block")));
itemNames.add(new ItemName(Material.NETHER_WART_BLOCK, langConfig.getString("tile.netherWartBlock.name", "Nether Wart Block")));
itemNames.add(new ItemName(Material.RED_NETHER_BRICK, langConfig.getString("tile.redNetherBrick.name", "Red Nether Brick")));
@ -360,6 +363,7 @@ public class LanguageUtils {
itemNames.add(new ItemName(Material.STRUCTURE_VOID, langConfig.getString("tile.structureVoid.name", "Structure Void")));
}
// Add Item Names
itemNames.add(new ItemName(Material.IRON_SPADE, langConfig.getString("item.shovelIron.name", "Iron Shovel")));
itemNames.add(new ItemName(Material.IRON_PICKAXE, langConfig.getString("item.pickaxeIron.name", "Iron Pickaxe")));
itemNames.add(new ItemName(Material.IRON_AXE, langConfig.getString("item.hatchetIron.name", "Iron Axe")));
@ -605,6 +609,7 @@ public class LanguageUtils {
itemNames.add(new ItemName(Material.RECORD_11, langConfig.getString("item.record.name", "Music Disc")));
itemNames.add(new ItemName(Material.RECORD_12, langConfig.getString("item.record.name", "Music Disc")));
// Add Enchantment Names
enchantmentNames.add(new EnchantmentName(Enchantment.ARROW_DAMAGE, langConfig.getString("enchantment.arrowDamage", "Power")));
enchantmentNames.add(new EnchantmentName(Enchantment.ARROW_FIRE, langConfig.getString("enchantment.arrowFire", "Flame")));
enchantmentNames.add(new EnchantmentName(Enchantment.ARROW_INFINITE, langConfig.getString("enchantment.arrowInfinite", "Infinity")));
@ -632,10 +637,12 @@ public class LanguageUtils {
enchantmentNames.add(new EnchantmentName(Enchantment.WATER_WORKER, langConfig.getString("enchantment.waterWorker", "Aqua Affinity")));
if (Utils.getMajorVersion() >= 9) {
// Add Enchantment Names of 1.9
enchantmentNames.add(new EnchantmentName(Enchantment.FROST_WALKER, langConfig.getString("enchantment.frostWalker", "Frost Walker")));
enchantmentNames.add(new EnchantmentName(Enchantment.MENDING, langConfig.getString("enchantment.mending", "Mending")));
}
// Add Enchantment Level Names
enchantmentLevelNames.add(new EnchantmentName.EnchantmentLevelName(1, langConfig.getString("enchantment.level.1", "I")));
enchantmentLevelNames.add(new EnchantmentName.EnchantmentLevelName(2, langConfig.getString("enchantment.level.2", "II")));
enchantmentLevelNames.add(new EnchantmentName.EnchantmentLevelName(3, langConfig.getString("enchantment.level.3", "II")));
@ -647,6 +654,7 @@ public class LanguageUtils {
enchantmentLevelNames.add(new EnchantmentName.EnchantmentLevelName(9, langConfig.getString("enchantment.level.9", "IX")));
enchantmentLevelNames.add(new EnchantmentName.EnchantmentLevelName(10, langConfig.getString("enchantment.level.10", "X")));
// Add Entity Names
entityNames.add(new EntityName(EntityType.CREEPER, langConfig.getString("entity.Creeper.name", "Creeper")));
entityNames.add(new EntityName(EntityType.SKELETON, langConfig.getString("entity.Skeleton.name", "Skeleton")));
entityNames.add(new EntityName(EntityType.SPIDER, langConfig.getString("entity.Spider.name", "Spider")));
@ -676,13 +684,16 @@ public class LanguageUtils {
entityNames.add(new EntityName(EntityType.VILLAGER, langConfig.getString("entity.Villager.name", "Villager")));
if (Utils.getMajorVersion() >= 9) {
// Add Entity Names of 1.9
entityNames.add(new EntityName(EntityType.SHULKER, langConfig.getString("entity.Shulker.name", "Shulker")));
}
if (Utils.getMajorVersion() >= 10) {
// Add Entity Names of 1.10
entityNames.add(new EntityName(EntityType.POLAR_BEAR, langConfig.getString("entity.PolarBear.name", "Polar Bear")));
}
// Add Potion Effect Names
potionEffectNames.add(new PotionEffectName(PotionType.FIRE_RESISTANCE, langConfig.getString("effect.fireResistance", "Fire Resistance")));
potionEffectNames.add(new PotionEffectName(PotionType.INSTANT_DAMAGE, langConfig.getString("effect.harm", "Instant Damage")));
potionEffectNames.add(new PotionEffectName(PotionType.INSTANT_HEAL, langConfig.getString("effect.heal", "Instant Health")));
@ -700,12 +711,14 @@ public class LanguageUtils {
potionEffectNames.add(new PotionEffectName(PotionType.AWKWARD, langConfig.getString("effect.none", "No Effects")));
if (Utils.getMajorVersion() >= 9) {
// Add Potion Effect Names of 1.9
potionEffectNames.add(new PotionEffectName(PotionType.LUCK, langConfig.getString("effect.luck", "Luck")));
potionEffectNames.add(new PotionEffectName(PotionType.MUNDANE, langConfig.getString("effect.none", "No Effects")));
potionEffectNames.add(new PotionEffectName(PotionType.THICK, langConfig.getString("effect.none", "No Effects")));
potionEffectNames.add(new PotionEffectName(PotionType.UNCRAFTABLE, langConfig.getString("effect.none", "No Effects")));
}
// Add Potion Names
potionNames.add(new PotionName(PotionName.PotionItemType.POTION, PotionType.AWKWARD, langConfig.getString("potion.effect.awkward", "Awkward Potion")));
potionNames.add(new PotionName(PotionName.PotionItemType.POTION, PotionType.FIRE_RESISTANCE, langConfig.getString("potion.effect.fire_resistance", "Potion of Fire Resistance")));
potionNames.add(new PotionName(PotionName.PotionItemType.POTION, PotionType.INSTANT_DAMAGE, langConfig.getString("potion.effect.harming", "Potion of Harming")));
@ -723,6 +736,7 @@ public class LanguageUtils {
potionNames.add(new PotionName(PotionName.PotionItemType.POTION, PotionType.WATER, langConfig.getString("potion.effect.water", "Water Bottle")));
if (Utils.getMajorVersion() >= 9) {
// Add Potion Names of 1.9
potionNames.add(new PotionName(PotionName.PotionItemType.POTION, PotionType.LUCK, langConfig.getString("potion.effect.luck", "Potion of Luck")));
potionNames.add(new PotionName(PotionName.PotionItemType.POTION, PotionType.MUNDANE, langConfig.getString("potion.effect.mundane", "Mundane Potion")));
potionNames.add(new PotionName(PotionName.PotionItemType.POTION, PotionType.THICK, langConfig.getString("potion.effect.thick", "Thick Potion")));
@ -730,6 +744,7 @@ public class LanguageUtils {
}
if (Utils.getMajorVersion() >= 9) {
// Add Tipped Arrow Names (implemented in Minecraft since 1.9)
potionNames.add(new PotionName(PotionName.PotionItemType.TIPPED_ARROW, PotionType.AWKWARD, langConfig.getString("tipped_arrow.effect.awkward", "Tipped Arrow")));
potionNames.add(new PotionName(PotionName.PotionItemType.TIPPED_ARROW, PotionType.FIRE_RESISTANCE, langConfig.getString("tipped_arrow.effect.fire_resistance", "Arrow of Fire Resistance")));
potionNames.add(new PotionName(PotionName.PotionItemType.TIPPED_ARROW, PotionType.INSTANT_DAMAGE, langConfig.getString("tipped_arrow.effect.harming", "Arrow of Harming")));
@ -751,6 +766,7 @@ public class LanguageUtils {
potionNames.add(new PotionName(PotionName.PotionItemType.TIPPED_ARROW, PotionType.UNCRAFTABLE, langConfig.getString("tipped_arrow.effect.empty", "Tipped Arrow")));
}
// Add Splash Potion Names
potionNames.add(new PotionName(PotionName.PotionItemType.SPLASH_POTION, PotionType.AWKWARD, langConfig.getString("splash_potion.effect.awkward", "Awkward Splash Potion")));
potionNames.add(new PotionName(PotionName.PotionItemType.SPLASH_POTION, PotionType.FIRE_RESISTANCE, langConfig.getString("splash_potion.effect.fire_resistance", "Splash Potion of Fire Resistance")));
potionNames.add(new PotionName(PotionName.PotionItemType.SPLASH_POTION, PotionType.INSTANT_DAMAGE, langConfig.getString("splash_potion.effect.harming", "Splash Potion of Harming")));
@ -768,6 +784,7 @@ public class LanguageUtils {
potionNames.add(new PotionName(PotionName.PotionItemType.SPLASH_POTION, PotionType.WATER, langConfig.getString("splash_potion.effect.water", "Splash Water Bottle")));
if (Utils.getMajorVersion() >= 9) {
// Add Splash Potion Names of 1.9
potionNames.add(new PotionName(PotionName.PotionItemType.SPLASH_POTION, PotionType.LUCK, langConfig.getString("splash_potion.effect.luck", "Splash Potion of Luck")));
potionNames.add(new PotionName(PotionName.PotionItemType.SPLASH_POTION, PotionType.MUNDANE, langConfig.getString("splash_potion.effect.mundane", "Mundane Splash Potion")));
potionNames.add(new PotionName(PotionName.PotionItemType.SPLASH_POTION, PotionType.THICK, langConfig.getString("splash_potion.effect.thick", "Thick Splash Potion")));
@ -775,6 +792,7 @@ public class LanguageUtils {
}
if (Utils.getMajorVersion() >= 9) {
// Add Lingering Potion Names (implemented in Minecraft since 1.9)
potionNames.add(new PotionName(PotionName.PotionItemType.LINGERING_POTION, PotionType.AWKWARD, langConfig.getString("lingering_potion.effect.awkward", "Awkward Lingering Potion")));
potionNames.add(new PotionName(PotionName.PotionItemType.LINGERING_POTION, PotionType.FIRE_RESISTANCE, langConfig.getString("lingering_potion.effect.fire_resistance", "Lingering Potion of Fire Resistance")));
potionNames.add(new PotionName(PotionName.PotionItemType.LINGERING_POTION, PotionType.INSTANT_DAMAGE, langConfig.getString("lingering_potion.effect.harming", "Lingering Potion of Harming")));
@ -796,6 +814,7 @@ public class LanguageUtils {
potionNames.add(new PotionName(PotionName.PotionItemType.LINGERING_POTION, PotionType.UNCRAFTABLE, langConfig.getString("lingering_potion.effect.empty", "Lingering Uncraftable Potion")));
}
// Add Music Disc Titles
musicDiscNames.add(new MusicDiscName(Material.GOLD_RECORD, langConfig.getString("item.record.13.desc", "C418 - 13")));
musicDiscNames.add(new MusicDiscName(Material.GREEN_RECORD, langConfig.getString("item.record.cat.desc", "C418 - cat")));
musicDiscNames.add(new MusicDiscName(Material.RECORD_3, langConfig.getString("item.record.blocks.desc", "C418 - blocks")));
@ -809,6 +828,7 @@ public class LanguageUtils {
musicDiscNames.add(new MusicDiscName(Material.RECORD_11, langConfig.getString("item.record.11.desc", "C418 - 11")));
musicDiscNames.add(new MusicDiscName(Material.RECORD_12, langConfig.getString("item.record.wait.desc", "C418 - wait")));
// Add ShopChest Messages
messages.add(new LocalizedMessage(LocalizedMessage.Message.SHOP_CREATED, langConfig.getString("message.shop-created", "&6Shop created.")));
messages.add(new LocalizedMessage(LocalizedMessage.Message.CHEST_ALREADY_SHOP, langConfig.getString("message.chest-already-shop", "&cChest already shop.")));
messages.add(new LocalizedMessage(LocalizedMessage.Message.SHOP_REMOVED, langConfig.getString("message.shop-removed", "&6Shop removed.")));
@ -881,6 +901,10 @@ public class LanguageUtils {
messages.add(new LocalizedMessage(LocalizedMessage.Message.COMMAND_DESC_LIMITS, langConfig.getString("message.commandDescription.limits", "View shop limits.")));
}
/**
* @param stack Item whose name to lookup
* @return Localized Name of the Item, the custom name, or if <i>stack</i> is a book, the title of the book
*/
public static String getItemName(ItemStack stack) {
if (stack.hasItemMeta()) {
ItemMeta meta = stack.getItemMeta();
@ -959,7 +983,7 @@ public class LanguageUtils {
}
}
return itemName.getLocalizedName() + " " + capitalizeDefaultString(spawnedType.toString());
return itemName.getLocalizedName() + " " + formatDefaultString(spawnedType.toString());
}
@ -969,11 +993,16 @@ public class LanguageUtils {
}
return capitalizeDefaultString(material.toString());
return formatDefaultString(material.toString());
}
/**
* @param enchantment Enchantment whose name should be looked up
* @param level Level of the enchantment
* @return Localized Name of the enchantment with the given level afterwards
*/
public static String getEnchantmentName(Enchantment enchantment, int level) {
String enchantmentString = capitalizeDefaultString(enchantment.getName());
String enchantmentString = formatDefaultString(enchantment.getName());
String levelString = langConfig.getString("enchantment.level." + level, String.valueOf(level));
for (EnchantmentName enchantmentName : enchantmentNames) {
@ -991,10 +1020,14 @@ public class LanguageUtils {
return enchantmentString + " " + levelString;
}
/**
* @param itemStack Potion Item whose base effect name should be looked up
* @return Localized Name of the Base Potion Effect
*/
public static String getPotionEffectName(ItemStack itemStack) {
PotionMeta potionMeta = (PotionMeta) itemStack.getItemMeta();
String potionEffectString = capitalizeDefaultString(potionMeta.getBasePotionData().getType().toString());
String potionEffectString = formatDefaultString(potionMeta.getBasePotionData().getType().toString());
String upgradeString = potionMeta.getBasePotionData().isUpgraded() ? "II" : "";
for (PotionEffectName potionEffectName : potionEffectNames) {
@ -1006,6 +1039,10 @@ public class LanguageUtils {
return potionEffectString + (upgradeString.length() > 0 ? " " + upgradeString : "");
}
/**
* @param musicDiscMaterial Material of the Music Disc whose name should be looked up
* @return Localized title of the Music Disc
*/
public static String getMusicDiscName(Material musicDiscMaterial) {
for (MusicDiscName musicDiscName : musicDiscNames) {
if (musicDiscMaterial == musicDiscName.getMusicDiscMaterial()) {
@ -1016,6 +1053,11 @@ public class LanguageUtils {
return "";
}
/**
* @param message Message which should be translated
* @param replacedRegexes Regexes which might be required to be replaced in the message
* @return Localized Message
*/
public static String getMessage(LocalizedMessage.Message message, LocalizedMessage.ReplacedRegex... replacedRegexes) {
String _message = ChatColor.RED + "An error occurred: Message not found: " + message.toString();
@ -1055,7 +1097,13 @@ public class LanguageUtils {
return _message;
}
private static String capitalizeDefaultString(String string) {
/**
* Underscores will be replaced by spaces and the first letter of each word will be capitalized
*
* @param string String to format
* @return Formatted String with underscores replaced by spaces and the first letter of each word capitalized
*/
private static String formatDefaultString(String string) {
string = string.replace("_", " ");
String newString = "";

View File

@ -20,14 +20,23 @@ public class LocalizedMessage {
this.localizedString = ChatColor.translateAlternateColorCodes('&', localizedString);
}
/**
* @return {@link Message} linked to this object
*/
public Message getMessage() {
return message;
}
/**
* @return Array of {@link Regex}, which are required by the message
*/
public Regex[] getRegexes() {
return regexes;
}
/**
* @return Localized Message
*/
public String getLocalizedString() {
return localizedString;
}
@ -102,7 +111,7 @@ public class LocalizedMessage {
COMMAND_DESC_INFO,
COMMAND_DESC_RELOAD,
COMMAND_DESC_UPDATE,
COMMAND_DESC_LIMITS;
COMMAND_DESC_LIMITS
}
public static class ReplacedRegex {
@ -115,10 +124,16 @@ public class LocalizedMessage {
this.replace = replace;
}
/**
* @return String which will replace the regex
*/
public String getReplace() {
return replace;
}
/**
* @return Regex that will be replaced
*/
public Regex getRegex() {
return regex;
}

View File

@ -12,10 +12,16 @@ public class MusicDiscName {
this.localizedName = localizedName;
}
/**
* @return Localized Title of the Music Disc
*/
public String getLocalizedName() {
return localizedName;
}
/**
* @return Material of the Music Disc
*/
public Material getMusicDiscMaterial() {
return musicDiscMaterial;
}

View File

@ -12,11 +12,16 @@ public class PotionEffectName {
this.localizedName = localizedName;
}
/**
* @return Potion Effect linked to the name
*/
public PotionType getEffect() {
return effect;
}
/**
* @return Localized Name of the potion effect
*/
public String getLocalizedName() {
return localizedName;
}

View File

@ -15,14 +15,23 @@ public class PotionName {
this.potionType = potionType;
}
/**
* @return {@link PotionItemType} linked to the Potion name
*/
public PotionItemType getPotionItemType() {
return potionItemType;
}
/**
* @return Potion Type linked to the Potion name
*/
public PotionType getPotionType() {
return potionType;
}
/**
* @return Localized Name of the Potion
*/
public String getLocalizedName() {
return localizedName;
}
@ -31,6 +40,6 @@ public class PotionName {
POTION,
LINGERING_POTION,
SPLASH_POTION,
TIPPED_ARROW;
TIPPED_ARROW
}
}

View File

@ -11,9 +11,6 @@ import org.bukkit.event.player.PlayerMoveEvent;
public class HologramUpdateListener implements Listener {
public HologramUpdateListener() {
}
@EventHandler
public void onPlayerMove(PlayerMoveEvent e) {

View File

@ -223,6 +223,16 @@ public class ShopInteractListener implements Listener {
}
/**
* Create a new shop
*
* @param executor Player, who executed the command, will receive the message and become the vendor of the shop
* @param location Where the shop will be located
* @param product Product of the Shop
* @param buyPrice Buy price
* @param sellPrice Sell price
* @param shopType Type of the shop
*/
private void create(Player executor, Location location, ItemStack product, double buyPrice, double sellPrice, ShopType shopType) {
Shop shop = new Shop(database.getNextFreeID(), plugin, executor, product, location, buyPrice, sellPrice, shopType);
@ -235,11 +245,21 @@ public class ShopInteractListener implements Listener {
}
/**
* Remove a shop
* @param executor Player, who executed the command and will receive the message
* @param shop Shop to be removed
*/
private void remove(Player executor, Shop shop) {
ShopUtils.removeShop(shop, true);
executor.sendMessage(LanguageUtils.getMessage(LocalizedMessage.Message.SHOP_REMOVED));
}
/**
*
* @param executor Player, who executed the command and will retrieve the information
* @param shop Shop from which the information will be retrieved
*/
private void info(Player executor, Shop shop) {
Chest c = (Chest) shop.getLocation().getBlock().getState();
@ -308,6 +328,11 @@ public class ShopInteractListener implements Listener {
executor.sendMessage(" ");
}
/**
* A player buys from a shop
* @param executor Player, who executed the command and will buy the product
* @param shop Shop, from which the player buys
*/
private void buy(Player executor, Shop shop) {
if (econ.getBalance(executor) >= shop.getBuyPrice()) {
@ -390,6 +415,11 @@ public class ShopInteractListener implements Listener {
}
}
/**
* A player sells to a shop
* @param executor Player, who executed the command and will sell the product
* @param shop Shop, to which the player sells
*/
private void sell(Player executor, Shop shop) {
if (econ.getBalance(shop.getVendor()) >= shop.getSellPrice() || shop.getShopType() == ShopType.ADMIN) {
@ -463,6 +493,12 @@ public class ShopInteractListener implements Listener {
}
}
/**
* Adds items to an inventory
* @param inventory The inventory, to which the items will be added
* @param itemStack Items to add
* @return Whether all items were added to the inventory
*/
private boolean addToInventory(Inventory inventory, ItemStack itemStack) {
HashMap<Integer, ItemStack> inventoryItems = new HashMap<>();
int amount = itemStack.getAmount();
@ -513,6 +549,12 @@ public class ShopInteractListener implements Listener {
return (added == amount);
}
/**
* Removes items to from an inventory
* @param inventory The inventory, from which the items will be removed
* @param itemStack Items to remove
* @return Whether all items were removed from the inventory
*/
private boolean removeFromInventory(Inventory inventory, ItemStack itemStack) {
HashMap<Integer, ItemStack> inventoryItems = new HashMap<>();
int amount = itemStack.getAmount();

View File

@ -22,7 +22,6 @@ import org.bukkit.inventory.meta.ItemMeta;
import org.bukkit.metadata.FixedMetadataValue;
import org.bukkit.util.Vector;
import java.util.ArrayList;
import java.util.UUID;
public class Shop {
@ -65,6 +64,9 @@ public class Shop {
if (item == null || item.isDead()) createItem();
}
/**
* Creates the hologram of the shop if it doesn't exist
*/
public void removeHologram() {
if (hologram != null && hologram.exists()) {
for (Player p : Bukkit.getOnlinePlayers()) {
@ -75,11 +77,18 @@ public class Shop {
}
}
/**
* Removes the floating item of the shop
*/
public void removeItem() {
if (item != null && !item.isDead())
item.remove();
}
/**
* <p>Creates the floating item of the shop</p>
* <b>Call this after {@link #createHologram()}, because it depends on the hologram's location</b>
*/
private void createItem() {
Item item;
Location itemLocation;
@ -101,6 +110,9 @@ public class Shop {
this.item = item;
}
/**
* Creates the hologram of the shop
*/
private void createHologram() {
boolean doubleChest;
@ -188,38 +200,65 @@ public class Shop {
}
/**
* @return The ID of the shop
*/
public int getID() {
return id;
}
/**
* @return Vendor of the shop; probably the creator of it
*/
public OfflinePlayer getVendor() {
return vendor;
}
/**
* @return Product the shop sells (or buys)
*/
public ItemStack getProduct() {
return product;
}
/**
* @return Location of (one of) the shop's chest
*/
public Location getLocation() {
return location;
}
/**
* @return Buy price of the shop
*/
public double getBuyPrice() {
return buyPrice;
}
/**
* @return Sell price of the shop
*/
public double getSellPrice() {
return sellPrice;
}
/**
* @return Type of the shop
*/
public ShopType getShopType() {
return shopType;
}
/**
* @return Hologram of the shop
*/
public Hologram getHologram() {
return hologram;
}
/**
* @return Chest of the shop. If double chest, only one chest is returned
*/
public Chest getChest() {
return chest;
}

View File

@ -24,8 +24,15 @@ public abstract class Database {
initialize();
}
/**
* @return Connection to the database
*/
public abstract Connection getConnection();
/**
* Initializes the database. <br>
* Creates the table (if doesn't exist) and tests the connection
*/
private void initialize() {
connection = getConnection();
@ -57,6 +64,9 @@ public abstract class Database {
}
}
/**
* @return Lowest possible ID which is not used (> 0)
*/
public int getNextFreeID() {
for (int i = 1; i < getHighestID() + 1; i++) {
if (get(i, ShopInfo.X) == null) {
@ -71,6 +81,9 @@ public abstract class Database {
return 1;
}
/**
* @return Highest ID which is used
*/
public int getHighestID() {
PreparedStatement ps = null;
ResultSet rs = null;
@ -98,6 +111,11 @@ public abstract class Database {
return 0;
}
/**
* Remove a shop from the database
*
* @param shop Shop to remove
*/
public void removeShop(Shop shop) {
PreparedStatement ps = null;
@ -112,6 +130,11 @@ public abstract class Database {
}
/**
* @param id ID of the shop
* @param shopInfo What to get
* @return Value you wanted to get. This needs to be casted to the right type!
*/
public Object get(int id, ShopInfo shopInfo) {
PreparedStatement ps = null;
ResultSet rs = null;
@ -186,6 +209,10 @@ public abstract class Database {
return null;
}
/**
* Adds a shop to the database
* @param shop Shop to add
*/
public void addShop(Shop shop) {
PreparedStatement ps = null;
@ -211,6 +238,11 @@ public abstract class Database {
}
}
/**
* Closes a {@link PreparedStatement} and a {@link ResultSet}
* @param ps {@link PreparedStatement} to close
* @param rs {@link ResultSet} to close
*/
private void close(PreparedStatement ps, ResultSet rs) {
try {
if (ps != null)
@ -233,11 +265,11 @@ public abstract class Database {
LOCATION,
BUYPRICE,
SELLPRICE,
SHOPTYPE;
SHOPTYPE
}
public enum DatabaseType {
SQLite,
MySQL;
MySQL
}
}

View File

@ -27,6 +27,12 @@ public class ClickType {
this.shopType = shopType;
}
/**
* Gets the click type of a player
*
* @param player Player whose click type should be gotten
* @return The Player's click type or <b>null</b> if he doesn't have one
*/
public static ClickType getPlayerClickType(OfflinePlayer player) {
if (playerClickType.containsKey(player))
return playerClickType.get(player);
@ -34,36 +40,61 @@ public class ClickType {
return null;
}
/**
* Removes the click type from a player
* @param player Player to remove the click type from
*/
public static void removePlayerClickType(OfflinePlayer player) {
playerClickType.remove(player);
}
public static void addPlayerClickType(OfflinePlayer player, ClickType clickType) {
/**
* Sets the click type of a player
*
* @param player Player whose click type should be set
* @param clickType Click type to set
*/
public static void setPlayerClickType(OfflinePlayer player, ClickType clickType) {
playerClickType.put(player, clickType);
}
/**
* @return Type of the click type
*/
public EnumClickType getClickType() {
return enumClickType;
}
/**
* @return If {@link #getClickType()} returns {@link EnumClickType#CREATE}, this returns the item, the player has hold in his hands, else <b>null</b>.
*/
public ItemStack getProduct() {
return product;
}
/**
* @return If {@link #getClickType()} returns {@link EnumClickType#CREATE}, this returns the buy price, the player has entered, else <b>null</b>.
*/
public double getBuyPrice() {
return buyPrice;
}
/**
* @return If {@link #getClickType()} returns {@link EnumClickType#CREATE}, this returns the sell price, the player has entered, else <b>null</b>.
*/
public double getSellPrice() {
return sellPrice;
}
/**
* @return If {@link #getClickType()} returns {@link EnumClickType#CREATE}, this returns the shop type, the player has entered, else <b>null</b>.
*/
public ShopType getShopType() {
return shopType;
}
public enum EnumClickType {
CREATE, REMOVE, INFO;
CREATE, REMOVE, INFO
}
}

View File

@ -4,8 +4,10 @@ import de.epiceric.shopchest.ShopChest;
import de.epiceric.shopchest.config.Config;
import de.epiceric.shopchest.shop.Shop;
import de.epiceric.shopchest.sql.Database;
import org.bukkit.*;
import org.bukkit.block.Block;
import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.OfflinePlayer;
import org.bukkit.World;
import org.bukkit.block.Chest;
import org.bukkit.block.DoubleChest;
import org.bukkit.entity.Entity;
@ -23,17 +25,32 @@ public class ShopUtils {
private static HashMap<Location, Shop> shopLocation = new HashMap<>();
private static ShopChest plugin = ShopChest.getInstance();
/**
* Get the shop at a given location
*
* @param location Location of the shop
* @return Shop at the given location or <b>null</b> if no shop is found there
*/
public static Shop getShop(Location location) {
Location newLocation = new Location(location.getWorld(), location.getX(), location.getY(), location.getZ());
return shopLocation.get(newLocation);
}
/**
* Checks whether there is a shop at a given location
* @param location Location to check
* @return Whether there is a shop at the given location
*/
public static boolean isShop(Location location) {
Location newLocation = new Location(location.getWorld(), location.getX(), location.getY(), location.getZ());
return shopLocation.containsKey(newLocation);
}
/**
* Get all Shops
* @return Array of all Shops
*/
public static Shop[] getShops() {
ArrayList<Shop> shops = new ArrayList<>();
@ -44,6 +61,11 @@ public class ShopUtils {
return shops.toArray(new Shop[shops.size()]);
}
/**
* Add a shop
* @param shop Shop to add
* @param addToDatabase Whether the shop should also be added to the database
*/
public static void addShop(Shop shop, boolean addToDatabase) {
InventoryHolder ih = shop.getChest().getInventory().getHolder();
@ -63,6 +85,11 @@ public class ShopUtils {
}
/**
* Remove a shop
* @param shop Shop to remove
* @param removeFromDatabase Whether the shop should also be removed from the database
*/
public static void removeShop(Shop shop, boolean removeFromDatabase) {
InventoryHolder ih = shop.getChest().getInventory().getHolder();
@ -84,6 +111,11 @@ public class ShopUtils {
plugin.getShopDatabase().removeShop(shop);
}
/**
* Get the shop limits of a player
* @param p Player, whose shop limits should be returned
* @return The shop limits of the given player
*/
public static int getShopLimit(Player p) {
int limit = Config.default_limit;
@ -137,6 +169,11 @@ public class ShopUtils {
return limit;
}
/**
* Get the amount of shops of a player
* @param p Player, whose shops should be counted
* @return The amount of a shops a player has (if {@link Config#exclude_admin_shops} is true, admin shops won't be counted)
*/
public static int getShopAmount(OfflinePlayer p) {
float shopCount = 0;
@ -154,6 +191,10 @@ public class ShopUtils {
return Math.round(shopCount);
}
/**
* Reload the shops
* @return Amount of shops, which were reloaded
*/
public static int reloadShops() {
for (Shop shop : ShopUtils.getShops()) {
ShopUtils.removeShop(shop, false);

View File

@ -10,15 +10,18 @@ import java.net.URLConnection;
public class UpdateChecker {
private ShopChest plugin;
private String url;
private String version;
private String link;
public UpdateChecker(ShopChest plugin, String url) {
public UpdateChecker(ShopChest plugin) {
this.plugin = plugin;
this.url = url;
}
/**
* Check if an update is needed
*
* @return {@link UpdateCheckerResult#TRUE} if an update is available, {@link UpdateCheckerResult#FALSE} of no update is needed and {@link UpdateCheckerResult#ERROR} if an error occurred
*/
public UpdateCheckerResult updateNeeded() {
try {
URL url = new URL("http://textuploader.com/all1l/raw");
@ -47,6 +50,10 @@ public class UpdateChecker {
}
}
/**
* Get the broadcast message
* @return A String Array of the lines of the broadcast message or <b>null</b> when no message is available
*/
public String[] getBroadcast() {
try {
URL url = new URL("http://textuploader.com/5b51f/raw");
@ -74,10 +81,16 @@ public class UpdateChecker {
return null;
}
/**
* @return Latest Version or <b>null</b> if no update is available
*/
public String getVersion() {
return version;
}
/**
* @return Download Link of the latest version of <b>null</b> if no update is available
*/
public String getLink() {
return link;
}
@ -85,7 +98,7 @@ public class UpdateChecker {
public enum UpdateCheckerResult {
TRUE,
FALSE,
ERROR;
ERROR
}

View File

@ -11,6 +11,13 @@ import java.util.ArrayList;
public class Utils {
/**
* Gets the amount of items in an inventory
*
* @param inventory The inventory, in which the items are counted
* @param itemStack The items to count
* @return Amount of given items in the given inventory
*/
public static int getAmount(Inventory inventory, ItemStack itemStack) {
int amount = 0;
@ -42,32 +49,47 @@ public class Utils {
return amount;
}
/**
* @return The current server version with revision number (e.g. 1_9_R2, 1_10_R1)
*/
public static String getServerVersion() {
String packageName = Bukkit.getServer().getClass().getPackage().getName();
return packageName.substring(packageName.lastIndexOf('.') + 1);
}
/**
* @return The major version of the server (e.g. <i>9</i> for 1.9.2, <i>10</i> for 1.10)
*/
public static int getMajorVersion() {
return Integer.valueOf(getServerVersion().split("_")[1]);
}
/**
* Checks if a given String is a UUID
* @param string String to check
* @return Whether the string is a UUID
*/
public static boolean isUUID(String string) {
return string.matches("[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[34][0-9a-fA-F]{3}-[89ab][0-9a-fA-F]{3}-[0-9a-fA-F]{12}");
}
/**
* Encodes an {@link ItemStack} in a Base64 String
* @param itemStack {@link ItemStack} to encode
* @return Base64 encoded String
*/
public static String encode(ItemStack itemStack) {
YamlConfiguration config = new YamlConfiguration();
config.set("i", itemStack);
return new String(Base64.encodeBase64(config.saveToString().getBytes()));
}
public static String toString(ItemStack itemStack) {
YamlConfiguration config = new YamlConfiguration();
config.set("i", itemStack);
return config.saveToString();
}
/**
* Decodes an {@link ItemStack} from a Base64 String
* @param string Base64 encoded String to decode
* @return Decoded {@link ItemStack}
*/
public static ItemStack decode(String string) {
YamlConfiguration config = new YamlConfiguration();
try {