From 95026e60168a03b52918ef4541acf9aaf8a7afa6 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Sat, 31 Jan 2026 11:20:35 -0800 Subject: [PATCH] improved spears dmg detection and fixed more errors with Excellent Enchants --- Changelog.txt | 10 ++- .../nossr50/datatypes/player/McMMOPlayer.java | 9 --- .../nossr50/listeners/PlayerListener.java | 21 ------- .../nossr50/util/skills/CombatUtils.java | 62 +++++-------------- 4 files changed, 26 insertions(+), 76 deletions(-) diff --git a/Changelog.txt b/Changelog.txt index 0cf000671..938877629 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,5 +1,13 @@ Version 2.2.050 - Further improved compatibility with Excellent Enchants + Minimum supported Minecraft version raised to 1.20.4 (see notes) + Improved Spears damage detection (see notes) + Spear abilities can now trigger from off-hand attacks with the Spear + Further improved compatibility with Excellent Enchants (fixed more errors) + + NOTES: + From 2.2.050 onwards, mcMMO will require Minecraft versions 1.20.4 or newer. + Every now and then I raise the minimum supported Minecraft version to reduce maintenance burden of supporting older versions. + mcMMO no longer monitors PlayerAnimationEvent, it turns out Spigot has a DamageType just for Spear damage, avoiding the need to track player arm swings. Version 2.2.049 Combat abilities work with spear in off-hand again (see notes) 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 595f47811..08ed9f88e 100644 --- a/src/main/java/com/gmail/nossr50/datatypes/player/McMMOPlayer.java +++ b/src/main/java/com/gmail/nossr50/datatypes/player/McMMOPlayer.java @@ -81,7 +81,6 @@ import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.VisibleForTesting; public class McMMOPlayer implements Identified { - private static final long NO_SWING = 0L; private final @NotNull Identity identity; //Hacky fix for now, redesign later @@ -98,7 +97,6 @@ public class McMMOPlayer implements Identified { private Party invite; private Party allianceInvite; private int itemShareModifier; - private long lastSwingTimestamp = NO_SWING; private PartyTeleportRecord ptpRecord; @@ -1281,11 +1279,4 @@ public class McMMOPlayer implements Identified { this.chatChannel = chatChannel; } - public long getLastSwingTimestamp() { - return lastSwingTimestamp; - } - - public void setLastSwingTimestamp(long lastSwingTimestamp) { - this.lastSwingTimestamp = lastSwingTimestamp; - } } diff --git a/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java b/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java index dd67906d5..284046093 100644 --- a/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java +++ b/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java @@ -63,8 +63,6 @@ import org.bukkit.event.entity.EntityDamageByEntityEvent; import org.bukkit.event.entity.EntityPickupItemEvent; import org.bukkit.event.entity.PlayerDeathEvent; import org.bukkit.event.player.AsyncPlayerChatEvent; -import org.bukkit.event.player.PlayerAnimationEvent; -import org.bukkit.event.player.PlayerAnimationType; import org.bukkit.event.player.PlayerChangedWorldEvent; import org.bukkit.event.player.PlayerCommandPreprocessEvent; import org.bukkit.event.player.PlayerDropItemEvent; @@ -1123,23 +1121,4 @@ public class PlayerListener implements Listener { SkillUtils.removeAbilityBuff(event.getMainHandItem()); SkillUtils.removeAbilityBuff(event.getOffHandItem()); } - - @EventHandler(ignoreCancelled = false, priority = EventPriority.MONITOR) - public void onPlayerAnimation(PlayerAnimationEvent event) { - if (event.getAnimationType() != PlayerAnimationType.ARM_SWING) { - return; - } - - final Player player = event.getPlayer(); - - if (!UserManager.hasPlayerDataKey(player)) { - return; - } - - final McMMOPlayer mmoPlayer = UserManager.getPlayer(player); - - if (mmoPlayer != null) { - mmoPlayer.setLastSwingTimestamp(System.currentTimeMillis()); - } - } } 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 895378a8d..d2adffb26 100644 --- a/src/main/java/com/gmail/nossr50/util/skills/CombatUtils.java +++ b/src/main/java/com/gmail/nossr50/util/skills/CombatUtils.java @@ -2,7 +2,6 @@ package com.gmail.nossr50.util.skills; import static com.gmail.nossr50.datatypes.experience.XPGainReason.PVP; import static com.gmail.nossr50.util.AttributeMapper.MAPPED_MOVEMENT_SPEED; -import static com.gmail.nossr50.util.ItemUtils.isSpear; import static com.gmail.nossr50.util.MobMetadataUtils.hasMobFlag; import static com.gmail.nossr50.util.Permissions.canUseSubSkill; import static com.gmail.nossr50.util.skills.ProjectileUtils.isCrossbowProjectile; @@ -132,11 +131,6 @@ public final class CombatUtils { return; } - // Hack to avoid other combat abilities applying to off-hand spear attacks - if (isSpear(player.getInventory().getItemInOffHand()) && isNotSwinging(mmoPlayer)) { - return; - } - SwordsManager swordsManager = mmoPlayer.getSwordsManager(); double boostedDamage = event.getDamage(); @@ -203,11 +197,6 @@ public final class CombatUtils { return; } - // Hack to avoid other combat abilities applying to off-hand spear attacks - if (isSpear(player.getInventory().getItemInOffHand()) && isNotSwinging(mmoPlayer)) { - return; - } - final TridentsManager tridentsManager = mmoPlayer.getTridentsManager(); // if (tridentsManager.canActivateAbility()) { @@ -321,11 +310,6 @@ public final class CombatUtils { return; } - // Hack to avoid other combat abilities applying to off-hand spear attacks - if (isSpear(player.getInventory().getItemInOffHand()) && isNotSwinging(mmoPlayer)) { - return; - } - final MacesManager macesManager = mmoPlayer.getMacesManager(); // Apply Limit Break DMG @@ -404,11 +388,6 @@ public final class CombatUtils { return; } - // Hack to avoid other combat abilities applying to off-hand spear attacks - if (isSpear(player.getInventory().getItemInOffHand()) && isNotSwinging(mmoPlayer)) { - return; - } - final AxesManager axesManager = mmoPlayer.getAxesManager(); if (axesManager.canActivateAbility()) { @@ -461,11 +440,6 @@ public final class CombatUtils { return; } - // Hack to avoid other combat abilities applying to off-hand spear attacks - if (isSpear(player.getInventory().getItemInOffHand()) && isNotSwinging(mmoPlayer)) { - return; - } - final UnarmedManager unarmedManager = mmoPlayer.getUnarmedManager(); if (unarmedManager.canActivateAbility()) { @@ -598,8 +572,12 @@ public final class CombatUtils { public static void processCombatAttack(@NotNull EntityDamageByEntityEvent event, @NotNull Entity painSourceRoot, @NotNull LivingEntity target) { - Entity painSource = event.getDamager(); - EntityType entityType = painSource.getType(); + final Entity painSource = event.getDamager(); + final EntityType entityType = painSource.getType(); + final String damageType = event.getDamageSource().getDamageType().getKey().getKey(); + + boolean isDamageTypeSpear = + damageType.equalsIgnoreCase("SPEAR"); if (target instanceof ArmorStand) { return; @@ -642,7 +620,7 @@ public final class CombatUtils { return; } - ItemStack heldItem = player.getInventory().getItemInMainHand(); + final ItemStack heldItem = player.getInventory().getItemInMainHand(); if (target instanceof Tameable) { if (heldItem.getType() == Material.BONE) { @@ -660,7 +638,16 @@ public final class CombatUtils { } } - if (ItemUtils.isSword(heldItem)) { + if (isDamageTypeSpear) { + if (!mcMMO.p.getSkillTools() + .canCombatSkillsTrigger(PrimarySkillType.SPEARS, target)) { + return; + } + if (mcMMO.p.getSkillTools() + .doesPlayerHaveSkillPermission(player, PrimarySkillType.SPEARS)) { + processSpearsCombat(target, player, event); + } + } if (ItemUtils.isSword(heldItem)) { if (!mcMMO.p.getSkillTools() .canCombatSkillsTrigger(PrimarySkillType.SWORDS, target)) { return; @@ -710,15 +697,6 @@ public final class CombatUtils { .doesPlayerHaveSkillPermission(player, PrimarySkillType.MACES)) { processMacesCombat(target, player, event); } - } else if (isSpear(heldItem)) { - if (!mcMMO.p.getSkillTools() - .canCombatSkillsTrigger(PrimarySkillType.SPEARS, target)) { - return; - } - if (mcMMO.p.getSkillTools() - .doesPlayerHaveSkillPermission(player, PrimarySkillType.SPEARS)) { - processSpearsCombat(target, player, event); - } } } else if (entityType == EntityType.WOLF) { Wolf wolf = (Wolf) painSource; @@ -1225,10 +1203,4 @@ public final class CombatUtils { mcMMO.p.getFoliaLib().getScheduler() .runLater(() -> ProjectileUtils.cleanupProjectileMetadata(arrow), 20 * 120); } - - public static boolean isNotSwinging(McMMOPlayer mmoPlayer) { - // If player has swung in the last second, it's extremely unlikely the damage originates - // from an off-hand spear charge attack - return mmoPlayer.getLastSwingTimestamp() + 500L < System.currentTimeMillis(); - } }