Wire up Acrobatics, Archery, and Axes behaviour managers

This commit is contained in:
nossr50 2019-07-03 02:24:04 -07:00
parent b756938fb1
commit 148a4fd555
11 changed files with 129 additions and 115 deletions

View File

@ -170,4 +170,7 @@ public class DynamicSettingsManager {
return skillPropertiesManager;
}
public SkillBehaviourManager getSkillBehaviourManager() {
return skillBehaviourManager;
}
}

View File

@ -12,7 +12,25 @@ import com.gmail.nossr50.mcMMO;
public class AcrobaticsBehaviour {
private final mcMMO pluginRef;
private double dodgeDamageModifier;
private int dodgeXpModifier;
public AcrobaticsBehaviour(mcMMO pluginRef) {
this.pluginRef = pluginRef;
dodgeDamageModifier = pluginRef.getConfigManager().getConfigAcrobatics().getDamageReductionDivisor();
dodgeXpModifier = pluginRef.getConfigManager().getConfigExperience().getDodgeXP();
}
public double calculateModifiedDodgeDamage(double damage, double damageModifier) {
return Math.max(damage / damageModifier, 1.0);
}
public double getDodgeDamageModifier() {
return dodgeDamageModifier;
}
public int getDodgeXpModifier() {
return dodgeXpModifier;
}
}

View File

@ -1,6 +1,16 @@
package com.gmail.nossr50.datatypes.skills.behaviours;
import com.gmail.nossr50.core.MetadataConstants;
import com.gmail.nossr50.datatypes.meta.TrackedArrowMeta;
import com.gmail.nossr50.datatypes.skills.SubSkillType;
import com.gmail.nossr50.mcMMO;
import com.gmail.nossr50.util.Misc;
import com.gmail.nossr50.util.skills.RankUtils;
import org.bukkit.Material;
import org.bukkit.entity.LivingEntity;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
import org.bukkit.metadata.FixedMetadataValue;
/**
* These behaviour classes are a band-aid fix for a larger problem
@ -16,4 +26,46 @@ public class ArcheryBehaviour {
public ArcheryBehaviour(mcMMO pluginRef) {
this.pluginRef = pluginRef;
}
/**
* Check for arrow retrieval.
*
* @param livingEntity The entity hit by the arrows
*/
public void arrowRetrievalCheck(LivingEntity livingEntity) {
if(livingEntity.hasMetadata(MetadataConstants.ARROW_TRACKER_METAKEY)) {
Misc.dropItems(livingEntity.getLocation(), new ItemStack(Material.ARROW), livingEntity.getMetadata(MetadataConstants.ARROW_TRACKER_METAKEY).get(0).asInt());
}
}
public void incrementArrowCount(LivingEntity livingEntity) {
if(livingEntity.hasMetadata(MetadataConstants.ARROW_TRACKER_METAKEY)) {
int arrowCount = livingEntity.getMetadata(MetadataConstants.ARROW_TRACKER_METAKEY).get(0).asInt();
livingEntity.getMetadata(MetadataConstants.ARROW_TRACKER_METAKEY).set(0, new FixedMetadataValue(pluginRef, arrowCount + 1));
} else {
livingEntity.setMetadata(MetadataConstants.ARROW_TRACKER_METAKEY, new TrackedArrowMeta(pluginRef, 1));
}
}
public double getSkillShotBonusDamage(Player player, double oldDamage) {
double damageBonusPercent = getDamageBonusPercent(player);
double newDamage = oldDamage + (oldDamage * damageBonusPercent);
return Math.min(newDamage, getSkillShotDamageCap());
}
public double getDamageBonusPercent(Player player) {
return ((RankUtils.getRank(player, SubSkillType.ARCHERY_SKILL_SHOT)) * pluginRef.getConfigManager().getConfigArchery().getSkillShotDamageMultiplier()) / 100.0D;
}
public double getSkillShotDamageCap() {
return pluginRef.getConfigManager().getConfigArchery().getSkillShotDamageCeiling();
}
public double getDazeBonusDamage() {
return pluginRef.getConfigManager().getConfigArchery().getDaze().getDazeBonusDamage();
}
public double getDistanceXpMultiplier() {
return pluginRef.getConfigManager().getConfigExperience().getExperienceArchery().getDistanceMultiplier();
}
}

View File

