Skip to content

Commit 42d4e6e

Browse files
Vilsu221jpenilla
authored andcommitted
Update to API-14 & fix parsers
1 parent 02fffbd commit 42d4e6e

31 files changed

Lines changed: 210 additions & 177 deletions

cloud-sponge/build.gradle.kts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,12 +9,12 @@ dependencies {
99
implementation(libs.cloud.brigadier)
1010
offlineLinkedJavadoc(project(":cloud-minecraft-modded-common"))
1111
implementation(project(":cloud-minecraft-modded-common"))
12-
compileOnly("org.spongepowered:spongeapi:12.1.0-SNAPSHOT")
13-
compileOnly("org.spongepowered:sponge:1.21.1-12.0.3-SNAPSHOT")
12+
compileOnly("org.spongepowered:spongeapi:14.1.0-SNAPSHOT")
13+
compileOnly("org.spongepowered:sponge:1.21.4-14.0.0-SNAPSHOT")
1414
}
1515

1616
neoForge {
1717
enable {
18-
neoFormVersion = "1.21.1-20240808.144430"
18+
neoFormVersion = "1.21.4-20241203.161809"
1919
}
2020
}

cloud-sponge/src/main/java/org/incendo/cloud/sponge/CloudSpongeCommand.java

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@
4545
import org.spongepowered.api.command.CommandResult;
4646
import org.spongepowered.api.command.parameter.ArgumentReader;
4747
import org.spongepowered.api.command.registrar.tree.CommandTreeNode;
48+
import org.spongepowered.api.registry.RegistryHolder;
4849

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

@@ -118,7 +119,7 @@ private CommandNode<C> namedNode() {
118119
}
119120

