Fix spigot api break for entity damage events

This commit is contained in:
nossr50
2024-02-13 17:47:54 -08:00
parent 94754b150c
commit 5bfca3c218
8 changed files with 47 additions and 112 deletions

View File

@ -1,14 +0,0 @@
package com.gmail.nossr50.events.fake;
import org.bukkit.entity.Entity;
import org.bukkit.event.entity.EntityDamageByEntityEvent;
import org.jetbrains.annotations.NotNull;
/**
* Called when mcMMO applies damage from an entity due to special abilities.
*/
public class FakeEntityDamageByEntityEvent extends EntityDamageByEntityEvent implements FakeEvent {
public FakeEntityDamageByEntityEvent(@NotNull Entity damager, @NotNull Entity damagee, @NotNull DamageCause cause, double damage) {
super(damager, damagee, cause, damage);
}
}

View File

@ -1,14 +0,0 @@
package com.gmail.nossr50.events.fake;
import org.bukkit.entity.Entity;
import org.bukkit.event.entity.EntityDamageEvent;
/**
* Called when mcMMO applies damage due to special abilities.
*/
public class FakeEntityDamageEvent extends EntityDamageEvent implements FakeEvent {
@Deprecated
public FakeEntityDamageEvent(Entity damagee, DamageCause cause, double damage) {
super(damagee, cause, damage);
}
}

View File

@ -1,20 +1,19 @@
package com.gmail.nossr50.events.skills.rupture;
import com.gmail.nossr50.datatypes.player.McMMOPlayer;
import org.bukkit.entity.Entity;
import org.bukkit.event.entity.EntityDamageByEntityEvent;
import org.jetbrains.annotations.NotNull;
public class McMMOEntityDamageByRuptureEvent extends EntityDamageByEntityEvent {
private final McMMOPlayer mcMMODamager;
public McMMOEntityDamageByRuptureEvent(@NotNull McMMOPlayer damager, @NotNull Entity damagee, double damage) {
super(damager.getPlayer(), damagee, DamageCause.CUSTOM, damage);
this.mcMMODamager = damager;
}
@NotNull
public McMMOPlayer getMcMMODamager() {
return mcMMODamager;
}
}
//package com.gmail.nossr50.events.skills.rupture;
//
//import com.gmail.nossr50.datatypes.player.McMMOPlayer;
//import org.bukkit.entity.Entity;
//import org.bukkit.event.entity.EntityDamageByEntityEvent;
//import org.jetbrains.annotations.NotNull;
//
//public class McMMOEntityDamageByRuptureEvent extends EntityDamageByEntityEvent {
// private final McMMOPlayer mcMMODamager;
//
// public McMMOEntityDamageByRuptureEvent(@NotNull McMMOPlayer damager, @NotNull Entity damagee, double damage) {
// this.mcMMODamager = damager;
// }
//
// @NotNull
// public McMMOPlayer getMcMMODamager() {
// return mcMMODamager;
// }
//}

View File

