跳转至

原创指南 · 目标版本:Minecraft 1.20.1 + Forge 47.4.10+ + FPSMatch 1.26.9(快照 2026-09-19) 面向服主 / 地图作者(不需要写代码)。命令、设置键、能力、物品 ID 均按最新版源码与仓库内 docs/mapper 逐条核对;游戏内 /fpsm help 永远是最新的事实来源。

FPSMatch 使用指南(最新版):把枪战玩法开起来

版本变化提醒(对比老教程)

最新版 groupId / 包名已整体改名com.ptcrys.fpsmatchnet.ptcrys.fpsmatch,Maven 坐标是 net.ptcrys:FPSMatch:<版本>(artifact 名大写),版本号形式变为 1.26.9-SNAPSHOT / v1.26.9.19。 另外 LDLib2 已彻底移除(界面改为 Modern UI),Kotlin for Forge 仍是必需依赖

目录

  1. 开篇:这份指南能让你做什么
  2. 安装与环境:版本、依赖、装哪边
  3. 概念速通:游戏类型 / 地图 / 队伍 / 区域 / 能力 / 设置
  4. 建图:两对角点 + 图形工具 + 命令
  5. 队伍与出生点
  6. 区域:地图区域 / 爆破区(包点)/ 商店区
  7. 地图设置
  8. 起始装备(kits)
  9. 商店:让玩家有钱买枪
  10. 商店监听模块:退货 / 护甲 / 动态换物
  11. 房间与比赛管理
  12. 制图工具四件套
  13. 地图展示资源:名称 / 图标 / 背景
  14. 导入另一张地图的配置
  15. 保存与维护
  16. 命令速查表
  17. 排错与常见问题
  18. 相关链接

开篇

FPSMatch 是一个对局框架(库模组):它提供地图实例、队伍、经济与商店、能力、HUD 与统计、房间大厅,但不自己提供玩法。要有可打的地图,必须先有一个注册了「游戏类型」的玩法模组(例如 cs 爆破、csdm 死斗,或你自己的玩法)。

读完你能做到:

  • 装好 FPSMatch 及其依赖,用 /fpsm help 验证
  • 用工具或命令建出第一张可打的地图
  • 配出生点、爆破区(包点)、起始装备、商店与购买区
  • 配好商店联动(自动退货、护甲 + 头盔升级、动态换物)
  • 管房间、开比赛、存数据、按需导入复用配置

安装

版本与依赖

Minecraft 1.20.1
Forge 47.4.10+
FPSMatch 1.26.9-SNAPSHOT(或正式版,见下)
Java 17+
必需依赖 Kotlin for Forge 4.11.0(FPSMatch 现在有 Kotlin 代码)
客户端必需 Modern UI Forge 1.20.1-3.12.0.1(界面用;专用服务端不需要)
可选联动 TaCZ 1.1.7-hotfix(枪械)、counterstrikegrenade(手雷)、tacz-tweakslr-tactical、KubeJS
不需要 ~~LDLib2~~(已彻底移除)

别装 LDLib2

老版本(1.2.5 时代)才需要 LDLib2。现在装上它会拖入独立的 kotlin-stdlib,和 Kotlin for Forge 抢 kotlin.jvm.functions,直接 ResolutionException