120121
@Override
121-
public CommandTreeNode.Root commandTree() {
122+
public CommandTreeNode.Root commandTree(final RegistryHolder holder) {
122123
final CommandTreeNode<CommandTreeNode.Root> root = CommandTreeNode.root();
123124

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

130131
this.addRequirement(cloud, root);
131132

132-
this.addChildren(root, cloud);
133+
this.addChildren(root, cloud, holder);
133134
return (CommandTreeNode.Root) root;
134135
}
135136

136-
private void addChildren(final CommandTreeNode<?> node, final CommandNode<C> cloud) {
137+
private void addChildren(final CommandTreeNode<?> node, final CommandNode<C> cloud, final RegistryHolder holder) {
137138
for (final CommandNode<C> child : cloud.children()) {
138139
final CommandComponent<C> value = child.component();
139140
final CommandTreeNode.Argument<? extends CommandTreeNode.Argument<?>> treeNode;
140141
if (value.parser() instanceof LiteralParser) {
141142
treeNode = (CommandTreeNode.Argument<? extends CommandTreeNode.Argument<?>>) CommandTreeNode.literal();
142143
} else if (value.parser() instanceof AggregateParser<C, ?> aggregate) {
143-
this.handleAggregate(node, child, aggregate);
144+
this.handleAggregate(node, child, aggregate, holder);
144145
continue;
145146
} else {
146-
treeNode = this.commandManager.parserMapper().mapComponent(value);
147+
treeNode = this.commandManager.parserMapper().mapComponent(value, holder);
147148
}
148149
this.addRequirement(child, treeNode);
149150
if (canExecute(child)) {
150151
treeNode.executable();
151152
}
152-
this.addChildren(treeNode, child);
153+
this.addChildren(treeNode, child, holder);
153154
node.child(value.name(), treeNode);
154155
}
155156
}
156157

157158
private void handleAggregate(
158159
final CommandTreeNode<?> node,
159160
final CommandNode<C> child,
160-
final AggregateParser<C, ?> compound
161+
final AggregateParser<C, ?> compound,
162+
final RegistryHolder holder
161163
) {
162164
final CommandTreeNode.Argument<? extends CommandTreeNode.Argument<?>> treeNode;
163165
final ArrayDeque<Pair<String, CommandTreeNode.Argument<? extends CommandTreeNode.Argument<?>>>> nodes = new ArrayDeque<>();
164166
for (final CommandComponent<C> component : compound.components()) {
165167
final String name = component.name();
166-
nodes.add(Pair.of(name, this.commandManager.parserMapper().mapParser(component.parser())));
168+
nodes.add(Pair.of(name, this.commandManager.parserMapper().mapParser(component.parser(), holder)));
167169
}
168170
Pair<String, CommandTreeNode.Argument<? extends CommandTreeNode.Argument<?>>> argument = null;
169171
while (!nodes.isEmpty()) {
@@ -180,7 +182,7 @@ private void handleAggregate(
180182
this.addRequirement(child, argument.second());
181183
}
182184
treeNode = argument.second();
183-
this.addChildren(treeNode, child);
185+
this.addChildren(treeNode, child, holder);
184186
node.child(compound.components().get(0).toString(), treeNode);
185187
}
186188

cloud-sponge/src/main/java/org/incendo/cloud/sponge/NodeSource.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525

2626
import org.checkerframework.checker.nullness.qual.NonNull;
2727
import org.spongepowered.api.command.registrar.tree.CommandTreeNode;
28+
import org.spongepowered.api.registry.RegistryHolder;
2829

2930
/**
3031
* Implemented by {@link org.incendo.cloud.parser.ArgumentParser} which also supply a special {@link CommandTreeNode.Argument}.
@@ -34,8 +35,9 @@ public interface NodeSource {
3435
/**
3536
* Get the node for this parser.
3637
*
38+
* @param registryHolder registry holder
3739
* @return argument node
3840
*/
39-
CommandTreeNode.@NonNull Argument<? extends CommandTreeNode.Argument<?>> node();
41+
CommandTreeNode.@NonNull Argument<? extends CommandTreeNode.Argument<?>> node(RegistryHolder registryHolder);
4042

4143
}

cloud-sponge/src/main/java/org/incendo/cloud/sponge/SpongeCommandManager.java

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,7 @@
7272
import org.spongepowered.api.event.lifecycle.RegisterCommandEvent;
7373
import org.spongepowered.api.registry.DefaultedRegistryType;
7474
import org.spongepowered.api.registry.Registry;
75+
import org.spongepowered.api.registry.RegistryHolder;
7576
import org.spongepowered.api.registry.RegistryType;
7677
import org.spongepowered.api.registry.RegistryTypes;
7778
import org.spongepowered.math.vector.Vector2d;
@@ -115,7 +116,6 @@ public SpongeCommandManager(
115116
this.senderMapper = senderMapper;
116117
this.parserMapper = new SpongeParserMapper<>();
117118
this.registerCommandPreProcessor(new SpongeCommandPreprocessor<>(this));
118-
this.registerParsers();
119119
this.captionRegistry().registerProvider(new SpongeDefaultCaptionsProvider<>());
120120
this.suggestionFactory = super.suggestionFactory().mapped(SpongeSuggestion::spongeSuggestion);
121121

@@ -137,19 +137,24 @@ private void checkLateCreation() {
137137
);
138138
}
139139

140-
private void registerParsers() {
140+
/**
141+
* Register parsers
142+
*
143+
* @param registryHolder Register holder
144+
*/
145+
public void registerParsers(final RegistryHolder registryHolder) {
141146
this.parserRegistry()
142-
.registerParser(ComponentParser.componentParser())
147+
.registerParser(ComponentParser.componentParser(registryHolder))
143148
.registerParser(NamedTextColorParser.namedTextColorParser())
144149
.registerParser(OperatorParser.operatorParser())
145150
.registerParser(WorldParser.worldParser())
146-
.registerParser(ProtoItemStackParser.protoItemStackParser())
147-
.registerParser(ItemStackPredicateParser.itemStackPredicateParser())
151+
.registerParser(ProtoItemStackParser.protoItemStackParser(registryHolder))
152+
.registerParser(ItemStackPredicateParser.itemStackPredicateParser(registryHolder))
148153
.registerParser(ResourceKeyParser.resourceKeyParser())
149154
.registerParser(GameProfileParser.gameProfileParser())
150155
.registerParser(GameProfileCollectionParser.gameProfileCollectionParser())
151-
.registerParser(BlockInputParser.blockInputParser())
152-
.registerParser(BlockPredicateParser.blockPredicateParser())
156+
.registerParser(BlockInputParser.blockInputParser(registryHolder))
157+
.registerParser(BlockPredicateParser.blockPredicateParser(registryHolder))
153158
.registerParser(UserParser.userParser())
154159
.registerParser(DataContainerParser.dataContainerParser())
155160
.registerAnnotationMapper(

cloud-sponge/src/main/java/org/incendo/cloud/sponge/SpongeParserMapper.java

Lines changed: 32 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@
4646
import org.incendo.cloud.parser.standard.UUIDParser;
4747
import org.spongepowered.api.command.registrar.tree.CommandTreeNode;
4848
import org.spongepowered.api.command.registrar.tree.CommandTreeNodeTypes;
49+
import org.spongepowered.api.registry.RegistryHolder;
4950

5051
import static java.util.Objects.requireNonNull;
5152

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

6263
SpongeParserMapper() {
63-
this.initStandardMappers();
64+
6465
}
6566

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

7779
@SuppressWarnings({"unchecked", "rawtypes"})
78-
CommandTreeNode.Argument<? extends CommandTreeNode.Argument<?>> mapParser(final ArgumentParser<C, ?> argumentParser) {
80+
CommandTreeNode.Argument<? extends CommandTreeNode.Argument<?>> mapParser(
81+
final ArgumentParser<C, ?> argumentParser, final RegistryHolder holder) {
7982
final CommandTreeNode.Argument<? extends CommandTreeNode.Argument<?>> result;
8083
ArgumentParser<C, ?> parser = argumentParser;
8184
while (parser instanceof MappedArgumentParser<?, ?, ?>) {
8285
parser = ((MappedArgumentParser<C, ?, ?>) parser).baseParser();
8386
}
84-
final Mapping<C, ?> mapper = this.mappers.get(parser.getClass());
87+
final Mapping<C, ?> mapper = this.getOrCreateMappers(holder).get(parser.getClass());
8588
if (mapper != null) {
8689
final CommandTreeNode.Argument<? extends CommandTreeNode.Argument<?>> apply =
8790
(CommandTreeNode.Argument<? extends CommandTreeNode.Argument<?>>) ((Function) mapper.mapper).apply(parser);
@@ -91,43 +94,51 @@ CommandTreeNode.Argument<? extends CommandTreeNode.Argument<?>> mapParser(final
9194
}
9295
result = apply;
9396
} else if (parser instanceof NodeSource) {
94-
result = ((NodeSource) parser).node();
97+
result = ((NodeSource) parser).node(holder);
9598
} else {
96-
result = CommandTreeNodeTypes.STRING.get().createNode().customCompletions().word();
99+
result = CommandTreeNodeTypes.STRING.get(holder).createNode().customCompletions().word();
97100
}
98101
return result;
99102
}
100103

101-
private void initStandardMappers() {
104+
private synchronized Map<Class<?>, Mapping<C, ?>> getOrCreateMappers(final RegistryHolder holder) {
105+
if (this.mappers.isEmpty()) {
106+
this.initStandardMappers(holder);
107+
}
108+
109+
return this.mappers;
110+
}
111+
112+
private void initStandardMappers(final RegistryHolder holder) {
102113
this.registerMapping(new TypeToken<StringParser<C>>() {
103114
}, builder -> builder.to(stringParser -> {
104115
final StringParser.StringMode mode = stringParser.stringMode();
105116
if (mode == StringParser.StringMode.SINGLE) {
106-
return CommandTreeNodeTypes.STRING.get().createNode().customCompletions().word();
117+
return CommandTreeNodeTypes.STRING.get(holder).createNode().customCompletions().word();
107118
} else if (mode == StringParser.StringMode.QUOTED) {
108-
return CommandTreeNodeTypes.STRING.get().createNode().customCompletions();
119+
return CommandTreeNodeTypes.STRING.get(holder).createNode().customCompletions();
109120
} else if (mode == StringParser.StringMode.GREEDY || mode == StringParser.StringMode.GREEDY_FLAG_YIELDING) {
110-
return CommandTreeNodeTypes.STRING.get().createNode().customCompletions().greedy();
121+
return CommandTreeNodeTypes.STRING.get(holder).createNode().customCompletions().greedy();
111122
}
112123
throw new IllegalArgumentException("Unknown string mode '" + mode + "'!");
113124
}));
114125
this.registerMapping(new TypeToken<ByteParser<C>>() {
115126
}, builder -> builder.to(byteParser -> {
116-
final CommandTreeNode.Range<Integer> node = CommandTreeNodeTypes.INTEGER.get().createNode();
127+
final CommandTreeNode.Range<Integer> node = CommandTreeNodeTypes.INTEGER.get(holder).createNode();
117128
node.min((int) byteParser.range().minByte());
118129
node.max((int) byteParser.range().maxByte());
119130
return node;
120131
}).cloudSuggestions(true));
121132
this.registerMapping(new TypeToken<ShortParser<C>>() {
122133
}, builder -> builder.to(shortParser -> {
123-
final CommandTreeNode.Range<Integer> node = CommandTreeNodeTypes.INTEGER.get().createNode();
134+
final CommandTreeNode.Range<Integer> node = CommandTreeNodeTypes.INTEGER.get(holder).createNode();
124135
node.min((int) shortParser.range().minShort());
125136
node.max((int) shortParser.range().maxShort());
126137
return node;
127138
}).cloudSuggestions(true));
128139
this.registerMapping(new TypeToken<IntegerParser<C>>() {
129140
}, builder -> builder.to(integerParser -> {
130-
final CommandTreeNode.Range<Integer> node = CommandTreeNodeTypes.INTEGER.get().createNode();
141+
final CommandTreeNode.Range<Integer> node = CommandTreeNodeTypes.INTEGER.get(holder).createNode();
131142
if (integerParser.hasMin()) {
132143
node.min(integerParser.range().minInt());
133144
}
@@ -138,7 +149,7 @@ private void initStandardMappers() {
138149
}).cloudSuggestions(true));
139150
this.registerMapping(new TypeToken<FloatParser<C>>() {
140151
}, builder -> builder.to(floatParser -> {
141-
final CommandTreeNode.Range<Float> node = CommandTreeNodeTypes.FLOAT.get().createNode();
152+
final CommandTreeNode.Range<Float> node = CommandTreeNodeTypes.FLOAT.get(holder).createNode();
142153
if (floatParser.hasMin()) {
143154
node.min(floatParser.range().minFloat());
144155
}
@@ -149,7 +160,7 @@ private void initStandardMappers() {
149160
}).cloudSuggestions(true));
150161
this.registerMapping(new TypeToken<DoubleParser<C>>() {
151162
}, builder -> builder.to(doubleParser -> {
152-
final CommandTreeNode.Range<Double> node = CommandTreeNodeTypes.DOUBLE.get().createNode();
163+
final CommandTreeNode.Range<Double> node = CommandTreeNodeTypes.DOUBLE.get(holder).createNode();
153164
if (doubleParser.hasMin()) {
154165
node.min(doubleParser.range().minDouble());
155166
}
@@ -160,7 +171,7 @@ private void initStandardMappers() {
160171
}).cloudSuggestions(true));
161172
this.registerMapping(new TypeToken<LongParser<C>>() {
162173
}, builder -> builder.to(longParser -> {
163-
final CommandTreeNode.Range<Long> node = CommandTreeNodeTypes.LONG.get().createNode();
174+
final CommandTreeNode.Range<Long> node = CommandTreeNodeTypes.LONG.get(holder).createNode();
164175
if (longParser.hasMin()) {
165176
node.min(longParser.range().minLong());
166177
}
@@ -171,19 +182,19 @@ private void initStandardMappers() {
171182
}).cloudSuggestions(true));
172183
this.registerMapping(new TypeToken<BooleanParser<C>>() {
173184
}, builder -> builder.to(booleanParser -> {
174-
return CommandTreeNodeTypes.BOOL.get().createNode();
185+
return CommandTreeNodeTypes.BOOL.get(holder).createNode();
175186
}));
176187
this.registerMapping(new TypeToken<CommandFlagParser<C>>() {
177188
}, builder -> builder.to(flagArgumentParser -> {
178-
return CommandTreeNodeTypes.STRING.get().createNode().customCompletions().greedy();
189+
return CommandTreeNodeTypes.STRING.get(holder).createNode().customCompletions().greedy();
179190
}));
180191
this.registerMapping(new TypeToken<StringArrayParser<C>>() {
181192
}, builder -> builder.to(stringArrayParser -> {
182-
return CommandTreeNodeTypes.STRING.get().createNode().customCompletions().greedy();
193+
return CommandTreeNodeTypes.STRING.get(holder).createNode().customCompletions().greedy();
183194
}));
184195
this.registerMapping(new TypeToken<UUIDParser<C>>() {
185196
}, builder -> builder.to(uuidParser -> {
186-
return CommandTreeNodeTypes.UUID.get().createNode();
197+
return CommandTreeNodeTypes.UUID.get(holder).createNode();
187198
}));
188199
}
189200

cloud-sponge/src/main/java/org/incendo/cloud/sponge/SpongeRegistrationHandler.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,8 @@ final class SpongeRegistrationHandler<C> implements CommandRegistrationHandler<C
5858

5959
private void handleRegistrationEvent(final RegisterCommandEvent<Command.Raw> event) {
6060
this.commandManager.registrationCalled();
61+
this.commandManager.registerParsers(event.registryHolder());
62+
6163
for (final CommandNode<C> node : this.commandManager.commandTree().rootNodes()) {
6264
this.registerCommand(event, requireNonNull(node.component()));
6365
}

cloud-sponge/src/main/java/org/incendo/cloud/sponge/data/ProtoItemStack.java

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -24,9 +24,7 @@
2424
package org.incendo.cloud.sponge.data;
2525

2626
import org.checkerframework.checker.nullness.qual.NonNull;
27-
import org.checkerframework.checker.nullness.qual.Nullable;
2827
import org.incendo.cloud.sponge.exception.ComponentMessageRuntimeException;
29-
import org.spongepowered.api.data.persistence.DataContainer;
3028
import org.spongepowered.api.item.ItemType;
3129
import org.spongepowered.api.item.inventory.ItemStack;
3230
import org.spongepowered.api.item.inventory.ItemStackSnapshot;
@@ -43,15 +41,6 @@ public interface ProtoItemStack {
4341
*/
4442
@NonNull ItemType itemType();
4543

46-
/**
47-
* Get any extra data besides the {@link ItemType} that may have been parsed.
48-
*
49-
* <p>Will return {@code null} if there is no extra data.</p>
50-
*
51-
* @return the extra data or {@code null}
52-
*/
53-
@Nullable DataContainer extraData();
54-
5544
/**
5645
* Create a new {@link ItemStack} from the state of this {@link ProtoItemStack}.
5746
*

0 commit comments

Comments
 (0)