205 lines
7.3 KiB
Diff
205 lines
7.3 KiB
Diff
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
From: Phoenix616 <mail@moep.tv>
|
|
Date: Tue, 21 Aug 2018 01:32:28 +0100
|
|
Subject: [PATCH] Improve death events
|
|
|
|
This adds the ability to cancel the death events and to modify the sound
|
|
an entity makes when dying. (In cases were no sound should it will be
|
|
called with shouldPlaySound set to false allowing unsilencing of silent
|
|
entities)
|
|
|
|
It makes handling of entity deaths a lot nicer as you no longer need
|
|
to listen on the damage event and calculate if the entity dies yourself
|
|
to cancel the death which has the benefit of also receiving the dropped
|
|
items and experience which is otherwise only properly possible by using
|
|
internal code.
|
|
|
|
diff --git a/src/main/java/org/bukkit/event/entity/EntityDeathEvent.java b/src/main/java/org/bukkit/event/entity/EntityDeathEvent.java
|
|
index b0c069f65da29c6e9eff8e0490fda43a6bed307c..81a3067ff5ae22943b66051f4613ab9fe095720c 100644
|
|
--- a/src/main/java/org/bukkit/event/entity/EntityDeathEvent.java
|
|
+++ b/src/main/java/org/bukkit/event/entity/EntityDeathEvent.java
|
|
@@ -6,15 +6,25 @@ import org.bukkit.entity.LivingEntity;
|
|
import org.bukkit.event.HandlerList;
|
|
import org.bukkit.inventory.ItemStack;
|
|
import org.jetbrains.annotations.NotNull;
|
|
+import org.jetbrains.annotations.Nullable;
|
|
|
|
/**
|
|
* Thrown whenever a LivingEntity dies
|
|
*/
|
|
-public class EntityDeathEvent extends EntityEvent {
|
|
+public class EntityDeathEvent extends EntityEvent implements org.bukkit.event.Cancellable { // Paper - make cancellable
|
|
private static final HandlerList handlers = new HandlerList();
|
|
private final DamageSource damageSource;
|
|
private final List<ItemStack> drops;
|
|
private int dropExp = 0;
|
|
+ // Paper start - make cancellable
|
|
+ private boolean cancelled;
|
|
+ private double reviveHealth = 0;
|
|
+ private boolean shouldPlayDeathSound;
|
|
+ @Nullable private org.bukkit.Sound deathSound;
|
|
+ @Nullable private org.bukkit.SoundCategory deathSoundCategory;
|
|
+ private float deathSoundVolume;
|
|
+ private float deathSoundPitch;
|
|
+ // Paper end
|
|
|
|
public EntityDeathEvent(@NotNull final LivingEntity entity, @NotNull DamageSource damageSource, @NotNull final List<ItemStack> drops) {
|
|
this(entity, damageSource, drops, 0);
|
|
@@ -87,4 +97,133 @@ public class EntityDeathEvent extends EntityEvent {
|
|
public static HandlerList getHandlerList() {
|
|
return handlers;
|
|
}
|
|
+
|
|
+ // Paper start - make cancellable
|
|
+ @Override
|
|
+ public boolean isCancelled() {
|
|
+ return cancelled;
|
|
+ }
|
|
+
|
|
+ @Override
|
|
+ public void setCancelled(boolean cancel) {
|
|
+ cancelled = cancel;
|
|
+ }
|
|
+
|
|
+ /**
|
|
+ * Get the amount of health that the entity should revive with after cancelling the event.
|
|
+ * Set to the entity's max health by default.
|
|
+ *
|
|
+ * @return The amount of health
|
|
+ */
|
|
+ public double getReviveHealth() {
|
|
+ return reviveHealth;
|
|
+ }
|
|
+
|
|
+ /**
|
|
+ * Set the amount of health that the entity should revive with after cancelling the event.
|
|
+ * Revive health value must be between 0 (exclusive) and the entity's max health (inclusive).
|
|
+ *
|
|
+ * @param reviveHealth The amount of health
|
|
+ * @throws IllegalArgumentException Thrown if the health is {@literal <= 0 or >} max health
|
|
+ */
|
|
+ public void setReviveHealth(double reviveHealth) throws IllegalArgumentException {
|
|
+ double maxHealth = ((LivingEntity) entity).getAttribute(org.bukkit.attribute.Attribute.GENERIC_MAX_HEALTH).getValue();
|
|
+ if ((maxHealth != 0 && reviveHealth <= 0) || (reviveHealth > maxHealth)) {
|
|
+ throw new IllegalArgumentException("Health must be between 0 (exclusive) and " + maxHealth + " (inclusive), but was " + reviveHealth);
|
|
+ }
|
|
+ this.reviveHealth = reviveHealth;
|
|
+ }
|
|
+
|
|
+ /**
|
|
+ * Whether or not the death sound should play when the entity dies. If the event is cancelled it does not play!
|
|
+ *
|
|
+ * @return Whether or not the death sound should play. Event is called with this set to false if the entity is silent.
|
|
+ */
|
|
+ public boolean shouldPlayDeathSound() {
|
|
+ return shouldPlayDeathSound;
|
|
+ }
|
|
+
|
|
+ /**
|
|
+ * Set whether or not the death sound should play when the entity dies. If the event is cancelled it does not play!
|
|
+ *
|
|
+ * @param playDeathSound Enable or disable the death sound
|
|
+ */
|
|
+ public void setShouldPlayDeathSound(boolean playDeathSound) {
|
|
+ this.shouldPlayDeathSound = playDeathSound;
|
|
+ }
|
|
+
|
|
+ /**
|
|
+ * Get the sound that the entity makes when dying
|
|
+ *
|
|
+ * @return The sound that the entity makes
|
|
+ */
|
|
+ @Nullable
|
|
+ public org.bukkit.Sound getDeathSound() {
|
|
+ return deathSound;
|
|
+ }
|
|
+
|
|
+ /**
|
|
+ * Set the sound that the entity makes when dying
|
|
+ *
|
|
+ * @param sound The sound that the entity should make when dying
|
|
+ */
|
|
+ public void setDeathSound(@Nullable org.bukkit.Sound sound) {
|
|
+ deathSound = sound;
|
|
+ }
|
|
+
|
|
+ /**
|
|
+ * Get the sound category that the death sound should play in
|
|
+ *
|
|
+ * @return The sound category
|
|
+ */
|
|
+ @Nullable
|
|
+ public org.bukkit.SoundCategory getDeathSoundCategory() {
|
|
+ return deathSoundCategory;
|
|
+ }
|
|
+
|
|
+ /**
|
|
+ * Set the sound category that the death sound should play in.
|
|
+ *
|
|
+ * @param soundCategory The sound category
|
|
+ */
|
|
+ public void setDeathSoundCategory(@Nullable org.bukkit.SoundCategory soundCategory) {
|
|
+ this.deathSoundCategory = soundCategory;
|
|
+ }
|
|
+
|
|
+ /**
|
|
+ * Get the volume that the death sound will play at.
|
|
+ *
|
|
+ * @return The volume the death sound will play at
|
|
+ */
|
|
+ public float getDeathSoundVolume() {
|
|
+ return deathSoundVolume;
|
|
+ }
|
|
+
|
|
+ /**
|
|
+ * Set the volume the death sound should play at. If the event is cancelled this will not play the sound!
|
|
+ *
|
|
+ * @param volume The volume the death sound should play at
|
|
+ */
|
|
+ public void setDeathSoundVolume(float volume) {
|
|
+ this.deathSoundVolume = volume;
|
|
+ }
|
|
+
|
|
+ /**
|
|
+ * Get the pitch that the death sound will play with.
|
|
+ *
|
|
+ * @return The pitch the death sound will play with
|
|
+ */
|
|
+ public float getDeathSoundPitch() {
|
|
+ return deathSoundPitch;
|
|
+ }
|
|
+
|
|
+ /**
|
|
+ * Set the pitch that the death sound should play with.
|
|
+ *
|
|
+ * @param pitch The pitch the death sound should play with
|
|
+ */
|
|
+ public void setDeathSoundPitch(float pitch) {
|
|
+ this.deathSoundPitch = pitch;
|
|
+ }
|
|
+ // Paper end
|
|
}
|
|
diff --git a/src/main/java/org/bukkit/event/entity/PlayerDeathEvent.java b/src/main/java/org/bukkit/event/entity/PlayerDeathEvent.java
|
|
index 9473303bd8ab1f6b63b6999a5f5ff3eca1cc23d6..76f00e386110f361549690d20dc0f73884a2fdda 100644
|
|
--- a/src/main/java/org/bukkit/event/entity/PlayerDeathEvent.java
|
|
+++ b/src/main/java/org/bukkit/event/entity/PlayerDeathEvent.java
|
|
@@ -63,6 +63,19 @@ public class PlayerDeathEvent extends EntityDeathEvent {
|
|
return (Player) entity;
|
|
}
|
|
|
|
+ // Paper start - improve death events
|
|
+ /**
|
|
+ * Clarity method for getting the player. Not really needed except
|
|
+ * for reasons of clarity.
|
|
+ *
|
|
+ * @return Player who is involved in this event
|
|
+ */
|
|
+ public @NotNull Player getPlayer() {
|
|
+ return this.getEntity();
|
|
+ }
|
|
+
|
|
+ // Paper end - improve death events
|
|
+
|
|
// Paper start - adventure
|
|
/**
|
|
* Set the death message that will appear to everyone on the server.
|