From c639a52a69d7f571a383aa4770113b24fd023ee5 Mon Sep 17 00:00:00 2001 From: Connor Linfoot Date: Sun, 16 May 2021 21:09:46 +0100 Subject: [PATCH] Add basic Datapack API (#5653) (#5653) --- .../0300-Add-basic-Datapack-API.patch | 106 +++++++++++ .../0731-Add-basic-Datapack-API.patch | 175 ++++++++++++++++++ 2 files changed, 281 insertions(+) create mode 100644 Spigot-API-Patches/0300-Add-basic-Datapack-API.patch create mode 100644 Spigot-Server-Patches/0731-Add-basic-Datapack-API.patch diff --git a/Spigot-API-Patches/0300-Add-basic-Datapack-API.patch b/Spigot-API-Patches/0300-Add-basic-Datapack-API.patch new file mode 100644 index 000000000..fb5231421 --- /dev/null +++ b/Spigot-API-Patches/0300-Add-basic-Datapack-API.patch @@ -0,0 +1,106 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Connor Linfoot +Date: Sun, 16 May 2021 15:07:34 +0100 +Subject: [PATCH] Add basic Datapack API + + +diff --git a/src/main/java/io/papermc/paper/resource/Datapack.java b/src/main/java/io/papermc/paper/resource/Datapack.java +new file mode 100644 +index 0000000000000000000000000000000000000000..5233057bf1ee10da28d7c3b9c36665616650b1ea +--- /dev/null ++++ b/src/main/java/io/papermc/paper/resource/Datapack.java +@@ -0,0 +1,32 @@ ++package io.papermc.paper.resource; ++ ++import org.checkerframework.checker.nullness.qual.NonNull; ++ ++public interface Datapack { ++ ++ /** ++ * @return the name of the pack ++ */ ++ @NonNull ++ String getName(); ++ ++ /** ++ * @return the compatibility of the pack ++ */ ++ @NonNull ++ Compatibility getCompatibility(); ++ ++ /** ++ * @return whether or not the pack is currently enabled ++ */ ++ boolean isEnabled(); ++ ++ void setEnabled(boolean enabled); ++ ++ enum Compatibility { ++ TOO_OLD, ++ TOO_NEW, ++ COMPATIBLE, ++ } ++ ++} +diff --git a/src/main/java/io/papermc/paper/resource/DatapackManager.java b/src/main/java/io/papermc/paper/resource/DatapackManager.java +new file mode 100644 +index 0000000000000000000000000000000000000000..b404e1a0d0afbf6297cc0c2623696fac26bcbc08 +--- /dev/null ++++ b/src/main/java/io/papermc/paper/resource/DatapackManager.java +@@ -0,0 +1,21 @@ ++package io.papermc.paper.resource; ++ ++import org.checkerframework.checker.nullness.qual.NonNull; ++ ++import java.util.Collection; ++ ++public interface DatapackManager { ++ ++ /** ++ * @return all the packs known to the server ++ */ ++ @NonNull ++ Collection getPacks(); ++ ++ /** ++ * @return all the packs which are currently enabled ++ */ ++ @NonNull ++ Collection getEnabledPacks(); ++ ++} +diff --git a/src/main/java/org/bukkit/Bukkit.java b/src/main/java/org/bukkit/Bukkit.java +index 5f7208196684d9c8373df28b7cfb5f9e21baa41e..bd834cd9b1d05327da195b76719e90ac14943dbb 100644 +--- a/src/main/java/org/bukkit/Bukkit.java ++++ b/src/main/java/org/bukkit/Bukkit.java +@@ -1937,6 +1937,14 @@ public final class Bukkit { + public static com.destroystokyo.paper.entity.ai.MobGoals getMobGoals() { + return server.getMobGoals(); + } ++ ++ /** ++ * @return the resource pack manager ++ */ ++ @NotNull ++ public static io.papermc.paper.resource.DatapackManager getDatapackManager() { ++ return server.getDatapackManager(); ++ } + // Paper end + + @NotNull +diff --git a/src/main/java/org/bukkit/Server.java b/src/main/java/org/bukkit/Server.java +index f3e27d2d02a9407bb1b091b8c1125ad5abf99e55..5f2b9a91b03a3e8b2dc5ce7743e31bea882500e4 100644 +--- a/src/main/java/org/bukkit/Server.java ++++ b/src/main/java/org/bukkit/Server.java +@@ -1698,5 +1698,11 @@ public interface Server extends PluginMessageRecipient, net.kyori.adventure.audi + */ + @NotNull + com.destroystokyo.paper.entity.ai.MobGoals getMobGoals(); ++ ++ /** ++ * @return the resource pack manager ++ */ ++ @NotNull ++ io.papermc.paper.resource.DatapackManager getDatapackManager(); + // Paper end + } diff --git a/Spigot-Server-Patches/0731-Add-basic-Datapack-API.patch b/Spigot-Server-Patches/0731-Add-basic-Datapack-API.patch new file mode 100644 index 000000000..3065774b4 --- /dev/null +++ b/Spigot-Server-Patches/0731-Add-basic-Datapack-API.patch @@ -0,0 +1,175 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Connor Linfoot +Date: Sun, 16 May 2021 15:07:34 +0100 +Subject: [PATCH] Add basic Datapack API + + +diff --git a/src/main/java/io/papermc/paper/resource/PaperDatapack.java b/src/main/java/io/papermc/paper/resource/PaperDatapack.java +new file mode 100644 +index 0000000000000000000000000000000000000000..3108efce8657db84329eceae43a10532f3d1f8d9 +--- /dev/null ++++ b/src/main/java/io/papermc/paper/resource/PaperDatapack.java +@@ -0,0 +1,51 @@ ++package io.papermc.paper.resource; ++ ++import io.papermc.paper.event.server.ServerResourcesReloadedEvent; ++import net.minecraft.server.MinecraftServer; ++import net.minecraft.server.packs.repository.ResourcePackLoader; ++ ++import java.util.List; ++import java.util.stream.Collectors; ++ ++public class PaperDatapack implements Datapack { ++ private final String name; ++ private final Compatibility compatibility; ++ private final boolean enabled; ++ ++ PaperDatapack(ResourcePackLoader loader, boolean enabled) { ++ this.name = loader.getName(); ++ this.compatibility = Compatibility.valueOf(loader.getVersion().name()); ++ this.enabled = enabled; ++ } ++ ++ @Override ++ public String getName() { ++ return name; ++ } ++ ++ @Override ++ public Compatibility getCompatibility() { ++ return compatibility; ++ } ++ ++ @Override ++ public boolean isEnabled() { ++ return enabled; ++ } ++ ++ @Override ++ public void setEnabled(boolean enabled) { ++ if (enabled == this.enabled) { ++ return; ++ } ++ ++ MinecraftServer server = MinecraftServer.getServer(); ++ List enabledKeys = server.getResourcePackRepository().getEnabledPacks().stream().map(ResourcePackLoader::getName).collect(Collectors.toList()); ++ if (enabled) { ++ enabledKeys.add(this.name); ++ } else { ++ enabledKeys.remove(this.name); ++ } ++ server.reloadServerResources(enabledKeys, ServerResourcesReloadedEvent.Cause.PLUGIN); ++ } ++} +diff --git a/src/main/java/io/papermc/paper/resource/PaperDatapackManager.java b/src/main/java/io/papermc/paper/resource/PaperDatapackManager.java +new file mode 100644 +index 0000000000000000000000000000000000000000..5c4858dfc5a416c88c1dedca5d59ee72dd8aa0ca +--- /dev/null ++++ b/src/main/java/io/papermc/paper/resource/PaperDatapackManager.java +@@ -0,0 +1,26 @@ ++package io.papermc.paper.resource; ++ ++import net.minecraft.server.packs.repository.ResourcePackLoader; ++import net.minecraft.server.packs.repository.ResourcePackRepository; ++ ++import java.util.Collection; ++import java.util.stream.Collectors; ++ ++public class PaperDatapackManager implements DatapackManager { ++ private final ResourcePackRepository repository; ++ ++ public PaperDatapackManager(ResourcePackRepository repository) { ++ this.repository = repository; ++ } ++ ++ @Override ++ public Collection getPacks() { ++ Collection enabledPacks = repository.getEnabledPacks(); ++ return repository.getPacks().stream().map(loader -> new PaperDatapack(loader, enabledPacks.contains(loader))).collect(Collectors.toList()); ++ } ++ ++ @Override ++ public Collection getEnabledPacks() { ++ return repository.getEnabledPacks().stream().map(loader -> new PaperDatapack(loader, true)).collect(Collectors.toList()); ++ } ++} +diff --git a/src/main/java/net/minecraft/server/packs/repository/ResourcePackLoader.java b/src/main/java/net/minecraft/server/packs/repository/ResourcePackLoader.java +index 5c038c02955d8517db0686f3b73c8573d3770466..01c4fda33a138b2d1f6b7c1335378445423a66a9 100644 +--- a/src/main/java/net/minecraft/server/packs/repository/ResourcePackLoader.java ++++ b/src/main/java/net/minecraft/server/packs/repository/ResourcePackLoader.java +@@ -102,6 +102,7 @@ public class ResourcePackLoader implements AutoCloseable { + }); + } + ++ public final EnumResourcePackVersion getVersion() { return this.c(); } // Paper - OBFHELPER + public EnumResourcePackVersion c() { + return this.g; + } +@@ -110,6 +111,7 @@ public class ResourcePackLoader implements AutoCloseable { + return (IResourcePack) this.d.get(); + } + ++ public final String getName() { return this.e(); } // Paper - OBFHELPER + public String e() { + return this.c; + } +diff --git a/src/main/java/net/minecraft/server/packs/repository/ResourcePackRepository.java b/src/main/java/net/minecraft/server/packs/repository/ResourcePackRepository.java +index e87523612d0423d71eab7b9af851c1c268cdf84f..568da9686c41a41e43ede3fe15e0ca53c9688f8b 100644 +--- a/src/main/java/net/minecraft/server/packs/repository/ResourcePackRepository.java ++++ b/src/main/java/net/minecraft/server/packs/repository/ResourcePackRepository.java +@@ -88,6 +88,7 @@ public class ResourcePackRepository implements AutoCloseable { + return this.b.keySet(); + } + ++ public final Collection getPacks() { return this.c(); } // Paper - OBFHELPER + public Collection c() { + return this.b.values(); + } +@@ -96,6 +97,7 @@ public class ResourcePackRepository implements AutoCloseable { + return (Collection) this.c.stream().map(ResourcePackLoader::e).collect(ImmutableSet.toImmutableSet()); + } + ++ public final Collection getEnabledPacks() { return this.e(); } // Paper - OBFHELPER + public Collection e() { + return this.c; + } +diff --git a/src/main/java/org/bukkit/craftbukkit/CraftServer.java b/src/main/java/org/bukkit/craftbukkit/CraftServer.java +index 6cc8eb04f42592aa12f76bb4a0a863ea509741b2..554d13d65952af1b98db074ebc4a2d90474029f6 100644 +--- a/src/main/java/org/bukkit/craftbukkit/CraftServer.java ++++ b/src/main/java/org/bukkit/craftbukkit/CraftServer.java +@@ -18,6 +18,7 @@ import com.mojang.serialization.Lifecycle; + import io.netty.buffer.ByteBuf; + import io.netty.buffer.ByteBufOutputStream; + import io.netty.buffer.Unpooled; ++import io.papermc.paper.resource.PaperDatapackManager; // Paper + import io.papermc.paper.util.TraceUtil; + import it.unimi.dsi.fastutil.objects.Object2ObjectLinkedOpenHashMap; + import java.awt.image.BufferedImage; +@@ -268,6 +269,7 @@ public final class CraftServer implements Server { + public boolean ignoreVanillaPermissions = false; + private final List playerView; + public int reloadCount; ++ private final PaperDatapackManager datapackManager; // Paper + public static Exception excessiveVelEx; // Paper - Velocity warnings + + static { +@@ -350,6 +352,7 @@ public final class CraftServer implements Server { + TicketType.PLUGIN.loadPeriod = Math.min(20, configuration.getInt("chunk-gc.period-in-ticks")); // Paper - cap plugin loads to 1 second + minimumAPI = configuration.getString("settings.minimum-api"); + loadIcon(); ++ datapackManager = new PaperDatapackManager(console.getResourcePackRepository()); // Paper + } + + public boolean getCommandBlockOverride(String command) { +@@ -2498,5 +2501,11 @@ public final class CraftServer implements Server { + public com.destroystokyo.paper.entity.ai.MobGoals getMobGoals() { + return mobGoals; + } ++ ++ @Override ++ public PaperDatapackManager getDatapackManager() { ++ return datapackManager; ++ } ++ + // Paper end + }