- 版权类型
- 原创
- 插件中文名称
- 高级村庄
- 插件英文名称
- VillagerPro
- 支持的核心(服务端)
- Spigot
- Paper
- Purpur
- PufferFish
- Leaves
- 语言支持
- 中文(简体)
- 适配版本(Java)
- 最新版本
- 26.x
- 1.21
- 1.20
- 1.19
[MD]
# VillagerPro 2.1.0
VillagerPro 是面向 Spigot/Paper 1.19.4 的村庄经营插件。玩家创建村庄、招募并培养职业村民;村民按周期生产物品,产物进入村庄仓库,村庄等级、职业技能、装饰和访客共同构成成长循环。
##购买
- 在右上角链接下单后,可以等待发货或加入lattice交流群:734527894 并@群主要求发货
## 运行要求
- Java 17
- Spigot/Paper 1.19.4
- Vault 及一个 Vault 经济插件(必需)
- PlayerPoints(可选;默认配置中的部分高等级升级需要它)
- ItemsAdder(可选;仅用于配置成 ItemsAdder 类型的成本或访客商品)
未安装可选依赖时,对应类型的成本不会被免费跳过,而是明确判定为无法支付。
组合成本会先统一校验再逐项扣除。Vault、PlayerPoints、ItemsAdder 或背包操作在中途失败或抛出异常时,系统会按相反顺序尽可能退回已经扣除的其他成本;某个提供方退款失败不会阻止后续项目继续退款,玩家会收到“未完整退款”的明确提示,服务端同时写入严重日志,不能把失败误报为已退还。
## 数据库
插件默认使用 SQLite,首次运行会自动创建 `plugins/VillagerPro/database.db`,无需额外配置。也支持 MySQL 8.0+;请先创建数据库并向账号授予该数据库的建表、索引和读写权限,然后修改 `config.yml`:
```yaml
database:
type: mysql
mysql:
host: localhost
port: 3306
database: villagerpro
username: villagerpro
password: "请替换为实际密码"
use_ssl: false
server_timezone: "Asia/Shanghai"
pool:
maximum_size: 10
minimum_idle: 2
connection_timeout_ms: 30000
```
重启服务器后配置才会生效。仅手动修改 `database.type` 不会迁移已有数据;需要保留数据时请使用下面的内置迁移命令。连接失败时插件会停止启用,日志会显示目标地址和错误原因,但不会输出密码。
也可以由拥有 `villagerpro.database.migrate` 权限的管理员或控制台执行内置迁移:
```text
/village database migrate mysql
/village database migrate sqlite
/village database migrate sqlite confirm
```
普通命令会创建目标表并复制全部插件数据,但只接受没有任何 VillagerPro 数据的目标库,不会覆盖或合并旧数据。需要转换回之前保留的旧数据库时,在末尾添加 `confirm`,命令会在同一事务内用当前数据替换目标库中的全部 VillagerPro 数据;该操作不可用于合并两边的数据。成功后会保留源数据库、自动修改 `database.type` 并停用插件;重启服务器后才会连接目标数据库。迁移期间命令会同步执行,数据量较大时可能造成短暂停顿。
## 核心流程
1. 使用 `/village create <名称>` 在当前位置创建村庄。
2. 靠近一个未绑定的原版村民,通过 `/villager recruit` 选择职业并支付招募成本。
3. 在村民详情中为其绑定对应职业的实体工作站;村民需要处于工作站有效范围内。
4. 村庄主人在线、与村民同世界且在工作范围内时,村民按职业周期工作。
5. 成功产出的物品自动进入村庄仓库;仓库已满时只存入剩余容量,完全存不下时不会获得工作经验。
6. 使用 `/village orders` 把仓库产物提交给每日订单,获得金币和繁荣度。
7. 通过生产统计定位停工原因,再用仓库规则、生活需求和职业专精调整经营策略。
招募确认时会重新校验玩家仍拥有该村庄、目标实体仍有效且尚未绑定。实际写入会锁定村庄,在同一数据库事务内检查实时人口数量、实体 UUID 唯一性,以及面包师/织布工所需的前置职业;多人争夺最后一个人口名额时只有一项能够成功,失败招募进入费用补偿流程。
已招募实体名称中的 `ID` 是 VillagerPro 数据库持久 ID,不是会在重启后变化的 Bukkit 实体编号;名称同时显示当前自由、跟随或停留模式。旧存档会在村民加载或交互时自动修正名称,传承生成的实体也会同步真实 UUID。所有需要村民 ID 的命令会在 Tab 补全中列出自己村庄的实际 ID。
村民详情中的拴绳按钮,或潜行并手持其他物品与村民交互,可按 `FREE → FOLLOW → STAY` 切换模式。自由模式恢复原版 AI,跟随模式启用定时导航,停留模式关闭 AI 并真正冻结位置,不只是清除一次目标。模式持久化后才应用到实体;插件启动与区块加载会恢复跟随任务或停留状态,关闭插件时会恢复 AI,避免卸载后留下永久冻结实体。核心死亡清理和模式监听不依赖个性系统开关。
默认启用 `compatibility.auto_cleanup_dead_villagers`:托管村民死亡、感染为僵尸村民或因雷击等原因转化为其他实体时,会停止跟随并删除原绑定;数据库外键同时释放技能、专精、需求和工作站状态以及人口名额。手动移除村民也会先取消跟随并恢复 AI,不会留下仍在跟随或永久冻结的普通实体。关闭自动清理后只停止运行中的跟随任务,数据库记录由服主自行处理。
## 职业与产出
| 职业 | 基础产物 | 基础数量 | 成功率 | 可用能力 |
| --- | --- | ---: | ---: | --- |
| 农民 | 小麦、胡萝卜、马铃薯、甜菜根 | 3 | 80% | 增产、扩大工作范围 |
| 渔夫 | 鳕鱼、鲑鱼、热带鱼、河豚 | 2 | 60% | 缩短周期、额外获得海洋之心 |
| 牧羊人 | 白/橙/品红羊毛 | 1 | 70% | 增产、逐级解锁羊毛颜色 |
| 图书管理员 | 书、经验瓶 | 1 | 40% | 附魔书概率、全村村民经验加成 |
| 祭司 | 药水 | 1 | 50% | 药水增产、全村村民最大生命值加成 |
| 制图师 | 空地图 | 1 | 40% | 地图增产、额外获得藏宝图 |
| 面包师 | 不独立生产 | - | - | 有农民时可招募,将完整的 3 小麦配方加工为面包 |
| 织布工 | 不独立生产 | - | - | 有牧羊人时可招募,将完整的 5 白羊毛配方加工为白地毯 |
面包师和织布工属于生态链加工职业。它们现在按自己的工作周期从仓库读取超过保留量的原料,只有加工成功才会在同一事务中扣除原料并加入成品;需求、工作站和工坊都会改变实际加工结果。默认连续加工模式也会读取上游生产者的链路专精,例如牧羊人的“织造协作”会提高织布工的加工成功率,不会因改用仓库加工而失效。
表格中的成功率和 `config.yml` 中职业 `probability`、访客 `spawn_probability`、专精额外产出概率均使用 `0.0` 到 `1.0`。运行时会将越界或非有限值钳制到可玩范围,建议仍按该范围配置,避免把职业或访客变成必定/永不发生。
默认连续生产链为:
```text
小麦 → 面包 → 曲奇
白羊毛 → 白地毯 → 画
```
加工配方按优先级尝试,高级成品优先消耗上一步产物;原料不足时才回到基础加工。村民等级先提高单周期最大加工批次;即使达到配方批次上限,额外等级仍按 `eco_chain.processing_output_bonus_per_level`(默认每级 5%)提高实际成品期望数量。工坊也会提高实际成品数量。曲奇与画进入每日订单池,从而形成基础生产、加工、交付和再投资的完整循环。所有阶段均可在 `eco_chain.processing_recipes` 中增加或修改。
### 工作条件
- 默认工作周期为 2400 ticks(120 秒),系统每 20 ticks 检查一次到期状态。
- 新招募村民会自动建立首次工作计时,不需要重启服务器。
- 默认仅允许主世界工作;可通过 `compatibility.allow_work_in_all_worlds` 修改。
- 默认必须绑定一个具体坐标的职业工作站;方块被移除、区块未加载或村民离站超过 8 格时暂停生产。
- 图书管理员等概率未命中的工作不会产出,也不会增加本次工作经验。
## 仓库规则
- 仓库容量表示可存储的物品总数量,不是箱子 GUI 格数。
- 默认容量为 50,每个村庄等级增加 25;“仓储扩容”每级再增加 50。
- 左键仓库物品提取全部,右键提取最多一组(不足 64 时提取现有数量)。
- 背包放不下的已提取物品会掉落在玩家脚下,不会复制或消失。
- 所有提取操作都校验村庄所有权,并使用带库存下限条件的数据库扣减。
### 经营规则
- `/village rules` 可管理所有配置产物和仓库已有物品,不需要先生产出该物品。
- 左键物品依次设置 `0/16/32/64/128` 的保留量;保留库存不能被玩家提取,也不会被订单消耗。
- 右键物品切换生产开关。基础产物会在随机选择前被过滤;生态链加工产物停产时会保留原料。
- 自动交付开启后,每次成功入库都会检查当日订单,但只使用超过保留量的库存。
- 仓库仍会优先存入剩余容量。溢出余量可选择直接丢弃,或按合法堆叠掉落在生产村民脚下。
- 普通生产、生态链加工、市场购买、节日/委托奖励和商队回程共享同一套村庄容量锁;MySQL 多连接同时入库时会串行重算总量。普通生产可以只占用最后的剩余空间,其余要求完整交付的操作会整体等待或回滚,仓库总量不能因并发突破容量。
- 玩家提取、需求补给、订单、市场出售、危机救援和商队派货都在数据库扣减语句中直接校验手动保留量与政策冻结比例,不采用容易被并发穿透的“先检查、后扣除”。
## 每日订单
- 每个村庄每天从 `orders.pool` 稳定生成默认 3 个订单;重开 GUI 或重启服务器不会刷新订单。
- 订单需求量和配置基础奖励按村庄等级线性增长;实际金币由 `orders.market_value_cap_multiplier` 限制为不高于同批货物当前市场清算价值,不能从市场买入后立即交单稳定套利。
- 点击订单可手动提交,完成后同时获得 Vault 金币和繁荣度;已完成订单当天不能重复领取。
- 交货扣库、繁荣度增加和待发金币记录在一个数据库事务中。Vault 临时失败时物资不会退回并重复交付,而是保留“待发金币”,再次点击只重试金币。
- 订单板优先显示所有跨日未结清款项,再显示当日订单;`payout_processing` 表示服务器可能在 Vault 调用期间中断,为防止重复发钱会停止自动重试。
- 可通过村庄主页的书本按钮或 `/village orders` 打开订单板。
- 管理员核对 Vault 流水后,可用 `/village orders resolve <订单ID> <completed|pending>` 分别确认“已经到账”或“没有到账,恢复重试”。
## 动态市场
`/village market prices` 显示当前全服行情。市场直接和自己的村庄仓库交易:出售只会使用超过仓库保留量的库存,购买前会检查完整仓库空间,不会把买不下的物品掉在地上。
```text
/village market prices
/village market sell <物品> <数量>
/village market buy <物品> <数量>
```
每种物品拥有持久化的全服供需压力。玩家大量出售会压低后续价格,大量购买会推高价格;压力默认按 24 小时半衰期回归基础价。批量成交按交易前后压力的中点计算滑点,收购价和出售价之间还保留价差;单次交易与村庄每日交易量也有限制,不能靠立即买回或无限刷单制造金币。成交会记录村庄、玩家、方向、数量和实际价格,默认保留 30 天;行情状态独立持久化,清理历史或重启服务器都不会重置价格。
每日额度校验、仓库增减、行情推进和成交日志位于同一数据库事务。并发交易会按村庄额度串行检查,并用行情版本阻止旧报价覆盖新成交;额度、仓库空间或库存保护状态变化时整笔数据库操作回滚。Vault 属于外部经济系统,经济插件调用失败时会执行补偿退款,并记录无法完成补偿的严重日志供服主核对。
## 村庄政策
村庄主人可以用 `/village policy list` 查看政策,并用 `/village policy set <类型>` 选择一项。政策默认锁定 24 小时,不能在生产或交易结算前临时切换:
| 政策 | 实际收益 | 实际代价 |
| --- | --- | --- |
| `overtime` 加班生产 | 基础生产与生态链产量 +20% | 三项生活需求衰减 +25% |
| `welfare` 福利供给 | 需求衰减 -25%,补给恢复 +20% | 村民提前 15 点需求开始消耗仓库补给 |
| `export` 出口导向 | 市场出售价格 +10% | 市场购买价格 +5%,订单金币 -15% |
| `reserve` 储备制度 | 仓库容量 +20% | 每种库存至少 15% 被锁定,生产链、订单和市场均不能提取 |
政策状态持久化到数据库,重启不会重置锁定时间。所有倍率都位于 `policies` 配置段,并直接进入生产、需求、仓库或经济结算,不是展示计数。村庄主页的讲台按钮会显示当前政策;仓库规则界面会同时显示手动保留量、政策生效后的有效保护量和真正可提取数量。
## 村庄危机
每个村庄在初始宽限期后按周期独立抽取危机。当前危机、救援进度、截止时间和下次抽取时间都写入数据库,重启不能刷新类型、清空进度或推迟抽取。可用 `/village crisis status` 查看当前影响,用 `/village crisis contribute <数量>` 从超过保留量的仓库库存提交救援物资。
| 危机 | 未处理时的实际影响 | 默认救援物资 | 对应减灾建筑 |
| --- | --- | --- | --- |
| 歉收 | 全村生产降至 65% | 面包 | 粮仓 |
| 疫病 | 生产降至 80%,需求衰减升至 150% | 药水 | 诊所 |
| 火灾 | 全村生产降至 75% | 橡木木板 | 工坊 |
| 贸易封锁 | 市场卖价降至 65%,买价升至 135% | 绿宝石 | 粮仓 |
功能建筑每级默认削弱 15% 的危机负面幅度,但不会把危机完全抵消。救援需求随村庄等级增长;及时处理会获得繁荣度,超时则扣除繁荣度。救援物资都能由现有生产链产出或从动态市场购入。村庄主页的钟会直接提示危机与救援进度;管理员可用 `/village crisis trigger <类型>` 在测试服立即触发指定危机。救援物资扣除、进度更新、危机状态与繁荣度结算均使用事务,服务器在中途停止时不会只完成其中一半。
## 商队贸易路线
商队把仓库资源转换为其他地区的特产,不是即时兑换。使用 `/village caravan dispatch <目的地> <物品> <数量>` 派出商队;货物会立即从可提取库存扣除,经过配置的运输时间后才能用 `/village caravan claim <ID>` 领取。仓库已满时货物保持待领取状态,不会掉落或消失。
- `capital`:面包、曲奇、画或书换回绿宝石。
- `coast`:羊毛、地毯或地图换回鳕鱼。
- `frontier`:食物换回橡木木板。
- `apothecary`:书、地图或绿宝石换回药水。
- 回程量按市场基础价值乘以低于 1 的路线折价计算,出口政策只提供有限加成,因此不能靠往返转换凭空增值。
- 每条路线有预先写入数据库的成败结果,重启不会重抽;村庄等级会降低风险。在途与待领取商队共用数量上限,且上限检查位于锁村事务内,MySQL 并发派遣不能绕过名额;贸易封锁期间不能派出新商队。
使用 `/village caravan list` 或村庄主页的矿车按钮查看最近记录、剩余时间和可领取编号。目的地、接受物品、回程物品、耗时、风险及价值折价均可配置;已领取和失败记录默认保留 30 天。派货时“扣仓库并创建路线”、领取时“写入回程物品并标记已领取”分别位于单个事务中,同一路线无法重复领取。
## 生产统计
- `/village stats` 按村民聚合最近 60 分钟的到期尝试、成功次数、实际入库量、概率未命中和容量/规则阻塞次数。
- 当前状态会直接说明生产倒计时、距离过远、世界不允许、实体不存在、全部停产、仓库已满或加工职业等待协作等原因。
- 统计窗口与日志保留天数分别由 `production_stats.window_minutes` 和 `retention_days` 控制。
- 统计记录默认保留 7 天,并由运行时定期清理,不会无限增长。
## 深层村民培养
### 职业专精
- 生产职业村民达到默认 3 级后,可以从两个互斥分支中选择一个;每个分支最高 3 级。
- 选择与升级会消耗 Vault 金币,洗点会清除当前分支和等级,但允许重新选择。
- 专精效果直接进入运行时生产公式,不是标签或计数:
- 农民:丰产倍率,或概率额外产出金胡萝卜。
- 渔夫:进一步缩短周期,或提高海洋宝藏概率。
- 牧羊人:羊毛增产,或提高织布生态链成功率。
- 图书管理员:个人经验加成,或额外附魔书概率。
- 祭司:药水增产,或提高自身最大生命值。
- 制图师:地图增产,或提高藏宝图概率。
- 使用 `/villager specialize <ID>`,或点击村民详情中的下界之星管理专精。
### 生活需求
- 每名村民拥有温饱、舒适和健康三项 `0-100` 状态,并按真实经过时间衰减;离线跨度最多按 24 小时结算,避免无限惩罚。
- 系统会从超过仓库保留量的库存中自动消耗食物、羊毛/地毯和药水;保留库存始终受到保护。补给扣除与需求状态更新在同一数据库事务内完成,状态冲突或写入失败会整体回滚,不会吞掉库存。
- 有效工作站按小时恢复舒适度。最近一次消耗和当前需求倍率可在需求 GUI 查看。
- 三项需求取最低值决定真实生产倍率:优秀 `+10%`、正常不变、较差 `-20%`、危急 `-40%`;需求不会直接杀死村民或完全停止生产。
- 使用 `/villager needs <ID>`,或点击村民详情中的苹果查看。
### 实体工作站
| 职业 | 默认绑定方块 |
| --- | --- |
| 农民 | 堆肥桶 |
| 渔夫 | 木桶 |
| 牧羊人 / 织布工 | 织布机 |
| 图书管理员 | 讲台 |
| 祭司 | 酿造台 |
| 制图师 | 制图台 |
| 面包师 | 烟熏炉 |
- 点击村民详情中的工作台图标,然后右键村庄保护范围内的正确方块完成绑定。
- 每个方块只能绑定一名村民;重新绑定会保留等级,方块被替换后立即失效。
- 工作站最高 3 级,默认 2/3 级分别提高 15%/30% 生产倍率;加工职业的等级会提高生态链加工成功率。
- 面包师和织布工不进行独立生产,只有其实体工作站正常时才参与对应生产者的加工。
- 使用 `/villager workstation <ID>` 查看、绑定、重新绑定或升级。
### 功能建筑
功能建筑不是菜单里的永久计数。玩家先在村庄保护范围内搭建结构,再看向八格内的核心方块执行登记;系统只扫描核心周围 `7×6×7` 的有限空间,根据功能方块数量和九列屋顶覆盖自动判定 1–3 级。
| 建筑 | 核心 | 1级基础要求 | 每级实际效果 |
| --- | --- | --- | --- |
| 粮仓 | 木桶 | 4 木桶、16 木板、6 列屋顶 | 仓库总容量 +100 |
| 工坊 | 工作台 | 2 熔炉、1 铁砧、12 木板、6 列屋顶 | 所有职业实际产量 +10% |
| 诊所 | 酿造台 | 2 床、1 酿造台、4 书架、6 列屋顶 | 需求衰减 -15%,药水恢复 +15% |
更高等级需要成比例增加功能方块并提高屋顶覆盖。方块放置、破坏、燃烧、爆炸、活塞移动和区块加载都会延迟合并后重检;另外每两分钟分批审计,因此通过 WorldEdit 修改或拆掉材料也不能永久保留效果。建筑区块未加载时不会强制加载,并暂时停止提供加成。
```text
/village building list
/village building register <granary|workshop|clinic>
/village building inspect
/village building remove <granary|workshop|clinic>
```
## 成长与升级
### 村民等级
- 村民每次成功存入产物后获得经验。
- 所需经验为 `当前等级 × villager.base_exp_per_level`。
- 普通生产职业每提高一级,基础单次产量默认增加 1,由 `villager.production_amount_per_level` 控制;加工职业等级会提高每周期可处理批次数,并在批次封顶后继续增加成品倍率,因此两类升级都不是单纯计数。
- 一次获得的积压经验会连续结算所有满足条件的等级;村庄也会逐级检查经验、对应升级费用和最高等级。若主人离线时积累了足够经验,会在下次登录时补结算,不需要再生产一次才能触发下一等级。
- 图书管理员的“知识加成”按全村技能总等级叠加,每级使所有村民经验期望值增加 10%。
### 村民职业技能
职业技能需要单独支付配置成本,带 `cost_multiplier` 的技能会按等级指数增长成本。技能不是纯计数,当前实现效果如下:
- 高效收割、高效剪毛、药剂大师、制图专家:每级使对应单次产量增加 1。
- 广域耕作:每级使农民有效工作范围增加 2 格。
- 快速垂钓:每级使渔夫工作周期减少 20%。
- 寻宝专家:每级增加 10% 海洋之心额外产出概率。
- 羊毛专家:每级解锁一种额外羊毛颜色。
- 生命祝福:每级使村庄内所有已招募村民最大生命值增加 1,多名祭司可叠加。
- 附魔专家:每级增加 10% 附魔书额外产出概率。
- 知识加成:每级增加全村村民 10% 经验获取期望值,多名图书管理员可叠加。
- 藏宝图:每级增加 10% 填充地图额外产出概率。
每项技能的实际数值位于自己的 `effects` 节点,例如 `amount_per_level`、`range_per_level`、`interval_reduction_per_level` 和 `treasure_chance_per_level`。运行时公式直接读取这些值;旧配置未包含节点时仍使用以上默认值。
### 个性与生产
- 村民可通过送礼、赞扬、保护、花坛和村庄升级获得忠诚度或心情;`personality.enabled` 与 `features.personality` 任一关闭时,该系统及其加成均停止生效。
- 默认忠诚度达到 `80` 后生产倍率 `+5%`,心情达到 `80` 后再 `+5%`,两项均满足时为 `110%`。该倍率直接进入普通职业产量、仓库加工成功率与加工成品数量,不是展示计数。
- 阈值与收益位于 `personality.production.loyalty_threshold`、`loyalty_bonus`、`mood_threshold`、`mood_bonus`;村民需求页和生产统计会显示当前个性倍率。
### 村庄等级与技能点
- 村庄仅在产物成功进入仓库后获得经验。
- 达到经验阈值后会尝试支付 `village.upgrade_costs`;资源不足时保留经验并等待后续工作。
- 每次村庄升级获得 1 个村庄技能点。
- `/village upgrade` 每级提供固定的一组候选项,重新打开 GUI 不会刷新候选结果。
- 农业强化、渔业专精、村民上限、仓储扩容和怪物生成抑制均已接入实际运行逻辑。
- 村庄技能会在数据库事务内锁定村庄并重新计算已用技能点;村民技能、职业专精和洗点也必须匹配付款前看到的分支与等级。旧 GUI、快速双击或并发操作不能超支技能点、覆盖更高等级或用旧等级费用推进新等级,状态变化时费用会进入补偿退款流程。
- 五类村庄升级的产量、范围、周期、概率、容量和生成抑制数值均位于 `village_upgrades.available_upgrades.<ID>.effects`,可调整且不再依赖散落的硬编码。
## 其他可玩系统
### 装饰与繁荣度
村庄主页可进入装饰商店。购买后的装饰物带有插件标签,右键方块即可放置;放置和移除都会同步数据库及繁荣度。已托管的装饰不能被普通挖掘、燃烧、爆炸或活塞移动绕过,需从装饰管理界面移除。默认装饰仅使用 Vault 与原版材料成本,不要求 ItemsAdder。
### 防御
- 村庄主页可按等级和成本召唤限时铁傀儡守卫。`defense.guard.max_active_per_village` 会跨区块与重启持久限制同村数量,守卫到期或插件正常关闭时会清理。
- 夜晚自动避难所会按 `defense.shelter` 配置运行,整段夜晚均可触发、白天自动解除;村民的原位置会被记录,重启后实体加载时也会解除临时无敌并复原,避免永久滞留。
- “村庄守护”升级按等级实际降低村庄范围内的怪物生成概率。
- 配置启用时,已招募村民在村庄保护范围内受到的伤害会按 `defense.protection.damage_reduction` 降低(默认 50%,取值范围 `0` 到 `1`)。
### 访客
- 繁荣度达到阈值后,系统按概率生成商人、旅行者或节日使者。
- 每个访客实体都绑定其数据库访客 ID。异常重启后会复用仍存在的实体,而不是重复生成;已过期、失去数据库记录或重复加载的实体会在启动或区块加载时清理。访客到期时会同时移除实体、内存状态以及关联的数据库交易/委托记录。
- 商人商品支持 `amount` 批量数量和 Vault、PlayerPoints、原版物品、ItemsAdder 组合成本;整数或小数价格均可读取。每项商品用稳定 `id` 标识,`stock` 是该访客整批共享库存,`per_player_limit` 是每名玩家的购买次数上限;占用使用数据库事务,因此多人同时点击不能超卖,扣费或发货失败会释放库存。商人离开后旧 GUI 不能继续购买,成功购买会按真实数量写入已完成成交记录。
- 旅行者委托按“玩家 + 访客 + 委托”持久化,并在接取时冻结需求物品、数量和奖励。后续配置重载、改名或删除只影响新合同;旧合同仍会显示并按原条件交付。交付物从超过保留量的村庄仓库扣除,奖励直接进入仓库,扣料、入库和完成状态位于同一事务中,同一委托不能重复结算。
- 节日按世界完整时间每 7 天判断;节日奖励每个周期可领取一次。
- 节日产出倍率作用于普通生产和仓库加工,并按全服节日周期持久化;个人领取标记、物品入库和首次全服增益激活位于同一数据库事务,任一写入失败都会整体回滚,仓库空间不足不会吞掉领取机会。服务器重启不会重置领取状态或增益,同一周期的后续个人领取既不会延长仍在生效的倍率,也不会在倍率结束后重新启动。
- ItemsAdder 访客商品的具体用途由服务器对应内容包定义。
### 个性互动
村庄主人可潜行并用蛋糕/蒲公英送礼,或潜行空手赞扬村民。互动受默认 30 秒冷却限制;村庄升级会实际提高全村忠诚度与心情。村民受到怪物攻击时,保护奖励和短时抗性效果也会触发。
## 实验模块
- 联盟成员管理默认关闭,可通过 `features.alliance` 与 `alliance.enabled` 启用;当前版本不宣称仓库共享或联盟增益。
- 传承模块尚未开放稳定的玩家入口,默认关闭;相关配置保留用于后续兼容。
## 命令
```text
/village create <名称> 创建村庄
/village info 打开村庄主页
/village warehouse 打开仓库
/village orders 打开每日订单板
/village orders resolve <订单ID> <completed|pending> 人工确认中断的金币结算(管理员)
/village stats 查看生产统计与停工原因
/village rules 设置仓库与生产规则
/village building ... 登记、检查或移除功能建筑
/village market ... 查看行情或买卖村庄仓库物品
/village policy ... 查看或选择限时村庄政策
/village crisis ... 查看危机或从仓库提交救援物资
/village caravan ... 派遣商队或领取回程货物
/village upgrade 使用村庄技能点
/village reload 重载配置(管理员)
/village database migrate <mysql|sqlite> [confirm] 转换数据库(管理员)
/villager list 查看村民列表
/villager recruit 招募附近村民
/villager info <ID> 查看自己的村民
/villager remove <ID> 解除自己的村民绑定
/villager upgrade <ID> 升级职业技能
/villager specialize <ID> 选择、升级或重置互斥职业专精
/villager needs <ID> 查看村民生活需求与效率
/villager workstation <ID> 绑定和升级实体工作站
/upgrade village
/upgrade villager <ID>
```
## 构建与安装
```powershell
.\gradlew.bat clean build
```
生成文件位于 `build/libs/VillagerPro2-2.0.0.jar`。将其放入服务器的 `plugins` 目录后重启服务器。升级旧版本前建议备份 SQLite/MySQL 数据和已有配置文件。
## 验证
项目包含费用归一化和核心玩法数值/配置测试,覆盖同类资源合并、连续等级结算、村民等级与技能增产、所有可购买升级必须声明正数运行时效果、节日有效奖励与不可续期增益、需求倍率、工作站等级、随机期望取整、周期下限、仓库与政策冻结保留量、生态链完整配方、每日订单缩放、政策收益与代价、新增数据表的 SQLite 唯一约束与级联清理、SQLite/MySQL 双方言,以及数据库迁移的全表复制和空目标保护:
```powershell
.\gradlew.bat clean test
```
[/MD]