@ -1,6 +1,12 @@
package com.gmail.nossr50.datatypes.skills.behaviours;
import com.gmail.nossr50.datatypes.skills.SubSkillType;
import com.gmail.nossr50.mcMMO;
import com.gmail.nossr50.util.ItemUtils;
import com.gmail.nossr50.util.skills.RankUtils;
import org.bukkit.entity.LivingEntity;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
/**
* These behaviour classes are a band-aid fix for a larger problem
@ -16,4 +22,24 @@ public class AxesBehaviour {
public AxesBehaviour(mcMMO pluginRef) {
this.pluginRef = pluginRef;
}
public boolean hasArmor(LivingEntity target) {
for (ItemStack itemStack : target.getEquipment().getArmorContents()) {
if (itemStack != null && ItemUtils.isArmor(itemStack)) {
return true;
}
}
return false;
}
/**
* For every rank in Axe Mastery we add RankDamageMultiplier to get the total bonus damage from Axe Mastery
*
* @param player The target player
* @return The axe mastery bonus damage which will be added to their attack
*/
public double getAxeMasteryBonusDamage(Player player) {
return RankUtils.getRank(player, SubSkillType.AXES_AXE_MASTERY) * pluginRef.getConfigManager().getConfigAxes().getAxeMasteryMultiplier();
}
}

View File

