mirror of
https://github.com/GeyserMC/Geyser.git
synced 2025-12-19 14:59:27 +00:00
Introduce sendCommand API method (#5582)
* Introduce sendCommand API method * Ensure Geyser/extension commands are caught * Remove handleCommand from the translator, use executeCommand directly * Relocate the command handling logic again, using the new one this time * Fix up the javadocs * Rename back to sendCommand, rename the packet method * Also change the bedrock command translator * And another one... * Ensure we forward commands directly when catching exceptions during command execution --------- Co-authored-by: onebeastchris <github@onechris.mozmail.com>
This commit is contained in:
@@ -107,6 +107,13 @@ public interface GeyserConnection extends Connection, CommandSource {
|
||||
*/
|
||||
void openQuickActions();
|
||||
|
||||
/**
|
||||
* Sends a command as if the player had executed it.
|
||||
*
|
||||
* @param command the command without the leading forward-slash
|
||||
*/
|
||||
void sendCommand(String command);
|
||||
|
||||
/**
|
||||
* @param javaId the Java entity ID to look up.
|
||||
* @return a {@link GeyserEntity} if present in this connection's entity tracker.
|
||||
|
||||
@@ -287,7 +287,7 @@ public class CommandRegistry implements EventRegistrar {
|
||||
help.execute(source);
|
||||
} else if (STANDALONE_COMMAND_MANAGER && source instanceof GeyserSession session) {
|
||||
// If we are on an appropriate platform, forward the command to the backend
|
||||
session.sendCommand(context.rawInput().input());
|
||||
session.sendCommandPacket(context.rawInput().input());
|
||||
} else {
|
||||
source.sendLocaleString(ExceptionHandlers.PERMISSION_FAIL_LANG_KEY);
|
||||
}
|
||||
|
||||
@@ -89,7 +89,7 @@ final class ExceptionHandlers {
|
||||
(ctx, e) -> {
|
||||
// Let backend server receive & handle the command
|
||||
if (CommandRegistry.STANDALONE_COMMAND_MANAGER && ctx.sender() instanceof GeyserSession session) {
|
||||
session.sendCommand(ctx.rawInput().input());
|
||||
session.sendCommandPacket(ctx.rawInput().input());
|
||||
} else {
|
||||
ctx.sender().sendLocaleString("geyser.command.not_found");
|
||||
}
|
||||
@@ -114,7 +114,7 @@ final class ExceptionHandlers {
|
||||
|
||||
// Let backend server receive & handle the command
|
||||
if (CommandRegistry.STANDALONE_COMMAND_MANAGER && source instanceof GeyserSession session) {
|
||||
session.sendCommand(context.rawInput().input());
|
||||
session.sendCommandPacket(context.rawInput().input());
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
@@ -126,7 +126,7 @@ public abstract class WorldManager {
|
||||
* @param value The new value for the gamerule
|
||||
*/
|
||||
public void setGameRule(GeyserSession session, String name, Object value) {
|
||||
session.sendCommand("gamerule " + name + " " + value);
|
||||
session.sendCommandPacket("gamerule " + name + " " + value);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -162,7 +162,7 @@ public abstract class WorldManager {
|
||||
* @param gameMode the new default game mode
|
||||
*/
|
||||
public void setDefaultGameMode(GeyserSession session, GameMode gameMode) {
|
||||
session.sendCommand("defaultgamemode " + gameMode.name().toLowerCase(Locale.ROOT));
|
||||
session.sendCommandPacket("defaultgamemode " + gameMode.name().toLowerCase(Locale.ROOT));
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -172,7 +172,7 @@ public abstract class WorldManager {
|
||||
* @param difficulty The difficulty to change to
|
||||
*/
|
||||
public void setDifficulty(GeyserSession session, Difficulty difficulty) {
|
||||
session.sendCommand("difficulty " + difficulty.name().toLowerCase(Locale.ROOT));
|
||||
session.sendCommandPacket("difficulty " + difficulty.name().toLowerCase(Locale.ROOT));
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -120,6 +120,7 @@ import org.geysermc.geyser.api.entity.type.player.GeyserPlayerEntity;
|
||||
import org.geysermc.geyser.api.event.bedrock.SessionDisconnectEvent;
|
||||
import org.geysermc.geyser.api.event.bedrock.SessionLoginEvent;
|
||||
import org.geysermc.geyser.api.network.RemoteServer;
|
||||
import org.geysermc.geyser.command.CommandRegistry;
|
||||
import org.geysermc.geyser.command.GeyserCommandSource;
|
||||
import org.geysermc.geyser.configuration.EmoteOffhandWorkaroundOption;
|
||||
import org.geysermc.geyser.configuration.GeyserConfiguration;
|
||||
@@ -1510,10 +1511,39 @@ public class GeyserSession implements GeyserConnection, GeyserCommandSource {
|
||||
/**
|
||||
* Sends a command to the Java server.
|
||||
*/
|
||||
public void sendCommand(String command) {
|
||||
public void sendCommandPacket(String command) {
|
||||
sendDownstreamGamePacket(new ServerboundChatCommandSignedPacket(command, Instant.now().toEpochMilli(), 0L, Collections.emptyList(), 0, new BitSet(), (byte) 0));
|
||||
}
|
||||
|
||||
/**
|
||||
* Runs the command through platform specific command registries if applicable
|
||||
* else, it sends the command to the server.
|
||||
*/
|
||||
@Override
|
||||
public void sendCommand(String command) {
|
||||
if (MessageTranslator.isTooLong(command, this)) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (CommandRegistry.STANDALONE_COMMAND_MANAGER) {
|
||||
// try to handle the command within the standalone/viaproxy command manager
|
||||
String[] args = command.split(" ");
|
||||
if (args.length > 0) {
|
||||
String root = args[0];
|
||||
|
||||
CommandRegistry registry = GeyserImpl.getInstance().commandRegistry();
|
||||
if (registry.rootCommands().contains(root)) {
|
||||
registry.runCommand(this, command);
|
||||
// don't pass the command to the java server here
|
||||
// will pass it through later if the user lacks permission
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
this.sendCommandPacket(command);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void openPauseScreenAdditions() {
|
||||
List<Dialog> additions = tagCache.get(DialogTag.PAUSE_SCREEN_ADDITIONS);
|
||||
|
||||
@@ -39,30 +39,6 @@ public class BedrockCommandRequestTranslator extends PacketTranslator<CommandReq
|
||||
@Override
|
||||
public void translate(GeyserSession session, CommandRequestPacket packet) {
|
||||
String command = MessageTranslator.convertToPlainText(packet.getCommand());
|
||||
handleCommand(session, MessageTranslator.normalizeSpace(command).substring(1));
|
||||
}
|
||||
|
||||
static void handleCommand(GeyserSession session, String command) {
|
||||
if (MessageTranslator.isTooLong(command, session)) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (CommandRegistry.STANDALONE_COMMAND_MANAGER) {
|
||||
// try to handle the command within the standalone/viaproxy command manager
|
||||
String[] args = command.split(" ");
|
||||
if (args.length > 0) {
|
||||
String root = args[0];
|
||||
|
||||
CommandRegistry registry = GeyserImpl.getInstance().commandRegistry();
|
||||
if (registry.rootCommands().contains(root)) {
|
||||
registry.runCommand(session, command);
|
||||
// don't pass the command to the java server here
|
||||
// will pass it through later if the user lacks permission
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
session.sendCommand(command);
|
||||
session.sendCommand(MessageTranslator.normalizeSpace(command).substring(1));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -48,7 +48,7 @@ public class BedrockTextTranslator extends PacketTranslator<TextPacket> {
|
||||
|
||||
if (message.startsWith("/")) {
|
||||
// Yes, Java actually allows whitespaces before commands and will still see those as valid
|
||||
BedrockCommandRequestTranslator.handleCommand(session, message.substring(1));
|
||||
session.sendCommand(message.substring(1));
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user