Alter original event and stop firing FakeDamageEvents

Fixes #2105
This commit is contained in:
TfT_02
2014-06-29 16:38:40 +02:00
parent e7e62b8d40
commit 2b9b5df1ee
9 changed files with 67 additions and 62 deletions

View File

@ -24,7 +24,6 @@ import org.bukkit.inventory.ItemStack;
import org.bukkit.projectiles.ProjectileSource;
import com.gmail.nossr50.mcMMO;
import com.gmail.nossr50.config.Config;
import com.gmail.nossr50.config.experience.ExperienceConfig;
import com.gmail.nossr50.datatypes.player.McMMOPlayer;
import com.gmail.nossr50.datatypes.skills.SkillType;
@ -78,6 +77,7 @@ public final class CombatUtils {
private static void processAxeCombat(LivingEntity target, Player player, EntityDamageByEntityEvent event) {
double initialDamage = event.getDamage();
double finalDamage = initialDamage;
Map<DamageModifier, Double> modifiers = getModifiers(event);
McMMOPlayer mcMMOPlayer = UserManager.getPlayer(player);
AxesManager axesManager = mcMMOPlayer.getAxesManager();
@ -87,7 +87,7 @@ public final class CombatUtils {
}
if (axesManager.canUseAxeMastery()) {
finalDamage += axesManager.axeMastery(target);
finalDamage += axesManager.axeMastery();
}
if (axesManager.canCriticalHit(target)) {
@ -102,17 +102,16 @@ public final class CombatUtils {
}
if (axesManager.canUseSkullSplitter(target)) {
axesManager.skullSplitterCheck(target, initialDamage);
axesManager.skullSplitterCheck(target, initialDamage, modifiers);
}
event.setDamage(finalDamage);
applyScaledModifiers(initialDamage, finalDamage, event);
startGainXp(mcMMOPlayer, target, SkillType.AXES);
}
private static void processUnarmedCombat(LivingEntity target, Player player, EntityDamageByEntityEvent event) {
double initialDamage = event.getDamage();
double finalDamage = initialDamage;
Map<DamageModifier, Double> modifiers = getModifiers(event);
McMMOPlayer mcMMOPlayer = UserManager.getPlayer(player);
UnarmedManager unarmedManager = mcMMOPlayer.getUnarmedManager();
@ -122,18 +121,18 @@ public final class CombatUtils {
}
if (unarmedManager.canUseIronArm()) {
finalDamage += unarmedManager.ironArm(target, modifiers);
finalDamage += unarmedManager.ironArm();
}
if (unarmedManager.canUseBerserk()) {
finalDamage += unarmedManager.berserkDamage(target, initialDamage, modifiers);
finalDamage += unarmedManager.berserkDamage(initialDamage);
}
if (unarmedManager.canDisarm(target)) {
unarmedManager.disarmCheck((Player) target);
}
event.setDamage(finalDamage);
applyScaledModifiers(initialDamage, finalDamage, event);
startGainXp(mcMMOPlayer, target, SkillType.UNARMED);
}
@ -149,14 +148,14 @@ public final class CombatUtils {
}
if (tamingManager.canUseSharpenedClaws()) {
finalDamage += tamingManager.sharpenedClaws(target, wolf);
finalDamage += tamingManager.sharpenedClaws();
}
if (tamingManager.canUseGore()) {
finalDamage += tamingManager.gore(target, initialDamage, wolf);
finalDamage += tamingManager.gore(target, initialDamage);
}
event.setDamage(finalDamage);
applyScaledModifiers(initialDamage, finalDamage, event);
startGainXp(mcMMOPlayer, target, SkillType.TAMING);
}
@ -180,11 +179,11 @@ public final class CombatUtils {
}
if (archeryManager.canSkillShot()) {
finalDamage += archeryManager.skillShot(target, initialDamage, arrow);
finalDamage += archeryManager.skillShot(initialDamage);
}
if (archeryManager.canDaze(target)) {
finalDamage += archeryManager.daze((Player) target, arrow);
finalDamage += archeryManager.daze((Player) target);
}
if (!arrow.hasMetadata(mcMMO.infiniteArrowKey) && archeryManager.canRetrieveArrows()) {
@ -193,7 +192,7 @@ public final class CombatUtils {
archeryManager.distanceXpBonus(target, arrow);
event.setDamage(finalDamage);
applyScaledModifiers(initialDamage, finalDamage, event);
startGainXp(mcMMOPlayer, target, SkillType.ARCHERY, arrow.getMetadata(mcMMO.bowForceKey).get(0).asDouble());
}
@ -237,7 +236,7 @@ public final class CombatUtils {
}
if (SkillType.SWORDS.getPermissions(player)) {
processSwordCombat(target, player, event.getDamage());
processSwordCombat(target, player, event);
}
}
else if (ItemUtils.isAxe(heldItem)) {
@ -318,6 +317,7 @@ public final class CombatUtils {
* @param target LivingEntity which to attempt to damage
* @param damage Amount of damage to attempt to do
*/
@Deprecated
public static void dealDamage(LivingEntity target, double damage) {
dealDamage(target, damage, DamageCause.CUSTOM, null);
}
@ -357,6 +357,7 @@ public final class CombatUtils {
* @param damage Amount of damage to attempt to do
* @param attacker Player to pass to event as damager
*/
@Deprecated
public static void dealDamage(LivingEntity target, double damage, DamageCause cause, Entity attacker) {
if (target.isDead()) {
return;
@ -609,7 +610,7 @@ public final class CombatUtils {
}
public static double callFakeDamageEvent(Entity attacker, Entity target, double damage, Map<DamageModifier, Double> modifiers) {
return callFakeDamageEvent(attacker, target, DamageCause.ENTITY_ATTACK, scaleModifiers(damage, modifiers));
return callFakeDamageEvent(attacker, target, DamageCause.ENTITY_ATTACK, getScaledModifiers(damage, modifiers));
}
public static double callFakeDamageEvent(Entity attacker, Entity target, DamageCause cause, Map<DamageModifier, Double> modifiers) {
@ -623,7 +624,7 @@ public final class CombatUtils {
return damageEvent.getFinalDamage();
}
public static Map<DamageModifier, Double> getModifiers(EntityDamageEvent event) {
private static Map<DamageModifier, Double> getModifiers(EntityDamageEvent event) {
Map<DamageModifier, Double> modifiers = new HashMap<DamageModifier, Double>();
for (DamageModifier modifier : DamageModifier.values()) {
modifiers.put(modifier, event.getDamage(modifier));
@ -632,7 +633,7 @@ public final class CombatUtils {
return modifiers;
}
public static Map<DamageModifier, Double> scaleModifiers(double damage, Map<DamageModifier, Double> modifiers) {
private static Map<DamageModifier, Double> getScaledModifiers(double damage, Map<DamageModifier, Double> modifiers) {
Map<DamageModifier, Double> scaledModifiers = new HashMap<DamageModifier, Double>();
for (DamageModifier modifier : DamageModifier.values()) {
@ -647,6 +648,28 @@ public final class CombatUtils {
return scaledModifiers;
}
public static EntityDamageByEntityEvent applyScaledModifiers(double initialDamage, double finalDamage, EntityDamageByEntityEvent event) {
// No additional damage
if (initialDamage == finalDamage) {
return event;
}
for (DamageModifier modifier : DamageModifier.values()) {
if (!event.isApplicable(modifier)) {
continue;
}
if (modifier == DamageModifier.BASE) {
event.setDamage(modifier, finalDamage);
continue;
}
event.setDamage(modifier, finalDamage / initialDamage * event.getDamage(modifier));
}
return event;
}
/**
* Get the upgrade tier of the item in hand.
*