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:
@@ -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)
|
||||||
|
|||||||
@@ -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;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user