从哪拿

  • 官方 Maven(新增,推荐
  • 正式版:https://maven.ptcrys.net/releases
  • 快照:https://maven.ptcrys.net/snapshots
  • 坐标:net.ptcrys:FPSMatch:1.26.9-SNAPSHOT
  • GitHub Releases / Modrinth / CurseForge 也可以下 jar
  • 客户端和服务端必须同一份 FPSMatch(网络协议号不一致会握手失败)

验证安装

  1. 进游戏敲 /fpsm help → 出现可展开的命令树 = 装好了
  2. 创造模式物品栏找 FPSMatch 分页 → 应有地图创建工具、复活点工具、对局配置工具、商店配置工具,以及手雷 / 闪光弹 / 烟雾弹 / 燃烧弹 / 防弹护甲等物品

常见坑:只装了客户端或只装了服务端、漏 Kotlin for Forge、漏客户端 Modern UI、Forge 低于 47.4.10。

概念

概念 说明 谁提供
游戏类型(game type) 字符串 ID(如 cscsdm),决定有哪些队伍、能力、商品分类 玩法模组注册
地图 ID 1~48 位小写字母/数字/下划线/连字符(如 training),是存档身份,别写中文 你创建时填写
维度 创建时所处的服务端维度,之后不会变 创建时确定
地图区域 两个对角方块坐标围成的长方体,覆盖所有可玩空间 你用工具/命令设置
队伍 玩法定义(如 T/CT、红/蓝),外加框架自管的旁观队 玩法模组创建
能力(capability) 挂在地图或队伍上的功能模块:出生点、商店、起始装备、爆破区、结束传送点… FPSMatch + 玩法
设置(setting) 每张地图的独立字段:展示名、自动开始、准备时间… 玩法注册字段,地图存值
商店 队伍能力:用钱买枪械/道具,有分组与监听模块联动 队伍能力

三种区域别搞混:

  1. 地图区域 = 最外层边界(玩家与地图对象的总空间)
  2. 爆破区(包点) = 允许安包的空间
  3. 商店区(购买区) = 该队玩家能开商店的位置(不配 = 全图可买)

推荐制作顺序:世界建筑 → 地图区域 → 出生点 → 目标区域 → 设置 → 装备 → 商店。 地图边界是外层约束:普通出生点和爆破区都必须落在边界内,缩小边界时若会把爆破区挤出去,服务端会直接拒绝。

建图

图形工具(推荐)

拿创造物品栏里的地图创建工具 fpsmatch:map_creator_tool

  • 左键方块 = 设 Pos1;右键方块 = 设 Pos2Ctrl + 右键 = 打开创建界面
  • 界面里选游戏类型(如 cs)、填地图 ID(如 training),点「创建地图」
  • 更新已有地图边界:选中「已有地图」,重设两点,点「保存地图」
  • 手持续持工具时会实时预览当前选区;换下工具预览清除

命令

/fpsm map create cs training 0 64 0 100 90 100

相对坐标同样可用:

/fpsm map create cs training ~-50 ~-10 ~-50 ~50 ~30 ~50

创建时会用该游戏类型的工厂生成队伍、能力与默认设置,并立即保存。

修改边界

  • 工具:选已有地图 → 重设两点 → 保存
  • 详情页:/fpsm mapselect → 进入地图 → 「管理 → 区域编辑」→ 地图区域
  • 限制:地图未开始、操作者在同维度、已有爆破区仍完整位于新区域内

队伍

队伍由玩法创建,你一般不新增/删除队伍,只给已有普通队伍配出生点、装备、商店。旁观队由框架单独管理,不需要出生点。

加出生点(工具)

  1. 复活点工具 fpsmatch:spawn_point_toolCtrl + 右键 打开界面
  2. 依次选游戏类型 → 地图 → 普通队伍
  3. 作为地面的方块右键:出生点取该方块上方位置,朝向取你当时的朝向
  4. 界面可浏览点位数量/坐标、删当前点、「清空」该队全部点

会被拒绝的情况:不同维度 / 不在图内 / 脚下没有可站立面 / 脚部或头部空间被方块占住 / 空间有液体 / 与已有出生点重复 / 比赛进行中。

想让玩家出生就面朝战场入口?先站好位置、看向目标方向再点右键。

加出生点(命令)

站在希望玩家出生的位置、朝向东方向,然后:

/fpsm map modify cs training team teams <队伍> capability spawnpoints add
/fpsm map modify cs training team teams <队伍> capability spawnpoints clear

<队伍> 用命令补全里的内部名(界面上的中文翻译名不能代替)。

管理地图成员

/fpsm map modify cs training team join                 ← 自己进自动分配队伍
/fpsm map modify cs training team join @a[tag=builders] ← 指定玩家
/fpsm map modify cs training team teams <队伍> players <目标> join
/fpsm map modify cs training team teams spectator players <目标> join

对应的 leave 表示移出。/fpsm mapselect 详情页里的队伍管理走同一套服务端规则。

区域

地图区域

详情页「管理 → 区域编辑 → 地图区域」:填 Pos1 / Pos2 三个整数坐标,「当前位置」按钮把玩家所在方块写进去。改边界不会重建地图 ID / 维度 / 设置 / 队伍 / 商店 / 装备,也不会自动移动出生点。

爆破区(包点)

a) 命令(新增 + 显示)

