diff --git a/Changelog.txt b/Changelog.txt index 9b798d95c9..7e6855e94f 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -4,7 +4,6 @@ Version 2.1.216 NOTES: The Sculk blocks don't quite fit perfectly as mining-related, especially since hoes are the fastest tool to use for them. Let me know what you think. Version 2.1.215 - Unarmed bonuses apply to players who hurt an entity with empty fists in the last 60 seconds, these bonuses do not get applied if you are using another mcMMO tool/weapon/trident/etc (see notes) Fixed Coal Blocks and potentially other fuel sources not showing burning animation to players (see notes) Level up broadcasts from level milestones will now be visible to the player who achieved them Fixed a bug where hovering over skill descriptions did not display anything (thanks Greymagic27) @@ -13,8 +12,6 @@ Version 2.1.215 Item in main hand is now used for Tree Feller drops (thanks destro174) NOTES: - The unarmed change is to lower the penalty for picking up items during a fight, as an alternative solution, you can turn on Skills.Unarmed.Items_As_Unarmed in config.yml to have players be considered to be using unarmed while holding items regardless of last unarmed combat (holding tools/weapons/tridents will disqualify you from this) - Players who damage another entity with empty hands are considered "recently unarmed" for the next 60 seconds, during this period if they attack with items in their hands (other weapons/tools/tridents excluded) they will be processed as if they are using unarmed combat, this also works with stuff like block breaker The burning animation bug is actually in Spigot, it takes an int for setBurnTime when it really should only take a short as the game is expecting a short value, I implemented a hacky workaround via Math.min There is a bug where you may lose your config comments, this will be complex to solve, for now you can check our GitHub for the configs with comments. diff --git a/src/main/java/com/gmail/nossr50/listeners/BlockListener.java b/src/main/java/com/gmail/nossr50/listeners/BlockListener.java index b5fa7c0cc1..fcfb8096a0 100644 --- a/src/main/java/com/gmail/nossr50/listeners/BlockListener.java +++ b/src/main/java/com/gmail/nossr50/listeners/BlockListener.java @@ -22,7 +22,6 @@ import com.gmail.nossr50.skills.woodcutting.WoodcuttingManager; import com.gmail.nossr50.util.*; 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.sounds.SoundManager; import com.gmail.nossr50.util.sounds.SoundType; @@ -626,7 +625,7 @@ public void onBlockDamageHigher(BlockDamageEvent event) { blockState.update(true); } } - else if (mcMMOPlayer.getAbilityMode(SuperAbilityType.BERSERK) && ItemUtils.isUnarmed(mcMMOPlayer.getPlayer().getInventory().getItemInMainHand()) || CombatUtils.isUsingUnarmedCombat(mcMMOPlayer)) { + else if (mcMMOPlayer.getAbilityMode(SuperAbilityType.BERSERK) && (heldItem.getType() == Material.AIR || mcMMO.p.getGeneralConfig().getUnarmedItemsAsUnarmed())) { if (mcMMOPlayer.getUnarmedManager().canUseBlockCracker() && BlockUtils.affectedByBlockCracker(blockState)) { if (EventUtils.simulateBlockBreak(block, player, true) && mcMMOPlayer.getUnarmedManager().blockCrackerCheck(blockState)) { blockState.update(); diff --git a/src/main/java/com/gmail/nossr50/skills/unarmed/UnarmedManager.java b/src/main/java/com/gmail/nossr50/skills/unarmed/UnarmedManager.java index 020ecf2122..93dc5eef51 100644 --- a/src/main/java/com/gmail/nossr50/skills/unarmed/UnarmedManager.java +++ b/src/main/java/com/gmail/nossr50/skills/unarmed/UnarmedManager.java @@ -13,7 +13,6 @@ import com.gmail.nossr50.util.player.NotificationManager; import com.gmail.nossr50.util.player.UserManager; import com.gmail.nossr50.util.random.RandomChanceUtil; -import com.gmail.nossr50.util.skills.CombatUtils; import com.gmail.nossr50.util.skills.RankUtils; import com.gmail.nossr50.util.skills.SkillActivationType; import org.bukkit.Material; @@ -25,14 +24,6 @@ import org.jetbrains.annotations.NotNull; public class UnarmedManager extends SkillManager { - private long lastUsedUnarmed = 0L; - - /** - * Players are considered using Unarmed if they have damaged another entity with empty fists in the last 60 seconds - */ - public boolean usedUnarmedCombatRecently() { - return lastUsedUnarmed + 60000 > System.currentTimeMillis(); - } public UnarmedManager(McMMOPlayer mcMMOPlayer) { super(mcMMOPlayer, PrimarySkillType.UNARMED); @@ -66,11 +57,7 @@ public boolean canDeflect() { Player player = getPlayer(); - McMMOPlayer mmoPlayer = UserManager.getPlayer(player); - if(mmoPlayer == null) - return false; - - return CombatUtils.isUsingUnarmedCombat(mmoPlayer) && Permissions.isSubSkillEnabled(getPlayer(), SubSkillType.UNARMED_ARROW_DEFLECT); + return ItemUtils.isUnarmed(player.getInventory().getItemInMainHand()) && Permissions.isSubSkillEnabled(getPlayer(), SubSkillType.UNARMED_ARROW_DEFLECT); } public boolean canUseBlockCracker() { @@ -201,8 +188,4 @@ private boolean hasIronGrip(@NotNull Player defender) { return false; } - - public void updateLastUsedUnarmed() { - this.lastUsedUnarmed = System.currentTimeMillis(); - } } diff --git a/src/main/java/com/gmail/nossr50/util/ItemUtils.java b/src/main/java/com/gmail/nossr50/util/ItemUtils.java index cd02166783..2e46341c2b 100644 --- a/src/main/java/com/gmail/nossr50/util/ItemUtils.java +++ b/src/main/java/com/gmail/nossr50/util/ItemUtils.java @@ -2,7 +2,6 @@ import com.gmail.nossr50.config.experience.ExperienceConfig; import com.gmail.nossr50.config.party.ItemWeightConfig; -import com.gmail.nossr50.datatypes.player.McMMOPlayer; import com.gmail.nossr50.datatypes.treasure.EnchantmentWrapper; import com.gmail.nossr50.datatypes.treasure.FishingTreasureBook; import com.gmail.nossr50.locale.LocaleLoader; @@ -179,12 +178,18 @@ public static boolean isPickaxe(@NotNull ItemStack item) { return mcMMO.getMaterialMapStore().isPickAxe(item.getType().getKey().getKey()); } - public static boolean isUnarmed(@NotNull ItemStack itemInMainHand) { + /** + * Checks if the item counts as unarmed. + * + * @param item Item to check + * @return true if the item counts as unarmed, false otherwise + */ + public static boolean isUnarmed(ItemStack item) { if (mcMMO.p.getGeneralConfig().getUnarmedItemsAsUnarmed()) { - return !isMinecraftTool(itemInMainHand); + return !isMinecraftTool(item); } - return itemInMainHand.getType() == Material.AIR; + return item.getType() == Material.AIR; } /** 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 4c4a25e3eb..bf4a3a4ee9 100644 --- a/src/main/java/com/gmail/nossr50/util/skills/CombatUtils.java +++ b/src/main/java/com/gmail/nossr50/util/skills/CombatUtils.java @@ -40,8 +40,6 @@ import java.util.List; -import static com.gmail.nossr50.util.ItemUtils.isMinecraftTool; - public final class CombatUtils { private CombatUtils() {} @@ -168,45 +166,47 @@ else if (axesManager.canGreaterImpact(target)) { printFinalDamageDebug(player, event, mcMMOPlayer); } - private static void processUnarmedCombat(@NotNull LivingEntity target, @NotNull McMMOPlayer mmoPlayer, @NotNull EntityDamageByEntityEvent event) { + private static void processUnarmedCombat(@NotNull LivingEntity target, @NotNull Player player, @NotNull EntityDamageByEntityEvent event) { if (event.getCause() == DamageCause.THORNS) { return; } double boostedDamage = event.getDamage(); - UnarmedManager unarmedManager = mmoPlayer.getUnarmedManager(); + McMMOPlayer mcMMOPlayer = UserManager.getPlayer(player); - if(isUsingUnarmedCombat(mmoPlayer)) { - if (unarmedManager.canActivateAbility()) { - mmoPlayer.checkAbilityActivation(PrimarySkillType.UNARMED); - } + //Make sure the profiles been loaded + if(mcMMOPlayer == null) { + return; + } - if (unarmedManager.canUseSteelArm()) { - boostedDamage+=(unarmedManager.calculateSteelArmStyleDamage() * mmoPlayer.getAttackStrength()); - } + UnarmedManager unarmedManager = mcMMOPlayer.getUnarmedManager(); - if (unarmedManager.canUseBerserk()) { - boostedDamage+=(unarmedManager.berserkDamage(boostedDamage) * mmoPlayer.getAttackStrength()); - } + if (unarmedManager.canActivateAbility()) { + mcMMOPlayer.checkAbilityActivation(PrimarySkillType.UNARMED); + } - if (unarmedManager.canDisarm(target)) { - unarmedManager.disarmCheck((Player) target); - } + if (unarmedManager.canUseSteelArm()) { + boostedDamage+=(unarmedManager.calculateSteelArmStyleDamage() * mcMMOPlayer.getAttackStrength()); + } - if(canUseLimitBreak(mmoPlayer.getPlayer(), target, SubSkillType.UNARMED_UNARMED_LIMIT_BREAK)) - { - boostedDamage+=(getLimitBreakDamage(mmoPlayer.getPlayer(), target, SubSkillType.UNARMED_UNARMED_LIMIT_BREAK) * mmoPlayer.getAttackStrength()); - } + if (unarmedManager.canUseBerserk()) { + boostedDamage+=(unarmedManager.berserkDamage(boostedDamage) * mcMMOPlayer.getAttackStrength()); } - event.setDamage(boostedDamage); - processCombatXP(mmoPlayer, target, PrimarySkillType.UNARMED); - printFinalDamageDebug(mmoPlayer.getPlayer(), event, mmoPlayer); + if (unarmedManager.canDisarm(target)) { + unarmedManager.disarmCheck((Player) target); + } - if (ItemUtils.isUnarmed(mmoPlayer.getPlayer().getInventory().getItemInMainHand())) { - mmoPlayer.getUnarmedManager().updateLastUsedUnarmed(); + if(canUseLimitBreak(player, target, SubSkillType.UNARMED_UNARMED_LIMIT_BREAK)) + { + boostedDamage+=(getLimitBreakDamage(player, target, SubSkillType.UNARMED_UNARMED_LIMIT_BREAK) * mcMMOPlayer.getAttackStrength()); } + + event.setDamage(boostedDamage); + processCombatXP(mcMMOPlayer, target, PrimarySkillType.UNARMED); + + printFinalDamageDebug(player, event, mcMMOPlayer); } private static void processTamingCombat(@NotNull LivingEntity target, @Nullable Player master, @NotNull Wolf wolf, @NotNull EntityDamageByEntityEvent event) { @@ -335,7 +335,6 @@ public static void processCombatAttack(@NotNull EntityDamageByEntityEvent event, } if (painSourceRoot instanceof Player player && entityType == EntityType.PLAYER) { - McMMOPlayer mmoPlayer = UserManager.getPlayer(player); if (!UserManager.hasPlayerDataKey(player)) { return; @@ -378,13 +377,13 @@ else if (ItemUtils.isAxe(heldItem)) { processAxeCombat(target, player, event); } } - else if (mmoPlayer != null && (mmoPlayer.getUnarmedManager().usedUnarmedCombatRecently() || ItemUtils.isUnarmed(heldItem))) { + else if (ItemUtils.isUnarmed(heldItem)) { if (!mcMMO.p.getSkillTools().canCombatSkillsTrigger(PrimarySkillType.UNARMED, target)) { return; } if (mcMMO.p.getSkillTools().doesPlayerHaveSkillPermission(player, PrimarySkillType.UNARMED)) { - processUnarmedCombat(target, mmoPlayer, event); + processUnarmedCombat(target, player, event); } } } @@ -978,21 +977,4 @@ public static void cleanupArrowMetadata(@NotNull Projectile entity) { public static void delayArrowMetaCleanup(@NotNull Projectile entity) { Bukkit.getServer().getScheduler().runTaskLater(mcMMO.p, () -> cleanupArrowMetadata(entity), 20*60); } - - /** - * Check if a player is considered "unarmed" - * - * @param mmoPlayer target player - * @return true if the item counts as unarmed, false otherwise - */ - public static boolean isUsingUnarmedCombat(@NotNull McMMOPlayer mmoPlayer) { - ItemStack itemInMainHand = mmoPlayer.getPlayer().getInventory().getItemInMainHand(); - - // player has to have been unarmed recently or config allows items as unarmed - if (mmoPlayer.getUnarmedManager().usedUnarmedCombatRecently() || mcMMO.p.getGeneralConfig().getUnarmedItemsAsUnarmed()) { - return !isMinecraftTool(itemInMainHand); - } - - return itemInMainHand.getType() == Material.AIR; - } }