@ -28,9 +28,11 @@ import org.bukkit.inventory.ItemStack;
public class Roll extends AcrobaticsSubSkill {
private final mcMMO pluginRef;
public Roll() {
public Roll(mcMMO pluginRef) {
super("Roll", EventPriority.HIGHEST, SubSkillType.ACROBATICS_ROLL);
this.pluginRef = pluginRef;
}
protected static double calculateModifiedRollDamage(double damage, double damageThreshold) {

View File

@ -1,17 +0,0 @@
package com.gmail.nossr50.skills.acrobatics;
public final class Acrobatics {
public static double dodgeDamageModifier;
public static int dodgeXpModifier;
// public static boolean dodgeLightningDisabled;
private Acrobatics() {
dodgeDamageModifier = pluginRef.getConfigManager().getConfigAcrobatics().getDamageReductionDivisor();
dodgeXpModifier = pluginRef.getConfigManager().getConfigExperience().getDodgeXP();
// dodgeLightningDisabled = MainConfig.getInstance().getDodgeLightningDisabled();
}
protected static double calculateModifiedDodgeDamage(double damage, double damageModifier) {
return Math.max(damage / damageModifier, 1.0);
}
}

View File

@ -6,6 +6,7 @@ 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.behaviours.AcrobaticsBehaviour;
import com.gmail.nossr50.mcMMO;
import com.gmail.nossr50.skills.SkillManager;
import com.gmail.nossr50.util.Misc;
@ -25,9 +26,13 @@ public class AcrobaticsManager extends SkillManager {
private long rollXPInterval;
private long rollXPIntervalLengthen = (1000 * 10); //10 Seconds
private LimitedSizeList fallLocationMap;
private AcrobaticsBehaviour acrobaticsBehaviour;
public AcrobaticsManager(mcMMO pluginRef, McMMOPlayer mcMMOPlayer) {
super(pluginRef, mcMMOPlayer, PrimarySkillType.ACROBATICS);
//Init Behaviour
acrobaticsBehaviour = pluginRef.getDynamicSettingsManager().getSkillBehaviourManager().getAcrobaticsBehaviour();
rollXPInterval = (1000 * pluginRef.getConfigManager().getConfigExploitPrevention().getConfigSectionExploitAcrobatics().getRollXPGainCooldownSeconds());
//Save some memory if exploit prevention is off
@ -80,7 +85,7 @@ public class AcrobaticsManager extends SkillManager {
* @return the modified event damage if the ability was successful, the original event damage otherwise
*/
public double dodgeCheck(double damage) {
double modifiedDamage = Acrobatics.calculateModifiedDodgeDamage(damage, Acrobatics.dodgeDamageModifier);
double modifiedDamage = acrobaticsBehaviour.calculateModifiedDodgeDamage(damage, acrobaticsBehaviour.getDodgeDamageModifier());
Player player = getPlayer();
if (!isFatal(modifiedDamage) && RandomChanceUtil.isActivationSuccessful(SkillActivationType.RANDOM_LINEAR_100_SCALE_WITH_CAP, SubSkillType.ACROBATICS_DODGE, player)) {
@ -92,10 +97,10 @@ public class AcrobaticsManager extends SkillManager {
//Check respawn to prevent abuse
if (!pluginRef.getConfigManager().getConfigExploitPrevention().getConfigSectionExploitAcrobatics().isPreventAcrobaticsAbuse())
applyXpGain((float) (damage * Acrobatics.dodgeXpModifier), XPGainReason.PVP);
applyXpGain((float) (damage * acrobaticsBehaviour.getDodgeXpModifier()), XPGainReason.PVP);
else if (SkillUtils.cooldownExpired(mcMMOPlayer.getRespawnATS(), Misc.PLAYER_RESPAWN_COOLDOWN_SECONDS)
&& mcMMOPlayer.getTeleportATS() < System.currentTimeMillis()) {
applyXpGain((float) (damage * Acrobatics.dodgeXpModifier), XPGainReason.PVP);
applyXpGain((float) (damage * acrobaticsBehaviour.getDodgeXpModifier()), XPGainReason.PVP);
}
return modifiedDamage;

View File

@ -1,56 +0,0 @@
package com.gmail.nossr50.skills.archery;
import com.gmail.nossr50.core.MetadataConstants;
import com.gmail.nossr50.datatypes.meta.TrackedArrowMeta;
import com.gmail.nossr50.datatypes.skills.SubSkillType;
import com.gmail.nossr50.util.Misc;
import com.gmail.nossr50.util.skills.RankUtils;
import org.bukkit.Material;
import org.bukkit.entity.LivingEntity;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
import org.bukkit.metadata.FixedMetadataValue;
public class Archery {
/**
* Check for arrow retrieval.
*
* @param livingEntity The entity hit by the arrows
*/
public static void arrowRetrievalCheck(LivingEntity livingEntity) {
if(livingEntity.hasMetadata(MetadataConstants.ARROW_TRACKER_METAKEY)) {
Misc.dropItems(livingEntity.getLocation(), new ItemStack(Material.ARROW), livingEntity.getMetadata(MetadataConstants.ARROW_TRACKER_METAKEY).get(0).asInt());
}
}
public static void incrementArrowCount(LivingEntity livingEntity) {
if(livingEntity.hasMetadata(MetadataConstants.ARROW_TRACKER_METAKEY)) {
int arrowCount = livingEntity.getMetadata(MetadataConstants.ARROW_TRACKER_METAKEY).get(0).asInt();
livingEntity.getMetadata(MetadataConstants.ARROW_TRACKER_METAKEY).set(0, new FixedMetadataValue(pluginRef, arrowCount + 1));
} else {
livingEntity.setMetadata(MetadataConstants.ARROW_TRACKER_METAKEY, new TrackedArrowMeta(pluginRef, 1));
}
}
public static double getSkillShotBonusDamage(Player player, double oldDamage) {
double damageBonusPercent = getDamageBonusPercent(player);
double newDamage = oldDamage + (oldDamage * damageBonusPercent);
return Math.min(newDamage, getSkillShotDamageCap());
}
public static double getDamageBonusPercent(Player player) {
return ((RankUtils.getRank(player, SubSkillType.ARCHERY_SKILL_SHOT)) * pluginRef.getConfigManager().getConfigArchery().getSkillShotDamageMultiplier()) / 100.0D;
}
public static double getSkillShotDamageCap() {
return pluginRef.getConfigManager().getConfigArchery().getSkillShotDamageCeiling();
}
public static double getDazeBonusDamage() {
return pluginRef.getConfigManager().getConfigArchery().getDaze().getDazeBonusDamage();
}
public static double getDistanceXpMultiplier() {
return pluginRef.getConfigManager().getConfigExperience().getExperienceArchery().getDistanceMultiplier();
}
}

View File

@ -5,6 +5,7 @@ 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.behaviours.ArcheryBehaviour;
import com.gmail.nossr50.mcMMO;
import com.gmail.nossr50.skills.SkillManager;
import com.gmail.nossr50.util.Misc;
@ -21,8 +22,14 @@ import org.bukkit.potion.PotionEffect;
import org.bukkit.potion.PotionEffectType;
public class ArcheryManager extends SkillManager {
private final ArcheryBehaviour archeryBehaviour;
public ArcheryManager(mcMMO pluginRef, McMMOPlayer mcMMOPlayer) {
super(pluginRef, mcMMOPlayer, PrimarySkillType.ARCHERY);
//Init Behaviour
this.archeryBehaviour = pluginRef.getDynamicSettingsManager().getSkillBehaviourManager().getArcheryBehaviour();
}
public boolean canDaze(LivingEntity target) {
@ -64,7 +71,7 @@ public class ArcheryManager extends SkillManager {
return 1;
}
return 1 + Math.min(firedLocation.distance(targetLocation), 50) * Archery.getDistanceXpMultiplier();
return 1 + Math.min(firedLocation.distance(targetLocation), 50) * archeryBehaviour.getDistanceXpMultiplier();
}
/**
@ -74,7 +81,7 @@ public class ArcheryManager extends SkillManager {
*/
public void processArrowRetrievalActivation(LivingEntity target, Projectile projectile) {
if(projectile.hasMetadata(MetadataConstants.ARROW_TRACKER_METAKEY)) {
Archery.incrementArrowCount(target);
archeryBehaviour.incrementArrowCount(target);
projectile.removeMetadata(MetadataConstants.ARROW_TRACKER_METAKEY, pluginRef); //Only 1 entity per projectile
}
}
@ -104,7 +111,7 @@ public class ArcheryManager extends SkillManager {
pluginRef.getNotificationManager().sendPlayerInformation(getPlayer(), NotificationType.SUBSKILL_MESSAGE, "Combat.TargetDazed");
}
return Archery.getDazeBonusDamage();
return archeryBehaviour.getDazeBonusDamage();
}
/**
@ -117,6 +124,6 @@ public class ArcheryManager extends SkillManager {
return oldDamage;
}
return Archery.getSkillShotBonusDamage(getPlayer(), oldDamage);
return archeryBehaviour.getSkillShotBonusDamage(getPlayer(), oldDamage);
}
}

View File

@ -1,31 +0,0 @@
package com.gmail.nossr50.skills.axes;
import com.gmail.nossr50.datatypes.skills.SubSkillType;
import com.gmail.nossr50.util.ItemUtils;
import com.gmail.nossr50.util.skills.RankUtils;
import org.bukkit.entity.LivingEntity;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
public class Axes {
protected static boolean hasArmor(LivingEntity target) {
for (ItemStack itemStack : target.getEquipment().getArmorContents()) {
if (itemStack != null && ItemUtils.isArmor(itemStack)) {
return true;
}
}
return false;
}
/**
* For every rank in Axe Mastery we add RankDamageMultiplier to get the total bonus damage from Axe Mastery
*
* @param player The target player
* @return The axe mastery bonus damage which will be added to their attack
*/
public static double getAxeMasteryBonusDamage(Player player) {
return RankUtils.getRank(player, SubSkillType.AXES_AXE_MASTERY) * pluginRef.getConfigManager().getConfigAxes().getAxeMasteryMultiplier();
}
}

View File

@ -6,6 +6,7 @@ import com.gmail.nossr50.datatypes.skills.PrimarySkillType;
import com.gmail.nossr50.datatypes.skills.SubSkillType;
import com.gmail.nossr50.datatypes.skills.SuperAbilityType;
import com.gmail.nossr50.datatypes.skills.ToolType;
import com.gmail.nossr50.datatypes.skills.behaviours.AxesBehaviour;
import com.gmail.nossr50.mcMMO;
import com.gmail.nossr50.skills.SkillManager;
import com.gmail.nossr50.util.ItemUtils;
@ -20,8 +21,12 @@ import org.bukkit.inventory.ItemStack;
import java.util.Map;
public class AxesManager extends SkillManager {
private final AxesBehaviour axesBehaviour;
public AxesManager(mcMMO pluginRef, McMMOPlayer mcMMOPlayer) {
super(pluginRef, mcMMOPlayer, PrimarySkillType.AXES);
this.axesBehaviour = pluginRef.getDynamicSettingsManager().getSkillBehaviourManager().getAxesBehaviour();
}
public boolean canUseAxeMastery() {
@ -42,14 +47,14 @@ public class AxesManager extends SkillManager {
if (!RankUtils.hasUnlockedSubskill(getPlayer(), SubSkillType.AXES_ARMOR_IMPACT))
return false;
return target.isValid() && Permissions.isSubSkillEnabled(getPlayer(), SubSkillType.AXES_ARMOR_IMPACT) && Axes.hasArmor(target);
return target.isValid() && Permissions.isSubSkillEnabled(getPlayer(), SubSkillType.AXES_ARMOR_IMPACT) && axesBehaviour.hasArmor(target);
}
public boolean canGreaterImpact(LivingEntity target) {
if (!RankUtils.hasUnlockedSubskill(getPlayer(), SubSkillType.AXES_GREATER_IMPACT))
return false;
return target.isValid() && Permissions.isSubSkillEnabled(getPlayer(), SubSkillType.AXES_GREATER_IMPACT) && !Axes.hasArmor(target);
return target.isValid() && Permissions.isSubSkillEnabled(getPlayer(), SubSkillType.AXES_GREATER_IMPACT) && !axesBehaviour.hasArmor(target);
}
public boolean canUseSkullSplitter(LivingEntity target) {
@ -71,7 +76,7 @@ public class AxesManager extends SkillManager {
return 0;
}
return Axes.getAxeMasteryBonusDamage(getPlayer());
return axesBehaviour.getAxeMasteryBonusDamage(getPlayer());
}
/**