From aa25ba6338aa04634f1e8bc34b90143fc889383f Mon Sep 17 00:00:00 2001 From: nossr50 Date: Sat, 23 Mar 2019 22:57:44 -0700 Subject: [PATCH] Fixed DoubleDrops for Mining, MANY nerfs to Rupture (PVP balance tweaks coming soon) --- Changelog.txt | 11 +++ .../nossr50/listeners/EntityListener.java | 18 ++-- src/main/java/com/gmail/nossr50/mcMMO.java | 1 + .../runnables/skills/BleedContainer.java | 4 +- .../runnables/skills/BleedTimerTask.java | 87 ++++++++++++++++--- .../nossr50/skills/mining/MiningManager.java | 1 - .../nossr50/skills/swords/SwordsManager.java | 21 ++++- .../nossr50/skills/taming/TamingManager.java | 2 +- .../nossr50/util/skills/CombatUtils.java | 43 ++++++++- 9 files changed, 165 insertions(+), 23 deletions(-) diff --git a/Changelog.txt b/Changelog.txt index c5144ef07..c6a419f27 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -9,6 +9,17 @@ Key: Version 2.1.23 Fixed a bug with Double Drops for Mining + Fixed a bug where killing entities with Rupture would not properly credit you as the killer + Fixed a bug where Serrated Strikes was applying Rupture twice + Players will now be ejected from Minecarts if they cast their fishing rod (anti-afk) + Rupture's strength is now related to your equipped Sword + Rupture will no longer be applied if the target is blocking, this doesn't prevent existing bleed damage from occurring though. + Wolf's Rupture has strength equivalent to a Stone Sword + Only Diamond swords will have bonus rupture damage at Rank 4 + Rupture damage is cut in half for weapons below Diamond in quality, if the weapon is wooden, the damage is cut in half again. + Swords below Diamond quality will have their tick duration drastically reduced + Rupture is not lethal if the sword is Stone or Wooden + Rupture damage is reduced by 25% on players if they are wearing Full Armor (can be any type) Note: You'll need to add these entries to your config.yml manually, or wait for the upcoming config update where this will be fixed for you automatically. NOTE: Here's what your Double_Drop entries in Config.yml for Mining should look like https://paste.gg/p/anonymous/dcd06f1215844311b4f2225f200090d1 diff --git a/src/main/java/com/gmail/nossr50/listeners/EntityListener.java b/src/main/java/com/gmail/nossr50/listeners/EntityListener.java index 9416a0dfa..b454fc0e9 100644 --- a/src/main/java/com/gmail/nossr50/listeners/EntityListener.java +++ b/src/main/java/com/gmail/nossr50/listeners/EntityListener.java @@ -25,6 +25,8 @@ import com.gmail.nossr50.util.player.UserManager; import com.gmail.nossr50.util.skills.CombatUtils; import com.gmail.nossr50.worldguard.WorldGuardManager; import com.gmail.nossr50.worldguard.WorldGuardUtils; +import org.bukkit.Bukkit; +import org.bukkit.ChatColor; import org.bukkit.Material; import org.bukkit.OfflinePlayer; import org.bukkit.block.Block; @@ -193,6 +195,16 @@ public class EntityListener implements Listener { */ @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) public void onEntityDamageByEntity(EntityDamageByEntityEvent event) { + double damage = event.getFinalDamage(); + Entity defender = event.getEntity(); + Entity attacker = event.getDamager(); + + if(defender.getMetadata(mcMMO.CUSTOM_DAMAGE_METAKEY).size() > 0) + { + defender.removeMetadata(mcMMO.CUSTOM_DAMAGE_METAKEY, plugin); + return; + } + /* WORLD BLACKLIST CHECK */ if(WorldBlacklist.isWorldBlacklisted(event.getEntity().getWorld())) return; @@ -211,10 +223,6 @@ public class EntityListener implements Listener { return; } - double damage = event.getFinalDamage(); - Entity defender = event.getEntity(); - Entity attacker = event.getDamager(); - if(attacker instanceof Player) { Player player = (Player) attacker; @@ -263,8 +271,6 @@ public class EntityListener implements Listener { return; } - - if (Misc.isNPCEntity(attacker)) { return; } diff --git a/src/main/java/com/gmail/nossr50/mcMMO.java b/src/main/java/com/gmail/nossr50/mcMMO.java index 03ba8d469..365fb124d 100644 --- a/src/main/java/com/gmail/nossr50/mcMMO.java +++ b/src/main/java/com/gmail/nossr50/mcMMO.java @@ -97,6 +97,7 @@ public class mcMMO extends JavaPlugin { /* Metadata Values */ public static final String FISH_HOOK_REF_METAKEY = "mcMMO: Fish Hook Tracker"; + public static final String CUSTOM_DAMAGE_METAKEY = "mcMMO: Custom Damage"; public final static String entityMetadataKey = "mcMMO: Spawned Entity"; public final static String blockMetadataKey = "mcMMO: Piston Tracking"; public final static String furnaceMetadataKey = "mcMMO: Tracked Furnace"; diff --git a/src/main/java/com/gmail/nossr50/runnables/skills/BleedContainer.java b/src/main/java/com/gmail/nossr50/runnables/skills/BleedContainer.java index 36f3a9022..32b4b9eca 100644 --- a/src/main/java/com/gmail/nossr50/runnables/skills/BleedContainer.java +++ b/src/main/java/com/gmail/nossr50/runnables/skills/BleedContainer.java @@ -5,14 +5,16 @@ import org.bukkit.entity.LivingEntity; public class BleedContainer { public int bleedTicks; public int bleedRank; + public int toolTier; public LivingEntity target; public LivingEntity damageSource; - public BleedContainer(LivingEntity target, int bleedTicks, int bleedRank, LivingEntity damageSource) + public BleedContainer(LivingEntity target, int bleedTicks, int bleedRank, int toolTier, LivingEntity damageSource) { this.target = target; this.bleedTicks = bleedTicks; this.bleedRank = bleedRank; + this.toolTier = toolTier; this.damageSource = damageSource; } } diff --git a/src/main/java/com/gmail/nossr50/runnables/skills/BleedTimerTask.java b/src/main/java/com/gmail/nossr50/runnables/skills/BleedTimerTask.java index aaffd0a88..60c1bda4d 100644 --- a/src/main/java/com/gmail/nossr50/runnables/skills/BleedTimerTask.java +++ b/src/main/java/com/gmail/nossr50/runnables/skills/BleedTimerTask.java @@ -9,8 +9,11 @@ import com.gmail.nossr50.util.skills.CombatUtils; import com.gmail.nossr50.util.skills.ParticleEffectUtils; import com.gmail.nossr50.util.sounds.SoundManager; import com.gmail.nossr50.util.sounds.SoundType; +import org.bukkit.Bukkit; +import org.bukkit.ChatColor; import org.bukkit.entity.LivingEntity; import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; import org.bukkit.scheduler.BukkitRunnable; import java.util.HashMap; @@ -28,21 +31,32 @@ public class BleedTimerTask extends BukkitRunnable { while (bleedIterator.hasNext()) { Entry containerEntry = bleedIterator.next(); LivingEntity target = containerEntry.getKey(); + int toolTier = containerEntry.getValue().toolTier; - int bleedTicks = containerEntry.getValue().bleedTicks; +// String debugMessage = ""; +// debugMessage += ChatColor.GOLD + "Target ["+target.getName()+"]: " + ChatColor.RESET; + +// debugMessage+="RemainingTicks=["+containerEntry.getValue().bleedTicks+"], "; if (containerEntry.getValue().bleedTicks <= 0 || !target.isValid()) { + if(target instanceof Player) + { + NotificationManager.sendPlayerInformation((Player) target, NotificationType.SUBSKILL_MESSAGE, "Swords.Combat.Bleeding.Stopped"); + } + bleedIterator.remove(); continue; } + int armorCount = 0; + double damage; if (target instanceof Player) { damage = AdvancedConfig.getInstance().getRuptureDamagePlayer(); //Above Bleed Rank 3 deals 50% more damage - if (containerEntry.getValue().bleedRank >= 3) + if (containerEntry.getValue().toolTier >= 4 && containerEntry.getValue().bleedRank >= 3) damage = damage * 1.5; Player player = (Player) target; @@ -51,28 +65,77 @@ public class BleedTimerTask extends BukkitRunnable { continue; } - NotificationManager.sendPlayerInformation(player, NotificationType.SUBSKILL_MESSAGE, "Swords.Combat.Bleeding.Stopped"); + //Count Armor + for(ItemStack armorPiece : ((Player) target).getInventory().getArmorContents()) + { + if(armorPiece != null) + armorCount++; + } + } else { damage = AdvancedConfig.getInstance().getRuptureDamageMobs(); +// debugMessage+="BaseDMG=["+damage+"], "; + //Above Bleed Rank 3 deals 50% more damage if (containerEntry.getValue().bleedRank >= 3) + { damage = damage * 1.5; + } + +// debugMessage+="Rank4Bonus=["+String.valueOf(containerEntry.getValue().bleedRank >= 3)+"], "; MobHealthbarUtils.handleMobHealthbars(target, damage, mcMMO.p); //Update health bars } - CombatUtils.dealNoInvulnerabilityTickDamage(target, damage, containerEntry.getValue().damageSource); - //Play Bleed Sound - SoundManager.worldSendSound(target.getWorld(), target.getLocation(), SoundType.BLEED); +// debugMessage+="FullArmor=["+String.valueOf(armorCount > 3)+"], "; - ParticleEffectUtils.playBleedEffect(target); + if(armorCount > 3) + { + damage = damage * .75; + } + +// debugMessage+="AfterRankAndArmorChecks["+damage+"], "; + + //Weapons below Diamond get damage cut in half + if(toolTier < 4) + damage = damage / 2; + +// debugMessage+="AfterDiamondCheck=["+String.valueOf(damage)+"], "; + + //Wood weapons get damage cut in half again + if(toolTier < 2) + damage = damage / 2; + +// debugMessage+="AfterWoodenCheck=["+String.valueOf(damage)+"], "; + + double victimHealth = target.getHealth(); + +// debugMessage+="TargetHealthBeforeDMG=["+String.valueOf(target.getHealth())+"], "; + + CombatUtils.dealNoInvulnerabilityTickDamageRupture(target, damage, containerEntry.getValue().damageSource, toolTier); + + double victimHealthAftermath = target.getHealth(); + +// debugMessage+="TargetHealthAfterDMG=["+String.valueOf(target.getHealth())+"], "; + + if(victimHealthAftermath <= 0 || victimHealth != victimHealthAftermath) + { + //Play Bleed Sound + SoundManager.worldSendSound(target.getWorld(), target.getLocation(), SoundType.BLEED); + + ParticleEffectUtils.playBleedEffect(target); + } //Lower Bleed Ticks BleedContainer loweredBleedContainer = copyContainer(containerEntry.getValue()); loweredBleedContainer.bleedTicks -= 1; + +// debugMessage+="RemainingTicks=["+loweredBleedContainer.bleedTicks+"]"; containerEntry.setValue(loweredBleedContainer); + +// Bukkit.broadcastMessage(debugMessage); } } @@ -82,8 +145,9 @@ public class BleedTimerTask extends BukkitRunnable { LivingEntity source = container.damageSource; int bleedTicks = container.bleedTicks; int bleedRank = container.bleedRank; + int toolTier = container.toolTier; - BleedContainer newContainer = new BleedContainer(target, bleedTicks, bleedRank, source); + BleedContainer newContainer = new BleedContainer(target, bleedTicks, bleedRank, toolTier, source); return newContainer; } @@ -108,8 +172,11 @@ public class BleedTimerTask extends BukkitRunnable { * @param entity LivingEntity to add * @param ticks Number of bleeding ticks */ - public static void add(LivingEntity entity, LivingEntity attacker, int ticks, int bleedRank) { - BleedContainer newBleedContainer = new BleedContainer(entity, ticks, bleedRank, attacker); + public static void add(LivingEntity entity, LivingEntity attacker, int ticks, int bleedRank, int toolTier) { + if(toolTier < 4) + ticks = Math.max(1, (ticks / 3)); + + BleedContainer newBleedContainer = new BleedContainer(entity, ticks, bleedRank, toolTier, attacker); bleedList.put(entity, newBleedContainer); } diff --git a/src/main/java/com/gmail/nossr50/skills/mining/MiningManager.java b/src/main/java/com/gmail/nossr50/skills/mining/MiningManager.java index 6437d7ef7..c9d54579c 100644 --- a/src/main/java/com/gmail/nossr50/skills/mining/MiningManager.java +++ b/src/main/java/com/gmail/nossr50/skills/mining/MiningManager.java @@ -18,7 +18,6 @@ import com.gmail.nossr50.util.Permissions; import com.gmail.nossr50.util.player.NotificationManager; import com.gmail.nossr50.util.random.RandomChanceUtil; import com.gmail.nossr50.util.skills.RankUtils; -import com.gmail.nossr50.util.skills.SkillActivationType; import com.gmail.nossr50.util.skills.SkillUtils; import org.bukkit.Material; import org.bukkit.block.Block; diff --git a/src/main/java/com/gmail/nossr50/skills/swords/SwordsManager.java b/src/main/java/com/gmail/nossr50/skills/swords/SwordsManager.java index 6d43fa769..8303bae2f 100644 --- a/src/main/java/com/gmail/nossr50/skills/swords/SwordsManager.java +++ b/src/main/java/com/gmail/nossr50/skills/swords/SwordsManager.java @@ -8,6 +8,7 @@ import com.gmail.nossr50.datatypes.skills.SuperAbilityType; import com.gmail.nossr50.datatypes.skills.ToolType; import com.gmail.nossr50.runnables.skills.BleedTimerTask; import com.gmail.nossr50.skills.SkillManager; +import com.gmail.nossr50.util.ItemUtils; import com.gmail.nossr50.util.Permissions; import com.gmail.nossr50.util.player.NotificationManager; import com.gmail.nossr50.util.player.UserManager; @@ -19,6 +20,7 @@ import org.bukkit.entity.Entity; import org.bukkit.entity.LivingEntity; import org.bukkit.entity.Player; import org.bukkit.event.entity.EntityDamageEvent.DamageModifier; +import org.bukkit.inventory.ItemStack; import java.util.Map; @@ -60,13 +62,17 @@ public class SwordsManager extends SkillManager { if (target instanceof Player) { Player defender = (Player) target; + //Don't start or add to a bleed if they are blocking + if(defender.isBlocking()) + return; + if (UserManager.getPlayer(defender).useChatNotifications()) { if(!BleedTimerTask.isBleeding(defender)) NotificationManager.sendPlayerInformation(defender, NotificationType.SUBSKILL_MESSAGE, "Swords.Combat.Bleeding.Started"); } } - BleedTimerTask.add(target, getPlayer(), getRuptureBleedTicks(), RankUtils.getRank(getPlayer(), SubSkillType.SWORDS_RUPTURE)); + BleedTimerTask.add(target, getPlayer(), getRuptureBleedTicks(), RankUtils.getRank(getPlayer(), SubSkillType.SWORDS_RUPTURE), getToolTier(getPlayer().getInventory().getItemInMainHand())); if (mcMMOPlayer.useChatNotifications()) { NotificationManager.sendPlayerInformation(getPlayer(), NotificationType.SUBSKILL_MESSAGE, "Swords.Combat.Bleeding"); @@ -74,6 +80,18 @@ public class SwordsManager extends SkillManager { } } + public int getToolTier(ItemStack itemStack) + { + if(ItemUtils.isDiamondTool(itemStack)) + return 4; + else if(ItemUtils.isIronTool(itemStack) || ItemUtils.isGoldTool(itemStack)) + return 3; + else if(ItemUtils.isStoneTool(itemStack)) + return 2; + else + return 1; + } + public int getRuptureBleedTicks() { int bleedTicks = 2 * RankUtils.getRank(getPlayer(), SubSkillType.SWORDS_RUPTURE); @@ -110,6 +128,5 @@ public class SwordsManager extends SkillManager { */ public void serratedStrikes(LivingEntity target, double damage, Map modifiers) { CombatUtils.applyAbilityAoE(getPlayer(), target, damage / Swords.serratedStrikesModifier, modifiers, skill); - BleedTimerTask.add(target, getPlayer(), getRuptureBleedTicks(), RankUtils.getRank(getPlayer(), SubSkillType.SWORDS_RUPTURE)); } } diff --git a/src/main/java/com/gmail/nossr50/skills/taming/TamingManager.java b/src/main/java/com/gmail/nossr50/skills/taming/TamingManager.java index d6c21e6b1..d16ea91cc 100644 --- a/src/main/java/com/gmail/nossr50/skills/taming/TamingManager.java +++ b/src/main/java/com/gmail/nossr50/skills/taming/TamingManager.java @@ -124,7 +124,7 @@ public class TamingManager extends SkillManager { return 0; } - BleedTimerTask.add(target, getPlayer(), Taming.goreBleedTicks, 1); + BleedTimerTask.add(target, getPlayer(), Taming.goreBleedTicks, 1, 2); if (target instanceof Player) { NotificationManager.sendPlayerInformation((Player)target, NotificationType.SUBSKILL_MESSAGE, "Combat.StruckByGore"); 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 6cac512cc..15c4d9642 100644 --- a/src/main/java/com/gmail/nossr50/util/skills/CombatUtils.java +++ b/src/main/java/com/gmail/nossr50/util/skills/CombatUtils.java @@ -32,6 +32,7 @@ import org.bukkit.event.entity.EntityDamageEvent.DamageCause; import org.bukkit.event.entity.EntityDamageEvent.DamageModifier; import org.bukkit.inventory.ItemStack; import org.bukkit.projectiles.ProjectileSource; +import org.bukkit.util.Vector; import java.util.EnumMap; import java.util.HashMap; @@ -394,7 +395,45 @@ public final class CombatUtils { double incDmg = callFakeDamageEvent(attacker, target, DamageCause.CUSTOM, damage); double newHealth = Math.max(0, target.getHealth() - incDmg); - target.setHealth(newHealth); + + if(newHealth == 0) + { + target.damage(9999, attacker); + } + else + target.setHealth(newHealth); + } + + public static void dealNoInvulnerabilityTickDamageRupture(LivingEntity target, double damage, Entity attacker, int toolTier) { + if (target.isDead()) { + return; + } + + int noDamageTicks = target.getNoDamageTicks(); + + double incDmg = callFakeDamageEvent(attacker, target, DamageCause.CUSTOM, damage); + + double newHealth = Math.max(0, target.getHealth() - incDmg); + + //Don't kill things with a stone or wooden weapon + if(toolTier < 3 && newHealth == 0) + return; + + target.setMetadata(mcMMO.CUSTOM_DAMAGE_METAKEY, mcMMO.metadataValue); + + if(newHealth == 0) + { + target.damage(99999, attacker); + } + else + { + Vector beforeRuptureVec = new Vector(target.getVelocity().getX(), target.getVelocity().getY(), target.getVelocity().getZ()); ; + target.damage(damage, attacker); + + target.setNoDamageTicks(noDamageTicks); + target.setVelocity(beforeRuptureVec); + } + } /** @@ -427,7 +466,7 @@ public final class CombatUtils { NotificationManager.sendPlayerInformation((Player)entity, NotificationType.SUBSKILL_MESSAGE, "Swords.Combat.SS.Struck"); } - BleedTimerTask.add(livingEntity, attacker, UserManager.getPlayer(attacker).getSwordsManager().getRuptureBleedTicks(), RankUtils.getRank(attacker, SubSkillType.SWORDS_RUPTURE)); + UserManager.getPlayer(attacker).getSwordsManager().ruptureCheck(target); break; case AXES: