Expose more argument types (#12665)

Co-authored-by: Bjarne Koll <git@lynxplay.dev>
Co-authored-by: Lulu13022002 <41980282+Lulu13022002@users.noreply.github.com>
This commit is contained in:
Strokkur24
2025-08-23 22:10:41 +02:00
committed by GitHub
parent 5622c9dd73
commit 42b653b197
13 changed files with 414 additions and 4 deletions
@@ -2,6 +2,7 @@ package io.papermc.paper.command.brigadier.argument;
import com.destroystokyo.paper.profile.CraftPlayerProfile;
import com.google.common.collect.Collections2;
import com.google.common.collect.ForwardingSet;
import com.google.common.collect.Lists;
import com.google.common.collect.Range;
import com.mojang.brigadier.StringReader;
@@ -12,16 +13,22 @@ import com.mojang.brigadier.suggestion.Suggestions;
import com.mojang.brigadier.suggestion.SuggestionsBuilder;
import io.papermc.paper.adventure.PaperAdventure;
import io.papermc.paper.command.brigadier.PaperCommands;
import io.papermc.paper.command.brigadier.argument.predicate.BlockInWorldPredicate;
import io.papermc.paper.command.brigadier.argument.predicate.ItemStackPredicate;
import io.papermc.paper.command.brigadier.argument.range.DoubleRangeProvider;
import io.papermc.paper.command.brigadier.argument.range.IntegerRangeProvider;
import io.papermc.paper.command.brigadier.argument.range.RangeProvider;
import io.papermc.paper.command.brigadier.argument.resolvers.AngleResolver;
import io.papermc.paper.command.brigadier.argument.resolvers.BlockPositionResolver;
import io.papermc.paper.command.brigadier.argument.resolvers.ColumnBlockPositionResolver;
import io.papermc.paper.command.brigadier.argument.resolvers.ColumnFinePositionResolver;
import io.papermc.paper.command.brigadier.argument.resolvers.FinePositionResolver;
import io.papermc.paper.command.brigadier.argument.resolvers.PlayerProfileListResolver;
import io.papermc.paper.command.brigadier.argument.resolvers.RotationResolver;
import io.papermc.paper.command.brigadier.argument.resolvers.selector.EntitySelectorArgumentResolver;
import io.papermc.paper.command.brigadier.argument.resolvers.selector.PlayerSelectorArgumentResolver;
import io.papermc.paper.command.brigadier.position.ColumnBlockPositionImpl;
import io.papermc.paper.command.brigadier.position.ColumnFinePositionImpl;
import io.papermc.paper.entity.LookAnchor;
import io.papermc.paper.math.Rotation;
import io.papermc.paper.registry.PaperRegistries;
@@ -31,7 +38,9 @@ import io.papermc.paper.registry.TypedKey;
import io.papermc.paper.util.MCUtil;
import java.util.Collection;
import java.util.Collections;
import java.util.EnumSet;
import java.util.List;
import java.util.Set;
import java.util.UUID;
import java.util.concurrent.CompletableFuture;
import java.util.function.Function;
@@ -42,6 +51,7 @@ import net.kyori.adventure.text.format.Style;
import net.kyori.adventure.text.format.TextColor;
import net.minecraft.advancements.critereon.MinMaxBounds;
import net.minecraft.commands.CommandSourceStack;
import net.minecraft.commands.arguments.AngleArgument;
import net.minecraft.commands.arguments.ColorArgument;
import net.minecraft.commands.arguments.ComponentArgument;
import net.minecraft.commands.arguments.DimensionArgument;
@@ -63,21 +73,28 @@ import net.minecraft.commands.arguments.TemplateMirrorArgument;
import net.minecraft.commands.arguments.TemplateRotationArgument;
import net.minecraft.commands.arguments.TimeArgument;
import net.minecraft.commands.arguments.UuidArgument;
import net.minecraft.commands.arguments.blocks.BlockPredicateArgument;
import net.minecraft.commands.arguments.blocks.BlockStateArgument;
import net.minecraft.commands.arguments.coordinates.BlockPosArgument;
import net.minecraft.commands.arguments.coordinates.ColumnPosArgument;
import net.minecraft.commands.arguments.coordinates.RotationArgument;
import net.minecraft.commands.arguments.coordinates.SwizzleArgument;
import net.minecraft.commands.arguments.coordinates.Vec2Argument;
import net.minecraft.commands.arguments.coordinates.Vec3Argument;
import net.minecraft.commands.arguments.item.ItemArgument;
import net.minecraft.commands.arguments.item.ItemPredicateArgument;
import net.minecraft.core.BlockPos;
import net.minecraft.core.Direction;
import net.minecraft.core.registries.Registries;
import net.minecraft.resources.ResourceKey;
import net.minecraft.server.MinecraftServer;
import net.minecraft.server.level.ServerLevel;
import net.minecraft.server.level.ServerPlayer;
import net.minecraft.world.level.Level;
import net.minecraft.world.level.block.state.pattern.BlockInWorld;
import net.minecraft.world.phys.Vec2;
import net.minecraft.world.phys.Vec3;
import org.bukkit.Axis;
import org.bukkit.GameMode;
import org.bukkit.HeightMap;
import org.bukkit.Keyed;
@@ -88,11 +105,14 @@ import org.bukkit.block.structure.Mirror;
import org.bukkit.block.structure.StructureRotation;
import org.bukkit.craftbukkit.CraftHeightMap;
import org.bukkit.craftbukkit.CraftRegistry;
import org.bukkit.craftbukkit.CraftWorld;
import org.bukkit.craftbukkit.block.CraftBlockEntityState;
import org.bukkit.craftbukkit.block.CraftBlockStates;
import org.bukkit.craftbukkit.block.data.CraftBlockData;
import org.bukkit.craftbukkit.inventory.CraftItemStack;
import org.bukkit.craftbukkit.scoreboard.CraftCriteria;
import org.bukkit.craftbukkit.scoreboard.CraftScoreboardTranslations;
import org.bukkit.craftbukkit.util.CraftLocation;
import org.bukkit.craftbukkit.util.CraftNamespacedKey;
import org.bukkit.inventory.ItemStack;
import org.bukkit.scoreboard.Criteria;
@@ -154,6 +174,32 @@ public class VanillaArgumentProviderImpl implements VanillaArgumentProvider {
});
}
@Override
public ArgumentType<ColumnBlockPositionResolver> columnBlockPosition() {
return this.wrap(ColumnPosArgument.columnPos(), (result) -> sourceStack -> {
final BlockPos pos = result.getBlockPos((CommandSourceStack) sourceStack);
return new ColumnBlockPositionImpl(pos.getX(), pos.getZ());
});
}
@Override
public ArgumentType<BlockInWorldPredicate> blockInWorldPredicate() {
return this.wrap(BlockPredicateArgument.blockPredicate(PaperCommands.INSTANCE.getBuildContext()),
result -> (block, loadChunk) -> {
final BlockInWorld blockInWorld = new BlockInWorld(
((CraftWorld) block.getWorld()).getHandle(),
CraftLocation.toBlockPosition(block.getLocation()),
loadChunk
);
// Get state lazy loads the state, will remain null if chunk is unloaded.
if (blockInWorld.getState() == null) return BlockInWorldPredicate.Result.UNLOADED_CHUNK;
return result.test(blockInWorld) ? BlockInWorldPredicate.Result.TRUE : BlockInWorldPredicate.Result.FALSE;
}
);
}
@Override
public ArgumentType<FinePositionResolver> finePosition(final boolean centerIntegers) {
return this.wrap(Vec3Argument.vec3(centerIntegers), (result) -> sourceStack -> {
@@ -163,6 +209,15 @@ public class VanillaArgumentProviderImpl implements VanillaArgumentProvider {
});
}
@Override
public ArgumentType<ColumnFinePositionResolver> columnFinePosition(final boolean centerIntegers) {
return this.wrap(Vec2Argument.vec2(centerIntegers), (result) -> sourceStack -> {
final Vec3 vec3 = result.getPosition((CommandSourceStack) sourceStack);
return new ColumnFinePositionImpl(vec3.x(), vec3.z());
});
}
@Override
public ArgumentType<RotationResolver> rotation() {
return this.wrap(RotationArgument.rotation(), (result) -> sourceStack -> {
@@ -172,6 +227,35 @@ public class VanillaArgumentProviderImpl implements VanillaArgumentProvider {
});
}
@Override
public ArgumentType<AngleResolver> angle() {
return this.wrap(AngleArgument.angle(), (result) -> sourceStack -> result.getAngle((CommandSourceStack) sourceStack));
}
@Override
public ArgumentType<AxisSet> axes() {
final class AxisSetImpl extends ForwardingSet<Axis> implements AxisSet {
private final EnumSet<Axis> inner;
public AxisSetImpl(final EnumSet<Axis> inner) {
this.inner = inner;
}
@Override
protected Set<Axis> delegate() {
return this.inner;
}
}
return this.wrap(SwizzleArgument.swizzle(), (result) -> {
final EnumSet<Axis> bukkitAxes = EnumSet.noneOf(Axis.class);
for (final Direction.Axis nmsAxis : result) {
bukkitAxes.add(CraftBlockData.toBukkit(nmsAxis, Axis.class));
}
return new AxisSetImpl(bukkitAxes);
});
}
@Override
public ArgumentType<BlockState> blockState() {
return this.wrap(BlockStateArgument.block(PaperCommands.INSTANCE.getBuildContext()), (result) -> {
@@ -0,0 +1,6 @@
package io.papermc.paper.command.brigadier.position;
import io.papermc.paper.command.brigadier.argument.position.ColumnBlockPosition;
public record ColumnBlockPositionImpl(int blockX, int blockZ) implements ColumnBlockPosition {
}
@@ -0,0 +1,6 @@
package io.papermc.paper.command.brigadier.position;
import io.papermc.paper.command.brigadier.argument.position.ColumnFinePosition;
public record ColumnFinePositionImpl(double x, double z) implements ColumnFinePosition {
}