Enable autocomplete for commands on servers

This commit is contained in:
Marcel Konrad
2022-06-26 19:18:14 +02:00
parent 75386c3523
commit 550504daec
4 changed files with 52 additions and 103 deletions

View File

@@ -15,9 +15,9 @@ import exopandora.worldhandler.util.AdvancementHelper;
import exopandora.worldhandler.util.CommandHelper; import exopandora.worldhandler.util.CommandHelper;
import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.client.ClientRegistry; import net.minecraftforge.client.ClientRegistry;
import net.minecraftforge.client.event.RegisterClientCommandsEvent;
import net.minecraftforge.client.event.RegisterClientReloadListenersEvent; import net.minecraftforge.client.event.RegisterClientReloadListenersEvent;
import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.event.RegisterCommandsEvent;
import net.minecraftforge.eventbus.api.IEventBus; import net.minecraftforge.eventbus.api.IEventBus;
import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.eventbus.api.SubscribeEvent;
import net.minecraftforge.fml.DistExecutor; import net.minecraftforge.fml.DistExecutor;
@@ -67,14 +67,14 @@ public class WorldHandler
{ {
MinecraftForge.EVENT_BUS.addListener(KeyHandler::keyInputEvent); MinecraftForge.EVENT_BUS.addListener(KeyHandler::keyInputEvent);
MinecraftForge.EVENT_BUS.addListener(ClientEventHandler::renderLevelLastEvent); MinecraftForge.EVENT_BUS.addListener(ClientEventHandler::renderLevelLastEvent);
MinecraftForge.EVENT_BUS.addListener(ClientEventHandler::clientChatEvent); MinecraftForge.EVENT_BUS.addListener(ClientEventHandler::clientTickEvent);
ClientRegistry.registerKeyBinding(KeyHandler.KEY_WORLD_HANDLER); ClientRegistry.registerKeyBinding(KeyHandler.KEY_WORLD_HANDLER);
KeyHandler.updatePosKeys(); KeyHandler.updatePosKeys();
} }
@SubscribeEvent @SubscribeEvent
public void registerCommands(RegisterCommandsEvent event) public void registerCommands(RegisterClientCommandsEvent event)
{ {
CommandHelper.registerCommands(event.getDispatcher(), event.getBuildContext()); CommandHelper.registerCommands(event.getDispatcher(), event.getBuildContext());
} }

View File

