Added config options for Rupture and updated the Swords command

This commit is contained in:
nossr50 2021-04-02 12:02:21 -07:00
parent 48bf79055a
commit affecfeeeb
8 changed files with 149 additions and 124 deletions

View File

@ -1,11 +1,26 @@
Version 2.1.186 Version 2.1.186
Rupture has been reworked to solve a few outstanding issues (see notes) Rupture has been reworked to solve a few outstanding issues (see notes)
Removed 'Skills.Swords.Rupture.MaxTicks' from advanced.yml
Removed 'Skills.Swords.Rupture.BaseTicks' from advanced.yml
Gore no longer applies Rupture Gore no longer applies Rupture
Gore no longer sends a message to the Wolf owner when it triggers Gore no longer sends a message to the Wolf owner when it triggers
Gore no longer sends a message to players that are hit by it Gore no longer sends a message to players that are hit by it
Rupture no longer sends a message telling you that your target is bleeding Rupture no longer sends a message telling you that your target is bleeding
Updated locale string 'Swords.SubSkill.Rupture.Description'
Updated locale string 'Swords.SubSkill.Rupture.Stat.Extra'
Updated locale string 'Swords.Combat.Rupture.Note'
Added 'Skills.Swords.Rupture.Rupture_Mechanics.Chance_To_Apply_On_Hit' to advanced.yml
Added 'Skills.Swords.Rupture.Rupture_Mechanics.Duration_In_Seconds.Against_Players' to advanced.yml
Added 'Skills.Swords.Rupture.Rupture_Mechanics.Duration_In_Seconds.Against_Mobs' to advanced.yml
Added 'Skills.Swords.Rupture.Rupture_Mechanics.Tick_Interval_Damage.Against_Players' to advanced.yml
Added 'Skills.Swords.Rupture.Rupture_Mechanics.Tick_Interval_Damage.Against_Mobs' to advanced.yml
Added 'Skills.Swords.Rupture.Rupture_Mechanics.Explosion_Damage.Against_Players' to advanced.yml
Added 'Skills.Swords.Rupture.Rupture_Mechanics.Explosion_Damage.Against_Mobs' to advanced.yml
Removed 'Skills.Swords.Rupture.ChanceMax' from advanced.yml
Removed 'Skills.Swords.Rupture.MaxBonusLevel.Standard' from advanced.yml
Removed 'Skills.Swords.Rupture.MaxBonusLevel.RetroMode' from advanced.yml
Removed 'Skills.Swords.Rupture.MaxTicks' from advanced.yml
Removed 'Skills.Swords.Rupture.BaseTicks' from advanced.yml
Removed 'Skills.Swords.Rupture.DamagePlayer' from advanced.yml
Removed 'Skills.Swords.Rupture.DamageMobs' from advanced.yml
NOTES: NOTES:
The old Rupture would constantly interfere with your ability to do a Sweep Attack/Swipe with swords, the new one solves this problem The old Rupture would constantly interfere with your ability to do a Sweep Attack/Swipe with swords, the new one solves this problem

View File