/fpsm map modify cs training capability demolition bomb_area add <from> <to>
/fpsm map modify cs training capability demolition bomb_area display
  • 两点 = 一个长方体区域 = 一个包点;A/B 两个包点就 add 两次
  • 区域必须完全落在地图区域内,否则被拒
  • 区域要足够高并盖住地面:判定「能不能安包」是看玩家是否位于区域内
  • 只有 add / display 两个子命令

b) 图形界面(改 / 删更顺手) 详情页「管理 → 区域编辑」→「爆破区域 / 新爆破区域」:填两点保存,左侧选已有区域可改,删除需二次确认。当前实现每张地图最多 256 个爆破区

看不到「爆破区域」页签

说明这张地图没有 DemolitionModeCapability。死斗类地图不会因为填了坐标就获得安包规则。

商店区(购买区)

属于队伍商店能力,在商店里配置:shop areas add/display/clear。不配 = 允许全图开商店;多队要共用同一购买区,必须每队分别配

设置

每张地图独立设置,界面从服务端读取当前实际注册的字段,不依赖固定清单。

基础设置表

设置 默认 含义
displayName 玩家看到的地图名;空 = 用地图 ID
iconTexture 地图列表缩略图资源位置
backgroundTexture 详情页背景资源位置
allowJoinInProgress true 开局后是否允许加入
minAssistDamageRatio 0.25 助攻所需伤害占目标最大生命的比例
teammateGlow false 队友发光
enemyGlow false 敌人发光
hideEnemyNameTag true 隐藏敌方名牌
autoStart false 满足玩法开始条件后启用自动开始计时
autoStartTime 6000 自动开始等待 tick(6000 ≈ 5 分钟)
readyStartEnabled true 允许全员准备触发开始倒计时
readyStartTime 200 全员准备后的等待 tick(200 ≈ 10 秒)

自动开始 ≠ 无条件定时启动

玩法仍会判断人数等开始条件;条件不满足时计时器会复位。别把 readyStartTime 设成 0——那会让准备倒计时每 tick 都判定完成,客户端「准备开始」文字会一直卡着。

三种改法

详情页(一次改多项):/fpsm mapselect → 地图 → 「管理 → 设置」,按分类展示、可搜索;布尔用开关、数值用控件、其它用文本框;改完点保存。

对局配置工具(站在地图里快速改一个):fpsmatch:match_config_tool 右键 → 选类型和地图 → 布尔直切、其它填值后点该行「应用」。

命令

/fpsm map modify cs training settings list
/fpsm map modify cs training settings get displayName
/fpsm map modify cs training settings set displayName 训练场
/fpsm map modify cs training settings set readyStartTime 200
/fpsm map modify cs training settings save
/fpsm map modify cs training settings load
/fpsm map modify cs training settings reset displayName
/fpsm map modify cs training settings reset all

set / reset 只改内存,save 才写文件;load 会用文件内容覆盖未保存的内存改动。

起始装备(kits)

拥有 StartKitsCapability 的队伍可以保存一套开局物品,玩法在准备流程里发放。

/fpsm map modify cs training team teams <队伍> capability kits add                    ← 复制主手完整物品栈(含 NBT)
/fpsm map modify cs training team teams <队伍> capability kits add minecraft:bread 3  ← 按物品 ID + 数量
/fpsm map modify cs training team teams <队伍> capability kits list
/fpsm map modify cs training team teams <队伍> capability kits clear