@@ -22,8 +22,6 @@ import net.minecraft.commands.arguments.blocks.BlockPredicateArgument;
import net.minecraft.commands.arguments.blocks.BlockStateArgument; import net.minecraft.commands.arguments.blocks.BlockStateArgument;
import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos;
import net.minecraft.resources.ResourceLocation; import net.minecraft.resources.ResourceLocation;
import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.fml.DistExecutor;
import net.minecraftforge.registries.ForgeRegistries; import net.minecraftforge.registries.ForgeRegistries;
public class CommandWH public class CommandWH
@@ -58,84 +56,65 @@ public class CommandWH
private static int pos1(CommandSourceStack source) throws CommandSyntaxException private static int pos1(CommandSourceStack source) throws CommandSyntaxException
{ {
DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> BlockHelper.pos1().set(BlockHelper.getFocusedBlockPos());
{ BlockPos pos = BlockHelper.pos1();
BlockHelper.pos1().set(BlockHelper.getFocusedBlockPos()); ResourceLocation block = ForgeRegistries.BLOCKS.getKey(BlockHelper.getBlock(pos));
BlockPos pos = BlockHelper.pos1(); CommandHelper.sendFeedback(source, "Set first position to " + pos.getX() + ", " + pos.getY() + ", " + pos.getZ() + " (" + block + ")");
ResourceLocation block = ForgeRegistries.BLOCKS.getKey(BlockHelper.getBlock(pos));
CommandHelper.sendFeedback(source, "Set first position to " + pos.getX() + ", " + pos.getY() + ", " + pos.getZ() + " (" + block + ")");
});
return 1; return 1;
} }
private static int pos2(CommandSourceStack source) throws CommandSyntaxException private static int pos2(CommandSourceStack source) throws CommandSyntaxException
{ {
DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> BlockHelper.pos2().set(BlockHelper.getFocusedBlockPos());
{ BlockPos pos = BlockHelper.pos2();
BlockHelper.pos2().set(BlockHelper.getFocusedBlockPos()); ResourceLocation block = ForgeRegistries.BLOCKS.getKey(BlockHelper.getBlock(pos));
BlockPos pos = BlockHelper.pos2(); CommandHelper.sendFeedback(source, "Set second position to " + pos.getX() + ", " + pos.getY() + ", " + pos.getZ() + " (" + block + ")");
ResourceLocation block = ForgeRegistries.BLOCKS.getKey(BlockHelper.getBlock(pos));
CommandHelper.sendFeedback(source, "Set second position to " + pos.getX() + ", " + pos.getY() + ", " + pos.getZ() + " (" + block + ")");
});
return 1; return 1;
} }
private static int fill(CommandSourceStack source, BlockInput block) private static int fill(CommandSourceStack source, BlockInput block)
{ {
DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> FillCommandBuilder builder = new FillCommandBuilder();
{ builder.from().set(BlockHelper.pos1());
FillCommandBuilder builder = new FillCommandBuilder(); builder.to().set(BlockHelper.pos2());
builder.from().set(BlockHelper.pos1()); builder.block().set(block.getState(), block.tag);
builder.to().set(BlockHelper.pos2()); CommandHelper.sendCommand(source.getTextName(), builder, FillCommandBuilder.Label.FILL);
builder.block().set(block.getState(), block.tag);
CommandHelper.sendCommand(source.getTextName(), builder, FillCommandBuilder.Label.FILL);
});
return 1; return 1;
} }
private static int replace(CommandSourceStack source, String filter, BlockInput block) private static int replace(CommandSourceStack source, String filter, BlockInput block)
{ {
DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> FillCommandBuilder builder = new FillCommandBuilder();
{ builder.from().set(BlockHelper.pos1());
FillCommandBuilder builder = new FillCommandBuilder(); builder.to().set(BlockHelper.pos2());
builder.from().set(BlockHelper.pos1()); builder.block().set(block.getState(), block.tag);
builder.to().set(BlockHelper.pos2()); builder.filter().deserialize(filter);
builder.block().set(block.getState(), block.tag); CommandHelper.sendCommand(source.getTextName(), builder, FillCommandBuilder.Label.REPLACE);
builder.filter().deserialize(filter);
CommandHelper.sendCommand(source.getTextName(), builder, FillCommandBuilder.Label.REPLACE);
});
return 1; return 1;
} }
private static int clone(CommandSourceStack source, String mask, String filter) private static int clone(CommandSourceStack source, String mask, String filter)
{ {
DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> CloneCommandBuilder builder = new CloneCommandBuilder();
builder.begin().set(BlockHelper.pos1());
builder.end().set(BlockHelper.pos2());
builder.destination().setX(new Coordinate.Ints(Type.RELATIVE));
builder.destination().setY(new Coordinate.Ints(Type.RELATIVE));
builder.destination().setZ(new Coordinate.Ints(Type.RELATIVE));
switch(mask)
{ {
CloneCommandBuilder builder = new CloneCommandBuilder(); case "filtered":
builder.begin().set(BlockHelper.pos1()); builder.filter().deserialize(filter);
builder.end().set(BlockHelper.pos2()); CommandHelper.sendCommand(source.getTextName(), builder, CloneCommandBuilder.Label.FILTERED);
builder.destination().setX(new Coordinate.Ints(Type.RELATIVE)); break;
builder.destination().setY(new Coordinate.Ints(Type.RELATIVE)); case "masked":
builder.destination().setZ(new Coordinate.Ints(Type.RELATIVE)); CommandHelper.sendCommand(source.getTextName(), builder, CloneCommandBuilder.Label.MASKED);
break;
switch(mask) case "replace":
{ CommandHelper.sendCommand(source.getTextName(), builder, CloneCommandBuilder.Label.REPLACE);
case "filtered": break;
builder.filter().deserialize(filter); }
CommandHelper.sendCommand(source.getTextName(), builder, CloneCommandBuilder.Label.FILTERED);
break;
case "masked":
CommandHelper.sendCommand(source.getTextName(), builder, CloneCommandBuilder.Label.MASKED);
break;
case "replace":
CommandHelper.sendCommand(source.getTextName(), builder, CloneCommandBuilder.Label.REPLACE);
break;
}
});
return 1; return 1;
} }

View File

