From b0e26190820e1908887f15da4067ddc019b8086a Mon Sep 17 00:00:00 2001 From: XiaoMoMi Date: Tue, 19 Aug 2025 05:15:11 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=B5=8B=E8=AF=95=E4=BB=A3?= =?UTF-8?q?=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../plugin/command/feature/TestCommand.java | 31 ++++++----- .../core/item/modifier/ItemDataModifiers.java | 2 + .../core/item/modifier/PDCModifier.java | 54 +++++++++++++++++++ 3 files changed, 74 insertions(+), 13 deletions(-) create mode 100644 core/src/main/java/net/momirealms/craftengine/core/item/modifier/PDCModifier.java diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/feature/TestCommand.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/feature/TestCommand.java index 4c404b53f..bb3ef7aaf 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/feature/TestCommand.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/feature/TestCommand.java @@ -7,13 +7,16 @@ import net.momirealms.craftengine.core.block.parser.BlockStateParser; import net.momirealms.craftengine.core.plugin.CraftEngine; import net.momirealms.craftengine.core.plugin.command.CraftEngineCommandManager; import org.bukkit.Location; +import org.bukkit.block.data.BlockData; import org.bukkit.command.CommandSender; import org.bukkit.entity.Minecart; +import org.bukkit.entity.Player; import org.checkerframework.checker.nullness.qual.NonNull; import org.incendo.cloud.Command; import org.incendo.cloud.bukkit.parser.location.LocationParser; import org.incendo.cloud.context.CommandContext; import org.incendo.cloud.context.CommandInput; +import org.incendo.cloud.parser.standard.IntegerParser; import org.incendo.cloud.parser.standard.StringParser; import org.incendo.cloud.suggestion.Suggestion; import org.incendo.cloud.suggestion.SuggestionProvider; @@ -30,20 +33,22 @@ public class TestCommand extends BukkitCommandFeature { @Override public Command.Builder assembleCommand(org.incendo.cloud.CommandManager manager, Command.Builder builder) { return builder - .required("location", LocationParser.locationParser()) - .required("id", StringParser.stringComponent(StringParser.StringMode.GREEDY_FLAG_YIELDING).suggestionProvider(new SuggestionProvider<>() { - @Override - public @NonNull CompletableFuture> suggestionsFuture(@NonNull CommandContext context, @NonNull CommandInput input) { - return CompletableFuture.completedFuture(BlockStateParser.fillSuggestions(input.input(), input.cursor()).stream().map(Suggestion::suggestion).collect(Collectors.toList())); - } - })) + .required("start", IntegerParser.integerParser(0)) + .senderType(Player.class) .handler(context -> { - String data = context.get("id"); - Location location = context.get("location"); - ImmutableBlockState state = BlockStateParser.deserialize(data); - if (state == null) return; - Minecart minecart = location.getWorld().spawn(location, Minecart.class); - minecart.setDisplayBlockData(BlockStateUtils.fromBlockData(state.customBlockState().handle())); + Player sender = context.sender(); + int start = context.get("start"); + int x = sender.getChunk().getX() * 16; + int z = sender.getChunk().getZ() * 16; + int y = (sender.getLocation().getBlockY() / 16) * 16; + for (int a = 0; a < 16; a++) { + for (int b = 0; b < 16; b++) { + for (int c = 0; c < 16; c++) { + BlockData blockData = BlockStateUtils.fromBlockData(BlockStateUtils.idToBlockState(start + a + b * 16 + c * 256)); + sender.getWorld().setBlockData(new Location(sender.getWorld(), x + a, y + b, z + c), blockData); + } + } + } }); } diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/modifier/ItemDataModifiers.java b/core/src/main/java/net/momirealms/craftengine/core/item/modifier/ItemDataModifiers.java index 402efa393..2b6672de8 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/item/modifier/ItemDataModifiers.java +++ b/core/src/main/java/net/momirealms/craftengine/core/item/modifier/ItemDataModifiers.java @@ -32,6 +32,7 @@ public final class ItemDataModifiers { public static final Key ATTRIBUTES = Key.of("craftengine:attributes"); public static final Key ARGUMENTS = Key.of("craftengine:arguments"); public static final Key VERSION = Key.of("craftengine:version"); + public static final Key PDC = Key.of("craftengine:pdc"); public static final Key ITEM_NAME = Key.of("craftengine:item-name"); public static final Key OVERWRITABLE_ITEM_NAME = Key.of("craftengine:overwritable-item-name"); public static final Key JUKEBOX_PLAYABLE = Key.of("craftengine:jukebox-playable"); @@ -74,6 +75,7 @@ public final class ItemDataModifiers { register(HIDE_TOOLTIP, HideTooltipModifier.FACTORY); register(ARGUMENTS, ArgumentsModifier.FACTORY); register(OVERWRITABLE_ITEM_NAME, OverwritableItemNameModifier.FACTORY); + register(PDC, PDCModifier.FACTORY); if (VersionHelper.isOrAbove1_20_5()) { register(CUSTOM_NAME, CustomNameModifier.FACTORY); register(ITEM_NAME, ItemNameModifier.FACTORY); diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/modifier/PDCModifier.java b/core/src/main/java/net/momirealms/craftengine/core/item/modifier/PDCModifier.java new file mode 100644 index 000000000..b6a52e91d --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/item/modifier/PDCModifier.java @@ -0,0 +1,54 @@ +package net.momirealms.craftengine.core.item.modifier; + +import net.momirealms.craftengine.core.item.ComponentKeys; +import net.momirealms.craftengine.core.item.Item; +import net.momirealms.craftengine.core.item.ItemBuildContext; +import net.momirealms.craftengine.core.item.ItemDataModifierFactory; +import net.momirealms.craftengine.core.plugin.CraftEngine; +import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.MiscUtils; +import net.momirealms.craftengine.core.util.ResourceConfigUtils; +import net.momirealms.craftengine.core.util.VersionHelper; +import net.momirealms.sparrow.nbt.CompoundTag; +import net.momirealms.sparrow.nbt.Tag; + +import java.util.List; +import java.util.Map; +import java.util.Optional; + +public class PDCModifier implements ItemDataModifier { + public static final String BUKKIT_PDC = "PublicBukkitValues"; + public static final Factory FACTORY = new Factory<>(); + private final CompoundTag data; + + public PDCModifier(CompoundTag data) { + this.data = data; + } + + @Override + public Key type() { + return ItemDataModifiers.PDC; + } + + @Override + public Item apply(Item item, ItemBuildContext context) { + if (VersionHelper.isOrAbove1_20_5()) { + CompoundTag customData = (CompoundTag) Optional.ofNullable(item.getSparrowNBTComponent(ComponentKeys.CUSTOM_DATA)).orElseGet(CompoundTag::new); + customData.put(BUKKIT_PDC, this.data); + item.setNBTComponent(ComponentKeys.CUSTOM_DATA, customData); + } else { + item.setTag(this.data, BUKKIT_PDC); + } + return item; + } + + public static class Factory implements ItemDataModifierFactory { + + @Override + public ItemDataModifier create(Object arg) { + Map data = ResourceConfigUtils.getAsMap(arg, "pdc"); + CompoundTag tag = (CompoundTag) CraftEngine.instance().platform().javaToSparrowNBT(data); + return new PDCModifier<>(tag); + } + } +}