Skip to content

Commit

Permalink
feat: 增强JS插件注册命令的功能 (PowerNukkitX#962)
Browse files Browse the repository at this point in the history
* feat: 增强JS插件注册命令的功能

1.JS插件现新增了完整的新建CommandParameter和CommandEnum的方法
2.JS插件注册命令后可以获取到命令对象

* refactor: 优化了之前的Message类型参数解析

* revert: 移除错误上传的运行配置

* 修订
  • Loading branch information
CoolLoong authored Jan 25, 2023
1 parent 075fcba commit 42b30b9
Show file tree
Hide file tree
Showing 19 changed files with 256 additions and 294 deletions.
10 changes: 0 additions & 10 deletions .run/PNX.run.xml

This file was deleted.

19 changes: 15 additions & 4 deletions src/main/java/cn/nukkit/command/data/CommandEnum.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,18 +4,21 @@
import cn.nukkit.api.PowerNukkitXOnly;
import cn.nukkit.api.Since;
import cn.nukkit.network.protocol.UpdateSoftEnumPacket;
import cn.nukkit.potion.Effect;
import com.google.common.collect.ImmutableList;

import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import java.util.*;
import java.util.function.Supplier;

/**
* @author CreeperFace
*/
public class CommandEnum {
@PowerNukkitXOnly
@Since("1.19.50-r4")
public static final CommandEnum ENUM_EFFECT;
@PowerNukkitXOnly
@Since("1.19.50-r4")
public static final CommandEnum FUNCTION_FILE = new CommandEnum("filepath", () -> Server.getInstance().getFunctionManager().getFunctions().keySet(), true);
Expand Down Expand Up @@ -54,6 +57,14 @@ public class CommandEnum {
)*/ Collections.emptyList());

ENUM_ENTITY = new CommandEnum("Entity", Collections.emptyList());

List<String> effects = new ArrayList<>();
for (Field field : Effect.class.getDeclaredFields()) {
if (field.getType() == int.class && field.getModifiers() == (Modifier.PUBLIC | Modifier.STATIC | Modifier.FINAL)) {
effects.add(field.getName().toLowerCase());
}
}
ENUM_EFFECT = new CommandEnum("Effect", effects, false);
}

private final String name;
Expand Down
116 changes: 40 additions & 76 deletions src/main/java/cn/nukkit/command/data/CommandParameter.java
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
import java.util.ArrayList;
import java.util.List;

