From 9771d160c4594308a117519bcfca1eddcc0de7d9 Mon Sep 17 00:00:00 2001 From: Josh Roy <10731363+JRoy@users.noreply.github.com> Date: Tue, 23 Aug 2022 19:59:34 -0400 Subject: [PATCH 01/14] Rework the provider system --- .../AlternativeCommandsHandler.java | 3 +- .../com/earth2me/essentials/Essentials.java | 245 ++++-------------- .../essentials/EssentialsBlockListener.java | 6 +- .../essentials/EssentialsPlayerListener.java | 6 +- .../com/earth2me/essentials/IEssentials.java | 44 +--- .../java/com/earth2me/essentials/Kit.java | 5 +- .../earth2me/essentials/MetaItemStack.java | 3 +- .../earth2me/essentials/ProviderFactory.java | 118 +++++++++ .../earth2me/essentials/RandomTeleport.java | 7 +- .../com/earth2me/essentials/Settings.java | 16 +- .../essentials/commands/Commandanvil.java | 5 +- .../commands/Commandcartographytable.java | 5 +- .../essentials/commands/Commandcreatekit.java | 5 +- .../commands/Commandessentials.java | 6 +- .../commands/Commandgrindstone.java | 5 +- .../essentials/commands/Commandhelp.java | 3 +- .../essentials/commands/Commandloom.java | 5 +- .../commands/Commandsmithingtable.java | 5 +- .../essentials/commands/Commandspawner.java | 2 +- .../commands/Commandstonecutter.java | 5 +- .../essentials/commands/Commandtop.java | 3 +- .../commands/EssentialsCommand.java | 3 +- .../earth2me/essentials/items/FlatItemDb.java | 8 +- .../essentials/items/LegacyItemDb.java | 12 +- .../essentials/signs/EssentialsSign.java | 13 +- .../earth2me/essentials/signs/SignAnvil.java | 5 +- .../essentials/signs/SignCartography.java | 5 +- .../essentials/signs/SignEnchant.java | 4 +- .../essentials/signs/SignGrindstone.java | 5 +- .../earth2me/essentials/signs/SignLoom.java | 5 +- .../essentials/signs/SignSmithing.java | 5 +- .../essentials/textreader/HelpInput.java | 3 +- .../essentials/utils/CommandMapUtil.java | 3 +- .../essentials/utils/LocationUtil.java | 13 +- .../main/java/net/ess3/api/IEssentials.java | 16 -- .../LegacyItemUnbreakableProvider.java | 7 +- .../ess3/provider/MaterialTagProvider.java | 2 +- .../net/ess3/provider/OnlineModeProvider.java | 5 + .../main/java/net/ess3/provider/Provider.java | 1 - .../providers/BasePotionDataProvider.java | 14 +- .../BlockMetaSpawnerItemProvider.java | 7 +- .../BukkitCommandSendListenerProvider.java | 5 - .../providers/BukkitMaterialTagProvider.java | 13 + .../providers/BukkitSpawnerBlockProvider.java | 14 +- .../FixedHeightWorldInfoProvider.java | 7 +- .../providers/FlatSpawnEggProvider.java | 15 +- .../providers/LegacyPotionMetaProvider.java | 7 +- .../providers/LegacySpawnEggProvider.java | 7 +- .../ModernDataWorldInfoProvider.java | 18 +- .../ModernItemUnbreakableProvider.java | 14 +- .../ModernPersistentDataProvider.java | 14 +- .../providers/ModernSignDataProvider.java | 14 +- .../essentialsx/providers/ProviderData.java | 14 + .../essentialsx/providers/ProviderTest.java | 11 + .../providers/ReflDataWorldInfoProvider.java | 14 +- .../ReflFormattedCommandAliasProvider.java | 8 +- .../providers/ReflKnownCommandsProvider.java | 8 +- .../providers/ReflOnlineModeProvider.java | 8 +- .../providers/ReflPersistentDataProvider.java | 7 +- .../providers/ReflServerStateProvider.java | 7 +- .../refl/providers/ReflSpawnEggProvider.java | 7 +- .../providers/ReflSpawnerBlockProvider.java | 7 +- .../providers/ReflSyncCommandsProvider.java | 7 +- .../PaperCommandSendListenerProvider.java | 5 - .../providers/PaperContainerProvider.java | 17 +- .../providers/PaperKnownCommandsProvider.java | 16 +- .../providers/PaperMaterialTagProvider.java | 14 + .../providers/PaperRecipeBookListener.java | 5 - .../providers/PaperSerializationProvider.java | 14 +- .../providers/PaperServerStateProvider.java | 14 +- 70 files changed, 512 insertions(+), 437 deletions(-) create mode 100644 Essentials/src/main/java/com/earth2me/essentials/ProviderFactory.java create mode 100644 providers/BaseProviders/src/main/java/net/ess3/provider/OnlineModeProvider.java create mode 100644 providers/BaseProviders/src/main/java/net/essentialsx/providers/ProviderData.java create mode 100644 providers/BaseProviders/src/main/java/net/essentialsx/providers/ProviderTest.java diff --git a/Essentials/src/main/java/com/earth2me/essentials/AlternativeCommandsHandler.java b/Essentials/src/main/java/com/earth2me/essentials/AlternativeCommandsHandler.java index 322cebb4d9f..c80a3136036 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/AlternativeCommandsHandler.java +++ b/Essentials/src/main/java/com/earth2me/essentials/AlternativeCommandsHandler.java @@ -1,5 +1,6 @@ package com.earth2me.essentials; +import net.ess3.provider.KnownCommandsProvider; import org.bukkit.command.Command; import org.bukkit.command.PluginIdentifiableCommand; import org.bukkit.plugin.Plugin; @@ -52,7 +53,7 @@ public final void addPlugin(final Plugin plugin) { private Map getPluginCommands(Plugin plugin) { final Map commands = new HashMap<>(); - for (final Map.Entry entry : ess.getKnownCommandsProvider().getKnownCommands().entrySet()) { + for (final Map.Entry entry : ess.getProviders().get(KnownCommandsProvider.class).getKnownCommands().entrySet()) { if (entry.getValue() instanceof PluginIdentifiableCommand && ((PluginIdentifiableCommand) entry.getValue()).getPlugin().equals(plugin)) { commands.put(entry.getKey(), entry.getValue()); } diff --git a/Essentials/src/main/java/com/earth2me/essentials/Essentials.java b/Essentials/src/main/java/com/earth2me/essentials/Essentials.java index 2b5584c69bb..d6e5d1852a6 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/Essentials.java +++ b/Essentials/src/main/java/com/earth2me/essentials/Essentials.java @@ -56,22 +56,9 @@ import net.ess3.nms.refl.providers.ReflSpawnEggProvider; import net.ess3.nms.refl.providers.ReflSpawnerBlockProvider; import net.ess3.nms.refl.providers.ReflSyncCommandsProvider; -import net.ess3.provider.ContainerProvider; -import net.ess3.provider.FormattedCommandAliasProvider; -import net.ess3.provider.ItemUnbreakableProvider; import net.ess3.provider.KnownCommandsProvider; -import net.ess3.provider.MaterialTagProvider; -import net.ess3.provider.PersistentDataProvider; -import net.ess3.provider.PotionMetaProvider; import net.ess3.provider.ProviderListener; -import net.ess3.provider.SerializationProvider; import net.ess3.provider.ServerStateProvider; -import net.ess3.provider.SignDataProvider; -import net.ess3.provider.SpawnEggProvider; -import net.ess3.provider.SpawnerBlockProvider; -import net.ess3.provider.SpawnerItemProvider; -import net.ess3.provider.SyncCommandsProvider; -import net.ess3.provider.WorldInfoProvider; import net.ess3.provider.providers.BaseLoggerProvider; import net.ess3.provider.providers.BasePotionDataProvider; import net.ess3.provider.providers.BlockMetaSpawnerItemProvider; @@ -145,6 +132,7 @@ public class Essentials extends JavaPlugin implements net.ess3.api.IEssentials { private static Logger LOGGER = null; private final transient TNTExplodeListener tntListener = new TNTExplodeListener(this); private final transient Set vanishedPlayers = new LinkedHashSet<>(); + private final transient ProviderFactory providerFactory = new ProviderFactory(this); private transient ISettings settings; private transient Jails jails; private transient Warps warps; @@ -162,23 +150,7 @@ public class Essentials extends JavaPlugin implements net.ess3.api.IEssentials { private transient I18n i18n; private transient MetricsWrapper metrics; private transient EssentialsTimer timer; - private transient SpawnerItemProvider spawnerItemProvider; - private transient SpawnerBlockProvider spawnerBlockProvider; - private transient SpawnEggProvider spawnEggProvider; - private transient PotionMetaProvider potionMetaProvider; - private transient ServerStateProvider serverStateProvider; - private transient ContainerProvider containerProvider; - private transient SerializationProvider serializationProvider; - private transient KnownCommandsProvider knownCommandsProvider; - private transient FormattedCommandAliasProvider formattedCommandAliasProvider; private transient ProviderListener recipeBookEventProvider; - private transient MaterialTagProvider materialTagProvider; - private transient SyncCommandsProvider syncCommandsProvider; - private transient PersistentDataProvider persistentDataProvider; - private transient ReflOnlineModeProvider onlineModeProvider; - private transient ItemUnbreakableProvider unbreakableProvider; - private transient WorldInfoProvider worldInfoProvider; - private transient SignDataProvider signDataProvider; private transient Kits kits; private transient RandomTeleport randomTeleport; private transient UpdateChecker updateChecker; @@ -353,98 +325,69 @@ public void onEnable() { execTimer.mark("Init(Jails)"); EconomyLayers.onEnable(this); + execTimer.mark("Init(EconomyLayers)"); - //Spawner item provider only uses one but it's here for legacy... - spawnerItemProvider = new BlockMetaSpawnerItemProvider(); + // Spawner item provider only uses one, but it's here for legacy... + providerFactory.registerProvider(BlockMetaSpawnerItemProvider.class); - //Spawner block providers - if (VersionUtil.getServerBukkitVersion().isLowerThan(VersionUtil.v1_12_0_R01)) { - spawnerBlockProvider = new ReflSpawnerBlockProvider(); - } else { - spawnerBlockProvider = new BukkitSpawnerBlockProvider(); - } + // Spawner block providers + providerFactory.registerProvider(ReflSpawnerBlockProvider.class, BukkitSpawnerBlockProvider.class); - //Spawn Egg Providers - if (VersionUtil.getServerBukkitVersion().isLowerThan(VersionUtil.v1_9_R01)) { - spawnEggProvider = new LegacySpawnEggProvider(); - } else if (VersionUtil.getServerBukkitVersion().isLowerThanOrEqualTo(VersionUtil.v1_12_2_R01)) { - spawnEggProvider = new ReflSpawnEggProvider(); - } else { - spawnEggProvider = new FlatSpawnEggProvider(); - } + // Spawn Egg Providers + providerFactory.registerProvider(LegacySpawnEggProvider.class, ReflSpawnEggProvider.class, FlatSpawnEggProvider.class); - //Potion Meta Provider - if (VersionUtil.getServerBukkitVersion().isLowerThan(VersionUtil.v1_9_R01)) { - potionMetaProvider = new LegacyPotionMetaProvider(); - } else { - potionMetaProvider = new BasePotionDataProvider(); - } + // Potion Meta Provider + providerFactory.registerProvider(LegacyPotionMetaProvider.class, BasePotionDataProvider.class); - //Server State Provider - //Container Provider - if (PaperLib.isPaper() && VersionUtil.getServerBukkitVersion().isHigherThanOrEqualTo(VersionUtil.v1_15_2_R01)) { - serverStateProvider = new PaperServerStateProvider(); - containerProvider = new PaperContainerProvider(); - serializationProvider = new PaperSerializationProvider(); - } else { - serverStateProvider = new ReflServerStateProvider(); - } + // Server State Provider + providerFactory.registerProvider(ReflServerStateProvider.class, PaperServerStateProvider.class); - //Event Providers - if (PaperLib.isPaper()) { - try { - Class.forName("com.destroystokyo.paper.event.player.PlayerRecipeBookClickEvent"); - recipeBookEventProvider = new PaperRecipeBookListener(event -> { - if (this.getUser(((PlayerEvent) event).getPlayer()).isRecipeSee()) { - ((Cancellable) event).setCancelled(true); - } - }); - } catch (final ClassNotFoundException ignored) { - } - } + // Container Provider + providerFactory.registerProvider(PaperContainerProvider.class); - //Known Commands Provider - if (PaperLib.isPaper() && VersionUtil.getServerBukkitVersion().isHigherThanOrEqualTo(VersionUtil.v1_11_2_R01)) { - knownCommandsProvider = new PaperKnownCommandsProvider(); - } else { - knownCommandsProvider = new ReflKnownCommandsProvider(); - } + // Serialization Provider + providerFactory.registerProvider(PaperSerializationProvider.class); - // Command aliases provider - formattedCommandAliasProvider = new ReflFormattedCommandAliasProvider(PaperLib.isPaper()); + // Known Commands Provider + providerFactory.registerProvider(ReflKnownCommandsProvider.class, PaperKnownCommandsProvider.class); + + // Command Aliases Provider + providerFactory.registerProvider(ReflFormattedCommandAliasProvider.class); // Material Tag Providers - if (VersionUtil.getServerBukkitVersion().isHigherThanOrEqualTo(VersionUtil.v1_13_0_R01)) { - materialTagProvider = PaperLib.isPaper() ? new PaperMaterialTagProvider() : new BukkitMaterialTagProvider(); - } + providerFactory.registerProvider(BukkitMaterialTagProvider.class, PaperMaterialTagProvider.class); // Sync Commands Provider - syncCommandsProvider = new ReflSyncCommandsProvider(); + providerFactory.registerProvider(ReflSyncCommandsProvider.class); - if (VersionUtil.getServerBukkitVersion().isHigherThanOrEqualTo(VersionUtil.v1_14_4_R01)) { - persistentDataProvider = new ModernPersistentDataProvider(this); - } else { - persistentDataProvider = new ReflPersistentDataProvider(this); - } + // Persistent Data Provider + providerFactory.registerProvider(ReflPersistentDataProvider.class, ModernPersistentDataProvider.class); - onlineModeProvider = new ReflOnlineModeProvider(); + // Online Mode Provider + providerFactory.registerProvider(ReflOnlineModeProvider.class); - if (VersionUtil.getServerBukkitVersion().isHigherThanOrEqualTo(VersionUtil.v1_11_2_R01)) { - unbreakableProvider = new ModernItemUnbreakableProvider(); - } else { - unbreakableProvider = new LegacyItemUnbreakableProvider(); - } + // Unbreakable Provider + providerFactory.registerProvider(LegacyItemUnbreakableProvider.class, ModernItemUnbreakableProvider.class); - if (VersionUtil.getServerBukkitVersion().isHigherThanOrEqualTo(VersionUtil.v1_17_1_R01)) { - worldInfoProvider = new ModernDataWorldInfoProvider(); - } else if (VersionUtil.getServerBukkitVersion().isHigherThanOrEqualTo(VersionUtil.v1_16_5_R01)) { - worldInfoProvider = new ReflDataWorldInfoProvider(); - } else { - worldInfoProvider = new FixedHeightWorldInfoProvider(); - } + // World Info Provider + providerFactory.registerProvider(FixedHeightWorldInfoProvider.class, ReflDataWorldInfoProvider.class, ModernDataWorldInfoProvider.class); - if (VersionUtil.getServerBukkitVersion().isHigherThanOrEqualTo(VersionUtil.v1_14_4_R01)) { - signDataProvider = new ModernSignDataProvider(this); + // Sign Data Provider + providerFactory.registerProvider(ModernSignDataProvider.class); + + providerFactory.finalizeRegistration(); + + // Event Providers + if (PaperLib.isPaper()) { + try { + Class.forName("com.destroystokyo.paper.event.player.PlayerRecipeBookClickEvent"); + recipeBookEventProvider = new PaperRecipeBookListener(event -> { + if (this.getUser(((PlayerEvent) event).getPlayer()).isRecipeSee()) { + ((Cancellable) event).setCancelled(true); + } + }); + } catch (final ClassNotFoundException ignored) { + } } execTimer.mark("Init(Providers)"); @@ -550,9 +493,14 @@ private void registerListeners(final PluginManager pm) { jails.resetListener(); } + @Override + public ProviderFactory getProviders() { + return providerFactory; + } + @Override public void onDisable() { - final boolean stopping = getServerStateProvider().isStopping(); + final boolean stopping = getProviders().get(ServerStateProvider.class).isStopping(); if (!stopping) { LOGGER.log(Level.SEVERE, tl("serverReloading")); } @@ -665,8 +613,8 @@ public List onTabCompleteEssentials(final CommandSender cSender, final C // Check for disabled commands if (getSettings().isCommandDisabled(commandLabel)) { - if (getKnownCommandsProvider().getKnownCommands().containsKey(commandLabel)) { - final Command newCmd = getKnownCommandsProvider().getKnownCommands().get(commandLabel); + if (getProviders().get(KnownCommandsProvider.class).getKnownCommands().containsKey(commandLabel)) { + final Command newCmd = getProviders().get(KnownCommandsProvider.class).getKnownCommands().get(commandLabel); if (!(newCmd instanceof PluginIdentifiableCommand) || ((PluginIdentifiableCommand) newCmd).getPlugin() != this) { return newCmd.tabComplete(cSender, commandLabel, args); } @@ -771,8 +719,8 @@ public boolean onCommandEssentials(final CommandSender cSender, final Command co // Check for disabled commands if (getSettings().isCommandDisabled(commandLabel)) { - if (getKnownCommandsProvider().getKnownCommands().containsKey(commandLabel)) { - final Command newCmd = getKnownCommandsProvider().getKnownCommands().get(commandLabel); + if (getProviders().get(KnownCommandsProvider.class).getKnownCommands().containsKey(commandLabel)) { + final Command newCmd = getProviders().get(KnownCommandsProvider.class).getKnownCommands().get(commandLabel); if (!(newCmd instanceof PluginIdentifiableCommand) || !isEssentialsPlugin(((PluginIdentifiableCommand) newCmd).getPlugin())) { return newCmd.execute(cSender, commandLabel, args); } @@ -1251,90 +1199,11 @@ public Iterable getOnlineUsers() { return onlineUsers; } - @Override - public SpawnerItemProvider getSpawnerItemProvider() { - return spawnerItemProvider; - } - - @Override - public SpawnerBlockProvider getSpawnerBlockProvider() { - return spawnerBlockProvider; - } - - @Override - public SpawnEggProvider getSpawnEggProvider() { - return spawnEggProvider; - } - - @Override - public PotionMetaProvider getPotionMetaProvider() { - return potionMetaProvider; - } - @Override public CustomItemResolver getCustomItemResolver() { return customItemResolver; } - @Override - public ServerStateProvider getServerStateProvider() { - return serverStateProvider; - } - - public MaterialTagProvider getMaterialTagProvider() { - return materialTagProvider; - } - - @Override - public ContainerProvider getContainerProvider() { - return containerProvider; - } - - @Override - public KnownCommandsProvider getKnownCommandsProvider() { - return knownCommandsProvider; - } - - @Override - public SerializationProvider getSerializationProvider() { - return serializationProvider; - } - - @Override - public FormattedCommandAliasProvider getFormattedCommandAliasProvider() { - return formattedCommandAliasProvider; - } - - @Override - public SyncCommandsProvider getSyncCommandsProvider() { - return syncCommandsProvider; - } - - @Override - public PersistentDataProvider getPersistentDataProvider() { - return persistentDataProvider; - } - - @Override - public ReflOnlineModeProvider getOnlineModeProvider() { - return onlineModeProvider; - } - - @Override - public ItemUnbreakableProvider getItemUnbreakableProvider() { - return unbreakableProvider; - } - - @Override - public WorldInfoProvider getWorldInfoProvider() { - return worldInfoProvider; - } - - @Override - public SignDataProvider getSignDataProvider() { - return signDataProvider; - } - @Override public PluginCommand getPluginCommand(final String cmd) { return this.getCommand(cmd); diff --git a/Essentials/src/main/java/com/earth2me/essentials/EssentialsBlockListener.java b/Essentials/src/main/java/com/earth2me/essentials/EssentialsBlockListener.java index dd700b2b5b9..be6ec1fdb96 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/EssentialsBlockListener.java +++ b/Essentials/src/main/java/com/earth2me/essentials/EssentialsBlockListener.java @@ -2,6 +2,8 @@ import com.earth2me.essentials.utils.MaterialUtil; import net.ess3.api.IEssentials; +import net.ess3.provider.PersistentDataProvider; +import net.ess3.provider.SpawnerItemProvider; import org.bukkit.GameMode; import org.bukkit.block.BlockState; import org.bukkit.block.CreatureSpawner; @@ -25,11 +27,11 @@ public EssentialsBlockListener(final IEssentials ess) { public void onBlockPlace(final BlockPlaceEvent event) { final ItemStack is = event.getItemInHand(); - if (is.getType() == MaterialUtil.SPAWNER && ess.getPersistentDataProvider().getString(is, "convert") != null) { + if (is.getType() == MaterialUtil.SPAWNER && ess.getProviders().get(PersistentDataProvider.class).getString(is, "convert") != null) { final BlockState blockState = event.getBlockPlaced().getState(); if (blockState instanceof CreatureSpawner) { final CreatureSpawner spawner = (CreatureSpawner) blockState; - final EntityType type = ess.getSpawnerItemProvider().getEntityType(event.getItemInHand()); + final EntityType type = ess.getProviders().get(SpawnerItemProvider.class).getEntityType(event.getItemInHand()); if (type != null && Mob.fromBukkitType(type) != null) { if (ess.getUser(event.getPlayer()).isAuthorized("essentials.spawnerconvert." + Mob.fromBukkitType(type).name().toLowerCase(Locale.ENGLISH))) { spawner.setSpawnedType(type); diff --git a/Essentials/src/main/java/com/earth2me/essentials/EssentialsPlayerListener.java b/Essentials/src/main/java/com/earth2me/essentials/EssentialsPlayerListener.java index 53f661f8079..c399e27c5e7 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/EssentialsPlayerListener.java +++ b/Essentials/src/main/java/com/earth2me/essentials/EssentialsPlayerListener.java @@ -14,6 +14,8 @@ import net.ess3.api.IEssentials; import net.ess3.api.events.AfkStatusChangeEvent; import net.ess3.provider.CommandSendListenerProvider; +import net.ess3.provider.FormattedCommandAliasProvider; +import net.ess3.provider.KnownCommandsProvider; import net.ess3.provider.providers.BukkitCommandSendListenerProvider; import net.ess3.provider.providers.PaperCommandSendListenerProvider; import net.essentialsx.api.v2.events.AsyncUserDataLoadEvent; @@ -580,10 +582,10 @@ public void onPlayerCommandPreprocess(final PlayerCommandPreprocessEvent event) // If the plugin command does not exist, check if it is an alias from commands.yml if (ess.getServer().getPluginCommand(cmd) == null) { - final Command knownCommand = ess.getKnownCommandsProvider().getKnownCommands().get(cmd); + final Command knownCommand = ess.getProviders().get(KnownCommandsProvider.class).getKnownCommands().get(cmd); if (knownCommand instanceof FormattedCommandAlias) { final FormattedCommandAlias command = (FormattedCommandAlias) knownCommand; - for (String fullCommand : ess.getFormattedCommandAliasProvider().createCommands(command, event.getPlayer(), args.split(" "))) { + for (String fullCommand : ess.getProviders().get(FormattedCommandAliasProvider.class).createCommands(command, event.getPlayer(), args.split(" "))) { handlePlayerCommandPreprocess(event, fullCommand); } return; diff --git a/Essentials/src/main/java/com/earth2me/essentials/IEssentials.java b/Essentials/src/main/java/com/earth2me/essentials/IEssentials.java index 464fec9182a..3a7f02aedc3 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/IEssentials.java +++ b/Essentials/src/main/java/com/earth2me/essentials/IEssentials.java @@ -7,20 +7,6 @@ import com.earth2me.essentials.commands.PlayerNotFoundException; import com.earth2me.essentials.perm.PermissionsHandler; import com.earth2me.essentials.updatecheck.UpdateChecker; -import net.ess3.nms.refl.providers.ReflOnlineModeProvider; -import net.ess3.provider.ContainerProvider; -import net.ess3.provider.FormattedCommandAliasProvider; -import net.ess3.provider.ItemUnbreakableProvider; -import net.ess3.provider.KnownCommandsProvider; -import net.ess3.provider.MaterialTagProvider; -import net.ess3.provider.PersistentDataProvider; -import net.ess3.provider.SerializationProvider; -import net.ess3.provider.ServerStateProvider; -import net.ess3.provider.SignDataProvider; -import net.ess3.provider.SpawnerBlockProvider; -import net.ess3.provider.SpawnerItemProvider; -import net.ess3.provider.SyncCommandsProvider; -import net.ess3.provider.WorldInfoProvider; import net.essentialsx.api.v2.services.BalanceTop; import net.essentialsx.api.v2.services.mail.MailService; import org.bukkit.Server; @@ -140,33 +126,7 @@ public interface IEssentials extends Plugin { Iterable getOnlineUsers(); - SpawnerItemProvider getSpawnerItemProvider(); - - SpawnerBlockProvider getSpawnerBlockProvider(); - - ServerStateProvider getServerStateProvider(); - - MaterialTagProvider getMaterialTagProvider(); - - ContainerProvider getContainerProvider(); - - KnownCommandsProvider getKnownCommandsProvider(); - - SerializationProvider getSerializationProvider(); - - FormattedCommandAliasProvider getFormattedCommandAliasProvider(); - - SyncCommandsProvider getSyncCommandsProvider(); - - PersistentDataProvider getPersistentDataProvider(); - - ReflOnlineModeProvider getOnlineModeProvider(); - - ItemUnbreakableProvider getItemUnbreakableProvider(); - - WorldInfoProvider getWorldInfoProvider(); - - SignDataProvider getSignDataProvider(); - PluginCommand getPluginCommand(String cmd); + + ProviderFactory getProviders(); } diff --git a/Essentials/src/main/java/com/earth2me/essentials/Kit.java b/Essentials/src/main/java/com/earth2me/essentials/Kit.java index e072fece091..d6261add871 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/Kit.java +++ b/Essentials/src/main/java/com/earth2me/essentials/Kit.java @@ -11,6 +11,7 @@ import com.earth2me.essentials.utils.NumberUtil; import net.ess3.api.IEssentials; import net.ess3.api.events.KitClaimEvent; +import net.ess3.provider.SerializationProvider; import org.bukkit.Bukkit; import org.bukkit.Material; import org.bukkit.inventory.ItemStack; @@ -191,11 +192,11 @@ public boolean expandItems(final User user, final List items) throws Exc final ItemStack stack; if (kitItem.startsWith("@")) { - if (ess.getSerializationProvider() == null) { + if (ess.getProviders().get(SerializationProvider.class) == null) { ess.getLogger().log(Level.WARNING, tl("kitError3", kitName, user.getName())); continue; } - stack = ess.getSerializationProvider().deserializeItem(Base64Coder.decodeLines(kitItem.substring(1))); + stack = ess.getProviders().get(SerializationProvider.class).deserializeItem(Base64Coder.decodeLines(kitItem.substring(1))); } else { final String[] parts = kitItem.split(" +"); final ItemStack parseStack = ess.getItemDb().get(parts[0], parts.length > 1 ? Integer.parseInt(parts[1]) : 1); diff --git a/Essentials/src/main/java/com/earth2me/essentials/MetaItemStack.java b/Essentials/src/main/java/com/earth2me/essentials/MetaItemStack.java index d1edb3e028c..e78dbc830d7 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/MetaItemStack.java +++ b/Essentials/src/main/java/com/earth2me/essentials/MetaItemStack.java @@ -10,6 +10,7 @@ import com.earth2me.essentials.utils.VersionUtil; import com.google.common.base.Joiner; import net.ess3.api.IEssentials; +import net.ess3.provider.ItemUnbreakableProvider; import org.bukkit.Color; import org.bukkit.DyeColor; import org.bukkit.FireworkEffect; @@ -684,7 +685,7 @@ private boolean hasMetaPermission(final User user, final String metaPerm, final private void setUnbreakable(final IEssentials ess, final ItemStack is, final boolean unbreakable) { final ItemMeta meta = is.getItemMeta(); - ess.getItemUnbreakableProvider().setUnbreakable(meta, unbreakable); + ess.getProviders().get(ItemUnbreakableProvider.class).setUnbreakable(meta, unbreakable); is.setItemMeta(meta); } } diff --git a/Essentials/src/main/java/com/earth2me/essentials/ProviderFactory.java b/Essentials/src/main/java/com/earth2me/essentials/ProviderFactory.java new file mode 100644 index 00000000000..5081d1728f8 --- /dev/null +++ b/Essentials/src/main/java/com/earth2me/essentials/ProviderFactory.java @@ -0,0 +1,118 @@ +package com.earth2me.essentials; + +import io.papermc.lib.PaperLib; +import net.ess3.provider.Provider; +import net.essentialsx.providers.ProviderData; +import net.essentialsx.providers.ProviderTest; +import org.bukkit.plugin.Plugin; + +import java.lang.reflect.Constructor; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.logging.Level; + +public class ProviderFactory { + private final Map, Provider> providers = new HashMap<>(); + private final Map, List>> registeredProviders = new HashMap<>(); + private final Essentials essentials; + + public ProviderFactory(final Essentials essentials) { + this.essentials = essentials; + } + + public

P get(final Class

providerClass) { + if (!this.providers.containsKey(providerClass)) { + return null; + } + //noinspection unchecked + return (P) providers.get(providerClass); + } + + @SafeVarargs + public final void registerProvider(final Class... toRegister) { + for (final Class provider : toRegister) { + final Class superclass = provider.getInterfaces().length > 0 ? provider.getInterfaces()[0] : provider.getSuperclass(); + if (Provider.class.isAssignableFrom(superclass)) { + //noinspection unchecked + registeredProviders.computeIfAbsent((Class) superclass, k -> new ArrayList<>()).add(provider); + if (essentials.getSettings().isDebug()) { + essentials.getLogger().info("Registered provider " + provider.getSimpleName() + " for " + superclass.getSimpleName()); + } + } + } + } + + public void finalizeRegistration() { + for (final Map.Entry, List>> entry : registeredProviders.entrySet()) { + final Class providerClass = entry.getKey(); + Class highestProvider = null; + ProviderData highestProviderData = null; + int highestWeight = -1; + providerLoop: + for (final Class provider : entry.getValue()) { + try { + final ProviderData providerData = provider.getAnnotation(ProviderData.class); + if (providerData.weight() > highestWeight) { + for (final Method method : provider.getMethods()) { + if (method.isAnnotationPresent(ProviderTest.class)) { + final Boolean result = (Boolean) method.invoke(null); + if (!result) { + continue providerLoop; + } + } + } + + highestWeight = providerData.weight(); + highestProvider = provider; + highestProviderData = providerData; + } + } catch (final Exception e) { + essentials.getLogger().log(Level.SEVERE, "Failed to initialize provider " + provider.getName(), e); + } + } + if (highestProvider == null) { + throw new IllegalStateException("No provider found for " + providerClass.getName()); + } + + essentials.getLogger().info("Selected " + highestProviderData.description() + " as the provider for " + providerClass.getSimpleName()); + providers.put(providerClass, getProviderInstance(highestProvider)); + } + registeredProviders.clear(); + } + + private C getProviderInstance(final Class provider) { + try { + final Constructor constructor = provider.getConstructors()[0]; + if (constructor.getParameterTypes().length == 0) { + //noinspection unchecked + return (C) constructor.newInstance(); + } + final Object[] args = new Object[constructor.getParameterTypes().length]; + + for (int i = 0; i < args.length; i++) { + final Class paramType = constructor.getParameterTypes()[i]; + if (paramType.isAssignableFrom(Plugin.class)) { + args[i] = essentials; + } else if (paramType.isAssignableFrom(boolean.class)) { + args[i] = PaperLib.isPaper(); + } else { + throw new IllegalArgumentException("Unsupported parameter type " + paramType.getName()); + } + } + + //noinspection unchecked + return (C) constructor.newInstance(args); + } catch (InstantiationException | IllegalAccessException | InvocationTargetException e) { + try { + return provider.getConstructor().newInstance(); + } catch (NoSuchMethodException | InvocationTargetException | InstantiationException | IllegalAccessException ex) { + e.printStackTrace(); + throw new RuntimeException(ex); + } + } + } +} diff --git a/Essentials/src/main/java/com/earth2me/essentials/RandomTeleport.java b/Essentials/src/main/java/com/earth2me/essentials/RandomTeleport.java index f020a2cca17..6742a9e5fb6 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/RandomTeleport.java +++ b/Essentials/src/main/java/com/earth2me/essentials/RandomTeleport.java @@ -6,6 +6,7 @@ import com.earth2me.essentials.utils.VersionUtil; import io.papermc.lib.PaperLib; import net.ess3.api.InvalidWorldException; +import net.ess3.provider.WorldInfoProvider; import org.bukkit.Location; import org.bukkit.World; import org.bukkit.block.Biome; @@ -177,7 +178,7 @@ private CompletableFuture calculateRandomLocation(final Location cente final Location location = new Location( center.getWorld(), center.getX() + offsetX, - ess.getWorldInfoProvider().getMaxHeight(center.getWorld()), + ess.getProviders().get(WorldInfoProvider.class).getMaxHeight(center.getWorld()), center.getZ() + offsetZ, 360 * RANDOM.nextFloat() - 180, 0 @@ -195,7 +196,7 @@ private CompletableFuture calculateRandomLocation(final Location cente // Returns an appropriate elevation for a given location in the nether, or -1 if none is found private double getNetherYAt(final Location location) { - for (int y = 32; y < ess.getWorldInfoProvider().getMaxHeight(location.getWorld()); ++y) { + for (int y = 32; y < ess.getProviders().get(WorldInfoProvider.class).getMaxHeight(location.getWorld()); ++y) { if (!LocationUtil.isBlockUnsafe(ess, location.getWorld(), location.getBlockX(), y, location.getBlockZ())) { return y; } @@ -204,7 +205,7 @@ private double getNetherYAt(final Location location) { } private boolean isValidRandomLocation(final Location location) { - return location.getBlockY() > ess.getWorldInfoProvider().getMinHeight(location.getWorld()) && !this.getExcludedBiomes().contains(location.getBlock().getBiome()); + return location.getBlockY() > ess.getProviders().get(WorldInfoProvider.class).getMinHeight(location.getWorld()) && !this.getExcludedBiomes().contains(location.getBlock().getBiome()); } public File getFile() { diff --git a/Essentials/src/main/java/com/earth2me/essentials/Settings.java b/Essentials/src/main/java/com/earth2me/essentials/Settings.java index c0b1c618245..d93ec84a86f 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/Settings.java +++ b/Essentials/src/main/java/com/earth2me/essentials/Settings.java @@ -13,6 +13,8 @@ import com.earth2me.essentials.utils.LocationUtil; import com.earth2me.essentials.utils.NumberUtil; import net.ess3.api.IEssentials; +import net.ess3.provider.KnownCommandsProvider; +import net.ess3.provider.SyncCommandsProvider; import org.bukkit.ChatColor; import org.bukkit.Material; import org.bukkit.command.Command; @@ -315,7 +317,7 @@ public boolean isVerboseCommandUsages() { private void _addAlternativeCommand(final String label, final Command current) { Command cmd = ess.getAlternativeCommandsHandler().getAlternative(label); if (cmd == null) { - for (final Map.Entry entry : ess.getKnownCommandsProvider().getKnownCommands().entrySet()) { + for (final Map.Entry entry : ess.getProviders().get(KnownCommandsProvider.class).getKnownCommands().entrySet()) { final String[] split = entry.getKey().split(":"); if (entry.getValue() != current && split[split.length - 1].equals(label)) { cmd = entry.getValue(); @@ -325,7 +327,7 @@ private void _addAlternativeCommand(final String label, final Command current) { } if (cmd != null) { - ess.getKnownCommandsProvider().getKnownCommands().put(label, cmd); + ess.getProviders().get(KnownCommandsProvider.class).getKnownCommands().put(label, cmd); } } @@ -680,13 +682,13 @@ public void reloadConfig() { playerCommands = _getPlayerCommands(); // This will be late loaded - if (ess.getKnownCommandsProvider() != null) { + if (ess.getProviders().get(KnownCommandsProvider.class) != null) { boolean mapModified = false; if (!disabledBukkitCommands.isEmpty()) { if (isDebug()) { ess.getLogger().log(Level.INFO, "Re-adding " + disabledBukkitCommands.size() + " disabled commands!"); } - ess.getKnownCommandsProvider().getKnownCommands().putAll(disabledBukkitCommands); + ess.getProviders().get(KnownCommandsProvider.class).getKnownCommands().putAll(disabledBukkitCommands); disabledBukkitCommands.clear(); mapModified = true; } @@ -698,7 +700,7 @@ public void reloadConfig() { if (isDebug()) { ess.getLogger().log(Level.INFO, "Attempting removal of " + effectiveAlias); } - final Command removed = ess.getKnownCommandsProvider().getKnownCommands().remove(effectiveAlias); + final Command removed = ess.getProviders().get(KnownCommandsProvider.class).getKnownCommands().remove(effectiveAlias); if (removed != null) { if (isDebug()) { ess.getLogger().log(Level.INFO, "Adding command " + effectiveAlias + " to disabled map!"); @@ -721,9 +723,9 @@ public void reloadConfig() { ess.getLogger().log(Level.INFO, "Syncing commands"); } if (reloadCount.get() < 2) { - ess.scheduleSyncDelayedTask(() -> ess.getSyncCommandsProvider().syncCommands()); + ess.scheduleSyncDelayedTask(() -> ess.getProviders().get(SyncCommandsProvider.class).syncCommands()); } else { - ess.getSyncCommandsProvider().syncCommands(); + ess.getProviders().get(SyncCommandsProvider.class).syncCommands(); } } } diff --git a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandanvil.java b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandanvil.java index f382c5dbf26..75a0c95a242 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandanvil.java +++ b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandanvil.java @@ -1,6 +1,7 @@ package com.earth2me.essentials.commands; import com.earth2me.essentials.User; +import net.ess3.provider.ContainerProvider; import org.bukkit.Server; import static com.earth2me.essentials.I18n.tl; @@ -13,11 +14,11 @@ public Commandanvil() { @Override protected void run(Server server, User user, String commandLabel, String[] args) throws Exception { - if (ess.getContainerProvider() == null) { + if (ess.getProviders().get(ContainerProvider.class) == null) { user.sendMessage(tl("unsupportedBrand")); return; } - ess.getContainerProvider().openAnvil(user.getBase()); + ess.getProviders().get(ContainerProvider.class).openAnvil(user.getBase()); } } diff --git a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandcartographytable.java b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandcartographytable.java index 74fc8c66690..bd1160928de 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandcartographytable.java +++ b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandcartographytable.java @@ -1,6 +1,7 @@ package com.earth2me.essentials.commands; import com.earth2me.essentials.User; +import net.ess3.provider.ContainerProvider; import org.bukkit.Server; import static com.earth2me.essentials.I18n.tl; @@ -13,11 +14,11 @@ public Commandcartographytable() { @Override public void run(final Server server, final User user, final String commandLabel, final String[] args) throws Exception { - if (ess.getContainerProvider() == null) { + if (ess.getProviders().get(ContainerProvider.class) == null) { user.sendMessage(tl("unsupportedBrand")); return; } - ess.getContainerProvider().openCartographyTable(user.getBase()); + ess.getProviders().get(ContainerProvider.class).openCartographyTable(user.getBase()); } } diff --git a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandcreatekit.java b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandcreatekit.java index 81d4519b5db..9272749ddf6 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandcreatekit.java +++ b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandcreatekit.java @@ -4,6 +4,7 @@ import com.earth2me.essentials.User; import com.earth2me.essentials.utils.DateUtil; import com.earth2me.essentials.utils.PasteUtil; +import net.ess3.provider.SerializationProvider; import org.bukkit.Material; import org.bukkit.Server; import org.bukkit.inventory.ItemStack; @@ -42,7 +43,7 @@ public void run(final Server server, final User user, final String commandLabel, boolean useSerializationProvider = ess.getSettings().isUseBetterKits(); - if (useSerializationProvider && ess.getSerializationProvider() == null) { + if (useSerializationProvider && ess.getProviders().get(SerializationProvider.class) == null) { ess.showError(user.getSource(), new Exception(tl("createKitUnsupported")), commandLabel); useSerializationProvider = false; } @@ -51,7 +52,7 @@ public void run(final Server server, final User user, final String commandLabel, if (is != null && is.getType() != null && is.getType() != Material.AIR) { final String serialized; if (useSerializationProvider) { - serialized = "@" + Base64Coder.encodeLines(ess.getSerializationProvider().serializeItem(is)); + serialized = "@" + Base64Coder.encodeLines(ess.getProviders().get(SerializationProvider.class).serializeItem(is)); } else { serialized = ess.getItemDb().serialize(is); } diff --git a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandessentials.java b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandessentials.java index ffa29c026c1..d9fc7ec4d76 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandessentials.java +++ b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandessentials.java @@ -20,6 +20,8 @@ import com.google.gson.JsonNull; import com.google.gson.JsonObject; import com.google.gson.JsonPrimitive; +import net.ess3.provider.KnownCommandsProvider; +import net.ess3.provider.OnlineModeProvider; import org.bukkit.Bukkit; import org.bukkit.ChatColor; import org.bukkit.Location; @@ -202,7 +204,7 @@ private void runDump(Server server, CommandSource sender, String commandLabel, S serverData.addProperty("bukkit-version", Bukkit.getBukkitVersion()); serverData.addProperty("server-version", Bukkit.getVersion()); serverData.addProperty("server-brand", Bukkit.getName()); - serverData.addProperty("online-mode", ess.getOnlineModeProvider().getOnlineModeString()); + serverData.addProperty("online-mode", ess.getProviders().get(OnlineModeProvider.class).getOnlineModeString()); final JsonObject supportStatus = new JsonObject(); final VersionUtil.SupportStatus status = VersionUtil.getServerSupportStatus(); supportStatus.addProperty("status", status.name()); @@ -272,7 +274,7 @@ private void runDump(Server server, CommandSource sender, String commandLabel, S final Plugin essDiscord = Bukkit.getPluginManager().getPlugin("EssentialsDiscord"); final Plugin essSpawn = Bukkit.getPluginManager().getPlugin("EssentialsSpawn"); - final Map knownCommandsCopy = new HashMap<>(ess.getKnownCommandsProvider().getKnownCommands()); + final Map knownCommandsCopy = new HashMap<>(ess.getProviders().get(KnownCommandsProvider.class).getKnownCommands()); final Map disabledCommandsCopy = new HashMap<>(ess.getAlternativeCommandsHandler().disabledCommands()); // Further operations will be heavy IO diff --git a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandgrindstone.java b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandgrindstone.java index 433dddd998d..6e3593c22c6 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandgrindstone.java +++ b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandgrindstone.java @@ -1,6 +1,7 @@ package com.earth2me.essentials.commands; import com.earth2me.essentials.User; +import net.ess3.provider.ContainerProvider; import org.bukkit.Server; import static com.earth2me.essentials.I18n.tl; @@ -13,11 +14,11 @@ public Commandgrindstone() { @Override public void run(final Server server, final User user, final String commandLabel, final String[] args) throws Exception { - if (ess.getContainerProvider() == null) { + if (ess.getProviders().get(ContainerProvider.class) == null) { user.sendMessage(tl("unsupportedBrand")); return; } - ess.getContainerProvider().openGrindstone(user.getBase()); + ess.getProviders().get(ContainerProvider.class).openGrindstone(user.getBase()); } } diff --git a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandhelp.java b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandhelp.java index aa64704c66b..121dc0f269a 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandhelp.java +++ b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandhelp.java @@ -8,6 +8,7 @@ import com.earth2me.essentials.textreader.TextInput; import com.earth2me.essentials.textreader.TextPager; import com.earth2me.essentials.utils.NumberUtil; +import net.ess3.provider.KnownCommandsProvider; import org.bukkit.Server; import org.bukkit.command.Command; import org.bukkit.command.PluginIdentifiableCommand; @@ -36,7 +37,7 @@ protected void run(final Server server, final User user, final String commandLab if (input.getLines().isEmpty()) { if (pageStr != null && pageStr.startsWith("/")) { final String cmd = pageStr.substring(1); - for (final Map.Entry knownCmd : ess.getKnownCommandsProvider().getKnownCommands().entrySet()) { + for (final Map.Entry knownCmd : ess.getProviders().get(KnownCommandsProvider.class).getKnownCommands().entrySet()) { if (knownCmd.getKey().equalsIgnoreCase(cmd)) { user.sendMessage(tl("commandHelpLine1", cmd)); user.sendMessage(tl("commandHelpLine2", knownCmd.getValue().getDescription())); diff --git a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandloom.java b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandloom.java index 2732b7f4f7e..7d064c2e5c9 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandloom.java +++ b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandloom.java @@ -1,6 +1,7 @@ package com.earth2me.essentials.commands; import com.earth2me.essentials.User; +import net.ess3.provider.ContainerProvider; import org.bukkit.Server; import static com.earth2me.essentials.I18n.tl; @@ -13,11 +14,11 @@ public Commandloom() { @Override public void run(final Server server, final User user, final String commandLabel, final String[] args) throws Exception { - if (ess.getContainerProvider() == null) { + if (ess.getProviders().get(ContainerProvider.class) == null) { user.sendMessage(tl("unsupportedBrand")); return; } - ess.getContainerProvider().openLoom(user.getBase()); + ess.getProviders().get(ContainerProvider.class).openLoom(user.getBase()); } } diff --git a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandsmithingtable.java b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandsmithingtable.java index df2e1e674d1..6765baacf77 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandsmithingtable.java +++ b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandsmithingtable.java @@ -1,6 +1,7 @@ package com.earth2me.essentials.commands; import com.earth2me.essentials.User; +import net.ess3.provider.ContainerProvider; import org.bukkit.Server; import static com.earth2me.essentials.I18n.tl; @@ -13,11 +14,11 @@ public Commandsmithingtable() { @Override protected void run(Server server, User user, String commandLabel, String[] args) throws Exception { - if (ess.getContainerProvider() == null) { + if (ess.getProviders().get(ContainerProvider.class) == null) { user.sendMessage(tl("unsupportedBrand")); return; } - ess.getContainerProvider().openSmithingTable(user.getBase()); + ess.getProviders().get(ContainerProvider.class).openSmithingTable(user.getBase()); } } diff --git a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandspawner.java b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandspawner.java index 601643c5968..6d3b50c12ab 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandspawner.java +++ b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandspawner.java @@ -61,7 +61,7 @@ protected void run(final Server server, final User user, final String commandLab final CreatureSpawner spawner = (CreatureSpawner) target.getBlock().getState(); spawner.setSpawnedType(mob.getType()); if (delay > 0) { - final SpawnerBlockProvider spawnerBlockProvider = ess.getSpawnerBlockProvider(); + final SpawnerBlockProvider spawnerBlockProvider = ess.getProviders().get(SpawnerBlockProvider.class); spawnerBlockProvider.setMinSpawnDelay(spawner, 1); spawnerBlockProvider.setMaxSpawnDelay(spawner, Integer.MAX_VALUE); spawnerBlockProvider.setMinSpawnDelay(spawner, delay); diff --git a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandstonecutter.java b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandstonecutter.java index 934ba3363d1..4b749548bc9 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandstonecutter.java +++ b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandstonecutter.java @@ -1,6 +1,7 @@ package com.earth2me.essentials.commands; import com.earth2me.essentials.User; +import net.ess3.provider.ContainerProvider; import org.bukkit.Server; import static com.earth2me.essentials.I18n.tl; @@ -13,11 +14,11 @@ public Commandstonecutter() { @Override public void run(final Server server, final User user, final String commandLabel, final String[] args) throws Exception { - if (ess.getContainerProvider() == null) { + if (ess.getProviders().get(ContainerProvider.class) == null) { user.sendMessage(tl("unsupportedBrand")); return; } - ess.getContainerProvider().openStonecutter(user.getBase()); + ess.getProviders().get(ContainerProvider.class).openStonecutter(user.getBase()); } } diff --git a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandtop.java b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandtop.java index f39b127896d..640122260b1 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandtop.java +++ b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandtop.java @@ -3,6 +3,7 @@ import com.earth2me.essentials.Trade; import com.earth2me.essentials.User; import com.earth2me.essentials.utils.LocationUtil; +import net.ess3.provider.WorldInfoProvider; import org.bukkit.Location; import org.bukkit.Server; import org.bukkit.event.player.PlayerTeleportEvent.TeleportCause; @@ -22,7 +23,7 @@ public void run(final Server server, final User user, final String commandLabel, final int topZ = user.getLocation().getBlockZ(); final float pitch = user.getLocation().getPitch(); final float yaw = user.getLocation().getYaw(); - final Location unsafe = new Location(user.getWorld(), topX, ess.getWorldInfoProvider().getMaxHeight(user.getWorld()), topZ, yaw, pitch); + final Location unsafe = new Location(user.getWorld(), topX, ess.getProviders().get(WorldInfoProvider.class).getMaxHeight(user.getWorld()), topZ, yaw, pitch); final Location safe = LocationUtil.getSafeDestination(ess, unsafe); final CompletableFuture future = new CompletableFuture<>(); future.thenAccept(success -> { diff --git a/Essentials/src/main/java/com/earth2me/essentials/commands/EssentialsCommand.java b/Essentials/src/main/java/com/earth2me/essentials/commands/EssentialsCommand.java index 8418dcfd335..c4f5e163506 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/commands/EssentialsCommand.java +++ b/Essentials/src/main/java/com/earth2me/essentials/commands/EssentialsCommand.java @@ -9,6 +9,7 @@ import com.google.common.collect.Lists; import com.google.common.collect.Maps; import net.ess3.api.IEssentials; +import net.ess3.provider.KnownCommandsProvider; import org.bukkit.ChatColor; import org.bukkit.Server; import org.bukkit.command.Command; @@ -277,7 +278,7 @@ protected List getMatchingItems(final String arg) { * Lists all commands. */ protected final List getCommands(Server server) { - final Map commandMap = Maps.newHashMap(this.ess.getKnownCommandsProvider().getKnownCommands()); + final Map commandMap = Maps.newHashMap(this.ess.getProviders().get(KnownCommandsProvider.class).getKnownCommands()); final List commands = Lists.newArrayListWithCapacity(commandMap.size()); for (final Command command : commandMap.values()) { if (!(command instanceof PluginIdentifiableCommand)) { diff --git a/Essentials/src/main/java/com/earth2me/essentials/items/FlatItemDb.java b/Essentials/src/main/java/com/earth2me/essentials/items/FlatItemDb.java index e8edab47dd5..6eb20f04a4e 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/items/FlatItemDb.java +++ b/Essentials/src/main/java/com/earth2me/essentials/items/FlatItemDb.java @@ -8,6 +8,8 @@ import com.google.gson.JsonObject; import com.google.gson.JsonParser; import net.ess3.api.IEssentials; +import net.ess3.provider.PersistentDataProvider; +import net.ess3.provider.SpawnerItemProvider; import org.bukkit.Material; import org.bukkit.entity.EntityType; import org.bukkit.inventory.ItemStack; @@ -149,8 +151,8 @@ public ItemStack get(String id, final boolean useResolvers) throws Exception { // setItemMeta to prevent a race condition final EntityType entity = data.getEntity(); if (entity != null && material.toString().contains("SPAWNER")) { - ess.getSpawnerItemProvider().setEntityType(stack, entity); - ess.getPersistentDataProvider().set(stack, "convert", "true"); + ess.getProviders().get(SpawnerItemProvider.class).setEntityType(stack, entity); + ess.getProviders().get(PersistentDataProvider.class).set(stack, "convert", "true"); } return stack; @@ -208,7 +210,7 @@ private ItemData lookup(final ItemStack item) { final PotionData potion = ((PotionMeta) item.getItemMeta()).getBasePotionData(); return new ItemData(type, potion); } else if (type.toString().contains("SPAWNER")) { - final EntityType entity = ess.getSpawnerItemProvider().getEntityType(item); + final EntityType entity = ess.getProviders().get(SpawnerItemProvider.class).getEntityType(item); return new ItemData(type, entity); } else { return new ItemData(type); diff --git a/Essentials/src/main/java/com/earth2me/essentials/items/LegacyItemDb.java b/Essentials/src/main/java/com/earth2me/essentials/items/LegacyItemDb.java index 4782449c3a6..d7d229150a2 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/items/LegacyItemDb.java +++ b/Essentials/src/main/java/com/earth2me/essentials/items/LegacyItemDb.java @@ -6,6 +6,10 @@ import com.earth2me.essentials.utils.StringUtil; import com.earth2me.essentials.utils.VersionUtil; import net.ess3.api.IEssentials; +import net.ess3.provider.PersistentDataProvider; +import net.ess3.provider.PotionMetaProvider; +import net.ess3.provider.SpawnEggProvider; +import net.ess3.provider.SpawnerItemProvider; import org.bukkit.Material; import org.bukkit.entity.EntityType; import org.bukkit.inventory.ItemStack; @@ -188,8 +192,8 @@ public ItemStack get(final String id, final boolean useResolvers) throws Excepti if (mat == MOB_SPAWNER) { if (metaData == 0) metaData = EntityType.PIG.getTypeId(); try { - retval = ess.getSpawnerItemProvider().setEntityType(retval, EntityType.fromId(metaData)); - ess.getPersistentDataProvider().set(retval, "convert", "true"); + retval = ess.getProviders().get(SpawnerItemProvider.class).setEntityType(retval, EntityType.fromId(metaData)); + ess.getProviders().get(PersistentDataProvider.class).set(retval, "convert", "true"); } catch (final IllegalArgumentException e) { throw new Exception("Can't spawn entity ID " + metaData + " from mob spawners."); } @@ -200,10 +204,10 @@ public ItemStack get(final String id, final boolean useResolvers) throws Excepti } catch (final IllegalArgumentException e) { throw new Exception("Can't spawn entity ID " + metaData + " from spawn eggs."); } - retval = ess.getSpawnEggProvider().createEggItem(type); + retval = ess.getProviders().get(SpawnEggProvider.class).createEggItem(type); } else if (mat.name().endsWith("POTION") && VersionUtil.getServerBukkitVersion().isLowerThan(VersionUtil.v1_11_R01)) { // Only apply this to pre-1.11 as items.csv might only work in 1.11 - retval = ess.getPotionMetaProvider().createPotionItem(mat, metaData); + retval = ess.getProviders().get(PotionMetaProvider.class).createPotionItem(mat, metaData); } else { retval.setDurability(metaData); } diff --git a/Essentials/src/main/java/com/earth2me/essentials/signs/EssentialsSign.java b/Essentials/src/main/java/com/earth2me/essentials/signs/EssentialsSign.java index cb0aaaf96b2..fb4c9483e95 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/signs/EssentialsSign.java +++ b/Essentials/src/main/java/com/earth2me/essentials/signs/EssentialsSign.java @@ -13,6 +13,7 @@ import net.ess3.api.events.SignBreakEvent; import net.ess3.api.events.SignCreateEvent; import net.ess3.api.events.SignInteractEvent; +import net.ess3.provider.SignDataProvider; import org.bukkit.ChatColor; import org.bukkit.Material; import org.bukkit.block.Block; @@ -163,24 +164,24 @@ public void setOwner(final IEssentials ess, final User user, final ISign signPro } public void setOwnerData(final IEssentials ess, final User user, final ISign signProvider) { - if (ess.getSignDataProvider() == null) { + if (ess.getProviders().get(SignDataProvider.class) == null) { return; } final Sign sign = (Sign) signProvider.getBlock().getState(); - ess.getSignDataProvider().setSignData(sign, SIGN_OWNER_KEY, user.getUUID().toString()); + ess.getProviders().get(SignDataProvider.class).setSignData(sign, SIGN_OWNER_KEY, user.getUUID().toString()); } public boolean isOwner(final IEssentials ess, final User user, final ISign signProvider, final int nameIndex, final String namePrefix) { final Sign sign = (Sign) signProvider.getBlock().getState(); - if (ess.getSignDataProvider() == null || ess.getSignDataProvider().getSignData(sign, SIGN_OWNER_KEY) == null) { + if (ess.getProviders().get(SignDataProvider.class) == null || ess.getProviders().get(SignDataProvider.class).getSignData(sign, SIGN_OWNER_KEY) == null) { final boolean isLegacyOwner = FormatUtil.stripFormat(signProvider.getLine(nameIndex)).equalsIgnoreCase(getUsername(user)); - if (ess.getSignDataProvider() != null && isLegacyOwner) { - ess.getSignDataProvider().setSignData(sign, SIGN_OWNER_KEY, user.getUUID().toString()); + if (ess.getProviders().get(SignDataProvider.class) != null && isLegacyOwner) { + ess.getProviders().get(SignDataProvider.class).setSignData(sign, SIGN_OWNER_KEY, user.getUUID().toString()); } return isLegacyOwner; } - if (user.getUUID().toString().equals(ess.getSignDataProvider().getSignData(sign, SIGN_OWNER_KEY))) { + if (user.getUUID().toString().equals(ess.getProviders().get(SignDataProvider.class).getSignData(sign, SIGN_OWNER_KEY))) { signProvider.setLine(nameIndex, namePrefix + getUsername(user)); return true; } diff --git a/Essentials/src/main/java/com/earth2me/essentials/signs/SignAnvil.java b/Essentials/src/main/java/com/earth2me/essentials/signs/SignAnvil.java index 09b9b77ae44..080f07ce34b 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/signs/SignAnvil.java +++ b/Essentials/src/main/java/com/earth2me/essentials/signs/SignAnvil.java @@ -2,6 +2,7 @@ import com.earth2me.essentials.User; import net.ess3.api.IEssentials; +import net.ess3.provider.ContainerProvider; import static com.earth2me.essentials.I18n.tl; @@ -12,7 +13,7 @@ public SignAnvil() { @Override protected boolean onSignCreate(final ISign sign, final User player, final String username, final IEssentials ess) { - if (ess.getContainerProvider() == null) { + if (ess.getProviders().get(ContainerProvider.class) == null) { player.sendMessage(tl("unsupportedBrand")); return false; } @@ -21,7 +22,7 @@ protected boolean onSignCreate(final ISign sign, final User player, final String @Override protected boolean onSignInteract(final ISign sign, final User player, final String username, final IEssentials ess) { - ess.getContainerProvider().openAnvil(player.getBase()); + ess.getProviders().get(ContainerProvider.class).openAnvil(player.getBase()); return true; } } diff --git a/Essentials/src/main/java/com/earth2me/essentials/signs/SignCartography.java b/Essentials/src/main/java/com/earth2me/essentials/signs/SignCartography.java index c5aaa3ed411..5186f559e81 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/signs/SignCartography.java +++ b/Essentials/src/main/java/com/earth2me/essentials/signs/SignCartography.java @@ -2,6 +2,7 @@ import com.earth2me.essentials.User; import net.ess3.api.IEssentials; +import net.ess3.provider.ContainerProvider; import static com.earth2me.essentials.I18n.tl; @@ -12,7 +13,7 @@ public SignCartography() { @Override protected boolean onSignCreate(final ISign sign, final User player, final String username, final IEssentials ess) { - if (ess.getContainerProvider() == null) { + if (ess.getProviders().get(ContainerProvider.class) == null) { player.sendMessage(tl("unsupportedBrand")); return false; } @@ -21,7 +22,7 @@ protected boolean onSignCreate(final ISign sign, final User player, final String @Override protected boolean onSignInteract(final ISign sign, final User player, final String username, final IEssentials ess) { - ess.getContainerProvider().openCartographyTable(player.getBase()); + ess.getProviders().get(ContainerProvider.class).openCartographyTable(player.getBase()); return true; } } diff --git a/Essentials/src/main/java/com/earth2me/essentials/signs/SignEnchant.java b/Essentials/src/main/java/com/earth2me/essentials/signs/SignEnchant.java index 0b90a41c7e2..ec86e9df04d 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/signs/SignEnchant.java +++ b/Essentials/src/main/java/com/earth2me/essentials/signs/SignEnchant.java @@ -22,7 +22,7 @@ public SignEnchant() { protected boolean onSignCreate(final ISign sign, final User player, final String username, final IEssentials ess) throws SignException, ChargeException { final ItemStack stack; final String itemName = sign.getLine(1); - final MaterialTagProvider tagProvider = ess.getMaterialTagProvider(); + final MaterialTagProvider tagProvider = ess.getProviders().get(MaterialTagProvider.class); try { stack = itemName.equals("*") || itemName.equalsIgnoreCase("any") || (tagProvider != null && tagProvider.tagExists(itemName)) ? null : getItemStack(sign.getLine(1), 1, ess); } catch (final SignException e) { @@ -67,7 +67,7 @@ protected boolean onSignCreate(final ISign sign, final User player, final String @Override protected boolean onSignInteract(final ISign sign, final User player, final String username, final IEssentials ess) throws SignException, ChargeException { final ItemStack playerHand = player.getBase().getItemInHand(); - final MaterialTagProvider tagProvider = ess.getMaterialTagProvider(); + final MaterialTagProvider tagProvider = ess.getProviders().get(MaterialTagProvider.class); final String itemName = sign.getLine(1); final ItemStack search = itemName.equals("*") || itemName.equalsIgnoreCase("any") || (tagProvider != null && tagProvider.tagExists(itemName) && tagProvider.isTagged(itemName, playerHand.getType())) ? null : getItemStack(itemName, 1, ess); final Trade charge = getTrade(sign, 3, ess); diff --git a/Essentials/src/main/java/com/earth2me/essentials/signs/SignGrindstone.java b/Essentials/src/main/java/com/earth2me/essentials/signs/SignGrindstone.java index 001d94b6258..4c52a2aa20e 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/signs/SignGrindstone.java +++ b/Essentials/src/main/java/com/earth2me/essentials/signs/SignGrindstone.java @@ -2,6 +2,7 @@ import com.earth2me.essentials.User; import net.ess3.api.IEssentials; +import net.ess3.provider.ContainerProvider; import static com.earth2me.essentials.I18n.tl; @@ -12,7 +13,7 @@ public SignGrindstone() { @Override protected boolean onSignCreate(final ISign sign, final User player, final String username, final IEssentials ess) { - if (ess.getContainerProvider() == null) { + if (ess.getProviders().get(ContainerProvider.class) == null) { player.sendMessage(tl("unsupportedBrand")); return false; } @@ -21,7 +22,7 @@ protected boolean onSignCreate(final ISign sign, final User player, final String @Override protected boolean onSignInteract(final ISign sign, final User player, final String username, final IEssentials ess) { - ess.getContainerProvider().openGrindstone(player.getBase()); + ess.getProviders().get(ContainerProvider.class).openGrindstone(player.getBase()); return true; } } diff --git a/Essentials/src/main/java/com/earth2me/essentials/signs/SignLoom.java b/Essentials/src/main/java/com/earth2me/essentials/signs/SignLoom.java index d2531b5176a..c2de03f0de0 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/signs/SignLoom.java +++ b/Essentials/src/main/java/com/earth2me/essentials/signs/SignLoom.java @@ -2,6 +2,7 @@ import com.earth2me.essentials.User; import net.ess3.api.IEssentials; +import net.ess3.provider.ContainerProvider; import static com.earth2me.essentials.I18n.tl; @@ -12,7 +13,7 @@ public SignLoom() { @Override protected boolean onSignCreate(final ISign sign, final User player, final String username, final IEssentials ess) { - if (ess.getContainerProvider() == null) { + if (ess.getProviders().get(ContainerProvider.class) == null) { player.sendMessage(tl("unsupportedBrand")); return false; } @@ -21,7 +22,7 @@ protected boolean onSignCreate(final ISign sign, final User player, final String @Override protected boolean onSignInteract(final ISign sign, final User player, final String username, final IEssentials ess) { - ess.getContainerProvider().openLoom(player.getBase()); + ess.getProviders().get(ContainerProvider.class).openLoom(player.getBase()); return true; } } diff --git a/Essentials/src/main/java/com/earth2me/essentials/signs/SignSmithing.java b/Essentials/src/main/java/com/earth2me/essentials/signs/SignSmithing.java index 9debfbe80e0..d76c85cc486 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/signs/SignSmithing.java +++ b/Essentials/src/main/java/com/earth2me/essentials/signs/SignSmithing.java @@ -2,6 +2,7 @@ import com.earth2me.essentials.User; import net.ess3.api.IEssentials; +import net.ess3.provider.ContainerProvider; import static com.earth2me.essentials.I18n.tl; @@ -12,7 +13,7 @@ public SignSmithing() { @Override protected boolean onSignCreate(final ISign sign, final User player, final String username, final IEssentials ess) { - if (ess.getContainerProvider() == null) { + if (ess.getProviders().get(ContainerProvider.class) == null) { player.sendMessage(tl("unsupportedBrand")); return false; } @@ -21,7 +22,7 @@ protected boolean onSignCreate(final ISign sign, final User player, final String @Override protected boolean onSignInteract(final ISign sign, final User player, final String username, final IEssentials ess) { - ess.getContainerProvider().openSmithingTable(player.getBase()); + ess.getProviders().get(ContainerProvider.class).openSmithingTable(player.getBase()); return true; } } diff --git a/Essentials/src/main/java/com/earth2me/essentials/textreader/HelpInput.java b/Essentials/src/main/java/com/earth2me/essentials/textreader/HelpInput.java index 3fb835b8b72..ab0c1a6e0a0 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/textreader/HelpInput.java +++ b/Essentials/src/main/java/com/earth2me/essentials/textreader/HelpInput.java @@ -4,6 +4,7 @@ import com.google.common.collect.HashMultimap; import com.google.common.collect.Multimap; import net.ess3.api.IEssentials; +import net.ess3.provider.KnownCommandsProvider; import org.bukkit.command.Command; import org.bukkit.command.PluginIdentifiableCommand; import org.bukkit.plugin.Plugin; @@ -33,7 +34,7 @@ public HelpInput(final User user, final String match, final IEssentials ess) { } final Multimap pluginCommands = HashMultimap.create(); - for (final Command command : ess.getKnownCommandsProvider().getKnownCommands().values()) { + for (final Command command : ess.getProviders().get(KnownCommandsProvider.class).getKnownCommands().values()) { if (!(command instanceof PluginIdentifiableCommand)) { continue; } diff --git a/Essentials/src/main/java/com/earth2me/essentials/utils/CommandMapUtil.java b/Essentials/src/main/java/com/earth2me/essentials/utils/CommandMapUtil.java index 287da28c4c6..2daa0cae1b7 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/utils/CommandMapUtil.java +++ b/Essentials/src/main/java/com/earth2me/essentials/utils/CommandMapUtil.java @@ -6,6 +6,7 @@ import com.google.gson.JsonObject; import com.google.gson.JsonPrimitive; import net.ess3.api.IEssentials; +import net.ess3.provider.FormattedCommandAliasProvider; import org.bukkit.command.Command; import org.bukkit.command.FormattedCommandAlias; import org.bukkit.command.PluginCommand; @@ -60,7 +61,7 @@ public static JsonObject toJson(IEssentials ess, Command value) { } else if (value instanceof FormattedCommandAlias) { json.addProperty("source", "commands.yml"); final JsonArray formatStrings = new JsonArray(); - for (final String entry : ess.getFormattedCommandAliasProvider().getFormatStrings((FormattedCommandAlias) value)) { + for (final String entry : ess.getProviders().get(FormattedCommandAliasProvider.class).getFormatStrings((FormattedCommandAlias) value)) { formatStrings.add(new JsonPrimitive(entry)); } json.add("bukkit_aliases", formatStrings); diff --git a/Essentials/src/main/java/com/earth2me/essentials/utils/LocationUtil.java b/Essentials/src/main/java/com/earth2me/essentials/utils/LocationUtil.java index 729caac394d..ea4557b2a22 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/utils/LocationUtil.java +++ b/Essentials/src/main/java/com/earth2me/essentials/utils/LocationUtil.java @@ -2,6 +2,7 @@ import com.earth2me.essentials.IEssentials; import net.ess3.api.IUser; +import net.ess3.provider.WorldInfoProvider; import org.bukkit.GameMode; import org.bukkit.Location; import org.bukkit.Material; @@ -109,7 +110,7 @@ public static Location getTarget(final LivingEntity entity, final int maxDistanc } public static boolean isBlockAboveAir(IEssentials ess, final World world, final int x, final int y, final int z) { - return y > ess.getWorldInfoProvider().getMaxHeight(world) || HOLLOW_MATERIALS.contains(world.getBlockAt(x, y - 1, z).getType()); + return y > ess.getProviders().get(WorldInfoProvider.class).getMaxHeight(world) || HOLLOW_MATERIALS.contains(world.getBlockAt(x, y - 1, z).getType()); } public static boolean isBlockOutsideWorldBorder(final World world, final int x, final int z) { @@ -215,9 +216,9 @@ public static Location getSafeDestination(IEssentials ess, final Location loc) t throw new Exception(tl("destinationNotSet")); } final World world = loc.getWorld(); - final int worldMinY = ess.getWorldInfoProvider().getMinHeight(world); - final int worldLogicalY = ess.getWorldInfoProvider().getLogicalHeight(world); - final int worldMaxY = loc.getBlockY() < worldLogicalY ? worldLogicalY : ess.getWorldInfoProvider().getMaxHeight(world); + final int worldMinY = ess.getProviders().get(WorldInfoProvider.class).getMinHeight(world); + final int worldLogicalY = ess.getProviders().get(WorldInfoProvider.class).getLogicalHeight(world); + final int worldMaxY = loc.getBlockY() < worldLogicalY ? worldLogicalY : ess.getProviders().get(WorldInfoProvider.class).getMaxHeight(world); int x = loc.getBlockX(); int y = (int) Math.round(loc.getY()); int z = loc.getBlockZ(); @@ -280,7 +281,7 @@ public static boolean shouldFly(IEssentials ess, final Location loc) { final int z = loc.getBlockZ(); int count = 0; // Check whether more than 2 unsafe block are below player. - while (LocationUtil.isBlockUnsafe(ess, world, x, y, z) && y >= ess.getWorldInfoProvider().getMinHeight(world)) { + while (LocationUtil.isBlockUnsafe(ess, world, x, y, z) && y >= ess.getProviders().get(WorldInfoProvider.class).getMinHeight(world)) { y--; count++; if (count > 2) { @@ -289,7 +290,7 @@ public static boolean shouldFly(IEssentials ess, final Location loc) { } // If not then check if player is in the void - return y < ess.getWorldInfoProvider().getMinHeight(world); + return y < ess.getProviders().get(WorldInfoProvider.class).getMinHeight(world); } public static class Vector3D { diff --git a/Essentials/src/main/java/net/ess3/api/IEssentials.java b/Essentials/src/main/java/net/ess3/api/IEssentials.java index 92ebfe981d4..4344ea1cfde 100644 --- a/Essentials/src/main/java/net/ess3/api/IEssentials.java +++ b/Essentials/src/main/java/net/ess3/api/IEssentials.java @@ -1,8 +1,6 @@ package net.ess3.api; import com.earth2me.essentials.items.CustomItemResolver; -import net.ess3.provider.PotionMetaProvider; -import net.ess3.provider.SpawnEggProvider; import java.util.Collection; @@ -19,20 +17,6 @@ public interface IEssentials extends com.earth2me.essentials.IEssentials { */ Collection getVanishedPlayersNew(); - /** - * Get the spawn egg provider for the current platform. - * - * @return The current active spawn egg provider - */ - SpawnEggProvider getSpawnEggProvider(); - - /** - * Get the potion meta provider for the current platform. - * - * @return The current active potion meta provider - */ - PotionMetaProvider getPotionMetaProvider(); - /** * Get the {@link CustomItemResolver} that is currently in use. * diff --git a/providers/1_8Provider/src/main/java/net/ess3/provider/providers/LegacyItemUnbreakableProvider.java b/providers/1_8Provider/src/main/java/net/ess3/provider/providers/LegacyItemUnbreakableProvider.java index f4781514d77..ec1539ca0b2 100644 --- a/providers/1_8Provider/src/main/java/net/ess3/provider/providers/LegacyItemUnbreakableProvider.java +++ b/providers/1_8Provider/src/main/java/net/ess3/provider/providers/LegacyItemUnbreakableProvider.java @@ -1,16 +1,13 @@ package net.ess3.provider.providers; import net.ess3.provider.ItemUnbreakableProvider; +import net.essentialsx.providers.ProviderData; import org.bukkit.inventory.meta.ItemMeta; +@ProviderData(description = "Legacy Item Unbreakable Provider") public class LegacyItemUnbreakableProvider implements ItemUnbreakableProvider { @Override public void setUnbreakable(ItemMeta meta, boolean unbreakable) { meta.spigot().setUnbreakable(unbreakable); } - - @Override - public String getDescription() { - return "Legacy ItemMeta Unbreakable Provider"; - } } diff --git a/providers/BaseProviders/src/main/java/net/ess3/provider/MaterialTagProvider.java b/providers/BaseProviders/src/main/java/net/ess3/provider/MaterialTagProvider.java index aaf6a05effa..056132e668a 100644 --- a/providers/BaseProviders/src/main/java/net/ess3/provider/MaterialTagProvider.java +++ b/providers/BaseProviders/src/main/java/net/ess3/provider/MaterialTagProvider.java @@ -2,7 +2,7 @@ import org.bukkit.Material; -public interface MaterialTagProvider { +public interface MaterialTagProvider extends Provider { boolean tagExists(String tagName); boolean isTagged(String tagName, Material material); diff --git a/providers/BaseProviders/src/main/java/net/ess3/provider/OnlineModeProvider.java b/providers/BaseProviders/src/main/java/net/ess3/provider/OnlineModeProvider.java new file mode 100644 index 00000000000..664a26dbbb1 --- /dev/null +++ b/providers/BaseProviders/src/main/java/net/ess3/provider/OnlineModeProvider.java @@ -0,0 +1,5 @@ +package net.ess3.provider; + +public interface OnlineModeProvider extends Provider { + String getOnlineModeString(); +} diff --git a/providers/BaseProviders/src/main/java/net/ess3/provider/Provider.java b/providers/BaseProviders/src/main/java/net/ess3/provider/Provider.java index 5e3916ca8d1..e4100bdbe56 100644 --- a/providers/BaseProviders/src/main/java/net/ess3/provider/Provider.java +++ b/providers/BaseProviders/src/main/java/net/ess3/provider/Provider.java @@ -1,5 +1,4 @@ package net.ess3.provider; public interface Provider { - String getDescription(); } diff --git a/providers/BaseProviders/src/main/java/net/ess3/provider/providers/BasePotionDataProvider.java b/providers/BaseProviders/src/main/java/net/ess3/provider/providers/BasePotionDataProvider.java index 74b4592a57f..a21c5993bd6 100644 --- a/providers/BaseProviders/src/main/java/net/ess3/provider/providers/BasePotionDataProvider.java +++ b/providers/BaseProviders/src/main/java/net/ess3/provider/providers/BasePotionDataProvider.java @@ -2,6 +2,8 @@ import com.google.common.collect.ImmutableMap; import net.ess3.provider.PotionMetaProvider; +import net.essentialsx.providers.ProviderData; +import net.essentialsx.providers.ProviderTest; import org.bukkit.Material; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.PotionMeta; @@ -10,6 +12,7 @@ import java.util.Map; +@ProviderData(description = "1.9+ Potion Meta Provider", weight = 1) public class BasePotionDataProvider implements PotionMetaProvider { private static final Map damageValueToType = ImmutableMap.builder() .put(1, PotionType.REGEN) @@ -64,8 +67,13 @@ public ItemStack createPotionItem(final Material initial, final int effectId) { return potion; } - @Override - public String getDescription() { - return "1.9+ Potion Meta Provider"; + @ProviderTest + public static boolean test() { + try { + Class.forName("org.bukkit.potion.PotionData"); + return true; + } catch (final ClassNotFoundException ignored) { + return false; + } } } diff --git a/providers/BaseProviders/src/main/java/net/ess3/provider/providers/BlockMetaSpawnerItemProvider.java b/providers/BaseProviders/src/main/java/net/ess3/provider/providers/BlockMetaSpawnerItemProvider.java index 79023106023..fc8acbc20bc 100644 --- a/providers/BaseProviders/src/main/java/net/ess3/provider/providers/BlockMetaSpawnerItemProvider.java +++ b/providers/BaseProviders/src/main/java/net/ess3/provider/providers/BlockMetaSpawnerItemProvider.java @@ -1,12 +1,14 @@ package net.ess3.provider.providers; import net.ess3.provider.SpawnerItemProvider; +import net.essentialsx.providers.ProviderData; import org.bukkit.block.BlockState; import org.bukkit.block.CreatureSpawner; import org.bukkit.entity.EntityType; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.BlockStateMeta; +@ProviderData(description = "1.8.3+ Spawner Item Provider") public class BlockMetaSpawnerItemProvider implements SpawnerItemProvider { @Override public ItemStack setEntityType(final ItemStack is, final EntityType type) throws IllegalArgumentException { @@ -24,9 +26,4 @@ public EntityType getEntityType(final ItemStack is) throws IllegalArgumentExcept final CreatureSpawner bs = (CreatureSpawner) bsm.getBlockState(); return bs.getSpawnedType(); } - - @Override - public String getDescription() { - return "1.8.3+ Spawner Provider"; - } } diff --git a/providers/BaseProviders/src/main/java/net/ess3/provider/providers/BukkitCommandSendListenerProvider.java b/providers/BaseProviders/src/main/java/net/ess3/provider/providers/BukkitCommandSendListenerProvider.java index d3feffc687c..6cf3f2ee67e 100644 --- a/providers/BaseProviders/src/main/java/net/ess3/provider/providers/BukkitCommandSendListenerProvider.java +++ b/providers/BaseProviders/src/main/java/net/ess3/provider/providers/BukkitCommandSendListenerProvider.java @@ -17,9 +17,4 @@ public void onCommandSend(PlayerCommandSendEvent event) { final Predicate filter = filter(event.getPlayer()); event.getCommands().removeIf(filter); } - - @Override - public String getDescription() { - return "Bukkit synchronous command send listener"; - } } diff --git a/providers/BaseProviders/src/main/java/net/ess3/provider/providers/BukkitMaterialTagProvider.java b/providers/BaseProviders/src/main/java/net/ess3/provider/providers/BukkitMaterialTagProvider.java index a6f28f96894..567b837317c 100644 --- a/providers/BaseProviders/src/main/java/net/ess3/provider/providers/BukkitMaterialTagProvider.java +++ b/providers/BaseProviders/src/main/java/net/ess3/provider/providers/BukkitMaterialTagProvider.java @@ -1,6 +1,8 @@ package net.ess3.provider.providers; import net.ess3.provider.MaterialTagProvider; +import net.essentialsx.providers.ProviderData; +import net.essentialsx.providers.ProviderTest; import org.bukkit.Material; import org.bukkit.Tag; @@ -8,6 +10,7 @@ import java.util.HashMap; import java.util.Map; +@ProviderData(description = "Bukkit Material Tag Provider") public class BukkitMaterialTagProvider implements MaterialTagProvider { private final Map> stringToTagMap = new HashMap<>(); @@ -46,4 +49,14 @@ private Tag getTag(String tagName) { } return stringToTagMap.get(tagName); } + + @ProviderTest + public static boolean test() { + try { + Class.forName("org.bukkit.Tag"); + return true; + } catch (ClassNotFoundException ignored) { + return false; + } + } } diff --git a/providers/BaseProviders/src/main/java/net/ess3/provider/providers/BukkitSpawnerBlockProvider.java b/providers/BaseProviders/src/main/java/net/ess3/provider/providers/BukkitSpawnerBlockProvider.java index fd6e8c30e54..43494b2d132 100644 --- a/providers/BaseProviders/src/main/java/net/ess3/provider/providers/BukkitSpawnerBlockProvider.java +++ b/providers/BaseProviders/src/main/java/net/ess3/provider/providers/BukkitSpawnerBlockProvider.java @@ -1,8 +1,11 @@ package net.ess3.provider.providers; import net.ess3.provider.SpawnerBlockProvider; +import net.essentialsx.providers.ProviderData; +import net.essentialsx.providers.ProviderTest; import org.bukkit.block.CreatureSpawner; +@ProviderData(description = "1.12+ Spawner Block Provider", weight = 1) public class BukkitSpawnerBlockProvider implements SpawnerBlockProvider { @Override public void setMaxSpawnDelay(final CreatureSpawner spawner, final int delay) { @@ -14,8 +17,13 @@ public void setMinSpawnDelay(final CreatureSpawner spawner, final int delay) { spawner.setMinSpawnDelay(delay); } - @Override - public String getDescription() { - return "Bukkit 1.12+ provider"; + @ProviderTest + public static boolean test() { + try { + CreatureSpawner.class.getDeclaredMethod("setMaxSpawnDelay", int.class); + return true; + } catch (final NoSuchMethodException ignored) { + return false; + } } } diff --git a/providers/BaseProviders/src/main/java/net/ess3/provider/providers/FixedHeightWorldInfoProvider.java b/providers/BaseProviders/src/main/java/net/ess3/provider/providers/FixedHeightWorldInfoProvider.java index b4d4ffda6b6..59c81c4ecb0 100644 --- a/providers/BaseProviders/src/main/java/net/ess3/provider/providers/FixedHeightWorldInfoProvider.java +++ b/providers/BaseProviders/src/main/java/net/ess3/provider/providers/FixedHeightWorldInfoProvider.java @@ -1,14 +1,11 @@ package net.ess3.provider.providers; import net.ess3.provider.WorldInfoProvider; +import net.essentialsx.providers.ProviderData; import org.bukkit.World; +@ProviderData(description = "Fixed Height World Info Provider") public class FixedHeightWorldInfoProvider implements WorldInfoProvider { - @Override - public String getDescription() { - return "Fixed world info provider for pre-1.16"; - } - @Override public int getMaxHeight(World world) { // Method has existed since Beta 1.7 (yes, *beta*) diff --git a/providers/BaseProviders/src/main/java/net/ess3/provider/providers/FlatSpawnEggProvider.java b/providers/BaseProviders/src/main/java/net/ess3/provider/providers/FlatSpawnEggProvider.java index 794a4770701..8bf50aa5011 100644 --- a/providers/BaseProviders/src/main/java/net/ess3/provider/providers/FlatSpawnEggProvider.java +++ b/providers/BaseProviders/src/main/java/net/ess3/provider/providers/FlatSpawnEggProvider.java @@ -1,10 +1,13 @@ package net.ess3.provider.providers; import net.ess3.provider.SpawnEggProvider; +import net.essentialsx.providers.ProviderData; +import net.essentialsx.providers.ProviderTest; import org.bukkit.Material; import org.bukkit.entity.EntityType; import org.bukkit.inventory.ItemStack; +@ProviderData(description = "1.13+ Spawn Egg Provider", weight = 2) public class FlatSpawnEggProvider implements SpawnEggProvider { @Override public ItemStack createEggItem(final EntityType type) throws IllegalArgumentException { @@ -21,8 +24,14 @@ public EntityType getSpawnedType(final ItemStack eggItem) throws IllegalArgument throw new IllegalArgumentException("Not a spawn egg"); } - @Override - public String getDescription() { - return "1.13+ Flattening Spawn Egg Provider"; + @ProviderTest + public static boolean test() { + try { + //noinspection unused + final Material yourMother = Material.COW_SPAWN_EGG; + return true; + } catch (final Throwable ignored) { + return false; + } } } diff --git a/providers/BaseProviders/src/main/java/net/ess3/provider/providers/LegacyPotionMetaProvider.java b/providers/BaseProviders/src/main/java/net/ess3/provider/providers/LegacyPotionMetaProvider.java index 2ab157895dd..d2b1f35f221 100644 --- a/providers/BaseProviders/src/main/java/net/ess3/provider/providers/LegacyPotionMetaProvider.java +++ b/providers/BaseProviders/src/main/java/net/ess3/provider/providers/LegacyPotionMetaProvider.java @@ -1,10 +1,12 @@ package net.ess3.provider.providers; import net.ess3.provider.PotionMetaProvider; +import net.essentialsx.providers.ProviderData; import org.bukkit.Material; import org.bukkit.inventory.ItemStack; @SuppressWarnings("deprecation") +@ProviderData(description = "1.8 Potion Meta Provider") public class LegacyPotionMetaProvider implements PotionMetaProvider { @Override public ItemStack createPotionItem(final Material initial, final int effectId) { @@ -12,9 +14,4 @@ public ItemStack createPotionItem(final Material initial, final int effectId) { potion.setDurability((short) effectId); return potion; } - - @Override - public String getDescription() { - return "Legacy 1.8 Potion Meta Provider"; - } } diff --git a/providers/BaseProviders/src/main/java/net/ess3/provider/providers/LegacySpawnEggProvider.java b/providers/BaseProviders/src/main/java/net/ess3/provider/providers/LegacySpawnEggProvider.java index c16bee48fa2..3be3e6fb267 100644 --- a/providers/BaseProviders/src/main/java/net/ess3/provider/providers/LegacySpawnEggProvider.java +++ b/providers/BaseProviders/src/main/java/net/ess3/provider/providers/LegacySpawnEggProvider.java @@ -1,12 +1,14 @@ package net.ess3.provider.providers; import net.ess3.provider.SpawnEggProvider; +import net.essentialsx.providers.ProviderData; import org.bukkit.entity.EntityType; import org.bukkit.inventory.ItemStack; import org.bukkit.material.MaterialData; import org.bukkit.material.SpawnEgg; @SuppressWarnings("deprecation") +@ProviderData(description = "1.8 Spawn Egg Provider") public class LegacySpawnEggProvider implements SpawnEggProvider { @Override public ItemStack createEggItem(final EntityType type) throws IllegalArgumentException { @@ -21,9 +23,4 @@ public EntityType getSpawnedType(final ItemStack eggItem) throws IllegalArgument } throw new IllegalArgumentException("Item is missing data"); } - - @Override - public String getDescription() { - return "Legacy 1.8 Spawn Egg Provider"; - } } diff --git a/providers/BaseProviders/src/main/java/net/ess3/provider/providers/ModernDataWorldInfoProvider.java b/providers/BaseProviders/src/main/java/net/ess3/provider/providers/ModernDataWorldInfoProvider.java index 55e10f253aa..6d840c081db 100644 --- a/providers/BaseProviders/src/main/java/net/ess3/provider/providers/ModernDataWorldInfoProvider.java +++ b/providers/BaseProviders/src/main/java/net/ess3/provider/providers/ModernDataWorldInfoProvider.java @@ -1,14 +1,12 @@ package net.ess3.provider.providers; import net.ess3.provider.WorldInfoProvider; +import net.essentialsx.providers.ProviderData; +import net.essentialsx.providers.ProviderTest; import org.bukkit.World; +@ProviderData(description = "1.17.1+ World Info Provider", weight = 2) public class ModernDataWorldInfoProvider implements WorldInfoProvider { - @Override - public String getDescription() { - return "API world info provider for data-driven worldgen for 1.17.1+"; - } - @Override public int getMaxHeight(World world) { return world.getMaxHeight(); @@ -23,4 +21,14 @@ public int getLogicalHeight(World world) { public int getMinHeight(World world) { return world.getMinHeight(); } + + @ProviderTest + public static boolean test() { + try { + Class.forName("org.bukkit.generator.WorldInfo"); + return true; + } catch (final ClassNotFoundException ignored) { + return false; + } + } } diff --git a/providers/BaseProviders/src/main/java/net/ess3/provider/providers/ModernItemUnbreakableProvider.java b/providers/BaseProviders/src/main/java/net/ess3/provider/providers/ModernItemUnbreakableProvider.java index 74775dd9cda..de65a32a15c 100644 --- a/providers/BaseProviders/src/main/java/net/ess3/provider/providers/ModernItemUnbreakableProvider.java +++ b/providers/BaseProviders/src/main/java/net/ess3/provider/providers/ModernItemUnbreakableProvider.java @@ -1,16 +1,24 @@ package net.ess3.provider.providers; import net.ess3.provider.ItemUnbreakableProvider; +import net.essentialsx.providers.ProviderData; +import net.essentialsx.providers.ProviderTest; import org.bukkit.inventory.meta.ItemMeta; +@ProviderData(description = "1.11+ Item Unbreakable Provider", weight = 1) public class ModernItemUnbreakableProvider implements ItemUnbreakableProvider { @Override public void setUnbreakable(ItemMeta meta, boolean unbreakable) { meta.setUnbreakable(unbreakable); } - @Override - public String getDescription() { - return "1.11+ ItemMeta Unbreakable Provider"; + @ProviderTest + public static boolean test() { + try { + ItemMeta.class.getDeclaredMethod("setUnbreakable", boolean.class); + return true; + } catch (final NoSuchMethodException ignored) { + return false; + } } } diff --git a/providers/BaseProviders/src/main/java/net/ess3/provider/providers/ModernPersistentDataProvider.java b/providers/BaseProviders/src/main/java/net/ess3/provider/providers/ModernPersistentDataProvider.java index 7c3ebbedecb..d51d2204db2 100644 --- a/providers/BaseProviders/src/main/java/net/ess3/provider/providers/ModernPersistentDataProvider.java +++ b/providers/BaseProviders/src/main/java/net/ess3/provider/providers/ModernPersistentDataProvider.java @@ -1,6 +1,8 @@ package net.ess3.provider.providers; import net.ess3.provider.PersistentDataProvider; +import net.essentialsx.providers.ProviderData; +import net.essentialsx.providers.ProviderTest; import org.bukkit.NamespacedKey; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.ItemMeta; @@ -8,6 +10,7 @@ import org.bukkit.plugin.Plugin; @SuppressWarnings("ConstantConditions") +@ProviderData(description = "1.14.4+ Persistent Data Container Provider", weight = 1) public class ModernPersistentDataProvider implements PersistentDataProvider { private final Plugin plugin; @@ -44,8 +47,13 @@ public void remove(ItemStack itemStack, String key) { itemStack.getItemMeta().getPersistentDataContainer().remove(new NamespacedKey(plugin, key)); } - @Override - public String getDescription() { - return "1.14+ Persistent Data Container Provider"; + @ProviderTest + public static boolean test() { + try { + Class.forName("org.bukkit.persistence.PersistentDataHolder"); + return true; + } catch (final ClassNotFoundException ignored) { + return false; + } } } diff --git a/providers/BaseProviders/src/main/java/net/ess3/provider/providers/ModernSignDataProvider.java b/providers/BaseProviders/src/main/java/net/ess3/provider/providers/ModernSignDataProvider.java index 84687c0ed43..99afe040a16 100644 --- a/providers/BaseProviders/src/main/java/net/ess3/provider/providers/ModernSignDataProvider.java +++ b/providers/BaseProviders/src/main/java/net/ess3/provider/providers/ModernSignDataProvider.java @@ -1,11 +1,14 @@ package net.ess3.provider.providers; import net.ess3.provider.SignDataProvider; +import net.essentialsx.providers.ProviderData; +import net.essentialsx.providers.ProviderTest; import org.bukkit.NamespacedKey; import org.bukkit.block.Sign; import org.bukkit.persistence.PersistentDataType; import org.bukkit.plugin.Plugin; +@ProviderData(description = "1.14+ Sign Data Provider") public class ModernSignDataProvider implements SignDataProvider { private final Plugin plugin; @@ -36,8 +39,13 @@ public String getSignData(Sign sign, String key) { } } - @Override - public String getDescription() { - return "1.14+ Persistent Data Sign Provider"; + @ProviderTest + public static boolean test() { + try { + Class.forName("org.bukkit.block.TileState"); + return true; + } catch (ClassNotFoundException e) { + return false; + } } } diff --git a/providers/BaseProviders/src/main/java/net/essentialsx/providers/ProviderData.java b/providers/BaseProviders/src/main/java/net/essentialsx/providers/ProviderData.java new file mode 100644 index 00000000000..fc54309ee91 --- /dev/null +++ b/providers/BaseProviders/src/main/java/net/essentialsx/providers/ProviderData.java @@ -0,0 +1,14 @@ +package net.essentialsx.providers; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.TYPE) +public @interface ProviderData { + String description(); + + int weight() default 0; +} diff --git a/providers/BaseProviders/src/main/java/net/essentialsx/providers/ProviderTest.java b/providers/BaseProviders/src/main/java/net/essentialsx/providers/ProviderTest.java new file mode 100644 index 00000000000..099b88f6d9a --- /dev/null +++ b/providers/BaseProviders/src/main/java/net/essentialsx/providers/ProviderTest.java @@ -0,0 +1,11 @@ +package net.essentialsx.providers; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.METHOD) +public @interface ProviderTest { +} diff --git a/providers/NMSReflectionProvider/src/main/java/net/ess3/nms/refl/providers/ReflDataWorldInfoProvider.java b/providers/NMSReflectionProvider/src/main/java/net/ess3/nms/refl/providers/ReflDataWorldInfoProvider.java index f9ac85c8cc9..9f0e03d503b 100644 --- a/providers/NMSReflectionProvider/src/main/java/net/ess3/nms/refl/providers/ReflDataWorldInfoProvider.java +++ b/providers/NMSReflectionProvider/src/main/java/net/ess3/nms/refl/providers/ReflDataWorldInfoProvider.java @@ -1,14 +1,12 @@ package net.ess3.nms.refl.providers; import net.ess3.provider.WorldInfoProvider; +import net.essentialsx.providers.ProviderData; +import net.essentialsx.providers.ProviderTest; import org.bukkit.World; +@ProviderData(description = "Reflection World Info Provider", weight = 1) public class ReflDataWorldInfoProvider implements WorldInfoProvider { - @Override - public String getDescription() { - return "NMS world info provider for data-driven worldgen for 1.16.x"; - } - @Override public int getMaxHeight(World world) { // Method has existed since Beta 1.7 (yes, *beta*) @@ -28,4 +26,10 @@ public int getMinHeight(World world) { // Worlds could not go below 0 until Minecraft 1.16 return 0; } + + @ProviderTest + public static boolean test() { + // troll face + return false; + } } diff --git a/providers/NMSReflectionProvider/src/main/java/net/ess3/nms/refl/providers/ReflFormattedCommandAliasProvider.java b/providers/NMSReflectionProvider/src/main/java/net/ess3/nms/refl/providers/ReflFormattedCommandAliasProvider.java index e7563ca274a..1e3d9f6159e 100644 --- a/providers/NMSReflectionProvider/src/main/java/net/ess3/nms/refl/providers/ReflFormattedCommandAliasProvider.java +++ b/providers/NMSReflectionProvider/src/main/java/net/ess3/nms/refl/providers/ReflFormattedCommandAliasProvider.java @@ -2,6 +2,7 @@ import net.ess3.nms.refl.ReflUtil; import net.ess3.provider.FormattedCommandAliasProvider; +import net.essentialsx.providers.ProviderData; import org.bukkit.command.CommandSender; import org.bukkit.command.FormattedCommandAlias; @@ -12,13 +13,14 @@ import java.util.ArrayList; import java.util.List; +@ProviderData(description = "Reflection Formatted Command Alias Provider") public class ReflFormattedCommandAliasProvider implements FormattedCommandAliasProvider { private final boolean paper; private final Field formatStringsField; private final MethodHandle buildCommandMethodHandle; - public ReflFormattedCommandAliasProvider(boolean paper) { + public ReflFormattedCommandAliasProvider(final boolean paper) { this.paper = paper; final Class formattedCommandAliasClass; @@ -85,8 +87,4 @@ public String buildCommand(FormattedCommandAlias command, CommandSender sender, } } - @Override - public String getDescription() { - return "NMS Reflection Provider for FormattedCommandAlias methods"; - } } diff --git a/providers/NMSReflectionProvider/src/main/java/net/ess3/nms/refl/providers/ReflKnownCommandsProvider.java b/providers/NMSReflectionProvider/src/main/java/net/ess3/nms/refl/providers/ReflKnownCommandsProvider.java index 19c558d5669..7cd5167200d 100644 --- a/providers/NMSReflectionProvider/src/main/java/net/ess3/nms/refl/providers/ReflKnownCommandsProvider.java +++ b/providers/NMSReflectionProvider/src/main/java/net/ess3/nms/refl/providers/ReflKnownCommandsProvider.java @@ -2,6 +2,7 @@ import net.ess3.nms.refl.ReflUtil; import net.ess3.provider.KnownCommandsProvider; +import net.essentialsx.providers.ProviderData; import org.bukkit.Bukkit; import org.bukkit.Server; import org.bukkit.command.Command; @@ -11,6 +12,7 @@ import java.util.HashMap; import java.util.Map; +@ProviderData(description = "Reflection Known Commands Provider") public class ReflKnownCommandsProvider implements KnownCommandsProvider { private final Map knownCommands; @@ -25,6 +27,7 @@ public ReflKnownCommandsProvider() { final SimpleCommandMap simpleCommandMap = (SimpleCommandMap) commandMapField.get(Bukkit.getServer()); final Field knownCommandsField = ReflUtil.getFieldCached(SimpleCommandMap.class, "knownCommands"); if (knownCommandsField != null) { + //noinspection unchecked knownCommands = (Map) knownCommandsField.get(simpleCommandMap); } } @@ -40,9 +43,4 @@ public ReflKnownCommandsProvider() { public Map getKnownCommands() { return this.knownCommands; } - - @Override - public String getDescription() { - return "NMS Reflection Known Commands Provider"; - } } diff --git a/providers/NMSReflectionProvider/src/main/java/net/ess3/nms/refl/providers/ReflOnlineModeProvider.java b/providers/NMSReflectionProvider/src/main/java/net/ess3/nms/refl/providers/ReflOnlineModeProvider.java index ff61a7c9de1..2205fcc8650 100644 --- a/providers/NMSReflectionProvider/src/main/java/net/ess3/nms/refl/providers/ReflOnlineModeProvider.java +++ b/providers/NMSReflectionProvider/src/main/java/net/ess3/nms/refl/providers/ReflOnlineModeProvider.java @@ -1,13 +1,16 @@ package net.ess3.nms.refl.providers; import net.ess3.nms.refl.ReflUtil; +import net.ess3.provider.OnlineModeProvider; +import net.essentialsx.providers.ProviderData; import org.bukkit.Bukkit; import java.lang.invoke.MethodHandle; import java.lang.invoke.MethodHandles; import java.lang.invoke.MethodType; -public class ReflOnlineModeProvider { +@ProviderData(description = "Reflection Online Mode Provider") +public class ReflOnlineModeProvider implements OnlineModeProvider { private final MethodHandle spigotBungeeGetter; private final MethodHandle paperBungeeGetter; private final Object paperProxiesInstance; @@ -42,6 +45,7 @@ public ReflOnlineModeProvider() { this.fancyPaperCheck = fancyCheck; } + @Override public String getOnlineModeString() { if (spigotBungeeGetter == null) { return Bukkit.getOnlineMode() ? "Online Mode" : "Offline Mode"; @@ -53,7 +57,7 @@ public String getOnlineModeString() { } if (fancyPaperCheck) { - if ((boolean) paperBungeeGetter.invoke()) { + if ((boolean) (paperProxiesInstance != null ? paperBungeeGetter.invoke(paperProxiesInstance) : paperBungeeGetter.invoke())) { // Could be Velocity or Bungee, so do not specify. return "Proxy Mode"; } diff --git a/providers/NMSReflectionProvider/src/main/java/net/ess3/nms/refl/providers/ReflPersistentDataProvider.java b/providers/NMSReflectionProvider/src/main/java/net/ess3/nms/refl/providers/ReflPersistentDataProvider.java index 41fa62a008d..8ddd34e320f 100644 --- a/providers/NMSReflectionProvider/src/main/java/net/ess3/nms/refl/providers/ReflPersistentDataProvider.java +++ b/providers/NMSReflectionProvider/src/main/java/net/ess3/nms/refl/providers/ReflPersistentDataProvider.java @@ -2,6 +2,7 @@ import net.ess3.nms.refl.ReflUtil; import net.ess3.provider.PersistentDataProvider; +import net.essentialsx.providers.ProviderData; import org.bukkit.inventory.ItemStack; import org.bukkit.plugin.Plugin; @@ -15,6 +16,7 @@ * Stores persistent data on 1.8-1.13 in a manner that's consistent with PDC on 1.14+ to enable * seamless upgrades. */ +@ProviderData(description = "Reflection Persistent Data Container Provider") public class ReflPersistentDataProvider implements PersistentDataProvider { private static final String PDC_ROOT_TAG = "PublicBukkitValues"; private static final String ROOT_TAG = "tag"; @@ -123,9 +125,4 @@ public void remove(ItemStack itemStack, String key) { } catch (Throwable ignored) { } } - - @Override - public String getDescription() { - return "1.13 >= Persistent Data Container Provider"; - } } diff --git a/providers/NMSReflectionProvider/src/main/java/net/ess3/nms/refl/providers/ReflServerStateProvider.java b/providers/NMSReflectionProvider/src/main/java/net/ess3/nms/refl/providers/ReflServerStateProvider.java index 892346cf0f5..da03e57ad4a 100644 --- a/providers/NMSReflectionProvider/src/main/java/net/ess3/nms/refl/providers/ReflServerStateProvider.java +++ b/providers/NMSReflectionProvider/src/main/java/net/ess3/nms/refl/providers/ReflServerStateProvider.java @@ -2,11 +2,13 @@ import net.ess3.nms.refl.ReflUtil; import net.ess3.provider.ServerStateProvider; +import net.essentialsx.providers.ProviderData; import java.lang.invoke.MethodHandle; import java.lang.invoke.MethodHandles; import java.lang.invoke.MethodType; +@ProviderData(description = "Reflection Server State Provider") public class ReflServerStateProvider implements ServerStateProvider { private final Object nmsServer; private final MethodHandle nmsIsRunning; @@ -48,9 +50,4 @@ public boolean isStopping() { } return false; } - - @Override - public String getDescription() { - return "NMS Reflection Server State Provider"; - } } diff --git a/providers/NMSReflectionProvider/src/main/java/net/ess3/nms/refl/providers/ReflSpawnEggProvider.java b/providers/NMSReflectionProvider/src/main/java/net/ess3/nms/refl/providers/ReflSpawnEggProvider.java index 34b68f870c6..7ffeca32a52 100644 --- a/providers/NMSReflectionProvider/src/main/java/net/ess3/nms/refl/providers/ReflSpawnEggProvider.java +++ b/providers/NMSReflectionProvider/src/main/java/net/ess3/nms/refl/providers/ReflSpawnEggProvider.java @@ -2,9 +2,11 @@ import net.ess3.nms.refl.SpawnEggRefl; import net.ess3.provider.SpawnEggProvider; +import net.essentialsx.providers.ProviderData; import org.bukkit.entity.EntityType; import org.bukkit.inventory.ItemStack; +@ProviderData(description = "1.9-1.12.2 Spawn Egg Provider", weight = 1) public class ReflSpawnEggProvider implements SpawnEggProvider { @Override @@ -24,9 +26,4 @@ public EntityType getSpawnedType(final ItemStack eggItem) throws IllegalArgument throw new IllegalArgumentException(e.getMessage(), e.getCause()); } } - - @Override - public String getDescription() { - return "NMS Reflection Provider"; - } } diff --git a/providers/NMSReflectionProvider/src/main/java/net/ess3/nms/refl/providers/ReflSpawnerBlockProvider.java b/providers/NMSReflectionProvider/src/main/java/net/ess3/nms/refl/providers/ReflSpawnerBlockProvider.java index 96266474c57..cdfb73286d1 100644 --- a/providers/NMSReflectionProvider/src/main/java/net/ess3/nms/refl/providers/ReflSpawnerBlockProvider.java +++ b/providers/NMSReflectionProvider/src/main/java/net/ess3/nms/refl/providers/ReflSpawnerBlockProvider.java @@ -2,12 +2,14 @@ import net.ess3.nms.refl.ReflUtil; import net.ess3.provider.SpawnerBlockProvider; +import net.essentialsx.providers.ProviderData; import org.bukkit.block.CreatureSpawner; import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; +@ProviderData(description = "Reflection Spawner Block Provider") public class ReflSpawnerBlockProvider implements SpawnerBlockProvider { @Override public void setMaxSpawnDelay(final CreatureSpawner spawner, final int delay) { @@ -33,11 +35,6 @@ public void setMinSpawnDelay(final CreatureSpawner spawner, final int delay) { } } - @Override - public String getDescription() { - return "Reflection based provider"; - } - private Object getNMSSpawner(final CreatureSpawner spawner) { try { final Class craftWorld = ReflUtil.getOBCClass("CraftWorld"); diff --git a/providers/NMSReflectionProvider/src/main/java/net/ess3/nms/refl/providers/ReflSyncCommandsProvider.java b/providers/NMSReflectionProvider/src/main/java/net/ess3/nms/refl/providers/ReflSyncCommandsProvider.java index 6fc754df2bf..1ba7ef3bc7f 100644 --- a/providers/NMSReflectionProvider/src/main/java/net/ess3/nms/refl/providers/ReflSyncCommandsProvider.java +++ b/providers/NMSReflectionProvider/src/main/java/net/ess3/nms/refl/providers/ReflSyncCommandsProvider.java @@ -2,12 +2,14 @@ import net.ess3.nms.refl.ReflUtil; import net.ess3.provider.SyncCommandsProvider; +import net.essentialsx.providers.ProviderData; import org.bukkit.Bukkit; import java.lang.invoke.MethodHandle; import java.lang.invoke.MethodHandles; import java.lang.invoke.MethodType; +@ProviderData(description = "Reflection Sync Commands Provider") public class ReflSyncCommandsProvider implements SyncCommandsProvider { private final MethodHandle nmsSyncCommands; @@ -22,11 +24,6 @@ public ReflSyncCommandsProvider() { nmsSyncCommands = syncCommands; } - @Override - public String getDescription() { - return "NMS Reflection Sync Commands Provider"; - } - @Override public void syncCommands() { if (nmsSyncCommands != null) { diff --git a/providers/PaperProvider/src/main/java/net/ess3/provider/providers/PaperCommandSendListenerProvider.java b/providers/PaperProvider/src/main/java/net/ess3/provider/providers/PaperCommandSendListenerProvider.java index 1bc1a56e440..2eb391e16a0 100644 --- a/providers/PaperProvider/src/main/java/net/ess3/provider/providers/PaperCommandSendListenerProvider.java +++ b/providers/PaperProvider/src/main/java/net/ess3/provider/providers/PaperCommandSendListenerProvider.java @@ -27,9 +27,4 @@ public void onAsyncCommandSend(@SuppressWarnings("deprecation") AsyncPlayerSendC children.removeIf(node -> filter.test(node.getName())); } - - @Override - public String getDescription() { - return "Paper async Brigadier command send listener"; - } } diff --git a/providers/PaperProvider/src/main/java/net/ess3/provider/providers/PaperContainerProvider.java b/providers/PaperProvider/src/main/java/net/ess3/provider/providers/PaperContainerProvider.java index 9210de53c41..f7cd1490c49 100644 --- a/providers/PaperProvider/src/main/java/net/ess3/provider/providers/PaperContainerProvider.java +++ b/providers/PaperProvider/src/main/java/net/ess3/provider/providers/PaperContainerProvider.java @@ -1,9 +1,14 @@ package net.ess3.provider.providers; import net.ess3.provider.ContainerProvider; +import net.essentialsx.providers.ProviderData; +import net.essentialsx.providers.ProviderTest; +import org.bukkit.Location; +import org.bukkit.entity.HumanEntity; import org.bukkit.entity.Player; import org.bukkit.inventory.InventoryView; +@ProviderData(description = "Paper Container Provider") public class PaperContainerProvider implements ContainerProvider { @Override @@ -36,9 +41,13 @@ public InventoryView openStonecutter(Player player) { return player.openStonecutter(null, true); } - @Override - public String getDescription() { - return "Paper Container Opening Provider"; + @ProviderTest + public static boolean test() { + try { + HumanEntity.class.getDeclaredMethod("openCartographyTable", Location.class, boolean.class); + return true; + } catch (final NoSuchMethodException ignored) { + return false; + } } - } diff --git a/providers/PaperProvider/src/main/java/net/ess3/provider/providers/PaperKnownCommandsProvider.java b/providers/PaperProvider/src/main/java/net/ess3/provider/providers/PaperKnownCommandsProvider.java index b1666962b7a..1ed3de90a58 100644 --- a/providers/PaperProvider/src/main/java/net/ess3/provider/providers/PaperKnownCommandsProvider.java +++ b/providers/PaperProvider/src/main/java/net/ess3/provider/providers/PaperKnownCommandsProvider.java @@ -1,19 +1,29 @@ package net.ess3.provider.providers; import net.ess3.provider.KnownCommandsProvider; +import net.essentialsx.providers.ProviderData; +import net.essentialsx.providers.ProviderTest; import org.bukkit.Bukkit; import org.bukkit.command.Command; +import org.bukkit.command.CommandMap; import java.util.Map; +@ProviderData(description = "Paper Known Commands Provider", weight = 1) public class PaperKnownCommandsProvider implements KnownCommandsProvider { @Override public Map getKnownCommands() { return Bukkit.getCommandMap().getKnownCommands(); } - @Override - public String getDescription() { - return "Paper Known Commands Provider"; + @ProviderTest + public static boolean test() { + try { + Bukkit.class.getDeclaredMethod("getCommandMap"); + CommandMap.class.getDeclaredMethod("getKnownCommands"); + return true; + } catch (NoSuchMethodException e) { + return false; + } } } diff --git a/providers/PaperProvider/src/main/java/net/ess3/provider/providers/PaperMaterialTagProvider.java b/providers/PaperProvider/src/main/java/net/ess3/provider/providers/PaperMaterialTagProvider.java index aded175f928..67406df73f9 100644 --- a/providers/PaperProvider/src/main/java/net/ess3/provider/providers/PaperMaterialTagProvider.java +++ b/providers/PaperProvider/src/main/java/net/ess3/provider/providers/PaperMaterialTagProvider.java @@ -3,6 +3,8 @@ import com.destroystokyo.paper.MaterialSetTag; import com.destroystokyo.paper.MaterialTags; import net.ess3.provider.MaterialTagProvider; +import net.essentialsx.providers.ProviderData; +import net.essentialsx.providers.ProviderTest; import org.bukkit.Material; import org.bukkit.Tag; @@ -10,6 +12,7 @@ import java.util.HashMap; import java.util.Map; +@ProviderData(description = "Paper Material Tag Provider", weight = 1) public class PaperMaterialTagProvider implements MaterialTagProvider { private final Map> bukkitTagMap = new HashMap<>(); private final Map paperTagMap = new HashMap<>(); @@ -73,4 +76,15 @@ private Tag getBukkitTag(String tagName) { } return bukkitTagMap.get(tagName); } + + @ProviderTest + public static boolean test() { + try { + Class.forName("org.bukkit.Tag"); + Class.forName("com.destroystokyo.paper.MaterialTags"); + return true; + } catch (ClassNotFoundException ignored) { + return false; + } + } } diff --git a/providers/PaperProvider/src/main/java/net/ess3/provider/providers/PaperRecipeBookListener.java b/providers/PaperProvider/src/main/java/net/ess3/provider/providers/PaperRecipeBookListener.java index 2db752d5141..6db9428e9fd 100644 --- a/providers/PaperProvider/src/main/java/net/ess3/provider/providers/PaperRecipeBookListener.java +++ b/providers/PaperProvider/src/main/java/net/ess3/provider/providers/PaperRecipeBookListener.java @@ -16,9 +16,4 @@ public PaperRecipeBookListener(final Consumer function) { public void onPlayerRecipeBookClick(final PlayerRecipeBookClickEvent event) { function.accept(event); } - - @Override - public String getDescription() { - return "Paper Player Recipe Book Click Event Provider"; - } } diff --git a/providers/PaperProvider/src/main/java/net/ess3/provider/providers/PaperSerializationProvider.java b/providers/PaperProvider/src/main/java/net/ess3/provider/providers/PaperSerializationProvider.java index 9665cdf18a1..6b053f7dabb 100644 --- a/providers/PaperProvider/src/main/java/net/ess3/provider/providers/PaperSerializationProvider.java +++ b/providers/PaperProvider/src/main/java/net/ess3/provider/providers/PaperSerializationProvider.java @@ -1,8 +1,11 @@ package net.ess3.provider.providers; import net.ess3.provider.SerializationProvider; +import net.essentialsx.providers.ProviderData; +import net.essentialsx.providers.ProviderTest; import org.bukkit.inventory.ItemStack; +@ProviderData(description = "Paper Serialization Provider") public class PaperSerializationProvider implements SerializationProvider { @Override @@ -15,8 +18,13 @@ public ItemStack deserializeItem(byte[] bytes) { return ItemStack.deserializeBytes(bytes); } - @Override - public String getDescription() { - return "Paper Serialization Provider"; + @ProviderTest + public static boolean test() { + try { + ItemStack.class.getDeclaredMethod("serializeAsBytes"); + return true; + } catch (final NoSuchMethodException ignored) { + return false; + } } } diff --git a/providers/PaperProvider/src/main/java/net/ess3/provider/providers/PaperServerStateProvider.java b/providers/PaperProvider/src/main/java/net/ess3/provider/providers/PaperServerStateProvider.java index ab201ed0b57..b91b3d8c6f6 100644 --- a/providers/PaperProvider/src/main/java/net/ess3/provider/providers/PaperServerStateProvider.java +++ b/providers/PaperProvider/src/main/java/net/ess3/provider/providers/PaperServerStateProvider.java @@ -1,16 +1,24 @@ package net.ess3.provider.providers; import net.ess3.provider.ServerStateProvider; +import net.essentialsx.providers.ProviderData; +import net.essentialsx.providers.ProviderTest; import org.bukkit.Bukkit; +@ProviderData(description = "Paper Server State Provider", weight = 1) public class PaperServerStateProvider implements ServerStateProvider { @Override public boolean isStopping() { return Bukkit.isStopping(); } - @Override - public String getDescription() { - return "Paper Server State Provider"; + @ProviderTest + public static boolean test() { + try { + Bukkit.class.getDeclaredMethod("isStopping"); + return true; + } catch (final NoSuchMethodException ignored) { + return false; + } } } From a6441d765cb3fbff719a1c48f80ef9bd1213803b Mon Sep 17 00:00:00 2001 From: Josh Roy <10731363+JRoy@users.noreply.github.com> Date: Tue, 23 Aug 2022 21:20:32 -0400 Subject: [PATCH 02/14] pop review --- .../earth2me/essentials/ProviderFactory.java | 27 +++++++++---------- .../providers/FlatSpawnEggProvider.java | 2 +- .../providers/ReflDataWorldInfoProvider.java | 2 +- 3 files changed, 15 insertions(+), 16 deletions(-) diff --git a/Essentials/src/main/java/com/earth2me/essentials/ProviderFactory.java b/Essentials/src/main/java/com/earth2me/essentials/ProviderFactory.java index 5081d1728f8..8cd87677fcd 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/ProviderFactory.java +++ b/Essentials/src/main/java/com/earth2me/essentials/ProviderFactory.java @@ -52,20 +52,10 @@ public void finalizeRegistration() { Class highestProvider = null; ProviderData highestProviderData = null; int highestWeight = -1; - providerLoop: for (final Class provider : entry.getValue()) { try { final ProviderData providerData = provider.getAnnotation(ProviderData.class); - if (providerData.weight() > highestWeight) { - for (final Method method : provider.getMethods()) { - if (method.isAnnotationPresent(ProviderTest.class)) { - final Boolean result = (Boolean) method.invoke(null); - if (!result) { - continue providerLoop; - } - } - } - + if (providerData.weight() > highestWeight && testProvider(provider)) { highestWeight = providerData.weight(); highestProvider = provider; highestProviderData = providerData; @@ -84,12 +74,21 @@ public void finalizeRegistration() { registeredProviders.clear(); } - private C getProviderInstance(final Class provider) { + private boolean testProvider(final Class providerClass) throws InvocationTargetException, IllegalAccessException { + for (final Method method : providerClass.getMethods()) { + if (method.isAnnotationPresent(ProviderTest.class)) { + return (Boolean) method.invoke(null); + } + } + return true; + } + + private

P getProviderInstance(final Class

provider) { try { final Constructor constructor = provider.getConstructors()[0]; if (constructor.getParameterTypes().length == 0) { //noinspection unchecked - return (C) constructor.newInstance(); + return (P) constructor.newInstance(); } final Object[] args = new Object[constructor.getParameterTypes().length]; @@ -105,7 +104,7 @@ private C getProviderInstance(final Class provider) { } //noinspection unchecked - return (C) constructor.newInstance(args); + return (P) constructor.newInstance(args); } catch (InstantiationException | IllegalAccessException | InvocationTargetException e) { try { return provider.getConstructor().newInstance(); diff --git a/providers/BaseProviders/src/main/java/net/ess3/provider/providers/FlatSpawnEggProvider.java b/providers/BaseProviders/src/main/java/net/ess3/provider/providers/FlatSpawnEggProvider.java index 8bf50aa5011..2240cce8a9c 100644 --- a/providers/BaseProviders/src/main/java/net/ess3/provider/providers/FlatSpawnEggProvider.java +++ b/providers/BaseProviders/src/main/java/net/ess3/provider/providers/FlatSpawnEggProvider.java @@ -28,7 +28,7 @@ public EntityType getSpawnedType(final ItemStack eggItem) throws IllegalArgument public static boolean test() { try { //noinspection unused - final Material yourMother = Material.COW_SPAWN_EGG; + final Material itMakesMeDeclareAVariable = Material.COW_SPAWN_EGG; return true; } catch (final Throwable ignored) { return false; diff --git a/providers/NMSReflectionProvider/src/main/java/net/ess3/nms/refl/providers/ReflDataWorldInfoProvider.java b/providers/NMSReflectionProvider/src/main/java/net/ess3/nms/refl/providers/ReflDataWorldInfoProvider.java index 9f0e03d503b..145a8983c17 100644 --- a/providers/NMSReflectionProvider/src/main/java/net/ess3/nms/refl/providers/ReflDataWorldInfoProvider.java +++ b/providers/NMSReflectionProvider/src/main/java/net/ess3/nms/refl/providers/ReflDataWorldInfoProvider.java @@ -29,7 +29,7 @@ public int getMinHeight(World world) { @ProviderTest public static boolean test() { - // troll face + // TODO: THIS IS INCORRECT return false; } } From faab19bf50b5c6903592baf4a2076376db6c0f65 Mon Sep 17 00:00:00 2001 From: Josh Roy <10731363+JRoy@users.noreply.github.com> Date: Tue, 8 Nov 2022 11:56:20 -0500 Subject: [PATCH 03/14] kennytv.dmg --- .../main/java/com/earth2me/essentials/ProviderFactory.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Essentials/src/main/java/com/earth2me/essentials/ProviderFactory.java b/Essentials/src/main/java/com/earth2me/essentials/ProviderFactory.java index 8cd87677fcd..21a974c4b1b 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/ProviderFactory.java +++ b/Essentials/src/main/java/com/earth2me/essentials/ProviderFactory.java @@ -25,11 +25,12 @@ public ProviderFactory(final Essentials essentials) { } public

P get(final Class

providerClass) { - if (!this.providers.containsKey(providerClass)) { + final Provider provider = providers.get(providerClass); + if (provider == null) { return null; } //noinspection unchecked - return (P) providers.get(providerClass); + return (P) provider; } @SafeVarargs From 8eac04aec0a52c41a063c41cb9f255a545e6288d Mon Sep 17 00:00:00 2001 From: Josh Roy <10731363+JRoy@users.noreply.github.com> Date: Tue, 23 May 2023 12:18:06 -0400 Subject: [PATCH 04/14] Update provider calls in /bottom --- .../java/com/earth2me/essentials/commands/Commandbottom.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandbottom.java b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandbottom.java index 4c3d0d5b945..849dc026ada 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandbottom.java +++ b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandbottom.java @@ -3,6 +3,7 @@ import com.earth2me.essentials.Trade; import com.earth2me.essentials.User; import com.earth2me.essentials.utils.LocationUtil; +import net.ess3.provider.WorldInfoProvider; import org.bukkit.Location; import org.bukkit.Server; import org.bukkit.event.player.PlayerTeleportEvent; @@ -23,7 +24,7 @@ public void run(final Server server, final User user, final String commandLabel, final int bottomZ = user.getLocation().getBlockZ(); final float pitch = user.getLocation().getPitch(); final float yaw = user.getLocation().getYaw(); - final Location unsafe = new Location(user.getWorld(), bottomX, ess.getWorldInfoProvider().getMinHeight(user.getWorld()), bottomZ, yaw, pitch); + final Location unsafe = new Location(user.getWorld(), bottomX, ess.getProviders().get(WorldInfoProvider.class).getMinHeight(user.getWorld()), bottomZ, yaw, pitch); final Location safe = LocationUtil.getSafeDestination(ess, unsafe); final CompletableFuture future = getNewExceptionFuture(user.getSource(), commandLabel); future.thenAccept(success -> { From 7f417ef09bd075123b8c8428a0f8c42c71d35bac Mon Sep 17 00:00:00 2001 From: Josh Roy <10731363+JRoy@users.noreply.github.com> Date: Thu, 21 Dec 2023 11:33:13 -0500 Subject: [PATCH 05/14] Add some javadocs people may forget what these things do later --- .../java/com/earth2me/essentials/ProviderFactory.java | 10 ++++++++++ .../java/net/essentialsx/providers/ProviderData.java | 7 +++++++ 2 files changed, 17 insertions(+) diff --git a/Essentials/src/main/java/com/earth2me/essentials/ProviderFactory.java b/Essentials/src/main/java/com/earth2me/essentials/ProviderFactory.java index 21a974c4b1b..1521ba69769 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/ProviderFactory.java +++ b/Essentials/src/main/java/com/earth2me/essentials/ProviderFactory.java @@ -24,6 +24,11 @@ public ProviderFactory(final Essentials essentials) { this.essentials = essentials; } + /** + * Gets the provider which has been selected for the given type. + * @param providerClass The provider type. + * @return the provider or null if no provider could be selected for that type. + */ public

P get(final Class

providerClass) { final Provider provider = providers.get(providerClass); if (provider == null) { @@ -93,6 +98,11 @@ private

P getProviderInstance(final Class

provider) { } final Object[] args = new Object[constructor.getParameterTypes().length]; + /* + Providers can have constructors with any of the following types, and this code will automatically supply them; + - Plugin - The Essentials instance will be passed + - boolean - True will be passed if this server is running Paper, otherwise false. + */ for (int i = 0; i < args.length; i++) { final Class paramType = constructor.getParameterTypes()[i]; if (paramType.isAssignableFrom(Plugin.class)) { diff --git a/providers/BaseProviders/src/main/java/net/essentialsx/providers/ProviderData.java b/providers/BaseProviders/src/main/java/net/essentialsx/providers/ProviderData.java index fc54309ee91..3f050847268 100644 --- a/providers/BaseProviders/src/main/java/net/essentialsx/providers/ProviderData.java +++ b/providers/BaseProviders/src/main/java/net/essentialsx/providers/ProviderData.java @@ -8,7 +8,14 @@ @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.TYPE) public @interface ProviderData { + /** + * A brief description of when this specific provider is used (MC Version, Server Software) and its name. + */ String description(); + /** + * If there is multiple providers for a given type that pass their {@link ProviderTest}, the one with the highest weight will be used. + * @return the weight of the provider. + */ int weight() default 0; } From 0360db3a0f972a0dee6f47d4f979e94a8877fb5a Mon Sep 17 00:00:00 2001 From: Josh Roy <10731363+JRoy@users.noreply.github.com> Date: Tue, 26 Dec 2023 10:59:46 -0500 Subject: [PATCH 06/14] inline some usages --- .../AlternativeCommandsHandler.java | 2 +- .../com/earth2me/essentials/Essentials.java | 10 +++++----- .../essentials/EssentialsBlockListener.java | 4 ++-- .../essentials/EssentialsPlayerListener.java | 4 ++-- .../com/earth2me/essentials/IEssentials.java | 5 +++++ .../java/com/earth2me/essentials/Kit.java | 5 +++-- .../earth2me/essentials/MetaItemStack.java | 2 +- .../earth2me/essentials/RandomTeleport.java | 9 +++++---- .../com/earth2me/essentials/Settings.java | 20 ++++++++++++------- .../essentials/commands/Commandanvil.java | 6 ++++-- .../essentials/commands/Commandbottom.java | 2 +- .../commands/Commandcartographytable.java | 6 ++++-- .../essentials/commands/Commandcreatekit.java | 5 +++-- .../commands/Commandessentials.java | 4 ++-- .../commands/Commandgrindstone.java | 6 ++++-- .../essentials/commands/Commandhelp.java | 2 +- .../essentials/commands/Commandloom.java | 6 ++++-- .../commands/Commandsmithingtable.java | 6 ++++-- .../essentials/commands/Commandspawner.java | 2 +- .../commands/Commandstonecutter.java | 6 ++++-- .../essentials/commands/Commandtop.java | 2 +- .../commands/EssentialsCommand.java | 2 +- .../earth2me/essentials/items/FlatItemDb.java | 6 +++--- .../essentials/items/LegacyItemDb.java | 8 ++++---- .../essentials/signs/EssentialsSign.java | 14 +++++++------ .../earth2me/essentials/signs/SignAnvil.java | 4 ++-- .../essentials/signs/SignCartography.java | 4 ++-- .../essentials/signs/SignEnchant.java | 4 ++-- .../essentials/signs/SignGrindstone.java | 4 ++-- .../earth2me/essentials/signs/SignLoom.java | 4 ++-- .../essentials/signs/SignSmithing.java | 4 ++-- .../essentials/textreader/HelpInput.java | 2 +- .../essentials/utils/CommandMapUtil.java | 2 +- .../essentials/utils/LocationUtil.java | 15 ++++++++------ 34 files changed, 109 insertions(+), 78 deletions(-) diff --git a/Essentials/src/main/java/com/earth2me/essentials/AlternativeCommandsHandler.java b/Essentials/src/main/java/com/earth2me/essentials/AlternativeCommandsHandler.java index b1594c2c465..107d7934fd5 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/AlternativeCommandsHandler.java +++ b/Essentials/src/main/java/com/earth2me/essentials/AlternativeCommandsHandler.java @@ -67,7 +67,7 @@ public final void addPlugin(final Plugin plugin) { private Map getPluginCommands(Plugin plugin) { final Map commands = new HashMap<>(); - for (final Map.Entry entry : ess.getProviders().get(KnownCommandsProvider.class).getKnownCommands().entrySet()) { + for (final Map.Entry entry : ess.provider(KnownCommandsProvider.class).getKnownCommands().entrySet()) { if (entry.getValue() instanceof PluginIdentifiableCommand && ((PluginIdentifiableCommand) entry.getValue()).getPlugin().equals(plugin)) { commands.put(entry.getKey(), entry.getValue()); } diff --git a/Essentials/src/main/java/com/earth2me/essentials/Essentials.java b/Essentials/src/main/java/com/earth2me/essentials/Essentials.java index 9aa7d2919fb..2182dac0f6a 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/Essentials.java +++ b/Essentials/src/main/java/com/earth2me/essentials/Essentials.java @@ -506,7 +506,7 @@ public ProviderFactory getProviders() { @Override public void onDisable() { - final boolean stopping = getProviders().get(ServerStateProvider.class).isStopping(); + final boolean stopping = provider(ServerStateProvider.class).isStopping(); if (!stopping) { LOGGER.log(Level.SEVERE, tl("serverReloading")); } @@ -619,8 +619,8 @@ public List onTabCompleteEssentials(final CommandSender cSender, final C // Check for disabled commands if (getSettings().isCommandDisabled(commandLabel)) { - if (getProviders().get(KnownCommandsProvider.class).getKnownCommands().containsKey(commandLabel)) { - final Command newCmd = getProviders().get(KnownCommandsProvider.class).getKnownCommands().get(commandLabel); + if (provider(KnownCommandsProvider.class).getKnownCommands().containsKey(commandLabel)) { + final Command newCmd = provider(KnownCommandsProvider.class).getKnownCommands().get(commandLabel); if (!(newCmd instanceof PluginIdentifiableCommand) || ((PluginIdentifiableCommand) newCmd).getPlugin() != this) { return newCmd.tabComplete(cSender, commandLabel, args); } @@ -725,8 +725,8 @@ public boolean onCommandEssentials(final CommandSender cSender, final Command co // Check for disabled commands if (getSettings().isCommandDisabled(commandLabel)) { - if (getProviders().get(KnownCommandsProvider.class).getKnownCommands().containsKey(commandLabel)) { - final Command newCmd = getProviders().get(KnownCommandsProvider.class).getKnownCommands().get(commandLabel); + if (provider(KnownCommandsProvider.class).getKnownCommands().containsKey(commandLabel)) { + final Command newCmd = provider(KnownCommandsProvider.class).getKnownCommands().get(commandLabel); if (!(newCmd instanceof PluginIdentifiableCommand) || !isEssentialsPlugin(((PluginIdentifiableCommand) newCmd).getPlugin())) { return newCmd.execute(cSender, commandLabel, args); } diff --git a/Essentials/src/main/java/com/earth2me/essentials/EssentialsBlockListener.java b/Essentials/src/main/java/com/earth2me/essentials/EssentialsBlockListener.java index 88798203325..2890bc2a79e 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/EssentialsBlockListener.java +++ b/Essentials/src/main/java/com/earth2me/essentials/EssentialsBlockListener.java @@ -28,11 +28,11 @@ public EssentialsBlockListener(final IEssentials ess) { public void onBlockPlace(final BlockPlaceEvent event) { final ItemStack is = event.getItemInHand(); - if (is.getType() == MaterialUtil.SPAWNER && ess.getProviders().get(PersistentDataProvider.class).getString(is, "convert") != null) { + if (is.getType() == MaterialUtil.SPAWNER && ess.provider(PersistentDataProvider.class).getString(is, "convert") != null) { final BlockState blockState = event.getBlockPlaced().getState(); if (blockState instanceof CreatureSpawner) { final CreatureSpawner spawner = (CreatureSpawner) blockState; - final EntityType type = ess.getProviders().get(SpawnerItemProvider.class).getEntityType(event.getItemInHand()); + final EntityType type = ess.provider(SpawnerItemProvider.class).getEntityType(event.getItemInHand()); if (type != null && Mob.fromBukkitType(type) != null) { if (ess.getUser(event.getPlayer()).isAuthorized("essentials.spawnerconvert." + Mob.fromBukkitType(type).name().toLowerCase(Locale.ENGLISH))) { spawner.setSpawnedType(type); diff --git a/Essentials/src/main/java/com/earth2me/essentials/EssentialsPlayerListener.java b/Essentials/src/main/java/com/earth2me/essentials/EssentialsPlayerListener.java index c5a462836c3..142b2fd1ed7 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/EssentialsPlayerListener.java +++ b/Essentials/src/main/java/com/earth2me/essentials/EssentialsPlayerListener.java @@ -607,10 +607,10 @@ public void onPlayerCommandPreprocess(final PlayerCommandPreprocessEvent event) // If the plugin command does not exist, check if it is an alias from commands.yml if (ess.getServer().getPluginCommand(cmd) == null) { - final Command knownCommand = ess.getProviders().get(KnownCommandsProvider.class).getKnownCommands().get(cmd); + final Command knownCommand = ess.provider(KnownCommandsProvider.class).getKnownCommands().get(cmd); if (knownCommand instanceof FormattedCommandAlias) { final FormattedCommandAlias command = (FormattedCommandAlias) knownCommand; - for (String fullCommand : ess.getProviders().get(FormattedCommandAliasProvider.class).createCommands(command, event.getPlayer(), args.split(" "))) { + for (String fullCommand : ess.provider(FormattedCommandAliasProvider.class).createCommands(command, event.getPlayer(), args.split(" "))) { handlePlayerCommandPreprocess(event, fullCommand); } return; diff --git a/Essentials/src/main/java/com/earth2me/essentials/IEssentials.java b/Essentials/src/main/java/com/earth2me/essentials/IEssentials.java index 286b431f058..c9e197bcab9 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/IEssentials.java +++ b/Essentials/src/main/java/com/earth2me/essentials/IEssentials.java @@ -8,6 +8,7 @@ import com.earth2me.essentials.perm.PermissionsHandler; import com.earth2me.essentials.updatecheck.UpdateChecker; import com.earth2me.essentials.userstorage.IUserMap; +import net.ess3.provider.Provider; import net.essentialsx.api.v2.services.BalanceTop; import net.essentialsx.api.v2.services.mail.MailService; import org.bukkit.Server; @@ -131,4 +132,8 @@ public interface IEssentials extends Plugin { PluginCommand getPluginCommand(String cmd); ProviderFactory getProviders(); + + default

P provider(final Class

providerClass) { + return getProviders().get(providerClass); + } } diff --git a/Essentials/src/main/java/com/earth2me/essentials/Kit.java b/Essentials/src/main/java/com/earth2me/essentials/Kit.java index a12b6b157f6..7cf7572bbf0 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/Kit.java +++ b/Essentials/src/main/java/com/earth2me/essentials/Kit.java @@ -190,13 +190,14 @@ public boolean expandItems(final User user, final List items) throws Exc } final ItemStack stack; + final SerializationProvider serializationProvider = ess.provider(SerializationProvider.class); if (kitItem.startsWith("@")) { - if (ess.getProviders().get(SerializationProvider.class) == null) { + if (serializationProvider == null) { ess.getLogger().log(Level.WARNING, tl("kitError3", kitName, user.getName())); continue; } - stack = ess.getProviders().get(SerializationProvider.class).deserializeItem(Base64Coder.decodeLines(kitItem.substring(1))); + stack = serializationProvider.deserializeItem(Base64Coder.decodeLines(kitItem.substring(1))); } else { final String[] parts = kitItem.split(" +"); final ItemStack parseStack = ess.getItemDb().get(parts[0], parts.length > 1 ? Integer.parseInt(parts[1]) : 1); diff --git a/Essentials/src/main/java/com/earth2me/essentials/MetaItemStack.java b/Essentials/src/main/java/com/earth2me/essentials/MetaItemStack.java index 2a41a5164f1..6446c550955 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/MetaItemStack.java +++ b/Essentials/src/main/java/com/earth2me/essentials/MetaItemStack.java @@ -702,7 +702,7 @@ private boolean hasMetaPermission(final User user, final String metaPerm, final private void setUnbreakable(final IEssentials ess, final ItemStack is, final boolean unbreakable) { final ItemMeta meta = is.getItemMeta(); - ess.getProviders().get(ItemUnbreakableProvider.class).setUnbreakable(meta, unbreakable); + ess.provider(ItemUnbreakableProvider.class).setUnbreakable(meta, unbreakable); is.setItemMeta(meta); } } diff --git a/Essentials/src/main/java/com/earth2me/essentials/RandomTeleport.java b/Essentials/src/main/java/com/earth2me/essentials/RandomTeleport.java index 6742a9e5fb6..049fc8c1bd5 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/RandomTeleport.java +++ b/Essentials/src/main/java/com/earth2me/essentials/RandomTeleport.java @@ -26,16 +26,17 @@ public class RandomTeleport implements IConf { private final IEssentials ess; private final EssentialsConfiguration config; private final ConcurrentLinkedQueue cachedLocations = new ConcurrentLinkedQueue<>(); + private WorldInfoProvider worldInfoProvider; public RandomTeleport(final IEssentials essentials) { this.ess = essentials; config = new EssentialsConfiguration(new File(essentials.getDataFolder(), "tpr.yml"), "/tpr.yml", "Configuration for the random teleport command.\nSome settings may be defaulted, and can be changed via the /settpr command in-game."); - reloadConfig(); } @Override public void reloadConfig() { + worldInfoProvider = ess.provider(WorldInfoProvider.class); config.load(); cachedLocations.clear(); } @@ -178,7 +179,7 @@ private CompletableFuture calculateRandomLocation(final Location cente final Location location = new Location( center.getWorld(), center.getX() + offsetX, - ess.getProviders().get(WorldInfoProvider.class).getMaxHeight(center.getWorld()), + worldInfoProvider.getMaxHeight(center.getWorld()), center.getZ() + offsetZ, 360 * RANDOM.nextFloat() - 180, 0 @@ -196,7 +197,7 @@ private CompletableFuture calculateRandomLocation(final Location cente // Returns an appropriate elevation for a given location in the nether, or -1 if none is found private double getNetherYAt(final Location location) { - for (int y = 32; y < ess.getProviders().get(WorldInfoProvider.class).getMaxHeight(location.getWorld()); ++y) { + for (int y = 32; y < worldInfoProvider.getMaxHeight(location.getWorld()); ++y) { if (!LocationUtil.isBlockUnsafe(ess, location.getWorld(), location.getBlockX(), y, location.getBlockZ())) { return y; } @@ -205,7 +206,7 @@ private double getNetherYAt(final Location location) { } private boolean isValidRandomLocation(final Location location) { - return location.getBlockY() > ess.getProviders().get(WorldInfoProvider.class).getMinHeight(location.getWorld()) && !this.getExcludedBiomes().contains(location.getBlock().getBiome()); + return location.getBlockY() > worldInfoProvider.getMinHeight(location.getWorld()) && !this.getExcludedBiomes().contains(location.getBlock().getBiome()); } public File getFile() { diff --git a/Essentials/src/main/java/com/earth2me/essentials/Settings.java b/Essentials/src/main/java/com/earth2me/essentials/Settings.java index 975c29cd0cc..782b4c694f2 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/Settings.java +++ b/Essentials/src/main/java/com/earth2me/essentials/Settings.java @@ -315,9 +315,11 @@ public boolean isVerboseCommandUsages() { } private void _addAlternativeCommand(final String label, final Command current) { + final KnownCommandsProvider knownCommandsProvider = ess.provider(KnownCommandsProvider.class); + Command cmd = ess.getAlternativeCommandsHandler().getAlternative(label); if (cmd == null) { - for (final Map.Entry entry : ess.getProviders().get(KnownCommandsProvider.class).getKnownCommands().entrySet()) { + for (final Map.Entry entry : knownCommandsProvider.getKnownCommands().entrySet()) { final String[] split = entry.getKey().split(":"); if (entry.getValue() != current && split[split.length - 1].equals(label)) { cmd = entry.getValue(); @@ -327,7 +329,7 @@ private void _addAlternativeCommand(final String label, final Command current) { } if (cmd != null) { - ess.getProviders().get(KnownCommandsProvider.class).getKnownCommands().put(label, cmd); + knownCommandsProvider.getKnownCommands().put(label, cmd); } } @@ -681,14 +683,16 @@ public void reloadConfig() { overriddenCommands = _getOverriddenCommands(); playerCommands = _getPlayerCommands(); + final KnownCommandsProvider knownCommandsProvider = ess.provider(KnownCommandsProvider.class); + // This will be late loaded - if (ess.getProviders().get(KnownCommandsProvider.class) != null) { + if (knownCommandsProvider != null) { boolean mapModified = false; if (!disabledBukkitCommands.isEmpty()) { if (isDebug()) { ess.getLogger().log(Level.INFO, "Re-adding " + disabledBukkitCommands.size() + " disabled commands!"); } - ess.getProviders().get(KnownCommandsProvider.class).getKnownCommands().putAll(disabledBukkitCommands); + knownCommandsProvider.getKnownCommands().putAll(disabledBukkitCommands); disabledBukkitCommands.clear(); mapModified = true; } @@ -700,7 +704,7 @@ public void reloadConfig() { if (isDebug()) { ess.getLogger().log(Level.INFO, "Attempting removal of " + effectiveAlias); } - final Command removed = ess.getProviders().get(KnownCommandsProvider.class).getKnownCommands().remove(effectiveAlias); + final Command removed = knownCommandsProvider.getKnownCommands().remove(effectiveAlias); if (removed != null) { if (isDebug()) { ess.getLogger().log(Level.INFO, "Adding command " + effectiveAlias + " to disabled map!"); @@ -718,14 +722,16 @@ public void reloadConfig() { } } + final SyncCommandsProvider syncCommandsProvider = ess.provider(SyncCommandsProvider.class); + if (mapModified) { if (isDebug()) { ess.getLogger().log(Level.INFO, "Syncing commands"); } if (reloadCount.get() < 2) { - ess.scheduleSyncDelayedTask(() -> ess.getProviders().get(SyncCommandsProvider.class).syncCommands()); + ess.scheduleSyncDelayedTask(syncCommandsProvider::syncCommands); } else { - ess.getProviders().get(SyncCommandsProvider.class).syncCommands(); + syncCommandsProvider.syncCommands(); } } } diff --git a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandanvil.java b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandanvil.java index 75a0c95a242..1b1f681ea14 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandanvil.java +++ b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandanvil.java @@ -14,11 +14,13 @@ public Commandanvil() { @Override protected void run(Server server, User user, String commandLabel, String[] args) throws Exception { - if (ess.getProviders().get(ContainerProvider.class) == null) { + final ContainerProvider containerProvider = ess.provider(ContainerProvider.class); + + if (containerProvider == null) { user.sendMessage(tl("unsupportedBrand")); return; } - ess.getProviders().get(ContainerProvider.class).openAnvil(user.getBase()); + containerProvider.openAnvil(user.getBase()); } } diff --git a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandbottom.java b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandbottom.java index 849dc026ada..a50281f6659 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandbottom.java +++ b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandbottom.java @@ -24,7 +24,7 @@ public void run(final Server server, final User user, final String commandLabel, final int bottomZ = user.getLocation().getBlockZ(); final float pitch = user.getLocation().getPitch(); final float yaw = user.getLocation().getYaw(); - final Location unsafe = new Location(user.getWorld(), bottomX, ess.getProviders().get(WorldInfoProvider.class).getMinHeight(user.getWorld()), bottomZ, yaw, pitch); + final Location unsafe = new Location(user.getWorld(), bottomX, ess.provider(WorldInfoProvider.class).getMinHeight(user.getWorld()), bottomZ, yaw, pitch); final Location safe = LocationUtil.getSafeDestination(ess, unsafe); final CompletableFuture future = getNewExceptionFuture(user.getSource(), commandLabel); future.thenAccept(success -> { diff --git a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandcartographytable.java b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandcartographytable.java index bd1160928de..70407d49c6d 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandcartographytable.java +++ b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandcartographytable.java @@ -14,11 +14,13 @@ public Commandcartographytable() { @Override public void run(final Server server, final User user, final String commandLabel, final String[] args) throws Exception { - if (ess.getProviders().get(ContainerProvider.class) == null) { + final ContainerProvider containerProvider = ess.provider(ContainerProvider.class); + + if (containerProvider == null) { user.sendMessage(tl("unsupportedBrand")); return; } - ess.getProviders().get(ContainerProvider.class).openCartographyTable(user.getBase()); + containerProvider.openCartographyTable(user.getBase()); } } diff --git a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandcreatekit.java b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandcreatekit.java index 29ae3a85323..799c27b9734 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandcreatekit.java +++ b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandcreatekit.java @@ -42,9 +42,10 @@ public void run(final Server server, final User user, final String commandLabel, final ItemStack[] items = Inventories.getInventory(user.getBase(), true); final List list = new ArrayList<>(); + final SerializationProvider serializationProvider = ess.provider(SerializationProvider.class); boolean useSerializationProvider = ess.getSettings().isUseBetterKits(); - if (useSerializationProvider && ess.getProviders().get(SerializationProvider.class) == null) { + if (useSerializationProvider && serializationProvider == null) { ess.showError(user.getSource(), new Exception(tl("createKitUnsupported")), commandLabel); useSerializationProvider = false; } @@ -53,7 +54,7 @@ public void run(final Server server, final User user, final String commandLabel, if (is != null && is.getType() != null && is.getType() != Material.AIR) { final String serialized; if (useSerializationProvider) { - serialized = "@" + Base64Coder.encodeLines(ess.getProviders().get(SerializationProvider.class).serializeItem(is)); + serialized = "@" + Base64Coder.encodeLines(serializationProvider.serializeItem(is)); } else { serialized = ess.getItemDb().serialize(is); } diff --git a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandessentials.java b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandessentials.java index 9b28bc7a700..1c883307e8c 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandessentials.java +++ b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandessentials.java @@ -262,7 +262,7 @@ private void runDump(Server server, CommandSource sender, String commandLabel, S serverData.addProperty("bukkit-version", Bukkit.getBukkitVersion()); serverData.addProperty("server-version", Bukkit.getVersion()); serverData.addProperty("server-brand", Bukkit.getName()); - serverData.addProperty("online-mode", ess.getProviders().get(OnlineModeProvider.class).getOnlineModeString()); + serverData.addProperty("online-mode", ess.provider(OnlineModeProvider.class).getOnlineModeString()); final JsonObject supportStatus = new JsonObject(); final VersionUtil.SupportStatus status = VersionUtil.getServerSupportStatus(); supportStatus.addProperty("status", status.name()); @@ -333,7 +333,7 @@ private void runDump(Server server, CommandSource sender, String commandLabel, S final Plugin essDiscordLink = Bukkit.getPluginManager().getPlugin("EssentialsDiscordLink"); final Plugin essSpawn = Bukkit.getPluginManager().getPlugin("EssentialsSpawn"); - final Map knownCommandsCopy = new HashMap<>(ess.getProviders().get(KnownCommandsProvider.class).getKnownCommands()); + final Map knownCommandsCopy = new HashMap<>(ess.provider(KnownCommandsProvider.class).getKnownCommands()); final Map disabledCommandsCopy = new HashMap<>(ess.getAlternativeCommandsHandler().disabledCommands()); // Further operations will be heavy IO diff --git a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandgrindstone.java b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandgrindstone.java index 6e3593c22c6..4ff55e588dc 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandgrindstone.java +++ b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandgrindstone.java @@ -14,11 +14,13 @@ public Commandgrindstone() { @Override public void run(final Server server, final User user, final String commandLabel, final String[] args) throws Exception { - if (ess.getProviders().get(ContainerProvider.class) == null) { + final ContainerProvider containerProvider = ess.provider(ContainerProvider.class); + + if (containerProvider == null) { user.sendMessage(tl("unsupportedBrand")); return; } - ess.getProviders().get(ContainerProvider.class).openGrindstone(user.getBase()); + containerProvider.openGrindstone(user.getBase()); } } diff --git a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandhelp.java b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandhelp.java index 121dc0f269a..4cfea3d6e26 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandhelp.java +++ b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandhelp.java @@ -37,7 +37,7 @@ protected void run(final Server server, final User user, final String commandLab if (input.getLines().isEmpty()) { if (pageStr != null && pageStr.startsWith("/")) { final String cmd = pageStr.substring(1); - for (final Map.Entry knownCmd : ess.getProviders().get(KnownCommandsProvider.class).getKnownCommands().entrySet()) { + for (final Map.Entry knownCmd : ess.provider(KnownCommandsProvider.class).getKnownCommands().entrySet()) { if (knownCmd.getKey().equalsIgnoreCase(cmd)) { user.sendMessage(tl("commandHelpLine1", cmd)); user.sendMessage(tl("commandHelpLine2", knownCmd.getValue().getDescription())); diff --git a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandloom.java b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandloom.java index 7d064c2e5c9..ecc734d443f 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandloom.java +++ b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandloom.java @@ -14,11 +14,13 @@ public Commandloom() { @Override public void run(final Server server, final User user, final String commandLabel, final String[] args) throws Exception { - if (ess.getProviders().get(ContainerProvider.class) == null) { + final ContainerProvider containerProvider = ess.provider(ContainerProvider.class); + + if (containerProvider == null) { user.sendMessage(tl("unsupportedBrand")); return; } - ess.getProviders().get(ContainerProvider.class).openLoom(user.getBase()); + containerProvider.openLoom(user.getBase()); } } diff --git a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandsmithingtable.java b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandsmithingtable.java index 6765baacf77..250de06fec5 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandsmithingtable.java +++ b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandsmithingtable.java @@ -14,11 +14,13 @@ public Commandsmithingtable() { @Override protected void run(Server server, User user, String commandLabel, String[] args) throws Exception { - if (ess.getProviders().get(ContainerProvider.class) == null) { + final ContainerProvider containerProvider = ess.provider(ContainerProvider.class); + + if (containerProvider == null) { user.sendMessage(tl("unsupportedBrand")); return; } - ess.getProviders().get(ContainerProvider.class).openSmithingTable(user.getBase()); + containerProvider.openSmithingTable(user.getBase()); } } diff --git a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandspawner.java b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandspawner.java index 6d3b50c12ab..5214b5877e9 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandspawner.java +++ b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandspawner.java @@ -61,7 +61,7 @@ protected void run(final Server server, final User user, final String commandLab final CreatureSpawner spawner = (CreatureSpawner) target.getBlock().getState(); spawner.setSpawnedType(mob.getType()); if (delay > 0) { - final SpawnerBlockProvider spawnerBlockProvider = ess.getProviders().get(SpawnerBlockProvider.class); + final SpawnerBlockProvider spawnerBlockProvider = ess.provider(SpawnerBlockProvider.class); spawnerBlockProvider.setMinSpawnDelay(spawner, 1); spawnerBlockProvider.setMaxSpawnDelay(spawner, Integer.MAX_VALUE); spawnerBlockProvider.setMinSpawnDelay(spawner, delay); diff --git a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandstonecutter.java b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandstonecutter.java index 4b749548bc9..c37a63d27ba 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandstonecutter.java +++ b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandstonecutter.java @@ -14,11 +14,13 @@ public Commandstonecutter() { @Override public void run(final Server server, final User user, final String commandLabel, final String[] args) throws Exception { - if (ess.getProviders().get(ContainerProvider.class) == null) { + final ContainerProvider containerProvider = ess.provider(ContainerProvider.class); + + if (containerProvider == null) { user.sendMessage(tl("unsupportedBrand")); return; } - ess.getProviders().get(ContainerProvider.class).openStonecutter(user.getBase()); + containerProvider.openStonecutter(user.getBase()); } } diff --git a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandtop.java b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandtop.java index 5c1fe370d15..54d0bab9d44 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandtop.java +++ b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandtop.java @@ -23,7 +23,7 @@ public void run(final Server server, final User user, final String commandLabel, final int topZ = user.getLocation().getBlockZ(); final float pitch = user.getLocation().getPitch(); final float yaw = user.getLocation().getYaw(); - final Location unsafe = new Location(user.getWorld(), topX, ess.getProviders().get(WorldInfoProvider.class).getMaxHeight(user.getWorld()), topZ, yaw, pitch); + final Location unsafe = new Location(user.getWorld(), topX, ess.provider(WorldInfoProvider.class).getMaxHeight(user.getWorld()), topZ, yaw, pitch); final Location safe = LocationUtil.getSafeDestination(ess, unsafe); final CompletableFuture future = getNewExceptionFuture(user.getSource(), commandLabel); future.thenAccept(success -> { diff --git a/Essentials/src/main/java/com/earth2me/essentials/commands/EssentialsCommand.java b/Essentials/src/main/java/com/earth2me/essentials/commands/EssentialsCommand.java index c4f5e163506..71e6b9088a0 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/commands/EssentialsCommand.java +++ b/Essentials/src/main/java/com/earth2me/essentials/commands/EssentialsCommand.java @@ -278,7 +278,7 @@ protected List getMatchingItems(final String arg) { * Lists all commands. */ protected final List getCommands(Server server) { - final Map commandMap = Maps.newHashMap(this.ess.getProviders().get(KnownCommandsProvider.class).getKnownCommands()); + final Map commandMap = Maps.newHashMap(this.ess.provider(KnownCommandsProvider.class).getKnownCommands()); final List commands = Lists.newArrayListWithCapacity(commandMap.size()); for (final Command command : commandMap.values()) { if (!(command instanceof PluginIdentifiableCommand)) { diff --git a/Essentials/src/main/java/com/earth2me/essentials/items/FlatItemDb.java b/Essentials/src/main/java/com/earth2me/essentials/items/FlatItemDb.java index 6eb20f04a4e..a132751dda5 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/items/FlatItemDb.java +++ b/Essentials/src/main/java/com/earth2me/essentials/items/FlatItemDb.java @@ -151,8 +151,8 @@ public ItemStack get(String id, final boolean useResolvers) throws Exception { // setItemMeta to prevent a race condition final EntityType entity = data.getEntity(); if (entity != null && material.toString().contains("SPAWNER")) { - ess.getProviders().get(SpawnerItemProvider.class).setEntityType(stack, entity); - ess.getProviders().get(PersistentDataProvider.class).set(stack, "convert", "true"); + ess.provider(SpawnerItemProvider.class).setEntityType(stack, entity); + ess.provider(PersistentDataProvider.class).set(stack, "convert", "true"); } return stack; @@ -210,7 +210,7 @@ private ItemData lookup(final ItemStack item) { final PotionData potion = ((PotionMeta) item.getItemMeta()).getBasePotionData(); return new ItemData(type, potion); } else if (type.toString().contains("SPAWNER")) { - final EntityType entity = ess.getProviders().get(SpawnerItemProvider.class).getEntityType(item); + final EntityType entity = ess.provider(SpawnerItemProvider.class).getEntityType(item); return new ItemData(type, entity); } else { return new ItemData(type); diff --git a/Essentials/src/main/java/com/earth2me/essentials/items/LegacyItemDb.java b/Essentials/src/main/java/com/earth2me/essentials/items/LegacyItemDb.java index d7d229150a2..64e9402a084 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/items/LegacyItemDb.java +++ b/Essentials/src/main/java/com/earth2me/essentials/items/LegacyItemDb.java @@ -192,8 +192,8 @@ public ItemStack get(final String id, final boolean useResolvers) throws Excepti if (mat == MOB_SPAWNER) { if (metaData == 0) metaData = EntityType.PIG.getTypeId(); try { - retval = ess.getProviders().get(SpawnerItemProvider.class).setEntityType(retval, EntityType.fromId(metaData)); - ess.getProviders().get(PersistentDataProvider.class).set(retval, "convert", "true"); + retval = ess.provider(SpawnerItemProvider.class).setEntityType(retval, EntityType.fromId(metaData)); + ess.provider(PersistentDataProvider.class).set(retval, "convert", "true"); } catch (final IllegalArgumentException e) { throw new Exception("Can't spawn entity ID " + metaData + " from mob spawners."); } @@ -204,10 +204,10 @@ public ItemStack get(final String id, final boolean useResolvers) throws Excepti } catch (final IllegalArgumentException e) { throw new Exception("Can't spawn entity ID " + metaData + " from spawn eggs."); } - retval = ess.getProviders().get(SpawnEggProvider.class).createEggItem(type); + retval = ess.provider(SpawnEggProvider.class).createEggItem(type); } else if (mat.name().endsWith("POTION") && VersionUtil.getServerBukkitVersion().isLowerThan(VersionUtil.v1_11_R01)) { // Only apply this to pre-1.11 as items.csv might only work in 1.11 - retval = ess.getProviders().get(PotionMetaProvider.class).createPotionItem(mat, metaData); + retval = ess.provider(PotionMetaProvider.class).createPotionItem(mat, metaData); } else { retval.setDurability(metaData); } diff --git a/Essentials/src/main/java/com/earth2me/essentials/signs/EssentialsSign.java b/Essentials/src/main/java/com/earth2me/essentials/signs/EssentialsSign.java index 0358d7ca1e8..a80adb9c91c 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/signs/EssentialsSign.java +++ b/Essentials/src/main/java/com/earth2me/essentials/signs/EssentialsSign.java @@ -166,24 +166,26 @@ public void setOwner(final IEssentials ess, final User user, final ISign signPro } public void setOwnerData(final IEssentials ess, final User user, final ISign signProvider) { - if (ess.getProviders().get(SignDataProvider.class) == null) { + final SignDataProvider dataProvider = ess.provider(SignDataProvider.class); + if (dataProvider == null) { return; } final Sign sign = (Sign) signProvider.getBlock().getState(); - ess.getProviders().get(SignDataProvider.class).setSignData(sign, SIGN_OWNER_KEY, user.getUUID().toString()); + dataProvider.setSignData(sign, SIGN_OWNER_KEY, user.getUUID().toString()); } public boolean isOwner(final IEssentials ess, final User user, final ISign signProvider, final int nameIndex, final String namePrefix) { + final SignDataProvider dataProvider = ess.provider(SignDataProvider.class); final Sign sign = (Sign) signProvider.getBlock().getState(); - if (ess.getProviders().get(SignDataProvider.class) == null || ess.getProviders().get(SignDataProvider.class).getSignData(sign, SIGN_OWNER_KEY) == null) { + if (dataProvider == null || dataProvider.getSignData(sign, SIGN_OWNER_KEY) == null) { final boolean isLegacyOwner = FormatUtil.stripFormat(signProvider.getLine(nameIndex)).equalsIgnoreCase(getUsername(user)); - if (ess.getProviders().get(SignDataProvider.class) != null && isLegacyOwner) { - ess.getProviders().get(SignDataProvider.class).setSignData(sign, SIGN_OWNER_KEY, user.getUUID().toString()); + if (dataProvider != null && isLegacyOwner) { + dataProvider.setSignData(sign, SIGN_OWNER_KEY, user.getUUID().toString()); } return isLegacyOwner; } - if (user.getUUID().toString().equals(ess.getProviders().get(SignDataProvider.class).getSignData(sign, SIGN_OWNER_KEY))) { + if (user.getUUID().toString().equals(dataProvider.getSignData(sign, SIGN_OWNER_KEY))) { signProvider.setLine(nameIndex, namePrefix + getUsername(user)); return true; } diff --git a/Essentials/src/main/java/com/earth2me/essentials/signs/SignAnvil.java b/Essentials/src/main/java/com/earth2me/essentials/signs/SignAnvil.java index 080f07ce34b..e45c38f2988 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/signs/SignAnvil.java +++ b/Essentials/src/main/java/com/earth2me/essentials/signs/SignAnvil.java @@ -13,7 +13,7 @@ public SignAnvil() { @Override protected boolean onSignCreate(final ISign sign, final User player, final String username, final IEssentials ess) { - if (ess.getProviders().get(ContainerProvider.class) == null) { + if (ess.provider(ContainerProvider.class) == null) { player.sendMessage(tl("unsupportedBrand")); return false; } @@ -22,7 +22,7 @@ protected boolean onSignCreate(final ISign sign, final User player, final String @Override protected boolean onSignInteract(final ISign sign, final User player, final String username, final IEssentials ess) { - ess.getProviders().get(ContainerProvider.class).openAnvil(player.getBase()); + ess.provider(ContainerProvider.class).openAnvil(player.getBase()); return true; } } diff --git a/Essentials/src/main/java/com/earth2me/essentials/signs/SignCartography.java b/Essentials/src/main/java/com/earth2me/essentials/signs/SignCartography.java index 5186f559e81..50c6ee5d7cb 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/signs/SignCartography.java +++ b/Essentials/src/main/java/com/earth2me/essentials/signs/SignCartography.java @@ -13,7 +13,7 @@ public SignCartography() { @Override protected boolean onSignCreate(final ISign sign, final User player, final String username, final IEssentials ess) { - if (ess.getProviders().get(ContainerProvider.class) == null) { + if (ess.provider(ContainerProvider.class) == null) { player.sendMessage(tl("unsupportedBrand")); return false; } @@ -22,7 +22,7 @@ protected boolean onSignCreate(final ISign sign, final User player, final String @Override protected boolean onSignInteract(final ISign sign, final User player, final String username, final IEssentials ess) { - ess.getProviders().get(ContainerProvider.class).openCartographyTable(player.getBase()); + ess.provider(ContainerProvider.class).openCartographyTable(player.getBase()); return true; } } diff --git a/Essentials/src/main/java/com/earth2me/essentials/signs/SignEnchant.java b/Essentials/src/main/java/com/earth2me/essentials/signs/SignEnchant.java index 51e83980247..22d144fdff1 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/signs/SignEnchant.java +++ b/Essentials/src/main/java/com/earth2me/essentials/signs/SignEnchant.java @@ -23,7 +23,7 @@ public SignEnchant() { protected boolean onSignCreate(final ISign sign, final User player, final String username, final IEssentials ess) throws SignException, ChargeException { final ItemStack stack; final String itemName = sign.getLine(1); - final MaterialTagProvider tagProvider = ess.getProviders().get(MaterialTagProvider.class); + final MaterialTagProvider tagProvider = ess.provider(MaterialTagProvider.class); try { stack = itemName.equals("*") || itemName.equalsIgnoreCase("any") || (tagProvider != null && tagProvider.tagExists(itemName)) ? null : getItemStack(sign.getLine(1), 1, ess); } catch (final SignException e) { @@ -68,7 +68,7 @@ protected boolean onSignCreate(final ISign sign, final User player, final String @Override protected boolean onSignInteract(final ISign sign, final User player, final String username, final IEssentials ess) throws SignException, ChargeException { final ItemStack playerHand = Inventories.getItemInHand(player.getBase()); - final MaterialTagProvider tagProvider = ess.getProviders().get(MaterialTagProvider.class); + final MaterialTagProvider tagProvider = ess.provider(MaterialTagProvider.class); final String itemName = sign.getLine(1); final ItemStack search = itemName.equals("*") || itemName.equalsIgnoreCase("any") || (tagProvider != null && tagProvider.tagExists(itemName) && tagProvider.isTagged(itemName, playerHand.getType())) ? null : getItemStack(itemName, 1, ess); final Trade charge = getTrade(sign, 3, ess); diff --git a/Essentials/src/main/java/com/earth2me/essentials/signs/SignGrindstone.java b/Essentials/src/main/java/com/earth2me/essentials/signs/SignGrindstone.java index 4c52a2aa20e..bc217baf781 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/signs/SignGrindstone.java +++ b/Essentials/src/main/java/com/earth2me/essentials/signs/SignGrindstone.java @@ -13,7 +13,7 @@ public SignGrindstone() { @Override protected boolean onSignCreate(final ISign sign, final User player, final String username, final IEssentials ess) { - if (ess.getProviders().get(ContainerProvider.class) == null) { + if (ess.provider(ContainerProvider.class) == null) { player.sendMessage(tl("unsupportedBrand")); return false; } @@ -22,7 +22,7 @@ protected boolean onSignCreate(final ISign sign, final User player, final String @Override protected boolean onSignInteract(final ISign sign, final User player, final String username, final IEssentials ess) { - ess.getProviders().get(ContainerProvider.class).openGrindstone(player.getBase()); + ess.provider(ContainerProvider.class).openGrindstone(player.getBase()); return true; } } diff --git a/Essentials/src/main/java/com/earth2me/essentials/signs/SignLoom.java b/Essentials/src/main/java/com/earth2me/essentials/signs/SignLoom.java index c2de03f0de0..b29b3a8b095 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/signs/SignLoom.java +++ b/Essentials/src/main/java/com/earth2me/essentials/signs/SignLoom.java @@ -13,7 +13,7 @@ public SignLoom() { @Override protected boolean onSignCreate(final ISign sign, final User player, final String username, final IEssentials ess) { - if (ess.getProviders().get(ContainerProvider.class) == null) { + if (ess.provider(ContainerProvider.class) == null) { player.sendMessage(tl("unsupportedBrand")); return false; } @@ -22,7 +22,7 @@ protected boolean onSignCreate(final ISign sign, final User player, final String @Override protected boolean onSignInteract(final ISign sign, final User player, final String username, final IEssentials ess) { - ess.getProviders().get(ContainerProvider.class).openLoom(player.getBase()); + ess.provider(ContainerProvider.class).openLoom(player.getBase()); return true; } } diff --git a/Essentials/src/main/java/com/earth2me/essentials/signs/SignSmithing.java b/Essentials/src/main/java/com/earth2me/essentials/signs/SignSmithing.java index d76c85cc486..2e38fc5886a 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/signs/SignSmithing.java +++ b/Essentials/src/main/java/com/earth2me/essentials/signs/SignSmithing.java @@ -13,7 +13,7 @@ public SignSmithing() { @Override protected boolean onSignCreate(final ISign sign, final User player, final String username, final IEssentials ess) { - if (ess.getProviders().get(ContainerProvider.class) == null) { + if (ess.provider(ContainerProvider.class) == null) { player.sendMessage(tl("unsupportedBrand")); return false; } @@ -22,7 +22,7 @@ protected boolean onSignCreate(final ISign sign, final User player, final String @Override protected boolean onSignInteract(final ISign sign, final User player, final String username, final IEssentials ess) { - ess.getProviders().get(ContainerProvider.class).openSmithingTable(player.getBase()); + ess.provider(ContainerProvider.class).openSmithingTable(player.getBase()); return true; } } diff --git a/Essentials/src/main/java/com/earth2me/essentials/textreader/HelpInput.java b/Essentials/src/main/java/com/earth2me/essentials/textreader/HelpInput.java index ab0c1a6e0a0..303e9b8c37d 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/textreader/HelpInput.java +++ b/Essentials/src/main/java/com/earth2me/essentials/textreader/HelpInput.java @@ -34,7 +34,7 @@ public HelpInput(final User user, final String match, final IEssentials ess) { } final Multimap pluginCommands = HashMultimap.create(); - for (final Command command : ess.getProviders().get(KnownCommandsProvider.class).getKnownCommands().values()) { + for (final Command command : ess.provider(KnownCommandsProvider.class).getKnownCommands().values()) { if (!(command instanceof PluginIdentifiableCommand)) { continue; } diff --git a/Essentials/src/main/java/com/earth2me/essentials/utils/CommandMapUtil.java b/Essentials/src/main/java/com/earth2me/essentials/utils/CommandMapUtil.java index 2daa0cae1b7..336de90c438 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/utils/CommandMapUtil.java +++ b/Essentials/src/main/java/com/earth2me/essentials/utils/CommandMapUtil.java @@ -61,7 +61,7 @@ public static JsonObject toJson(IEssentials ess, Command value) { } else if (value instanceof FormattedCommandAlias) { json.addProperty("source", "commands.yml"); final JsonArray formatStrings = new JsonArray(); - for (final String entry : ess.getProviders().get(FormattedCommandAliasProvider.class).getFormatStrings((FormattedCommandAlias) value)) { + for (final String entry : ess.provider(FormattedCommandAliasProvider.class).getFormatStrings((FormattedCommandAlias) value)) { formatStrings.add(new JsonPrimitive(entry)); } json.add("bukkit_aliases", formatStrings); diff --git a/Essentials/src/main/java/com/earth2me/essentials/utils/LocationUtil.java b/Essentials/src/main/java/com/earth2me/essentials/utils/LocationUtil.java index ea4557b2a22..d98d4e94ae0 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/utils/LocationUtil.java +++ b/Essentials/src/main/java/com/earth2me/essentials/utils/LocationUtil.java @@ -110,7 +110,7 @@ public static Location getTarget(final LivingEntity entity, final int maxDistanc } public static boolean isBlockAboveAir(IEssentials ess, final World world, final int x, final int y, final int z) { - return y > ess.getProviders().get(WorldInfoProvider.class).getMaxHeight(world) || HOLLOW_MATERIALS.contains(world.getBlockAt(x, y - 1, z).getType()); + return y > ess.provider(WorldInfoProvider.class).getMaxHeight(world) || HOLLOW_MATERIALS.contains(world.getBlockAt(x, y - 1, z).getType()); } public static boolean isBlockOutsideWorldBorder(final World world, final int x, final int z) { @@ -215,10 +215,12 @@ public static Location getSafeDestination(IEssentials ess, final Location loc) t if (loc == null || loc.getWorld() == null) { throw new Exception(tl("destinationNotSet")); } + final WorldInfoProvider worldInfoProvider = ess.provider(WorldInfoProvider.class); + final World world = loc.getWorld(); - final int worldMinY = ess.getProviders().get(WorldInfoProvider.class).getMinHeight(world); - final int worldLogicalY = ess.getProviders().get(WorldInfoProvider.class).getLogicalHeight(world); - final int worldMaxY = loc.getBlockY() < worldLogicalY ? worldLogicalY : ess.getProviders().get(WorldInfoProvider.class).getMaxHeight(world); + final int worldMinY = worldInfoProvider.getMinHeight(world); + final int worldLogicalY = worldInfoProvider.getLogicalHeight(world); + final int worldMaxY = loc.getBlockY() < worldLogicalY ? worldLogicalY : worldInfoProvider.getMaxHeight(world); int x = loc.getBlockX(); int y = (int) Math.round(loc.getY()); int z = loc.getBlockZ(); @@ -275,13 +277,14 @@ public static Location getSafeDestination(IEssentials ess, final Location loc) t } public static boolean shouldFly(IEssentials ess, final Location loc) { + final WorldInfoProvider worldInfoProvider = ess.provider(WorldInfoProvider.class); final World world = loc.getWorld(); final int x = loc.getBlockX(); int y = (int) Math.round(loc.getY()); final int z = loc.getBlockZ(); int count = 0; // Check whether more than 2 unsafe block are below player. - while (LocationUtil.isBlockUnsafe(ess, world, x, y, z) && y >= ess.getProviders().get(WorldInfoProvider.class).getMinHeight(world)) { + while (LocationUtil.isBlockUnsafe(ess, world, x, y, z) && y >= worldInfoProvider.getMinHeight(world)) { y--; count++; if (count > 2) { @@ -290,7 +293,7 @@ public static boolean shouldFly(IEssentials ess, final Location loc) { } // If not then check if player is in the void - return y < ess.getProviders().get(WorldInfoProvider.class).getMinHeight(world); + return y < worldInfoProvider.getMinHeight(world); } public static class Vector3D { From 4e5c194606ea4c7f9d66e103fb7eb8f948f231b6 Mon Sep 17 00:00:00 2001 From: JRoy <10731363+JRoy@users.noreply.github.com> Date: Tue, 23 Jul 2024 18:48:46 -0400 Subject: [PATCH 07/14] Fix missing test from 1.9-1.12 Spawn Egg Provider --- .../nms/refl/providers/ReflSpawnEggProvider.java | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/providers/NMSReflectionProvider/src/main/java/net/ess3/nms/refl/providers/ReflSpawnEggProvider.java b/providers/NMSReflectionProvider/src/main/java/net/ess3/nms/refl/providers/ReflSpawnEggProvider.java index 7ffeca32a52..a1bd623a92f 100644 --- a/providers/NMSReflectionProvider/src/main/java/net/ess3/nms/refl/providers/ReflSpawnEggProvider.java +++ b/providers/NMSReflectionProvider/src/main/java/net/ess3/nms/refl/providers/ReflSpawnEggProvider.java @@ -3,6 +3,7 @@ import net.ess3.nms.refl.SpawnEggRefl; import net.ess3.provider.SpawnEggProvider; import net.essentialsx.providers.ProviderData; +import net.essentialsx.providers.ProviderTest; import org.bukkit.entity.EntityType; import org.bukkit.inventory.ItemStack; @@ -26,4 +27,15 @@ public EntityType getSpawnedType(final ItemStack eggItem) throws IllegalArgument throw new IllegalArgumentException(e.getMessage(), e.getCause()); } } + + @ProviderTest + public static boolean test() { + try { + // There isn't a real good way to test this, but we can check if the Shulker class exists. + Class.forName("org.bukkit.entity.Shulker"); + return true; + } catch (final Throwable ignored) { + return false; + } + } } From f05a9dd5c60222cca954e0198fba445f661e9e34 Mon Sep 17 00:00:00 2001 From: JRoy <10731363+JRoy@users.noreply.github.com> Date: Tue, 23 Jul 2024 20:25:47 -0400 Subject: [PATCH 08/14] Fix compile/merge errors --- .../com/earth2me/essentials/Essentials.java | 110 ++++-------------- .../essentials/EssentialsPlayerListener.java | 13 ++- .../earth2me/essentials/MetaItemStack.java | 6 +- .../earth2me/essentials/RandomTeleport.java | 2 +- .../essentials/commands/Commandrecipe.java | 5 +- .../commands/EssentialsCommand.java | 1 + .../essentials/items/AbstractItemDb.java | 9 +- .../earth2me/essentials/items/FlatItemDb.java | 7 +- .../providers/LegacyBannerDataProvider.java | 7 +- .../LegacyInventoryViewProvider.java | 7 +- .../providers/LegacyPotionMetaProvider.java | 15 ++- .../PrehistoricPotionMetaProvider.java | 7 +- .../providers/BaseBannerDataProvider.java | 15 ++- .../providers/BaseInventoryViewProvider.java | 9 +- .../providers/ModernPotionMetaProvider.java | 15 ++- .../providers/PaperBiomeKeyProvider.java | 19 ++- 16 files changed, 116 insertions(+), 131 deletions(-) diff --git a/Essentials/src/main/java/com/earth2me/essentials/Essentials.java b/Essentials/src/main/java/com/earth2me/essentials/Essentials.java index a96ba2c5e7b..6bf300be668 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/Essentials.java +++ b/Essentials/src/main/java/com/earth2me/essentials/Essentials.java @@ -59,18 +59,22 @@ import net.ess3.nms.refl.providers.ReflSpawnEggProvider; import net.ess3.nms.refl.providers.ReflSpawnerBlockProvider; import net.ess3.nms.refl.providers.ReflSyncCommandsProvider; +import net.ess3.provider.InventoryViewProvider; import net.ess3.provider.KnownCommandsProvider; import net.ess3.provider.PlayerLocaleProvider; import net.ess3.provider.ProviderListener; import net.ess3.provider.ServerStateProvider; +import net.ess3.provider.providers.BaseBannerDataProvider; +import net.ess3.provider.providers.BaseInventoryViewProvider; import net.ess3.provider.providers.BaseLoggerProvider; -import net.ess3.provider.providers.BasePotionDataProvider; import net.ess3.provider.providers.BlockMetaSpawnerItemProvider; import net.ess3.provider.providers.BukkitMaterialTagProvider; import net.ess3.provider.providers.BukkitSpawnerBlockProvider; import net.ess3.provider.providers.FixedHeightWorldInfoProvider; import net.ess3.provider.providers.FlatSpawnEggProvider; +import net.ess3.provider.providers.LegacyBannerDataProvider; import net.ess3.provider.providers.LegacyDamageEventProvider; +import net.ess3.provider.providers.LegacyInventoryViewProvider; import net.ess3.provider.providers.LegacyItemUnbreakableProvider; import net.ess3.provider.providers.LegacyPlayerLocaleProvider; import net.ess3.provider.providers.LegacyPotionMetaProvider; @@ -80,13 +84,16 @@ import net.ess3.provider.providers.ModernItemUnbreakableProvider; import net.ess3.provider.providers.ModernPersistentDataProvider; import net.ess3.provider.providers.ModernPlayerLocaleProvider; +import net.ess3.provider.providers.ModernPotionMetaProvider; import net.ess3.provider.providers.ModernSignDataProvider; +import net.ess3.provider.providers.PaperBiomeKeyProvider; import net.ess3.provider.providers.PaperContainerProvider; import net.ess3.provider.providers.PaperKnownCommandsProvider; import net.ess3.provider.providers.PaperMaterialTagProvider; import net.ess3.provider.providers.PaperRecipeBookListener; import net.ess3.provider.providers.PaperSerializationProvider; import net.ess3.provider.providers.PaperServerStateProvider; +import net.ess3.provider.providers.PrehistoricPotionMetaProvider; import net.essentialsx.api.v2.services.BalanceTop; import net.essentialsx.api.v2.services.mail.MailService; import net.kyori.adventure.platform.bukkit.BukkitAudiences; @@ -330,9 +337,6 @@ public void onEnable() { execTimer.mark("Init(ItemDB)"); randomTeleport = new RandomTeleport(this); - if (randomTeleport.getPreCache()) { - randomTeleport.cacheRandomLocations(randomTeleport.getCenter(), randomTeleport.getMinRange(), randomTeleport.getMaxRange()); - } confList.add(randomTeleport); execTimer.mark("Init(RandomTeleport)"); @@ -363,20 +367,10 @@ public void onEnable() { providerFactory.registerProvider(LegacySpawnEggProvider.class, ReflSpawnEggProvider.class, FlatSpawnEggProvider.class); //Potion Meta Provider - if (VersionUtil.getServerBukkitVersion().isHigherThanOrEqualTo(VersionUtil.v1_20_6_R01)) { - potionMetaProvider = new ModernPotionMetaProvider(); - } else if (VersionUtil.getServerBukkitVersion().isLowerThan(VersionUtil.v1_9_R01)) { - potionMetaProvider = new PrehistoricPotionMetaProvider(); - } else { - potionMetaProvider = new LegacyPotionMetaProvider(); - } + providerFactory.registerProvider(PrehistoricPotionMetaProvider.class, LegacyPotionMetaProvider.class, ModernPotionMetaProvider.class); //Banner Meta Provider - if (VersionUtil.getServerBukkitVersion().isHigherThanOrEqualTo(VersionUtil.v1_20_6_R01)) { - bannerDataProvider = new BaseBannerDataProvider(); - } else { - bannerDataProvider = new LegacyBannerDataProvider(); - } + providerFactory.registerProvider(LegacyBannerDataProvider.class, BaseBannerDataProvider.class); // Server State Provider providerFactory.registerProvider(ReflServerStateProvider.class, PaperServerStateProvider.class); @@ -420,6 +414,12 @@ public void onEnable() { // Damage Event Provider providerFactory.registerProvider(ModernDamageEventProvider.class, LegacyDamageEventProvider.class); + // Inventory View Provider + providerFactory.registerProvider(LegacyInventoryViewProvider.class, BaseInventoryViewProvider.class); + + // Biome Key Provider + providerFactory.registerProvider(PaperBiomeKeyProvider.class); + providerFactory.finalizeRegistration(); // Event Providers @@ -435,75 +435,14 @@ public void onEnable() { } } - //Known Commands Provider - if (PaperLib.isPaper() && VersionUtil.getServerBukkitVersion().isHigherThanOrEqualTo(VersionUtil.v1_11_2_R01)) { - knownCommandsProvider = new PaperKnownCommandsProvider(); - } else { - knownCommandsProvider = new ReflKnownCommandsProvider(); - } - - // Command aliases provider - formattedCommandAliasProvider = new ReflFormattedCommandAliasProvider(PaperLib.isPaper()); - - // Material Tag Providers - if (VersionUtil.getServerBukkitVersion().isHigherThanOrEqualTo(VersionUtil.v1_13_0_R01)) { - materialTagProvider = PaperLib.isPaper() ? new PaperMaterialTagProvider() : new BukkitMaterialTagProvider(); - } - - // Sync Commands Provider - syncCommandsProvider = new ReflSyncCommandsProvider(); - - if (VersionUtil.getServerBukkitVersion().isHigherThanOrEqualTo(VersionUtil.v1_14_4_R01)) { - persistentDataProvider = new ModernPersistentDataProvider(this); - } else { - persistentDataProvider = new ReflPersistentDataProvider(this); - } - - onlineModeProvider = new ReflOnlineModeProvider(); - - if (VersionUtil.getServerBukkitVersion().isHigherThanOrEqualTo(VersionUtil.v1_11_2_R01)) { - unbreakableProvider = new ModernItemUnbreakableProvider(); - } else { - unbreakableProvider = new LegacyItemUnbreakableProvider(); - } - - if (VersionUtil.getServerBukkitVersion().isHigherThanOrEqualTo(VersionUtil.v1_17_1_R01)) { - worldInfoProvider = new ModernDataWorldInfoProvider(); - } else if (VersionUtil.getServerBukkitVersion().isHigherThanOrEqualTo(VersionUtil.v1_16_5_R01)) { - worldInfoProvider = new ReflDataWorldInfoProvider(); - } else { - worldInfoProvider = new FixedHeightWorldInfoProvider(); - } - - if (VersionUtil.getServerBukkitVersion().isHigherThanOrEqualTo(VersionUtil.v1_14_4_R01)) { - signDataProvider = new ModernSignDataProvider(this); - } - - if (VersionUtil.getServerBukkitVersion().isHigherThanOrEqualTo(VersionUtil.v1_12_2_R01)) { - playerLocaleProvider = new ModernPlayerLocaleProvider(); - } else { - playerLocaleProvider = new LegacyPlayerLocaleProvider(); - } - - if (VersionUtil.getServerBukkitVersion().isHigherThanOrEqualTo(VersionUtil.v1_20_4_R01)) { - damageEventProvider = new ModernDamageEventProvider(); - } else { - damageEventProvider = new LegacyDamageEventProvider(); - } - - if (VersionUtil.getServerBukkitVersion().isHigherThanOrEqualTo(VersionUtil.v1_21_R01)) { - inventoryViewProvider = new BaseInventoryViewProvider(); - } else { - inventoryViewProvider = new LegacyInventoryViewProvider(); - } - - if (PaperLib.isPaper() && VersionUtil.getServerBukkitVersion().isHigherThanOrEqualTo(VersionUtil.v1_19_4_R01)) { - biomeKeyProvider = new PaperBiomeKeyProvider(); - } - execTimer.mark("Init(Providers)"); reload(); + if (randomTeleport.getPreCache()) { + randomTeleport.cacheRandomLocations(randomTeleport.getCenter(), randomTeleport.getMinRange(), randomTeleport.getMaxRange()); + } + execTimer.mark("PreCache(RandomTeleport)"); + // The item spawn blacklist is loaded with all other settings, before the item // DB, but it depends on the item DB, so we need to reload it again here: ((Settings) settings)._lateLoadItemSpawnBlacklist(); @@ -925,16 +864,17 @@ private boolean isEssentialsPlugin(Plugin plugin) { } public void cleanupOpenInventories() { + final InventoryViewProvider provider = provider(InventoryViewProvider.class); for (final User user : getOnlineUsers()) { if (user.isRecipeSee()) { final InventoryView view = user.getBase().getOpenInventory(); - inventoryViewProvider.getTopInventory(view).clear(); - inventoryViewProvider.close(view); + provider.getTopInventory(view).clear(); + provider.close(view); user.setRecipeSee(false); } if (user.isInvSee() || user.isEnderSee()) { - inventoryViewProvider.close(user.getBase().getOpenInventory()); + provider.close(user.getBase().getOpenInventory()); user.setInvSee(false); user.setEnderSee(false); } diff --git a/Essentials/src/main/java/com/earth2me/essentials/EssentialsPlayerListener.java b/Essentials/src/main/java/com/earth2me/essentials/EssentialsPlayerListener.java index 58da6a6d0bf..e29c498c96e 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/EssentialsPlayerListener.java +++ b/Essentials/src/main/java/com/earth2me/essentials/EssentialsPlayerListener.java @@ -18,6 +18,7 @@ import net.ess3.api.events.AfkStatusChangeEvent; import net.ess3.provider.CommandSendListenerProvider; import net.ess3.provider.FormattedCommandAliasProvider; +import net.ess3.provider.InventoryViewProvider; import net.ess3.provider.KnownCommandsProvider; import net.ess3.provider.providers.BukkitCommandSendListenerProvider; import net.ess3.provider.providers.PaperCommandSendListenerProvider; @@ -301,7 +302,7 @@ public void onPlayerQuit(final PlayerQuitEvent event) { } user.setLogoutLocation(); if (user.isRecipeSee()) { - ess.getInventoryViewProvider().getTopInventory(user.getBase().getOpenInventory()).clear(); + ess.provider(InventoryViewProvider.class).getTopInventory(user.getBase().getOpenInventory()).clear(); } final ArrayList viewers = new ArrayList<>(user.getBase().getInventory().getViewers()); @@ -899,14 +900,15 @@ public void run() { @EventHandler(priority = EventPriority.LOWEST, ignoreCancelled = true) public void onInventoryClickEvent(final InventoryClickEvent event) { Player refreshPlayer = null; - final Inventory top = ess.getInventoryViewProvider().getTopInventory(event.getView()); + final InventoryViewProvider provider = ess.provider(InventoryViewProvider.class); + final Inventory top = provider.getTopInventory(event.getView()); final InventoryType type = top.getType(); final Inventory clickedInventory; if (event.getRawSlot() < 0) { clickedInventory = null; } else { - clickedInventory = event.getRawSlot() < top.getSize() ? top : ess.getInventoryViewProvider().getBottomInventory(event.getView()); + clickedInventory = event.getRawSlot() < top.getSize() ? top : provider.getBottomInventory(event.getView()); } final User user = ess.getUser((Player) event.getWhoClicked()); @@ -965,7 +967,8 @@ private boolean isPreventBindingHat(User user, PlayerInventory inventory) { @EventHandler(priority = EventPriority.MONITOR) public void onInventoryCloseEvent(final InventoryCloseEvent event) { Player refreshPlayer = null; - final Inventory top = ess.getInventoryViewProvider().getTopInventory(event.getView()); + final InventoryViewProvider provider = ess.provider(InventoryViewProvider.class); + final Inventory top = provider.getTopInventory(event.getView()); final InventoryType type = top.getType(); if (type == InventoryType.PLAYER) { final User user = ess.getUser((Player) event.getPlayer()); @@ -979,7 +982,7 @@ public void onInventoryCloseEvent(final InventoryCloseEvent event) { final User user = ess.getUser((Player) event.getPlayer()); if (user.isRecipeSee()) { user.setRecipeSee(false); - ess.getInventoryViewProvider().getTopInventory(event.getView()).clear(); + provider.getTopInventory(event.getView()).clear(); refreshPlayer = user.getBase(); } } else if (type == InventoryType.CHEST && top.getSize() == 9) { diff --git a/Essentials/src/main/java/com/earth2me/essentials/MetaItemStack.java b/Essentials/src/main/java/com/earth2me/essentials/MetaItemStack.java index c7f07a4cec9..68d9cf68ed7 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/MetaItemStack.java +++ b/Essentials/src/main/java/com/earth2me/essentials/MetaItemStack.java @@ -11,7 +11,9 @@ import com.google.common.base.Joiner; import net.ess3.api.IEssentials; import net.ess3.api.TranslatableException; +import net.ess3.provider.BannerDataProvider; import net.ess3.provider.ItemUnbreakableProvider; +import net.ess3.provider.PotionMetaProvider; import org.bukkit.Color; import org.bukkit.DyeColor; import org.bukkit.FireworkEffect; @@ -566,7 +568,7 @@ public void addPotionMeta(final CommandSource sender, final boolean allowShortNa } pmeta.addCustomEffect(pEffect, true); stack.setItemMeta(pmeta); - ess.getPotionMetaProvider().setSplashPotion(stack, isSplashPotion); + ess.provider(PotionMetaProvider.class).setSplashPotion(stack, isSplashPotion); resetPotionMeta(); } } @@ -656,7 +658,7 @@ public void addBannerMeta(final CommandSource sender, final boolean allowShortNa final BannerMeta meta = (BannerMeta) stack.getItemMeta(); if (split[0].equalsIgnoreCase("basecolor")) { final Color color = Color.fromRGB(Integer.parseInt(split[1])); - ess.getBannerDataProvider().setBaseColor(stack, DyeColor.getByColor(color)); + ess.provider(BannerDataProvider.class).setBaseColor(stack, DyeColor.getByColor(color)); } else if (patternType != null) { //noinspection removal final PatternType type = PatternType.getByIdentifier(split[0]); diff --git a/Essentials/src/main/java/com/earth2me/essentials/RandomTeleport.java b/Essentials/src/main/java/com/earth2me/essentials/RandomTeleport.java index 54f20d461e4..9929b04327a 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/RandomTeleport.java +++ b/Essentials/src/main/java/com/earth2me/essentials/RandomTeleport.java @@ -217,7 +217,7 @@ private boolean isExcludedBiome(final Location location) { return false; } final String biomeKey; - final BiomeKeyProvider biomeKeyProvider = ess.getBiomeKeyProvider(); + final BiomeKeyProvider biomeKeyProvider = ess.provider(BiomeKeyProvider.class); if (biomeKeyProvider != null) { // Works with custom biome keys biomeKey = biomeKeyProvider.getBiomeKey(location.getBlock()).toString(); diff --git a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandrecipe.java b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandrecipe.java index 448d2476ef9..eaa2771c630 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandrecipe.java +++ b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandrecipe.java @@ -7,6 +7,7 @@ import com.earth2me.essentials.utils.NumberUtil; import com.earth2me.essentials.utils.VersionUtil; import net.ess3.api.TranslatableException; +import net.ess3.provider.InventoryViewProvider; import org.bukkit.Material; import org.bukkit.Server; import org.bukkit.inventory.FurnaceRecipe; @@ -131,7 +132,7 @@ public void shapedRecipe(final CommandSource sender, final ShapedRecipe recipe, if (VersionUtil.PRE_FLATTENING && item.getDurability() == Short.MAX_VALUE) { item.setDurability((short) 0); } - ess.getInventoryViewProvider().getTopInventory(view).setItem(j * 3 + k + 1, item); + ess.provider(InventoryViewProvider.class).getTopInventory(view).setItem(j * 3 + k + 1, item); } } } else { @@ -174,7 +175,7 @@ public void shapelessRecipe(final CommandSource sender, final ShapelessRecipe re if (VersionUtil.PRE_FLATTENING && item.getDurability() == Short.MAX_VALUE) { item.setDurability((short) 0); } - ess.getInventoryViewProvider().setItem(view, i + 1, item); + ess.provider(InventoryViewProvider.class).setItem(view, i + 1, item); } } else { diff --git a/Essentials/src/main/java/com/earth2me/essentials/commands/EssentialsCommand.java b/Essentials/src/main/java/com/earth2me/essentials/commands/EssentialsCommand.java index 37628619582..897c3d98101 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/commands/EssentialsCommand.java +++ b/Essentials/src/main/java/com/earth2me/essentials/commands/EssentialsCommand.java @@ -11,6 +11,7 @@ import com.google.common.collect.Maps; import net.ess3.api.IEssentials; import net.ess3.api.TranslatableException; +import net.ess3.provider.KnownCommandsProvider; import org.bukkit.Server; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; diff --git a/Essentials/src/main/java/com/earth2me/essentials/items/AbstractItemDb.java b/Essentials/src/main/java/com/earth2me/essentials/items/AbstractItemDb.java index 79043276de7..a3bcd932fdc 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/items/AbstractItemDb.java +++ b/Essentials/src/main/java/com/earth2me/essentials/items/AbstractItemDb.java @@ -9,6 +9,8 @@ import com.earth2me.essentials.utils.VersionUtil; import net.ess3.api.IEssentials; import net.ess3.api.PluginKey; +import net.ess3.provider.BannerDataProvider; +import net.ess3.provider.PotionMetaProvider; import org.bukkit.Color; import org.bukkit.DyeColor; import org.bukkit.FireworkEffect; @@ -284,8 +286,9 @@ public String serialize(final ItemStack is, final boolean useResolvers) { serializeEffectMeta(sb, fireworkEffectMeta.getEffect()); } } else if (MaterialUtil.isPotion(material)) { - final boolean splash = ess.getPotionMetaProvider().isSplashPotion(is); - final Collection effects = ess.getPotionMetaProvider().getCustomEffects(is); + final PotionMetaProvider provider = ess.provider(PotionMetaProvider.class); + final boolean splash = provider.isSplashPotion(is); + final Collection effects = provider.getCustomEffects(is); for (final PotionEffect e : effects) { // long but needs to be effect:speed power:2 duration:120 in that order. @@ -316,7 +319,7 @@ public String serialize(final ItemStack is, final boolean useResolvers) { } else { final BannerMeta bannerMeta = (BannerMeta) is.getItemMeta(); if (bannerMeta != null) { - DyeColor baseDyeColor = ess.getBannerDataProvider().getBaseColor(is); + DyeColor baseDyeColor = ess.provider(BannerDataProvider.class).getBaseColor(is); if (baseDyeColor == null) { baseDyeColor = MaterialUtil.getColorOf(material); } diff --git a/Essentials/src/main/java/com/earth2me/essentials/items/FlatItemDb.java b/Essentials/src/main/java/com/earth2me/essentials/items/FlatItemDb.java index fa8f9e83829..eff20d361ea 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/items/FlatItemDb.java +++ b/Essentials/src/main/java/com/earth2me/essentials/items/FlatItemDb.java @@ -9,6 +9,9 @@ import com.google.gson.JsonParser; import net.ess3.api.IEssentials; import net.ess3.api.TranslatableException; +import net.ess3.provider.PersistentDataProvider; +import net.ess3.provider.PotionMetaProvider; +import net.ess3.provider.SpawnerItemProvider; import org.bukkit.Material; import org.bukkit.entity.EntityType; import org.bukkit.inventory.ItemStack; @@ -131,7 +134,7 @@ public ItemStack get(String id, final boolean useResolvers) throws Exception { final ItemData.EssentialPotionData potionData = data.getPotionData(); if (potionData != null && stack.getItemMeta() instanceof PotionMeta) { - ess.getPotionMetaProvider().setBasePotionType(stack, potionData.getType(), potionData.isExtended(), potionData.isUpgraded()); + ess.provider(PotionMetaProvider.class).setBasePotionType(stack, potionData.getType(), potionData.isExtended(), potionData.isUpgraded()); } final ItemMeta meta = stack.getItemMeta(); @@ -205,7 +208,7 @@ private ItemData lookup(final ItemStack is) { final Material type = is.getType(); if (MaterialUtil.isPotion(type) && is.getItemMeta() instanceof PotionMeta) { - final PotionMetaProvider provider = ess.getPotionMetaProvider(); + final PotionMetaProvider provider = ess.provider(PotionMetaProvider.class); return new ItemData(type, new ItemData.EssentialPotionData(provider.getBasePotionType(is), provider.isUpgraded(is), provider.isExtended(is))); } else if (type.toString().contains("SPAWNER")) { final EntityType entity = ess.provider(SpawnerItemProvider.class).getEntityType(is); diff --git a/providers/1_12Provider/src/main/java/net/ess3/provider/providers/LegacyBannerDataProvider.java b/providers/1_12Provider/src/main/java/net/ess3/provider/providers/LegacyBannerDataProvider.java index afd971ffd14..2a06ad753f8 100644 --- a/providers/1_12Provider/src/main/java/net/ess3/provider/providers/LegacyBannerDataProvider.java +++ b/providers/1_12Provider/src/main/java/net/ess3/provider/providers/LegacyBannerDataProvider.java @@ -1,10 +1,12 @@ package net.ess3.provider.providers; import net.ess3.provider.BannerDataProvider; +import net.essentialsx.providers.ProviderData; import org.bukkit.DyeColor; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.BannerMeta; +@ProviderData(description = "Legacy Banner Meta Provider") public class LegacyBannerDataProvider implements BannerDataProvider { @Override public DyeColor getBaseColor(ItemStack stack) { @@ -18,9 +20,4 @@ public void setBaseColor(ItemStack stack, DyeColor color) { bannerMeta.setBaseColor(color); stack.setItemMeta(bannerMeta); } - - @Override - public String getDescription() { - return "Legacy Banner Meta Provider"; - } } diff --git a/providers/1_12Provider/src/main/java/net/ess3/provider/providers/LegacyInventoryViewProvider.java b/providers/1_12Provider/src/main/java/net/ess3/provider/providers/LegacyInventoryViewProvider.java index 1fd5ca68f35..7a7fbfbddce 100644 --- a/providers/1_12Provider/src/main/java/net/ess3/provider/providers/LegacyInventoryViewProvider.java +++ b/providers/1_12Provider/src/main/java/net/ess3/provider/providers/LegacyInventoryViewProvider.java @@ -1,10 +1,12 @@ package net.ess3.provider.providers; import net.ess3.provider.InventoryViewProvider; +import net.essentialsx.providers.ProviderData; import org.bukkit.inventory.Inventory; import org.bukkit.inventory.InventoryView; import org.bukkit.inventory.ItemStack; +@ProviderData(description = "Legacy InventoryView Abstract Class ABI Provider") public class LegacyInventoryViewProvider implements InventoryViewProvider { @Override public Inventory getTopInventory(InventoryView view) { @@ -25,9 +27,4 @@ public void setItem(InventoryView view, int slot, ItemStack item) { public void close(InventoryView view) { view.close(); } - - @Override - public String getDescription() { - return "Legacy InventoryView Abstract Class ABI Provider"; - } } diff --git a/providers/1_12Provider/src/main/java/net/ess3/provider/providers/LegacyPotionMetaProvider.java b/providers/1_12Provider/src/main/java/net/ess3/provider/providers/LegacyPotionMetaProvider.java index d28fe62135d..667959f5e33 100644 --- a/providers/1_12Provider/src/main/java/net/ess3/provider/providers/LegacyPotionMetaProvider.java +++ b/providers/1_12Provider/src/main/java/net/ess3/provider/providers/LegacyPotionMetaProvider.java @@ -2,6 +2,8 @@ import com.google.common.collect.ImmutableMap; import net.ess3.provider.PotionMetaProvider; +import net.essentialsx.providers.ProviderData; +import net.essentialsx.providers.ProviderTest; import org.bukkit.Material; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.PotionMeta; @@ -12,6 +14,7 @@ import java.util.Collection; import java.util.Map; +@ProviderData(description = "1.9-1.20.4 Potion Meta Provider", weight = 1) public class LegacyPotionMetaProvider implements PotionMetaProvider { private static final Map damageValueToType = ImmutableMap.builder() .put(1, PotionType.REGEN) @@ -127,8 +130,14 @@ public void setBasePotionType(final ItemStack stack, final PotionType type, fina stack.setItemMeta(meta); } - @Override - public String getDescription() { - return "1.9-1.20.4 Potion Meta Provider"; + @ProviderTest + public static boolean test() { + try { + // This provider was created to support the new PotionData API introduced in 1.9 + Class.forName("org.bukkit.potion.PotionData"); + return false; + } catch (final Throwable ignored) { + return true; + } } } diff --git a/providers/1_8Provider/src/main/java/net/ess3/provider/providers/PrehistoricPotionMetaProvider.java b/providers/1_8Provider/src/main/java/net/ess3/provider/providers/PrehistoricPotionMetaProvider.java index 05dc7ce608b..c5df091122f 100644 --- a/providers/1_8Provider/src/main/java/net/ess3/provider/providers/PrehistoricPotionMetaProvider.java +++ b/providers/1_8Provider/src/main/java/net/ess3/provider/providers/PrehistoricPotionMetaProvider.java @@ -1,6 +1,7 @@ package net.ess3.provider.providers; import net.ess3.provider.PotionMetaProvider; +import net.essentialsx.providers.ProviderData; import org.bukkit.Material; import org.bukkit.inventory.ItemStack; import org.bukkit.potion.Potion; @@ -9,6 +10,7 @@ import java.util.Collection; +@ProviderData(description = "Legacy 1.8 Potion Meta Provider") public class PrehistoricPotionMetaProvider implements PotionMetaProvider { @Override public ItemStack createPotionItem(final Material initial, final int effectId) { @@ -77,9 +79,4 @@ public void setBasePotionType(final ItemStack stack, final PotionType type, fina potion.apply(stack); } - - @Override - public String getDescription() { - return "Legacy 1.8 Potion Meta Provider"; - } } diff --git a/providers/BaseProviders/src/main/java/net/ess3/provider/providers/BaseBannerDataProvider.java b/providers/BaseProviders/src/main/java/net/ess3/provider/providers/BaseBannerDataProvider.java index 4fbfb24a799..f7871349865 100644 --- a/providers/BaseProviders/src/main/java/net/ess3/provider/providers/BaseBannerDataProvider.java +++ b/providers/BaseProviders/src/main/java/net/ess3/provider/providers/BaseBannerDataProvider.java @@ -3,10 +3,13 @@ import com.google.common.collect.BiMap; import com.google.common.collect.HashBiMap; import net.ess3.provider.BannerDataProvider; +import net.essentialsx.providers.ProviderData; +import net.essentialsx.providers.ProviderTest; import org.bukkit.DyeColor; import org.bukkit.Material; import org.bukkit.inventory.ItemStack; +@ProviderData(description = "1.20.5+ Banner Data Provider", weight = 1) public class BaseBannerDataProvider implements BannerDataProvider { private final BiMap materialToDyeMap = HashBiMap.create(); @@ -42,8 +45,14 @@ public void setBaseColor(ItemStack stack, DyeColor color) { } } - @Override - public String getDescription() { - return "1.20.5+ Banner Data Provider."; + @ProviderTest + public static boolean test() { + try { + //noinspection unused + final Material needAVariable = Material.LIGHT_BLUE_BANNER; + return true; + } catch (final Throwable t) { + return false; + } } } diff --git a/providers/BaseProviders/src/main/java/net/ess3/provider/providers/BaseInventoryViewProvider.java b/providers/BaseProviders/src/main/java/net/ess3/provider/providers/BaseInventoryViewProvider.java index d6b8194e218..47cd709df81 100644 --- a/providers/BaseProviders/src/main/java/net/ess3/provider/providers/BaseInventoryViewProvider.java +++ b/providers/BaseProviders/src/main/java/net/ess3/provider/providers/BaseInventoryViewProvider.java @@ -1,10 +1,13 @@ package net.ess3.provider.providers; import net.ess3.provider.InventoryViewProvider; +import net.essentialsx.providers.ProviderData; +import net.essentialsx.providers.ProviderTest; import org.bukkit.inventory.Inventory; import org.bukkit.inventory.InventoryView; import org.bukkit.inventory.ItemStack; +@ProviderData(description = "1.21+ InventoryView Interface ABI Provider", weight = 1) public class BaseInventoryViewProvider implements InventoryViewProvider { @Override public Inventory getTopInventory(InventoryView view) { @@ -26,8 +29,8 @@ public void close(InventoryView view) { view.close(); } - @Override - public String getDescription() { - return "1.21+ InventoryView Interface ABI Provider"; + @ProviderTest + public static boolean test() { + return InventoryView.class.isInterface(); } } diff --git a/providers/BaseProviders/src/main/java/net/ess3/provider/providers/ModernPotionMetaProvider.java b/providers/BaseProviders/src/main/java/net/ess3/provider/providers/ModernPotionMetaProvider.java index 02ad54cdb2b..d46039336d8 100644 --- a/providers/BaseProviders/src/main/java/net/ess3/provider/providers/ModernPotionMetaProvider.java +++ b/providers/BaseProviders/src/main/java/net/ess3/provider/providers/ModernPotionMetaProvider.java @@ -1,6 +1,8 @@ package net.ess3.provider.providers; import net.ess3.provider.PotionMetaProvider; +import net.essentialsx.providers.ProviderData; +import net.essentialsx.providers.ProviderTest; import org.bukkit.Material; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.PotionMeta; @@ -9,6 +11,7 @@ import java.util.Collection; +@ProviderData(description = "1.20.6+ Potion Meta Provider", weight = 2) public class ModernPotionMetaProvider implements PotionMetaProvider { @Override public ItemStack createPotionItem(Material initial, int effectId) { @@ -100,8 +103,14 @@ public void setSplashPotion(ItemStack stack, boolean isSplash) { } } - @Override - public String getDescription() { - return "1.20.5+ Potion Meta Provider"; + @ProviderTest + public static boolean test() { + try { + // This provider was created due to Potion being removed in 1.20.6 + Class.forName("org.bukkit.potion.Potion"); + return false; + } catch (final Throwable ignored) { + return true; + } } } diff --git a/providers/PaperProvider/src/main/java/net/ess3/provider/providers/PaperBiomeKeyProvider.java b/providers/PaperProvider/src/main/java/net/ess3/provider/providers/PaperBiomeKeyProvider.java index 34c26ea4844..1b72d82b6f3 100644 --- a/providers/PaperProvider/src/main/java/net/ess3/provider/providers/PaperBiomeKeyProvider.java +++ b/providers/PaperProvider/src/main/java/net/ess3/provider/providers/PaperBiomeKeyProvider.java @@ -1,19 +1,30 @@ package net.ess3.provider.providers; import net.ess3.provider.BiomeKeyProvider; +import net.essentialsx.providers.ProviderData; +import net.essentialsx.providers.ProviderTest; import org.bukkit.Bukkit; import org.bukkit.NamespacedKey; +import org.bukkit.RegionAccessor; +import org.bukkit.UnsafeValues; import org.bukkit.block.Block; -@SuppressWarnings("deprecation") +@ProviderData(description = "Paper Biome Key Provider") public class PaperBiomeKeyProvider implements BiomeKeyProvider { @Override public NamespacedKey getBiomeKey(final Block block) { + //noinspection deprecation return Bukkit.getUnsafe().getBiomeKey(block.getWorld(), block.getX(), block.getY(), block.getZ()); } - @Override - public String getDescription() { - return "Paper Biome Key Provider"; + @ProviderTest + public static boolean test() { + try { + //noinspection deprecation + UnsafeValues.class.getDeclaredMethod("getBiomeKey", RegionAccessor.class, int.class, int.class, int.class); + return true; + } catch (final Throwable ignored) { + return false; + } } } From 2c4576ec39a2ba534e29b7f06d44cab57c2f2ad7 Mon Sep 17 00:00:00 2001 From: JRoy <10731363+JRoy@users.noreply.github.com> Date: Sun, 24 Nov 2024 19:33:28 -0500 Subject: [PATCH 09/14] fix compile --- .../src/main/java/com/earth2me/essentials/Essentials.java | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/Essentials/src/main/java/com/earth2me/essentials/Essentials.java b/Essentials/src/main/java/com/earth2me/essentials/Essentials.java index 4efa05001fc..e05cd0d72e9 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/Essentials.java +++ b/Essentials/src/main/java/com/earth2me/essentials/Essentials.java @@ -439,12 +439,7 @@ public void onEnable() { execTimer.mark("Init(Providers)"); reload(); - if (randomTeleport.getPreCache()) { - randomTeleport.cacheRandomLocations(randomTeleport.getCenter(), randomTeleport.getMinRange(), randomTeleport.getMaxRange()); - } - execTimer.mark("PreCache(RandomTeleport)"); - - // The item spawn blacklist is loaded with all other settings, before the item + // The item spawn blacklist is loaded with all other settings, before the item\ // DB, but it depends on the item DB, so we need to reload it again here: ((Settings) settings)._lateLoadItemSpawnBlacklist(); backup = new Backup(this); From cd007e893c44070db0bb1c089276793612bdba80 Mon Sep 17 00:00:00 2001 From: JRoy <10731363+JRoy@users.noreply.github.com> Date: Sat, 30 Nov 2024 15:57:07 -0500 Subject: [PATCH 10/14] fix compile --- .../main/java/com/earth2me/essentials/commands/Commandpay.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandpay.java b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandpay.java index 264a3effcf7..30c40c70737 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandpay.java +++ b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandpay.java @@ -10,6 +10,7 @@ import net.ess3.api.MaxMoneyException; import net.ess3.api.TranslatableException; import net.ess3.api.events.UserBalanceUpdateEvent; +import net.ess3.provider.PlayerLocaleProvider; import org.bukkit.Server; import java.math.BigDecimal; @@ -42,7 +43,7 @@ public void run(final Server server, final User user, final String commandLabel, final BigDecimal amount; if (ess.getSettings().isPerPlayerLocale()) { - amount = NumberUtil.parseStringToBDecimal(ogStr, user.getPlayerLocale(ess.getPlayerLocaleProvider().getLocale(user.getBase()))); + amount = NumberUtil.parseStringToBDecimal(ogStr, user.getPlayerLocale(ess.getProviders().get(PlayerLocaleProvider.class).getLocale(user.getBase()))); } else { amount = NumberUtil.parseStringToBDecimal(ogStr); } From 5b146f8383aa078c5f2b2b22bf8df520c381fd01 Mon Sep 17 00:00:00 2001 From: JRoy <10731363+JRoy@users.noreply.github.com> Date: Wed, 18 Dec 2024 21:05:03 -0500 Subject: [PATCH 11/14] fix issue w/FormattedCommandAliasProvider on 1.8 forks --- .../ReflFormattedCommandAliasProvider.java | 25 ++++++++++--------- 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/providers/NMSReflectionProvider/src/main/java/net/ess3/nms/refl/providers/ReflFormattedCommandAliasProvider.java b/providers/NMSReflectionProvider/src/main/java/net/ess3/nms/refl/providers/ReflFormattedCommandAliasProvider.java index 1e3d9f6159e..ff20f66b32d 100644 --- a/providers/NMSReflectionProvider/src/main/java/net/ess3/nms/refl/providers/ReflFormattedCommandAliasProvider.java +++ b/providers/NMSReflectionProvider/src/main/java/net/ess3/nms/refl/providers/ReflFormattedCommandAliasProvider.java @@ -15,14 +15,12 @@ @ProviderData(description = "Reflection Formatted Command Alias Provider") public class ReflFormattedCommandAliasProvider implements FormattedCommandAliasProvider { - - private final boolean paper; + private final boolean senderArg; private final Field formatStringsField; private final MethodHandle buildCommandMethodHandle; - public ReflFormattedCommandAliasProvider(final boolean paper) { - this.paper = paper; - + public ReflFormattedCommandAliasProvider() { + boolean senderArg = true; final Class formattedCommandAliasClass; Field formatStringsField = null; MethodHandle buildCommandMethodHandle = null; @@ -30,14 +28,16 @@ public ReflFormattedCommandAliasProvider(final boolean paper) { formattedCommandAliasClass = FormattedCommandAlias.class; formatStringsField = ReflUtil.getFieldCached(formattedCommandAliasClass, "formatStrings"); - final Class[] parameterTypes; - if (paper) { - parameterTypes = new Class[] {CommandSender.class, String.class, String[].class}; - } else { - parameterTypes = new Class[] {String.class, String[].class}; + Method buildCommandMethod = ReflUtil.getMethodCached(formattedCommandAliasClass, "buildCommand", CommandSender.class, String.class, String[].class); + if (buildCommandMethod == null) { + senderArg = false; + buildCommandMethod = ReflUtil.getMethodCached(formattedCommandAliasClass, "buildCommand", String.class, String[].class); + } + + if (buildCommandMethod == null) { + throw new NoSuchMethodException("Could not find buildCommand method in FormattedCommandAlias"); } - final Method buildCommandMethod = ReflUtil.getMethodCached(formattedCommandAliasClass, "buildCommand", parameterTypes); buildCommandMethod.setAccessible(true); buildCommandMethodHandle = MethodHandles.lookup().unreflect(buildCommandMethod); } catch (final Exception ex) { @@ -45,6 +45,7 @@ public ReflFormattedCommandAliasProvider(final boolean paper) { } finally { this.formatStringsField = formatStringsField; this.buildCommandMethodHandle = buildCommandMethodHandle; + this.senderArg = senderArg; } } @@ -77,7 +78,7 @@ public String[] getFormatStrings(FormattedCommandAlias command) { @Override public String buildCommand(FormattedCommandAlias command, CommandSender sender, String formatString, String[] args) { try { - if (paper) { + if (senderArg) { return (String) buildCommandMethodHandle.invoke(command, sender, formatString, args); } else { return (String) buildCommandMethodHandle.invoke(command, formatString, args); From 73426f42d3bce26716d76c5a571b4855d951de68 Mon Sep 17 00:00:00 2001 From: JRoy <10731363+JRoy@users.noreply.github.com> Date: Mon, 30 Dec 2024 08:48:07 -0500 Subject: [PATCH 12/14] fix old provider method call --- .../main/java/com/earth2me/essentials/commands/Commandpay.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandpay.java b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandpay.java index 30c40c70737..3f7d353af6f 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandpay.java +++ b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandpay.java @@ -43,7 +43,8 @@ public void run(final Server server, final User user, final String commandLabel, final BigDecimal amount; if (ess.getSettings().isPerPlayerLocale()) { - amount = NumberUtil.parseStringToBDecimal(ogStr, user.getPlayerLocale(ess.getProviders().get(PlayerLocaleProvider.class).getLocale(user.getBase()))); + final String playerLocale = ess.provider(PlayerLocaleProvider.class).getLocale(user.getBase()); + amount = NumberUtil.parseStringToBDecimal(ogStr, user.getPlayerLocale(playerLocale)); } else { amount = NumberUtil.parseStringToBDecimal(ogStr); } From aad0ee5778c152a1810ff7487c1233c29df51e64 Mon Sep 17 00:00:00 2001 From: JRoy <10731363+JRoy@users.noreply.github.com> Date: Mon, 30 Dec 2024 09:09:35 -0500 Subject: [PATCH 13/14] review concerns --- .../com/earth2me/essentials/Essentials.java | 21 +++++++++---------- .../earth2me/essentials/ProviderFactory.java | 11 ++++++---- .../earth2me/essentials/RandomTeleport.java | 2 +- .../net/ess3/provider/BiomeKeyProvider.java | 2 ++ .../net/ess3/provider/ContainerProvider.java | 2 ++ .../ess3/provider/SerializationProvider.java | 2 ++ .../net/ess3/provider/SignDataProvider.java | 2 ++ .../providers/NullableProvider.java | 14 +++++++++++++ 8 files changed, 40 insertions(+), 16 deletions(-) create mode 100644 providers/BaseProviders/src/main/java/net/essentialsx/providers/NullableProvider.java diff --git a/Essentials/src/main/java/com/earth2me/essentials/Essentials.java b/Essentials/src/main/java/com/earth2me/essentials/Essentials.java index e05cd0d72e9..2ae888decd9 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/Essentials.java +++ b/Essentials/src/main/java/com/earth2me/essentials/Essentials.java @@ -432,6 +432,9 @@ public void onEnable() { ((Cancellable) event).setCancelled(true); } }); + if (getSettings().isDebug()) { + LOGGER.log(Level.INFO, "Registered Paper Recipe Book Event Listener"); + } } catch (final ClassNotFoundException ignored) { } } @@ -439,7 +442,7 @@ public void onEnable() { execTimer.mark("Init(Providers)"); reload(); - // The item spawn blacklist is loaded with all other settings, before the item\ + // The item spawn blacklist is loaded with all other settings, before the item // DB, but it depends on the item DB, so we need to reload it again here: ((Settings) settings)._lateLoadItemSpawnBlacklist(); backup = new Backup(this); @@ -667,11 +670,9 @@ public List onTabCompleteEssentials(final CommandSender cSender, final C // Check for disabled commands if (getSettings().isCommandDisabled(commandLabel)) { - if (provider(KnownCommandsProvider.class).getKnownCommands().containsKey(commandLabel)) { - final Command newCmd = provider(KnownCommandsProvider.class).getKnownCommands().get(commandLabel); - if (!(newCmd instanceof PluginIdentifiableCommand) || ((PluginIdentifiableCommand) newCmd).getPlugin() != this) { - return newCmd.tabComplete(cSender, commandLabel, args); - } + final Command newCmd = provider(KnownCommandsProvider.class).getKnownCommands().get(commandLabel); + if (newCmd != null && (!(newCmd instanceof PluginIdentifiableCommand) || ((PluginIdentifiableCommand) newCmd).getPlugin() != this)) { + return newCmd.tabComplete(cSender, commandLabel, args); } return Collections.emptyList(); } @@ -778,11 +779,9 @@ public boolean onCommandEssentials(final CommandSender cSender, final Command co // Check for disabled commands if (getSettings().isCommandDisabled(commandLabel)) { - if (provider(KnownCommandsProvider.class).getKnownCommands().containsKey(commandLabel)) { - final Command newCmd = provider(KnownCommandsProvider.class).getKnownCommands().get(commandLabel); - if (!(newCmd instanceof PluginIdentifiableCommand) || !isEssentialsPlugin(((PluginIdentifiableCommand) newCmd).getPlugin())) { - return newCmd.execute(cSender, commandLabel, args); - } + final Command newCmd = provider(KnownCommandsProvider.class).getKnownCommands().get(commandLabel); + if (newCmd != null && (!(newCmd instanceof PluginIdentifiableCommand) || !isEssentialsPlugin(((PluginIdentifiableCommand) newCmd).getPlugin()))) { + return newCmd.execute(cSender, commandLabel, args); } sender.sendTl("commandDisabled", commandLabel); return true; diff --git a/Essentials/src/main/java/com/earth2me/essentials/ProviderFactory.java b/Essentials/src/main/java/com/earth2me/essentials/ProviderFactory.java index 1521ba69769..80de68734f3 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/ProviderFactory.java +++ b/Essentials/src/main/java/com/earth2me/essentials/ProviderFactory.java @@ -2,6 +2,7 @@ import io.papermc.lib.PaperLib; import net.ess3.provider.Provider; +import net.essentialsx.providers.NullableProvider; import net.essentialsx.providers.ProviderData; import net.essentialsx.providers.ProviderTest; import org.bukkit.plugin.Plugin; @@ -55,6 +56,7 @@ public final void registerProvider(final Class... toRegister public void finalizeRegistration() { for (final Map.Entry, List>> entry : registeredProviders.entrySet()) { final Class providerClass = entry.getKey(); + final boolean nullable = providerClass.isAnnotationPresent(NullableProvider.class); Class highestProvider = null; ProviderData highestProviderData = null; int highestWeight = -1; @@ -70,12 +72,13 @@ public void finalizeRegistration() { essentials.getLogger().log(Level.SEVERE, "Failed to initialize provider " + provider.getName(), e); } } - if (highestProvider == null) { + + if (highestProvider != null) { + essentials.getLogger().info("Selected " + highestProviderData.description() + " as the provider for " + providerClass.getSimpleName()); + providers.put(providerClass, getProviderInstance(highestProvider)); + } else if (!nullable) { throw new IllegalStateException("No provider found for " + providerClass.getName()); } - - essentials.getLogger().info("Selected " + highestProviderData.description() + " as the provider for " + providerClass.getSimpleName()); - providers.put(providerClass, getProviderInstance(highestProvider)); } registeredProviders.clear(); } diff --git a/Essentials/src/main/java/com/earth2me/essentials/RandomTeleport.java b/Essentials/src/main/java/com/earth2me/essentials/RandomTeleport.java index 9541c79fac4..163e76dcaa0 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/RandomTeleport.java +++ b/Essentials/src/main/java/com/earth2me/essentials/RandomTeleport.java @@ -35,7 +35,7 @@ public class RandomTeleport implements IConf { public RandomTeleport(final IEssentials essentials) { this.ess = essentials; config = new EssentialsConfiguration(new File(essentials.getDataFolder(), "tpr.yml"), "/tpr.yml", - "Configuration for the random teleport command.\nSome settings may be defaulted, and can be changed via the /settpr command in-game."); + "Configuration for the random teleport command.\nUse the /settpr command in-game to set random teleport locations."); } public EssentialsConfiguration getConfig() { diff --git a/providers/BaseProviders/src/main/java/net/ess3/provider/BiomeKeyProvider.java b/providers/BaseProviders/src/main/java/net/ess3/provider/BiomeKeyProvider.java index 94ee756fc03..fff7290b08a 100644 --- a/providers/BaseProviders/src/main/java/net/ess3/provider/BiomeKeyProvider.java +++ b/providers/BaseProviders/src/main/java/net/ess3/provider/BiomeKeyProvider.java @@ -1,8 +1,10 @@ package net.ess3.provider; +import net.essentialsx.providers.NullableProvider; import org.bukkit.NamespacedKey; import org.bukkit.block.Block; +@NullableProvider public interface BiomeKeyProvider extends Provider { NamespacedKey getBiomeKey(Block block); } diff --git a/providers/BaseProviders/src/main/java/net/ess3/provider/ContainerProvider.java b/providers/BaseProviders/src/main/java/net/ess3/provider/ContainerProvider.java index f1d886335a6..cb8654a99b5 100644 --- a/providers/BaseProviders/src/main/java/net/ess3/provider/ContainerProvider.java +++ b/providers/BaseProviders/src/main/java/net/ess3/provider/ContainerProvider.java @@ -1,8 +1,10 @@ package net.ess3.provider; +import net.essentialsx.providers.NullableProvider; import org.bukkit.entity.Player; import org.bukkit.inventory.InventoryView; +@NullableProvider public interface ContainerProvider extends Provider { InventoryView openAnvil(Player player); diff --git a/providers/BaseProviders/src/main/java/net/ess3/provider/SerializationProvider.java b/providers/BaseProviders/src/main/java/net/ess3/provider/SerializationProvider.java index 252af46be6b..6ccaf94862f 100644 --- a/providers/BaseProviders/src/main/java/net/ess3/provider/SerializationProvider.java +++ b/providers/BaseProviders/src/main/java/net/ess3/provider/SerializationProvider.java @@ -1,7 +1,9 @@ package net.ess3.provider; +import net.essentialsx.providers.NullableProvider; import org.bukkit.inventory.ItemStack; +@NullableProvider public interface SerializationProvider extends Provider { byte[] serializeItem(ItemStack stack); diff --git a/providers/BaseProviders/src/main/java/net/ess3/provider/SignDataProvider.java b/providers/BaseProviders/src/main/java/net/ess3/provider/SignDataProvider.java index f84c851444d..d4215d6b705 100644 --- a/providers/BaseProviders/src/main/java/net/ess3/provider/SignDataProvider.java +++ b/providers/BaseProviders/src/main/java/net/ess3/provider/SignDataProvider.java @@ -1,7 +1,9 @@ package net.ess3.provider; +import net.essentialsx.providers.NullableProvider; import org.bukkit.block.Sign; +@NullableProvider public interface SignDataProvider extends Provider { void setSignData(Sign sign, String key, String value); diff --git a/providers/BaseProviders/src/main/java/net/essentialsx/providers/NullableProvider.java b/providers/BaseProviders/src/main/java/net/essentialsx/providers/NullableProvider.java new file mode 100644 index 00000000000..32d8606945f --- /dev/null +++ b/providers/BaseProviders/src/main/java/net/essentialsx/providers/NullableProvider.java @@ -0,0 +1,14 @@ +package net.essentialsx.providers; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * Marks a provider as nullable, meaning that an error will not be thrown if no provider is found for the given type. + */ +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.TYPE) +public @interface NullableProvider { +} From a869f09d436c137095b971cdc9fdb3107c7b2861 Mon Sep 17 00:00:00 2001 From: JRoy <10731363+JRoy@users.noreply.github.com> Date: Mon, 30 Dec 2024 09:15:26 -0500 Subject: [PATCH 14/14] fix 1.8 spigot compat --- .../com/earth2me/essentials/ProviderFactory.java | 14 ++++++++++---- .../net/ess3/provider/MaterialTagProvider.java | 2 ++ 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/Essentials/src/main/java/com/earth2me/essentials/ProviderFactory.java b/Essentials/src/main/java/com/earth2me/essentials/ProviderFactory.java index 80de68734f3..e9b23dc13e4 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/ProviderFactory.java +++ b/Essentials/src/main/java/com/earth2me/essentials/ProviderFactory.java @@ -78,18 +78,24 @@ public void finalizeRegistration() { providers.put(providerClass, getProviderInstance(highestProvider)); } else if (!nullable) { throw new IllegalStateException("No provider found for " + providerClass.getName()); + } else { + essentials.getLogger().info("No provider found for " + providerClass.getSimpleName() + ", but it is nullable"); } } registeredProviders.clear(); } private boolean testProvider(final Class providerClass) throws InvocationTargetException, IllegalAccessException { - for (final Method method : providerClass.getMethods()) { - if (method.isAnnotationPresent(ProviderTest.class)) { - return (Boolean) method.invoke(null); + try { + for (final Method method : providerClass.getMethods()) { + if (method.isAnnotationPresent(ProviderTest.class)) { + return (Boolean) method.invoke(null); + } } + return true; + } catch (final NoClassDefFoundError ignored) { + return false; } - return true; } private

P getProviderInstance(final Class

provider) { diff --git a/providers/BaseProviders/src/main/java/net/ess3/provider/MaterialTagProvider.java b/providers/BaseProviders/src/main/java/net/ess3/provider/MaterialTagProvider.java index 056132e668a..63f87c731d1 100644 --- a/providers/BaseProviders/src/main/java/net/ess3/provider/MaterialTagProvider.java +++ b/providers/BaseProviders/src/main/java/net/ess3/provider/MaterialTagProvider.java @@ -1,7 +1,9 @@ package net.ess3.provider; +import net.essentialsx.providers.NullableProvider; import org.bukkit.Material; +@NullableProvider public interface MaterialTagProvider extends Provider { boolean tagExists(String tagName);