多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
>[danger]例如道具等级,需要在生成物品时传递进来 可以将组件继承`ParameterPiece` >[danger] 先展示最终效果(由于箱子最下一排只有7个位置可用,超过7个将不会显示,直到出现了新的UI模式QAQ) ![](https://img.kancloud.cn/79/73/797355497600a5eecd46b1a318e64347_221x129.png) >[danger] MyParameterMeta代码 ``` public class MyParameterMeta implements ProxyObject<Integer> { private int level = 0; @Override public Integer get() { return level; } @Override public ProxyObject<Integer> set(Integer level) { this.level = level; return this; } } ``` >[danger] MyParameterPrice代码 ``` public class MyParameterPrice<T extends ItemObject> extends ParameterPiece<MyParameterMeta, T, Integer> { private final Map<String, CustomArg> argMap; @Override public Map<String, CustomArg> getAutoArgs() { //需要注册的参数返回出去 return argMap; } protected MyParameterPrice() { //这里写一个支持参数的等级组件 super("my-parameter-level"); argMap = new HashMap<>(); //添加一个参数名为 "my-parameter-level" 的Integer型参数 argMap.put("my-parameter-level",new IntegerArg()); //返回变量管理器 VariableManager<MyParameterMeta, T, Integer> variableManager = getVariableManager(); //添加空节点变量 {equip.my-parameter-level} 会解析成 metatable.get().toString() variableManager.addVariable(null, new Variable.ItemStringVariable<MyParameterMeta, T, Integer>() { @Override public String getValue(T inter, BuildPiece buildPiece, String str, MyParameterMeta metatable) { return metatable.get().toString(); } }); //添加level节点变量 {equip.my-parameter-level.level} 会解析成 metatable.get().toString() variableManager.addVariable("level", new Variable.ItemStringVariable<MyParameterMeta, T, Integer>() { @Override public String getValue(T inter, BuildPiece buildPiece, String str, MyParameterMeta metatable) { return metatable.get().toString(); } }); //让组件支持物品nbt setMetaSerialize(new BasicMetaSerialize<MyParameterMeta, T, Integer>(getId()) { /** * 序列化操作 */ @Override public MetaBase toMeta(MyParameterMeta instance) { //元数据模块 MetaModule module = MAPI.getAPI().getModuleManager().getModule(MetaModule.class); //创建基本类型数据 MetaPrimitive primitive = module.createPrimitive(instance.get()); //创建list //MetaList list = module.createList(); //创建map //MetaCompound compound = module.createCompound(); return primitive; } /** * 反序列化操作 * @param itemInter 物品中间件 泛型T是什么类型就是什么类型 * @param instance 你的元数据容器实例 * @param metaBase 元数据(NBT结构,或者说是 Map List 基本类型 结构) */ @Override public void fromMeta(T itemInter, MyParameterMeta instance, MetaBase metaBase) { //判断是 map 还是 list 还是 基本类型 if (metaBase.isPrimitive() && metaBase.toPrimitive().isNumber()) { //是数字, 就给对象设置 instance.set(metaBase.toPrimitive().getNumber().intValue()); } } }); } @Override public Class<?> getProxyObjectClass() { //返回你的元数据容器class return MyParameterMeta.class; } @Override public MyParameterMeta spawnProxyObject(T inter) { return new MyParameterMeta(); } /** * 将参数str格式解析成你需要的格式 * * @param author 生成物品时的玩家,可能为null * @param tr 文本替换器 * @param arg 'level=2;my-parameter-level=5'中的5 * @return 解析后的结果 */ @Override protected Integer analysisArg(AdapterPlayer author, TextReplacer tr, String arg) { //arg是 'level=2;my-parameter-level=5'传入的5字符串 //TextReplacer 参数可以进行计算 //double calculated = tr.calculated(arg); //return (int)calculated; return Integer.parseInt(arg); } /** * 这个方法是在物品生成时调用 * * @param inter 物品中间件 * @param instance 由 spawnProxyObject() 生成的对象 * @param level 这个参数是由 analysisArg 方法解析后的内容 * @param author 玩家 可能为null * @param tr 文本替换器 * @param args 参数 */ @Override protected void set(T inter, MyParameterMeta instance, Integer level, AdapterPlayer author, TextReplacer tr, ParameterResolver args) { instance.set(level); } } ```