Merge branch 'master' of https://github.com/mcMMO-Dev/mcMMO into commandsonlevelup

This commit is contained in:
nossr50 2024-02-17 16:11:52 -08:00
commit 3bc7b8eee7
10 changed files with 78 additions and 92 deletions

View File

@ -1,3 +1,11 @@
Version 2.1.228
Fixed a stack trace due to Spigot API break on EntityDamageEvent and EntityDamageByEntity event
(API) - Removed FakeEntityDamageEvent and FakeEntityDamageByEntityEvent
(API) - Reworked McMMOEntityDamageByRuptureEvent, this no longer extends EntityDamageByEntityEvent, instead it extends EntityEvent
Notes:
Some care went into keeping mcMMO compatible with older versions despite a big API break from Spigot, this may introduce some new bugs, so please report them if you run into any.
Version 2.1.227 Version 2.1.227
Fixed bug where some text would not be displayed to players (Adventure dependency update) Fixed bug where some text would not be displayed to players (Adventure dependency update)
Repair sound effect from mcMMO can now be adjusted in Minecraft sound options (Thanks MithicSpirit) Repair sound effect from mcMMO can now be adjusted in Minecraft sound options (Thanks MithicSpirit)

View File

@ -2,7 +2,7 @@
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
<groupId>com.gmail.nossr50.mcMMO</groupId> <groupId>com.gmail.nossr50.mcMMO</groupId>
<artifactId>mcMMO</artifactId> <artifactId>mcMMO</artifactId>
<version>2.1.228-SNAPSHOT</version> <version>2.1.228</version>
<name>mcMMO</name> <name>mcMMO</name>
<url>https://github.com/mcMMO-Dev/mcMMO</url> <url>https://github.com/mcMMO-Dev/mcMMO</url>
<scm> <scm>

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

