diff --git a/Changelog.txt b/Changelog.txt index 035c7ffc8..31e1721a0 100644 --- a/Changelog.txt +++ b/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 diff --git a/src/main/java/com/gmail/nossr50/commands/skills/SwordsCommand.java b/src/main/java/com/gmail/nossr50/commands/skills/SwordsCommand.java index ed3cc6a87..614c71c7f 100644 --- a/src/main/java/com/gmail/nossr50/commands/skills/SwordsCommand.java +++ b/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 statsDisplay(Player player, float skillValue, boolean hasEndurance, boolean isLucky) { List messages = new ArrayList(); + 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) { diff --git a/src/main/java/com/gmail/nossr50/config/AdvancedConfig.java b/src/main/java/com/gmail/nossr50/config/AdvancedConfig.java index 2af38e850..866d87eb5 100644 --- a/src/main/java/com/gmail/nossr50/config/AdvancedConfig.java +++ b/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); }*/ diff --git a/src/main/java/com/gmail/nossr50/datatypes/skills/PrimarySkillType.java b/src/main/java/com/gmail/nossr50/datatypes/skills/PrimarySkillType.java index 54f01015c..1cb036842 100644 --- a/src/main/java/com/gmail/nossr50/datatypes/skills/PrimarySkillType.java +++ b/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)); diff --git a/src/main/java/com/gmail/nossr50/datatypes/skills/SubSkillType.java b/src/main/java/com/gmail/nossr50/datatypes/skills/SubSkillType.java index 3d96cc86f..1c19e3625 100644 --- a/src/main/java/com/gmail/nossr50/datatypes/skills/SubSkillType.java +++ b/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), diff --git a/src/main/java/com/gmail/nossr50/mcMMO.java b/src/main/java/com/gmail/nossr50/mcMMO.java index 507ee9649..acbbbdb28 100644 --- a/src/main/java/com/gmail/nossr50/mcMMO.java +++ b/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; 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 a1d82ae9d..af37d2532 100644 --- a/src/main/java/com/gmail/nossr50/runnables/skills/BleedTimerTask.java +++ b/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 bleedList = new HashMap(); + private static Map bleedDamage = new HashMap(); @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); } } diff --git a/src/main/java/com/gmail/nossr50/skills/swords/Swords.java b/src/main/java/com/gmail/nossr50/skills/swords/Swords.java index ce7839435..c6d49eb5f 100644 --- a/src/main/java/com/gmail/nossr50/skills/swords/Swords.java +++ b/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(); 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 bff6c78d1..8ac106a84 100644 --- a/src/main/java/com/gmail/nossr50/skills/swords/SwordsManager.java +++ b/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 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)); } } diff --git a/src/main/java/com/gmail/nossr50/skills/taming/Taming.java b/src/main/java/com/gmail/nossr50/skills/taming/Taming.java index 6ec4c7b56..092048eab 100644 --- a/src/main/java/com/gmail/nossr50/skills/taming/Taming.java +++ b/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); 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 00660c8ae..762efcd41 100644 --- a/src/main/java/com/gmail/nossr50/skills/taming/TamingManager.java +++ b/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"); 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 03b8a4b0a..fc88b6bab 100644 --- a/src/main/java/com/gmail/nossr50/util/skills/CombatUtils.java +++ b/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: diff --git a/src/main/java/com/gmail/nossr50/util/sounds/SoundManager.java b/src/main/java/com/gmail/nossr50/util/sounds/SoundManager.java index 5a49d55b4..7793e8887 100644 --- a/src/main/java/com/gmail/nossr50/util/sounds/SoundManager.java +++ b/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; } diff --git a/src/main/java/com/gmail/nossr50/util/sounds/SoundType.java b/src/main/java/com/gmail/nossr50/util/sounds/SoundType.java index c2f41f631..80d09b1f2 100644 --- a/src/main/java/com/gmail/nossr50/util/sounds/SoundType.java +++ b/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() diff --git a/src/main/resources/advanced.yml b/src/main/resources/advanced.yml index f2655df92..26c4d9642 100644 --- a/src/main/resources/advanced.yml +++ b/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: 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: diff --git a/src/main/resources/locale/locale_en_US.properties b/src/main/resources/locale/locale_en_US.properties index e93adec7c..5f3505ce4 100644 --- a/src/main/resources/locale/locale_en_US.properties +++ b/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. diff --git a/src/main/resources/skillranks.yml b/src/main/resources/skillranks.yml index 61d319b07..8b54fda06 100644 --- a/src/main/resources/skillranks.yml +++ b/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 diff --git a/src/main/resources/sounds.yml b/src/main/resources/sounds.yml index 21f3e48d2..7ed6550d5 100644 --- a/src/main/resources/sounds.yml +++ b/src/main/resources/sounds.yml @@ -59,4 +59,8 @@ Sounds: TIRED: Enable: true Volume: 1.0 - Pitch: 1.7 \ No newline at end of file + Pitch: 1.7 + BLEED: + Enable: true + Volume: 2.0 + Pitch: 2.0 \ No newline at end of file