[MD]
### 功能
- **两点选角圈地**:用选区工具标记两个角(手机版选点:长按/点击=第一个点/第二个点;电脑版选点:左键/右键=第一个点/第二个点),两点之间的矩形即为领地。**高度不限**,领地覆盖从地底到天空的整个垂直范围。每人同时只能拥有一块领地。面积上限、单边长度上限、领地之间的最小间隔均可配置。
- **领地升级**:默认最高10级,可通过配置文件提高上限。升级不改变领地大小。圈地费、升级费与每日维护费均基于圈地时确定的面积计算。同等级的领地使用相同的升级标准,差异仅来自面积。
- **邀请与申请**:户主可直接邀请玩家;其他玩家可提交申请,由户主同意或拒绝。
- **领地保护**:非成员不可破坏或放置方块、开启容器、使用桶、在领地内攻击玩家。爆炸不会破坏领地内的方块。
- **领地传送点**:`/territory home`,户主与成员均可使用。
- **出售与转让**:可挂牌定价供其他玩家从市场购买,也可无偿转让。成交时系统收取可配置的手续费。
- **每日维护费**:按自然日收取一次。欠费的领地将被冻结,冻结期间仅户主与最高权限可建造,且传送点不可用。冻结超过配置的天数后领地被释放。
- **MEB营地联动**:市长可为营地圈一块**固定大小**的领地,费用从**营地捐献池**扣除。加入营地即获得营地领地的编辑权限。领地信息中显示营地名、营地 ID 与营地等级。户主的同居对象自动获得领地编辑权限。
- **MEB浮空字联动**:安装 MEBFloatingText 后,户主在领地内选定位置,插件在该处维护一块信息浮空字。**提示内容为统一格式,由配置文件配置。** 浮空字归户主所有并由 MEBTerritory 托管,**OP 无权删除或修改**,仅户主本人与最高权限可操作。
- **MEBGUI联动**:进服发放菜单物品(电脑版右键打开界面)。GUI 操作与指令共用同一业务层,两者校验一致。
### 指令
`/territory`,别名 `/ter` `/land` `/领地`。玩家不带参数执行时打开 GUI(需安装MEBForms)。
| 子指令 | 用法 | 说明 |
|---|---|---|
| `help` | `/territory help` | 查看指令帮助 |
| `gui` | `/territory gui` | 打开领地图形界面 |
| `tool` | `/territory tool` | 获取领地选区工具 |
| `item` | `/territory item` | 补发 GUI 唤醒物品 |
| `pos1` / `pos2` | `/territory pos1` | 将所在位置设为第一个 / 第二个角 |
| `claim` | `/territory claim` | 使用已选的两个角圈定领地 |
| `campclaim` | `/territory campclaim` | 为营地圈定领地(**仅市长**,费用走捐献池) |
| `info` | `/territory info [领地ID]` | 查看领地详细信息,不填 ID 时查看自己的 |
| `here` | `/territory here` | 查看当前所处领地的信息 |
| `list` | `/territory list [页码]` | 查看全服领地列表 |
| `upgrade` | `/territory upgrade` | 升级领地 |
| `invite` | `/territory invite <玩家名>` | 授予玩家领地编辑权限 |
| `kick` | `/territory kick <玩家名>` | 移除领地成员 |
| `apply` | `/territory apply [领地ID]` | 申请编辑权限,不填 ID 时申请当前所处领地 |
| `accept` / `deny` | `/territory accept <玩家名>` | 同意 / 拒绝申请 |
| `members` | `/territory members` | 查看成员与待处理申请 |
| `sethome` | `/territory sethome` | 将传送点设在所在位置,须位于领地内 |
| `home` | `/territory home` | 传送到领地传送点 |
| `sell` | `/territory sell <价格>` | 挂牌出售领地 |
| `unsell` | `/territory unsell` | 取消出售 |
| `buy` | `/territory buy <领地ID>` | 购买在售领地 |
| `market` | `/territory market` | 查看在售领地列表 |
| `transfer` | `/territory transfer <玩家名>` | 无偿转让领地 |
| `pay` | `/territory pay` | 补缴欠费并解冻领地 |
| `abandon` | `/territory abandon` | 放弃领地并领取部分退款 |
| `text` | `/territory text [off]` | 在所在位置设置领地浮空字,`off` 为撤除 |
| `delete` | `/territory delete <领地ID>` | 强制删除领地(**仅最高权限**) |
| `reload` | `/territory reload` | 重载配置与领地数据(**仅最高权限**) |
### 权限
| 权限节点 | 默认 | 说明 |
|---|---|---|
| `MEBTerritory.ge` | 所有人 | 使用 `/territory` |
| `MEBTerritory.master` | `false` | 管理全部领地,含 `delete` 与 `reload` |
OP 不具备领地管理权限。最高权限的判定满足以下任一条件即可:控制台、持有 `MEBTerritory.master` 权限节点、为 MEBSociety 的「最高权限」。
### 领地上的身份
| 身份 | 可建造 | 可管理(升级 / 邀请 / 出售 / 传送点 / 删除) |
|---|---|---|
| 最高权限 | 是 | 是 |
| 户主(营地领地为市长) | 是 | 是 |
| 成员(被邀请或申请通过) | 是 | 否 |
| 户主的同居对象 | 是 | 否 |
| 营地成员(营地领地) | 是 | 否 |
| 访客 | 否 | 否 |
领地因欠费冻结期间,仅户主与最高权限可建造。
### 给其他插件的接口
`MengBao\MEBTerritory\API\TerritoryAPI` 是供其他插件调用的稳定接口。
```php
use MengBao\MEBTerritory\API\TerritoryAPI;
if (TerritoryAPI::isAvailable() && TerritoryAPI::getEffectiveLevel($playerName) >= 5) {
//解锁 5 级内容
}
```
| 方法 | 返回 |
|---|---|
| `isAvailable()` | MEBTerritory 是否已装且已启用 |
| `getPlayerLevel(string)` | 玩家自己领地的等级,无领地或已冻结时返回 `0` |
| `getEffectiveLevel(string)` | 「自己领地」与「所在营地领地」等级中的较大值 |
| `getCampsiteLevel(string)` | 玩家所在营地领地的等级,无则返回 `0` |
| `getMaxLevel()` | 配置的等级上限 |
| `getPlayerTerritory(string)` / `hasTerritory(string)` | `Territory` 对象 / 布尔值 |
| `getTerritoryAt(string, Vector3)` / `getTerritoryOf(Player)` | 指定位置所在的领地 |
| `canBuildAt(Player, string, Vector3)` | 该玩家能否在指定位置修改方块 |
| `isOwner(Territory, string)` / `canBuild(Territory, string)` | 身份判断 |
冻结中的领地等级按 `0` 返回。接口仅开放查询操作。
### 依赖(可选)
| 插件 | 装上解锁 | 不装时 |
|---|---|---|
| **MEBForms** | GUI 界面 | GUI 不可用并输出启动警告,全部指令不受影响 |
| **MEBSociety**(2.0.8+) | 游戏币、营地领地、营地等级加成、同居编辑权限、升级材料 | 所有费用不予收取,营地与同居相关功能不可用 |
| **MEBFloatingText**(1.2.0+) | 领地信息浮空字 | 浮空字功能不可用 |
使用 MEBSociety 2.0.7 及更早版本时,营地等级与专属物品尚不存在,插件将输出警告并把领地升级降级为仅收取游戏币。
### 配置与数据
数据目录 `plugin_data/MEBTerritory/`:
- `Settings.yml` —— 配置文件,缺失键在启动时自动补齐。
- `Territories.yml` —— 领地数据。损坏的条目会被跳过并在日志中提示,文件内容保留不动。
`Settings.yml` 主要默认值:
| 键 | 默认 | 说明 |
|---|---|---|
| 语言 | `zh_CN` | 语言代码(`zh_CN` / `en_US`) |
| 选区工具 | `wooden_axe` | 选区工具物品 |
| 个人领地最大面积 | 10000 | 个人领地面积上限 |
| 领地单边最大长度 / 最小长度 | 256 / 5 | 单边长度限制 |
| 领地之间的最小间隔 | 3 | 领地之间的最小间隔,0 表示允许相邻 |
| 允许圈地的世界 / 禁止圈地的世界 | `[]` / `[]` | 白名单(留空表示全部世界)与黑名单,黑名单优先 |
| 个人领地每格圈地费 / 升级费 / 每日维护费 | 10 / 6 / 0.1 | 每格单价 |
| 营地领地每格圈地费 / 升级费 / 每日维护费 | 5 / 3 / 0.05 | 营地领地的每格单价 |
| 营地领地边长 | 256 | 营地领地的固定边长 |
| 领地最大等级 | 10 | 等级上限 |
| 免材料的领地等级上限 | 2 | 该等级之前的升级仅收取游戏币 |
| 每多少格领地消耗一个升级材料 | 500 | 材料数量随面积增长 |
| 单次升级材料数量上限 | 64 | 单次升级的材料上限 |
| 放弃领地返还比例 | 0.3 | 放弃领地时按圈地费返还的比例 |
| 领地交易手续费比例 | 0.05 | 成交时系统收取的比例 |
| 启用每日维护费 | `true` | 维护费开关 |
| 欠费自动释放天数 | 14 | 冻结达该天数后释放领地,0 表示永不释放 |
| 保护方块交互 / 保护容器 / 领地内禁止PVP / 领地内禁止爆炸破坏 | `true` | 保护开关 |
| 提示冷却(s) | 2 | 保护提示的冷却时间 |
| 进出领地提示 / 进出提示用聊天栏 | `true` / `false` | 进出提示;`false` 表示使用物品栏上方的小字 |
| 启用领地浮空字 / 浮空字高度偏移 | `true` / 1.6 | 浮空字开关与高度偏移 |
| 领地浮空字格式 | 见文件 | 全服统一模板,变量见下 |
| 启用GUI唤醒物品 / 唤醒物品 | `true` / `compass` | 进服发放的菜单物品 |
| 领地成员数量上限 | 20 | 0 表示不限 |
| 列表每页显示数量 | 8 | 列表每页条数 |
浮空字可用变量:`{id}` `{owner}` `{name}` `{level}` `{max_level}` `{area}` `{size}` `{members}` `{campsite}` `{CID}` `{campsite_level}` `{state}`。
### 费用
默认单价下,面积为 `A`、等级为 `L` 的领地:
| 项目 | 计算式 |
|---|---|
| 圈地 | `10 × A` |
| `L` 级升 `L+1` 级 | `6 × A × L` |
| 每日维护费 | `0.1 × A × (1 + (L−1) × 0.1)` |
| 升级材料(3 级及以上) | 同等级解锁的营地专属物品,需要 `ceil(A ÷ 500)` 个,上限 64 个 |
材料需求将领地等级与营地进度关联:领地无法超过 2 级,直至其所在营地达到对应等级并解锁该物品;成员可从每周福利箱领取,或在专属物品市场购买。
### 说明
- 领地为高度不限的二维矩形,仅存储与比较 x/z 坐标。
- 选区仅保存在内存中,玩家退出时清除。
- 维护费任务每小时执行一次,按**自然日**而非经过时长收费,因此在服务器运行的任意一天恰好收取一次。
- 指令与 GUI 共用同一业务层(`TerritoryService`),GUI 回调在写入数据时重新校验权限。
- 营地领地的户主判定跟随**市长**,而非存储固定的玩家名,因此转让市长职位时领地控制权随之转移。
- 启动时清理所属营地已不存在的领地,以及无对应领地的残留浮空字。
---
[/MD]