>[danger] 原模板是这样使用的
```
name: '{equip.quality.color}{equip.name}{equip.streng.name}'
lore:
- '{equip.bind}'
- '{equip.template.config.归属}'
- '#FF9B9B9B职业:#FFC7CAED {equip.need-class}'
- '#FF9B9B9B等级:#FFC7CAED {equip.need-level}'
- '#FF9B9B9B部位:#FFC7CAED {equip.equip-type}'
- '#FF9B9B9B品质: {equip.quality.color}{equip.quality.display}'
- '#FF9B9B9B评分:#FFC7CAED {equip.sell.value.score}'
- '#FF9B9B9B售价[#FFC8C3B8银两#FF9B9B9B]'
- '#FFC8C3B8{equip.sell.value.money}'
- '#FFC7CAED{equip.entry-basic}'
- '#FF5D66DC{equip.entry-random}'
- '{equip.template.config.孔数1}'
- '{equip.template.config.孔数}'
- '{equip.gem}'
- '[start]'
- '#FF9B9B9B{equip.introduce}'
- '[end]'
```
</br>
*****
</br>
>[danger] 解译器模式是这样调用的
```
code-name: TemplateUtil.equipName(data);
code-lore: TemplateUtil.equipLore(data);
```
</br>
*****
</br>
`TemplateUtil` 是一个模板工具例子,针对上述排版的lore生成
路径: `\plugins\PxRpg\Modules\Code\Cover\pxrpg.util.TemplateUtil.java`(记得在`\plugins\PxRpg\Modules\Code\env-imports.yml`导入)
</br>
#### :-: **完整内容**
```
import com.google.common.collect.HashBasedTable;
import com.google.common.collect.Table;
import com.pxpmc.itemextend.api.creator.Attr;
import com.pxpmc.itemextend.api.piece.ExtendData;
import com.pxpmc.pxrpg.api.item.ItemObject;
import com.pxpmc.pxrpg.api.modules.attribute.Attribute;
import com.pxpmc.pxrpg.api.modules.attribute.entry.AttributeEntry;
import com.pxpmc.pxrpg.api.modules.bind.BindType;
import com.pxpmc.pxrpg.api.modules.code.util.UMap;
import com.pxpmc.pxrpg.api.modules.entrygroup.EntryGroup;
import com.pxpmc.pxrpg.api.modules.entrygroup.item.piece.ItemEntryGroup;
import com.pxpmc.pxrpg.api.modules.equip.EquipInter;
import com.pxpmc.pxrpg.api.modules.equipcontainer.EquipType;
import com.pxpmc.pxrpg.api.modules.gem.GemInter;
import com.pxpmc.pxrpg.api.modules.gem.forequip.piece.EquipGemInfo;
import com.pxpmc.pxrpg.api.modules.occupation.Occupation;
import com.pxpmc.pxrpg.api.modules.occupation.piece.OccupationInfo;
import com.pxpmc.pxrpg.api.modules.quality.Quality;
import com.pxpmc.pxrpg.api.modules.sell.piece.SellInfo;
import com.pxpmc.pxrpg.bukkit.PxRpg;
import org.bukkit.Bukkit;
import java.util.*;
/**
* 模板工具类
* 用前记得导入
*/
class TemplateUtil {
static String color1 = "&f";
static String color2 = "&6";
static String colorBase = "&f"; //基础属性颜色和装备详情颜色
static String colorRandom = "&b";
static String equipName(UMap data) {
ItemObject itemObject = data.get("inter");
String name = itemObject.getData("name");
Quality quality = itemObject.getData("quality");
int strenglevel = itemObject.getData("streng");
return quality.getColor() + name + (strenglevel > 0 ? " &e+" + strenglevel : "");
}
/**
* 装备lore排版生成
*
* @param data pr的数据
* @return 生成后的list
*/
static List equipLore(UMap data) {
List list = new ArrayList();
ItemObject inter = data.get("inter");
//绑定类型的显示名称
addBind(list, inter);
//归属者
//addAuthor(list, inter);
//职业
addOcc(list, inter);
//等级
addLevel(list, inter);
//部位
addType(list, inter);
//品质
addQuality(list, inter);
//售价和评分
addSell(list, inter);
//基础词条
addBasicEntry(list, inter);
//随机词条
addRandomEntry(list, inter);
//宝石孔数以及宝石
addGems(list, inter);
//装备描述
addIntroduce(list, inter);
return list;
}
static void addGemInlaid(List list, ItemObject inter) {
//宝石适用
Set inlaids = inter.getData("inlaid-equip-type");
list.add(color1 + "适用: " + colorBase + join((Collection) inlaids));
}
static void addBind(List list, ItemObject inter) {
//绑定类型的显示名称
BindType bindType = inter.getData("bind");
list.add(bindType.getDisplay());
}
static void addLevel(List list, ItemObject inter) {
//等级
int level = inter.getData("need-level");
list.add(color1 + "等级: " + colorBase + level);
}
static void addQuality(List list, ItemObject inter) {
Quality quality = inter.getData("quality");
list.add(color1 + "品质: " + quality.getColor() + quality.getDisplay());
}
static void addSell(List list, ItemObject inter) {
addSell(list, inter, true);
}
static void addSell(List list, ItemObject inter, boolean showScore) {
//售价和评分
SellInfo sell = inter.getData("sell");
if (showScore) {
list.add(color1 + "评分: " + colorBase + (sell.hasPrice("score") ? NumFormat.toTho(sell.getPrice("score")) : "0"));
}
list.add(color1 + "售价[" + color2 + "银两" + color1 + "]");
//NumFormat 这个类在tools里面有实例
list.add(color2 + (sell.hasPrice("money") ? NumFormat.toTho(sell.getPrice("money")) : "0"));
}
static void addType(List list, ItemObject inter) {
//部位
EquipType type = inter.getData("equip-type");
list.add(color1 + "部位: " + colorBase + type.getDisplay());
}
static void addOcc(List list, ItemObject inter) {
//职业要求
OccupationInfo inf = inter.getData("need-class");
Set keys = inf.keys();
if (keys.isEmpty()) list.add(color1 + "职业: " + colorBase + "通用");
else list.add(color1 + "职业: " + colorBase + join((Collection) inf.values()));
}
static void addIntroduce(List list, ItemObject inter) {
addIntroduce(list, inter, true);
}
static void addIntroduce(List list, ItemObject inter, boolean equip) {
List introduces = inter.getData("introduce");
if (introduces.isEmpty()) return;
if (equip) list.add("[start]");
for (String line : introduces)
list.add(color1 + line);
if (equip) list.add("[end]");
}
static void addAuthor(List list, ItemObject inter) {
String str = inter.getData("author");
list.add("无".equals(str) ? "" : color1 + str);
}
static void addBasicEntry(List list, ItemObject inter) {
//基础词条
ItemEntryGroup entryGroup = inter.getData("entry-basic");
for (String line : entryGroup.spawnInfo())
list.add(colorBase + line);
}
static void addRandomEntry(List list, ItemObject inter) {
//随机词条
ItemEntryGroup entryGroup = inter.getData("entry-random");
for (String line : entryGroup.spawnInfo())
list.add(colorRandom + line);
}
static void addGems(List list, ItemObject inter) {
addGems(list, inter, true);
}
static void addGems(List list, ItemObject inter, boolean showLevel) {
//宝石孔数以及宝石
EquipGemInfo gemInfo = inter.getData("gem");
if (gemInfo.getHoles() > 0) {
//有孔才输出宝石
list.add("");
list.add("&f孔数: &6" + gemInfo.getGemAmount() + "/" + gemInfo.getHoles());
for (ItemObject gem : gemInfo.getGems())
addGem(list, gem, showLevel);
}
}
static void addGem(List list, ItemObject inter, boolean showLevel) {
String str = "&a镶嵌: ";
if (showLevel) str += inter.getData("level") + "级";
str += inter.getData("name");
list.add(str);
//基础词条
addBasicEntry(list, inter);
//随机词条
addRandomEntry(list, inter);
}
/**
* 词条属性生成
*
* @param data
* @return
*/
static String entryAtt(UMap data) {
AttributeEntry entry = data.get("entry");
Attribute attribute = entry.getAttribute();
return attribute.getName() + ": " + attribute.spawnString();
}
/**
* 宝石词条属性生成
*
* @param data
* @return
*/
static String gemEntryAtt(UMap data) {
AttributeEntry entry = data.get("entry");
Attribute attribute = entry.getAttribute();
if (attribute.isPercentage()) return entryAtt(data);
return attribute.spawnString() + " 点" + attribute.getName();
}
/**
* 宝石词条每级属性生成
*
* @param data
* @return
*/
static String gemEveroneEntryAtt(UMap data) {
AttributeEntry entry = data.get("entry");
Attribute attribute = entry.getAttribute();
if (attribute.isPercentage()) return entryAtt(data);
return attribute.getName() + "提升" + attribute.spawnString();
}
/**
* 宝石词条每级属性生成
*
* @param data
* @return
*/
static String gemPercentageEntryAtt(UMap data) {
AttributeEntry entry = data.get("entry");
Attribute attribute = entry.getAttribute();
return "提升" + attribute.spawnString() + attribute.getName();
}
static String join(Collection list) {
return join(list, ",");
}
static String join(Collection list, String separator) {
if (list == null) return "";
StringBuilder sb = new StringBuilder();
boolean first = true;
for (Object o : list) {
if (first) first = false;
else sb.append(separator);
if (o instanceof Occupation)
sb.append(((Occupation) o).getDisplay());
else sb.append(Objects.toString(o));
}
return sb.toString();
}
}
```
- 通用配置(使用px之前先看这里)
- 1分钟搭建数据库
- 1分钟搭建Redis环境教程
- 常见问题与报错
- [技能驱动]PxSkilldrive
- 介绍
- config配置
- 所有指令
- 单个技能完整配置
- MythisMobs技能配置
- 自带的技能系统[1.1.4+]
- 打开技能组
- PlaceHolderAPI变量
- 更新日志
- [商会]PxMerchant
- 介绍
- 配置文件
- 更新日志
- [帮派]PxGangs
- 介绍
- 用前必看
- 指令一览
- 职位/权限
- 帮派数据/建筑
- PlaceHolderAPI变量
- 兼容插件
- 更新日志
- [商店]PxShop
- 介绍
- 完整商店配置
- 货币/商品
- 更新日志
- [在线/成就奖励]PxLoginRewards
- 介绍
- 安装使用
- 完整配置
- 要求/奖励
- 更新日志
- [属性]PxRpg
- 介绍
- 安装使用
- 模块文件夹
- 指令
- 属性
- 属性是什么
- 如何创建属性
- 属性组
- 如何利用属性打出伤害(已过时)
- 词条
- 介绍
- 随机词条组列表[4.4.2+]
- 职业
- config[已过时]
- 创建一个职业[已过时]
- 职业[4.3.0+]
- config[4.3.0+]
- 怪物
- 天生属性[4.5.4+]
- 装备
- 装备配置文件
- 让装备获得属性
- 装备变量[已过时]
- 装备类型
- 手持武器[4.5.3+]
- 切换装备[4.5.3+]
- 物品显示模板(lore内容)
- 装备模板的使用
- 物品
- 普通物品
- 消耗品
- 回血道具[旧版]
- 代码回血/回蓝(4.3.0+)
- code代码执行(4.3.0+)
- 介绍
- 例子
- Buff相关
- 传送相关
- 执行3种指令
- 洗炼道具
- 强化类
- 强化道具
- 强化保护券
- 强化券
- 强化转移道具
- 解绑道具
- 宝石相关
- 打孔道具
- 摘除宝石
- 绑定系统
- 绑定类型
- 战斗系统
- 战斗公式变量(已弃用)
- 配置战斗公式[4.3.0+]
- 攻击类型列表
- 自定义伤害类型
- 伤害机制
- 伤害显示
- 掉落
- 掉落类型(已弃用)
- 配置怪物掉落包
- 掉落包[4.3.0+]
- Buff
- 介绍
- buff支持的词条
- 给予buff的方法
- 显示相关
- 萌芽显示
- 龙核相关
- 套装
- 介绍
- 技能[4.5.1+]
- 介绍
- 配置技能
- 技能词条介绍
- 钩子模块[4.5.1+]
- 介绍
- 监听器API
- [自身]Monitor.yml
- [装备容器]Equip Container.yml
- [鉴定]Appraisal.yml
- [绑定]Bind.yml
- [怪物]Mob.yml
- [Buff]Buff.yml
- [分解]Decompose.yml
- [战斗]Fight.yml
- [职业]Occupation.yml
- [玩家]Player Data.yml
- Mythicmobs
- 兼容mm技能(不推荐)
- 如何让MM打出伤害
- MM技能Buff(4.1.1新增)
- MM技能触发Pr伤害(4.2.1+)
- SkillAPI(4.3.0)
- 同步SkillAPI职业
- 战斗公式变量(已弃用)
- 个人变量(已弃用)
- 覆盖技能伤害
- Buff(4.1.1新增)
- 给Mob添加Buff(4.1.1新增)
- 治疗/回蓝组件(4.3.0+)
- PlaceholderAPI变量
- 统计(4.1.0更新)
- [附属]装备经验和升级
- 使用教程
- [附属]物品拓展功能
- 介绍
- [ExtendGui]窗口环境的所有方法
- [ExtendData]拓展数据所有方法
- 类方法
- [工具类]QuickTools
- [拓展数据]ExtendData
- [拓展属性]Attr
- [拓展技能]SkillLv
- 物品生成时添加
- 属性拓展
- 技能拓展[1.0.1+]
- 大量例子
- [福利]提交活动
- 作者发布
- 简单强化
- 界面锁定
- 延迟强化
- 菜单例子
- 吞噬物品永久保存
- 安笙
- 作者介绍
- 词条强化[暂无法使用 等待更新]
- 酒桶
- 作者介绍
- 更新日志
- [附属]萌芽装备容器
- 介绍
- 例子
- 常用工具类
- [数据容器]UMap
- [属性对象]Att
- [对象BUFF]BuffContainer
- [技能对象]USKill
- 接入PxRpg插件(开发者)
- 注册模块入口
- 接入属性
- 模块配置读取
- 接入物品
- 道具生成
- 道具数据获取
- 设置数据并渲染
- 自定义道具组件
- 具有生成参数的组件
- 集成模块介绍
- 更新日志
- 视频预览
- 4.3.0+新版公式教程
- 简介(内含旧版公式转换器)
- 教程(战斗公式篇)(必先学)
- 传递参数和类型的常用方法(重要)
- 单例属性教程(含战斗力变量教程)
- 道具消耗品(含属性加成)
- 装备/宝石/怪物的属性词条
- Buff新版词条(内含属性加成)
- Drop掉落物配置(内含属性掉落加成)
- [副本]PxInstance-Pro
- 介绍
- 世界规则
- 指令详解
- 副本规则(rule)
- 触发器(trigger)
- 触发器参数详解
- 条件(condition)
- 事件(event)
- 副本流程详解
- 根据难度初始化怪物
- 判定通关条件,发放通关奖励
- 副本倒计时/超时处理
- 动态创建倒计时
- 结算奖励
- 副本自带变量
- PlaceholderAPI变量
- 更新日志
- [副本]PxInstace(不再更新)
- 介绍
- 安装使用
- 配置教程
- PlaceholderAPI变量
- 流程配置
- [队伍]PxTeam-Pro
- 介绍
- HUD设置教程
- 变量大全
- 配置文件
- config.yml
- 开发者
- 调用API
- 更新日志
- [任务]BookQuest
- 介绍
- 完整任务配置
- 4种状态显示[4.2.1+]
- 要求/奖励
- 更新日志
- [对话]PxDialogue
- 介绍
- 完整的对话配置
- 一个住酒店的例子
- 更新日志
- [采集]PxCollect
- 介绍
- 作物配置
- 区域生成
- 种植配置
- 条件/事件
- 更新日志
- [技能快捷键]PxQuickSkill
- 介绍
- [仓库]PxWarehouse
- 介绍
- 更新日志
- [拍卖行]PxAuction
- 介绍
- [队伍]PxTeam(不再更新)
- 介绍
- [锻造]PxForging
- 介绍
- 材料/产物
- 完整的锻造配置
- 更新日志
- [邮箱]PxEmail
- 介绍
- PlaceHolderAPI变量
- 编辑邮件模板
- 编辑玩家群
- 编辑系统类型
- 编辑定时邮件
- 权限
- 更新日志
- [MM管理]PxMMSpawner
- 介绍
- 更新日志
- [前置]PxTools(通用部分)
- 介绍
- 掉落物显示[1.12.2+]
- 函数[弃用]
- abs
- ceil
- decimals
- floor
- format
- gradual
- if
- max
- min
- pow
- prd
- random
- randomint
- randomweight
- repeat
- round
- sum
- time
- 要求/奖励(1.9.0+)
- 时间要求(1.9.1+)
- 条件/事件
- 指令
- 事件组
- PlaceholderAPI变量
- 更新日志
- 一些通用的工具类
- 介绍[必看]
- [经济]Vault
- [点券]PlayerPoints
- PxTools相关
- [玩家变量]VarAPI
- [玩家标签]TagAPI
- [玩家计数器]CountAPI
- [时间相关]Date
- [数学函数]Math
- [变量API]PlaceholderAPI
- [自定义冷却]CooldownUtil
- [数字千分化]NumFormat
- [萌芽API]GermAPI
- 消息转发[1.12.3+]