瀏覽代碼

Bleed doesn't suck anymore.

nossr50 6 年之前
父節點
當前提交
11c8374f6c

+ 9 - 0
Changelog.txt

@@ -22,6 +22,7 @@ Version 2.1.0
  + (Sounds) Activating Super abilities plays a sound (other plays can hear this)
  + (Sounds) Skill Unlock Notifications have sounds
  + (Sounds) Readying a tool for a super ability now plays a sound
+ + (Sounds) Bleed DOT now plays a sound
  + (Experience) mcMMO now notifies you when you progress in a skill!
  + (Experience) Coral (blocks) now give Mining XP
  + (Experience) Coral (plants) now give Herbalism XP
@@ -32,6 +33,13 @@ Version 2.1.0
  + (Events) Starting an XP event will now use the title API (toggle this in advanced.yml)
  + (Sound) Volume and Pitch of sounds can now be configured in the new sounds.yml file
  + (MySQL) Added support for SSL for MySQL/MariaDB (On by default)
+ ! (Skills) Taming's Gore now uses Bleed Rank 1 for its DoT
+ ! (Skills) Sword's Rupture now ticks four times as fast
+ ! (Skills) Sword's Bleed has been renamed to Rupture
+ ! (Skills) Sword's Rupture now reaches its max proc chance at level 20 (200 in Retro)
+ ! (Skills) Sword's Rupture now has a max chance to proc of 33% instead of 70%
+ ! (Skills) Sword's Rupture now deals 50% more damage at above Rank 3 and can last much longer! The base damage for Bleed has been increased as well (update your advanced.yml admins)
+ ! (Skills) Sword's Rupture no longer triggers invincibility frames when damaging your opponent
  + (Skills) Ability Lengths now have a default skill cap at which they stop increasing in length, configurable in advanced.yml
  + (Skills) Added a new subskill to some skills 'Understanding The Art' this adds nothing new, but tracks benefits that increase together that seemed unrelated, which was previously a bit obfuscated.
  + (Skills) Tool alerts now are sent to the Action Bar
@@ -89,6 +97,7 @@ Version 2.1.0
  ! (Skills) Acrobatics' Roll & Gracefull Roll are now considered the same skill (both mechanics are still there)
  ! (Skills) Woodcutting's Double Drop subskill is now named Harvest Lumber
  ! (Skills) Archery's Skill Shot now uses a rank system
+ ! (Skills) Swords' Bleed now uses a rank system
  ! (Skills) Axe's Axe Mastery now uses a rank system
  ! (Skills) Axe's Impact now uses a rank system
  ! (Skills) Herbalism's Farmer's Diet now uses a rank system

+ 15 - 7
src/main/java/com/gmail/nossr50/commands/skills/SwordsCommand.java

@@ -7,6 +7,7 @@ import com.gmail.nossr50.locale.LocaleLoader;
 import com.gmail.nossr50.skills.swords.Swords;
 import com.gmail.nossr50.util.Permissions;
 import com.gmail.nossr50.util.TextComponentFactory;
+import com.gmail.nossr50.util.player.UserManager;
 import com.gmail.nossr50.util.skills.RankUtils;
 import net.md_5.bungee.api.chat.TextComponent;
 import org.bukkit.entity.Player;
@@ -40,11 +41,11 @@ public class SwordsCommand extends SkillCommand {
             serratedStrikesLengthEndurance = serratedStrikesStrings[1];
         }
 
-        // SWORDS_BLEED
+        // SWORDS_RUPTURE
         if (canBleed) {
-            bleedLength = (skillValue >= AdvancedConfig.getInstance().getMaxBonusLevel(SubSkillType.SWORDS_BLEED)) ? Swords.bleedMaxTicks : Swords.bleedBaseTicks;
+            bleedLength = (skillValue >= AdvancedConfig.getInstance().getMaxBonusLevel(SubSkillType.SWORDS_RUPTURE)) ? Swords.bleedMaxTicks : Swords.bleedBaseTicks;
 
-            String[] bleedStrings = calculateAbilityDisplayValues(skillValue, SubSkillType.SWORDS_BLEED, isLucky);
+            String[] bleedStrings = calculateAbilityDisplayValues(skillValue, SubSkillType.SWORDS_RUPTURE, isLucky);
             bleedChance = bleedStrings[0];
             bleedChanceLucky = bleedStrings[1];
         }