@ -2,19 +2,56 @@ package com.gmail.nossr50.events.skills.rupture;
import com.gmail.nossr50.datatypes.player.McMMOPlayer; import com.gmail.nossr50.datatypes.player.McMMOPlayer;
import org.bukkit.entity.Entity; import org.bukkit.entity.Entity;
import org.bukkit.event.entity.EntityDamageByEntityEvent; import org.bukkit.event.Cancellable;
import org.bukkit.event.HandlerList;
import org.bukkit.event.entity.EntityEvent;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
public class McMMOEntityDamageByRuptureEvent extends EntityDamageByEntityEvent { public class McMMOEntityDamageByRuptureEvent extends EntityEvent implements Cancellable {
private final McMMOPlayer mcMMODamager; private final McMMOPlayer damager;
private final Entity damagee;
private double damage;
private boolean isCancelled = false;
private static final HandlerList handlers = new HandlerList();
public McMMOEntityDamageByRuptureEvent(@NotNull McMMOPlayer damager, @NotNull Entity damagee, double damage) { public McMMOEntityDamageByRuptureEvent(@NotNull McMMOPlayer damager, @NotNull Entity damagee, double damage) {
super(damager.getPlayer(), damagee, DamageCause.CUSTOM, damage); super(damagee);
this.mcMMODamager = damager; this.damager = damager;
this.damagee = damagee;
this.damage = damage;
} }
@NotNull @NotNull
@Deprecated
public McMMOPlayer getMcMMODamager() { public McMMOPlayer getMcMMODamager() {
return mcMMODamager; return damager;
}
public McMMOPlayer getDamager() {
return damager;
}
public double getDamage() {
return damage;
}
public void setDamage(double damage) {
this.damage = Math.max(0, damage);
}
@Override
public boolean isCancelled() {
return isCancelled;
}
@Override
public void setCancelled(boolean cancel) {
isCancelled = cancel;
}
@NotNull
@Override
public HandlerList getHandlers() {
return handlers;
} }
} }

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.player.McMMOPlayer;
import com.gmail.nossr50.datatypes.skills.SubSkillType; import com.gmail.nossr50.datatypes.skills.SubSkillType;
import com.gmail.nossr50.datatypes.skills.subskills.interfaces.InteractType; 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.fake.FakeEntityTameEvent;
import com.gmail.nossr50.events.skills.rupture.McMMOEntityDamageByRuptureEvent;
import com.gmail.nossr50.mcMMO; import com.gmail.nossr50.mcMMO;
import com.gmail.nossr50.metadata.MobMetaFlagType; import com.gmail.nossr50.metadata.MobMetaFlagType;
import com.gmail.nossr50.metadata.MobMetadataService; import com.gmail.nossr50.metadata.MobMetadataService;
@ -286,9 +283,11 @@ public class EntityListener implements Listener {
*/ */
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
public void onEntityDamageByEntity(EntityDamageByEntityEvent event) { public void onEntityDamageByEntity(EntityDamageByEntityEvent event) {
if (event instanceof FakeEntityDamageByEntityEvent || event instanceof McMMOEntityDamageByRuptureEvent) { if (event.getEntity() instanceof LivingEntity livingEntity) {
if (CombatUtils.hasIgnoreDamageMetadata(livingEntity)) {
return; return;
} }
}
double damage = event.getFinalDamage(); double damage = event.getFinalDamage();
Entity defender = event.getEntity(); Entity defender = event.getEntity();
@ -447,14 +446,6 @@ public class EntityListener implements Listener {
player.sendMessage("Final damage: " + entityDamageEvent.getFinalDamage()); 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()) { if(entityDamageEvent.isCancelled()) {
player.sendMessage("Event was cancelled, which means no damage should be done."); 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 max health: "+otherPlayer.getAttribute(Attribute.GENERIC_MAX_HEALTH).getValue());
player.sendMessage("Target players current health: "+otherPlayer.getHealth()); 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()) { if(entityDamageEvent.isCancelled()) {
player.sendMessage("Event was cancelled, which means no damage should be done."); player.sendMessage("Event was cancelled, which means no damage should be done.");
} }
@ -558,9 +541,11 @@ public class EntityListener implements Listener {
* Old code * Old code
*/ */
if (event instanceof FakeEntityDamageEvent) { if (event.getEntity() instanceof LivingEntity livingEntity) {
if (CombatUtils.hasIgnoreDamageMetadata(livingEntity)) {
return; return;
} }
}
double damage = event.getFinalDamage(); double damage = event.getFinalDamage();

View File

@ -1,10 +1,12 @@
package com.gmail.nossr50.runnables.skills; package com.gmail.nossr50.runnables.skills;
import com.gmail.nossr50.datatypes.MobHealthbarType;
import com.gmail.nossr50.datatypes.player.McMMOPlayer; import com.gmail.nossr50.datatypes.player.McMMOPlayer;
import com.gmail.nossr50.events.skills.rupture.McMMOEntityDamageByRuptureEvent; import com.gmail.nossr50.events.skills.rupture.McMMOEntityDamageByRuptureEvent;
import com.gmail.nossr50.mcMMO; import com.gmail.nossr50.mcMMO;
import com.gmail.nossr50.util.CancellableRunnable; import com.gmail.nossr50.util.CancellableRunnable;
import com.gmail.nossr50.util.MetadataConstants; import com.gmail.nossr50.util.MetadataConstants;
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;
@ -84,7 +86,8 @@ public class RuptureTask extends CancellableRunnable {
//Ensure victim has health //Ensure victim has health
if (healthBeforeRuptureIsApplied > 0.01) { if (healthBeforeRuptureIsApplied > 0.01) {
//Send a fake damage event //Send a fake damage event
McMMOEntityDamageByRuptureEvent event = new McMMOEntityDamageByRuptureEvent(ruptureSource, targetEntity, calculateAdjustedTickDamage()); McMMOEntityDamageByRuptureEvent event =
new McMMOEntityDamageByRuptureEvent(ruptureSource, targetEntity, calculateAdjustedTickDamage());
mcMMO.p.getServer().getPluginManager().callEvent(event); mcMMO.p.getServer().getPluginManager().callEvent(event);
//Ensure the event wasn't cancelled and damage is still greater than 0 //Ensure the event wasn't cancelled and damage is still greater than 0
@ -96,6 +99,7 @@ public class RuptureTask extends CancellableRunnable {
double damagedHealth = healthBeforeRuptureIsApplied - damage; double damagedHealth = healthBeforeRuptureIsApplied - damage;
targetEntity.setHealth(damagedHealth); //Hurt entity without the unwanted side effects of damage()} targetEntity.setHealth(damagedHealth); //Hurt entity without the unwanted side effects of damage()}
MobHealthbarUtils.handleMobHealthbars(targetEntity, damage, mcMMO.p);
} }
return false; return false;

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.McMMOPlayerLevelDownEvent;
import com.gmail.nossr50.events.experience.McMMOPlayerLevelUpEvent; import com.gmail.nossr50.events.experience.McMMOPlayerLevelUpEvent;
import com.gmail.nossr50.events.experience.McMMOPlayerXpGainEvent; 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.McMMOPlayerPreDeathPenaltyEvent;
import com.gmail.nossr50.events.hardcore.McMMOPlayerStatLossEvent; import com.gmail.nossr50.events.hardcore.McMMOPlayerStatLossEvent;
import com.gmail.nossr50.events.hardcore.McMMOPlayerVampirismEvent; import com.gmail.nossr50.events.hardcore.McMMOPlayerVampirismEvent;
@ -83,17 +86,6 @@ public final class EventUtils {
return event instanceof FakeEvent; 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 * This little method is just to make the code more readable
* *

View File

@ -39,7 +39,7 @@ public final class MobHealthbarUtils {
return; return;
} }
if (isBoss(target)) { if (isBoss(target) || target instanceof Player) {
return; return;
} }

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