@ -1,6 +1,7 @@
package com.gmail.nossr50.commands.skills; package com.gmail.nossr50.commands.skills;
import com.gmail.nossr50.config.AdvancedConfig; import com.gmail.nossr50.config.AdvancedConfig;
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.SubSkillType;
import com.gmail.nossr50.locale.LocaleLoader; import com.gmail.nossr50.locale.LocaleLoader;
@ -19,15 +20,16 @@ import java.util.List;
public class SwordsCommand extends SkillCommand { public class SwordsCommand extends SkillCommand {
private String counterChance; private String counterChance;
private String counterChanceLucky; private String counterChanceLucky;
private int bleedLength;
private String bleedChance;
private String bleedChanceLucky;
private String serratedStrikesLength; private String serratedStrikesLength;
private String serratedStrikesLengthEndurance; private String serratedStrikesLengthEndurance;
private String rupturePureTickDamageAgainstPlayers, rupturePureTickDamageAgainstMobs,
ruptureExplosionDamageAgainstPlayers, ruptureExplosionDamageAgainstMobs,
ruptureLengthSecondsAgainstPlayers, ruptureLengthSecondsAgainstMobs, ruptureChanceToApply, ruptureChanceToApplyLucky;
private boolean canCounter; private boolean canCounter;
private boolean canSerratedStrike; private boolean canSerratedStrike;
private boolean canBleed; private boolean canRupture;
public SwordsCommand() { public SwordsCommand() {
super(PrimarySkillType.SWORDS); super(PrimarySkillType.SWORDS);
@ -43,12 +45,19 @@ public class SwordsCommand extends SkillCommand {
} }
// SWORDS_RUPTURE // SWORDS_RUPTURE
if (canBleed) { if (canRupture) {
bleedLength = UserManager.getPlayer(player).getSwordsManager().getRuptureBleedTicks(); int ruptureRank = RankUtils.getRank(player, SubSkillType.SWORDS_RUPTURE);
ruptureLengthSecondsAgainstPlayers = String.valueOf(AdvancedConfig.getInstance().getRuptureDurationSeconds(true));
ruptureLengthSecondsAgainstMobs = String.valueOf(AdvancedConfig.getInstance().getRuptureDurationSeconds(false));
String[] bleedStrings = getAbilityDisplayValues(SkillActivationType.RANDOM_LINEAR_100_SCALE_WITH_CAP, player, SubSkillType.SWORDS_RUPTURE); rupturePureTickDamageAgainstPlayers = String.valueOf(AdvancedConfig.getInstance().getRuptureTickDamage(true, ruptureRank));
bleedChance = bleedStrings[0]; rupturePureTickDamageAgainstMobs = String.valueOf(AdvancedConfig.getInstance().getRuptureTickDamage(false, ruptureRank));
bleedChanceLucky = bleedStrings[1];
ruptureExplosionDamageAgainstPlayers = String.valueOf(AdvancedConfig.getInstance().getRuptureExplosionDamage(true, ruptureRank));
ruptureExplosionDamageAgainstMobs = String.valueOf(AdvancedConfig.getInstance().getRuptureExplosionDamage(false, ruptureRank));
ruptureChanceToApply = String.valueOf(AdvancedConfig.getInstance().getRuptureChanceToApplyOnHit(ruptureRank));
ruptureChanceToApplyLucky = String.valueOf(AdvancedConfig.getInstance().getRuptureChanceToApplyOnHit(ruptureRank) * 1.33);
} }
// SERRATED STRIKES // SERRATED STRIKES
@ -61,7 +70,7 @@ public class SwordsCommand extends SkillCommand {
@Override @Override
protected void permissionsCheck(Player player) { protected void permissionsCheck(Player player) {
canBleed = canUseSubskill(player, SubSkillType.SWORDS_RUPTURE); canRupture = 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);
} }
@ -70,22 +79,21 @@ 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<>(); List<String> messages = new ArrayList<>();
int ruptureTicks = UserManager.getPlayer(player).getSwordsManager().getRuptureBleedTicks();
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 (canRupture) {
messages.add(getStatMessage(SubSkillType.SWORDS_RUPTURE, bleedChance) messages.add(getStatMessage(SubSkillType.SWORDS_RUPTURE, ruptureChanceToApply)
+ (isLucky ? LocaleLoader.getString("Perks.Lucky.Bonus", bleedChanceLucky) : "")); + (isLucky ? LocaleLoader.getString("Perks.Lucky.Bonus", ruptureChanceToApplyLucky) : ""));
messages.add(getStatMessage(true, true, SubSkillType.SWORDS_RUPTURE, messages.add(getStatMessage(true, true, SubSkillType.SWORDS_RUPTURE,
String.valueOf(ruptureTicks), ruptureLengthSecondsAgainstPlayers,
String.valueOf(ruptureDamagePlayers), ruptureLengthSecondsAgainstMobs,
String.valueOf(ruptureDamageMobs))); rupturePureTickDamageAgainstPlayers,
rupturePureTickDamageAgainstMobs,
ruptureExplosionDamageAgainstPlayers,
ruptureExplosionDamageAgainstMobs));
messages.add(LocaleLoader.getString("Swords.Combat.Rupture.Note")); messages.add(LocaleLoader.getString("Swords.Combat.Rupture.Note"));
} }

View File

@ -5,6 +5,9 @@ import com.gmail.nossr50.datatypes.skills.SubSkillType;
import com.gmail.nossr50.datatypes.skills.subskills.AbstractSubSkill; import com.gmail.nossr50.datatypes.skills.subskills.AbstractSubSkill;
import com.gmail.nossr50.mcMMO; import com.gmail.nossr50.mcMMO;
import net.md_5.bungee.api.ChatColor; import net.md_5.bungee.api.ChatColor;
import org.bukkit.entity.LivingEntity;
import org.bukkit.entity.Player;
import org.jetbrains.annotations.NotNull;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
@ -310,25 +313,6 @@ public class AdvancedConfig extends AutoUpdateConfigLoader {
} }
/* SWORDS */ /* SWORDS */
if (getMaximumProbability(SubSkillType.SWORDS_RUPTURE) < 1) {
reason.add("Skills.Swords.Rupture.ChanceMax should be at least 1!");
}
if (getMaxBonusLevel(SubSkillType.SWORDS_RUPTURE) < 1) {
reason.add("Skills.Swords.Rupture.MaxBonusLevel should be at least 1!");
}
if (getRuptureMaxTicks() < 1) {
reason.add("Skills.Swords.Rupture.MaxTicks should be at least 1!");
}
if (getRuptureMaxTicks() < getRuptureBaseTicks()) {
reason.add("Skills.Swords.Rupture.MaxTicks should be at least Skills.Swords.Rupture.BaseTicks!");
}
if (getRuptureBaseTicks() < 1) {
reason.add("Skills.Swords.Rupture.BaseTicks should be at least 1!");
}
if (getMaximumProbability(SubSkillType.SWORDS_COUNTER_ATTACK) < 1) { if (getMaximumProbability(SubSkillType.SWORDS_COUNTER_ATTACK) < 1) {
reason.add("Skills.Swords.CounterAttack.ChanceMax should be at least 1!"); reason.add("Skills.Swords.CounterAttack.ChanceMax should be at least 1!");
@ -665,13 +649,11 @@ public class AdvancedConfig extends AutoUpdateConfigLoader {
public double getGracefulRollDamageThreshold() { return config.getDouble("Skills.Acrobatics.GracefulRoll.DamageThreshold", 14.0D); } public double getGracefulRollDamageThreshold() { return config.getDouble("Skills.Acrobatics.GracefulRoll.DamageThreshold", 14.0D); }
/* ALCHEMY */ /* ALCHEMY */
/*public int getCatalysisUnlockLevel() { return config.getInt("Skills.Alchemy.Catalysis.UnlockLevel", 100); }*/
public int getCatalysisMaxBonusLevel() { return config.getInt("Skills.Alchemy.Catalysis.MaxBonusLevel", 1000); } public int getCatalysisMaxBonusLevel() { return config.getInt("Skills.Alchemy.Catalysis.MaxBonusLevel", 1000); }
public double getCatalysisMinSpeed() { return config.getDouble("Skills.Alchemy.Catalysis.MinSpeed", 1.0D); } public double getCatalysisMinSpeed() { return config.getDouble("Skills.Alchemy.Catalysis.MinSpeed", 1.0D); }
public double getCatalysisMaxSpeed() { return config.getDouble("Skills.Alchemy.Catalysis.MaxSpeed", 4.0D); } public double getCatalysisMaxSpeed() { return config.getDouble("Skills.Alchemy.Catalysis.MaxSpeed", 4.0D); }
//public int getConcoctionsTierLevel(Alchemy.Tier tier) { return config.getInt("Skills.Alchemy.Rank_Levels.Rank_" + rank); }
/* ARCHERY */ /* ARCHERY */
public double getSkillShotRankDamageMultiplier() { return config.getDouble("Skills.Archery.SkillShot.RankDamageMultiplier", 10.0D); } public double getSkillShotRankDamageMultiplier() { return config.getDouble("Skills.Archery.SkillShot.RankDamageMultiplier", 10.0D); }
@ -700,7 +682,6 @@ public class AdvancedConfig extends AutoUpdateConfigLoader {
//Nothing to configure, everything is already configurable in config.yml //Nothing to configure, everything is already configurable in config.yml
/* FISHING */ /* FISHING */
//public int getFishingTierLevel(int rank) { return config.getInt("Skills.Fishing.Rank_Levels.Rank_" + rank); }
public double getShakeChance(int rank) { return config.getDouble("Skills.Fishing.ShakeChance.Rank_" + rank); } public double getShakeChance(int rank) { return config.getDouble("Skills.Fishing.ShakeChance.Rank_" + rank); }
public int getFishingVanillaXPModifier(int rank) { return config.getInt("Skills.Fishing.VanillaXPMultiplier.Rank_" + rank); } public int getFishingVanillaXPModifier(int rank) { return config.getInt("Skills.Fishing.VanillaXPMultiplier.Rank_" + rank); }
@ -712,9 +693,7 @@ public class AdvancedConfig extends AutoUpdateConfigLoader {
public int getFishingReductionMaxWaitCap() { return config.getInt("Skills.Fishing.MasterAngler.Tick_Reduction_Caps.Max_Wait", 100);} public int getFishingReductionMaxWaitCap() { return config.getInt("Skills.Fishing.MasterAngler.Tick_Reduction_Caps.Max_Wait", 100);}
public int getFishermanDietRankChange() { return config.getInt("Skills.Fishing.FishermansDiet.RankChange", 200); } public int getFishermanDietRankChange() { return config.getInt("Skills.Fishing.FishermansDiet.RankChange", 200); }
/*public int getIceFishingUnlockLevel() { return config.getInt("Skills.Fishing.IceFishing.UnlockLevel", 50); }
public int getMasterAnglerUnlockLevel() {return config.getInt("Skills.Fishing.MasterAngler.UnlockLevel", 125); }*/
public double getMasterAnglerBoatModifier() {return config.getDouble("Skills.Fishing.MasterAngler.BoatModifier", 2.0); } public double getMasterAnglerBoatModifier() {return config.getDouble("Skills.Fishing.MasterAngler.BoatModifier", 2.0); }
public double getMasterAnglerBiomeModifier() {return config.getDouble("Skills.Fishing.MasterAngler.BiomeModifier", 2.0); } public double getMasterAnglerBiomeModifier() {return config.getDouble("Skills.Fishing.MasterAngler.BiomeModifier", 2.0); }
@ -737,23 +716,15 @@ public class AdvancedConfig extends AutoUpdateConfigLoader {
public double getRepairMasteryMaxBonus() { return config.getDouble("Skills.Repair.RepairMastery.MaxBonusPercentage", 200.0D); } public double getRepairMasteryMaxBonus() { return config.getDouble("Skills.Repair.RepairMastery.MaxBonusPercentage", 200.0D); }
public int getRepairMasteryMaxLevel() { return config.getInt("Skills.Repair.RepairMastery.MaxBonusLevel", 100); } public int getRepairMasteryMaxLevel() { return config.getInt("Skills.Repair.RepairMastery.MaxBonusLevel", 100); }
/* Arcane Forging */
//public int getArcaneForgingRankLevel(int rank) { return config.getInt("Skills.Repair.ArcaneForging.Rank_Levels.Rank_" + rank); }
public boolean getArcaneForgingEnchantLossEnabled() { return config.getBoolean("Skills.Repair.ArcaneForging.May_Lose_Enchants", true); } public boolean getArcaneForgingEnchantLossEnabled() { return config.getBoolean("Skills.Repair.ArcaneForging.May_Lose_Enchants", true); }
public double getArcaneForgingKeepEnchantsChance(int rank) { return config.getDouble("Skills.Repair.ArcaneForging.Keep_Enchants_Chance.Rank_" + rank); } public double getArcaneForgingKeepEnchantsChance(int rank) { return config.getDouble("Skills.Repair.ArcaneForging.Keep_Enchants_Chance.Rank_" + rank); }
public boolean getArcaneForgingDowngradeEnabled() { return config.getBoolean("Skills.Repair.ArcaneForging.Downgrades_Enabled", true); } public boolean getArcaneForgingDowngradeEnabled() { return config.getBoolean("Skills.Repair.ArcaneForging.Downgrades_Enabled", true); }
public double getArcaneForgingDowngradeChance(int rank) { return config.getDouble("Skills.Repair.ArcaneForging.Downgrades_Chance.Rank_" + rank); } public double getArcaneForgingDowngradeChance(int rank) { return config.getDouble("Skills.Repair.ArcaneForging.Downgrades_Chance.Rank_" + rank); }
/* SALVAGE */
//public double getSalvageMaxPercentage() { return config.getDouble("Skills.Salvage.MaxPercentage", 100.0D); }
//public int getSalvageMaxPercentageLevel() { return config.getInt("Skills.Salvage.MaxPercentageLevel", 1000); }
public boolean getArcaneSalvageEnchantDowngradeEnabled() { return config.getBoolean("Skills.Salvage.ArcaneSalvage.EnchantDowngradeEnabled", true); } public boolean getArcaneSalvageEnchantDowngradeEnabled() { return config.getBoolean("Skills.Salvage.ArcaneSalvage.EnchantDowngradeEnabled", true); }
public boolean getArcaneSalvageEnchantLossEnabled() { return config.getBoolean("Skills.Salvage.ArcaneSalvage.EnchantLossEnabled", true); } public boolean getArcaneSalvageEnchantLossEnabled() { return config.getBoolean("Skills.Salvage.ArcaneSalvage.EnchantLossEnabled", true); }
//public int getArcaneSalvageRankLevel(int rank) { return config.getInt("Skills.Salvage.ArcaneSalvage.Rank_Levels.Rank_" + rank); }
public double getArcaneSalvageExtractFullEnchantsChance(int rank) { return config.getDouble("Skills.Salvage.ArcaneSalvage.ExtractFullEnchant.Rank_" + rank); } public double getArcaneSalvageExtractFullEnchantsChance(int rank) { return config.getDouble("Skills.Salvage.ArcaneSalvage.ExtractFullEnchant.Rank_" + rank); }
public double getArcaneSalvageExtractPartialEnchantsChance(int rank) { return config.getDouble("Skills.Salvage.ArcaneSalvage.ExtractPartialEnchant.Rank_" + rank); } public double getArcaneSalvageExtractPartialEnchantsChance(int rank) { return config.getDouble("Skills.Salvage.ArcaneSalvage.ExtractPartialEnchant.Rank_" + rank); }
@ -765,19 +736,35 @@ public class AdvancedConfig extends AutoUpdateConfigLoader {
return config.getInt("Skills.Smelting.FuelEfficiency.Standard.MaxBonusLevel", 100); return config.getInt("Skills.Smelting.FuelEfficiency.Standard.MaxBonusLevel", 100);
} }
/*public int getFluxMiningUnlockLevel() { return config.getInt("Skills.Smelting.FluxMining.UnlockLevel", 250); }*/
public double getFluxMiningChance() { return config.getDouble("Skills.Smelting.FluxMining.Chance", 33.0D); } public double getFluxMiningChance() { return config.getDouble("Skills.Smelting.FluxMining.Chance", 33.0D); }
public int getSmeltingRankLevel(int rank) { return config.getInt("Skills.Smelting.Rank_Levels.Rank_" + rank); }
public int getSmeltingVanillaXPBoostMultiplier(int rank) { return config.getInt("Skills.Smelting.VanillaXPMultiplier.Rank_" + rank); }
/* SWORDS */ /* SWORDS */
public double getRuptureDamagePlayer() { return config.getDouble("Skills.Swords.Rupture.DamagePlayer", 1.0); } public double getRuptureTickDamage(boolean isTargetPlayer, int rank) {
public double getRuptureDamageMobs() { return config.getDouble("Skills.Swords.Rupture.DamageMobs", 2.0); } String root = "Skills.Swords.Rupture.Rupture_Mechanics.Tick_Interval_Damage.Against_";
String targetType = isTargetPlayer ? "Players" : "Mobs";
String key = root + targetType + ".Rank_" + rank;
public int getRuptureMaxTicks() { return config.getInt("Skills.Swords.Rupture.MaxTicks", 8); } return config.getDouble(key, 1.0D);
public int getRuptureBaseTicks() { return config.getInt("Skills.Swords.Rupture.BaseTicks", 2); } }
public int getRuptureDurationSeconds(boolean isTargetPlayer) {
String root = "Skills.Swords.Rupture.Rupture_Mechanics.Duration_In_Seconds.Against_";
String targetType = isTargetPlayer ? "Players" : "Mobs";
return config.getInt(root + targetType, 5);
}
public double getRuptureExplosionDamage(boolean isTargetPlayer, int rank) {
String root = "Skills.Swords.Rupture.Rupture_Mechanics.Explosion_Damage.Against_";
String targetType = isTargetPlayer ? "Players" : "Mobs";
String key = root + targetType + ".Rank_" + rank;
return config.getDouble(key, 40.0D);
}
public double getRuptureChanceToApplyOnHit(int rank) {
String root = "Skills.Swords.Rupture.Rupture_Mechanics.Chance_To_Apply_On_Hit.Rank_";
return config.getDouble(root + rank, 33);
}
public double getCounterModifier() { return config.getDouble("Skills.Swords.CounterAttack.DamageModifier", 2.0D); } public double getCounterModifier() { return config.getDouble("Skills.Swords.CounterAttack.DamageModifier", 2.0D); }
@ -785,24 +772,15 @@ public class AdvancedConfig extends AutoUpdateConfigLoader {
public int getSerratedStrikesTicks() { return config.getInt("Skills.Swords.SerratedStrikes.RuptureTicks", 5); } public int getSerratedStrikesTicks() { return config.getInt("Skills.Swords.SerratedStrikes.RuptureTicks", 5); }
/* TAMING */ /* TAMING */
//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 double getFastFoodChance() { return config.getDouble("Skills.Taming.FastFoodService.Chance", 50.0D); } public double getFastFoodChance() { return config.getDouble("Skills.Taming.FastFoodService.Chance", 50.0D); }
public double getPummelChance() { return config.getDouble("Skills.Taming.Pummel.Chance", 10.0D); } public double getPummelChance() { return config.getDouble("Skills.Taming.Pummel.Chance", 10.0D); }
//public int getEnviromentallyAwareUnlock() { return config.getInt("Skills.Taming.EnvironmentallyAware.UnlockLevel", 100); }
/*public int getThickFurUnlock() { return config.getInt("Skills.Taming.ThickFur.UnlockLevel", 250); }*/
public double getThickFurModifier() { return config.getDouble("Skills.Taming.ThickFur.Modifier", 2.0D); } public double getThickFurModifier() { return config.getDouble("Skills.Taming.ThickFur.Modifier", 2.0D); }
/*public int getHolyHoundUnlock() {return config.getInt("Skills.Taming.HolyHound.UnlockLevel", 375); }*/
/*public int getShockProofUnlock() { return config.getInt("Skills.Taming.ShockProof.UnlockLevel", 500); }*/
public double getShockProofModifier() { return config.getDouble("Skills.Taming.ShockProof.Modifier", 6.0D); } public double getShockProofModifier() { return config.getDouble("Skills.Taming.ShockProof.Modifier", 6.0D); }
/*public int getSharpenedClawsUnlock() { return config.getInt("Skills.Taming.SharpenedClaws.UnlockLevel", 750); }*/
public double getSharpenedClawsBonus() { return config.getDouble("Skills.Taming.SharpenedClaws.Bonus", 2.0D); } public double getSharpenedClawsBonus() { return config.getDouble("Skills.Taming.SharpenedClaws.Bonus", 2.0D); }
public double getMinHorseJumpStrength() { return config.getDouble("Skills.Taming.CallOfTheWild.MinHorseJumpStrength", 0.7D); } public double getMinHorseJumpStrength() { return config.getDouble("Skills.Taming.CallOfTheWild.MinHorseJumpStrength", 0.7D); }

View File

@ -1,37 +1,38 @@
package com.gmail.nossr50.runnables.skills; package com.gmail.nossr50.runnables.skills;
import com.gmail.nossr50.config.AdvancedConfig;
import com.gmail.nossr50.datatypes.player.McMMOPlayer; import com.gmail.nossr50.datatypes.player.McMMOPlayer;
import com.gmail.nossr50.mcMMO; import com.gmail.nossr50.mcMMO;
import com.gmail.nossr50.util.MobHealthbarUtils; import com.gmail.nossr50.util.MobHealthbarUtils;
import com.gmail.nossr50.util.skills.ParticleEffectUtils; import com.gmail.nossr50.util.skills.ParticleEffectUtils;
import com.google.common.base.Objects; import com.google.common.base.Objects;
import org.bukkit.entity.LivingEntity; import org.bukkit.entity.LivingEntity;
import org.bukkit.entity.Player;
import org.bukkit.scheduler.BukkitRunnable; import org.bukkit.scheduler.BukkitRunnable;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
public class RuptureTask extends BukkitRunnable { public class RuptureTask extends BukkitRunnable {
public static final int FIVE_SECOND_DURATION = 20 * 5;
public static final int DAMAGE_TICK_INTERVAL = 10; public static final int DAMAGE_TICK_INTERVAL = 10;
private final @NotNull McMMOPlayer ruptureSource; private final @NotNull McMMOPlayer ruptureSource;
private final @NotNull LivingEntity targetEntity; private final @NotNull LivingEntity targetEntity;
private final int ruptureRank;
private final int expireTick; private final int expireTick;
private int ruptureTick; private int ruptureTick;
private int damageTickTracker; private int damageTickTracker;
private final double damageValue; //TODO: Make configurable private final double pureTickDamage; //TODO: Make configurable
private final double explosionDamage; //TODO: Make configurable
public RuptureTask(@NotNull McMMOPlayer ruptureSource, @NotNull LivingEntity targetEntity, int ruptureRank, double damageValue) { public RuptureTask(@NotNull McMMOPlayer ruptureSource, @NotNull LivingEntity targetEntity, double pureTickDamage, double explosionDamage) {
this.ruptureSource = ruptureSource; this.ruptureSource = ruptureSource;
this.targetEntity = targetEntity; this.targetEntity = targetEntity;
this.ruptureRank = ruptureRank; this.expireTick = AdvancedConfig.getInstance().getRuptureDurationSeconds(targetEntity instanceof Player);
this.expireTick = FIVE_SECOND_DURATION;
this.damageValue = damageValue;
this.ruptureTick = 0; this.ruptureTick = 0;
this.damageTickTracker = 0; this.damageTickTracker = 0;
this.pureTickDamage = pureTickDamage;
this.explosionDamage = explosionDamage;
} }
@Override @Override
@ -48,10 +49,11 @@ public class RuptureTask extends BukkitRunnable {
if(damageTickTracker >= DAMAGE_TICK_INTERVAL) { if(damageTickTracker >= DAMAGE_TICK_INTERVAL) {
damageTickTracker = 0; //Reset damageTickTracker = 0; //Reset
ParticleEffectUtils.playBleedEffect(targetEntity); //Animate ParticleEffectUtils.playBleedEffect(targetEntity); //Animate
double finalDamage = 0; //Used for mob health bars and setting last damage
if(targetEntity.getHealth() > 0.01) { if(targetEntity.getHealth() > 0.01) {
double healthBeforeRuptureIsApplied = targetEntity.getHealth(); double healthBeforeRuptureIsApplied = targetEntity.getHealth();
double damagedHealth = healthBeforeRuptureIsApplied - getTickDamage(); double damagedHealth = healthBeforeRuptureIsApplied - calculateAdjustedTickDamage();
if(damagedHealth <= 0) { if(damagedHealth <= 0) {
mcMMO.p.getLogger().severe("DEBUG: Miscalculating Rupture tick damage"); mcMMO.p.getLogger().severe("DEBUG: Miscalculating Rupture tick damage");
@ -59,10 +61,7 @@ public class RuptureTask extends BukkitRunnable {
targetEntity.setHealth(damagedHealth); //Hurt entity without the unwanted side effects of damage() targetEntity.setHealth(damagedHealth); //Hurt entity without the unwanted side effects of damage()
//TODO: Do we need to set last damage? Double check //TODO: Do we need to set last damage? Double check
double finalDamage = healthBeforeRuptureIsApplied - targetEntity.getHealth(); finalDamage = healthBeforeRuptureIsApplied - targetEntity.getHealth();
//Update health bars
MobHealthbarUtils.handleMobHealthbars(targetEntity, finalDamage, mcMMO.p);
if(finalDamage <= 0) { if(finalDamage <= 0) {
mcMMO.p.getLogger().severe("DEBUG: Miscalculating final damage for Rupture"); mcMMO.p.getLogger().severe("DEBUG: Miscalculating final damage for Rupture");
@ -72,6 +71,9 @@ public class RuptureTask extends BukkitRunnable {
} }
} }
} }
//Update Health bars
MobHealthbarUtils.handleMobHealthbars(targetEntity, finalDamage, mcMMO.p);
} }
} else { } else {
explode(); explode();
@ -95,8 +97,8 @@ public class RuptureTask extends BukkitRunnable {
this.cancel(); //Task no longer needed this.cancel(); //Task no longer needed
} }
private double getTickDamage() { private double calculateAdjustedTickDamage() {
double tickDamage = damageValue; double tickDamage = pureTickDamage;
if(targetEntity.getHealth() <= tickDamage) { if(targetEntity.getHealth() <= tickDamage) {
tickDamage = targetEntity.getHealth() - 0.01; tickDamage = targetEntity.getHealth() - 0.01;
@ -109,9 +111,21 @@ public class RuptureTask extends BukkitRunnable {
return tickDamage; return tickDamage;
} }
private int getExplosionDamage() { private double getExplosionDamage() {
//TODO: Balance pass return explosionDamage;
return ruptureRank * 10; }
@Override
public String toString() {
return "RuptureTask{" +
"ruptureSource=" + ruptureSource +
", targetEntity=" + targetEntity +
", expireTick=" + expireTick +
", ruptureTick=" + ruptureTick +
", damageTickTracker=" + damageTickTracker +
", pureTickDamage=" + pureTickDamage +
", explosionDamage=" + explosionDamage +
'}';
} }
@Override @Override
@ -119,24 +133,11 @@ public class RuptureTask extends BukkitRunnable {
if (this == o) return true; if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false; if (o == null || getClass() != o.getClass()) return false;
RuptureTask that = (RuptureTask) o; RuptureTask that = (RuptureTask) o;
return ruptureRank == that.ruptureRank && expireTick == that.expireTick && ruptureTick == that.ruptureTick && damageTickTracker == that.damageTickTracker && Double.compare(that.damageValue, damageValue) == 0 && Objects.equal(ruptureSource, that.ruptureSource) && Objects.equal(targetEntity, that.targetEntity); return expireTick == that.expireTick && ruptureTick == that.ruptureTick && damageTickTracker == that.damageTickTracker && Double.compare(that.pureTickDamage, pureTickDamage) == 0 && Double.compare(that.explosionDamage, explosionDamage) == 0 && Objects.equal(ruptureSource, that.ruptureSource) && Objects.equal(targetEntity, that.targetEntity);
} }
@Override @Override
public int hashCode() { public int hashCode() {
return Objects.hashCode(ruptureSource, targetEntity, ruptureRank, expireTick, ruptureTick, damageTickTracker, damageValue); return Objects.hashCode(ruptureSource, targetEntity, expireTick, ruptureTick, damageTickTracker, pureTickDamage, explosionDamage);
}
@Override
public String toString() {
return "RuptureTimerTask{" +
"ruptureSource=" + ruptureSource +
", targetEntity=" + targetEntity +
", ruptureRank=" + ruptureRank +
", expireTick=" + expireTick +
", ruptureTick=" + ruptureTick +
", damageTickTracker=" + damageTickTracker +
", damageValue=" + damageValue +
'}';
} }
} }

View File

@ -3,8 +3,6 @@ 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().getRuptureMaxTicks();
public static double counterAttackModifier = AdvancedConfig.getInstance().getCounterModifier(); public static double counterAttackModifier = AdvancedConfig.getInstance().getCounterModifier();
public static double serratedStrikesModifier = AdvancedConfig.getInstance().getSerratedStrikesModifier(); public static double serratedStrikesModifier = AdvancedConfig.getInstance().getSerratedStrikesModifier();

View File

@ -89,9 +89,10 @@ public class SwordsManager extends SkillManager {
} }
} }
double tickDamageValue = target instanceof Player ? AdvancedConfig.getInstance().getRuptureDamagePlayer() : AdvancedConfig.getInstance().getRuptureDamageMobs(); RuptureTask ruptureTask = new RuptureTask(mmoPlayer, target,
AdvancedConfig.getInstance().getRuptureTickDamage(target instanceof Player, getRuptureRank()),
AdvancedConfig.getInstance().getRuptureExplosionDamage(target instanceof Player, getRuptureRank()));
RuptureTask ruptureTask = new RuptureTask(mmoPlayer, target, RankUtils.getRank(mmoPlayer.getPlayer(), SubSkillType.SWORDS_RUPTURE), tickDamageValue);
RuptureTaskMeta ruptureTaskMeta = new RuptureTaskMeta(mcMMO.p, ruptureTask); RuptureTaskMeta ruptureTaskMeta = new RuptureTaskMeta(mcMMO.p, ruptureTask);
ruptureTask.runTaskTimer(mcMMO.p, 0, 1); ruptureTask.runTaskTimer(mcMMO.p, 0, 1);
@ -133,8 +134,8 @@ public class SwordsManager extends SkillManager {
return 1; return 1;
} }
public int getRuptureBleedTicks() { public int getRuptureBleedTicks(boolean isTargetPlayer) {
return RuptureTask.FIVE_SECOND_DURATION / RuptureTask.DAMAGE_TICK_INTERVAL; return AdvancedConfig.getInstance().getRuptureDurationSeconds(isTargetPlayer) / RuptureTask.DAMAGE_TICK_INTERVAL;
} }
/** /**

View File

@ -454,17 +454,41 @@ Skills:
### ###
Swords: Swords:
Rupture: Rupture:
# ChanceMax: Maximum chance of triggering bleeding Rupture_Mechanics:
# MaxBonusLevel: On this level, the chance to cause Bleeding will be <ChanceMax> # This is % chance, 15 would mean 15% percent of the time
ChanceMax: 33.0 Chance_To_Apply_On_Hit:
MaxBonusLevel: Rank_1: 15
Standard: 100 Rank_2: 33
RetroMode: 1000 Rank_3: 40
Rank_4: 66
# DamagePlayer: Bleeding damage dealt to players Duration_In_Seconds:
# DamageMobs: Bleeding damage dealt to mobs Against_Players: 5
DamagePlayer: 2.0 Against_Mobs: 5
DamageMobs: 3.0 # Tick interval damage is applied twice a second during rupture, it is "pure" and does not get lowered from armor or absorption etc
Tick_Interval_Damage:
Against_Players:
Rank_1: 0.1
Rank_2: 0.15
Rank_3: 0.2
Rank_4: 0.3
Against_Mobs:
Rank_1: 0.5
Rank_2: 0.75
Rank_3: 0.9
Rank_4: 1
# If Rupture runs for 5 seconds without being reapplied, it explodes
# this damage is **NOT** pure and is reduced dramatically vs armor/absorption/etc
Explosion_Damage:
Against_Players:
Rank_1: 10
Rank_2: 20
Rank_3: 30
Rank_4: 40
Against_Mobs:
Rank_1: 10
Rank_2: 20
Rank_3: 30
Rank_4: 40
CounterAttack: CounterAttack:
# ChanceMax: Maximum chance of triggering a counter attack # ChanceMax: Maximum chance of triggering a counter attack
# MaxBonusLevel: On this level, the chance to Counter will be <ChanceMax> # MaxBonusLevel: On this level, the chance to Counter will be <ChanceMax>

View File

@ -406,7 +406,7 @@ Anvil.Unbreakable=This item is unbreakable!
#SWORDS #SWORDS
Swords.Ability.Lower=&7You lower your sword. Swords.Ability.Lower=&7You lower your sword.
Swords.Ability.Ready=&3You &6ready&3 your Sword. Swords.Ability.Ready=&3You &6ready&3 your Sword.
Swords.Combat.Rupture.Note=&7NOTE: &e1 Tick happens every 0.5 seconds! Swords.Combat.Rupture.Note=&7NOTE: Pure tick damage is dealt twice a second during Rupture and bypasses resistances but IS never lethal, an explosion goes off after 5 seconds with is reduced by armor and other resistances.
Swords.Combat.Bleeding.Started=&4 You're bleeding! Swords.Combat.Bleeding.Started=&4 You're bleeding!
Swords.Combat.Bleeding.Stopped=&7The bleeding has &astopped&7! Swords.Combat.Bleeding.Stopped=&7The bleeding has &astopped&7!
Swords.Combat.Bleeding=&a**ENEMY BLEEDING** Swords.Combat.Bleeding=&a**ENEMY BLEEDING**
@ -420,7 +420,7 @@ Swords.SubSkill.SerratedStrikes.Name=Serrated Strikes
Swords.SubSkill.SerratedStrikes.Description=Deal partial damage in an AOE with a chance to apply Rupture! Swords.SubSkill.SerratedStrikes.Description=Deal partial damage in an AOE with a chance to apply Rupture!
Swords.SubSkill.SerratedStrikes.Stat=Serrated Strikes Length Swords.SubSkill.SerratedStrikes.Stat=Serrated Strikes Length
Swords.SubSkill.Rupture.Name=Rupture Swords.SubSkill.Rupture.Name=Rupture
Swords.SubSkill.Rupture.Description=Apply a powerful bleed DoT Swords.SubSkill.Rupture.Description=A damage over time effect that ends explosively
Swords.SubSkill.Stab.Name=Stab Swords.SubSkill.Stab.Name=Stab
Swords.SubSkill.Stab.Description=Adds bonus damage to your attacks. Swords.SubSkill.Stab.Description=Adds bonus damage to your attacks.
Swords.SubSkill.Stab.Stat=Stab Damage Swords.SubSkill.Stab.Stat=Stab Damage
@ -428,7 +428,7 @@ Swords.SubSkill.SwordsLimitBreak.Name=Swords Limit Break
Swords.SubSkill.SwordsLimitBreak.Description=Breaking your limits. Increased damage against tough opponents. Intended for PVP, up to server settings for whether or not it will boost damage in PVE. Swords.SubSkill.SwordsLimitBreak.Description=Breaking your limits. Increased damage against tough opponents. Intended for PVP, up to server settings for whether or not it will boost damage in PVE.
Swords.SubSkill.SwordsLimitBreak.Stat=Limit Break Max DMG Swords.SubSkill.SwordsLimitBreak.Stat=Limit Break Max DMG
Swords.SubSkill.Rupture.Stat=Rupture Chance Swords.SubSkill.Rupture.Stat=Rupture Chance
Swords.SubSkill.Rupture.Stat.Extra=Rupture: &a{0} ticks [{1} DMG vs Player] [{2} DMG vs Mobs] Swords.SubSkill.Rupture.Stat.Extra=Rupture: Duration in seconds: &a{0} vs Players, {1} vs Mobs. Pure Tick Damage: {2} vs Players, {3} vs Mobs. Explosion Damage: {4} vs Players, {5} vs Mobs
Swords.Effect.4=Serrated Strikes Rupture+ Swords.Effect.4=Serrated Strikes Rupture+
Swords.Effect.5={0} Tick Rupture Swords.Effect.5={0} Tick Rupture
Swords.Listener=Swords: Swords.Listener=Swords: