Skip to content
This repository has been archived by the owner on Nov 2, 2021. It is now read-only.

Commit

Permalink
Drop support for Minecraft versions older than 1.13
Browse files Browse the repository at this point in the history
PyvesB committed Oct 16, 2021
1 parent a47ad85 commit eebd25c
Showing 108 changed files with 385 additions and 1,672 deletions.
4 changes: 0 additions & 4 deletions advanced-achievements-plugin/pom.xml
Original file line number Diff line number Diff line change
@@ -138,10 +138,6 @@
<groupId>me.clip</groupId>
<artifactId>placeholderapi</artifactId>
</dependency>
<dependency>
<groupId>com.github.shadowjonathan</groupId>
<artifactId>ParticleEffect</artifactId>
</dependency>
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
Original file line number Diff line number Diff line change
@@ -18,7 +18,6 @@
import org.bukkit.configuration.file.YamlConfiguration;
import org.bukkit.inventory.ItemStack;

import com.darkblade12.particleeffect.ReflectionUtils.PackageType;
import com.hm.achievement.AdvancedAchievements;
import com.hm.achievement.advancement.AchievementAdvancement.AchievementAdvancementBuilder;
import com.hm.achievement.category.Category;
@@ -31,7 +30,7 @@
import com.hm.achievement.utils.StringHelper;

/**
* Class in charge of registering achievements as advancements for servers running on Minecraft 1.12+.
* Class in charge of registering achievements as advancements.
*
* @author Pyves
*/
@@ -43,25 +42,12 @@ public class AdvancementManager implements Reloadable {
private static final String MINECRAFT_BOOK_KEY = "minecraft:book";
// Pattern to produce keys for advancements.
private static final Pattern REGEX_PATTERN_KEYS = Pattern.compile("[^A-Za-z0-9_]");
// Strings related to Reflection.
private static final String PACKAGE_INVENTORY = "inventory";
private static final String CLASS_CRAFT_ITEM_STACK = "CraftItemStack";
private static final String CLASS_ITEM = "Item";
private static final String CLASS_ITEM_STACK = "ItemStack";
private static final String CLASS_REGISTRY_MATERIALS = "RegistryMaterials";
private static final String CLASS_MINECRAFT_KEY = "MinecraftKey";
private static final String FIELD_REGISTRY = "REGISTRY";
private static final String METHOD_AS_NMS_COPY = "asNMSCopy";
private static final String METHOD_GET_ITEM = "getItem";
private static final String METHOD_GET_KEY = "getKey";
private static final String METHOD_B = "b";

private final YamlConfiguration mainConfig;
private final GUIItems guiItems;
private final AdvancedAchievements advancedAchievements;
private final Logger logger;
private final Set<Category> disabledCategories;
private final int serverVersion;
private final AchievementMap achievementMap;

private boolean configRegisterAdvancementDescriptions;
@@ -72,13 +58,12 @@ public class AdvancementManager implements Reloadable {

@Inject
public AdvancementManager(@Named("main") YamlConfiguration mainConfig, GUIItems guiItems, AchievementMap achievementMap,
AdvancedAchievements advancedAchievements, Logger logger, Set<Category> disabledCategories, int serverVersion) {
AdvancedAchievements advancedAchievements, Logger logger, Set<Category> disabledCategories) {
this.mainConfig = mainConfig;
this.guiItems = guiItems;
this.advancedAchievements = advancedAchievements;
this.logger = logger;
this.disabledCategories = disabledCategories;
this.serverVersion = serverVersion;
this.achievementMap = achievementMap;
}

@@ -110,9 +95,6 @@ public void registerAdvancements() {
*/
private String parseBackgroundTexture() {
String configTexture = mainConfig.getString("AdvancementsBackground");
if (serverVersion == 12) {
return StringUtils.replace(configTexture, "/item/", "/items/");
}
return StringUtils.replaceEach(configTexture, new String[] { "/items/", "book_enchanted.png" },
new String[] { "/item/", "enchanted_book.png" });
}
@@ -151,9 +133,6 @@ private void registerParentAdvancement() {
.description("")
.background(configBackgroundTexture)
.type(AdvancementType.GOAL);
if (serverVersion == 12) {
builder.iconData("0");
}
Bukkit.getUnsafe().loadAdvancement(namespacedKey, AdvancementJsonHelper.toJson(builder.build()));
}
}
@@ -206,42 +185,13 @@ private String registerAdvancement(ItemStack item, Achievement achievement, Stri
}

AchievementAdvancementBuilder builder = new AchievementAdvancementBuilder()
.iconItem(serverVersion == 12 ? getInternalName(item) : item.getType().name().toLowerCase())
.iconItem(item.getType().name().toLowerCase())
.title(displayName)
.description(description)
.parent("advancedachievements:" + parentKey)
.type(lastAchievement ? AdvancementType.CHALLENGE : AdvancementType.TASK);
if (serverVersion == 12) {
builder.iconData(Short.toString(item.getDurability()));
}
Bukkit.getUnsafe().loadAdvancement(namespacedKey, AdvancementJsonHelper.toJson(builder.build()));
++generatedAdvancements;
return achKey;
}

/**
* Gets the internal item used by Vanilla Minecraft. These are the only names supported by advancements. Material
* and internal names can differ quite significantly (for instance: book_and_quill vs. writable_book).
*
* @param item
* @return the internal Minecraft name, prefixed with "minecraft:"
*/
private String getInternalName(ItemStack item) {
try {
Object nmsItemStack = PackageType.CRAFTBUKKIT.getClass(PACKAGE_INVENTORY + "." + CLASS_CRAFT_ITEM_STACK)
.getMethod(METHOD_AS_NMS_COPY, ItemStack.class).invoke(null, item);
Object nmsItem = PackageType.MINECRAFT_SERVER.getClass(CLASS_ITEM_STACK).getMethod(METHOD_GET_ITEM)
.invoke(nmsItemStack);
Object registry = PackageType.MINECRAFT_SERVER.getClass(CLASS_ITEM).getField(FIELD_REGISTRY).get(null);
Object minecraftKey = PackageType.MINECRAFT_SERVER.getClass(CLASS_REGISTRY_MATERIALS)
.getMethod(METHOD_B, Object.class).invoke(registry, nmsItem);
return "minecraft:" + PackageType.MINECRAFT_SERVER.getClass(CLASS_MINECRAFT_KEY).getMethod(METHOD_GET_KEY)
.invoke(minecraftKey);
} catch (Exception e) {
logger.warning("Failed to get internal " + item.getType().name().toLowerCase() + " name for advancement icon. "
+ "Using book instead.");
return MINECRAFT_BOOK_KEY;
}
}

}
Original file line number Diff line number Diff line change
@@ -19,9 +19,7 @@
import com.hm.achievement.command.executable.CommandSpec;
import com.hm.achievement.command.executable.DeleteCommand;
import com.hm.achievement.command.executable.EasterEggCommand;
import com.hm.achievement.command.executable.GenerateCommand;
import com.hm.achievement.command.executable.ResetCommand;
import com.hm.achievement.command.executable.Upgrade13Command;
import com.hm.achievement.config.AchievementMap;

/**
@@ -32,19 +30,14 @@
*/
public class CommandTabCompleter implements TabCompleter {

private static final int MAX_LIST_LENGTH = 50;

private final AchievementMap achievementMap;
private final Set<CommandSpec> commandSpecs;
private final int serverVersion;

@Inject
public CommandTabCompleter(AchievementMap achievementMap, Set<AbstractCommand> commands, int serverVersion) {
public CommandTabCompleter(AchievementMap achievementMap, Set<AbstractCommand> commands) {
this.achievementMap = achievementMap;
this.serverVersion = serverVersion;
this.commandSpecs = commands.stream()
.filter(c -> !(c instanceof EasterEggCommand || c instanceof Upgrade13Command
|| serverVersion < 12 && c instanceof GenerateCommand))
.filter(c -> !(c instanceof EasterEggCommand))
.map(c -> c.getClass().getAnnotation(CommandSpec.class))
.collect(Collectors.toSet());
}
@@ -83,7 +76,7 @@ public List<String> onTabComplete(CommandSender sender, Command command, String

/**
* Returns a partial list based on the input set. Members of the returned list must start with what the player has
* types so far. The list also has a limited length prior to Minecraft 1.13 to avoid filling the player's screen.
* types so far.
*
* @param options
* @param prefix
@@ -94,18 +87,11 @@ private List<String> getPartialList(Collection<String> options, String prefix) {
// Replace spaces with an Open Box character to prevent completing wrong word. Prevented Behaviour:
// T -> Tamer -> Teleport Man -> Teleport The Avener -> Teleport The The Smelter
// Sort matching elements by alphabetical order.
List<String> allOptions = options.stream()
return options.stream()
.filter(s1 -> s1.toLowerCase().startsWith(prefix.toLowerCase()))
.map(s -> s.replace(' ', '\u2423'))
.sorted()
.collect(Collectors.toList());

if (serverVersion < 13 && allOptions.size() > MAX_LIST_LENGTH) {
allOptions = allOptions.subList(0, MAX_LIST_LENGTH - 1);
// Suspension points to show that list was truncated.
allOptions.add("\u2022\u2022\u2022");
}
return allOptions;
}

private boolean shouldReturnPlayerList(Command command, String[] args) {
Original file line number Diff line number Diff line change
@@ -16,7 +16,6 @@
import org.bukkit.configuration.file.YamlConfiguration;
import org.bukkit.entity.Player;

import com.darkblade12.particleeffect.ParticleEffect;
import com.hm.achievement.command.pagination.CommandPagination;
import com.hm.achievement.db.AbstractDatabaseManager;
import com.hm.achievement.utils.SoundPlayer;
@@ -37,7 +36,6 @@ public abstract class AbstractRankingCommand extends AbstractCommand {
private static final int PER_PAGE = 16;

private final Logger logger;
private final int serverVersion;
private final String languageKey;
private final AbstractDatabaseManager databaseManager;
private final SoundPlayer soundPlayer;
@@ -56,11 +54,9 @@ public abstract class AbstractRankingCommand extends AbstractCommand {
private long lastCacheUpdate = 0L;

AbstractRankingCommand(YamlConfiguration mainConfig, YamlConfiguration langConfig, StringBuilder pluginHeader,
Logger logger, int serverVersion, String languageKey, AbstractDatabaseManager databaseManager,
SoundPlayer soundPlayer) {
Logger logger, String languageKey, AbstractDatabaseManager databaseManager, SoundPlayer soundPlayer) {
super(mainConfig, langConfig, pluginHeader);
this.logger = logger;
this.serverVersion = serverVersion;
this.languageKey = languageKey;
this.databaseManager = databaseManager;
this.soundPlayer = soundPlayer;
@@ -181,16 +177,11 @@ private String getRankingSymbol(int rank) {
*/
private void launchEffects(Player player) {
if (configAdditionalEffects) {
if (serverVersion >= 9) {
player.spawnParticle(Particle.PORTAL, player.getLocation(), 100, 0, 1, 0, 0.5f);
} else {
ParticleEffect.PORTAL.display(0, 1, 0, 0.5f, 1000, player.getLocation(), 1);
}
player.spawnParticle(Particle.PORTAL, player.getLocation(), 100, 0, 1, 0, 0.5f);
}

if (configSound) {
soundPlayer.play(player, configSoundRanking, "ENTITY_FIREWORK_ROCKET_BLAST", "ENTITY_FIREWORK_LARGE_BLAST",
"FIREWORK_BLAST");
soundPlayer.play(player, configSoundRanking, "ENTITY_FIREWORK_ROCKET_BLAST");
}
}
}
Original file line number Diff line number Diff line change
@@ -15,6 +15,7 @@
import javax.inject.Singleton;

import org.apache.commons.lang3.StringUtils;
import org.bukkit.Bukkit;
import org.bukkit.Material;
import org.bukkit.Particle;
import org.bukkit.command.CommandSender;
@@ -23,8 +24,6 @@
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.BookMeta;

import com.darkblade12.particleeffect.ParticleEffect;
import com.darkblade12.particleeffect.ReflectionUtils.PackageType;
import com.hm.achievement.config.AchievementMap;
import com.hm.achievement.db.AbstractDatabaseManager;
import com.hm.achievement.db.data.AwardedDBAchievement;
@@ -126,16 +125,12 @@ void onExecute(CommandSender sender, String[] args) {
}
// Play special particle effect when receiving the book.
if (configAdditionalEffects) {
if (serverVersion >= 9) {
player.spawnParticle(Particle.ENCHANTMENT_TABLE, player.getLocation(), 1000, 0, 2, 0, 1);
} else {
ParticleEffect.ENCHANTMENT_TABLE.display(0, 2, 0, 1, 1000, player.getLocation(), 100);
}
player.spawnParticle(Particle.ENCHANTMENT_TABLE, player.getLocation(), 1000, 0, 2, 0, 1);
}

// Play special sound when receiving the book.
if (configSound) {
soundPlayer.play(player, configSoundBook, "ENTITY_PLAYER_LEVELUP", "ENTITY_PLAYER_LEVELUP", "LEVEL_UP");
soundPlayer.play(player, configSoundBook, "ENTITY_PLAYER_LEVELUP");
}

fillBook(playerAchievementsList, player);
@@ -214,15 +209,17 @@ private boolean isInCooldownPeriod(Player player) {
*/
@SuppressWarnings("unchecked")
private void setBookPages(List<String> bookPages, BookMeta bookMeta) {
if (serverVersion >= 11 && serverVersion <= 15) {
if (serverVersion <= 15) {
try {
// Code we're trying to execute: this.pages.add(CraftChatMessage.fromString(page, true)[0]); in
// CraftMetaBook.java.
Class<?> craftMetaBookClass = PackageType.CRAFTBUKKIT
.getClass(PACKAGE_INVENTORY + "." + CLASS_CRAFT_META_BOOK);
String versionIdentifier = Bukkit.getServer().getClass().getPackage().getName().substring(23);
Class<?> craftMetaBookClass = Class.forName("org.bukkit.craftbukkit." + versionIdentifier + "."
+ PACKAGE_INVENTORY + "." + CLASS_CRAFT_META_BOOK);
List<Object> pages = (List<Object>) craftMetaBookClass.getField(FIELD_PAGES)
.get(craftMetaBookClass.cast(bookMeta));
Method fromStringMethod = PackageType.CRAFTBUKKIT.getClass(PACKAGE_UTIL + "." + CLASS_CRAFT_CHAT_MESSAGE)
Method fromStringMethod = Class.forName("org.bukkit.craftbukkit." + versionIdentifier + "."
+ PACKAGE_UTIL + "." + CLASS_CRAFT_CHAT_MESSAGE)
.getMethod(METHOD_FROM_STRING, String.class, boolean.class);
for (String bookPage : bookPages) {
pages.add(((Object[]) fromStringMethod.invoke(null, bookPage, true))[0]);
Original file line number Diff line number Diff line change
@@ -19,17 +19,14 @@
@CommandSpec(name = "generate", permission = "generate", minArgs = 1, maxArgs = 1)
public class GenerateCommand extends AbstractCommand {

private final int serverVersion;
private final AdvancementManager advancementManager;

private String langAdvancementsGenerated;
private String langMinecraftNotSupported;

@Inject
public GenerateCommand(@Named("main") YamlConfiguration mainConfig, @Named("lang") YamlConfiguration langConfig,
StringBuilder pluginHeader, int serverVersion, AdvancementManager advancementManager) {
StringBuilder pluginHeader, AdvancementManager advancementManager) {
super(mainConfig, langConfig, pluginHeader);
this.serverVersion = serverVersion;
this.advancementManager = advancementManager;
}

@@ -38,17 +35,12 @@ public void extractConfigurationParameters() {
super.extractConfigurationParameters();

langAdvancementsGenerated = pluginHeader + langConfig.getString("advancements-generated");
langMinecraftNotSupported = pluginHeader + langConfig.getString("minecraft-not-supported");
}

@Override
void onExecute(CommandSender sender, String[] args) {
if (serverVersion >= 12) {
advancementManager.registerAdvancements();
advancementManager.registerAdvancements();

sender.sendMessage(langAdvancementsGenerated);
} else {
sender.sendMessage(langMinecraftNotSupported);
}
sender.sendMessage(langAdvancementsGenerated);
}
}
Original file line number Diff line number Diff line change
@@ -1,7 +1,5 @@
package com.hm.achievement.command.executable;

import java.util.logging.Logger;

import javax.inject.Inject;
import javax.inject.Named;
import javax.inject.Singleton;
@@ -24,8 +22,7 @@
@CommandSpec(name = "help", permission = "", minArgs = 0, maxArgs = Integer.MAX_VALUE)
public class HelpCommand extends AbstractCommand {

private final int serverVersion;
private final Logger logger;
private final FancyMessageSender fancyMessageSender;

private ChatColor configColor;
private String configIcon;
@@ -66,10 +63,9 @@ public class HelpCommand extends AbstractCommand {

@Inject
public HelpCommand(@Named("main") YamlConfiguration mainConfig, @Named("lang") YamlConfiguration langConfig,
StringBuilder pluginHeader, int serverVersion, Logger logger) {
StringBuilder pluginHeader, FancyMessageSender fancyMessageSender) {
super(mainConfig, langConfig, pluginHeader);
this.serverVersion = serverVersion;
this.logger = logger;
this.fancyMessageSender = fancyMessageSender;
}

@Override
@@ -167,7 +163,7 @@ void onExecute(CommandSender sender, String[] args) {
sendJsonClickableHoverableMessage(sender, langCommandReload, "/aach reload", langCommandReloadHover);
}

if (serverVersion >= 12 && sender.hasPermission("achievement.generate")) {
if (sender.hasPermission("achievement.generate")) {
sendJsonClickableHoverableMessage(sender, langCommandGenerate, "/aach generate", langCommandGenerateHover);
}

@@ -211,16 +207,10 @@ void onExecute(CommandSender sender, String[] args) {
* @param hover
*/
private void sendJsonClickableHoverableMessage(CommandSender sender, String message, String command, String hover) {
// Send clickable and hoverable message if sender is a player and if supported by the Minecraft version.
if (sender instanceof Player && serverVersion > 7) {
try {
FancyMessageSender.sendHoverableCommandMessage((Player) sender, message, command, hover,
configColor.name().toLowerCase());
} catch (Exception e) {
logger.warning(
"Failed to display clickable and hoverable message in /aach help command. Displaying standard message instead.");
sender.sendMessage(message);
}
// Send clickable and hoverable message if sender is a player.
if (sender instanceof Player) {
fancyMessageSender.sendHoverableCommandMessage((Player) sender, message, command, hover,
configColor.name().toLowerCase());
} else {
sender.sendMessage(message);
}
Loading

0 comments on commit eebd25c

Please sign in to comment.