diff --git a/paper-api/src/main/java/org/bukkit/Bukkit.java b/paper-api/src/main/java/org/bukkit/Bukkit.java index 5a884154a1..653dffc6c7 100644 --- a/paper-api/src/main/java/org/bukkit/Bukkit.java +++ b/paper-api/src/main/java/org/bukkit/Bukkit.java @@ -41,6 +41,7 @@ import org.bukkit.inventory.Recipe; import org.bukkit.inventory.meta.ItemMeta; import org.bukkit.loot.LootTable; import org.bukkit.map.MapView; +import org.bukkit.packs.DataPackManager; import org.bukkit.permissions.Permissible; import org.bukkit.plugin.PluginManager; import org.bukkit.plugin.ServicesManager; @@ -248,6 +249,26 @@ public final class Bukkit { return server.getAllowNether(); } + @NotNull + public static List getInitialEnabledPacks() { + return server.getInitialEnabledPacks(); + } + + @NotNull + public static List getInitialDisabledPacks() { + return server.getInitialDisabledPacks(); + } + + /** + * Get the DataPack Manager. + * + * @return the manager + */ + @NotNull + public static DataPackManager getDataPackManager() { + return server.getDataPackManager(); + } + /** * Gets the server resource pack uri, or empty string if not specified. * diff --git a/paper-api/src/main/java/org/bukkit/FeatureFlag.java b/paper-api/src/main/java/org/bukkit/FeatureFlag.java new file mode 100644 index 0000000000..3b11344b3d --- /dev/null +++ b/paper-api/src/main/java/org/bukkit/FeatureFlag.java @@ -0,0 +1,21 @@ +package org.bukkit; + +import org.jetbrains.annotations.ApiStatus; + +/** + * This represents a Feature Flag for a World. + */ +@ApiStatus.Experimental +public interface FeatureFlag extends Keyed { + + public static final FeatureFlag VANILLA = Bukkit.getUnsafe().getFeatureFlag(NamespacedKey.minecraft("vanilla")); + + @MinecraftExperimental + public static final FeatureFlag BUNDLE = Bukkit.getUnsafe().getFeatureFlag(NamespacedKey.minecraft("bundle")); + + /** + * AVAILABLE BETWEEN VERSIONS: 1.19 - 1.19.4 + */ + @MinecraftExperimental + public static final FeatureFlag UPDATE_1_20 = Bukkit.getUnsafe().getFeatureFlag(NamespacedKey.minecraft("update_1_20")); +} diff --git a/paper-api/src/main/java/org/bukkit/Material.java b/paper-api/src/main/java/org/bukkit/Material.java index 0d04591db6..444c0d9807 100644 --- a/paper-api/src/main/java/org/bukkit/Material.java +++ b/paper-api/src/main/java/org/bukkit/Material.java @@ -11061,4 +11061,14 @@ public enum Material implements Keyed, Translatable { public String getItemTranslationKey() { return Bukkit.getUnsafe().getItemTranslationKey(this); } + + /** + * Gets if the Material is enabled by the features in a world. + * + * @param world the world to check + * @return true if this material can be used in this World. + */ + public boolean isEnabledByFeature(@NotNull World world) { + return Bukkit.getDataPackManager().isEnabledByFeature(this, world); + } } diff --git a/paper-api/src/main/java/org/bukkit/Server.java b/paper-api/src/main/java/org/bukkit/Server.java index ac380d4f41..b95dc5c431 100644 --- a/paper-api/src/main/java/org/bukkit/Server.java +++ b/paper-api/src/main/java/org/bukkit/Server.java @@ -41,6 +41,7 @@ import org.bukkit.inventory.Recipe; import org.bukkit.inventory.meta.ItemMeta; import org.bukkit.loot.LootTable; import org.bukkit.map.MapView; +import org.bukkit.packs.DataPackManager; import org.bukkit.permissions.Permissible; import org.bukkit.plugin.PluginManager; import org.bukkit.plugin.ServicesManager; @@ -205,6 +206,30 @@ public interface Server extends PluginMessageRecipient { */ public boolean getAllowNether(); + /** + * Gets a list of packs to be enabled. + * + * @return a list of packs names + */ + @NotNull + public List getInitialEnabledPacks(); + + /** + * Gets a list of packs that will not be enabled automatically. + * + * @return a list of packs names + */ + @NotNull + public List getInitialDisabledPacks(); + + /** + * Get the DataPack Manager. + * + * @return the manager + */ + @NotNull + public DataPackManager getDataPackManager(); + /** * Gets the server resource pack uri, or empty string if not specified. * diff --git a/paper-api/src/main/java/org/bukkit/UnsafeValues.java b/paper-api/src/main/java/org/bukkit/UnsafeValues.java index ba69db36a2..650adcecdc 100644 --- a/paper-api/src/main/java/org/bukkit/UnsafeValues.java +++ b/paper-api/src/main/java/org/bukkit/UnsafeValues.java @@ -12,6 +12,8 @@ import org.bukkit.inventory.ItemStack; import org.bukkit.material.MaterialData; import org.bukkit.plugin.InvalidPluginException; import org.bukkit.plugin.PluginDescriptionFile; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; /** * This interface provides value conversions that may be specific to a @@ -87,4 +89,7 @@ public interface UnsafeValues { String getTranslationKey(EntityType entityType); String getTranslationKey(ItemStack itemStack); + + @Nullable + FeatureFlag getFeatureFlag(@NotNull NamespacedKey key); } diff --git a/paper-api/src/main/java/org/bukkit/World.java b/paper-api/src/main/java/org/bukkit/World.java index 8ac2339eb2..be376fa714 100644 --- a/paper-api/src/main/java/org/bukkit/World.java +++ b/paper-api/src/main/java/org/bukkit/World.java @@ -5,6 +5,7 @@ import java.util.Collection; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Set; import java.util.function.Predicate; import org.bukkit.block.Biome; import org.bukkit.block.Block; @@ -2670,6 +2671,14 @@ public interface World extends RegionAccessor, WorldInfo, PluginMessageRecipient @Nullable public DragonBattle getEnderDragonBattle(); + /** + * Get all {@link FeatureFlag} enabled in this world. + * + * @return all enabled {@link FeatureFlag} + */ + @NotNull + public Set getFeatureFlags(); + /** * Represents various map environment types that a world may be */ diff --git a/paper-api/src/main/java/org/bukkit/entity/EntityType.java b/paper-api/src/main/java/org/bukkit/entity/EntityType.java index bed9c519a5..16f1ed5bda 100644 --- a/paper-api/src/main/java/org/bukkit/entity/EntityType.java +++ b/paper-api/src/main/java/org/bukkit/entity/EntityType.java @@ -444,4 +444,14 @@ public enum EntityType implements Keyed, Translatable { public String getTranslationKey() { return Bukkit.getUnsafe().getTranslationKey(this); } + + /** + * Gets if this EntityType is enabled by feature in a world. + * + * @param world the world to check + * @return true if this EntityType can be used to spawn an Entity for this World. + */ + public boolean isEnabledByFeature(@NotNull World world) { + return Bukkit.getDataPackManager().isEnabledByFeature(this, world); + } } diff --git a/paper-api/src/main/java/org/bukkit/packs/DataPack.java b/paper-api/src/main/java/org/bukkit/packs/DataPack.java new file mode 100644 index 0000000000..744d8c055b --- /dev/null +++ b/paper-api/src/main/java/org/bukkit/packs/DataPack.java @@ -0,0 +1,107 @@ +package org.bukkit.packs; + +import java.util.Set; +import org.bukkit.FeatureFlag; +import org.bukkit.Keyed; +import org.jetbrains.annotations.ApiStatus; +import org.jetbrains.annotations.NotNull; + +/** + * Represents a data pack. + */ +@ApiStatus.Experimental +public interface DataPack extends Keyed { + + /** + * Gets the title of the data pack. + * + * @return the title + */ + @NotNull + public String getTitle(); + + /** + * Gets the description of the data pack. + * + * @return the description + */ + @NotNull + public String getDescription(); + + /** + * Gets the pack version. + *
+ * This is related to the server version to work. + * + * @return the pack version + */ + public int getPackFormat(); + + /** + * Gets if the data pack is enabled on the server. + * + * @return True if is enabled + */ + public boolean isEnabled(); + + /** + * Gets if the data pack is required on the server. + * + * @return True if is required + */ + public boolean isRequired(); + + /** + * Gets the compatibility of this data pack with the server. + * + * @return an enum + */ + @NotNull + public Compatibility getCompatibility(); + + /** + * Gets a set of features requested by this data pack. + * + * @return a set of features + */ + @NotNull + public Set getRequestedFeatures(); + + /** + * Gets the source of this data pack. + * + * @return the source + */ + @NotNull + public Source getSource(); + + /** + * Show the compatibility of the data pack with the server. + */ + public enum Compatibility { + + /** + * It's newer than the server pack version. + */ + NEW, + /** + * It's older than the server pack version. + */ + OLD, + /** + * Its compatible with the server pack version. + */ + COMPATIBLE; + } + + /** + * Represent the source of a data pack. + */ + public enum Source { + DEFAULT, + BUILT_IN, + FEATURE, + WORLD, + SERVER; + } +} diff --git a/paper-api/src/main/java/org/bukkit/packs/DataPackManager.java b/paper-api/src/main/java/org/bukkit/packs/DataPackManager.java new file mode 100644 index 0000000000..d7fb6310e6 --- /dev/null +++ b/paper-api/src/main/java/org/bukkit/packs/DataPackManager.java @@ -0,0 +1,70 @@ +package org.bukkit.packs; + +import java.util.Collection; +import org.bukkit.Material; +import org.bukkit.NamespacedKey; +import org.bukkit.World; +import org.bukkit.entity.EntityType; +import org.jetbrains.annotations.ApiStatus; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +/** + * Manager of data packs. + */ +@ApiStatus.Experimental +public interface DataPackManager { + + /** + * Return all the available {@link DataPack}s on the server. + * + * @return a Collection of {@link DataPack} + */ + @NotNull + public Collection getDataPacks(); + + /** + * Gets a {@link DataPack} by its key. + * + * @param dataPackKey the key of the {@link DataPack} + * @return the {@link DataPack} or null if it does not exist + */ + @Nullable + public DataPack getDataPack(@NotNull NamespacedKey dataPackKey); + + /** + * Return all the enabled {@link DataPack} in the World. + * + * @param world the world to search + * @return a Collection of {@link DataPack} + */ + @NotNull + public Collection getEnabledDataPacks(@NotNull World world); + + /** + * Return all the disabled {@link DataPack} in the World. + * + * @param world the world to search + * @return a Collection of {@link DataPack} + */ + @NotNull + public Collection getDisabledDataPacks(@NotNull World world); + + /** + * Gets if the Material is enabled for use by the features in World. + * + * @param material Material to check (needs to be an {@link Material#isItem()} or {@link Material#isBlock()}) + * @param world World to check + * @return {@code True} if the Item/Block related to the material is enabled + */ + public boolean isEnabledByFeature(@NotNull Material material, @NotNull World world); + + /** + * Gets if the EntityType is enabled for use by the Features in World. + * + * @param entityType EntityType to check + * @param world World to check + * @return {@code True} if the type of entity is enabled + */ + public boolean isEnabledByFeature(@NotNull EntityType entityType, @NotNull World world); +} diff --git a/paper-api/src/main/java/org/bukkit/packs/package-info.java b/paper-api/src/main/java/org/bukkit/packs/package-info.java new file mode 100644 index 0000000000..90a767b89a --- /dev/null +++ b/paper-api/src/main/java/org/bukkit/packs/package-info.java @@ -0,0 +1,5 @@ +/** + * Classes dedicated to handling data pack information. + */ +@org.jetbrains.annotations.ApiStatus.Experimental +package org.bukkit.packs;