说明
此 wiki 内所使用的文件名及目录名均为默认的,自行替换成你自己的目录及文件名即可。
插件激活
将插件放入 plugins
加载一遍生成配置文件,打开 ./plugins/AyTrade/config.yml
结构说明
在目录 ./plugins/AyTrade/
中,有多个文件和目录,下方是它们的作用说明。
| 文件名 | 文件说明 |
|:----|:----|
|config.yml|主配置文件,主功能设置的地方,例:数据存储方式、语言类型、授权码设定|
|tradeItems.yml|所有兑换物品设定的地方|
<br />
| 目录名 | 目录说明 |
|:----|:----|
|customTrade|存放所有兑换界面, 一个文件代表一个界面|
|lang|语言文件存放的地方, 一个文件代表一个语言配置|
|storage|存储兑换物品数据的地方, 请不要修改这个目录里的文件|
增加一个兑换物
# 例子物品
example:
# 可视类型: DEFAULT, PANEL
viewType: DEFAULT
# 物品昵称
customName: "&3测试兑换"
# 展示物品
displayItem: "result"
# 购买条件, 详细的请看 wiki: https://wiki.mc9y.com/zh/aytrade
conditions:
- "item,example,1"
- "vault,1000"
# 限时器, 格式例子: 2022/09/10 00:00-2022/09/11 00:00, 不限购填写 none
date: "2022/09/10 00:00-2022/09/11 00:00"
# 玩家每日限购, 不限购写 -1
dayLimit: -1
# 玩家总限购, 不限购写 -1
playerLimit: -1
# 全服限购, 不限购写 -1
serverLimit: -1
# 合成后给予的物品编号(/ayt recipe 添加的编号), 不给予则写 none
result: "result"
# 结尾拼接描述
appendLores:
- "&7-----------------"
- "&f * &a个人限购: &7%playerLimit%"
- "&f * &a每日限购: &7%dayLimit%"
- "&f * 全服限购: &7%serverLimit%"
- "&7-----------------"
- "&f * &e测试物品一 &fx1 &f{1}"
- "&f * &e金币 &fx1000 &f{2}"
- ""
- "&d➜ &6点击兑换物品"
commands:
- "say %player% 23333333333"
# 购买所需权限, 无需权限则写 none 或删除此行
permission: "aytrade.action.example"
viewType(可视面板): DEFAULT 为点击后直接触发条件逻辑, PANEL 为点击后打开详细界面, 如下图

条件类型
|条件名|条件说明|条件格式|
|:----|:----|:----|
|vault|使用 Vault 经济桥|vault,需求数量|
|nyeconomy|使用 NyEconomy 货币插件|nyeconomy,货币名,需求数量|
|playerpoints|使用 PlayerPoints 货币插件|playerpoints,需求数量|
|item|扣除玩家物品|item,物品编号(通过命令 /ayt displayitem 增加的物品编号),需求数量|
|item|扣除玩家物品(判定物品名)|item,name:物品名,需求数量|
|level|扣除玩家游戏等级|level,需求数量|
|papi|条件判断(变量返回必须是数字), 后方格式 < 为可选, 加上则代表小于|papi,变量名,(<)需求数量|
不止于兑换
制作一个收购商品
# 收购例子物品
example:
# 可视类型: DEFAULT, PANEL
viewType: DEFAULT
# 物品昵称
customName: "&3钻石收购"
# 展示物品
displayItem: "result"
# 购买条件, 详细的请看 wiki: https://wiki.mc9y.com/zh/aytrade
conditions:
- "item,example,1"
# 限时器, 格式例子: 2022/09/10 00:00-2022/09/11 00:00, 不限购填写 none
date: "2022/09/10 00:00-2022/09/11 00:00"
# 玩家每日限购, 不限购写 -1
dayLimit: -1
# 玩家总限购, 不限购写 -1
playerLimit: -1
# 全服限购, 不限购写 -1
serverLimit: -1
# 合成后给予的物品编号(/ayt recipe 添加的编号), 不给予则写 none
result: "none"
# 结尾拼接描述
appendLores:
- "&7-----------------"
- "&f * &a个人收购限量: &7%playerLimit%"
- "&f * &a每日收购限量: &7%dayLimit%"
- "&f * 全服收购限量: &7%serverLimit%"
- "&7-----------------"
- "&f * &e钻石物品 &fx1 &f{1}"
- ""
- "&d➜ &6点击出售物品"
commands:
- "cmi money give %player% 100"
# 购买所需权限, 无需权限则写 none 或删除此行
permission: "aytrade.action.example"
自定义兑换界面物品
# 界面显示的交易物品, 格式:物品编号,显示槽位
tradeItems:
- "example,4"
# 界面大小
size: 9
# 界面标题
title: "&8自定义标题"
# 打开界面所需权限, 无需权限则写 none 或删除此行
permission: "aytrade.open.example"
# 自定义物品
items:
pane:
type: STAINED_GLASS_PANE
data: 5
amount: 1
name: "&f"
lore: [ ]
slot: 0,1,2,3,5,6,7,8
开发接口
注册条件
public class ExampleConditionImpl implements ICondition {
@Override
public boolean isCompliant(Player player, TradeItem tradeItem, String... params) {
return false;
}
@Override
public boolean run(Player player, TradeItem tradeItem, String... params) {
return false;
}
}
在自己的条件类实现 ICondition
接口, 方法 isCompliant()
为条件预判断时执行, 方法 run()
为条件通过后执行扣除操作,例如下方扣除经验的条件类。
public class LevelConditionImpl implements ICondition {
@Override
public boolean isCompliant(Player player, TradeItem tradeItem, String... params) {
try {
return player.getLevel() >= Integer.parseInt(params[1]);
} catch (Exception ignored) {
}
return false;
}
@Override
public boolean run(Player player, TradeItem tradeItem, String... params) {
try {
if (player.getLevel() >= Integer.parseInt(params[1])) {
player.setLevel(player.getLevel() - Integer.parseInt(params[1]));
}
} catch (Exception ignored) {
}
return false;
}
}
修改数据存储器
如果你想自己实现数据存储器, 需实现 IDataStorage
接口, 然后通过 DataManager.setDataStorage(IDataStorage 实例)
来设置数据存储器。