Skip to content
Merged
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
Original file line number Diff line number Diff line change
Expand Up @@ -92,7 +92,7 @@ public List<String> getMatchedAliases() {
}

@Override
public Stream<String> getSuggestions(String input) {
public Stream<String> getSuggestions(String input, ParserContext context) {
return Arrays.stream(this.prefixes)
.filter(validPrefix(input))
.flatMap(extractArguments(input, new ParserContext()));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -45,11 +45,11 @@ public Pattern parseFromInput(String input, ParserContext context) throws InputP

// overridden to provide $<biome> too
@Override
public Stream<String> getSuggestions(String input) {
public Stream<String> getSuggestions(String input, ParserContext context) {
if (input.startsWith(BIOME_PREFIX)) {
return BiomeType.REGISTRY.getSuggestions(input.substring(1)).map(biome -> BIOME_PREFIX + biome);
} else {
return super.getSuggestions(input);
return super.getSuggestions(input, context);
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ public RandomTransformParser(WorldEdit worldEdit) {
}

@Override
public Stream<String> getSuggestions(String input) {
public Stream<String> getSuggestions(String input, ParserContext context) {
if (input.isEmpty()) {
return Stream.empty();
}
Expand All @@ -36,7 +36,7 @@ public Stream<String> getSuggestions(String input) {
builder.append(split.get(i)).append(',');
}
String previous = builder.toString();
return worldEdit.getTransformFactory().getSuggestions(split.get(split.size() - 1)).stream()
return worldEdit.getTransformFactory().getSuggestions(split.getLast(), context).stream()
.map(s -> previous + s);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -72,8 +72,7 @@ public static Stream<String> getBlockCategorySuggestions(String tag, boolean all
return Stream.empty();
}

public static Stream<String> getBlockPropertySuggestions(String blockType, String props) {
BlockType type = BlockTypes.get(blockType.toLowerCase(Locale.ROOT));
public static Stream<String> getBlockPropertySuggestions(String blockTypeString, BlockType type, String props) {
if (type == null) {
return Stream.empty();
}
Expand All @@ -90,7 +89,7 @@ public static Stream<String> getBlockPropertySuggestions(String blockType, Strin
// suggest for next property
String previous = Arrays.stream(propParts, 0, propParts.length - 1).collect(Collectors.joining(","))
+ (propParts.length == 1 ? "" : ",");
String lastValidInput = (blockType + "[" + previous).toLowerCase(Locale.ROOT);
String lastValidInput = (blockTypeString + "[" + previous).toLowerCase(Locale.ROOT);
if (propVal.length == 1) {
// only property, no value yet
final List<? extends Property<?>> matchingProps = propertyMap.entrySet().stream()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@
import com.google.common.collect.Maps;
import com.sk89q.jnbt.CompoundTag;
import com.sk89q.worldedit.IncompleteRegionException;
import com.sk89q.worldedit.LocalSession;
import com.sk89q.worldedit.NotABlockException;
import com.sk89q.worldedit.WorldEdit;
import com.sk89q.worldedit.WorldEditException;
Expand Down Expand Up @@ -319,23 +320,52 @@ public static Map<Property<?>, Object> parseProperties(
}

@Override
public Stream<String> getSuggestions(String input) {
public Stream<String> getSuggestions(String input, ParserContext context) {
final int idx = input.lastIndexOf('[');
if (idx < 0) {
return SuggestionHelper.getNamespacedRegistrySuggestions(BlockType.REGISTRY, input);
}
String blockType = input.substring(0, idx);
BlockType type = BlockTypes.get(blockType.toLowerCase(Locale.ROOT));
if (type == null) {
return Stream.empty();
var lowerBlockType = blockType.toLowerCase(Locale.ROOT);
switch (lowerBlockType) {
case "hand", "offhand" -> {
var actor = context.getActor();
if (actor instanceof Player player) {
var itemInHand = player.getItemInHand(lowerBlockType.equals("hand") ? HandSide.MAIN_HAND : HandSide.OFF_HAND);
if (itemInHand.getType().hasBlockType()) {
type = itemInHand.getType().getBlockType();
}
}
}
case "pos1" -> {
// Get the block type from the "primary position"
World world = context.getWorld();
LocalSession session = context.getSession();
if (world != null && session != null) {
try {
BlockVector3 primaryPosition = session.getRegionSelector(world).getPrimaryPosition();
type = world.getBlock(primaryPosition).getBlockType();
} catch (IncompleteRegionException ignored) {
}
}
}
default -> {
}
}

if (type == null) {
return Stream.empty();
}
}

String props = input.substring(idx + 1);
if (props.isEmpty()) {
return type.getProperties().stream().map(p -> input + p.getName() + "=");
}

return SuggestionHelper.getBlockPropertySuggestions(blockType, props);
return SuggestionHelper.getBlockPropertySuggestions(blockType, type, props);
}

@Nonnull
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,8 +40,8 @@ public BlocksMaskParser(WorldEdit worldEdit) {
}

@Override
public Stream<String> getSuggestions(String input) {
return worldEdit.getBlockFactory().getSuggestions(input).stream();
public Stream<String> getSuggestions(String input, ParserContext context) {
return worldEdit.getBlockFactory().getSuggestions(input, context).stream();
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -43,14 +43,14 @@ public NegateMaskParser(WorldEdit worldEdit) {
}

@Override
public Stream<String> getSuggestions(String input) {
public Stream<String> getSuggestions(String input, ParserContext context) {
if (input.isEmpty()) {
return Stream.of("!");
}
if (input.charAt(0) != '!') {
return Stream.empty();
}
return worldEdit.getMaskFactory().getSuggestions(input.substring(1)).stream().map(s -> "!" + s);
return worldEdit.getMaskFactory().getSuggestions(input.substring(1), context).stream().map(s -> "!" + s);
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -44,15 +44,15 @@ public OffsetMaskParser(WorldEdit worldEdit) {
}

@Override
public Stream<String> getSuggestions(String input) {
public Stream<String> getSuggestions(String input, ParserContext context) {
if (input.isEmpty()) {
return Stream.of(">", "<");
}
final char firstChar = input.charAt(0);
if (firstChar != '>' && firstChar != '<') {
return Stream.empty();
}
return worldEdit.getMaskFactory().getSuggestions(input.substring(1)).stream().map(s -> firstChar + s);
return worldEdit.getMaskFactory().getSuggestions(input.substring(1), context).stream().map(s -> firstChar + s);
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ public RandomPatternParser(WorldEdit worldEdit) {
}

@Override
public Stream<String> getSuggestions(String input) {
public Stream<String> getSuggestions(String input, ParserContext context) {
//FAWE start
List<String> patterns = StringUtil.split(input, ',', '[', ']');
if (patterns.isEmpty()) {
Expand All @@ -46,7 +46,7 @@ public Stream<String> getSuggestions(String input) {
}
String previous = patterns.size() == 1 ? "" : String.join(",", patterns.subList(0, patterns.size() - 1)) + ",";
String prefix = previous + (percent == null ? "" : percent + "%");
final List<String> innerSuggestions = worldEdit.getPatternFactory().getSuggestions(token);
final List<String> innerSuggestions = worldEdit.getPatternFactory().getSuggestions(token, context);
return innerSuggestions.stream().map(s -> prefix + s);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -42,15 +42,15 @@ public RandomStatePatternParser(WorldEdit worldEdit) {
}

@Override
public Stream<String> getSuggestions(String input) {
public Stream<String> getSuggestions(String input, ParserContext context) {
if (input.isEmpty()) {
return Stream.of("*");
}
if (!input.startsWith("*")) {
return Stream.empty();
}

return worldEdit.getBlockFactory().getSuggestions(input.substring(1)).stream().map(s -> "*" + s);
return worldEdit.getBlockFactory().getSuggestions(input.substring(1), context).stream().map(s -> "*" + s);
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,8 +34,8 @@ public SingleBlockPatternParser(WorldEdit worldEdit) {
}

@Override
public Stream<String> getSuggestions(String input) {
return worldEdit.getBlockFactory().getSuggestions(input).stream();
public Stream<String> getSuggestions(String input, ParserContext context) {
return worldEdit.getBlockFactory().getSuggestions(input, context).stream();
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,10 +33,13 @@
import com.sk89q.worldedit.function.pattern.TypeApplyingPattern;
import com.sk89q.worldedit.internal.registry.InputParser;
import com.sk89q.worldedit.util.formatting.text.TextComponent;
import com.sk89q.worldedit.world.block.BlockType;
import com.sk89q.worldedit.world.block.BlockTypes;

import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.stream.Stream;

Expand All @@ -49,7 +52,7 @@ public TypeOrStateApplyingPatternParser(WorldEdit worldEdit) {
}

@Override
public Stream<String> getSuggestions(String input) {
public Stream<String> getSuggestions(String input, ParserContext context) {
if (input.isEmpty()) {
return Stream.of("^");
}
Expand All @@ -62,12 +65,13 @@ public Stream<String> getSuggestions(String input) {
String type = parts[0];

if (parts.length == 1) {
return worldEdit.getBlockFactory().getSuggestions(input).stream().map(s -> "^" + s);
return worldEdit.getBlockFactory().getSuggestions(input, context).stream().map(s -> "^" + s);
} else {
if (type.isEmpty()) {
return Stream.empty(); // without knowing a type, we can't really suggest states
} else {
return SuggestionHelper.getBlockPropertySuggestions(type, parts[1]).map(s -> "^" + s);
BlockType blockType = BlockTypes.get(type.toLowerCase(Locale.ROOT));
return SuggestionHelper.getBlockPropertySuggestions(type, blockType, parts[1]).map(s -> "^" + s);
}
}
}
Expand Down
Loading