@@ -6,13 +6,10 @@ import com.mojang.brigadier.CommandDispatcher;
import com.mojang.brigadier.exceptions.CommandSyntaxException; import com.mojang.brigadier.exceptions.CommandSyntaxException;
import exopandora.worldhandler.Main; import exopandora.worldhandler.Main;
import exopandora.worldhandler.util.ActionHelper; import exopandora.worldhandler.event.ClientEventHandler;
import exopandora.worldhandler.util.CommandHelper; import exopandora.worldhandler.util.CommandHelper;
import net.minecraft.client.Minecraft;
import net.minecraft.commands.CommandSourceStack; import net.minecraft.commands.CommandSourceStack;
import net.minecraft.commands.Commands; import net.minecraft.commands.Commands;
import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.fml.DistExecutor;
import net.minecraftforge.fml.ModList; import net.minecraftforge.fml.ModList;
import net.minecraftforge.fml.VersionChecker; import net.minecraftforge.fml.VersionChecker;
@@ -39,7 +36,7 @@ public class CommandWorldHandler
private static int display(CommandSourceStack source) throws CommandSyntaxException private static int display(CommandSourceStack source) throws CommandSyntaxException
{ {
DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> Minecraft.getInstance().execute(ActionHelper::displayGui)); ClientEventHandler.openGui = true;
return 1; return 1;
} }

View File

@@ -2,30 +2,26 @@ package exopandora.worldhandler.event;
import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.PoseStack;
import com.mojang.blaze3d.vertex.VertexConsumer; import com.mojang.blaze3d.vertex.VertexConsumer;
import com.mojang.brigadier.CommandDispatcher;
import com.mojang.brigadier.ParseResults;
import com.mojang.brigadier.StringReader;
import com.mojang.brigadier.exceptions.CommandSyntaxException;
import exopandora.worldhandler.config.Config; import exopandora.worldhandler.config.Config;
import exopandora.worldhandler.util.ActionHelper;
import exopandora.worldhandler.util.BlockHelper; import exopandora.worldhandler.util.BlockHelper;
import exopandora.worldhandler.util.CommandHelper;
import exopandora.worldhandler.util.RenderUtils; import exopandora.worldhandler.util.RenderUtils;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.LevelRenderer; import net.minecraft.client.renderer.LevelRenderer;
import net.minecraft.client.renderer.MultiBufferSource.BufferSource; import net.minecraft.client.renderer.MultiBufferSource.BufferSource;
import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.RenderType;
import net.minecraft.commands.CommandBuildContext;
import net.minecraft.commands.CommandSourceStack;
import net.minecraft.core.RegistryAccess;
import net.minecraft.world.phys.AABB; import net.minecraft.world.phys.AABB;
import net.minecraft.world.phys.Vec3; import net.minecraft.world.phys.Vec3;
import net.minecraftforge.client.event.ClientChatEvent;
import net.minecraftforge.client.event.RenderLevelLastEvent; import net.minecraftforge.client.event.RenderLevelLastEvent;
import net.minecraftforge.event.TickEvent;
import net.minecraftforge.event.TickEvent.ClientTickEvent;
import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.eventbus.api.SubscribeEvent;
public class ClientEventHandler public class ClientEventHandler
{ {
public static boolean openGui;
@SubscribeEvent @SubscribeEvent
public static void renderLevelLastEvent(RenderLevelLastEvent event) public static void renderLevelLastEvent(RenderLevelLastEvent event)
{ {
@@ -63,35 +59,12 @@ public class ClientEventHandler
} }
@SubscribeEvent @SubscribeEvent
public static void clientChatEvent(ClientChatEvent event) public static void clientTickEvent(ClientTickEvent event)
{ {
if(!Minecraft.getInstance().hasSingleplayerServer() && Minecraft.getInstance().player != null) if(TickEvent.Phase.START.equals(event.phase) && ClientEventHandler.openGui)
{ {
CommandDispatcher<CommandSourceStack> dispatcher = new CommandDispatcher<CommandSourceStack>(); ClientEventHandler.openGui = false;
CommandHelper.registerCommands(dispatcher, new CommandBuildContext(RegistryAccess.BUILTIN.get())); ActionHelper.displayGui();
StringReader command = new StringReader(event.getMessage());
command.skip();
ParseResults<CommandSourceStack> result = dispatcher.parse(command, Minecraft.getInstance().player.createCommandSourceStack());
if(result.getContext().getCommand() != null)
{
try
{
dispatcher.execute(result);
Minecraft.getInstance().gui.getChat().addRecentChat(event.getMessage());
}
catch(CommandSyntaxException e)
{
e.printStackTrace();
}
if(event.isCancelable())
{
event.setCanceled(true);
}
}
} }
} }
} }