发放时会先清空玩家物品栏

护甲进装备槽,其它进背包;枪械会经枪械兼容层修正后整理物品栏。所以 kits 适合「背包完全由比赛管理」的玩法,不是给生存背包加奖励,离场也不会自动还原赛前背包。

当前没有「按序号删单件」的命令:要么 clear 后按顺序重加,要么用导入复制整套。

商店

商店属于队伍。可用的商品分类和槽位数由玩法决定;你负责选类型、填商品和价格。

初始化(必须有这一步)

/fpsm map modify cs training team teams <队伍> capability shop initialize <商店类型> [初始资金]
  • <商店类型> 用补全看(内置分类形如 equipment 装备 / pistol 手枪 / mid_rank 中级 / rifle 步枪 / throwable 投掷物,实际以服务器注册为准)
  • 初始资金省略 = 800
  • 初始化成功后,该队才会出现在地图详情页与商店配置工具的可编辑列表里

其它管理命令:

... capability shop info      ← 队伍 / 商店类型 / 初始资金 / 玩家数
... capability shop reset     ← 清玩家本局购买状态(不动商品模板)
... capability shop sync      ← 把最新槽位数据推给玩家(改完命令后建议执行)

购买区域

... capability shop areas add <pos1> <pos2>
... capability shop areas display
... capability shop areas clear      ← ⚠️ 真删除,不只是隐藏

改槽位(命令)

... capability shop modify set <商店类型> <槽位> cost <价格>
... capability shop modify set <商店类型> <槽位> item [物品]           ← 不写物品 = 取主手
... capability shop modify set <商店类型> <槽位> dummy_ammo_amount <数量>
... capability shop modify set <商店类型> <槽位> group_id <值>          ← -1 需用图形编辑器恢复
... capability shop modify set <商店类型> <槽位> listener_module add <模块名>
... capability shop modify set <商店类型> <槽位> listener_module remove <模块名>

槽位号从 1 开始;<商店类型> 可小写输入(服务端转大写)。连续改多条后执行 shop sync + /fpsm save

图形编辑器(推荐)

  • 详情页「管理 → 商店编辑」,或手持 fpsmatch:shop_config_tool 右键
  • 打开单个槽位可:换商品(从背包选)、改价格(0 ~ 1,000,000)、枪械虚拟弹药(0 ~ 999,999)、分组 ID(-1 = 不分组)、挂监听模块
  • 改动先存草稿,点「保存」后服务端复核
  • 保存槽位会替换默认模板、重建该队现有玩家的商店状态并同步客户端 → 请在正式开赛前配好

监听模块

模块挂在某个槽位上,只在同一分组里的另一个槽位被买/退时触发。触发方向就是最常配错的地方:

想实现 模块挂哪
买 B 时自动退掉已买的 A returnGoodsA
买 A 时让 B 变成别的商品 changeItem_...B
买含头盔护甲时启用头盔属性 bulletproof_with_helmet 挂同组另一格护甲上

groupId = -1 不参与分组;命令的 group_id 只接受 ≥ 0,清除分组用图形编辑器。

内置模块

  • returnGoods:同组另一格被购买时,检查本格商品是否已买、还在背包且可退,可退则移除一件并退款。 ⚠️ 会先按新商品完整价格检查余额再退货:已有 650 护甲、要买 1000 头盔护甲,购买前仍需 ≥ 1000。
  • bulletproof_without_helmet:写入 100 点护甲耐久 + hasHelmet=false(身体吃甲、爆头不吃);同组退回时移除护甲属性。
  • bulletproof_with_helmet:写入 100 点护甲耐久 + hasHelmet=true(身体和爆头都吃甲)。
  • changeItem_...:动态换物(见下),默认注册示例 changeItem_minecraft_apple(苹果 50 → 金苹果 300)。
  • 其它扩展模块:服务器装的玩法模组注册什么就有什么,编辑器只显示名字。

完整示例:护甲 + 头盔升级(交叉挂载)

