1安装插件

两个 jar:LinuxAPP.jar 硬依赖 InTheNameOfLinux.jar —— 26.11.11 起 App 的服务端就是直接调 ITNOL 的 API,老版本 ITNOL 缺这些方法会报「服务器没有 ITNOL 插件」,所以两个必须一起换、版本对齐。AuthMe、经济插件、LinuxTeam、LinuxTitle 这些是接上就用,没接就少一块数据,不会报错。

  1. 把 LinuxAPP.jar 放进服务器的 plugins/ 目录。服务端用 Paper 或 Spigot 1.12.2,Java 8。
  2. 重启服务器。插件会自己生成配置和密钥,并在 49282 端口把接口开起来(默认监听 0.0.0.0,云服务器要能直连)。
  3. 看控制台的 [联动] 日志,确认 AuthMe、金币、点券、封禁、队伍、头衔都接上了。
  4. 在服务器本机执行 curl http://127.0.0.1:49282/api/health,能返回一串 JSON 就说明接口是活的;在手机浏览器里试 http://你的服务器IP:49282/api/health 能看到同样的 JSON,就说明安全组也放行了。

正常启动时控制台会依次打出这几行(装了什么就出现什么,没装的那一项不会打):

[LinuxAPP] Loading LinuxAPP v 26.13.3
[LinuxAPP] Enabling LinuxAPP v 26.13.3
[LinuxAPP] [联动] 已接上 AuthMe —— 用游戏密码登录
[LinuxAPP] [联动] 已接上 Vault 经济 —— 金币数据
[LinuxAPP] [联动] 已接上 PlayerPoints —— 点券数据
[LinuxAPP] [联动] 已接上 InTheNameOfLinux —— 封禁 / 解封
[LinuxAPP] [联动] 已接上 LinuxTeam 队伍(信息 / 建队 / 加入 / 退出 / 踢人 / 转让)
[LinuxAPP] [联动] 已接上 LinuxTitle 头衔(列表 / 佩戴)
[LinuxAPP] [联动] 已接上 ITNOL 禁言判定(App 里发聊天前会先查)
[LinuxAPP] [联动] 已接上 ITNOL 身份(只用来读身份,旧版本起不再要求 App 里二次验证)
[LinuxAPP] [联动] 已接上 ITNOL 举报(列表 / 提交 / 接受 / 驳回)
[LinuxAPP] [联动] 已接上 FakePlayerPlugin 假人(列表 / 召唤 / 移除)
[LinuxAPP] [联动] 已接上 XlandCore 身份(服主 / 副服主 / 市长 / 协管)
[LinuxAPP] [联动] 已接上 NalxerLink 1.24.0 —— 安卓客户端发的消息会进公屏,标「FS1安卓端」
[LinuxAPP] 接口已启动:http://0.0.0.0:49282/api/health(明文直连,手机里填 http://服务器IP:49282 就能用)
[LinuxAPP] LinuxAPP 已启用 —— 手机 App 接口就绪(AuthMe 登录:是,金币:是,点券:是,封禁:是,队伍:是,头衔:是)
[LinuxAPP] 聊天通道已开启 —— 游戏里说话会同步到 App,App 发的消息带 [LinuxAPP] 前缀广播进游戏
[LinuxAPP] 二次身份验证:关闭(旧版本起整套去掉,登录成功直接进主界面)
[LinuxAPP] 命令控制台 / su 名单:[Linux582021, fs1](不在名单里的管理员只能封禁 / 惩罚 / 处理举报 / 管假人)

哪一行结尾写的是「未检测到」,就是对应的插件没装、没启用或者版本不认识。那一项在 App 里会显示成 —,其余功能照常,不用为了一行日志去折腾服务器。

启动后生成的文件

没有子目录、没有数据库,就这几个文件:

plugins/LinuxAPP/
├── config.yml # 全部配置;token.secret 也写在这个文件里
├── stats.yml # 离线玩家的数据缓存(金币 / 点券 / 等级 / 时长)
└── audit.log # 封禁 / 解封 / 登录的审计记录
⚠
默认就是公网直连,明文传输,心里有数就行 插件默认监听 0.0.0.0:49282,手机直接连 http://服务器IP:49282,不需要 Nginx。 代价是密码和令牌在公网上是明文(限流、令牌签名、审计都还在)。想加密有两条路: 前面挂 Nginx(见 Nginx 反代),或者开 http.tls: true 让插件自己上 HTTPS (见本节末尾)。
ℹ️
服务器是离线模式也没关系 登录校验走的是 AuthMe 的账号数据,和正版验证无关。只要玩家在 AuthMe 里注册过,就能用游戏 ID + 游戏密码登录 App。

2配置

全部配置都在一个 config.yml 里,改完执行 /nalxerapp reload 就生效,不用重启服务器。

键默认值说明
http.host0.0.0.0监听地址。0.0.0.0 = 所有网卡(手机才能直连);只想让本机 Nginx 转发就写 127.0.0.1。
http.port49282接口端口。改了记得同步改 Nginx 里的 proxy_pass,两边要对得上。
http.threads8处理请求的线程数。几十个人的服 8 个足够,没必要往上加。
http.tlsfalse插件自带 HTTPS 的总开关。开了就不用在前面挂 Nginx,地址直接写 https://域名:49282。
http.keystorekeystore.p12证书文件(PKCS12),放在 plugins/LinuxAPP/ 下。
http.keystore-password空p12 的密码,开了 tls 就不能留空。
token.secret""令牌签名密钥。留空会自动生成一串随机值写回配置;换掉它等于所有人重新登录一次。
token.ttl-hours168令牌有效期(小时)。168 = 7 天,过期的令牌直接返回 401。
login.require-authmetruetrue = 登录必须通过 AuthMe 校验游戏密码(推荐);false = 不校验密码,只放行此刻在游戏里在线的玩家,给正版服 / 没装 AuthMe 的服用。关掉它之后,知道别人 ID 的人可以在对方在线时登进去,别在装了 AuthMe 的服上关。
login.attempts-per-minute5每个 IP 每分钟允许几次登录尝试。这是防撞库的第一道闸。
login.requests-per-minute180每个 IP 每分钟允许多少次请求(所有接口合计)。App 自动刷新 30 秒一次,180 有富余。
admin.players[]管理员名单,填游戏 ID。名单里的人能看到玩家管理页;服务器 OP 自动算管理员,不用重复填。
data.*全 true某一项数据要不要对外提供(coins / points / level / playtime / team / title)。关掉哪一项,App 里对应的那一块就显示 —,接口也不返回。
verify.enabledtrue1.4.1 的 Linux 身份验证总开关。开着时,verify.players 里的账号登录 App 后要先输一次 ITNOL 密码,验完才能用其它功能。
verify.players[Linux582021, fs1]哪些账号要二次验证。留空就退回「插件里那个受保护账号」。
su.players[Linux582021, fs1]能碰「命令控制台」和「su(任意命令)」的账号。不在这份名单里的管理员照样能封禁 / 惩罚 / 处理举报 / 管假人,但命令控制台直接返回 403。App 设置里还要再打开「启用 su 控制台」开关才看得见入口。
chat.capture-linktrue26.11.14:把 logs/latest.log 里 [App] 名字: 内容 这种广播收进 App 公屏,标「FS1安卓端」。
chat.link-speakers[app]认哪些方括号前缀是「安卓端发来的聊天」。默认 app(NalxerLink 的广播前缀);也可以写 fs1、nalxerlink。
features.*全 true1.3.0 起的功能开关:chat / team / titles / checkin / report / penalty / fakes / console。关掉后对应接口直接返回 403,App 里那一页也不再出现。
debugfalse打开后每个请求都往控制台打一行(路径、耗时、来源 IP),排查连不上时用,平时关着。

一份改过的配置长这样

http:
host: 0.0.0.0 # 直连要 0.0.0.0;只走本机 Nginx 就 127.0.0.1
port: 49282
threads: 8
token:
secret: "" # 留空,首次启动自动生成
ttl-hours: 168 # 7 天
login:
require-authme: true
attempts-per-minute: 5
requests-per-minute: 180
admin:
players:
- Linux582021
- Steve

