diff --git a/.gitignore b/.gitignore index 7b31b14a1..64124434b 100644 --- a/.gitignore +++ b/.gitignore @@ -45,5 +45,7 @@ build/ ### Islands ### /configuration/skyblock/islands/hypixel_skyblock_island_template/ /configuration/skyblock/islands/hypixel_skyblock_hub/ +/configuration/skyblock/islands/hypixel_skyblock_gold_mine/ +/configuration/skyblock/islands/* /configuration/hypixel_prototype_lobby/ .gradle/ diff --git a/commons/src/main/java/net/swofty/commons/ChatUtility.java b/commons/src/main/java/net/swofty/commons/ChatUtility.java new file mode 100644 index 000000000..0b60cf6ca --- /dev/null +++ b/commons/src/main/java/net/swofty/commons/ChatUtility.java @@ -0,0 +1,190 @@ +package net.swofty.commons; + +import lombok.Getter; + +import java.util.List; + +public class ChatUtility { + + public enum FontInfo { + A('A', 5), + a('a', 5), + B('B', 5), + b('b', 5), + C('C', 5), + c('c', 5), + D('D', 5), + d('d', 5), + E('E', 5), + e('e', 5), + F('F', 5), + f('f', 4), + G('G', 5), + g('g', 5), + H('H', 5), + h('h', 5), + I('I', 3), + i('i', 1), + J('J', 5), + j('j', 5), + K('K', 5), + k('k', 4), + L('L', 5), + l('l', 1), + M('M', 5), + m('m', 5), + N('N', 5), + n('n', 5), + O('O', 5), + o('o', 5), + P('P', 5), + p('p', 5), + Q('Q', 5), + q('q', 5), + R('R', 5), + r('r', 5), + S('S', 5), + s('s', 5), + T('T', 5), + t('t', 4), + U('U', 5), + u('u', 5), + V('V', 5), + v('v', 5), + W('W', 5), + w('w', 5), + X('X', 5), + x('x', 5), + Y('Y', 5), + y('y', 5), + Z('Z', 5), + z('z', 5), + NUM_1('1', 5), + NUM_2('2', 5), + NUM_3('3', 5), + NUM_4('4', 5), + NUM_5('5', 5), + NUM_6('6', 5), + NUM_7('7', 5), + NUM_8('8', 5), + NUM_9('9', 5), + NUM_0('0', 5), + EXCLAMATION_POINT('!', 1), + AT_SYMBOL('@', 6), + NUM_SIGN('#', 5), + DOLLAR_SIGN('$', 5), + PERCENT('%', 5), + UP_ARROW('^', 5), + AMPERSAND('&', 5), + ASTERISK('*', 5), + LEFT_PARENTHESIS('(', 4), + RIGHT_PERENTHESIS(')', 4), + MINUS('-', 5), + UNDERSCORE('_', 5), + PLUS_SIGN('+', 5), + EQUALS_SIGN('=', 5), + LEFT_CURL_BRACE('{', 4), + RIGHT_CURL_BRACE('}', 4), + LEFT_BRACKET('[', 3), + RIGHT_BRACKET(']', 3), + COLON(':', 1), + SEMI_COLON(';', 1), + DOUBLE_QUOTE('"', 3), + SINGLE_QUOTE('\'', 1), + LEFT_ARROW('<', 4), + RIGHT_ARROW('>', 4), + DOUBLE_LEFT_ARROW('«', 5), + DOUBLE_RIGHT_ARROW('»', 5), + QUESTION_MARK('?', 5), + SLASH('/', 5), + BACK_SLASH('\\', 5), + LINE('|', 1), + TILDE('~', 5), + TICK('`', 2), + PERIOD('.', 1), + COMMA(',', 1), + SPACE(' ', 3), + DEFAULT('a', 4); + + private final static int CENTER_PX = 320 / 2 - 6; + @Getter + private final char character; + @Getter + private final int length; + + FontInfo(char character, int length) { + this.character = character; + this.length = length; + } + + public static FontInfo getDefaultFontInfo(char c) { + for (FontInfo fontInfo : values()) { + if (fontInfo.getCharacter() == c) { + return fontInfo; + } + } + return DEFAULT; + } + + public static String center(String message) { + return getCenterSpaces(message) + message; + } + + public static List centerLines(List lines) { + return lines.stream().map(FontInfo::center).toList(); + } + + public static String getCenterSpaces(String message) { + if (message == null || message.isEmpty()) { + return ""; + } + int messagePxSize = getLength(message); + int halvedMessageSize = messagePxSize / 2; + int toCompensate = CENTER_PX - halvedMessageSize; + int spaceLength = SPACE.getLength() + 1; + int compensated = 0; + StringBuilder sb = new StringBuilder(); + + while (compensated < toCompensate) { + sb.append(" "); + compensated += spaceLength; + } + return sb.toString(); + } + + public static String stripTokens(String input) { + return input.replaceAll("§.", ""); + } + + public static int getLength(String message) { + message = stripTokens(message); + + double messagePxSize = 0; + boolean previousCode = false; + boolean bold = false; + + for (char c : message.toCharArray()) { + if (c == '§') { + previousCode = true; + + } else if (previousCode) { + previousCode = false; + bold = bold ? c != 'r' : c == 'l'; + + } else { + FontInfo fontInfo = getDefaultFontInfo(c); + messagePxSize += bold ? fontInfo.getBoldLength() + 1.5 : fontInfo.getLength() + 1; + } + } + return (int) messagePxSize; + } + + public int getBoldLength() { + if (this == SPACE) { + return getLength(); + } + return length + 1; + } + } + +} diff --git a/commons/src/main/java/net/swofty/commons/CustomWorlds.java b/commons/src/main/java/net/swofty/commons/CustomWorlds.java index bf2ba4892..8138b5980 100644 --- a/commons/src/main/java/net/swofty/commons/CustomWorlds.java +++ b/commons/src/main/java/net/swofty/commons/CustomWorlds.java @@ -1,24 +1,27 @@ package net.swofty.commons; public enum CustomWorlds { - SKYBLOCK_ISLAND_TEMPLATE("hypixel_skyblock_island_template"), - SKYBLOCK_HUB("hypixel_skyblock_hub"), - SKYBLOCK_DUNGEON_HUB("hypixel_skyblock_dungeon_hub"), - PROTOTYPE_LOBBY("hypixel_prototype_lobby"), - BEDWARS_LOBBY("hypixel_bedwars_lobby"), - ; + SKYBLOCK_ISLAND_TEMPLATE("hypixel_skyblock_island_template"), + SKYBLOCK_HUB("hypixel_skyblock_hub"), + SKYBLOCK_GOLD_MINE("hypixel_skyblock_gold_mine"), + SKYBLOCK_DEEP_CAVERNS("hypixel_skyblock_deep_caverns"), + SKYBLOCK_DWARVEN_MINES("hypixel_skyblock_dwarven_mines"), + SKYBLOCK_DUNGEON_HUB("hypixel_skyblock_dungeon_hub"), + PROTOTYPE_LOBBY("hypixel_prototype_lobby"), + BEDWARS_LOBBY("hypixel_bedwars_lobby"), + ; - private final String folderName; + private final String folderName; - CustomWorlds(String folderName) { - this.folderName = folderName; - } + CustomWorlds(String folderName) { + this.folderName = folderName; + } - public String getFolderName() { - if (name().startsWith("SKYBLOCK_")) { - return "./configuration/skyblock/islands/" + folderName; - } else { - return "./configuration/" + folderName; - } - } + public String getFolderName() { + if (name().startsWith("SKYBLOCK_")) { + return "./configuration/skyblock/islands/" + folderName; + } else { + return "./configuration/" + folderName; + } + } } diff --git a/commons/src/main/java/net/swofty/commons/ServerType.java b/commons/src/main/java/net/swofty/commons/ServerType.java index 6a7e44bdd..8b5ba20ba 100644 --- a/commons/src/main/java/net/swofty/commons/ServerType.java +++ b/commons/src/main/java/net/swofty/commons/ServerType.java @@ -4,41 +4,44 @@ @Getter public enum ServerType { - SKYBLOCK_ISLAND(true), - SKYBLOCK_HUB(true), - SKYBLOCK_DUNGEON_HUB(true), - SKYBLOCK_THE_FARMING_ISLANDS(true), - PROTOTYPE_LOBBY(false), - BEDWARS_LOBBY(false), - BEDWARS_GAME(false), - ; - - private final boolean isSkyBlock; - - ServerType(boolean isSkyBlock) { - this.isSkyBlock = isSkyBlock; - } - - public static boolean isServerType(String type) { - for (ServerType a : values()) - if (type.equalsIgnoreCase(a.name())) return true; - - return false; - } - - public String formatName() { - return StringUtility.toNormalCase(name()); - } - - public static ServerType getSkyblockServer(String name) { - if (!name.startsWith("SKYBLOCK_")) { - return valueOf("SKYBLOCK_" + name.toUpperCase()); - } else { - return valueOf(name); - } - } - - public String skyblockName() { - return name().replace("SKYBLOCK_", ""); - } + SKYBLOCK_ISLAND(true), + SKYBLOCK_HUB(true), + SKYBLOCK_DUNGEON_HUB(true), + SKYBLOCK_THE_FARMING_ISLANDS(true), + SKYBLOCK_GOLD_MINE(true), + SKYBLOCK_DEEP_CAVERNS(true), + SKYBLOCK_DWARVEN_MINES(true), + PROTOTYPE_LOBBY(false), + BEDWARS_LOBBY(false), + BEDWARS_GAME(false), + ; + + private final boolean isSkyBlock; + + ServerType(boolean isSkyBlock) { + this.isSkyBlock = isSkyBlock; + } + + public static boolean isServerType(String type) { + for (ServerType a : values()) + if (type.equalsIgnoreCase(a.name())) return true; + + return false; + } + + public static ServerType getSkyblockServer(String name) { + if (!name.startsWith("SKYBLOCK_")) { + return valueOf("SKYBLOCK_" + name.toUpperCase()); + } else { + return valueOf(name); + } + } + + public String formatName() { + return StringUtility.toNormalCase(name()); + } + + public String skyblockName() { + return name().replace("SKYBLOCK_", ""); + } } diff --git a/commons/src/main/java/net/swofty/commons/ServiceType.java b/commons/src/main/java/net/swofty/commons/ServiceType.java index 1600d0fe6..63c2d7c89 100644 --- a/commons/src/main/java/net/swofty/commons/ServiceType.java +++ b/commons/src/main/java/net/swofty/commons/ServiceType.java @@ -7,5 +7,6 @@ public enum ServiceType { API, DATA_MUTEX, PARTY, + DARK_AUCTION, ; } diff --git a/commons/src/main/java/net/swofty/commons/StringUtility.java b/commons/src/main/java/net/swofty/commons/StringUtility.java index 6936e1641..a4d2143d6 100644 --- a/commons/src/main/java/net/swofty/commons/StringUtility.java +++ b/commons/src/main/java/net/swofty/commons/StringUtility.java @@ -17,284 +17,279 @@ import java.util.regex.Pattern; public class StringUtility { - public static final char[] ALPHABET = { - 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'W', 'X', 'Y', 'Z' - }; - private static final DecimalFormat INTEGER_FORMAT = new DecimalFormat("#,###"); - private static final Pattern COLOR_PATTERN = Pattern.compile("§[0-9a-fk-or]"); - - public static String formatTimeAsAgo(long millis) { - long timeDifference = System.currentTimeMillis() - millis; - // Simplified the calculation logic by abstracting repetitive calculations - long[] timeUnits = {TimeUnit.DAYS.toMillis(1), TimeUnit.HOURS.toMillis(1), TimeUnit.MINUTES.toMillis(1)}; - String[] timeLabels = {"d ago", "h ago", "m ago"}; - for (int i = 0; i < timeUnits.length; i++) { - if (timeDifference >= timeUnits[i]) { - return (timeDifference / timeUnits[i]) + timeLabels[i]; - } - } - return "Just now"; - } - - public static String commaifyAndTh(double d) { - // "th" suffix for numbers ending in 11, 12, 13 - return switch ((int) d % 100) { - case 11, 12, 13 -> INTEGER_FORMAT.format(d) + "th"; - default -> switch ((int) d % 10) { - case 1 -> INTEGER_FORMAT.format(d) + "st"; - case 2 -> INTEGER_FORMAT.format(d) + "nd"; - case 3 -> INTEGER_FORMAT.format(d) + "rd"; - default -> INTEGER_FORMAT.format(d) + "th"; - }; - }; - } - - public static String formatTimeWentBy(long millis) { - long timeDifference = System.currentTimeMillis() - millis; - // Simplified the calculation logic by abstracting repetitive calculations - long[] timeUnits = {TimeUnit.DAYS.toMillis(1), TimeUnit.HOURS.toMillis(1), TimeUnit.MINUTES.toMillis(1)}; - String[] timeLabels = {"d", "h", "m"}; - for (int i = 0; i < timeUnits.length; i++) { - if (timeDifference >= timeUnits[i]) { - return (timeDifference / timeUnits[i]) + timeLabels[i]; - } - } - return "Just now"; - } - - public static String createLineProgressBar(int length, ChatColor progressColor, double current, double max) { - double percent = Math.min(current, max) / max; - long completed = Math.round((double) length * percent); - StringBuilder builder = new StringBuilder().append(progressColor); - for (int i = 0; i < completed; i++) - builder.append("-"); - builder.append(ChatColor.WHITE); - for (int i = 0; i < length - completed; i++) - builder.append("-"); - builder.append(" ").append(ChatColor.YELLOW).append(commaify(current)).append(ChatColor.GOLD).append("/") - .append(ChatColor.YELLOW).append(commaify(max)); - return builder.toString(); - } - - public static String createProgressText(String text, double current, double max) { - double percent; - if (max != 0) - percent = (current / max) * 100.0; - else - percent = 0.0; - percent = roundTo(percent, 1); - return ChatColor.GRAY + text + ": " + (percent < 100.0 ? ChatColor.YELLOW + commaify(percent) - + ChatColor.GOLD + "%" : ChatColor.GREEN + "100.0%"); - } - - public static double roundTo(double d, int decimalPlaces) { - return Math.round(d * Math.pow(10, decimalPlaces)) / Math.pow(10, decimalPlaces); - } - - public static String stripColor(String s) { - // Find any '§' character followed by a color code - Matcher matcher = COLOR_PATTERN.matcher(s); - return matcher.replaceAll(""); - } - - public static String shortenNumber(double number) { - if (number < 1000) return String.valueOf((int) number); - String[] units = new String[]{"K", "M", "B"}; - for (int i = units.length - 1; i >= 0; i--) { - double unitValue = Math.pow(1000, i + 1); - if (number >= unitValue) { - return String.format("%.1f%s", number / unitValue, units[i]); - } - } - return String.valueOf(number); // Fallback, should not be reached - } - - public static String formatTimeLeft(long millis) { - StringBuilder sb = new StringBuilder(); - long days = TimeUnit.MILLISECONDS.toDays(millis); - long hours = TimeUnit.MILLISECONDS.toHours(millis % TimeUnit.DAYS.toMillis(1)); - long minutes = TimeUnit.MILLISECONDS.toMinutes(millis % TimeUnit.HOURS.toMillis(1)); - long seconds = TimeUnit.MILLISECONDS.toSeconds(millis % TimeUnit.MINUTES.toMillis(1)); - - // Eliminated redundant checks by concatenating non-zero values directly - if (days > 0) sb.append(days).append("d "); - if (hours > 0) sb.append(hours).append("h "); - if (minutes > 0) sb.append(minutes).append("m "); - if (seconds > 0 || sb.isEmpty()) sb.append(seconds).append("s"); - return sb.toString().trim(); - } - - public static String formatTimeLeftWrittenOut(long millis) { - StringBuilder sb = new StringBuilder(); - long days = TimeUnit.MILLISECONDS.toDays(millis); - long hours = TimeUnit.MILLISECONDS.toHours(millis % TimeUnit.DAYS.toMillis(1)); - long minutes = TimeUnit.MILLISECONDS.toMinutes(millis % TimeUnit.HOURS.toMillis(1)); - long seconds = TimeUnit.MILLISECONDS.toSeconds(millis % TimeUnit.MINUTES.toMillis(1)); - - // Eliminated redundant checks by concatenating non-zero values directly - if (days > 0) sb.append(days).append((days == 1) ? " day ":" days "); - if (hours > 0) sb.append(hours).append((hours == 1) ? " hour ":" hours "); - if (minutes > 0) sb.append(minutes).append((minutes == 1) ? " minute ":" minutes "); - if (seconds > 0 || sb.isEmpty()) sb.append(seconds).append((seconds == 1) ? " second ":" seconds "); - return sb.toString().trim(); - } - - public static String commaify(int i) { - return INTEGER_FORMAT.format(i); - } - - public static Material getMaterialFromBlock(Block block) { - return Material.fromKey(block.key()); - } - - public static String profileAge(long tbf) { - return formatTimeWentBy(System.currentTimeMillis() - tbf); - } - - - public static String getAsRomanNumeral(int num) { - if (num == 0) return ""; - int[] values = {1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1}; - String[] symbols = {"M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I"}; - StringBuilder roman = new StringBuilder(); - for (int i = 0; i < values.length; i++) { - while (num >= values[i]) { - num -= values[i]; - roman.append(symbols[i]); - } - } - return roman.toString(); - } - - public static String getTextFromComponent(Component component) { - if (!(component instanceof TextComponent)) - throw new IllegalArgumentException("Component must be a TextComponent"); - return PlainTextComponentSerializer.plainText().serialize(component); - } - - public static String getAuctionSetupFormattedTime(long millis) { - return formatTimeLeft(millis).replaceAll(" ", "") - .replaceAll("s$", ""); - } - - public static String formatAsDate(long millis) { - // Month as display, Day, Year - SimpleDateFormat sdf = new SimpleDateFormat("MMMM dd, yyyy"); - return sdf.format(millis); - } - - public static String toNormalCase(String string) { - if (Acronym.isAcronym(string)) return string.toUpperCase(); - string = string.replaceAll("_", " "); - String[] spl = string.split(" "); - StringBuilder sb = new StringBuilder(); - - for (String value : spl) { - String s = value; - if (s.isEmpty()) { - continue; - } - if (s.length() == 1) { - s = s.toUpperCase(); - } else { - s = s.substring(0, 1).toUpperCase() + s.substring(1).toLowerCase(); - } - // Append the processed string to the StringBuilder - // Only add a space if it's not the first word - if (!sb.isEmpty()) { - sb.append(" "); - } - sb.append(s); - } - return sb.toString(); - } - - public static String commaify(double d) { - return d < 1 ? "0" : INTEGER_FORMAT.format(d); - } - - public static String decimalify(double d, int decimalPlaces) { - if (decimalPlaces < 1) - throw new IllegalArgumentException(); - String builder = "#." + "#".repeat(decimalPlaces); - DecimalFormat df = new DecimalFormat(builder); - df.setRoundingMode(RoundingMode.CEILING); - return df.format(d); - } - - public static List splitByWordAndLength(String string, int splitLength) { - List result = new ArrayList<>(); - String[] words = string.split(" "); - StringBuilder currentString = new StringBuilder(); - - for (String word : words) { - // Check if adding the next word exceeds the split length (considering the space) - if (currentString.length() + word.length() + (!currentString.isEmpty() ? 1 : 0) > splitLength) { - // Add the currentString to the result and reset it - result.add(currentString.toString()); - currentString = new StringBuilder(); - } - // Add a space before the word if it's not the first word in the currentString - if (!currentString.isEmpty()) { - currentString.append(" "); - } - currentString.append(word); - } - - // Add any remaining text to the result - if (!currentString.isEmpty()) { - result.add(currentString.toString()); - } - - return result; - } - - public static double random(double min, double max) { - return Math.random() * (max - min) + min; - } - - public static String zeroed(long l) { - return String.format("%02d", l); - } - - public static String commaify(long l) { - return INTEGER_FORMAT.format(l); - } - - public static String limitStringLength(String s, int charLimit) { - return s.length() <= charLimit ? s : s.substring(0, charLimit); - } - - public static String ntify(int i) { - return switch (i % 100) { - case 11, 12, 13 -> i + "th"; - default -> switch (i % 10) { - case 1 -> i + "st"; - case 2 -> i + "nd"; - case 3 -> i + "rd"; - default -> i + "th"; - }; - }; - } - - public static String getFormatedStatistic(ItemStatistic statistic) { - return statistic.getDisplayColor() + statistic.getSymbol() + " " + statistic.getDisplayName(); - } - - public static List centerLines(List lines) { - int maxLength = lines.stream() - .map(StringUtility::stripColor) - .mapToInt(String::length) - .max() - .orElse(0); - - List centered = new ArrayList<>(); - for (String line : lines) { - String stripped = stripColor(line); - int padding = Math.max(0, (maxLength - stripped.length()) / 2); - centered.add(" ".repeat(padding) + line); - } - - return centered; - } + public static final char[] ALPHABET = { + 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'W', 'X', 'Y', 'Z' + }; + private static final DecimalFormat INTEGER_FORMAT = new DecimalFormat("#,###"); + private static final Pattern COLOR_PATTERN = Pattern.compile("§[0-9a-fk-or]"); + + public static String formatTimeAsAgo(long millis) { + long timeDifference = System.currentTimeMillis() - millis; + // Simplified the calculation logic by abstracting repetitive calculations + long[] timeUnits = {TimeUnit.DAYS.toMillis(1), TimeUnit.HOURS.toMillis(1), TimeUnit.MINUTES.toMillis(1)}; + String[] timeLabels = {"d ago", "h ago", "m ago"}; + for (int i = 0; i < timeUnits.length; i++) { + if (timeDifference >= timeUnits[i]) { + return (timeDifference / timeUnits[i]) + timeLabels[i]; + } + } + return "Just now"; + } + + public static String commaifyAndTh(double d) { + // "th" suffix for numbers ending in 11, 12, 13 + return switch ((int) d % 100) { + case 11, 12, 13 -> INTEGER_FORMAT.format(d) + "th"; + default -> switch ((int) d % 10) { + case 1 -> INTEGER_FORMAT.format(d) + "st"; + case 2 -> INTEGER_FORMAT.format(d) + "nd"; + case 3 -> INTEGER_FORMAT.format(d) + "rd"; + default -> INTEGER_FORMAT.format(d) + "th"; + }; + }; + } + + public static String formatTimeWentBy(long millis) { + long timeDifference = System.currentTimeMillis() - millis; + // Simplified the calculation logic by abstracting repetitive calculations + long[] timeUnits = {TimeUnit.DAYS.toMillis(1), TimeUnit.HOURS.toMillis(1), TimeUnit.MINUTES.toMillis(1)}; + String[] timeLabels = {"d", "h", "m"}; + for (int i = 0; i < timeUnits.length; i++) { + if (timeDifference >= timeUnits[i]) { + return (timeDifference / timeUnits[i]) + timeLabels[i]; + } + } + return "Just now"; + } + + public static String createLineProgressBar(int length, ChatColor progressColor, double current, double max) { + double percent = Math.min(current, max) / max; + long completed = Math.round((double) length * percent); + StringBuilder builder = new StringBuilder().append(progressColor); + for (int i = 0; i < completed; i++) + builder.append("-"); + builder.append(ChatColor.WHITE); + for (int i = 0; i < length - completed; i++) + builder.append("-"); + builder.append(" ").append(ChatColor.YELLOW).append(commaify(current)).append(ChatColor.GOLD).append("/") + .append(ChatColor.YELLOW).append(commaify(max)); + return builder.toString(); + } + + public static String createProgressText(String text, double current, double max) { + double percent; + if (max != 0) + percent = (current / max) * 100.0; + else + percent = 0.0; + percent = roundTo(percent, 1); + return ChatColor.GRAY + text + ": " + (percent < 100.0 ? ChatColor.YELLOW + commaify(percent) + + ChatColor.GOLD + "%" : ChatColor.GREEN + "100.0%"); + } + + public static double roundTo(double d, int decimalPlaces) { + return Math.round(d * Math.pow(10, decimalPlaces)) / Math.pow(10, decimalPlaces); + } + + public static String stripColor(String s) { + // Find any '§' character followed by a color code + Matcher matcher = COLOR_PATTERN.matcher(s); + return matcher.replaceAll(""); + } + + public static String shortenNumber(double number) { + if (number < 1000) return String.valueOf((int) number); + String[] units = new String[]{"K", "M", "B"}; + for (int i = units.length - 1; i >= 0; i--) { + double unitValue = Math.pow(1000, i + 1); + if (number >= unitValue) { + return String.format("%.1f%s", number / unitValue, units[i]); + } + } + return String.valueOf(number); // Fallback, should not be reached + } + + public static String formatTimeLeft(long millis) { + StringBuilder sb = new StringBuilder(); + long days = TimeUnit.MILLISECONDS.toDays(millis); + long hours = TimeUnit.MILLISECONDS.toHours(millis % TimeUnit.DAYS.toMillis(1)); + long minutes = TimeUnit.MILLISECONDS.toMinutes(millis % TimeUnit.HOURS.toMillis(1)); + long seconds = TimeUnit.MILLISECONDS.toSeconds(millis % TimeUnit.MINUTES.toMillis(1)); + + // Eliminated redundant checks by concatenating non-zero values directly + if (days > 0) sb.append(days).append("d "); + if (hours > 0) sb.append(hours).append("h "); + if (minutes > 0) sb.append(minutes).append("m "); + if (seconds > 0 || sb.isEmpty()) sb.append(seconds).append("s"); + return sb.toString().trim(); + } + + public static String formatTimeLeftWrittenOut(long millis) { + StringBuilder sb = new StringBuilder(); + long days = TimeUnit.MILLISECONDS.toDays(millis); + long hours = TimeUnit.MILLISECONDS.toHours(millis % TimeUnit.DAYS.toMillis(1)); + long minutes = TimeUnit.MILLISECONDS.toMinutes(millis % TimeUnit.HOURS.toMillis(1)); + long seconds = TimeUnit.MILLISECONDS.toSeconds(millis % TimeUnit.MINUTES.toMillis(1)); + + // Eliminated redundant checks by concatenating non-zero values directly + if (days > 0) sb.append(days).append((days == 1) ? " day " : " days "); + if (hours > 0) sb.append(hours).append((hours == 1) ? " hour " : " hours "); + if (minutes > 0) sb.append(minutes).append((minutes == 1) ? " minute " : " minutes "); + if (seconds > 0 || sb.isEmpty()) sb.append(seconds).append((seconds == 1) ? " second " : " seconds "); + return sb.toString().trim(); + } + + public static String commaify(int i) { + return INTEGER_FORMAT.format(i); + } + + public static Material getMaterialFromBlock(Block block) { + return Material.fromKey(block.key()); + } + + public static String profileAge(long tbf) { + return formatTimeWentBy(System.currentTimeMillis() - tbf); + } + + public static String getAsRomanNumeral(int num) { + if (num == 0) return ""; + int[] values = {1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1}; + String[] symbols = {"M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I"}; + StringBuilder roman = new StringBuilder(); + for (int i = 0; i < values.length; i++) { + while (num >= values[i]) { + num -= values[i]; + roman.append(symbols[i]); + } + } + return roman.toString(); + } + + public static String getTextFromComponent(Component component) { + if (!(component instanceof TextComponent)) + throw new IllegalArgumentException("Component must be a TextComponent"); + return PlainTextComponentSerializer.plainText().serialize(component); + } + + public static String getAuctionSetupFormattedTime(long millis) { + return formatTimeLeft(millis).replaceAll(" ", "") + .replaceAll("s$", ""); + } + + public static String formatAsDate(long millis) { + // Month as display, Day, Year + SimpleDateFormat sdf = new SimpleDateFormat("MMMM dd, yyyy"); + return sdf.format(millis); + } + + public static String toNormalCase(String string) { + if (Acronym.isAcronym(string)) return string.toUpperCase(); + string = string.replaceAll("_", " "); + String[] spl = string.split(" "); + StringBuilder sb = new StringBuilder(); + + for (String value : spl) { + String s = value; + if (s.isEmpty()) { + continue; + } + if (s.length() == 1) { + s = s.toUpperCase(); + } else { + s = s.substring(0, 1).toUpperCase() + s.substring(1).toLowerCase(); + } + // Append the processed string to the StringBuilder + // Only add a space if it's not the first word + if (!sb.isEmpty()) { + sb.append(" "); + } + sb.append(s); + } + return sb.toString(); + } + + public static String commaify(double d) { + return d < 1 ? "0" : INTEGER_FORMAT.format(d); + } + + public static String decimalify(double d, int decimalPlaces) { + if (decimalPlaces < 1) + throw new IllegalArgumentException(); + String builder = "#." + "#".repeat(decimalPlaces); + DecimalFormat df = new DecimalFormat(builder); + df.setRoundingMode(RoundingMode.CEILING); + return df.format(d); + } + + public static List splitByWordAndLength(String string, int splitLength) { + List result = new ArrayList<>(); + String[] lines = string.split("\n", -1); + for (String line : lines) { + if (line.isEmpty()) { + result.add(""); + continue; + } + + String[] words = line.split(" "); + StringBuilder currentString = new StringBuilder(); + + for (String word : words) { + if (word.isEmpty()) { + continue; // skip extra spaces + } + // Check if adding the next word exceeds the split length (considering the space) + int extraSpace = currentString.isEmpty() ? 0 : 1; + if (currentString.length() + extraSpace + word.length() > splitLength) { + // Add the currentString to the result and reset it + if (!currentString.isEmpty()) { + result.add(currentString.toString()); + currentString = new StringBuilder(); + } + } + // Add a space before the word if it's not the first word in the currentString + if (!currentString.isEmpty()) { + currentString.append(" "); + } + currentString.append(word); + } + + // Add any remaining text to the result + result.add(currentString.toString()); + } + + return result; + } + + public static double random(double min, double max) { + return Math.random() * (max - min) + min; + } + + public static String zeroed(long l) { + return String.format("%02d", l); + } + + public static String commaify(long l) { + return INTEGER_FORMAT.format(l); + } + + public static String limitStringLength(String s, int charLimit) { + return s.length() <= charLimit ? s : s.substring(0, charLimit); + } + + public static String ntify(int i) { + return switch (i % 100) { + case 11, 12, 13 -> i + "th"; + default -> switch (i % 10) { + case 1 -> i + "st"; + case 2 -> i + "nd"; + case 3 -> i + "rd"; + default -> i + "th"; + }; + }; + } + + public static String getFormatedStatistic(ItemStatistic statistic) { + return statistic.getDisplayColor() + statistic.getSymbol() + " " + statistic.getDisplayName(); + } + } diff --git a/commons/src/main/java/net/swofty/commons/auctions/DarkAuctionPhase.java b/commons/src/main/java/net/swofty/commons/auctions/DarkAuctionPhase.java new file mode 100644 index 000000000..23869225e --- /dev/null +++ b/commons/src/main/java/net/swofty/commons/auctions/DarkAuctionPhase.java @@ -0,0 +1,8 @@ +package net.swofty.commons.auctions; + +public enum DarkAuctionPhase { + QUEUE, // 35 seconds to enter + BIDDING, // Active bidding + BETWEEN, // Between rounds + COMPLETE // Done +} diff --git a/commons/src/main/java/net/swofty/commons/item/ItemType.java b/commons/src/main/java/net/swofty/commons/item/ItemType.java index fb1200701..ba8182abc 100644 --- a/commons/src/main/java/net/swofty/commons/item/ItemType.java +++ b/commons/src/main/java/net/swofty/commons/item/ItemType.java @@ -6,366 +6,377 @@ import org.jetbrains.annotations.Nullable; public enum ItemType { - SANDBOX_ITEM(Material.BLAZE_POWDER, Rarity.COMMON), - - /** - * Miscellaneous - */ - ENCHANTED_BOOK(Material.ENCHANTED_BOOK, Rarity.UNCOMMON), - SKYBLOCK_MENU(Material.NETHER_STAR, Rarity.COMMON), - MOVE_JERRY(Material.VILLAGER_SPAWN_EGG, Rarity.COMMON), - HOT_POTATO_BOOK(Material.BOOK, Rarity.EPIC), - GAME_BREAKER(Material.TNT, Rarity.SPECIAL), - GAME_ANNIHILATOR(Material.PLAYER_HEAD, Rarity.SPECIAL), - QUALITY_MAP(Material.MAP, Rarity.SPECIAL), - DEAD_BUSH_OF_LOVE(Material.DEAD_BUSH, Rarity.SPECIAL), - - ENDSTONE_ROSE(Material.POPPY, Rarity.RARE), - BIOFUEL(Material.GREEN_DYE, Rarity.RARE), - - /** - * Accessories - */ - ZOMBIE_TALISMAN(Material.ZOMBIE_HEAD, Rarity.COMMON), - ZOMBIE_RING(Material.PLAYER_HEAD, Rarity.UNCOMMON), - ZOMBIE_ARTIFACT(Material.PLAYER_HEAD, Rarity.RARE), - SPEED_TALISMAN(Material.PLAYER_HEAD, Rarity.COMMON), - SPEED_RING(Material.PLAYER_HEAD, Rarity.UNCOMMON), - SPEED_ARTIFACT(Material.PLAYER_HEAD, Rarity.RARE), - SKELETON_TALISMAN(Material.SKELETON_SKULL, Rarity.COMMON), - HASTE_RING(Material.PLAYER_HEAD, Rarity.RARE), - FARMING_TALISMAN(Material.PLAYER_HEAD, Rarity.COMMON), - LAVA_TALISMAN(Material.PLAYER_HEAD, Rarity.UNCOMMON), - POTATO_TALISMAN(Material.PLAYER_HEAD, Rarity.COMMON), - TALISMAN_OF_POWER(Material.PLAYER_HEAD, Rarity.COMMON), - BAT_TALISMAN(Material.PLAYER_HEAD, Rarity.RARE), - FIRE_TALISMAN(Material.PLAYER_HEAD, Rarity.COMMON), - AUTO_RECOMBOBULATOR(Material.PLAYER_HEAD, Rarity.LEGENDARY), - CATACOMBS_EXPERT_RING(Material.PLAYER_HEAD, Rarity.EPIC), - WITHER_RELIC(Material.PLAYER_HEAD, Rarity.LEGENDARY), - SCARFS_GRIMOIRE(Material.PLAYER_HEAD, Rarity.LEGENDARY), - SCARFS_THESIS(Material.PLAYER_HEAD, Rarity.EPIC), - SCARFS_STUDIES(Material.PLAYER_HEAD, Rarity.RARE), - TREASURE_ARTIFACT(Material.PLAYER_HEAD, Rarity.LEGENDARY), - TREASURE_RING(Material.PLAYER_HEAD, Rarity.EPIC), - TREASURE_TALISMAN(Material.PLAYER_HEAD, Rarity.RARE), - SPIDER_TALISMAN(Material.PLAYER_HEAD, Rarity.UNCOMMON), - SPIDER_RING(Material.PLAYER_HEAD, Rarity.RARE), - SPIDER_ARTIFACT(Material.PLAYER_HEAD, Rarity.EPIC), - MINE_AFFINITY_TALISMAN(Material.PLAYER_HEAD, Rarity.COMMON), - VILLAGE_AFFINITY_TALISMAN(Material.PLAYER_HEAD, Rarity.COMMON), - BITS_TALISMAN(Material.PLAYER_HEAD, Rarity.RARE), - ACTUALLY_BLUE_ABICASE(Material.PLAYER_HEAD, Rarity.RARE), - BLUE_BUT_GREEN_ABICASE(Material.PLAYER_HEAD, Rarity.RARE), - BLUE_BUT_RED_ABICASE(Material.PLAYER_HEAD, Rarity.RARE), - BLUE_BUT_YELLOW_ABICASE(Material.PLAYER_HEAD, Rarity.RARE), - LIGHTER_BLUE_ABICASE(Material.PLAYER_HEAD, Rarity.RARE), - REZAR_ABICASE(Material.PLAYER_HEAD, Rarity.RARE), - SUMSUNG_G3_ABICASE(Material.PLAYER_HEAD, Rarity.RARE), - SUMSUNG_GG_ABICASE(Material.PLAYER_HEAD, Rarity.RARE), - - /** - * Community Shop Items - */ - BOOSTER_COOKIE(Material.COOKIE, Rarity.LEGENDARY), - GOD_POTION(Material.PLAYER_HEAD, Rarity.SPECIAL), - KAT_FLOWER(Material.POPPY, Rarity.SPECIAL), - KAT_BOUQUET(Material.ROSE_BUSH, Rarity.SPECIAL), - HYPER_CATALYST_UPGRADER(Material.PLAYER_HEAD, Rarity.SPECIAL), - ULTIMATE_CARROT_CANDY_UPGRADE(Material.PLAYER_HEAD, Rarity.SPECIAL), - COLOSSAL_EXPERIENCE_BOTTLE_UPGRADE(Material.PLAYER_HEAD, Rarity.SPECIAL), - MINION_STORAGE_EXPANDER(Material.PLAYER_HEAD, Rarity.SPECIAL), - MATRIARCHS_PERFUME(Material.RABBIT_STEW, Rarity.SPECIAL), - HOLOGRAM(Material.PLAYER_HEAD, Rarity.LEGENDARY), - DITTO_BLOB(Material.PLAYER_HEAD, Rarity.LEGENDARY), - BUILDERS_WAND(Material.BLAZE_ROD, Rarity.LEGENDARY), - BLOCK_ZAPPER(Material.FLINT, Rarity.EPIC), - PORTALIZER(Material.PLAYER_HEAD, Rarity.SPECIAL), - AUTOPET_RULES_2_PACK(Material.PLAYER_HEAD, Rarity.SPECIAL), - POCKET_SACK_IN_A_SACK(Material.PLAYER_HEAD, Rarity.SPECIAL), - DUNGEON_SACK(Material.PLAYER_HEAD, Rarity.LEGENDARY), - RUNE_SACK(Material.PLAYER_HEAD, Rarity.EPIC), - FLOWER_SACK(Material.PLAYER_HEAD, Rarity.EPIC), - DWARVEN_SACK(Material.PLAYER_HEAD, Rarity.EPIC), - CRYSTAL_HOLLOWS_SACK(Material.PLAYER_HEAD, Rarity.EPIC), - ABIPHONE_CONTACTS_TRIO(Material.COMPARATOR, Rarity.SPECIAL), - PURE_WHITE_DYE(Material.BONE_MEAL, Rarity.EPIC), - PURE_BLACK_DYE(Material.INK_SAC, Rarity.EPIC), - ACCESSORY_ENRICHMENT_SWAPPER(Material.COMPARATOR, Rarity.SPECIAL), - ATTACK_SPEED_ENRICHMENT(Material.PLAYER_HEAD, Rarity.SPECIAL), - CRITICAL_CHANCE_ENRICHMENT(Material.PLAYER_HEAD, Rarity.SPECIAL), - CRITICAL_DAMAGE_ENRICHMENT(Material.PLAYER_HEAD, Rarity.SPECIAL), - DEFENSE_ENRICHMENT(Material.PLAYER_HEAD, Rarity.SPECIAL), - FEROCITY_ENRICHMENT(Material.PLAYER_HEAD, Rarity.SPECIAL), - HEALTH_ENRICHMENT(Material.PLAYER_HEAD, Rarity.SPECIAL), - INTELLIGENCE_ENRICHMENT(Material.PLAYER_HEAD, Rarity.SPECIAL), - MAGIC_FIND_ENRICHMENT(Material.PLAYER_HEAD, Rarity.SPECIAL), - SEA_CREATURE_CHANCE_ENRICHMENT(Material.PLAYER_HEAD, Rarity.SPECIAL), - SPEED_ENRICHMENT(Material.PLAYER_HEAD, Rarity.SPECIAL), - STRENGTH_ENRICHMENT(Material.PLAYER_HEAD, Rarity.SPECIAL), - CHAMPION(Material.ENCHANTED_BOOK, Rarity.COMMON), - COMPACT(Material.ENCHANTED_BOOK, Rarity.COMMON), - CULTIVATING(Material.ENCHANTED_BOOK, Rarity.COMMON), - EXPERTISE(Material.ENCHANTED_BOOK, Rarity.COMMON), - HECATOMB(Material.ENCHANTED_BOOK, Rarity.COMMON), - INFERNO_FUEL_BLOCK(Material.PLAYER_HEAD, Rarity.RARE), - - /** - * Sacks - */ - SMALL_MINING_SACK(Material.PLAYER_HEAD, Rarity.UNCOMMON), - MEDIUM_MINING_SACK(Material.PLAYER_HEAD, Rarity.RARE), - LARGE_MINING_SACK(Material.PLAYER_HEAD, Rarity.EPIC), - - /** - * Runes - */ - BLOOD_RUNE(Material.PLAYER_HEAD, Rarity.COMMON), - - /** - * Minions - */ - COBBLESTONE_MINION(Material.PLAYER_HEAD, Rarity.RARE), - COAL_MINION(Material.PLAYER_HEAD, Rarity.RARE), - SNOW_MINION(Material.PLAYER_HEAD, Rarity.RARE), - DIAMOND_MINION(Material.PLAYER_HEAD, Rarity.RARE), - EMERALD_MINION(Material.PLAYER_HEAD, Rarity.RARE), - IRON_MINION(Material.PLAYER_HEAD, Rarity.RARE), - GOLD_MINION(Material.PLAYER_HEAD, Rarity.RARE), - LAPIS_MINION(Material.PLAYER_HEAD, Rarity.RARE), - REDSTONE_MINION(Material.PLAYER_HEAD, Rarity.RARE), - ENDSTONE_MINION(Material.PLAYER_HEAD, Rarity.RARE), - ICE_MINION(Material.PLAYER_HEAD, Rarity.RARE), - QUARTZ_MINION(Material.PLAYER_HEAD, Rarity.RARE), - OBSIDIAN_MINION(Material.PLAYER_HEAD, Rarity.RARE), - SAND_MINION(Material.PLAYER_HEAD, Rarity.RARE), - GRAVEL_MINION(Material.PLAYER_HEAD, Rarity.RARE), - GLOWSTONE_MINION(Material.PLAYER_HEAD, Rarity.RARE), - HARD_STONE_MINION(Material.PLAYER_HEAD, Rarity.RARE), - MITHRIL_MINION(Material.PLAYER_HEAD, Rarity.RARE), - - ACACIA_MINION(Material.PLAYER_HEAD, Rarity.RARE), - BIRCH_MINION(Material.PLAYER_HEAD, Rarity.RARE), - SPRUCE_MINION(Material.PLAYER_HEAD, Rarity.RARE), - DARK_OAK_MINION(Material.PLAYER_HEAD, Rarity.RARE), - JUNGLE_MINION(Material.PLAYER_HEAD, Rarity.RARE), - OAK_MINION(Material.PLAYER_HEAD, Rarity.RARE), - FLOWER_MINION(Material.PLAYER_HEAD, Rarity.RARE), - - FISHING_MINION(Material.PLAYER_HEAD, Rarity.RARE), - CLAY_MINION(Material.PLAYER_HEAD, Rarity.RARE), - - WHEAT_MINION(Material.PLAYER_HEAD, Rarity.RARE), - POTATO_MINION(Material.PLAYER_HEAD, Rarity.RARE), - CACTUS_MINION(Material.PLAYER_HEAD, Rarity.RARE), - CARROT_MINION(Material.PLAYER_HEAD, Rarity.RARE), - COCOA_BEANS_MINION(Material.PLAYER_HEAD, Rarity.RARE), - MELON_MINION(Material.PLAYER_HEAD, Rarity.RARE), - MUSHROOM_MINION(Material.PLAYER_HEAD, Rarity.RARE), - NETHER_WART_MINION(Material.PLAYER_HEAD, Rarity.RARE), - PUMPKIN_MINION(Material.PLAYER_HEAD, Rarity.RARE), - SUGAR_CANE_MINION(Material.PLAYER_HEAD, Rarity.RARE), - CHICKEN_MINION(Material.PLAYER_HEAD, Rarity.RARE), - COW_MINION(Material.PLAYER_HEAD, Rarity.RARE), - PIG_MINION(Material.PLAYER_HEAD, Rarity.RARE), - RABBIT_MINION(Material.PLAYER_HEAD, Rarity.RARE), - SHEEP_MINION(Material.PLAYER_HEAD, Rarity.RARE), - - BLAZE_MINION(Material.PLAYER_HEAD, Rarity.RARE), - CAVE_SPIDER_MINION(Material.PLAYER_HEAD, Rarity.RARE), - CREEPER_MINION(Material.PLAYER_HEAD, Rarity.RARE), - ENDERMAN_MINION(Material.PLAYER_HEAD, Rarity.RARE), - GHAST_MINION(Material.PLAYER_HEAD, Rarity.RARE), - MAGMA_CUBE_MINION(Material.PLAYER_HEAD, Rarity.RARE), - SKELETON_MINION(Material.PLAYER_HEAD, Rarity.RARE), - SLIME_MINION(Material.PLAYER_HEAD, Rarity.RARE), - SPIDER_MINION(Material.PLAYER_HEAD, Rarity.RARE), - ZOMBIE_MINION(Material.PLAYER_HEAD, Rarity.RARE), - - - /** - * Minion Upgrades - */ - AUTO_SMELTER(Material.FURNACE, Rarity.COMMON), - COMPACTOR(Material.DISPENSER, Rarity.UNCOMMON), - SUPER_COMPACTOR_3000(Material.DISPENSER, Rarity.RARE), - BUDGET_HOPPER(Material.HOPPER, Rarity.UNCOMMON), - ENCHANTED_HOPPER(Material.HOPPER, Rarity.RARE), - FLY_CATCHER(Material.COBWEB, Rarity.EPIC), - DIAMOND_SPREADING(Material.DIAMOND, Rarity.RARE), - MINION_EXPANDER(Material.COMMAND_BLOCK, Rarity.RARE), - MITHRIL_INFUSION(Material.PLAYER_HEAD, Rarity.UNCOMMON), - - /** - * Minion Fuels - */ - ENCHANTED_LAVA_BUCKET(Material.LAVA_BUCKET, Rarity.RARE), - MAGMA_BUCKET(Material.LAVA_BUCKET, Rarity.LEGENDARY), - PLASMA_BUCKET(Material.LAVA_BUCKET, Rarity.LEGENDARY), - EVERBURNING_FLAME(Material.PLAYER_HEAD, Rarity.EPIC), - HEAT_CORE(Material.PLAYER_HEAD, Rarity.SPECIAL), - - /** - * Minion Skins - */ - BEE_MINION_SKIN(Material.PLAYER_HEAD, Rarity.COMMON), - - /** - * Pets - */ - BEE_PET(Material.PLAYER_HEAD, Rarity.COMMON), - - /** - * Pet Items - */ - ALL_SKILLS_EXP_BOOST(Material.DIAMOND, Rarity.COMMON), - MINING_EXP_BOOST_COMMON(Material.IRON_PICKAXE, Rarity.COMMON), - MINING_EXP_BOOST_RARE(Material.IRON_PICKAXE, Rarity.RARE), - FARMING_EXP_BOOST_COMMON(Material.IRON_HOE, Rarity.COMMON), - FARMING_EXP_BOOST_RARE(Material.IRON_HOE, Rarity.RARE), - FISHING_EXP_BOOST(Material.COD, Rarity.COMMON), - FORAGING_EXP_BOOST(Material.IRON_AXE, Rarity.COMMON), - COMBAT_EXP_BOOST(Material.IRON_SWORD, Rarity.COMMON), - BIG_TEETH(Material.GHAST_TEAR, Rarity.COMMON), - IRON_CLAWS(Material.IRON_INGOT, Rarity.COMMON), - HARDENED_SCALES(Material.PRISMARINE_CRYSTALS, Rarity.UNCOMMON), - SHARPENED_CLAWS(Material.PRISMARINE_SHARD, Rarity.UNCOMMON), - BUBBLEGUM(Material.PLAYER_HEAD, Rarity.RARE), - - /** - * Backpacks - */ - SMALL_BACKPACK(Material.PLAYER_HEAD, Rarity.UNCOMMON), - MEDIUM_BACKPACK(Material.PLAYER_HEAD, Rarity.RARE), - LARGE_BACKPACK(Material.PLAYER_HEAD, Rarity.EPIC), - GREATER_BACKPACK(Material.PLAYER_HEAD, Rarity.EPIC), - JUMBO_BACKPACK(Material.PLAYER_HEAD, Rarity.LEGENDARY), - JUMBO_BACKPACK_UPGRADE(Material.PLAYER_HEAD, Rarity.SPECIAL), - - /** - * Decoration items - */ - DECORATION_ANCIENT_FRUIT(Material.PLAYER_HEAD, Rarity.COMMON), - DECORATION_APPALLED_PUMPKIN(Material.PLAYER_HEAD, Rarity.COMMON), - DECORATION_APPLE(Material.PLAYER_HEAD, Rarity.COMMON), - DECORATION_BANANA_BUNCH(Material.PLAYER_HEAD, Rarity.COMMON), - DECORATION_BEETROOT(Material.PLAYER_HEAD, Rarity.COMMON), - DECORATION_BERRY(Material.PLAYER_HEAD, Rarity.COMMON), - DECORATION_BERRY_BUSH(Material.PLAYER_HEAD, Rarity.COMMON), - DECORATION_BLUE_CORN(Material.PLAYER_HEAD, Rarity.COMMON), - DECORATION_BROWN_MUSHROOM(Material.PLAYER_HEAD, Rarity.COMMON), - DECORATION_BUSH(Material.PLAYER_HEAD, Rarity.COMMON), - DECORATION_CACTUS(Material.PLAYER_HEAD, Rarity.COMMON), - DECORATION_CHESTO_BERRY(Material.PLAYER_HEAD, Rarity.COMMON), - DECORATION_CORN(Material.PLAYER_HEAD, Rarity.COMMON), - DECORATION_KIWI(Material.PLAYER_HEAD, Rarity.COMMON), - DECORATION_LEMON(Material.PLAYER_HEAD, Rarity.COMMON), - DECORATION_LETTUCE(Material.PLAYER_HEAD, Rarity.COMMON), - DECORATION_LILAC_FRUIT(Material.PLAYER_HEAD, Rarity.COMMON), - DECORATION_MELON(Material.PLAYER_HEAD, Rarity.COMMON), - DECORATION_ONION(Material.PLAYER_HEAD, Rarity.COMMON), - DECORATION_ORANGE(Material.PLAYER_HEAD, Rarity.COMMON), - DECORATION_PINK_BERRY(Material.PLAYER_HEAD, Rarity.COMMON), - - /** - * Power Stones - */ - LUXURIOUS_SPOOL(Material.PLAYER_HEAD, Rarity.UNCOMMON), - - - ASCENSION_ROPE(Material.PLAYER_HEAD, Rarity.UNCOMMON), - - /** - * Farming Props - */ - ROOKIE_HOE(Material.STONE_HOE, Rarity.COMMON), - WOODEN_HOE(Material.WOODEN_HOE, Rarity.COMMON), - STONE_HOE(Material.STONE_HOE, Rarity.COMMON), - GOLDEN_HOE(Material.GOLDEN_HOE, Rarity.COMMON), - IRON_HOE(Material.IRON_HOE, Rarity.COMMON), - DIAMOND_HOE(Material.DIAMOND_HOE, Rarity.UNCOMMON), - WHEAT(Material.WHEAT, Rarity.COMMON), - WHEAT_SEEDS(Material.WHEAT_SEEDS, Rarity.COMMON), - WHEAT_CRYSTAL(Material.PLAYER_HEAD, Rarity.SPECIAL), - FLOWER_CRYSTAL(Material.PLAYER_HEAD, Rarity.SPECIAL), - CARROT_CRYSTAL(Material.PLAYER_HEAD, Rarity.SPECIAL), - POTATO_CRYSTAL(Material.PLAYER_HEAD, Rarity.SPECIAL), - PUMPKIN_AND_MELON_CRYSTAL(Material.PLAYER_HEAD, Rarity.SPECIAL), - MUTANT_NETHER_WART(Material.PLAYER_HEAD, Rarity.RARE), - POLISHED_PUMPKIN(Material.PLAYER_HEAD, Rarity.RARE), - BOX_OF_SEEDS(Material.PLAYER_HEAD, Rarity.RARE), - ENCHANTED_BOOKSHELF(Material.BOOKSHELF, Rarity.UNCOMMON), - ENCHANTED_COOKED_FISH(Material.COOKED_COD, Rarity.RARE), - ENCHANTED_RAW_FISH(Material.COD, Rarity.RARE), - ENCHANTED_IRON_INGOT(Material.IRON_INGOT, Rarity.RARE), - TIGHTLY_TIED_HAY_BALE(Material.PLAYER_HEAD, Rarity.RARE), - COMPOST(Material.PLAYER_HEAD, Rarity.UNCOMMON), - COMPOST_BUNDLE(Material.PLAYER_HEAD, Rarity.RARE), - DUNG(Material.BROWN_WOOL, Rarity.UNCOMMON), - HONEY_JAR(Material.PLAYER_HEAD, Rarity.UNCOMMON), - PLANT_MATTER(Material.OAK_LEAVES, Rarity.UNCOMMON), - - /** - * Foraging Props - */ - WOODEN_AXE(Material.WOODEN_AXE, Rarity.COMMON), - STONE_AXE(Material.STONE_AXE, Rarity.COMMON), - GOLDEN_AXE(Material.GOLDEN_AXE, Rarity.COMMON), - IRON_AXE(Material.IRON_AXE, Rarity.COMMON), - DIAMOND_AXE(Material.DIAMOND_AXE, Rarity.UNCOMMON), - ROOKIE_AXE(Material.STONE_AXE, Rarity.COMMON), - PROMISING_AXE(Material.IRON_AXE, Rarity.UNCOMMON), - SWEET_AXE(Material.IRON_AXE, Rarity.UNCOMMON), - EFFICIENT_AXE(Material.IRON_AXE, Rarity.UNCOMMON), - - /** - * Fishing Props - */ - SHARK_FIN(Material.PRISMARINE_SHARD, Rarity.RARE), - NURSE_SHARK_TOOTH(Material.GHAST_TEAR, Rarity.UNCOMMON), - BLUE_SHARK_TOOTH(Material.GHAST_TEAR, Rarity.RARE), - TIGER_SHARK_TOOTH(Material.GHAST_TEAR, Rarity.EPIC), - GREAT_WHITE_SHARK_TOOTH(Material.GHAST_TEAR, Rarity.LEGENDARY), - MAGMAFISH(Material.PLAYER_HEAD, Rarity.RARE), - SILVER_MAGMAFISH(Material.PLAYER_HEAD, Rarity.EPIC), - GOLD_MAGMAFISH(Material.PLAYER_HEAD, Rarity.LEGENDARY), - DIAMOND_MAGMAFISH(Material.PLAYER_HEAD, Rarity.MYTHIC), - FISHING_ROD(Material.FISHING_ROD, Rarity.COMMON), - - /** - * Combat Props - */ - CHILI_PEPPER(Material.PLAYER_HEAD, Rarity.UNCOMMON), - STUFFED_CHILI_PEPPER(Material.PLAYER_HEAD, Rarity.RARE), - ABSOLUTE_ENDER_PEARL(Material.PLAYER_HEAD, Rarity.RARE), - WHIPPED_MAGMA_CREAM(Material.PLAYER_HEAD, Rarity.RARE), - ZOMBIE_HEART(Material.PLAYER_HEAD, Rarity.RARE), - SOUL_STRING(Material.STRING, Rarity.RARE), - - /** - * Zombie Slayer - */ - FOUL_FLESH(Material.CHARCOAL, Rarity.RARE), - REVENANT_FLESH(Material.ROTTEN_FLESH, Rarity.UNCOMMON), - UNDEAD_CATALYST(Material.PLAYER_HEAD, Rarity.RARE), - BEHEADED_HORROR(Material.PLAYER_HEAD, Rarity.EPIC), - REVENANT_CATALYST(Material.PLAYER_HEAD, Rarity.EPIC), - SCYTHE_BLADE(Material.DIAMOND, Rarity.LEGENDARY), - SHARD_OF_THE_SHREDDED(Material.PLAYER_HEAD, Rarity.LEGENDARY), - WARDEN_HEART(Material.PLAYER_HEAD, Rarity.LEGENDARY), - REVENANT_VISCERA(Material.COOKED_PORKCHOP, Rarity.RARE), - CRYSTALLIZED_HEART(Material.PLAYER_HEAD, Rarity.RARE), - REVIVED_HEART(Material.PLAYER_HEAD, Rarity.EPIC), - REAPER_MASK(Material.PLAYER_HEAD, Rarity.LEGENDARY), - WARDEN_HELMET(Material.PLAYER_HEAD, Rarity.LEGENDARY), - REVENANT_FALCHION(Material.DIAMOND_SWORD, Rarity.RARE), - REAPER_FALCHION(Material.DIAMOND_SWORD, Rarity.EPIC), - AXE_OF_THE_SHREDDED(Material.DIAMOND_AXE, Rarity.LEGENDARY), - REAPER_SCYTHE(Material.DIAMOND_HOE, Rarity.LEGENDARY), - - /* - * Spider Slayer - */ + SANDBOX_ITEM(Material.BLAZE_POWDER, Rarity.COMMON), + + /** + * Miscellaneous + */ + ENCHANTED_BOOK(Material.ENCHANTED_BOOK, Rarity.UNCOMMON), + SKYBLOCK_MENU(Material.NETHER_STAR, Rarity.COMMON), + MOVE_JERRY(Material.VILLAGER_SPAWN_EGG, Rarity.COMMON), + HOT_POTATO_BOOK(Material.BOOK, Rarity.EPIC), + GAME_BREAKER(Material.TNT, Rarity.SPECIAL), + GAME_ANNIHILATOR(Material.PLAYER_HEAD, Rarity.SPECIAL), + QUALITY_MAP(Material.MAP, Rarity.SPECIAL), + DEAD_BUSH_OF_LOVE(Material.DEAD_BUSH, Rarity.SPECIAL), + + ENDSTONE_ROSE(Material.POPPY, Rarity.RARE), + BIOFUEL(Material.GREEN_DYE, Rarity.RARE), + + ABIPHONE_BASIC(Material.PLAYER_HEAD, Rarity.COMMON), + ABIPHONE_X_RED(Material.PLAYER_HEAD, Rarity.UNCOMMON), + ABIPHONE_X_BLUE(Material.PLAYER_HEAD, Rarity.UNCOMMON), + ABIPHONE_XI_YELLOW(Material.PLAYER_HEAD, Rarity.UNCOMMON), + ABIPHONE_XI_GREEN(Material.PLAYER_HEAD, Rarity.UNCOMMON), + ABIPHONE_XII_AMBER(Material.PLAYER_HEAD, Rarity.RARE), + ABIPHONE_XII_AMETHYST(Material.PLAYER_HEAD, Rarity.RARE), + + NEW_YEAR_CAKE(Material.CAKE, Rarity.SPECIAL), + NEW_YEAR_CAKE_BAG(Material.PLAYER_HEAD, Rarity.UNCOMMON), + + /** + * Accessories + */ + ZOMBIE_TALISMAN(Material.ZOMBIE_HEAD, Rarity.COMMON), + ZOMBIE_RING(Material.PLAYER_HEAD, Rarity.UNCOMMON), + ZOMBIE_ARTIFACT(Material.PLAYER_HEAD, Rarity.RARE), + SPEED_TALISMAN(Material.PLAYER_HEAD, Rarity.COMMON), + SPEED_RING(Material.PLAYER_HEAD, Rarity.UNCOMMON), + SPEED_ARTIFACT(Material.PLAYER_HEAD, Rarity.RARE), + SKELETON_TALISMAN(Material.SKELETON_SKULL, Rarity.COMMON), + HASTE_RING(Material.PLAYER_HEAD, Rarity.RARE), + FARMING_TALISMAN(Material.PLAYER_HEAD, Rarity.COMMON), + LAVA_TALISMAN(Material.PLAYER_HEAD, Rarity.UNCOMMON), + POTATO_TALISMAN(Material.PLAYER_HEAD, Rarity.COMMON), + TALISMAN_OF_POWER(Material.PLAYER_HEAD, Rarity.COMMON), + BAT_TALISMAN(Material.PLAYER_HEAD, Rarity.RARE), + FIRE_TALISMAN(Material.PLAYER_HEAD, Rarity.COMMON), + AUTO_RECOMBOBULATOR(Material.PLAYER_HEAD, Rarity.LEGENDARY), + CATACOMBS_EXPERT_RING(Material.PLAYER_HEAD, Rarity.EPIC), + WITHER_RELIC(Material.PLAYER_HEAD, Rarity.LEGENDARY), + SCARFS_GRIMOIRE(Material.PLAYER_HEAD, Rarity.LEGENDARY), + SCARFS_THESIS(Material.PLAYER_HEAD, Rarity.EPIC), + SCARFS_STUDIES(Material.PLAYER_HEAD, Rarity.RARE), + TREASURE_ARTIFACT(Material.PLAYER_HEAD, Rarity.LEGENDARY), + TREASURE_RING(Material.PLAYER_HEAD, Rarity.EPIC), + TREASURE_TALISMAN(Material.PLAYER_HEAD, Rarity.RARE), + SPIDER_TALISMAN(Material.PLAYER_HEAD, Rarity.UNCOMMON), + SPIDER_RING(Material.PLAYER_HEAD, Rarity.RARE), + SPIDER_ARTIFACT(Material.PLAYER_HEAD, Rarity.EPIC), + MINE_AFFINITY_TALISMAN(Material.PLAYER_HEAD, Rarity.COMMON), + VILLAGE_AFFINITY_TALISMAN(Material.PLAYER_HEAD, Rarity.COMMON), + BITS_TALISMAN(Material.PLAYER_HEAD, Rarity.RARE), + ACTUALLY_BLUE_ABICASE(Material.PLAYER_HEAD, Rarity.RARE), + BLUE_BUT_GREEN_ABICASE(Material.PLAYER_HEAD, Rarity.RARE), + BLUE_BUT_RED_ABICASE(Material.PLAYER_HEAD, Rarity.RARE), + BLUE_BUT_YELLOW_ABICASE(Material.PLAYER_HEAD, Rarity.RARE), + LIGHTER_BLUE_ABICASE(Material.PLAYER_HEAD, Rarity.RARE), + REZAR_ABICASE(Material.PLAYER_HEAD, Rarity.RARE), + SUMSUNG_G3_ABICASE(Material.PLAYER_HEAD, Rarity.RARE), + SUMSUNG_GG_ABICASE(Material.PLAYER_HEAD, Rarity.RARE), + + /** + * Community Shop Items + */ + BOOSTER_COOKIE(Material.COOKIE, Rarity.LEGENDARY), + GOD_POTION(Material.PLAYER_HEAD, Rarity.SPECIAL), + KAT_FLOWER(Material.POPPY, Rarity.SPECIAL), + KAT_BOUQUET(Material.ROSE_BUSH, Rarity.SPECIAL), + HYPER_CATALYST_UPGRADER(Material.PLAYER_HEAD, Rarity.SPECIAL), + ULTIMATE_CARROT_CANDY_UPGRADE(Material.PLAYER_HEAD, Rarity.SPECIAL), + COLOSSAL_EXPERIENCE_BOTTLE_UPGRADE(Material.PLAYER_HEAD, Rarity.SPECIAL), + MINION_STORAGE_EXPANDER(Material.PLAYER_HEAD, Rarity.SPECIAL), + MATRIARCHS_PERFUME(Material.RABBIT_STEW, Rarity.SPECIAL), + HOLOGRAM(Material.PLAYER_HEAD, Rarity.LEGENDARY), + DITTO_BLOB(Material.PLAYER_HEAD, Rarity.LEGENDARY), + BUILDERS_WAND(Material.BLAZE_ROD, Rarity.LEGENDARY), + BLOCK_ZAPPER(Material.FLINT, Rarity.EPIC), + PORTALIZER(Material.PLAYER_HEAD, Rarity.SPECIAL), + AUTOPET_RULES_2_PACK(Material.PLAYER_HEAD, Rarity.SPECIAL), + POCKET_SACK_IN_A_SACK(Material.PLAYER_HEAD, Rarity.SPECIAL), + DUNGEON_SACK(Material.PLAYER_HEAD, Rarity.LEGENDARY), + RUNE_SACK(Material.PLAYER_HEAD, Rarity.EPIC), + FLOWER_SACK(Material.PLAYER_HEAD, Rarity.EPIC), + DWARVEN_SACK(Material.PLAYER_HEAD, Rarity.EPIC), + CRYSTAL_HOLLOWS_SACK(Material.PLAYER_HEAD, Rarity.EPIC), + ABIPHONE_CONTACTS_TRIO(Material.COMPARATOR, Rarity.SPECIAL), + PURE_WHITE_DYE(Material.BONE_MEAL, Rarity.EPIC), + PURE_BLACK_DYE(Material.INK_SAC, Rarity.EPIC), + DARK_PURPLE_DYE(Material.PLAYER_HEAD, Rarity.LEGENDARY),ACCESSORY_ENRICHMENT_SWAPPER(Material.COMPARATOR, Rarity.SPECIAL), + ATTACK_SPEED_ENRICHMENT(Material.PLAYER_HEAD, Rarity.SPECIAL), + CRITICAL_CHANCE_ENRICHMENT(Material.PLAYER_HEAD, Rarity.SPECIAL), + CRITICAL_DAMAGE_ENRICHMENT(Material.PLAYER_HEAD, Rarity.SPECIAL), + DEFENSE_ENRICHMENT(Material.PLAYER_HEAD, Rarity.SPECIAL), + FEROCITY_ENRICHMENT(Material.PLAYER_HEAD, Rarity.SPECIAL), + HEALTH_ENRICHMENT(Material.PLAYER_HEAD, Rarity.SPECIAL), + INTELLIGENCE_ENRICHMENT(Material.PLAYER_HEAD, Rarity.SPECIAL), + MAGIC_FIND_ENRICHMENT(Material.PLAYER_HEAD, Rarity.SPECIAL), + SEA_CREATURE_CHANCE_ENRICHMENT(Material.PLAYER_HEAD, Rarity.SPECIAL), + SPEED_ENRICHMENT(Material.PLAYER_HEAD, Rarity.SPECIAL), + STRENGTH_ENRICHMENT(Material.PLAYER_HEAD, Rarity.SPECIAL), + CHAMPION(Material.ENCHANTED_BOOK, Rarity.COMMON), + COMPACT(Material.ENCHANTED_BOOK, Rarity.COMMON), + CULTIVATING(Material.ENCHANTED_BOOK, Rarity.COMMON), + EXPERTISE(Material.ENCHANTED_BOOK, Rarity.COMMON), + HECATOMB(Material.ENCHANTED_BOOK, Rarity.COMMON), + INFERNO_FUEL_BLOCK(Material.PLAYER_HEAD, Rarity.RARE), + + /** + * Sacks + */ + SMALL_MINING_SACK(Material.PLAYER_HEAD, Rarity.UNCOMMON), + MEDIUM_MINING_SACK(Material.PLAYER_HEAD, Rarity.RARE), + LARGE_MINING_SACK(Material.PLAYER_HEAD, Rarity.EPIC), + + /** + * Runes + */ + BLOOD_RUNE(Material.PLAYER_HEAD, Rarity.COMMON), + + /** + * Minions + */ + COBBLESTONE_MINION(Material.PLAYER_HEAD, Rarity.RARE), + COAL_MINION(Material.PLAYER_HEAD, Rarity.RARE), + SNOW_MINION(Material.PLAYER_HEAD, Rarity.RARE), + DIAMOND_MINION(Material.PLAYER_HEAD, Rarity.RARE), + EMERALD_MINION(Material.PLAYER_HEAD, Rarity.RARE), + IRON_MINION(Material.PLAYER_HEAD, Rarity.RARE), + GOLD_MINION(Material.PLAYER_HEAD, Rarity.RARE), + LAPIS_MINION(Material.PLAYER_HEAD, Rarity.RARE), + REDSTONE_MINION(Material.PLAYER_HEAD, Rarity.RARE), + ENDSTONE_MINION(Material.PLAYER_HEAD, Rarity.RARE), + ICE_MINION(Material.PLAYER_HEAD, Rarity.RARE), + QUARTZ_MINION(Material.PLAYER_HEAD, Rarity.RARE), + OBSIDIAN_MINION(Material.PLAYER_HEAD, Rarity.RARE), + SAND_MINION(Material.PLAYER_HEAD, Rarity.RARE), + GRAVEL_MINION(Material.PLAYER_HEAD, Rarity.RARE), + GLOWSTONE_MINION(Material.PLAYER_HEAD, Rarity.RARE), + HARD_STONE_MINION(Material.PLAYER_HEAD, Rarity.RARE), + MITHRIL_MINION(Material.PLAYER_HEAD, Rarity.RARE), + + ACACIA_MINION(Material.PLAYER_HEAD, Rarity.RARE), + BIRCH_MINION(Material.PLAYER_HEAD, Rarity.RARE), + SPRUCE_MINION(Material.PLAYER_HEAD, Rarity.RARE), + DARK_OAK_MINION(Material.PLAYER_HEAD, Rarity.RARE), + JUNGLE_MINION(Material.PLAYER_HEAD, Rarity.RARE), + OAK_MINION(Material.PLAYER_HEAD, Rarity.RARE), + FLOWER_MINION(Material.PLAYER_HEAD, Rarity.RARE), + + FISHING_MINION(Material.PLAYER_HEAD, Rarity.RARE), + CLAY_MINION(Material.PLAYER_HEAD, Rarity.RARE), + + WHEAT_MINION(Material.PLAYER_HEAD, Rarity.RARE), + POTATO_MINION(Material.PLAYER_HEAD, Rarity.RARE), + CACTUS_MINION(Material.PLAYER_HEAD, Rarity.RARE), + CARROT_MINION(Material.PLAYER_HEAD, Rarity.RARE), + COCOA_BEANS_MINION(Material.PLAYER_HEAD, Rarity.RARE), + MELON_MINION(Material.PLAYER_HEAD, Rarity.RARE), + MUSHROOM_MINION(Material.PLAYER_HEAD, Rarity.RARE), + NETHER_WART_MINION(Material.PLAYER_HEAD, Rarity.RARE), + PUMPKIN_MINION(Material.PLAYER_HEAD, Rarity.RARE), + SUGAR_CANE_MINION(Material.PLAYER_HEAD, Rarity.RARE), + CHICKEN_MINION(Material.PLAYER_HEAD, Rarity.RARE), + COW_MINION(Material.PLAYER_HEAD, Rarity.RARE), + PIG_MINION(Material.PLAYER_HEAD, Rarity.RARE), + RABBIT_MINION(Material.PLAYER_HEAD, Rarity.RARE), + SHEEP_MINION(Material.PLAYER_HEAD, Rarity.RARE), + + BLAZE_MINION(Material.PLAYER_HEAD, Rarity.RARE), + CAVE_SPIDER_MINION(Material.PLAYER_HEAD, Rarity.RARE), + CREEPER_MINION(Material.PLAYER_HEAD, Rarity.RARE), + ENDERMAN_MINION(Material.PLAYER_HEAD, Rarity.RARE), + GHAST_MINION(Material.PLAYER_HEAD, Rarity.RARE), + MAGMA_CUBE_MINION(Material.PLAYER_HEAD, Rarity.RARE), + SKELETON_MINION(Material.PLAYER_HEAD, Rarity.RARE), + SLIME_MINION(Material.PLAYER_HEAD, Rarity.RARE), + SPIDER_MINION(Material.PLAYER_HEAD, Rarity.RARE), + ZOMBIE_MINION(Material.PLAYER_HEAD, Rarity.RARE), + + + /** + * Minion Upgrades + */ + AUTO_SMELTER(Material.FURNACE, Rarity.COMMON), + COMPACTOR(Material.DISPENSER, Rarity.UNCOMMON), + SUPER_COMPACTOR_3000(Material.DISPENSER, Rarity.RARE), + BUDGET_HOPPER(Material.HOPPER, Rarity.UNCOMMON), + ENCHANTED_HOPPER(Material.HOPPER, Rarity.RARE), + FLY_CATCHER(Material.COBWEB, Rarity.EPIC), + DIAMOND_SPREADING(Material.DIAMOND, Rarity.RARE), + MINION_EXPANDER(Material.COMMAND_BLOCK, Rarity.RARE), + MITHRIL_INFUSION(Material.PLAYER_HEAD, Rarity.UNCOMMON), + + /** + * Minion Fuels + */ + ENCHANTED_LAVA_BUCKET(Material.LAVA_BUCKET, Rarity.RARE), + MAGMA_BUCKET(Material.LAVA_BUCKET, Rarity.LEGENDARY), + PLASMA_BUCKET(Material.LAVA_BUCKET, Rarity.LEGENDARY), + EVERBURNING_FLAME(Material.PLAYER_HEAD, Rarity.EPIC), + HEAT_CORE(Material.PLAYER_HEAD, Rarity.SPECIAL), + + /** + * Minion Skins + */ + BEE_MINION_SKIN(Material.PLAYER_HEAD, Rarity.COMMON), + + /** + * Pets + */ + BEE_PET(Material.PLAYER_HEAD, Rarity.COMMON), + + /** + * Pet Items + */ + ALL_SKILLS_EXP_BOOST(Material.DIAMOND, Rarity.COMMON), + MINING_EXP_BOOST_COMMON(Material.IRON_PICKAXE, Rarity.COMMON), + MINING_EXP_BOOST_RARE(Material.IRON_PICKAXE, Rarity.RARE), + FARMING_EXP_BOOST_COMMON(Material.IRON_HOE, Rarity.COMMON), + FARMING_EXP_BOOST_RARE(Material.IRON_HOE, Rarity.RARE), + FISHING_EXP_BOOST(Material.COD, Rarity.COMMON), + FORAGING_EXP_BOOST(Material.IRON_AXE, Rarity.COMMON), + COMBAT_EXP_BOOST(Material.IRON_SWORD, Rarity.COMMON), + BIG_TEETH(Material.GHAST_TEAR, Rarity.COMMON), + IRON_CLAWS(Material.IRON_INGOT, Rarity.COMMON), + HARDENED_SCALES(Material.PRISMARINE_CRYSTALS, Rarity.UNCOMMON), + SHARPENED_CLAWS(Material.PRISMARINE_SHARD, Rarity.UNCOMMON), + BUBBLEGUM(Material.PLAYER_HEAD, Rarity.RARE), + + /** + * Backpacks + */ + SMALL_BACKPACK(Material.PLAYER_HEAD, Rarity.UNCOMMON), + MEDIUM_BACKPACK(Material.PLAYER_HEAD, Rarity.RARE), + LARGE_BACKPACK(Material.PLAYER_HEAD, Rarity.EPIC), + GREATER_BACKPACK(Material.PLAYER_HEAD, Rarity.EPIC), + JUMBO_BACKPACK(Material.PLAYER_HEAD, Rarity.LEGENDARY), + JUMBO_BACKPACK_UPGRADE(Material.PLAYER_HEAD, Rarity.SPECIAL), + + /** + * Decoration items + */ + DECORATION_ANCIENT_FRUIT(Material.PLAYER_HEAD, Rarity.COMMON), + DECORATION_APPALLED_PUMPKIN(Material.PLAYER_HEAD, Rarity.COMMON), + DECORATION_APPLE(Material.PLAYER_HEAD, Rarity.COMMON), + DECORATION_BANANA_BUNCH(Material.PLAYER_HEAD, Rarity.COMMON), + DECORATION_BEETROOT(Material.PLAYER_HEAD, Rarity.COMMON), + DECORATION_BERRY(Material.PLAYER_HEAD, Rarity.COMMON), + DECORATION_BERRY_BUSH(Material.PLAYER_HEAD, Rarity.COMMON), + DECORATION_BLUE_CORN(Material.PLAYER_HEAD, Rarity.COMMON), + DECORATION_BROWN_MUSHROOM(Material.PLAYER_HEAD, Rarity.COMMON), + DECORATION_BUSH(Material.PLAYER_HEAD, Rarity.COMMON), + DECORATION_CACTUS(Material.PLAYER_HEAD, Rarity.COMMON), + DECORATION_CHESTO_BERRY(Material.PLAYER_HEAD, Rarity.COMMON), + DECORATION_CORN(Material.PLAYER_HEAD, Rarity.COMMON), + DECORATION_KIWI(Material.PLAYER_HEAD, Rarity.COMMON), + DECORATION_LEMON(Material.PLAYER_HEAD, Rarity.COMMON), + DECORATION_LETTUCE(Material.PLAYER_HEAD, Rarity.COMMON), + DECORATION_LILAC_FRUIT(Material.PLAYER_HEAD, Rarity.COMMON), + DECORATION_MELON(Material.PLAYER_HEAD, Rarity.COMMON), + DECORATION_ONION(Material.PLAYER_HEAD, Rarity.COMMON), + DECORATION_ORANGE(Material.PLAYER_HEAD, Rarity.COMMON), + DECORATION_PINK_BERRY(Material.PLAYER_HEAD, Rarity.COMMON), + + /** + * Power Stones + */ + LUXURIOUS_SPOOL(Material.PLAYER_HEAD, Rarity.UNCOMMON), + + + ASCENSION_ROPE(Material.PLAYER_HEAD, Rarity.UNCOMMON), + + /** + * Farming Props + */ + ROOKIE_HOE(Material.STONE_HOE, Rarity.COMMON), + WOODEN_HOE(Material.WOODEN_HOE, Rarity.COMMON), + STONE_HOE(Material.STONE_HOE, Rarity.COMMON), + GOLDEN_HOE(Material.GOLDEN_HOE, Rarity.COMMON), + IRON_HOE(Material.IRON_HOE, Rarity.COMMON), + DIAMOND_HOE(Material.DIAMOND_HOE, Rarity.UNCOMMON), + WHEAT(Material.WHEAT, Rarity.COMMON), + WHEAT_SEEDS(Material.WHEAT_SEEDS, Rarity.COMMON), + WHEAT_CRYSTAL(Material.PLAYER_HEAD, Rarity.SPECIAL), + FLOWER_CRYSTAL(Material.PLAYER_HEAD, Rarity.SPECIAL), + CARROT_CRYSTAL(Material.PLAYER_HEAD, Rarity.SPECIAL), + POTATO_CRYSTAL(Material.PLAYER_HEAD, Rarity.SPECIAL), + PUMPKIN_AND_MELON_CRYSTAL(Material.PLAYER_HEAD, Rarity.SPECIAL), + MUTANT_NETHER_WART(Material.PLAYER_HEAD, Rarity.RARE), + POLISHED_PUMPKIN(Material.PLAYER_HEAD, Rarity.RARE), + BOX_OF_SEEDS(Material.PLAYER_HEAD, Rarity.RARE), + ENCHANTED_BOOKSHELF(Material.BOOKSHELF, Rarity.UNCOMMON), + ENCHANTED_COOKED_FISH(Material.COOKED_COD, Rarity.RARE), + ENCHANTED_RAW_FISH(Material.COD, Rarity.RARE), + ENCHANTED_IRON_INGOT(Material.IRON_INGOT, Rarity.RARE), + TIGHTLY_TIED_HAY_BALE(Material.PLAYER_HEAD, Rarity.RARE), + COMPOST(Material.PLAYER_HEAD, Rarity.UNCOMMON), + COMPOST_BUNDLE(Material.PLAYER_HEAD, Rarity.RARE), + DUNG(Material.BROWN_WOOL, Rarity.UNCOMMON), + HONEY_JAR(Material.PLAYER_HEAD, Rarity.UNCOMMON), + PLANT_MATTER(Material.OAK_LEAVES, Rarity.UNCOMMON), + + /** + * Foraging Props + */ + WOODEN_AXE(Material.WOODEN_AXE, Rarity.COMMON), + STONE_AXE(Material.STONE_AXE, Rarity.COMMON), + GOLDEN_AXE(Material.GOLDEN_AXE, Rarity.COMMON), + IRON_AXE(Material.IRON_AXE, Rarity.COMMON), + DIAMOND_AXE(Material.DIAMOND_AXE, Rarity.UNCOMMON), + ROOKIE_AXE(Material.STONE_AXE, Rarity.COMMON), + PROMISING_AXE(Material.IRON_AXE, Rarity.UNCOMMON), + SWEET_AXE(Material.IRON_AXE, Rarity.UNCOMMON), + EFFICIENT_AXE(Material.IRON_AXE, Rarity.UNCOMMON), + + /** + * Fishing Props + */ + SHARK_FIN(Material.PRISMARINE_SHARD, Rarity.RARE), + NURSE_SHARK_TOOTH(Material.GHAST_TEAR, Rarity.UNCOMMON), + BLUE_SHARK_TOOTH(Material.GHAST_TEAR, Rarity.RARE), + TIGER_SHARK_TOOTH(Material.GHAST_TEAR, Rarity.EPIC), + GREAT_WHITE_SHARK_TOOTH(Material.GHAST_TEAR, Rarity.LEGENDARY), + MAGMAFISH(Material.PLAYER_HEAD, Rarity.RARE), + SILVER_MAGMAFISH(Material.PLAYER_HEAD, Rarity.EPIC), + GOLD_MAGMAFISH(Material.PLAYER_HEAD, Rarity.LEGENDARY), + DIAMOND_MAGMAFISH(Material.PLAYER_HEAD, Rarity.MYTHIC), + FISHING_ROD(Material.FISHING_ROD, Rarity.COMMON), + + /** + * Combat Props + */ + CHILI_PEPPER(Material.PLAYER_HEAD, Rarity.UNCOMMON), + STUFFED_CHILI_PEPPER(Material.PLAYER_HEAD, Rarity.RARE), + ABSOLUTE_ENDER_PEARL(Material.PLAYER_HEAD, Rarity.RARE), + WHIPPED_MAGMA_CREAM(Material.PLAYER_HEAD, Rarity.RARE), + ZOMBIE_HEART(Material.PLAYER_HEAD, Rarity.RARE), + SOUL_STRING(Material.STRING, Rarity.RARE), + + /** + * Zombie Slayer + */ + FOUL_FLESH(Material.CHARCOAL, Rarity.RARE), + REVENANT_FLESH(Material.ROTTEN_FLESH, Rarity.UNCOMMON), + UNDEAD_CATALYST(Material.PLAYER_HEAD, Rarity.RARE), + BEHEADED_HORROR(Material.PLAYER_HEAD, Rarity.EPIC), + REVENANT_CATALYST(Material.PLAYER_HEAD, Rarity.EPIC), + SCYTHE_BLADE(Material.DIAMOND, Rarity.LEGENDARY), + SHARD_OF_THE_SHREDDED(Material.PLAYER_HEAD, Rarity.LEGENDARY), + WARDEN_HEART(Material.PLAYER_HEAD, Rarity.LEGENDARY), + REVENANT_VISCERA(Material.COOKED_PORKCHOP, Rarity.RARE), + CRYSTALLIZED_HEART(Material.PLAYER_HEAD, Rarity.RARE), + REVIVED_HEART(Material.PLAYER_HEAD, Rarity.EPIC), + REAPER_MASK(Material.PLAYER_HEAD, Rarity.LEGENDARY), + WARDEN_HELMET(Material.PLAYER_HEAD, Rarity.LEGENDARY), + REVENANT_FALCHION(Material.DIAMOND_SWORD, Rarity.RARE), + REAPER_FALCHION(Material.DIAMOND_SWORD, Rarity.EPIC), + AXE_OF_THE_SHREDDED(Material.DIAMOND_AXE, Rarity.LEGENDARY), + REAPER_SCYTHE(Material.DIAMOND_HOE, Rarity.LEGENDARY), + + /* + * Spider Slayer + */ /* TARANTULA_WEB(Material.STRING, Rarity.UNCOMMON), @@ -380,9 +391,9 @@ public enum ItemType { SCORPION_FOIL(Material.WOODEN_SWORD, Rarity.EPIC), */ - /* - * Wolf Slayer - */ + /* + * Wolf Slayer + */ /* WOLF_TOOTH(Material.GHAST_TEAR, Rarity.UNCOMMON), @@ -397,9 +408,9 @@ public enum ItemType { WEIRD_TUBA(Material.HOPPER, Rarity.RARE), */ - /* - * Enderman Slayer - */ + /* + * Enderman Slayer + */ /* NULL_SPHERE(Material.FIREWORK_STAR, Rarity.UNCOMMON), @@ -429,9 +440,9 @@ public enum ItemType { ETHERWARP_CONDUIT(Material.PLAYER_HEAD, Rarity.EPIC), */ - /* - * Blaze Slayer - */ + /* + * Blaze Slayer + */ /* DERELICT_ASHE(Material.GUNPOWDER, Rarity.UNCOMMON), @@ -450,1143 +461,1157 @@ public enum ItemType { SUBZERO_INVERTER(Material.PLAYER_HEAD, Rarity.LEGENDARY), */ - /** - * BrewingItem - */ - - CHEAP_COFFEE(Material.PLAYER_HEAD, Rarity.COMMON), - TEPID_GREEN_TEA(Material.PLAYER_HEAD, Rarity.COMMON), - PULPOUS_ORANGE_JUICE(Material.PLAYER_HEAD, Rarity.COMMON), - BITTER_ICE_TEA(Material.PLAYER_HEAD, Rarity.COMMON), - KNOCKOFF_COLA(Material.PLAYER_HEAD, Rarity.COMMON), - DECENT_COFFEE(Material.PLAYER_HEAD, Rarity.UNCOMMON), - WOLF_FUR_MIXIN(Material.PLAYER_HEAD, Rarity.RARE), - ZOMBIE_BRAIN_MIXIN(Material.PLAYER_HEAD, Rarity.RARE), - SPIDER_EGG_MIXIN(Material.PLAYER_HEAD, Rarity.RARE), - END_PORTAL_FUMES(Material.PLAYER_HEAD, Rarity.RARE), - GABAGOEY_MIXIN(Material.PLAYER_HEAD, Rarity.RARE), - BLACK_COFFEE(Material.PLAYER_HEAD, Rarity.RARE), - - /** - * DungeonItem - */ - ANCIENT_ROSE(Material.POPPY, Rarity.RARE), - ARCHITECTS_FIRST_DRAFT(Material.PAPER, Rarity.EPIC), - KISMET_FEATHER(Material.FEATHER, Rarity.RARE), - NECRONS_HANDLE(Material.STICK, Rarity.EPIC), - BIGFOOT_LASSO(Material.LEAD, Rarity.EPIC), - BONZO_FRAGMENT(Material.RED_MUSHROOM, Rarity.RARE), - FUMING_POTATO_BOOK(Material.BOOK, Rarity.EPIC), - - /** - * Mythological Ritual - */ - GRIFFIN_FEATHER(Material.FEATHER, Rarity.RARE), - ANCIENT_CLAW(Material.FLINT, Rarity.RARE), - ANTIQUE_REMEDIES(Material.AZURE_BLUET, Rarity.EPIC), - CROCHET_TIGER_PLUSHIE(Material.PLAYER_HEAD, Rarity.EPIC), - DWARF_TURTLE_SHELMET(Material.PLAYER_HEAD, Rarity.RARE), - DAEDALUS_STICK(Material.STICK, Rarity.LEGENDARY), - MINOS_RELIC(Material.PLAYER_HEAD, Rarity.EPIC), - CROWN_OF_GREED(Material.GOLDEN_HELMET, Rarity.LEGENDARY), - WASHED_UP_SOUVENIR(Material.PLAYER_HEAD, Rarity.LEGENDARY), - DAEDALUS_AXE(Material.GOLDEN_AXE, Rarity.LEGENDARY), - SWORD_OF_REVELATIONS(Material.WOODEN_SWORD, Rarity.EPIC), - - /** - * Spooky Festival - */ - GREEN_CANDY(Material.PLAYER_HEAD, Rarity.UNCOMMON), - PURPLE_CANDY(Material.PLAYER_HEAD, Rarity.EPIC), - WEREWOLF_SKIN(Material.ROTTEN_FLESH, Rarity.RARE), - SOUL_FRAGMENT(Material.PLAYER_HEAD, Rarity.EPIC), - ECTOPLASM(Material.PRISMARINE_CRYSTALS, Rarity.RARE), - BLAST_O_LANTERN(Material.PLAYER_HEAD, Rarity.RARE), - PUMPKIN_GUTS(Material.PUMPKIN_SEEDS, Rarity.UNCOMMON), - SPOOKY_SHARD(Material.PLAYER_HEAD, Rarity.EPIC), - HORSEMAN_CANDLE(Material.PLAYER_HEAD, Rarity.EPIC), - BAT_FIREWORK(Material.FIREWORK_ROCKET, Rarity.RARE), - - /** - * Armor Sets - */ - LEAFLET_HELMET(Material.OAK_LEAVES, Rarity.COMMON), - LEAFLET_CHESTPLATE(Material.LEATHER_CHESTPLATE, Rarity.COMMON), - LEAFLET_LEGGINGS(Material.LEATHER_LEGGINGS, Rarity.COMMON), - LEAFLET_BOOTS(Material.LEATHER_BOOTS, Rarity.COMMON), - MINERS_OUTFIT_HELMET(Material.LEATHER_HELMET, Rarity.UNCOMMON), - MINERS_OUTFIT_CHESTPLATE(Material.LEATHER_CHESTPLATE, Rarity.UNCOMMON), - MINERS_OUTFIT_LEGGINGS(Material.LEATHER_LEGGINGS, Rarity.UNCOMMON), - MINERS_OUTFIT_BOOTS(Material.LEATHER_BOOTS, Rarity.UNCOMMON), - FARM_SUIT_HELMET(Material.LEATHER_HELMET, Rarity.COMMON), - FARM_SUIT_CHESTPLATE(Material.LEATHER_CHESTPLATE, Rarity.COMMON), - FARM_SUIT_LEGGINGS(Material.LEATHER_LEGGINGS, Rarity.COMMON), - FARM_SUIT_BOOTS(Material.LEATHER_BOOTS, Rarity.COMMON), - ROSETTA_HELMET(Material.DIAMOND_HELMET, Rarity.UNCOMMON), - ROSETTA_CHESTPLATE(Material.DIAMOND_CHESTPLATE, Rarity.UNCOMMON), - ROSETTA_LEGGINGS(Material.DIAMOND_LEGGINGS, Rarity.UNCOMMON), - ROSETTA_BOOTS(Material.DIAMOND_BOOTS, Rarity.UNCOMMON), - SQUIRE_HELMET(Material.CHAINMAIL_HELMET, Rarity.UNCOMMON), - SQUIRE_CHESTPLATE(Material.IRON_CHESTPLATE, Rarity.UNCOMMON), - SQUIRE_LEGGINGS(Material.CHAINMAIL_LEGGINGS, Rarity.UNCOMMON), - SQUIRE_BOOTS(Material.LEATHER_BOOTS, Rarity.UNCOMMON), - MERCENARY_HELMET(Material.CHAINMAIL_HELMET, Rarity.RARE), - MERCENARY_CHESTPLATE(Material.IRON_CHESTPLATE, Rarity.RARE), - MERCENARY_LEGGINGS(Material.CHAINMAIL_LEGGINGS, Rarity.RARE), - MERCENARY_BOOTS(Material.LEATHER_BOOTS, Rarity.RARE), - CELESTE_HELMET(Material.LEATHER_HELMET, Rarity.UNCOMMON), - CELESTE_CHESTPLATE(Material.LEATHER_CHESTPLATE, Rarity.UNCOMMON), - CELESTE_LEGGINGS(Material.LEATHER_LEGGINGS, Rarity.UNCOMMON), - CELESTE_BOOTS(Material.LEATHER_BOOTS, Rarity.UNCOMMON), - STARLIGHT_HELMET(Material.GOLDEN_HELMET, Rarity.RARE), - STARLIGHT_CHESTPLATE(Material.LEATHER_CHESTPLATE, Rarity.RARE), - STARLIGHT_LEGGINGS(Material.GOLDEN_LEGGINGS, Rarity.RARE), - STARLIGHT_BOOTS(Material.LEATHER_BOOTS, Rarity.RARE), - CHEAP_TUXEDO_CHESTPLATE(Material.LEATHER_CHESTPLATE, Rarity.EPIC), - CHEAP_TUXEDO_LEGGINGS(Material.LEATHER_LEGGINGS, Rarity.EPIC), - CHEAP_TUXEDO_BOOTS(Material.LEATHER_BOOTS, Rarity.EPIC), - FANCY_TUXEDO_CHESTPLATE(Material.LEATHER_CHESTPLATE, Rarity.LEGENDARY), - FANCY_TUXEDO_LEGGINGS(Material.LEATHER_LEGGINGS, Rarity.LEGENDARY), - FANCY_TUXEDO_BOOTS(Material.LEATHER_BOOTS, Rarity.LEGENDARY), - ELEGANT_TUXEDO_CHESTPLATE(Material.LEATHER_CHESTPLATE, Rarity.LEGENDARY), - ELEGANT_TUXEDO_LEGGINGS(Material.LEATHER_LEGGINGS, Rarity.LEGENDARY), - ELEGANT_TUXEDO_BOOTS(Material.LEATHER_BOOTS, Rarity.LEGENDARY), - MUSHROOM_HELMET(Material.LEATHER_HELMET, Rarity.COMMON), - MUSHROOM_CHESTPLATE(Material.LEATHER_CHESTPLATE, Rarity.COMMON), - MUSHROOM_LEGGINGS(Material.LEATHER_LEGGINGS, Rarity.COMMON), - MUSHROOM_BOOTS(Material.LEATHER_BOOTS, Rarity.COMMON), - PUMPKIN_HELMET(Material.LEATHER_HELMET, Rarity.COMMON), - PUMPKIN_CHESTPLATE(Material.LEATHER_CHESTPLATE, Rarity.COMMON), - PUMPKIN_LEGGINGS(Material.LEATHER_LEGGINGS, Rarity.COMMON), - PUMPKIN_BOOTS(Material.LEATHER_BOOTS, Rarity.COMMON), - - /** - * Pickaxes - */ - PIONEERS_PICKAXE(Material.WOODEN_PICKAXE, Rarity.SPECIAL), - DIAMOND_PICKAXE(Material.DIAMOND_PICKAXE, Rarity.UNCOMMON), - IRON_PICKAXE(Material.IRON_PICKAXE, Rarity.COMMON), - STONE_PICKAXE(Material.STONE_PICKAXE, Rarity.COMMON), - WOODEN_PICKAXE(Material.WOODEN_PICKAXE, Rarity.COMMON), - GOLDEN_PICKAXE(Material.GOLDEN_PICKAXE, Rarity.COMMON), - ROOKIE_PICKAXE(Material.STONE_PICKAXE, Rarity.COMMON), - PROMISING_PICKAXE(Material.IRON_PICKAXE, Rarity.UNCOMMON), - PICKONIMBUS_2000(Material.DIAMOND_PICKAXE, Rarity.EPIC), - - /** - * Swords - */ - HYPERION(Material.IRON_SWORD, Rarity.LEGENDARY), - ROGUE_SWORD(Material.GOLDEN_SWORD, Rarity.COMMON), - DIAMOND_SWORD(Material.DIAMOND_SWORD, Rarity.UNCOMMON), - IRON_SWORD(Material.IRON_SWORD, Rarity.COMMON), - STONE_SWORD(Material.STONE_SWORD, Rarity.COMMON), - WOODEN_SWORD(Material.WOODEN_SWORD, Rarity.COMMON), - GOLDEN_SWORD(Material.GOLDEN_SWORD, Rarity.COMMON), - UNDEAD_SWORD(Material.IRON_SWORD, Rarity.COMMON), - END_SWORD(Material.DIAMOND_SWORD, Rarity.UNCOMMON), - SPIDER_SWORD(Material.IRON_SWORD, Rarity.COMMON), - ASPECT_OF_THE_JERRY(Material.WOODEN_SWORD, Rarity.COMMON), - FANCY_SWORD(Material.GOLDEN_SWORD, Rarity.COMMON), - HUNTER_KNIFE(Material.IRON_SWORD, Rarity.UNCOMMON), - PRISMARINE_BLADE(Material.PRISMARINE_SHARD, Rarity.UNCOMMON), - SILVER_FANG(Material.GHAST_TEAR, Rarity.UNCOMMON), - ASPECT_OF_THE_END(Material.DIAMOND_SWORD, Rarity.RARE), - SQUIRE_SWORD(Material.IRON_SWORD, Rarity.UNCOMMON), - MERCENARY_AXE(Material.IRON_AXE, Rarity.RARE), - - /** - * Shovels - */ - SHEARS(Material.SHEARS, Rarity.COMMON), - WOODEN_SHOVEL(Material.WOODEN_SHOVEL, Rarity.COMMON), - STONE_SHOVEL(Material.STONE_SHOVEL, Rarity.COMMON), - GOLDEN_SHOVEL(Material.GOLDEN_SHOVEL, Rarity.COMMON), - IRON_SHOVEL(Material.IRON_SHOVEL, Rarity.COMMON), - DIAMOND_SHOVEL(Material.DIAMOND_SHOVEL, Rarity.UNCOMMON), - - /** - * Bows - */ - WITHER_BOW(Material.BOW, Rarity.UNCOMMON), - ARTISANAL_SHORTBOW(Material.BOW, Rarity.RARE), - BOW(Material.BOW, Rarity.COMMON), - - /** - * Arrows - */ - FLINT_ARROW(Material.ARROW, Rarity.COMMON), - - /** - * Jerry's Workshop - */ - WHITE_GIFT(Material.PLAYER_HEAD, Rarity.COMMON), - GREEN_GIFT(Material.PLAYER_HEAD, Rarity.UNCOMMON), - RED_GIFT(Material.PLAYER_HEAD, Rarity.RARE), - GLACIAL_FRAGMENT(Material.PLAYER_HEAD, Rarity.EPIC), - - /** - * Mining Materials - */ - ROUGH_AMBER_GEMSTONE(Material.PLAYER_HEAD, Rarity.COMMON), - ROUGH_TOPAZ_GEMSTONE(Material.PLAYER_HEAD, Rarity.COMMON), - ROUGH_SAPPHIRE_GEMSTONE(Material.PLAYER_HEAD, Rarity.COMMON), - ROUGH_AMETHYST_GEMSTONE(Material.PLAYER_HEAD, Rarity.COMMON), - ROUGH_JASPER_GEMSTONE(Material.PLAYER_HEAD, Rarity.COMMON), - ROUGH_RUBY_GEMSTONE(Material.PLAYER_HEAD, Rarity.COMMON), - ROUGH_JADE_GEMSTONE(Material.PLAYER_HEAD, Rarity.COMMON), - FLAWED_AMBER_GEMSTONE(Material.PLAYER_HEAD, Rarity.UNCOMMON), - FLAWED_TOPAZ_GEMSTONE(Material.PLAYER_HEAD, Rarity.UNCOMMON), - FLAWED_SAPPHIRE_GEMSTONE(Material.PLAYER_HEAD, Rarity.UNCOMMON), - FLAWED_AMETHYST_GEMSTONE(Material.PLAYER_HEAD, Rarity.UNCOMMON), - FLAWED_JASPER_GEMSTONE(Material.PLAYER_HEAD, Rarity.UNCOMMON), - FLAWED_RUBY_GEMSTONE(Material.PLAYER_HEAD, Rarity.UNCOMMON), - FLAWED_JADE_GEMSTONE(Material.PLAYER_HEAD, Rarity.UNCOMMON), - FINE_AMBER_GEMSTONE(Material.PLAYER_HEAD, Rarity.RARE), - FINE_TOPAZ_GEMSTONE(Material.PLAYER_HEAD, Rarity.RARE), - FINE_SAPPHIRE_GEMSTONE(Material.PLAYER_HEAD, Rarity.RARE), - FINE_AMETHYST_GEMSTONE(Material.PLAYER_HEAD, Rarity.RARE), - FINE_JASPER_GEMSTONE(Material.PLAYER_HEAD, Rarity.RARE), - FINE_RUBY_GEMSTONE(Material.PLAYER_HEAD, Rarity.RARE), - FINE_JADE_GEMSTONE(Material.PLAYER_HEAD, Rarity.RARE), - FLAWLESS_AMBER_GEMSTONE(Material.PLAYER_HEAD, Rarity.EPIC), - FLAWLESS_TOPAZ_GEMSTONE(Material.PLAYER_HEAD, Rarity.EPIC), - FLAWLESS_SAPPHIRE_GEMSTONE(Material.PLAYER_HEAD, Rarity.EPIC), - FLAWLESS_AMETHYST_GEMSTONE(Material.PLAYER_HEAD, Rarity.EPIC), - FLAWLESS_JASPER_GEMSTONE(Material.PLAYER_HEAD, Rarity.EPIC), - FLAWLESS_RUBY_GEMSTONE(Material.PLAYER_HEAD, Rarity.EPIC), - FLAWLESS_JADE_GEMSTONE(Material.PLAYER_HEAD, Rarity.EPIC), - PERFECT_AMBER_GEMSTONE(Material.PLAYER_HEAD, Rarity.LEGENDARY), - PERFECT_TOPAZ_GEMSTONE(Material.PLAYER_HEAD, Rarity.LEGENDARY), - PERFECT_SAPPHIRE_GEMSTONE(Material.PLAYER_HEAD, Rarity.LEGENDARY), - PERFECT_AMETHYST_GEMSTONE(Material.PLAYER_HEAD, Rarity.LEGENDARY), - PERFECT_JASPER_GEMSTONE(Material.PLAYER_HEAD, Rarity.LEGENDARY), - PERFECT_RUBY_GEMSTONE(Material.PLAYER_HEAD, Rarity.LEGENDARY), - PERFECT_JADE_GEMSTONE(Material.PLAYER_HEAD, Rarity.LEGENDARY), - HARD_STONE(Material.STONE, Rarity.COMMON), - ENCHANTED_HARD_STONE(Material.STONE, Rarity.UNCOMMON), - MITHRIL(Material.PRISMARINE_CRYSTALS, Rarity.COMMON), - TITANIUM(Material.PLAYER_HEAD, Rarity.RARE), - SULPHUR(Material.GLOWSTONE_DUST, Rarity.UNCOMMON), - CONCENTRATED_STONE(Material.PLAYER_HEAD, Rarity.RARE), - - /** - * Forge Items - */ - REFINED_MITHRIL(Material.PLAYER_HEAD, Rarity.EPIC), - REFINED_TITANIUM(Material.PLAYER_HEAD, Rarity.EPIC), - - /** - * Other Mining Stuff - */ - GOBLIN_EGG(Material.EGG, Rarity.RARE), - YELLOW_GOBLIN_EGG(Material.EGG, Rarity.RARE), - RED_GOBLIN_EGG(Material.EGG, Rarity.RARE), - GREEN_GOBLIN_EGG(Material.EGG, Rarity.UNCOMMON), - BLUE_GOBLIN_EGG(Material.EGG, Rarity.RARE), - CONTROL_SWITCH(Material.PLAYER_HEAD, Rarity.RARE), - ELECTRON_TRANSMITTER(Material.PLAYER_HEAD, Rarity.RARE), - FTX_3070(Material.PLAYER_HEAD, Rarity.RARE), - ROBOTRON_REFLECTOR(Material.PLAYER_HEAD, Rarity.RARE), - SUPERLITE_MOTOR(Material.PLAYER_HEAD, Rarity.RARE), - SYNTHETIC_HEART(Material.PLAYER_HEAD, Rarity.RARE), - SLUDGE_JUICE(Material.PLAYER_HEAD, Rarity.UNCOMMON), - OIL_BARREL(Material.PLAYER_HEAD, Rarity.UNCOMMON), - TREASURITE(Material.PLAYER_HEAD, Rarity.EPIC), - JUNGLE_KEY(Material.TRIPWIRE_HOOK, Rarity.EPIC), - WISHING_COMPASS(Material.PLAYER_HEAD, Rarity.UNCOMMON), - WORM_MEMBRANE(Material.ROTTEN_FLESH, Rarity.UNCOMMON), - MAGMA_CORE(Material.MAGMA_CREAM, Rarity.RARE), - ETERNAL_FLAME_RING(Material.PLAYER_HEAD, Rarity.UNCOMMON), - HELIX(Material.PLAYER_HEAD, Rarity.LEGENDARY), - BOB_OMB(Material.PLAYER_HEAD, Rarity.RARE), - PREHISTORIC_EGG(Material.PLAYER_HEAD, Rarity.COMMON), - RECALL_POTION(Material.PLAYER_HEAD, Rarity.EPIC), - GEMSTONE_MIXTURE(Material.PLAYER_HEAD, Rarity.RARE), - DIVAN_FRAGMENT(Material.PLAYER_HEAD, Rarity.EPIC), - DIVAN_ALLOY(Material.PLAYER_HEAD, Rarity.LEGENDARY), - GLACITE_JEWEL(Material.PLAYER_HEAD, Rarity.RARE), - STARFALL(Material.NETHER_STAR, Rarity.RARE), - SORROW(Material.GHAST_TEAR, Rarity.RARE), - PLASMA(Material.PLAYER_HEAD, Rarity.RARE), - VOLTA(Material.PLAYER_HEAD, Rarity.RARE), - CORLEONITE(Material.PLAYER_HEAD, Rarity.EPIC), - - /** - * Travel Scrolls - */ - HUB_CASTLE_TRAVEL_SCROLL(Material.MAP, Rarity.EPIC), - HUB_MUSEUM_TRAVEL_SCROLL(Material.MAP, Rarity.EPIC), + /** + * BrewingItem + */ + + CHEAP_COFFEE(Material.PLAYER_HEAD, Rarity.COMMON), + TEPID_GREEN_TEA(Material.PLAYER_HEAD, Rarity.COMMON), + PULPOUS_ORANGE_JUICE(Material.PLAYER_HEAD, Rarity.COMMON), + BITTER_ICE_TEA(Material.PLAYER_HEAD, Rarity.COMMON), + KNOCKOFF_COLA(Material.PLAYER_HEAD, Rarity.COMMON), + DECENT_COFFEE(Material.PLAYER_HEAD, Rarity.UNCOMMON), + WOLF_FUR_MIXIN(Material.PLAYER_HEAD, Rarity.RARE), + ZOMBIE_BRAIN_MIXIN(Material.PLAYER_HEAD, Rarity.RARE), + SPIDER_EGG_MIXIN(Material.PLAYER_HEAD, Rarity.RARE), + END_PORTAL_FUMES(Material.PLAYER_HEAD, Rarity.RARE), + GABAGOEY_MIXIN(Material.PLAYER_HEAD, Rarity.RARE), + BLACK_COFFEE(Material.PLAYER_HEAD, Rarity.RARE), + + /** + * DungeonItem + */ + ANCIENT_ROSE(Material.POPPY, Rarity.RARE), + ARCHITECTS_FIRST_DRAFT(Material.PAPER, Rarity.EPIC), + KISMET_FEATHER(Material.FEATHER, Rarity.RARE), + NECRONS_HANDLE(Material.STICK, Rarity.EPIC), + BIGFOOT_LASSO(Material.LEAD, Rarity.EPIC), + BONZO_FRAGMENT(Material.RED_MUSHROOM, Rarity.RARE), + FUMING_POTATO_BOOK(Material.BOOK, Rarity.EPIC), + SUPERBOOM_TNT(Material.TNT, Rarity.RARE), + + /** + * Mythological Ritual + */ + GRIFFIN_FEATHER(Material.FEATHER, Rarity.RARE), + ANCIENT_CLAW(Material.FLINT, Rarity.RARE), + ANTIQUE_REMEDIES(Material.AZURE_BLUET, Rarity.EPIC), + CROCHET_TIGER_PLUSHIE(Material.PLAYER_HEAD, Rarity.EPIC), + DWARF_TURTLE_SHELMET(Material.PLAYER_HEAD, Rarity.RARE), + DAEDALUS_STICK(Material.STICK, Rarity.LEGENDARY), + MINOS_RELIC(Material.PLAYER_HEAD, Rarity.EPIC), + CROWN_OF_GREED(Material.GOLDEN_HELMET, Rarity.LEGENDARY), + WASHED_UP_SOUVENIR(Material.PLAYER_HEAD, Rarity.LEGENDARY), + DAEDALUS_AXE(Material.GOLDEN_AXE, Rarity.LEGENDARY), + SWORD_OF_REVELATIONS(Material.WOODEN_SWORD, Rarity.EPIC), + + /** + * Spooky Festival + */ + GREEN_CANDY(Material.PLAYER_HEAD, Rarity.UNCOMMON), + PURPLE_CANDY(Material.PLAYER_HEAD, Rarity.EPIC), + WEREWOLF_SKIN(Material.ROTTEN_FLESH, Rarity.RARE), + SOUL_FRAGMENT(Material.PLAYER_HEAD, Rarity.EPIC), + ECTOPLASM(Material.PRISMARINE_CRYSTALS, Rarity.RARE), + BLAST_O_LANTERN(Material.PLAYER_HEAD, Rarity.RARE), + PUMPKIN_GUTS(Material.PUMPKIN_SEEDS, Rarity.UNCOMMON), + SPOOKY_SHARD(Material.PLAYER_HEAD, Rarity.EPIC), + HORSEMAN_CANDLE(Material.PLAYER_HEAD, Rarity.EPIC), + BAT_FIREWORK(Material.FIREWORK_ROCKET, Rarity.RARE), + + /** + * Armor Sets + */ + LEAFLET_HELMET(Material.OAK_LEAVES, Rarity.COMMON), + LEAFLET_CHESTPLATE(Material.LEATHER_CHESTPLATE, Rarity.COMMON), + LEAFLET_LEGGINGS(Material.LEATHER_LEGGINGS, Rarity.COMMON), + LEAFLET_BOOTS(Material.LEATHER_BOOTS, Rarity.COMMON), + MINERS_OUTFIT_HELMET(Material.LEATHER_HELMET, Rarity.UNCOMMON), + MINERS_OUTFIT_CHESTPLATE(Material.LEATHER_CHESTPLATE, Rarity.UNCOMMON), + MINERS_OUTFIT_LEGGINGS(Material.LEATHER_LEGGINGS, Rarity.UNCOMMON), + MINERS_OUTFIT_BOOTS(Material.LEATHER_BOOTS, Rarity.UNCOMMON), + FARM_SUIT_HELMET(Material.LEATHER_HELMET, Rarity.COMMON), + FARM_SUIT_CHESTPLATE(Material.LEATHER_CHESTPLATE, Rarity.COMMON), + FARM_SUIT_LEGGINGS(Material.LEATHER_LEGGINGS, Rarity.COMMON), + FARM_SUIT_BOOTS(Material.LEATHER_BOOTS, Rarity.COMMON), + ROSETTA_HELMET(Material.DIAMOND_HELMET, Rarity.UNCOMMON), + ROSETTA_CHESTPLATE(Material.DIAMOND_CHESTPLATE, Rarity.UNCOMMON), + ROSETTA_LEGGINGS(Material.DIAMOND_LEGGINGS, Rarity.UNCOMMON), + ROSETTA_BOOTS(Material.DIAMOND_BOOTS, Rarity.UNCOMMON), + SQUIRE_HELMET(Material.CHAINMAIL_HELMET, Rarity.UNCOMMON), + SQUIRE_CHESTPLATE(Material.IRON_CHESTPLATE, Rarity.UNCOMMON), + SQUIRE_LEGGINGS(Material.CHAINMAIL_LEGGINGS, Rarity.UNCOMMON), + SQUIRE_BOOTS(Material.LEATHER_BOOTS, Rarity.UNCOMMON), + MERCENARY_HELMET(Material.CHAINMAIL_HELMET, Rarity.RARE), + MERCENARY_CHESTPLATE(Material.IRON_CHESTPLATE, Rarity.RARE), + MERCENARY_LEGGINGS(Material.CHAINMAIL_LEGGINGS, Rarity.RARE), + MERCENARY_BOOTS(Material.LEATHER_BOOTS, Rarity.RARE), + CELESTE_HELMET(Material.LEATHER_HELMET, Rarity.UNCOMMON), + CELESTE_CHESTPLATE(Material.LEATHER_CHESTPLATE, Rarity.UNCOMMON), + CELESTE_LEGGINGS(Material.LEATHER_LEGGINGS, Rarity.UNCOMMON), + CELESTE_BOOTS(Material.LEATHER_BOOTS, Rarity.UNCOMMON), + STARLIGHT_HELMET(Material.GOLDEN_HELMET, Rarity.RARE), + STARLIGHT_CHESTPLATE(Material.LEATHER_CHESTPLATE, Rarity.RARE), + STARLIGHT_LEGGINGS(Material.GOLDEN_LEGGINGS, Rarity.RARE), + STARLIGHT_BOOTS(Material.LEATHER_BOOTS, Rarity.RARE), + CHEAP_TUXEDO_CHESTPLATE(Material.LEATHER_CHESTPLATE, Rarity.EPIC), + CHEAP_TUXEDO_LEGGINGS(Material.LEATHER_LEGGINGS, Rarity.EPIC), + CHEAP_TUXEDO_BOOTS(Material.LEATHER_BOOTS, Rarity.EPIC), + FANCY_TUXEDO_CHESTPLATE(Material.LEATHER_CHESTPLATE, Rarity.LEGENDARY), + FANCY_TUXEDO_LEGGINGS(Material.LEATHER_LEGGINGS, Rarity.LEGENDARY), + FANCY_TUXEDO_BOOTS(Material.LEATHER_BOOTS, Rarity.LEGENDARY), + ELEGANT_TUXEDO_CHESTPLATE(Material.LEATHER_CHESTPLATE, Rarity.LEGENDARY), + ELEGANT_TUXEDO_LEGGINGS(Material.LEATHER_LEGGINGS, Rarity.LEGENDARY), + ELEGANT_TUXEDO_BOOTS(Material.LEATHER_BOOTS, Rarity.LEGENDARY), + MUSHROOM_HELMET(Material.LEATHER_HELMET, Rarity.COMMON), + MUSHROOM_CHESTPLATE(Material.LEATHER_CHESTPLATE, Rarity.COMMON), + MUSHROOM_LEGGINGS(Material.LEATHER_LEGGINGS, Rarity.COMMON), + MUSHROOM_BOOTS(Material.LEATHER_BOOTS, Rarity.COMMON), + PUMPKIN_HELMET(Material.LEATHER_HELMET, Rarity.COMMON), + PUMPKIN_CHESTPLATE(Material.LEATHER_CHESTPLATE, Rarity.COMMON), + PUMPKIN_LEGGINGS(Material.LEATHER_LEGGINGS, Rarity.COMMON), + PUMPKIN_BOOTS(Material.LEATHER_BOOTS, Rarity.COMMON), + LAPIS_ARMOR_HELMET(Material.SEA_LANTERN, Rarity.UNCOMMON), + LAPIS_ARMOR_CHESTPLATE(Material.LEATHER_CHESTPLATE, Rarity.UNCOMMON), + LAPIS_ARMOR_LEGGINGS(Material.SEA_LANTERN, Rarity.UNCOMMON), + LAPIS_ARMOR_BOOTS(Material.LEATHER_BOOTS, Rarity.UNCOMMON), + MINER_ARMOR_HELMET(Material.IRON_HELMET, Rarity.RARE), + MINER_ARMOR_CHESTPLATE(Material.IRON_CHESTPLATE, Rarity.RARE), + MINER_ARMOR_LEGGINGS(Material.IRON_LEGGINGS, Rarity.RARE), + MINER_ARMOR_BOOTS(Material.IRON_BOOTS, Rarity.RARE), + + /** + * Pickaxes + */ + PIONEERS_PICKAXE(Material.WOODEN_PICKAXE, Rarity.SPECIAL), + DIAMOND_PICKAXE(Material.DIAMOND_PICKAXE, Rarity.UNCOMMON), + IRON_PICKAXE(Material.IRON_PICKAXE, Rarity.COMMON), + STONE_PICKAXE(Material.STONE_PICKAXE, Rarity.COMMON), + WOODEN_PICKAXE(Material.WOODEN_PICKAXE, Rarity.COMMON), + GOLDEN_PICKAXE(Material.GOLDEN_PICKAXE, Rarity.COMMON), + ROOKIE_PICKAXE(Material.STONE_PICKAXE, Rarity.COMMON), + PROMISING_PICKAXE(Material.IRON_PICKAXE, Rarity.UNCOMMON), + PICKONIMBUS_2000(Material.DIAMOND_PICKAXE, Rarity.EPIC), + + /** + * Swords + */ + HYPERION(Material.IRON_SWORD, Rarity.LEGENDARY), + ROGUE_SWORD(Material.GOLDEN_SWORD, Rarity.COMMON), + DIAMOND_SWORD(Material.DIAMOND_SWORD, Rarity.UNCOMMON), + IRON_SWORD(Material.IRON_SWORD, Rarity.COMMON), + STONE_SWORD(Material.STONE_SWORD, Rarity.COMMON), + WOODEN_SWORD(Material.WOODEN_SWORD, Rarity.COMMON), + GOLDEN_SWORD(Material.GOLDEN_SWORD, Rarity.COMMON), + UNDEAD_SWORD(Material.IRON_SWORD, Rarity.COMMON), + END_SWORD(Material.DIAMOND_SWORD, Rarity.UNCOMMON), + SPIDER_SWORD(Material.IRON_SWORD, Rarity.COMMON), + ASPECT_OF_THE_JERRY(Material.WOODEN_SWORD, Rarity.COMMON), + FANCY_SWORD(Material.GOLDEN_SWORD, Rarity.COMMON), + HUNTER_KNIFE(Material.IRON_SWORD, Rarity.UNCOMMON), + PRISMARINE_BLADE(Material.PRISMARINE_SHARD, Rarity.UNCOMMON), + SILVER_FANG(Material.GHAST_TEAR, Rarity.UNCOMMON), + ASPECT_OF_THE_END(Material.DIAMOND_SWORD, Rarity.RARE), + SQUIRE_SWORD(Material.IRON_SWORD, Rarity.UNCOMMON), + MERCENARY_AXE(Material.IRON_AXE, Rarity.RARE), + + /** + * Shovels + */ + SHEARS(Material.SHEARS, Rarity.COMMON), + WOODEN_SHOVEL(Material.WOODEN_SHOVEL, Rarity.COMMON), + STONE_SHOVEL(Material.STONE_SHOVEL, Rarity.COMMON), + GOLDEN_SHOVEL(Material.GOLDEN_SHOVEL, Rarity.COMMON), + IRON_SHOVEL(Material.IRON_SHOVEL, Rarity.COMMON), + DIAMOND_SHOVEL(Material.DIAMOND_SHOVEL, Rarity.UNCOMMON), + + /** + * Bows + */ + WITHER_BOW(Material.BOW, Rarity.UNCOMMON), + ARTISANAL_SHORTBOW(Material.BOW, Rarity.RARE), + BOW(Material.BOW, Rarity.COMMON), + + /** + * Arrows + */ + FLINT_ARROW(Material.ARROW, Rarity.COMMON), + + /** + * Jerry's Workshop + */ + WHITE_GIFT(Material.PLAYER_HEAD, Rarity.COMMON), + GREEN_GIFT(Material.PLAYER_HEAD, Rarity.UNCOMMON), + RED_GIFT(Material.PLAYER_HEAD, Rarity.RARE), + GLACIAL_FRAGMENT(Material.PLAYER_HEAD, Rarity.EPIC), + + /** + * Mining Materials + */ + ROUGH_AMBER_GEMSTONE(Material.PLAYER_HEAD, Rarity.COMMON), + ROUGH_TOPAZ_GEMSTONE(Material.PLAYER_HEAD, Rarity.COMMON), + ROUGH_SAPPHIRE_GEMSTONE(Material.PLAYER_HEAD, Rarity.COMMON), + ROUGH_AMETHYST_GEMSTONE(Material.PLAYER_HEAD, Rarity.COMMON), + ROUGH_JASPER_GEMSTONE(Material.PLAYER_HEAD, Rarity.COMMON), + ROUGH_RUBY_GEMSTONE(Material.PLAYER_HEAD, Rarity.COMMON), + ROUGH_JADE_GEMSTONE(Material.PLAYER_HEAD, Rarity.COMMON), + FLAWED_AMBER_GEMSTONE(Material.PLAYER_HEAD, Rarity.UNCOMMON), + FLAWED_TOPAZ_GEMSTONE(Material.PLAYER_HEAD, Rarity.UNCOMMON), + FLAWED_SAPPHIRE_GEMSTONE(Material.PLAYER_HEAD, Rarity.UNCOMMON), + FLAWED_AMETHYST_GEMSTONE(Material.PLAYER_HEAD, Rarity.UNCOMMON), + FLAWED_JASPER_GEMSTONE(Material.PLAYER_HEAD, Rarity.UNCOMMON), + FLAWED_RUBY_GEMSTONE(Material.PLAYER_HEAD, Rarity.UNCOMMON), + FLAWED_JADE_GEMSTONE(Material.PLAYER_HEAD, Rarity.UNCOMMON), + FINE_AMBER_GEMSTONE(Material.PLAYER_HEAD, Rarity.RARE), + FINE_TOPAZ_GEMSTONE(Material.PLAYER_HEAD, Rarity.RARE), + FINE_SAPPHIRE_GEMSTONE(Material.PLAYER_HEAD, Rarity.RARE), + FINE_AMETHYST_GEMSTONE(Material.PLAYER_HEAD, Rarity.RARE), + FINE_JASPER_GEMSTONE(Material.PLAYER_HEAD, Rarity.RARE), + FINE_RUBY_GEMSTONE(Material.PLAYER_HEAD, Rarity.RARE), + FINE_JADE_GEMSTONE(Material.PLAYER_HEAD, Rarity.RARE), + FLAWLESS_AMBER_GEMSTONE(Material.PLAYER_HEAD, Rarity.EPIC), + FLAWLESS_TOPAZ_GEMSTONE(Material.PLAYER_HEAD, Rarity.EPIC), + FLAWLESS_SAPPHIRE_GEMSTONE(Material.PLAYER_HEAD, Rarity.EPIC), + FLAWLESS_AMETHYST_GEMSTONE(Material.PLAYER_HEAD, Rarity.EPIC), + FLAWLESS_JASPER_GEMSTONE(Material.PLAYER_HEAD, Rarity.EPIC), + FLAWLESS_RUBY_GEMSTONE(Material.PLAYER_HEAD, Rarity.EPIC), + FLAWLESS_JADE_GEMSTONE(Material.PLAYER_HEAD, Rarity.EPIC), + PERFECT_AMBER_GEMSTONE(Material.PLAYER_HEAD, Rarity.LEGENDARY), + PERFECT_TOPAZ_GEMSTONE(Material.PLAYER_HEAD, Rarity.LEGENDARY), + PERFECT_SAPPHIRE_GEMSTONE(Material.PLAYER_HEAD, Rarity.LEGENDARY), + PERFECT_AMETHYST_GEMSTONE(Material.PLAYER_HEAD, Rarity.LEGENDARY), + PERFECT_JASPER_GEMSTONE(Material.PLAYER_HEAD, Rarity.LEGENDARY), + PERFECT_RUBY_GEMSTONE(Material.PLAYER_HEAD, Rarity.LEGENDARY), + PERFECT_JADE_GEMSTONE(Material.PLAYER_HEAD, Rarity.LEGENDARY), + HARD_STONE(Material.STONE, Rarity.COMMON), + ENCHANTED_HARD_STONE(Material.STONE, Rarity.UNCOMMON), + MITHRIL(Material.PRISMARINE_CRYSTALS, Rarity.COMMON), + TITANIUM(Material.PLAYER_HEAD, Rarity.RARE), + SULPHUR(Material.GLOWSTONE_DUST, Rarity.UNCOMMON), + CONCENTRATED_STONE(Material.PLAYER_HEAD, Rarity.RARE), + + /** + * Forge Items + */ + REFINED_MITHRIL(Material.PLAYER_HEAD, Rarity.EPIC), + REFINED_TITANIUM(Material.PLAYER_HEAD, Rarity.EPIC), + + /** + * Other Mining Stuff + */ + GOBLIN_EGG(Material.EGG, Rarity.RARE), + YELLOW_GOBLIN_EGG(Material.EGG, Rarity.RARE), + RED_GOBLIN_EGG(Material.EGG, Rarity.RARE), + GREEN_GOBLIN_EGG(Material.EGG, Rarity.UNCOMMON), + BLUE_GOBLIN_EGG(Material.EGG, Rarity.RARE), + CONTROL_SWITCH(Material.PLAYER_HEAD, Rarity.RARE), + ELECTRON_TRANSMITTER(Material.PLAYER_HEAD, Rarity.RARE), + FTX_3070(Material.PLAYER_HEAD, Rarity.RARE), + ROBOTRON_REFLECTOR(Material.PLAYER_HEAD, Rarity.RARE), + SUPERLITE_MOTOR(Material.PLAYER_HEAD, Rarity.RARE), + SYNTHETIC_HEART(Material.PLAYER_HEAD, Rarity.RARE), + SLUDGE_JUICE(Material.PLAYER_HEAD, Rarity.UNCOMMON), + OIL_BARREL(Material.PLAYER_HEAD, Rarity.UNCOMMON), + TREASURITE(Material.PLAYER_HEAD, Rarity.EPIC), + JUNGLE_KEY(Material.TRIPWIRE_HOOK, Rarity.EPIC), + WISHING_COMPASS(Material.PLAYER_HEAD, Rarity.UNCOMMON), + WORM_MEMBRANE(Material.ROTTEN_FLESH, Rarity.UNCOMMON), + MAGMA_CORE(Material.MAGMA_CREAM, Rarity.RARE), + ETERNAL_FLAME_RING(Material.PLAYER_HEAD, Rarity.UNCOMMON), + HELIX(Material.PLAYER_HEAD, Rarity.LEGENDARY), + BOB_OMB(Material.PLAYER_HEAD, Rarity.RARE), + PREHISTORIC_EGG(Material.PLAYER_HEAD, Rarity.COMMON), + RECALL_POTION(Material.PLAYER_HEAD, Rarity.EPIC), + GEMSTONE_MIXTURE(Material.PLAYER_HEAD, Rarity.RARE), + DIVAN_FRAGMENT(Material.PLAYER_HEAD, Rarity.EPIC), + DIVAN_ALLOY(Material.PLAYER_HEAD, Rarity.LEGENDARY), + GLACITE_JEWEL(Material.PLAYER_HEAD, Rarity.RARE), + STARFALL(Material.NETHER_STAR, Rarity.RARE), + SORROW(Material.GHAST_TEAR, Rarity.RARE), + PLASMA(Material.PLAYER_HEAD, Rarity.RARE), + VOLTA(Material.PLAYER_HEAD, Rarity.RARE), + CORLEONITE(Material.PLAYER_HEAD, Rarity.EPIC), + + /** + * Travel Scrolls + */ + HUB_CASTLE_TRAVEL_SCROLL(Material.MAP, Rarity.EPIC), + HUB_MUSEUM_TRAVEL_SCROLL(Material.MAP, Rarity.EPIC), + HUB_DARK_AUCTION_TRAVEL_SCROLL(Material.MAP, Rarity.EPIC), HUB_CRYPTS_TRAVEL_SCROLL(Material.MAP, Rarity.EPIC), - /** - * Crimson Isles - */ - FLAMES(Material.BLAZE_POWDER, Rarity.RARE), - - /** - * Vanilla Items - */ - AIR(Material.AIR, Rarity.COMMON), - DIRT(Material.DIRT, Rarity.COMMON), - CRAFTING_TABLE(Material.CRAFTING_TABLE, Rarity.COMMON), - ANVIL(Material.ANVIL, Rarity.COMMON), - FLOWER_POT(Material.FLOWER_POT, Rarity.COMMON), - FERN(Material.FERN, Rarity.COMMON), - DEAD_BUSH(Material.DEAD_BUSH, Rarity.COMMON), - WATER_BUCKET(Material.WATER_BUCKET, Rarity.COMMON), - LARGE_FERN(Material.LARGE_FERN, Rarity.COMMON), - STICK(Material.STICK, Rarity.COMMON), - BAKED_POTATO(Material.BAKED_POTATO, Rarity.COMMON), - BLAZE_ROD(Material.BLAZE_ROD, Rarity.COMMON), - BONE(Material.BONE, Rarity.COMMON), - BONE_MEAL(Material.BONE_MEAL, Rarity.COMMON), - BOOK(Material.BOOK, Rarity.COMMON), - BOOKSHELF(Material.BOOKSHELF, Rarity.COMMON), - BOWL(Material.BOWL, Rarity.COMMON), - BREAD(Material.BREAD, Rarity.COMMON), - CARROT(Material.CARROT, Rarity.COMMON), - CHARCOAL(Material.CHARCOAL, Rarity.COMMON), - COAL(Material.COAL, Rarity.COMMON), - COCOA_BEANS(Material.COCOA_BEANS, Rarity.COMMON), - DIAMOND(Material.DIAMOND, Rarity.COMMON), - DIAMOND_BLOCK(Material.DIAMOND_BLOCK, Rarity.COMMON), - EGG(Material.EGG, Rarity.COMMON), - EMERALD(Material.EMERALD, Rarity.COMMON), - EMERALD_BLOCK(Material.EMERALD_BLOCK, Rarity.COMMON), - ENDER_PEARL(Material.ENDER_PEARL, Rarity.COMMON), - FEATHER(Material.FEATHER, Rarity.COMMON), - FLINT(Material.FLINT, Rarity.COMMON), - GLOWSTONE_DUST(Material.GLOWSTONE_DUST, Rarity.COMMON), - GOLD_INGOT(Material.GOLD_INGOT, Rarity.COMMON), - GOLD_BLOCK(Material.GOLD_BLOCK, Rarity.COMMON), - GUNPOWDER(Material.GUNPOWDER, Rarity.COMMON), - END_STONE(Material.END_STONE, Rarity.COMMON), - EYE_OF_ENDER(Material.ENDER_EYE, Rarity.COMMON), - GHAST_TEAR(Material.GHAST_TEAR, Rarity.COMMON), - ICE(Material.ICE, Rarity.COMMON), - IRON_INGOT(Material.IRON_INGOT, Rarity.COMMON), - GRAVEL(Material.GRAVEL, Rarity.COMMON), - LAPIS_LAZULI(Material.LAPIS_LAZULI, Rarity.COMMON), - IRON_BLOCK(Material.IRON_BLOCK, Rarity.COMMON), - LEATHER(Material.LEATHER, Rarity.COMMON), - MAGMA_CREAM(Material.MAGMA_CREAM, Rarity.COMMON), - OBSIDIAN(Material.OBSIDIAN, Rarity.COMMON), - PACKED_ICE(Material.PACKED_ICE, Rarity.COMMON), - VINES(Material.VINE, Rarity.COMMON), - PAPER(Material.PAPER, Rarity.COMMON), - POTATO(Material.POTATO, Rarity.COMMON), - PUMPKIN(Material.PUMPKIN, Rarity.COMMON), - REDSTONE(Material.REDSTONE, Rarity.COMMON), - REDSTONE_BLOCK(Material.REDSTONE_BLOCK, Rarity.COMMON), - ROTTEN_FLESH(Material.ROTTEN_FLESH, Rarity.COMMON), - SLIME_BALL(Material.SLIME_BALL, Rarity.COMMON), - SPONGE(Material.SPONGE, Rarity.COMMON), - STRING(Material.STRING, Rarity.COMMON), - SUGAR_CANE(Material.SUGAR_CANE, Rarity.COMMON), - SUGAR(Material.SUGAR, Rarity.COMMON), - SNOW(Material.SNOW, Rarity.COMMON), - SNOW_BLOCK(Material.SNOW_BLOCK, Rarity.COMMON), - SNOWBALL(Material.SNOWBALL, Rarity.COMMON), - MELON_SLICE(Material.MELON_SLICE, Rarity.COMMON), - RED_MUSHROOM(Material.RED_MUSHROOM, Rarity.COMMON), - BROWN_MUSHROOM(Material.BROWN_MUSHROOM, Rarity.COMMON), - MUTTON(Material.MUTTON, Rarity.COMMON), - NETHER_WART(Material.NETHER_WART, Rarity.COMMON), - CHICKEN(Material.CHICKEN, Rarity.COMMON), - SOUL_SAND(Material.SOUL_SAND, Rarity.COMMON), - PRISMARINE(Material.PRISMARINE, Rarity.COMMON), - PRISMARINE_BRICKS(Material.PRISMARINE_BRICKS, Rarity.COMMON), - DARK_PRISMARINE(Material.DARK_PRISMARINE, Rarity.COMMON), - SEA_LANTERN(Material.SEA_LANTERN, Rarity.COMMON), - WET_SPONGE(Material.WET_SPONGE, Rarity.COMMON), - LAVA_BUCKET(Material.LAVA_BUCKET, Rarity.COMMON), - JACK_O_LANTERN(Material.JACK_O_LANTERN, Rarity.COMMON), - NETHER_BRICKS(Material.NETHER_BRICKS, Rarity.COMMON), - COARSE_DIRT(Material.COARSE_DIRT, Rarity.COMMON), - PODZOL(Material.PODZOL, Rarity.COMMON), - CRACKED_STONE_BRICKS(Material.CRACKED_STONE_BRICKS, Rarity.COMMON), - CHISELED_STONE_BRICKS(Material.CHISELED_STONE_BRICKS, Rarity.COMMON), - SMOOTH_STONE(Material.SMOOTH_STONE, Rarity.COMMON), - SMOOTH_SANDSTONE(Material.SMOOTH_SANDSTONE, Rarity.COMMON), - SMOOTH_QUARTZ(Material.SMOOTH_QUARTZ, Rarity.COMMON), - BRICKS(Material.BRICKS, Rarity.COMMON), - END_STONE_BRICKS(Material.END_STONE_BRICKS, Rarity.COMMON), - PURPUR_BLOCK(Material.PURPUR_BLOCK, Rarity.COMMON), - PURPUR_PILLAR(Material.PURPUR_PILLAR, Rarity.COMMON), - PURPUR_STAIRS(Material.PURPUR_STAIRS, Rarity.COMMON), - PURPUR_SLAB(Material.PURPUR_SLAB, Rarity.COMMON), - END_ROD(Material.END_ROD, Rarity.COMMON), - DRAGON_BREATH(Material.DRAGON_BREATH, Rarity.COMMON), - ELDER_GUARDIAN_SPAWN_EGG(Material.ELDER_GUARDIAN_SPAWN_EGG, Rarity.COMMON), - ENDER_CHEST(Material.ENDER_CHEST, Rarity.COMMON), - ENDER_EYE(Material.ENDER_EYE, Rarity.COMMON), - BRICK_STAIRS(Material.BRICK_STAIRS, Rarity.COMMON), - BRICK_SLAB(Material.BRICK_SLAB, Rarity.COMMON), - SMOOTH_RED_SANDSTONE(Material.SMOOTH_RED_SANDSTONE, Rarity.COMMON), - IRON_BARS(Material.IRON_BARS, Rarity.COMMON), - IRON_DOOR(Material.IRON_DOOR, Rarity.COMMON), - REDSTONE_LAMP(Material.REDSTONE_LAMP, Rarity.COMMON), - SANDSTONE_STAIRS(Material.SANDSTONE_STAIRS, Rarity.COMMON), - EMERALD_ORE(Material.EMERALD_ORE, Rarity.COMMON), - DIAMOND_ORE(Material.DIAMOND_ORE, Rarity.COMMON), - GOLD_ORE(Material.GOLD_ORE, Rarity.COMMON), - IRON_ORE(Material.IRON_ORE, Rarity.COMMON), - COAL_ORE(Material.COAL_ORE, Rarity.COMMON), - LAPIS_LAZULI_ORE(Material.LAPIS_ORE, Rarity.COMMON), - REDSTONE_ORE(Material.REDSTONE_ORE, Rarity.COMMON), - IRON_TRAPDOOR(Material.IRON_TRAPDOOR, Rarity.COMMON), - PORKCHOP(Material.PORKCHOP, Rarity.COMMON), - RABBIT(Material.RABBIT, Rarity.COMMON), - MYCELIUM(Material.MYCELIUM, Rarity.COMMON), - RED_SAND(Material.RED_SAND, Rarity.COMMON), - QUARTZ(Material.QUARTZ, Rarity.COMMON), - NETHER_QUARTZ_ORE(Material.NETHER_QUARTZ_ORE, Rarity.COMMON), - NETHERRACK(Material.NETHERRACK, Rarity.COMMON), - NETHER_BRICK(Material.NETHER_BRICK, Rarity.COMMON), - SAND(Material.SAND, Rarity.COMMON), - CLAY_BALL(Material.CLAY_BALL, Rarity.COMMON), - TROPICAL_FISH(Material.TROPICAL_FISH, Rarity.COMMON), - INK_SAC(Material.INK_SAC, Rarity.COMMON), - GRASS_BLOCK(Material.GRASS_BLOCK, Rarity.COMMON), - SHORT_GRASS(Material.SHORT_GRASS, Rarity.COMMON), - TALL_GRASS(Material.TALL_GRASS, Rarity.COMMON), - MELON_BLOCK(Material.MELON, Rarity.COMMON), - LILY_PAD(Material.LILY_PAD, Rarity.COMMON), - PRISMARINE_CRYSTALS(Material.PRISMARINE_CRYSTALS, Rarity.COMMON), - PRISMARINE_SHARD(Material.PRISMARINE_SHARD, Rarity.COMMON), - PUFFERFISH(Material.PUFFERFISH, Rarity.COMMON), - COD(Material.COD, Rarity.COMMON), - SALMON(Material.SALMON, Rarity.COMMON), - TORCH(Material.TORCH, Rarity.COMMON), - RAW_BEEF(Material.BEEF, Rarity.UNCOMMON), - RAW_CHICKEN(Material.CHICKEN, Rarity.UNCOMMON), - SPIDER_EYE(Material.SPIDER_EYE, Rarity.COMMON), - CACTUS_GREEN(Material.GREEN_DYE, Rarity.COMMON), - DANDELION(Material.DANDELION, Rarity.COMMON), - FERMENTED_SPIDER_EYE(Material.FERMENTED_SPIDER_EYE, Rarity.COMMON), - GLISTERING_MELON(Material.GLISTERING_MELON_SLICE, Rarity.COMMON), - GLOWSTONE(Material.GLOWSTONE, Rarity.COMMON), - HAY_BALE(Material.HAY_BLOCK, Rarity.COMMON), - POISONOUS_POTATO(Material.POISONOUS_POTATO, Rarity.COMMON), - POPPY(Material.POPPY, Rarity.COMMON), - RABBIT_FOOT(Material.RABBIT_FOOT, Rarity.COMMON), - RABBIT_HIDE(Material.RABBIT_HIDE, Rarity.COMMON), - BEEF(Material.BEEF, Rarity.COMMON), - COAL_BLOCK(Material.COAL_BLOCK, Rarity.COMMON), - LAPIS_LAZULI_BLOCK(Material.LAPIS_BLOCK, Rarity.COMMON), - BROWN_MUSHROOM_BLOCK(Material.BROWN_MUSHROOM_BLOCK, Rarity.COMMON), - RED_MUSHROOM_BLOCK(Material.RED_MUSHROOM_BLOCK, Rarity.COMMON), - BLAZE_POWDER(Material.BLAZE_POWDER, Rarity.COMMON), - GOLDEN_CARROT(Material.GOLDEN_CARROT, Rarity.COMMON), - GOLD_NUGGET(Material.GOLD_NUGGET, Rarity.COMMON), - IRON_NUGGET(Material.IRON_NUGGET, Rarity.COMMON), - WATER_BOTTLE(Material.POTION, Rarity.COMMON), - CACTUS(Material.CACTUS, Rarity.COMMON), - CHEST(Material.CHEST, Rarity.COMMON), - IRON_HELMET(Material.IRON_HELMET, Rarity.COMMON), - IRON_CHESTPLATE(Material.IRON_CHESTPLATE, Rarity.COMMON), - IRON_LEGGINGS(Material.IRON_LEGGINGS, Rarity.COMMON), - IRON_BOOTS(Material.IRON_BOOTS, Rarity.COMMON), - LEATHER_HELMET(Material.LEATHER_HELMET, Rarity.COMMON), - LEATHER_CHESTPLATE(Material.LEATHER_CHESTPLATE, Rarity.COMMON), - LEATHER_LEGGINGS(Material.LEATHER_LEGGINGS, Rarity.COMMON), - LEATHER_BOOTS(Material.LEATHER_BOOTS, Rarity.COMMON), - GOLDEN_HELMET(Material.GOLDEN_HELMET, Rarity.COMMON), - GOLDEN_CHESTPLATE(Material.GOLDEN_CHESTPLATE, Rarity.COMMON), - GOLDEN_LEGGINGS(Material.GOLDEN_LEGGINGS, Rarity.COMMON), - GOLDEN_BOOTS(Material.GOLDEN_BOOTS, Rarity.COMMON), - DIAMOND_HELMET(Material.DIAMOND_HELMET, Rarity.UNCOMMON), - DIAMOND_CHESTPLATE(Material.DIAMOND_CHESTPLATE, Rarity.UNCOMMON), - DIAMOND_LEGGINGS(Material.DIAMOND_LEGGINGS, Rarity.UNCOMMON), - DIAMOND_BOOTS(Material.DIAMOND_BOOTS, Rarity.UNCOMMON), - APPLE(Material.APPLE, Rarity.COMMON), - SLIME_BLOCK(Material.SLIME_BLOCK, Rarity.COMMON), - - OAK_SAPLING(Material.OAK_SAPLING, Rarity.COMMON), - SPRUCE_SAPLING(Material.SPRUCE_SAPLING, Rarity.COMMON), - BIRCH_SAPLING(Material.BIRCH_SAPLING, Rarity.COMMON), - JUNGLE_SAPLING(Material.JUNGLE_SAPLING, Rarity.COMMON), - ACACIA_SAPLING(Material.ACACIA_SAPLING, Rarity.COMMON), - DARK_OAK_SAPLING(Material.DARK_OAK_SAPLING, Rarity.COMMON), - CHERRY_SAPLING(Material.CHERRY_SAPLING, Rarity.COMMON), - MANGROVE_PROPAGULE(Material.MANGROVE_PROPAGULE, Rarity.COMMON), - PALE_OAK_SAPLING(Material.PALE_OAK_SAPLING, Rarity.COMMON), - AZALEA(Material.AZALEA, Rarity.COMMON), - FLOWERING_AZALEA(Material.FLOWERING_AZALEA, Rarity.COMMON), - - OAK_LEAVES(Material.OAK_LEAVES, Rarity.COMMON), - SPRUCE_LEAVES(Material.SPRUCE_LEAVES, Rarity.COMMON), - BIRCH_LEAVES(Material.BIRCH_LEAVES, Rarity.COMMON), - JUNGLE_LEAVES(Material.JUNGLE_LEAVES, Rarity.COMMON), - ACACIA_LEAVES(Material.ACACIA_LEAVES, Rarity.COMMON), - DARK_OAK_LEAVES(Material.DARK_OAK_LEAVES, Rarity.COMMON), - CHERRY_LEAVES(Material.CHERRY_LEAVES, Rarity.COMMON), - MANGROVE_LEAVES(Material.MANGROVE_LEAVES, Rarity.COMMON), - PALE_OAK_LEAVES(Material.PALE_OAK_LEAVES, Rarity.COMMON), - AZALEA_LEAVES(Material.AZALEA_LEAVES, Rarity.COMMON), - FLOWERING_AZALEA_LEAVES(Material.FLOWERING_AZALEA_LEAVES, Rarity.COMMON), - - OAK_LOG(Material.OAK_LOG, Rarity.COMMON), - STRIPPED_OAK_LOG(Material.STRIPPED_OAK_LOG, Rarity.COMMON), - OAK_WOOD(Material.OAK_WOOD, Rarity.COMMON), - STRIPPED_OAK_WOOD(Material.STRIPPED_OAK_WOOD, Rarity.COMMON), - OAK_PLANKS(Material.OAK_PLANKS, Rarity.COMMON), - OAK_SLAB(Material.OAK_SLAB, Rarity.COMMON), - OAK_STAIRS(Material.OAK_STAIRS, Rarity.COMMON), - OAK_FENCE(Material.OAK_FENCE, Rarity.COMMON), - OAK_FENCE_GATE(Material.OAK_FENCE_GATE, Rarity.COMMON), - OAK_DOOR(Material.OAK_DOOR, Rarity.COMMON), - OAK_TRAPDOOR(Material.OAK_TRAPDOOR, Rarity.COMMON), - OAK_PRESSURE_PLATE(Material.OAK_PRESSURE_PLATE, Rarity.COMMON), - OAK_BUTTON(Material.OAK_BUTTON, Rarity.COMMON), - OAK_BOAT(Material.OAK_BOAT, Rarity.COMMON), - OAK_CHEST_BOAT(Material.OAK_CHEST_BOAT, Rarity.COMMON), - OAK_SIGN(Material.OAK_SIGN, Rarity.COMMON), - OAK_HANGING_SIGN(Material.OAK_HANGING_SIGN, Rarity.COMMON), - - ACACIA_LOG(Material.ACACIA_LOG, Rarity.COMMON), - STRIPPED_ACACIA_LOG(Material.STRIPPED_ACACIA_LOG, Rarity.COMMON), - ACACIA_WOOD(Material.ACACIA_WOOD, Rarity.COMMON), - STRIPPED_ACACIA_WOOD(Material.STRIPPED_ACACIA_WOOD, Rarity.COMMON), - ACACIA_PLANKS(Material.ACACIA_PLANKS, Rarity.COMMON), - ACACIA_SLAB(Material.ACACIA_SLAB, Rarity.COMMON), - ACACIA_STAIRS(Material.ACACIA_STAIRS, Rarity.COMMON), - ACACIA_FENCE(Material.ACACIA_FENCE, Rarity.COMMON), - ACACIA_FENCE_GATE(Material.ACACIA_FENCE_GATE, Rarity.COMMON), - ACACIA_DOOR(Material.ACACIA_DOOR, Rarity.COMMON), - ACACIA_TRAPDOOR(Material.ACACIA_TRAPDOOR, Rarity.COMMON), - ACACIA_PRESSURE_PLATE(Material.ACACIA_PRESSURE_PLATE, Rarity.COMMON), - ACACIA_BUTTON(Material.ACACIA_BUTTON, Rarity.COMMON), - ACACIA_BOAT(Material.ACACIA_BOAT, Rarity.COMMON), - ACACIA_CHEST_BOAT(Material.ACACIA_CHEST_BOAT, Rarity.COMMON), - ACACIA_SIGN(Material.ACACIA_SIGN, Rarity.COMMON), - ACACIA_HANGING_SIGN(Material.ACACIA_HANGING_SIGN, Rarity.COMMON), - - CHERRY_LOG(Material.CHERRY_LOG, Rarity.COMMON), - STRIPPED_CHERRY_LOG(Material.STRIPPED_CHERRY_LOG, Rarity.COMMON), - CHERRY_WOOD(Material.CHERRY_WOOD, Rarity.COMMON), - STRIPPED_CHERRY_WOOD(Material.STRIPPED_CHERRY_WOOD, Rarity.COMMON), - CHERRY_PLANKS(Material.CHERRY_PLANKS, Rarity.COMMON), - CHERRY_SLAB(Material.CHERRY_SLAB, Rarity.COMMON), - CHERRY_STAIRS(Material.CHERRY_STAIRS, Rarity.COMMON), - CHERRY_FENCE(Material.CHERRY_FENCE, Rarity.COMMON), - CHERRY_FENCE_GATE(Material.CHERRY_FENCE_GATE, Rarity.COMMON), - CHERRY_DOOR(Material.CHERRY_DOOR, Rarity.COMMON), - CHERRY_TRAPDOOR(Material.CHERRY_TRAPDOOR, Rarity.COMMON), - CHERRY_PRESSURE_PLATE(Material.CHERRY_PRESSURE_PLATE, Rarity.COMMON), - CHERRY_BUTTON(Material.CHERRY_BUTTON, Rarity.COMMON), - CHERRY_BOAT(Material.CHERRY_BOAT, Rarity.COMMON), - CHERRY_CHEST_BOAT(Material.CHERRY_CHEST_BOAT, Rarity.COMMON), - CHERRY_SIGN(Material.CHERRY_SIGN, Rarity.COMMON), - CHERRY_HANGING_SIGN(Material.CHERRY_HANGING_SIGN, Rarity.COMMON), - - MANGROVE_PLANKS(Material.MANGROVE_PLANKS, Rarity.COMMON), - MANGROVE_LOG(Material.MANGROVE_LOG, Rarity.COMMON), - STRIPPED_MANGROVE_LOG(Material.STRIPPED_MANGROVE_LOG, Rarity.COMMON), - MANGROVE_WOOD(Material.MANGROVE_WOOD, Rarity.COMMON), - STRIPPED_MANGROVE_WOOD(Material.STRIPPED_MANGROVE_WOOD, Rarity.COMMON), - MANGROVE_SLAB(Material.MANGROVE_SLAB, Rarity.COMMON), - MANGROVE_STAIRS(Material.MANGROVE_STAIRS, Rarity.COMMON), - MANGROVE_FENCE(Material.MANGROVE_FENCE, Rarity.COMMON), - MANGROVE_FENCE_GATE(Material.MANGROVE_FENCE_GATE, Rarity.COMMON), - MANGROVE_DOOR(Material.MANGROVE_DOOR, Rarity.COMMON), - MANGROVE_TRAPDOOR(Material.MANGROVE_TRAPDOOR, Rarity.COMMON), - MANGROVE_PRESSURE_PLATE(Material.MANGROVE_PRESSURE_PLATE, Rarity.COMMON), - MANGROVE_BUTTON(Material.MANGROVE_BUTTON, Rarity.COMMON), - MANGROVE_BOAT(Material.MANGROVE_BOAT, Rarity.COMMON), - MANGROVE_CHEST_BOAT(Material.MANGROVE_CHEST_BOAT, Rarity.COMMON), - MANGROVE_SIGN(Material.MANGROVE_SIGN, Rarity.COMMON), - MANGROVE_HANGING_SIGN(Material.MANGROVE_HANGING_SIGN, Rarity.COMMON), - - PALE_OAK_LOG(Material.PALE_OAK_LOG, Rarity.COMMON), - STRIPPED_PALE_OAK_LOG(Material.STRIPPED_PALE_OAK_LOG, Rarity.COMMON), - PALE_OAK_WOOD(Material.PALE_OAK_WOOD, Rarity.COMMON), - STRIPPED_PALE_OAK_WOOD(Material.STRIPPED_PALE_OAK_WOOD, Rarity.COMMON), - PALE_OAK_PLANKS(Material.PALE_OAK_PLANKS, Rarity.COMMON), - PALE_OAK_SLAB(Material.PALE_OAK_SLAB, Rarity.COMMON), - PALE_OAK_STAIRS(Material.PALE_OAK_STAIRS, Rarity.COMMON), - PALE_OAK_FENCE(Material.PALE_OAK_FENCE, Rarity.COMMON), - PALE_OAK_FENCE_GATE(Material.PALE_OAK_FENCE_GATE, Rarity.COMMON), - PALE_OAK_DOOR(Material.PALE_OAK_DOOR, Rarity.COMMON), - PALE_OAK_TRAPDOOR(Material.PALE_OAK_TRAPDOOR, Rarity.COMMON), - PALE_OAK_PRESSURE_PLATE(Material.PALE_OAK_PRESSURE_PLATE, Rarity.COMMON), - PALE_OAK_BUTTON(Material.PALE_OAK_BUTTON, Rarity.COMMON), - PALE_OAK_BOAT(Material.PALE_OAK_BOAT, Rarity.COMMON), - PALE_OAK_CHEST_BOAT(Material.PALE_OAK_CHEST_BOAT, Rarity.COMMON), - PALE_OAK_SIGN(Material.PALE_OAK_SIGN, Rarity.COMMON), - PALE_OAK_HANGING_SIGN(Material.PALE_OAK_HANGING_SIGN, Rarity.COMMON), - - BIRCH_LOG(Material.BIRCH_LOG, Rarity.COMMON), - STRIPPED_BIRCH_LOG(Material.STRIPPED_BIRCH_LOG, Rarity.COMMON), - BIRCH_WOOD(Material.BIRCH_WOOD, Rarity.COMMON), - STRIPPED_BIRCH_WOOD(Material.STRIPPED_BIRCH_WOOD, Rarity.COMMON), - BIRCH_PLANKS(Material.BIRCH_PLANKS, Rarity.COMMON), - BIRCH_SLAB(Material.BIRCH_SLAB, Rarity.COMMON), - BIRCH_STAIRS(Material.BIRCH_STAIRS, Rarity.COMMON), - BIRCH_FENCE(Material.BIRCH_FENCE, Rarity.COMMON), - BIRCH_FENCE_GATE(Material.BIRCH_FENCE_GATE, Rarity.COMMON), - BIRCH_DOOR(Material.BIRCH_DOOR, Rarity.COMMON), - BIRCH_TRAPDOOR(Material.BIRCH_TRAPDOOR, Rarity.COMMON), - BIRCH_PRESSURE_PLATE(Material.BIRCH_PRESSURE_PLATE, Rarity.COMMON), - BIRCH_BUTTON(Material.BIRCH_BUTTON, Rarity.COMMON), - BIRCH_BOAT(Material.BIRCH_BOAT, Rarity.COMMON), - BIRCH_CHEST_BOAT(Material.BIRCH_CHEST_BOAT, Rarity.COMMON), - BIRCH_SIGN(Material.BIRCH_SIGN, Rarity.COMMON), - BIRCH_HANGING_SIGN(Material.BIRCH_HANGING_SIGN, Rarity.COMMON), - - DARK_OAK_LOG(Material.DARK_OAK_LOG, Rarity.COMMON), - STRIPPED_DARK_OAK_LOG(Material.STRIPPED_DARK_OAK_LOG, Rarity.COMMON), - DARK_OAK_WOOD(Material.DARK_OAK_WOOD, Rarity.COMMON), - STRIPPED_DARK_OAK_WOOD(Material.STRIPPED_DARK_OAK_WOOD, Rarity.COMMON), - DARK_OAK_PLANKS(Material.DARK_OAK_PLANKS, Rarity.COMMON), - DARK_OAK_SLAB(Material.DARK_OAK_SLAB, Rarity.COMMON), - DARK_OAK_STAIRS(Material.DARK_OAK_STAIRS, Rarity.COMMON), - DARK_OAK_FENCE(Material.DARK_OAK_FENCE, Rarity.COMMON), - DARK_OAK_FENCE_GATE(Material.DARK_OAK_FENCE_GATE, Rarity.COMMON), - DARK_OAK_DOOR(Material.DARK_OAK_DOOR, Rarity.COMMON), - DARK_OAK_TRAPDOOR(Material.DARK_OAK_TRAPDOOR, Rarity.COMMON), - DARK_OAK_PRESSURE_PLATE(Material.DARK_OAK_PRESSURE_PLATE, Rarity.COMMON), - DARK_OAK_BUTTON(Material.DARK_OAK_BUTTON, Rarity.COMMON), - DARK_OAK_BOAT(Material.DARK_OAK_BOAT, Rarity.COMMON), - DARK_OAK_CHEST_BOAT(Material.DARK_OAK_CHEST_BOAT, Rarity.COMMON), - DARK_OAK_SIGN(Material.DARK_OAK_SIGN, Rarity.COMMON), - DARK_OAK_HANGING_SIGN(Material.DARK_OAK_HANGING_SIGN, Rarity.COMMON), - - JUNGLE_LOG(Material.JUNGLE_LOG, Rarity.COMMON), - STRIPPED_JUNGLE_LOG(Material.STRIPPED_JUNGLE_LOG, Rarity.COMMON), - JUNGLE_WOOD(Material.JUNGLE_WOOD, Rarity.COMMON), - STRIPPED_JUNGLE_WOOD(Material.STRIPPED_JUNGLE_WOOD, Rarity.COMMON), - JUNGLE_PLANKS(Material.JUNGLE_PLANKS, Rarity.COMMON), - JUNGLE_SLAB(Material.JUNGLE_SLAB, Rarity.COMMON), - JUNGLE_STAIRS(Material.JUNGLE_STAIRS, Rarity.COMMON), - JUNGLE_FENCE(Material.JUNGLE_FENCE, Rarity.COMMON), - JUNGLE_FENCE_GATE(Material.JUNGLE_FENCE_GATE, Rarity.COMMON), - JUNGLE_DOOR(Material.JUNGLE_DOOR, Rarity.COMMON), - JUNGLE_TRAPDOOR(Material.JUNGLE_TRAPDOOR, Rarity.COMMON), - JUNGLE_PRESSURE_PLATE(Material.JUNGLE_PRESSURE_PLATE, Rarity.COMMON), - JUNGLE_BUTTON(Material.JUNGLE_BUTTON, Rarity.COMMON), - JUNGLE_BOAT(Material.JUNGLE_BOAT, Rarity.COMMON), - JUNGLE_CHEST_BOAT(Material.JUNGLE_CHEST_BOAT, Rarity.COMMON), - JUNGLE_SIGN(Material.JUNGLE_SIGN, Rarity.COMMON), - JUNGLE_HANGING_SIGN(Material.JUNGLE_HANGING_SIGN, Rarity.COMMON), - - SPRUCE_LOG(Material.SPRUCE_LOG, Rarity.COMMON), - STRIPPED_SPRUCE_LOG(Material.STRIPPED_SPRUCE_LOG, Rarity.COMMON), - SPRUCE_WOOD(Material.SPRUCE_WOOD, Rarity.COMMON), - STRIPPED_SPRUCE_WOOD(Material.STRIPPED_SPRUCE_WOOD, Rarity.COMMON), - SPRUCE_PLANKS(Material.SPRUCE_PLANKS, Rarity.COMMON), - SPRUCE_SLAB(Material.SPRUCE_SLAB, Rarity.COMMON), - SPRUCE_STAIRS(Material.SPRUCE_STAIRS, Rarity.COMMON), - SPRUCE_FENCE(Material.SPRUCE_FENCE, Rarity.COMMON), - SPRUCE_FENCE_GATE(Material.SPRUCE_FENCE_GATE, Rarity.COMMON), - SPRUCE_DOOR(Material.SPRUCE_DOOR, Rarity.COMMON), - SPRUCE_TRAPDOOR(Material.SPRUCE_TRAPDOOR, Rarity.COMMON), - SPRUCE_PRESSURE_PLATE(Material.SPRUCE_PRESSURE_PLATE, Rarity.COMMON), - SPRUCE_BUTTON(Material.SPRUCE_BUTTON, Rarity.COMMON), - SPRUCE_BOAT(Material.SPRUCE_BOAT, Rarity.COMMON), - SPRUCE_CHEST_BOAT(Material.SPRUCE_CHEST_BOAT, Rarity.COMMON), - SPRUCE_SIGN(Material.SPRUCE_SIGN, Rarity.COMMON), - SPRUCE_HANGING_SIGN(Material.SPRUCE_HANGING_SIGN, Rarity.COMMON), - - BAMBOO_BLOCK(Material.BAMBOO_BLOCK, Rarity.COMMON), - STRIPPED_BAMBOO_BLOCK(Material.STRIPPED_BAMBOO_BLOCK, Rarity.COMMON), - BAMBOO_PLANKS(Material.BAMBOO_PLANKS, Rarity.COMMON), - BAMBOO_MOSAIC(Material.BAMBOO_MOSAIC, Rarity.COMMON), - BAMBOO_SLAB(Material.BAMBOO_SLAB, Rarity.COMMON), - BAMBOO_MOSAIC_SLAB(Material.BAMBOO_MOSAIC_SLAB, Rarity.COMMON), - BAMBOO_STAIRS(Material.BAMBOO_STAIRS, Rarity.COMMON), - BAMBOO_MOSAIC_STAIRS(Material.BAMBOO_MOSAIC_STAIRS, Rarity.COMMON), - BAMBOO_FENCE(Material.BAMBOO_FENCE, Rarity.COMMON), - BAMBOO_FENCE_GATE(Material.BAMBOO_FENCE_GATE, Rarity.COMMON), - BAMBOO_DOOR(Material.BAMBOO_DOOR, Rarity.COMMON), - BAMBOO_TRAPDOOR(Material.BAMBOO_TRAPDOOR, Rarity.COMMON), - BAMBOO_PRESSURE_PLATE(Material.BAMBOO_PRESSURE_PLATE, Rarity.COMMON), - BAMBOO_BUTTON(Material.BAMBOO_BUTTON, Rarity.COMMON), - BAMBOO_RAFT(Material.BAMBOO_RAFT, Rarity.COMMON), - BAMBOO_CHEST_RAFT(Material.BAMBOO_CHEST_RAFT, Rarity.COMMON), - BAMBOO_SIGN(Material.BAMBOO_SIGN, Rarity.COMMON), - BAMBOO_HANGING_SIGN(Material.BAMBOO_HANGING_SIGN, Rarity.COMMON), - - WARPED_STEM(Material.WARPED_STEM, Rarity.COMMON), - STRIPPED_WARPED_STEM(Material.STRIPPED_WARPED_STEM, Rarity.COMMON), - WARPED_HYPHAE(Material.WARPED_HYPHAE, Rarity.COMMON), - STRIPPED_WARPED_HYPHAE(Material.STRIPPED_WARPED_HYPHAE, Rarity.COMMON), - WARPED_PLANKS(Material.WARPED_PLANKS, Rarity.COMMON), - WARPED_SLAB(Material.WARPED_SLAB, Rarity.COMMON), - WARPED_STAIRS(Material.WARPED_STAIRS, Rarity.COMMON), - WARPED_FENCE(Material.WARPED_FENCE, Rarity.COMMON), - WARPED_FENCE_GATE(Material.WARPED_FENCE_GATE, Rarity.COMMON), - WARPED_DOOR(Material.WARPED_DOOR, Rarity.COMMON), - WARPED_TRAPDOOR(Material.WARPED_TRAPDOOR, Rarity.COMMON), - WARPED_PRESSURE_PLATE(Material.WARPED_PRESSURE_PLATE, Rarity.COMMON), - WARPED_BUTTON(Material.WARPED_BUTTON, Rarity.COMMON), - WARPED_SIGN(Material.WARPED_SIGN, Rarity.COMMON), - WARPED_HANGING_SIGN(Material.WARPED_HANGING_SIGN, Rarity.COMMON), - - CRIMSON_STEM(Material.CRIMSON_STEM, Rarity.COMMON), - STRIPPED_CRIMSON_STEM(Material.STRIPPED_CRIMSON_STEM, Rarity.COMMON), - CRIMSON_HYPHAE(Material.CRIMSON_HYPHAE, Rarity.COMMON), - STRIPPED_CRIMSON_HYPHAE(Material.STRIPPED_CRIMSON_HYPHAE, Rarity.COMMON), - CRIMSON_PLANKS(Material.CRIMSON_PLANKS, Rarity.COMMON), - CRIMSON_SLAB(Material.CRIMSON_SLAB, Rarity.COMMON), - CRIMSON_STAIRS(Material.CRIMSON_STAIRS, Rarity.COMMON), - CRIMSON_FENCE(Material.CRIMSON_FENCE, Rarity.COMMON), - CRIMSON_FENCE_GATE(Material.CRIMSON_FENCE_GATE, Rarity.COMMON), - CRIMSON_DOOR(Material.CRIMSON_DOOR, Rarity.COMMON), - CRIMSON_TRAPDOOR(Material.CRIMSON_TRAPDOOR, Rarity.COMMON), - CRIMSON_PRESSURE_PLATE(Material.CRIMSON_PRESSURE_PLATE, Rarity.COMMON), - CRIMSON_BUTTON(Material.CRIMSON_BUTTON, Rarity.COMMON), - CRIMSON_SIGN(Material.CRIMSON_SIGN, Rarity.COMMON), - CRIMSON_HANGING_SIGN(Material.CRIMSON_HANGING_SIGN, Rarity.COMMON), - - CHAIN(Material.IRON_CHAIN, Rarity.COMMON), - LADDER(Material.LADDER, Rarity.COMMON), - STONE(Material.STONE, Rarity.COMMON), - STONE_SLAB(Material.STONE_SLAB, Rarity.COMMON), - STONE_STAIRS(Material.STONE_STAIRS, Rarity.COMMON), - SMOOTH_STONE_SLAB(Material.SMOOTH_STONE_SLAB, Rarity.COMMON), - GRANITE(Material.GRANITE, Rarity.COMMON), - GRANITE_SLAB(Material.GRANITE_SLAB, Rarity.COMMON), - GRANITE_STAIRS(Material.GRANITE_STAIRS, Rarity.COMMON), - GRANITE_WALL(Material.GRANITE_WALL, Rarity.COMMON), - POLISHED_GRANITE(Material.POLISHED_GRANITE, Rarity.COMMON), - POLISHED_GRANITE_SLAB(Material.POLISHED_GRANITE_SLAB, Rarity.COMMON), - POLISHED_GRANITE_STAIRS(Material.POLISHED_GRANITE_STAIRS, Rarity.COMMON), - DIORITE(Material.DIORITE, Rarity.COMMON), - DIORITE_SLAB(Material.DIORITE_SLAB, Rarity.COMMON), - DIORITE_STAIRS(Material.DIORITE_STAIRS, Rarity.COMMON), - DIORITE_WALL(Material.DIORITE_WALL, Rarity.COMMON), - POLISHED_DIORITE(Material.POLISHED_DIORITE, Rarity.COMMON), - POLISHED_DIORITE_SLAB(Material.POLISHED_DIORITE_SLAB, Rarity.COMMON), - POLISHED_DIORITE_STAIRS(Material.POLISHED_DIORITE_STAIRS, Rarity.COMMON), - ANDESITE(Material.ANDESITE, Rarity.COMMON), - ANDESITE_SLAB(Material.ANDESITE_SLAB, Rarity.COMMON), - ANDESITE_STAIRS(Material.ANDESITE_STAIRS, Rarity.COMMON), - ANDESITE_WALL(Material.ANDESITE_WALL, Rarity.COMMON), - POLISHED_ANDESITE(Material.POLISHED_ANDESITE, Rarity.COMMON), - POLISHED_ANDESITE_SLAB(Material.POLISHED_ANDESITE_SLAB, Rarity.COMMON), - POLISHED_ANDESITE_STAIRS(Material.POLISHED_ANDESITE_STAIRS, Rarity.COMMON), - COBBLESTONE(Material.COBBLESTONE, Rarity.COMMON), - COBBLESTONE_SLAB(Material.COBBLESTONE_SLAB, Rarity.COMMON), - COBBLESTONE_STAIRS(Material.COBBLESTONE_STAIRS, Rarity.COMMON), - COBBLESTONE_WALL(Material.COBBLESTONE_WALL, Rarity.COMMON), - SANDSTONE(Material.SANDSTONE, Rarity.COMMON), - SANDSTONE_SLAB(Material.SANDSTONE_SLAB, Rarity.COMMON), - SANDSTONE_WALL(Material.SANDSTONE_WALL, Rarity.COMMON), - CUT_SANDSTONE(Material.CUT_SANDSTONE, Rarity.COMMON), - CUT_SANDSTONE_SLAB(Material.CUT_SANDSTONE_SLAB, Rarity.COMMON), - CHISELED_SANDSTONE(Material.CHISELED_SANDSTONE, Rarity.COMMON), - RED_SANDSTONE(Material.RED_SANDSTONE, Rarity.COMMON), - RED_SANDSTONE_SLAB(Material.RED_SANDSTONE_SLAB, Rarity.COMMON), - RED_SANDSTONE_STAIRS(Material.RED_SANDSTONE_STAIRS, Rarity.COMMON), - RED_SANDSTONE_WALL(Material.RED_SANDSTONE_WALL, Rarity.COMMON), - CUT_RED_SANDSTONE(Material.CUT_RED_SANDSTONE, Rarity.COMMON), - CUT_RED_SANDSTONE_SLAB(Material.CUT_RED_SANDSTONE_SLAB, Rarity.COMMON), - CHISELED_RED_SANDSTONE(Material.CHISELED_RED_SANDSTONE, Rarity.COMMON), - STONE_BRICKS(Material.STONE_BRICKS, Rarity.COMMON), - STONE_BRICK_SLAB(Material.STONE_BRICK_SLAB, Rarity.COMMON), - STONE_BRICK_STAIRS(Material.STONE_BRICK_STAIRS, Rarity.COMMON), - STONE_BRICK_WALL(Material.STONE_BRICK_WALL, Rarity.COMMON), - MOSSY_COBBLESTONE(Material.MOSSY_COBBLESTONE, Rarity.COMMON), - MOSSY_COBBLESTONE_SLAB(Material.MOSSY_COBBLESTONE_SLAB, Rarity.COMMON), - MOSSY_COBBLESTONE_STAIRS(Material.MOSSY_COBBLESTONE_STAIRS, Rarity.COMMON), - MOSSY_COBBLESTONE_WALL(Material.MOSSY_COBBLESTONE_WALL, Rarity.COMMON), - MOSSY_STONE_BRICKS(Material.MOSSY_STONE_BRICKS, Rarity.COMMON), - MOSSY_STONE_BRICK_SLAB(Material.MOSSY_STONE_BRICK_SLAB, Rarity.COMMON), - MOSSY_STONE_BRICK_STAIRS(Material.MOSSY_STONE_BRICK_STAIRS, Rarity.COMMON), - MOSSY_STONE_BRICK_WALL(Material.MOSSY_STONE_BRICK_WALL, Rarity.COMMON), - QUARTZ_BLOCK(Material.QUARTZ_BLOCK, Rarity.COMMON), - QUARTZ_SLAB(Material.QUARTZ_SLAB, Rarity.COMMON), - QUARTZ_STAIRS(Material.QUARTZ_STAIRS, Rarity.COMMON), - QUARTZ_PILLAR(Material.QUARTZ_PILLAR, Rarity.COMMON), - CHISELED_QUARTZ_BLOCK(Material.CHISELED_QUARTZ_BLOCK, Rarity.COMMON), - NETHER_BRICK_SLAB(Material.NETHER_BRICK_SLAB, Rarity.COMMON), - NETHER_BRICK_STAIRS(Material.NETHER_BRICK_STAIRS, Rarity.COMMON), - NETHER_BRICK_WALL(Material.NETHER_BRICK_WALL, Rarity.COMMON), - NETHER_BRICK_FENCE(Material.NETHER_BRICK_FENCE, Rarity.COMMON), - HONEYCOMB(Material.HONEYCOMB, Rarity.COMMON), - - WHITE_DYE(Material.WHITE_DYE, Rarity.COMMON), - ORANGE_DYE(Material.ORANGE_DYE, Rarity.COMMON), - MAGENTA_DYE(Material.MAGENTA_DYE, Rarity.COMMON), - LIGHT_BLUE_DYE(Material.LIGHT_BLUE_DYE, Rarity.COMMON), - YELLOW_DYE(Material.YELLOW_DYE, Rarity.COMMON), - LIME_DYE(Material.LIME_DYE, Rarity.COMMON), - PINK_DYE(Material.PINK_DYE, Rarity.COMMON), - GRAY_DYE(Material.GRAY_DYE, Rarity.COMMON), - LIGHT_GRAY_DYE(Material.LIGHT_GRAY_DYE, Rarity.COMMON), - CYAN_DYE(Material.CYAN_DYE, Rarity.COMMON), - PURPLE_DYE(Material.PURPLE_DYE, Rarity.COMMON), - BLUE_DYE(Material.BLUE_DYE, Rarity.COMMON), - BROWN_DYE(Material.BROWN_DYE, Rarity.COMMON), - RED_DYE(Material.RED_DYE, Rarity.COMMON), - BLACK_DYE(Material.BLACK_DYE, Rarity.COMMON), - GREEN_DYE(Material.GREEN_DYE, Rarity.COMMON), - - WHITE_WOOL(Material.WHITE_WOOL, Rarity.COMMON), - ORANGE_WOOL(Material.ORANGE_WOOL, Rarity.COMMON), - MAGENTA_WOOL(Material.MAGENTA_WOOL, Rarity.COMMON), - LIGHT_BLUE_WOOL(Material.LIGHT_BLUE_WOOL, Rarity.COMMON), - YELLOW_WOOL(Material.YELLOW_WOOL, Rarity.COMMON), - LIME_WOOL(Material.LIME_WOOL, Rarity.COMMON), - PINK_WOOL(Material.PINK_WOOL, Rarity.COMMON), - GRAY_WOOL(Material.GRAY_WOOL, Rarity.COMMON), - LIGHT_GRAY_WOOL(Material.LIGHT_GRAY_WOOL, Rarity.COMMON), - CYAN_WOOL(Material.CYAN_WOOL, Rarity.COMMON), - PURPLE_WOOL(Material.PURPLE_WOOL, Rarity.COMMON), - BLUE_WOOL(Material.BLUE_WOOL, Rarity.COMMON), - BROWN_WOOL(Material.BROWN_WOOL, Rarity.COMMON), - GREEN_WOOL(Material.GREEN_WOOL, Rarity.COMMON), - RED_WOOL(Material.RED_WOOL, Rarity.COMMON), - BLACK_WOOL(Material.BLACK_WOOL, Rarity.COMMON), - - WHITE_CARPET(Material.WHITE_CARPET, Rarity.COMMON), - ORANGE_CARPET(Material.ORANGE_CARPET, Rarity.COMMON), - MAGENTA_CARPET(Material.MAGENTA_CARPET, Rarity.COMMON), - LIGHT_BLUE_CARPET(Material.LIGHT_BLUE_CARPET, Rarity.COMMON), - YELLOW_CARPET(Material.YELLOW_CARPET, Rarity.COMMON), - LIME_CARPET(Material.LIME_CARPET, Rarity.COMMON), - PINK_CARPET(Material.PINK_CARPET, Rarity.COMMON), - GRAY_CARPET(Material.GRAY_CARPET, Rarity.COMMON), - LIGHT_GRAY_CARPET(Material.LIGHT_GRAY_CARPET, Rarity.COMMON), - CYAN_CARPET(Material.CYAN_CARPET, Rarity.COMMON), - PURPLE_CARPET(Material.PURPLE_CARPET, Rarity.COMMON), - BLUE_CARPET(Material.BLUE_CARPET, Rarity.COMMON), - BROWN_CARPET(Material.BROWN_CARPET, Rarity.COMMON), - GREEN_CARPET(Material.GREEN_CARPET, Rarity.COMMON), - RED_CARPET(Material.RED_CARPET, Rarity.COMMON), - BLACK_CARPET(Material.BLACK_CARPET, Rarity.COMMON), - - WHITE_BED(Material.WHITE_BED, Rarity.COMMON), - ORANGE_BED(Material.ORANGE_BED, Rarity.COMMON), - MAGENTA_BED(Material.MAGENTA_BED, Rarity.COMMON), - LIGHT_BLUE_BED(Material.LIGHT_BLUE_BED, Rarity.COMMON), - YELLOW_BED(Material.YELLOW_BED, Rarity.COMMON), - LIME_BED(Material.LIME_BED, Rarity.COMMON), - PINK_BED(Material.PINK_BED, Rarity.COMMON), - GRAY_BED(Material.GRAY_BED, Rarity.COMMON), - LIGHT_GRAY_BED(Material.LIGHT_GRAY_BED, Rarity.COMMON), - CYAN_BED(Material.CYAN_BED, Rarity.COMMON), - PURPLE_BED(Material.PURPLE_BED, Rarity.COMMON), - BLUE_BED(Material.BLUE_BED, Rarity.COMMON), - BROWN_BED(Material.BROWN_BED, Rarity.COMMON), - GREEN_BED(Material.GREEN_BED, Rarity.COMMON), - RED_BED(Material.RED_BED, Rarity.COMMON), - BLACK_BED(Material.BLACK_BED, Rarity.COMMON), - - WHITE_BANNER(Material.WHITE_BANNER, Rarity.COMMON), - ORANGE_BANNER(Material.ORANGE_BANNER, Rarity.COMMON), - MAGENTA_BANNER(Material.MAGENTA_BANNER, Rarity.COMMON), - LIGHT_BLUE_BANNER(Material.LIGHT_BLUE_BANNER, Rarity.COMMON), - YELLOW_BANNER(Material.YELLOW_BANNER, Rarity.COMMON), - LIME_BANNER(Material.LIME_BANNER, Rarity.COMMON), - PINK_BANNER(Material.PINK_BANNER, Rarity.COMMON), - GRAY_BANNER(Material.GRAY_BANNER, Rarity.COMMON), - LIGHT_GRAY_BANNER(Material.LIGHT_GRAY_BANNER, Rarity.COMMON), - CYAN_BANNER(Material.CYAN_BANNER, Rarity.COMMON), - PURPLE_BANNER(Material.PURPLE_BANNER, Rarity.COMMON), - BLUE_BANNER(Material.BLUE_BANNER, Rarity.COMMON), - BROWN_BANNER(Material.BROWN_BANNER, Rarity.COMMON), - GREEN_BANNER(Material.GREEN_BANNER, Rarity.COMMON), - RED_BANNER(Material.RED_BANNER, Rarity.COMMON), - BLACK_BANNER(Material.BLACK_BANNER, Rarity.COMMON), - - CANDLE(Material.CANDLE, Rarity.COMMON), - WHITE_CANDLE(Material.WHITE_CANDLE, Rarity.COMMON), - ORANGE_CANDLE(Material.ORANGE_CANDLE, Rarity.COMMON), - MAGENTA_CANDLE(Material.MAGENTA_CANDLE, Rarity.COMMON), - LIGHT_BLUE_CANDLE(Material.LIGHT_BLUE_CANDLE, Rarity.COMMON), - YELLOW_CANDLE(Material.YELLOW_CANDLE, Rarity.COMMON), - LIME_CANDLE(Material.LIME_CANDLE, Rarity.COMMON), - PINK_CANDLE(Material.PINK_CANDLE, Rarity.COMMON), - GRAY_CANDLE(Material.GRAY_CANDLE, Rarity.COMMON), - LIGHT_GRAY_CANDLE(Material.LIGHT_GRAY_CANDLE, Rarity.COMMON), - CYAN_CANDLE(Material.CYAN_CANDLE, Rarity.COMMON), - PURPLE_CANDLE(Material.PURPLE_CANDLE, Rarity.COMMON), - BLUE_CANDLE(Material.BLUE_CANDLE, Rarity.COMMON), - BROWN_CANDLE(Material.BROWN_CANDLE, Rarity.COMMON), - GREEN_CANDLE(Material.GREEN_CANDLE, Rarity.COMMON), - RED_CANDLE(Material.RED_CANDLE, Rarity.COMMON), - BLACK_CANDLE(Material.BLACK_CANDLE, Rarity.COMMON), - - GLASS(Material.GLASS, Rarity.COMMON), - WHITE_STAINED_GLASS(Material.WHITE_STAINED_GLASS, Rarity.COMMON), - ORANGE_STAINED_GLASS(Material.ORANGE_STAINED_GLASS, Rarity.COMMON), - MAGENTA_STAINED_GLASS(Material.MAGENTA_STAINED_GLASS, Rarity.COMMON), - LIGHT_BLUE_STAINED_GLASS(Material.LIGHT_BLUE_STAINED_GLASS, Rarity.COMMON), - YELLOW_STAINED_GLASS(Material.YELLOW_STAINED_GLASS, Rarity.COMMON), - LIME_STAINED_GLASS(Material.LIME_STAINED_GLASS, Rarity.COMMON), - PINK_STAINED_GLASS(Material.PINK_STAINED_GLASS, Rarity.COMMON), - GRAY_STAINED_GLASS(Material.GRAY_STAINED_GLASS, Rarity.COMMON), - LIGHT_GRAY_STAINED_GLASS(Material.LIGHT_GRAY_STAINED_GLASS, Rarity.COMMON), - CYAN_STAINED_GLASS(Material.CYAN_STAINED_GLASS, Rarity.COMMON), - PURPLE_STAINED_GLASS(Material.PURPLE_STAINED_GLASS, Rarity.COMMON), - BLUE_STAINED_GLASS(Material.BLUE_STAINED_GLASS, Rarity.COMMON), - BROWN_STAINED_GLASS(Material.BROWN_STAINED_GLASS, Rarity.COMMON), - GREEN_STAINED_GLASS(Material.GREEN_STAINED_GLASS, Rarity.COMMON), - RED_STAINED_GLASS(Material.RED_STAINED_GLASS, Rarity.COMMON), - BLACK_STAINED_GLASS(Material.BLACK_STAINED_GLASS, Rarity.COMMON), - - GLASS_PANE(Material.GLASS_PANE, Rarity.COMMON), - WHITE_STAINED_GLASS_PANE(Material.WHITE_STAINED_GLASS_PANE, Rarity.COMMON), - ORANGE_STAINED_GLASS_PANE(Material.ORANGE_STAINED_GLASS_PANE, Rarity.COMMON), - MAGENTA_STAINED_GLASS_PANE(Material.MAGENTA_STAINED_GLASS_PANE, Rarity.COMMON), - LIGHT_BLUE_STAINED_GLASS_PANE(Material.LIGHT_BLUE_STAINED_GLASS_PANE, Rarity.COMMON), - YELLOW_STAINED_GLASS_PANE(Material.YELLOW_STAINED_GLASS_PANE, Rarity.COMMON), - LIME_STAINED_GLASS_PANE(Material.LIME_STAINED_GLASS_PANE, Rarity.COMMON), - PINK_STAINED_GLASS_PANE(Material.PINK_STAINED_GLASS_PANE, Rarity.COMMON), - GRAY_STAINED_GLASS_PANE(Material.GRAY_STAINED_GLASS_PANE, Rarity.COMMON), - LIGHT_GRAY_STAINED_GLASS_PANE(Material.LIGHT_GRAY_STAINED_GLASS_PANE, Rarity.COMMON), - CYAN_STAINED_GLASS_PANE(Material.CYAN_STAINED_GLASS_PANE, Rarity.COMMON), - PURPLE_STAINED_GLASS_PANE(Material.PURPLE_STAINED_GLASS_PANE, Rarity.COMMON), - BLUE_STAINED_GLASS_PANE(Material.BLUE_STAINED_GLASS_PANE, Rarity.COMMON), - BROWN_STAINED_GLASS_PANE(Material.BROWN_STAINED_GLASS_PANE, Rarity.COMMON), - GREEN_STAINED_GLASS_PANE(Material.GREEN_STAINED_GLASS_PANE, Rarity.COMMON), - RED_STAINED_GLASS_PANE(Material.RED_STAINED_GLASS_PANE, Rarity.COMMON), - BLACK_STAINED_GLASS_PANE(Material.BLACK_STAINED_GLASS_PANE, Rarity.COMMON), - - TERRACOTTA(Material.TERRACOTTA, Rarity.COMMON), - WHITE_TERRACOTTA(Material.WHITE_TERRACOTTA, Rarity.COMMON), - ORANGE_TERRACOTTA(Material.ORANGE_TERRACOTTA, Rarity.COMMON), - MAGENTA_TERRACOTTA(Material.MAGENTA_TERRACOTTA, Rarity.COMMON), - LIGHT_BLUE_TERRACOTTA(Material.LIGHT_BLUE_TERRACOTTA, Rarity.COMMON), - YELLOW_TERRACOTTA(Material.YELLOW_TERRACOTTA, Rarity.COMMON), - LIME_TERRACOTTA(Material.LIME_TERRACOTTA, Rarity.COMMON), - PINK_TERRACOTTA(Material.PINK_TERRACOTTA, Rarity.COMMON), - GRAY_TERRACOTTA(Material.GRAY_TERRACOTTA, Rarity.COMMON), - LIGHT_GRAY_TERRACOTTA(Material.LIGHT_GRAY_TERRACOTTA, Rarity.COMMON), - CYAN_TERRACOTTA(Material.CYAN_TERRACOTTA, Rarity.COMMON), - PURPLE_TERRACOTTA(Material.PURPLE_TERRACOTTA, Rarity.COMMON), - BLUE_TERRACOTTA(Material.BLUE_TERRACOTTA, Rarity.COMMON), - BROWN_TERRACOTTA(Material.BROWN_TERRACOTTA, Rarity.COMMON), - GREEN_TERRACOTTA(Material.GREEN_TERRACOTTA, Rarity.COMMON), - RED_TERRACOTTA(Material.RED_TERRACOTTA, Rarity.COMMON), - BLACK_TERRACOTTA(Material.BLACK_TERRACOTTA, Rarity.COMMON), - - WHITE_GLAZED_TERRACOTTA(Material.WHITE_GLAZED_TERRACOTTA, Rarity.COMMON), - ORANGE_GLAZED_TERRACOTTA(Material.ORANGE_GLAZED_TERRACOTTA, Rarity.COMMON), - MAGENTA_GLAZED_TERRACOTTA(Material.MAGENTA_GLAZED_TERRACOTTA, Rarity.COMMON), - LIGHT_BLUE_GLAZED_TERRACOTTA(Material.LIGHT_BLUE_GLAZED_TERRACOTTA, Rarity.COMMON), - YELLOW_GLAZED_TERRACOTTA(Material.YELLOW_GLAZED_TERRACOTTA, Rarity.COMMON), - LIME_GLAZED_TERRACOTTA(Material.LIME_GLAZED_TERRACOTTA, Rarity.COMMON), - PINK_GLAZED_TERRACOTTA(Material.PINK_GLAZED_TERRACOTTA, Rarity.COMMON), - GRAY_GLAZED_TERRACOTTA(Material.GRAY_GLAZED_TERRACOTTA, Rarity.COMMON), - LIGHT_GRAY_GLAZED_TERRACOTTA(Material.LIGHT_GRAY_GLAZED_TERRACOTTA, Rarity.COMMON), - CYAN_GLAZED_TERRACOTTA(Material.CYAN_GLAZED_TERRACOTTA, Rarity.COMMON), - PURPLE_GLAZED_TERRACOTTA(Material.PURPLE_GLAZED_TERRACOTTA, Rarity.COMMON), - BLUE_GLAZED_TERRACOTTA(Material.BLUE_GLAZED_TERRACOTTA, Rarity.COMMON), - BROWN_GLAZED_TERRACOTTA(Material.BROWN_GLAZED_TERRACOTTA, Rarity.COMMON), - GREEN_GLAZED_TERRACOTTA(Material.GREEN_GLAZED_TERRACOTTA, Rarity.COMMON), - RED_GLAZED_TERRACOTTA(Material.RED_GLAZED_TERRACOTTA, Rarity.COMMON), - BLACK_GLAZED_TERRACOTTA(Material.BLACK_GLAZED_TERRACOTTA, Rarity.COMMON), - - WITHER_ROSE(Material.WITHER_ROSE, Rarity.COMMON), - CORNFLOWER(Material.CORNFLOWER, Rarity.COMMON), - LILY_OF_THE_VALLEY(Material.LILY_OF_THE_VALLEY, Rarity.COMMON), - SUNFLOWER(Material.SUNFLOWER, Rarity.COMMON), - BEETROOT(Material.BEETROOT, Rarity.COMMON), - RED_TULIP(Material.RED_TULIP, Rarity.COMMON), - ORANGE_TULIP(Material.ORANGE_TULIP, Rarity.COMMON), - PINK_TULIP(Material.PINK_TULIP, Rarity.COMMON), - WHITE_TULIP(Material.WHITE_TULIP, Rarity.COMMON), - ROSE_BUSH(Material.ROSE_BUSH, Rarity.COMMON), - TORCHFLOWER(Material.TORCHFLOWER, Rarity.COMMON), - PITCHER_PLANT(Material.PITCHER_PLANT, Rarity.COMMON), - BLUE_ORCHID(Material.BLUE_ORCHID, Rarity.COMMON), - PEONY(Material.PEONY, Rarity.COMMON), - PINK_PETALS(Material.PINK_PETALS, Rarity.COMMON), - LILAC(Material.LILAC, Rarity.COMMON), - ALLIUM(Material.ALLIUM, Rarity.COMMON), - AZURE_BLUET(Material.AZURE_BLUET, Rarity.COMMON), - OXEYE_DAISY(Material.OXEYE_DAISY, Rarity.COMMON), - - BREWING_STAND(Material.BREWING_STAND, Rarity.COMMON), - ENCHANTING_TABLE(Material.ENCHANTING_TABLE, Rarity.COMMON), - FURNACE(Material.FURNACE, Rarity.COMMON), - REDSTONE_TORCH(Material.REDSTONE_TORCH, Rarity.COMMON), - REPEATER(Material.REPEATER, Rarity.COMMON), - COMPARATOR(Material.COMPARATOR, Rarity.COMMON), - LEVER(Material.LEVER, Rarity.COMMON), - STONE_BUTTON(Material.STONE_BUTTON, Rarity.COMMON), - STONE_PRESSURE_PLATE(Material.STONE_PRESSURE_PLATE, Rarity.COMMON), - LIGHT_WEIGHTED_PRESSURE_PLATE(Material.LIGHT_WEIGHTED_PRESSURE_PLATE, Rarity.COMMON), - HEAVY_WEIGHTED_PRESSURE_PLATE(Material.HEAVY_WEIGHTED_PRESSURE_PLATE, Rarity.COMMON), - TRIPWIRE_HOOK(Material.TRIPWIRE_HOOK, Rarity.COMMON), - PISTON(Material.PISTON, Rarity.COMMON), - STICKY_PISTON(Material.STICKY_PISTON, Rarity.COMMON), - DISPENSER(Material.DISPENSER, Rarity.COMMON), - DROPPER(Material.DROPPER, Rarity.COMMON), - HOPPER(Material.HOPPER, Rarity.COMMON), - NOTE_BLOCK(Material.NOTE_BLOCK, Rarity.COMMON), - RAIL(Material.RAIL, Rarity.COMMON), - ACTIVATOR_RAIL(Material.ACTIVATOR_RAIL, Rarity.COMMON), - DETECTOR_RAIL(Material.DETECTOR_RAIL, Rarity.COMMON), - POWERED_RAIL(Material.POWERED_RAIL, Rarity.COMMON), - TNT(Material.TNT, Rarity.COMMON), - DAYLIGHT_DETECTOR(Material.DAYLIGHT_DETECTOR, Rarity.COMMON), - JUKEBOX(Material.JUKEBOX, Rarity.COMMON), - MINECART(Material.MINECART, Rarity.COMMON), - CHEST_MINECART(Material.CHEST_MINECART, Rarity.COMMON), - HOPPER_MINECART(Material.HOPPER_MINECART, Rarity.COMMON), - TNT_MINECART(Material.TNT_MINECART, Rarity.COMMON), - FURNACE_MINECART(Material.FURNACE_MINECART, Rarity.COMMON), - - /** - * Enchanted Items - */ - ENCHANTED_ACACIA_LOG(Material.ACACIA_LOG, Rarity.UNCOMMON), - ENCHANTED_BAKED_POTATO(Material.BAKED_POTATO, Rarity.UNCOMMON), - ENCHANTED_BIRCH_LOG(Material.BIRCH_LOG, Rarity.UNCOMMON), - ENCHANTED_SLIMEBALL(Material.SLIME_BALL, Rarity.UNCOMMON), - ENCHANTED_BLAZE_ROD(Material.BLAZE_ROD, Rarity.UNCOMMON), - ENCHANTED_BLAZE_POWDER(Material.BLAZE_POWDER, Rarity.UNCOMMON), - ENCHANTED_BONE(Material.BONE, Rarity.UNCOMMON), - ENCHANTED_CARROT(Material.CARROT, Rarity.UNCOMMON), - ENCHANTED_CHARCOAL(Material.CHARCOAL, Rarity.UNCOMMON), - ENCHANTED_COAL(Material.COAL, Rarity.UNCOMMON), - ENCHANTED_COBBLESTONE(Material.COBBLESTONE, Rarity.UNCOMMON), - ENCHANTED_COCOA_BEANS(Material.COCOA_BEANS, Rarity.UNCOMMON), - ENCHANTED_DARK_OAK_LOG(Material.DARK_OAK_LOG, Rarity.UNCOMMON), - ENCHANTED_DIAMOND(Material.DIAMOND, Rarity.UNCOMMON), - ENCHANTED_EGG(Material.EGG, Rarity.UNCOMMON), - SUPER_ENCHANTED_EGG(Material.POLAR_BEAR_SPAWN_EGG, Rarity.RARE), - OMEGA_ENCHANTED_EGG(Material.ENDERMITE_SPAWN_EGG, Rarity.EPIC), - ENCHANTED_EMERALD(Material.EMERALD, Rarity.UNCOMMON), - ENCHANTED_ENDER_PEARL(Material.ENDER_PEARL, Rarity.UNCOMMON), - ENCHANTED_DIAMOND_BLOCK(Material.DIAMOND_BLOCK, Rarity.RARE), - ENCHANTED_EMERALD_BLOCK(Material.EMERALD_BLOCK, Rarity.UNCOMMON), - ENCHANTED_GOLD_INGOT(Material.GOLD_INGOT, Rarity.UNCOMMON), - ENCHANTED_GOLD_BLOCK(Material.GOLD_BLOCK, Rarity.RARE), - ENCHANTED_JUNGLE_LOG(Material.JUNGLE_LOG, Rarity.UNCOMMON), - ENCHANTED_GUNPOWDER(Material.GUNPOWDER, Rarity.UNCOMMON), - ENCHANTED_IRON_BLOCK(Material.IRON_BLOCK, Rarity.RARE), - ENCHANTED_LEATHER(Material.LEATHER, Rarity.UNCOMMON), - ENCHANTED_OAK_LOG(Material.OAK_LOG, Rarity.UNCOMMON), - ENCHANTED_OBSIDIAN(Material.OBSIDIAN, Rarity.UNCOMMON), - ENCHANTED_PACKED_ICE(Material.PACKED_ICE, Rarity.UNCOMMON), - ENCHANTED_POTATO(Material.POTATO, Rarity.UNCOMMON), - ENCHANTED_PUMPKIN(Material.PUMPKIN, Rarity.UNCOMMON), - ENCHANTED_REDSTONE(Material.REDSTONE, Rarity.UNCOMMON), - ENCHANTED_REDSTONE_BLOCK(Material.REDSTONE_BLOCK, Rarity.RARE), - ENCHANTED_ROTTEN_FLESH(Material.ROTTEN_FLESH, Rarity.UNCOMMON), - ENCHANTED_SPONGE(Material.SPONGE, Rarity.UNCOMMON), - ENCHANTED_SPRUCE_LOG(Material.SPRUCE_LOG, Rarity.UNCOMMON), - ENCHANTED_STRING(Material.STRING, Rarity.UNCOMMON), - ENCHANTED_SUGAR(Material.SUGAR, Rarity.UNCOMMON), - ENCHANTED_SNOW_BLOCK(Material.SNOW_BLOCK, Rarity.UNCOMMON), - ENCHANTED_BROWN_MUSHROOM(Material.BROWN_MUSHROOM, Rarity.UNCOMMON), - ENCHANTED_RED_MUSHROOM(Material.RED_MUSHROOM, Rarity.UNCOMMON), - ENCHANTED_CACTUS_GREEN(Material.GREEN_DYE, Rarity.UNCOMMON), - ENCHANTED_CACTUS(Material.CACTUS, Rarity.RARE), - ENCHANTED_END_STONE(Material.END_STONE, Rarity.UNCOMMON), - ENCHANTED_EYE_OF_ENDER(Material.ENDER_EYE, Rarity.UNCOMMON), - ENCHANTED_ICE(Material.ICE, Rarity.UNCOMMON), - ENCHANTED_MAGMA_CREAM(Material.MAGMA_CREAM, Rarity.UNCOMMON), - ENCHANTED_BROWN_MUSHROOM_BLOCK(Material.BROWN_MUSHROOM_BLOCK, Rarity.RARE), - ENCHANTED_CLAY(Material.CLAY_BALL, Rarity.UNCOMMON), - ENCHANTED_CLOWNFISH(Material.TROPICAL_FISH, Rarity.UNCOMMON), - ENCHANTED_COD(Material.COD, Rarity.UNCOMMON), - ENCHANTED_COOKED_COD(Material.COOKED_COD, Rarity.RARE), - ENCHANTED_MUTTON(Material.MUTTON, Rarity.UNCOMMON), - ENCHANTED_COOKED_MUTTON(Material.COOKED_MUTTON, Rarity.RARE), - ENCHANTED_RAW_SALMON(Material.SALMON, Rarity.UNCOMMON), - ENCHANTED_COOKED_SALMON(Material.COOKED_SALMON, Rarity.UNCOMMON), - ENCHANTED_COOKIE(Material.COOKIE, Rarity.RARE), - ENCHANTED_DANDELION(Material.DANDELION, Rarity.UNCOMMON), - ENCHANTED_FEATHER(Material.FEATHER, Rarity.UNCOMMON), - ENCHANTED_SPIDER_EYE(Material.SPIDER_EYE, Rarity.UNCOMMON), - ENCHANTED_FERMENTED_SPIDER_EYE(Material.FERMENTED_SPIDER_EYE, Rarity.UNCOMMON), - ENCHANTED_FIREWORK_ROCKET(Material.FIREWORK_ROCKET, Rarity.RARE), - ENCHANTED_FLINT(Material.FLINT, Rarity.UNCOMMON), - ENCHANTED_GHAST_TEAR(Material.GHAST_TEAR, Rarity.UNCOMMON), - ENCHANTED_GLISTERING_MELON(Material.GLISTERING_MELON_SLICE, Rarity.RARE), - ENCHANTED_GLOWSTONE_DUST(Material.GLOWSTONE_DUST, Rarity.UNCOMMON), - ENCHANTED_GLOWSTONE(Material.GLOWSTONE, Rarity.UNCOMMON), - ENCHANTED_GOLDEN_CARROT(Material.GOLDEN_CARROT, Rarity.UNCOMMON), - ENCHANTED_PORK(Material.PORKCHOP, Rarity.UNCOMMON), - ENCHANTED_GRILLED_PORK(Material.COOKED_PORKCHOP, Rarity.RARE), - ENCHANTED_HAY_BALE(Material.HAY_BLOCK, Rarity.UNCOMMON), - ENCHANTED_ANCIENT_CLAW(Material.FLINT, Rarity.EPIC), - ENCHANTED_COAL_BLOCK(Material.COAL_BLOCK, Rarity.RARE), - ENCHANTED_BONE_BLOCK(Material.BONE_BLOCK, Rarity.RARE), - ENCHANTED_BREAD(Material.BREAD, Rarity.COMMON), - ENCHANTED_RED_MUSHROOM_BLOCK(Material.RED_MUSHROOM_BLOCK, Rarity.RARE), - ENCHANTED_INK_SAC(Material.INK_SAC, Rarity.UNCOMMON), - ENCHANTED_LAPIS_LAZULI(Material.LAPIS_LAZULI, Rarity.UNCOMMON), - ENCHANTED_LAPIS_LAZULI_BLOCK(Material.LAPIS_BLOCK, Rarity.RARE), - ENCHANTED_LILY_PAD(Material.LILY_PAD, Rarity.UNCOMMON), - ENCHANTED_MELON(Material.MELON_SLICE, Rarity.UNCOMMON), - ENCHANTED_MELON_BLOCK(Material.MELON, Rarity.RARE), - ENCHANTED_MITHRIL(Material.PRISMARINE_CRYSTALS, Rarity.RARE), - ENCHANTED_MYCELIUM(Material.MYCELIUM, Rarity.UNCOMMON), - ENCHANTED_MYCELIUM_CUBE(Material.PLAYER_HEAD, Rarity.RARE), - ENCHANTED_NETHER_WART(Material.NETHER_WART, Rarity.UNCOMMON), - ENCHANTED_NETHERRACK(Material.NETHERRACK, Rarity.UNCOMMON), - ENCHANTED_PAPER(Material.PAPER, Rarity.UNCOMMON), - ENCHANTED_POISONOUS_POTATO(Material.POISONOUS_POTATO, Rarity.UNCOMMON), - ENCHANTED_POPPY(Material.POPPY, Rarity.UNCOMMON), - ENCHANTED_PRISMARINE_CRYSTALS(Material.PRISMARINE_CRYSTALS, Rarity.UNCOMMON), - ENCHANTED_PRISMARINE_SHARD(Material.PRISMARINE_SHARD, Rarity.UNCOMMON), - ENCHANTED_PUFFERFISH(Material.PUFFERFISH, Rarity.UNCOMMON), - ENCHANTED_QUARTZ(Material.QUARTZ, Rarity.UNCOMMON), - ENCHANTED_QUARTZ_BLOCK(Material.QUARTZ_BLOCK, Rarity.RARE), - ENCHANTED_RABBIT_FOOT(Material.RABBIT_FOOT, Rarity.RARE), - ENCHANTED_RABBIT_HIDE(Material.RABBIT_HIDE, Rarity.RARE), - ENCHANTED_RAW_BEEF(Material.BEEF, Rarity.UNCOMMON), - ENCHANTED_RAW_CHICKEN(Material.CHICKEN, Rarity.UNCOMMON), - ENCHANTED_RAW_RABBIT(Material.RABBIT, Rarity.UNCOMMON), - ENCHANTED_SAND(Material.SAND, Rarity.UNCOMMON), - ENCHANTED_SEEDS(Material.WHEAT_SEEDS, Rarity.UNCOMMON), - ENCHANTED_SLIME_BLOCK(Material.SLIME_BLOCK, Rarity.RARE), - ENCHANTED_SUGAR_CANE(Material.SUGAR_CANE, Rarity.RARE), - ENCHANTED_SULPHUR(Material.GLOWSTONE_DUST, Rarity.RARE), - ENCHANTED_SULPHUR_CUBE(Material.PLAYER_HEAD, Rarity.RARE), - ENCHANTED_TITANIUM(Material.PLAYER_HEAD, Rarity.EPIC), - ENCHANTED_WET_SPONGE(Material.WET_SPONGE, Rarity.RARE), - ENCHANTED_WOOL(Material.WHITE_WOOL, Rarity.UNCOMMON), - ENCHANTED_SHARK_FIN(Material.PRISMARINE_SHARD, Rarity.EPIC), - ENCHANTED_RED_SAND(Material.RED_SAND, Rarity.UNCOMMON), - ENCHANTED_RED_SAND_CUBE(Material.PLAYER_HEAD, Rarity.RARE), - ENCHANTED_BONE_MEAL(Material.BONE_MEAL, Rarity.COMMON), - ; - - public final Material material; - public final Rarity rarity; - - ItemType(Material material, Rarity rarity) { - this.material = material; - this.rarity = rarity; - } - - @SneakyThrows - public String getDisplayName() { - return StringUtility.toNormalCase(this.name()); - } - - - public static @Nullable ItemType get(String name) { - try { - return ItemType.valueOf(name.replace("minecraft:", "").toUpperCase()); - } catch (Exception e) { - return null; - } - } - - public static boolean isVanillaReplaced(String item) { - return get(item) != null; - } - - public static @Nullable ItemType fromMaterial(Material material) { - String materialName = material.key().value(); - String formattedItemName = StringUtility.toNormalCase(materialName); - - for (ItemType itemType : ItemType.values()) { - if (itemType.material == material && - formattedItemName.equals(StringUtility.toNormalCase(itemType.getDisplayName()))) { - return itemType; - } - } - return null; - } + /** + * Crimson Isles + */ + FLAMES(Material.BLAZE_POWDER, Rarity.RARE), + + /** + * Vanilla Items + */ + AIR(Material.AIR, Rarity.COMMON), + DIRT(Material.DIRT, Rarity.COMMON), + CRAFTING_TABLE(Material.CRAFTING_TABLE, Rarity.COMMON), + ANVIL(Material.ANVIL, Rarity.COMMON), + FLOWER_POT(Material.FLOWER_POT, Rarity.COMMON), + FERN(Material.FERN, Rarity.COMMON), + DEAD_BUSH(Material.DEAD_BUSH, Rarity.COMMON), + WATER_BUCKET(Material.WATER_BUCKET, Rarity.COMMON), + LARGE_FERN(Material.LARGE_FERN, Rarity.COMMON), + STICK(Material.STICK, Rarity.COMMON), + BAKED_POTATO(Material.BAKED_POTATO, Rarity.COMMON), + BLAZE_ROD(Material.BLAZE_ROD, Rarity.COMMON), + BONE(Material.BONE, Rarity.COMMON), + BONE_MEAL(Material.BONE_MEAL, Rarity.COMMON), + BOOK(Material.BOOK, Rarity.COMMON), + EXPERIENCE_BOTTLE(Material.EXPERIENCE_BOTTLE, Rarity.COMMON), + BOOKSHELF(Material.BOOKSHELF, Rarity.COMMON), + BOWL(Material.BOWL, Rarity.COMMON), + BREAD(Material.BREAD, Rarity.COMMON), + CARROT(Material.CARROT, Rarity.COMMON), + CHARCOAL(Material.CHARCOAL, Rarity.COMMON), + COAL(Material.COAL, Rarity.COMMON), + COCOA_BEANS(Material.COCOA_BEANS, Rarity.COMMON), + DIAMOND(Material.DIAMOND, Rarity.COMMON), + DIAMOND_BLOCK(Material.DIAMOND_BLOCK, Rarity.COMMON), + EGG(Material.EGG, Rarity.COMMON), + EMERALD(Material.EMERALD, Rarity.COMMON), + EMERALD_BLOCK(Material.EMERALD_BLOCK, Rarity.COMMON), + ENDER_PEARL(Material.ENDER_PEARL, Rarity.COMMON), + FEATHER(Material.FEATHER, Rarity.COMMON), + FLINT(Material.FLINT, Rarity.COMMON), + GLOWSTONE_DUST(Material.GLOWSTONE_DUST, Rarity.COMMON), + GOLD_INGOT(Material.GOLD_INGOT, Rarity.COMMON), + GOLD_BLOCK(Material.GOLD_BLOCK, Rarity.COMMON), + GUNPOWDER(Material.GUNPOWDER, Rarity.COMMON), + END_STONE(Material.END_STONE, Rarity.COMMON), + EYE_OF_ENDER(Material.ENDER_EYE, Rarity.COMMON), + GHAST_TEAR(Material.GHAST_TEAR, Rarity.COMMON), + ICE(Material.ICE, Rarity.COMMON), + IRON_INGOT(Material.IRON_INGOT, Rarity.COMMON), + GRAVEL(Material.GRAVEL, Rarity.COMMON), + LAPIS_LAZULI(Material.LAPIS_LAZULI, Rarity.COMMON), + IRON_BLOCK(Material.IRON_BLOCK, Rarity.COMMON), + LEATHER(Material.LEATHER, Rarity.COMMON), + MAGMA_CREAM(Material.MAGMA_CREAM, Rarity.COMMON), + OBSIDIAN(Material.OBSIDIAN, Rarity.COMMON), + PACKED_ICE(Material.PACKED_ICE, Rarity.COMMON), + VINES(Material.VINE, Rarity.COMMON), + PAPER(Material.PAPER, Rarity.COMMON), + POTATO(Material.POTATO, Rarity.COMMON), + PUMPKIN(Material.PUMPKIN, Rarity.COMMON), + REDSTONE(Material.REDSTONE, Rarity.COMMON), + REDSTONE_BLOCK(Material.REDSTONE_BLOCK, Rarity.COMMON), + ROTTEN_FLESH(Material.ROTTEN_FLESH, Rarity.COMMON), + SLIME_BALL(Material.SLIME_BALL, Rarity.COMMON), + SPONGE(Material.SPONGE, Rarity.COMMON), + STRING(Material.STRING, Rarity.COMMON), + SUGAR_CANE(Material.SUGAR_CANE, Rarity.COMMON), + SUGAR(Material.SUGAR, Rarity.COMMON), + SNOW(Material.SNOW, Rarity.COMMON), + SNOW_BLOCK(Material.SNOW_BLOCK, Rarity.COMMON), + SNOWBALL(Material.SNOWBALL, Rarity.COMMON), + MELON_SLICE(Material.MELON_SLICE, Rarity.COMMON), + RED_MUSHROOM(Material.RED_MUSHROOM, Rarity.COMMON), + BROWN_MUSHROOM(Material.BROWN_MUSHROOM, Rarity.COMMON), + MUTTON(Material.MUTTON, Rarity.COMMON), + NETHER_WART(Material.NETHER_WART, Rarity.COMMON), + CHICKEN(Material.CHICKEN, Rarity.COMMON), + SOUL_SAND(Material.SOUL_SAND, Rarity.COMMON), + PRISMARINE(Material.PRISMARINE, Rarity.COMMON), + PRISMARINE_BRICKS(Material.PRISMARINE_BRICKS, Rarity.COMMON), + DARK_PRISMARINE(Material.DARK_PRISMARINE, Rarity.COMMON), + SEA_LANTERN(Material.SEA_LANTERN, Rarity.COMMON), + WET_SPONGE(Material.WET_SPONGE, Rarity.COMMON), + LAVA_BUCKET(Material.LAVA_BUCKET, Rarity.COMMON), + JACK_O_LANTERN(Material.JACK_O_LANTERN, Rarity.COMMON), + NETHER_BRICKS(Material.NETHER_BRICKS, Rarity.COMMON), + COARSE_DIRT(Material.COARSE_DIRT, Rarity.COMMON), + PODZOL(Material.PODZOL, Rarity.COMMON), + CRACKED_STONE_BRICKS(Material.CRACKED_STONE_BRICKS, Rarity.COMMON), + CHISELED_STONE_BRICKS(Material.CHISELED_STONE_BRICKS, Rarity.COMMON), + SMOOTH_STONE(Material.SMOOTH_STONE, Rarity.COMMON), + SMOOTH_SANDSTONE(Material.SMOOTH_SANDSTONE, Rarity.COMMON), + SMOOTH_QUARTZ(Material.SMOOTH_QUARTZ, Rarity.COMMON), + BRICKS(Material.BRICKS, Rarity.COMMON), + END_STONE_BRICKS(Material.END_STONE_BRICKS, Rarity.COMMON), + PURPUR_BLOCK(Material.PURPUR_BLOCK, Rarity.COMMON), + PURPUR_PILLAR(Material.PURPUR_PILLAR, Rarity.COMMON), + PURPUR_STAIRS(Material.PURPUR_STAIRS, Rarity.COMMON), + PURPUR_SLAB(Material.PURPUR_SLAB, Rarity.COMMON), + END_ROD(Material.END_ROD, Rarity.COMMON), + DRAGON_BREATH(Material.DRAGON_BREATH, Rarity.COMMON), + ELDER_GUARDIAN_SPAWN_EGG(Material.ELDER_GUARDIAN_SPAWN_EGG, Rarity.COMMON), + ENDER_CHEST(Material.ENDER_CHEST, Rarity.COMMON), + ENDER_EYE(Material.ENDER_EYE, Rarity.COMMON), + BRICK_STAIRS(Material.BRICK_STAIRS, Rarity.COMMON), + BRICK_SLAB(Material.BRICK_SLAB, Rarity.COMMON), + SMOOTH_RED_SANDSTONE(Material.SMOOTH_RED_SANDSTONE, Rarity.COMMON), + IRON_BARS(Material.IRON_BARS, Rarity.COMMON), + IRON_DOOR(Material.IRON_DOOR, Rarity.COMMON), + REDSTONE_LAMP(Material.REDSTONE_LAMP, Rarity.COMMON), + SANDSTONE_STAIRS(Material.SANDSTONE_STAIRS, Rarity.COMMON), + EMERALD_ORE(Material.EMERALD_ORE, Rarity.COMMON), + DIAMOND_ORE(Material.DIAMOND_ORE, Rarity.COMMON), + GOLD_ORE(Material.GOLD_ORE, Rarity.COMMON), + IRON_ORE(Material.IRON_ORE, Rarity.COMMON), + COAL_ORE(Material.COAL_ORE, Rarity.COMMON), + LAPIS_LAZULI_ORE(Material.LAPIS_ORE, Rarity.COMMON), + REDSTONE_ORE(Material.REDSTONE_ORE, Rarity.COMMON), + IRON_TRAPDOOR(Material.IRON_TRAPDOOR, Rarity.COMMON), + PORKCHOP(Material.PORKCHOP, Rarity.COMMON), + RABBIT(Material.RABBIT, Rarity.COMMON), + MYCELIUM(Material.MYCELIUM, Rarity.COMMON), + RED_SAND(Material.RED_SAND, Rarity.COMMON), + QUARTZ(Material.QUARTZ, Rarity.COMMON), + NETHER_QUARTZ_ORE(Material.NETHER_QUARTZ_ORE, Rarity.COMMON), + NETHERRACK(Material.NETHERRACK, Rarity.COMMON), + NETHER_BRICK(Material.NETHER_BRICK, Rarity.COMMON), + SAND(Material.SAND, Rarity.COMMON), + CLAY_BALL(Material.CLAY_BALL, Rarity.COMMON), + TROPICAL_FISH(Material.TROPICAL_FISH, Rarity.COMMON), + INK_SAC(Material.INK_SAC, Rarity.COMMON), + GRASS_BLOCK(Material.GRASS_BLOCK, Rarity.COMMON), + SHORT_GRASS(Material.SHORT_GRASS, Rarity.COMMON), + TALL_GRASS(Material.TALL_GRASS, Rarity.COMMON), + MELON_BLOCK(Material.MELON, Rarity.COMMON), + LILY_PAD(Material.LILY_PAD, Rarity.COMMON), + PRISMARINE_CRYSTALS(Material.PRISMARINE_CRYSTALS, Rarity.COMMON), + PRISMARINE_SHARD(Material.PRISMARINE_SHARD, Rarity.COMMON), + PUFFERFISH(Material.PUFFERFISH, Rarity.COMMON), + COD(Material.COD, Rarity.COMMON), + SALMON(Material.SALMON, Rarity.COMMON), + TORCH(Material.TORCH, Rarity.COMMON), + RAW_BEEF(Material.BEEF, Rarity.UNCOMMON), + RAW_CHICKEN(Material.CHICKEN, Rarity.UNCOMMON), + SPIDER_EYE(Material.SPIDER_EYE, Rarity.COMMON), + CACTUS_GREEN(Material.GREEN_DYE, Rarity.COMMON), + DANDELION(Material.DANDELION, Rarity.COMMON), + FERMENTED_SPIDER_EYE(Material.FERMENTED_SPIDER_EYE, Rarity.COMMON), + GLISTERING_MELON(Material.GLISTERING_MELON_SLICE, Rarity.COMMON), + GLOWSTONE(Material.GLOWSTONE, Rarity.COMMON), + HAY_BALE(Material.HAY_BLOCK, Rarity.COMMON), + POISONOUS_POTATO(Material.POISONOUS_POTATO, Rarity.COMMON), + POPPY(Material.POPPY, Rarity.COMMON), + RABBIT_FOOT(Material.RABBIT_FOOT, Rarity.COMMON), + RABBIT_HIDE(Material.RABBIT_HIDE, Rarity.COMMON), + BEEF(Material.BEEF, Rarity.COMMON), + COAL_BLOCK(Material.COAL_BLOCK, Rarity.COMMON), + LAPIS_LAZULI_BLOCK(Material.LAPIS_BLOCK, Rarity.COMMON), + BROWN_MUSHROOM_BLOCK(Material.BROWN_MUSHROOM_BLOCK, Rarity.COMMON), + RED_MUSHROOM_BLOCK(Material.RED_MUSHROOM_BLOCK, Rarity.COMMON), + BLAZE_POWDER(Material.BLAZE_POWDER, Rarity.COMMON), + GOLDEN_CARROT(Material.GOLDEN_CARROT, Rarity.COMMON), + GOLD_NUGGET(Material.GOLD_NUGGET, Rarity.COMMON), + IRON_NUGGET(Material.IRON_NUGGET, Rarity.COMMON), + WATER_BOTTLE(Material.POTION, Rarity.COMMON), + CACTUS(Material.CACTUS, Rarity.COMMON), + CHEST(Material.CHEST, Rarity.COMMON), + IRON_HELMET(Material.IRON_HELMET, Rarity.COMMON), + IRON_CHESTPLATE(Material.IRON_CHESTPLATE, Rarity.COMMON), + IRON_LEGGINGS(Material.IRON_LEGGINGS, Rarity.COMMON), + IRON_BOOTS(Material.IRON_BOOTS, Rarity.COMMON), + CHAINMAIL_HELMET(Material.CHAINMAIL_HELMET, Rarity.COMMON), + CHAINMAIL_CHESTPLATE(Material.CHAINMAIL_CHESTPLATE, Rarity.COMMON), + CHAINMAIL_LEGGINGS(Material.CHAINMAIL_LEGGINGS, Rarity.COMMON), + CHAINMAIL_BOOTS(Material.CHAINMAIL_BOOTS, Rarity.COMMON), + LEATHER_HELMET(Material.LEATHER_HELMET, Rarity.COMMON), + LEATHER_CHESTPLATE(Material.LEATHER_CHESTPLATE, Rarity.COMMON), + LEATHER_LEGGINGS(Material.LEATHER_LEGGINGS, Rarity.COMMON), + LEATHER_BOOTS(Material.LEATHER_BOOTS, Rarity.COMMON), + GOLDEN_HELMET(Material.GOLDEN_HELMET, Rarity.COMMON), + GOLDEN_CHESTPLATE(Material.GOLDEN_CHESTPLATE, Rarity.COMMON), + GOLDEN_LEGGINGS(Material.GOLDEN_LEGGINGS, Rarity.COMMON), + GOLDEN_BOOTS(Material.GOLDEN_BOOTS, Rarity.COMMON), + DIAMOND_HELMET(Material.DIAMOND_HELMET, Rarity.UNCOMMON), + DIAMOND_CHESTPLATE(Material.DIAMOND_CHESTPLATE, Rarity.UNCOMMON), + DIAMOND_LEGGINGS(Material.DIAMOND_LEGGINGS, Rarity.UNCOMMON), + DIAMOND_BOOTS(Material.DIAMOND_BOOTS, Rarity.UNCOMMON), + APPLE(Material.APPLE, Rarity.COMMON), + SLIME_BLOCK(Material.SLIME_BLOCK, Rarity.COMMON), + + OAK_SAPLING(Material.OAK_SAPLING, Rarity.COMMON), + SPRUCE_SAPLING(Material.SPRUCE_SAPLING, Rarity.COMMON), + BIRCH_SAPLING(Material.BIRCH_SAPLING, Rarity.COMMON), + JUNGLE_SAPLING(Material.JUNGLE_SAPLING, Rarity.COMMON), + ACACIA_SAPLING(Material.ACACIA_SAPLING, Rarity.COMMON), + DARK_OAK_SAPLING(Material.DARK_OAK_SAPLING, Rarity.COMMON), + CHERRY_SAPLING(Material.CHERRY_SAPLING, Rarity.COMMON), + MANGROVE_PROPAGULE(Material.MANGROVE_PROPAGULE, Rarity.COMMON), + PALE_OAK_SAPLING(Material.PALE_OAK_SAPLING, Rarity.COMMON), + AZALEA(Material.AZALEA, Rarity.COMMON), + FLOWERING_AZALEA(Material.FLOWERING_AZALEA, Rarity.COMMON), + + OAK_LEAVES(Material.OAK_LEAVES, Rarity.COMMON), + SPRUCE_LEAVES(Material.SPRUCE_LEAVES, Rarity.COMMON), + BIRCH_LEAVES(Material.BIRCH_LEAVES, Rarity.COMMON), + JUNGLE_LEAVES(Material.JUNGLE_LEAVES, Rarity.COMMON), + ACACIA_LEAVES(Material.ACACIA_LEAVES, Rarity.COMMON), + DARK_OAK_LEAVES(Material.DARK_OAK_LEAVES, Rarity.COMMON), + CHERRY_LEAVES(Material.CHERRY_LEAVES, Rarity.COMMON), + MANGROVE_LEAVES(Material.MANGROVE_LEAVES, Rarity.COMMON), + PALE_OAK_LEAVES(Material.PALE_OAK_LEAVES, Rarity.COMMON), + AZALEA_LEAVES(Material.AZALEA_LEAVES, Rarity.COMMON), + FLOWERING_AZALEA_LEAVES(Material.FLOWERING_AZALEA_LEAVES, Rarity.COMMON), + + OAK_LOG(Material.OAK_LOG, Rarity.COMMON), + STRIPPED_OAK_LOG(Material.STRIPPED_OAK_LOG, Rarity.COMMON), + OAK_WOOD(Material.OAK_WOOD, Rarity.COMMON), + STRIPPED_OAK_WOOD(Material.STRIPPED_OAK_WOOD, Rarity.COMMON), + OAK_PLANKS(Material.OAK_PLANKS, Rarity.COMMON), + OAK_SLAB(Material.OAK_SLAB, Rarity.COMMON), + OAK_STAIRS(Material.OAK_STAIRS, Rarity.COMMON), + OAK_FENCE(Material.OAK_FENCE, Rarity.COMMON), + OAK_FENCE_GATE(Material.OAK_FENCE_GATE, Rarity.COMMON), + OAK_DOOR(Material.OAK_DOOR, Rarity.COMMON), + OAK_TRAPDOOR(Material.OAK_TRAPDOOR, Rarity.COMMON), + OAK_PRESSURE_PLATE(Material.OAK_PRESSURE_PLATE, Rarity.COMMON), + OAK_BUTTON(Material.OAK_BUTTON, Rarity.COMMON), + OAK_BOAT(Material.OAK_BOAT, Rarity.COMMON), + OAK_CHEST_BOAT(Material.OAK_CHEST_BOAT, Rarity.COMMON), + OAK_SIGN(Material.OAK_SIGN, Rarity.COMMON), + OAK_HANGING_SIGN(Material.OAK_HANGING_SIGN, Rarity.COMMON), + + ACACIA_LOG(Material.ACACIA_LOG, Rarity.COMMON), + STRIPPED_ACACIA_LOG(Material.STRIPPED_ACACIA_LOG, Rarity.COMMON), + ACACIA_WOOD(Material.ACACIA_WOOD, Rarity.COMMON), + STRIPPED_ACACIA_WOOD(Material.STRIPPED_ACACIA_WOOD, Rarity.COMMON), + ACACIA_PLANKS(Material.ACACIA_PLANKS, Rarity.COMMON), + ACACIA_SLAB(Material.ACACIA_SLAB, Rarity.COMMON), + ACACIA_STAIRS(Material.ACACIA_STAIRS, Rarity.COMMON), + ACACIA_FENCE(Material.ACACIA_FENCE, Rarity.COMMON), + ACACIA_FENCE_GATE(Material.ACACIA_FENCE_GATE, Rarity.COMMON), + ACACIA_DOOR(Material.ACACIA_DOOR, Rarity.COMMON), + ACACIA_TRAPDOOR(Material.ACACIA_TRAPDOOR, Rarity.COMMON), + ACACIA_PRESSURE_PLATE(Material.ACACIA_PRESSURE_PLATE, Rarity.COMMON), + ACACIA_BUTTON(Material.ACACIA_BUTTON, Rarity.COMMON), + ACACIA_BOAT(Material.ACACIA_BOAT, Rarity.COMMON), + ACACIA_CHEST_BOAT(Material.ACACIA_CHEST_BOAT, Rarity.COMMON), + ACACIA_SIGN(Material.ACACIA_SIGN, Rarity.COMMON), + ACACIA_HANGING_SIGN(Material.ACACIA_HANGING_SIGN, Rarity.COMMON), + + CHERRY_LOG(Material.CHERRY_LOG, Rarity.COMMON), + STRIPPED_CHERRY_LOG(Material.STRIPPED_CHERRY_LOG, Rarity.COMMON), + CHERRY_WOOD(Material.CHERRY_WOOD, Rarity.COMMON), + STRIPPED_CHERRY_WOOD(Material.STRIPPED_CHERRY_WOOD, Rarity.COMMON), + CHERRY_PLANKS(Material.CHERRY_PLANKS, Rarity.COMMON), + CHERRY_SLAB(Material.CHERRY_SLAB, Rarity.COMMON), + CHERRY_STAIRS(Material.CHERRY_STAIRS, Rarity.COMMON), + CHERRY_FENCE(Material.CHERRY_FENCE, Rarity.COMMON), + CHERRY_FENCE_GATE(Material.CHERRY_FENCE_GATE, Rarity.COMMON), + CHERRY_DOOR(Material.CHERRY_DOOR, Rarity.COMMON), + CHERRY_TRAPDOOR(Material.CHERRY_TRAPDOOR, Rarity.COMMON), + CHERRY_PRESSURE_PLATE(Material.CHERRY_PRESSURE_PLATE, Rarity.COMMON), + CHERRY_BUTTON(Material.CHERRY_BUTTON, Rarity.COMMON), + CHERRY_BOAT(Material.CHERRY_BOAT, Rarity.COMMON), + CHERRY_CHEST_BOAT(Material.CHERRY_CHEST_BOAT, Rarity.COMMON), + CHERRY_SIGN(Material.CHERRY_SIGN, Rarity.COMMON), + CHERRY_HANGING_SIGN(Material.CHERRY_HANGING_SIGN, Rarity.COMMON), + + MANGROVE_PLANKS(Material.MANGROVE_PLANKS, Rarity.COMMON), + MANGROVE_LOG(Material.MANGROVE_LOG, Rarity.COMMON), + STRIPPED_MANGROVE_LOG(Material.STRIPPED_MANGROVE_LOG, Rarity.COMMON), + MANGROVE_WOOD(Material.MANGROVE_WOOD, Rarity.COMMON), + STRIPPED_MANGROVE_WOOD(Material.STRIPPED_MANGROVE_WOOD, Rarity.COMMON), + MANGROVE_SLAB(Material.MANGROVE_SLAB, Rarity.COMMON), + MANGROVE_STAIRS(Material.MANGROVE_STAIRS, Rarity.COMMON), + MANGROVE_FENCE(Material.MANGROVE_FENCE, Rarity.COMMON), + MANGROVE_FENCE_GATE(Material.MANGROVE_FENCE_GATE, Rarity.COMMON), + MANGROVE_DOOR(Material.MANGROVE_DOOR, Rarity.COMMON), + MANGROVE_TRAPDOOR(Material.MANGROVE_TRAPDOOR, Rarity.COMMON), + MANGROVE_PRESSURE_PLATE(Material.MANGROVE_PRESSURE_PLATE, Rarity.COMMON), + MANGROVE_BUTTON(Material.MANGROVE_BUTTON, Rarity.COMMON), + MANGROVE_BOAT(Material.MANGROVE_BOAT, Rarity.COMMON), + MANGROVE_CHEST_BOAT(Material.MANGROVE_CHEST_BOAT, Rarity.COMMON), + MANGROVE_SIGN(Material.MANGROVE_SIGN, Rarity.COMMON), + MANGROVE_HANGING_SIGN(Material.MANGROVE_HANGING_SIGN, Rarity.COMMON), + + PALE_OAK_LOG(Material.PALE_OAK_LOG, Rarity.COMMON), + STRIPPED_PALE_OAK_LOG(Material.STRIPPED_PALE_OAK_LOG, Rarity.COMMON), + PALE_OAK_WOOD(Material.PALE_OAK_WOOD, Rarity.COMMON), + STRIPPED_PALE_OAK_WOOD(Material.STRIPPED_PALE_OAK_WOOD, Rarity.COMMON), + PALE_OAK_PLANKS(Material.PALE_OAK_PLANKS, Rarity.COMMON), + PALE_OAK_SLAB(Material.PALE_OAK_SLAB, Rarity.COMMON), + PALE_OAK_STAIRS(Material.PALE_OAK_STAIRS, Rarity.COMMON), + PALE_OAK_FENCE(Material.PALE_OAK_FENCE, Rarity.COMMON), + PALE_OAK_FENCE_GATE(Material.PALE_OAK_FENCE_GATE, Rarity.COMMON), + PALE_OAK_DOOR(Material.PALE_OAK_DOOR, Rarity.COMMON), + PALE_OAK_TRAPDOOR(Material.PALE_OAK_TRAPDOOR, Rarity.COMMON), + PALE_OAK_PRESSURE_PLATE(Material.PALE_OAK_PRESSURE_PLATE, Rarity.COMMON), + PALE_OAK_BUTTON(Material.PALE_OAK_BUTTON, Rarity.COMMON), + PALE_OAK_BOAT(Material.PALE_OAK_BOAT, Rarity.COMMON), + PALE_OAK_CHEST_BOAT(Material.PALE_OAK_CHEST_BOAT, Rarity.COMMON), + PALE_OAK_SIGN(Material.PALE_OAK_SIGN, Rarity.COMMON), + PALE_OAK_HANGING_SIGN(Material.PALE_OAK_HANGING_SIGN, Rarity.COMMON), + + BIRCH_LOG(Material.BIRCH_LOG, Rarity.COMMON), + STRIPPED_BIRCH_LOG(Material.STRIPPED_BIRCH_LOG, Rarity.COMMON), + BIRCH_WOOD(Material.BIRCH_WOOD, Rarity.COMMON), + STRIPPED_BIRCH_WOOD(Material.STRIPPED_BIRCH_WOOD, Rarity.COMMON), + BIRCH_PLANKS(Material.BIRCH_PLANKS, Rarity.COMMON), + BIRCH_SLAB(Material.BIRCH_SLAB, Rarity.COMMON), + BIRCH_STAIRS(Material.BIRCH_STAIRS, Rarity.COMMON), + BIRCH_FENCE(Material.BIRCH_FENCE, Rarity.COMMON), + BIRCH_FENCE_GATE(Material.BIRCH_FENCE_GATE, Rarity.COMMON), + BIRCH_DOOR(Material.BIRCH_DOOR, Rarity.COMMON), + BIRCH_TRAPDOOR(Material.BIRCH_TRAPDOOR, Rarity.COMMON), + BIRCH_PRESSURE_PLATE(Material.BIRCH_PRESSURE_PLATE, Rarity.COMMON), + BIRCH_BUTTON(Material.BIRCH_BUTTON, Rarity.COMMON), + BIRCH_BOAT(Material.BIRCH_BOAT, Rarity.COMMON), + BIRCH_CHEST_BOAT(Material.BIRCH_CHEST_BOAT, Rarity.COMMON), + BIRCH_SIGN(Material.BIRCH_SIGN, Rarity.COMMON), + BIRCH_HANGING_SIGN(Material.BIRCH_HANGING_SIGN, Rarity.COMMON), + + DARK_OAK_LOG(Material.DARK_OAK_LOG, Rarity.COMMON), + STRIPPED_DARK_OAK_LOG(Material.STRIPPED_DARK_OAK_LOG, Rarity.COMMON), + DARK_OAK_WOOD(Material.DARK_OAK_WOOD, Rarity.COMMON), + STRIPPED_DARK_OAK_WOOD(Material.STRIPPED_DARK_OAK_WOOD, Rarity.COMMON), + DARK_OAK_PLANKS(Material.DARK_OAK_PLANKS, Rarity.COMMON), + DARK_OAK_SLAB(Material.DARK_OAK_SLAB, Rarity.COMMON), + DARK_OAK_STAIRS(Material.DARK_OAK_STAIRS, Rarity.COMMON), + DARK_OAK_FENCE(Material.DARK_OAK_FENCE, Rarity.COMMON), + DARK_OAK_FENCE_GATE(Material.DARK_OAK_FENCE_GATE, Rarity.COMMON), + DARK_OAK_DOOR(Material.DARK_OAK_DOOR, Rarity.COMMON), + DARK_OAK_TRAPDOOR(Material.DARK_OAK_TRAPDOOR, Rarity.COMMON), + DARK_OAK_PRESSURE_PLATE(Material.DARK_OAK_PRESSURE_PLATE, Rarity.COMMON), + DARK_OAK_BUTTON(Material.DARK_OAK_BUTTON, Rarity.COMMON), + DARK_OAK_BOAT(Material.DARK_OAK_BOAT, Rarity.COMMON), + DARK_OAK_CHEST_BOAT(Material.DARK_OAK_CHEST_BOAT, Rarity.COMMON), + DARK_OAK_SIGN(Material.DARK_OAK_SIGN, Rarity.COMMON), + DARK_OAK_HANGING_SIGN(Material.DARK_OAK_HANGING_SIGN, Rarity.COMMON), + + JUNGLE_LOG(Material.JUNGLE_LOG, Rarity.COMMON), + STRIPPED_JUNGLE_LOG(Material.STRIPPED_JUNGLE_LOG, Rarity.COMMON), + JUNGLE_WOOD(Material.JUNGLE_WOOD, Rarity.COMMON), + STRIPPED_JUNGLE_WOOD(Material.STRIPPED_JUNGLE_WOOD, Rarity.COMMON), + JUNGLE_PLANKS(Material.JUNGLE_PLANKS, Rarity.COMMON), + JUNGLE_SLAB(Material.JUNGLE_SLAB, Rarity.COMMON), + JUNGLE_STAIRS(Material.JUNGLE_STAIRS, Rarity.COMMON), + JUNGLE_FENCE(Material.JUNGLE_FENCE, Rarity.COMMON), + JUNGLE_FENCE_GATE(Material.JUNGLE_FENCE_GATE, Rarity.COMMON), + JUNGLE_DOOR(Material.JUNGLE_DOOR, Rarity.COMMON), + JUNGLE_TRAPDOOR(Material.JUNGLE_TRAPDOOR, Rarity.COMMON), + JUNGLE_PRESSURE_PLATE(Material.JUNGLE_PRESSURE_PLATE, Rarity.COMMON), + JUNGLE_BUTTON(Material.JUNGLE_BUTTON, Rarity.COMMON), + JUNGLE_BOAT(Material.JUNGLE_BOAT, Rarity.COMMON), + JUNGLE_CHEST_BOAT(Material.JUNGLE_CHEST_BOAT, Rarity.COMMON), + JUNGLE_SIGN(Material.JUNGLE_SIGN, Rarity.COMMON), + JUNGLE_HANGING_SIGN(Material.JUNGLE_HANGING_SIGN, Rarity.COMMON), + + SPRUCE_LOG(Material.SPRUCE_LOG, Rarity.COMMON), + STRIPPED_SPRUCE_LOG(Material.STRIPPED_SPRUCE_LOG, Rarity.COMMON), + SPRUCE_WOOD(Material.SPRUCE_WOOD, Rarity.COMMON), + STRIPPED_SPRUCE_WOOD(Material.STRIPPED_SPRUCE_WOOD, Rarity.COMMON), + SPRUCE_PLANKS(Material.SPRUCE_PLANKS, Rarity.COMMON), + SPRUCE_SLAB(Material.SPRUCE_SLAB, Rarity.COMMON), + SPRUCE_STAIRS(Material.SPRUCE_STAIRS, Rarity.COMMON), + SPRUCE_FENCE(Material.SPRUCE_FENCE, Rarity.COMMON), + SPRUCE_FENCE_GATE(Material.SPRUCE_FENCE_GATE, Rarity.COMMON), + SPRUCE_DOOR(Material.SPRUCE_DOOR, Rarity.COMMON), + SPRUCE_TRAPDOOR(Material.SPRUCE_TRAPDOOR, Rarity.COMMON), + SPRUCE_PRESSURE_PLATE(Material.SPRUCE_PRESSURE_PLATE, Rarity.COMMON), + SPRUCE_BUTTON(Material.SPRUCE_BUTTON, Rarity.COMMON), + SPRUCE_BOAT(Material.SPRUCE_BOAT, Rarity.COMMON), + SPRUCE_CHEST_BOAT(Material.SPRUCE_CHEST_BOAT, Rarity.COMMON), + SPRUCE_SIGN(Material.SPRUCE_SIGN, Rarity.COMMON), + SPRUCE_HANGING_SIGN(Material.SPRUCE_HANGING_SIGN, Rarity.COMMON), + + BAMBOO_BLOCK(Material.BAMBOO_BLOCK, Rarity.COMMON), + STRIPPED_BAMBOO_BLOCK(Material.STRIPPED_BAMBOO_BLOCK, Rarity.COMMON), + BAMBOO_PLANKS(Material.BAMBOO_PLANKS, Rarity.COMMON), + BAMBOO_MOSAIC(Material.BAMBOO_MOSAIC, Rarity.COMMON), + BAMBOO_SLAB(Material.BAMBOO_SLAB, Rarity.COMMON), + BAMBOO_MOSAIC_SLAB(Material.BAMBOO_MOSAIC_SLAB, Rarity.COMMON), + BAMBOO_STAIRS(Material.BAMBOO_STAIRS, Rarity.COMMON), + BAMBOO_MOSAIC_STAIRS(Material.BAMBOO_MOSAIC_STAIRS, Rarity.COMMON), + BAMBOO_FENCE(Material.BAMBOO_FENCE, Rarity.COMMON), + BAMBOO_FENCE_GATE(Material.BAMBOO_FENCE_GATE, Rarity.COMMON), + BAMBOO_DOOR(Material.BAMBOO_DOOR, Rarity.COMMON), + BAMBOO_TRAPDOOR(Material.BAMBOO_TRAPDOOR, Rarity.COMMON), + BAMBOO_PRESSURE_PLATE(Material.BAMBOO_PRESSURE_PLATE, Rarity.COMMON), + BAMBOO_BUTTON(Material.BAMBOO_BUTTON, Rarity.COMMON), + BAMBOO_RAFT(Material.BAMBOO_RAFT, Rarity.COMMON), + BAMBOO_CHEST_RAFT(Material.BAMBOO_CHEST_RAFT, Rarity.COMMON), + BAMBOO_SIGN(Material.BAMBOO_SIGN, Rarity.COMMON), + BAMBOO_HANGING_SIGN(Material.BAMBOO_HANGING_SIGN, Rarity.COMMON), + + WARPED_STEM(Material.WARPED_STEM, Rarity.COMMON), + STRIPPED_WARPED_STEM(Material.STRIPPED_WARPED_STEM, Rarity.COMMON), + WARPED_HYPHAE(Material.WARPED_HYPHAE, Rarity.COMMON), + STRIPPED_WARPED_HYPHAE(Material.STRIPPED_WARPED_HYPHAE, Rarity.COMMON), + WARPED_PLANKS(Material.WARPED_PLANKS, Rarity.COMMON), + WARPED_SLAB(Material.WARPED_SLAB, Rarity.COMMON), + WARPED_STAIRS(Material.WARPED_STAIRS, Rarity.COMMON), + WARPED_FENCE(Material.WARPED_FENCE, Rarity.COMMON), + WARPED_FENCE_GATE(Material.WARPED_FENCE_GATE, Rarity.COMMON), + WARPED_DOOR(Material.WARPED_DOOR, Rarity.COMMON), + WARPED_TRAPDOOR(Material.WARPED_TRAPDOOR, Rarity.COMMON), + WARPED_PRESSURE_PLATE(Material.WARPED_PRESSURE_PLATE, Rarity.COMMON), + WARPED_BUTTON(Material.WARPED_BUTTON, Rarity.COMMON), + WARPED_SIGN(Material.WARPED_SIGN, Rarity.COMMON), + WARPED_HANGING_SIGN(Material.WARPED_HANGING_SIGN, Rarity.COMMON), + + CRIMSON_STEM(Material.CRIMSON_STEM, Rarity.COMMON), + STRIPPED_CRIMSON_STEM(Material.STRIPPED_CRIMSON_STEM, Rarity.COMMON), + CRIMSON_HYPHAE(Material.CRIMSON_HYPHAE, Rarity.COMMON), + STRIPPED_CRIMSON_HYPHAE(Material.STRIPPED_CRIMSON_HYPHAE, Rarity.COMMON), + CRIMSON_PLANKS(Material.CRIMSON_PLANKS, Rarity.COMMON), + CRIMSON_SLAB(Material.CRIMSON_SLAB, Rarity.COMMON), + CRIMSON_STAIRS(Material.CRIMSON_STAIRS, Rarity.COMMON), + CRIMSON_FENCE(Material.CRIMSON_FENCE, Rarity.COMMON), + CRIMSON_FENCE_GATE(Material.CRIMSON_FENCE_GATE, Rarity.COMMON), + CRIMSON_DOOR(Material.CRIMSON_DOOR, Rarity.COMMON), + CRIMSON_TRAPDOOR(Material.CRIMSON_TRAPDOOR, Rarity.COMMON), + CRIMSON_PRESSURE_PLATE(Material.CRIMSON_PRESSURE_PLATE, Rarity.COMMON), + CRIMSON_BUTTON(Material.CRIMSON_BUTTON, Rarity.COMMON), + CRIMSON_SIGN(Material.CRIMSON_SIGN, Rarity.COMMON), + CRIMSON_HANGING_SIGN(Material.CRIMSON_HANGING_SIGN, Rarity.COMMON), + + CHAIN(Material.IRON_CHAIN, Rarity.COMMON), + LADDER(Material.LADDER, Rarity.COMMON), + STONE(Material.STONE, Rarity.COMMON), + STONE_SLAB(Material.STONE_SLAB, Rarity.COMMON), + STONE_STAIRS(Material.STONE_STAIRS, Rarity.COMMON), + SMOOTH_STONE_SLAB(Material.SMOOTH_STONE_SLAB, Rarity.COMMON), + GRANITE(Material.GRANITE, Rarity.COMMON), + GRANITE_SLAB(Material.GRANITE_SLAB, Rarity.COMMON), + GRANITE_STAIRS(Material.GRANITE_STAIRS, Rarity.COMMON), + GRANITE_WALL(Material.GRANITE_WALL, Rarity.COMMON), + POLISHED_GRANITE(Material.POLISHED_GRANITE, Rarity.COMMON), + POLISHED_GRANITE_SLAB(Material.POLISHED_GRANITE_SLAB, Rarity.COMMON), + POLISHED_GRANITE_STAIRS(Material.POLISHED_GRANITE_STAIRS, Rarity.COMMON), + DIORITE(Material.DIORITE, Rarity.COMMON), + DIORITE_SLAB(Material.DIORITE_SLAB, Rarity.COMMON), + DIORITE_STAIRS(Material.DIORITE_STAIRS, Rarity.COMMON), + DIORITE_WALL(Material.DIORITE_WALL, Rarity.COMMON), + POLISHED_DIORITE(Material.POLISHED_DIORITE, Rarity.COMMON), + POLISHED_DIORITE_SLAB(Material.POLISHED_DIORITE_SLAB, Rarity.COMMON), + POLISHED_DIORITE_STAIRS(Material.POLISHED_DIORITE_STAIRS, Rarity.COMMON), + ANDESITE(Material.ANDESITE, Rarity.COMMON), + ANDESITE_SLAB(Material.ANDESITE_SLAB, Rarity.COMMON), + ANDESITE_STAIRS(Material.ANDESITE_STAIRS, Rarity.COMMON), + ANDESITE_WALL(Material.ANDESITE_WALL, Rarity.COMMON), + POLISHED_ANDESITE(Material.POLISHED_ANDESITE, Rarity.COMMON), + POLISHED_ANDESITE_SLAB(Material.POLISHED_ANDESITE_SLAB, Rarity.COMMON), + POLISHED_ANDESITE_STAIRS(Material.POLISHED_ANDESITE_STAIRS, Rarity.COMMON), + COBBLESTONE(Material.COBBLESTONE, Rarity.COMMON), + COBBLESTONE_SLAB(Material.COBBLESTONE_SLAB, Rarity.COMMON), + COBBLESTONE_STAIRS(Material.COBBLESTONE_STAIRS, Rarity.COMMON), + COBBLESTONE_WALL(Material.COBBLESTONE_WALL, Rarity.COMMON), + SANDSTONE(Material.SANDSTONE, Rarity.COMMON), + SANDSTONE_SLAB(Material.SANDSTONE_SLAB, Rarity.COMMON), + SANDSTONE_WALL(Material.SANDSTONE_WALL, Rarity.COMMON), + CUT_SANDSTONE(Material.CUT_SANDSTONE, Rarity.COMMON), + CUT_SANDSTONE_SLAB(Material.CUT_SANDSTONE_SLAB, Rarity.COMMON), + CHISELED_SANDSTONE(Material.CHISELED_SANDSTONE, Rarity.COMMON), + RED_SANDSTONE(Material.RED_SANDSTONE, Rarity.COMMON), + RED_SANDSTONE_SLAB(Material.RED_SANDSTONE_SLAB, Rarity.COMMON), + RED_SANDSTONE_STAIRS(Material.RED_SANDSTONE_STAIRS, Rarity.COMMON), + RED_SANDSTONE_WALL(Material.RED_SANDSTONE_WALL, Rarity.COMMON), + CUT_RED_SANDSTONE(Material.CUT_RED_SANDSTONE, Rarity.COMMON), + CUT_RED_SANDSTONE_SLAB(Material.CUT_RED_SANDSTONE_SLAB, Rarity.COMMON), + CHISELED_RED_SANDSTONE(Material.CHISELED_RED_SANDSTONE, Rarity.COMMON), + STONE_BRICKS(Material.STONE_BRICKS, Rarity.COMMON), + STONE_BRICK_SLAB(Material.STONE_BRICK_SLAB, Rarity.COMMON), + STONE_BRICK_STAIRS(Material.STONE_BRICK_STAIRS, Rarity.COMMON), + STONE_BRICK_WALL(Material.STONE_BRICK_WALL, Rarity.COMMON), + MOSSY_COBBLESTONE(Material.MOSSY_COBBLESTONE, Rarity.COMMON), + MOSSY_COBBLESTONE_SLAB(Material.MOSSY_COBBLESTONE_SLAB, Rarity.COMMON), + MOSSY_COBBLESTONE_STAIRS(Material.MOSSY_COBBLESTONE_STAIRS, Rarity.COMMON), + MOSSY_COBBLESTONE_WALL(Material.MOSSY_COBBLESTONE_WALL, Rarity.COMMON), + MOSSY_STONE_BRICKS(Material.MOSSY_STONE_BRICKS, Rarity.COMMON), + MOSSY_STONE_BRICK_SLAB(Material.MOSSY_STONE_BRICK_SLAB, Rarity.COMMON), + MOSSY_STONE_BRICK_STAIRS(Material.MOSSY_STONE_BRICK_STAIRS, Rarity.COMMON), + MOSSY_STONE_BRICK_WALL(Material.MOSSY_STONE_BRICK_WALL, Rarity.COMMON), + QUARTZ_BLOCK(Material.QUARTZ_BLOCK, Rarity.COMMON), + QUARTZ_SLAB(Material.QUARTZ_SLAB, Rarity.COMMON), + QUARTZ_STAIRS(Material.QUARTZ_STAIRS, Rarity.COMMON), + QUARTZ_PILLAR(Material.QUARTZ_PILLAR, Rarity.COMMON), + CHISELED_QUARTZ_BLOCK(Material.CHISELED_QUARTZ_BLOCK, Rarity.COMMON), + NETHER_BRICK_SLAB(Material.NETHER_BRICK_SLAB, Rarity.COMMON), + NETHER_BRICK_STAIRS(Material.NETHER_BRICK_STAIRS, Rarity.COMMON), + NETHER_BRICK_WALL(Material.NETHER_BRICK_WALL, Rarity.COMMON), + NETHER_BRICK_FENCE(Material.NETHER_BRICK_FENCE, Rarity.COMMON), + HONEYCOMB(Material.HONEYCOMB, Rarity.COMMON), + + WHITE_DYE(Material.WHITE_DYE, Rarity.COMMON), + ORANGE_DYE(Material.ORANGE_DYE, Rarity.COMMON), + MAGENTA_DYE(Material.MAGENTA_DYE, Rarity.COMMON), + LIGHT_BLUE_DYE(Material.LIGHT_BLUE_DYE, Rarity.COMMON), + YELLOW_DYE(Material.YELLOW_DYE, Rarity.COMMON), + LIME_DYE(Material.LIME_DYE, Rarity.COMMON), + PINK_DYE(Material.PINK_DYE, Rarity.COMMON), + GRAY_DYE(Material.GRAY_DYE, Rarity.COMMON), + LIGHT_GRAY_DYE(Material.LIGHT_GRAY_DYE, Rarity.COMMON), + CYAN_DYE(Material.CYAN_DYE, Rarity.COMMON), + PURPLE_DYE(Material.PURPLE_DYE, Rarity.COMMON), + BLUE_DYE(Material.BLUE_DYE, Rarity.COMMON), + BROWN_DYE(Material.BROWN_DYE, Rarity.COMMON), + RED_DYE(Material.RED_DYE, Rarity.COMMON), + BLACK_DYE(Material.BLACK_DYE, Rarity.COMMON), + GREEN_DYE(Material.GREEN_DYE, Rarity.COMMON), + + WHITE_WOOL(Material.WHITE_WOOL, Rarity.COMMON), + ORANGE_WOOL(Material.ORANGE_WOOL, Rarity.COMMON), + MAGENTA_WOOL(Material.MAGENTA_WOOL, Rarity.COMMON), + LIGHT_BLUE_WOOL(Material.LIGHT_BLUE_WOOL, Rarity.COMMON), + YELLOW_WOOL(Material.YELLOW_WOOL, Rarity.COMMON), + LIME_WOOL(Material.LIME_WOOL, Rarity.COMMON), + PINK_WOOL(Material.PINK_WOOL, Rarity.COMMON), + GRAY_WOOL(Material.GRAY_WOOL, Rarity.COMMON), + LIGHT_GRAY_WOOL(Material.LIGHT_GRAY_WOOL, Rarity.COMMON), + CYAN_WOOL(Material.CYAN_WOOL, Rarity.COMMON), + PURPLE_WOOL(Material.PURPLE_WOOL, Rarity.COMMON), + BLUE_WOOL(Material.BLUE_WOOL, Rarity.COMMON), + BROWN_WOOL(Material.BROWN_WOOL, Rarity.COMMON), + GREEN_WOOL(Material.GREEN_WOOL, Rarity.COMMON), + RED_WOOL(Material.RED_WOOL, Rarity.COMMON), + BLACK_WOOL(Material.BLACK_WOOL, Rarity.COMMON), + + WHITE_CARPET(Material.WHITE_CARPET, Rarity.COMMON), + ORANGE_CARPET(Material.ORANGE_CARPET, Rarity.COMMON), + MAGENTA_CARPET(Material.MAGENTA_CARPET, Rarity.COMMON), + LIGHT_BLUE_CARPET(Material.LIGHT_BLUE_CARPET, Rarity.COMMON), + YELLOW_CARPET(Material.YELLOW_CARPET, Rarity.COMMON), + LIME_CARPET(Material.LIME_CARPET, Rarity.COMMON), + PINK_CARPET(Material.PINK_CARPET, Rarity.COMMON), + GRAY_CARPET(Material.GRAY_CARPET, Rarity.COMMON), + LIGHT_GRAY_CARPET(Material.LIGHT_GRAY_CARPET, Rarity.COMMON), + CYAN_CARPET(Material.CYAN_CARPET, Rarity.COMMON), + PURPLE_CARPET(Material.PURPLE_CARPET, Rarity.COMMON), + BLUE_CARPET(Material.BLUE_CARPET, Rarity.COMMON), + BROWN_CARPET(Material.BROWN_CARPET, Rarity.COMMON), + GREEN_CARPET(Material.GREEN_CARPET, Rarity.COMMON), + RED_CARPET(Material.RED_CARPET, Rarity.COMMON), + BLACK_CARPET(Material.BLACK_CARPET, Rarity.COMMON), + + WHITE_BED(Material.WHITE_BED, Rarity.COMMON), + ORANGE_BED(Material.ORANGE_BED, Rarity.COMMON), + MAGENTA_BED(Material.MAGENTA_BED, Rarity.COMMON), + LIGHT_BLUE_BED(Material.LIGHT_BLUE_BED, Rarity.COMMON), + YELLOW_BED(Material.YELLOW_BED, Rarity.COMMON), + LIME_BED(Material.LIME_BED, Rarity.COMMON), + PINK_BED(Material.PINK_BED, Rarity.COMMON), + GRAY_BED(Material.GRAY_BED, Rarity.COMMON), + LIGHT_GRAY_BED(Material.LIGHT_GRAY_BED, Rarity.COMMON), + CYAN_BED(Material.CYAN_BED, Rarity.COMMON), + PURPLE_BED(Material.PURPLE_BED, Rarity.COMMON), + BLUE_BED(Material.BLUE_BED, Rarity.COMMON), + BROWN_BED(Material.BROWN_BED, Rarity.COMMON), + GREEN_BED(Material.GREEN_BED, Rarity.COMMON), + RED_BED(Material.RED_BED, Rarity.COMMON), + BLACK_BED(Material.BLACK_BED, Rarity.COMMON), + + WHITE_BANNER(Material.WHITE_BANNER, Rarity.COMMON), + ORANGE_BANNER(Material.ORANGE_BANNER, Rarity.COMMON), + MAGENTA_BANNER(Material.MAGENTA_BANNER, Rarity.COMMON), + LIGHT_BLUE_BANNER(Material.LIGHT_BLUE_BANNER, Rarity.COMMON), + YELLOW_BANNER(Material.YELLOW_BANNER, Rarity.COMMON), + LIME_BANNER(Material.LIME_BANNER, Rarity.COMMON), + PINK_BANNER(Material.PINK_BANNER, Rarity.COMMON), + GRAY_BANNER(Material.GRAY_BANNER, Rarity.COMMON), + LIGHT_GRAY_BANNER(Material.LIGHT_GRAY_BANNER, Rarity.COMMON), + CYAN_BANNER(Material.CYAN_BANNER, Rarity.COMMON), + PURPLE_BANNER(Material.PURPLE_BANNER, Rarity.COMMON), + BLUE_BANNER(Material.BLUE_BANNER, Rarity.COMMON), + BROWN_BANNER(Material.BROWN_BANNER, Rarity.COMMON), + GREEN_BANNER(Material.GREEN_BANNER, Rarity.COMMON), + RED_BANNER(Material.RED_BANNER, Rarity.COMMON), + BLACK_BANNER(Material.BLACK_BANNER, Rarity.COMMON), + + CANDLE(Material.CANDLE, Rarity.COMMON), + WHITE_CANDLE(Material.WHITE_CANDLE, Rarity.COMMON), + ORANGE_CANDLE(Material.ORANGE_CANDLE, Rarity.COMMON), + MAGENTA_CANDLE(Material.MAGENTA_CANDLE, Rarity.COMMON), + LIGHT_BLUE_CANDLE(Material.LIGHT_BLUE_CANDLE, Rarity.COMMON), + YELLOW_CANDLE(Material.YELLOW_CANDLE, Rarity.COMMON), + LIME_CANDLE(Material.LIME_CANDLE, Rarity.COMMON), + PINK_CANDLE(Material.PINK_CANDLE, Rarity.COMMON), + GRAY_CANDLE(Material.GRAY_CANDLE, Rarity.COMMON), + LIGHT_GRAY_CANDLE(Material.LIGHT_GRAY_CANDLE, Rarity.COMMON), + CYAN_CANDLE(Material.CYAN_CANDLE, Rarity.COMMON), + PURPLE_CANDLE(Material.PURPLE_CANDLE, Rarity.COMMON), + BLUE_CANDLE(Material.BLUE_CANDLE, Rarity.COMMON), + BROWN_CANDLE(Material.BROWN_CANDLE, Rarity.COMMON), + GREEN_CANDLE(Material.GREEN_CANDLE, Rarity.COMMON), + RED_CANDLE(Material.RED_CANDLE, Rarity.COMMON), + BLACK_CANDLE(Material.BLACK_CANDLE, Rarity.COMMON), + + GLASS(Material.GLASS, Rarity.COMMON), + WHITE_STAINED_GLASS(Material.WHITE_STAINED_GLASS, Rarity.COMMON), + ORANGE_STAINED_GLASS(Material.ORANGE_STAINED_GLASS, Rarity.COMMON), + MAGENTA_STAINED_GLASS(Material.MAGENTA_STAINED_GLASS, Rarity.COMMON), + LIGHT_BLUE_STAINED_GLASS(Material.LIGHT_BLUE_STAINED_GLASS, Rarity.COMMON), + YELLOW_STAINED_GLASS(Material.YELLOW_STAINED_GLASS, Rarity.COMMON), + LIME_STAINED_GLASS(Material.LIME_STAINED_GLASS, Rarity.COMMON), + PINK_STAINED_GLASS(Material.PINK_STAINED_GLASS, Rarity.COMMON), + GRAY_STAINED_GLASS(Material.GRAY_STAINED_GLASS, Rarity.COMMON), + LIGHT_GRAY_STAINED_GLASS(Material.LIGHT_GRAY_STAINED_GLASS, Rarity.COMMON), + CYAN_STAINED_GLASS(Material.CYAN_STAINED_GLASS, Rarity.COMMON), + PURPLE_STAINED_GLASS(Material.PURPLE_STAINED_GLASS, Rarity.COMMON), + BLUE_STAINED_GLASS(Material.BLUE_STAINED_GLASS, Rarity.COMMON), + BROWN_STAINED_GLASS(Material.BROWN_STAINED_GLASS, Rarity.COMMON), + GREEN_STAINED_GLASS(Material.GREEN_STAINED_GLASS, Rarity.COMMON), + RED_STAINED_GLASS(Material.RED_STAINED_GLASS, Rarity.COMMON), + BLACK_STAINED_GLASS(Material.BLACK_STAINED_GLASS, Rarity.COMMON), + + GLASS_PANE(Material.GLASS_PANE, Rarity.COMMON), + WHITE_STAINED_GLASS_PANE(Material.WHITE_STAINED_GLASS_PANE, Rarity.COMMON), + ORANGE_STAINED_GLASS_PANE(Material.ORANGE_STAINED_GLASS_PANE, Rarity.COMMON), + MAGENTA_STAINED_GLASS_PANE(Material.MAGENTA_STAINED_GLASS_PANE, Rarity.COMMON), + LIGHT_BLUE_STAINED_GLASS_PANE(Material.LIGHT_BLUE_STAINED_GLASS_PANE, Rarity.COMMON), + YELLOW_STAINED_GLASS_PANE(Material.YELLOW_STAINED_GLASS_PANE, Rarity.COMMON), + LIME_STAINED_GLASS_PANE(Material.LIME_STAINED_GLASS_PANE, Rarity.COMMON), + PINK_STAINED_GLASS_PANE(Material.PINK_STAINED_GLASS_PANE, Rarity.COMMON), + GRAY_STAINED_GLASS_PANE(Material.GRAY_STAINED_GLASS_PANE, Rarity.COMMON), + LIGHT_GRAY_STAINED_GLASS_PANE(Material.LIGHT_GRAY_STAINED_GLASS_PANE, Rarity.COMMON), + CYAN_STAINED_GLASS_PANE(Material.CYAN_STAINED_GLASS_PANE, Rarity.COMMON), + PURPLE_STAINED_GLASS_PANE(Material.PURPLE_STAINED_GLASS_PANE, Rarity.COMMON), + BLUE_STAINED_GLASS_PANE(Material.BLUE_STAINED_GLASS_PANE, Rarity.COMMON), + BROWN_STAINED_GLASS_PANE(Material.BROWN_STAINED_GLASS_PANE, Rarity.COMMON), + GREEN_STAINED_GLASS_PANE(Material.GREEN_STAINED_GLASS_PANE, Rarity.COMMON), + RED_STAINED_GLASS_PANE(Material.RED_STAINED_GLASS_PANE, Rarity.COMMON), + BLACK_STAINED_GLASS_PANE(Material.BLACK_STAINED_GLASS_PANE, Rarity.COMMON), + + TERRACOTTA(Material.TERRACOTTA, Rarity.COMMON), + WHITE_TERRACOTTA(Material.WHITE_TERRACOTTA, Rarity.COMMON), + ORANGE_TERRACOTTA(Material.ORANGE_TERRACOTTA, Rarity.COMMON), + MAGENTA_TERRACOTTA(Material.MAGENTA_TERRACOTTA, Rarity.COMMON), + LIGHT_BLUE_TERRACOTTA(Material.LIGHT_BLUE_TERRACOTTA, Rarity.COMMON), + YELLOW_TERRACOTTA(Material.YELLOW_TERRACOTTA, Rarity.COMMON), + LIME_TERRACOTTA(Material.LIME_TERRACOTTA, Rarity.COMMON), + PINK_TERRACOTTA(Material.PINK_TERRACOTTA, Rarity.COMMON), + GRAY_TERRACOTTA(Material.GRAY_TERRACOTTA, Rarity.COMMON), + LIGHT_GRAY_TERRACOTTA(Material.LIGHT_GRAY_TERRACOTTA, Rarity.COMMON), + CYAN_TERRACOTTA(Material.CYAN_TERRACOTTA, Rarity.COMMON), + PURPLE_TERRACOTTA(Material.PURPLE_TERRACOTTA, Rarity.COMMON), + BLUE_TERRACOTTA(Material.BLUE_TERRACOTTA, Rarity.COMMON), + BROWN_TERRACOTTA(Material.BROWN_TERRACOTTA, Rarity.COMMON), + GREEN_TERRACOTTA(Material.GREEN_TERRACOTTA, Rarity.COMMON), + RED_TERRACOTTA(Material.RED_TERRACOTTA, Rarity.COMMON), + BLACK_TERRACOTTA(Material.BLACK_TERRACOTTA, Rarity.COMMON), + + WHITE_GLAZED_TERRACOTTA(Material.WHITE_GLAZED_TERRACOTTA, Rarity.COMMON), + ORANGE_GLAZED_TERRACOTTA(Material.ORANGE_GLAZED_TERRACOTTA, Rarity.COMMON), + MAGENTA_GLAZED_TERRACOTTA(Material.MAGENTA_GLAZED_TERRACOTTA, Rarity.COMMON), + LIGHT_BLUE_GLAZED_TERRACOTTA(Material.LIGHT_BLUE_GLAZED_TERRACOTTA, Rarity.COMMON), + YELLOW_GLAZED_TERRACOTTA(Material.YELLOW_GLAZED_TERRACOTTA, Rarity.COMMON), + LIME_GLAZED_TERRACOTTA(Material.LIME_GLAZED_TERRACOTTA, Rarity.COMMON), + PINK_GLAZED_TERRACOTTA(Material.PINK_GLAZED_TERRACOTTA, Rarity.COMMON), + GRAY_GLAZED_TERRACOTTA(Material.GRAY_GLAZED_TERRACOTTA, Rarity.COMMON), + LIGHT_GRAY_GLAZED_TERRACOTTA(Material.LIGHT_GRAY_GLAZED_TERRACOTTA, Rarity.COMMON), + CYAN_GLAZED_TERRACOTTA(Material.CYAN_GLAZED_TERRACOTTA, Rarity.COMMON), + PURPLE_GLAZED_TERRACOTTA(Material.PURPLE_GLAZED_TERRACOTTA, Rarity.COMMON), + BLUE_GLAZED_TERRACOTTA(Material.BLUE_GLAZED_TERRACOTTA, Rarity.COMMON), + BROWN_GLAZED_TERRACOTTA(Material.BROWN_GLAZED_TERRACOTTA, Rarity.COMMON), + GREEN_GLAZED_TERRACOTTA(Material.GREEN_GLAZED_TERRACOTTA, Rarity.COMMON), + RED_GLAZED_TERRACOTTA(Material.RED_GLAZED_TERRACOTTA, Rarity.COMMON), + BLACK_GLAZED_TERRACOTTA(Material.BLACK_GLAZED_TERRACOTTA, Rarity.COMMON), + + WITHER_ROSE(Material.WITHER_ROSE, Rarity.COMMON), + CORNFLOWER(Material.CORNFLOWER, Rarity.COMMON), + LILY_OF_THE_VALLEY(Material.LILY_OF_THE_VALLEY, Rarity.COMMON), + SUNFLOWER(Material.SUNFLOWER, Rarity.COMMON), + BEETROOT(Material.BEETROOT, Rarity.COMMON), + RED_TULIP(Material.RED_TULIP, Rarity.COMMON), + ORANGE_TULIP(Material.ORANGE_TULIP, Rarity.COMMON), + PINK_TULIP(Material.PINK_TULIP, Rarity.COMMON), + WHITE_TULIP(Material.WHITE_TULIP, Rarity.COMMON), + ROSE_BUSH(Material.ROSE_BUSH, Rarity.COMMON), + TORCHFLOWER(Material.TORCHFLOWER, Rarity.COMMON), + PITCHER_PLANT(Material.PITCHER_PLANT, Rarity.COMMON), + BLUE_ORCHID(Material.BLUE_ORCHID, Rarity.COMMON), + PEONY(Material.PEONY, Rarity.COMMON), + PINK_PETALS(Material.PINK_PETALS, Rarity.COMMON), + LILAC(Material.LILAC, Rarity.COMMON), + ALLIUM(Material.ALLIUM, Rarity.COMMON), + AZURE_BLUET(Material.AZURE_BLUET, Rarity.COMMON), + OXEYE_DAISY(Material.OXEYE_DAISY, Rarity.COMMON), + + BREWING_STAND(Material.BREWING_STAND, Rarity.COMMON), + ENCHANTING_TABLE(Material.ENCHANTING_TABLE, Rarity.COMMON), + FURNACE(Material.FURNACE, Rarity.COMMON), + REDSTONE_TORCH(Material.REDSTONE_TORCH, Rarity.COMMON), + REPEATER(Material.REPEATER, Rarity.COMMON), + COMPARATOR(Material.COMPARATOR, Rarity.COMMON), + LEVER(Material.LEVER, Rarity.COMMON), + STONE_BUTTON(Material.STONE_BUTTON, Rarity.COMMON), + STONE_PRESSURE_PLATE(Material.STONE_PRESSURE_PLATE, Rarity.COMMON), + LIGHT_WEIGHTED_PRESSURE_PLATE(Material.LIGHT_WEIGHTED_PRESSURE_PLATE, Rarity.COMMON), + HEAVY_WEIGHTED_PRESSURE_PLATE(Material.HEAVY_WEIGHTED_PRESSURE_PLATE, Rarity.COMMON), + TRIPWIRE_HOOK(Material.TRIPWIRE_HOOK, Rarity.COMMON), + PISTON(Material.PISTON, Rarity.COMMON), + STICKY_PISTON(Material.STICKY_PISTON, Rarity.COMMON), + DISPENSER(Material.DISPENSER, Rarity.COMMON), + DROPPER(Material.DROPPER, Rarity.COMMON), + HOPPER(Material.HOPPER, Rarity.COMMON), + NOTE_BLOCK(Material.NOTE_BLOCK, Rarity.COMMON), + RAIL(Material.RAIL, Rarity.COMMON), + ACTIVATOR_RAIL(Material.ACTIVATOR_RAIL, Rarity.COMMON), + DETECTOR_RAIL(Material.DETECTOR_RAIL, Rarity.COMMON), + POWERED_RAIL(Material.POWERED_RAIL, Rarity.COMMON), + TNT(Material.TNT, Rarity.COMMON), + DAYLIGHT_DETECTOR(Material.DAYLIGHT_DETECTOR, Rarity.COMMON), + JUKEBOX(Material.JUKEBOX, Rarity.COMMON), + MINECART(Material.MINECART, Rarity.COMMON), + CHEST_MINECART(Material.CHEST_MINECART, Rarity.COMMON), + HOPPER_MINECART(Material.HOPPER_MINECART, Rarity.COMMON), + TNT_MINECART(Material.TNT_MINECART, Rarity.COMMON), + FURNACE_MINECART(Material.FURNACE_MINECART, Rarity.COMMON), + + /** + * Enchanted Items + */ + ENCHANTED_ACACIA_LOG(Material.ACACIA_LOG, Rarity.UNCOMMON), + ENCHANTED_BAKED_POTATO(Material.BAKED_POTATO, Rarity.UNCOMMON), + ENCHANTED_BIRCH_LOG(Material.BIRCH_LOG, Rarity.UNCOMMON), + ENCHANTED_SLIMEBALL(Material.SLIME_BALL, Rarity.UNCOMMON), + ENCHANTED_BLAZE_ROD(Material.BLAZE_ROD, Rarity.UNCOMMON), + ENCHANTED_BLAZE_POWDER(Material.BLAZE_POWDER, Rarity.UNCOMMON), + ENCHANTED_BONE(Material.BONE, Rarity.UNCOMMON), + ENCHANTED_CARROT(Material.CARROT, Rarity.UNCOMMON), + ENCHANTED_CHARCOAL(Material.CHARCOAL, Rarity.UNCOMMON), + ENCHANTED_COAL(Material.COAL, Rarity.UNCOMMON), + ENCHANTED_COBBLESTONE(Material.COBBLESTONE, Rarity.UNCOMMON), + ENCHANTED_COCOA_BEANS(Material.COCOA_BEANS, Rarity.UNCOMMON), + ENCHANTED_DARK_OAK_LOG(Material.DARK_OAK_LOG, Rarity.UNCOMMON), + ENCHANTED_DIAMOND(Material.DIAMOND, Rarity.UNCOMMON), + ENCHANTED_EGG(Material.EGG, Rarity.UNCOMMON), + SUPER_ENCHANTED_EGG(Material.POLAR_BEAR_SPAWN_EGG, Rarity.RARE), + OMEGA_ENCHANTED_EGG(Material.ENDERMITE_SPAWN_EGG, Rarity.EPIC), + ENCHANTED_EMERALD(Material.EMERALD, Rarity.UNCOMMON), + ENCHANTED_ENDER_PEARL(Material.ENDER_PEARL, Rarity.UNCOMMON), + ENCHANTED_DIAMOND_BLOCK(Material.DIAMOND_BLOCK, Rarity.RARE), + ENCHANTED_EMERALD_BLOCK(Material.EMERALD_BLOCK, Rarity.UNCOMMON), + ENCHANTED_GOLD_INGOT(Material.GOLD_INGOT, Rarity.UNCOMMON), + ENCHANTED_GOLD_BLOCK(Material.GOLD_BLOCK, Rarity.RARE), + ENCHANTED_JUNGLE_LOG(Material.JUNGLE_LOG, Rarity.UNCOMMON), + ENCHANTED_GUNPOWDER(Material.GUNPOWDER, Rarity.UNCOMMON), + ENCHANTED_IRON_BLOCK(Material.IRON_BLOCK, Rarity.RARE), + ENCHANTED_LEATHER(Material.LEATHER, Rarity.UNCOMMON), + ENCHANTED_OAK_LOG(Material.OAK_LOG, Rarity.UNCOMMON), + ENCHANTED_OBSIDIAN(Material.OBSIDIAN, Rarity.UNCOMMON), + ENCHANTED_PACKED_ICE(Material.PACKED_ICE, Rarity.UNCOMMON), + ENCHANTED_POTATO(Material.POTATO, Rarity.UNCOMMON), + ENCHANTED_PUMPKIN(Material.PUMPKIN, Rarity.UNCOMMON), + ENCHANTED_REDSTONE(Material.REDSTONE, Rarity.UNCOMMON), + ENCHANTED_REDSTONE_BLOCK(Material.REDSTONE_BLOCK, Rarity.RARE), + ENCHANTED_ROTTEN_FLESH(Material.ROTTEN_FLESH, Rarity.UNCOMMON), + ENCHANTED_SPONGE(Material.SPONGE, Rarity.UNCOMMON), + ENCHANTED_SPRUCE_LOG(Material.SPRUCE_LOG, Rarity.UNCOMMON), + ENCHANTED_STRING(Material.STRING, Rarity.UNCOMMON), + ENCHANTED_SUGAR(Material.SUGAR, Rarity.UNCOMMON), + ENCHANTED_SNOW_BLOCK(Material.SNOW_BLOCK, Rarity.UNCOMMON), + ENCHANTED_BROWN_MUSHROOM(Material.BROWN_MUSHROOM, Rarity.UNCOMMON), + ENCHANTED_RED_MUSHROOM(Material.RED_MUSHROOM, Rarity.UNCOMMON), + ENCHANTED_CACTUS_GREEN(Material.GREEN_DYE, Rarity.UNCOMMON), + ENCHANTED_CACTUS(Material.CACTUS, Rarity.RARE), + ENCHANTED_END_STONE(Material.END_STONE, Rarity.UNCOMMON), + ENCHANTED_EYE_OF_ENDER(Material.ENDER_EYE, Rarity.UNCOMMON), + ENCHANTED_ICE(Material.ICE, Rarity.UNCOMMON), + ENCHANTED_MAGMA_CREAM(Material.MAGMA_CREAM, Rarity.UNCOMMON), + ENCHANTED_BROWN_MUSHROOM_BLOCK(Material.BROWN_MUSHROOM_BLOCK, Rarity.RARE), + ENCHANTED_CLAY(Material.CLAY_BALL, Rarity.UNCOMMON), + ENCHANTED_CLOWNFISH(Material.TROPICAL_FISH, Rarity.UNCOMMON), + ENCHANTED_COD(Material.COD, Rarity.UNCOMMON), + ENCHANTED_COOKED_COD(Material.COOKED_COD, Rarity.RARE), + ENCHANTED_MUTTON(Material.MUTTON, Rarity.UNCOMMON), + ENCHANTED_COOKED_MUTTON(Material.COOKED_MUTTON, Rarity.RARE), + ENCHANTED_RAW_SALMON(Material.SALMON, Rarity.UNCOMMON), + ENCHANTED_COOKED_SALMON(Material.COOKED_SALMON, Rarity.UNCOMMON), + ENCHANTED_COOKIE(Material.COOKIE, Rarity.RARE), + ENCHANTED_DANDELION(Material.DANDELION, Rarity.UNCOMMON), + ENCHANTED_FEATHER(Material.FEATHER, Rarity.UNCOMMON), + ENCHANTED_SPIDER_EYE(Material.SPIDER_EYE, Rarity.UNCOMMON), + ENCHANTED_FERMENTED_SPIDER_EYE(Material.FERMENTED_SPIDER_EYE, Rarity.UNCOMMON), + ENCHANTED_FIREWORK_ROCKET(Material.FIREWORK_ROCKET, Rarity.RARE), + ENCHANTED_FLINT(Material.FLINT, Rarity.UNCOMMON), + ENCHANTED_GHAST_TEAR(Material.GHAST_TEAR, Rarity.UNCOMMON), + ENCHANTED_GLISTERING_MELON(Material.GLISTERING_MELON_SLICE, Rarity.RARE), + ENCHANTED_GLOWSTONE_DUST(Material.GLOWSTONE_DUST, Rarity.UNCOMMON), + ENCHANTED_GLOWSTONE(Material.GLOWSTONE, Rarity.UNCOMMON), + ENCHANTED_GOLDEN_CARROT(Material.GOLDEN_CARROT, Rarity.UNCOMMON), + ENCHANTED_PORK(Material.PORKCHOP, Rarity.UNCOMMON), + ENCHANTED_GRILLED_PORK(Material.COOKED_PORKCHOP, Rarity.RARE), + ENCHANTED_HAY_BALE(Material.HAY_BLOCK, Rarity.UNCOMMON), + ENCHANTED_ANCIENT_CLAW(Material.FLINT, Rarity.EPIC), + ENCHANTED_COAL_BLOCK(Material.COAL_BLOCK, Rarity.RARE), + ENCHANTED_BONE_BLOCK(Material.BONE_BLOCK, Rarity.RARE), + ENCHANTED_BREAD(Material.BREAD, Rarity.COMMON), + ENCHANTED_RED_MUSHROOM_BLOCK(Material.RED_MUSHROOM_BLOCK, Rarity.RARE), + ENCHANTED_INK_SAC(Material.INK_SAC, Rarity.UNCOMMON), + ENCHANTED_LAPIS_LAZULI(Material.LAPIS_LAZULI, Rarity.UNCOMMON), + ENCHANTED_LAPIS_LAZULI_BLOCK(Material.LAPIS_BLOCK, Rarity.RARE), + ENCHANTED_LILY_PAD(Material.LILY_PAD, Rarity.UNCOMMON), + ENCHANTED_MELON(Material.MELON_SLICE, Rarity.UNCOMMON), + ENCHANTED_MELON_BLOCK(Material.MELON, Rarity.RARE), + ENCHANTED_MITHRIL(Material.PRISMARINE_CRYSTALS, Rarity.RARE), + ENCHANTED_MYCELIUM(Material.MYCELIUM, Rarity.UNCOMMON), + ENCHANTED_MYCELIUM_CUBE(Material.PLAYER_HEAD, Rarity.RARE), + ENCHANTED_NETHER_WART(Material.NETHER_WART, Rarity.UNCOMMON), + ENCHANTED_NETHERRACK(Material.NETHERRACK, Rarity.UNCOMMON), + ENCHANTED_PAPER(Material.PAPER, Rarity.UNCOMMON), + ENCHANTED_POISONOUS_POTATO(Material.POISONOUS_POTATO, Rarity.UNCOMMON), + ENCHANTED_POPPY(Material.POPPY, Rarity.UNCOMMON), + ENCHANTED_PRISMARINE_CRYSTALS(Material.PRISMARINE_CRYSTALS, Rarity.UNCOMMON), + ENCHANTED_PRISMARINE_SHARD(Material.PRISMARINE_SHARD, Rarity.UNCOMMON), + ENCHANTED_PUFFERFISH(Material.PUFFERFISH, Rarity.UNCOMMON), + ENCHANTED_QUARTZ(Material.QUARTZ, Rarity.UNCOMMON), + ENCHANTED_QUARTZ_BLOCK(Material.QUARTZ_BLOCK, Rarity.RARE), + ENCHANTED_RABBIT_FOOT(Material.RABBIT_FOOT, Rarity.RARE), + ENCHANTED_RABBIT_HIDE(Material.RABBIT_HIDE, Rarity.RARE), + ENCHANTED_RAW_BEEF(Material.BEEF, Rarity.UNCOMMON), + ENCHANTED_RAW_CHICKEN(Material.CHICKEN, Rarity.UNCOMMON), + ENCHANTED_RAW_RABBIT(Material.RABBIT, Rarity.UNCOMMON), + ENCHANTED_SAND(Material.SAND, Rarity.UNCOMMON), + ENCHANTED_SEEDS(Material.WHEAT_SEEDS, Rarity.UNCOMMON), + ENCHANTED_SLIME_BLOCK(Material.SLIME_BLOCK, Rarity.RARE), + ENCHANTED_SUGAR_CANE(Material.SUGAR_CANE, Rarity.RARE), + ENCHANTED_SULPHUR(Material.GLOWSTONE_DUST, Rarity.RARE), + ENCHANTED_SULPHUR_CUBE(Material.PLAYER_HEAD, Rarity.RARE), + ENCHANTED_TITANIUM(Material.PLAYER_HEAD, Rarity.EPIC), + ENCHANTED_WET_SPONGE(Material.WET_SPONGE, Rarity.RARE), + ENCHANTED_WOOL(Material.WHITE_WOOL, Rarity.UNCOMMON), + ENCHANTED_SHARK_FIN(Material.PRISMARINE_SHARD, Rarity.EPIC), + ENCHANTED_RED_SAND(Material.RED_SAND, Rarity.UNCOMMON), + ENCHANTED_RED_SAND_CUBE(Material.PLAYER_HEAD, Rarity.RARE), + ENCHANTED_BONE_MEAL(Material.BONE_MEAL, Rarity.COMMON), + ; + + public final Material material; + public final Rarity rarity; + + ItemType(Material material, Rarity rarity) { + this.material = material; + this.rarity = rarity; + } + + public static @Nullable ItemType get(String name) { + try { + return ItemType.valueOf(name.replace("minecraft:", "").toUpperCase()); + } catch (Exception e) { + return null; + } + } + + public static boolean isVanillaReplaced(String item) { + return get(item) != null; + } + + public static @Nullable ItemType fromMaterial(Material material) { + String materialName = material.key().value(); + String formattedItemName = StringUtility.toNormalCase(materialName); + + for (ItemType itemType : ItemType.values()) { + if (itemType.material == material && + formattedItemName.equals(StringUtility.toNormalCase(itemType.getDisplayName()))) { + return itemType; + } + } + return null; + } + + @SneakyThrows + public String getDisplayName() { + return StringUtility.toNormalCase(this.name()); + } } \ No newline at end of file diff --git a/commons/src/main/java/net/swofty/commons/item/attribute/attributes/ItemAttributeDyeColor.java b/commons/src/main/java/net/swofty/commons/item/attribute/attributes/ItemAttributeDyeColor.java new file mode 100644 index 000000000..64902c09c --- /dev/null +++ b/commons/src/main/java/net/swofty/commons/item/attribute/attributes/ItemAttributeDyeColor.java @@ -0,0 +1,31 @@ +package net.swofty.commons.item.attribute.attributes; + +import net.swofty.commons.item.attribute.ItemAttribute; +import net.swofty.commons.statistics.ItemStatistics; +import org.jetbrains.annotations.Nullable; + +public class ItemAttributeDyeColor extends ItemAttribute { + + @Override + public String getKey() { + return "dye_color"; + } + + @Override + public String getDefaultValue(@Nullable ItemStatistics defaultStatistics) { + return null; + } + + @Override + public String loadFromString(String string) { + if (string == null || string.isEmpty() || string.equals("null")) { + return null; + } + return string; + } + + @Override + public String saveIntoString() { + return getValue() != null ? getValue() : "null"; + } +} diff --git a/commons/src/main/java/net/swofty/commons/item/attribute/attributes/ItemAttributeNewYearCakeYear.java b/commons/src/main/java/net/swofty/commons/item/attribute/attributes/ItemAttributeNewYearCakeYear.java new file mode 100644 index 000000000..8acfd2821 --- /dev/null +++ b/commons/src/main/java/net/swofty/commons/item/attribute/attributes/ItemAttributeNewYearCakeYear.java @@ -0,0 +1,28 @@ +package net.swofty.commons.item.attribute.attributes; + +import net.swofty.commons.item.attribute.ItemAttribute; +import net.swofty.commons.statistics.ItemStatistic; +import net.swofty.commons.statistics.ItemStatistics; +import org.jetbrains.annotations.Nullable; + +public class ItemAttributeNewYearCakeYear extends ItemAttribute { + @Override + public String getKey() { + return "new-year-cake-year"; + } + + @Override + public Integer getDefaultValue(@Nullable ItemStatistics defaultStatistics) { + return -1; + } + + @Override + public Integer loadFromString(String string) { + return Integer.valueOf(string); + } + + @Override + public String saveIntoString() { + return this.value.toString(); + } +} diff --git a/commons/src/main/java/net/swofty/commons/protocol/objects/darkauction/DarkAuctionEventProtocol.java b/commons/src/main/java/net/swofty/commons/protocol/objects/darkauction/DarkAuctionEventProtocol.java new file mode 100644 index 000000000..85cd48209 --- /dev/null +++ b/commons/src/main/java/net/swofty/commons/protocol/objects/darkauction/DarkAuctionEventProtocol.java @@ -0,0 +1,144 @@ +package net.swofty.commons.protocol.objects.darkauction; + +import net.swofty.commons.auctions.DarkAuctionPhase; +import net.swofty.commons.protocol.ProtocolObject; +import net.swofty.commons.protocol.Serializer; +import org.json.JSONArray; +import org.json.JSONObject; + +import java.util.ArrayList; +import java.util.List; +import java.util.UUID; + +public class DarkAuctionEventProtocol extends ProtocolObject< + DarkAuctionEventProtocol.DarkAuctionMessage, + DarkAuctionEventProtocol.DarkAuctionResponse> { + + public enum EventType { + AUCTION_START, // Spawn Sirius, open door + AUCTION_BEGIN, // Start bidding (after 35 sec queue) + ROUND_START, // New round with item + BID_PLACED, // Someone bid (sync across hubs) + ROUND_END, // Round finished, winner announced + AUCTION_END // Auction complete, cleanup + } + + @Override + public Serializer getSerializer() { + return new Serializer<>() { + @Override + public String serialize(DarkAuctionMessage value) { + JSONObject json = new JSONObject(); + json.put("eventType", value.eventType.name()); + json.put("auctionId", value.auctionId.toString()); + json.put("phase", value.phase.name()); + json.put("currentRound", value.currentRound); + json.put("currentItemType", value.currentItemType); + json.put("currentBid", value.currentBid); + json.put("highestBidderId", value.highestBidderId != null ? value.highestBidderId.toString() : null); + json.put("highestBidderName", value.highestBidderName); + json.put("countdown", value.countdown); + + JSONArray itemsArray = new JSONArray(); + for (String item : value.roundItems) { + itemsArray.put(item); + } + json.put("roundItems", itemsArray); + + // Refund info for BID_PLACED events + json.put("refundPlayerId", value.refundPlayerId != null ? value.refundPlayerId.toString() : null); + json.put("refundAmount", value.refundAmount); + + return json.toString(); + } + + @Override + public DarkAuctionMessage deserialize(String json) { + JSONObject jsonObject = new JSONObject(json); + + EventType eventType = EventType.valueOf(jsonObject.getString("eventType")); + UUID auctionId = UUID.fromString(jsonObject.getString("auctionId")); + DarkAuctionPhase phase = DarkAuctionPhase.valueOf(jsonObject.getString("phase")); + int currentRound = jsonObject.getInt("currentRound"); + String currentItemType = jsonObject.optString("currentItemType", null); + long currentBid = jsonObject.getLong("currentBid"); + + String bidderIdStr = jsonObject.optString("highestBidderId", null); + UUID highestBidderId = bidderIdStr != null && !bidderIdStr.equals("null") ? UUID.fromString(bidderIdStr) : null; + String highestBidderName = jsonObject.optString("highestBidderName", null); + int countdown = jsonObject.getInt("countdown"); + + List roundItems = new ArrayList<>(); + JSONArray itemsArray = jsonObject.optJSONArray("roundItems"); + if (itemsArray != null) { + for (int i = 0; i < itemsArray.length(); i++) { + roundItems.add(itemsArray.getString(i)); + } + } + + String refundPlayerIdStr = jsonObject.optString("refundPlayerId", null); + UUID refundPlayerId = refundPlayerIdStr != null && !refundPlayerIdStr.equals("null") ? UUID.fromString(refundPlayerIdStr) : null; + long refundAmount = jsonObject.optLong("refundAmount", 0); + + return new DarkAuctionMessage(eventType, auctionId, phase, currentRound, currentItemType, + currentBid, highestBidderId, highestBidderName, countdown, roundItems, + refundPlayerId, refundAmount); + } + + @Override + public DarkAuctionMessage clone(DarkAuctionMessage value) { + return new DarkAuctionMessage(value.eventType, value.auctionId, value.phase, value.currentRound, + value.currentItemType, value.currentBid, value.highestBidderId, + value.highestBidderName, value.countdown, new ArrayList<>(value.roundItems), + value.refundPlayerId, value.refundAmount); + } + }; + } + + @Override + public Serializer getReturnSerializer() { + return new Serializer<>() { + @Override + public String serialize(DarkAuctionResponse value) { + JSONObject json = new JSONObject(); + json.put("success", value.success); + json.put("playersInAuction", value.playersInAuction); + return json.toString(); + } + + @Override + public DarkAuctionResponse deserialize(String json) { + JSONObject jsonObject = new JSONObject(json); + return new DarkAuctionResponse( + jsonObject.getBoolean("success"), + jsonObject.getInt("playersInAuction") + ); + } + + @Override + public DarkAuctionResponse clone(DarkAuctionResponse value) { + return new DarkAuctionResponse(value.success, value.playersInAuction); + } + }; + } + + public record DarkAuctionMessage( + EventType eventType, + UUID auctionId, + DarkAuctionPhase phase, + int currentRound, + String currentItemType, + long currentBid, + UUID highestBidderId, + String highestBidderName, + int countdown, + List roundItems, + UUID refundPlayerId, + long refundAmount + ) {} + + public record DarkAuctionResponse( + boolean success, + int playersInAuction + ) {} +} diff --git a/commons/src/main/java/net/swofty/commons/protocol/objects/darkauction/GetAuctionStateProtocol.java b/commons/src/main/java/net/swofty/commons/protocol/objects/darkauction/GetAuctionStateProtocol.java new file mode 100644 index 000000000..a54efeb0f --- /dev/null +++ b/commons/src/main/java/net/swofty/commons/protocol/objects/darkauction/GetAuctionStateProtocol.java @@ -0,0 +1,115 @@ +package net.swofty.commons.protocol.objects.darkauction; + +import net.swofty.commons.auctions.DarkAuctionPhase; +import net.swofty.commons.protocol.ProtocolObject; +import net.swofty.commons.protocol.Serializer; +import org.json.JSONArray; +import org.json.JSONObject; + +import java.util.ArrayList; +import java.util.List; +import java.util.UUID; + +public class GetAuctionStateProtocol extends ProtocolObject< + GetAuctionStateProtocol.GetAuctionStateMessage, + GetAuctionStateProtocol.GetAuctionStateResponse> { + + @Override + public Serializer getSerializer() { + return new Serializer<>() { + @Override + public String serialize(GetAuctionStateMessage value) { + return ""; + } + + @Override + public GetAuctionStateMessage deserialize(String json) { + return new GetAuctionStateMessage(); + } + + @Override + public GetAuctionStateMessage clone(GetAuctionStateMessage value) { + return new GetAuctionStateMessage(); + } + }; + } + + @Override + public Serializer getReturnSerializer() { + return new Serializer<>() { + @Override + public String serialize(GetAuctionStateResponse value) { + JSONObject json = new JSONObject(); + json.put("auctionActive", value.auctionActive); + if (value.auctionActive) { + json.put("auctionId", value.auctionId.toString()); + json.put("phase", value.phase.toString()); + json.put("currentRound", value.currentRound); + json.put("currentItemType", value.currentItemType); + json.put("currentBid", value.currentBid); + json.put("highestBidderId", value.highestBidderId != null ? value.highestBidderId.toString() : null); + json.put("highestBidderName", value.highestBidderName); + + JSONArray itemsArray = new JSONArray(); + for (String item : value.roundItems) { + itemsArray.put(item); + } + json.put("roundItems", itemsArray); + } + return json.toString(); + } + + @Override + public GetAuctionStateResponse deserialize(String json) { + JSONObject jsonObject = new JSONObject(json); + boolean auctionActive = jsonObject.getBoolean("auctionActive"); + + if (!auctionActive) { + return new GetAuctionStateResponse(false, null, null, 0, null, 0, null, null, List.of()); + } + + UUID auctionId = UUID.fromString(jsonObject.getString("auctionId")); + String phase = jsonObject.getString("phase"); + int currentRound = jsonObject.getInt("currentRound"); + String currentItemType = jsonObject.optString("currentItemType", null); + long currentBid = jsonObject.getLong("currentBid"); + + String bidderIdStr = jsonObject.optString("highestBidderId", null); + UUID highestBidderId = bidderIdStr != null && !bidderIdStr.equals("null") ? UUID.fromString(bidderIdStr) : null; + String highestBidderName = jsonObject.optString("highestBidderName", null); + + List roundItems = new ArrayList<>(); + JSONArray itemsArray = jsonObject.optJSONArray("roundItems"); + if (itemsArray != null) { + for (int i = 0; i < itemsArray.length(); i++) { + roundItems.add(itemsArray.getString(i)); + } + } + + return new GetAuctionStateResponse(true, auctionId, DarkAuctionPhase.valueOf(phase), currentRound, currentItemType, + currentBid, highestBidderId, highestBidderName, roundItems); + } + + @Override + public GetAuctionStateResponse clone(GetAuctionStateResponse value) { + return new GetAuctionStateResponse(value.auctionActive, value.auctionId, value.phase, + value.currentRound, value.currentItemType, value.currentBid, + value.highestBidderId, value.highestBidderName, new ArrayList<>(value.roundItems)); + } + }; + } + + public record GetAuctionStateMessage() {} + + public record GetAuctionStateResponse( + boolean auctionActive, + UUID auctionId, + DarkAuctionPhase phase, + int currentRound, + String currentItemType, + long currentBid, + UUID highestBidderId, + String highestBidderName, + List roundItems + ) {} +} diff --git a/commons/src/main/java/net/swofty/commons/protocol/objects/darkauction/PlaceBidProtocol.java b/commons/src/main/java/net/swofty/commons/protocol/objects/darkauction/PlaceBidProtocol.java new file mode 100644 index 000000000..49d18c153 --- /dev/null +++ b/commons/src/main/java/net/swofty/commons/protocol/objects/darkauction/PlaceBidProtocol.java @@ -0,0 +1,82 @@ +package net.swofty.commons.protocol.objects.darkauction; + +import net.swofty.commons.protocol.ProtocolObject; +import net.swofty.commons.protocol.Serializer; +import org.json.JSONObject; + +import java.util.UUID; + +public class PlaceBidProtocol extends ProtocolObject< + PlaceBidProtocol.PlaceBidMessage, + PlaceBidProtocol.PlaceBidResponse> { + + @Override + public Serializer getSerializer() { + return new Serializer<>() { + @Override + public String serialize(PlaceBidMessage value) { + JSONObject json = new JSONObject(); + json.put("auctionId", value.auctionId.toString()); + json.put("playerId", value.playerId.toString()); + json.put("playerName", value.playerName); + json.put("bidAmount", value.bidAmount); + return json.toString(); + } + + @Override + public PlaceBidMessage deserialize(String json) { + JSONObject jsonObject = new JSONObject(json); + return new PlaceBidMessage( + UUID.fromString(jsonObject.getString("auctionId")), + UUID.fromString(jsonObject.getString("playerId")), + jsonObject.getString("playerName"), + jsonObject.getLong("bidAmount") + ); + } + + @Override + public PlaceBidMessage clone(PlaceBidMessage value) { + return new PlaceBidMessage(value.auctionId, value.playerId, value.playerName, value.bidAmount); + } + }; + } + + @Override + public Serializer getReturnSerializer() { + return new Serializer<>() { + @Override + public String serialize(PlaceBidResponse value) { + JSONObject json = new JSONObject(); + json.put("success", value.success); + json.put("message", value.message); + return json.toString(); + } + + @Override + public PlaceBidResponse deserialize(String json) { + JSONObject jsonObject = new JSONObject(json); + return new PlaceBidResponse( + jsonObject.getBoolean("success"), + jsonObject.getString("message") + ); + } + + @Override + public PlaceBidResponse clone(PlaceBidResponse value) { + return new PlaceBidResponse(value.success, value.message); + } + }; + } + + public record PlaceBidMessage( + UUID auctionId, + UUID playerId, + String playerName, + long bidAmount + ) {} + + public record PlaceBidResponse( + boolean success, + String message + ) {} +} diff --git a/commons/src/main/java/net/swofty/commons/protocol/objects/darkauction/PlayerLeftAuctionProtocol.java b/commons/src/main/java/net/swofty/commons/protocol/objects/darkauction/PlayerLeftAuctionProtocol.java new file mode 100644 index 000000000..848a7c466 --- /dev/null +++ b/commons/src/main/java/net/swofty/commons/protocol/objects/darkauction/PlayerLeftAuctionProtocol.java @@ -0,0 +1,85 @@ +package net.swofty.commons.protocol.objects.darkauction; + +import net.swofty.commons.protocol.ProtocolObject; +import net.swofty.commons.protocol.Serializer; +import org.json.JSONObject; + +import java.util.UUID; + +public class PlayerLeftAuctionProtocol extends ProtocolObject< + PlayerLeftAuctionProtocol.PlayerLeftMessage, + PlayerLeftAuctionProtocol.PlayerLeftResponse> { + + @Override + public Serializer getSerializer() { + return new Serializer<>() { + @Override + public String serialize(PlayerLeftMessage value) { + JSONObject json = new JSONObject(); + json.put("playerId", value.playerId.toString()); + json.put("playerName", value.playerName); + if (value.auctionId != null) { + json.put("auctionId", value.auctionId.toString()); + } + return json.toString(); + } + + @Override + public PlayerLeftMessage deserialize(String json) { + JSONObject jsonObject = new JSONObject(json); + UUID auctionId = null; + if (jsonObject.has("auctionId") && !jsonObject.isNull("auctionId")) { + auctionId = UUID.fromString(jsonObject.getString("auctionId")); + } + return new PlayerLeftMessage( + UUID.fromString(jsonObject.getString("playerId")), + jsonObject.getString("playerName"), + auctionId + ); + } + + @Override + public PlayerLeftMessage clone(PlayerLeftMessage value) { + return new PlayerLeftMessage(value.playerId, value.playerName, value.auctionId); + } + }; + } + + @Override + public Serializer getReturnSerializer() { + return new Serializer<>() { + @Override + public String serialize(PlayerLeftResponse value) { + JSONObject json = new JSONObject(); + json.put("success", value.success); + json.put("refundAmount", value.refundAmount); + return json.toString(); + } + + @Override + public PlayerLeftResponse deserialize(String json) { + JSONObject jsonObject = new JSONObject(json); + return new PlayerLeftResponse( + jsonObject.getBoolean("success"), + jsonObject.getLong("refundAmount") + ); + } + + @Override + public PlayerLeftResponse clone(PlayerLeftResponse value) { + return new PlayerLeftResponse(value.success, value.refundAmount); + } + }; + } + + public record PlayerLeftMessage( + UUID playerId, + String playerName, + UUID auctionId + ) {} + + public record PlayerLeftResponse( + boolean success, + long refundAmount + ) {} +} diff --git a/commons/src/main/java/net/swofty/commons/protocol/objects/darkauction/TriggerDarkAuctionProtocol.java b/commons/src/main/java/net/swofty/commons/protocol/objects/darkauction/TriggerDarkAuctionProtocol.java new file mode 100644 index 000000000..fcfd748e1 --- /dev/null +++ b/commons/src/main/java/net/swofty/commons/protocol/objects/darkauction/TriggerDarkAuctionProtocol.java @@ -0,0 +1,70 @@ +package net.swofty.commons.protocol.objects.darkauction; + +import net.swofty.commons.protocol.ProtocolObject; +import net.swofty.commons.protocol.Serializer; +import org.json.JSONObject; + +public class TriggerDarkAuctionProtocol extends ProtocolObject< + TriggerDarkAuctionProtocol.TriggerMessage, + TriggerDarkAuctionProtocol.TriggerResponse> { + + @Override + public Serializer getSerializer() { + return new Serializer<>() { + @Override + public String serialize(TriggerMessage value) { + JSONObject json = new JSONObject(); + json.put("calendarTime", value.calendarTime); + json.put("forced", value.forced); + return json.toString(); + } + + @Override + public TriggerMessage deserialize(String json) { + JSONObject jsonObject = new JSONObject(json); + long calendarTime = jsonObject.optLong("calendarTime", 0); + boolean forced = jsonObject.optBoolean("forced", false); + return new TriggerMessage(calendarTime, forced); + } + + @Override + public TriggerMessage clone(TriggerMessage value) { + return new TriggerMessage(value.calendarTime, value.forced); + } + }; + } + + @Override + public Serializer getReturnSerializer() { + return new Serializer<>() { + @Override + public String serialize(TriggerResponse value) { + JSONObject json = new JSONObject(); + json.put("success", value.success); + json.put("message", value.message); + return json.toString(); + } + + @Override + public TriggerResponse deserialize(String json) { + JSONObject jsonObject = new JSONObject(json); + boolean success = jsonObject.getBoolean("success"); + String message = jsonObject.optString("message", ""); + return new TriggerResponse(success, message); + } + + @Override + public TriggerResponse clone(TriggerResponse value) { + return new TriggerResponse(value.success, value.message); + } + }; + } + + public record TriggerMessage(long calendarTime, boolean forced) { + public TriggerMessage(long calendarTime) { + this(calendarTime, false); + } + } + + public record TriggerResponse(boolean success, String message) {} +} diff --git a/commons/src/main/java/net/swofty/commons/service/FromServiceChannels.java b/commons/src/main/java/net/swofty/commons/service/FromServiceChannels.java index 20075ea23..b5e0f3516 100644 --- a/commons/src/main/java/net/swofty/commons/service/FromServiceChannels.java +++ b/commons/src/main/java/net/swofty/commons/service/FromServiceChannels.java @@ -11,7 +11,9 @@ public enum FromServiceChannels { KICK_FROM_GUI("kick-from-gui"), PROPAGATE_BAZAAR_TRANSACTION("propagate-bazaar-transaction"), SEND_MESSAGE("send-message"), - PROPAGATE_PARTY_EVENT("propagate_party_event"); + PROPAGATE_PARTY_EVENT("propagate_party_event"), + DARK_AUCTION_EVENT("dark-auction-event"), + TRIGGER_DARK_AUCTION("trigger-dark-auction"), ; private final String channelName; diff --git a/configuration/resources.json b/configuration/resources.json index deaff180f..c11939188 100644 --- a/configuration/resources.json +++ b/configuration/resources.json @@ -2,7 +2,7 @@ "mongodb": "mongodb://localhost", "redis-uri": "redis://localhost:6379", "velocity-secret": "ixmSUgWOgvs7", - "limbo-host-name": "0.0.0.0", + "limbo-host-name": "127.0.0.1", "limbo-port": "65535", "pterodactyl-mode": false, "spark": false, @@ -11,5 +11,5 @@ "host-name": "0.0.0.0", "transfer-timeout": "800", "sandbox-mode": true, - "anticheat": true + "anticheat": false } \ No newline at end of file diff --git a/configuration/settings.yml b/configuration/settings.yml index 780a80569..8fbd8eeb5 100644 --- a/configuration/settings.yml +++ b/configuration/settings.yml @@ -4,7 +4,7 @@ # Server's host address and port. Set ip empty to use public address bind: - ip: 'localhost' + ip: '0.0.0.0' port: 65535 # Max number of players can join to server @@ -52,7 +52,7 @@ secureProfile: false # For 1.13+ clients brandName: enable: true - content: 'NanoLimbo' + content: 'Hypixel' # Message sends when player joins to the server joinMessage: @@ -75,9 +75,9 @@ bossBar: title: enable: false # Set title text value empty, if you need only subtitle - title: '' + title: '{"text": ""}' # Set subtitle text value empty, if you need only title - subtitle: '' + subtitle: '{"text": ""}' # Fade in time in ticks (1 sec = 20 ticks) fadeIn: 10 # Stay time in ticks diff --git a/configuration/skyblock/Minestom.regions.csv b/configuration/skyblock/Minestom.regions.csv index 86ee17ce2..a5f36c942 100644 --- a/configuration/skyblock/Minestom.regions.csv +++ b/configuration/skyblock/Minestom.regions.csv @@ -54,14 +54,14 @@ coalmine_4,COAL_MINE,-4,71,-230,-41,64,-161,HUB coalmine_5,COAL_MINE,-15,75,-152,4,64,-167,HUB coalmine_6,COAL_MINE,4,64,-165,-20,73,-182,HUB coalmine_7,COAL_MINE,-7,69,-178,3,63,-165,HUB -#goldmine_1,GOLD_MINE,52,136,-261,-106,14,-404, -#deepcavern_1,DEEP_CAVERN,181,235,-945,384,0,-1129, -#gunpowder,GUNPOWDER_MINES,408,160,-1015,211,143,-1119, -#lapis_quarry,LAPIS_QUARRY,211,143,-1119,400,114,-980, -#pigmens_den,PIGMENS_DEN,400,114,-980,223,85,-1118, -#slimehill,SLIMEHILL,223,85,-1118,376,52,-983, -#diamond_reserve,DIAMOND_RESERVE,376,52,-983,213,28,-1131, -#obsidian_sanctuary,OBSIDIAN_SANCTUARY,213,28,-1131,370,0,-1009, +goldmine_1,GOLD_MINE,52,136,-261,-106,14,-404,GOLD_MINE +deepcavern_1,DEEP_CAVERNS,-68,235,112,135,0,-72,DEEP_CAVERNS +gunpowder,GUNPOWDER_MINES,159,165,42,-38,143,-62,DEEP_CAVERNS +lapis_quarry,LAPIS_QUARRY,-38,143,-62,151,114,77,DEEP_CAVERNS +pigmens_den,PIGMENS_DEN,151,114,77,-26,85,-61,DEEP_CAVERNS +slimehill,SLIMEHILL,-26,85,-61,127,52,74,DEEP_CAVERNS +diamond_reserve,DIAMOND_RESERVE,127,52,74,-36,28,-74,DEEP_CAVERNS +obsidian_sanctuary,OBSIDIAN_SANCTUARY,-36,28,-74,121,0,48,DEEP_CAVERNS #the_end_nest_1,THE_END_NEST,78,117,-87,149,0,85, #the_end_1,THE_END,150,177,146,190,23,-115, #dragons_nest_2,DRAGONS_NEST,-34,1,68,-92,68,-52, @@ -69,15 +69,15 @@ coalmine_7,COAL_MINE,-7,69,-178,3,63,-165,HUB #spiders_den_2,SPIDERS_DEN,-408,195,-368,-178,13,-183, #spiders_den_3,SPIDERS_DEN,-226,6,-130,-408,195,-368, #spiders_den_hive_1,SPIDERS_DEN_HIVE,-236,102,-249,-149,195,-353, -#dwarvenmines1,DWARVEN_MINES,-407,255,530,144,3,1026, -#forge1,THE_FORGE,-198,168,693,-134,144,610, -#forge2,FORGE_BASIN,-180,189,734,-147,144,697, -#divb1,DIVANS_GATEWAY,-157,127,786,-174,149,863, -#icewall,GREAT_ICE_WALL,-139,169,873,-189,126,909, -#gb1,GOBLIN_BURROWS,-211,170,949,-260,154,834, -#gb2,GOBLIN_BURROWS,-224,163,915,-356,131,845, -#mist1,THE_MIST,-224,83,737,36,63,895, -#cliffv,CLIFFSIDE_VEINS,-158,154,758,-72,114,791, +dwarvenmines1,DWARVEN_MINES,-243,255,-205,308,3,291,DWARVEN_MINES +forge1,THE_FORGE,-34,168,-42,30,144,-125,DWARVEN_MINES +forge2,FORGE_BASIN,-16,189,-1,17,144,-38,DWARVEN_MINES +divb1,DIVANS_GATEWAY,7,127,51,-10,149,128,DWARVEN_MINES +icewall,GREAT_ICE_WALL,25,169,138,-25,126,174,DWARVEN_MINES +gb1,GOBLIN_BURROWS,-47,170,214,-96,154,99,DWARVEN_MINES +gb2,GOBLIN_BURROWS,-60,163,180,-192,131,110,DWARVEN_MINES +mist1,THE_MIST,-60,83,2,200,63,160,DWARVEN_MINES +cliffv,CLIFFSIDE_VEINS,6,154,23,92,114,56,DWARVEN_MINES #vs1,VOID_SEPULTURE,100,62,-17,56,7,-96, #vs2,VOID_SEPULTURE,68,70,-96,140,23,-21, #vs3,VOID_SEPULTURE,74,50,-51,49,8,-91, diff --git a/configuration/skyblock/items/armor/lapis.yml b/configuration/skyblock/items/armor/lapis.yml new file mode 100644 index 000000000..ab0cb7e74 --- /dev/null +++ b/configuration/skyblock/items/armor/lapis.yml @@ -0,0 +1,81 @@ +items: + - id: LAPIS_HELMET + rarity: COMMON + default_statistics: + defense: 25 + mining_speed: 20 + mining_fortune: 2 + components: + - id: CUSTOM_DISPLAY_NAME + display_name: Lapis Armor Helmet + - id: STANDARD_ITEM + standard_item_type: HELMET + - id: LEATHER_COLOR + r: '122' + g: '121' + b: '100' + - id: SELLABLE + value: 1000.0 + - id: TRACKED_UNIQUE + - id: MUSEUM + museum_category: ARMOR_SETS + - id: LAPIS_CHESTPLATE + rarity: COMMON + default_statistics: + defense: 40 + mining_speed: 20 + mining_fortune: 2 + components: + - id: CUSTOM_DISPLAY_NAME + display_name: Lapis Armor Chestplate + - id: STANDARD_ITEM + standard_item_type: CHESTPLATE + - id: LEATHER_COLOR + r: '122' + g: '121' + b: '100' + - id: SELLABLE + value: 2000.0 + - id: TRACKED_UNIQUE + - id: MUSEUM + museum_category: ARMOR_SETS + - id: LAPIS_LEGGINGS + rarity: COMMON + default_statistics: + defense: 35 + mining_speed: 20 + mining_fortune: 2 + components: + - id: CUSTOM_DISPLAY_NAME + display_name: Lapis Armor Leggings + - id: STANDARD_ITEM + standard_item_type: LEGGINGS + - id: LEATHER_COLOR + r: '122' + g: '121' + b: '100' + - id: SELLABLE + value: 1750.0 + - id: TRACKED_UNIQUE + - id: MUSEUM + museum_category: ARMOR_SETS + - id: LAPIS_BOOTS + rarity: COMMON + default_statistics: + defense: 20 + mining_speed: 20 + mining_fortune: 2 + components: + - id: CUSTOM_DISPLAY_NAME + display_name: Lapis Armor Boots + - id: STANDARD_ITEM + standard_item_type: BOOTS + - id: LEATHER_COLOR + r: '122' + g: '121' + b: '100' + - id: SELLABLE + value: 1000.0 + - id: TRACKED_UNIQUE + - id: MUSEUM + museum_category: ARMOR_SETS diff --git a/configuration/skyblock/items/armor/miner.yml b/configuration/skyblock/items/armor/miner.yml new file mode 100644 index 000000000..4bb7a6946 --- /dev/null +++ b/configuration/skyblock/items/armor/miner.yml @@ -0,0 +1,37 @@ +items: + - id: DIAMOND_HELMET + material: DIAMOND_HELMET + rarity: RARE + components: + - id: STANDARD_ITEM + standard_item_type: HELMET + default_statistics: + defense: 15.0 + mining_speed: 10.0 + - id: DIAMOND_CHESTPLATE + material: DIAMOND_CHESTPLATE + rarity: RARE + components: + - id: STANDARD_ITEM + standard_item_type: CHESTPLATE + default_statistics: + defense: 15.0 + mining_speed: 10.0 + - id: DIAMOND_LEGGINGS + material: DIAMOND_LEGGINGS + rarity: RARE + components: + - id: STANDARD_ITEM + standard_item_type: LEGGINGS + default_statistics: + defense: 15.0 + mining_speed: 10.0 + - id: DIAMOND_BOOTS + material: DIAMOND_BOOTS + rarity: RARE + components: + - id: STANDARD_ITEM + standard_item_type: BOOTS + default_statistics: + defense: 15.0 + mining_speed: 10.0 \ No newline at end of file diff --git a/configuration/skyblock/items/mining/dwarven.yml b/configuration/skyblock/items/mining/dwarven.yml index 226cd30e4..5d0f56483 100644 --- a/configuration/skyblock/items/mining/dwarven.yml +++ b/configuration/skyblock/items/mining/dwarven.yml @@ -13,6 +13,9 @@ items: components: - id: SELLABLE value: 8.0 + - id: SKILLABLE_MINE + category: MINING + mining_value: 6.0 - id: PLASMA rarity: COMMON components: diff --git a/configuration/skyblock/items/mining/pickaxe.yml b/configuration/skyblock/items/mining/pickaxe.yml new file mode 100644 index 000000000..58f25fde4 --- /dev/null +++ b/configuration/skyblock/items/mining/pickaxe.yml @@ -0,0 +1,11 @@ +items: + - id: PROMISING_PICKAXE + rarity: UNCOMMON + default_statistics: + damage: 30.0 + mining_speed: 1500.0 + breaking_power: 3.0 + components: + - id: PICKAXE + - id: SELLABLE + value: 10.0 diff --git a/configuration/skyblock/items/miscellaneous/abiphones.yml b/configuration/skyblock/items/miscellaneous/abiphones.yml new file mode 100644 index 000000000..3a2ee6f44 --- /dev/null +++ b/configuration/skyblock/items/miscellaneous/abiphones.yml @@ -0,0 +1,94 @@ +items: + - id: ABIPHONE_BASIC + material: PLAYER_HEAD + rarity: COMMON + components: + - id: ABIPHONE + max_contacts: 6 + max_discs: 0 + features: + - CONTACTS_DIRECTORY + - id: CUSTOM_DISPLAY_NAME + display_name: Abiphone Basic + - id: SKULL_HEAD + texture: e471c673a875425428d4b5ecf78a24d86ea65ae6599633e6514bbaafd7fa561f + - id: ABIPHONE_X_RED + material: PLAYER_HEAD + rarity: UNCOMMON + components: + - id: ABIPHONE + max_contacts: 7 + max_discs: 0 + features: + - CONTACTS_DIRECTORY + - id: CUSTOM_DISPLAY_NAME + display_name: Abiphone X Red + - id: SKULL_HEAD + texture: d256584eea6825150a415fc18daa532b9139cca454f969f2210355de10a15a4 + - id: ABIPHONE_X_BLUE + material: PLAYER_HEAD + rarity: COMMON + components: + - id: ABIPHONE + max_contacts: 7 + max_discs: 0 + features: + - CONTACTS_DIRECTORY + - id: CUSTOM_DISPLAY_NAME + display_name: Abiphone X Blue + - id: SKULL_HEAD + texture: 76116a4cb5d1c9c2e9c3912f118206b2a8b0c48e6daa4a1f489821eb58264224 + - id: ABIPHONE_XI_YELLOW + material: PLAYER_HEAD + rarity: UNCOMMON + components: + - id: ABIPHONE + max_contacts: 8 + max_discs: 5 + features: + - CONTACTS_DIRECTORY + - id: CUSTOM_DISPLAY_NAME + display_name: Abiphone XI Yellow + - id: SKULL_HEAD + texture: 5e065a2b61a89e96e302737a7c928e24bfd3b7ae498210324ccd0e84332046f6 + - id: ABIPHONE_XI_GREEN + material: PLAYER_HEAD + rarity: UNCOMMON + components: + - id: ABIPHONE + max_contacts: 8 + max_discs: 5 + features: + - CONTACTS_DIRECTORY + - id: CUSTOM_DISPLAY_NAME + display_name: Abiphone XI Green + - id: SKULL_HEAD + texture: 5e065a2b61a89e96e302737a7c928e24bfd3b7ae498210324ccd0e84332046f6 + - id: ABIPHONE_XII_AMBER + material: PLAYER_HEAD + rarity: RARE + components: + - id: ABIPHONE + max_contacts: 9 + max_discs: 10 + features: + - CONTACTS_DIRECTORY + - DO_NOT_DISTURB_MODE + - id: CUSTOM_DISPLAY_NAME + display_name: Abiphone XII Amber + - id: SKULL_HEAD + texture: c386262dba9acafb004a2525e02789e6f9448ce89541441c7fbce401fd66588a + - id: ABIPHONE_XII_AMETHYST + material: PLAYER_HEAD + rarity: RARE + components: + - id: ABIPHONE + max_contacts: 9 + max_discs: 10 + features: + - CONTACTS_DIRECTORY + - DO_NOT_DISTURB_MODE + - id: CUSTOM_DISPLAY_NAME + display_name: Abiphone XII Amethyst + - id: SKULL_HEAD + texture: df4de5e522a34a534039c29eee368dfcc1ad0d43a2d8264c1751a8b596cbea7b \ No newline at end of file diff --git a/configuration/skyblock/items/miscellaneous/cake.yml b/configuration/skyblock/items/miscellaneous/cake.yml new file mode 100644 index 000000000..7a80088d3 --- /dev/null +++ b/configuration/skyblock/items/miscellaneous/cake.yml @@ -0,0 +1,23 @@ +items: + - id: NEW_YEAR_CAKE + material: PLAYER_HEAD + rarity: SPECIAL + components: + - id: ENCHANTED + - id: NEW_YEAR_CAKE + - id: SELLABLE + value: 100 + - id: NEW_YEAR_CAKE_BAG + material: PLAYER_HEAD + rarity: UNCOMMON + lore: + - "§7Holds §dNew Year Cake§7. Each" + - "§7unique New Year Cake within this" + - "§7bag grants §a+1 §c❤ Health§7." + components: + - id: CUSTOM_DISPLAY_NAME + display_name: New Year Cake Bag + - id: ACCESSORY + - id: SKULL_HEAD + texture: "cde7cdeb9713a6f9cfedaaddcffb355721911f49f2fa1cf1189b949e2f0d5b28" + - id: NOT_FINISHED_YET \ No newline at end of file diff --git a/configuration/skyblock/items/miscellaneous/dungeon.yml b/configuration/skyblock/items/miscellaneous/dungeon.yml index fbd61a3d0..3e67a0818 100644 --- a/configuration/skyblock/items/miscellaneous/dungeon.yml +++ b/configuration/skyblock/items/miscellaneous/dungeon.yml @@ -13,3 +13,9 @@ items: - id: ENCHANTED - id: RIGHT_CLICK_RECIPE recipe_item: NECRONS_HANDLE + - id: SUPERBOOM_TNT + rarity: RARE + components: + - id: CUSTOM_DISPLAY_NAME + display_name: Superboom TNT + - id: ENCHANTED diff --git a/configuration/skyblock/items/travelscroll.yml b/configuration/skyblock/items/travelscroll.yml index b28e7bfe0..c23e4f76d 100644 --- a/configuration/skyblock/items/travelscroll.yml +++ b/configuration/skyblock/items/travelscroll.yml @@ -29,6 +29,12 @@ items: result: type: HUB_CRYPTS_TRAVEL_SCROLL amount: 1 + - id: HUB_DARK_AUCTION_TRAVEL_SCROLL + material: PAPER + rarity: UNCOMMON + components: + - id: TRAVEL_SCROLL + scroll_type: HUB_DARK_AUCTION - id: HUB_CRYPTS_TRAVEL_SCROLL material: PAPER rarity: UNCOMMON diff --git a/configuration/skyblock/items/vanilla/blocks/prismarine.yml b/configuration/skyblock/items/vanilla/blocks/prismarine.yml new file mode 100644 index 000000000..64d8343d2 --- /dev/null +++ b/configuration/skyblock/items/vanilla/blocks/prismarine.yml @@ -0,0 +1,37 @@ +items: + - id: PRISMARINE + material: PRISMARINE + rarity: COMMON + components: + - id: CUSTOM_DROP + rules: + - conditions: + serverType: "SKYBLOCK_DWARVEN_MINES" + drops: + - item: MITHRIL + chance: 1 + amount: 1 + - id: DARK_PRISMARINE + material: DARK_PRISMARINE + rarity: COMMON + components: + - id: CUSTOM_DROP + rules: + - conditions: + serverType: "SKYBLOCK_DWARVEN_MINES" + drops: + - item: MITHRIL + chance: 1 + amount: 1 + - id: PRISMARINE_BRICKS + material: PRISMARINE_BRICKS + rarity: COMMON + components: + - id: CUSTOM_DROP + rules: + - conditions: + serverType: "SKYBLOCK_DWARVEN_MINES" + drops: + - item: MITHRIL + chance: 1 + amount: 1 \ No newline at end of file diff --git a/configuration/skyblock/items/vanilla/blocks/stone/diorite.yml b/configuration/skyblock/items/vanilla/blocks/stone/diorite.yml index 8834e2adb..fbcf4129b 100644 --- a/configuration/skyblock/items/vanilla/blocks/stone/diorite.yml +++ b/configuration/skyblock/items/vanilla/blocks/stone/diorite.yml @@ -71,4 +71,4 @@ items: amount: 1 result: type: DIORITE_WALL - amount: 6 \ No newline at end of file + amount: 6 diff --git a/configuration/skyblock/items/vanilla/blocks/stone/polishedDiorite.yml b/configuration/skyblock/items/vanilla/blocks/stone/polishedDiorite.yml index 4b9fa6a42..037072765 100644 --- a/configuration/skyblock/items/vanilla/blocks/stone/polishedDiorite.yml +++ b/configuration/skyblock/items/vanilla/blocks/stone/polishedDiorite.yml @@ -3,6 +3,14 @@ items: material: POLISHED_DIORITE rarity: COMMON components: + - id: CUSTOM_DROP + rules: + - conditions: + serverType: "SKYBLOCK_DWARVEN_MINES" + drops: + - item: TITANIUM + chance: 1 + amount: 1 - id: PLACEABLE - id: SELLABLE value: 2.0 diff --git a/configuration/skyblock/items/vanilla/blocks/terracotta.yml b/configuration/skyblock/items/vanilla/blocks/terracotta.yml index 4aaca2b86..b46ccbe6f 100644 --- a/configuration/skyblock/items/vanilla/blocks/terracotta.yml +++ b/configuration/skyblock/items/vanilla/blocks/terracotta.yml @@ -6,7 +6,6 @@ items: - id: PLACEABLE - id: SELLABLE value: 1.0 - - id: WHITE_TERRACOTTA material: WHITE_TERRACOTTA rarity: COMMON @@ -245,6 +244,14 @@ items: material: CYAN_TERRACOTTA rarity: COMMON components: + - id: CUSTOM_DROP + rules: + - conditions: + serverType: "SKYBLOCK_DWARVEN_MINES" + drops: + - item: MITHRIL + chance: 1 + amount: 1 - id: PLACEABLE - id: SELLABLE value: 1.0 diff --git a/configuration/skyblock/items/vanilla/blocks/wool.yml b/configuration/skyblock/items/vanilla/blocks/wool.yml index 6d8f75ccd..490c70803 100644 --- a/configuration/skyblock/items/vanilla/blocks/wool.yml +++ b/configuration/skyblock/items/vanilla/blocks/wool.yml @@ -83,6 +83,14 @@ items: material: GRAY_WOOL rarity: COMMON components: + - id: CUSTOM_DROP + rules: + - conditions: + serverType: "SKYBLOCK_DWARVEN_MINES" + drops: + - item: MITHRIL + chance: 1 + amount: 1 - id: PLACEABLE - id: SELLABLE value: 2.0 @@ -123,6 +131,14 @@ items: material: LIGHT_BLUE_WOOL rarity: COMMON components: + - id: CUSTOM_DROP + rules: + - conditions: + serverType: "SKYBLOCK_DWARVEN_MINES" + drops: + - item: MITHRIL + chance: 1 + amount: 1 - id: PLACEABLE - id: SELLABLE value: 2.0 diff --git a/configuration/skyblock/items/vanilla/items/armor/diamond.yml b/configuration/skyblock/items/vanilla/items/armor/diamond.yml index 580afa0fd..f737049ad 100644 --- a/configuration/skyblock/items/vanilla/items/armor/diamond.yml +++ b/configuration/skyblock/items/vanilla/items/armor/diamond.yml @@ -3,6 +3,8 @@ items: material: DIAMOND_HELMET rarity: COMMON components: + - id: STANDARD_ITEM + standard_item_type: HELMET - id: DEFAULT_CRAFTABLE recipes: - type: SHAPED @@ -23,6 +25,8 @@ items: material: DIAMOND_CHESTPLATE rarity: COMMON components: + - id: STANDARD_ITEM + standard_item_type: CHESTPLATE - id: DEFAULT_CRAFTABLE recipes: - type: SHAPED @@ -44,6 +48,8 @@ items: material: DIAMOND_LEGGINGS rarity: COMMON components: + - id: STANDARD_ITEM + standard_item_type: LEGGINGS - id: DEFAULT_CRAFTABLE recipes: - type: SHAPED @@ -65,6 +71,8 @@ items: material: DIAMOND_BOOTS rarity: COMMON components: + - id: STANDARD_ITEM + standard_item_type: BOOTS - id: DEFAULT_CRAFTABLE recipes: - type: SHAPED diff --git a/configuration/skyblock/items/vanilla/items/armor/gold.yml b/configuration/skyblock/items/vanilla/items/armor/gold.yml index 8e4a3d6ae..7e9cfb908 100644 --- a/configuration/skyblock/items/vanilla/items/armor/gold.yml +++ b/configuration/skyblock/items/vanilla/items/armor/gold.yml @@ -3,6 +3,8 @@ items: material: GOLDEN_HELMET rarity: COMMON components: + - id: STANDARD_ITEM + standard_item_type: HELMET - id: DEFAULT_CRAFTABLE recipes: - type: SHAPED @@ -23,6 +25,8 @@ items: material: GOLDEN_CHESTPLATE rarity: COMMON components: + - id: STANDARD_ITEM + standard_item_type: CHESTPLATE - id: DEFAULT_CRAFTABLE recipes: - type: SHAPED @@ -44,6 +48,8 @@ items: material: GOLDEN_LEGGINGS rarity: COMMON components: + - id: STANDARD_ITEM + standard_item_type: LEGGINGS - id: DEFAULT_CRAFTABLE recipes: - type: SHAPED @@ -65,6 +71,8 @@ items: material: GOLDEN_BOOTS rarity: COMMON components: + - id: STANDARD_ITEM + standard_item_type: BOOTS - id: DEFAULT_CRAFTABLE recipes: - type: SHAPED diff --git a/configuration/skyblock/items/vanilla/items/armor/iron.yml b/configuration/skyblock/items/vanilla/items/armor/iron.yml index 7ea80d814..ec2d5eb52 100644 --- a/configuration/skyblock/items/vanilla/items/armor/iron.yml +++ b/configuration/skyblock/items/vanilla/items/armor/iron.yml @@ -3,6 +3,8 @@ items: material: IRON_HELMET rarity: COMMON components: + - id: STANDARD_ITEM + standard_item_type: HELMET - id: DEFAULT_CRAFTABLE recipes: - type: SHAPED @@ -24,6 +26,8 @@ items: material: IRON_CHESTPLATE rarity: COMMON components: + - id: STANDARD_ITEM + standard_item_type: CHESTPLATE - id: DEFAULT_CRAFTABLE recipes: - type: SHAPED @@ -46,6 +50,8 @@ items: material: IRON_LEGGINGS rarity: COMMON components: + - id: STANDARD_ITEM + standard_item_type: LEGGINGS - id: DEFAULT_CRAFTABLE recipes: - type: SHAPED @@ -68,6 +74,8 @@ items: material: IRON_BOOTS rarity: COMMON components: + - id: STANDARD_ITEM + standard_item_type: BOOTS - id: DEFAULT_CRAFTABLE recipes: - type: SHAPED diff --git a/configuration/skyblock/items/vanilla/items/armor/leather.yml b/configuration/skyblock/items/vanilla/items/armor/leather.yml index 24b7923f3..25ffbd08b 100644 --- a/configuration/skyblock/items/vanilla/items/armor/leather.yml +++ b/configuration/skyblock/items/vanilla/items/armor/leather.yml @@ -3,6 +3,8 @@ items: material: LEATHER_HELMET rarity: COMMON components: + - id: STANDARD_ITEM + standard_item_type: HELMET - id: DEFAULT_CRAFTABLE recipes: - type: SHAPED @@ -23,6 +25,8 @@ items: material: LEATHER_CHESTPLATE rarity: COMMON components: + - id: STANDARD_ITEM + standard_item_type: CHESTPLATE - id: DEFAULT_CRAFTABLE recipes: - type: SHAPED @@ -44,6 +48,8 @@ items: material: LEATHER_LEGGINGS rarity: COMMON components: + - id: STANDARD_ITEM + standard_item_type: LEGGINGS - id: DEFAULT_CRAFTABLE recipes: - type: SHAPED @@ -65,6 +71,8 @@ items: material: LEATHER_BOOTS rarity: COMMON components: + - id: STANDARD_ITEM + standard_item_type: BOOTS - id: DEFAULT_CRAFTABLE recipes: - type: SHAPED diff --git a/configuration/skyblock/items/weapons.yml b/configuration/skyblock/items/weapons.yml index 35a4cde84..4a7368e4a 100644 --- a/configuration/skyblock/items/weapons.yml +++ b/configuration/skyblock/items/weapons.yml @@ -2,6 +2,8 @@ items: - id: ASPECT_OF_THE_END material: DIAMOND_SWORD rarity: RARE + abilities: + - INSTANT_TRANSMISSION default_statistics: damage: 100 strength: 100 diff --git a/loader/build.gradle.kts b/loader/build.gradle.kts index 6911a9b8d..42e019b88 100644 --- a/loader/build.gradle.kts +++ b/loader/build.gradle.kts @@ -27,6 +27,9 @@ dependencies { implementation(project(":type.island")) implementation(project(":type.hub")) implementation(project(":type.thefarmingislands")) + implementation(project(":type.goldmine")) + implementation(project(":type.deepcaverns")) + implementation(project(":type.dwarvenmines")) implementation(project(":type.dungeonhub")) implementation(project(":type.skyblockgeneric")) implementation(project(":type.prototypelobby")) @@ -123,9 +126,11 @@ tasks.register("runWithTestFlow") { handler = trimmed.substringAfter("handler:").trim() inStartServers = false } + inStartServers && trimmed.startsWith("- ") -> { startServers.add(trimmed.substring(2).trim()) } + !trimmed.startsWith("#") && trimmed.isNotEmpty() && !trimmed.contains(":") -> { if (inStartServers) inStartServers = false } diff --git a/loader/src/main/java/net/swofty/loader/Hypixel.java b/loader/src/main/java/net/swofty/loader/Hypixel.java index bc5351aef..e2b4b5c8f 100644 --- a/loader/src/main/java/net/swofty/loader/Hypixel.java +++ b/loader/src/main/java/net/swofty/loader/Hypixel.java @@ -106,11 +106,14 @@ public static void main(String[] args) { ServerType type = clazz.getDeclaredConstructor().newInstance().getType(); Logger.info("Found TypeLoader: " + type.name()); return type == serverType; - } catch (InstantiationException | IllegalAccessException | InvocationTargetException | - NoSuchMethodException e) { + } catch (Exception e) { + Logger.error("Failed to init TypeLoader " + clazz.getName(), e); return false; } - }).findFirst().orElse(null).getDeclaredConstructor().newInstance(); + }).findFirst().orElseThrow(() -> + new IllegalStateException("No TypeLoader found for server type " + serverType) + ).getDeclaredConstructor().newInstance(); + new HypixelGenericLoader(typeLoader).initialize(minecraftServer); /** diff --git a/proxy.api/src/main/java/net/swofty/proxyapi/ProxyAPI.java b/proxy.api/src/main/java/net/swofty/proxyapi/ProxyAPI.java index 2e5d4f1e1..001c045a2 100644 --- a/proxy.api/src/main/java/net/swofty/proxyapi/ProxyAPI.java +++ b/proxy.api/src/main/java/net/swofty/proxyapi/ProxyAPI.java @@ -70,6 +70,11 @@ public void registerFromServiceHandler(ServiceToClient handler) { // Handle message JSONObject response = handler.onMessage(json); + if (response == null) { + // Don't send a response if null + return; + } + // Send response back to service with this server's UUID RedisAPI.getInstance().publishMessage( serviceId, diff --git a/proxy.api/src/main/java/net/swofty/proxyapi/redis/ServerOutboundMessage.java b/proxy.api/src/main/java/net/swofty/proxyapi/redis/ServerOutboundMessage.java index 125347d26..1cf46e2ed 100644 --- a/proxy.api/src/main/java/net/swofty/proxyapi/redis/ServerOutboundMessage.java +++ b/proxy.api/src/main/java/net/swofty/proxyapi/redis/ServerOutboundMessage.java @@ -74,7 +74,12 @@ public static void sendMessageToService(ServiceType service, Object rawMessage, Consumer response) { UUID requestId = UUID.randomUUID(); - UUID toCallback = UUID.fromString(RedisAPI.getInstance().getFilterId()); + UUID toCallback = null; + try { + toCallback = UUID.fromString(RedisAPI.getInstance().getFilterId()); + } catch (Error e) { + return; + } redisMessageListeners.put(requestId, response); String message = specification.translateToString(rawMessage); diff --git a/server/proxy/configuration/resources.json b/server/proxy/configuration/resources.json index deaff180f..423cf34ba 100644 --- a/server/proxy/configuration/resources.json +++ b/server/proxy/configuration/resources.json @@ -2,7 +2,7 @@ "mongodb": "mongodb://localhost", "redis-uri": "redis://localhost:6379", "velocity-secret": "ixmSUgWOgvs7", - "limbo-host-name": "0.0.0.0", + "limbo-host-name": "127.0.0.1", "limbo-port": "65535", "pterodactyl-mode": false, "spark": false, diff --git a/service.darkauction/build.gradle.kts b/service.darkauction/build.gradle.kts new file mode 100644 index 000000000..8d5b2f85c --- /dev/null +++ b/service.darkauction/build.gradle.kts @@ -0,0 +1,47 @@ +import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar + +plugins { + java + application + id("io.github.goooler.shadow") version "8.1.7" +} + +group = "net.swofty" +version = "3.0" + +java { + sourceCompatibility = JavaVersion.VERSION_25 + targetCompatibility = JavaVersion.VERSION_25 + toolchain { + languageVersion.set(JavaLanguageVersion.of(25)) + } +} + +repositories { + maven("https://jitpack.io") + mavenCentral() +} + +dependencies { + implementation(project(":service.generic")) + implementation(project(":commons")) + implementation("com.github.ben-manes.caffeine:caffeine:3.1.8") + implementation("org.tinylog:tinylog-api:2.7.0") + implementation("org.tinylog:tinylog-impl:2.7.0") + + implementation("net.minestom:minestom:2025.12.20c-1.21.11") { + exclude(group = "org.jboss.shrinkwrap.resolver", module = "shrinkwrap-resolver-depchain") + } +} + +application { + mainClass.set("net.swofty.service.darkauction.DarkAuctionService") +} + +tasks { + named("shadowJar") { + archiveBaseName.set("ServiceDarkAuction") + archiveClassifier.set("") + archiveVersion.set("") + } +} diff --git a/service.darkauction/src/main/java/net/swofty/service/darkauction/DarkAuctionScheduler.java b/service.darkauction/src/main/java/net/swofty/service/darkauction/DarkAuctionScheduler.java new file mode 100644 index 000000000..0b059b514 --- /dev/null +++ b/service.darkauction/src/main/java/net/swofty/service/darkauction/DarkAuctionScheduler.java @@ -0,0 +1,195 @@ +package net.swofty.service.darkauction; + +import net.swofty.commons.auctions.DarkAuctionPhase; +import net.swofty.commons.protocol.objects.darkauction.DarkAuctionEventProtocol; +import net.swofty.commons.service.FromServiceChannels; +import net.swofty.service.generic.redis.ServiceToServerManager; +import org.json.JSONArray; +import org.json.JSONObject; +import org.tinylog.Logger; + +import java.util.UUID; +import java.util.concurrent.Executors; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.ScheduledFuture; +import java.util.concurrent.TimeUnit; + +/** + * Manages Dark Auction phases and timing. + * This scheduler only manages the auction phases once triggered. + */ +public class DarkAuctionScheduler { + // Auction timing constants (in seconds) + private static final int QUEUE_DURATION_SECONDS = 35; + private static final int AUCTION_START_DELAY_SECONDS = 10; + private static final int ROUND_TIMER_SECONDS = 10; + private static final int BETWEEN_ROUNDS_SECONDS = 5; + + private static ScheduledExecutorService executor; + private static ScheduledFuture roundTimerFuture; + + public static void start() { + executor = Executors.newScheduledThreadPool(2, r -> { + Thread t = new Thread(r, "dark-auction-scheduler"); + t.setDaemon(true); + return t; + }); + + Logger.info("Dark Auction Scheduler started (waiting for calendar triggers)"); + } + + public static void startNewAuction() { + Logger.info("Starting new Dark Auction!"); + + DarkAuctionState auction = new DarkAuctionState(); + auction.setPhase(DarkAuctionPhase.QUEUE); + DarkAuctionService.setCurrentAuction(auction); + + // Broadcast AUCTION_START to all hubs + broadcastEvent(DarkAuctionEventProtocol.EventType.AUCTION_START, auction, 0); + + // Schedule auction begin after queue duration + executor.schedule(() -> beginAuction(auction), QUEUE_DURATION_SECONDS, TimeUnit.SECONDS); + } + + private static void beginAuction(DarkAuctionState auction) { + if (auction != DarkAuctionService.getCurrentAuction()) { + return; // Auction was cancelled + } + + Logger.info("Auction queue phase complete, beginning bidding!"); + auction.setPhase(DarkAuctionPhase.BIDDING); + auction.setCurrentRound(0); + + // Broadcast AUCTION_BEGIN + broadcastEvent(DarkAuctionEventProtocol.EventType.AUCTION_BEGIN, auction, 0); + + // Start first round after delay (gives players time to get to basement) + executor.schedule(() -> startRound(auction), AUCTION_START_DELAY_SECONDS, TimeUnit.SECONDS); + } + + private static void startRound(DarkAuctionState auction) { + if (auction != DarkAuctionService.getCurrentAuction()) { + return; // Auction was cancelled + } + + auction.resetForNextRound(); + auction.setPhase(DarkAuctionPhase.BIDDING); + + Logger.info("Starting round {} with item {}", auction.getCurrentRound() + 1, auction.getCurrentItem()); + + // Broadcast ROUND_START + broadcastEvent(DarkAuctionEventProtocol.EventType.ROUND_START, auction, ROUND_TIMER_SECONDS); + + // Schedule round end + scheduleRoundEnd(auction, ROUND_TIMER_SECONDS); + } + + public static void resetRoundTimer(DarkAuctionState auction) { + // Cancel existing timer + if (roundTimerFuture != null && !roundTimerFuture.isDone()) { + roundTimerFuture.cancel(false); + } + + // Reschedule for 10 more seconds + scheduleRoundEnd(auction, ROUND_TIMER_SECONDS); + } + + private static void scheduleRoundEnd(DarkAuctionState auction, int seconds) { + roundTimerFuture = executor.schedule(() -> endRound(auction), seconds, TimeUnit.SECONDS); + } + + private static void endRound(DarkAuctionState auction) { + if (auction != DarkAuctionService.getCurrentAuction()) { + return; // Auction was cancelled + } + + Logger.info("Round {} ended. Winner: {}, Bid: {}", + auction.getCurrentRound() + 1, + auction.getHighestBidderName(), + auction.getCurrentBid()); + + // Broadcast ROUND_END + broadcastEvent(DarkAuctionEventProtocol.EventType.ROUND_END, auction, 0); + + // Check if more rounds + if (auction.hasMoreRounds()) { + auction.setPhase(DarkAuctionPhase.BETWEEN); + + // Schedule next round + executor.schedule(() -> { + auction.advanceToNextRound(); + startRound(auction); + }, BETWEEN_ROUNDS_SECONDS, TimeUnit.SECONDS); + } else { + // Auction complete + endAuction(auction); + } + } + + private static void endAuction(DarkAuctionState auction) { + Logger.info("Dark Auction complete!"); + auction.setPhase(DarkAuctionPhase.COMPLETE); + + // Broadcast AUCTION_END + broadcastEvent(DarkAuctionEventProtocol.EventType.AUCTION_END, auction, 0); + + // Clear auction + DarkAuctionService.setCurrentAuction(null); + } + + public static void broadcastEvent(DarkAuctionEventProtocol.EventType type, DarkAuctionState auction, int countdown) { + broadcastEvent(type, auction, countdown, null, 0); + } + + public static void broadcastBidPlaced(DarkAuctionState auction, UUID refundPlayerId, long refundAmount) { + broadcastEvent(DarkAuctionEventProtocol.EventType.BID_PLACED, auction, ROUND_TIMER_SECONDS, + refundPlayerId, refundAmount); + } + + private static void broadcastEvent(DarkAuctionEventProtocol.EventType type, DarkAuctionState auction, + int countdown, UUID refundPlayerId, long refundAmount) { + JSONObject message = new JSONObject(); + message.put("eventType", type.name()); + message.put("auctionId", auction.getAuctionId().toString()); + message.put("phase", auction.getPhase().name()); + message.put("currentRound", auction.getCurrentRound()); + message.put("currentItemType", auction.getCurrentItem() != null ? auction.getCurrentItem().name() : null); + message.put("currentBid", auction.getCurrentBid()); + message.put("highestBidderId", auction.getHighestBidderId() != null ? auction.getHighestBidderId().toString() : null); + message.put("highestBidderName", auction.getHighestBidderName()); + message.put("countdown", countdown); + + JSONArray itemsArray = new JSONArray(); + for (String item : auction.getRoundItemNames()) { + itemsArray.put(item); + } + message.put("roundItems", itemsArray); + + // Include refund info for BID_PLACED events + if (refundPlayerId != null) { + message.put("refundPlayerId", refundPlayerId.toString()); + message.put("refundAmount", refundAmount); + } + + // Include new bidder info for coin handling + if (type == DarkAuctionEventProtocol.EventType.BID_PLACED) { + message.put("newBidderId", auction.getHighestBidderId().toString()); + message.put("newBidAmount", auction.getCurrentBid()); + } + + Logger.debug("Broadcasting {} event for auction {}", type, auction.getAuctionId()); + + ServiceToServerManager.sendToAllServers( + FromServiceChannels.DARK_AUCTION_EVENT, + message, + 5000 + ).thenAccept(responses -> { + Logger.debug("Received {} responses for {} event", responses.size(), type); + }).exceptionally(throwable -> { + Logger.error("Error broadcasting {} event: {}", type, throwable.getMessage()); + return null; + }); + } + +} diff --git a/service.darkauction/src/main/java/net/swofty/service/darkauction/DarkAuctionService.java b/service.darkauction/src/main/java/net/swofty/service/darkauction/DarkAuctionService.java new file mode 100644 index 000000000..306711e71 --- /dev/null +++ b/service.darkauction/src/main/java/net/swofty/service/darkauction/DarkAuctionService.java @@ -0,0 +1,42 @@ +package net.swofty.service.darkauction; + +import net.swofty.commons.ServiceType; +import net.swofty.service.generic.SkyBlockService; +import net.swofty.service.generic.redis.ServiceEndpoint; +import org.tinylog.Logger; + +import java.util.List; + +public class DarkAuctionService implements SkyBlockService { + private static DarkAuctionState currentAuction = null; + + public static void main(String[] args) { + SkyBlockService.init(new DarkAuctionService()); + + // Start the scheduler that checks SkyBlock time + DarkAuctionScheduler.start(); + Logger.info("DarkAuctionService started with scheduler"); + } + + @Override + public ServiceType getType() { + return ServiceType.DARK_AUCTION; + } + + @Override + public List getEndpoints() { + return loopThroughPackage("net.swofty.service.darkauction.endpoints", ServiceEndpoint.class).toList(); + } + + public static DarkAuctionState getCurrentAuction() { + return currentAuction; + } + + public static void setCurrentAuction(DarkAuctionState auction) { + currentAuction = auction; + } + + public static boolean hasActiveAuction() { + return currentAuction != null; + } +} diff --git a/service.darkauction/src/main/java/net/swofty/service/darkauction/DarkAuctionState.java b/service.darkauction/src/main/java/net/swofty/service/darkauction/DarkAuctionState.java new file mode 100644 index 000000000..600d3f820 --- /dev/null +++ b/service.darkauction/src/main/java/net/swofty/service/darkauction/DarkAuctionState.java @@ -0,0 +1,137 @@ +package net.swofty.service.darkauction; + +import lombok.Getter; +import lombok.Setter; +import net.swofty.commons.auctions.DarkAuctionPhase; +import net.swofty.commons.item.ItemType; +import net.swofty.service.darkauction.loot.DarkAuctionBookPool; +import net.swofty.service.darkauction.loot.DarkAuctionItemPool; + +import java.util.*; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ConcurrentLinkedQueue; + +@Getter +@Setter +public class DarkAuctionState { + public static final long STARTING_BID = 50_000; + + private final UUID auctionId = UUID.randomUUID(); + private final List roundItems; + private int currentRound = 0; + private long currentBid = STARTING_BID; + private UUID highestBidderId = null; + private String highestBidderName = null; + private DarkAuctionPhase phase = DarkAuctionPhase.QUEUE; + + // Escrow tracking - coins held from bidders + private final Map escrowedCoins = new ConcurrentHashMap<>(); + // Pending refunds to broadcast + private final Queue pendingRefunds = new ConcurrentLinkedQueue<>(); + // Bid history for reconciliation - ordered from most recent to oldest + private final List bidHistory = Collections.synchronizedList(new ArrayList<>()); + + public record RefundEntry(UUID playerId, long amount) {} + public record BidEntry(UUID playerId, String playerName, long bidAmount) {} + + public DarkAuctionState() { + // Pre-select all items at auction creation + DarkAuctionItemPool pool = new DarkAuctionItemPool(); + List items = new ArrayList<>(); + + items.add(pool.selectAndRemove()); // Round 1: Item Pool + items.add(DarkAuctionBookPool.selectRandom()); // Round 2: Book Pool + items.add(pool.selectAndRemove()); // Round 3: Item Pool + items.add(pool.selectAndRemove()); // Round 4: Item Pool + items.add(ItemType.FLOWER_MINION); // Round 5: Always Flower Minion + + this.roundItems = Collections.unmodifiableList(items); + } + + public ItemType getCurrentItem() { + if (currentRound < 0 || currentRound >= roundItems.size()) { + return null; + } + return roundItems.get(currentRound); + } + + public void setEscrowedAmount(UUID playerId, long amount) { + escrowedCoins.put(playerId, amount); + } + + public void queueRefund(UUID playerId, long amount) { + pendingRefunds.add(new RefundEntry(playerId, amount)); + escrowedCoins.remove(playerId); + } + + public List drainPendingRefunds() { + List refunds = new ArrayList<>(); + RefundEntry entry; + while ((entry = pendingRefunds.poll()) != null) { + refunds.add(entry); + } + return refunds; + } + + public void clearEscrowForRound() { + // Called when round ends - winner's escrow is "finalized" + escrowedCoins.clear(); + pendingRefunds.clear(); + } + + public void resetForNextRound() { + currentBid = STARTING_BID; + highestBidderId = null; + highestBidderName = null; + clearEscrowForRound(); + bidHistory.clear(); + } + + /** + * Records a bid in the history for reconciliation purposes. + */ + public void recordBid(UUID playerId, String playerName, long bidAmount) { + // Add to front of list (most recent first) + bidHistory.add(0, new BidEntry(playerId, playerName, bidAmount)); + } + + /** + * Finds the next highest bidder after excluding a specific player. + * Used when the highest bidder leaves and we need to promote the runner-up. + * + * @param excludePlayerId the player to exclude (who left) + * @return the next highest bid entry, or null if no other bidders + */ + public BidEntry findNextHighestBidder(UUID excludePlayerId) { + synchronized (bidHistory) { + for (BidEntry entry : bidHistory) { + if (!entry.playerId().equals(excludePlayerId)) { + return entry; + } + } + } + return null; + } + + /** + * Removes all bids by a specific player from the history. + */ + public void removeBidsFromPlayer(UUID playerId) { + synchronized (bidHistory) { + bidHistory.removeIf(entry -> entry.playerId().equals(playerId)); + } + } + + public boolean hasMoreRounds() { + return currentRound < roundItems.size() - 1; + } + + public void advanceToNextRound() { + currentRound++; + resetForNextRound(); + } + + public List getRoundItemNames() { + return roundItems.stream().map(ItemType::name).toList(); + } +} diff --git a/service.darkauction/src/main/java/net/swofty/service/darkauction/endpoints/EndpointGetAuctionState.java b/service.darkauction/src/main/java/net/swofty/service/darkauction/endpoints/EndpointGetAuctionState.java new file mode 100644 index 000000000..35cc88e89 --- /dev/null +++ b/service.darkauction/src/main/java/net/swofty/service/darkauction/endpoints/EndpointGetAuctionState.java @@ -0,0 +1,46 @@ +package net.swofty.service.darkauction.endpoints; + +import net.swofty.commons.impl.ServiceProxyRequest; +import net.swofty.commons.protocol.ProtocolObject; +import net.swofty.commons.protocol.objects.darkauction.GetAuctionStateProtocol; +import net.swofty.service.darkauction.DarkAuctionService; +import net.swofty.service.darkauction.DarkAuctionState; +import net.swofty.service.generic.redis.ServiceEndpoint; + +import java.util.List; + +public class EndpointGetAuctionState implements ServiceEndpoint< + GetAuctionStateProtocol.GetAuctionStateMessage, + GetAuctionStateProtocol.GetAuctionStateResponse> { + + @Override + public ProtocolObject associatedProtocolObject() { + return new GetAuctionStateProtocol(); + } + + @Override + public GetAuctionStateProtocol.GetAuctionStateResponse onMessage( + ServiceProxyRequest request, + GetAuctionStateProtocol.GetAuctionStateMessage msg) { + + DarkAuctionState auction = DarkAuctionService.getCurrentAuction(); + + if (auction == null) { + return new GetAuctionStateProtocol.GetAuctionStateResponse( + false, null, null, 0, null, 0, null, null, List.of() + ); + } + + return new GetAuctionStateProtocol.GetAuctionStateResponse( + true, + auction.getAuctionId(), + auction.getPhase(), + auction.getCurrentRound(), + auction.getCurrentItem() != null ? auction.getCurrentItem().name() : null, + auction.getCurrentBid(), + auction.getHighestBidderId(), + auction.getHighestBidderName(), + auction.getRoundItemNames() + ); + } +} diff --git a/service.darkauction/src/main/java/net/swofty/service/darkauction/endpoints/EndpointPlaceBid.java b/service.darkauction/src/main/java/net/swofty/service/darkauction/endpoints/EndpointPlaceBid.java new file mode 100644 index 000000000..266a773b7 --- /dev/null +++ b/service.darkauction/src/main/java/net/swofty/service/darkauction/endpoints/EndpointPlaceBid.java @@ -0,0 +1,89 @@ +package net.swofty.service.darkauction.endpoints; + +import net.swofty.commons.auctions.DarkAuctionPhase; +import net.swofty.commons.impl.ServiceProxyRequest; +import net.swofty.commons.protocol.ProtocolObject; +import net.swofty.commons.protocol.objects.darkauction.PlaceBidProtocol; +import net.swofty.service.darkauction.DarkAuctionScheduler; +import net.swofty.service.darkauction.DarkAuctionService; +import net.swofty.service.darkauction.DarkAuctionState; +import net.swofty.service.generic.redis.ServiceEndpoint; +import org.tinylog.Logger; + +import java.util.UUID; + +public class EndpointPlaceBid implements ServiceEndpoint< + PlaceBidProtocol.PlaceBidMessage, + PlaceBidProtocol.PlaceBidResponse> { + + @Override + public ProtocolObject associatedProtocolObject() { + return new PlaceBidProtocol(); + } + + @Override + public PlaceBidProtocol.PlaceBidResponse onMessage( + ServiceProxyRequest request, + PlaceBidProtocol.PlaceBidMessage msg) { + + DarkAuctionState auction = DarkAuctionService.getCurrentAuction(); + + // Check if there's an active auction + if (auction == null) { + Logger.warn("Bid rejected: No active auction"); + return new PlaceBidProtocol.PlaceBidResponse(false, "No active auction"); + } + + // Check if auction ID matches + if (!auction.getAuctionId().equals(msg.auctionId())) { + Logger.warn("Bid rejected: Auction ID mismatch"); + return new PlaceBidProtocol.PlaceBidResponse(false, "Invalid auction ID"); + } + + // Check if we're in bidding phase + if (auction.getPhase() != DarkAuctionPhase.BIDDING) { + Logger.warn("Bid rejected: Not in bidding phase (current: {})", auction.getPhase()); + return new PlaceBidProtocol.PlaceBidResponse(false, "Auction is not in bidding phase"); + } + + // SYNCHRONIZED to prevent race conditions + synchronized (auction) { + // Validate bid is higher than current + if (msg.bidAmount() <= auction.getCurrentBid()) { + Logger.info("Bid rejected: {} tried to bid {} but current bid is {}", + msg.playerName(), msg.bidAmount(), auction.getCurrentBid()); + return new PlaceBidProtocol.PlaceBidResponse(false, + "Bid too low - someone else bid first! Current bid is " + auction.getCurrentBid()); + } + + // If there's a previous bidder, queue their refund + UUID previousBidder = auction.getHighestBidderId(); + long previousBid = auction.getCurrentBid(); + + if (previousBidder != null && previousBid > 0) { + Logger.info("Queueing refund of {} to previous bidder {}", previousBid, previousBidder); + auction.queueRefund(previousBidder, previousBid); + } + + // Update state with new bid + auction.setCurrentBid(msg.bidAmount()); + auction.setHighestBidderId(msg.playerId()); + auction.setHighestBidderName(msg.playerName()); + auction.setEscrowedAmount(msg.playerId(), msg.bidAmount()); + + // Record in bid history for reconciliation + auction.recordBid(msg.playerId(), msg.playerName(), msg.bidAmount()); + + Logger.info("Bid accepted: {} bid {} coins for {}", + msg.playerName(), msg.bidAmount(), auction.getCurrentItem()); + + // Reset countdown timer + DarkAuctionScheduler.resetRoundTimer(auction); + + // Broadcast BID_PLACED with refund info + DarkAuctionScheduler.broadcastBidPlaced(auction, previousBidder, previousBid); + + return new PlaceBidProtocol.PlaceBidResponse(true, "Bid accepted"); + } + } +} diff --git a/service.darkauction/src/main/java/net/swofty/service/darkauction/endpoints/EndpointPlayerLeftAuction.java b/service.darkauction/src/main/java/net/swofty/service/darkauction/endpoints/EndpointPlayerLeftAuction.java new file mode 100644 index 000000000..410aab09a --- /dev/null +++ b/service.darkauction/src/main/java/net/swofty/service/darkauction/endpoints/EndpointPlayerLeftAuction.java @@ -0,0 +1,111 @@ +package net.swofty.service.darkauction.endpoints; + +import net.swofty.commons.auctions.DarkAuctionPhase; +import net.swofty.commons.impl.ServiceProxyRequest; +import net.swofty.commons.protocol.ProtocolObject; +import net.swofty.commons.protocol.objects.darkauction.PlayerLeftAuctionProtocol; +import net.swofty.service.darkauction.DarkAuctionScheduler; +import net.swofty.service.darkauction.DarkAuctionService; +import net.swofty.service.darkauction.DarkAuctionState; +import net.swofty.service.generic.redis.ServiceEndpoint; +import org.tinylog.Logger; + +import java.util.UUID; + +public class EndpointPlayerLeftAuction implements ServiceEndpoint< + PlayerLeftAuctionProtocol.PlayerLeftMessage, + PlayerLeftAuctionProtocol.PlayerLeftResponse> { + + @Override + public ProtocolObject associatedProtocolObject() { + return new PlayerLeftAuctionProtocol(); + } + + @Override + public PlayerLeftAuctionProtocol.PlayerLeftResponse onMessage( + ServiceProxyRequest request, + PlayerLeftAuctionProtocol.PlayerLeftMessage msg) { + + DarkAuctionState auction = DarkAuctionService.getCurrentAuction(); + + // If no active auction, nothing to clean up + if (auction == null) { + Logger.debug("Player {} left but no active auction", msg.playerName()); + return new PlayerLeftAuctionProtocol.PlayerLeftResponse(true, 0); + } + + // If auction ID was provided and doesn't match, ignore + if (msg.auctionId() != null && !auction.getAuctionId().equals(msg.auctionId())) { + Logger.debug("Player {} left but auction ID mismatch", msg.playerName()); + return new PlayerLeftAuctionProtocol.PlayerLeftResponse(true, 0); + } + + synchronized (auction) { + UUID playerId = msg.playerId(); + long refundAmount = 0; + + // Check if player has escrowed coins (was bidding) + Long escrowed = auction.getEscrowedCoins().get(playerId); + + // If they were the highest bidder, we need to handle reconciliation + if (playerId.equals(auction.getHighestBidderId())) { + Logger.info("Highest bidder {} left the auction during phase {}", + msg.playerName(), auction.getPhase()); + + if (escrowed != null && escrowed > 0) { + refundAmount = escrowed; + } + + // Remove their bids from history + auction.removeBidsFromPlayer(playerId); + auction.getEscrowedCoins().remove(playerId); + + // Find the next highest bidder + DarkAuctionState.BidEntry nextBidder = auction.findNextHighestBidder(playerId); + + if (nextBidder != null) { + // Promote the runner-up to highest bidder + Logger.info("Promoting {} as new highest bidder with bid {}", + nextBidder.playerName(), nextBidder.bidAmount()); + + auction.setHighestBidderId(nextBidder.playerId()); + auction.setHighestBidderName(nextBidder.playerName()); + auction.setCurrentBid(nextBidder.bidAmount()); + + // Set escrow for the promoted bidder (their coins will be re-taken via broadcast) + auction.setEscrowedAmount(nextBidder.playerId(), nextBidder.bidAmount()); + + // Broadcast the change so all servers know about the new highest bidder + // This will also trigger coin deduction from the promoted player + if (auction.getPhase() == DarkAuctionPhase.BIDDING) { + DarkAuctionScheduler.broadcastBidPlaced(auction, null, 0); + } + } else { + // No other bidders - reset the round bid state to starting bid + Logger.info("No other bidders found, resetting bid to starting bid"); + auction.setHighestBidderId(null); + auction.setHighestBidderName(null); + auction.setCurrentBid(DarkAuctionState.STARTING_BID); + + // Broadcast the reset + if (auction.getPhase() == DarkAuctionPhase.BIDDING) { + DarkAuctionScheduler.broadcastBidPlaced(auction, null, 0); + } + } + } else if (escrowed != null && escrowed > 0) { + // They had some escrow but weren't highest bidder (shouldn't happen normally, + // but handle it anyway) + refundAmount = escrowed; + auction.getEscrowedCoins().remove(playerId); + auction.removeBidsFromPlayer(playerId); + } else { + // Player was just in the queue or spectating, just remove from history + auction.removeBidsFromPlayer(playerId); + } + + Logger.info("Player {} left Dark Auction, refund amount: {}", msg.playerName(), refundAmount); + + return new PlayerLeftAuctionProtocol.PlayerLeftResponse(true, refundAmount); + } + } +} diff --git a/service.darkauction/src/main/java/net/swofty/service/darkauction/endpoints/EndpointTriggerAuction.java b/service.darkauction/src/main/java/net/swofty/service/darkauction/endpoints/EndpointTriggerAuction.java new file mode 100644 index 000000000..815e8b7a0 --- /dev/null +++ b/service.darkauction/src/main/java/net/swofty/service/darkauction/endpoints/EndpointTriggerAuction.java @@ -0,0 +1,43 @@ +package net.swofty.service.darkauction.endpoints; + +import net.swofty.commons.impl.ServiceProxyRequest; +import net.swofty.commons.protocol.ProtocolObject; +import net.swofty.commons.protocol.objects.darkauction.TriggerDarkAuctionProtocol; +import net.swofty.service.darkauction.DarkAuctionScheduler; +import net.swofty.service.darkauction.DarkAuctionService; +import net.swofty.service.generic.redis.ServiceEndpoint; +import org.tinylog.Logger; + +public class EndpointTriggerAuction implements ServiceEndpoint< + TriggerDarkAuctionProtocol.TriggerMessage, + TriggerDarkAuctionProtocol.TriggerResponse> { + + @Override + public ProtocolObject associatedProtocolObject() { + return new TriggerDarkAuctionProtocol(); + } + + @Override + public TriggerDarkAuctionProtocol.TriggerResponse onMessage( + ServiceProxyRequest request, + TriggerDarkAuctionProtocol.TriggerMessage msg) { + + Logger.info("Received trigger request - calendarTime: {}, forced: {}", msg.calendarTime(), msg.forced()); + + // Check if auction is already active (deduplication) + if (DarkAuctionService.hasActiveAuction()) { + Logger.info("Auction already active, ignoring trigger"); + return new TriggerDarkAuctionProtocol.TriggerResponse(false, "Auction already in progress"); + } + + // Start the auction + try { + DarkAuctionScheduler.startNewAuction(); + Logger.info("Dark Auction started successfully via calendar trigger"); + return new TriggerDarkAuctionProtocol.TriggerResponse(true, "Auction started"); + } catch (Exception e) { + Logger.error(e, "Failed to start Dark Auction"); + return new TriggerDarkAuctionProtocol.TriggerResponse(false, "Failed to start: " + e.getMessage()); + } + } +} diff --git a/service.darkauction/src/main/java/net/swofty/service/darkauction/loot/DarkAuctionBookPool.java b/service.darkauction/src/main/java/net/swofty/service/darkauction/loot/DarkAuctionBookPool.java new file mode 100644 index 000000000..3ec3d1013 --- /dev/null +++ b/service.darkauction/src/main/java/net/swofty/service/darkauction/loot/DarkAuctionBookPool.java @@ -0,0 +1,66 @@ +package net.swofty.service.darkauction.loot; + +import net.swofty.commons.item.ItemType; + +import java.util.List; +import java.util.Random; + +/** + * Pool for Dark Auction round 2 (book round) + * All books have equal chance of being selected + * + * In actual Hypixel, these are specific enchanted books like: + * - Soul Eater V + * - One For All I + * - Bank V + * - Chimera V + * - Duplex I + * - Legion V + * - Ender Slayer VII + * - No Pain No Gain I + * - Mana Vampire VI + * + * For now, we use ENCHANTED_BOOK as a placeholder. + * The specific enchantment type would be handled by item metadata. + */ +public class DarkAuctionBookPool { + private static final Random random = new Random(); + + // Book pool - for now just returning ENCHANTED_BOOK + // The specific enchantment would be determined by item configuration + private static final List BOOK_TYPES = List.of( + "SOUL_EATER_V", + "ONE_FOR_ALL_I", + "BANK_V", + "CHIMERA_V", + "DUPLEX_I", + "LEGION_V", + "ENDER_SLAYER_VII", + "NO_PAIN_NO_GAIN_I", + "MANA_VAMPIRE_VI" + ); + + /** + * Select a random book for the auction + * Returns ENCHANTED_BOOK - the specific type is stored separately + */ + public static ItemType selectRandom() { + // For now, return ENCHANTED_BOOK + // The actual book type would be stored in item metadata + return ItemType.ENCHANTED_BOOK; + } + + /** + * Get the name of a random book type (for display/tracking purposes) + */ + public static String getRandomBookTypeName() { + return BOOK_TYPES.get(random.nextInt(BOOK_TYPES.size())); + } + + /** + * Get all available book types + */ + public static List getAvailableBookTypes() { + return BOOK_TYPES; + } +} diff --git a/service.darkauction/src/main/java/net/swofty/service/darkauction/loot/DarkAuctionItemPool.java b/service.darkauction/src/main/java/net/swofty/service/darkauction/loot/DarkAuctionItemPool.java new file mode 100644 index 000000000..5619c1faa --- /dev/null +++ b/service.darkauction/src/main/java/net/swofty/service/darkauction/loot/DarkAuctionItemPool.java @@ -0,0 +1,65 @@ +package net.swofty.service.darkauction.loot; + +import net.swofty.commons.item.ItemType; + +import java.util.ArrayList; +import java.util.List; +import java.util.Random; + +public class DarkAuctionItemPool { + private final List items = new ArrayList<>(); + private static final double DARK_PURPLE_DYE_FIRST_ROLL = 0.0025; // 0.25% chance + private static final Random random = new Random(); + + public DarkAuctionItemPool() { + // Artifacts (weight 24) + items.add(new WeightedItem(ItemType.DIRT, 24)); + items.add(new WeightedItem(ItemType.COAL, 24)); + items.add(new WeightedItem(ItemType.ACACIA_BUTTON, 24)); + + // Special Items (weight 16) + items.add(new WeightedItem(ItemType.HYPERION, 16)); + + // Epic Pets (weight 16) + items.add(new WeightedItem(ItemType.BEE_PET, 16)); + items.add(new WeightedItem(ItemType.PERFECT_AMBER_GEMSTONE, 16)); + } + + /** + * Select an item and remove it from the pool (so it can't be selected again in same auction) + */ + public ItemType selectAndRemove() { + // First roll for Dark Purple Dye + if (random.nextDouble() < DARK_PURPLE_DYE_FIRST_ROLL) { + return ItemType.DARK_PURPLE_DYE; + } + + // Weighted random selection + double totalWeight = items.stream().mapToDouble(WeightedItem::weight).sum(); + double randomValue = random.nextDouble() * totalWeight; + double cumulative = 0; + + for (int i = 0; i < items.size(); i++) { + cumulative += items.get(i).weight(); + if (randomValue < cumulative) { + return items.remove(i).type(); + } + } + + // If pool is exhausted, TODO return Midas Sword + return ItemType.HYPERION; + } + + /** + * Peek at what items are still available without removing + */ + public List getAvailableItems() { + return items.stream().map(WeightedItem::type).toList(); + } + + public boolean isEmpty() { + return items.isEmpty(); + } + + public record WeightedItem(ItemType type, double weight) {} +} diff --git a/settings.gradle.kts b/settings.gradle.kts index c9468cfb9..274359aa2 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -14,6 +14,9 @@ include(":loader") include(":type.prototypelobby") include(":type.thefarmingislands") +include(":type.goldmine") +include(":type.deepcaverns") +include(":type.dwarvenmines") include(":type.island") include(":type.hub") include(":type.dungeonhub") @@ -24,4 +27,5 @@ include(":service.itemtracker") include(":service.api") include(":service.datamutex") include(":service.party") +include(":service.darkauction") include(":anticheat") diff --git a/type.deepcaverns/build.gradle.kts b/type.deepcaverns/build.gradle.kts new file mode 100644 index 000000000..4bd276792 --- /dev/null +++ b/type.deepcaverns/build.gradle.kts @@ -0,0 +1,26 @@ +plugins { + java +} + +group = "net.swofty" +version = "3.0" + +java { + sourceCompatibility = JavaVersion.VERSION_25 + targetCompatibility = JavaVersion.VERSION_25 + toolchain { + languageVersion.set(JavaLanguageVersion.of(25)) + } +} + +dependencies { + implementation(project(":type.skyblockgeneric")) + implementation(project(":type.generic")) + implementation(project(":commons")) + implementation(project(":proxy.api")) + compileOnly("net.minestom:minestom:2025.12.20c-1.21.11") { + exclude(group = "org.jboss.shrinkwrap.resolver", module = "shrinkwrap-resolver-depchain") + } + implementation("org.tinylog:tinylog-api:2.7.0") + implementation("org.tinylog:tinylog-impl:2.7.0") +} \ No newline at end of file diff --git a/type.deepcaverns/src/main/java/net/swofty/type/deepcaverns/TypeDeepCavernsLoader.java b/type.deepcaverns/src/main/java/net/swofty/type/deepcaverns/TypeDeepCavernsLoader.java new file mode 100644 index 000000000..c7c410ea7 --- /dev/null +++ b/type.deepcaverns/src/main/java/net/swofty/type/deepcaverns/TypeDeepCavernsLoader.java @@ -0,0 +1,125 @@ +package net.swofty.type.deepcaverns; + +import net.minestom.server.MinecraftServer; +import net.minestom.server.coordinate.Pos; +import net.swofty.commons.CustomWorlds; +import net.swofty.commons.ServerType; +import net.swofty.commons.ServiceType; +import net.swofty.proxyapi.redis.ProxyToClient; +import net.swofty.proxyapi.redis.ServiceToClient; +import net.swofty.type.deepcaverns.tab.DeepCavernsServerModule; +import net.swofty.type.generic.SkyBlockTypeLoader; +import net.swofty.type.generic.entity.animalnpc.HypixelAnimalNPC; +import net.swofty.type.generic.entity.npc.HypixelNPC; +import net.swofty.type.generic.entity.villager.HypixelVillagerNPC; +import net.swofty.type.generic.event.HypixelEventClass; +import net.swofty.type.generic.tab.TablistManager; +import net.swofty.type.generic.tab.TablistModule; +import net.swofty.type.skyblockgeneric.SkyBlockGenericLoader; +import net.swofty.type.skyblockgeneric.tabmodules.AccountInformationModule; +import net.swofty.type.skyblockgeneric.tabmodules.SkyBlockPlayersOnlineModule; +import org.jetbrains.annotations.Nullable; +import org.tinylog.Logger; + +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +public class TypeDeepCavernsLoader implements SkyBlockTypeLoader { + @Override + public ServerType getType() { + return ServerType.SKYBLOCK_DEEP_CAVERNS; + } + + @Override + public void onInitialize(MinecraftServer server) { + Logger.info("TypeDeepCavernsLoader initialized!"); + } + + @Override + public void afterInitialize(MinecraftServer server) { + + } + + @Override + public LoaderValues getLoaderValues() { + return new LoaderValues( + (type) -> switch (type) { + default -> new Pos(4, 157, 85, -180, 0); + }, // Spawn position + true // Announce death messages + ); + } + + public TablistManager getTablistManager() { + return new TablistManager() { + @Override + public List getModules() { + return new ArrayList<>(List.of( + new SkyBlockPlayersOnlineModule(1), + new SkyBlockPlayersOnlineModule(2), + new DeepCavernsServerModule(), + new AccountInformationModule() + )); + } + }; + } + + @Override + public List getTraditionalEvents() { + return SkyBlockGenericLoader.loopThroughPackage( + "net.swofty.type.deepcaverns.events", + HypixelEventClass.class + ).collect(Collectors.toList()); + } + + @Override + public List getCustomEvents() { + return new ArrayList<>(); + } + + @Override + public List getNPCs() { + List npcs = new ArrayList<>(); + + npcs.addAll(SkyBlockGenericLoader.loopThroughPackage( + "net.swofty.type.deepcaverns.npcs", + HypixelNPC.class + ).toList()); + + return npcs; + } + + @Override + public List getServiceRedisListeners() { + return List.of(); + } + + @Override + public List getProxyRedisListeners() { + return List.of(); + } + + @Override + public List getVillagerNPCs() { + return new ArrayList<>(SkyBlockGenericLoader.loopThroughPackage( + "net.swofty.type.deepcaverns.villagers", + HypixelVillagerNPC.class + ).toList()); + } + + @Override + public List getAnimalNPCs() { + return new ArrayList<>(); + } + + @Override + public List getRequiredServices() { + return new ArrayList<>(List.of(ServiceType.DATA_MUTEX)); + } + + @Override + public @Nullable CustomWorlds getMainInstance() { + return CustomWorlds.SKYBLOCK_DEEP_CAVERNS; + } +} diff --git a/type.deepcaverns/src/main/java/net/swofty/type/deepcaverns/events/ActionPlayerJoin.java b/type.deepcaverns/src/main/java/net/swofty/type/deepcaverns/events/ActionPlayerJoin.java new file mode 100644 index 000000000..f0a580201 --- /dev/null +++ b/type.deepcaverns/src/main/java/net/swofty/type/deepcaverns/events/ActionPlayerJoin.java @@ -0,0 +1,26 @@ +package net.swofty.type.deepcaverns.events; + +import lombok.SneakyThrows; +import net.minestom.server.event.player.AsyncPlayerConfigurationEvent; +import net.swofty.type.generic.HypixelConst; +import net.swofty.type.generic.event.EventNodes; +import net.swofty.type.generic.event.HypixelEvent; +import net.swofty.type.generic.event.HypixelEventClass; +import net.swofty.type.skyblockgeneric.user.SkyBlockPlayer; + +public class ActionPlayerJoin implements HypixelEventClass { + + @SneakyThrows + @HypixelEvent(node = EventNodes.PLAYER, requireDataLoaded = false) + public void run(AsyncPlayerConfigurationEvent event) { + + final SkyBlockPlayer player = (SkyBlockPlayer) event.getPlayer(); + + event.setSpawningInstance(HypixelConst.getInstanceContainer()); + player.setRespawnPoint(HypixelConst.getTypeLoader() + .getLoaderValues() + .spawnPosition() + .apply(player.getOriginServer()) + ); + } +} diff --git a/type.deepcaverns/src/main/java/net/swofty/type/deepcaverns/gui/GUILiftOperator.java b/type.deepcaverns/src/main/java/net/swofty/type/deepcaverns/gui/GUILiftOperator.java new file mode 100644 index 000000000..5d3c42350 --- /dev/null +++ b/type.deepcaverns/src/main/java/net/swofty/type/deepcaverns/gui/GUILiftOperator.java @@ -0,0 +1,119 @@ +package net.swofty.type.deepcaverns.gui; + +import net.kyori.adventure.text.Component; +import net.minestom.server.coordinate.Pos; +import net.minestom.server.event.inventory.InventoryPreClickEvent; +import net.minestom.server.inventory.InventoryType; +import net.minestom.server.item.ItemStack; +import net.minestom.server.item.Material; +import net.swofty.commons.ServerType; +import net.swofty.type.generic.data.datapoints.DatapointStringList; +import net.swofty.type.generic.gui.inventory.HypixelInventoryGUI; +import net.swofty.type.generic.gui.inventory.ItemStackCreator; +import net.swofty.type.generic.gui.inventory.item.GUIClickableItem; +import net.swofty.type.generic.user.HypixelPlayer; +import net.swofty.type.skyblockgeneric.data.SkyBlockDataHandler; +import net.swofty.type.skyblockgeneric.region.SkyBlockRegion; +import net.swofty.type.skyblockgeneric.user.SkyBlockPlayer; + +import java.util.List; +import java.util.function.Consumer; + +public class GUILiftOperator extends HypixelInventoryGUI { + public GUILiftOperator() { + super("Lift", InventoryType.CHEST_6_ROW); + } + + @Override + public boolean allowHotkeying() { + return false; + } + + @Override + public void onOpen(InventoryGUIOpenEvent event) { + fill(ItemStackCreator.createNamedItemStack(Material.BLACK_STAINED_GLASS_PANE)); + + for (LiftLocation location : LiftLocation.values()) { + set(new GUIClickableItem(location.slot) { + @Override + public void run(InventoryPreClickEvent e, HypixelPlayer p) { + SkyBlockPlayer player = (SkyBlockPlayer) p; + SkyBlockRegion region = player.getRegion(); + if (region != null) { + if (region.getType().name().equals(location.name())) { + p.sendMessage(Component.text("§cYou are already in the " + location.prettyName() + "!")); + return; + } + } + DatapointStringList discoveredZones = player.getSkyblockDataHandler().get( + SkyBlockDataHandler.Data.VISITED_REGIONS, + DatapointStringList.class + ); + List discoveredZonesList = discoveredZones.getValue(); + if (!discoveredZonesList.contains(location.prettyName()) && location != LiftLocation.DWARVEN_MINES) { + player.sendMessage("§cYou have not discovered the " + location.prettyName() + " yet!"); + return; + } + location.consumer.accept(p); + p.closeInventory(); + } + + @Override + public ItemStack.Builder getItem(HypixelPlayer p) { + SkyBlockPlayer player = (SkyBlockPlayer) p; + DatapointStringList discoveredZones = player.getSkyblockDataHandler().get( + SkyBlockDataHandler.Data.VISITED_REGIONS, + DatapointStringList.class + ); + List discoveredZonesList = discoveredZones.getValue(); + if (!discoveredZonesList.contains(location.name()) && location != LiftLocation.DWARVEN_MINES) { + return ItemStackCreator.getSingleLoreStack("§a" + location.prettyName(), "§e", location.material, 1, "§7Click to teleport to the §b" + location.prettyName() + "§7!\n\n§cNot discovered yet!"); + } + return ItemStackCreator.getSingleLoreStack("§a" + location.prettyName(), "§e", location.material, 1, "§7Click to teleport to the §b" + location.prettyName() + "§7!\n\n§eClick to travel!"); + } + }); + } + + updateItemStacks(getInventory(), getPlayer()); + } + + @Override + public void onBottomClick(InventoryPreClickEvent e) { + } + + enum LiftLocation { + GUNPOWDER_MINES(Material.GOLD_INGOT, 10, (player) -> teleportLocation(player, new Pos(52.5, 150, 15.5, 90f, 0))), + LAPIS_QUARRY(Material.LAPIS_LAZULI, 12, (player) -> teleportLocation(player, new Pos(52.5, 121, 15.5, 90f, 0))), + PIGMENS_DEN(Material.REDSTONE, 14, (player) -> teleportLocation(player, new Pos(52.5, 101, 15.5, 90f, 0))), + SLIMEHILL(Material.EMERALD, 16, (player) -> teleportLocation(player, new Pos(52.5, 66, 15.5, 90f, 0))), + DIAMOND_RESERVE(Material.DIAMOND, 29, (player) -> teleportLocation(player, new Pos(52.5, 38, 15.5, 90f, 0))), + OBSIDIAN_SANCTUARY(Material.OBSIDIAN, 31, (player) -> teleportLocation(player, new Pos(52.5, 13, 15.5, 90f, 0))), + DWARVEN_MINES(Material.PRISMARINE, 33, (player) -> { + player.sendTo(ServerType.SKYBLOCK_DWARVEN_MINES); + }); + + private final Material material; + private final int slot; + private final Consumer consumer; + + LiftLocation(Material material, int slot, Consumer consumer) { + this.material = material; + this.slot = slot; + this.consumer = consumer; + } + + private static void teleportLocation(HypixelPlayer player, Pos pos) { + player.teleport(pos); + } + + public String prettyName() { + String lower = this.name().toLowerCase(); + String[] parts = lower.split("_"); + StringBuilder capitalized = new StringBuilder(); + for (String part : parts) { + capitalized.append(Character.toUpperCase(part.charAt(0))).append(part.substring(1)).append(" "); + } + return capitalized.toString().trim(); + } + } +} diff --git a/type.deepcaverns/src/main/java/net/swofty/type/deepcaverns/gui/GUIShopWalter.java b/type.deepcaverns/src/main/java/net/swofty/type/deepcaverns/gui/GUIShopWalter.java new file mode 100644 index 000000000..a69dcf8d9 --- /dev/null +++ b/type.deepcaverns/src/main/java/net/swofty/type/deepcaverns/gui/GUIShopWalter.java @@ -0,0 +1,17 @@ +package net.swofty.type.deepcaverns.gui; + +import net.swofty.commons.item.ItemType; +import net.swofty.type.skyblockgeneric.gui.SkyBlockShopGUI; +import net.swofty.type.skyblockgeneric.item.SkyBlockItem; +import net.swofty.type.skyblockgeneric.shop.type.CoinShopPrice; + +public class GUIShopWalter extends SkyBlockShopGUI { + public GUIShopWalter() { + super("Walter", 1, SINGLE_SLOT); + } + + @Override + public void initializeShopItems() { + attachItem(ShopItem.Stackable(new SkyBlockItem(ItemType.SUPERBOOM_TNT), 1, new CoinShopPrice(2500))); + } +} diff --git a/type.deepcaverns/src/main/java/net/swofty/type/deepcaverns/npcs/NPCLapisMiner.java b/type.deepcaverns/src/main/java/net/swofty/type/deepcaverns/npcs/NPCLapisMiner.java new file mode 100644 index 000000000..5bdfe273e --- /dev/null +++ b/type.deepcaverns/src/main/java/net/swofty/type/deepcaverns/npcs/NPCLapisMiner.java @@ -0,0 +1,48 @@ +package net.swofty.type.deepcaverns.npcs; + +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.event.ClickEvent; +import net.minestom.server.coordinate.Pos; +import net.swofty.type.generic.entity.npc.HypixelNPC; +import net.swofty.type.generic.entity.npc.NPCParameters; +import net.swofty.type.generic.user.HypixelPlayer; +import net.swofty.type.skyblockgeneric.user.SkyBlockPlayer; + +public class NPCLapisMiner extends HypixelNPC { + + public NPCLapisMiner() { + super(new NPCParameters() { + @Override + public String[] holograms(HypixelPlayer player) { + return new String[]{"Lapis Miner", "§e§lCLICK"}; + } + + @Override + public String signature(HypixelPlayer player) { + return "SissRoKQWTHkTCNRnTMHimwaoqOA3OcENRzAEOAU+WZ+1NKJXqehyd6ntO3HyCzit9FlJSBigpCFKYEykR/yAhaFbyb9sbVv+HvO2OvttHkme+Nx9upGVOz7LeB+1tSiQtGEZgGqhOUxCppFsYWrVKUmGMSWf6TCnAv5TJHx1yjy0OgY5NpTaUOKW95egGKZEzbBUAvC7bi8n8Bfpv42yuYnAoMPQAQ2RvxRqNFNmTPsxy10y8x7v/GqxOIeC9gbBsklUE/UKEdyBE0I+fCn7MP80b94N0aAl5qIHH84/yzf1WMna4XRmywYoAf1MmH5Scl51RLeRwuCuwKobgGXTyViHtFkX+ELGrLOvw9SFRp98cvdr1ghoC7oyn3yaxXYC20Bz+OjOcq7LBn+Bq8NJk1yTZ4ePYVtNUZewV8kQpJL+zs6WvEiEh7raVF57BTaU+dkZ1BIW/BNv2xk3VZHR73lYxucI5oyT58mSUGZjUrsl6p9jirEXrc+iU9/pdtObV/CzWr53rMNNPZTLfMCrDYW+1a0YmRXPhYQ4KCOiZhH3utr1M58o8xNiw1Kf061ZCluA1LKV1CYyM0EffL2HADooDggpaq17Q6W6yScNqnROShL+sU6Aq3H+Sj2pa3KIni/OLRpBH+HodV/gZyh+MfTj73+uSZ9JCiC7dZkMkY="; + } + + @Override + public String texture(HypixelPlayer player) { + return "ewogICJ0aW1lc3RhbXAiIDogMTY5MzkzMDgxMjc2NCwKICAicHJvZmlsZUlkIiA6ICJmZDYwZjM2ZjU4NjE0ZjEyYjNjZDQ3YzJkODU1Mjk5YSIsCiAgInByb2ZpbGVOYW1lIiA6ICJSZWFkIiwKICAic2lnbmF0dXJlUmVxdWlyZWQiIDogdHJ1ZSwKICAidGV4dHVyZXMiIDogewogICAgIlNLSU4iIDogewogICAgICAidXJsIiA6ICJodHRwOi8vdGV4dHVyZXMubWluZWNyYWZ0Lm5ldC90ZXh0dXJlL2JmYWFmNWRlMGQyNWFlMjZiMjg3YTJiYTUxOTYxYjk2OGEzYWRkOGJiYzI0NzJlOTdhNzZmZGM2OGNlNDFmNzgiCiAgICB9CiAgfQp9"; + } + + @Override + public Pos position(HypixelPlayer player) { + return new Pos(-10.500, 120.000, 35.500, -115, 0); + } + + @Override + public boolean looking() { + return true; + } + }); + } + + @Override + public void onClick(PlayerClickNPCEvent event) { + SkyBlockPlayer player = (SkyBlockPlayer) event.player(); + player.sendMessage(Component.text("§cThis Feature is not there yet. §aOpen a Pull request HERE to get it added quickly!") + .clickEvent(ClickEvent.openUrl("https://github.com/Swofty-Developments/HypixelSkyBlock"))); + } +} \ No newline at end of file diff --git a/type.deepcaverns/src/main/java/net/swofty/type/deepcaverns/npcs/NPCLiftOperator.java b/type.deepcaverns/src/main/java/net/swofty/type/deepcaverns/npcs/NPCLiftOperator.java new file mode 100644 index 000000000..5c4602091 --- /dev/null +++ b/type.deepcaverns/src/main/java/net/swofty/type/deepcaverns/npcs/NPCLiftOperator.java @@ -0,0 +1,102 @@ +package net.swofty.type.deepcaverns.npcs; + +import net.minestom.server.coordinate.Pos; +import net.swofty.type.deepcaverns.gui.GUILiftOperator; +import net.swofty.type.generic.data.datapoints.DatapointToggles; +import net.swofty.type.generic.entity.npc.NPCDialogue; +import net.swofty.type.generic.entity.npc.NPCParameters; +import net.swofty.type.generic.user.HypixelPlayer; +import net.swofty.type.skyblockgeneric.mission.MissionData; +import net.swofty.type.skyblockgeneric.mission.missions.MissionTalkToLiftOperator; +import net.swofty.type.skyblockgeneric.user.SkyBlockPlayer; + +import java.util.stream.Stream; + +public class NPCLiftOperator extends NPCDialogue { + + public NPCLiftOperator() { + super(new NPCParameters() { + @Override + public String[] holograms(HypixelPlayer player) { + return new String[]{"Lift Operator", "§e§lCLICK"}; + } + + @Override + public String signature(HypixelPlayer player) { + return "W8e6ip++dGgqglbYiPyLxCEHUXpOMioWrf6bCJwMNPHmEFTJux+M0H4GZaDjs1+d7FcSHjg6rEbMWS1sZAL4TUh7Q9vCtEYlx0PfnkY42l1Qqo/tIpJvgY5J6RHZ1j1cvtfrgXfKU8AKpjZVDNNyAqc5iJWcgqAm1gj3SPH6SoVvfzZgx9avAKo3z440CRsIhLYwgwEtq8/sbkqi0y6cuwlCZ+reo7yy2Ohe5AwG0Sx7Tkkv0DIVC4wO2RYoP+4xw2MYi1SRWk9yv3ZKqjwhTP8ugB/xqK/R480vVrr7MLhCpLrbUzpuLiaAbfruF9/TmvBV2hXFSCrlqypo4EmLk1E3WSuJX5ls11+juht0M12MIUlmmYcsFjgnAux5tgJ+fQq3KWhrbYedEY4CG7swavIG71/ZZI/ugRCXz/KONOq7bXKn939CyIpPdfBBAo2RZhjk2QXG/bWODeTfJ6z5VlIivNzo65FCAdwJ54VQzmUcP86ID3/jrWQ5fE5fhPkGhpYtOlVn5S4xKdFtu6RfYYUX6cEPD6MRPcOzXB4ZvCzgD7QhKxIQDBc1S9XY35c6+ZDYHPokQa87iD053Yfft4PH/pZA21ovOcf7+Xa+AFu72wnsjbynkaZUqSrFz3mCdOl+TFynZe89SwgDX0t1mIPtGtJmtK5jbZpwFA4bqDE="; + } + + @Override + public String texture(HypixelPlayer player) { + return "eyJ0aW1lc3RhbXAiOjE1NTQ1NzE2OTkxOTAsInByb2ZpbGVJZCI6IjNmYzdmZGY5Mzk2MzRjNDE5MTE5OWJhM2Y3Y2MzZmVkIiwicHJvZmlsZU5hbWUiOiJZZWxlaGEiLCJzaWduYXR1cmVSZXF1aXJlZCI6dHJ1ZSwidGV4dHVyZXMiOnsiU0tJTiI6eyJ1cmwiOiJodHRwOi8vdGV4dHVyZXMubWluZWNyYWZ0Lm5ldC90ZXh0dXJlLzg2NTJhMDZmN2I5OWU0ODIyYjQ5NWJhOWI2MDg5ZDRkNTE1MWU4M2JlZDk1NmE3Y2NjYjg0N2VhNDZhMjU3MjUifX19"; + } + + @Override + public Pos position(HypixelPlayer player) { + final Pos[] positions = new Pos[]{ + new Pos(45.500, 150.000, 15.500, 90f, 0f), + new Pos(45.500, 121.000, 15.500, 90f, 0f), + new Pos(45.500, 101.000, 17.500, 90f, 0f), + new Pos(45.500, 66.000, 15.500, 90f, 0f), + new Pos(45.500, 38.000, 15.500, 90f, 0f), + new Pos(45.500, 13.0, 15.500, 90f, 0f), + }; + + final Pos playerPos = player.getPosition(); + double bestDistSq = Double.POSITIVE_INFINITY; + int closestIndex = 0; + + for (int i = 0; i < positions.length; i++) { + Pos pos = positions[i]; + double dx = playerPos.x() - pos.x(); + double dy = playerPos.y() - pos.y(); + double dz = playerPos.z() - pos.z(); + double distSq = dx * dx + dy * dy + dz * dz; + + if (distSq < bestDistSq) { + bestDistSq = distSq; + closestIndex = i; + } + } + + return positions[closestIndex]; + } + + + @Override + public boolean looking() { + return true; + } + }); + } + + @Override + public void onClick(PlayerClickNPCEvent e) { + SkyBlockPlayer player = (SkyBlockPlayer) e.player(); + if (isInDialogue(player)) return; + boolean hasSpokenBefore = player.getToggles().get(DatapointToggles.Toggles.ToggleType.HAS_SPOKEN_TO_LIFT_OPERATOR); + + if (!hasSpokenBefore) { + setDialogue(player, "hello").thenRun(() -> { + player.getToggles().set(DatapointToggles.Toggles.ToggleType.HAS_SPOKEN_TO_LIFT_OPERATOR, true); + }); + return; + } + + new GUILiftOperator().open(player); + } + + @Override + public NPCDialogue.DialogueSet[] getDialogueSets(HypixelPlayer player) { + return Stream.of( + DialogueSet.builder() + .key("hello").lines(new String[]{ + "Hey Feller!", + "I control this lift here behind me.", + "Once you've explored an area I can give you a safe ride back there.", + "Be careful not to fall down the shaft though, it's a long fall!", + "Good luck on your adventures." + }).build() + ).toArray(NPCDialogue.DialogueSet[]::new); + } +} \ No newline at end of file diff --git a/type.deepcaverns/src/main/java/net/swofty/type/deepcaverns/npcs/NPCRedstoneMiner.java b/type.deepcaverns/src/main/java/net/swofty/type/deepcaverns/npcs/NPCRedstoneMiner.java new file mode 100644 index 000000000..4c16f2eab --- /dev/null +++ b/type.deepcaverns/src/main/java/net/swofty/type/deepcaverns/npcs/NPCRedstoneMiner.java @@ -0,0 +1,48 @@ +package net.swofty.type.deepcaverns.npcs; + +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.event.ClickEvent; +import net.minestom.server.coordinate.Pos; +import net.swofty.type.generic.entity.npc.HypixelNPC; +import net.swofty.type.generic.entity.npc.NPCParameters; +import net.swofty.type.generic.user.HypixelPlayer; +import net.swofty.type.skyblockgeneric.user.SkyBlockPlayer; + +public class NPCRedstoneMiner extends HypixelNPC { + + public NPCRedstoneMiner() { + super(new NPCParameters() { + @Override + public String[] holograms(HypixelPlayer player) { + return new String[]{"Redstone Miner", "§e§lCLICK"}; + } + + @Override + public String signature(HypixelPlayer player) { + return "wJTZ9MCUjX/mtBuzZcey1VVlywKqV91n8hWUGyrR/37p+gCntLgGzjssYYWqKRWgVosrIPjtye5E23fYMv3lW+SEPdu3o14kjYl+ZPzXLJ/A3Kt8aJO+8TJthGzXGm2fKb3PTmvQVIvAxaoOzDwP9Q8JjXgZcUCoLtY1IGlcAlr4xWqUQNV3UsbNeWG/1W9otKgqrvX9oKBn+ScSQMPItIasG6VKRj/22S/kSlzgkS7ZdewpM6Yzk/sT2srvkKQuM561ZCX1AMq7xhr+OdJRg3zEX3G6PTVDBWk8pWPvTYvCVpkreEfh47WiFRGweWmB4lvTWITDj9dyOHwG1M08bR4w1oVOUkN+RzA7X1/4vSlwOIJIf0s/1JH+hmM1bIvGWl46ZqxitKUyq6/NfSFtWVnlXNshz1+5/eZ8DYGfKUtKiJQvxTU86mZ0kdeUiys97WB8Qs/x/nVoxgz61+LAAp9lQ3EetVgnfyUvJc8aegTnIuJwt18SoPB3w9RTZU40BE7EcXjUE/tcQ7aD/f7MTGhqNokfNmsGatLxOpi8Jg7Z9dKkXpYUIqRP2wm/5ahHfMfQYAamDVTEblpgfJcaEwMUlPlwOjHcwrlTi5a1DjA6s9V9d3SalYEtn+a+YrP51Ib4NhGMXVyE4jOQstMdzaG4JKpJYiNHmwNwU/4QY58="; + } + + @Override + public String texture(HypixelPlayer player) { + return "ewogICJ0aW1lc3RhbXAiIDogMTY5MzkzMDkxNTIyMiwKICAicHJvZmlsZUlkIiA6ICJiMGQ0YjI4YmMxZDc0ODg5YWYwZTg2NjFjZWU5NmFhYiIsCiAgInByb2ZpbGVOYW1lIiA6ICJNaW5lU2tpbl9vcmciLAogICJzaWduYXR1cmVSZXF1aXJlZCIgOiB0cnVlLAogICJ0ZXh0dXJlcyIgOiB7CiAgICAiU0tJTiIgOiB7CiAgICAgICJ1cmwiIDogImh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvOTUwM2MwMDg5MDMyNjYwNTA2N2ZmMTZmZmZiYzJkMDUwMjI1MWIzNjgwYzFhY2MxZDY4Y2QzZDA2NGQwNTc3IgogICAgfQogIH0KfQ=="; + } + + @Override + public Pos position(HypixelPlayer player) { + return new Pos(25.000, 104.000, 16.500, -66, 0); + } + + @Override + public boolean looking() { + return true; + } + }); + } + + @Override + public void onClick(PlayerClickNPCEvent event) { + SkyBlockPlayer player = (SkyBlockPlayer) event.player(); + player.sendMessage(Component.text("§cThis Feature is not there yet. §aOpen a Pull request HERE to get it added quickly!") + .clickEvent(ClickEvent.openUrl("https://github.com/Swofty-Developments/HypixelSkyBlock"))); + } +} \ No newline at end of file diff --git a/type.deepcaverns/src/main/java/net/swofty/type/deepcaverns/npcs/NPCRhys.java b/type.deepcaverns/src/main/java/net/swofty/type/deepcaverns/npcs/NPCRhys.java new file mode 100644 index 000000000..4bf0f7caa --- /dev/null +++ b/type.deepcaverns/src/main/java/net/swofty/type/deepcaverns/npcs/NPCRhys.java @@ -0,0 +1,48 @@ +package net.swofty.type.deepcaverns.npcs; + +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.event.ClickEvent; +import net.minestom.server.coordinate.Pos; +import net.swofty.type.generic.entity.npc.HypixelNPC; +import net.swofty.type.generic.entity.npc.NPCParameters; +import net.swofty.type.generic.user.HypixelPlayer; +import net.swofty.type.skyblockgeneric.user.SkyBlockPlayer; + +public class NPCRhys extends HypixelNPC { + + public NPCRhys() { + super(new NPCParameters() { + @Override + public String[] holograms(HypixelPlayer player) { + return new String[]{"Rhys", "§e§lCLICK"}; + } + + @Override + public String signature(HypixelPlayer player) { + return "cEhw4KPnjOLHodZV5sBF0cDMUcmzFklYNbv8zR3G1+IwdkEfLxnXeSOeZRu3OrGOvxn6WwZWl/P4cZbfAxYEoVXvTYFesNM8lI0VNwuqt0QGz5sjkKMlQlEbdQilnw2Ki77SAqFqd8XHknYuUku/XpMEFCvDaS96SwTkQRwitE8EhJb5/X9AS6m/Wslu/F/AuKcZKc5UIXFr6geGV0XhJUpW8rBnWPxf4so5XKdQLXPvM8aActwAecXV4MkIPTsP1N6nOywEOeV5qs56AgoNgx44u+38Xg+0RV0wr9hzYHENPos7ZSfdVwd/tqAMTbyrKj4AGppl7MnSynEdgiBBk22qiF3g8vYgGj4O9w3h5185U9Ow7f2DihIy3mDAiFSvc77Hx/BGYkIxZ4HXWrKRj3INTxVSalB1RG7tuCHs4J/xAaDu2yI5zSedAX+L6VXeudIzpUPym5JaRc3alL1TW94ZQZ4W7QKw5fViLVORr4lve2fdDaz9KRUVkGeQx9L7Q81LaCV84E/8j0juzyHMtVdm+fmDERr+TSoa7REk6KIg0bpTqvyWiqJyygL8/sw02SuhqAupFdf3QOTLbLrh4qU8LtMvykl9V7n36uSTRZi0EVJasODGEVF2Qyt+toFSRdIvc6YUY+C2UJf3jI1C7E9hAuz42ayleKdGoezAsds="; + } + + @Override + public String texture(HypixelPlayer player) { + return "ewogICJ0aW1lc3RhbXAiIDogMTYwODMxNDY5NDY2OSwKICAicHJvZmlsZUlkIiA6ICI0MWQzYWJjMmQ3NDk0MDBjOTA5MGQ1NDM0ZDAzODMxYiIsCiAgInByb2ZpbGVOYW1lIiA6ICJNZWdha2xvb24iLAogICJzaWduYXR1cmVSZXF1aXJlZCIgOiB0cnVlLAogICJ0ZXh0dXJlcyIgOiB7CiAgICAiU0tJTiIgOiB7CiAgICAgICJ1cmwiIDogImh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvNmIyMGIyM2MxYWEyYmUwMjcwZjAxNmI0YzkwZDZlZTZiODMzMGExN2NmZWY4Nzg2OWQ2YWQ2MGIyZmZiZjNiNSIKICAgIH0KICB9Cn0="; + } + + @Override + public Pos position(HypixelPlayer player) { + return new Pos(31.500, 12.000, 14.500, -90, 0); + } + + @Override + public boolean looking() { + return true; + } + }); + } + + @Override + public void onClick(PlayerClickNPCEvent event) { + SkyBlockPlayer player = (SkyBlockPlayer) event.player(); + player.sendMessage(Component.text("§cThis Feature is not there yet. §aOpen a Pull request HERE to get it added quickly!") + .clickEvent(ClickEvent.openUrl("https://github.com/Swofty-Developments/HypixelSkyBlock"))); + } +} \ No newline at end of file diff --git a/type.deepcaverns/src/main/java/net/swofty/type/deepcaverns/npcs/NPCWalter.java b/type.deepcaverns/src/main/java/net/swofty/type/deepcaverns/npcs/NPCWalter.java new file mode 100644 index 000000000..af203acea --- /dev/null +++ b/type.deepcaverns/src/main/java/net/swofty/type/deepcaverns/npcs/NPCWalter.java @@ -0,0 +1,102 @@ +package net.swofty.type.deepcaverns.npcs; + +import net.kyori.adventure.text.format.NamedTextColor; +import net.minestom.server.coordinate.Pos; +import net.minestom.server.item.ItemStack; +import net.swofty.type.deepcaverns.gui.GUIShopWalter; +import net.swofty.type.generic.entity.npc.NPCDialogue; +import net.swofty.type.generic.entity.npc.NPCOption; +import net.swofty.type.generic.entity.npc.NPCParameters; +import net.swofty.type.generic.user.HypixelPlayer; +import net.swofty.type.generic.utility.MathUtility; +import net.swofty.type.skyblockgeneric.item.SkyBlockItem; +import net.swofty.type.skyblockgeneric.item.components.AbiphoneComponent; +import net.swofty.type.skyblockgeneric.user.SkyBlockPlayer; + +import java.util.Collections; +import java.util.stream.Stream; + +public class NPCWalter extends NPCDialogue { + + public NPCWalter() { + super(new NPCParameters() { + @Override + public String[] holograms(HypixelPlayer player) { + return new String[]{"Walter", "§e§lCLICK"}; + } + + @Override + public String signature(HypixelPlayer player) { + return "pYSyVXmvIReEOZA6g7/m7dA1WCdC/GE9yj/78LN/cEwVwUf7OTYwadV9nv4DHaQSvw9qICXff25/ewa2ayer/HHhl6/9UX7nso/CZdc4nlyDkA9v6ywKu5yChgWHdpJKbYoDolIdOoYj5TFSAlN0rewNlLivEK2B+8BCugeNJbEiIcgmnq7sdovh7M2r6VH3ZXG7mvC6nq37aMsKxrT0mjkzRnTAMGgYv3Tdnu8kzcAQTBJWejdT4MsBBytcFPquQXdlt36+ng7n3ERGzB3F8nIdX2smAjft19hCfPbrbQQL4WRzQi2fyrACnYIaNACRnlhnu55+UGFYlUrdGeCEHmjLz0aFsipnmmq5xFAOyx3Vr/EAbyy5hSBN316yMeklDCgiGIqPgvjMTdpSMqglNEzgqxT/s2NCDbjpmdcTP8j44MfWd522ehAA/W+g9BIto2ERmF3AFm8NqA6LEjs1jyNOEAuL0rG7KoJ+p1bEvGW6V/2Z7zEUnF/KYAQpTmTsOWBssUFvFHUAytzoTABBuWFIv39Jb9uaLljMhWGYknwIPMmmnkw2UYzqvjbZ3VpHBoEN2FlGXGVe3K/pmSK/wrfR61vq+vQ2w7eOfmyx7GXqPTYRGdDJbuuTs0fpUDkx243Gjjt1p58zSl4l2tTAEji3yjWf4lT11y+hmBbYQqs="; + } + + @Override + public String texture(HypixelPlayer player) { + return "ewogICJ0aW1lc3RhbXAiIDogMTU5MzgyNTM2OTAzOSwKICAicHJvZmlsZUlkIiA6ICI4YzUzN2M3YWEzYjI0NWFmOGQ0ODY2YmIxZjhjMGU5YSIsCiAgInByb2ZpbGVOYW1lIiA6ICJCb0F0TmVlR2EiLAogICJzaWduYXR1cmVSZXF1aXJlZCIgOiB0cnVlLAogICJ0ZXh0dXJlcyIgOiB7CiAgICAiU0tJTiIgOiB7CiAgICAgICJ1cmwiIDogImh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvNDNhYzIxYjY1M2EyNzYzMmRiYzgzNzNjNmU2ZmJhNWI4Yzk3YjdlY2JmZWYyZDc5MzYzMGQxNDliMTE2YmE4MSIsCiAgICAgICJtZXRhZGF0YSIgOiB7CiAgICAgICAgIm1vZGVsIiA6ICJzbGltIgogICAgICB9CiAgICB9CiAgfQp9"; + } + + @Override + public Pos position(HypixelPlayer player) { + return new Pos(19.000, 156.000, -36.000, -25, 0); + } + + @Override + public boolean looking() { + return true; + } + }); + } + + @Override + public void onClick(PlayerClickNPCEvent event) { + SkyBlockPlayer player = (SkyBlockPlayer) event.player(); + if (isInDialogue(player)) return; + + ItemStack itemStack = player.getItemInMainHand(); + SkyBlockItem item = new SkyBlockItem(itemStack); + + if (item.hasComponent(AbiphoneComponent.class)) { + setDialogue(player, "abiphone").thenRun(() -> { + NPCOption.sendOption(player, "walter", Collections.singletonList(new NPCOption.Option( + "pay", // actual id from Hypixel + NamedTextColor.GREEN, + "DONATE CUBE", + (p) -> { + setDialogue(player, "donate_cube_no_requirements"); + } + ))); + }); + return; + } + + setDialogue(player, "none").thenRun(() -> { + MathUtility.delay(() -> new GUIShopWalter().open(player), 20); + }); + } + + @Override + public NPCDialogue.DialogueSet[] getDialogueSets(HypixelPlayer player) { + return Stream.of( + DialogueSet.builder() + .key("none").lines(new String[]{ + "With the right tools, you can get through anything!", + }).build(), + DialogueSet.builder() + .key("abiphone").lines(new String[]{ // when clicking with an Abiphone + "My abiphone is for Platinum-level donors of the Walter cause only.", + "You know these superbooms don't craft themselves right?", + "You just need §3Sulphur Collection 7 §fand to then donate an Enchanted Sulphur Cube!", // then show "donate cube" option + }).abiPhone(true).build(), + DialogueSet.builder() + .key("donate_cube").lines(new String[]{ // when donating the cube with requirements met + "Welcome to the Platinum club, high roller!", + "Call me anytime!", + "And before you ask... yes, I do try to commercialize all of my friendships.", + }).abiPhone(true).build(), + DialogueSet.builder() + .key("donate_cube_no_requirements").lines(new String[]{ // when donating the cube without requirements met + "Mmh... you're missing something to become a Platinum-level donor...", + }).abiPhone(true).build() + ).toArray(NPCDialogue.DialogueSet[]::new); + } +} \ No newline at end of file diff --git a/type.deepcaverns/src/main/java/net/swofty/type/deepcaverns/tab/DeepCavernsServerModule.java b/type.deepcaverns/src/main/java/net/swofty/type/deepcaverns/tab/DeepCavernsServerModule.java new file mode 100644 index 000000000..d8d7e74f7 --- /dev/null +++ b/type.deepcaverns/src/main/java/net/swofty/type/deepcaverns/tab/DeepCavernsServerModule.java @@ -0,0 +1,25 @@ +package net.swofty.type.deepcaverns.tab; + +import net.swofty.type.generic.HypixelConst; +import net.swofty.type.generic.tab.TablistModule; +import net.swofty.type.generic.tab.TablistSkinRegistry; +import net.swofty.type.generic.user.HypixelPlayer; + +import java.util.ArrayList; +import java.util.List; + +public class DeepCavernsServerModule extends TablistModule { + @Override + public List getEntries(HypixelPlayer player) { + ArrayList entries = new ArrayList<>(List.of( + new TablistEntry(getCentered("§3§lServer Info"), TablistSkinRegistry.CYAN) + )); + + entries.add(new TablistEntry("§b§lArea: §7Deep Caverns", TablistSkinRegistry.GRAY)); + entries.add(new TablistEntry(" Server: §8" + HypixelConst.getServerName(), TablistSkinRegistry.GRAY)); + + fillRestWithGray(entries); + + return entries; + } +} diff --git a/type.dwarvenmines/build.gradle.kts b/type.dwarvenmines/build.gradle.kts new file mode 100644 index 000000000..4bd276792 --- /dev/null +++ b/type.dwarvenmines/build.gradle.kts @@ -0,0 +1,26 @@ +plugins { + java +} + +group = "net.swofty" +version = "3.0" + +java { + sourceCompatibility = JavaVersion.VERSION_25 + targetCompatibility = JavaVersion.VERSION_25 + toolchain { + languageVersion.set(JavaLanguageVersion.of(25)) + } +} + +dependencies { + implementation(project(":type.skyblockgeneric")) + implementation(project(":type.generic")) + implementation(project(":commons")) + implementation(project(":proxy.api")) + compileOnly("net.minestom:minestom:2025.12.20c-1.21.11") { + exclude(group = "org.jboss.shrinkwrap.resolver", module = "shrinkwrap-resolver-depchain") + } + implementation("org.tinylog:tinylog-api:2.7.0") + implementation("org.tinylog:tinylog-impl:2.7.0") +} \ No newline at end of file diff --git a/type.dwarvenmines/src/main/java/net/swofty/type/dwarvenmines/TypeDwarvenMinesLoader.java b/type.dwarvenmines/src/main/java/net/swofty/type/dwarvenmines/TypeDwarvenMinesLoader.java new file mode 100644 index 000000000..24143c19e --- /dev/null +++ b/type.dwarvenmines/src/main/java/net/swofty/type/dwarvenmines/TypeDwarvenMinesLoader.java @@ -0,0 +1,125 @@ +package net.swofty.type.dwarvenmines; + +import net.minestom.server.MinecraftServer; +import net.minestom.server.coordinate.Pos; +import net.swofty.commons.CustomWorlds; +import net.swofty.commons.ServerType; +import net.swofty.commons.ServiceType; +import net.swofty.proxyapi.redis.ProxyToClient; +import net.swofty.proxyapi.redis.ServiceToClient; +import net.swofty.type.dwarvenmines.tab.DwarvenMinesServerModule; +import net.swofty.type.generic.SkyBlockTypeLoader; +import net.swofty.type.generic.entity.animalnpc.HypixelAnimalNPC; +import net.swofty.type.generic.entity.npc.HypixelNPC; +import net.swofty.type.generic.entity.villager.HypixelVillagerNPC; +import net.swofty.type.generic.event.HypixelEventClass; +import net.swofty.type.generic.tab.TablistManager; +import net.swofty.type.generic.tab.TablistModule; +import net.swofty.type.skyblockgeneric.SkyBlockGenericLoader; +import net.swofty.type.skyblockgeneric.tabmodules.AccountInformationModule; +import net.swofty.type.skyblockgeneric.tabmodules.SkyBlockPlayersOnlineModule; +import org.jetbrains.annotations.Nullable; +import org.tinylog.Logger; + +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +public class TypeDwarvenMinesLoader implements SkyBlockTypeLoader { + @Override + public ServerType getType() { + return ServerType.SKYBLOCK_DWARVEN_MINES; + } + + @Override + public void onInitialize(MinecraftServer server) { + Logger.info("TypeDwarvenMinesLoader initialized!"); + } + + @Override + public void afterInitialize(MinecraftServer server) { + + } + + @Override + public LoaderValues getLoaderValues() { + return new LoaderValues( + (type) -> switch (type) { + default -> new Pos(-85, 200, -123, -90, 0); + }, // Spawn position + true // Announce death messages + ); + } + + public TablistManager getTablistManager() { + return new TablistManager() { + @Override + public List getModules() { + return new ArrayList<>(List.of( + new SkyBlockPlayersOnlineModule(1), + new SkyBlockPlayersOnlineModule(2), + new DwarvenMinesServerModule(), + new AccountInformationModule() + )); + } + }; + } + + @Override + public List getTraditionalEvents() { + return SkyBlockGenericLoader.loopThroughPackage( + "net.swofty.type.dwarvenmines.events", + HypixelEventClass.class + ).collect(Collectors.toList()); + } + + @Override + public List getCustomEvents() { + return new ArrayList<>(); + } + + @Override + public List getNPCs() { + List npcs = new ArrayList<>(); + + npcs.addAll(SkyBlockGenericLoader.loopThroughPackage( + "net.swofty.type.dwarvenmines.npcs", + HypixelNPC.class + ).toList()); + + return npcs; + } + + @Override + public List getServiceRedisListeners() { + return List.of(); + } + + @Override + public List getProxyRedisListeners() { + return List.of(); + } + + @Override + public List getVillagerNPCs() { + return new ArrayList<>(SkyBlockGenericLoader.loopThroughPackage( + "net.swofty.type.dwarvenmines.villagers", + HypixelVillagerNPC.class + ).toList()); + } + + @Override + public List getAnimalNPCs() { + return new ArrayList<>(); + } + + @Override + public List getRequiredServices() { + return new ArrayList<>(List.of(ServiceType.DATA_MUTEX)); + } + + @Override + public @Nullable CustomWorlds getMainInstance() { + return CustomWorlds.SKYBLOCK_DWARVEN_MINES; + } +} diff --git a/type.dwarvenmines/src/main/java/net/swofty/type/dwarvenmines/events/ActionPlayerJoin.java b/type.dwarvenmines/src/main/java/net/swofty/type/dwarvenmines/events/ActionPlayerJoin.java new file mode 100644 index 000000000..1a8d7d7a5 --- /dev/null +++ b/type.dwarvenmines/src/main/java/net/swofty/type/dwarvenmines/events/ActionPlayerJoin.java @@ -0,0 +1,26 @@ +package net.swofty.type.dwarvenmines.events; + +import lombok.SneakyThrows; +import net.minestom.server.event.player.AsyncPlayerConfigurationEvent; +import net.swofty.type.generic.HypixelConst; +import net.swofty.type.generic.event.EventNodes; +import net.swofty.type.generic.event.HypixelEvent; +import net.swofty.type.generic.event.HypixelEventClass; +import net.swofty.type.skyblockgeneric.user.SkyBlockPlayer; + +public class ActionPlayerJoin implements HypixelEventClass { + + @SneakyThrows + @HypixelEvent(node = EventNodes.PLAYER, requireDataLoaded = false) + public void run(AsyncPlayerConfigurationEvent event) { + + final SkyBlockPlayer player = (SkyBlockPlayer) event.getPlayer(); + + event.setSpawningInstance(HypixelConst.getInstanceContainer()); + player.setRespawnPoint(HypixelConst.getTypeLoader() + .getLoaderValues() + .spawnPosition() + .apply(player.getOriginServer()) + ); + } +} diff --git a/type.dwarvenmines/src/main/java/net/swofty/type/dwarvenmines/npcs/NPCBankerBroadjaw.java b/type.dwarvenmines/src/main/java/net/swofty/type/dwarvenmines/npcs/NPCBankerBroadjaw.java new file mode 100644 index 000000000..2b7f39f0b --- /dev/null +++ b/type.dwarvenmines/src/main/java/net/swofty/type/dwarvenmines/npcs/NPCBankerBroadjaw.java @@ -0,0 +1,44 @@ +package net.swofty.type.dwarvenmines.npcs; + +import net.minestom.server.coordinate.Pos; +import net.swofty.type.generic.entity.npc.HypixelNPC; +import net.swofty.type.generic.entity.npc.NPCParameters; +import net.swofty.type.generic.user.HypixelPlayer; +import net.swofty.type.skyblockgeneric.gui.inventories.banker.GUIBanker; + +public class NPCBankerBroadjaw extends HypixelNPC { + + public NPCBankerBroadjaw() { + super(new NPCParameters() { + @Override + public String[] holograms(HypixelPlayer player) { + return new String[]{"§6Banker Broadjaw", "§e§lCLICK"}; + } + + @Override + public String signature(HypixelPlayer player) { + return "PaUxiTsjUMkZYK0pG/asB1a6/FALKLHWL5JbS1j1cGTW+6iTRD6JES6mQlOsJtf1/KJ0CX+ONfmvMjRN+x27s/ufQGDI4BLtem/UFnxu82OBzhVT4FDEUn792yi+YkVyb1gDFQW3UkkgMahSLBoe+I4JtFl+4OMUTBQZF8eYsWlr8ViwAs0a3gr5JbnLrtPxbhUwmgtcBrw2Hk+WipSgcWoZyhvG+17SHZ2zqIzu8tOi7k0lp92VZs1GFRs50ZpMV7/IHB3pEwp1Peh8DlMDtpIDdOOxmiNtJBZVGIyXXwoQ/wmg2ma4TUaanwBkJh+Sdd1yT0aRwdMGEzl0wAzHhEyr/L17SKSdUaK+29un+4pTV2nqTO3dLRSCnRVOmJtMnrfc+K0aoivJhCc3MRIaSB5Ib1bP86l57wNVomTeca+ywl+M4oF62Gq1QQnDmZHERB5i0TzP49DVKJy7sU/8mnfmah5+mfpIM7C5p+IB6ALWJ7nn/5QV4jqP+sUDw0+0XN/1KeXwnGGyhHn2B7ysYkqA8AUpNi/ygYhEeqUlJCDzKAP7GrkE9CktbQdH8HXb0KpS9hUmweKmL7VR9aJiqcK5LTCVctZfPA6H9fXTagIk7tPKth41GBnSjDJazj61MlUazNpYJIBQnDuErllKecr0Gft2E/jxrezWlaw+fmg="; + } + + @Override + public String texture(HypixelPlayer player) { + return "ewogICJ0aW1lc3RhbXAiIDogMTYwOTI0NTM4MDg1MCwKICAicHJvZmlsZUlkIiA6ICI3MmNiMDYyMWU1MTA0MDdjOWRlMDA1OTRmNjAxNTIyZCIsCiAgInByb2ZpbGVOYW1lIiA6ICJNb3M5OTAiLAogICJzaWduYXR1cmVSZXF1aXJlZCIgOiB0cnVlLAogICJ0ZXh0dXJlcyIgOiB7CiAgICAiU0tJTiIgOiB7CiAgICAgICJ1cmwiIDogImh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvZTU5ZjhjNGRmZDFjNTgzYThhNTRmYTVjYzdmOGViNmMyNGQyNjlhZjI3Yzk5ZmQ5ZjJiMmJiZjQwZTcwZmVkMiIKICAgIH0KICB9Cn0="; + } + + @Override + public Pos position(HypixelPlayer player) { + return new Pos(13.500, 201.000, -148.500, 44, 0); + } + + @Override + public boolean looking() { + return true; + } + }); + } + + @Override + public void onClick(PlayerClickNPCEvent event) { + new GUIBanker().open(event.player()); + } +} \ No newline at end of file diff --git a/type.dwarvenmines/src/main/java/net/swofty/type/dwarvenmines/npcs/NPCBubu.java b/type.dwarvenmines/src/main/java/net/swofty/type/dwarvenmines/npcs/NPCBubu.java new file mode 100644 index 000000000..72a9138d2 --- /dev/null +++ b/type.dwarvenmines/src/main/java/net/swofty/type/dwarvenmines/npcs/NPCBubu.java @@ -0,0 +1,48 @@ +package net.swofty.type.dwarvenmines.npcs; + +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.event.ClickEvent; +import net.minestom.server.coordinate.Pos; +import net.swofty.type.generic.entity.npc.HypixelNPC; +import net.swofty.type.generic.entity.npc.NPCParameters; +import net.swofty.type.generic.user.HypixelPlayer; +import net.swofty.type.skyblockgeneric.user.SkyBlockPlayer; + +public class NPCBubu extends HypixelNPC { + + public NPCBubu() { + super(new NPCParameters() { + @Override + public String[] holograms(HypixelPlayer player) { + return new String[]{"§5Bubu", "§e§lCLICK"}; + } + + @Override + public String signature(HypixelPlayer player) { + return "Tu4M+oWlNBsaoOukmq/Zx0zbq/xnCxOFFGOsVnk6Rw38djwURcKWUp5xz4N3IBGfLGCaeZdUu3FwEwNn4qeQ58lEO+MWc0pOhphP4CI1qsMK5fx+I42PKlJSGX12gUwHTJWJtIgKtVgcXMSNpP24p3HrJqpk/K4oDIP2MO3pQ+UwMn0b0QkRcpGK1JqyPMiIM2gdDnn/dtfZswrNQ1KkvZgeGWt8mcvt/iMK8/67br6bFJV8ql7k1H5Gk+Qx5s2RQ2U2cp2u0x4CDxqr41xZqqXLIrjpzUkah8EvalSBW6yNnLnAQXgALwKsiG+X9MX1MY1xXbBbTbkKDPR8qUy4DS+FujHvt3FL4W0PP/5uhzaKxazDEqXOk0m6xhvzLLhcz/86lou6LWba67yhECJvLcSiTMLTQa87IG1PGozOg8czPX36F73WxOu/FClsLw5bLTsUA3aBAtCUG8MVWOMuqG6sCmibPSVfr/YJKIib4veZrHGa6zCEj7gl75yF1A3lj0wYWSr4NsuYR7JxzMgv7HmujeYMgrx7CimcTQWCu1ReGqTMQziF03tRCc2V2h5/1uhFOiAr0Q0FMEmF/vXPrxq6Bt4TD7XhVUsDNvYZ8piUwKL19YKtcS79hIOCzu3+SsDFk9dKXIEVO0aqBQGfVvpsAayiIVPpdCF1/JQGWUw="; + } + + @Override + public String texture(HypixelPlayer player) { + return "ewogICJ0aW1lc3RhbXAiIDogMTYwODMxMzM3MzE3MywKICAicHJvZmlsZUlkIiA6ICI0MWQzYWJjMmQ3NDk0MDBjOTA5MGQ1NDM0ZDAzODMxYiIsCiAgInByb2ZpbGVOYW1lIiA6ICJNZWdha2xvb24iLAogICJzaWduYXR1cmVSZXF1aXJlZCIgOiB0cnVlLAogICJ0ZXh0dXJlcyIgOiB7CiAgICAiU0tJTiIgOiB7CiAgICAgICJ1cmwiIDogImh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvNjVmMzFjMWMyMTVhNTdlOTM3ZmQ3NWFiMzU3ODJmODVlYzI0MmExYjFmOTUwYTI2YTQyYmI1ZTBhYTVjYmVkYSIKICAgIH0KICB9Cn0="; + } + + @Override + public Pos position(HypixelPlayer player) { + return new Pos(-10.500, 201.000, -103.500, 45, 0); + } + + @Override + public boolean looking() { + return true; + } + }); + } + + @Override + public void onClick(PlayerClickNPCEvent event) { + SkyBlockPlayer player = (SkyBlockPlayer) event.player(); + player.sendMessage(Component.text("§cThis Feature is not there yet. §aOpen a Pull request HERE to get it added quickly!") + .clickEvent(ClickEvent.openUrl("https://github.com/Swofty-Developments/HypixelSkyBlock"))); + } +} \ No newline at end of file diff --git a/type.dwarvenmines/src/main/java/net/swofty/type/dwarvenmines/npcs/NPCBulvar.java b/type.dwarvenmines/src/main/java/net/swofty/type/dwarvenmines/npcs/NPCBulvar.java new file mode 100644 index 000000000..efed40448 --- /dev/null +++ b/type.dwarvenmines/src/main/java/net/swofty/type/dwarvenmines/npcs/NPCBulvar.java @@ -0,0 +1,48 @@ +package net.swofty.type.dwarvenmines.npcs; + +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.event.ClickEvent; +import net.minestom.server.coordinate.Pos; +import net.swofty.type.generic.entity.npc.HypixelNPC; +import net.swofty.type.generic.entity.npc.NPCParameters; +import net.swofty.type.generic.user.HypixelPlayer; +import net.swofty.type.skyblockgeneric.user.SkyBlockPlayer; + +public class NPCBulvar extends HypixelNPC { + + public NPCBulvar() { + super(new NPCParameters() { + @Override + public String[] holograms(HypixelPlayer player) { + return new String[]{"§5Bulvar", "§e§lCLICK"}; + } + + @Override + public String signature(HypixelPlayer player) { + return "L96mT0EgH5wKootwvD+UZjsosZYKCl0gYnCjiBqmOLWDFUfVE3izl+Va1A53sgNWn/HWyzd/yaqLnZnBQJvsRIUqUjAfySmQvbOyxN9Lp4BZJN8PFmcg4gYUjpu8Yo/Ykfp0a9X2TyMVKzdK1EpupuFsmuIUSzBuF/gwO+FjZV1WaeuW6wU/QJZD/pYuJw7ZaUlLA5JTVjD/D5ytLC5cQJST4zWez+JGkftf+OHHNidpoWEdi6SqD1CJE1dhDxV6bmwsunLV/z9ZU51k14Ccq9Pe+YsFHXMZANrIv7sCgS3BU9GHVV3t4m/roxZwOwjccDXosC14A6jEnUG8ab2ub5r1Nnfn/duTRxrkR9+e6gxa3tlf960G7jeEE/5TO1I16cklhLugfOus8n1CJDgtCUccDfu/0yOWSX6jtdsE6U7MnZkW716LIJdrDpaIzewTI2z/kuOicXiK/Gtb5yRYwryNEmTuYTKVrU3EuPsV0I3E+fWl3Dj9Z6Vtrt0vvebucy2Tpk9Xc1ATCzMyhokcGtRDaXIBTTAQDdvSKMLlJLMc3awzCRFwxN0er/lA5dCi7qafNfHoHPytIWzrrkvoiPREGXGidqRlY+QiFenUMUDgSc/6cVsUGRppHrBje70o50Frzev2U8caMkBrNaeA8kXwSxpoNeqjO4ztvBWMfK0="; + } + + @Override + public String texture(HypixelPlayer player) { + return "ewogICJ0aW1lc3RhbXAiIDogMTYwODMxMzQ0NjA5MiwKICAicHJvZmlsZUlkIiA6ICI0MWQzYWJjMmQ3NDk0MDBjOTA5MGQ1NDM0ZDAzODMxYiIsCiAgInByb2ZpbGVOYW1lIiA6ICJNZWdha2xvb24iLAogICJzaWduYXR1cmVSZXF1aXJlZCIgOiB0cnVlLAogICJ0ZXh0dXJlcyIgOiB7CiAgICAiU0tJTiIgOiB7CiAgICAgICJ1cmwiIDogImh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvMjEzY2YwY2E3OWEzNjExYjhlMDVmZTllMjY0ZmIyYmY4ZDI3ZTQ2NGRjMTJkYzZlOTVkZDBhZTBjMzM1YTU2MSIKICAgIH0KICB9Cn0="; + } + + @Override + public Pos position(HypixelPlayer player) { + return new Pos(-15.500, 201.000, -98.500, -135, 0); + } + + @Override + public boolean looking() { + return true; + } + }); + } + + @Override + public void onClick(PlayerClickNPCEvent event) { + SkyBlockPlayer player = (SkyBlockPlayer) event.player(); + player.sendMessage(Component.text("§cThis Feature is not there yet. §aOpen a Pull request HERE to get it added quickly!") + .clickEvent(ClickEvent.openUrl("https://github.com/Swofty-Developments/HypixelSkyBlock"))); + } +} \ No newline at end of file diff --git a/type.dwarvenmines/src/main/java/net/swofty/type/dwarvenmines/npcs/NPCLiftOperator.java b/type.dwarvenmines/src/main/java/net/swofty/type/dwarvenmines/npcs/NPCLiftOperator.java new file mode 100644 index 000000000..fcfa3792f --- /dev/null +++ b/type.dwarvenmines/src/main/java/net/swofty/type/dwarvenmines/npcs/NPCLiftOperator.java @@ -0,0 +1,48 @@ +package net.swofty.type.dwarvenmines.npcs; + +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.event.ClickEvent; +import net.minestom.server.coordinate.Pos; +import net.swofty.type.generic.entity.npc.HypixelNPC; +import net.swofty.type.generic.entity.npc.NPCParameters; +import net.swofty.type.generic.user.HypixelPlayer; +import net.swofty.type.skyblockgeneric.user.SkyBlockPlayer; + +public class NPCLiftOperator extends HypixelNPC { + + public NPCLiftOperator() { + super(new NPCParameters() { + @Override + public String[] holograms(HypixelPlayer player) { + return new String[]{"Lift Operator", "§e§lCLICK"}; + } + + @Override + public String signature(HypixelPlayer player) { + return "W8e6ip++dGgqglbYiPyLxCEHUXpOMioWrf6bCJwMNPHmEFTJux+M0H4GZaDjs1+d7FcSHjg6rEbMWS1sZAL4TUh7Q9vCtEYlx0PfnkY42l1Qqo/tIpJvgY5J6RHZ1j1cvtfrgXfKU8AKpjZVDNNyAqc5iJWcgqAm1gj3SPH6SoVvfzZgx9avAKo3z440CRsIhLYwgwEtq8/sbkqi0y6cuwlCZ+reo7yy2Ohe5AwG0Sx7Tkkv0DIVC4wO2RYoP+4xw2MYi1SRWk9yv3ZKqjwhTP8ugB/xqK/R480vVrr7MLhCpLrbUzpuLiaAbfruF9/TmvBV2hXFSCrlqypo4EmLk1E3WSuJX5ls11+juht0M12MIUlmmYcsFjgnAux5tgJ+fQq3KWhrbYedEY4CG7swavIG71/ZZI/ugRCXz/KONOq7bXKn939CyIpPdfBBAo2RZhjk2QXG/bWODeTfJ6z5VlIivNzo65FCAdwJ54VQzmUcP86ID3/jrWQ5fE5fhPkGhpYtOlVn5S4xKdFtu6RfYYUX6cEPD6MRPcOzXB4ZvCzgD7QhKxIQDBc1S9XY35c6+ZDYHPokQa87iD053Yfft4PH/pZA21ovOcf7+Xa+AFu72wnsjbynkaZUqSrFz3mCdOl+TFynZe89SwgDX0t1mIPtGtJmtK5jbZpwFA4bqDE="; + } + + @Override + public String texture(HypixelPlayer player) { + return "eyJ0aW1lc3RhbXAiOjE1NTQ1NzE2OTkxOTAsInByb2ZpbGVJZCI6IjNmYzdmZGY5Mzk2MzRjNDE5MTE5OWJhM2Y3Y2MzZmVkIiwicHJvZmlsZU5hbWUiOiJZZWxlaGEiLCJzaWduYXR1cmVSZXF1aXJlZCI6dHJ1ZSwidGV4dHVyZXMiOnsiU0tJTiI6eyJ1cmwiOiJodHRwOi8vdGV4dHVyZXMubWluZWNyYWZ0Lm5ldC90ZXh0dXJlLzg2NTJhMDZmN2I5OWU0ODIyYjQ5NWJhOWI2MDg5ZDRkNTE1MWU4M2JlZDk1NmE3Y2NjYjg0N2VhNDZhMjU3MjUifX19"; + } + + @Override + public Pos position(HypixelPlayer player) { + return new Pos(-79.500, 200, -123.500, -59, 0); + } + + @Override + public boolean looking() { + return true; + } + }); + } + + @Override + public void onClick(PlayerClickNPCEvent event) { + SkyBlockPlayer player = (SkyBlockPlayer) event.player(); + player.sendMessage(Component.text("§cThis Feature is not there yet. §aOpen a Pull request HERE to get it added quickly!") + .clickEvent(ClickEvent.openUrl("https://github.com/Swofty-Developments/HypixelSkyBlock"))); + } +} \ No newline at end of file diff --git a/type.dwarvenmines/src/main/java/net/swofty/type/dwarvenmines/npcs/NPCRoyalGuardOne.java b/type.dwarvenmines/src/main/java/net/swofty/type/dwarvenmines/npcs/NPCRoyalGuardOne.java new file mode 100644 index 000000000..47948b0a4 --- /dev/null +++ b/type.dwarvenmines/src/main/java/net/swofty/type/dwarvenmines/npcs/NPCRoyalGuardOne.java @@ -0,0 +1,48 @@ +package net.swofty.type.dwarvenmines.npcs; + +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.event.ClickEvent; +import net.minestom.server.coordinate.Pos; +import net.swofty.type.generic.entity.npc.HypixelNPC; +import net.swofty.type.generic.entity.npc.NPCParameters; +import net.swofty.type.generic.user.HypixelPlayer; +import net.swofty.type.skyblockgeneric.user.SkyBlockPlayer; + +public class NPCRoyalGuardOne extends HypixelNPC { + + public NPCRoyalGuardOne() { + super(new NPCParameters() { + @Override + public String[] holograms(HypixelPlayer player) { + return new String[]{"§6Royal Guard", "§e§lCLICK"}; + } + + @Override + public String signature(HypixelPlayer player) { + return "seuXIllWZjXjqV2JnR3IcWgjYKWb1wm0gK69ENtKNZZCcP0QKbqjHme1u+K/aIs+JIH0nSkdkj+5PP6/kbsRm64V789hHeDSYJ2aE8lcqamptdez63Ap//Nvv8ykDRPHTddvOlJ/zpeEOj2x2E0u4LtsyLaRlY24Ku8kkiy7L+EKZQ4Pl0mB2o2AtzZNECF1BYhhSguEzFVhu2emweFCD5yYcTcpyecnvKfedXy4uxaeTAls46rqCfGHJSLll6PatUwJ7ZcBQyN95RCR8I0+kdkkkFZ3v2nYllTLd3oJPpRD6GBkOA32uVFYEYXp4HAjN2odDZfPmw663jdVJtLvYIEc9FckQfY6uXjSt3V7/yzOrxP8iV22IMhXY1gaTjQFnoBFa/yRcVrbcJ1GIT3tJMYrB3hS8BnmR7jPQ05crUQjZHCqVzZEa74bM44eus3Db8sL6OALpYznP+u9Ss855AkjpIlwQw533qxMRZEffvnQ1wT556TeczvZDEb9zTszYqzCKt4uLG97k9aTYKpeJHIBbzCo9+xvGD0zzzTXZ7xKe4ZfpzKnFFjUrJRdqjddGRi5iV3WdHFLQ4VVcZyCqIhVNjt5bkCbObuqIdmhmCZNDvf8xmis1p890mLoTeln+Mu6/2NwgVXwuTtKgHnCGff4X7vdzepdomo0pZrgObk="; + } + + @Override + public String texture(HypixelPlayer player) { + return "ewogICJ0aW1lc3RhbXAiIDogMTYwNzQ2NDk5NDA2MSwKICAicHJvZmlsZUlkIiA6ICJhMmY4MzQ1OTVjODk0YTI3YWRkMzA0OTcxNmNhOTEwYyIsCiAgInByb2ZpbGVOYW1lIiA6ICJiUHVuY2giLAogICJzaWduYXR1cmVSZXF1aXJlZCIgOiB0cnVlLAogICJ0ZXh0dXJlcyIgOiB7CiAgICAiU0tJTiIgOiB7CiAgICAgICJ1cmwiIDogImh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvOGU3YTQ2YzI1ODI2OGY0MmM4NTlkZDVjODAwOGE5N2M3MmI4ZDM3MGU5ODFjZTJkY2MwYzNmZDQ1MTYzOGVkNyIKICAgIH0KICB9Cn0="; + } + + @Override + public Pos position(HypixelPlayer player) { + return new Pos(-45.500, 200.000, -124.500, 90, 0); + } + + @Override + public boolean looking() { + return true; + } + }); + } + + @Override + public void onClick(PlayerClickNPCEvent event) { + SkyBlockPlayer player = (SkyBlockPlayer) event.player(); + player.sendMessage(Component.text("§cThis Feature is not there yet. §aOpen a Pull request HERE to get it added quickly!") + .clickEvent(ClickEvent.openUrl("https://github.com/Swofty-Developments/HypixelSkyBlock"))); + } +} \ No newline at end of file diff --git a/type.dwarvenmines/src/main/java/net/swofty/type/dwarvenmines/npcs/NPCRoyalGuardTwo.java b/type.dwarvenmines/src/main/java/net/swofty/type/dwarvenmines/npcs/NPCRoyalGuardTwo.java new file mode 100644 index 000000000..1c8820895 --- /dev/null +++ b/type.dwarvenmines/src/main/java/net/swofty/type/dwarvenmines/npcs/NPCRoyalGuardTwo.java @@ -0,0 +1,48 @@ +package net.swofty.type.dwarvenmines.npcs; + +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.event.ClickEvent; +import net.minestom.server.coordinate.Pos; +import net.swofty.type.generic.entity.npc.HypixelNPC; +import net.swofty.type.generic.entity.npc.NPCParameters; +import net.swofty.type.generic.user.HypixelPlayer; +import net.swofty.type.skyblockgeneric.user.SkyBlockPlayer; + +public class NPCRoyalGuardTwo extends HypixelNPC { + + public NPCRoyalGuardTwo() { + super(new NPCParameters() { + @Override + public String[] holograms(HypixelPlayer player) { + return new String[]{"§6Royal Guard", "§e§lCLICK"}; + } + + @Override + public String signature(HypixelPlayer player) { + return "Ic93JjFO3ZL10gtcVoaGbsaHXjsUvq6dWirUPihZYzieAHVSyCSzrjMYDmMVvuIJGnVE8MCgcGQuYxh+J9TbmqdFugU9vVZvJ6urPTKJwyLrHtdz3tzUW4FF7+HkDn2nOBEm3lu3Pcszis49TFstpp4xfBUsvIpdivyzfeHH0KoWPTK/NE5IDdy7JqP3NS5IJg4L4Rt/zWuA17F/Pfm5+s5Ol9l7SAvSWhS/ed/lB7AzdHFGBx9SVSR1oGr1Sx9YxRKyFT4KRjc5czTUhiNUmiaZ/dwwn4cVYqjXbRG3sPQuMffuIO/QKo4ohWLU1My1SThC0qC4b52xMdzYQg8aV4rmJwe+zNkbpvylmpHNgIysTK9GO4clG3sBc+McdNM9NFKyLtxHdpGwu/ZHOPnPO5uu2vbCqnB+sxQ6I12esos+V1HPiFV4YZnCK2YxYB4MCkMjoWTJRkZhShAIcE8IgcQ/pHi5kwlqyy4kH/4Vfwd0YFK0oPFo7zfVOjj8wZaVnPmKdcAkMbO9kpOOUMPVt5/jfLyfiroRgJJQQJITVStXpmQFIieze6+aigsKhoiL5Mej4ggVrwniP8gc3iiK3p4HMeObKK0CfoiVPPP+sN9uEs443EGZmVrpuphD51xA0Qow4UtD6YhIRWPYiLzT1SV55dJ4gYy7Qr0rbDUbm+k="; + } + + @Override + public String texture(HypixelPlayer player) { + return "ewogICJ0aW1lc3RhbXAiIDogMTYxMDU3NzM3NDY3NCwKICAicHJvZmlsZUlkIiA6ICJiMGQ0YjI4YmMxZDc0ODg5YWYwZTg2NjFjZWU5NmFhYiIsCiAgInByb2ZpbGVOYW1lIiA6ICJNaW5lU2tpbl9vcmciLAogICJzaWduYXR1cmVSZXF1aXJlZCIgOiB0cnVlLAogICJ0ZXh0dXJlcyIgOiB7CiAgICAiU0tJTiIgOiB7CiAgICAgICJ1cmwiIDogImh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvNzk0MWM5YzZhMzhiMjU0OWMyOTViMzQxOWI5MWMwM2YzMTAzNThmOTllMWViOWVkOGI5YjU5NGJlZWRlZjEwOCIKICAgIH0KICB9Cn0="; + } + + @Override + public Pos position(HypixelPlayer player) { + return new Pos(-45.500, 200.000, -118.500, 90, 0); + } + + @Override + public boolean looking() { + return true; + } + }); + } + + @Override + public void onClick(PlayerClickNPCEvent event) { + SkyBlockPlayer player = (SkyBlockPlayer) event.player(); + player.sendMessage(Component.text("§cThis Feature is not there yet. §aOpen a Pull request HERE to get it added quickly!") + .clickEvent(ClickEvent.openUrl("https://github.com/Swofty-Developments/HypixelSkyBlock"))); + } +} \ No newline at end of file diff --git a/type.dwarvenmines/src/main/java/net/swofty/type/dwarvenmines/tab/DwarvenMinesServerModule.java b/type.dwarvenmines/src/main/java/net/swofty/type/dwarvenmines/tab/DwarvenMinesServerModule.java new file mode 100644 index 000000000..9317fd506 --- /dev/null +++ b/type.dwarvenmines/src/main/java/net/swofty/type/dwarvenmines/tab/DwarvenMinesServerModule.java @@ -0,0 +1,25 @@ +package net.swofty.type.dwarvenmines.tab; + +import net.swofty.type.generic.HypixelConst; +import net.swofty.type.generic.tab.TablistModule; +import net.swofty.type.generic.tab.TablistSkinRegistry; +import net.swofty.type.generic.user.HypixelPlayer; + +import java.util.ArrayList; +import java.util.List; + +public class DwarvenMinesServerModule extends TablistModule { + @Override + public List getEntries(HypixelPlayer player) { + ArrayList entries = new ArrayList<>(List.of( + new TablistEntry(getCentered("§3§lServer Info"), TablistSkinRegistry.CYAN) + )); + + entries.add(new TablistEntry("§b§lArea: §7Dwarven Mines", TablistSkinRegistry.GRAY)); + entries.add(new TablistEntry(" Server: §8" + HypixelConst.getServerName(), TablistSkinRegistry.GRAY)); + + fillRestWithGray(entries); + + return entries; + } +} diff --git a/type.generic/build.gradle.kts b/type.generic/build.gradle.kts index 04ff810ad..a7adbc96b 100644 --- a/type.generic/build.gradle.kts +++ b/type.generic/build.gradle.kts @@ -5,6 +5,14 @@ plugins { group = "net.swofty" version = "1.0" +java { + sourceCompatibility = JavaVersion.VERSION_25 + targetCompatibility = JavaVersion.VERSION_25 + toolchain { + languageVersion.set(JavaLanguageVersion.of(25)) + } +} + repositories { maven("https://jitpack.io") maven("https://s01.oss.sonatype.org/content/repositories/snapshots/") diff --git a/type.generic/src/main/java/net/swofty/type/generic/data/datapoints/DatapointToggles.java b/type.generic/src/main/java/net/swofty/type/generic/data/datapoints/DatapointToggles.java index ce4229685..86d7e7324 100644 --- a/type.generic/src/main/java/net/swofty/type/generic/data/datapoints/DatapointToggles.java +++ b/type.generic/src/main/java/net/swofty/type/generic/data/datapoints/DatapointToggles.java @@ -72,11 +72,18 @@ public enum ToggleType { DISABLE_DROP_MESSAGES(false), HAS_SPOKEN_TO_BEA(false), HAS_SPOKEN_TO_TIA(false), + HAS_SPOKEN_TO_LIFT_OPERATOR(false), + HAS_SPOKEN_TO_LAZY_MINER(false), + HAS_SPOKEN_TO_BAKER(false), + HAS_SPOKEN_TO_RUSTY(false), + HAS_SPOKEN_TO_RUSTY_ABOUT_PICKAXE(false), HAS_SPOKEN_TO_CURATOR(false), HAS_SPOKEN_TO_MADAME_ELEANOR(false), HAS_DONE_COAL_TRADE_WITH_BLACKSMITH(false), HAS_SPOKEN_TO_SEYMOUR(false), HAS_SPOKEN_TO_FISH_MERCHANT(false), + HAS_SPOKEN_TO_GOLD_FORGER(false), + HAS_SPOKEN_TO_IRON_FORGER(false), HAS_SPOKEN_TO_FARM_MERCHANT(false), HAS_SPOKEN_TO_ADVENTURER(false), HAS_SPOKEN_TO_LUMBER_MERCHANT(false), @@ -88,6 +95,7 @@ public enum ToggleType { HAS_SPOKEN_TO_ZOG(false), HAS_SPOKEN_TO_JAX(false), HAS_REALLY_SPOKEN_TO_JAX(false), + HAS_FOUND_LAZY_MINER_PICKAXE(false), PAPER_ICONS(false), ; diff --git a/type.generic/src/main/java/net/swofty/type/generic/entity/npc/HypixelNPC.java b/type.generic/src/main/java/net/swofty/type/generic/entity/npc/HypixelNPC.java index 1b8e35173..16b9cd22d 100644 --- a/type.generic/src/main/java/net/swofty/type/generic/entity/npc/HypixelNPC.java +++ b/type.generic/src/main/java/net/swofty/type/generic/entity/npc/HypixelNPC.java @@ -13,160 +13,178 @@ import java.util.concurrent.ConcurrentHashMap; public abstract class HypixelNPC { - private static final int SPAWN_DISTANCE = 48; - private static final int LOOK_DISTANCE = 16; - - @Getter - private static List npcs = new ArrayList<>(); - @Getter - private static Map perPlayerNPCs = new HashMap<>(); - - @Getter - private final NPCParameters parameters; - @Getter - private final String name; - - public abstract void onClick(PlayerClickNPCEvent e); - - public HypixelNPC(NPCParameters defaultParams) { - this.parameters = defaultParams; - String className = getClass().getSimpleName().replace("NPC", ""); - this.name = className.replaceAll("(?<=.)(?=\\p{Lu})", " "); - } - - public void register() { - npcs.add(this); - } - - public void sendNPCMessage(HypixelPlayer player, String message) { - player.sendMessage("§e[NPC] " + getName() + "§f: " + message); - } - - public static HypixelNPC getFromImpl(HypixelPlayer player, NPCEntityImpl impl) { - Map npcs = perPlayerNPCs.get(player.getUuid()).getEntityImpls(); - if (npcs == null) return null; - - for (Map.Entry entry : npcs.entrySet()) { - if (entry.getValue().equals(impl)) { - return entry.getKey(); - } - } - - return null; - } - - public static void updateForPlayer(HypixelPlayer player) { - perPlayerNPCs.putIfAbsent(player.getUuid(), new PlayerNPCCache()); - - Thread.startVirtualThread(() -> { - HypixelNPC.getNpcs().forEach((npc) -> { - boolean playerHasNPC = perPlayerNPCs.containsKey(player.getUuid()) && perPlayerNPCs.get(player.getUuid()).getEntityImpls().containsKey(npc); - - if (!playerHasNPC) { - NPCEntityImpl entity = new NPCEntityImpl( - npc.getParameters().holograms(player)[npc.getParameters().holograms(player).length - 1], - npc.getParameters().texture(player), - npc.getParameters().signature(player), - npc.getParameters().holograms(player)); - Pos position = npc.getParameters().position(player); - - PlayerHolograms.ExternalPlayerHologram holo = PlayerHolograms.ExternalPlayerHologram.builder() - .pos(position.add(0, 1.1, 0)) - .text(Arrays.copyOfRange(npc.getParameters().holograms(player), 0, npc.getParameters().holograms(player).length - 1)) - .player(player) - .build(); - - entity.setAutoViewable(false); - - PlayerHolograms.addExternalPlayerHologram(holo); - entity.setInstance(HypixelConst.getInstanceContainer(), position); - entity.addViewer(player); - - PlayerNPCCache cache = perPlayerNPCs.get(player.getUuid()); - cache.add(npc, holo, entity); - perPlayerNPCs.put(player.getUuid(), cache); - return; - } - - PlayerNPCCache cache = perPlayerNPCs.get(player.getUuid()); - NPCEntityImpl entity = cache.get(npc).getValue(); - PlayerHolograms.ExternalPlayerHologram holo = cache.get(npc).getKey(); - - Pos npcPosition = npc.getParameters().position(player); - String npcTexture = npc.getParameters().texture(player); - String npcSignature = npc.getParameters().signature(player); - String[] npcHolograms = npc.getParameters().holograms(player); - - // If any of the parameters have changed, update the NPC - if (!Arrays.equals(entity.getHolograms(), npcHolograms) || - !entity.getSkinTexture().equals(npcTexture) || - !entity.getSkinSignature().equals(npcSignature) || - !entity.getPosition().equals(npcPosition)) { - entity.remove(); - PlayerHolograms.removeExternalPlayerHologram(holo); - cache.remove(npc); - return; - } - - Pos playerPosition = player.getPosition(); - List inRange = entity.getInRangeOf(); - double entityDistance = playerPosition.distance(npcPosition); - boolean isLookingNPC = npc.getParameters().looking(); - - if (entityDistance <= SPAWN_DISTANCE) { - if (!inRange.contains(player)) { - inRange.add(player); - entity.updateNewViewer(player); - } - - if (isLookingNPC && entityDistance <= LOOK_DISTANCE) { - double diffX = playerPosition.x() - npcPosition.x(); - double diffZ = playerPosition.z() - npcPosition.z(); - double theta = Math.atan2(diffZ, diffX); - double yaw = MathUtility.normalizeAngle(Math.toDegrees(theta) + 90, 360.0); - - player.sendPackets( - new EntityRotationPacket(entity.getEntityId(), (float) yaw, npcPosition.pitch(), true), - new EntityHeadLookPacket(entity.getEntityId(), (float) yaw) - ); - } - } else { - if (inRange.contains(player)) { - inRange.remove(player); - entity.updateOldViewer(player); - - player.sendPackets( - new EntityRotationPacket(entity.getEntityId(), npcPosition.yaw(), npcPosition.pitch(), true), - new EntityHeadLookPacket(entity.getEntityId(), npcPosition.yaw()) - ); - } - } - }); - }); - } - - public record PlayerClickNPCEvent(HypixelPlayer player, int entityId, HypixelNPC npc) { - } - - public static class PlayerNPCCache { - private final Map> npcs = new ConcurrentHashMap<>(); - - public void add(HypixelNPC npc, PlayerHolograms.ExternalPlayerHologram hologram, NPCEntityImpl entity) { - npcs.put(npc, Map.entry(hologram, entity)); - } - - public void remove(HypixelNPC npc) { - npcs.remove(npc); - } - - public Map getEntityImpls() { - Map entityImpls = new HashMap<>(); - npcs.forEach((npc, entry) -> entityImpls.put(npc, entry.getValue())); - return entityImpls; - } - - public Map.Entry get(HypixelNPC npc) { - return npcs.get(npc); - } - } + private static final int SPAWN_DISTANCE = 48; + private static final int LOOK_DISTANCE = 5; + + @Getter + private static List npcs = new ArrayList<>(); + @Getter + private static Map perPlayerNPCs = new HashMap<>(); + + @Getter + private final NPCParameters parameters; + @Getter + private final String name; + + public HypixelNPC(NPCParameters defaultParams) { + this.parameters = defaultParams; + String className = getClass().getSimpleName().replace("NPC", ""); + this.name = className.replaceAll("(?<=.)(?=\\p{Lu})", " "); + } + + public static HypixelNPC getFromImpl(HypixelPlayer player, NPCEntityImpl impl) { + Map npcs = perPlayerNPCs.get(player.getUuid()).getEntityImpls(); + if (npcs == null) return null; + + for (Map.Entry entry : npcs.entrySet()) { + if (entry.getValue().equals(impl)) { + return entry.getKey(); + } + } + + return null; + } + + public static void updateForPlayer(HypixelPlayer player) { + perPlayerNPCs.putIfAbsent(player.getUuid(), new PlayerNPCCache()); + + Thread.startVirtualThread(() -> { + HypixelNPC.getNpcs().forEach((npc) -> { + boolean playerHasNPC = perPlayerNPCs.containsKey(player.getUuid()) && perPlayerNPCs.get(player.getUuid()).getEntityImpls().containsKey(npc); + + if (!playerHasNPC) { + NPCEntityImpl entity = new NPCEntityImpl( + npc.getParameters().holograms(player)[npc.getParameters().holograms(player).length - 1], + npc.getParameters().texture(player), + npc.getParameters().signature(player), + npc.getParameters().holograms(player)); + Pos position = npc.getParameters().position(player); + + PlayerHolograms.ExternalPlayerHologram holo = PlayerHolograms.ExternalPlayerHologram.builder() + .pos(position.add(0, 1.1, 0)) + .text(Arrays.copyOfRange(npc.getParameters().holograms(player), 0, npc.getParameters().holograms(player).length - 1)) + .player(player) + .build(); + + entity.setAutoViewable(false); + + PlayerHolograms.addExternalPlayerHologram(holo); + entity.setInstance(HypixelConst.getInstanceContainer(), position); + entity.addViewer(player); + + PlayerNPCCache cache = perPlayerNPCs.get(player.getUuid()); + cache.add(npc, holo, entity); + perPlayerNPCs.put(player.getUuid(), cache); + return; + } + + PlayerNPCCache cache = perPlayerNPCs.get(player.getUuid()); + NPCEntityImpl entity = cache.get(npc).getValue(); + PlayerHolograms.ExternalPlayerHologram holo = cache.get(npc).getKey(); + + Pos npcPosition = npc.getParameters().position(player); + String npcTexture = npc.getParameters().texture(player); + String npcSignature = npc.getParameters().signature(player); + String[] npcHolograms = npc.getParameters().holograms(player); + + // If any of the parameters have changed, update the NPC + if (!Arrays.equals(entity.getHolograms(), npcHolograms) || + !entity.getSkinTexture().equals(npcTexture) || + !entity.getSkinSignature().equals(npcSignature) || + !entity.getPosition().equals(npcPosition)) { + entity.remove(); + PlayerHolograms.removeExternalPlayerHologram(holo); + cache.remove(npc); + return; + } + + Pos playerPosition = player.getPosition(); + List inRange = entity.getInRangeOf(); + double entityDistance = playerPosition.distance(npcPosition); + boolean isLookingNPC = npc.getParameters().looking(); + + if (entityDistance <= SPAWN_DISTANCE) { + if (!inRange.contains(player)) { + inRange.add(player); + entity.updateNewViewer(player); + } + + if (isLookingNPC && entityDistance <= LOOK_DISTANCE) { + double diffX = playerPosition.x() - npcPosition.x(); + double diffZ = playerPosition.z() - npcPosition.z(); + double theta = Math.atan2(diffZ, diffX); + double yaw = MathUtility.normalizeAngle(Math.toDegrees(theta) + 90, 360.0); + + player.sendPackets( + new EntityRotationPacket(entity.getEntityId(), (float) yaw, npcPosition.pitch(), true), + new EntityHeadLookPacket(entity.getEntityId(), (float) yaw) + ); + } else if (isLookingNPC) { + player.sendPackets( + new EntityRotationPacket(entity.getEntityId(), npcPosition.yaw(), npcPosition.pitch(), true), + new EntityHeadLookPacket(entity.getEntityId(), npcPosition.yaw()) + ); + } + } else { + if (inRange.contains(player)) { + inRange.remove(player); + entity.updateOldViewer(player); + + player.sendPackets( + new EntityRotationPacket(entity.getEntityId(), npcPosition.yaw(), npcPosition.pitch(), true), + new EntityHeadLookPacket(entity.getEntityId(), npcPosition.yaw()) + ); + } + } + }); + }); + } + + public abstract void onClick(PlayerClickNPCEvent event); + + /** + * Called when a NPC is called (with an Abiphone) by a player. + * + * @param player The player who called the NPC. + */ + public void onCalled(HypixelPlayer player) { + + } + + public void register() { + npcs.add(this); + } + + public void sendNPCMessage(HypixelPlayer player, String message) { + player.sendMessage("§e[NPC] " + getName() + "§f: " + message); + } + + public void sendNPCAbiphoneMessage(HypixelPlayer player, String message) { + player.sendMessage("§e[NPC] " + getName() + "§f: §b✆ §f" + message); + } + + public record PlayerClickNPCEvent(HypixelPlayer player, int entityId, HypixelNPC npc) { + } + + public static class PlayerNPCCache { + private final Map> npcs = new ConcurrentHashMap<>(); + + public void add(HypixelNPC npc, PlayerHolograms.ExternalPlayerHologram hologram, NPCEntityImpl entity) { + npcs.put(npc, Map.entry(hologram, entity)); + } + + public void remove(HypixelNPC npc) { + npcs.remove(npc); + } + + public Map getEntityImpls() { + Map entityImpls = new HashMap<>(); + npcs.forEach((npc, entry) -> entityImpls.put(npc, entry.getValue())); + return entityImpls; + } + + public Map.Entry get(HypixelNPC npc) { + return npcs.get(npc); + } + } } diff --git a/type.generic/src/main/java/net/swofty/type/generic/entity/npc/NPCDialogue.java b/type.generic/src/main/java/net/swofty/type/generic/entity/npc/NPCDialogue.java index c64478d39..6347e0c7b 100644 --- a/type.generic/src/main/java/net/swofty/type/generic/entity/npc/NPCDialogue.java +++ b/type.generic/src/main/java/net/swofty/type/generic/entity/npc/NPCDialogue.java @@ -11,65 +11,70 @@ import java.util.concurrent.CompletableFuture; public abstract class NPCDialogue extends HypixelNPC { - HashMap>> dialogueSets = new HashMap<>(); - - protected NPCDialogue(NPCParameters parameters) { - super(parameters); - } - - public abstract DialogueSet[] getDialogueSets(HypixelPlayer player); - - public Boolean isInDialogue(HypixelPlayer player) { - Map.Entry> dialogueSet = dialogueSets.get(player); - return dialogueSet != null; - } - - public CompletableFuture setDialogue(HypixelPlayer player, String key) { - CompletableFuture future = new CompletableFuture<>(); - - for (DialogueSet dialogueSet : getDialogueSets(player)) { - if (dialogueSet.key().equals(key)) { - dialogueSets.put(player, Map.entry(dialogueSet, future)); - handleLineSendingLoop(player, dialogueSet); - return future; - } - } - - future.completeExceptionally(new NullPointerException("Dialogue set with key '" + key + "' not found.")); - return future; - } - - private void handleLineSendingLoop(HypixelPlayer player, DialogueSet dialogueSet) { - sendNPCMessage(player, dialogueSet.lines()[0]); - - String[] newLines = new String[dialogueSet.lines().length - 1]; - System.arraycopy(dialogueSet.lines(), 1, newLines, 0, dialogueSet.lines().length - 1); - - if (newLines.length == 0) { - dialogueSets.get(player).getValue().complete(dialogueSet.key()); - dialogueSets.remove(player); - return; - } - - Scheduler scheduler = MinecraftServer.getSchedulerManager(); - scheduler.buildTask(() -> { - handleLineSendingLoop(player, DialogueSet.builder().key(dialogueSet.key()).lines(newLines).build()); - }).delay(TaskSchedule.seconds(2)).schedule(); - } - - public static void remove(HypixelPlayer player) { - for (HypixelNPC npc : getNpcs()) { - if (npc instanceof NPCDialogue dialogue) { - if (dialogue.isInDialogue(player)) { - dialogue.dialogueSets.get(player).getValue().complete(null); - dialogue.dialogueSets.remove(player); - } - } - } - } - - @Builder - public record DialogueSet(String key, String[] lines) { - } + HashMap>> dialogueSets = new HashMap<>(); + + protected NPCDialogue(NPCParameters parameters) { + super(parameters); + } + + public static void remove(HypixelPlayer player) { + for (HypixelNPC npc : getNpcs()) { + if (npc instanceof NPCDialogue dialogue) { + if (dialogue.isInDialogue(player)) { + dialogue.dialogueSets.get(player).getValue().complete(null); + dialogue.dialogueSets.remove(player); + } + } + } + } + + public abstract DialogueSet[] getDialogueSets(HypixelPlayer player); + + public Boolean isInDialogue(HypixelPlayer player) { + Map.Entry> dialogueSet = dialogueSets.get(player); + return dialogueSet != null; + } + + public CompletableFuture setDialogue(HypixelPlayer player, String key) { + CompletableFuture future = new CompletableFuture<>(); + + for (DialogueSet dialogueSet : getDialogueSets(player)) { + if (dialogueSet.key().equals(key)) { + dialogueSets.put(player, Map.entry(dialogueSet, future)); + handleLineSendingLoop(player, dialogueSet); + return future; + } + } + + future.completeExceptionally(new NullPointerException("Dialogue set with key '" + key + "' not found.")); + return future; + } + + private void handleLineSendingLoop(HypixelPlayer player, DialogueSet dialogueSet) { + if (dialogueSet.abiPhone) { + sendNPCAbiphoneMessage(player, dialogueSet.lines()[0]); + } else { + sendNPCMessage(player, dialogueSet.lines()[0]); + } + + String[] newLines = new String[dialogueSet.lines().length - 1]; + System.arraycopy(dialogueSet.lines(), 1, newLines, 0, dialogueSet.lines().length - 1); + + if (newLines.length == 0) { + dialogueSets.get(player).getValue().complete(dialogueSet.key()); + dialogueSets.remove(player); + return; + } + + Scheduler scheduler = MinecraftServer.getSchedulerManager(); + scheduler.buildTask(() -> { + handleLineSendingLoop(player, DialogueSet.builder().key(dialogueSet.key()).lines(newLines).abiPhone(dialogueSet.abiPhone).build()); + }).delay(TaskSchedule.seconds(2)).schedule(); + } + + @Builder + public record DialogueSet(String key, String[] lines, boolean abiPhone) { + } + } diff --git a/type.generic/src/main/java/net/swofty/type/generic/entity/npc/NPCOption.java b/type.generic/src/main/java/net/swofty/type/generic/entity/npc/NPCOption.java new file mode 100644 index 000000000..b6525654f --- /dev/null +++ b/type.generic/src/main/java/net/swofty/type/generic/entity/npc/NPCOption.java @@ -0,0 +1,48 @@ +package net.swofty.type.generic.entity.npc; + +import lombok.Builder; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.event.ClickEvent; +import net.kyori.adventure.text.format.NamedTextColor; +import net.kyori.adventure.text.format.Style; +import net.kyori.adventure.text.format.TextDecoration; +import net.swofty.type.generic.user.HypixelPlayer; +import net.swofty.type.generic.utility.MathUtility; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.function.Consumer; + +public class NPCOption { + public static final Map options = new HashMap<>(); + + public static void sendOption(HypixelPlayer player, String id, List