Skip to content

Commit

Permalink
Add support for relative and absolute coordinates to //toggleplace
Browse files Browse the repository at this point in the history
  • Loading branch information
TomyLobo committed Mar 16, 2023
1 parent 23f81d9 commit 4fdcabb
Show file tree
Hide file tree
Showing 2 changed files with 59 additions and 3 deletions.
Expand Up @@ -19,19 +19,26 @@

package com.sk89q.worldedit.command.argument;

import com.google.common.collect.ImmutableList;
import com.google.common.collect.Iterables;
import com.sk89q.worldedit.IncompleteRegionException;
import com.sk89q.worldedit.extension.platform.Actor;
import com.sk89q.worldedit.math.BlockVector3;
import com.sk89q.worldedit.regions.RegionSelector;
import com.sk89q.worldedit.session.Placement;
import com.sk89q.worldedit.util.formatting.text.Component;
import com.sk89q.worldedit.util.formatting.text.TextComponent;
import com.sk89q.worldedit.util.formatting.text.TranslatableComponent;
import org.enginehub.piston.CommandManager;
import org.enginehub.piston.converter.ArgumentConverter;
import org.enginehub.piston.converter.ConversionResult;
import org.enginehub.piston.converter.FailedConversion;
import org.enginehub.piston.converter.SuccessfulConversion;
import org.enginehub.piston.inject.InjectedValueAccess;
import org.enginehub.piston.inject.Key;

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

public class PlacementConverter implements ArgumentConverter<Placement> {

Expand All @@ -46,17 +53,24 @@ public static void register(CommandManager commandManager) {
new PlacementConverter()
);
}
private final VectorConverter<Integer, BlockVector3> vectorConverter = VectorConverter.BLOCK_VECTOR_3_CONVERTER;

@Override
public Component describeAcceptableArguments() {
return TextComponent.builder()
.append(String.join(", ", FIXED_SUGGESTIONS))
.append(", or ")
.append(vectorConverter.describeAcceptableArguments())
.append(" (prefix with '^' to place relative to the player)")
.build();
}

@Override
public List<String> getSuggestions(String input, InjectedValueAccess context) {
return FIXED_SUGGESTIONS;
return ImmutableList.copyOf(Iterables.concat(
FIXED_SUGGESTIONS,
vectorConverter.getSuggestions(input, context)
));
}

@Override
Expand All @@ -69,7 +83,47 @@ public ConversionResult<Placement> convert(String input, InjectedValueAccess con
return SuccessfulConversion.fromSingle(Placement.PLAYER);

default:
return FailedConversion.from(new IllegalArgumentException("Must be either pos1 or player"));
if (input.startsWith("^")) {
return vectorConverter.convert(input.substring(1), context)
.map(collection -> collection.stream()
.map(vector -> new Placement() {
@Override
public BlockVector3 getPlacementPosition(RegionSelector selector, Actor actor) throws IncompleteRegionException {
return Placement.PLAYER.getPlacementPosition(selector, actor).add(vector);
}

@Override
public Component getInfo() {
return TranslatableComponent.of("worldedit.toggleplace.relative-player",
TextComponent.of(vector.getX()),
TextComponent.of(vector.getY()),
TextComponent.of(vector.getZ())
);
}
})
.collect(Collectors.toList())
);
} else {
return vectorConverter.convert(input, context)
.map(collection -> collection.stream()
.map(vector -> new Placement() {
@Override
public BlockVector3 getPlacementPosition(RegionSelector selector, Actor actor) throws IncompleteRegionException {
return vector;
}

@Override
public Component getInfo() {
return TranslatableComponent.of("worldedit.toggleplace.absolute",
TextComponent.of(vector.getX()),
TextComponent.of(vector.getY()),
TextComponent.of(vector.getZ())
);
}
})
.collect(Collectors.toList())
);
}
}
}
}
2 changes: 2 additions & 0 deletions worldedit-core/src/main/resources/lang/strings.json
Expand Up @@ -70,6 +70,8 @@
"worldedit.gmask.set": "Global mask set.",
"worldedit.toggleplace.pos1": "Now placing at pos #1.",
"worldedit.toggleplace.player": "Now placing at the block you stand in.",
"worldedit.toggleplace.relative-player": "Now placing at an offset of ({0}, {1}, {2}) from the block you stand in.",
"worldedit.toggleplace.absolute": "Now placing at ({0}, {1}, {2}).",
"worldedit.toggleplace.not-locatable": "Cannot toggle placing in this context.",
"worldedit.searchitem.too-short": "Enter a longer search string (len > 2).",
"worldedit.searchitem.either-b-or-i": "You cannot use both the 'b' and 'i' flags simultaneously.",
Expand Down

0 comments on commit 4fdcabb

Please sign in to comment.