mirror of
https://github.com/ViaVersion/ViaVersion.git
synced 2024-11-02 08:39:59 +01:00
Add abstract declare commands handler
This commit is contained in:
parent
59e05e3096
commit
54488341bf
@ -0,0 +1,84 @@
|
||||
package us.myles.ViaVersion.api.rewriters;
|
||||
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
import us.myles.ViaVersion.api.PacketWrapper;
|
||||
import us.myles.ViaVersion.api.protocol.ClientboundPacketType;
|
||||
import us.myles.ViaVersion.api.protocol.Protocol;
|
||||
import us.myles.ViaVersion.api.remapper.PacketRemapper;
|
||||
import us.myles.ViaVersion.api.type.Type;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* Abstract rewriter for the declare commands packet to handle argument type name and content changes.
|
||||
*/
|
||||
public abstract class CommandRewriter {
|
||||
protected final Protocol protocol;
|
||||
protected final Map<String, CommandArgumentConsumer> parserHandlers = new HashMap<>();
|
||||
|
||||
protected CommandRewriter(Protocol protocol) {
|
||||
this.protocol = protocol;
|
||||
}
|
||||
|
||||
public void handleArgument(PacketWrapper wrapper, String argumentType) throws Exception {
|
||||
CommandArgumentConsumer handler = parserHandlers.get(argumentType);
|
||||
if (handler != null) {
|
||||
handler.accept(wrapper);
|
||||
}
|
||||
}
|
||||
|
||||
public void registerDeclareCommands(ClientboundPacketType packetType) {
|
||||
protocol.registerOutgoing(packetType, new PacketRemapper() {
|
||||
@Override
|
||||
public void registerMap() {
|
||||
handler(wrapper -> {
|
||||
int size = wrapper.passthrough(Type.VAR_INT);
|
||||
for (int i = 0; i < size; i++) {
|
||||
byte flags = wrapper.passthrough(Type.BYTE);
|
||||
wrapper.passthrough(Type.VAR_INT_ARRAY_PRIMITIVE); // Children indices
|
||||
if ((flags & 0x08) != 0) {
|
||||
wrapper.passthrough(Type.VAR_INT); // Redirect node index
|
||||
}
|
||||
|
||||
byte nodeType = (byte) (flags & 0x03);
|
||||
if (nodeType == 1 || nodeType == 2) { // Literal/argument node
|
||||
wrapper.passthrough(Type.STRING); // Name
|
||||
}
|
||||
|
||||
if (nodeType == 2) { // Argument node
|
||||
String argumentType = handleArgumentType(wrapper.read(Type.STRING));
|
||||
if (argumentType != null) {
|
||||
wrapper.write(Type.STRING, argumentType);
|
||||
handleArgument(wrapper, argumentType);
|
||||
}
|
||||
}
|
||||
|
||||
if ((flags & 0x10) != 0) {
|
||||
wrapper.passthrough(Type.STRING); // Suggestion type
|
||||
}
|
||||
}
|
||||
|
||||
wrapper.passthrough(Type.VAR_INT); // Root node index
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Can be overridden if needed.
|
||||
*
|
||||
* @param argumentType argument type
|
||||
* @return new argument type, or null if it should be removed
|
||||
*/
|
||||
@Nullable
|
||||
protected String handleArgumentType(String argumentType) {
|
||||
return argumentType;
|
||||
}
|
||||
|
||||
@FunctionalInterface
|
||||
public interface CommandArgumentConsumer {
|
||||
|
||||
void accept(PacketWrapper wrapper) throws Exception;
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user