Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions cloud-sponge/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -9,12 +9,12 @@ dependencies {
implementation(libs.cloud.brigadier)
offlineLinkedJavadoc(project(":cloud-minecraft-modded-common"))
implementation(project(":cloud-minecraft-modded-common"))
compileOnly("org.spongepowered:spongeapi:11.0.0-SNAPSHOT")
compileOnly("org.spongepowered:sponge:1.20.6-11.0.0-SNAPSHOT")
compileOnly("org.spongepowered:spongeapi:14.1.0-SNAPSHOT")
compileOnly("org.spongepowered:sponge:1.21.4-14.0.0-SNAPSHOT")
}

neoForge {
enable {
neoFormVersion = "1.20.6-20240627.102356"
neoFormVersion = "1.21.4-20241203.161809"
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,7 @@
import org.spongepowered.api.command.CommandResult;
import org.spongepowered.api.command.parameter.ArgumentReader;
import org.spongepowered.api.command.registrar.tree.CommandTreeNode;
import org.spongepowered.api.registry.RegistryHolder;

import static net.kyori.adventure.text.Component.text;

Expand Down Expand Up @@ -118,7 +119,7 @@ private CommandNode<C> namedNode() {
}

@Override
public CommandTreeNode.Root commandTree() {
public CommandTreeNode.Root commandTree(final RegistryHolder holder) {
final CommandTreeNode<CommandTreeNode.Root> root = CommandTreeNode.root();

final CommandNode<C> cloud = this.namedNode();
Expand All @@ -129,41 +130,42 @@ public CommandTreeNode.Root commandTree() {

this.addRequirement(cloud, root);

this.addChildren(root, cloud);
this.addChildren(root, cloud, holder);
return (CommandTreeNode.Root) root;
}

private void addChildren(final CommandTreeNode<?> node, final CommandNode<C> cloud) {
private void addChildren(final CommandTreeNode<?> node, final CommandNode<C> cloud, final RegistryHolder holder) {
for (final CommandNode<C> child : cloud.children()) {
final CommandComponent<C> value = child.component();
final CommandTreeNode.Argument<? extends CommandTreeNode.Argument<?>> treeNode;
if (value.parser() instanceof LiteralParser) {
treeNode = (CommandTreeNode.Argument<? extends CommandTreeNode.Argument<?>>) CommandTreeNode.literal();
} else if (value.parser() instanceof AggregateParser<C, ?> aggregate) {
this.handleAggregate(node, child, aggregate);
this.handleAggregate(node, child, aggregate, holder);
continue;
} else {
treeNode = this.commandManager.parserMapper().mapComponent(value);
treeNode = this.commandManager.parserMapper().mapComponent(value, holder);
}
this.addRequirement(child, treeNode);
if (canExecute(child)) {
treeNode.executable();
}
this.addChildren(treeNode, child);
this.addChildren(treeNode, child, holder);
node.child(value.name(), treeNode);
}
}

private void handleAggregate(
final CommandTreeNode<?> node,
final CommandNode<C> child,
final AggregateParser<C, ?> compound
final AggregateParser<C, ?> compound,
final RegistryHolder holder
) {
final CommandTreeNode.Argument<? extends CommandTreeNode.Argument<?>> treeNode;
final ArrayDeque<Pair<String, CommandTreeNode.Argument<? extends CommandTreeNode.Argument<?>>>> nodes = new ArrayDeque<>();
for (final CommandComponent<C> component : compound.components()) {
final String name = component.name();
nodes.add(Pair.of(name, this.commandManager.parserMapper().mapParser(component.parser())));
nodes.add(Pair.of(name, this.commandManager.parserMapper().mapParser(component.parser(), holder)));
}
Pair<String, CommandTreeNode.Argument<? extends CommandTreeNode.Argument<?>>> argument = null;
while (!nodes.isEmpty()) {
Expand All @@ -180,7 +182,7 @@ private void handleAggregate(
this.addRequirement(child, argument.second());
}
treeNode = argument.second();
this.addChildren(treeNode, child);
this.addChildren(treeNode, child, holder);
node.child(compound.components().get(0).toString(), treeNode);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@

import org.checkerframework.checker.nullness.qual.NonNull;
import org.spongepowered.api.command.registrar.tree.CommandTreeNode;
import org.spongepowered.api.registry.RegistryHolder;

/**
* Implemented by {@link org.incendo.cloud.parser.ArgumentParser} which also supply a special {@link CommandTreeNode.Argument}.
Expand All @@ -34,8 +35,9 @@ public interface NodeSource {
/**
* Get the node for this parser.
*
* @param registryHolder registry holder
* @return argument node
*/
CommandTreeNode.@NonNull Argument<? extends CommandTreeNode.Argument<?>> node();
CommandTreeNode.@NonNull Argument<? extends CommandTreeNode.Argument<?>> node(RegistryHolder registryHolder);

}
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,7 @@
import org.spongepowered.api.event.lifecycle.RegisterCommandEvent;
import org.spongepowered.api.registry.DefaultedRegistryType;
import org.spongepowered.api.registry.Registry;
import org.spongepowered.api.registry.RegistryHolder;
import org.spongepowered.api.registry.RegistryType;
import org.spongepowered.api.registry.RegistryTypes;
import org.spongepowered.math.vector.Vector2d;
Expand Down Expand Up @@ -115,7 +116,6 @@ public SpongeCommandManager(
this.senderMapper = senderMapper;
this.parserMapper = new SpongeParserMapper<>();
this.registerCommandPreProcessor(new SpongeCommandPreprocessor<>(this));
this.registerParsers();
this.captionRegistry().registerProvider(new SpongeDefaultCaptionsProvider<>());
this.suggestionFactory = super.suggestionFactory().mapped(SpongeSuggestion::spongeSuggestion);

Expand All @@ -137,19 +137,24 @@ private void checkLateCreation() {
);
}

private void registerParsers() {
/**
* Register parsers
*
* @param registryHolder Register holder
*/
public void registerParsers(final RegistryHolder registryHolder) {
this.parserRegistry()
.registerParser(ComponentParser.componentParser())
.registerParser(ComponentParser.componentParser(registryHolder))
.registerParser(NamedTextColorParser.namedTextColorParser())
.registerParser(OperatorParser.operatorParser())
.registerParser(WorldParser.worldParser())
.registerParser(ProtoItemStackParser.protoItemStackParser())
.registerParser(ItemStackPredicateParser.itemStackPredicateParser())
.registerParser(ProtoItemStackParser.protoItemStackParser(registryHolder))
.registerParser(ItemStackPredicateParser.itemStackPredicateParser(registryHolder))
.registerParser(ResourceKeyParser.resourceKeyParser())
.registerParser(GameProfileParser.gameProfileParser())
.registerParser(GameProfileCollectionParser.gameProfileCollectionParser())
.registerParser(BlockInputParser.blockInputParser())
.registerParser(BlockPredicateParser.blockPredicateParser())
.registerParser(BlockInputParser.blockInputParser(registryHolder))
.registerParser(BlockPredicateParser.blockPredicateParser(registryHolder))
.registerParser(UserParser.userParser())
.registerParser(DataContainerParser.dataContainerParser())
.registerAnnotationMapper(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,7 @@
import org.incendo.cloud.parser.standard.UUIDParser;
import org.spongepowered.api.command.registrar.tree.CommandTreeNode;
import org.spongepowered.api.command.registrar.tree.CommandTreeNodeTypes;
import org.spongepowered.api.registry.RegistryHolder;

import static java.util.Objects.requireNonNull;

Expand All @@ -60,11 +61,12 @@ public final class SpongeParserMapper<C> {
private final Map<Class<?>, Mapping<C, ?>> mappers = new HashMap<>();

SpongeParserMapper() {
this.initStandardMappers();

}

CommandTreeNode.Argument<? extends CommandTreeNode.Argument<?>> mapComponent(final CommandComponent<C> commandComponent) {
final CommandTreeNode.Argument<? extends CommandTreeNode.Argument<?>> result = this.mapParser(commandComponent.parser());
CommandTreeNode.Argument<? extends CommandTreeNode.Argument<?>> mapComponent(
final CommandComponent<C> commandComponent, final RegistryHolder holder) {
final CommandTreeNode.Argument<? extends CommandTreeNode.Argument<?>> result = this.mapParser(commandComponent.parser(), holder);
// final boolean customSuggestionsProvider = !DELEGATING_SUGGESTIONS_PROVIDER.isInstance(commandComponent.getSuggestionsProvider());
// todo: not exactly the same as in v1...
final boolean customSuggestionsProvider = commandComponent.parser() != commandComponent.suggestionProvider();
Expand All @@ -75,13 +77,14 @@ CommandTreeNode.Argument<? extends CommandTreeNode.Argument<?>> mapComponent(fin
}

@SuppressWarnings({"unchecked", "rawtypes"})
CommandTreeNode.Argument<? extends CommandTreeNode.Argument<?>> mapParser(final ArgumentParser<C, ?> argumentParser) {
CommandTreeNode.Argument<? extends CommandTreeNode.Argument<?>> mapParser(
final ArgumentParser<C, ?> argumentParser, final RegistryHolder holder) {
final CommandTreeNode.Argument<? extends CommandTreeNode.Argument<?>> result;
ArgumentParser<C, ?> parser = argumentParser;
while (parser instanceof MappedArgumentParser<?, ?, ?>) {
parser = ((MappedArgumentParser<C, ?, ?>) parser).baseParser();
}
final Mapping<C, ?> mapper = this.mappers.get(parser.getClass());
final Mapping<C, ?> mapper = this.getOrCreateMappers(holder).get(parser.getClass());
if (mapper != null) {
final CommandTreeNode.Argument<? extends CommandTreeNode.Argument<?>> apply =
(CommandTreeNode.Argument<? extends CommandTreeNode.Argument<?>>) ((Function) mapper.mapper).apply(parser);
Expand All @@ -91,43 +94,51 @@ CommandTreeNode.Argument<? extends CommandTreeNode.Argument<?>> mapParser(final
}
result = apply;
} else if (parser instanceof NodeSource) {
result = ((NodeSource) parser).node();
result = ((NodeSource) parser).node(holder);
} else {
result = CommandTreeNodeTypes.STRING.get().createNode().customCompletions().word();
result = CommandTreeNodeTypes.STRING.get(holder).createNode().customCompletions().word();
}
return result;
}

private void initStandardMappers() {
private synchronized Map<Class<?>, Mapping<C, ?>> getOrCreateMappers(final RegistryHolder holder) {
if (this.mappers.isEmpty()) {
this.initStandardMappers(holder);
}

return this.mappers;
}

private void initStandardMappers(final RegistryHolder holder) {
this.registerMapping(new TypeToken<StringParser<C>>() {
}, builder -> builder.to(stringParser -> {
final StringParser.StringMode mode = stringParser.stringMode();
if (mode == StringParser.StringMode.SINGLE) {
return CommandTreeNodeTypes.STRING.get().createNode().customCompletions().word();
return CommandTreeNodeTypes.STRING.get(holder).createNode().customCompletions().word();
} else if (mode == StringParser.StringMode.QUOTED) {
return CommandTreeNodeTypes.STRING.get().createNode().customCompletions();
return CommandTreeNodeTypes.STRING.get(holder).createNode().customCompletions();
} else if (mode == StringParser.StringMode.GREEDY || mode == StringParser.StringMode.GREEDY_FLAG_YIELDING) {
return CommandTreeNodeTypes.STRING.get().createNode().customCompletions().greedy();
return CommandTreeNodeTypes.STRING.get(holder).createNode().customCompletions().greedy();
}
throw new IllegalArgumentException("Unknown string mode '" + mode + "'!");
}));
this.registerMapping(new TypeToken<ByteParser<C>>() {
}, builder -> builder.to(byteParser -> {
final CommandTreeNode.Range<Integer> node = CommandTreeNodeTypes.INTEGER.get().createNode();
final CommandTreeNode.Range<Integer> node = CommandTreeNodeTypes.INTEGER.get(holder).createNode();
node.min((int) byteParser.range().minByte());
node.max((int) byteParser.range().maxByte());
return node;
}).cloudSuggestions(true));
this.registerMapping(new TypeToken<ShortParser<C>>() {
}, builder -> builder.to(shortParser -> {
final CommandTreeNode.Range<Integer> node = CommandTreeNodeTypes.INTEGER.get().createNode();
final CommandTreeNode.Range<Integer> node = CommandTreeNodeTypes.INTEGER.get(holder).createNode();
node.min((int) shortParser.range().minShort());
node.max((int) shortParser.range().maxShort());
return node;
}).cloudSuggestions(true));
this.registerMapping(new TypeToken<IntegerParser<C>>() {
}, builder -> builder.to(integerParser -> {
final CommandTreeNode.Range<Integer> node = CommandTreeNodeTypes.INTEGER.get().createNode();
final CommandTreeNode.Range<Integer> node = CommandTreeNodeTypes.INTEGER.get(holder).createNode();
if (integerParser.hasMin()) {
node.min(integerParser.range().minInt());
}
Expand All @@ -138,7 +149,7 @@ private void initStandardMappers() {
}).cloudSuggestions(true));
this.registerMapping(new TypeToken<FloatParser<C>>() {
}, builder -> builder.to(floatParser -> {
final CommandTreeNode.Range<Float> node = CommandTreeNodeTypes.FLOAT.get().createNode();
final CommandTreeNode.Range<Float> node = CommandTreeNodeTypes.FLOAT.get(holder).createNode();
if (floatParser.hasMin()) {
node.min(floatParser.range().minFloat());
}
Expand All @@ -149,7 +160,7 @@ private void initStandardMappers() {
}).cloudSuggestions(true));
this.registerMapping(new TypeToken<DoubleParser<C>>() {
}, builder -> builder.to(doubleParser -> {
final CommandTreeNode.Range<Double> node = CommandTreeNodeTypes.DOUBLE.get().createNode();
final CommandTreeNode.Range<Double> node = CommandTreeNodeTypes.DOUBLE.get(holder).createNode();
if (doubleParser.hasMin()) {
node.min(doubleParser.range().minDouble());
}
Expand All @@ -160,7 +171,7 @@ private void initStandardMappers() {
}).cloudSuggestions(true));
this.registerMapping(new TypeToken<LongParser<C>>() {
}, builder -> builder.to(longParser -> {
final CommandTreeNode.Range<Long> node = CommandTreeNodeTypes.LONG.get().createNode();
final CommandTreeNode.Range<Long> node = CommandTreeNodeTypes.LONG.get(holder).createNode();
if (longParser.hasMin()) {
node.min(longParser.range().minLong());
}
Expand All @@ -171,19 +182,19 @@ private void initStandardMappers() {
}).cloudSuggestions(true));
this.registerMapping(new TypeToken<BooleanParser<C>>() {
}, builder -> builder.to(booleanParser -> {
return CommandTreeNodeTypes.BOOL.get().createNode();
return CommandTreeNodeTypes.BOOL.get(holder).createNode();
}));
this.registerMapping(new TypeToken<CommandFlagParser<C>>() {
}, builder -> builder.to(flagArgumentParser -> {
return CommandTreeNodeTypes.STRING.get().createNode().customCompletions().greedy();
return CommandTreeNodeTypes.STRING.get(holder).createNode().customCompletions().greedy();
}));
this.registerMapping(new TypeToken<StringArrayParser<C>>() {
}, builder -> builder.to(stringArrayParser -> {
return CommandTreeNodeTypes.STRING.get().createNode().customCompletions().greedy();
return CommandTreeNodeTypes.STRING.get(holder).createNode().customCompletions().greedy();
}));
this.registerMapping(new TypeToken<UUIDParser<C>>() {
}, builder -> builder.to(uuidParser -> {
return CommandTreeNodeTypes.UUID.get().createNode();
return CommandTreeNodeTypes.UUID.get(holder).createNode();
}));
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,8 @@ final class SpongeRegistrationHandler<C> implements CommandRegistrationHandler<C

private void handleRegistrationEvent(final RegisterCommandEvent<Command.Raw> event) {
this.commandManager.registrationCalled();
this.commandManager.registerParsers(event.registryHolder());

for (final CommandNode<C> node : this.commandManager.commandTree().rootNodes()) {
this.registerCommand(event, requireNonNull(node.component()));
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,9 +24,7 @@
package org.incendo.cloud.sponge.data;

import org.checkerframework.checker.nullness.qual.NonNull;
import org.checkerframework.checker.nullness.qual.Nullable;
import org.incendo.cloud.sponge.exception.ComponentMessageRuntimeException;
import org.spongepowered.api.data.persistence.DataContainer;
import org.spongepowered.api.item.ItemType;
import org.spongepowered.api.item.inventory.ItemStack;
import org.spongepowered.api.item.inventory.ItemStackSnapshot;
Expand All @@ -43,15 +41,6 @@ public interface ProtoItemStack {
*/
@NonNull ItemType itemType();

/**
* Get any extra data besides the {@link ItemType} that may have been parsed.
*
* <p>Will return {@code null} if there is no extra data.</p>
*
* @return the extra data or {@code null}
*/
@Nullable DataContainer extraData();

/**
* Create a new {@link ItemStack} from the state of this {@link ProtoItemStack}.
*
Expand Down
Loading