Bleed doesn't suck anymore.

This commit is contained in:
nossr50 2019-01-21 15:14:01 -08:00
parent 848cee18a9
commit 11c8374f6c
18 changed files with 137 additions and 60 deletions

View File

@ -22,6 +22,7 @@ Version 2.1.0
+ (Sounds) Activating Super abilities plays a sound (other plays can hear this) + (Sounds) Activating Super abilities plays a sound (other plays can hear this)
+ (Sounds) Skill Unlock Notifications have sounds + (Sounds) Skill Unlock Notifications have sounds
+ (Sounds) Readying a tool for a super ability now plays a sound + (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) mcMMO now notifies you when you progress in a skill!
+ (Experience) Coral (blocks) now give Mining XP + (Experience) Coral (blocks) now give Mining XP
+ (Experience) Coral (plants) now give Herbalism 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) + (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 + (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) + (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) 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) 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 + (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) 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) Woodcutting's Double Drop subskill is now named Harvest Lumber
! (Skills) Archery's Skill Shot now uses a rank system ! (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 Axe Mastery now uses a rank system
! (Skills) Axe's Impact 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 ! (Skills) Herbalism's Farmer's Diet now uses a rank system

View File

@ -7,6 +7,7 @@ import com.gmail.nossr50.locale.LocaleLoader;
import com.gmail.nossr50.skills.swords.Swords; import com.gmail.nossr50.skills.swords.Swords;
import com.gmail.nossr50.util.Permissions; import com.gmail.nossr50.util.Permissions;
import com.gmail.nossr50.util.TextComponentFactory; import com.gmail.nossr50.util.TextComponentFactory;
import com.gmail.nossr50.util.player.UserManager;
import com.gmail.nossr50.util.skills.RankUtils; import com.gmail.nossr50.util.skills.RankUtils;
import net.md_5.bungee.api.chat.TextComponent; import net.md_5.bungee.api.chat.TextComponent;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
@ -40,11 +41,11 @@ public class SwordsCommand extends SkillCommand {
serratedStrikesLengthEndurance = serratedStrikesStrings[1]; serratedStrikesLengthEndurance = serratedStrikesStrings[1];
} }
// SWORDS_BLEED // SWORDS_RUPTURE
if (canBleed) { 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]; bleedChance = bleedStrings[0];
bleedChanceLucky = bleedStrings[1]; bleedChanceLucky = bleedStrings[1];
} }
@ -59,7 +60,7 @@ public class SwordsCommand extends SkillCommand {
@Override @Override
protected void permissionsCheck(Player player) { protected void permissionsCheck(Player player) {
canBleed = canUseSubskill(player, SubSkillType.SWORDS_BLEED); canBleed = canUseSubskill(player, SubSkillType.SWORDS_RUPTURE);
canCounter = canUseSubskill(player, SubSkillType.SWORDS_COUNTER_ATTACK); canCounter = canUseSubskill(player, SubSkillType.SWORDS_COUNTER_ATTACK);
canSerratedStrike = RankUtils.hasUnlockedSubskill(player, SubSkillType.SWORDS_SERRATED_STRIKES) && Permissions.serratedStrikes(player); 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) { protected List<String> statsDisplay(Player player, float skillValue, boolean hasEndurance, boolean isLucky) {
List<String> messages = new ArrayList<String>(); 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) { if (canCounter) {
messages.add(getStatMessage(SubSkillType.SWORDS_COUNTER_ATTACK, counterChance) messages.add(getStatMessage(SubSkillType.SWORDS_COUNTER_ATTACK, counterChance)
+ (isLucky ? LocaleLoader.getString("Perks.Lucky.Bonus", counterChanceLucky) : "")); + (isLucky ? LocaleLoader.getString("Perks.Lucky.Bonus", counterChanceLucky) : ""));
} }
if (canBleed) { if (canBleed) {
messages.add(getStatMessage(SubSkillType.SWORDS_BLEED, bleedChance) messages.add(getStatMessage(SubSkillType.SWORDS_RUPTURE, bleedChance)
+ (isLucky ? LocaleLoader.getString("Perks.Lucky.Bonus", bleedChanceLucky) : "")); + (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) { if (canSerratedStrike) {

View File

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

View File

@ -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)), 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)), 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)), 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)), 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)), 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)); 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));

