[TOC]
#### :-: **功能截图**
:-: ![](https://img.kancloud.cn/7d/b2/7db2d46f733ec6898a46ac9618de4b93_300x334.png)
![](https://img.kancloud.cn/71/64/71643b317ac9b088ceea6d83d1030dc5_263x359.png)
*****
</br>
#### :-: **功能简介**
```
简单强化,只是一个示例文件,含有大部分实现方法
强化+3 +6 +9时,会创建一个额外的属性添加到装备内
里面没有进行强化道具的判定,只要是个item的物品就行
没有实现提升概率物品的代码,只是作为一个示范告诉大家可以这么用
```
*****
</br>
>[danger] 一般拓展需要配合模板的java解译器模式使用
> 具体如何使用,可以参考[装备模板的使用](../../../%E7%89%A9%E5%93%81%E6%98%BE%E7%A4%BA%E6%A8%A1%E6%9D%BF/%E8%A3%85%E5%A4%87%E6%A8%A1%E6%9D%BF%E7%9A%84%E4%BD%BF%E7%94%A8.md)
#### :-: **模板显示生成方法**
> 直接在[装备模板工具](../../../%E7%89%A9%E5%93%81%E6%98%BE%E7%A4%BA%E6%A8%A1%E6%9D%BF/%E8%A3%85%E5%A4%87%E6%A8%A1%E6%9D%BF%E7%9A%84%E4%BD%BF%E7%94%A8.md)里面随便找个地方复制进去
```
static void 添加强化随机排版(List list, ItemObject inter) {
ExtendData extendData = inter.getData("extend");
//没有这个内容将直接退出不处理
if(!extendData.has("强化随机")) return;
Map map = extendData.get("强化随机");
for (int i = 3; i <= 9; i+=3) {
if(!map.containsKey(""+i)) continue;
Attr attr = map.get(""+i);
list.add("&7强化奖励&6[&b"+i+"&6] &c" + attr.getId() + ": " + (int)attr.getMin() + (attr.getMin() == attr.getMax() ? "" : "-" + (int)attr.getMax()));
}
}
```
*****
</br>
#### :-: **在装备模板生成lore的代码里面添加上**
```
//基础词条
addBasicEntry(list, inter);
//随机词条
addRandomEntry(list, inter);
//================
添加强化随机排版(list, inter); //<=============放在这里将生成在随机词条后面
//================
//宝石孔数以及宝石
addGems(list, inter);
//装备描述
addIntroduce(list, inter);
```
*****
</br>
#### :-: **完整配置**
文件名: `强化.yml`
打开指令: `pr ei o 玩家 强化`
```
#每个文件都是一个自定义窗口
#可以在里面配置对应的修正功能
#例如,强化,洗炼等
#自定义标题
#所有方法均为同步方法
#窗口标题
title: "装备强化"
#9的倍数 只能是: 9,18,27,36,45,54
size: 9
#窗口相关的操作
action:
#此方法在创建窗口之前,没有当前环境
#返回false不能打开,做鉴权,比如某个世界不能打开等
#默认true
#boolean reallyOpen(AdapterPlayer player)
really_open: return true;
#创建窗口后打开时触发,有当前环境
#void open(AdapterPlayer player)
open: return;
#创建窗口后,关闭时触发,有当前环境
#无需在里面返还物品,系统自处理
#void close(AdapterPlayer player)
close: return;
#窗口内每个位置对应设置
slots:
'0':
#空位模式,可以让玩家将物品放入到里面
type: empty
#支持的操作
#before 交换/改动之前,用于鉴权
#after 交换/改动之后,用于更新
action:
#交换物品时触发(没有该代码时不限制放入)
#可用于包含但不限于检查物品是否可以放入这个位置中
#player = 操作的玩家
#item = 原本在这个位置上的物品(可能为空气,可用 item.isAir() 判断是不是空气)
#cursor = 当前鼠标上的物品(可能为空气,可用 cursor.isAir() 判断是不是空气)
#返回 false 将取消事件
#boolean before(AdapterPlayer player,AdapterItemStack item,AdapterItemStack cursor)
before: |-
//如果指针物品是空气,说明是拿走原本的物品,返回true不取消事件
if(cursor.isAir()) return true;
//QuickTools是一个快捷工具类,由原生java编写,默认导入(无需手动导入),方法都是静态方法, 可直接类名.方法名调用
//要获取原版ItemStack可使用 ItemStack itemStack = cursor.getObject();
//这里判断是不是一个装备,是装备可以进行交换
if(QuickTools.isEquip(cursor)) return true;
player.sendOldMessage("这里只能放装备"); //不是装备提醒玩家
//this.getPlayer().sendOldMessage("这里只能放装备"); //或者这样也一样
return false;
#当这个格子的物品被更改时触发
#可更改界面内的其他slot位置的物品内容等
#item = 这个位置的物品
#
#void after(AdapterPlayer player,AdapterItemStack item)
after: |-
//为空气表示拿走了物品
if(item.isAir()){
AdapterItemStack 开始按钮 = this.getButton(3); //这里具有ExtendGui(当前窗口)环境,可以调用ExtendGui类的方法
开始按钮.setDisplayName("&7开始");
}else{
//不是空气表示放入新的物品
AdapterItemStack 开始按钮 = this.getButton(3); //这里具有ExtendGui环境,可以调用ExtendGui类的方法
开始按钮.setDisplayName("&6已经放入了装备");
//this.setButton(3,开始按钮); //有些操作不生效时,可以利用这个方法再重新设置一下,如操作了NBT等
}
'1':
type: empty
action:
before: |-
//指针物品为空气或者是一个pr道具则允许操作
if(cursor.isAir() || QuickTools.isItem(cursor)) return true;
player.sendOldMessage("这里只能放强化道具");
return false;
'2':
type: empty
action:
before: |-
if(cursor.isAir() || QuickTools.isItem(cursor)) return true;
player.sendOldMessage("这里只能放保护券或提升概率道具");
return false;
'3':
#button按钮模式
type: button
#按钮的默认物品
def:
type: stone
name: "&7开始"
lore:
- '&7左键点击开始强化'
#不可破坏,默认true
unbreakable: true
#隐藏原版内容,默认63
hide: 63
action:
#按钮支持:
#left 左键点击
#right 右键点击
#shift_left shift+左键点击
#shift_right shift+右键点击
#double_click 双击
#或者自定义的由其他地方调用
#按钮被点击时触发
#cursor = 当前鼠标上的物品
#void left(AdapterPlayer player,AdapterItemStack item)
left: |-
//这里具有this环境,可以调用ExtendGui.get(int)类的方法拿到空位的物品
//但需要注意的是, get方法拿到的是物品的副本,并不是实际上格子内的
AdapterItemStack 装备物品 = this.get(0);
AdapterItemStack 强化物品 = get(1); //省略this也可以
AdapterItemStack 保护券或增加概率券 = get(2);
//可以利用this环境直接调用ExtendGui.getPlayerUMap()方法拿到玩家的UMap
//getPlayerUMap() 等价于 this.getPlayerUMap() this可以省略,如果有冲突可以加上this
UMap data = getPlayerUMap();
//查看UMap里面有什么,正式环境可以删除
Set set = data.keys();
for(String key : set){
System.out.println(key + " 的内容类型为: " + data.get(key).getClass());
}
/*
一般窗口操作有3步常规流程
1.先判定物品是否正确
2.进行相关的逻辑流程判定及物品的移除
3.根据逻辑判断流程给予相应的奖励并更新
*/
//1.先判定物品是否正确
if(装备物品.isAir()){
player.sendOldMessage("你还未放入要强化装备呢");
return;
}
if(强化物品.isAir()){
player.sendOldMessage("你还未放入强化道具呢");
return;
}
EquipInter 装备物品对象 = QuickTools.toEquip(装备物品);
ItemInter 强化物品对象 = QuickTools.toItem(强化物品);
int 当前强化等级 = 装备物品对象.getData("streng");
player.sendOldMessage("当前装备强化等级为: " + 当前强化等级); //正式环境可以删除
//2.进行相关的逻辑流程判定及物品的移除
强化物品.setAmount(强化物品.getAmount()-1);
this.set(1,强化物品);
int 下级强化等级 = 当前强化等级+1;
player.sendOldMessage("准备强化下一级等级: " + 下级强化等级); //正式环境可以删除
double 成功概率 = (1-下级强化等级*0.05);//计算好成功概率,也可以利用玩家属性去修正
//3.根据逻辑判断流程给予相应的奖励并更新
if(Math.random() < 成功概率){
装备物品对象.setData("streng",下级强化等级); //设置强化为 当前+1
player.sendOldMessage("恭喜,强化成功为 " + 下级强化等级);
if(下级强化等级 == 3){
//这里省略了随机的过程,就直接添加一个攻击进去
Attr 随机属性 = QuickTools.createAttr("攻击",100.0,150.0);
//拿到装备的扩展数据, 宝石 装备 道具 都有的(宝石和装备添加对人物属性getAttr的兼容,道具可以存储,在窗口内拿到给装备或者宝石,例如: 附魔等)
ExtendData 装备扩展数据 = 装备物品对象.getData("extend");
//第一个参数一般用于大类型,这个大参数里面只有你知道有什么
//大类型相同,小类型相同 的内容会被覆盖,所以每次强化到+3的时候都会生成一次属性(下面同理)
//Attr 由java原生代码编写,在插件内兼容的属性获取的方法,这里添加进ExtendData并穿戴上就可以获得对应属性
装备扩展数据.set("强化随机","3",随机属性);//扩展内容可以添加 Attr 类型的数据
player.sendOldMessage("由于强化+3 额外添加了一条强化属性: " + 随机属性.getId()+ ": " + 随机属性.getMin() + "-"+随机属性.getMax());
}else if(下级强化等级 == 6){
Attr 随机属性 = QuickTools.createAttr("攻击",150.0,250.0);
ExtendData 装备扩展数据 = 装备物品对象.getData("extend");
装备扩展数据.set("强化随机","6",随机属性);
player.sendOldMessage("由于强化+6 额外添加了一条强化属性: " + 随机属性.getId()+ ": " + 随机属性.getMin() + "-"+随机属性.getMax());
}else if(下级强化等级 == 9){
Attr 随机属性 = QuickTools.createAttr("攻击",300.0,500.0);
ExtendData 装备扩展数据 = 装备物品对象.getData("extend");
装备扩展数据.set("强化随机","9",随机属性);
player.sendOldMessage("由于强化+9 额外添加了一条强化属性: " + 随机属性.getId()+ ": " + 随机属性.getMin() + "-"+随机属性.getMax());
}
装备物品对象.render();//重新渲染一下
this.set(0,装备物品对象.getItemStack()); //设置到窗口内
}else{
//强化失败
player.sendOldMessage("很抱歉,强化失败了");
//强化失败不需要返回,因为失败也是逻辑成功的一种,我们在上面减少了强化道具的数量,所以让他走到下面去提交一下即可
}
//在调用了this.set(int,item) 方法时,会将设置的物品保存至缓存,不会直接设置在窗口上(可以防止在运行过程中出现异常而导致物品已经更改)
//这个方法就相当于你填好了表格(设置了物品)准备提交上去,但是途中出现了不是你填的数据,或者被告知有地方填错了(出现异常)
//就被判定需要你重新拿个表格填(告知玩家重新试试)
this.execute(true); //清空缓存物品,并将缓存物品设置到窗口内(只要set了物品在结束时都需要提交一下才会更新物品)
//this.execute(false); //清空缓存物品,之前的物品原封不动
#为4到8位置的按钮同时设置填充物
'4-8':
type: button
def:
type: paper
name: "&7填充物"
lore: [ ]
unbreakable: true
hide: 63
```
- 通用配置(使用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+]