9
0
mirror of https://github.com/Xiao-MoMi/craft-engine.git synced 2025-12-25 09:59:20 +00:00

添加测试代码

This commit is contained in:
XiaoMoMi
2025-08-19 05:15:11 +08:00
parent 3fc0988c13
commit b0e2619082
3 changed files with 74 additions and 13 deletions

View File

@@ -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<CommandSender> {
@Override
public Command.Builder<? extends CommandSender> assembleCommand(org.incendo.cloud.CommandManager<CommandSender> manager, Command.Builder<CommandSender> builder) {
return builder
.required("location", LocationParser.locationParser())
.required("id", StringParser.stringComponent(StringParser.StringMode.GREEDY_FLAG_YIELDING).suggestionProvider(new SuggestionProvider<>() {
@Override
public @NonNull CompletableFuture<? extends @NonNull Iterable<? extends @NonNull Suggestion>> suggestionsFuture(@NonNull CommandContext<Object> 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);
}
}
}
});
}

View File

@@ -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);

View File

@@ -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<I> implements ItemDataModifier<I> {
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<I> apply(Item<I> 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<I> implements ItemDataModifierFactory<I> {
@Override
public ItemDataModifier<I> create(Object arg) {
Map<String, Object> data = ResourceConfigUtils.getAsMap(arg, "pdc");
CompoundTag tag = (CompoundTag) CraftEngine.instance().platform().javaToSparrowNBT(data);
return new PDCModifier<>(tag);
}
}
}