Skip to content

Commit 48f7a1a

Browse files
authored
Add WardenAngerChangeEvent (#7943)
1 parent cb410bb commit 48f7a1a

File tree

2 files changed

+165
-0
lines changed

2 files changed

+165
-0
lines changed
Lines changed: 117 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,117 @@
1+
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
2+
From: nopjar <code.nopjar@gmail.com>
3+
Date: Sun, 12 Jun 2022 00:56:45 +0200
4+
Subject: [PATCH] Add WardenAngerChangeEvent
5+
6+
Adding a event which gets called when a warden is angered by
7+
another entity.
8+
9+
diff --git a/src/main/java/io/papermc/paper/event/entity/WardenAngerChangeEvent.java b/src/main/java/io/papermc/paper/event/entity/WardenAngerChangeEvent.java
10+
new file mode 100644
11+
index 0000000000000000000000000000000000000000..4fd31d4d8b35f27789f3cd9581e7c17a6bde5373
12+
--- /dev/null
13+
+++ b/src/main/java/io/papermc/paper/event/entity/WardenAngerChangeEvent.java
14+
@@ -0,0 +1,103 @@
15+
+package io.papermc.paper.event.entity;
16+
+
17+
+import org.bukkit.entity.Entity;
18+
+import org.bukkit.entity.Warden;
19+
+import org.bukkit.event.Cancellable;
20+
+import org.bukkit.event.HandlerList;
21+
+import org.bukkit.event.entity.EntityEvent;
22+
+import org.jetbrains.annotations.NotNull;
23+
+import org.jetbrains.annotations.Nullable;
24+
+
25+
+/**
26+
+ * Called when a Warden's anger level has changed due to another entity.
27+
+ * <p>
28+
+ * If the event is cancelled, the warden's anger level will not change.
29+
+ */
30+
+public class WardenAngerChangeEvent extends EntityEvent implements Cancellable {
31+
+
32+
+ private static final HandlerList handlers = new HandlerList();
33+
+ private boolean cancelled;
34+
+ private final Entity target;
35+
+ private final int oldAnger;
36+
+ private int newAnger;
37+
+
38+
+ public WardenAngerChangeEvent(@NotNull final Warden warden, @Nullable final Entity target, final int oldAnger, final int newAnger) {
39+
+ super(warden);
40+
+ this.target = target;
41+
+ this.oldAnger = oldAnger;
42+
+ this.newAnger = newAnger;
43+
+ }
44+
+
45+
+ /**
46+
+ * Gets the entity (if any) which triggered this anger update.
47+
+ *
48+
+ * @return triggering entity, or null
49+
+ */
50+
+ @Nullable
51+
+ public Entity getTarget() {
52+
+ return target;
53+
+ }
54+
+
55+
+ /**
56+
+ * Gets the old anger level.
57+
+ *
58+
+ * @return old anger level
59+
+ * @see Warden#getAnger(Entity)
60+
+ */
61+
+ public int getOldAnger() {
62+
+ return oldAnger;
63+
+ }
64+
+
65+
+ /**
66+
+ * Gets the new anger level resulting from this event.
67+
+ *
68+
+ * @return new anger level
69+
+ * @see Warden#getAnger(Entity)
70+
+ */
71+
+ public int getNewAnger() {
72+
+ return newAnger;
73+
+ }
74+
+
75+
+ /**
76+
+ * Sets the new anger level resulting from this event.
77+
+ * <p>
78+
+ * The anger of a warden is capped at 150.
79+
+ *
80+
+ * @param newAnger the new anger level, max 150
81+
+ * @see Warden#setAnger(Entity, int)
82+
+ * @throws IllegalArgumentException if newAnger is greater than 150
83+
+ */
84+
+ public void setNewAnger(int newAnger) {
85+
+ if (newAnger > 150)
86+
+ throw new IllegalArgumentException("newAnger must not be greater than 150");
87+
+
88+
+ this.newAnger = newAnger;
89+
+ }
90+
+
91+
+ @NotNull
92+
+ @Override
93+
+ public Warden getEntity() {
94+
+ return (Warden) entity;
95+
+ }
96+
+
97+
+ @Override
98+
+ public boolean isCancelled() {
99+
+ return cancelled;
100+
+ }
101+
+
102+
+ @Override
103+
+ public void setCancelled(boolean cancelled) {
104+
+ this.cancelled = cancelled;
105+
+ }
106+
+
107+
+ @NotNull
108+
+ @Override
109+
+ public HandlerList getHandlers() {
110+
+ return handlers;
111+
+ }
112+
+
113+
+ @NotNull
114+
+ public static HandlerList getHandlerList() {
115+
+ return handlers;
116+
+ }
117+
+}
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
2+
From: nopjar <code.nopjar@gmail.com>
3+
Date: Sun, 12 Jun 2022 02:26:04 +0200
4+
Subject: [PATCH] Add WardenAngerChangeEvent
5+
6+
7+
diff --git a/src/main/java/net/minecraft/world/entity/monster/warden/AngerManagement.java b/src/main/java/net/minecraft/world/entity/monster/warden/AngerManagement.java
8+
index e9b4f29e1844f7c44e341f9b1c07c676469ca3b6..d76800a79faef26aab0cf99b28dfa4621877ecc7 100644
9+
--- a/src/main/java/net/minecraft/world/entity/monster/warden/AngerManagement.java
10+
+++ b/src/main/java/net/minecraft/world/entity/monster/warden/AngerManagement.java
11+
@@ -145,7 +145,7 @@ public class AngerManagement {
12+
public int increaseAnger(Entity entity, int amount) {
13+
boolean bl = !this.angerBySuspect.containsKey(entity);
14+
int i = this.angerBySuspect.computeInt(entity, (suspect, anger) -> {
15+
- return Math.min(150, (anger == null ? 0 : anger) + amount);
16+
+ return Math.min(150, (anger == null ? 0 : anger) + amount); // Paper - diff on change
17+
});
18+
if (bl) {
19+
int j = this.angerByUuid.removeInt(entity.getUUID());
20+
diff --git a/src/main/java/net/minecraft/world/entity/monster/warden/Warden.java b/src/main/java/net/minecraft/world/entity/monster/warden/Warden.java
21+
index 60410fd12e0fcfbaad3b4dc431452f8b2e6276c7..cd6fb81d14706217c92fccc7853afce4010dfd1b 100644
22+
--- a/src/main/java/net/minecraft/world/entity/monster/warden/Warden.java
23+
+++ b/src/main/java/net/minecraft/world/entity/monster/warden/Warden.java
24+
@@ -361,7 +361,7 @@ public class Warden extends Monster implements VibrationListener.VibrationListen
25+
26+
@Override
27+
public Brain<Warden> getBrain() {
28+
- return super.getBrain();
29+
+ return (Brain<Warden>) super.getBrain(); // Paper - decompile fix
30+
}
31+
32+
@Override
33+
@@ -460,6 +460,15 @@ public class Warden extends Monster implements VibrationListener.VibrationListen
34+
@VisibleForTesting
35+
public void increaseAngerAt(@Nullable Entity entity, int amount, boolean listening) {
36+
if (!this.isNoAi() && this.canTargetEntity(entity)) {
37+
+ // Paper start
38+
+ int activeAnger = this.angerManagement.getActiveAnger(entity);
39+
+ io.papermc.paper.event.entity.WardenAngerChangeEvent event = new io.papermc.paper.event.entity.WardenAngerChangeEvent((org.bukkit.entity.Warden) this.getBukkitEntity(), entity.getBukkitEntity(), activeAnger, Math.min(150, activeAnger + amount));
40+
+ this.level.getCraftServer().getPluginManager().callEvent(event);
41+
+ if (event.isCancelled()) {
42+
+ return;
43+
+ }
44+
+ amount = event.getNewAnger() - activeAnger;
45+
+ // Paper end
46+
WardenAi.setDigCooldown(this);
47+
boolean bl = !(this.getBrain().getMemory(MemoryModuleType.ATTACK_TARGET).orElse((LivingEntity)null) instanceof Player);
48+
int i = this.angerManagement.increaseAnger(entity, amount);

0 commit comments

Comments
 (0)