aboutsummaryrefslogtreecommitdiffhomepage
path: root/patches/api/0051-ExperienceOrbs-API-for-Reason-Source-Triggering-play.patch
blob: 5dadaf640f851e6249c3745bb1b76835366e3220 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
From 0000000000000000000000000000000000000000 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 c286edfd827e185a76e44c44faace19a80325d7a..dec70bbfaf73a9d525b2c45682b804c684e1645b 100644
--- a/src/main/java/org/bukkit/entity/ExperienceOrb.java
+++ b/src/main/java/org/bukkit/entity/ExperienceOrb.java
@@ -1,5 +1,8 @@
 package org.bukkit.entity;
 
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable; // Paper
+
 /**
  * Represents an Experience Orb.
  */
@@ -18,4 +21,99 @@ 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,
+        /**
+         * Spawned by a player using a grindstone
+         */
+        GRINDSTONE,
+        /**
+         * 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.
+     */
+    @NotNull
+    SpawnReason getSpawnReason();
+    // Paper end
 }