aboutsummaryrefslogtreecommitdiffhomepage
path: root/patches/api/0145-Improve-death-events.patch
diff options
context:
space:
mode:
Diffstat (limited to 'patches/api/0145-Improve-death-events.patch')
-rw-r--r--patches/api/0145-Improve-death-events.patch204
1 files changed, 204 insertions, 0 deletions
diff --git a/patches/api/0145-Improve-death-events.patch b/patches/api/0145-Improve-death-events.patch
new file mode 100644
index 0000000000..90a6bdde24
--- /dev/null
+++ b/patches/api/0145-Improve-death-events.patch
@@ -0,0 +1,204 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: Phoenix616 <[email protected]>
+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 a5984ab06cce95d30e70511e125f69339b574c04..130cf9e5981f701dff4fa72e71e0b5dc8295bfc8 100644
+--- a/src/main/java/org/bukkit/event/entity/EntityDeathEvent.java
++++ b/src/main/java/org/bukkit/event/entity/EntityDeathEvent.java
+@@ -5,14 +5,24 @@ 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 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 final List<ItemStack> drops) {
+ this(entity, drops, 0);
+@@ -74,4 +84,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 03b4e0300d228e3f3a9f4f75c96e0cf9ed1a7d2d..38f81772edacb178e21c3f273e8c41ed46177d6d 100644
+--- a/src/main/java/org/bukkit/event/entity/PlayerDeathEvent.java
++++ b/src/main/java/org/bukkit/event/entity/PlayerDeathEvent.java
+@@ -62,6 +62,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.