diff --git a/pom.xml b/pom.xml index fb39a2584..5136da500 100755 --- a/pom.xml +++ b/pom.xml @@ -154,6 +154,7 @@ net.kyori:adventure-text-serializer-craftbukkit net.kyori:adventure-text-serializer-gson-legacy-impl co.aikar:acf-bukkit + io.papermc:paperlib @@ -189,6 +190,10 @@ org.bstats com.gmail.nossr50.mcmmo.metrics.bstats + + io.papermc.lib + com.gmail.nossr50.mcmmo.paperlib + @@ -241,6 +246,10 @@ sonatype-oss-snapshots1 https://s01.oss.sonatype.org/content/repositories/snapshots/ + + papermc + https://papermc.io/repo/repository/maven-public/ + @@ -362,5 +371,10 @@ 31.1-jre compile + + io.papermc + paperlib + 1.0.8 + diff --git a/src/main/java/com/gmail/nossr50/listeners/BlockListener.java b/src/main/java/com/gmail/nossr50/listeners/BlockListener.java index 4e36e5e5c..5e1ec0158 100644 --- a/src/main/java/com/gmail/nossr50/listeners/BlockListener.java +++ b/src/main/java/com/gmail/nossr50/listeners/BlockListener.java @@ -13,6 +13,7 @@ import com.gmail.nossr50.events.fake.FakeBlockBreakEvent; import com.gmail.nossr50.events.fake.FakeBlockDamageEvent; import com.gmail.nossr50.events.fake.FakeEvent; import com.gmail.nossr50.mcMMO; +import com.gmail.nossr50.runnables.skills.AlchemyBrewTask; import com.gmail.nossr50.skills.alchemy.Alchemy; import com.gmail.nossr50.skills.excavation.ExcavationManager; import com.gmail.nossr50.skills.herbalism.HerbalismManager; @@ -27,6 +28,7 @@ import com.gmail.nossr50.util.sounds.SoundManager; import com.gmail.nossr50.util.sounds.SoundType; import com.gmail.nossr50.worldguard.WorldGuardManager; import com.gmail.nossr50.worldguard.WorldGuardUtils; +import io.papermc.lib.PaperLib; import org.bukkit.*; import org.bukkit.block.*; import org.bukkit.entity.Item; @@ -36,8 +38,10 @@ import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; import org.bukkit.event.block.*; import org.bukkit.inventory.ItemStack; +import org.bukkit.metadata.MetadataValue; import java.util.HashSet; +import java.util.List; public class BlockListener implements Listener { private final mcMMO plugin; @@ -104,8 +108,9 @@ public class BlockListener implements Listener { } } - if (event.getBlock().getMetadata(MetadataConstants.METADATA_KEY_BONUS_DROPS).size() > 0) { - BonusDropMeta bonusDropMeta = (BonusDropMeta) event.getBlock().getMetadata(MetadataConstants.METADATA_KEY_BONUS_DROPS).get(0); + List metadata = event.getBlock().getMetadata(MetadataConstants.METADATA_KEY_BONUS_DROPS); + if (metadata.size() > 0) { + BonusDropMeta bonusDropMeta = (BonusDropMeta) metadata.get(0); int bonusCount = bonusDropMeta.asInt(); for (int i = 0; i < bonusCount; i++) { @@ -115,8 +120,7 @@ public class BlockListener implements Listener { } } - if(event.getBlock().hasMetadata(MetadataConstants.METADATA_KEY_BONUS_DROPS)) - event.getBlock().removeMetadata(MetadataConstants.METADATA_KEY_BONUS_DROPS, plugin); + event.getBlock().removeMetadata(MetadataConstants.METADATA_KEY_BONUS_DROPS, plugin); } /** @@ -339,7 +343,7 @@ public class BlockListener implements Listener { } } - BlockState blockState = block.getState(); + BlockState blockState = PaperLib.getBlockState(block, false).getState(); Location location = blockState.getLocation(); // if (!BlockUtils.shouldBeWatched(blockState)) { @@ -347,8 +351,10 @@ public class BlockListener implements Listener { // } /* ALCHEMY - Cancel any brew in progress for that BrewingStand */ - if (blockState instanceof BrewingStand && Alchemy.brewingStandMap.containsKey(location)) { - Alchemy.brewingStandMap.get(location).cancelBrew(); + if (blockState instanceof BrewingStand) { + AlchemyBrewTask task = Alchemy.brewingStandMap.get(location); + if (task != null) + task.cancelBrew(); } Player player = event.getPlayer(); @@ -605,17 +611,11 @@ public class BlockListener implements Listener { Player player = event.getPlayer(); - if (!UserManager.hasPlayerDataKey(player)) { - return; - } - McMMOPlayer mcMMOPlayer = UserManager.getPlayer(player); //Profile not loaded - if(UserManager.getPlayer(player) == null) - { + if (mcMMOPlayer == null) return; - } ItemStack heldItem = player.getInventory().getItemInMainHand(); Block block = event.getBlock(); @@ -659,37 +659,30 @@ public class BlockListener implements Listener { McMMOPlayer mcMMOPlayer = UserManager.getPlayer(player); //Profile not loaded - if(UserManager.getPlayer(player) == null) - { + if (mcMMOPlayer == null) return; - } - BlockState blockState = event.getBlock().getState(); + BlockState blockState = PaperLib.getBlockState(event.getBlock(), false).getState(); ItemStack heldItem = player.getInventory().getItemInMainHand(); cleanupAbilityTools(player, mcMMOPlayer, blockState, heldItem); - debugStickDump(player, blockState); + debugStickDump(player, mcMMOPlayer, blockState); } //TODO: Rewrite this //TODO: Convert into locale strings - private void debugStickDump(Player player, BlockState blockState) { - //Profile not loaded - if(UserManager.getPlayer(player) == null) - { - return; - } + private void debugStickDump(Player player, McMMOPlayer mcmmoPlayer, BlockState blockState) { - if(UserManager.getPlayer(player).isDebugMode()) + if(mcmmoPlayer.isDebugMode()) { if(mcMMO.getPlaceStore().isTrue(blockState)) player.sendMessage("[mcMMO DEBUG] This block is not natural and does not reward treasures/XP"); else { player.sendMessage("[mcMMO DEBUG] This block is considered natural by mcMMO"); - UserManager.getPlayer(player).getExcavationManager().printExcavationDebug(player, blockState); + mcmmoPlayer.getExcavationManager().printExcavationDebug(player, blockState); } if(WorldGuardUtils.isWorldGuardLoaded()) diff --git a/src/main/java/com/gmail/nossr50/listeners/InventoryListener.java b/src/main/java/com/gmail/nossr50/listeners/InventoryListener.java index 6be0eb357..0c1e36c71 100644 --- a/src/main/java/com/gmail/nossr50/listeners/InventoryListener.java +++ b/src/main/java/com/gmail/nossr50/listeners/InventoryListener.java @@ -7,6 +7,7 @@ import com.gmail.nossr50.datatypes.skills.SubSkillType; import com.gmail.nossr50.events.fake.FakeBrewEvent; import com.gmail.nossr50.mcMMO; import com.gmail.nossr50.runnables.player.PlayerUpdateInventoryTask; +import com.gmail.nossr50.runnables.skills.AlchemyBrewTask; import com.gmail.nossr50.skills.alchemy.Alchemy; import com.gmail.nossr50.skills.alchemy.AlchemyPotionBrewer; import com.gmail.nossr50.util.ItemUtils; @@ -16,6 +17,7 @@ import com.gmail.nossr50.util.player.UserManager; import com.gmail.nossr50.util.skills.SkillUtils; import com.gmail.nossr50.worldguard.WorldGuardManager; import com.gmail.nossr50.worldguard.WorldGuardUtils; +import io.papermc.lib.PaperLib; import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.OfflinePlayer; @@ -54,11 +56,8 @@ public class InventoryListener implements Listener { Furnace furnace = (Furnace) furnaceState; OfflinePlayer offlinePlayer = mcMMO.getSmeltingTracker().getFurnaceOwner(furnace); - Player player; - - if(offlinePlayer != null && offlinePlayer.isOnline() && offlinePlayer instanceof Player) { - player = (Player) offlinePlayer; + if(offlinePlayer != null && offlinePlayer.isOnline() && offlinePlayer instanceof Player player) { if (!Permissions.isSubSkillEnabled(player, SubSkillType.SMELTING_FUEL_EFFICIENCY)) { return; } @@ -91,7 +90,7 @@ public class InventoryListener implements Listener { if(WorldBlacklist.isWorldBlacklisted(event.getBlock().getWorld())) return; - BlockState blockState = event.getBlock().getState(); //Furnaces can only be cast from a BlockState not a Block + BlockState blockState = PaperLib.getBlockState(event.getBlock(), false).getState(); //Furnaces can only be cast from a BlockState not a Block ItemStack smelting = event.getSource(); if (!ItemUtils.isSmeltable(smelting)) { @@ -120,12 +119,12 @@ public class InventoryListener implements Listener { if(WorldBlacklist.isWorldBlacklisted(event.getPlayer().getWorld())) return; - BlockState furnaceBlock = event.getBlock().getState(); - if (!ItemUtils.isSmelted(new ItemStack(event.getItemType(), event.getItemAmount()))) { return; } + BlockState furnaceBlock = PaperLib.getBlockState(event.getBlock(), false).getState(); + Player player = event.getPlayer(); if(furnaceBlock instanceof Furnace) { @@ -136,18 +135,14 @@ public class InventoryListener implements Listener { return; } - if (!UserManager.hasPlayerDataKey(player) || !Permissions.vanillaXpBoost(player, PrimarySkillType.SMELTING)) { - return; - } + McMMOPlayer mcMMOPlayer = UserManager.getPlayer(player); - //Profile not loaded - if(UserManager.getPlayer(player) == null) - { + if (mcMMOPlayer == null || !Permissions.vanillaXpBoost(player, PrimarySkillType.SMELTING)) { return; } int xpToDrop = event.getExpToDrop(); - int exp = UserManager.getPlayer(player).getSmeltingManager().vanillaXPBoost(xpToDrop); + int exp = mcMMOPlayer.getSmeltingManager().vanillaXPBoost(xpToDrop); event.setExpToDrop(exp); } } @@ -164,7 +159,7 @@ public class InventoryListener implements Listener { Inventory inventory = event.getInventory(); - Player player = ((Player) event.getWhoClicked()).getPlayer(); + Player player = ((Player) event.getWhoClicked()); if(event.getInventory() instanceof FurnaceInventory) { @@ -181,7 +176,7 @@ public class InventoryListener implements Listener { return; } - InventoryHolder holder = inventory.getHolder(); + InventoryHolder holder = PaperLib.getHolder(inventory, false).getHolder(); if (!(holder instanceof BrewingStand stand)) { return; @@ -287,13 +282,17 @@ public class InventoryListener implements Listener { if(WorldBlacklist.isWorldBlacklisted(event.getWhoClicked().getWorld())) return; - Inventory inventory = event.getInventory(); - - if (!(inventory instanceof BrewerInventory)) { + if (!event.getInventorySlots().contains(Alchemy.INGREDIENT_SLOT)) { return; } - InventoryHolder holder = inventory.getHolder(); + Inventory inventory = event.getInventory(); + + if (!(inventory instanceof BrewerInventory brewerInventory)) { + return; + } + + InventoryHolder holder = PaperLib.getHolder(inventory, false).getHolder(); if (!(holder instanceof BrewingStand)) { return; @@ -305,12 +304,8 @@ public class InventoryListener implements Listener { return; } - if (!event.getInventorySlots().contains(Alchemy.INGREDIENT_SLOT)) { - return; - } - ItemStack cursor = event.getCursor(); - ItemStack ingredient = ((BrewerInventory) inventory).getIngredient(); + ItemStack ingredient = brewerInventory.getIngredient(); if (AlchemyPotionBrewer.isEmpty(ingredient) || ingredient.isSimilar(cursor)) { Player player = (Player) whoClicked; @@ -344,8 +339,9 @@ public class InventoryListener implements Listener { if (event instanceof FakeBrewEvent) return; Location location = event.getBlock().getLocation(); - if (Alchemy.brewingStandMap.containsKey(location)) { - Alchemy.brewingStandMap.get(location).finishImmediately(); + AlchemyBrewTask task = Alchemy.brewingStandMap.get(location); + if (task != null) { + task.finishImmediately(); event.setCancelled(true); } } @@ -364,7 +360,7 @@ public class InventoryListener implements Listener { return; } - InventoryHolder holder = inventory.getHolder(); + InventoryHolder holder = PaperLib.getHolder(inventory, false).getHolder(); if (!(holder instanceof BrewingStand)) { return; diff --git a/src/main/java/com/gmail/nossr50/locale/LocaleLoader.java b/src/main/java/com/gmail/nossr50/locale/LocaleLoader.java index 38944f720..20dd27830 100644 --- a/src/main/java/com/gmail/nossr50/locale/LocaleLoader.java +++ b/src/main/java/com/gmail/nossr50/locale/LocaleLoader.java @@ -103,8 +103,7 @@ public final class LocaleLoader { public static String formatString(String string, Object... messageArguments) { if (messageArguments != null) { - MessageFormat formatter = new MessageFormat(""); - formatter.applyPattern(string.replace("'", "''")); + MessageFormat formatter = new MessageFormat(string.replace("'", "''")); string = formatter.format(messageArguments); } @@ -115,8 +114,7 @@ public final class LocaleLoader { public static @NotNull TextComponent formatComponent(@NotNull String string, Object... messageArguments) { if (messageArguments != null) { - MessageFormat formatter = new MessageFormat(""); - formatter.applyPattern(string.replace("'", "''")); + MessageFormat formatter = new MessageFormat(string.replace("'", "''")); string = formatter.format(messageArguments); } diff --git a/src/main/java/com/gmail/nossr50/metadata/ItemMetadataService.java b/src/main/java/com/gmail/nossr50/metadata/ItemMetadataService.java index f1d1e9471..d3a117312 100644 --- a/src/main/java/com/gmail/nossr50/metadata/ItemMetadataService.java +++ b/src/main/java/com/gmail/nossr50/metadata/ItemMetadataService.java @@ -73,19 +73,15 @@ public class ItemMetadataService { ItemMeta itemMeta = itemStack.getItemMeta(); if(itemMeta != null) { - //TODO: can be optimized - if (itemMeta.hasEnchant(Enchantment.DIG_SPEED)) { - itemMeta.removeEnchant(Enchantment.DIG_SPEED); - } - if (originalSpeed > 0) { itemMeta.addEnchant(Enchantment.DIG_SPEED, originalSpeed, true); + } else { + itemMeta.removeEnchant(Enchantment.DIG_SPEED); } PersistentDataContainer dataContainer = itemMeta.getPersistentDataContainer(); dataContainer.remove(NSK_SUPER_ABILITY_BOOSTED_ITEM); //Remove persistent data - //TODO: needed? itemStack.setItemMeta(itemMeta); } } diff --git a/src/main/java/com/gmail/nossr50/runnables/skills/AlchemyBrewTask.java b/src/main/java/com/gmail/nossr50/runnables/skills/AlchemyBrewTask.java index 7a615bd96..9e33b0551 100644 --- a/src/main/java/com/gmail/nossr50/runnables/skills/AlchemyBrewTask.java +++ b/src/main/java/com/gmail/nossr50/runnables/skills/AlchemyBrewTask.java @@ -1,5 +1,6 @@ package com.gmail.nossr50.runnables.skills; +import com.gmail.nossr50.datatypes.player.McMMOPlayer; import com.gmail.nossr50.datatypes.skills.PrimarySkillType; import com.gmail.nossr50.datatypes.skills.SubSkillType; import com.gmail.nossr50.events.skills.alchemy.McMMOPlayerBrewEvent; @@ -12,7 +13,6 @@ import com.gmail.nossr50.util.Permissions; import com.gmail.nossr50.util.player.UserManager; import org.bukkit.Location; import org.bukkit.Material; -import org.bukkit.block.BlockState; import org.bukkit.block.BrewingStand; import org.bukkit.entity.Player; import org.bukkit.scheduler.BukkitRunnable; @@ -21,7 +21,7 @@ public class AlchemyBrewTask extends BukkitRunnable { private static final double DEFAULT_BREW_SPEED = 1.0; private static final int DEFAULT_BREW_TICKS = 400; - private final BlockState brewingStand; + private final BrewingStand brewingStand; private final Location location; private double brewSpeed; private double brewTimer; @@ -29,7 +29,7 @@ public class AlchemyBrewTask extends BukkitRunnable { private int fuel; private boolean firstRun = true; - public AlchemyBrewTask(BlockState brewingStand, Player player) { + public AlchemyBrewTask(BrewingStand brewingStand, Player player) { this.brewingStand = brewingStand; this.location = brewingStand.getLocation(); this.player = player; @@ -37,12 +37,14 @@ public class AlchemyBrewTask extends BukkitRunnable { brewSpeed = DEFAULT_BREW_SPEED; brewTimer = DEFAULT_BREW_TICKS; + McMMOPlayer mcMMOPlayer = UserManager.getPlayer(player); + if (player != null && !Misc.isNPCEntityExcludingVillagers(player) && Permissions.isSubSkillEnabled(player, SubSkillType.ALCHEMY_CATALYSIS) - && UserManager.getPlayer(player) != null) { + && mcMMOPlayer != null) { - double catalysis = UserManager.getPlayer(player).getAlchemyManager().calculateBrewSpeed(Permissions.lucky(player, PrimarySkillType.ALCHEMY)); + double catalysis = mcMMOPlayer.getAlchemyManager().calculateBrewSpeed(Permissions.lucky(player, PrimarySkillType.ALCHEMY)); McMMOPlayerCatalysisEvent event = new McMMOPlayerCatalysisEvent(player, catalysis); mcMMO.p.getServer().getPluginManager().callEvent(event); @@ -52,13 +54,14 @@ public class AlchemyBrewTask extends BukkitRunnable { } } - if (Alchemy.brewingStandMap.containsKey(location)) { - Alchemy.brewingStandMap.get(location).cancel(); + AlchemyBrewTask existing = Alchemy.brewingStandMap.get(location); + if (existing != null) { + existing.cancel(); } - fuel = ((BrewingStand) brewingStand).getFuelLevel(); + fuel = brewingStand.getFuelLevel(); - if (((BrewingStand) brewingStand).getBrewingTime() == -1) // Only decrement on our end if it isn't a vanilla ingredient. + if (brewingStand.getBrewingTime() == -1) // Only decrement on our end if it isn't a vanilla ingredient. fuel--; Alchemy.brewingStandMap.put(location, this); @@ -67,10 +70,8 @@ public class AlchemyBrewTask extends BukkitRunnable { @Override public void run() { - if (player == null || !player.isValid() || brewingStand == null || brewingStand.getType() != Material.BREWING_STAND || !AlchemyPotionBrewer.isValidIngredient(player, ((BrewingStand) brewingStand).getInventory().getContents()[Alchemy.INGREDIENT_SLOT])) { - if (Alchemy.brewingStandMap.containsKey(location)) { - Alchemy.brewingStandMap.remove(location); - } + if (player == null || !player.isValid() || location.getBlock().getType() != Material.BREWING_STAND || !AlchemyPotionBrewer.isValidIngredient(player, brewingStand.getInventory().getContents()[Alchemy.INGREDIENT_SLOT])) { + Alchemy.brewingStandMap.remove(location); this.cancel(); @@ -79,7 +80,7 @@ public class AlchemyBrewTask extends BukkitRunnable { if (firstRun) { firstRun = false; - ((BrewingStand) brewingStand).setFuelLevel(fuel); + brewingStand.setFuelLevel(fuel); } brewTimer -= brewSpeed; @@ -90,7 +91,7 @@ public class AlchemyBrewTask extends BukkitRunnable { finish(); } else { - ((BrewingStand) brewingStand).setBrewingTime((int) brewTimer); + brewingStand.setBrewingTime((int) brewTimer); } } diff --git a/src/main/java/com/gmail/nossr50/util/experience/ExperienceBarManager.java b/src/main/java/com/gmail/nossr50/util/experience/ExperienceBarManager.java index e77641d32..0777ab6bd 100644 --- a/src/main/java/com/gmail/nossr50/util/experience/ExperienceBarManager.java +++ b/src/main/java/com/gmail/nossr50/util/experience/ExperienceBarManager.java @@ -50,24 +50,19 @@ public class ExperienceBarManager { || !ExperienceConfig.getInstance().isExperienceBarEnabled(primarySkillType)) return; - //Init Bar - if(experienceBars.get(primarySkillType) == null) - experienceBars.put(primarySkillType, new ExperienceBarWrapper(primarySkillType, mcMMOPlayer)); - - //Get Bar - ExperienceBarWrapper experienceBarWrapper = experienceBars.get(primarySkillType); + // Init or get the bar + ExperienceBarWrapper bar = experienceBars.computeIfAbsent(primarySkillType, k -> new ExperienceBarWrapper(primarySkillType, mcMMOPlayer)); //Update Progress - experienceBarWrapper.setProgress(mcMMOPlayer.getProgressInCurrentSkillLevel(primarySkillType)); + bar.setProgress(mcMMOPlayer.getProgressInCurrentSkillLevel(primarySkillType)); //Show Bar - experienceBarWrapper.showExperienceBar(); + bar.showExperienceBar(); //Setup Hide Bar Task - if(experienceBarHideTaskHashMap.get(primarySkillType) != null) - { - experienceBarHideTaskHashMap.get(primarySkillType).cancel(); - } + ExperienceBarHideTask task = experienceBarHideTaskHashMap.get(primarySkillType); + if (task != null) + task.cancel(); scheduleHideTask(primarySkillType, plugin); } diff --git a/src/main/java/com/gmail/nossr50/util/player/UserManager.java b/src/main/java/com/gmail/nossr50/util/player/UserManager.java index ef0b63e43..286b4f649 100644 --- a/src/main/java/com/gmail/nossr50/util/player/UserManager.java +++ b/src/main/java/com/gmail/nossr50/util/player/UserManager.java @@ -8,12 +8,14 @@ import org.bukkit.OfflinePlayer; import org.bukkit.entity.Entity; import org.bukkit.entity.Player; import org.bukkit.metadata.FixedMetadataValue; +import org.bukkit.metadata.MetadataValue; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.util.ArrayList; import java.util.Collection; import java.util.HashSet; +import java.util.List; public final class UserManager { @@ -137,9 +139,13 @@ public final class UserManager { * @return McMMOPlayer object for this player, null if Player has not been loaded */ public static @Nullable McMMOPlayer getPlayer(@Nullable Player player) { + if (player == null) + return null; + + List metadata = player.getMetadata(MetadataConstants.METADATA_KEY_PLAYER_DATA); //Avoid Array Index out of bounds - if(player != null && player.hasMetadata(MetadataConstants.METADATA_KEY_PLAYER_DATA)) - return (McMMOPlayer) player.getMetadata(MetadataConstants.METADATA_KEY_PLAYER_DATA).get(0).value(); + if (!metadata.isEmpty()) + return (McMMOPlayer) metadata.get(0).value(); else return null; } diff --git a/src/main/java/com/gmail/nossr50/util/skills/SmeltingTracker.java b/src/main/java/com/gmail/nossr50/util/skills/SmeltingTracker.java index 83e993a10..dbdd5bd13 100644 --- a/src/main/java/com/gmail/nossr50/util/skills/SmeltingTracker.java +++ b/src/main/java/com/gmail/nossr50/util/skills/SmeltingTracker.java @@ -4,6 +4,7 @@ import com.gmail.nossr50.datatypes.player.McMMOPlayer; import com.gmail.nossr50.datatypes.skills.PrimarySkillType; import com.gmail.nossr50.mcMMO; import com.gmail.nossr50.util.player.UserManager; +import io.papermc.lib.PaperLib; import org.bukkit.Bukkit; import org.bukkit.ChatColor; import org.bukkit.OfflinePlayer; @@ -80,7 +81,7 @@ public class SmeltingTracker { return null; } - return (Furnace) inventory.getHolder(); + return (Furnace) PaperLib.getHolder(inventory, false).getHolder(); } public boolean isFurnaceOwned(Furnace furnace) { @@ -92,8 +93,9 @@ public class SmeltingTracker { return; //Don't swap ownership if its the same player - if(getFurnaceOwner(furnace) != null) { - if(getFurnaceOwner(furnace).getUniqueId().equals(player.getUniqueId())) + OfflinePlayer owner = getFurnaceOwner(furnace); + if(owner != null) { + if(owner.getUniqueId().equals(player.getUniqueId())) return; }