View File

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

View File

@ -498,7 +498,7 @@ public class mcMMO extends JavaPlugin {
new CleanBackupsTask().runTaskAsynchronously(mcMMO.p); new CleanBackupsTask().runTaskAsynchronously(mcMMO.p);
// Bleed timer (Runs every two seconds) // 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 // Old & Powerless User remover
long purgeIntervalTicks = Config.getInstance().getPurgeInterval() * 60L * 60L * Misc.TICK_CONVERSION_FACTOR; long purgeIntervalTicks = Config.getInstance().getPurgeInterval() * 60L * 60L * Misc.TICK_CONVERSION_FACTOR;

View File

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

View File

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

View File

@ -13,6 +13,7 @@ import com.gmail.nossr50.util.Permissions;
import com.gmail.nossr50.util.player.NotificationManager; import com.gmail.nossr50.util.player.NotificationManager;
import com.gmail.nossr50.util.player.UserManager; import com.gmail.nossr50.util.player.UserManager;
import com.gmail.nossr50.util.skills.CombatUtils; 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.SkillActivationType;
import com.gmail.nossr50.util.skills.SkillUtils; import com.gmail.nossr50.util.skills.SkillUtils;
import org.bukkit.entity.Entity; import org.bukkit.entity.Entity;
@ -32,7 +33,7 @@ public class SwordsManager extends SkillManager {
} }
public boolean canUseBleed() { public boolean canUseBleed() {
return Permissions.isSubSkillEnabled(getPlayer(), SubSkillType.SWORDS_BLEED); return Permissions.isSubSkillEnabled(getPlayer(), SubSkillType.SWORDS_RUPTURE);
} }
public boolean canUseCounterAttack(Entity target) { public boolean canUseCounterAttack(Entity target) {
@ -49,13 +50,13 @@ public class SwordsManager extends SkillManager {
* @param target The defending entity * @param target The defending entity
*/ */
public void bleedCheck(LivingEntity target) { 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)) { if (getSkillLevel() >= AdvancedConfig.getInstance().getMaxBonusLevel(SubSkillType.SWORDS_RUPTURE)) {
BleedTimerTask.add(target, Swords.bleedMaxTicks); BleedTimerTask.add(target, getBleedTicks(), RankUtils.getRank(getPlayer(), SubSkillType.SWORDS_RUPTURE));
} }
else { else {
BleedTimerTask.add(target, Swords.bleedBaseTicks); BleedTimerTask.add(target, getBleedTicks(), RankUtils.getRank(getPlayer(), SubSkillType.SWORDS_RUPTURE));
} }
if (mcMMOPlayer.useChatNotifications()) { 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 * 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) { public void serratedStrikes(LivingEntity target, double damage, Map<DamageModifier, Double> modifiers) {
CombatUtils.applyAbilityAoE(getPlayer(), target, damage / Swords.serratedStrikesModifier, modifiers, skill); 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));
} }
} }

View File

