Skip to content

Commit 45235f6

Browse files
committed
Merge remote-tracking branch 'origin/api-12' into api-13
2 parents a786569 + 17d21e3 commit 45235f6

File tree

15 files changed

+144
-74
lines changed

15 files changed

+144
-74
lines changed

src/main/java/org/spongepowered/common/command/brigadier/SpongeParameterTranslator.java

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535
import org.spongepowered.api.command.parameter.managed.Flag;
3636
import org.spongepowered.common.command.brigadier.argument.ArgumentParser;
3737
import org.spongepowered.common.command.brigadier.argument.CustomArgumentParser;
38+
import org.spongepowered.common.command.brigadier.tree.SpongeArgumentCommandNode;
3839
import org.spongepowered.common.command.brigadier.tree.SpongeArgumentCommandNodeBuilder;
3940
import org.spongepowered.common.command.brigadier.tree.SpongeCommandExecutorWrapper;
4041
import org.spongepowered.common.command.brigadier.tree.SpongeFlagLiteralCommandNode;
@@ -189,6 +190,7 @@ private Collection<? extends CommandNode<CommandSourceStack>> createAndAttachNod
189190
final boolean shouldTerminate,
190191
final boolean allowSubcommands) {
191192

193+
final Set<CommandNode<CommandSourceStack>> tailNodes = new HashSet<>(parents);
192194
final Set<CommandNode<CommandSourceStack>> nodesToAttachTo = new HashSet<>(parents);
193195
final ListIterator<Parameter> parameterIterator = children.listIterator();
194196
while (parameterIterator.hasNext()) {
@@ -291,30 +293,43 @@ private Collection<? extends CommandNode<CommandSourceStack>> createAndAttachNod
291293

292294
parametersToAttachTo.add(builtNode);
293295

296+
// Filter out optional nodes that have a matching type, they are nearly impossible to "merge" correctly.
297+
if (isOptional) {
298+
final Set<CommandNode<CommandSourceStack>> conflictingNodes = nodesToAttachTo.stream()
299+
.filter(n -> n instanceof final SpongeArgumentCommandNode<?> argumentNodeToAttachTo
300+
&& argumentNodeToAttachTo.isOptional() && argumentNodeToAttachTo.key().type().equals(valueParameter.key().type()))
301+
.collect(Collectors.toSet());
302+
if (!conflictingNodes.isEmpty()) {
303+
nodesToAttachTo.removeIf(n -> n.getChildren().stream().anyMatch(conflictingNodes::contains));
304+
}
305+
}
306+
294307
// Make sure the nodes we need to attach to have the nodes we need to
295308
nodesToAttachTo.forEach(x -> x.addChild(builtNode));
296309
}
297310

298311
// If this is not optional, then we clear the "toAttachTo" list because we do not want to skip the parameter.
299312
if (!isOptional) {
313+
tailNodes.clear();
300314
nodesToAttachTo.clear();
301315
}
302316

317+
tailNodes.addAll(parametersToAttachTo);
303318
nodesToAttachTo.addAll(parametersToAttachTo);
304319
}
305320
}
306321

307322
// If we should make any terminal parameters actually terminal, we do that now.
308323
if (shouldTerminate) {
309-
for (final CommandNode<CommandSourceStack> node : nodesToAttachTo) {
324+
for (final CommandNode<CommandSourceStack> node : tailNodes) {
310325
// These are therefore terminal.
311326
if (node instanceof SpongeNode) { // they should be, but just in case
312327
((SpongeNode) node).forceExecutor(executorWrapper);
313328
}
314329
}
315330
}
316331

317-
return nodesToAttachTo;
332+
return tailNodes;
318333
}
319334

320335
@SuppressWarnings({"unchecked", "rawtypes"})
@@ -334,7 +349,8 @@ private Collection<? extends CommandNode<CommandSourceStack>> createAndAttachNod
334349
parameter.completer(),
335350
parameter.modifier().orElse(null),
336351
parameter.valueUsage().orElse(null),
337-
suffix
352+
suffix,
353+
parameter.isOptional()
338354
);
339355
// CommandCause is mixed into CommandSource, so this is okay.
340356
argumentBuilder.requires((Predicate) parameter.requirement());

src/main/java/org/spongepowered/common/command/brigadier/tree/SpongeArgumentCommandNode.java

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,7 @@ public final class SpongeArgumentCommandNode<T> extends ArgumentCommandNode<Comm
9898
private final @Nullable ValueParameterModifier<T> modifier;
9999
private final ValueUsage usage;
100100
private final boolean isComplexSuggestions;
101+
private final boolean isOptional;
101102

