- ◆ 游戏版本
- 1.12.2
- ◆ 前置/依赖
- Pixelmon mod
- ◆ 模组加载器
- Forge
GlobalMarket · 全球市场
**交易市场:图形化界面、宝可梦原样托管与返还、并发防超卖。
环境要求
| 项目 | 版本 |
|---|---|
| Minecraft | 1.12.2 |
| Forge | 14.23.5.2860(1.12.2 的较新版本均可) |
| Pixelmon Reforged | 8.4.3(必需,本模组就是按这个版本开发的) |
| Java | 8 |
安装
- 把
GlobalMarket-1.0.0.jar放进服务端和客户端的mods/目录; - 确认
mods/里已经有 Pixelmon Reforged 1.12.2-8.4.3(本模组依赖它); - 启动一次服务器,会自动生成:
- 配置:
config/GlobalMarket.cfg - 数据库:
config/market.db(SQLite,建表与升级全自动)
- 配置:
- 进游戏按 J 打开市场(按键可在"控制"里改,分类:游戏),或输入
/globalmarket open。
玩家怎么用
市场界面(按 J,或输入 /globalmarket open)
- 6 × 5 = 30 个商品格子,卡片上只有"图标 + 价格"(大额价格写成
15M、1.2k,完整金额在悬浮描述里); - 搜索:输入关键词,回车立即搜,停笔也会自动搜;
- 分类:全部 / 物品 / 宝可梦 / 我的在售;排序:最新、价格升降、等级升降;
- 筛选:闪光、等级区间、价格区间、个体区间、特性、性格、性别、体型(全部由服务端过滤);
- 右侧查看器:选中宝可梦后显示它的照片、等级/性格/特性/性别/个体/生命/携带和六边形雷达图;
- 悬浮描述:鼠标指到货物上显示名字、价格、数量、卖家、上架时间、过期时间等(内容可在配置里自定义);
- 操作:左键选中,右键快速买 1 个(自己的挂单一律是"下架",不能买自己的货);
- 底部导航:浏览 / 我的在售 / 上架 / 历史 / 邮箱。
上架
- 物品:从背包 9×4 格子里选一格 → 填单价和数量 → 确认;
- 宝可梦:图形化列表(队伍优先,其次 PC),选中后填单价。 已经在市场上的宝可梦不会再出现在列表里,队伍里的最后一只不能上架;
- 上架后货品由市场托管(从背包/PC 取走并原样保存),下架或过期会原样退回。
邮箱与历史
- 市场邮箱:买家背包满、卖家离线、下架返还、回滚补偿、挂单过期都会进这里。 退回的物品/宝可梦按图标格子展示(6×4 一页):物品带数量角标、宝可梦显示官方照片、钱显示金色金额; 鼠标悬停看完整信息,左键领取这一封,底部按钮一键全部领取;
- 交易历史:我的购买 / 我的出售,含数量、单价、实付、税金与时间。
命令
| 命令 | 说明 |
|---|---|
/globalmarket open [玩家] |
打开市场界面(和快捷键 J 一样;给别的玩家打开需要 OP) |
/globalmarket 或 /globalmarket listings |
在聊天框里列出市场(不开界面) |
/globalmarket items / pokemon |
只看物品 / 宝可梦 |
/globalmarket search <关键词> |
搜索 |
/globalmarket selling |
我的在售 |
/globalmarket sell <槽位0-35> <单价> [数量] |
上架背包物品 |
/globalmarket sellpokemon party <0-5> <价格> |
上架队伍宝可梦 |
/globalmarket sellpokemon pc <箱子> <格子> <价格> |
上架 PC 宝可梦 |
/globalmarket buy <编号> [数量] |
购买 |
/globalmarket cancel <编号> |
下架自己的挂单 |
/globalmarket history <bought|sold> [页码] |
交易历史 |
/globalmarket mail |
查看/领取邮箱 |
/globalmarket info <编号> |
查看某条挂单详情 |
/globalmarket version |
查看版本、协议、经济与数据库状态(排错第一步) |
/globalmarket reload |
重载配置(需要权限) |
/globalmarket admin ... |
remove / release / inspect / recover / audit(需要管理员权限) |
权限节点
| 权限 | 作用 |
|---|---|
globalmarket.admin |
管理员子命令(/globalmarket admin ...) |
globalmarket.reload |
重载配置 |
globalmarket.bypass.blacklist |
不受物品/宝可梦黑名单限制 |
globalmarket.bypass.limit |
完全不受上架数量限制 |
| 自定义(见下) | 按权限分配不同的上架上限 |
权限来源:混合端(CatServer 等)读 Bukkit 权限(LuckPerms、PermissionsEx 等都生效), 纯 Forge 端读 Forge 权限(默认按 OP 等级,装了权限模组则由它接管)。
按权限分配上架上限(limits.permission-tiers)
默认所有玩家用同一套上限(limits.daily-listing-limit 每日上架次数、
limits.max-active-listings 最大在售数)。想让不同权限的玩家有不同额度,就在配置里加档位:
limits {
I:daily-listing-limit=20
I:max-active-listings=100
# 每行一条:<权限节点>=<每日上架次数>,<最大在售数>
# 两个数字都可以写 0 = 不限制
S:permission-tiers <
globalmarket.limit.vip=50,100
globalmarket.limit.mvp=150,300
globalmarket.limit.staff=0,0
>
}
- 上例含义:有
globalmarket.limit.vip的玩家每天最多上架 50 次、最多在售 100 件;MVP 更高; 有globalmarket.limit.staff的玩家完全不限; - 同时拥有多个档位时取最宽松的一档(两个数字各自取最大;写 0 的那个维度直接变成不限制), 所以档位只会放宽、不会低于上面那两项基准值;
- 档位是权限节点,玩家加权限即可生效、不需要改配置也不需要用命令(LuckPerms:
/lp user <玩家> permission set globalmarket.limit.vip true); - 想改权限节点的名字就改这一行,改完
/globalmarket reload生效;玩家重进或等下一次打开市场界面后,界面上的"今日剩余上架次数"也会跟着变。
配置一览(config/GlobalMarket.cfg)
| 分类 | 键 | 默认 | 说明 |
|---|---|---|---|
| market | enabled |
true | 是否启用市场 |
| economy | provider |
auto | 经济来源:auto(有 Vault 经济就用 Vault,否则用 PokéDollars)/ vault / pixelmon |
| tax | enabled / rate |
true / 5.0 | 是否收交易税 / 税率(%) |
| limits | daily-listing-limit |
20 | 每人每日上架次数(0 = 不限制) |
| limits | max-active-listings |
100 | 每人最大在售数(0 = 不限制) |
| limits | permission-tiers |
空 | 按权限分配上架上限(格式见上一节) |
| price | minimum / maximum |
1 / 999999999999 | 允许的单价区间 |
| listing | allow-item / allow-pokemon |
true / true | 是否允许上架物品 / 宝可梦 |
| listing | expire-hours |
0 | 挂单过期小时数,0 = 永不过期;>0 时过期自动下架并进邮箱 |
| listing | expire-check-seconds |
60 | 过期扫描间隔(秒,最小 10) |
| delivery | enabled |
true | 是否启用邮箱 |
| general | timezone |
Asia/Shanghai | 用于"每日次数"和时间的时区 |
| database | type |
sqlite | 数据库类型:sqlite(本地文件 config/market.db)/ mysql |
| database | mysql-host / mysql-port |
127.0.0.1 / 3306 | MySQL 地址与端口 |
| database | mysql-database |
globalmarket | 库名(不存在会自动创建) |
| database | mysql-username / mysql-password |
root / 123456 | MySQL 账号 |
| database | mysql-create-database |
true | 库不存在时自动建库(utf8mb4) |
| database | driver |
server | 仅 SQLite 用:server(用服务端自带驱动)/ embedded(用随身驱动) |
| compat | require-supported-pixelmon-version |
true | Pixelmon 版本不匹配时是否停用市场 |
| blacklist | items / pokemon |
空 | 上架黑名单(物品 modid:name;宝可梦 Species 或 Species:Form) |
| tooltip | show-icon-info |
true | 悬浮描述里是否保留图标自带信息 |
| tooltip | item-lines / pokemon-lines |
空 | 悬浮描述模板,每行一条;留空 = 内置默认 |
经济:Vault 还是 PokéDollars
默认 economy.provider=auto:
- 混合服务端(CatServer / Mohist 等)装了 Vault + 经济插件(EssentialsX、CMI 等)→ 自动使用 Vault,
玩家余额、扣款、收款全部走该插件,货币名也用它(例如
Coins); - 纯 Forge 服务端(没有 Bukkit/Vault)→ 自动使用 Pixelmon PokéDollars,不需要任何配置;
- 想强制某一种就把
provider写成vault或pixelmon。强制vault但没挂上时会退回 PokéDollars 并打警告, 服务器不会因此起不来; - 混合端的插件比 Forge 的模组加载得晚,所以市场会在服务端完全启动后、以及每次用钱之前自动重试挂钩—— 启动日志里那几行 "Vault is installed but ..." 属于正常现象,插件加载完就会自动用上;
/globalmarket version的economy:一行会显示当前实际用的是哪种经济,排查时先看它。
数据库:SQLite(默认)/ MySQL
默认是 SQLite 单文件(config/market.db),零配置。多台服务器想共用一个市场、或者想集中备份时,
把 database.type 改成 mysql(同段的 mysql-* 就是连接参数,默认 127.0.0.1:3306 / root / 123456 / 库名 globalmarket):
- 库不存在会先自动建库(utf8mb4);已经存在的库会直接复用;
- 需要 MySQL 5.7.6+ / MariaDB 10.2+;
- 需要服务端有 MySQL 驱动:混合端(CatServer/Spigot)的
libraries/里通常自带, 纯 Forge 端把mysql-connector-java-x.y.z.jar放进config/globalmarket/jdbc/即可;两处都没有时启动日志会直接说明; - 改完
type需要重启服务端;/globalmarket version会显示当前用的数据库与位置; - 切换数据库不会自动搬数据,但两边表结构一致,用任何 SQL 工具都能直接导出导入。
货物悬浮描述自定义
市场里鼠标指到货物上显示的那段文字,服务端改一次对所有玩家生效:
tooltip {
B:show-icon-info=true
S:item-lines <
&f{name}
&a{lang:globalmarket.gui.row.price} {currency}{price}
&7{lang:globalmarket.gui.row.seller} {seller}
&8{left_line}
-
&8{lang:globalmarket.gui.hint.buyFast}
>
S:pokemon-lines <
&f{name}
&7{lang:globalmarket.gui.row.level} {level} &7{lang:globalmarket.gui.row.nature} {nature}
&8{lang:globalmarket.gui.row.iv} {iv_total} &8{lang:globalmarket.gui.row.held} {held}
&a{lang:globalmarket.gui.row.price} {currency}{price}
&8{left_line}
>
}
- 每行一条;写一行
-(减号)就是一条分隔线;留空则用模组内置的默认描述; - 颜色代码:
&7灰、&a绿、&c红、&l加粗(也可以直接写§); - 常用占位符:
{name}名称、{price}单价、{price_compact}单价(1.2k 写法)、{currency}货币符号、{total}总价、{remaining}剩余、{quantity}总量、{seller}卖家、{listed}上架时间、{expires}过期时间、{left}剩余时间、{left_line}整行"剩余 xx"(永不过期时整行消失); - 宝可梦专用:
{species}{dex}{form}{form_name}{nickname}{level}{nature}{ability}{gender}{shiny}{held}{ball}{ot}{iv_total}{hp}{max_hp}{moves}{growth}; {lang:词条键}会取玩家客户端语言的文本,例如{lang:globalmarket.gui.row.price}中文显示"价格"、英文显示"Price";- 渲染后没有任何可见文字的行会自动省略;写错的占位符会原样显示,方便你排错。
常见问题
客户端提示"GlobalMarket 客户端版本不兼容,请更新模组"?
客户端与服务端的 jar 版本不一致,两边换成同一个 jar;用 /globalmarket version 看双方版本。
界面文字显示成原始 key(例如 globalmarket.gui.title)?
确认客户端是中文语言;必要时按 F3+T 重载资源。
挂单过期了,但邮箱里没有?
先看 listing.expire-hours 是不是 0(0 = 永不过期)。过期一律进邮箱,卖家在线时还会收到一句聊天提示;
过期扫描每轮最多处理 5 条,量大时分会几轮清完。
为什么买不了自己的挂单? 有意限制。自己的挂单请用"下架"。
宝可梦上架失败?
常见原因:这只宝可梦已经在市场上、是队伍里的最后一只、在上架黑名单里、正在战斗、
价格超出 price 区间、达到每日或最大在售上限。
权限给了但上限没变?
混合端读的是 Bukkit 权限(LuckPerms 等),纯 Forge 端读 Forge 权限;
确认玩家确实在线、权限节点和配置里写的一字不差,然后 /globalmarket reload,再让玩家重进或用 /globalmarket version 确认。
数据与备份
- 默认全部数据在
config/market.db(SQLite 单文件),备份它就等于备份市场; 用 MySQL 时数据在对应的库里,按平时的数据库备份流程做即可; - 结构升级由模组自动完成,升级不会丢数据;
- 管理员可用
/globalmarket admin audit/recover处理异常挂单与遗留交易。
许可与致谢
- 不含任何 Pixelmon 的资源或代码,运行需要玩家自行安装 Pixelmon Reforged; 请遵守 Pixelmon 的授权条款,不要随包分发 Pixelmon。