Skip to content

Commit 0cb9c77

Browse files
committed
Update Upstream EssentialsX (support 26.2) :
EssentialsX@d16aec1 Fixed unreachable nickNoMore Message in /nick command. Not a huge change. (EssentialsX#6442) EssentialsX@bc6acfe Command Trees v2 (EssentialsX#6230) EssentialsX@99f7a49 Improve gc command performance (EssentialsX#6439) EssentialsX@e9b8343 Move away from adventure-platform for Paper (EssentialsX#6220) EssentialsX@18549a7 Fix /ess reload (EssentialsX#6444) EssentialsX@f080f81 fix(commands): propagate Essentials and module to tree nodes (EssentialsX#6445) EssentialsX@b8acd9c Allow discord console relay to be filtered by logger name (EssentialsX#6448) EssentialsX@5abe8b6 Fix server freezing with /give (EssentialsX#6449) EssentialsX@9c83333 Fix integer overflow with /burn + /more & fix % in chat formats (EssentialsX#6452) EssentialsX@297d0e4 Migrate Vault and emoji-java dependencies away from Jitpack (EssentialsX#6458) EssentialsX@9d70fdb Add MiniMessage support for thunder enabled / disabled (EssentialsX#6454) EssentialsX@302653a Fix workflow artifact upload paths missing X in EssentialsX addon jar names (EssentialsX#6462) EssentialsX@482175e Prevent running recipe command while sleeping (EssentialsX#6455) EssentialsX@d7452bf Fix stale shadow include group ID for emoji-java in EssentialsDiscord (EssentialsX#6467) EssentialsX@8e3b24f Minecraft 26.1 (EssentialsX#6473) EssentialsX@5d535dc Support new PaperMC versioning scheme in VersionUtil (EssentialsX#6480) EssentialsX@c26909e Add alias ver for the version subcommand (EssentialsX#6481) EssentialsX@218e004 Bump supported versions to 26.1.1 (EssentialsX#6482) EssentialsX@637ac8f Fix version comparison logic for pre-release/snapshot/rc variants (EssentialsX#6483) EssentialsX@716a61e Mitigate Discord 429s (EssentialsX#6461) EssentialsX@5a78df5 Add option to allow fishing when afk (EssentialsX#6465) EssentialsX@0845ea6 Fixed NoSuchMethodException Player.getRespawnLocation() (EssentialsX#6460) EssentialsX@08b7fe3 Add PreTransactionEvent (EssentialsX#6370) EssentialsX@f5fc430 fix(fly): persist fly mode and restore on join (EssentialsX#6403) EssentialsX@236ce88 Add /unmute command and broadcast on unmute (EssentialsX#6491) EssentialsX@86621cd Don't enable fly mode on login when player is in water (EssentialsX#6490) EssentialsX@73aa657 Reject Windows reserved filenames in /setwarp (EssentialsX#6487) EssentialsX@00b4a5b Make /flyspeed and /walkspeed force the correct speed type (EssentialsX#6485) EssentialsX@4db09f2 Change default max-nick-length to 16 (EssentialsX#6484) EssentialsX@ddaadf2 Add socialSpyCmdFormat message key for command social spy (EssentialsX#6489) EssentialsX@add5eb7 Add permission cache system + permission for vanish item pickup (EssentialsX#6488) EssentialsX@fb669aa Remove extractUrls from default legacy serializer (EssentialsX#6492) EssentialsX@1038b3a Fix incorrect teleport safety message (EssentialsX#6486) EssentialsX@63e7c4d Bump supported versions to 26.1.2 (EssentialsX#6500) EssentialsX@f39bc91 Fix version parsing for local paper builds (EssentialsX#6501) EssentialsX@7f37b5e Fix minimessage parsing in playerlist keyword replacement (EssentialsX#6505) EssentialsX@678bacf Suppress advancement broadcast for vanished players on Paper (EssentialsX#6513) EssentialsX@e9f3677 Fix /eco ignoring locale-specific decimal separators (EssentialsX#6511) EssentialsX@b594358 Fix VanishStatusChangeEvent NPE and document parameter inversion (EssentialsX#6510) EssentialsX@57a8c59 Fix /time overriding player's /ptime setting (EssentialsX#6509) EssentialsX@3d03cf3 Fix command descriptions not using player's locale (EssentialsX#6508) EssentialsX@936a2c0 Fix SocialSpy local chat color bleeding from player display name (EssentialsX#6507) EssentialsX@97fd560 Fix {USERNAME} underscore escaping in kit items (EssentialsX#6514) EssentialsX@87bde72 Fix consoleName translation key not working (EssentialsX#6506)
1 parent 173321b commit 0cb9c77

19 files changed

Lines changed: 1388 additions & 1072 deletions

.github/workflows/build.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ jobs:
2222
- name: Setup Java
2323
uses: actions/setup-java@v3
2424
with:
25-
java-version: '21'
25+
java-version: '25'
2626
distribution: 'temurin'
2727

2828
- name: Grant execute permission to script

Essentials

Submodule Essentials updated 185 files

patches/plugins/0001-Rebrand.patch

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
1-
From eac7e304a715107a508fcd9ce60bb95ae753ff89 Mon Sep 17 00:00:00 2001
1+
From a81c597e2c7b45b88fec5c3d4d8190190737becc Mon Sep 17 00:00:00 2001
22
From: Bierque Euphyllia <bierque.euphyllia@gmail.com>
3-
Date: Mon, 9 Feb 2026 00:20:05 +0100
4-
Subject: [PATCH 01/14] Rebrand
3+
Date: Sun, 26 Apr 2026 12:51:36 +0200
4+
Subject: [PATCH 01/13] Rebrand
55

66
---
77
Essentials/src/main/resources/plugin.yml | 1 +
@@ -18,7 +18,7 @@ Subject: [PATCH 01/14] Rebrand
1818
11 files changed, 113 insertions(+), 103 deletions(-)
1919

2020
diff --git a/Essentials/src/main/resources/plugin.yml b/Essentials/src/main/resources/plugin.yml
21-
index 844f92319..6081ddfc6 100644
21+
index b18e7f06f..d671422c9 100644
2222
--- a/Essentials/src/main/resources/plugin.yml
2323
+++ b/Essentials/src/main/resources/plugin.yml
2424
@@ -7,6 +7,7 @@ description: Provides an essential, core set of commands for Bukkit.

patches/plugins/0002-Teleport-to-teleportAsync.patch

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
1-
From 8312e388581b24d3972056c7643966cd2ef53433 Mon Sep 17 00:00:00 2001
1+
From 091c12dd80f6d1fdbd821dab741f6328aea0bcad Mon Sep 17 00:00:00 2001
22
From: Bierque Euphyllia <bierque.euphyllia@gmail.com>
3-
Date: Mon, 9 Feb 2026 00:20:18 +0100
4-
Subject: [PATCH 02/14] Teleport to teleportAsync
3+
Date: Sun, 26 Apr 2026 12:51:36 +0200
4+
Subject: [PATCH 02/13] Teleport to teleportAsync
55

66
---
77
.../main/java/com/earth2me/essentials/AsyncTeleport.java | 9 +++++----

patches/plugins/0003-Replace-BukkitRunnable-to-FoliaRunnable.patch

Lines changed: 14 additions & 299 deletions
Original file line numberDiff line numberDiff line change
@@ -1,315 +1,30 @@
1-
From ab1fe38a111dfdfa4bcb01e9dfa7292c199daeed Mon Sep 17 00:00:00 2001
1+
From a93aa52d858b0465fe9b71109dfe310f8b689d88 Mon Sep 17 00:00:00 2001
22
From: Bierque Euphyllia <bierque.euphyllia@gmail.com>
3-
Date: Mon, 9 Feb 2026 00:20:18 +0100
4-
Subject: [PATCH 03/14] Replace BukkitRunnable to FoliaRunnable
3+
Date: Sun, 26 Apr 2026 12:56:15 +0200
4+
Subject: [PATCH 03/13] Replace BukkitRunnable to FoliaRunnable
55

66
---
7-
.../essentials/api/FoliaRunnable.java | 271 ++++++++++++++++++
8-
.../commands/Commandessentials.java | 5 +-
9-
2 files changed, 274 insertions(+), 2 deletions(-)
10-
create mode 100644 Essentials/src/main/java/com/earth2me/essentials/api/FoliaRunnable.java
7+
.../earth2me/essentials/commands/essentials/NyanCommand.java | 5 +++--
8+
1 file changed, 3 insertions(+), 2 deletions(-)
119

12-
diff --git a/Essentials/src/main/java/com/earth2me/essentials/api/FoliaRunnable.java b/Essentials/src/main/java/com/earth2me/essentials/api/FoliaRunnable.java
13-
new file mode 100644
14-
index 000000000..cc2ec820e
15-
--- /dev/null
16-
+++ b/Essentials/src/main/java/com/earth2me/essentials/api/FoliaRunnable.java
17-
@@ -0,0 +1,271 @@
18-
+package com.earth2me.essentials.api;
19-
+
20-
+import io.papermc.paper.threadedregions.scheduler.AsyncScheduler;
21-
+import io.papermc.paper.threadedregions.scheduler.EntityScheduler;
22-
+import io.papermc.paper.threadedregions.scheduler.GlobalRegionScheduler;
23-
+import io.papermc.paper.threadedregions.scheduler.RegionScheduler;
24-
+import io.papermc.paper.threadedregions.scheduler.ScheduledTask;
25-
+import org.bukkit.Location;
26-
+import org.bukkit.World;
27-
+import org.bukkit.plugin.Plugin;
28-
+import org.jetbrains.annotations.NotNull;
29-
+import org.jetbrains.annotations.Nullable;
30-
+import java.util.concurrent.TimeUnit;
31-
+
32-
+/**
33-
+ * A runnable class with both Paper and Folia Support.
34-
+ *
35-
+ * @author Euphyllia
36-
+ * @version 1.9
37-
+ * @since 1.0
38-
+ */
39-
+public abstract class FoliaRunnable implements Runnable {
40-
+
41-
+ private ScheduledTask task;
42-
+ private @Nullable AsyncScheduler asyncScheduler;
43-
+ private @Nullable TimeUnit timeUnit;
44-
+ private @Nullable EntityScheduler entityScheduler;
45-
+ private @Nullable Runnable entityRetired;
46-
+ private @Nullable GlobalRegionScheduler globalRegionScheduler;
47-
+ private @Nullable RegionScheduler regionScheduler;
48-
+ private World world;
49-
+ private int chunkX;
50-
+ private int chunkZ;
51-
+
52-
+ /**
53-
+ * A constructor to build an {@link AsyncScheduler} with a {@link TimeUnit}.
54-
+ *
55-
+ * @param scheduler the {@link AsyncScheduler}
56-
+ * @param timeUnit the {@link TimeUnit}
57-
+ * @since 1.0
58-
+ */
59-
+ public FoliaRunnable(@NotNull final AsyncScheduler scheduler, @Nullable final TimeUnit timeUnit) {
60-
+ this.asyncScheduler = scheduler;
61-
+ this.timeUnit = timeUnit;
62-
+ }
63-
+
64-
+ /**
65-
+ * A constructor to build an entity scheduler.
66-
+ *
67-
+ * @param scheduler the {@link EntityScheduler}
68-
+ * @param retired the {@link Runnable}
69-
+ * @since 1.0
70-
+ */
71-
+ public FoliaRunnable(@NotNull final EntityScheduler scheduler, @Nullable final Runnable retired) {
72-
+ this.entityScheduler = scheduler;
73-
+ this.entityRetired = retired;
74-
+ }
75-
+
76-
+ /**
77-
+ * A constructor for the {@link GlobalRegionScheduler}.
78-
+ *
79-
+ * @param scheduler the {@link GlobalRegionScheduler}
80-
+ * @since 1.0
81-
+ */
82-
+ public FoliaRunnable(@NotNull final GlobalRegionScheduler scheduler) {
83-
+ this.globalRegionScheduler = scheduler;
84-
+ }
85-
+
86-
+ /**
87-
+ * A constructor that builds a {@link Runnable} for the {@link Location}'s region.
88-
+ *
89-
+ * @param scheduler the {@link RegionScheduler} for the {@link Location}
90-
+ * @param location the {@link Location}
91-
+ * @since 1.0
92-
+ */
93-
+ public FoliaRunnable(@NotNull final RegionScheduler scheduler, @NotNull final Location location) {
94-
+ this(scheduler, location.getWorld(), location.getBlockX() >> 4, location.getBlockZ() >> 4);
95-
+ }
96-
+
97-
+ /**
98-
+ * A constructor that builds a {@link Runnable} for the world region.
99-
+ *
100-
+ * @param scheduler the {@link RegionScheduler} for the world
101-
+ * @param world the {@link World}
102-
+ * @param chunkX the chunk's {@link Integer}
103-
+ * @param chunkZ the chunk's {@link Integer}
104-
+ * @since 1.0
105-
+ */
106-
+ public FoliaRunnable(@NotNull final RegionScheduler scheduler, @NotNull final World world, final int chunkX, final int chunkZ) {
107-
+ this.regionScheduler = scheduler;
108-
+ this.world = world;
109-
+ this.chunkX = chunkX;
110-
+ this.chunkZ = chunkZ;
111-
+ }
112-
+
113-
+ /**
114-
+ * Checks if the task is cancelled or not.
115-
+ *
116-
+ * @return true or false
117-
+ * @throws IllegalStateException throws this exception if unable to check
118-
+ * @since 1.0
119-
+ */
120-
+ public final boolean isCancelled() throws IllegalStateException {
121-
+ checkScheduled();
122-
+
123-
+ return this.task.isCancelled();
124-
+ }
125-
+
126-
+ /**
127-
+ * Cancels a task.
128-
+ *
129-
+ * @throws IllegalStateException throws this exception if unable to cancel
130-
+ * @since 1.0
131-
+ */
132-
+ public void cancel() throws IllegalStateException {
133-
+ this.task.cancel();
134-
+ }
135-
+
136-
+ /**
137-
+ * Runs a task immediately supporting Folia/Paper.
138-
+ *
139-
+ * @param plugin the {@link Plugin}
140-
+ * @return true if the task was successfully executed.
141-
+ * @throws IllegalArgumentException throws this exception if it fails
142-
+ * @throws IllegalStateException throws this exception if it is unstable
143-
+ * @since 1.5.6
144-
+ */
145-
+ public final boolean execute(@NotNull final Plugin plugin) throws IllegalArgumentException, IllegalStateException {
146-
+ checkNotYetScheduled();
147-
+
148-
+ if (this.globalRegionScheduler != null) {
149-
+ this.globalRegionScheduler.execute(plugin, this);
150-
+ } else if (this.entityScheduler != null) {
151-
+ return this.entityScheduler.execute(plugin, this, this.entityRetired, 1L);
152-
+ } else if (this.regionScheduler != null) {
153-
+ this.regionScheduler.execute(plugin, this.world, this.chunkX, this.chunkZ, this);
154-
+ } else if (this.asyncScheduler != null) {
155-
+ this.asyncScheduler.runNow(plugin, scheduledTask -> this.run());
156-
+ } else {
157-
+ throw new UnsupportedOperationException("The task type is not supported.");
158-
+ }
159-
+
160-
+ return true;
161-
+ }
162-
+
163-
+ /**
164-
+ * Runs a task on the next tick supporting Folia/Paper.
165-
+ *
166-
+ * @param plugin the {@link Plugin}
167-
+ * @return a scheduled task
168-
+ * @throws IllegalArgumentException throws this exception if it fails
169-
+ * @throws IllegalStateException throws this exception if it is unstable
170-
+ * @since 1.0
171-
+ */
172-
+ public @NotNull final ScheduledTask run(@NotNull final Plugin plugin) throws IllegalArgumentException, IllegalStateException {
173-
+ checkNotYetScheduled();
174-
+
175-
+ if (this.globalRegionScheduler != null) {
176-
+ return setupTask(this.globalRegionScheduler.run(plugin, scheduledTask -> this.run()));
177-
+ } else if (this.entityScheduler != null) {
178-
+ return setupTask(this.entityScheduler.run(plugin, scheduledTask -> this.run(), this.entityRetired));
179-
+ } else if (this.regionScheduler != null) {
180-
+ return setupTask(this.regionScheduler.run(plugin, this.world, this.chunkX, this.chunkZ, scheduledTask -> this.run()));
181-
+ } else if (this.asyncScheduler != null) {
182-
+ return setupTask(this.asyncScheduler.runDelayed(plugin, scheduledTask -> this.run(), 50, TimeUnit.MILLISECONDS));
183-
+ } else {
184-
+ throw new UnsupportedOperationException("The task type is not supported.");
185-
+ }
186-
+ }
187-
+
188-
+ /**
189-
+ * Schedules this to run after the specified number of server ticks.
190-
+ *
191-
+ * @param plugin the reference to the {@link Plugin} scheduling task
192-
+ * @param delay the ticks to wait before running the task
193-
+ * @return a ScheduledTask that contains the id number
194-
+ * @throws IllegalArgumentException if plugin is null
195-
+ * @throws IllegalStateException if this was already scheduled
196-
+ * @since 1.0
197-
+ */
198-
+ public @NotNull final ScheduledTask runDelayed(@NotNull final Plugin plugin, long delay) throws IllegalArgumentException, IllegalStateException {
199-
+ checkNotYetScheduled();
200-
+
201-
+ delay = Math.max(1, delay);
202-
+
203-
+ if (this.globalRegionScheduler != null) {
204-
+ return setupTask(this.globalRegionScheduler.runDelayed(plugin, scheduledTask -> this.run(), delay));
205-
+ } else if (this.entityScheduler != null) {
206-
+ return setupTask(this.entityScheduler.runDelayed(plugin, scheduledTask -> this.run(), this.entityRetired, delay));
207-
+ } else if (this.regionScheduler != null) {
208-
+ return setupTask(this.regionScheduler.runDelayed(plugin, this.world, this.chunkX, this.chunkZ, scheduledTask -> this.run(), delay));
209-
+ } else if (this.asyncScheduler != null && this.timeUnit != null) {
210-
+ return setupTask(this.asyncScheduler.runDelayed(plugin, scheduledTask -> this.run(), delay, this.timeUnit));
211-
+ } else {
212-
+ throw new UnsupportedOperationException("The task type is not supported.");
213-
+ }
214-
+ }
215-
+
216-
+ /**
217-
+ * Schedules this to repeatedly run until cancelled, starting after the
218-
+ * specified number of server ticks.
219-
+ *
220-
+ * @param plugin the reference to the {@link Plugin} scheduling task
221-
+ * @param delay the ticks to wait before running the task
222-
+ * @param period the ticks to wait between runs
223-
+ * @return a ScheduledTask that contains the id number
224-
+ * @throws IllegalArgumentException if plugin is null
225-
+ * @throws IllegalStateException if this was already scheduled
226-
+ * @since 1.0
227-
+ */
228-
+ public @NotNull final ScheduledTask runAtFixedRate(@NotNull final Plugin plugin, long delay, long period) throws IllegalArgumentException, IllegalStateException {
229-
+ checkNotYetScheduled();
230-
+
231-
+ delay = Math.max(1, delay);
232-
+ period = Math.max(1, period);
233-
+
234-
+ if (this.globalRegionScheduler != null) {
235-
+ return setupTask(this.globalRegionScheduler.runAtFixedRate(plugin, scheduledTask -> this.run(), delay, period));
236-
+ } else if (this.entityScheduler != null) {
237-
+ return setupTask(this.entityScheduler.runAtFixedRate(plugin, scheduledTask -> this.run(), this.entityRetired, delay, period));
238-
+ } else if (this.regionScheduler != null) {
239-
+ return setupTask(this.regionScheduler.runAtFixedRate(plugin, this.world, this.chunkX, this.chunkZ, scheduledTask -> this.run(), delay, period));
240-
+ } else if (this.asyncScheduler != null && this.timeUnit != null) {
241-
+ return setupTask(this.asyncScheduler.runAtFixedRate(plugin, scheduledTask -> this.run(), delay, period, this.timeUnit));
242-
+ } else {
243-
+ throw new UnsupportedOperationException("The task type is not supported.");
244-
+ }
245-
+ }
246-
+
247-
+ /**
248-
+ * Gets the task id for this runnable.
249-
+ *
250-
+ * @return the task id that this runnable was scheduled as
251-
+ * @throws IllegalStateException if task was not scheduled yet
252-
+ * @since 1.0
253-
+ */
254-
+ public final int getTaskId() throws IllegalStateException {
255-
+ checkScheduled();
256-
+
257-
+ return this.task.hashCode();
258-
+ }
259-
+
260-
+ /**
261-
+ * Checks scheduled and throws a state exception if null i.e. not scheduled.
262-
+ *
263-
+ * @since 1.0
264-
+ */
265-
+ private void checkScheduled() {
266-
+ if (this.task == null) throw new IllegalStateException("Not scheduled yet");
267-
+ }
268-
+
269-
+ /**
270-
+ * Checks if scheduled and throws an illegal state exception if not null i.e. already scheduled.
271-
+ *
272-
+ * @since 1.0
273-
+ */
274-
+ private void checkNotYetScheduled() {
275-
+ if (this.task != null) throw new IllegalStateException("Already scheduled as " + task.hashCode());
276-
+ }
277-
+
278-
+ /**
279-
+ * Sets up the {@link ScheduledTask}.
280-
+ *
281-
+ * @param task the {@link ScheduledTask} to schedule
282-
+ * @return the {@link ScheduledTask}
283-
+ * @since 1.0
284-
+ */
285-
+ private @NotNull ScheduledTask setupTask(@NotNull final ScheduledTask task) {
286-
+ return this.task = task;
287-
+ }
288-
+}
289-
\ No newline at end of file
290-
diff --git a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandessentials.java b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandessentials.java
291-
index 1eeb6d20b..1efae5e9c 100644
292-
--- a/Essentials/src/main/java/com/earth2me/essentials/commands/Commandessentials.java
293-
+++ b/Essentials/src/main/java/com/earth2me/essentials/commands/Commandessentials.java
294-
@@ -509,7 +509,7 @@ public class Commandessentials extends EssentialsCommand {
10+
diff --git a/Essentials/src/main/java/com/earth2me/essentials/commands/essentials/NyanCommand.java b/Essentials/src/main/java/com/earth2me/essentials/commands/essentials/NyanCommand.java
11+
index 9e42fc503..172b6c331 100644
12+
--- a/Essentials/src/main/java/com/earth2me/essentials/commands/essentials/NyanCommand.java
13+
+++ b/Essentials/src/main/java/com/earth2me/essentials/commands/essentials/NyanCommand.java
14+
@@ -29,10 +29,10 @@ public class NyanCommand extends EssentialsTreeNode {
29515
}
29616

29717
currentTune = new TuneRunnable(NYAN_TUNE, NOTE_HARP, ess::getOnlinePlayers);
29818
- currentTune.runTaskTimer(ess, 20, 2);
29919
+ currentTune.runAtFixedRate(ess, 20, 2); // Euphyllia
30020
}
30121

302-
// Cow farts.
303-
@@ -904,7 +904,7 @@ public class Commandessentials extends EssentialsCommand {
304-
return Collections.emptyList();
305-
}
306-
30722
- private static class TuneRunnable extends BukkitRunnable {
308-
+ private static class TuneRunnable extends com.earth2me.essentials.api.FoliaRunnable { // Euphyllia
23+
+ private static class TuneRunnable extends com.earth2me.essentials.api.FoliaRunnable { // Euphyllia
30924
private static final Map<String, Float> noteMap = ImmutableMap.<String, Float>builder()
310-
.put("1F#", 0.5f)
311-
.put("1G", 0.53f)
312-
@@ -938,6 +938,7 @@ public class Commandessentials extends EssentialsCommand {
25+
.put("1F#", 0.5f)
26+
.put("1G", 0.53f)
27+
@@ -66,6 +66,7 @@ public class NyanCommand extends EssentialsTreeNode {
31328
private int i = 0;
31429

31530
TuneRunnable(final String tuneStr, final Sound sound, final Supplier<Collection<Player>> players) {

0 commit comments

Comments
 (0)