槽位 商品 价格 分组 模块
equipment 1 fpsmatch:bulletproof_armor 650 100 returnGoodsbulletproof_with_helmet
equipment 2 fpsmatch:bulletproof_with_helmet 1000 100 returnGoodsbulletproof_without_helmet
/fpsm map modify cs training team teams ct capability shop modify set equipment 1 item fpsmatch:bulletproof_armor
/fpsm map modify cs training team teams ct capability shop modify set equipment 1 cost 650
/fpsm map modify cs training team teams ct capability shop modify set equipment 1 group_id 100
/fpsm map modify cs training team teams ct capability shop modify set equipment 1 listener_module add returnGoods
/fpsm map modify cs training team teams ct capability shop modify set equipment 1 listener_module add bulletproof_with_helmet

/fpsm map modify cs training team teams ct capability shop modify set equipment 2 item fpsmatch:bulletproof_with_helmet
/fpsm map modify cs training team teams ct capability shop modify set equipment 2 cost 1000
/fpsm map modify cs training team teams ct capability shop modify set equipment 2 group_id 100
/fpsm map modify cs training team teams ct capability shop modify set equipment 2 listener_module add returnGoods
/fpsm map modify cs training team teams ct capability shop modify set equipment 2 listener_module add bulletproof_without_helmet

动态换物模块

创建(OP 2,玩家执行;默认商品放副手、换后商品放主手):

/fpsm listener_module add change_item_module <改变后价格> <默认价格>

例(副手苹果、主手金苹果):