public class CommandParameter implements Cloneable {
public class CommandParameter {

@PowerNukkitOnly
@Since("1.4.0.0-PN")
Expand Down Expand Up @@ -141,9 +141,9 @@ public static CommandParameter newType(String name, CommandParamType type) {


/**
* optional = false
* optional = false,CommandParamOption=[]
*
* @see #newType(String, boolean, CommandParamType, IParamNode)
* @see #newType(String, boolean, CommandParamType, IParamNode, CommandParamOption...)
*/
@PowerNukkitXOnly
@Since("1.19.50-r3")
Expand All @@ -153,31 +153,24 @@ public static CommandParameter newType(String name, CommandParamType type, IPara


/**
* 创建一个命令参数,参数解析节点{@link IParamNode}依据参数类型{@link CommandParamType}自动选取
* paramNode = null , CommandParamOption=[]
*
* @param name 参数名
* @param optional 该参数是否为可选参数
* @param type 类型{@link CommandParamType}
* @return the command parameter
* @see #newType(String, boolean, CommandParamType, IParamNode, CommandParamOption...)
*/
@Since("1.4.0.0-PN")
public static CommandParameter newType(String name, boolean optional, CommandParamType type) {
return new CommandParameter(name, optional, type, null, null);
return newType(name, optional, type, null, new CommandParamOption[]{});
}

/**
* 创建一个命令参数,参数解析节点{@link IParamNode}依据参数类型{@link CommandParamType}自动选取
* paramNode = null
*
* @param name 参数名
* @param optional 该参数是否为可选参数
* @param type 类型{@link CommandParamType}
* @return the command parameter
* @see #newType(String, boolean, CommandParamType, IParamNode, CommandParamOption...)
*/
@PowerNukkitXOnly
@Since("1.19.50-r4")
public static CommandParameter newType(String name, boolean optional, CommandParamType type, CommandParamOption... options) {
var result = new CommandParameter(name, optional, type, null, null);
result.paramOptions = Lists.newArrayList(options);
return result;
return newType(name, optional, type, null, options);
}

/**
Expand All @@ -187,12 +180,17 @@ public static CommandParameter newType(String name, boolean optional, CommandPar
* @param optional 该参数是否为可选参数
* @param type 类型{@link CommandParamType}
* @param paramNode 用于解析该参数的参数节点
* @param options the options
* @return the command parameter
*/
@PowerNukkitXOnly
@Since("1.19.50-r3")
public static CommandParameter newType(String name, boolean optional, CommandParamType type, IParamNode<?> paramNode) {
return new CommandParameter(name, optional, type, null, null, paramNode);
@Since("1.19.50-r4")
public static CommandParameter newType(String name, boolean optional, CommandParamType type, IParamNode<?> paramNode, CommandParamOption... options) {
var result = new CommandParameter(name, optional, type, null, null, paramNode);
if (options.length != 0) {
result.paramOptions = Lists.newArrayList(options);
}
return result;
}

/**
Expand All @@ -219,17 +217,17 @@ public static CommandParameter newEnum(String name, boolean optional, String[] v
/**
* optional = false
*
* @see #newEnum(String name, boolean optional, String type)
* @see #newEnum(String, boolean, CommandEnum, IParamNode, CommandParamOption...)
*/
@Since("1.4.0.0-PN")
public static CommandParameter newEnum(String name, String type) {
return newEnum(name, false, type);
}

/**
* isSoft = false
* optional = false
*
* @see #newEnum(String name, boolean optional, String type, boolean isSoft)
* @see #newEnum(String, boolean, CommandEnum, IParamNode, CommandParamOption...)
*/
@Since("1.4.0.0-PN")
public static CommandParameter newEnum(String name, boolean optional, String type) {
Expand All @@ -238,13 +236,9 @@ public static CommandParameter newEnum(String name, boolean optional, String typ


/**
* 创建一个枚举参数,其枚举数据{@link CommandEnum#getValues()}为空列表
* optional = false
*
* @param name 参数名(不会显示到命令中,仅作为标识)
* @param optional 该枚举参数是否可选
* @param type 枚举参数名(会显示到参数中)
* @param isSoft 当为False时,客户端显示枚举参数会带上枚举名称{@link CommandEnum#getName()}
* @return the command parameter
* @see #newEnum(String, boolean, CommandEnum, IParamNode, CommandParamOption...)
*/
@PowerNukkitXOnly
@Since("1.6.0.0-PNX")
Expand All @@ -263,71 +257,60 @@ public static CommandParameter newEnum(String name, CommandEnum data) {
}

/**
* 创建一个枚举参数
* optional = false
*
* @param name 参数名(不会显示到命令中,仅作为标识)
* @param optional 改参数是否可选
* @param data 枚举数据{@link CommandEnum},其中的{@link CommandEnum#getName()}才是真正的枚举参数名
* @return the command parameter
* @see #newEnum(String, boolean, CommandEnum, IParamNode, CommandParamOption...)
*/
@Since("1.4.0.0-PN")
public static CommandParameter newEnum(String name, boolean optional, CommandEnum data) {
return new CommandParameter(name, optional, null, data, null);
}

/**
* 创建一个枚举参数
* optional = false
*
* @param name 参数名称
* @param optional 改参数是否可选
* @param data 枚举数据{@link CommandEnum},其中的{@link CommandEnum#getName()}才是真正的枚举参数名
* @param options the options
* @return the command parameter
* @see #newEnum(String, boolean, CommandEnum, IParamNode, CommandParamOption...)
*/
@PowerNukkitXOnly
@Since("1.19.50-r4")
public static CommandParameter newEnum(String name, boolean optional, CommandEnum data, CommandParamOption... options) {
var result = new CommandParameter(name, optional, null, data, null);
result.paramOptions = Lists.newArrayList(options);
return result;
return newEnum(name, optional, data, null, options);
}


/**
* New enum command parameter.
* optional = false
*
* @param name the name
* @param optional the optional
* @param data the data
* @param paramNode the enum node
* @return the command parameter
* @see #newEnum(String, boolean, CommandEnum, IParamNode, CommandParamOption...)
*/
@PowerNukkitXOnly
@Since("1.19.50-r4")
public static CommandParameter newEnum(String name, boolean optional, CommandEnum data, IParamNode<?> paramNode) {
return new CommandParameter(name, optional, null, data, null, paramNode);
return newEnum(name, optional, data, paramNode, new CommandParamOption[]{});
}

/**
* New enum command parameter.
* 创建一个枚举参数
*
* @param name the name
* @param optional the optional
* @param data the data
* @param paramNode the enum node
* @param name 参数名称
* @param optional 改参数是否可选
* @param data 枚举数据{@link CommandEnum},其中的{@link CommandEnum#getName()}才是真正的枚举参数名
* @param paramNode 该参数对应的{@link IParamNode}
* @param options the options
* @return the command parameter
*/
@PowerNukkitXOnly
@Since("1.19.50-r4")
public static CommandParameter newEnum(String name, boolean optional, CommandEnum data, IParamNode<?> paramNode, CommandParamOption... options) {
var result = new CommandParameter(name, optional, null, data, null, paramNode);
result.paramOptions = Lists.newArrayList(options);
if (options.length != 0) {
result.paramOptions = Lists.newArrayList(options);
}
return result;
}

//此方法使用不当会崩溃客户端,请谨慎使用!
//todo 注释掉创建Postfix的方法知道能够稳定运行
//todo 注释掉创建Postfix的方法直到能够稳定运行
/*@Since("1.4.0.0-PN")
public static CommandParameter newPostfix(String name, String postfix) {
return newPostfix(name, false, postfix);
Expand Down Expand Up @@ -356,25 +339,6 @@ protected static CommandParamType fromString(String param) {
return CommandParamType.RAWTEXT;
}

@PowerNukkitXOnly
@Since("1.19.50-r4")
@Override
public CommandParameter clone() throws CloneNotSupportedException {
try {
CommandParameter commandParameter = (CommandParameter) super.clone();
commandParameter.type = this.type;
commandParameter.name = this.name;
commandParameter.enumData = this.enumData;
commandParameter.optional = this.optional;
commandParameter.paramOptions = this.paramOptions;
commandParameter.postFix = this.postFix;
commandParameter.paramNode = this.paramNode;
return commandParameter;
} catch (CloneNotSupportedException e) {
return null;
}
}

@Deprecated
@DeprecationDetails(since = "1.4.0.0-PN", reason = "Removed from Cloudburst Nukkit")
@PowerNukkitOnly("Re-added for backward compatibility")
Expand Down
14 changes: 1 addition & 13 deletions src/main/java/cn/nukkit/command/defaults/EffectCommand.java
Original file line number Diff line number Diff line change
Expand Up @@ -7,16 +7,12 @@
import cn.nukkit.command.data.CommandParamType;
import cn.nukkit.command.data.CommandParameter;
import cn.nukkit.command.tree.ParamList;
import cn.nukkit.command.tree.ParamTree;
import cn.nukkit.command.utils.CommandLogger;
import cn.nukkit.entity.Entity;
import cn.nukkit.entity.item.EntityItem;
import cn.nukkit.potion.Effect;
import cn.nukkit.potion.InstantEffect;

import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

Expand All @@ -29,17 +25,9 @@ public EffectCommand(String name) {
super(name, "commands.effect.description", "nukkit.command.effect.usage");
this.setPermission("nukkit.command.effect");
this.commandParameters.clear();

List<String> effects = new ArrayList<>();
for (Field field : Effect.class.getDeclaredFields()) {
if (field.getType() == int.class && field.getModifiers() == (Modifier.PUBLIC | Modifier.STATIC | Modifier.FINAL)) {
effects.add(field.getName().toLowerCase());
}
}

this.commandParameters.put("default", new CommandParameter[]{
CommandParameter.newType("player", CommandParamType.TARGET),
CommandParameter.newEnum("effect", new CommandEnum("Effect", effects)),
CommandParameter.newEnum("effect", CommandEnum.ENUM_EFFECT),
CommandParameter.newType("seconds", true, CommandParamType.INT),
CommandParameter.newType("amplifier", true, CommandParamType.INT),
CommandParameter.newEnum("hideParticle", true, CommandEnum.ENUM_BOOLEAN)
Expand Down
Loading

0 comments on commit 42b30b9

Please sign in to comment.