@@ -59,7 +60,7 @@ public class SwordsCommand extends SkillCommand {
 
     @Override
     protected void permissionsCheck(Player player) {
-        canBleed = canUseSubskill(player, SubSkillType.SWORDS_BLEED);
+        canBleed = canUseSubskill(player, SubSkillType.SWORDS_RUPTURE);
         canCounter = canUseSubskill(player, SubSkillType.SWORDS_COUNTER_ATTACK);
         canSerratedStrike = RankUtils.hasUnlockedSubskill(player, SubSkillType.SWORDS_SERRATED_STRIKES) && Permissions.serratedStrikes(player);
     }
@@ -88,17 +89,24 @@ public class SwordsCommand extends SkillCommand {
     protected List<String> statsDisplay(Player player, float skillValue, boolean hasEndurance, boolean isLucky) {
         List<String> messages = new ArrayList<String>();
 
+        int ruptureTicks = UserManager.getPlayer(player).getSwordsManager().getBleedTicks();
+        double ruptureDamagePlayers =  RankUtils.getRank(player, SubSkillType.SWORDS_RUPTURE) >= 3 ? AdvancedConfig.getInstance().getRuptureDamagePlayer() * 1.5D : AdvancedConfig.getInstance().getRuptureDamagePlayer();
+        double ruptureDamageMobs =  RankUtils.getRank(player, SubSkillType.SWORDS_RUPTURE) >= 3 ? AdvancedConfig.getInstance().getRuptureDamageMobs() * 1.5D : AdvancedConfig.getInstance().getRuptureDamageMobs();
+
         if (canCounter) {
             messages.add(getStatMessage(SubSkillType.SWORDS_COUNTER_ATTACK, counterChance)
                     + (isLucky ? LocaleLoader.getString("Perks.Lucky.Bonus", counterChanceLucky) : ""));
         }
 
         if (canBleed) {
-            messages.add(getStatMessage(SubSkillType.SWORDS_BLEED, bleedChance)
+            messages.add(getStatMessage(SubSkillType.SWORDS_RUPTURE, bleedChance)
                     + (isLucky ? LocaleLoader.getString("Perks.Lucky.Bonus", bleedChanceLucky) : ""));
-            messages.add(getStatMessage(true, true, SubSkillType.SWORDS_BLEED, String.valueOf(bleedLength)));
+            messages.add(getStatMessage(true, true, SubSkillType.SWORDS_RUPTURE,
+                    String.valueOf(ruptureTicks),
+                    String.valueOf(ruptureDamagePlayers),
+                    String.valueOf(ruptureDamageMobs)));
 
-            messages.add(LocaleLoader.getString("Swords.Combat.Bleed.Note"));
+            messages.add(LocaleLoader.getString("Swords.Combat.Rupture.Note"));
         }
 
         if (canSerratedStrike) {

+ 19 - 19
src/main/java/com/gmail/nossr50/config/AdvancedConfig.java

@@ -486,24 +486,24 @@ public class AdvancedConfig extends AutoUpdateConfigLoader {
         }*/
 
         /* SWORDS */
-        if (getMaxChance(SubSkillType.SWORDS_BLEED) < 1) {
-            reason.add("Skills.Swords.Bleed.ChanceMax should be at least 1!");
+        if (getMaxChance(SubSkillType.SWORDS_RUPTURE) < 1) {
+            reason.add("Skills.Swords.Rupture.ChanceMax should be at least 1!");
         }
 
-        if (getMaxBonusLevel(SubSkillType.SWORDS_BLEED) < 1) {
-            reason.add("Skills.Swords.Bleed.MaxBonusLevel should be at least 1!");
+        if (getMaxBonusLevel(SubSkillType.SWORDS_RUPTURE) < 1) {
+            reason.add("Skills.Swords.Rupture.MaxBonusLevel should be at least 1!");
         }
 
-        if (getBleedMaxTicks() < 1) {
-            reason.add("Skills.Swords.Bleed.MaxTicks should be at least 1!");
+        if (getRuptureMaxTicks() < 1) {
+            reason.add("Skills.Swords.Rupture.MaxTicks should be at least 1!");
         }
 
-        if (getBleedMaxTicks() < getBleedBaseTicks()) {
-            reason.add("Skills.Swords.Bleed.MaxTicks should be at least Skills.Swords.Bleed.BaseTicks!");
+        if (getRuptureMaxTicks() < getRuptureBaseTicks()) {
+            reason.add("Skills.Swords.Rupture.MaxTicks should be at least Skills.Swords.Rupture.BaseTicks!");
         }
 
-        if (getBleedBaseTicks() < 1) {
-            reason.add("Skills.Swords.Bleed.BaseTicks should be at least 1!");
+        if (getRuptureBaseTicks() < 1) {
+            reason.add("Skills.Swords.Rupture.BaseTicks should be at least 1!");
         }
 
         if (getMaxChance(SubSkillType.SWORDS_COUNTER_ATTACK) < 1) {
@@ -523,7 +523,7 @@ public class AdvancedConfig extends AutoUpdateConfigLoader {
         }
 
         if (getSerratedStrikesTicks() < 1) {
-            reason.add("Skills.Swords.SerratedStrikes.BleedTicks should be at least 1!");
+            reason.add("Skills.Swords.SerratedStrikes.RuptureTicks should be at least 1!");
         }
 
         /* TAMING */
@@ -536,8 +536,8 @@ public class AdvancedConfig extends AutoUpdateConfigLoader {
             reason.add("Skills.Taming.Gore.MaxBonusLevel should be at least 1!");
         }
 
-        if (getGoreBleedTicks() < 1) {
-            reason.add("Skills.Taming.Gore.BleedTicks should be at least 1!");
+        if (getGoreRuptureTicks() < 1) {
+            reason.add("Skills.Taming.Gore.RuptureTicks should be at least 1!");
         }
 
         if (getGoreModifier() < 1) {
@@ -922,19 +922,19 @@ public class AdvancedConfig extends AutoUpdateConfigLoader {
     public int getSmeltingVanillaXPBoostMultiplier(int rank) { return config.getInt("Skills.Smelting.VanillaXPMultiplier.Rank_" + rank); }
 
     /* SWORDS */
-    public double getBleedDamagePlayer() { return config.getDouble("Skills.Swords.Bleed.DamagePlayer", 1.0); }
-    public double getBleedDamageMobs() { return config.getDouble("Skills.Swords.Bleed.DamageMobs", 2.0); }
+    public double getRuptureDamagePlayer() { return config.getDouble("Skills.Swords.Rupture.DamagePlayer", 1.0); }
+    public double getRuptureDamageMobs() { return config.getDouble("Skills.Swords.Rupture.DamageMobs", 2.0); }
 
-    public int getBleedMaxTicks() { return config.getInt("Skills.Swords.Bleed.MaxTicks", 3); }
-    public int getBleedBaseTicks() { return config.getInt("Skills.Swords.Bleed.BaseTicks", 2); }
+    public int getRuptureMaxTicks() { return config.getInt("Skills.Swords.Rupture.MaxTicks", 3); }
+    public int getRuptureBaseTicks() { return config.getInt("Skills.Swords.Rupture.BaseTicks", 2); }
 
     public double getCounterModifier() { return config.getDouble("Skills.Swords.CounterAttack.DamageModifier", 2.0D); }
 
     public double getSerratedStrikesModifier() { return config.getDouble("Skills.Swords.SerratedStrikes.DamageModifier", 4.0D); }
-    public int getSerratedStrikesTicks() { return config.getInt("Skills.Swords.SerratedStrikes.BleedTicks", 5); }
+    public int getSerratedStrikesTicks() { return config.getInt("Skills.Swords.SerratedStrikes.RuptureTicks", 5); }
 
     /* TAMING */
-    public int getGoreBleedTicks() { return config.getInt("Skills.Taming.Gore.BleedTicks", 2); }
+    public int getGoreRuptureTicks() { return config.getInt("Skills.Taming.Gore.RuptureTicks", 2); }
     public double getGoreModifier() { return config.getDouble("Skills.Taming.Gore.Modifier", 2.0D); }
 
     /*public int getFastFoodUnlock() { return config.getInt("Skills.Taming.FastFood.UnlockLevel", 50); }*/

+ 1 - 1
src/main/java/com/gmail/nossr50/datatypes/skills/PrimarySkillType.java

@@ -46,7 +46,7 @@ public enum PrimarySkillType {
     REPAIR(RepairManager.class, Color.SILVER, ImmutableList.of(SubSkillType.REPAIR_ARCANE_FORGING, SubSkillType.REPAIR_REPAIR_MASTERY, SubSkillType.REPAIR_SUPER_REPAIR)),
     SALVAGE(SalvageManager.class, Color.ORANGE, ImmutableList.of(SubSkillType.SALVAGE_ADVANCED_SALVAGE, SubSkillType.SALVAGE_ARCANE_SALVAGE)),
     SMELTING(SmeltingManager.class, Color.YELLOW, ImmutableList.of(SubSkillType.SMELTING_UNDERSTANDING_THE_ART, SubSkillType.SMELTING_FLUX_MINING, SubSkillType.SMELTING_FUEL_EFFICIENCY, SubSkillType.SMELTING_SECOND_SMELT)),
-    SWORDS(SwordsManager.class, Color.fromRGB(178, 34, 34), SuperAbilityType.SERRATED_STRIKES, ToolType.SWORD, ImmutableList.of(SubSkillType.SWORDS_SERRATED_STRIKES, SubSkillType.SWORDS_BLEED, SubSkillType.SWORDS_COUNTER_ATTACK)),
+    SWORDS(SwordsManager.class, Color.fromRGB(178, 34, 34), SuperAbilityType.SERRATED_STRIKES, ToolType.SWORD, ImmutableList.of(SubSkillType.SWORDS_SERRATED_STRIKES, SubSkillType.SWORDS_RUPTURE, SubSkillType.SWORDS_COUNTER_ATTACK)),
     TAMING(TamingManager.class, Color.PURPLE, ImmutableList.of(SubSkillType.TAMING_BEAST_LORE, SubSkillType.TAMING_CALL_OF_THE_WILD, SubSkillType.TAMING_ENVIRONMENTALLY_AWARE, SubSkillType.TAMING_FAST_FOOD_SERVICE, SubSkillType.TAMING_GORE, SubSkillType.TAMING_HOLY_HOUND, SubSkillType.TAMING_SHARPENED_CLAWS, SubSkillType.TAMING_SHOCK_PROOF, SubSkillType.TAMING_THICK_FUR, SubSkillType.TAMING_PUMMEL)),
     UNARMED(UnarmedManager.class, Color.BLACK, SuperAbilityType.BERSERK, ToolType.FISTS, ImmutableList.of(SubSkillType.UNARMED_BERSERK, SubSkillType.UNARMED_BLOCK_CRACKER, SubSkillType.UNARMED_ARROW_DEFLECT, SubSkillType.UNARMED_DISARM, SubSkillType.UNARMED_IRON_ARM_STYLE, SubSkillType.UNARMED_IRON_GRIP)),
     WOODCUTTING(WoodcuttingManager.class, Color.OLIVE, SuperAbilityType.TREE_FELLER, ToolType.AXE, ImmutableList.of(SubSkillType.WOODCUTTING_LEAF_BLOWER, SubSkillType.WOODCUTTING_BARK_SURGEON, SubSkillType.WOODCUTTING_SPLINTER, SubSkillType.WOODCUTTING_NATURES_BOUNTY, SubSkillType.WOODCUTTING_TREE_FELLER, SubSkillType.WOODCUTTING_HARVEST_LUMBER));

+ 1 - 1
src/main/java/com/gmail/nossr50/datatypes/skills/SubSkillType.java

@@ -69,7 +69,7 @@ public enum SubSkillType {
     SMELTING_UNDERSTANDING_THE_ART(8),
 
     /* Swords */
-    SWORDS_BLEED,
+    SWORDS_RUPTURE(4),
     SWORDS_COUNTER_ATTACK,
     SWORDS_SERRATED_STRIKES(1),
 

+ 1 - 1
src/main/java/com/gmail/nossr50/mcMMO.java

@@ -498,7 +498,7 @@ public class mcMMO extends JavaPlugin {
         new CleanBackupsTask().runTaskAsynchronously(mcMMO.p);
 
         // Bleed timer (Runs every two seconds)
-        new BleedTimerTask().runTaskTimer(this, 2 * Misc.TICK_CONVERSION_FACTOR, 2 * Misc.TICK_CONVERSION_FACTOR);
+        new BleedTimerTask().runTaskTimer(this, 1 * Misc.TICK_CONVERSION_FACTOR, 1 * (Misc.TICK_CONVERSION_FACTOR / 2));
 
         // Old & Powerless User remover
         long purgeIntervalTicks = Config.getInstance().getPurgeInterval() * 60L * 60L * Misc.TICK_CONVERSION_FACTOR;

+ 22 - 4
src/main/java/com/gmail/nossr50/runnables/skills/BleedTimerTask.java

@@ -5,6 +5,8 @@ import com.gmail.nossr50.datatypes.interactions.NotificationType;
 import com.gmail.nossr50.util.player.NotificationManager;
 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.entity.LivingEntity;
 import org.bukkit.entity.Player;
 import org.bukkit.scheduler.BukkitRunnable;
@@ -17,6 +19,7 @@ import java.util.Map.Entry;
 public class BleedTimerTask extends BukkitRunnable {
     private final static int MAX_BLEED_TICKS = 10;
     private static Map<LivingEntity, Integer> bleedList = new HashMap<LivingEntity, Integer>();
+    private static Map<LivingEntity, Integer> bleedDamage = new HashMap<LivingEntity, Integer>();
 
     @Override
     public void run() {
@@ -31,8 +34,16 @@ public class BleedTimerTask extends BukkitRunnable {
 
             double damage;
 
+            //Play Bleed Sound
+            SoundManager.worldSendSound(entity.getWorld(), entity.getLocation(), SoundType.BLEED);
+
             if (entity instanceof Player) {
-                damage = AdvancedConfig.getInstance().getBleedDamagePlayer();
+                damage = AdvancedConfig.getInstance().getRuptureDamagePlayer();
+
+                //Above Bleed Rank 3 deals 50% more damage
+                if(bleedDamage.get(entity) >= 3)
+                    damage = damage * 1.5;
+
                 Player player = (Player) entity;
 
                 if (!player.isOnline()) {
@@ -52,7 +63,7 @@ public class BleedTimerTask extends BukkitRunnable {
                 }
             }
             else {
-                damage = AdvancedConfig.getInstance().getBleedDamageMobs();
+                damage = AdvancedConfig.getInstance().getRuptureDamageMobs();
 
                 // Anticipate the entity's death to prevent CME because of our EntityDeathEvent listener
                 if (entity.getHealth() - damage > 0) {
@@ -75,8 +86,9 @@ public class BleedTimerTask extends BukkitRunnable {
      */
     public static void bleedOut(LivingEntity entity) {
         if (bleedList.containsKey(entity)) {
-            CombatUtils.dealDamage(entity, bleedList.get(entity) * 2);
+            CombatUtils.dealNoInvulnerabilityTickDamage(entity, bleedList.get(entity) * 2, null);
             bleedList.remove(entity);
+            bleedDamage.remove(entity);
         }
     }
 
@@ -88,6 +100,7 @@ public class BleedTimerTask extends BukkitRunnable {
     public static void remove(LivingEntity entity) {
         if (bleedList.containsKey(entity)) {
             bleedList.remove(entity);
+            bleedDamage.remove(entity);
         }
     }
 
@@ -97,15 +110,20 @@ public class BleedTimerTask extends BukkitRunnable {
      * @param entity LivingEntity to add
      * @param ticks Number of bleeding ticks
      */
-    public static void add(LivingEntity entity, int ticks) {
+    public static void add(LivingEntity entity, int ticks, int bleedRank) {
         int newTicks = ticks;
 
         if (bleedList.containsKey(entity)) {
             newTicks += bleedList.get(entity);
             bleedList.put(entity, Math.min(newTicks, MAX_BLEED_TICKS));
+
+            //Override the current bleed rank only if this one is higher
+            if(bleedDamage.get(entity) < bleedRank)
+                bleedDamage.put(entity, bleedRank);
         }
         else {
             bleedList.put(entity, Math.min(newTicks, MAX_BLEED_TICKS));
+            bleedDamage.put(entity, bleedRank);
         }
     }
 

+ 2 - 2
src/main/java/com/gmail/nossr50/skills/swords/Swords.java

@@ -3,8 +3,8 @@ package com.gmail.nossr50.skills.swords;
 import com.gmail.nossr50.config.AdvancedConfig;
 
 public class Swords {
-    public static int    bleedMaxTicks      = AdvancedConfig.getInstance().getBleedMaxTicks();
-    public static int    bleedBaseTicks     = AdvancedConfig.getInstance().getBleedBaseTicks();
+    public static int    bleedMaxTicks      = AdvancedConfig.getInstance().getRuptureMaxTicks();
+    public static int    bleedBaseTicks     = AdvancedConfig.getInstance().getRuptureBaseTicks();
 
     public static double  counterAttackModifier      = AdvancedConfig.getInstance().getCounterModifier();
 

+ 17 - 6
src/main/java/com/gmail/nossr50/skills/swords/SwordsManager.java

@@ -13,6 +13,7 @@ import com.gmail.nossr50.util.Permissions;
 import com.gmail.nossr50.util.player.NotificationManager;
 import com.gmail.nossr50.util.player.UserManager;
 import com.gmail.nossr50.util.skills.CombatUtils;
+import com.gmail.nossr50.util.skills.RankUtils;
 import com.gmail.nossr50.util.skills.SkillActivationType;
 import com.gmail.nossr50.util.skills.SkillUtils;
 import org.bukkit.entity.Entity;
@@ -32,7 +33,7 @@ public class SwordsManager extends SkillManager {
     }
 
     public boolean canUseBleed() {
-        return Permissions.isSubSkillEnabled(getPlayer(), SubSkillType.SWORDS_BLEED);
+        return Permissions.isSubSkillEnabled(getPlayer(), SubSkillType.SWORDS_RUPTURE);
     }
 
     public boolean canUseCounterAttack(Entity target) {
@@ -49,13 +50,13 @@ public class SwordsManager extends SkillManager {
      * @param target The defending entity
      */
     public void bleedCheck(LivingEntity target) {
-        if (SkillUtils.isActivationSuccessful(SkillActivationType.RANDOM_LINEAR_100_SCALE_WITH_CAP, SubSkillType.SWORDS_BLEED, getPlayer(), this.skill, getSkillLevel(), activationChance)) {
+        if (SkillUtils.isActivationSuccessful(SkillActivationType.RANDOM_LINEAR_100_SCALE_WITH_CAP, SubSkillType.SWORDS_RUPTURE, getPlayer(), this.skill, getSkillLevel(), activationChance)) {
 
-            if (getSkillLevel() >= AdvancedConfig.getInstance().getMaxBonusLevel(SubSkillType.SWORDS_BLEED)) {
-                BleedTimerTask.add(target, Swords.bleedMaxTicks);
+            if (getSkillLevel() >= AdvancedConfig.getInstance().getMaxBonusLevel(SubSkillType.SWORDS_RUPTURE)) {
+                BleedTimerTask.add(target, getBleedTicks(), RankUtils.getRank(getPlayer(), SubSkillType.SWORDS_RUPTURE));
             }
             else {
-                BleedTimerTask.add(target, Swords.bleedBaseTicks);
+                BleedTimerTask.add(target, getBleedTicks(), RankUtils.getRank(getPlayer(), SubSkillType.SWORDS_RUPTURE));
             }
 
             if (mcMMOPlayer.useChatNotifications()) {
@@ -72,6 +73,16 @@ public class SwordsManager extends SkillManager {
         }
     }
 
+    public int getBleedTicks()
+    {
+        int bleedTicks = 2 * RankUtils.getRank(getPlayer(), SubSkillType.SWORDS_RUPTURE);
+
+        if(bleedTicks > Swords.bleedMaxTicks)
+            bleedTicks = Swords.bleedMaxTicks;
+
+        return bleedTicks;
+    }
+
     /**
      * Handle the effects of the Counter Attack ability
      *
@@ -98,6 +109,6 @@ public class SwordsManager extends SkillManager {
      */
     public void serratedStrikes(LivingEntity target, double damage, Map<DamageModifier, Double> modifiers) {
         CombatUtils.applyAbilityAoE(getPlayer(), target, damage / Swords.serratedStrikesModifier, modifiers, skill);
-        BleedTimerTask.add(target, Swords.serratedStrikesBleedTicks);
+        BleedTimerTask.add(target, Swords.serratedStrikesBleedTicks, RankUtils.getRank(getPlayer(), SubSkillType.SWORDS_RUPTURE));
     }
 }

+ 1 - 1
src/main/java/com/gmail/nossr50/skills/taming/Taming.java

@@ -13,7 +13,7 @@ public class Taming {
     public static int    fastFoodServiceUnlockLevel      = RankUtils.getUnlockLevel(SubSkillType.TAMING_FAST_FOOD_SERVICE);
     public static double fastFoodServiceActivationChance = AdvancedConfig.getInstance().getFastFoodChance();
 
-    public static int    goreBleedTicks    = AdvancedConfig.getInstance().getGoreBleedTicks();
+    public static int    goreBleedTicks    = AdvancedConfig.getInstance().getGoreRuptureTicks();
     public static double goreModifier      = AdvancedConfig.getInstance().getGoreModifier();
 
     public static int    sharpenedClawsUnlockLevel = RankUtils.getUnlockLevel(SubSkillType.TAMING_SHARPENED_CLAWS);

+ 1 - 1
src/main/java/com/gmail/nossr50/skills/taming/TamingManager.java

@@ -111,7 +111,7 @@ public class TamingManager extends SkillManager {
             return 0;
         }
 
-        BleedTimerTask.add(target, Taming.goreBleedTicks);
+        BleedTimerTask.add(target, Taming.goreBleedTicks, 1);
 
         if (target instanceof Player) {
             NotificationManager.sendPlayerInformation((Player)target, NotificationType.SUBSKILL_MESSAGE, "Combat.StruckByGore");

+ 14 - 1
src/main/java/com/gmail/nossr50/util/skills/CombatUtils.java

@@ -4,6 +4,7 @@ import com.gmail.nossr50.config.experience.ExperienceConfig;
 import com.gmail.nossr50.datatypes.interactions.NotificationType;
 import com.gmail.nossr50.datatypes.player.McMMOPlayer;
 import com.gmail.nossr50.datatypes.skills.PrimarySkillType;
+import com.gmail.nossr50.datatypes.skills.SubSkillType;
 import com.gmail.nossr50.datatypes.skills.XPGainReason;
 import com.gmail.nossr50.events.fake.FakeEntityDamageByEntityEvent;
 import com.gmail.nossr50.events.fake.FakeEntityDamageEvent;
@@ -375,6 +376,18 @@ public final class CombatUtils {
         target.damage(callFakeDamageEvent(attacker, target, cause, damage));
     }
 
+    public static void dealNoInvulnerabilityTickDamage(LivingEntity target, double damage, Entity attacker) {
+        if (target.isDead()) {
+            return;
+        }
+
+        //target.damage(callFakeDamageEvent(attacker, target, cause, damage));
+        double incDmg = callFakeDamageEvent(attacker, target, DamageCause.CUSTOM, damage);
+
+        if(incDmg > 0)
+            target.setHealth(incDmg);
+    }
+
     /**
      * Apply Area-of-Effect ability actions.
      *
@@ -405,7 +418,7 @@ public final class CombatUtils {
                         NotificationManager.sendPlayerInformation((Player)entity, NotificationType.SUBSKILL_MESSAGE, "Swords.Combat.SS.Struck");
                     }
 
-                    BleedTimerTask.add(livingEntity, Swords.serratedStrikesBleedTicks);
+                    BleedTimerTask.add(livingEntity, Swords.serratedStrikesBleedTicks, RankUtils.getRank(attacker, SubSkillType.SWORDS_RUPTURE));
                     break;
 
                 case AXES:

+ 2 - 0
src/main/java/com/gmail/nossr50/util/sounds/SoundManager.java

@@ -93,6 +93,8 @@ public class SoundManager {
                 return Sound.ENTITY_ENDER_EYE_DEATH;
             case TIRED:
                 return Sound.BLOCK_CONDUIT_AMBIENT;
+            case BLEED:
+                return Sound.ENTITY_ENDER_EYE_DEATH;
             default:
                 return null;
         }

+ 1 - 0
src/main/java/com/gmail/nossr50/util/sounds/SoundType.java

@@ -14,6 +14,7 @@ public enum SoundType {
     TOOL_READY,
     ABILITY_ACTIVATED_GENERIC,
     ABILITY_ACTIVATED_BERSERK,
+    BLEED,
     TIRED;
 
     public boolean usesCustomPitch()

+ 6 - 6
src/main/resources/advanced.yml

@@ -442,19 +442,19 @@ Skills:
     #  Settings for Swords
     ###
     Swords:
-        Bleed:
+        Rupture:
             # ChanceMax: Maximum chance of triggering bleeding
             # MaxBonusLevel: On this level, the chance to cause Bleeding will be <ChanceMax>
-            ChanceMax: 75.0
-            MaxBonusLevel: 75
+            ChanceMax: 33.0
+            MaxBonusLevel: 20
 
             # DamagePlayer: Bleeding damage dealt to players
             # DamageMobs: Bleeding damage dealt to mobs
-            DamagePlayer: 1.0
-            DamageMobs: 2.0
+            DamagePlayer: 2.0
+            DamageMobs: 3.0
 
             # These settings determine how long the Bleeding effect lasts
-            MaxTicks: 3
+            MaxTicks: 8
             BaseTicks: 2
 
         CounterAttack:

+ 9 - 9
src/main/resources/locale/locale_en_US.properties

@@ -383,7 +383,7 @@ Anvil.Unbreakable=This item is unbreakable!
 #SWORDS
 Swords.Ability.Lower=[[GRAY]]You lower your sword.
 Swords.Ability.Ready=[[DARK_AQUA]]You [[GOLD]]ready[[DARK_AQUA]] your Sword.
-Swords.Combat.Bleed.Note=[[GRAY]]NOTE: [[YELLOW]]1 Tick happens every 2 seconds
+Swords.Combat.Rupture.Note=[[GRAY]]NOTE: [[YELLOW]]1 Tick happens every 0.5 seconds!
 Swords.Combat.Bleeding.Started=[[DARK_RED]] You're bleeding!
 Swords.Combat.Bleeding.Stopped=[[GRAY]]The bleeding has [[GREEN]]stopped[[GRAY]]!
 Swords.Combat.Bleeding=[[GREEN]]**ENEMY BLEEDING**
@@ -396,12 +396,12 @@ Swords.SubSkill.CounterAttack.Stat=Counter Attack Chance
 Swords.SubSkill.SerratedStrikes.Name=Serrated Strikes
 Swords.SubSkill.SerratedStrikes.Description={0} DMG AoE, Bleed+ AoE
 Swords.SubSkill.SerratedStrikes.Stat=Serrated Strikes Length
-Swords.SubSkill.Bleed.Name=Bleed
-Swords.SubSkill.Bleed.Description=Apply a bleed DoT
-Swords.SubSkill.Bleed.Stat=Bleed Chance
-Swords.SubSkill.Bleed.Stat.Extra=Bleed Length: [[GREEN]]{0} ticks
-Swords.Effect.4=Serrated Strikes Bleed+
-Swords.Effect.5={0} Tick Bleed
+Swords.SubSkill.Rupture.Name=Rupture
+Swords.SubSkill.Rupture.Description=Apply a powerful bleed DoT
+Swords.SubSkill.Rupture.Stat=Rupture Chance
+Swords.SubSkill.Rupture.Stat.Extra=Rupture: [[GREEN]]{0} ticks [{1} DMG vs Player] [{2} DMG vs Mobs]
+Swords.Effect.4=Serrated Strikes Rupture+
+Swords.Effect.5={0} Tick Rupture
 Swords.Listener=Swords:
 Swords.SkillName=SWORDS
 Swords.Skills.SS.Off=**Serrated Strikes has worn off**
@@ -441,7 +441,7 @@ Taming.SubSkill.FastFoodService.Description=Chance for wolves to heal on attack
 Taming.SubSkill.HolyHound.Name=Holy Hound
 Taming.SubSkill.HolyHound.Description=Healed by Magic & Poison
 Taming.SubSkill.Gore.Name=Gore
-Taming.SubSkill.Gore.Description=Critical Strike that applies Bleed
+Taming.SubSkill.Gore.Description=Critical Strike that applies Rupture
 Taming.SubSkill.SharpenedClaws.Name=Sharpened Claws
 Taming.SubSkill.SharpenedClaws.Description=Damage Bonus
 Taming.SubSkill.EnvironmentallyAware.Name=Environmentally Aware
@@ -886,7 +886,7 @@ Guides.Smelting.Section.0=Coming soon...
 Guides.Swords.Section.0=[[DARK_AQUA]]About Swords:\n[[YELLOW]]This skill awards combat bonuses to anyone fighting with a\n[[YELLOW]]sword.\n\n[[DARK_AQUA]]XP GAIN:\n[[YELLOW]]XP is gained based on the amount of damage dealt to mobs or \n[[YELLOW]]other players when wielding a sword.
 Guides.Swords.Section.1=[[DARK_AQUA]]How does Serrated Strikes work?\n[[YELLOW]]Serrated Strikes is an active ability, you can activate it by\n[[YELLOW]]right-clicking with a sword. This ability allows you to deal \n[[YELLOW]]an AoE (Area of Effect) hit. This AoE will do a bonus 25%\n[[YELLOW]]damage and will inflict a bleed effect that lasts for 5 ticks.
 Guides.Swords.Section.2=[[DARK_AQUA]]How does Counter Attack work?\n[[YELLOW]]Counter Attack is an active ability. When blocking and taking\n[[YELLOW]]hits from mobs, you will have a chance to reflect 50% of \n[[YELLOW]]the damage that was taken.
-Guides.Swords.Section.3=[[DARK_AQUA]]How does Bleed work?\n[[YELLOW]]Bleed causes enemies to take damage every two seconds. The \n[[YELLOW]]target will bleed until the effect wears off, or death, \n[[YELLOW]]whichever comes first.\n[[YELLOW]]The duration of the bleed is increased by your sword skill.
+Guides.Swords.Section.3=[[DARK_AQUA]]How does Rupture work?\n[[YELLOW]]Rupture causes enemies to take damage every two seconds. The \n[[YELLOW]]target will bleed until the effect wears off, or death, \n[[YELLOW]]whichever comes first.\n[[YELLOW]]The duration of the bleed is increased by your sword skill.
 ##Taming
 Guides.Taming.Section.0=[[DARK_AQUA]]About Taming:\n[[YELLOW]]Taming will give players various combat bonuses when using\n[[YELLOW]]tamed wolves.\n\n[[DARK_AQUA]]XP GAIN:\n[[YELLOW]]To gain XP in this skill, you need to tame wolves/ocelots or\n[[YELLOW]]get into combat with your wolves.
 Guides.Taming.Section.1=[[DARK_AQUA]]How does Call of the Wild work?\n[[YELLOW]]Call of the Wild is an active ability that will allow you to summon\n[[YELLOW]]a wolf or an ocelot by your side. You can do this by\n[[YELLOW]]left-clicking while holding bones or fish.

+ 11 - 0
src/main/resources/skillranks.yml

@@ -326,6 +326,17 @@ Fishing:
             Rank_7: 850
             Rank_8: 1000
 Swords:
+    Rupture:
+        Standard:
+            Rank_1: 5
+            Rank_2: 15
+            Rank_3: 75
+            Rank_4: 90
+        RetroMode:
+            Rank_1: 50
+            Rank_2: 150
+            Rank_3: 750
+            Rank_4: 900
     SerratedStrikes:
         Standard:
             Rank_1: 10

+ 5 - 1
src/main/resources/sounds.yml

@@ -59,4 +59,8 @@ Sounds:
     TIRED:
         Enable: true
         Volume: 1.0
-        Pitch: 1.7
+        Pitch: 1.7
+    BLEED:
+        Enable: true
+        Volume: 2.0
+        Pitch: 2.0