mirror of
https://github.com/mcMMO-Dev/mcMMO.git
synced 2024-11-24 06:06:45 +01:00
merge master
This commit is contained in:
commit
70383b7250
@ -51,6 +51,14 @@ Version 2.2.000
|
|||||||
Currently these skills scale up to a maximum 50% chance if a player has 10,000 skill, you can adjust this in advanced.yml
|
Currently these skills scale up to a maximum 50% chance if a player has 10,000 skill, you can adjust this in advanced.yml
|
||||||
|
|
||||||
|
|
||||||
|
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)
|
||||||
|
@ -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);
|
|
||||||
}
|
|
||||||
}
|
|
@ -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);
|
|
||||||
}
|
|
||||||
}
|
|
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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;
|
||||||
@ -261,9 +258,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();
|
||||||
@ -422,14 +421,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.");
|
||||||
}
|
}
|
||||||
@ -456,14 +447,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.");
|
||||||
}
|
}
|
||||||
@ -533,9 +516,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();
|
||||||
|
|
||||||
|
@ -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;
|
||||||
|
@ -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
|
||||||
*
|
*
|
||||||
|
@ -39,7 +39,7 @@ public final class MobHealthbarUtils {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (isBoss(target)) {
|
if (isBoss(target) || target instanceof Player) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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;
|
||||||
@ -30,7 +28,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;
|
||||||
@ -624,7 +621,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);
|
||||||
}
|
}
|
||||||
@ -669,10 +665,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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -955,19 +956,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.
|
||||||
*
|
*
|
||||||
|
Loading…
Reference in New Issue
Block a user