From b3b8a12b6d7fc194d78629e6d4eaeddc2ea4dfeb Mon Sep 17 00:00:00 2001 From: nossr50 Date: Mon, 22 Jan 2024 13:51:23 -0800 Subject: [PATCH] Crossbow Fixes --- pom.xml | 2 +- .../commands/skills/TridentsCommand.java | 5 +- .../nossr50/datatypes/player/McMMOPlayer.java | 10 ++-- .../nossr50/listeners/EntityListener.java | 37 +++++--------- .../nossr50/skills/crossbows/Crossbows.java | 10 ++-- .../skills/crossbows/CrossbowsManager.java | 15 +++--- .../skills/excavation/ExcavationManager.java | 10 ++-- .../java/com/gmail/nossr50/util/BowType.java | 6 --- .../com/gmail/nossr50/util/ItemUtils.java | 11 ---- .../gmail/nossr50/util/MetadataConstants.java | 1 - .../nossr50/util/skills/CombatUtils.java | 51 ++++++++----------- .../nossr50/util/skills/ProjectileUtils.java | 26 ++++------ src/main/resources/plugin.yml | 4 ++ 13 files changed, 76 insertions(+), 112 deletions(-) delete mode 100644 src/main/java/com/gmail/nossr50/util/BowType.java diff --git a/pom.xml b/pom.xml index 7cc845fe9..3d3839c21 100644 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 com.gmail.nossr50.mcMMO mcMMO - 2.2.000-BETA-04-SNAPSHOT + 2.2.000-BETA-07-SNAPSHOT mcMMO https://github.com/mcMMO-Dev/mcMMO diff --git a/src/main/java/com/gmail/nossr50/commands/skills/TridentsCommand.java b/src/main/java/com/gmail/nossr50/commands/skills/TridentsCommand.java index 63ec41037..7ff5cc5bb 100644 --- a/src/main/java/com/gmail/nossr50/commands/skills/TridentsCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/skills/TridentsCommand.java @@ -2,20 +2,19 @@ package com.gmail.nossr50.commands.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.util.player.UserManager; import com.gmail.nossr50.util.skills.CombatUtils; import com.gmail.nossr50.util.skills.SkillUtils; import com.gmail.nossr50.util.text.TextComponentFactory; import net.kyori.adventure.text.Component; import org.bukkit.ChatColor; -import org.bukkit.entity.Cat; import org.bukkit.entity.Player; import java.util.ArrayList; import java.util.List; -import static com.gmail.nossr50.datatypes.skills.SubSkillType.*; +import static com.gmail.nossr50.datatypes.skills.SubSkillType.TRIDENTS_IMPALE; +import static com.gmail.nossr50.datatypes.skills.SubSkillType.TRIDENTS_TRIDENTS_LIMIT_BREAK; public class TridentsCommand extends SkillCommand { diff --git a/src/main/java/com/gmail/nossr50/datatypes/player/McMMOPlayer.java b/src/main/java/com/gmail/nossr50/datatypes/player/McMMOPlayer.java index bfb441c0f..ed4b4d9b0 100644 --- a/src/main/java/com/gmail/nossr50/datatypes/player/McMMOPlayer.java +++ b/src/main/java/com/gmail/nossr50/datatypes/player/McMMOPlayer.java @@ -963,14 +963,14 @@ public class McMMOPlayer implements Identified { /** * Check to see if an ability can be activated. * - * @param bowType The type of bow (crossbow, bow) + * @param isCrossbow true for crossbow, false for bow */ - public void checkAbilityActivationProjectiles(BowType bowType) { - PrimarySkillType primarySkillType = bowType == BowType.CROSSBOW ? PrimarySkillType.CROSSBOWS : PrimarySkillType.ARCHERY; + public void checkAbilityActivationProjectiles(boolean isCrossbow) { + PrimarySkillType primarySkillType = isCrossbow ? PrimarySkillType.CROSSBOWS : PrimarySkillType.ARCHERY; // TODO: Refactor this crappy logic - ToolType tool = bowType == BowType.CROSSBOW ? ToolType.CROSSBOW : ToolType.BOW; - SuperAbilityType superAbilityType = bowType == BowType.CROSSBOW ? SuperAbilityType.SUPER_SHOTGUN : SuperAbilityType.EXPLOSIVE_SHOT; + ToolType tool = isCrossbow ? ToolType.CROSSBOW : ToolType.BOW; + SuperAbilityType superAbilityType = isCrossbow ? SuperAbilityType.SUPER_SHOTGUN : SuperAbilityType.EXPLOSIVE_SHOT; SubSkillType subSkillType = superAbilityType.getSubSkillTypeDefinition(); if (getAbilityMode(superAbilityType) || !superAbilityType.getPermissions(player)) { diff --git a/src/main/java/com/gmail/nossr50/listeners/EntityListener.java b/src/main/java/com/gmail/nossr50/listeners/EntityListener.java index 0e4d50b51..f12610019 100644 --- a/src/main/java/com/gmail/nossr50/listeners/EntityListener.java +++ b/src/main/java/com/gmail/nossr50/listeners/EntityListener.java @@ -26,7 +26,6 @@ import com.gmail.nossr50.util.player.NotificationManager; import com.gmail.nossr50.util.player.UserManager; import com.gmail.nossr50.util.random.ProbabilityUtil; import com.gmail.nossr50.util.skills.CombatUtils; -import com.gmail.nossr50.util.skills.ProjectileUtils; import com.gmail.nossr50.worldguard.WorldGuardManager; import com.gmail.nossr50.worldguard.WorldGuardUtils; import org.bukkit.ChatColor; @@ -105,7 +104,7 @@ public class EntityListener implements Listener { } } - @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) + @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = false) public void onEntityShootBow(EntityShootBowEvent event) { /* WORLD BLACKLIST CHECK */ if(WorldBlacklist.isWorldBlacklisted(event.getEntity().getWorld())) @@ -113,18 +112,10 @@ public class EntityListener implements Listener { if(event.getEntity() instanceof Player player) { - - /* WORLD GUARD MAIN FLAG CHECK */ - if(WorldGuardUtils.isWorldGuardLoaded()) - { - if(!WorldGuardManager.getInstance().hasMainFlag(player)) - return; - } - Entity projectile = event.getProjectile(); //Should be noted that there are API changes regarding Arrow from 1.13.2 to current versions of the game - if (!(projectile instanceof Arrow)) { + if (!(projectile instanceof Arrow arrow)) { return; } @@ -133,20 +124,16 @@ public class EntityListener implements Listener { if (bow == null) return; - // determine if bow or crossbow - BowType bowType = ItemUtils.isCrossbow(bow) ? BowType.CROSSBOW : BowType.BOW; - if (bow.containsEnchantment(Enchantment.ARROW_INFINITE)) { projectile.setMetadata(MetadataConstants.METADATA_KEY_INF_ARROW, MetadataConstants.MCMMO_METADATA_VALUE); } // Set BowType, Force, and Distance metadata - projectile.setMetadata(MetadataConstants.METADATA_KEY_BOW_TYPE, new FixedMetadataValue(pluginRef, bowType)); projectile.setMetadata(MetadataConstants.METADATA_KEY_BOW_FORCE, new FixedMetadataValue(pluginRef, Math.min(event.getForce() * mcMMO.p.getAdvancedConfig().getForceMultiplier(), 1.0))); - projectile.setMetadata(MetadataConstants.METADATA_KEY_ARROW_DISTANCE, new FixedMetadataValue(pluginRef, projectile.getLocation())); + projectile.setMetadata(MetadataConstants.METADATA_KEY_ARROW_DISTANCE, new FixedMetadataValue(pluginRef, arrow.getLocation())); //Cleanup metadata in 1 minute in case normal collection falls through - CombatUtils.delayArrowMetaCleanup((Projectile) projectile); + CombatUtils.delayArrowMetaCleanup(arrow); } } @@ -168,14 +155,14 @@ public class EntityListener implements Listener { Projectile projectile = event.getEntity(); EntityType entityType = projectile.getType(); - if(entityType == EntityType.ARROW || entityType == EntityType.SPECTRAL_ARROW) { - CombatUtils.delayArrowMetaCleanup(projectile); //Cleans up metadata 1 minute from now in case other collection methods fall through + if(projectile instanceof Arrow arrow) { + CombatUtils.delayArrowMetaCleanup(arrow); //Cleans up metadata 1 minute from now in case other collection methods fall through if(!projectile.hasMetadata(MetadataConstants.METADATA_KEY_BOW_FORCE)) projectile.setMetadata(MetadataConstants.METADATA_KEY_BOW_FORCE, new FixedMetadataValue(pluginRef, 1.0)); if(!projectile.hasMetadata(MetadataConstants.METADATA_KEY_ARROW_DISTANCE)) - projectile.setMetadata(MetadataConstants.METADATA_KEY_ARROW_DISTANCE, new FixedMetadataValue(pluginRef, projectile.getLocation())); + projectile.setMetadata(MetadataConstants.METADATA_KEY_ARROW_DISTANCE, new FixedMetadataValue(pluginRef, arrow.getLocation())); //Check both hands if(ItemUtils.doesPlayerHaveEnchantmentInHands(player, "piercing")) { @@ -411,8 +398,8 @@ public class EntityListener implements Listener { } } - if(entityDamageEvent.getDamager() instanceof Projectile) { - ProjectileUtils.cleanupProjectileMetadata((Projectile) entityDamageEvent.getDamager()); + if(entityDamageEvent.getDamager() instanceof Arrow arrow) { + CombatUtils.delayArrowMetaCleanup(arrow); } if(entityDamageEvent.getEntity() instanceof Player player && entityDamageEvent.getDamager() instanceof Player) { @@ -1119,6 +1106,10 @@ public class EntityListener implements Listener { if (WorldBlacklist.isWorldBlacklisted(event.getEntity().getWorld())) return; - Crossbows.processCrossbows(event, pluginRef); + if(event.getEntity() instanceof Arrow arrow) { + if(arrow.isShotFromCrossbow()) { + Crossbows.processCrossbows(event, pluginRef, arrow); + } + } } } diff --git a/src/main/java/com/gmail/nossr50/skills/crossbows/Crossbows.java b/src/main/java/com/gmail/nossr50/skills/crossbows/Crossbows.java index 33604948e..b09a1510a 100644 --- a/src/main/java/com/gmail/nossr50/skills/crossbows/Crossbows.java +++ b/src/main/java/com/gmail/nossr50/skills/crossbows/Crossbows.java @@ -13,14 +13,14 @@ import static com.gmail.nossr50.util.skills.ProjectileUtils.getNormal; * Util class for crossbows. */ public class Crossbows { - public static void processCrossbows(ProjectileHitEvent event, Plugin pluginRef) { - if(event.getEntity() instanceof Arrow originalArrow && event.getHitBlock() != null && event.getHitBlockFace() != null) { - if (originalArrow.getShooter() instanceof Player) { - McMMOPlayer mmoPlayer = UserManager.getPlayer((Player) originalArrow.getShooter()); + public static void processCrossbows(ProjectileHitEvent event, Plugin pluginRef, Arrow arrow) { + if(event.getHitBlock() != null && event.getHitBlockFace() != null) { + if (arrow.getShooter() instanceof Player) { + McMMOPlayer mmoPlayer = UserManager.getPlayer((Player) arrow.getShooter()); if (mmoPlayer != null) { mmoPlayer.getCrossbowsManager().handleRicochet( pluginRef, - originalArrow, + arrow, getNormal(event.getHitBlockFace())); } } diff --git a/src/main/java/com/gmail/nossr50/skills/crossbows/CrossbowsManager.java b/src/main/java/com/gmail/nossr50/skills/crossbows/CrossbowsManager.java index a7e9ae508..91826def0 100644 --- a/src/main/java/com/gmail/nossr50/skills/crossbows/CrossbowsManager.java +++ b/src/main/java/com/gmail/nossr50/skills/crossbows/CrossbowsManager.java @@ -5,8 +5,6 @@ import com.gmail.nossr50.datatypes.skills.PrimarySkillType; import com.gmail.nossr50.datatypes.skills.SubSkillType; import com.gmail.nossr50.mcMMO; import com.gmail.nossr50.skills.SkillManager; -import com.gmail.nossr50.skills.archery.Archery; -import com.gmail.nossr50.util.BowType; import com.gmail.nossr50.util.MetadataConstants; import com.gmail.nossr50.util.Permissions; import com.gmail.nossr50.util.random.ProbabilityUtil; @@ -25,17 +23,20 @@ public class CrossbowsManager extends SkillManager { super(mmoPlayer, PrimarySkillType.CROSSBOWS); } - public void handleRicochet(@NotNull Plugin pluginRef, @NotNull Arrow originalArrow, @NotNull Vector hitBlockNormal) { + public void handleRicochet(@NotNull Plugin pluginRef, @NotNull Arrow arrow, @NotNull Vector hitBlockNormal) { + if(!arrow.isShotFromCrossbow()) + return; + // Check player permission if (!Permissions.trickShot(mmoPlayer.getPlayer())) { return; } // TODO: Add an event for this for plugins to hook into - spawnReflectedArrow(pluginRef, originalArrow, originalArrow.getLocation(), hitBlockNormal); + spawnReflectedArrow(pluginRef, arrow, arrow.getLocation(), hitBlockNormal); } - public void spawnReflectedArrow(@NotNull Plugin pluginRef, @NotNull Arrow originalArrow, + private void spawnReflectedArrow(@NotNull Plugin pluginRef, @NotNull Arrow originalArrow, @NotNull Location origin, @NotNull Vector normal) { int bounceCount = 0; @@ -66,8 +67,6 @@ public class CrossbowsManager extends SkillManager { new FixedMetadataValue(pluginRef, bounceCount + 1)); arrow.setMetadata(MetadataConstants.METADATA_KEY_SPAWNED_ARROW, new FixedMetadataValue(pluginRef, originalArrowShooter)); - arrow.setMetadata(MetadataConstants.METADATA_KEY_BOW_TYPE, - new FixedMetadataValue(pluginRef, BowType.CROSSBOW)); originalArrow.remove(); } @@ -89,7 +88,7 @@ public class CrossbowsManager extends SkillManager { public double poweredShot(double oldDamage) { if (ProbabilityUtil.isNonRNGSkillActivationSuccessful(SubSkillType.CROSSBOWS_POWERED_SHOT, getPlayer())) { - return Archery.getSkillShotBonusDamage(getPlayer(), oldDamage); + return getPoweredShotBonusDamage(getPlayer(), oldDamage); } else { return oldDamage; } diff --git a/src/main/java/com/gmail/nossr50/skills/excavation/ExcavationManager.java b/src/main/java/com/gmail/nossr50/skills/excavation/ExcavationManager.java index bc9120e12..e3cf20fd3 100644 --- a/src/main/java/com/gmail/nossr50/skills/excavation/ExcavationManager.java +++ b/src/main/java/com/gmail/nossr50/skills/excavation/ExcavationManager.java @@ -35,6 +35,7 @@ public class ExcavationManager extends SkillManager { * @param blockState The {@link BlockState} to check ability activation for */ public void excavationBlockCheck(BlockState blockState) { + int xp = Excavation.getBlockXP(blockState); requireNonNull(blockState, "excavationBlockCheck: blockState cannot be null"); if (Permissions.isSubSkillEnabled(getPlayer(), SubSkillType.EXCAVATION_ARCHAEOLOGY)) { List treasures = getTreasures(blockState); @@ -51,6 +52,8 @@ public class ExcavationManager extends SkillManager { } } } + + applyXpGain(xp, XPGainReason.PVE, XPGainSource.SELF); } @VisibleForTesting @@ -61,16 +64,17 @@ public class ExcavationManager extends SkillManager { @VisibleForTesting public void processExcavationBonusesOnBlock(BlockState blockState, ExcavationTreasure treasure, Location location) { - int xp = Excavation.getBlockXP(blockState); - //Spawn Vanilla XP orbs if a dice roll succeeds if(ProbabilityUtil.isStaticSkillRNGSuccessful(PrimarySkillType.EXCAVATION, getPlayer(), getArchaelogyExperienceOrbChance())) { Misc.spawnExperienceOrb(location, getExperienceOrbsReward()); } + int xp = 0; xp += treasure.getXp(); Misc.spawnItem(getPlayer(), location, treasure.getDrop(), ItemSpawnReason.EXCAVATION_TREASURE); - applyXpGain(xp, XPGainReason.PVE, XPGainSource.SELF); + if (xp > 0) { + applyXpGain(xp, XPGainReason.PVE, XPGainSource.SELF); + } } public int getExperienceOrbsReward() { diff --git a/src/main/java/com/gmail/nossr50/util/BowType.java b/src/main/java/com/gmail/nossr50/util/BowType.java deleted file mode 100644 index 5e4d78274..000000000 --- a/src/main/java/com/gmail/nossr50/util/BowType.java +++ /dev/null @@ -1,6 +0,0 @@ -package com.gmail.nossr50.util; - -public enum BowType { - BOW, - CROSSBOW -} diff --git a/src/main/java/com/gmail/nossr50/util/ItemUtils.java b/src/main/java/com/gmail/nossr50/util/ItemUtils.java index a6ad59a18..04993eb74 100644 --- a/src/main/java/com/gmail/nossr50/util/ItemUtils.java +++ b/src/main/java/com/gmail/nossr50/util/ItemUtils.java @@ -51,17 +51,6 @@ public final class ItemUtils { return isBow(item) || isCrossbow(item); } - // TODO: Unit tests - public static BowType getBowType(@NotNull ItemStack item) { - if (isBow(item)) { - return BowType.BOW; - } else if (isCrossbow(item)) { - return BowType.CROSSBOW; - } - - throw new IllegalArgumentException(item + " is not a bow or crossbow"); - } - // TODO: Unit tests public static boolean isTrident(@NotNull ItemStack item) { return mcMMO.getMaterialMapStore().isTrident(item.getType().getKey().getKey()); diff --git a/src/main/java/com/gmail/nossr50/util/MetadataConstants.java b/src/main/java/com/gmail/nossr50/util/MetadataConstants.java index 48aaa8955..c8fc18a7d 100644 --- a/src/main/java/com/gmail/nossr50/util/MetadataConstants.java +++ b/src/main/java/com/gmail/nossr50/util/MetadataConstants.java @@ -16,7 +16,6 @@ public class MetadataConstants { public static final @NotNull String METADATA_KEY_REPLANT = "mcMMO: Recently Replanted"; public static final @NotNull String METADATA_KEY_SPAWNED_ARROW = "mcMMO: Spawned Arrow"; public static final @NotNull String METADATA_KEY_BOUNCE_COUNT = "mcMMO: Arrow Bounce Count"; - public static final @NotNull String METADATA_KEY_BOW_TYPE = "mcMMO: Bow Type"; public static final @NotNull String METADATA_KEY_EXPLOSION_FROM_RUPTURE = "mcMMO: Rupture Explosion"; public static final @NotNull String METADATA_KEY_FISH_HOOK_REF = "mcMMO: Fish Hook Tracker"; public static final @NotNull String METADATA_KEY_DODGE_TRACKER = "mcMMO: Dodge Tracker"; diff --git a/src/main/java/com/gmail/nossr50/util/skills/CombatUtils.java b/src/main/java/com/gmail/nossr50/util/skills/CombatUtils.java index 485ef96da..164ebf122 100644 --- a/src/main/java/com/gmail/nossr50/util/skills/CombatUtils.java +++ b/src/main/java/com/gmail/nossr50/util/skills/CombatUtils.java @@ -52,8 +52,10 @@ public final class CombatUtils { // TODO: Unit tests public static void processProjectileSkillSuperAbilityActivation(McMMOPlayer mmoPlayer, ItemStack heldItem) { if (heldItem != null && mmoPlayer != null) { - if (ItemUtils.isBowOrCrossbow(heldItem)) - mmoPlayer.checkAbilityActivationProjectiles(ItemUtils.getBowType(heldItem)); + if (ItemUtils.isBowOrCrossbow(heldItem)) { + boolean isCrossbow = ItemUtils.isCrossbow(heldItem); + mmoPlayer.checkAbilityActivationProjectiles(isCrossbow); + } } } @@ -159,14 +161,14 @@ public final class CombatUtils { } private static void processCrossbowsCombat(@NotNull LivingEntity target, @NotNull Player player, - @NotNull EntityDamageByEntityEvent event, @NotNull Projectile arrow) { + @NotNull EntityDamageByEntityEvent event, @NotNull Arrow arrow) { double initialDamage = event.getDamage(); McMMOPlayer mcMMOPlayer = UserManager.getPlayer(player); //Make sure the profiles been loaded if(mcMMOPlayer == null) { - ProjectileUtils.cleanupProjectileMetadata(arrow); + delayArrowMetaCleanup(arrow); return; } @@ -194,7 +196,7 @@ public final class CombatUtils { "Final Damage: "+boostedDamage); //Clean data - ProjectileUtils.cleanupProjectileMetadata(arrow); + delayArrowMetaCleanup(arrow); } private static void processAxeCombat(@NotNull LivingEntity target, @NotNull Player player, @NotNull EntityDamageByEntityEvent event) { @@ -324,14 +326,15 @@ public final class CombatUtils { } - private static void processArcheryCombat(@NotNull LivingEntity target, @NotNull Player player, @NotNull EntityDamageByEntityEvent event, @NotNull Projectile arrow) { + private static void processArcheryCombat(@NotNull LivingEntity target, @NotNull Player player, + @NotNull EntityDamageByEntityEvent event, @NotNull Arrow arrow) { double initialDamage = event.getDamage(); McMMOPlayer mcMMOPlayer = UserManager.getPlayer(player); //Make sure the profiles been loaded if(mcMMOPlayer == null) { - ProjectileUtils.cleanupProjectileMetadata(arrow); + delayArrowMetaCleanup(arrow); return; } @@ -372,7 +375,7 @@ public final class CombatUtils { "Initial Damage: "+initialDamage, "Final Damage: "+boostedDamage); //Clean data - ProjectileUtils.cleanupProjectileMetadata(arrow); + delayArrowMetaCleanup(arrow); } /** @@ -489,22 +492,20 @@ public final class CombatUtils { } } } - else if (entityType == EntityType.ARROW || entityType == EntityType.SPECTRAL_ARROW) { - Projectile arrow = (Projectile) painSource; + else if (painSource instanceof Arrow arrow) { ProjectileSource projectileSource = arrow.getShooter(); - + boolean isCrossbow = arrow.isShotFromCrossbow(); if (projectileSource instanceof Player player) { - BowType bowType = getBowTypeFromMetadata(arrow); if (!Misc.isNPCEntityExcludingVillagers(player)) { - if(bowType == BowType.BOW && mcMMO.p.getSkillTools().canCombatSkillsTrigger(PrimarySkillType.ARCHERY, target)) { + if(!isCrossbow && mcMMO.p.getSkillTools().canCombatSkillsTrigger(PrimarySkillType.ARCHERY, target)) { processArcheryCombat(target, player, event, arrow); - } else if(bowType == BowType.CROSSBOW && mcMMO.p.getSkillTools().canCombatSkillsTrigger(PrimarySkillType.CROSSBOWS, target)) { + } else if(isCrossbow && mcMMO.p.getSkillTools().canCombatSkillsTrigger(PrimarySkillType.CROSSBOWS, target)) { processCrossbowsCombat(target, player, event, arrow); } } else { //Cleanup Arrow - ProjectileUtils.cleanupProjectileMetadata(arrow); + delayArrowMetaCleanup(arrow); } if (target.getType() != EntityType.CREEPER @@ -522,18 +523,6 @@ public final class CombatUtils { } } - private static BowType getBowTypeFromMetadata(Projectile projectile) { - // Return the BowType from the metadata, or default to BOW - if (projectile.hasMetadata(MetadataConstants.METADATA_KEY_BOW_TYPE)) { - List metadataValue = projectile.getMetadata(MetadataConstants.METADATA_KEY_BOW_TYPE); - - if (!metadataValue.isEmpty()) { - return (BowType) metadataValue.get(0).value(); - } - } - throw new IllegalStateException("BowType metadata is empty"); - } - /** * This cleans up names from displaying in chat as hearts * @param entity target entity @@ -728,7 +717,7 @@ public final class CombatUtils { } public static boolean hasIgnoreDamageMetadata(@NotNull LivingEntity target) { - return target.getMetadata(MetadataConstants.METADATA_KEY_CUSTOM_DAMAGE).size() != 0; + return target.hasMetadata(MetadataConstants.METADATA_KEY_CUSTOM_DAMAGE); } public static void dealNoInvulnerabilityTickDamageRupture(@NotNull LivingEntity target, double damage, Entity attacker, int toolTier) { @@ -1040,9 +1029,9 @@ public final class CombatUtils { /** * Clean up metadata from a projectile after a minute has passed * - * @param entity the projectile + * @param arrow the projectile */ - public static void delayArrowMetaCleanup(@NotNull Projectile entity) { - mcMMO.p.getFoliaLib().getImpl().runLater(() -> ProjectileUtils.cleanupProjectileMetadata(entity), 20*60); + public static void delayArrowMetaCleanup(@NotNull Arrow arrow) { + mcMMO.p.getFoliaLib().getImpl().runLater(() -> ProjectileUtils.cleanupProjectileMetadata(arrow), 20*120); } } diff --git a/src/main/java/com/gmail/nossr50/util/skills/ProjectileUtils.java b/src/main/java/com/gmail/nossr50/util/skills/ProjectileUtils.java index 0ef2ccd46..2c872f417 100644 --- a/src/main/java/com/gmail/nossr50/util/skills/ProjectileUtils.java +++ b/src/main/java/com/gmail/nossr50/util/skills/ProjectileUtils.java @@ -3,7 +3,7 @@ package com.gmail.nossr50.util.skills; import com.gmail.nossr50.mcMMO; import com.gmail.nossr50.util.MetadataConstants; import org.bukkit.block.BlockFace; -import org.bukkit.entity.Projectile; +import org.bukkit.entity.Arrow; import org.bukkit.util.Vector; import org.jetbrains.annotations.NotNull; @@ -23,28 +23,24 @@ public class ProjectileUtils { /** * Clean up all possible mcMMO related metadata for a projectile * - * @param entity projectile + * @param arrow projectile */ // TODO: Add test - public static void cleanupProjectileMetadata(@NotNull Projectile entity) { - if(entity.hasMetadata(MetadataConstants.METADATA_KEY_INF_ARROW)) { - entity.removeMetadata(MetadataConstants.METADATA_KEY_INF_ARROW, mcMMO.p); + public static void cleanupProjectileMetadata(@NotNull Arrow arrow) { + if(arrow.hasMetadata(MetadataConstants.METADATA_KEY_INF_ARROW)) { + arrow.removeMetadata(MetadataConstants.METADATA_KEY_INF_ARROW, mcMMO.p); } - if(entity.hasMetadata(MetadataConstants.METADATA_KEY_BOW_FORCE)) { - entity.removeMetadata(MetadataConstants.METADATA_KEY_BOW_FORCE, mcMMO.p); + if(arrow.hasMetadata(MetadataConstants.METADATA_KEY_BOW_FORCE)) { + arrow.removeMetadata(MetadataConstants.METADATA_KEY_BOW_FORCE, mcMMO.p); } - if(entity.hasMetadata(MetadataConstants.METADATA_KEY_ARROW_DISTANCE)) { - entity.removeMetadata(MetadataConstants.METADATA_KEY_ARROW_DISTANCE, mcMMO.p); + if(arrow.hasMetadata(MetadataConstants.METADATA_KEY_ARROW_DISTANCE)) { + arrow.removeMetadata(MetadataConstants.METADATA_KEY_ARROW_DISTANCE, mcMMO.p); } - if(entity.hasMetadata(MetadataConstants.METADATA_KEY_BOW_TYPE)) { - entity.removeMetadata(MetadataConstants.METADATA_KEY_BOW_TYPE, mcMMO.p); - } - - if(entity.hasMetadata(MetadataConstants.METADATA_KEY_SPAWNED_ARROW)) { - entity.removeMetadata(MetadataConstants.METADATA_KEY_SPAWNED_ARROW, mcMMO.p); + if(arrow.hasMetadata(MetadataConstants.METADATA_KEY_SPAWNED_ARROW)) { + arrow.removeMetadata(MetadataConstants.METADATA_KEY_SPAWNED_ARROW, mcMMO.p); } } } diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index 21ba26247..a4dc5d4b2 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -859,6 +859,8 @@ permissions: mcmmo.commands.alchemy: true mcmmo.commands.archery: true mcmmo.commands.axes: true + mcmmo.commands.crossbows: true + mcmmo.commands.tridents: true mcmmo.commands.excavation: true mcmmo.commands.fishing: true mcmmo.commands.herbalism: true @@ -2212,6 +2214,8 @@ permissions: mcmmo.skills.taming: true mcmmo.skills.unarmed: true mcmmo.skills.woodcutting: true + mcmmo.skills.crossbows: true + mcmmo.skills.tridents: true mcmmo.skills.acrobatics: description: Allows access to the Acrobatics skill children: