papermc/Spigot-API-Patches/0048-ExperienceOrbs-API-for-Reason-Source-Triggering-play.patch

120 lines
3.6 KiB
Diff
Raw Normal View History

From 0e3f92f938875e2030ff8e1b7f559ecddca777f7 Mon Sep 17 00:00:00 2001
From: Aikar <aikar@aikar.co>
Date: Tue, 19 Dec 2017 16:28:32 -0500
Subject: [PATCH] ExperienceOrbs API for Reason/Source/Triggering player
Adds lots of information about why this orb exists.
Replaces isFromBottle() with logic that persists entity reloads too.
diff --git a/src/main/java/org/bukkit/entity/ExperienceOrb.java b/src/main/java/org/bukkit/entity/ExperienceOrb.java
index c286edfd..f847543b 100644
--- a/src/main/java/org/bukkit/entity/ExperienceOrb.java
+++ b/src/main/java/org/bukkit/entity/ExperienceOrb.java
@@ -1,5 +1,7 @@
package org.bukkit.entity;
+import javax.annotation.Nullable;
+
/**
* Represents an Experience Orb.
*/
@@ -18,4 +20,94 @@ public interface ExperienceOrb extends Entity {
* @param value Amount of experience
*/
public void setExperience(int value);
+
+ // Paper start
+ /**
+ * Check if this orb was spawned from a {@link ThrownExpBottle}
+ *
+ * @return if orb was spawned from a bottle
+ * @deprecated Use getSpawnReason() == EXP_BOTTLE
+ */
+ @Deprecated
+ default boolean isFromBottle() {
+ return getSpawnReason() == SpawnReason.EXP_BOTTLE;
+ }
+
+ /**
+ * Reasons for why this Experience Orb was spawned
+ */
+ enum SpawnReason {
+ /**
+ * Spawned by a player dying
+ */
+ PLAYER_DEATH,
+ /**
+ * Spawned by an entity dying after being damaged by a player
+ */
+ ENTITY_DEATH,
+ /**
+ * Spawned by player using a furnace
+ */
+ FURNACE,
+ /**
+ * Spawned by player breeding animals
+ */
+ BREED,
+ /**
+ * Spawned by player trading with a villager
+ */
+ VILLAGER_TRADE,
+ /**
+ * Spawned by player fishing
+ */
+ FISHING,
+ /**
+ * Spawned by player breaking a block that gives experience points such as Diamond Ore
+ */
+ BLOCK_BREAK,
+ /**
+ * Spawned by Bukkit API
+ */
+ CUSTOM,
+ /**
+ * Spawned by a player throwing an experience points bottle
+ */
+ EXP_BOTTLE,
+ /**
+ * We do not know why it was spawned
+ */
+ UNKNOWN
+ }
+
+ /**
+ * If this experience orb was triggered to be spawned by
+ * an entity such as a player, due to events such as killing entity,
+ * breaking blocks, smelting in a furnace, etc, this will return the UUID
+ * of the entity that triggered this orb to drop.
+ *
+ * In the case of an entity being killed, this will be the killers UUID.
+ *
+ * @return UUID of the player that triggered this orb to drop, or null if unknown/no triggering entity
+ */
+ @Nullable java.util.UUID getTriggerEntityId();
+
+ /**
+ * If this experience orb was spawned in relation to another
+ * entity, such as a player or other living entity death, or breeding,
+ * return the source entity UUID.
+ *
+ * In the case of breeding, this will be the new baby entities UUID.
+ * In the case of an entity being killed, this will be the dead entities UUID.
+ *
+ * @return The UUID of the entity that sourced this experience orb
+ */
+ @Nullable java.util.UUID getSourceEntityId();
+
+ /**
+ * Gets the reason that this experience orb was spawned. For any case that we
+ * do not know, such as orbs spawned before this API was added, UNKNOWN is returned.
+ * @return The reason for this orb being spawned.
+ */
+ SpawnReason getSpawnReason();
+ // Paper end
}
--
2.18.0