First attempt at integrating Piston as the only command system

This commit is contained in:
Kenzie Togami
2019-04-15 01:21:15 -07:00
parent da35b3c174
commit 267ccf2298
28 changed files with 493 additions and 389 deletions

View File

@ -19,15 +19,17 @@
package com.sk89q.worldedit.forge;
import com.google.common.collect.ImmutableList;
import com.mojang.brigadier.Command;
import com.mojang.brigadier.CommandDispatcher;
import com.mojang.brigadier.builder.LiteralArgumentBuilder;
import com.mojang.brigadier.tree.LiteralCommandNode;
import com.sk89q.worldedit.util.command.CommandMapping;
import com.sk89q.worldedit.command.util.PermissionCondition;
import net.minecraft.command.CommandSource;
import net.minecraft.entity.player.EntityPlayerMP;
import java.util.Set;
import java.util.function.Predicate;
import java.util.stream.Stream;
import static net.minecraft.command.Commands.literal;
@ -35,11 +37,14 @@ public final class CommandWrapper {
private CommandWrapper() {
}
public static void register(CommandDispatcher<CommandSource> dispatcher, CommandMapping command) {
for (String alias : command.getAllAliases()) {
public static void register(CommandDispatcher<CommandSource> dispatcher, org.enginehub.piston.Command command) {
ImmutableList.Builder<String> aliases = ImmutableList.builder();
aliases.add(command.getName()).addAll(command.getAliases());
for (String alias : aliases.build()) {
LiteralArgumentBuilder<CommandSource> base = literal(alias)
.executes(FAKE_COMMAND);
if (command.getDescription().getPermissions().size() > 0) {
if (command.getCondition().as(PermissionCondition.class)
.filter(p -> p.getPermissions().size() > 0).isPresent()) {
base.requires(requirementsFor(command));
}
dispatcher.register(base);
@ -54,11 +59,14 @@ public final class CommandWrapper {
return 1;
};
private static Predicate<CommandSource> requirementsFor(CommandMapping mapping) {
private static Predicate<CommandSource> requirementsFor(org.enginehub.piston.Command mapping) {
return ctx -> {
ForgePermissionsProvider permsProvider = ForgeWorldEdit.inst.getPermissionsProvider();
return ctx.getEntity() instanceof EntityPlayerMP &&
mapping.getDescription().getPermissions().stream()
mapping.getCondition().as(PermissionCondition.class)
.map(PermissionCondition::getPermissions)
.map(Set::stream)
.orElseGet(Stream::empty)
.allMatch(perm -> permsProvider.hasPermission(
(EntityPlayerMP) ctx.getEntity(), perm
));

View File

@ -19,14 +19,13 @@
package com.sk89q.worldedit.forge;
import com.sk89q.worldedit.command.util.PermissionCondition;
import com.sk89q.worldedit.entity.Player;
import com.sk89q.worldedit.extension.platform.AbstractPlatform;
import com.sk89q.worldedit.extension.platform.Actor;
import com.sk89q.worldedit.extension.platform.Capability;
import com.sk89q.worldedit.extension.platform.MultiUserPlatform;
import com.sk89q.worldedit.extension.platform.Preference;
import com.sk89q.worldedit.util.command.CommandMapping;
import com.sk89q.worldedit.util.command.Dispatcher;
import com.sk89q.worldedit.world.World;
import com.sk89q.worldedit.world.registry.Registries;
import net.minecraft.command.Commands;
@ -36,13 +35,19 @@ import net.minecraft.server.management.PlayerList;
import net.minecraft.util.ResourceLocation;
import net.minecraft.world.WorldServer;
import net.minecraftforge.fml.server.ServerLifecycleHooks;
import org.enginehub.piston.Command;
import org.enginehub.piston.CommandManager;
import javax.annotation.Nullable;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.EnumMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import static java.util.stream.Collectors.toList;
class ForgePlatform extends AbstractPlatform implements MultiUserPlatform {
@ -117,16 +122,17 @@ class ForgePlatform extends AbstractPlatform implements MultiUserPlatform {
}
@Override
public void registerCommands(Dispatcher dispatcher) {
public void registerCommands(CommandManager manager) {
if (server == null) return;
Commands mcMan = server.getCommandManager();
for (final CommandMapping command : dispatcher.getCommands()) {
for (Command command : manager.getAllCommands().collect(toList())) {
CommandWrapper.register(mcMan.getDispatcher(), command);
if (command.getDescription().getPermissions().size() > 0) {
for (int i = 1; i < command.getDescription().getPermissions().size(); i++) {
ForgeWorldEdit.inst.getPermissionsProvider().registerPermission(command.getDescription().getPermissions().get(i));
}
Set<String> perms = command.getCondition().as(PermissionCondition.class)
.map(PermissionCondition::getPermissions)
.orElseGet(Collections::emptySet);
if (perms.size() > 0) {
perms.forEach(ForgeWorldEdit.inst.getPermissionsProvider()::registerPermission);
}
}
}