diff --git a/paper-api/src/main/java/io/papermc/paper/datacomponent/item/BannerPatternLayers.java b/paper-api/src/main/java/io/papermc/paper/datacomponent/item/BannerPatternLayers.java index 785b5db96bb5..1995d795f643 100644 --- a/paper-api/src/main/java/io/papermc/paper/datacomponent/item/BannerPatternLayers.java +++ b/paper-api/src/main/java/io/papermc/paper/datacomponent/item/BannerPatternLayers.java @@ -1,5 +1,6 @@ package io.papermc.paper.datacomponent.item; +import io.papermc.paper.datacomponent.BuildableDataComponent; import io.papermc.paper.datacomponent.DataComponentBuilder; import java.util.List; import org.bukkit.block.banner.Pattern; @@ -15,7 +16,7 @@ @NullMarked @ApiStatus.Experimental @ApiStatus.NonExtendable -public interface BannerPatternLayers { +public interface BannerPatternLayers extends BuildableDataComponent { @Contract(value = "_ -> new", pure = true) static BannerPatternLayers bannerPatternLayers(final List patterns) { diff --git a/paper-api/src/main/java/io/papermc/paper/datacomponent/item/BlocksAttacks.java b/paper-api/src/main/java/io/papermc/paper/datacomponent/item/BlocksAttacks.java index 5cfb65dfcfde..a9d4c044e2ae 100644 --- a/paper-api/src/main/java/io/papermc/paper/datacomponent/item/BlocksAttacks.java +++ b/paper-api/src/main/java/io/papermc/paper/datacomponent/item/BlocksAttacks.java @@ -1,5 +1,6 @@ package io.papermc.paper.datacomponent.item; +import io.papermc.paper.datacomponent.BuildableDataComponent; import io.papermc.paper.datacomponent.DataComponentBuilder; import io.papermc.paper.datacomponent.item.blocksattacks.DamageReduction; import io.papermc.paper.datacomponent.item.blocksattacks.ItemDamageFunction; @@ -20,7 +21,7 @@ @NullMarked @ApiStatus.Experimental @ApiStatus.NonExtendable -public interface BlocksAttacks { +public interface BlocksAttacks extends BuildableDataComponent { @Contract(value = "-> new", pure = true) static Builder blocksAttacks() { diff --git a/paper-api/src/main/java/io/papermc/paper/datacomponent/item/BundleContents.java b/paper-api/src/main/java/io/papermc/paper/datacomponent/item/BundleContents.java index 696a4cebb902..ca78e80a53bc 100644 --- a/paper-api/src/main/java/io/papermc/paper/datacomponent/item/BundleContents.java +++ b/paper-api/src/main/java/io/papermc/paper/datacomponent/item/BundleContents.java @@ -1,5 +1,6 @@ package io.papermc.paper.datacomponent.item; +import io.papermc.paper.datacomponent.BuildableDataComponent; import io.papermc.paper.datacomponent.DataComponentBuilder; import java.util.List; import org.bukkit.inventory.ItemStack; @@ -15,7 +16,7 @@ @NullMarked @ApiStatus.Experimental @ApiStatus.NonExtendable -public interface BundleContents { +public interface BundleContents extends BuildableDataComponent { @Contract(value = "_ -> new", pure = true) static BundleContents bundleContents(final List contents) { @@ -61,5 +62,15 @@ interface Builder extends DataComponentBuilder { */ @Contract(value = "_ -> this", mutates = "this") Builder addAll(List stacks); + + /** + * Sets items to this builder. + * + * @param stacks items + * @return the builder for chaining + * @see #contents() + */ + @Contract(value = "_ -> this", mutates = "this") + Builder stacks(List stacks); } } diff --git a/paper-api/src/main/java/io/papermc/paper/datacomponent/item/ChargedProjectiles.java b/paper-api/src/main/java/io/papermc/paper/datacomponent/item/ChargedProjectiles.java index aac079e1d805..8a32a58d4d91 100644 --- a/paper-api/src/main/java/io/papermc/paper/datacomponent/item/ChargedProjectiles.java +++ b/paper-api/src/main/java/io/papermc/paper/datacomponent/item/ChargedProjectiles.java @@ -1,5 +1,6 @@ package io.papermc.paper.datacomponent.item; +import io.papermc.paper.datacomponent.BuildableDataComponent; import io.papermc.paper.datacomponent.DataComponentBuilder; import java.util.List; import org.bukkit.inventory.ItemStack; @@ -15,7 +16,7 @@ @NullMarked @ApiStatus.Experimental @ApiStatus.NonExtendable -public interface ChargedProjectiles { +public interface ChargedProjectiles extends BuildableDataComponent { @Contract(value = "_ -> new", pure = true) static ChargedProjectiles chargedProjectiles(final List projectiles) { @@ -61,5 +62,15 @@ interface Builder extends DataComponentBuilder { */ @Contract(value = "_ -> this", mutates = "this") Builder addAll(List stacks); + + /** + * Sets the projectiles to be loaded in this builder. + * + * @param stacks projectiles + * @return the builder for chaining + * @see #projectiles() + */ + @Contract(value = "_ -> this", mutates = "this") + Builder stacks(List stacks); } } diff --git a/paper-api/src/main/java/io/papermc/paper/datacomponent/item/CustomModelData.java b/paper-api/src/main/java/io/papermc/paper/datacomponent/item/CustomModelData.java index 10e4d354611e..04647ef7b810 100644 --- a/paper-api/src/main/java/io/papermc/paper/datacomponent/item/CustomModelData.java +++ b/paper-api/src/main/java/io/papermc/paper/datacomponent/item/CustomModelData.java @@ -1,5 +1,6 @@ package io.papermc.paper.datacomponent.item; +import io.papermc.paper.datacomponent.BuildableDataComponent; import io.papermc.paper.datacomponent.DataComponentBuilder; import java.util.List; import org.bukkit.Color; @@ -16,7 +17,7 @@ @NullMarked @ApiStatus.Experimental @ApiStatus.NonExtendable -public interface CustomModelData { +public interface CustomModelData extends BuildableDataComponent { @Contract(value = "-> new", pure = true) static CustomModelData.Builder customModelData() { @@ -82,6 +83,16 @@ interface Builder extends DataComponentBuilder { @Contract(value = "_ -> this", mutates = "this") CustomModelData.Builder addFloats(List floats); + /** + * Sets multiple floats to this custom model data. + * + * @param floats the floats + * @return the builder for chaining + * @see #floats() + */ + @Contract(value = "_ -> this", mutates = "this") + CustomModelData.Builder floats(List floats); + /** * Adds a flag to this custom model data. * @@ -102,6 +113,16 @@ interface Builder extends DataComponentBuilder { @Contract(value = "_ -> this", mutates = "this") CustomModelData.Builder addFlags(List flags); + /** + * Sets multiple flags to this custom model data. + * + * @param flags the flags + * @return the builder for chaining + * @see #flags() + */ + @Contract(value = "_ -> this", mutates = "this") + CustomModelData.Builder flags(List flags); + /** * Adds a string to this custom model data. * @@ -122,6 +143,16 @@ interface Builder extends DataComponentBuilder { @Contract(value = "_ -> this", mutates = "this") CustomModelData.Builder addStrings(List strings); + /** + * Sets multiple strings to this custom model data. + * + * @param strings the strings + * @return the builder for chaining + * @see #strings() + */ + @Contract(value = "_ -> this", mutates = "this") + CustomModelData.Builder strings(List strings); + /** * Adds a color to this custom model data. * @@ -141,5 +172,15 @@ interface Builder extends DataComponentBuilder { */ @Contract(value = "_ -> this", mutates = "this") CustomModelData.Builder addColors(List colors); + + /** + * Sets multiple colors to this custom model data. + * + * @param colors the colors + * @return the builder for chaining + * @see #colors() + */ + @Contract(value = "_ -> this", mutates = "this") + CustomModelData.Builder colors(List colors); } } diff --git a/paper-api/src/main/java/io/papermc/paper/datacomponent/item/DeathProtection.java b/paper-api/src/main/java/io/papermc/paper/datacomponent/item/DeathProtection.java index 8a42550bb52d..2501a52e4981 100644 --- a/paper-api/src/main/java/io/papermc/paper/datacomponent/item/DeathProtection.java +++ b/paper-api/src/main/java/io/papermc/paper/datacomponent/item/DeathProtection.java @@ -1,5 +1,6 @@ package io.papermc.paper.datacomponent.item; +import io.papermc.paper.datacomponent.BuildableDataComponent; import io.papermc.paper.datacomponent.DataComponentBuilder; import io.papermc.paper.datacomponent.item.consumable.ConsumeEffect; import java.util.List; @@ -15,7 +16,7 @@ @NullMarked @ApiStatus.Experimental @ApiStatus.NonExtendable -public interface DeathProtection { +public interface DeathProtection extends BuildableDataComponent { @Contract(value = "_ -> new", pure = true) static DeathProtection deathProtection(final List deathEffects) { @@ -42,5 +43,8 @@ interface Builder extends DataComponentBuilder { @Contract(value = "_ -> this", mutates = "this") Builder addEffects(List effects); + + @Contract(value = "_ -> this", mutates = "this") + Builder effects(List effects); } } diff --git a/paper-api/src/main/java/io/papermc/paper/datacomponent/item/DyedItemColor.java b/paper-api/src/main/java/io/papermc/paper/datacomponent/item/DyedItemColor.java index 73f4c73dabb5..11c813100f73 100644 --- a/paper-api/src/main/java/io/papermc/paper/datacomponent/item/DyedItemColor.java +++ b/paper-api/src/main/java/io/papermc/paper/datacomponent/item/DyedItemColor.java @@ -1,5 +1,6 @@ package io.papermc.paper.datacomponent.item; +import io.papermc.paper.datacomponent.BuildableDataComponent; import io.papermc.paper.datacomponent.DataComponentBuilder; import org.bukkit.Color; import org.jetbrains.annotations.ApiStatus; @@ -13,7 +14,7 @@ @NullMarked @ApiStatus.Experimental @ApiStatus.NonExtendable -public interface DyedItemColor { +public interface DyedItemColor extends BuildableDataComponent { @Contract(value = "_, _ -> new", pure = true) static DyedItemColor dyedItemColor(final Color color) { diff --git a/paper-api/src/main/java/io/papermc/paper/datacomponent/item/Fireworks.java b/paper-api/src/main/java/io/papermc/paper/datacomponent/item/Fireworks.java index 72aa1b4bda26..5e5165006ec8 100644 --- a/paper-api/src/main/java/io/papermc/paper/datacomponent/item/Fireworks.java +++ b/paper-api/src/main/java/io/papermc/paper/datacomponent/item/Fireworks.java @@ -1,5 +1,6 @@ package io.papermc.paper.datacomponent.item; +import io.papermc.paper.datacomponent.BuildableDataComponent; import io.papermc.paper.datacomponent.DataComponentBuilder; import java.util.List; import org.bukkit.FireworkEffect; @@ -16,7 +17,7 @@ @NullMarked @ApiStatus.Experimental @ApiStatus.NonExtendable -public interface Fireworks { +public interface Fireworks extends BuildableDataComponent { @Contract(value = "_, _ -> new", pure = true) static Fireworks fireworks(final List effects, final int flightDuration) { @@ -80,5 +81,15 @@ interface Builder extends DataComponentBuilder { */ @Contract(value = "_ -> this", mutates = "this") Builder addEffects(List effects); + + /** + * Sets explosions to this builder. + * + * @param effects effects + * @return the builder for chaining + * @see #effects() + */ + @Contract(value = "_ -> this", mutates = "this") + Builder effects(List effects); } } diff --git a/paper-api/src/main/java/io/papermc/paper/datacomponent/item/ItemAdventurePredicate.java b/paper-api/src/main/java/io/papermc/paper/datacomponent/item/ItemAdventurePredicate.java index 6dbe3b72e774..7c621e4e2e03 100644 --- a/paper-api/src/main/java/io/papermc/paper/datacomponent/item/ItemAdventurePredicate.java +++ b/paper-api/src/main/java/io/papermc/paper/datacomponent/item/ItemAdventurePredicate.java @@ -1,6 +1,7 @@ package io.papermc.paper.datacomponent.item; import io.papermc.paper.block.BlockPredicate; +import io.papermc.paper.datacomponent.BuildableDataComponent; import io.papermc.paper.datacomponent.DataComponentBuilder; import java.util.List; import org.jetbrains.annotations.ApiStatus; @@ -16,7 +17,7 @@ @NullMarked @ApiStatus.Experimental @ApiStatus.NonExtendable -public interface ItemAdventurePredicate { +public interface ItemAdventurePredicate extends BuildableDataComponent { @Contract(value = "_ -> new", pure = true) static ItemAdventurePredicate itemAdventurePredicate(final List predicates) { @@ -61,5 +62,15 @@ interface Builder extends DataComponentBuilder { */ @Contract(value = "_ -> this", mutates = "this") Builder addPredicates(List predicates); + + /** + * Sets block predicates to this builder. + * + * @param predicates predicates + * @return the builder for chaining + * @see #predicates() + */ + @Contract(value = "_ -> this", mutates = "this") + Builder predicates(List predicates); } } diff --git a/paper-api/src/main/java/io/papermc/paper/datacomponent/item/ItemArmorTrim.java b/paper-api/src/main/java/io/papermc/paper/datacomponent/item/ItemArmorTrim.java index bae6ad86229c..2ef4bdac2ccc 100644 --- a/paper-api/src/main/java/io/papermc/paper/datacomponent/item/ItemArmorTrim.java +++ b/paper-api/src/main/java/io/papermc/paper/datacomponent/item/ItemArmorTrim.java @@ -1,5 +1,6 @@ package io.papermc.paper.datacomponent.item; +import io.papermc.paper.datacomponent.BuildableDataComponent; import io.papermc.paper.datacomponent.DataComponentBuilder; import org.bukkit.inventory.meta.trim.ArmorTrim; import org.jetbrains.annotations.ApiStatus; @@ -13,7 +14,7 @@ @NullMarked @ApiStatus.Experimental @ApiStatus.NonExtendable -public interface ItemArmorTrim { +public interface ItemArmorTrim extends BuildableDataComponent { @Contract(value = "_ -> new", pure = true) static ItemArmorTrim.Builder itemArmorTrim(final ArmorTrim armorTrim) { diff --git a/paper-api/src/main/java/io/papermc/paper/datacomponent/item/ItemAttributeModifiers.java b/paper-api/src/main/java/io/papermc/paper/datacomponent/item/ItemAttributeModifiers.java index c3bc8e6f534b..a1ab71482176 100644 --- a/paper-api/src/main/java/io/papermc/paper/datacomponent/item/ItemAttributeModifiers.java +++ b/paper-api/src/main/java/io/papermc/paper/datacomponent/item/ItemAttributeModifiers.java @@ -1,5 +1,6 @@ package io.papermc.paper.datacomponent.item; +import io.papermc.paper.datacomponent.BuildableDataComponent; import io.papermc.paper.datacomponent.DataComponentBuilder; import io.papermc.paper.datacomponent.item.attribute.AttributeModifierDisplay; import java.util.List; @@ -18,7 +19,7 @@ @NullMarked @ApiStatus.Experimental @ApiStatus.NonExtendable -public interface ItemAttributeModifiers { +public interface ItemAttributeModifiers extends BuildableDataComponent { @Contract(value = "-> new", pure = true) static ItemAttributeModifiers.Builder itemAttributes() { diff --git a/paper-api/src/main/java/io/papermc/paper/datacomponent/item/ItemContainerContents.java b/paper-api/src/main/java/io/papermc/paper/datacomponent/item/ItemContainerContents.java index 3b00e34a1d6a..9870a81a5d40 100644 --- a/paper-api/src/main/java/io/papermc/paper/datacomponent/item/ItemContainerContents.java +++ b/paper-api/src/main/java/io/papermc/paper/datacomponent/item/ItemContainerContents.java @@ -1,5 +1,6 @@ package io.papermc.paper.datacomponent.item; +import io.papermc.paper.datacomponent.BuildableDataComponent; import io.papermc.paper.datacomponent.DataComponentBuilder; import java.util.List; import org.bukkit.inventory.ItemStack; @@ -15,7 +16,7 @@ @NullMarked @ApiStatus.Experimental @ApiStatus.NonExtendable -public interface ItemContainerContents { +public interface ItemContainerContents extends BuildableDataComponent { @Contract(value = "_ -> new", pure = true) static ItemContainerContents containerContents(final List contents) { @@ -58,5 +59,15 @@ interface Builder extends DataComponentBuilder { */ @Contract(value = "_ -> this", mutates = "this") Builder addAll(List stacks); + + /** + * Sets item stacks to the container. + * + * @param stacks the item stacks + * @return the builder for chaining + * @see #contents() + */ + @Contract(value = "_ -> this", mutates = "this") + Builder stacks(List stacks); } } diff --git a/paper-api/src/main/java/io/papermc/paper/datacomponent/item/ItemEnchantments.java b/paper-api/src/main/java/io/papermc/paper/datacomponent/item/ItemEnchantments.java index a36266df0f52..01d673e98940 100644 --- a/paper-api/src/main/java/io/papermc/paper/datacomponent/item/ItemEnchantments.java +++ b/paper-api/src/main/java/io/papermc/paper/datacomponent/item/ItemEnchantments.java @@ -1,5 +1,6 @@ package io.papermc.paper.datacomponent.item; +import io.papermc.paper.datacomponent.BuildableDataComponent; import io.papermc.paper.datacomponent.DataComponentBuilder; import java.util.Map; import org.bukkit.enchantments.Enchantment; @@ -17,7 +18,7 @@ @NullMarked @ApiStatus.Experimental @ApiStatus.NonExtendable -public interface ItemEnchantments { +public interface ItemEnchantments extends BuildableDataComponent { @Contract(value = "_, _ -> new", pure = true) static ItemEnchantments itemEnchantments(final Map enchantments) { @@ -64,5 +65,15 @@ interface Builder extends DataComponentBuilder { */ @Contract(value = "_ -> this", mutates = "this") Builder addAll(Map enchantments); + + /** + * Sets enchantments with the given level to this component. + * + * @param enchantments enchantments + * @return the builder for chaining + * @see #enchantments() + */ + @Contract(value = "_ -> this", mutates = "this") + Builder enchantments(Map enchantments); } } diff --git a/paper-api/src/main/java/io/papermc/paper/datacomponent/item/ItemLore.java b/paper-api/src/main/java/io/papermc/paper/datacomponent/item/ItemLore.java index 3be62f6005e0..43b16977fc50 100644 --- a/paper-api/src/main/java/io/papermc/paper/datacomponent/item/ItemLore.java +++ b/paper-api/src/main/java/io/papermc/paper/datacomponent/item/ItemLore.java @@ -1,5 +1,6 @@ package io.papermc.paper.datacomponent.item; +import io.papermc.paper.datacomponent.BuildableDataComponent; import io.papermc.paper.datacomponent.DataComponentBuilder; import java.util.List; import net.kyori.adventure.text.Component; @@ -16,7 +17,7 @@ @NullMarked @ApiStatus.Experimental @ApiStatus.NonExtendable -public interface ItemLore { +public interface ItemLore extends BuildableDataComponent { @Contract(value = "_ -> new", pure = true) static ItemLore lore(final List lines) { diff --git a/paper-api/src/main/java/io/papermc/paper/datacomponent/item/JukeboxPlayable.java b/paper-api/src/main/java/io/papermc/paper/datacomponent/item/JukeboxPlayable.java index d9c5f3fe0337..d72b1b6a17cd 100644 --- a/paper-api/src/main/java/io/papermc/paper/datacomponent/item/JukeboxPlayable.java +++ b/paper-api/src/main/java/io/papermc/paper/datacomponent/item/JukeboxPlayable.java @@ -1,5 +1,6 @@ package io.papermc.paper.datacomponent.item; +import io.papermc.paper.datacomponent.BuildableDataComponent; import io.papermc.paper.datacomponent.DataComponentBuilder; import org.bukkit.JukeboxSong; import org.jetbrains.annotations.ApiStatus; @@ -13,7 +14,7 @@ @NullMarked @ApiStatus.Experimental @ApiStatus.NonExtendable -public interface JukeboxPlayable { +public interface JukeboxPlayable extends BuildableDataComponent { @Contract(value = "_ -> new", pure = true) static JukeboxPlayable.Builder jukeboxPlayable(final JukeboxSong song) { diff --git a/paper-api/src/main/java/io/papermc/paper/datacomponent/item/LodestoneTracker.java b/paper-api/src/main/java/io/papermc/paper/datacomponent/item/LodestoneTracker.java index b919672ceea7..1b61a0cdd91c 100644 --- a/paper-api/src/main/java/io/papermc/paper/datacomponent/item/LodestoneTracker.java +++ b/paper-api/src/main/java/io/papermc/paper/datacomponent/item/LodestoneTracker.java @@ -1,5 +1,6 @@ package io.papermc.paper.datacomponent.item; +import io.papermc.paper.datacomponent.BuildableDataComponent; import io.papermc.paper.datacomponent.DataComponentBuilder; import org.bukkit.Location; import org.jetbrains.annotations.ApiStatus; @@ -14,7 +15,7 @@ @NullMarked @ApiStatus.Experimental @ApiStatus.NonExtendable -public interface LodestoneTracker { +public interface LodestoneTracker extends BuildableDataComponent { @Contract(value = "_, _ -> new", pure = true) static LodestoneTracker lodestoneTracker(final @Nullable Location location, final boolean tracked) { diff --git a/paper-api/src/main/java/io/papermc/paper/datacomponent/item/MapDecorations.java b/paper-api/src/main/java/io/papermc/paper/datacomponent/item/MapDecorations.java index 1e611f1f918c..f7477053d91f 100644 --- a/paper-api/src/main/java/io/papermc/paper/datacomponent/item/MapDecorations.java +++ b/paper-api/src/main/java/io/papermc/paper/datacomponent/item/MapDecorations.java @@ -1,5 +1,6 @@ package io.papermc.paper.datacomponent.item; +import io.papermc.paper.datacomponent.BuildableDataComponent; import io.papermc.paper.datacomponent.DataComponentBuilder; import java.util.Map; import org.bukkit.map.MapCursor; @@ -16,7 +17,7 @@ @NullMarked @ApiStatus.Experimental @ApiStatus.NonExtendable -public interface MapDecorations { +public interface MapDecorations extends BuildableDataComponent { @Contract(value = "_ -> new", pure = true) static MapDecorations mapDecorations(final Map entries) { diff --git a/paper-api/src/main/java/io/papermc/paper/datacomponent/item/MapItemColor.java b/paper-api/src/main/java/io/papermc/paper/datacomponent/item/MapItemColor.java index 87845d19a25e..dcba6e2f5a73 100644 --- a/paper-api/src/main/java/io/papermc/paper/datacomponent/item/MapItemColor.java +++ b/paper-api/src/main/java/io/papermc/paper/datacomponent/item/MapItemColor.java @@ -1,5 +1,6 @@ package io.papermc.paper.datacomponent.item; +import io.papermc.paper.datacomponent.BuildableDataComponent; import io.papermc.paper.datacomponent.DataComponentBuilder; import org.bukkit.Color; import org.jetbrains.annotations.ApiStatus; @@ -13,7 +14,7 @@ @NullMarked @ApiStatus.Experimental @ApiStatus.NonExtendable -public interface MapItemColor { +public interface MapItemColor extends BuildableDataComponent { @Contract(value = "-> new", pure = true) static MapItemColor.Builder mapItemColor() { diff --git a/paper-api/src/main/java/io/papermc/paper/datacomponent/item/PotDecorations.java b/paper-api/src/main/java/io/papermc/paper/datacomponent/item/PotDecorations.java index 15154d7f9f86..c7a418a3feee 100644 --- a/paper-api/src/main/java/io/papermc/paper/datacomponent/item/PotDecorations.java +++ b/paper-api/src/main/java/io/papermc/paper/datacomponent/item/PotDecorations.java @@ -1,5 +1,6 @@ package io.papermc.paper.datacomponent.item; +import io.papermc.paper.datacomponent.BuildableDataComponent; import io.papermc.paper.datacomponent.DataComponentBuilder; import org.bukkit.inventory.ItemType; import org.jetbrains.annotations.ApiStatus; @@ -14,7 +15,7 @@ @NullMarked @ApiStatus.Experimental @ApiStatus.NonExtendable -public interface PotDecorations { +public interface PotDecorations extends BuildableDataComponent { @Contract(value = "_, _, _, _ -> new", pure = true) static PotDecorations potDecorations(final @Nullable ItemType back, final @Nullable ItemType left, final @Nullable ItemType right, final @Nullable ItemType front) { diff --git a/paper-api/src/main/java/io/papermc/paper/datacomponent/item/PotionContents.java b/paper-api/src/main/java/io/papermc/paper/datacomponent/item/PotionContents.java index 984f793a42af..2cd480f968cc 100644 --- a/paper-api/src/main/java/io/papermc/paper/datacomponent/item/PotionContents.java +++ b/paper-api/src/main/java/io/papermc/paper/datacomponent/item/PotionContents.java @@ -1,5 +1,6 @@ package io.papermc.paper.datacomponent.item; +import io.papermc.paper.datacomponent.BuildableDataComponent; import io.papermc.paper.datacomponent.DataComponentBuilder; import java.util.List; import org.bukkit.Color; @@ -18,7 +19,7 @@ @NullMarked @ApiStatus.Experimental @ApiStatus.NonExtendable -public interface PotionContents { +public interface PotionContents extends BuildableDataComponent { @Contract(value = "-> new", pure = true) static PotionContents.Builder potionContents() { @@ -135,5 +136,15 @@ interface Builder extends DataComponentBuilder { */ @Contract(value = "_ -> this", mutates = "this") Builder addCustomEffects(List effects); + + /** + * Sets custom effect instances to this builder. + * + * @param effects effects + * @return the builder for chaining + * @see #customEffects() + */ + @Contract(value = "_ -> this", mutates = "this") + Builder customEffects(List effects); } } diff --git a/paper-api/src/main/java/io/papermc/paper/datacomponent/item/SeededContainerLoot.java b/paper-api/src/main/java/io/papermc/paper/datacomponent/item/SeededContainerLoot.java index f79af65e8f3f..31ba305a5710 100644 --- a/paper-api/src/main/java/io/papermc/paper/datacomponent/item/SeededContainerLoot.java +++ b/paper-api/src/main/java/io/papermc/paper/datacomponent/item/SeededContainerLoot.java @@ -1,5 +1,6 @@ package io.papermc.paper.datacomponent.item; +import io.papermc.paper.datacomponent.BuildableDataComponent; import io.papermc.paper.datacomponent.DataComponentBuilder; import net.kyori.adventure.key.Key; import org.jetbrains.annotations.ApiStatus; @@ -13,7 +14,7 @@ @NullMarked @ApiStatus.Experimental @ApiStatus.NonExtendable -public interface SeededContainerLoot { +public interface SeededContainerLoot extends BuildableDataComponent { @Contract(value = "_, _ -> new", pure = true) static SeededContainerLoot seededContainerLoot(final Key lootTableKey, final long seed) { diff --git a/paper-api/src/main/java/io/papermc/paper/datacomponent/item/SuspiciousStewEffects.java b/paper-api/src/main/java/io/papermc/paper/datacomponent/item/SuspiciousStewEffects.java index 9a740ef7da96..594967087a1e 100644 --- a/paper-api/src/main/java/io/papermc/paper/datacomponent/item/SuspiciousStewEffects.java +++ b/paper-api/src/main/java/io/papermc/paper/datacomponent/item/SuspiciousStewEffects.java @@ -1,5 +1,6 @@ package io.papermc.paper.datacomponent.item; +import io.papermc.paper.datacomponent.BuildableDataComponent; import io.papermc.paper.datacomponent.DataComponentBuilder; import io.papermc.paper.potion.SuspiciousEffectEntry; import java.util.Collection; @@ -16,7 +17,7 @@ @NullMarked @ApiStatus.Experimental @ApiStatus.NonExtendable -public interface SuspiciousStewEffects { +public interface SuspiciousStewEffects extends BuildableDataComponent { @Contract(value = "_ -> new", pure = true) static SuspiciousStewEffects suspiciousStewEffects(final Collection effects) { @@ -62,5 +63,15 @@ interface Builder extends DataComponentBuilder { */ @Contract(value = "_ -> this", mutates = "this") Builder addAll(Collection entries); + + /** + * Sets effects applied to this builder. + * + * @param entries effect + * @return the builder for chaining + * @see #effects() + */ + @Contract(value = "_ -> this", mutates = "this") + Builder effects(Collection entries); } } diff --git a/paper-api/src/main/java/io/papermc/paper/datacomponent/item/Tool.java b/paper-api/src/main/java/io/papermc/paper/datacomponent/item/Tool.java index e1ef5cffa48e..59cb712acbea 100644 --- a/paper-api/src/main/java/io/papermc/paper/datacomponent/item/Tool.java +++ b/paper-api/src/main/java/io/papermc/paper/datacomponent/item/Tool.java @@ -1,5 +1,6 @@ package io.papermc.paper.datacomponent.item; +import io.papermc.paper.datacomponent.BuildableDataComponent; import io.papermc.paper.datacomponent.DataComponentBuilder; import io.papermc.paper.datacomponent.DataComponentTypes; import io.papermc.paper.registry.set.RegistryKeySet; @@ -21,7 +22,7 @@ @NullMarked @ApiStatus.Experimental @ApiStatus.NonExtendable -public interface Tool { +public interface Tool extends BuildableDataComponent { @Contract(value = "-> new", pure = true) static Tool.Builder tool() { @@ -164,5 +165,14 @@ interface Builder extends DataComponentBuilder { */ @Contract(value = "_ -> this", mutates = "this") Builder addRules(Collection rules); + + /** + * Sets rules to the tool that control the breaking speed / damage per block if matched. + * + * @param rules rules + * @return the builder for chaining + */ + @Contract(value = "_ -> this", mutates = "this") + Builder rules(Collection rules); } } diff --git a/paper-api/src/main/java/io/papermc/paper/datacomponent/item/TooltipDisplay.java b/paper-api/src/main/java/io/papermc/paper/datacomponent/item/TooltipDisplay.java index 85aaae68adcf..1fd01b08e28e 100644 --- a/paper-api/src/main/java/io/papermc/paper/datacomponent/item/TooltipDisplay.java +++ b/paper-api/src/main/java/io/papermc/paper/datacomponent/item/TooltipDisplay.java @@ -1,5 +1,6 @@ package io.papermc.paper.datacomponent.item; +import io.papermc.paper.datacomponent.BuildableDataComponent; import io.papermc.paper.datacomponent.DataComponentBuilder; import io.papermc.paper.datacomponent.DataComponentType; import org.jetbrains.annotations.ApiStatus; @@ -11,7 +12,7 @@ @NullMarked @ApiStatus.Experimental @ApiStatus.NonExtendable -public interface TooltipDisplay { +public interface TooltipDisplay extends BuildableDataComponent { /** * Returns a new builder for creating a TooltipDisplay. @@ -40,6 +41,9 @@ interface Builder extends DataComponentBuilder { @Contract(value = "_ -> this", mutates = "this") Builder addHiddenComponents(DataComponentType... components); + @Contract(value = "_ -> this", mutates = "this") + Builder addHiddenComponents(Set components); + @Contract(value = "_ -> this", mutates = "this") Builder hiddenComponents(Set components); } diff --git a/paper-api/src/main/java/io/papermc/paper/datacomponent/item/UseCooldown.java b/paper-api/src/main/java/io/papermc/paper/datacomponent/item/UseCooldown.java index 57fc55ad1def..a015ee911751 100644 --- a/paper-api/src/main/java/io/papermc/paper/datacomponent/item/UseCooldown.java +++ b/paper-api/src/main/java/io/papermc/paper/datacomponent/item/UseCooldown.java @@ -1,5 +1,6 @@ package io.papermc.paper.datacomponent.item; +import io.papermc.paper.datacomponent.BuildableDataComponent; import io.papermc.paper.datacomponent.DataComponentBuilder; import net.kyori.adventure.key.Key; import org.jetbrains.annotations.ApiStatus; @@ -14,7 +15,7 @@ @NullMarked @ApiStatus.Experimental @ApiStatus.NonExtendable -public interface UseCooldown { +public interface UseCooldown extends BuildableDataComponent { /** * Creates a new builder for use cooldown. diff --git a/paper-api/src/main/java/io/papermc/paper/datacomponent/item/Weapon.java b/paper-api/src/main/java/io/papermc/paper/datacomponent/item/Weapon.java index 856120108ca8..b14fe27ff266 100644 --- a/paper-api/src/main/java/io/papermc/paper/datacomponent/item/Weapon.java +++ b/paper-api/src/main/java/io/papermc/paper/datacomponent/item/Weapon.java @@ -1,5 +1,6 @@ package io.papermc.paper.datacomponent.item; +import io.papermc.paper.datacomponent.BuildableDataComponent; import io.papermc.paper.datacomponent.DataComponentBuilder; import org.jetbrains.annotations.ApiStatus; import org.jspecify.annotations.NullMarked; @@ -7,7 +8,7 @@ @NullMarked @ApiStatus.Experimental @ApiStatus.NonExtendable -public interface Weapon { +public interface Weapon extends BuildableDataComponent { /** * Returns a new builder for creating a Weapon. diff --git a/paper-api/src/main/java/io/papermc/paper/datacomponent/item/WritableBookContent.java b/paper-api/src/main/java/io/papermc/paper/datacomponent/item/WritableBookContent.java index 828d3bb1c763..bc5d5d4d5dd1 100644 --- a/paper-api/src/main/java/io/papermc/paper/datacomponent/item/WritableBookContent.java +++ b/paper-api/src/main/java/io/papermc/paper/datacomponent/item/WritableBookContent.java @@ -1,5 +1,6 @@ package io.papermc.paper.datacomponent.item; +import io.papermc.paper.datacomponent.BuildableDataComponent; import io.papermc.paper.datacomponent.DataComponentBuilder; import io.papermc.paper.text.Filtered; import java.util.List; @@ -15,7 +16,7 @@ @NullMarked @ApiStatus.Experimental @ApiStatus.NonExtendable -public interface WritableBookContent { +public interface WritableBookContent extends BuildableDataComponent { @Contract(value = "-> new", pure = true) static WritableBookContent.Builder writeableBookContent() { @@ -57,6 +58,16 @@ interface Builder extends DataComponentBuilder { @Contract(value = "_ -> this", mutates = "this") Builder addPages(List pages); + /** + * Sets pages that can be written to for this builder. + * + * @param pages pages + * @return the builder for chaining + * @see #pages() + */ + @Contract(value = "_ -> this", mutates = "this") + Builder pages(List pages); + /** * Adds a filterable page that can be written to for this builder. * @@ -76,5 +87,15 @@ interface Builder extends DataComponentBuilder { */ @Contract(value = "_ -> this", mutates = "this") Builder addFilteredPages(List> pages); + + /** + * Sets filterable pages that can be written to for this builder. + * + * @param pages pages + * @return the builder for chaining + * @see #pages() + */ + @Contract(value = "_ -> this", mutates = "this") + Builder filteredPages(List> pages); } } diff --git a/paper-api/src/main/java/io/papermc/paper/datacomponent/item/WrittenBookContent.java b/paper-api/src/main/java/io/papermc/paper/datacomponent/item/WrittenBookContent.java index 979bc05009b8..8962425373f9 100644 --- a/paper-api/src/main/java/io/papermc/paper/datacomponent/item/WrittenBookContent.java +++ b/paper-api/src/main/java/io/papermc/paper/datacomponent/item/WrittenBookContent.java @@ -1,5 +1,6 @@ package io.papermc.paper.datacomponent.item; +import io.papermc.paper.datacomponent.BuildableDataComponent; import io.papermc.paper.datacomponent.DataComponentBuilder; import io.papermc.paper.text.Filtered; import java.util.List; @@ -18,7 +19,7 @@ @NullMarked @ApiStatus.Experimental @ApiStatus.NonExtendable -public interface WrittenBookContent { +public interface WrittenBookContent extends BuildableDataComponent { @Contract(value = "_, _ -> new", pure = true) static WrittenBookContent.Builder writtenBookContent(final String title, final String author) { @@ -142,12 +143,22 @@ interface Builder extends DataComponentBuilder { /** * Adds pages to this book. * - * @param page the pages + * @param pages the pages + * @return the builder for chaining + * @see #pages() + */ + @Contract(value = "_ -> this", mutates = "this") + Builder addPages(List pages); + + /** + * Sets pages to this book. + * + * @param pages the pages * @return the builder for chaining * @see #pages() */ @Contract(value = "_ -> this", mutates = "this") - Builder addPages(List page); + Builder pages(List pages); /** * Adds a filterable page to this book. @@ -168,5 +179,15 @@ interface Builder extends DataComponentBuilder { */ @Contract(value = "_ -> this", mutates = "this") Builder addFilteredPages(List> pages); + + /** + * Sets filterable pages to this book. + * + * @param pages the pages + * @return the builder for chaining + * @see #pages() + */ + @Contract(value = "_ -> this", mutates = "this") + Builder filteredPages(List> pages); } } diff --git a/paper-server/src/main/java/io/papermc/paper/datacomponent/item/PaperBannerPatternLayers.java b/paper-server/src/main/java/io/papermc/paper/datacomponent/item/PaperBannerPatternLayers.java index 9963cbf9f70c..e6126da0a840 100644 --- a/paper-server/src/main/java/io/papermc/paper/datacomponent/item/PaperBannerPatternLayers.java +++ b/paper-server/src/main/java/io/papermc/paper/datacomponent/item/PaperBannerPatternLayers.java @@ -2,6 +2,7 @@ import io.papermc.paper.registry.RegistryKey; import io.papermc.paper.util.MCUtil; +import java.util.ArrayList; import java.util.List; import java.util.Objects; import java.util.Optional; @@ -34,6 +35,11 @@ public net.minecraft.world.level.block.entity.BannerPatternLayers getHandle() { return convert(impl); } + @Override + public Builder toBuilder() { + return new BuilderImpl().addAll(this.patterns()); + } + static final class BuilderImpl implements BannerPatternLayers.Builder { private final net.minecraft.world.level.block.entity.BannerPatternLayers.Builder builder = new net.minecraft.world.level.block.entity.BannerPatternLayers.Builder(); diff --git a/paper-server/src/main/java/io/papermc/paper/datacomponent/item/PaperBlocksAttacks.java b/paper-server/src/main/java/io/papermc/paper/datacomponent/item/PaperBlocksAttacks.java index 7d8ae6b3a3f3..3d4950350818 100644 --- a/paper-server/src/main/java/io/papermc/paper/datacomponent/item/PaperBlocksAttacks.java +++ b/paper-server/src/main/java/io/papermc/paper/datacomponent/item/PaperBlocksAttacks.java @@ -61,6 +61,18 @@ public ItemDamageFunction itemDamage() { return this.impl.disableSound().map(holder -> PaperAdventure.asAdventure(holder.value().location())).orElse(null); } + @Override + public Builder toBuilder() { + return new BuilderImpl() + .blockDelaySeconds(this.blockDelaySeconds()) + .disableCooldownScale(this.disableCooldownScale()) + .damageReductions(this.damageReductions()) + .itemDamage(this.itemDamage()) + .bypassedBy(this.bypassedBy()) + .blockSound(this.blockSound()) + .disableSound(this.disableSound()); + } + static final class BuilderImpl implements Builder { private float blockDelaySeconds; diff --git a/paper-server/src/main/java/io/papermc/paper/datacomponent/item/PaperBundleContents.java b/paper-server/src/main/java/io/papermc/paper/datacomponent/item/PaperBundleContents.java index ba95ce77dbdd..7c74114df81e 100644 --- a/paper-server/src/main/java/io/papermc/paper/datacomponent/item/PaperBundleContents.java +++ b/paper-server/src/main/java/io/papermc/paper/datacomponent/item/PaperBundleContents.java @@ -22,6 +22,11 @@ public List contents() { return MCUtil.transformUnmodifiable((List) this.impl.items(), CraftItemStack::asBukkitCopy); } + @Override + public Builder toBuilder() { + return new BuilderImpl().addAll(this.contents()); + } + static final class BuilderImpl implements BundleContents.Builder { private final List items = new ObjectArrayList<>(); @@ -40,6 +45,13 @@ public BundleContents.Builder addAll(final List stacks) { return this; } + @Override + public Builder stacks(final List stacks) { + items.clear(); + stacks.forEach(this::add); + return this; + } + @Override public BundleContents build() { if (this.items.isEmpty()) { diff --git a/paper-server/src/main/java/io/papermc/paper/datacomponent/item/PaperChargedProjectiles.java b/paper-server/src/main/java/io/papermc/paper/datacomponent/item/PaperChargedProjectiles.java index 2129dd67fd02..3d6c811e43ed 100644 --- a/paper-server/src/main/java/io/papermc/paper/datacomponent/item/PaperChargedProjectiles.java +++ b/paper-server/src/main/java/io/papermc/paper/datacomponent/item/PaperChargedProjectiles.java @@ -22,6 +22,11 @@ public List projectiles() { return MCUtil.transformUnmodifiable(this.impl.getItems() /*makes copies internally*/, CraftItemStack::asCraftMirror); } + @Override + public Builder toBuilder() { + return new BuilderImpl().addAll(this.projectiles()); + } + static final class BuilderImpl implements ChargedProjectiles.Builder { private final List items = new ArrayList<>(); @@ -40,6 +45,13 @@ public ChargedProjectiles.Builder addAll(final List stacks) { return this; } + @Override + public Builder stacks(final List stacks) { + items.clear(); + stacks.forEach(this::add); + return this; + } + @Override public ChargedProjectiles build() { if (this.items.isEmpty()) { diff --git a/paper-server/src/main/java/io/papermc/paper/datacomponent/item/PaperCustomModelData.java b/paper-server/src/main/java/io/papermc/paper/datacomponent/item/PaperCustomModelData.java index e2f2d435b97a..ff9d0213a509 100644 --- a/paper-server/src/main/java/io/papermc/paper/datacomponent/item/PaperCustomModelData.java +++ b/paper-server/src/main/java/io/papermc/paper/datacomponent/item/PaperCustomModelData.java @@ -43,6 +43,15 @@ public List colors() { return MCUtil.transformUnmodifiable(this.impl.colors(), color -> Color.fromRGB(color & 0x00FFFFFF)); // skip alpha channel } + @Override + public Builder toBuilder() { + return new BuilderImpl() + .floats(this.floats()) + .flags(this.flags()) + .strings(this.strings()) + .colors(this.colors()); + } + static final class BuilderImpl implements CustomModelData.Builder { private final FloatList floats = new FloatArrayList(); @@ -65,6 +74,16 @@ public Builder addFloats(final List floats) { return this; } + @Override + public Builder floats(final List floats) { + this.floats.clear(); + for (Float f : floats) { + Preconditions.checkArgument(f != null, "Float cannot be null"); + } + this.floats.addAll(floats); + return this; + } + @Override public Builder addFlag(final boolean flag) { this.flags.add(flag); @@ -80,6 +99,16 @@ public Builder addFlags(final List flags) { return this; } + @Override + public Builder flags(final List flags) { + this.flags.clear(); + for (Boolean flag : flags) { + Preconditions.checkArgument(flag != null, "Flag cannot be null"); + } + this.flags.addAll(flags); + return this; + } + @Override public Builder addString(final String string) { Preconditions.checkArgument(string != null, "String cannot be null"); @@ -93,6 +122,13 @@ public Builder addStrings(final List strings) { return this; } + @Override + public Builder strings(final List strings) { + this.strings.clear(); + strings.forEach(this::addString); + return this; + } + @Override public Builder addColor(final Color color) { Preconditions.checkArgument(color != null, "Color cannot be null"); @@ -106,6 +142,13 @@ public Builder addColors(final List colors) { return this; } + @Override + public Builder colors(final List colors) { + this.colors.clear(); + colors.forEach(this::addColor); + return this; + } + @Override public CustomModelData build() { return new PaperCustomModelData( diff --git a/paper-server/src/main/java/io/papermc/paper/datacomponent/item/PaperDeathProtection.java b/paper-server/src/main/java/io/papermc/paper/datacomponent/item/PaperDeathProtection.java index e643b5db9d1f..65dcc37e2bd1 100644 --- a/paper-server/src/main/java/io/papermc/paper/datacomponent/item/PaperDeathProtection.java +++ b/paper-server/src/main/java/io/papermc/paper/datacomponent/item/PaperDeathProtection.java @@ -22,6 +22,11 @@ public net.minecraft.world.item.component.DeathProtection getHandle() { return MCUtil.transformUnmodifiable(this.impl.deathEffects(), PaperConsumableEffect::fromNms); } + @Override + public Builder toBuilder() { + return new BuilderImpl().effects(this.deathEffects()); + } + static final class BuilderImpl implements Builder { private final List effects = new ArrayList<>(); @@ -40,6 +45,15 @@ public Builder addEffects(final List effects) { return this; } + @Override + public Builder effects(final List effects) { + effects.clear(); + for (final ConsumeEffect effect : effects) { + this.effects.add(PaperConsumableEffect.toNms(effect)); + } + return this; + } + @Override public DeathProtection build() { return new PaperDeathProtection( diff --git a/paper-server/src/main/java/io/papermc/paper/datacomponent/item/PaperDyedItemColor.java b/paper-server/src/main/java/io/papermc/paper/datacomponent/item/PaperDyedItemColor.java index 8f47f1d32f54..d4f1d10f2fa1 100644 --- a/paper-server/src/main/java/io/papermc/paper/datacomponent/item/PaperDyedItemColor.java +++ b/paper-server/src/main/java/io/papermc/paper/datacomponent/item/PaperDyedItemColor.java @@ -17,6 +17,11 @@ public Color color() { return Color.fromRGB(this.impl.rgb() & 0x00FFFFFF); // skip alpha channel } + @Override + public Builder toBuilder() { + return new BuilderImpl().color(this.color()); + } + static final class BuilderImpl implements DyedItemColor.Builder { private Color color = Color.WHITE; diff --git a/paper-server/src/main/java/io/papermc/paper/datacomponent/item/PaperFireworks.java b/paper-server/src/main/java/io/papermc/paper/datacomponent/item/PaperFireworks.java index 80189eb5054a..263f90f2b8b5 100644 --- a/paper-server/src/main/java/io/papermc/paper/datacomponent/item/PaperFireworks.java +++ b/paper-server/src/main/java/io/papermc/paper/datacomponent/item/PaperFireworks.java @@ -29,6 +29,13 @@ public int flightDuration() { return this.impl.flightDuration(); } + @Override + public Builder toBuilder() { + return new BuilderImpl() + .flightDuration(this.flightDuration()) + .effects(this.effects()); + } + static final class BuilderImpl implements Fireworks.Builder { private final List effects = new ObjectArrayList<>(); @@ -65,6 +72,19 @@ public Fireworks.Builder addEffects(final List effects) { return this; } + @Override + public Builder effects(final List effects) { + Preconditions.checkArgument( + effects.size() <= net.minecraft.world.item.component.Fireworks.MAX_EXPLOSIONS, + "Cannot have more than %s effects, had %s", + net.minecraft.world.item.component.Fireworks.MAX_EXPLOSIONS, + effects.size() + ); + this.effects.clear(); + MCUtil.addAndConvert(this.effects, effects, CraftMetaFirework::getExplosion); + return this; + } + @Override public Fireworks build() { return new PaperFireworks(new net.minecraft.world.item.component.Fireworks(this.duration, new ObjectArrayList<>(this.effects))); diff --git a/paper-server/src/main/java/io/papermc/paper/datacomponent/item/PaperItemAdventurePredicate.java b/paper-server/src/main/java/io/papermc/paper/datacomponent/item/PaperItemAdventurePredicate.java index 705f5a4f1d18..9643edaa0fa5 100644 --- a/paper-server/src/main/java/io/papermc/paper/datacomponent/item/PaperItemAdventurePredicate.java +++ b/paper-server/src/main/java/io/papermc/paper/datacomponent/item/PaperItemAdventurePredicate.java @@ -31,6 +31,11 @@ public List predicates() { return convert(this.impl); } + @Override + public Builder toBuilder() { + return new BuilderImpl().predicates(this.predicates()); + } + static final class BuilderImpl implements ItemAdventurePredicate.Builder { private final List predicates = new ObjectArrayList<>(); @@ -51,6 +56,13 @@ public Builder addPredicates(final List predicates) { return this; } + @Override + public Builder predicates(final List predicates) { + this.predicates.clear(); + predicates.forEach(this::addPredicate); + return this; + } + @Override public ItemAdventurePredicate build() { return new PaperItemAdventurePredicate(new net.minecraft.world.item.AdventureModePredicate( diff --git a/paper-server/src/main/java/io/papermc/paper/datacomponent/item/PaperItemArmorTrim.java b/paper-server/src/main/java/io/papermc/paper/datacomponent/item/PaperItemArmorTrim.java index b3142e9661ea..a046e1d62ffc 100644 --- a/paper-server/src/main/java/io/papermc/paper/datacomponent/item/PaperItemArmorTrim.java +++ b/paper-server/src/main/java/io/papermc/paper/datacomponent/item/PaperItemArmorTrim.java @@ -19,6 +19,11 @@ public ArmorTrim armorTrim() { return new ArmorTrim(CraftTrimMaterial.minecraftHolderToBukkit(this.impl.material()), CraftTrimPattern.minecraftHolderToBukkit(this.impl.pattern())); } + @Override + public Builder toBuilder() { + return new BuilderImpl(this.armorTrim()); + } + static final class BuilderImpl implements ItemArmorTrim.Builder { private ArmorTrim armorTrim; diff --git a/paper-server/src/main/java/io/papermc/paper/datacomponent/item/PaperItemAttributeModifiers.java b/paper-server/src/main/java/io/papermc/paper/datacomponent/item/PaperItemAttributeModifiers.java index d9970e0a2bbb..2454a5c13fbc 100644 --- a/paper-server/src/main/java/io/papermc/paper/datacomponent/item/PaperItemAttributeModifiers.java +++ b/paper-server/src/main/java/io/papermc/paper/datacomponent/item/PaperItemAttributeModifiers.java @@ -38,6 +38,13 @@ public net.minecraft.world.item.component.ItemAttributeModifiers getHandle() { return convert(this.impl); } + @Override + public Builder toBuilder() { + Builder builder = new BuilderImpl(); + this.modifiers().forEach(entry -> builder.addModifier(entry.attribute(), entry.modifier(), entry.display())); + return builder; + } + public record PaperEntry(Attribute attribute, AttributeModifier modifier, AttributeModifierDisplay display) implements ItemAttributeModifiers.Entry { } diff --git a/paper-server/src/main/java/io/papermc/paper/datacomponent/item/PaperItemContainerContents.java b/paper-server/src/main/java/io/papermc/paper/datacomponent/item/PaperItemContainerContents.java index fe86d636f6e1..1dac18358aae 100644 --- a/paper-server/src/main/java/io/papermc/paper/datacomponent/item/PaperItemContainerContents.java +++ b/paper-server/src/main/java/io/papermc/paper/datacomponent/item/PaperItemContainerContents.java @@ -22,6 +22,11 @@ public List contents() { return MCUtil.transformUnmodifiable(this.impl.items, CraftItemStack::asBukkitCopy); } + @Override + public Builder toBuilder() { + return new BuilderImpl().addAll(this.contents()); + } + static final class BuilderImpl implements ItemContainerContents.Builder { private final List items = new ObjectArrayList<>(); @@ -54,6 +59,22 @@ public ItemContainerContents.Builder addAll(final List stacks) { return this; } + @Override + public Builder stacks(final List stacks) { + this.items.clear(); + Preconditions.checkArgument( + stacks.size() <= net.minecraft.world.item.component.ItemContainerContents.MAX_SIZE, + "Cannot have more than %s items, had %s", + net.minecraft.world.item.component.ItemContainerContents.MAX_SIZE, + stacks.size() + ); + MCUtil.addAndConvert(this.items, stacks, stack -> { + Preconditions.checkArgument(stack != null, "Cannot pass null item!"); + return CraftItemStack.asNMSCopy(stack); + }); + return this; + } + @Override public ItemContainerContents build() { if (this.items.isEmpty()) { diff --git a/paper-server/src/main/java/io/papermc/paper/datacomponent/item/PaperItemEnchantments.java b/paper-server/src/main/java/io/papermc/paper/datacomponent/item/PaperItemEnchantments.java index 489e77f4f04f..8f1cac87f9ed 100644 --- a/paper-server/src/main/java/io/papermc/paper/datacomponent/item/PaperItemEnchantments.java +++ b/paper-server/src/main/java/io/papermc/paper/datacomponent/item/PaperItemEnchantments.java @@ -10,6 +10,7 @@ import org.bukkit.craftbukkit.enchantments.CraftEnchantment; import org.bukkit.craftbukkit.util.Handleable; import org.bukkit.enchantments.Enchantment; +import org.checkerframework.common.value.qual.IntRange; public record PaperItemEnchantments( net.minecraft.world.item.enchantment.ItemEnchantments impl, @@ -36,6 +37,11 @@ public net.minecraft.world.item.enchantment.ItemEnchantments getHandle() { return this.impl; } + @Override + public Builder toBuilder() { + return new BuilderImpl().enchantments(this.enchantments()); + } + static final class BuilderImpl implements ItemEnchantments.Builder { private final Map enchantments = new Object2ObjectOpenHashMap<>(); @@ -58,6 +64,13 @@ public ItemEnchantments.Builder addAll(final Map enchantme return this; } + @Override + public Builder enchantments(final Map enchantments) { + this.enchantments.clear(); + enchantments.forEach(this::add); + return this; + } + @Override public ItemEnchantments build() { final net.minecraft.world.item.enchantment.ItemEnchantments initialEnchantments = net.minecraft.world.item.enchantment.ItemEnchantments.EMPTY; diff --git a/paper-server/src/main/java/io/papermc/paper/datacomponent/item/PaperItemLore.java b/paper-server/src/main/java/io/papermc/paper/datacomponent/item/PaperItemLore.java index 3bb0c1aebb03..a5a8bb181a4b 100644 --- a/paper-server/src/main/java/io/papermc/paper/datacomponent/item/PaperItemLore.java +++ b/paper-server/src/main/java/io/papermc/paper/datacomponent/item/PaperItemLore.java @@ -30,6 +30,11 @@ public net.minecraft.world.item.component.ItemLore getHandle() { return MCUtil.transformUnmodifiable(this.impl.styledLines(), PaperAdventure::asAdventure); } + @Override + public Builder toBuilder() { + return new BuilderImpl().lines(this.lines()); + } + static final class BuilderImpl implements ItemLore.Builder { private List lines = new ObjectArrayList<>(); diff --git a/paper-server/src/main/java/io/papermc/paper/datacomponent/item/PaperItemTool.java b/paper-server/src/main/java/io/papermc/paper/datacomponent/item/PaperItemTool.java index 2bb8166347e5..47aa2d8fd936 100644 --- a/paper-server/src/main/java/io/papermc/paper/datacomponent/item/PaperItemTool.java +++ b/paper-server/src/main/java/io/papermc/paper/datacomponent/item/PaperItemTool.java @@ -62,6 +62,15 @@ public static PaperRule fromUnsafe(final RegistryKeySet blocks, final } } + @Override + public Builder toBuilder() { + return new BuilderImpl() + .damagePerBlock(this.damagePerBlock()) + .defaultMiningSpeed(this.defaultMiningSpeed()) + .rules(this.rules()) + .canDestroyBlocksInCreative(this.canDestroyBlocksInCreative()); + } + static final class BuilderImpl implements Builder { private final List rules = new ObjectArrayList<>(); @@ -104,6 +113,13 @@ public Builder addRules(final Collection rules) { return this; } + @Override + public Builder rules(final Collection rules) { + this.rules.clear(); + rules.forEach(this::addRule); + return this; + } + @Override public Tool build() { return new PaperItemTool(new net.minecraft.world.item.component.Tool( diff --git a/paper-server/src/main/java/io/papermc/paper/datacomponent/item/PaperJukeboxPlayable.java b/paper-server/src/main/java/io/papermc/paper/datacomponent/item/PaperJukeboxPlayable.java index b80f1420703e..99519ab6364b 100644 --- a/paper-server/src/main/java/io/papermc/paper/datacomponent/item/PaperJukeboxPlayable.java +++ b/paper-server/src/main/java/io/papermc/paper/datacomponent/item/PaperJukeboxPlayable.java @@ -23,6 +23,11 @@ public JukeboxSong jukeboxSong() { .orElseThrow(); } + @Override + public Builder toBuilder() { + return new BuilderImpl(this.jukeboxSong()); + } + static final class BuilderImpl implements JukeboxPlayable.Builder { private JukeboxSong song; diff --git a/paper-server/src/main/java/io/papermc/paper/datacomponent/item/PaperLodestoneTracker.java b/paper-server/src/main/java/io/papermc/paper/datacomponent/item/PaperLodestoneTracker.java index 5b97249f6ae9..d761ce3e478c 100644 --- a/paper-server/src/main/java/io/papermc/paper/datacomponent/item/PaperLodestoneTracker.java +++ b/paper-server/src/main/java/io/papermc/paper/datacomponent/item/PaperLodestoneTracker.java @@ -25,6 +25,13 @@ public boolean tracked() { return this.impl.tracked(); } + @Override + public Builder toBuilder() { + return new BuilderImpl() + .location(this.location()) + .tracked(this.tracked()); + } + static final class BuilderImpl implements LodestoneTracker.Builder { private @Nullable Location location; diff --git a/paper-server/src/main/java/io/papermc/paper/datacomponent/item/PaperMapDecorations.java b/paper-server/src/main/java/io/papermc/paper/datacomponent/item/PaperMapDecorations.java index 322a1285b0c5..ad80b7a46d0e 100644 --- a/paper-server/src/main/java/io/papermc/paper/datacomponent/item/PaperMapDecorations.java +++ b/paper-server/src/main/java/io/papermc/paper/datacomponent/item/PaperMapDecorations.java @@ -43,6 +43,11 @@ public Map decorations() { return Collections.unmodifiableMap(decorations); } + @Override + public Builder toBuilder() { + return new BuilderImpl().putAll(this.decorations()); + } + public record PaperDecorationEntry(net.minecraft.world.item.component.MapDecorations.Entry entry) implements DecorationEntry { public static DecorationEntry toApi(final MapCursor.Type type, final double x, final double z, final float rotation) { diff --git a/paper-server/src/main/java/io/papermc/paper/datacomponent/item/PaperMapItemColor.java b/paper-server/src/main/java/io/papermc/paper/datacomponent/item/PaperMapItemColor.java index 9b6fdfc9c124..03d035fc0844 100644 --- a/paper-server/src/main/java/io/papermc/paper/datacomponent/item/PaperMapItemColor.java +++ b/paper-server/src/main/java/io/papermc/paper/datacomponent/item/PaperMapItemColor.java @@ -17,6 +17,11 @@ public Color color() { return Color.fromRGB(this.impl.rgb() & 0x00FFFFFF); // skip alpha channel } + @Override + public Builder toBuilder() { + return new BuilderImpl().color(this.color()); + } + static final class BuilderImpl implements Builder { private Color color = Color.fromRGB(net.minecraft.world.item.component.MapItemColor.DEFAULT.rgb()); diff --git a/paper-server/src/main/java/io/papermc/paper/datacomponent/item/PaperPotDecorations.java b/paper-server/src/main/java/io/papermc/paper/datacomponent/item/PaperPotDecorations.java index bde757b51d0a..6a8bf63ef8ed 100644 --- a/paper-server/src/main/java/io/papermc/paper/datacomponent/item/PaperPotDecorations.java +++ b/paper-server/src/main/java/io/papermc/paper/datacomponent/item/PaperPotDecorations.java @@ -30,6 +30,15 @@ public record PaperPotDecorations( return this.impl.front().map(CraftItemType::minecraftToBukkitNew).orElse(null); } + @Override + public Builder toBuilder() { + return new BuilderImpl() + .front(this.front()) + .right(this.right()) + .back(this.back()) + .left(this.left()); + } + @Override public net.minecraft.world.level.block.entity.PotDecorations getHandle() { return this.impl; diff --git a/paper-server/src/main/java/io/papermc/paper/datacomponent/item/PaperPotionContents.java b/paper-server/src/main/java/io/papermc/paper/datacomponent/item/PaperPotionContents.java index cc74da94894e..498e10e372d9 100644 --- a/paper-server/src/main/java/io/papermc/paper/datacomponent/item/PaperPotionContents.java +++ b/paper-server/src/main/java/io/papermc/paper/datacomponent/item/PaperPotionContents.java @@ -63,6 +63,15 @@ public Color computeEffectiveColor() { return Color.fromARGB(this.impl.getColor()); } + @Override + public Builder toBuilder() { + return new BuilderImpl() + .potion(this.potion()) + .customColor(this.customColor()) + .customName(this.customName()) + .customEffects(this.customEffects()); + } + static final class BuilderImpl implements PotionContents.Builder { private final List customEffects = new ObjectArrayList<>(); @@ -101,6 +110,13 @@ public PotionContents.Builder addCustomEffects(final List effects) return this; } + @Override + public Builder customEffects(final List effects) { + this.customEffects.clear(); + effects.forEach(this::addCustomEffect); + return this; + } + @Override public PotionContents build() { if (this.type == null && this.color == null && this.customEffects.isEmpty() && this.customName == null) { diff --git a/paper-server/src/main/java/io/papermc/paper/datacomponent/item/PaperSeededContainerLoot.java b/paper-server/src/main/java/io/papermc/paper/datacomponent/item/PaperSeededContainerLoot.java index 1ee469b3b690..307fea99b308 100644 --- a/paper-server/src/main/java/io/papermc/paper/datacomponent/item/PaperSeededContainerLoot.java +++ b/paper-server/src/main/java/io/papermc/paper/datacomponent/item/PaperSeededContainerLoot.java @@ -27,6 +27,11 @@ public long seed() { return this.impl.seed(); } + @Override + public Builder toBuilder() { + return new BuilderImpl(this.lootTable()).seed(this.seed()); + } + static final class BuilderImpl implements SeededContainerLoot.Builder { private long seed = LootTable.RANDOMIZE_SEED; diff --git a/paper-server/src/main/java/io/papermc/paper/datacomponent/item/PaperSuspiciousStewEffects.java b/paper-server/src/main/java/io/papermc/paper/datacomponent/item/PaperSuspiciousStewEffects.java index 41df23c7e7e7..d2a64ff18f0e 100644 --- a/paper-server/src/main/java/io/papermc/paper/datacomponent/item/PaperSuspiciousStewEffects.java +++ b/paper-server/src/main/java/io/papermc/paper/datacomponent/item/PaperSuspiciousStewEffects.java @@ -25,6 +25,11 @@ public net.minecraft.world.item.component.SuspiciousStewEffects getHandle() { return MCUtil.transformUnmodifiable(this.impl.effects(), entry -> create(CraftPotionEffectType.minecraftHolderToBukkit(entry.effect()), entry.duration())); } + @Override + public Builder toBuilder() { + return new BuilderImpl().effects(this.effects()); + } + static final class BuilderImpl implements Builder { private final List effects = new ObjectArrayList<>(); @@ -44,6 +49,13 @@ public Builder addAll(final Collection entries) { return this; } + @Override + public Builder effects(final Collection entries) { + this.effects.clear(); + entries.forEach(this::add); + return this; + } + @Override public SuspiciousStewEffects build() { if (this.effects.isEmpty()) { diff --git a/paper-server/src/main/java/io/papermc/paper/datacomponent/item/PaperTooltipDisplay.java b/paper-server/src/main/java/io/papermc/paper/datacomponent/item/PaperTooltipDisplay.java index 8062486f41f9..5bfee20869b6 100644 --- a/paper-server/src/main/java/io/papermc/paper/datacomponent/item/PaperTooltipDisplay.java +++ b/paper-server/src/main/java/io/papermc/paper/datacomponent/item/PaperTooltipDisplay.java @@ -29,6 +29,13 @@ public Set hiddenComponents() { .collect(Collectors.toCollection(ReferenceLinkedOpenHashSet::new)); } + @Override + public Builder toBuilder() { + return new BuilderImpl() + .hideTooltip(this.hideTooltip()) + .hiddenComponents(this.hiddenComponents()); + } + static final class BuilderImpl implements Builder { private final Set hiddenComponents = new ReferenceLinkedOpenHashSet<>(); @@ -46,8 +53,15 @@ public Builder addHiddenComponents(final DataComponentType... components) { return this; } + @Override + public Builder addHiddenComponents(final Set components) { + this.hiddenComponents.addAll(components); + return this; + } + @Override public Builder hiddenComponents(final Set components) { + this.hiddenComponents.clear(); this.hiddenComponents.addAll(components); return this; } diff --git a/paper-server/src/main/java/io/papermc/paper/datacomponent/item/PaperUseCooldown.java b/paper-server/src/main/java/io/papermc/paper/datacomponent/item/PaperUseCooldown.java index b5e2e7387431..afa4f8e66a63 100644 --- a/paper-server/src/main/java/io/papermc/paper/datacomponent/item/PaperUseCooldown.java +++ b/paper-server/src/main/java/io/papermc/paper/datacomponent/item/PaperUseCooldown.java @@ -28,6 +28,11 @@ public float seconds() { .orElse(null); } + @Override + public Builder toBuilder() { + return new BuilderImpl(this.seconds()).cooldownGroup(this.cooldownGroup()); + } + static final class BuilderImpl implements Builder { private final float seconds; diff --git a/paper-server/src/main/java/io/papermc/paper/datacomponent/item/PaperWeapon.java b/paper-server/src/main/java/io/papermc/paper/datacomponent/item/PaperWeapon.java index 0d3fb7aa0c99..b9540daf5f87 100644 --- a/paper-server/src/main/java/io/papermc/paper/datacomponent/item/PaperWeapon.java +++ b/paper-server/src/main/java/io/papermc/paper/datacomponent/item/PaperWeapon.java @@ -22,6 +22,13 @@ public float disableBlockingForSeconds() { return this.impl.disableBlockingForSeconds(); } + @Override + public Builder toBuilder() { + return new BuilderImpl() + .itemDamagePerAttack(this.itemDamagePerAttack()) + .disableBlockingForSeconds(this.disableBlockingForSeconds()); + } + static final class BuilderImpl implements Builder { private int itemDamagePerAttack = 1; diff --git a/paper-server/src/main/java/io/papermc/paper/datacomponent/item/PaperWritableBookContent.java b/paper-server/src/main/java/io/papermc/paper/datacomponent/item/PaperWritableBookContent.java index 559343a33bad..82eb48ffaff7 100644 --- a/paper-server/src/main/java/io/papermc/paper/datacomponent/item/PaperWritableBookContent.java +++ b/paper-server/src/main/java/io/papermc/paper/datacomponent/item/PaperWritableBookContent.java @@ -24,6 +24,11 @@ public net.minecraft.world.item.component.WritableBookContent getHandle() { return MCUtil.transformUnmodifiable(this.impl.pages(), input -> Filtered.of(input.raw(), input.filtered().orElse(null))); } + @Override + public Builder toBuilder() { + return new BuilderImpl().filteredPages(this.pages()); + } + static final class BuilderImpl implements WritableBookContent.Builder { private final List> pages = new ObjectArrayList<>(); @@ -65,6 +70,17 @@ public WritableBookContent.Builder addPages(final List pages) { return this; } + @Override + public Builder pages(final List pages) { + this.pages.clear(); + validatePageCount(0, pages.size()); + for (final String page : pages) { + validatePageLength(page); + this.pages.add(Filterable.passThrough(page)); + } + return this; + } + @Override public WritableBookContent.Builder addFilteredPage(final Filtered page) { validatePageLength(page.raw()); @@ -89,6 +105,20 @@ public WritableBookContent.Builder addFilteredPages(final List> return this; } + @Override + public Builder filteredPages(final List> pages) { + this.pages.clear(); + validatePageCount(0, pages.size()); + for (final Filtered page : pages) { + validatePageLength(page.raw()); + if (page.filtered() != null) { + validatePageLength(page.filtered()); + } + this.pages.add(new Filterable<>(page.raw(), Optional.ofNullable(page.filtered()))); + } + return this; + } + @Override public WritableBookContent build() { if (this.pages.isEmpty()) { diff --git a/paper-server/src/main/java/io/papermc/paper/datacomponent/item/PaperWrittenBookContent.java b/paper-server/src/main/java/io/papermc/paper/datacomponent/item/PaperWrittenBookContent.java index 037a6695bdb8..c3351cf57afb 100644 --- a/paper-server/src/main/java/io/papermc/paper/datacomponent/item/PaperWrittenBookContent.java +++ b/paper-server/src/main/java/io/papermc/paper/datacomponent/item/PaperWrittenBookContent.java @@ -6,6 +6,7 @@ import io.papermc.paper.util.MCUtil; import it.unimi.dsi.fastutil.objects.ObjectArrayList; import java.util.List; +import java.util.Objects; import java.util.Optional; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.ComponentLike; @@ -55,6 +56,17 @@ public boolean resolved() { return this.impl.resolved(); } + @Override + public Builder toBuilder() { + return new BuilderImpl(this.title(), this.author()) + .generation(this.generation()) + .resolved(this.resolved()) + .pages(this.pages().stream() + .map(Filtered::filtered) + .filter(Objects::nonNull) + .toList()); + } + static final class BuilderImpl implements WrittenBookContent.Builder { private final List> pages = new ObjectArrayList<>(); @@ -150,6 +162,17 @@ public WrittenBookContent.Builder addPages(final List p return this; } + @Override + public Builder pages(final List pages) { + this.pages.clear(); + for (final ComponentLike page : pages) { + final Component component = page.asComponent(); + validatePageLength(component); + this.pages.add(Filterable.passThrough(asVanilla(component))); + } + return this; + } + @Override public WrittenBookContent.Builder addFilteredPage(final Filtered page) { final Component raw = page.raw().asComponent(); @@ -169,6 +192,13 @@ public WrittenBookContent.Builder addFilteredPages(final List> pages) { + this.pages.clear(); + pages.forEach(this::addFilteredPage); + return this; + } + @Override public WrittenBookContent build() { return new PaperWrittenBookContent(new net.minecraft.world.item.component.WrittenBookContent(