aboutsummaryrefslogtreecommitdiffhomepage
path: root/patches/api/0436-Add-HiddenPotionEffect-API.patch
blob: 94799bbf65466de75c6317c7c7fd685abaa4da3a (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
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Tamion <70228790+notTamion@users.noreply.github.com>
Date: Sun, 5 Nov 2023 09:50:48 +0100
Subject: [PATCH] Add HiddenPotionEffect API


diff --git a/src/main/java/org/bukkit/entity/LivingEntity.java b/src/main/java/org/bukkit/entity/LivingEntity.java
index 5de7651f673cba9782f88f46dc938274b37a38ec..5c29956c6db53440322330ff723c7087193641f1 100644
--- a/src/main/java/org/bukkit/entity/LivingEntity.java
+++ b/src/main/java/org/bukkit/entity/LivingEntity.java
@@ -591,6 +591,9 @@ public interface LivingEntity extends Attributable, Damageable, ProjectileSource
 
     /**
      * Adds the given {@link PotionEffect} to the living entity.
+     * <p>
+     * Note: {@link PotionEffect#getHiddenPotionEffect()} is ignored when
+     * adding the effect to the entity.
      *
      * @param effect PotionEffect to be added
      * @return whether the effect could be added
@@ -615,6 +618,9 @@ public interface LivingEntity extends Attributable, Damageable, ProjectileSource
     /**
      * Attempts to add all of the given {@link PotionEffect} to the living
      * entity.
+     * <p>
+     * Note: {@link PotionEffect#getHiddenPotionEffect()} is ignored when
+     * adding the effect to the entity.
      *
      * @param effects the effects to add
      * @return whether all of the effects could be added
diff --git a/src/main/java/org/bukkit/potion/PotionEffect.java b/src/main/java/org/bukkit/potion/PotionEffect.java
index 575156c089e45a3d6a43ca6b7adfbc7b473a60ab..704b6d615e7490d433b703f5a6a8d3c40aa6425e 100644
--- a/src/main/java/org/bukkit/potion/PotionEffect.java
+++ b/src/main/java/org/bukkit/potion/PotionEffect.java
@@ -28,6 +28,7 @@ public class PotionEffect implements ConfigurationSerializable {
      */
     public static final int INFINITE_DURATION = -1;
 
+    private static final String HIDDEN_EFFECT = "hidden_effect"; // Paper
     private static final String AMPLIFIER = "amplifier";
     private static final String DURATION = "duration";
     private static final String TYPE = "effect";
@@ -40,6 +41,7 @@ public class PotionEffect implements ConfigurationSerializable {
     private final boolean ambient;
     private final boolean particles;
     private final boolean icon;
+    private final PotionEffect hiddenEffect; // Paper
 
     /**
      * Creates a potion effect.
@@ -50,8 +52,11 @@ public class PotionEffect implements ConfigurationSerializable {
      * @param ambient the ambient status, see {@link PotionEffect#isAmbient()}
      * @param particles the particle status, see {@link PotionEffect#hasParticles()}
      * @param icon the icon status, see {@link PotionEffect#hasIcon()}
+     * @param hiddenEffect the hidden PotionEffect
+     * @hidden Internal-- hidden effects are only shown internally
      */
-    public PotionEffect(@NotNull PotionEffectType type, int duration, int amplifier, boolean ambient, boolean particles, boolean icon) {
+    @org.jetbrains.annotations.ApiStatus.Internal // Paper
+    public PotionEffect(@NotNull PotionEffectType type, int duration, int amplifier, boolean ambient, boolean particles, boolean icon, @Nullable PotionEffect hiddenEffect) { // Paper
         Preconditions.checkArgument(type != null, "effect type cannot be null");
         this.type = type;
         this.duration = duration;
@@ -59,6 +64,23 @@ public class PotionEffect implements ConfigurationSerializable {
         this.ambient = ambient;
         this.particles = particles;
         this.icon = icon;
+        // Paper start
+        this.hiddenEffect = hiddenEffect;
+    }
+
+    /**
+     * Creates a potion effect.
+     * @param type effect type
+     * @param duration measured in ticks, see {@link
+     *     PotionEffect#getDuration()}
+     * @param amplifier the amplifier, see {@link PotionEffect#getAmplifier()}
+     * @param ambient the ambient status, see {@link PotionEffect#isAmbient()}
+     * @param particles the particle status, see {@link PotionEffect#hasParticles()}
+     * @param icon the icon status, see {@link PotionEffect#hasIcon()}
+     */
+    public PotionEffect(@NotNull PotionEffectType type, int duration, int amplifier, boolean ambient, boolean particles, boolean icon) {
+        this(type, duration, amplifier, ambient, particles, icon, null);
+        // Paper end
     }
 
     /**
@@ -106,7 +128,7 @@ public class PotionEffect implements ConfigurationSerializable {
      * @param map the map to deserialize from
      */
     public PotionEffect(@NotNull Map<String, Object> map) {
-        this(getEffectType(map), getInt(map, DURATION), getInt(map, AMPLIFIER), getBool(map, AMBIENT, false), getBool(map, PARTICLES, true), getBool(map, ICON, getBool(map, PARTICLES, true)));
+        this(getEffectType(map), getInt(map, DURATION), getInt(map, AMPLIFIER), getBool(map, AMBIENT, false), getBool(map, PARTICLES, true), getBool(map, ICON, getBool(map, PARTICLES, true)), (PotionEffect) map.get(HIDDEN_EFFECT)); // Paper
     }
 
     // Paper start
@@ -134,6 +156,19 @@ public class PotionEffect implements ConfigurationSerializable {
     public PotionEffect withIcon(boolean icon) {
         return new PotionEffect(this.type, duration, amplifier, ambient, particles, icon);
     }
+
+    /**
+     * Returns the PotionEffect that will become active
+     * after the current PotionEffect has run out.
+     * <p>
+     * Note: This value is only applicable to type applied to living entities.
+     *
+     * @return The hidden PotionEffect.
+     */
+    @Nullable
+    public PotionEffect getHiddenPotionEffect() {
+        return hiddenEffect;
+    }
     // Paper end
 
     @NotNull
@@ -170,19 +205,27 @@ public class PotionEffect implements ConfigurationSerializable {
     @Override
     @NotNull
     public Map<String, Object> serialize() {
-        return ImmutableMap.<String, Object>builder()
+        ImmutableMap.Builder<String, Object> builder = ImmutableMap.<String, Object>builder() // Paper
             .put(TYPE, type.getKey().toString())
             .put(DURATION, duration)
             .put(AMPLIFIER, amplifier)
             .put(AMBIENT, ambient)
             .put(PARTICLES, particles)
-            .put(ICON, icon)
-            .build();
+            .put(ICON, icon);
+        // Paper start
+        if (this.hiddenEffect != null) {
+            builder.put(HIDDEN_EFFECT, this.hiddenEffect);
+        }
+        return builder.build();
+        // Paper end
     }
 
     /**
      * Attempts to add the effect represented by this object to the given
      * {@link LivingEntity}.
+     * <p>
+     * Note: {@link PotionEffect#getHiddenPotionEffect()} is ignored when
+     * adding the effect to the entity.
      *
      * @param entity The entity to add this effect to
      * @return Whether the effect could be added
@@ -201,7 +244,7 @@ public class PotionEffect implements ConfigurationSerializable {
             return false;
         }
         PotionEffect that = (PotionEffect) obj;
-        return this.type.equals(that.type) && this.ambient == that.ambient && this.amplifier == that.amplifier && this.duration == that.duration && this.particles == that.particles && this.icon == that.icon;
+        return this.type.equals(that.type) && this.ambient == that.ambient && this.amplifier == that.amplifier && this.duration == that.duration && this.particles == that.particles && this.icon == that.icon && java.util.Objects.equals(this.hiddenEffect, that.hiddenEffect); // Paper
     }
 
     /**
@@ -306,11 +349,12 @@ public class PotionEffect implements ConfigurationSerializable {
         hash ^= 0x22222222 >> (ambient ? 1 : -1);
         hash ^= 0x22222222 >> (particles ? 1 : -1);
         hash ^= 0x22222222 >> (icon ? 1 : -1);
+        if (hiddenEffect != null) hash = hash * 31 + hiddenEffect.hashCode(); // Paper
         return hash;
     }
 
     @Override
     public String toString() {
-        return type.getName() + (ambient ? ":(" : ":") + duration + "t-x" + amplifier + (ambient ? ")" : "");
+        return "PotionEffect{" + "amplifier=" + amplifier + ", duration=" + duration + ", type=" + type + ", ambient=" + ambient + ", particles=" + particles + ", icon=" + icon + ", hiddenEffect=" + hiddenEffect + '}'; // Paper
     }
 }