🎸自定义类型

创建自定义类型需要定义两个类,分别继承 SBTypeSBElement,我叫他类型与元素,类型用于创建元素,元素直接参与表达式解析,下面是内置类型整数的实现以供参考。

public class IntType extends SBType<IntElement> {
    public static IntType inst = new IntType();
    private IntType() {}
    
    @Override
    public Plugin getPlugin() {
        return SBPlaceholder2.plugin;
    }
    
    @Override
    public String getName() {
        return "Int";
    }
    
    @Override
    public IntElement newInst(Parser parser, EntrustInst... insts) {
        return insts[0].execute(parser).asInt();
    }
}

方法详解

public Plugin getPlugin()

  • 获取提供插件。

public String getName()

  • 获取类型名,返回值应与对应的元素的 getName() 方法返回值相同。

public IntElement newInst(Parser parser, EntrustInst... insts)

  • 用于构造新元素。

最后执行 IntType.inst.register("Int") 注册类型。

下面是内置元素整数的实现

public class IntElement extends SBElement<IntType> {
    @NotNull public final Integer value;
    
    public IntElement(@NotNull Integer value) {
        this.value = value;
    }
    
    @Override public Plugin getPlugin() { return SBPlaceholder2.plugin; }
    @Override public String getName() { return "Int"; }
    @Override public String toString() { return value.toString(); }
    
    @Override
    public BoolElement asBool() {
        return BoolElement.fromBool(value > 0);
    }
    
    @Override
    public IntElement asInt() {
        return this;
    }
    
    @Override
    public NumberElement asNumber() {
        return new NumberElement(value.doubleValue());
    }
    
    @Override
    public IntElement symbol_add(SBElement<?> other) {
        return new IntElement(value + other.asInt().value);
    }
    
    @Override
    public IntElement symbol_sub(SBElement<?> other) {
        return new IntElement(value - other.asInt().value);
    }
    
    @Override
    public IntElement symbol_mul(SBElement<?> other) {
        return new IntElement(value * other.asInt().value);
    }
    
    @Override
    public NumberElement symbol_div(SBElement<?> other) {
        return new NumberElement(((double)value) / other.asInt().value);
    }
    
    @Override
    public IntElement symbol_double_div(SBElement<?> other) {
        return new IntElement(value / other.asInt().value);
    }
    
    @Override
    public NumberElement symbol_double_mul(SBElement<?> other) {
        return new NumberElement(Math.pow((double)value, other.asNumber().value));
    }
    
    @Override
    public Integer symbol_compare(SBElement<?> other) {
        return value.compareTo(other.asInt().value);
    }
    
    @ElementMethod(name = "abs", returnType = "Int")
    public SBElement<?> method_abs(Parser parser, EntrustInst... args) {
        return new IntElement(Math.abs(value));
    }
    
    @ElementMethod(name = "mod", args = {"Int"}, returnType = "Int")
    public SBElement<?> method_mod(Parser parser, EntrustInst... args) {
        IntElement arg1 = args[0].execute(parser).asInt();
        return new IntElement(value % arg1.value);
    }
    
    @Override
    public int hashCode() {
        return value.hashCode();
    }
    
    @Override
    public boolean equals(Object obj) {
        return obj instanceof IntElement intInst && intInst.value.equals(value);
    }
}

快速构建

@EventHandler
public void onFastElementBuild(FastElementBuildEvent event) {
    if (event.getRaw_string().equals("随机数字")) {
        event.setResult(new NumberElement(Math.random()));
    }
}
> %s_随机数字%
0.58272153

最后更新于