@ -13,7 +13,7 @@ public class Taming {
public static int fastFoodServiceUnlockLevel = RankUtils.getUnlockLevel(SubSkillType.TAMING_FAST_FOOD_SERVICE); public static int fastFoodServiceUnlockLevel = RankUtils.getUnlockLevel(SubSkillType.TAMING_FAST_FOOD_SERVICE);
public static double fastFoodServiceActivationChance = AdvancedConfig.getInstance().getFastFoodChance(); 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 double goreModifier = AdvancedConfig.getInstance().getGoreModifier();
public static int sharpenedClawsUnlockLevel = RankUtils.getUnlockLevel(SubSkillType.TAMING_SHARPENED_CLAWS); public static int sharpenedClawsUnlockLevel = RankUtils.getUnlockLevel(SubSkillType.TAMING_SHARPENED_CLAWS);

View File

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

View File

@ -4,6 +4,7 @@ import com.gmail.nossr50.config.experience.ExperienceConfig;
import com.gmail.nossr50.datatypes.interactions.NotificationType; import com.gmail.nossr50.datatypes.interactions.NotificationType;
import com.gmail.nossr50.datatypes.player.McMMOPlayer; import com.gmail.nossr50.datatypes.player.McMMOPlayer;
import com.gmail.nossr50.datatypes.skills.PrimarySkillType; 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.datatypes.skills.XPGainReason;
import com.gmail.nossr50.events.fake.FakeEntityDamageByEntityEvent; import com.gmail.nossr50.events.fake.FakeEntityDamageByEntityEvent;
import com.gmail.nossr50.events.fake.FakeEntityDamageEvent; import com.gmail.nossr50.events.fake.FakeEntityDamageEvent;
@ -375,6 +376,18 @@ public final class CombatUtils {
target.damage(callFakeDamageEvent(attacker, target, cause, damage)); 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. * 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"); 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; break;
case AXES: case AXES:

View File

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

View File

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

View File

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

View File

@ -383,7 +383,7 @@ Anvil.Unbreakable=This item is unbreakable!
#SWORDS #SWORDS
Swords.Ability.Lower=[[GRAY]]You lower your sword. Swords.Ability.Lower=[[GRAY]]You lower your sword.
Swords.Ability.Ready=[[DARK_AQUA]]You [[GOLD]]ready[[DARK_AQUA]] 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.Started=[[DARK_RED]] You're bleeding!
Swords.Combat.Bleeding.Stopped=[[GRAY]]The bleeding has [[GREEN]]stopped[[GRAY]]! Swords.Combat.Bleeding.Stopped=[[GRAY]]The bleeding has [[GREEN]]stopped[[GRAY]]!
Swords.Combat.Bleeding=[[GREEN]]**ENEMY BLEEDING** 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.Name=Serrated Strikes
Swords.SubSkill.SerratedStrikes.Description={0} DMG AoE, Bleed+ AoE Swords.SubSkill.SerratedStrikes.Description={0} DMG AoE, Bleed+ AoE
Swords.SubSkill.SerratedStrikes.Stat=Serrated Strikes Length Swords.SubSkill.SerratedStrikes.Stat=Serrated Strikes Length
Swords.SubSkill.Bleed.Name=Bleed Swords.SubSkill.Rupture.Name=Rupture
Swords.SubSkill.Bleed.Description=Apply a bleed DoT Swords.SubSkill.Rupture.Description=Apply a powerful bleed DoT
Swords.SubSkill.Bleed.Stat=Bleed Chance Swords.SubSkill.Rupture.Stat=Rupture Chance
Swords.SubSkill.Bleed.Stat.Extra=Bleed Length: [[GREEN]]{0} ticks Swords.SubSkill.Rupture.Stat.Extra=Rupture: [[GREEN]]{0} ticks [{1} DMG vs Player] [{2} DMG vs Mobs]
Swords.Effect.4=Serrated Strikes Bleed+ Swords.Effect.4=Serrated Strikes Rupture+
Swords.Effect.5={0} Tick Bleed Swords.Effect.5={0} Tick Rupture
Swords.Listener=Swords: Swords.Listener=Swords:
Swords.SkillName=SWORDS Swords.SkillName=SWORDS
Swords.Skills.SS.Off=**Serrated Strikes has worn off** 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.Name=Holy Hound
Taming.SubSkill.HolyHound.Description=Healed by Magic & Poison Taming.SubSkill.HolyHound.Description=Healed by Magic & Poison
Taming.SubSkill.Gore.Name=Gore 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.Name=Sharpened Claws
Taming.SubSkill.SharpenedClaws.Description=Damage Bonus Taming.SubSkill.SharpenedClaws.Description=Damage Bonus
Taming.SubSkill.EnvironmentallyAware.Name=Environmentally Aware 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.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.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.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 ##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.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. 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.

View File

@ -326,6 +326,17 @@ Fishing:
Rank_7: 850 Rank_7: 850
Rank_8: 1000 Rank_8: 1000
Swords: 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: SerratedStrikes:
Standard: Standard:
Rank_1: 10 Rank_1: 10

View File

@ -60,3 +60,7 @@ Sounds:
Enable: true Enable: true
Volume: 1.0 Volume: 1.0
Pitch: 1.7 Pitch: 1.7
BLEED:
Enable: true
Volume: 2.0
Pitch: 2.0