@ -5,10 +5,7 @@ import com.gmail.nossr50.config.experience.ExperienceConfig;
import com.gmail.nossr50.datatypes.player.McMMOPlayer;
import com.gmail.nossr50.datatypes.skills.SubSkillType;
import com.gmail.nossr50.datatypes.skills.subskills.interfaces.InteractType;
import com.gmail.nossr50.events.fake.FakeEntityDamageByEntityEvent;
import com.gmail.nossr50.events.fake.FakeEntityDamageEvent;
import com.gmail.nossr50.events.fake.FakeEntityTameEvent;
import com.gmail.nossr50.events.skills.rupture.McMMOEntityDamageByRuptureEvent;
import com.gmail.nossr50.mcMMO;
import com.gmail.nossr50.metadata.MobMetaFlagType;
import com.gmail.nossr50.metadata.MobMetadataService;
@ -286,8 +283,10 @@ public class EntityListener implements Listener {
*/
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
public void onEntityDamageByEntity(EntityDamageByEntityEvent event) {
if (event instanceof FakeEntityDamageByEntityEvent || event instanceof McMMOEntityDamageByRuptureEvent) {
return;
if (event.getEntity() instanceof LivingEntity livingEntity) {
if (CombatUtils.hasIgnoreDamageMetadata(livingEntity)) {
return;
}
}
double damage = event.getFinalDamage();
@ -447,14 +446,6 @@ public class EntityListener implements Listener {
player.sendMessage("Final damage: " + entityDamageEvent.getFinalDamage());
if(entityDamageEvent instanceof FakeEntityDamageByEntityEvent) {
player.sendMessage("This report is for a fake damage event used by mcMMO to test a players permission to hurt another");
}
if(entityDamageEvent instanceof McMMOEntityDamageByRuptureEvent) {
player.sendMessage("This report is for a Rupture damage event, which is sent out by mcMMO");
}
if(entityDamageEvent.isCancelled()) {
player.sendMessage("Event was cancelled, which means no damage should be done.");
}
@ -481,14 +472,6 @@ public class EntityListener implements Listener {
player.sendMessage("Target players max health: "+otherPlayer.getAttribute(Attribute.GENERIC_MAX_HEALTH).getValue());
player.sendMessage("Target players current health: "+otherPlayer.getHealth());
if(entityDamageEvent instanceof FakeEntityDamageByEntityEvent) {
player.sendMessage("This report is for a fake damage event used by mcMMO to test a players permission to hurt another");
}
if(entityDamageEvent instanceof McMMOEntityDamageByRuptureEvent) {
player.sendMessage("This report is for a Rupture damage event, which is sent out by mcMMO");
}
if(entityDamageEvent.isCancelled()) {
player.sendMessage("Event was cancelled, which means no damage should be done.");
}
@ -558,8 +541,10 @@ public class EntityListener implements Listener {
* Old code
*/
if (event instanceof FakeEntityDamageEvent) {
return;
if (event.getEntity() instanceof LivingEntity livingEntity) {
if (CombatUtils.hasIgnoreDamageMetadata(livingEntity)) {
return;
}
}
double damage = event.getFinalDamage();

View File

@ -1,7 +1,6 @@
package com.gmail.nossr50.runnables.skills;
import com.gmail.nossr50.datatypes.player.McMMOPlayer;
import com.gmail.nossr50.events.skills.rupture.McMMOEntityDamageByRuptureEvent;
import com.gmail.nossr50.mcMMO;
import com.gmail.nossr50.util.CancellableRunnable;
import com.gmail.nossr50.util.MetadataConstants;
@ -83,18 +82,14 @@ public class RuptureTask extends CancellableRunnable {
//Ensure victim has health
if (healthBeforeRuptureIsApplied > 0.01) {
//Send a fake damage event
McMMOEntityDamageByRuptureEvent event = new McMMOEntityDamageByRuptureEvent(ruptureSource, targetEntity, calculateAdjustedTickDamage());
mcMMO.p.getServer().getPluginManager().callEvent(event);
// TODO: Needs updating for new spigot API
double damage = calculateAdjustedTickDamage(); //Use raw damage for Rupture
//Ensure the event wasn't cancelled and damage is still greater than 0
double damage = event.getDamage(); //Use raw damage for Rupture
if (event.isCancelled() || damage <= 0 || healthBeforeRuptureIsApplied - damage <= 0)
if (damage <= 0 || healthBeforeRuptureIsApplied - damage <= 0) {
return true;
}
double damagedHealth = healthBeforeRuptureIsApplied - damage;
targetEntity.setHealth(damagedHealth); //Hurt entity without the unwanted side effects of damage()}
}

View File

@ -15,7 +15,10 @@ import com.gmail.nossr50.events.experience.McMMOPlayerLevelChangeEvent;
import com.gmail.nossr50.events.experience.McMMOPlayerLevelDownEvent;
import com.gmail.nossr50.events.experience.McMMOPlayerLevelUpEvent;
import com.gmail.nossr50.events.experience.McMMOPlayerXpGainEvent;
import com.gmail.nossr50.events.fake.*;
import com.gmail.nossr50.events.fake.FakeBlockBreakEvent;
import com.gmail.nossr50.events.fake.FakeBlockDamageEvent;
import com.gmail.nossr50.events.fake.FakeEvent;
import com.gmail.nossr50.events.fake.FakePlayerFishEvent;
import com.gmail.nossr50.events.hardcore.McMMOPlayerPreDeathPenaltyEvent;
import com.gmail.nossr50.events.hardcore.McMMOPlayerStatLossEvent;
import com.gmail.nossr50.events.hardcore.McMMOPlayerVampirismEvent;
@ -83,17 +86,6 @@ public final class EventUtils {
return event instanceof FakeEvent;
}
/**
* Checks to see if damage is from natural sources
* This cannot be used to determine if damage is from vanilla MC, it just checks to see if the damage is from a complex behaviour in mcMMO such as bleed.
*
* @param event this event
* @return true if damage is NOT from an unnatural mcMMO skill (such as bleed DOTs)
*/
public static boolean isDamageFromMcMMOComplexBehaviour(@NotNull Event event) {
return event instanceof FakeEntityDamageEvent;
}
/**
* This little method is just to make the code more readable
*

View File

@ -7,8 +7,6 @@ import com.gmail.nossr50.datatypes.meta.OldName;
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.events.fake.FakeEntityDamageByEntityEvent;
import com.gmail.nossr50.events.fake.FakeEntityDamageEvent;
import com.gmail.nossr50.mcMMO;
import com.gmail.nossr50.metadata.MobMetaFlagType;
import com.gmail.nossr50.metadata.MobMetadataService;
@ -29,7 +27,6 @@ import org.bukkit.attribute.Attribute;
import org.bukkit.attribute.AttributeInstance;
import org.bukkit.entity.*;
import org.bukkit.event.entity.EntityDamageByEntityEvent;
import org.bukkit.event.entity.EntityDamageEvent;
import org.bukkit.event.entity.EntityDamageEvent.DamageCause;
import org.bukkit.inventory.ItemStack;
import org.bukkit.metadata.MetadataValue;
@ -527,7 +524,6 @@ 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(@NotNull LivingEntity target, double damage) {
dealDamage(target, damage, DamageCause.CUSTOM, null);
}
@ -572,10 +568,15 @@ public final class CombatUtils {
if (target.isDead()) {
return;
}
if(canDamage(attacker, target, cause, damage)) {
try {
// TODO: Check for Spigot API for DamageSource, if DamageSource is found then send out a damage() with a custom damage source
applyIgnoreDamageMetadata(target);
target.damage(damage);
if (attacker != null) {
target.damage(damage, attacker);
} else {
target.damage(damage);
}
} finally {
removeIgnoreDamageMetadata(target);
}
}
@ -885,19 +886,6 @@ public final class CombatUtils {
return false;
}
public static boolean canDamage(@Nullable Entity attacker, @NotNull Entity target, @NotNull DamageCause damageCause, double damage) {
EntityDamageEvent damageEvent;
if (attacker != null) {
damageEvent = new FakeEntityDamageByEntityEvent(attacker, target, damageCause, damage);
} else {
damageEvent = new FakeEntityDamageEvent(target, damageCause, damage);
}
mcMMO.p.getServer().getPluginManager().callEvent(damageEvent);
return !damageEvent.isCancelled();
}
/**
* Get the upgrade tier of the item in hand.
*