存盘之后执行 /nalxerapp reload。配置写错(缩进错、键名拼错)插件不会崩,会在控制台打一行黄色警告并且继续用旧配置跑。

ℹ️
reload 不会把谁踢下线 只有改了 token.secret,已经发出去的令牌才会立刻失效 —— 因为签名换了,旧令牌验不过。改端口、改限流、改管理员名单都不影响已登录的人。
⚠
token.secret 别提交进 Git 这个密钥是签令牌用的,泄露了别人就能自己伪造一个「已登录」的令牌。仓库里放的是空的 config.yml, 线上那个文件用 .gitignore 排除掉。

3Nginx 反代

直连已经能用(http://服务器IP:49282),这一节是给「想要 https、想要域名」的人准备的:Nginx 转一次,顺便把 http 跳 https 一起做了。

server {
listen 80;
server_name api.nalxer.top;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl http2;
server_name api.nalxer.top;
ssl_certificate /etc/letsencrypt/live/api.nalxer.top/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/api.nalxer.top/privkey.pem;
location /api/ {
proxy_pass http://127.0.0.1:49282;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_read_timeout 15s;
}
}

证书路径按你自己的改,用 certbot --nginx -d api.nalxer.top 签的话它长这样。proxy_pass 后面是纯地址,不要再拼一个 /api/,拼了会把路径再叠一遍,变成 /api/api/login。

改完先 nginx -t 看语法,再 systemctl reload nginx。然后本机验一下: curl -I https://api.nalxer.top/api/health,返回 200 就通了。

⚠
一定要传 X-Real-IP,否则限流会把所有人算成一个 IP 插件看到的来源地址是 Nginx 的 127.0.0.1。少了这一行,全服所有玩家在限流眼里是同一个人: 一个人连续输错 5 次密码,所有人接下来一分钟都登不上,日志里也全是 127.0.0.1,出了问题根本没法查是谁。
ℹ️
前面还有 Cloudflare 怎么办 Nginx 拿到的 $remote_addr 会是 Cloudflare 的节点 IP。要么让 Nginx 认 CF-Connecting-IP, 要么在插件前面就别加这一层 —— 加一层就得配一次真实 IP,多一层就多一个「限流算错人」的机会。

不想挂 Nginx:让插件自己上 HTTPS

服务器上就这一个服务、又懒得维护 Nginx 的话,插件内置了 HTTPS(Java 自带 HttpsServer,没有额外依赖)。 把 certbot 签的证书转成 PKCS12 丢进插件目录就行:

# 1. 证书转 PKCS12
openssl pkcs12 -export -out keystore.p12 \
-inkey /etc/letsencrypt/live/api.nalxer.top/privkey.pem \
-in /etc/letsencrypt/live/api.nalxer.top/fullchain.pem \
-passout pass:你的密码
# 2. 放进插件目录
cp keystore.p12 plugins/LinuxAPP/
http:
port: 49282
tls: true
keystore: keystore.p12
keystore-password: '你的密码'

重启后控制台会打 接口已启动:https://0.0.0.0:49282/api/health(插件自带 TLS,证书来自 keystore.p12), App 里地址填 https://你的域名:49282。

⚠
证书得和域名对得上,用 IP 直连手机不认 自签证书或者「证书是 api.nalxer.top、App 里却填 IP」都会在手机上直接报证书错误。 换证书要重启服务器;tls: true 但 p12 缺失或密码错时,插件打一条警告后退回普通 HTTP,不会起不来。

4接口表

一共 16 个普通接口 + 13 个管理员接口,除了 health 和 login,其它都要在请求头里带 Authorization: Bearer <token>。

方法路径要令牌说明
GET/api/health否返回版本、监听地址和 capabilities(哪些插件接上了)。连不上、数据全是 0,第一个要看的就是它。
POST/api/login否body 传 name + password,校验通过返回 token 和过期时间。
GET/api/me是当前登录玩家的完整数据,App 的「我的」页只靠这个接口。字段见下一节。
GET/api/me?name=Steve是管理员查别人的数据。普通玩家查别人会拿到 403,查自己不带参数就行。
GET/api/online是在线人数和在线玩家名单(名字 + 延迟)。
GET/api/players是在线玩家列表:名字 / 等级 / 延迟 / 世界 / 队伍 / 头衔,最多 200 条。
GET/api/chat?since=0是聊天记录(环形缓冲 120 条),参数 since 是上一条的 id,只回新的。
POST/api/chat是发一条聊天,body:message(最多 200 字)。被禁言会返回 403。
GET/api/team是我的队伍(成员、队长、队标)+ 全部队伍列表。
POST/api/team是队伍操作,body:action(create / join / leave / kick / disband / transfer)+ arg。
GET/api/titles是头衔总览:当前佩戴、已解锁数量、全部头衔 + 解锁条件。
POST/api/titles是佩戴 / 卸下,body:id(传空串是卸下)。
GET/api/checkin是签到状态:今天签没签、连续多少天、累计多少天、下次重置时间(北京时间 0 点)。
POST/api/checkin是签今天的到。返回 reward(5000 金币 / N 点券);当天重复调用返回 400 和「今天已经签过了」。
GET/api/reports是我提交过的举报 + 处理结果。
POST/api/report是举报别人,body:target / reason。返回举报编号。
GET/api/admin/linux是Linux 系插件清单:名字 / 版本 / 是否运行 / config.yml 大小 / 目录里的文件。需要管理员。
GET/api/admin/linux/config?name=LinuxTAB是读这个插件的 config.yml 原文,App 里直接改。
POST/api/admin/linux/config是保存配置:body {name,text}。先做 YAML 语法检查,过了才写盘 + 重载,旧文件留 config.yml.app-bak。
POST/api/admin/linux/op是启停重载:body {name,op:enable|disable|reload}。
GET/api/admin/status是插件联动状态(11 个插件 + 8 个功能开关),App 设置页那张状态表就是它。
GET/api/admin/players?q=st是在线 + 离线一起搜(离线名字来自 ITNOL 的历史记录),最多 60 条。
GET/api/admin/player?name=Steve是单个玩家详情:数据 + 他身上生效的惩罚 + 举报记录。
GET/api/admin/penalties是当前所有惩罚记录(禁言 / 移动 / 方块 / 封禁)。
POST/api/admin/penalty是op=apply|release,apply 传 type / name / minutes / reason。
GET/api/admin/reports?pending=1是举报列表,pending=1 只看没处理的。
POST/api/admin/report是处理举报:op=accept|reject + id + note。
GET/api/admin/fakes是假人列表:名字 / UUID / 世界 / 是否活跃 / 坐标。
POST/api/admin/fake是op=add|remove。召唤要求本人正在游戏里(假人要站在你脚下)。
GET/api/admin/commands是命令白名单 + 分组清单,App 的「服务器命令」页靠它渲染。
POST/api/admin/exec是执行一条白名单命令,body:command。返回真实回显,最多 40 行。
POST/api/admin/su是1.7.0 的 su:验证过 Linux 身份后执行任意命令(不走白名单,stop / restart 仍然拦),body:command。
GET/api/admin/search?q=st是按名字模糊搜玩家,最多 30 条,每条带 name / online / banned。需要管理员。
GET/api/admin/bans是当前生效的封禁列表,带原因和到期时间。需要管理员。
POST/api/admin/ban是封禁,body:name / reason / minutes。需要管理员。
POST/api/admin/unban是解封,body:name。需要管理员。

手动试一次登录

curl -X POST https://api.nalxer.top/api/login \
-H "Content-Type: application/json" \
-d '{"name":"Steve","password":"你的游戏密码"}'
# 返回
{"ok":true,"token":"eyJhbGciOi...","name":"Steve","admin":false,"expiresIn":604800}

拿到 token 之后可以接着试:

curl https://api.nalxer.top/api/me \
-H "Authorization: Bearer eyJhbGciOi..."
ℹ️
会碰到的状态码 200 成功、400 参数不对、401 令牌没有或过期(重新登录)、 403 令牌是好的但你没有管理员权限、404 路径写错了、 429 触发限流(等一分钟,不用改配置)、5xx 服务端执行失败(消息里会写原因,比如玩家不存在)。

5数据字段

/api/me 返回一个 JSON 对象,App 的每一块显示都对应其中几个。下面挑常用的写,加粗的是 1.2.0 新增的。

字段类型说明
namestring游戏 ID,就是登录时填的那个名字。
uuidstring玩家 UUID,带连字符的完整形式。
onlineboolean现在是否在线。离线也能拿到数据,只是这个字段是 false。
coinsnumber金币数量。没装经济插件时是 0,要靠 hasCoins 判断该不该显示。
hasCoinsboolean服务端有没有接上金币来源。false 时 App 显示「—」而不是 0。
pointsnumber点券数量,同理。
hasPointsboolean服务端有没有接上点券来源。
levelnumber玩家等级。1.2.0 起离线时也读真实存档(world/playerdata/<uuid>.dat 的 NBT),不再是 0。
expnumber当前这一级已经攒的经验,用于画进度条。
totalExpnumber从 0 级算起的总经验,不掉级就只增不减。
levelLivenumber实时等级,含经验条上那点还没存盘的进度。
expIntoLevelnumber当前这一级已经攒的经验(和 exp 同义,App 用它算进度百分比)。
expToNextnumber升到下一级要多少经验(1.12.2 公式:2L+7 / 5L-38 / 9L-158)。
identityobject玩家身份(来自 XlandCore):{role, label, prefix, roles, hasXland},label 是「服主 / 副服主 / 市长 / 协管 / 管理员 / 普通玩家」。
rolestring上面那个 label 的简写,省得 App 再拆一层。
teamTagstring队伍标识(队标)带色码,没队伍是空串。
titleId / titleNamestring头衔 id 和干净名字,没戴头衔是空串。
mutedboolean是否被 ITNOL 禁言(App 发聊天前会看它)。
health / maxHealth / foodnumber在线时的生命、血量上限、饥饿值。
gamemode / world / pingstring / string / number游戏模式、所在世界、延迟(毫秒)。
banUntilnumber封禁到期时间戳(毫秒),永久封禁是 0。
playtimeHoursnumber累计在线小时数,保留一位小数。
firstPlayedstring第一次进服时间,ISO 8601 格式。
lastPlayedstring最近一次进服时间,同样 ISO 8601。
teamstringLinuxTeam 队伍名。没队伍是空字符串,App 显示「无队伍」。
titlestringLinuxTitle 头衔。没头衔是空字符串。
bannedboolean当前是否处于封禁状态。被封的人也能登录 App 看自己的状态。
banReasonstring封禁原因。没封禁是空字符串。
ℹ️
离线为什么也能看到等级 1.2.0 起离线玩家的等级直接从 world/playerdata/<uuid>.dat 的 NBT 里读, 不再依赖「上次有人在线时缓存下来的值」,所以挂机号、退服很久的人也能看到真实等级。levelLive 只是标记这次读数是不是实时的。
⚠
别拿 coins: 0 直接当「没钱」 判断有没有这个数据源看 hasCoins。只读 coins 的话,没装经济插件的服务器上每个人看起来都是穷光蛋。

6App 使用

普通玩家五个页签:我的(数据 + 签到)、聊天(公屏 + 队伍频道 + 队伍管理)、头衔、更多(在线玩家 / 设置)。管理员会多一个管理页签,里面分「玩家 / 举报 / 惩罚 / 假人 / 命令」五块。

1.4.0 把原来单独的「队伍」「命令」两页合了进来:队伍相关全在聊天页,命令在管理页的最后一个子标签里。

每日签到

「我的」页顶部那张卡就是签到:点一下领奖励,50% 是 5000 金币,剩下的是 1–5 点券。 每天北京时间 0 点重置。

  • 连续签到天数会累加,断一天就从 1 重新算;累计天数永远只增不减。
  • 当天签过按钮变「已签到」,再点会被服务端挡回来(`400`)。
  • 奖励真的进游戏账户,下线也算数 —— 走的是 Vault 和 PlayerPoints。

装到手机上

两个平台给的包不一样,别装错:

平台文件怎么装
安卓LinuxAPP-26.13.3.apk(约 3.34 MB)传到手机点开装;系统提示「未知来源」时给浏览器一次安装权限
iOSLinuxAPP-26.13.3-unsigned.ipa(约 1.17 MB)电脑装 Sideloadly,插上 iPhone,把 ipa 拖进去、填 Apple ID、点 Start

iOS 这个 ipa 是在 macOS 上编出来的真机包,没有签名 —— 苹果不允许未签名的 App 在手机上跑, 所以要用你自己的 Apple ID 重签一次。Sideloadly 在 Windows 和 Mac 上都能用,全程不用越狱。

⚠
免费 Apple ID 签的 App 7 天到期 到期后图标点不开,用 Sideloadly 再签一次就行 —— 游戏数据、App 里的登录状态都还在。 想省这个麻烦就买开发者账号(一年),签一次能用一年。

第一次登录

先填接口地址(https://api.nalxer.top,不要带 /api 后缀),再填游戏 ID 和游戏密码。 这里的密码就是进服用的那个 AuthMe 密码,不是邮箱密码、也不是论坛账号。

登录成功会拿到一个令牌,默认 7 天有效。这 7 天里打开 App 不用再输密码;令牌过期会回到登录页,重新登一次即可。

「我的」页看什么

从上到下一屏:在线状态 → 金币 / 点券 / 等级三张卡 → 经验进度条 → 队伍和头衔 → 累计在线时长和最近一次上线时间。 被封禁的账号在最上面多一条红色横幅,写着原因和到期时间。

「聊天」页怎么用

游戏里公屏说的每句话都会同步到这里(带 · 游戏 标记),在 App 里发的消息会以 [LinuxAPP] 你的名字:内容 的格式广播回服务器,游戏里的人能看见。30 秒自动拉一次新消息,有未读时底部页签上会出现小红点。

队伍频道(1.4.0)

聊天页顶部有「世界 / 队伍」两个小按钮。点「队伍」就只看队内消息:发出去的话只有队友看得到,游戏里也会以 [队伍] 队标 名字 » 内容 的样子出现。

  • 一个人在几个队里时,队伍频道下面会多出一排队名,点哪个看哪个、发到哪个。
  • 队伍管理也在这一页:成员、贡献、退出、踢人、转让、解散、建队、加入,都在聊天记录下面。
  • 队长把队伍聊天关了(/team setting chat off),App 这边发会被挡回来。

发不出去通常就两个原因:被 ITNOL 禁言了(返回「你被禁言了,现在不能在服务器说话」),或者单条超过 200 字。

ℹ️
控制台 / RCON 的 say 也会进来(1.3.1) 服务器控制台敲 say 今晚八点维护、面板用 RCON 发播报,都会以「控制台」的身份出现在聊天里。 万一你那边的面板走的是别的派发方式,插件还会盯 logs/latest.log 里 [Server] / [Rcon] / [CONSOLE] 开头的播报行兜底 (chat.capture-log,默认开)。同一句话不会重复出现。

FS1 安卓端(NalxerLink)发的消息也能看见(26.11.14)

如果服务器上装了 NalxerLink(给安卓客户端用的登录 / 聊天接口),那边发的聊天会以 [App] 用户名: 内容 的形式广播到控制台。这里的用户名就是对方在 FS1 安卓客户端登录时 填的那个账号(比如 Linux582021),不是固定的「FS1玩家」字样。LinuxAPP 会把这行认出来, 原样用这个用户名进 App 的「世界」频道,后面标 · FS1安卓端——一眼能分清是 游戏里 说的、 LinuxAPP 发的、还是 FS1 安卓端 发的。显示形如:Linux582021 · 23:59 · FS1安卓端。

  • 开关:chat.capture-link,默认 true;关掉就不再读这类广播。
  • 前缀名单:chat.link-speakers,默认 [app]。别的客户端广播前缀不是 [App] 的话,把它加进这个列表。
  • 实现方式:只读 logs/latest.log,不碰 NalxerLink 本身,那个插件怎么升级都行。

在 App 里管 Linux 系插件(1.7.0)

设置页最下面一张「Linux 系插件」卡,点进去就是列表:每个插件一行,写清楚版本、有没有 config.yml、目录里还有哪些文件。

  • 停用 / 启用:直接 disablePlugin,停用后服务器立刻不再跑它(被别的插件依赖会失败并告诉你)。
  • 重载配置:等于 reloadConfig()。
  • 改配置:把 config.yml 原文读出来,在手机上改完点「保存并重载」。保存前先跑一遍 YAML 语法检查,写错了不落盘、原文还能继续改;成功会留一份 config.yml.app-bak。
列的是自家插件:名字以 Linux 开头的(LinuxACE / LinuxChestGUI / LinuxSync / LinuxTAB / LinuxTeam / LinuxTitle)加上假人插件 FakePlayerPlugin;插件联动状态那张表也只显示这些。

「队伍」页怎么用

没队伍时给的是「建队」按钮和全服队伍列表,点一个就能申请加入;有队伍时显示队长、队标、成员(在线的人名是亮的),队长能踢人 / 转让 / 解散,队员只能退出。所有操作直接调 LinuxTeam,和游戏里 /team 命令是同一套数据。

ℹ️
队伍操作要人先进服 LinuxTeam 的部分操作需要在线玩家对象,人在线时最好用。离线时点建队会提示「队伍操作要先进服」,这是正常的。
ℹ️
一个人可以在好几个队里(1.3.1) LinuxTeam 支持多队,App 现在按「我所在的全部队伍」一张张列出来,每张卡有自己的退出 / 解散按钮。

「头衔」页怎么用

顶上是你现在戴的头衔(右边有「卸下」),下面是全部头衔和它们的解锁条件 —— 条件都翻成了人话:「今日在线 12 小时」「挖矿 99999 次」「管理员发放」「节日活动」。已解锁的点一下就能戴上,进服或重新进服后会在名字前面显示。

ℹ️
离线也能看到自己戴的头衔(1.3.1) 以前这块要走玩家对象,人不在线就读不出来 —— 明明戴着却显示「没有」。 现在直接读 LinuxTitle 的存档(active id + titles.yml),离线也在。 另外解锁判断统一按小写比,titles.yml 里 id 写成大写也认。

管理页怎么封人

只有 admin.players 名单里的人或者 OP 才看得到这个入口。流程是五步,一步都不能少:

  1. 进管理页,在搜索框里打一部分名字(打 st 就能搜到 Steve),等结果出来。
  2. 点一下要处理的那个玩家,选中之后底部才会亮出操作栏。
  3. 点「封禁」,填原因 —— 这一栏建议写清楚,玩家在 App 里看到的就是它。
  4. 选时长:1 小时 / 1 天 / 7 天 / 30 天 / 永久。
  5. 再点一次「确认封禁」。在线的人会被当场踢下线,封禁立刻生效,同时写一条审计日志。

解封在同一个页面:admin/bans 列表里点开那条封禁,点「解封」就行,不用填原因。

刷新和设置

  • 「我的」页每 30 秒自动刷一次,下拉也能立刻刷。
  • 设置页可以改接口地址(换服务器用)、清掉本地令牌(等于退出登录)、看 App 版本号。
  • 退出登录只删手机上的令牌,不影响游戏账号,也不影响别人。
ℹ️
离线也能看,只是数字不涨 人不在线时 App 照样能登录、照样显示上次存盘的数据,只有「在线状态」是灰的。 在线时长、经验这些要等下次进服才会更新。

726.13.3 更新说明

26.13.3 这一版有两件事:队伍能共享领地了,插件也改名成 LinuxAPP 了。

  • 队伍「领地共享」:队伍卡片里,「队伍申请」下面多了一个开关。打开后,队长和每个队员名下的 Residence 领地会对全队开放 17 项基础权限(建造、破坏、使用、容器、按钮、拉杆、中继器、门、压力板、音符盒、附魔、酿造、铁砧、蛋糕、龙蛋、床、工作台);关掉就把这些权限收回。有人入队、退队、被踢,都会自动补上或收回。
  • 必须先开「队伍申请」:没开进队验证时,这个开关是灰的,点不动,下面写着「需要先打开上面的「队伍申请」」。这样不会出现「谁都能进队、顺手把领地也交出去」。
  • 插件改名 LinuxAPP:jar 从 LinuxAPP.jar 改成 LinuxAPP.jar,命令用 /linuxapp(/nalxerapp 也还能用)。第一次启动会自动把 plugins/LinuxAPP 里的配置、登录记录、队伍申请搬到 plugins/LinuxAPP,旧的不用手动删。
  • 装两个 jar 才完整:LinuxAPP.jar + InTheNameOfLinux.jar 一起放进 plugins。LinuxAPP 硬依赖 ITNOL,少了它不会启动。
  • 领地共享靠的是命令 + 存档:不直接调 Residence 的 Java 接口(它把 WorldGuard / Kingdoms 写进了类里,服务器没装就崩),改成读 plugins/Residence/Save/Worlds 找归属、用控制台 resadmin pset 改权限,所以服务器不需要额外装 WorldGuard。

此前版本要点:这一版加了主题(风格 + 颜色),把聊天的实时刷新彻底修好,并让 App 里做的操作在执行人一栏写成「APP端(用户名)」。

  • 动效:开屏动画、切页滑入(按底栏顺序决定方向)、顶栏标题淡入、底栏选中态过渡、弹窗淡入缩放;系统开了「减少动态效果」就自动关掉。
  • 分段控件:不再左右滑动,改成一整条带分隔线的合体按钮,条目多了换行、文字居中。
  • 管理页「在线」多了管理层名单:服主 / 副服主 / 管理员 / 协管,在不在线都列,按身份优先、同级在线优先;每行「详情」直接进玩家详情。
  • 保护对象不再假成功:对 ITNOL 的保护对象点禁言/禁移动/禁交互/全禁,现在会明确告诉你「ITNOL 会拦住这类惩罚」,不会再弹成功。
  • 玩家详情能返回了:以前点返回会被异步回来的请求又拽回详情页,现在不会。
  • iOS 风格 + 悬浮导航:主题里风格多了 iOS(卡片半透明液态玻璃、顶栏与弹窗毛玻璃、系统式分段控件);主题弹窗里还有「悬浮导航栏」开关,底栏会变成浮起来的一颗胶囊,iOS 风格默认开。
  • 分段控件圆角修好:以前按钮自己带圆角和投影,套在胶囊容器里圆角对不上、投影还会溢出来。现在容器统一裁切、按钮不再自带投影;条目多了横向滑动,不折行。
  • Miuix 布局:不只是配色,卡片内距、圆角、行高、按钮形状、页面边距都跟着 Miuix 走。
  • 默认落在「我的」:登录 / 重新登录 / 冷启动都从「我的」开始。
  • ITNOL 回到插件管理:InTheNameOfLinux 现在出现在「插件联动」和插件管理里,但它的配置、启停、重载只有 Linux582021 能用,别人看到的是灰按钮。
  • 主题:更多页 →「显示」→「主题」,点开是二级菜单。风格可选 默认 和 Miuix(大圆角、无边框卡片、胶囊按钮、浅底输入框);颜色可选 天蓝色 / 淡粉色 / 淡绿色 / 古董白 / 黑色 / 灰色,默认天蓝色,深色模式会自动换成对应的深色版本。选完立刻生效并记在本地。
  • 聊天实时刷新:服务端 /api/chat 原来返回的是全局最后一条消息的 id,游标会被别的频道推过去;重启后 id 又从 1 重来,旧游标就永远查不到新消息。现在返回本次实际最后一条的 id,并在游标跑飞时回 reset 让客户端重拉。App 里聊天页改成 2 秒一轮、8 秒卡死自愈、切到后台再回来立刻刷一次,每次切页也会重拉该页数据。
  • 只认 [APP] 日志:[NalxerLink] [Link] 有效 token:0 这种插件自身的运行日志不会再被当成玩家发言,只把 [APP] 玩家名:内容 当成 FS1 安卓端的消息。
  • 执行人写 APP端:从 App 里做的举报受理/驳回、禁言/禁止移动/禁止交互/全部禁止、封禁/解封,记录里的执行人是 APP端(用户名);在游戏里做的保持原样。
  • 队伍离线可用:人不在游戏里也能建队 / 加入 / 退出 / 踢人 / 转让 / 解散 —— 之前只要离线,所有队伍按钮都回一句「你现在不在游戏里」。
  • 队伍管理补齐:邀请、改队标、队伍聊天开关、转让队长、踢人、解散;多队玩家每张卡片上的按钮只对那一支队生效。
  • 举报筛选:全部 / 待处理 / 已处理,已处理的显示受理还是驳回、处理人和备注。
  • 玩家详情单独一页:搜索框里点「详情」直接进详情页,左上角有返回,不再挤在管理页下面。
  • 设置页分组:账号 / 显示 / 管理 / 接口地址 / 插件联动 / 关于软件 / 退出登录,版本号和作者只在「关于软件」和页面最底下出现一次。
  • 权限收紧:普通玩家看不到「改 Linux 系插件配置文件」的入口。
  • 26.11.14 NalxerLink 的安卓消息进公屏:装了 NalxerLink 的服务器,安卓客户端(FS1 安卓端)发的聊天会出现在 App 的「世界」频道,名字后面标「· FS1安卓端」,和游戏发言、App 发言一眼分清。只在服务端读日志,不改 NalxerLink;开关 chat.capture-link,前缀名单 chat.link-speakers。
  • 26.11.12 队伍 / 转账 / 聊天:加入队伍成功却弹「加入失败」已修(LinuxTeam 的 join 是 void,以前把 null 当 false);接上 NalxerECO 的转账,聊天输入框旁边多一个「转账」按钮,金币走 Vault、点券走 PlayerPoints,规则和税都沿用那个插件的实现;聊天重复显示修好(服务端 1.5 秒内同一句只存一次,App 端按消息 id 去重、请求串行,不再丢最新一条);有人上线/下线时公屏中间出现灰条提示;在线玩家点「管理」直接进详情页。
  • 26.11.11 硬依赖 ITNOL:举报 / 惩罚 / 封禁 / 身份验证以前靠反射猜方法名,线上 ITNOL 版本一对不上就报「服务器没有 ITNOL 插件」,已处理的举报也读不出来。现在 plugin.yml 写死 depend: [InTheNameOfLinux],代码直接调 ReportManager / LinuxPenalty / BanManager / LoginManager,缺插件直接不启动并说明原因。
  • 26.11.10 我的页加了举报:以前只有管理员能在管理页看举报,普通玩家既没地方提交、也看不到自己举报的结果。现在「我的」页有一张「举报玩家」卡:填 ID 和理由就能提交,下面按时间列出自己的举报,已处理的会写受理还是驳回、谁处理、备注是什么。
  • 26.11.9 补两处点击:队伍卡片上的按钮(邀请 / 改队标 / 队伍聊天开关 / 转让 / 踢人 / 解散 / 退出)之前按了没反应,是点击事件的匹配列表里漏了这几个按钮;玩家详情页里开惩罚提示「先选一个玩家」,是详情搬成独立页后还去旧位置找名字。
版本号的写法
从这里开始版本号跟服务端插件对齐,写成 26.11.x 这种「年份.月份.序号」,不再用 1.x。

26.11.22 队伍和聊天合成「社交」

  • 底栏变成:我的 / 社交 / 头衔 / 管理 / 更多,队伍不再是单独一页。
  • 社交页顶部的切换控件是三段:公屏 / 队伍频道 / 队伍;最后一段就是队伍管理(我的队伍、建队、服务器上的队伍)。
  • 切到「队伍」时聊天输入条会收起,整页只放队伍相关的内容。

26.11.28 消息提醒:提示音 + 振动 + 系统通知

  • 以前只有顶部弹窗,现在同时响提示音、振动一下(走系统原生的振动与音频,网页版退回浏览器能力)。
  • 停在聊天页也会弹,不再只在别的页面弹。
  • 新增两个开关:「软件内提醒」(弹窗 + 提示音 + 振动)和「软件外提醒」(退到后台推一条系统通知),各管各的。
  • 第一次打开会申请通知权限;拒绝后可以去系统设置里再打开。
  • Miuix 主题的圆角补回来了:选择控件是完整胶囊,输入框有圆角描边,卡片/弹窗/按钮都跟 Miuix 一致。

26.12.3 新图标 + iOS 12 定位修复

  • 换图标:蓝→紫对角渐变底 + 白色 N + 右下薄荷绿点,圆角与配色都重新调过;安卓同时出了自适应前景和圆形版。
  • iOS 12 的开屏动画、弹窗跑到左上角:根因是 CSS 里用了 inset: 0(iOS 14.1 才支持)和 100dvh(iOS 15.4 才支持),老 WebKit 直接丢掉这两条 → 全屏遮罩没有定位。 现在 top/right/bottom/left 与 100vh 都先写了一遍,老系统也认得。
  • 老系统兼容层再补一批:开屏内部、消息弹窗、弹窗卡片之间用外边距补 flex gap;.splash / .modal 再兜一次四方向和宽高。
  • iOS 12 包的版本号改成读 $(MARKETING_VERSION),CI 传什么就是什么,不会再出现「包里写着旧版本」。

26.12.4 新图标:白底蓝标

  • 图标换成白底 + 极淡网格 + 蓝色渐变 N(右下蓝点),跟系统里一堆彩色图标放在一起更清爽,也更好认。
  • iOS 12 那个包之前用的是 Capacitor 框架的默认图标(白底蓝色叉),现在和正式版统一,都是自己的 N。
  • 安卓同步换了方形 / 圆形 / 自适应前景三套资源。

26.12.6 协管权限 / 单设备登录 / 开屏图标 / iOS 12 输入条

  • 协管有权限了:XlandCore 的 moderators 名单、config.yml 里新加的 admin.moderators、或游戏里带 nalxerapp.moderator 权限的人,登录后角色是 moderator,底栏出现「管理」,但只有「在线 / 玩家 / 举报 / 惩罚」四格。
  • 协管能做的:看在线列表和管理层名单、查玩家详情、处理举报、禁言 / 解除禁言。封禁、禁止移动、禁止交互、全部惩罚、假人、插件配置、su 控制台一律 403,文案直接说「协管只能禁言」。
  • 一个账号同时只能在一台设备登录:第二台会提示「已经在另一台设备上登录了,请先在那边退出登录」;原设备点「退出登录」后马上可以换机。原设备还开着的话,下一次请求会收到「已经在另一台设备登录」并被登出。
  • 手机丢了或重装了:登录时确认「踢掉那台设备」就能顶掉旧会话(takeover),不必等旧机操作。
  • 开屏和登录页的图标换成框架那张图,和桌面上一致。
  • iOS 12 的聊天输入栏以前会跟着页面滚走,现在老系统单独走 position: fixed,钉在底栏上方。

26.12.5 图标:回到白底蓝叉

  • 图标按你的要求换成 Capacitor 框架自带的那张(白底 + 淡对角网格 + 蓝色交叉标),iOS 用框架原图逐字节替换。
  • 安卓由 1024 主图缩放生成方 / 圆 / 自适应三套,背景色改成白色,自适应前景缩进 66% 安全区。
  • iOS 12 分支同步换成同一张,两个包图标一致。

装 ipa 报「Application is missing the application-identifier entitlement」

  • 这句话的意思是:这个包装进去的时候没有带 application-identifier 这个授权项,不是包坏了,是「没签名 / 签名没注入授权」。
  • 三条路,任选一条:
    · 先签名再装:全能签里不要点「安装」,走「签名」→ 选证书 → 签完再装;
    · 用电脑签:Sideloadly / AltStore 登 Apple ID 重签,最稳;
    · 直接用 ad-hoc 版:下载页那两个「装不上?用 ad-hoc 版」,包里已经用 codesign --sign - 写入了 application-identifier 与 _CodeSignature,TrollStore 这类只认授权的安装器可以直接装。
  • ad-hoc 版没有开发者证书,越狱/TrollStore 之外的普通机器仍然要用证书重签一次才能启动,这点和未签名版一样。
  • 如果重签后还是报同样的错,换一个 Bundle ID(比如 top.nalxer.app2)再签,多半是和已装的旧包冲突。

iOS 12 老系统版(26.12.2 起)

  • 下载页多了一个 Nalxer-26.12.6-ios12-unsigned.ipa,最低 iOS 12.0,给 iPhone 6 / 6 Plus / 5s / iPad 4 这类老机器用。
  • 它用的是 Capacitor 3.9.0(新版框架最低要 iOS 13),前端和主版本是同一套 mobile/www,功能没有删减。
  • 包体约 16.0 MB,因为 Swift 运行库一起打进去了;新系统版仍是 1.12 MB。
  • 老系统的 WebKit 没有 flex gap,包里带 legacy.js / legacy.css:检测到不支持就自动用外边距补间距,并把 -webkit-sticky、惯性滚动补上。
  • 32 位设备(armv7)最高只能到 iOS 10,现代 Xcode 已经不支持,所以这条线到头是 iOS 12 + arm64。
  • 自己编:mobile-ios12/ 是独立工程,macOS 上 bash build-ios12.sh 26.12.6 直接出包。

26.12.2 登录页「测试连接」:自己签名的 App 连不上时先看这里

  • 登录按钮下面多了一个「测试连接」,只请求 /api/health,不用账号密码。
  • 成功会显示 HTTP 200,服务端版本 x.y.z;失败会把原始错误原样贴出来。
  • 常见三种原因会自动附上建议:
    · ATS:重签名工具(全能签等)重写了 Info.plist,把 http 访问拦掉了 —— 重签时不要勾「修改 Info.plist」,或换回我们给的未签名 ipa 再签;
    · Load failed:先在 Safari 打开同一个地址,能看到 JSON 就说明网络没问题、是签名包被限制了 http;
    · 超时:地址写错、端口没放行、或服务器只在内网。
  • iOS 端 Info.plist 补了 NSLocalNetworkUsageDescription 与 NSBonjourServices,连局域网服务器时会弹权限说明。

26.12.1 正式版 公屏上下线带时间

  • 公屏里「XX 上线了 / XX 下线了」后面带上时间,例如「TabCheck 上线了 · 01:20」。
  • 提示保持居中灰条,和微信「消息已撤回」一样,不占聊天气泡的位置。
  • 这个版本作为 26.12.6 正式版发布。

26.11.36 队伍页彻底不跟随滚动

  • 只有「公屏」「队伍频道」会跟着消息滚到底,「队伍」页完全不跟随。
  • 切到「队伍」时会回到页面顶部,从队伍卡片第一行开始看,不会被上一页的滚动位置带跑。

26.11.35 队伍页不再被拉到底

  • 只有「公屏」和「队伍频道」会跟着消息自动滚到底。
  • 「队伍」页保持你当前的位置,来消息也不会把你拽走,方便看队伍和申请。

26.11.34 发消息 / 来消息直接拉到底

  • 发完消息、收到新消息都直接把聊天拉到最后,不再做「刚好露出一条」的定位。
  • 进聊天页、切频道同样落在最底部。

26.11.33 聊天自动跟到最新一条

  • 自己发完消息,列表自动滚到底,不用再手动往下拉。
  • 别人发来消息也自动跟过去,保证最新那条露在输入框上方,不会被挡住。
  • 切频道、重新进聊天页同样会停在最新的位置。

26.11.32 提醒更聪明:哪页都能收到

  • 以前只有聊天页才会提醒,现在任何页面收到别人的新消息都会提示(每 4 秒查一次)。
  • 在聊天页只出声、只震动,不再弹卡片挡住消息;在别的页面才弹顶部卡片。
  • 顶部卡片会避开灵动岛 / 刘海(跟着系统安全区下移),不会再被挡掉。

26.11.31 队伍频道会跟着开关消失 / 大数字带单位

  • 队长把某个队的队伍聊天关掉后,聊天页顶部的「队伍频道」如果没别的队能用,整段就不显示了;正在队伍频道的话会自己回到公屏。
  • 队伍频道里多个队的切换条,也会把关了聊天的队过滤掉。
  • 所有开关(深色模式、软件内/外提醒、队伍三个开关)都加了滑动过渡,点下去是滑过去的,不是瞬间跳。
  • 金币、点券带单位了:1000 → 1K,一百万 → 1M,十亿 → 1B,再往上还有 T / Q。转账弹窗里的余额也一起改了。

26.11.30 队伍申请与队长审批

  • 队伍页多了一排开关:队伍聊天、队伍伤害、队伍申请,队长点一下就能改,非队长只能看。
  • 「队伍申请」打开后,这个队就不再直接进:别人点「申请加入」,队长的队伍卡片上会出现「加入申请 N 条」,可以逐条同意或拒绝。
  • 公开队照旧一键加入,没有申请这一步;服务器队伍列表里,需要申请的队伍排在最前面,按钮写「申请加入」,还带一个「需申请」标签。
  • 同意时如果对方不在线,也照样批准 —— 他下次进服就在队里了。

26.11.29 提醒更靠谱、名字不分大小写

  • 消息提醒只在真的来了新消息时出现,点来点去不会再重复弹旧消息;软件内提醒弹 2 秒。
  • 提醒带提示音与震动(系统原生方式);退到后台可以推一条系统通知,两个开关各管一边。
  • 玩家名一律不分大小写:输 apptest 也能找到 AppTest,名字来源是 InTheNameOfLinux 记过的真实玩家名单。
  • 进「管理」默认落在「在线」;从玩家详情返回,回到刚才那一级(在线 / 玩家 / 举报…),不再被拽回玩家页。
  • iOS 浅色模式下状态栏改成深色字,看得清了。

26.11.27 管理入口只给服主

  • 普通管理员在「更多」页看不到「管理」那一块了:su 开关、Linux 系插件、插件联动状态一起隐藏。
  • 导航栏的「管理」页照旧:在线、玩家、举报、惩罚、假人、命令、su 都在。
  • 就算绕过界面调接口,服务端也会回 403「插件配置只有服主能改」。

26.11.26 权限、提醒、历史消息

  • 插件配置文件的读取、保存、启停、重载只有服主能做;普通管理员进到插件管理只能看,按钮是灰的。
  • 主题(风格 + 颜色)对所有人都开放,在「更多 → 显示 → 主题」。
  • 聊天有了入场动画;别人发消息时顶部会弹一条 1.5 秒的提醒,可在「更多 → 显示 → 消息弹窗提醒」关掉。
  • 每次打开社交页、切换公屏 / 队伍频道,都会重新拉最近 200 条历史,不会再「只看到刚发的」。
  • 底栏选中块的圆角改成跟导航栏一致,看起来更贴。

26.11.25 一点手感上的修补

  • 命令分组、多队伍切换、举报筛选这些「点一下会重建按钮」的选择控件,白块现在也会滑过去,不再直接跳。
  • 底栏选中块再放大一圈,圆角 18px(悬浮导航 20px)。
  • 顶部下拉、底部上推的回弹更明显:最大 150px、阻尼 0.55、松手 420ms 回位。

26.11.20 选择控件的白块会滑过去

  • 点开哪个选项,白色滑块就平移到哪一格,0.28 秒的缓动,和 iOS 的分段控件手感一致。
  • 选项换行到第二行时,滑块也会跟着跳到对应的一行。
  • 深色模式滑块是半透明白;系统开了「减少动态效果」就不做动画。

26.11.18 又改了这些

  • iOS 风格回到普通配色:不再做半透明毛玻璃,卡片 / 顶栏 / 弹窗都是实底;圆角、间距、胶囊按钮、悬浮导航这些布局保持原样。
  • 开屏停 2 秒:最少显示两秒再进入,不会一闪而过。
  • 管理列表挪到在线玩家下面:管理 → 在线,先「在线玩家」,再「管理层」。
  • 详情按钮点了没反应修好:整行都能点;按下后 1 秒内不再重绘列表;返回时作废在飞请求,不会被拽回详情页。
  • 开关跟随主题色:iOS 皮肤里「开」不再固定绿色,改成你选的强调色。
  • 控件布局收尾:分段控件圆角裁齐(不再顶出容器)、聊天页吸顶条不再左右出血、接口地址输入框铺满卡片。

8换主题:风格与颜色(26.12.6)

更多页 →「显示」卡 →「主题」,点开是二级菜单:

项目可选说明
风格默认 / Miuix / iOS默认是原来的界面;Miuix 把卡片改成大圆角无边框、按钮和开关改成胶囊、输入框改成浅底无边框、底栏去上边框加阴影;iOS 是液态玻璃:半透明卡片 + 背景毛玻璃、顶栏和弹窗一起毛玻璃、系统式分段控件、按钮带轻微投影。
颜色天蓝色 / 淡粉色 / 淡绿色 / 古董白 / 黑色 / 灰色改的是强调色:按钮、选中态、标签、未读小红点。默认天蓝色;深色模式自动用同一颜色的深色版,不会深底深字。

选完立刻生效,存在浏览器本地(nalxer.skin、nalxer.accent),换设备或清缓存会回到「默认 · 天蓝色」。

深色和颜色是两个开关
「深色模式」在设置的显卡片里,「主题」只管风格和强调色;两者可以随便组合,比如 Miuix + 淡粉色 + 深色。

10管理层名单(26.12.6)

管理页的「在线」子标签,最上面多了一张「管理层」卡:

  • 服主 / 副服主 / 管理员 / 协管四组,在不在线都列出来,右边写每组多少人;
  • 排序:先按身份(服主 > 副服主 > 管理员 > 协管),同一身份在线的排前面,再按名字;
  • 每行一个是「在线 / 离线」,一个是「详情」按钮 —— 点了直接进该玩家的详情页,不用再去搜索框里搜。

名单来源:服主 / 副服主 / 协管读 XlandCore 的配置名单,管理员读服务器 OP 列表。

7管理员

两种方式成为管理员:把游戏 ID 写进 admin.players,或者给这个玩家服务器 OP(OP 自动算管理员,不用重复填)。

admin:
players:
- Linux582021 # 一个 ID 一行(不区分大小写)
- Steve

改完 /nalxerapp reload,名单里的人下次打开 App 就能看到管理页。被移出名单的人要重新登录一次才会掉权限 —— 他手上的令牌还是管理员令牌,直到过期。

管理页有七块(1.7.0)

顶上一个横条切子页:在线 / 玩家 / 举报 / 惩罚 / 假人 / 命令 / su。

  • 在线:当前在服里的人,点名能进玩家详情。
  • 玩家:在线 + 离线一起搜,点开有金币 / 等级 / 身份(服主、副服主、市长、协管,读 XlandCore)/ 队伍 / 头衔 / 封禁,下面五种惩罚一键开。
  • 举报 / 惩罚 / 假人:举报能看未处理和已处理;惩罚按类型解除;假人可以停用 / 启用、停载区块、关刷怪、重生、移除。
  • 命令:白名单里的常用命令,点一条填参数再执行。
  • su:仿真控制台,只有设置里打开才出现,打开前要验一次 Linux 身份;输入的命令以服务器控制台身份执行,回显就是后台那份。

管理页:玩家 / 举报 / 惩罚 / 假人

管理员的「更多」页会多出一张管理卡,四个子标签:

子标签能做什么
玩家搜在线或离线的玩家 → 点开详情(等级 / 金币 / 点券 / 队伍 / 头衔 / 历史惩罚 / 相关举报)→ 直接封禁或开惩罚。
举报看玩家提交的举报(举报人、被举报人、理由、时间),逐条受理或驳回,可以写处理备注。
惩罚所有生效中的禁言 / 移动封禁 / 方块封禁 / 封禁,按类型分组,点一下就解除。
假人FakePlayerPlugin 的假人列表(坐标、在线状态),能直接移除;召唤需要你本人正在游戏里。
⚠️
举报有 30 分钟冷却 同一份举报提交后 30 分钟内不能受理,这是 ITNOL 留的调查时间,不是 App 的 bug。

封禁时长选项

App 里给的是四个档,对应的就是接口里的 minutes:

选项minutes什么时候用
永久0作弊、开小号报复。不传 minutes 也是永久。
1 小时60刷屏、骂人这类小问题,冷静一下就行。
1 天1440反复犯同一个小毛病。
7 天10080恶意破坏、偷东西。

审计日志

每一次封禁和解封都会往 plugins/LinuxAPP/audit.log 追加一行,一行一次操作,纯文本,直接 tail -f 看:

2026-11-02 21:55:10 Linux582021 封禁 Alex_02(7 天)原因:飞行作弊
2026-11-02 21:55:25 Linux582021 解封 Alex_02
2026-11-02 21:54:25 127.0.0.1 登录 Steve → 成功

日志只追加、不自动清理。一个几十人的服务器一年也就几百行,占不了多少地方;真嫌大就手动归档一下,别直接删 —— 出了纠纷它是唯一能拿出来说话的东西。

⚠
管理员名单不是权限组 admin.players 里的人能封人、解封、搜人,还能在下一节的「服务器命令」里跑白名单内的命令。 但 stop / op / give / whitelist 这类写死在黑名单里,改配置也放不开 —— 出问题最多影响玩家,不会把服务器搞挂。

8服务器命令(管理员)

管理员在 App 的管理页会多一个「服务器命令」标签。它不是给玩家看的榜单,而是一个受控的命令执行器: 点一条命令 → 参数自动填进输入框 → 服务器主线程执行 → 回显原样贴回来。

这样做的好处是 ITNOL 的 /linux xxx、LinuxTAB 的 /ltab、/team、/title、 /fp 全都能用,插件以后加新子命令也不用改 App。

  • 先选分组:封禁与解封 / 查人 / 服务器 / Linux 系插件,四个分组覆盖日常操作。
  • 点一条:命令根和参数占位符会填进下面的输入框,比如 linux ban <玩家> [原因]。
  • 补完参数,点「执行」(或直接按回车)。
  • 看回显:下面是服务器真实的输出,分页、配色都已经被剥掉,只剩文字。
  • 默认能用哪些命令

    白名单在 admin.commands.allow,默认这些根命令:

    根命令干什么例子
    linuxITNOL 总入口:封禁、查人、插件状态、审计、日志linux plugins、linux lookup Steve
    tempban / unban临时封禁 / 解封(linux ban 没有时间参数,定时要用 tempban)tempban Steve 7d 刷屏
    banip / unbanip封 IP(小号报复时用,注意别把网吧 / 学校网段封了)banip Steve
    banlist看全部封禁记录,分页banlist 2
    ltab / lchestLinuxTAB 状态与刷新 / 箱子面板ltab info
    title / team头衔 / 队伍插件title help
    fp / fplist / fpr / fpsave / fpreload假人插件的增删查、重载、存盘fplist
    linuxsync / nalxerapp玩家数据同步 / 本插件自己的状态与重载nalxerapp status

    要放开别的根命令,往 admin.commands.allow 里加一行,然后 /nalxerapp reload:

    admin:
    commands:
    enabled: true
    allow: [linux, banlist, unban, tempban, ltab, team, title, fp]
    # 只写根命令,不带斜杠;子命令不受限

    永远执行不了的命令

    下面这些在代码里写死,改配置也放不开:

    命令为什么锁死
    stop restart reload一键把服务器关掉或重载,手滑一次全服掉线
    op deop whitelist permissions提权类,等于把服务器送给别人
    give gamemode gm刷物品 / 改模式,会直接毁经济
    kick plugins version sudo踢人、暴露插件列表、代执行任意命令
    ⚠
    执行前会再问一次 标了「谨慎」的命令(封禁、封 IP 这类),点执行时 App 会弹一次确认框,把命令原文念一遍。 手指滑到就执行的年代已经过去了。

    边界与超时

    每条命令最多等 5 秒,回显最多 40 行 / 4000 字,超了就截断 —— 防止有人拿 banlist 一口气翻几百页把 App 卡死。

    命令在服务器主线程执行,和你在控制台敲是一样的效果;执行记录会写进控制台和 audit.log:

    2026-11-03 01:44:02 Linux582021 控制台执行 ltab info
    2026-11-03 01:44:15 Linux582021 控制台执行 tempban Steve 7d 刷屏
    💡
    命令现在是管理页里的一个子标签 1.4.0 起底栏没有单独的「命令」了,进「管理 → 命令」;白名单、危险命令二次确认这些规则没变。

    Linux 身份验证(1.4.1)

    verify.players 里的账号(默认就是 ITNOL 那个受保护号 Linux582021)登录 App 后,会先弹一个密码框: 「你登陆的是 Linux582021 账号,请通过 Linux 身份验证」。输的是 ITNOL 的验证密码,不是游戏密码。

    • 验证之前,除了 /api/me 和退出登录,其它接口一律 403 need_verify,界面上什么都点不动。
    • 验证状态跟着令牌走,重开 App 不用再验一次;令牌过期或换设备要重验。
    • 连错 5 次锁 10 分钟,服务端 audit.log 里有记录。

    su 控制台(1.7.0)

    「管理 → 命令」最上面那张卡。验证过 Linux 身份之后,可以在弹窗里输入任意命令,不再受 admin.commands.allow 白名单限制 —— 给东西、传送、改权限、装插件都行。

    • 只拦 stop / restart / end:这三条按下去服务器就没了,App 里补救不了。
    • 每条都写 audit.log,格式 X su 执行 命令。
    • 回显里要是「错误 / 找不到 / Unknown command」,App 会直接标红说失败,不会假装成功。

    假人逐个开关(1.4.1)

    假人列表每个名字下面会标「区块已加载 / 没加载」「会刷怪 / 不刷怪」,右边四个按钮:

    • 停载区块 / 加载区块 —— 对应 FakePlayerPlugin 的区块常驻(keep-loaded-chunks);
    • 关刷怪 / 开刷怪 —— 对应 spawn.*,假人站着的地方刷不刷怪;
    • 重生(按新设置重新出现)、移除。

    举报能看已处理(1.4.1)

    举报子页分「待处理 / 已处理」两个标签,已处理的会显示处理结果(受理 / 驳回)、处理人和备注。 接口是 GET /api/admin/reports?pending=0,返回里带 count / handledCount / pendingCount。

    💡
    命令页要重新登录才出现 刚被加进 admin.players 的人,手上的令牌还是普通令牌;让他在设置页退出登录再登一次,管理页和命令标签才会出来。

    9常见问题

    下面这几条覆盖了绝大多数「打不开 / 数据不对」的情况,按顺序试。

    登录提示「游戏密码不对」
    App 校验的是 AuthMe 的密码,不是论坛密码、不是邮箱密码。先在游戏里 /login 密码 确认这个密码是对的。
    还是不对的话按顺序查:① 玩家在 AuthMe 里注册过没有(plugins/AuthMe/ 里能不能找到这个 ID);② 大小写有没有打错,ID 是区分大小写的;③ 服务器是不是把 login.require-authme 改成了 false —— 关掉后不再校验密码,只放行在线玩家,离线时怎么登都失败。
    另外注意限流:一分钟内输错 5 次会返回 429,这时候密码是对的也登不上,等一分钟再试。
    数据全是 0,或者显示成「—」
    「—」表示服务端根本没接上那一项数据源,不是你的数据丢了。用浏览器打开 https://api.nalxer.top/api/health,里面有一个 capabilities 字段,写着每一项接没接上:
    coins: false → 服务器没装经济插件,或者装了但插件名不在 data.* 的识别列表里;
    points: false → 点券插件没接上;
    team: false / title: false → LinuxTeam / LinuxTitle 没装。
    而如果显示的是 0 而不是「—」,说明数据源接上了,只是这个玩家确实没有:新号、或者数据存在别的插件里。
    离线玩家的金币显示 0
    经济插件一般把余额存在内存里,玩家下线才写盘,有的干脆只对在线玩家提供查询接口。插件能做的只有两件事:在线时直接问经济插件要,离线时读它落盘的数据。
    插件已经做了能做的:玩家在线时把金币记进 plugins/LinuxAPP/stats.yml,离线后读这份缓存显示,所以一般不会是 0。但如果那个玩家从没在线过一次、或者换了经济插件导致旧缓存对不上,就只能是 0 —— 这不是 App 的问题。
    另外新人第一次进服之前没有任何数据,显示 0 是正常的。
    手机连不上,浏览器打开 http://服务器IP:49282/api/health 也打不开
    先分清是哪一层不通:本机 / 安全组 / App 填的地址。
    ① 服务器本机 curl http://127.0.0.1:49282/api/health 不通 → 插件没起来、端口被占,或者 config.yml 的 http.host 被改成了别的网卡,看一眼启动日志;老版本默认是 127.0.0.1:8787(只监听本机),新 jar 会自动改成 0.0.0.0:49282,日志里有一行「已自动改成」;
    ② 本机通、手机浏览器打 http://服务器IP:49282/api/health 不通 → 云服务器安全组 / 系统防火墙没放行 49282,去控制台加一条入站规则(TCP 49282);
    ③ 浏览器能打开、App 连不上 → App 里的地址填错了:忘了端口、多写了 /api、或者末尾多了斜杠。设置页的「测试连接」会直接告诉你通没通、联动接没接上。
    走 https://api.nalxer.top 域名的话,还要确认 Nginx 反代指向 127.0.0.1:49282、证书没过期(nginx -t,再看 /var/log/nginx/error.log)。
    服务器换了地址 / 换了域名,App 怎么改
    进 App 的设置页,「接口地址」那一栏直接改成新的 https:// 地址,保存后会要求重新登录一次(旧域名发的令牌不作数)。
    如果连 App 的登录页都进不去(老地址已经彻底不能用了),在登录页也能找到「修改接口地址」的入口。这个地址是存在手机本地的,卸载重装会清掉,等于回到第一次打开的状态。
    管理员在管理页搜不到某个玩家
    搜索走的是服务器上记录的玩家数据,从来没进过服的名字搜不到,这是正常的。
    另外两种可能:① 你手上的令牌是加进 admin.players 之前登录的,重新登录一次才会带上管理员身份;② 名字打错了 —— 搜索是模糊匹配但区分大小写,试试只打前三个字母。

    10安全说明

    这一节说清楚:密码去了哪、令牌怎么算的、什么样的部署方式等于没设防。

    密码

    App 里输入的密码,只在登录那一次请求里出现一次。插件拿到之后立刻交给 AuthMe 校验,校验完就丢掉 —— 不写配置文件、不写日志、不存数据库。所以别人拿到服务器上的文件,也翻不到任何人的密码。

    令牌

    登录成功后发的是 HMAC 签名令牌,签名的密钥就是 token.secret。令牌里带着玩家名和过期时间, 服务端每次校验都重新算一次签名,对不上就直接 401。默认有效期 7 天(168 小时),改密钥等于让所有令牌立刻作废。

    限流

    每个 IP 每分钟 5 次登录尝试 / 180 次请求。前者挡撞库,后者挡脚本刷接口。 这两个数字都按 IP 算,所以 Nginx 那一行 X-Real-IP 是硬要求 —— 少了它,全服共用 127.0.0.1 这一个额度。

    监听与审计

    接口默认监听 0.0.0.0:49282,公网可以直接连(明文 HTTP)。想加密就挂 Nginx 或开插件自带 TLS; 安全组里也可以只放行自己常用的网段。所有封禁 / 解封都写进 plugins/LinuxAPP/audit.log,谁在什么时候封了谁、什么原因、多长时间,一行一条。

    ⚠
    别用明文 HTTP 暴露这个接口 密码是在请求体里传的,走 http:// 等于把每个人的游戏密码写在明信片上寄出去。 一定要 HTTPS,证书用 Let's Encrypt 免费签就行。安卓 9 以后默认也禁止明文 HTTP,这条路本来就走不通。
    ℹ️
    被限流挡住的时候怎么办 等一分钟。限流是按 IP 的滑动窗口算的,不会因为你重开 App 就重置。 如果是整栋楼共用出口 IP(学校、网吧、公司 NAT),确实可能出现「别人试错把我锁了」的情况 —— 这种环境只能把 login.attempts-per-minute 调大,或者干脆别在公共网络里登。