From b470b2cd081e4c9e1ff71dff96c5f05cacb1cb30 Mon Sep 17 00:00:00 2001 From: Etil <81570777+etil2jz@users.noreply.github.com> Date: Wed, 22 Dec 2021 17:12:30 +0100 Subject: [PATCH] Oops --- patches/api/0005-Disable-reload-command.patch | 30 +++++ patches/api/0006-Add-last-tick-time-API.patch | 60 +++++++++ .../api/0007-Optimize-Spigot-event-bus.patch | 47 +++++++ .../api/0008-Default-Purpur-permissions.patch | 119 ++++++++++++++++++ patches/api/0009-World-Instance-Flag.patch | 24 ++++ .../api/0010-Skip-event-if-no-listeners.patch | 53 ++++++++ 6 files changed, 333 insertions(+) create mode 100644 patches/api/0005-Disable-reload-command.patch create mode 100644 patches/api/0006-Add-last-tick-time-API.patch create mode 100644 patches/api/0007-Optimize-Spigot-event-bus.patch create mode 100644 patches/api/0008-Default-Purpur-permissions.patch create mode 100644 patches/api/0009-World-Instance-Flag.patch create mode 100644 patches/api/0010-Skip-event-if-no-listeners.patch diff --git a/patches/api/0005-Disable-reload-command.patch b/patches/api/0005-Disable-reload-command.patch new file mode 100644 index 0000000..a049b6e --- /dev/null +++ b/patches/api/0005-Disable-reload-command.patch @@ -0,0 +1,30 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Etil <81570777+etil2jz@users.noreply.github.com> +Date: Thu, 9 Dec 2021 19:11:14 +0100 +Subject: [PATCH] Disable reload command + +Original code by YatopiaMC, licensed under MIT +You can find the original code on https://github.com/YatopiaMC/Yatopia + +diff --git a/src/main/java/org/bukkit/command/defaults/ReloadCommand.java b/src/main/java/org/bukkit/command/defaults/ReloadCommand.java +index 0c7ba0718de2b93d013968ca0fec34ffd423990f..535800197c43f43c30854d2b193107808dc3b6c7 100644 +--- a/src/main/java/org/bukkit/command/defaults/ReloadCommand.java ++++ b/src/main/java/org/bukkit/command/defaults/ReloadCommand.java +@@ -21,6 +21,17 @@ public class ReloadCommand extends BukkitCommand { + @Override + public boolean execute(@NotNull CommandSender sender, @NotNull String currentAlias, @NotNull String[] args) { // Paper + if (!testPermission(sender)) return true; ++ // Yatopia start - disable reload command ++ if (Boolean.parseBoolean(System.getProperty("Mirai.DisableReloadCommand", "true"))) { ++ sender.sendMessage(ChatColor.RED + "Operation denied."); ++ sender.sendMessage(ChatColor.YELLOW + "Reload command SHOULD NEVER EVER EVER be used in whatever circumstances."); ++ sender.sendMessage(ChatColor.YELLOW + "Mirai has intentionally disabled it in order to stop you using it, instead of restarting your server."); ++ sender.sendMessage(ChatColor.GREEN + "---------------------------------------------"); ++ sender.sendMessage(ChatColor.YELLOW + "RESTART YOUR SERVER AND NEVER USE /reload"); ++ sender.sendMessage(ChatColor.YELLOW + "For plugin developers: learn what a HOTSWAP AGENT is and stop using /reload"); ++ return true; ++ } ++ // Yatopia end + + // Paper start - Reload permissions.yml & require confirm + boolean confirmed = System.getProperty("LetMeReload") != null; diff --git a/patches/api/0006-Add-last-tick-time-API.patch b/patches/api/0006-Add-last-tick-time-API.patch new file mode 100644 index 0000000..e0ed25f --- /dev/null +++ b/patches/api/0006-Add-last-tick-time-API.patch @@ -0,0 +1,60 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Etil <81570777+etil2jz@users.noreply.github.com> +Date: Thu, 9 Dec 2021 19:14:13 +0100 +Subject: [PATCH] Add last tick time API + +Original code by YatopiaMC, licensed under MIT +You can find the original code on https://github.com/YatopiaMC/Yatopia + +diff --git a/src/main/java/org/bukkit/Bukkit.java b/src/main/java/org/bukkit/Bukkit.java +index b7c45aa5d5f79fd16e59401acfa9c2bed0a5d78c..4d6b936f28e1686923696e54275eff67e347dc08 100644 +--- a/src/main/java/org/bukkit/Bukkit.java ++++ b/src/main/java/org/bukkit/Bukkit.java +@@ -2115,6 +2115,16 @@ public final class Bukkit { + return server.isStopping(); + } + ++ // Yatopia start ++ @Deprecated ++ public static long getLastTickMs() { ++ return server.getLastTickMs(); ++ } ++ @NotNull public static java.time.Duration getLastTickTime() { ++ return server.getLastTickTime(); ++ } ++ // Yatopia end ++ + /** + * Returns the {@link com.destroystokyo.paper.entity.ai.MobGoals} manager + * +diff --git a/src/main/java/org/bukkit/Server.java b/src/main/java/org/bukkit/Server.java +index b3b0cea3ed790599b90b98a24aa142875efa1f7b..bf996d38d03e3d9df74d4b917f86dcaea5b7ff8f 100644 +--- a/src/main/java/org/bukkit/Server.java ++++ b/src/main/java/org/bukkit/Server.java +@@ -1851,6 +1851,26 @@ public interface Server extends PluginMessageRecipient, net.kyori.adventure.audi + */ + boolean isStopping(); + ++ // Yatopia start ++ /** ++ * Returns the time the last tick took in milliseconds. ++ * ++ * @return long time value ++ * @deprecated newer method with java's Duration and a possibility to convert it from millis to something else ++ */ ++ @Deprecated ++ default long getLastTickMs() { ++ return getLastTickTime().toMillis(); ++ } ++ /** ++ * Returns the time in {@link java.time.Duration} the last tick took. ++ * ++ * @return duration ++ */ ++ @NotNull ++ java.time.Duration getLastTickTime(); ++ // Yatopia end ++ + /** + * Returns the {@link com.destroystokyo.paper.entity.ai.MobGoals} manager + * diff --git a/patches/api/0007-Optimize-Spigot-event-bus.patch b/patches/api/0007-Optimize-Spigot-event-bus.patch new file mode 100644 index 0000000..dc9e1f4 --- /dev/null +++ b/patches/api/0007-Optimize-Spigot-event-bus.patch @@ -0,0 +1,47 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Etil <81570777+etil2jz@users.noreply.github.com> +Date: Thu, 9 Dec 2021 19:20:40 +0100 +Subject: [PATCH] Optimize Spigot event bus + +Original code by lynxplay, licensed under GNU General Public License v3.0 +You can find the original code on https://github.com/lynxplay/ktp + +diff --git a/src/main/java/org/bukkit/plugin/RegisteredListener.java b/src/main/java/org/bukkit/plugin/RegisteredListener.java +index 419aec56b0e3fa8bcec2ea7f340caa3456b57d00..8530d926931a54ed1300c40cd1e0908b2d9b594d 100644 +--- a/src/main/java/org/bukkit/plugin/RegisteredListener.java ++++ b/src/main/java/org/bukkit/plugin/RegisteredListener.java +@@ -62,8 +62,10 @@ public class RegisteredListener { + * @throws EventException If an event handler throws an exception. + */ + public void callEvent(@NotNull final Event event) throws EventException { +- if (event instanceof Cancellable) { +- if (((Cancellable) event).isCancelled() && isIgnoringCancelled()) { ++ // KTP start - optimize spigot event bus ++ if (isIgnoringCancelled()) { ++ if (event instanceof Cancellable cancellable && cancellable.isCancelled()) { ++ // KTP end - optimize spigot event bus + return; + } + } +diff --git a/src/main/java/org/bukkit/plugin/SimplePluginManager.java b/src/main/java/org/bukkit/plugin/SimplePluginManager.java +index 05bb388407b5bd8a942478237580a38ffaa388c8..bb60356395ef81bd3bbc51ea1e4ca2faaca2bd1b 100644 +--- a/src/main/java/org/bukkit/plugin/SimplePluginManager.java ++++ b/src/main/java/org/bukkit/plugin/SimplePluginManager.java +@@ -612,11 +612,15 @@ public final class SimplePluginManager implements PluginManager { + @Override + public void callEvent(@NotNull Event event) { + // Paper - replace callEvent by merging to below method +- if (event.isAsynchronous() && server.isPrimaryThread()) { ++ // KTP start - optimize spigot event bus ++ final boolean isAsync = event.isAsynchronous(); ++ final boolean isPrimary = server.isPrimaryThread(); // Cache to prevent multiple thread object comparisons. ++ if (isAsync && isPrimary) { + throw new IllegalStateException(event.getEventName() + " may only be triggered asynchronously."); +- } else if (!event.isAsynchronous() && !server.isPrimaryThread() && !server.isStopping() ) { ++ } else if (!isAsync && !isPrimary && !server.isStopping() ) { + throw new IllegalStateException(event.getEventName() + " may only be triggered synchronously."); + } ++ // KTP end - optimize spigot event bus + + HandlerList handlers = event.getHandlers(); + RegisteredListener[] listeners = handlers.getRegisteredListeners(); diff --git a/patches/api/0008-Default-Purpur-permissions.patch b/patches/api/0008-Default-Purpur-permissions.patch new file mode 100644 index 0000000..ecc0996 --- /dev/null +++ b/patches/api/0008-Default-Purpur-permissions.patch @@ -0,0 +1,119 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Etil <81570777+etil2jz@users.noreply.github.com> +Date: Mon, 13 Dec 2021 00:28:15 +0100 +Subject: [PATCH] Default Purpur permissions + +Original code by PurpurMC, licensed under MIT +You can find the original code on https://github.com/PurpurMC/Purpur + +diff --git a/src/main/java/org/bukkit/util/permissions/CommandPermissions.java b/src/main/java/org/bukkit/util/permissions/CommandPermissions.java +index 7763d6101ac61900db1e2310966b99584539fd0e..d5a42707d365ffd72532bbb1a59a1ca7145f9918 100644 +--- a/src/main/java/org/bukkit/util/permissions/CommandPermissions.java ++++ b/src/main/java/org/bukkit/util/permissions/CommandPermissions.java +@@ -18,6 +18,7 @@ public final class CommandPermissions { + DefaultPermissions.registerPermission(PREFIX + "plugins", "Allows the user to view the list of plugins running on this server", PermissionDefault.TRUE, commands); + DefaultPermissions.registerPermission(PREFIX + "reload", "Allows the user to reload the server settings", PermissionDefault.OP, commands); + DefaultPermissions.registerPermission(PREFIX + "version", "Allows the user to view the version of the server", PermissionDefault.TRUE, commands); ++ DefaultPermissions.registerPermission(PREFIX + "purpur", "Allows the user to use the purpur command", PermissionDefault.OP, commands); // Purpur + + commands.recalculatePermissibles(); + return commands; +diff --git a/src/main/java/org/bukkit/util/permissions/DefaultPermissions.java b/src/main/java/org/bukkit/util/permissions/DefaultPermissions.java +index e1a4ddf2c07cdd242fa8054a0152522fe4039e85..8e481e3815f5645ee92f0d229e5ff25c8fc9a6c2 100644 +--- a/src/main/java/org/bukkit/util/permissions/DefaultPermissions.java ++++ b/src/main/java/org/bukkit/util/permissions/DefaultPermissions.java +@@ -89,6 +89,8 @@ public final class DefaultPermissions { + CommandPermissions.registerPermissions(parent); + BroadcastPermissions.registerPermissions(parent); + ++ PurpurPermissions.registerPermissions(); // Purpur ++ + parent.recalculatePermissibles(); + } + } +diff --git a/src/main/java/org/bukkit/util/permissions/PurpurPermissions.java b/src/main/java/org/bukkit/util/permissions/PurpurPermissions.java +new file mode 100644 +index 0000000000000000000000000000000000000000..efef6b099202717d2b53316028dc6dfb0e5f01ec +--- /dev/null ++++ b/src/main/java/org/bukkit/util/permissions/PurpurPermissions.java +@@ -0,0 +1,79 @@ ++package org.bukkit.util.permissions; ++ ++import org.bukkit.entity.Entity; ++import org.bukkit.entity.EntityType; ++import org.bukkit.entity.Mob; ++import org.bukkit.permissions.Permission; ++import org.bukkit.permissions.PermissionDefault; ++import org.jetbrains.annotations.NotNull; ++ ++import java.util.HashSet; ++import java.util.Set; ++ ++public final class PurpurPermissions { ++ private static final String ROOT = "purpur"; ++ private static final String PREFIX = ROOT + "."; ++ private static final Set mobs = new HashSet<>(); ++ ++ static { ++ for (EntityType mob : EntityType.values()) { ++ Class clazz = mob.getEntityClass(); ++ if (clazz != null && Mob.class.isAssignableFrom(clazz)) { ++ mobs.add(mob.getName()); ++ } ++ } ++ } ++ ++ @NotNull ++ public static Permission registerPermissions() { ++ Permission purpur = DefaultPermissions.registerPermission(ROOT, "Gives the user the ability to use all Purpur utilities and commands", PermissionDefault.FALSE); ++ ++ DefaultPermissions.registerPermission(PREFIX + "enderchest.rows.six", "Gives the user six rows of enderchest space", PermissionDefault.FALSE, purpur); ++ DefaultPermissions.registerPermission(PREFIX + "enderchest.rows.five", "Gives the user five rows of enderchest space", PermissionDefault.FALSE, purpur); ++ DefaultPermissions.registerPermission(PREFIX + "enderchest.rows.four", "Gives the user four rows of enderchest space", PermissionDefault.FALSE, purpur); ++ DefaultPermissions.registerPermission(PREFIX + "enderchest.rows.three", "Gives the user three rows of enderchest space", PermissionDefault.FALSE, purpur); ++ DefaultPermissions.registerPermission(PREFIX + "enderchest.rows.two", "Gives the user two rows of enderchest space", PermissionDefault.FALSE, purpur); ++ DefaultPermissions.registerPermission(PREFIX + "enderchest.rows.one", "Gives the user one row of enderchest space", PermissionDefault.FALSE, purpur); ++ ++ DefaultPermissions.registerPermission(PREFIX + "debug.f3n", "Allows the user to use F3+N keybind to swap gamemodes", PermissionDefault.FALSE, purpur); ++ DefaultPermissions.registerPermission(PREFIX + "joinfullserver", "Allows the user to join a full server", PermissionDefault.OP, purpur); ++ ++ DefaultPermissions.registerPermission(PREFIX + "drop.spawner", "Allows the user to drop spawner cage when broken with diamond pickaxe with silk touch", PermissionDefault.FALSE, purpur); ++ DefaultPermissions.registerPermission(PREFIX + "place.spawner", "Allows the user to place spawner cage in the world", PermissionDefault.FALSE, purpur); ++ ++ DefaultPermissions.registerPermission(PREFIX + "anvil.color", "Allows the user to use color codes on anvils", PermissionDefault.FALSE, purpur); ++ ++ Permission book = DefaultPermissions.registerPermission(PREFIX + "book", "Allows the user to use color codes on books", PermissionDefault.FALSE, purpur); ++ DefaultPermissions.registerPermission(PREFIX + "book.color.edit", "Allows the user to use color codes on books when editing", PermissionDefault.FALSE, book); ++ DefaultPermissions.registerPermission(PREFIX + "book.color.sign", "Allows the user to use color codes on books when signing", PermissionDefault.FALSE, book); ++ book.recalculatePermissibles(); ++ ++ Permission sign = DefaultPermissions.registerPermission(PREFIX + "sign", "Allows the user to use all sign abilities", PermissionDefault.FALSE, purpur); ++ DefaultPermissions.registerPermission(PREFIX + "sign.edit", "Allows the user to click signs to open sign editor", PermissionDefault.FALSE, sign); ++ DefaultPermissions.registerPermission(PREFIX + "sign.color", "Allows the user to use color codes on signs", PermissionDefault.FALSE, sign); ++ DefaultPermissions.registerPermission(PREFIX + "sign.style", "Allows the user to use style codes on signs", PermissionDefault.FALSE, sign); ++ DefaultPermissions.registerPermission(PREFIX + "sign.magic", "Allows the user to use magic/obfuscate code on signs", PermissionDefault.FALSE, sign); ++ sign.recalculatePermissibles(); ++ ++ Permission ride = DefaultPermissions.registerPermission("allow.ride", "Allows the user to ride all mobs", PermissionDefault.FALSE, purpur); ++ for (String mob : mobs) { ++ DefaultPermissions.registerPermission("allow.ride." + mob, "Allows the user to ride " + mob, PermissionDefault.FALSE, ride); ++ } ++ ride.recalculatePermissibles(); ++ ++ Permission special = DefaultPermissions.registerPermission("allow.special", "Allows the user to use all mobs special abilities", PermissionDefault.FALSE, purpur); ++ for (String mob : mobs) { ++ DefaultPermissions.registerPermission("allow.special." + mob, "Allows the user to use " + mob + " special ability", PermissionDefault.FALSE, special); ++ } ++ special.recalculatePermissibles(); ++ ++ Permission powered = DefaultPermissions.registerPermission("allow.powered", "Allows the user to toggle all mobs powered state", PermissionDefault.FALSE, purpur); ++ DefaultPermissions.registerPermission("allow.powered.creeper", "Allows the user to toggle creeper powered state", PermissionDefault.FALSE, powered); ++ powered.recalculatePermissibles(); ++ ++ DefaultPermissions.registerPermission(PREFIX + "portal.instant", "Allows the user to bypass portal wait time", PermissionDefault.FALSE, purpur); ++ ++ purpur.recalculatePermissibles(); ++ return purpur; ++ } ++} +\ No newline at end of file diff --git a/patches/api/0009-World-Instance-Flag.patch b/patches/api/0009-World-Instance-Flag.patch new file mode 100644 index 0000000..9530aae --- /dev/null +++ b/patches/api/0009-World-Instance-Flag.patch @@ -0,0 +1,24 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Etil <81570777+etil2jz@users.noreply.github.com> +Date: Mon, 13 Dec 2021 19:10:14 +0100 +Subject: [PATCH] World Instance Flag + +Original code by Cryptite, licensed under MIT +You can find the original code on https://github.com/Cryptite/Slice + +diff --git a/src/main/java/org/bukkit/World.java b/src/main/java/org/bukkit/World.java +index 1f8a51897d9de00f0004ab1de479198390483f7d..306aba5984872ec930ffb69d60c11475a089b7a5 100644 +--- a/src/main/java/org/bukkit/World.java ++++ b/src/main/java/org/bukkit/World.java +@@ -2606,6 +2606,11 @@ public interface World extends RegionAccessor, WorldInfo, PluginMessageRecipient + */ + public void setAutoSave(boolean value); + ++ // Slice start ++ public boolean isInstance(); ++ public void setInstance(boolean value); ++ // Slice end ++ + /** + * Sets the Difficulty of the world. + * diff --git a/patches/api/0010-Skip-event-if-no-listeners.patch b/patches/api/0010-Skip-event-if-no-listeners.patch new file mode 100644 index 0000000..2086c5e --- /dev/null +++ b/patches/api/0010-Skip-event-if-no-listeners.patch @@ -0,0 +1,53 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Etil <81570777+etil2jz@users.noreply.github.com> +Date: Sun, 19 Dec 2021 22:34:04 +0100 +Subject: [PATCH] Skip event if no listeners + +Original code by Titaniumtown, licensed under GNU General Public License v3.0 +You can find the original code on https://gitlab.com/Titaniumtown/JettPack + +diff --git a/build.gradle.kts b/build.gradle.kts +index 1d5e05ab5c3c2ba206f52e8743163663490861ab..7e3eb41269da9ba5998877eef56831f0b1823b6b 100644 +--- a/build.gradle.kts ++++ b/build.gradle.kts +@@ -26,9 +26,9 @@ dependencies { + // api dependencies are listed transitively to API consumers + api("commons-lang:commons-lang:2.6") + api("com.google.guava:guava:31.0.1-jre") +- api("com.google.code.gson:gson:2.8.8") ++ api("com.google.code.gson:gson:2.8.9") + api("net.md-5:bungeecord-chat:1.16-R0.4") +- api("org.yaml:snakeyaml:1.28") ++ api("org.yaml:snakeyaml:1.29") + // Paper start + api("com.googlecode.json-simple:json-simple:1.1.1") { + isTransitive = false // includes junit +diff --git a/src/main/java/org/bukkit/plugin/SimplePluginManager.java b/src/main/java/org/bukkit/plugin/SimplePluginManager.java +index bb60356395ef81bd3bbc51ea1e4ca2faaca2bd1b..9813932164ecadbb5889d5d26bdd3a9947436f48 100644 +--- a/src/main/java/org/bukkit/plugin/SimplePluginManager.java ++++ b/src/main/java/org/bukkit/plugin/SimplePluginManager.java +@@ -611,6 +611,13 @@ public final class SimplePluginManager implements PluginManager { + */ + @Override + public void callEvent(@NotNull Event event) { ++ // JettPack start ++ HandlerList handlers = event.getHandlers(); ++ RegisteredListener[] listeners = handlers.getRegisteredListeners(); ++ if (listeners.length == 0) { ++ return; ++ } ++ // JettPack end + // Paper - replace callEvent by merging to below method + // KTP start - optimize spigot event bus + final boolean isAsync = event.isAsynchronous(); +@@ -622,8 +629,8 @@ public final class SimplePluginManager implements PluginManager { + } + // KTP end - optimize spigot event bus + +- HandlerList handlers = event.getHandlers(); +- RegisteredListener[] listeners = handlers.getRegisteredListeners(); ++ //HandlerList handlers = event.getHandlers(); ++ //RegisteredListener[] listeners = handlers.getRegisteredListeners(); + + for (RegisteredListener registration : listeners) { + if (!registration.getPlugin().isEnabled()) {