/fpsm listener_module add change_item_module 300 50
  • 非枪械商品的名字来自默认商品 IDchangeItem_minecraft_apple
  • 换后商品是枪械时,名字用换后枪械 ID(如 changeItem_example_rifle
  • 同名再次创建会覆盖旧定义
  • 配好后:触发槽位与目标槽位同分组合 → 模块挂到目标槽位 → 买触发槽位时目标槽位换物换价,退回则恢复 → /fpsm save

顺序与重置

同槽位多模块按优先级执行:returnGoods = 5、changeItem_... = 1、护甲模块 = 0;同优先级按挂载顺序。商店重置会恢复价格/购买次数/锁定状态并调用模块重置(换物模块恢复默认商品与价格)。

常见问题

  • 列表里没模块:模块来自服务器注册表;第三方模块缺失 = 提供它的模组没装/版本不匹配/注册失败;动态换物要先创建再重开编辑器
  • 买了没反应:两格 groupId 是否相同的非负数、模块是否挂另一格
  • 没自动退货:商品已丢弃/消耗/被锁定,或没满足新商品完整价格
  • 保存提示模块无效:重开槽位编辑器刷新目录;重名/空名/未注册/超过 64 个都会被拒

房间

地图选择界面既是玩家入口也是管理台:

/fpsm mapselect
  • 列表显示游戏类型、人数、状态、加入条件,可按状态/类型筛选
  • 进详情的页面会持续订阅该房间状态,不用反复关开
  • 普通玩家:加入 / 离开 / 准备 / 允许的换队
  • 管理员额外看到:管理、邀请、设置、商店、区域、导入、比赛操作

管理动作(与命令一一对应):

界面 命令 作用
开始 debug start 调起玩法开始流程
重置 debug reset 恢复玩法定义的重置状态
新回合 debug new_round 请求下一回合
清理 debug cleanup 清运行状态与临时对象
调试 debug switch 切换地图调试模式
/fpsm map modify cs training debug start|new_round|reset|cleanup|switch
/fpsm map modify cs training team join <目标>      ← 不写目标 = 自己(命令方块/控制台不能用省略形式)
/fpsm map modify cs training team leave <目标>

改配置前的状态限制

区域、出生点和部分管理员编辑只在地图未开始时开放;要改空间先「重置」或「清理」让地图回到非运行状态。

工具

物品 ID 操作
地图创建工具 fpsmatch:map_creator_tool 左键设 Pos1 / 右键设 Pos2 / Ctrl+右键 开界面
复活点工具 fpsmatch:spawn_point_tool Ctrl+右键 开界面选类型/地图/队伍,右键地面方块加点位
对局配置工具 fpsmatch:match_config_tool 右键开界面,循环选类型/地图,逐项改设置
商店配置工具 fpsmatch:shop_config_tool 右键选类型/地图 → 进入该队商店编辑器
  • 工具只是服务端管理界面的便携入口,配置都存在地图数据里
  • 工具的选择状态存在物品自己的 NBT 里,复制工具会连选择一起复制
  • 工具没反应时:检查 OP 2 权限、服务器有无该游戏类型、地图是否缺能力、维度是否一致、比赛是否进行中——服务端会给出具体失败消息

资源

显示名

/fpsm map modify cs training settings set displayName 训练场
/fpsm map modify cs training settings save

展示名可含空格和中文,不会改变命令里的 training,也不会新建地图。

图标 / 背景

把图片放进(自己做的)资源包:

assets/my_maps/textures/gui/maps/training_icon.png
assets/my_maps/textures/gui/maps/training_background.png

然后填资源位置(不是文件路径、不是 URL):

/fpsm map modify cs training settings set iconTexture my_maps:textures/gui/maps/training_icon.png
/fpsm map modify cs training settings set backgroundTexture my_maps:textures/gui/maps/training_background.png
/fpsm map modify cs training settings save
  • 图标用于列表卡片,背景用于详情页;缺失或为空时客户端用按地图身份生成的色块
  • 缩略图与背景建议接近 16:9
  • 每个客户端都要能拿到资源(模组内置或服务器资源包);资源包 只改图片不用重建地图设置,但客户端要重载资源
  • displayName 是纯文本,不会自动解析翻译键

导入

详情页「管理 → 导入地图配置」可把同类地图的设置 / 商店 / 起始装备复制过来(支持已加载地图,也会扫描 FPSMatch 数据目录里的其它世界存档)。

  • 来源必须同游戏类型、不能是自己;历史存档还要求保存分组相符
  • 商店和起始装备按队伍内部名映射,同名且有相应能力才复制,映射不上的会跳过(消息里显示跳过数量)
  • 三类内容分别可勾选:地图设置 / 商店 / 起始装备(起始装备是整套替换,不是追加)
  • 不会复制:地图边界、维度、地图 ID、出生点、爆破区、结束传送点、世界建筑
  • 不能撤销;导入前先备份对应 FPSMatch 数据目录
  • 玩法版本升级后如果设置字段对不上,设置导入可能整体失败(要求目标每个设置都能从来源解析)

持久化

数据位置:

  • 地图数据:<游戏目录>/fpsmatch/<世界存档名>/
  • 地图区域、队伍、能力、玩家比赛数据都在这里;地图设置另有自己的 .cfg
  • 实际子目录名由注册该数据类型的模组决定 → 备份要整个世界目录一起备,别只挑一个 JSON
  • 全局数据:路径由 fpsmatch/config.jsonglobalDataPath 决定,默认 fpsmatch/global/

常用命令:

/fpsm save                    ← 写出所有已注册数据
/fpsm reload                  ← 发布重载事件(不是 /reload 的别名,不会重载 Java 模组)
/fpsm map modify cs training settings load

会自动保存的操作:地图创建、区域修改、出生点修改、配置导入、多种能力命令。settings set/reset 只改内存,要 settings save 才落盘。运行时别用外部程序直接覆盖同样的文件。

世界文件夹改名后 = 换了一套 FPSMatch 世界数据;想沿用旧配置,保留原目录供「导入」发现,或在停服状态下整体管理存档。

命令速查

地图管理命令默认要求 OP 等级 2。尖括号 = 必填,方括号 = 可省;类型/地图/队伍/设置/能力都由服务器动态补全。

# 帮助与全局
/fpsm help
/fpsm save
/fpsm reload

# 建图
/fpsm map create <游戏类型> <地图名> <from> <to>

# 队伍
/fpsm map modify <类型> <地图> team join [目标]
/fpsm map modify <类型> <地图> team leave [目标]
/fpsm map modify <类型> <地图> team teams <队伍> players <目标> <join|leave>
/fpsm map modify <类型> <地图> team teams spectator players <目标> <join|leave>

# 设置
/fpsm map modify <类型> <地图> settings list|get|set|save|load|reset

# 地图能力
/fpsm map modify <类型> <地图> capability demolition bomb_area add <from> <to>
/fpsm map modify <类型> <地图> capability demolition bomb_area display
/fpsm map modify <类型> <地图> capability match_end_teleport_point <pos>

# 队伍能力
/fpsm map modify <类型> <地图> team teams <队伍> capability spawnpoints add|clear
/fpsm map modify <类型> <地图> team teams <队伍> capability kits add [物品] [数量] | list | clear
/fpsm map modify <类型> <地图> team teams <队伍> capability shop initialize <类型> [初始资金]
/fpsm map modify <类型> <地图> team teams <队伍> capability shop info|reset|sync
/fpsm map modify <类型> <地图> team teams <队伍> capability shop areas add|display|clear
/fpsm map modify <类型> <地图> team teams <队伍> capability shop modify set <商店类型> <槽位> <参数…>

# 比赛管理
/fpsm map modify <类型> <地图> debug start|reset|new_round|cleanup|switch

# 模块与调试
/fpsm listener_module add change_item_module <改变后价格> <默认价格>
/fpsm debug
/fpsm tacz dummy <数量>

会随服务器注册内容变化,/fpsm help 为准

排错

症状 可能原因 怎么办
没有能建的地图类型 没装注册游戏类型的玩法模组 装玩法模组(如 BlockOffensive 的 cs
/fpsm map create 报「无效或未注册的游戏类型」 类型名写错 用补全
建图报「请先设置 Pos1/Pos2」 命令/工具两点没给全 给两个对角坐标
建图报重名 同类型下 ID 重复 换 ID
开不了局 队伍没有出生点 / 出生点不足 每队加 3~5 个落地可站的点位
出生点加不上 不在图内 / 脚下悬空 / 空间被占 / 有液体 / 维度不符 / 重复 换位置,或先修地图边界
包点加不上 超出地图区域 扩大地图区域,或挪包点
详情页没有「爆破区域」 该地图没有爆破能力 cs 类地图,或让玩法给能力
开不了商店 没进图 / 未开局 / 购买时间过期 / 离开购买区 / 玩法不支持商店 对应检查;购买区用 shop areas add
商店改了没变化 shop sync / 没 save sync/fpsm save
监听模块没反应 分组不同 / 模块挂错槽位 监听模块触发方向表
起始装备没发 玩法没在准备流程发 / 队伍没 kits 能力 检查队伍能力与玩法发放时点
房间界面不刷新 roomSync 关了 fpsmatch-server.tomlroomSync.*
改了配置不生效 没重启或没 /fpsm reload 重启或 reload
客户端连不上/握手失败 两端 FPSMatch 版本不同 换成同一份
启动崩 Missing mandatory dependencies 缺 Kotlin for Forge 或客户端缺 Modern UI 补齐;不要加 LDLib2
非 OP 也能看到地图选择按钮 配置允许 fpsmatch-server.toml 顶层 EnableMapSelectionButtonForNonOps = false

开服前 checklist

  • 依赖齐:Forge ≥ 47.4.10、Kotlin for Forge 4.11.0、客户端 Modern UI 1.20.1-3.12.0.1、TaCZ(可选);没装 LDLib2
  • /fpsm help 正常,玩法模组的游戏类型出现在补全里
  • 每队出生点 ≥ 3 个且都能站稳、朝向正确
  • 爆破区(包点)落在地图区域内、够高够盖地
  • 商店:initialize 过、购买区圈好、槽位与价格配好、监听模块方向正确、sync + /fpsm save
  • 测试过一局:debug start → 打完 → debug reset
  • 数据目录已备份(整个世界目录 + fpsmatch/global