102103
// used so we can have insertion order.
103104
private final UnsortedNodeHolder nodeHolder = new UnsortedNodeHolder();
@@ -117,7 +118,8 @@ public SpongeArgumentCommandNode(
117118
final RedirectModifier<CommandSourceStack> modifier,
118119
final boolean forks,
119120
final String keyName,
120-
final @Nullable ValueParameterModifier<T> parameterModifier) {
121+
final @Nullable ValueParameterModifier<T> parameterModifier,
122+
final boolean isOptional) {
121123
super(keyName,
122124
(ArgumentType<T>) Constants.Command.STANDARD_STRING_ARGUMENT_TYPE, // we can abuse generics, we're not actually going to use this.
123125
command,
@@ -131,6 +133,11 @@ public SpongeArgumentCommandNode(
131133
this.isComplexSuggestions = this.parser instanceof ComplexSuggestionNodeProvider;
132134
this.key = key;
133135
this.usage = usage;
136+
this.isOptional = isOptional;
137+
}
138+
139+
public Parameter.Key<? super T> key() {
140+
return this.key;
134141
}
135142

136143
public final boolean isComplex() {
@@ -300,6 +307,10 @@ private String getUsageTextForClient() {
300307
return this.getName();
301308
}
302309

310+
public boolean isOptional() {
311+
return this.isOptional;
312+
}
313+
303314
@Override
304315
public final void parse(final StringReader reader, final CommandContextBuilder<CommandSourceStack> contextBuilder) throws CommandSyntaxException {
305316
final int start = reader.getCursor();

src/main/java/org/spongepowered/common/command/brigadier/tree/SpongeArgumentCommandNodeBuilder.java

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ public final class SpongeArgumentCommandNodeBuilder<T> extends ArgumentBuilder<C
4343
private final @Nullable String suffix;
4444
private final @Nullable ValueUsage usage;
4545
private final @Nullable ValueParameterModifier<T> modifier;
46+
private final boolean isOptional;
4647

4748
private static @Nullable ValueCompleter filterNativeCompleters(final ArgumentParser<?> parser, final ValueCompleter completer) {
4849
if (parser == completer && parser.hasClientNativeCompletions()) {
@@ -57,13 +58,15 @@ public SpongeArgumentCommandNodeBuilder(
5758
final ValueCompleter completer,
5859
final @Nullable ValueParameterModifier<T> modifier,
5960
final @Nullable ValueUsage usage,
60-
final @Nullable String suffix) {
61+
final @Nullable String suffix,
62+
final boolean isOptional) {
6163
this.key = key;
6264
this.type = type;
6365
this.completer = SpongeArgumentCommandNodeBuilder.filterNativeCompleters(type, completer);
6466
this.modifier = modifier;
6567
this.usage = usage;
6668
this.suffix = suffix;
69+
this.isOptional = isOptional;
6770
}
6871

6972
@Override
@@ -84,7 +87,8 @@ public SpongeArgumentCommandNode<T> build() {
8487
this.getRedirectModifier(),
8588
this.isFork(),
8689
this.suffix == null ? this.key.key() : this.key.key() + "_" + this.suffix,
87-
this.modifier);
90+
this.modifier,
91+
this.isOptional);
8892
for (final CommandNode<CommandSourceStack> child : this.getArguments()) {
8993
node.addChild(child);
9094
}

src/main/java/org/spongepowered/common/event/tracking/PhaseContext.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -368,6 +368,10 @@ public void printTrace(final PrettyPrinter printer) {
368368
return null;
369369
}
370370

371+
public boolean isClientSide() {
372+
return false;
373+
}
374+
371375
protected boolean isRunaway(final PhaseContext<?> phaseContext) {
372376
return phaseContext.getClass() == this.getClass();
373377
}

src/main/java/org/spongepowered/common/event/tracking/context/transaction/TransactionSink.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -364,8 +364,8 @@ default EffectTransactor logOpenInventory(final Player player) {
364364
return this.pushEffect(new ResultingTransactionBySideEffect(InventoryEffect.getInstance()));
365365
}
366366

367-
default EffectTransactor logCloseInventory(final Player player, final boolean clientSource) {
368-
final CloseMenuTransaction transaction = new CloseMenuTransaction(player, clientSource);
367+
default EffectTransactor logCloseInventory(final PhaseContext<@NonNull ?> current, final Player player) {
368+
final CloseMenuTransaction transaction = new CloseMenuTransaction(player, current.isClientSide());
369369
this.logTransaction(transaction);
370370
return this.pushEffect(new ResultingTransactionBySideEffect(InventoryEffect.getInstance()));
371371
}

src/main/java/org/spongepowered/common/event/tracking/phase/packet/BasicPacketContext.java

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -35,10 +35,6 @@ public BasicPacketContext(final PacketState<BasicPacketContext> state, final Pha
3535
@SuppressWarnings("unchecked")
3636
@Override
3737
public boolean hasCaptures() {
38-
if (this.state == PacketPhase.General.CLOSE_WINDOW) {
39-
return true;
40-
}
41-
4238
return super.hasCaptures();
4339
}
4440
}

src/main/java/org/spongepowered/common/event/tracking/phase/packet/BasicPacketState.java

Lines changed: 0 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -24,9 +24,6 @@
2424
*/
2525
package org.spongepowered.common.event.tracking.phase.packet;
2626

27-
import net.minecraft.server.level.ServerPlayer;
28-
import org.checkerframework.checker.nullness.qual.Nullable;
29-
import org.spongepowered.common.bridge.server.TickTaskBridge;
3027
import org.spongepowered.common.event.tracking.PhaseTracker;
3128

3229
public class BasicPacketState extends PacketState<BasicPacketContext> {
@@ -35,14 +32,4 @@ public class BasicPacketState extends PacketState<BasicPacketContext> {
3532
public BasicPacketContext createNewContext(final PhaseTracker tracker) {
3633
return new BasicPacketContext(this, tracker);
3734
}
38-
39-
@Override
40-
public void foldContextForThread(final BasicPacketContext context, final TickTaskBridge returnValue) {
41-
final @Nullable ServerPlayer source = context.getPacketPlayer();
42-
returnValue.bridge$contextShift((c, f) -> {
43-
if (source != null) {
44-
f.pushCause(source);
45-
}
46-
});
47-
}
4835
}

src/main/java/org/spongepowered/common/event/tracking/phase/packet/PacketPhase.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@
6262
import org.spongepowered.common.event.tracking.phase.packet.drag.PrimaryDragInventoryStopState;
6363
import org.spongepowered.common.event.tracking.phase.packet.drag.SecondaryDragInventoryStopState;
6464
import org.spongepowered.common.event.tracking.phase.packet.inventory.BasicInventoryPacketState;
65+
import org.spongepowered.common.event.tracking.phase.packet.inventory.CloseWindowContext;
6566
import org.spongepowered.common.event.tracking.phase.packet.inventory.CloseWindowState;
6667
import org.spongepowered.common.event.tracking.phase.packet.inventory.CreativeInventoryPacketState;
6768
import org.spongepowered.common.event.tracking.phase.packet.inventory.DoubleClickInventoryState;
@@ -127,7 +128,7 @@ public static final class General {
127128
static final IPhaseState<BasicPacketContext> STOP_SPRINTING = new BasicPacketState();
128129
static final IPhaseState<BasicPacketContext> STOP_SLEEPING = new StopSleepingPacketState();
129130
static final IPhaseState<BasicPacketContext> TAB_COMPLETE = new BasicPacketState();
130-
public static final IPhaseState<BasicPacketContext> CLOSE_WINDOW = new CloseWindowState();
131+
public static final IPhaseState<CloseWindowContext> CLOSE_WINDOW = new CloseWindowState();
131132
public static final IPhaseState<BasicPacketContext> UPDATE_SIGN = new BasicPacketState();
132133
static final IPhaseState<BasicPacketContext> STOP_RIDING_JUMP = new BasicPacketState();
133134
static final IPhaseState<BasicPacketContext> HANDLED_EXTERNALLY = new UnknownPacketState();

src/main/java/org/spongepowered/common/event/tracking/phase/packet/PacketState.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,13 +28,16 @@
2828
import net.minecraft.network.protocol.Packet;
2929
import net.minecraft.resources.ResourceLocation;
3030
import net.minecraft.server.level.ServerLevel;
31+
import net.minecraft.server.level.ServerPlayer;
3132
import net.minecraft.world.level.block.Block;
3233
import net.minecraft.world.level.chunk.LevelChunk;
34+
import org.checkerframework.checker.nullness.qual.Nullable;
3335
import org.spongepowered.api.ResourceKey;
3436
import org.spongepowered.api.entity.living.player.Player;
3537
import org.spongepowered.api.event.CauseStackManager;
3638
import org.spongepowered.api.event.cause.entity.SpawnType;
3739
import org.spongepowered.api.event.cause.entity.SpawnTypes;
40+
import org.spongepowered.common.bridge.server.TickTaskBridge;
3841
import org.spongepowered.common.bridge.world.level.chunk.LevelChunkBridge;
3942
import org.spongepowered.common.entity.PlayerTracker;
4043
import org.spongepowered.common.event.tracking.IPhaseState;
@@ -106,6 +109,16 @@ protected boolean alwaysUnwinds() {
106109
return false;
107110
}
108111

112+
@Override
113+
public void foldContextForThread(final P context, final TickTaskBridge returnValue) {
114+
final @Nullable ServerPlayer source = context.getPacketPlayer();
115+
returnValue.bridge$contextShift((c, f) -> {
116+
if (source != null) {
117+
f.pushCause(source);
118+
}
119+
});
120+
}
121+
109122
private final String desc = TrackingUtil.phaseStateToString("Packet", this);
110123

111124
@Override

0 commit comments

Comments
 (0)