描述匹配器

用于物品描述的前缀识别,具体表现在 taboolib.common5.LoreMap 类中。在 Map 中储存描述关键词和对象, 然后丢入装备上的描述即可高效返回对象。

用法和 HashMap 类似,适合上百条乃至上千条描述的快速前缀判断。

比如,你有 “物理伤害”, “法术伤害”, “心理伤害” 等上百种属性,”&b&l[&e&l属性&b&l]&c&l物理伤害: &a20”、”草泥马透透透物理伤害: &b20”。

现在要从中准确提取出 “物理伤害” 和 “:20” (注:”物理伤害” 这四个字中间,只允许有空格或颜色代码),那么用这个LoreMap, 只需调用 getMatchResult(lore)。你将会在几毫秒内得到匹配结果,远远快于循环 contains 和正则表达式。

注意,若要完全匹配则推荐直接用 HashMap 的 containsKey(lore)

具体使用方式可以表现为以下形式:

// 假定你通过抽象类定义了属性
public abstract class MyAttribute

// 并且定义了子类
public class Damage extend MyAttribute

public class Health extend MyAttribute

现在可以定义一个 LoreMap 容器,并向其中添加描述和属性:

// 三个参数为:无视颜色代码,无视前缀,无视空格
public static LoreMap<MyAttribute> attrMap = new LoreMap(true, true, true);

static {
    attrMap.put("伤害", new Damage())
    attrMap.put("生命", new Health())
}

并在之后通过描述随时获取属性:

for (String lore: meta.getLore()) {
    // 在 LoreMap 中匹配属性
    LoreMap.Result<MyAttribute> matchResult = attrMap.getMatchResult(lore)
    // 如果没匹配到则处理下一条
    if (matchResult.obj == null) {
        continue;
    }
    // 匹配到则取属性
    MyAttribute attr = matchResult.obj;
    // 取属性描述右边剩下没匹配完的
    String remain = matchResult.remain;
    // 没匹配完的啥也没有,说明属性右边没数字,跳过
    if (remain==null) {
        continue;
    }
    // 处理属性
    // ..
}