1
0
mirror of https://github.com/mcMMO-Dev/mcMMO.git synced 2026-02-17 17:32:36 +01:00

improved spears dmg detection and fixed more errors with Excellent Enchants

This commit is contained in:
nossr50
2026-01-31 11:20:35 -08:00
parent 7738c45b72
commit 95026e6016
4 changed files with 26 additions and 76 deletions

View File

@@ -1,5 +1,13 @@
Version 2.2.050 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 Version 2.2.049
Combat abilities work with spear in off-hand again (see notes) Combat abilities work with spear in off-hand again (see notes)

View File

@@ -81,7 +81,6 @@ import org.jetbrains.annotations.Nullable;
import org.jetbrains.annotations.VisibleForTesting; import org.jetbrains.annotations.VisibleForTesting;
public class McMMOPlayer implements Identified { public class McMMOPlayer implements Identified {
private static final long NO_SWING = 0L;
private final @NotNull Identity identity; private final @NotNull Identity identity;
//Hacky fix for now, redesign later //Hacky fix for now, redesign later
@@ -98,7 +97,6 @@ public class McMMOPlayer implements Identified {
private Party invite; private Party invite;
private Party allianceInvite; private Party allianceInvite;
private int itemShareModifier; private int itemShareModifier;
private long lastSwingTimestamp = NO_SWING;
private PartyTeleportRecord ptpRecord; private PartyTeleportRecord ptpRecord;
@@ -1281,11 +1279,4 @@ public class McMMOPlayer implements Identified {
this.chatChannel = chatChannel; this.chatChannel = chatChannel;
} }
public long getLastSwingTimestamp() {
return lastSwingTimestamp;
}
public void setLastSwingTimestamp(long lastSwingTimestamp) {
this.lastSwingTimestamp = lastSwingTimestamp;
}
} }

View File

@@ -63,8 +63,6 @@ import org.bukkit.event.entity.EntityDamageByEntityEvent;
import org.bukkit.event.entity.EntityPickupItemEvent; import org.bukkit.event.entity.EntityPickupItemEvent;
import org.bukkit.event.entity.PlayerDeathEvent; import org.bukkit.event.entity.PlayerDeathEvent;
import org.bukkit.event.player.AsyncPlayerChatEvent; 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.PlayerChangedWorldEvent;
import org.bukkit.event.player.PlayerCommandPreprocessEvent; import org.bukkit.event.player.PlayerCommandPreprocessEvent;
import org.bukkit.event.player.PlayerDropItemEvent; import org.bukkit.event.player.PlayerDropItemEvent;
@@ -1123,23 +1121,4 @@ public class PlayerListener implements Listener {
SkillUtils.removeAbilityBuff(event.getMainHandItem()); SkillUtils.removeAbilityBuff(event.getMainHandItem());
SkillUtils.removeAbilityBuff(event.getOffHandItem()); 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());
}
}
} }

View File

@@ -2,7 +2,6 @@ package com.gmail.nossr50.util.skills;
import static com.gmail.nossr50.datatypes.experience.XPGainReason.PVP; 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.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.MobMetadataUtils.hasMobFlag;
import static com.gmail.nossr50.util.Permissions.canUseSubSkill; import static com.gmail.nossr50.util.Permissions.canUseSubSkill;
import static com.gmail.nossr50.util.skills.ProjectileUtils.isCrossbowProjectile; import static com.gmail.nossr50.util.skills.ProjectileUtils.isCrossbowProjectile;
@@ -132,11 +131,6 @@ public final class CombatUtils {
return; 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(); SwordsManager swordsManager = mmoPlayer.getSwordsManager();
double boostedDamage = event.getDamage(); double boostedDamage = event.getDamage();
@@ -203,11 +197,6 @@ public final class CombatUtils {
return; 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(); final TridentsManager tridentsManager = mmoPlayer.getTridentsManager();
// if (tridentsManager.canActivateAbility()) { // if (tridentsManager.canActivateAbility()) {
@@ -321,11 +310,6 @@ public final class CombatUtils {
return; 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(); final MacesManager macesManager = mmoPlayer.getMacesManager();
// Apply Limit Break DMG // Apply Limit Break DMG
@@ -404,11 +388,6 @@ public final class CombatUtils {
return; 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(); final AxesManager axesManager = mmoPlayer.getAxesManager();
if (axesManager.canActivateAbility()) { if (axesManager.canActivateAbility()) {
@@ -461,11 +440,6 @@ public final class CombatUtils {
return; 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(); final UnarmedManager unarmedManager = mmoPlayer.getUnarmedManager();
if (unarmedManager.canActivateAbility()) { if (unarmedManager.canActivateAbility()) {
@@ -598,8 +572,12 @@ public final class CombatUtils {
public static void processCombatAttack(@NotNull EntityDamageByEntityEvent event, public static void processCombatAttack(@NotNull EntityDamageByEntityEvent event,
@NotNull Entity painSourceRoot, @NotNull Entity painSourceRoot,
@NotNull LivingEntity target) { @NotNull LivingEntity target) {
Entity painSource = event.getDamager(); final Entity painSource = event.getDamager();
EntityType entityType = painSource.getType(); final EntityType entityType = painSource.getType();
final String damageType = event.getDamageSource().getDamageType().getKey().getKey();
boolean isDamageTypeSpear =
damageType.equalsIgnoreCase("SPEAR");
if (target instanceof ArmorStand) { if (target instanceof ArmorStand) {
return; return;
@@ -642,7 +620,7 @@ public final class CombatUtils {
return; return;
} }
ItemStack heldItem = player.getInventory().getItemInMainHand(); final ItemStack heldItem = player.getInventory().getItemInMainHand();
if (target instanceof Tameable) { if (target instanceof Tameable) {
if (heldItem.getType() == Material.BONE) { 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() if (!mcMMO.p.getSkillTools()
.canCombatSkillsTrigger(PrimarySkillType.SWORDS, target)) { .canCombatSkillsTrigger(PrimarySkillType.SWORDS, target)) {
return; return;
@@ -710,15 +697,6 @@ public final class CombatUtils {
.doesPlayerHaveSkillPermission(player, PrimarySkillType.MACES)) { .doesPlayerHaveSkillPermission(player, PrimarySkillType.MACES)) {
processMacesCombat(target, player, event); 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) { } else if (entityType == EntityType.WOLF) {
Wolf wolf = (Wolf) painSource; Wolf wolf = (Wolf) painSource;
@@ -1225,10 +1203,4 @@ public final class CombatUtils {
mcMMO.p.getFoliaLib().getScheduler() mcMMO.p.getFoliaLib().getScheduler()
.runLater(() -> ProjectileUtils.cleanupProjectileMetadata(arrow), 20 * 120); .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();
}
} }