Repository navigation
Added
-
/setpassword <new> <confirm>(alias/setpw) sets the first game password of an account created on the web
through/panel. It works only while the player is logged in and the account has no game password, and it follows
the same password rules as/register; afterwards/loginworks with it. An account that already has a password
is told to use/changepassword. -
/setpassword <新密码> <确认>(别名/setpw)为通过/panel在网页上创建的账号设置第一个游戏密码。仅在玩家已登录且账号没有
游戏密码时可用,密码规则与/register相同;之后即可用/login登录。已有密码的账号会被提示使用/changepassword。 -
A web registration counts as an UltiLogin registration. When a player whose name has no UltiLogin account on this
server creates a new UltiKits account on the/panelpage, the game creates their UltiLogin account without a game
password, logs them in and tells them once to set one with/setpassword./loginrefuses such an account, whatever
is typed, until a game password is set, and the refused try is not counted as a wrong password. If the player
registers in game first, that account is kept untouched. Amax-register-per-iplimit, when set, applies to it too.
Withgui-mode.enabled: truesuch an account is never shown the number pad, which no digits could satisfy: on
joining and at every re-prompt the player is told to log in with/paneland then set a game password. -
网页注册视同 UltiLogin 注册。名字在本服务器上没有 UltiLogin 账号的玩家在
/panel页面上新建 UltiKits 账号后,游戏会为其创建
一个没有游戏密码的 UltiLogin 账号、让其登录,并提示一次用/setpassword设置游戏密码。在设置游戏密码之前,无论输入什么
/login都会拒绝该账号,且不计为密码错误。若玩家先在游戏内注册,则保留该账号不变。设置了max-register-per-ip时同样适用。
在gui-mode.enabled: true下,这样的账号不会弹出任何数字都无法通过的数字键盘:进入服务器及每次再次提示时,玩家都会被告知
用/panel登录,然后设置游戏密码。 -
Every web outcome of a
/panellink is shown in game: cancelled on the page, refused by the web (with the reason),
expired, signed in, or the server's UltiCloud credential refused (also logged to the console). While a player who
has not logged in holds a pending link, the login countdown is paused; it resumes with the time that was left when
the link is cancelled, refused or expires, never with a fresh full timeout. The other restrictions stay. A player who
leaves the server loses their pending links, so a sign-in completed on the web after they left logs nobody in. -
/panel链接在网页上的每种结果都会在游戏内显示:网页取消、网页拒绝(附原因)、链接过期、登录成功,或服务器的 UltiCloud 凭据被
拒绝(同时写入控制台)。未登录的玩家持有待处理链接期间,登录倒计时暂停;链接被取消、拒绝或过期后,按暂停时剩余的时间继续,
绝不重新计满。其他限制保持不变。玩家离开服务器后其待处理链接作废,
此后在网页上完成的登录不会让任何人登录。
Changed
-
Lockout redesign (#50): BOTH now counts and locks each (address, account UUID) pair,
independently of that account at other addresses, and separately locks an address aftermax-login-attempts
different accounts fail there. Success clears only its own pair, never the address's failed-account memberships.
IP-mode successes no longer clear the shared address count, closing the success-reset bypass. IP counts and
each BOTH address membership expirelockout-durationseconds after their latest failure; unlocked UUID/pair
counts still reset only on their own success or corresponding lock expiry. BOTH is the new fresh/missing-key
default. Existing operator values (including IP and lowercase uuid) stay byte for byte; unusable values warn and
fall back to BOTH only in memory. Recognised old shipped comments refresh without overwriting custom comments. -
登录封禁重构(#50): BOTH 改为按(地址、账号 UUID)组合计数并封禁,同一账号在其他地址不受该组合封禁影响;
同一地址失败的不同账号数达到max-login-attempts时另封禁整个地址。成功只清除自身组合计数,不清除地址集合。
IP 模式成功不再清除共用地址计数,修复成功登录清零绕过;IP 计数和 BOTH 的每个地址集合成员在最近一次失败的lockout-duration秒后过期。
未封禁的 UUID/组合计数仍只在自身成功或对应封禁到期时重置。新文件或缺少键时默认 BOTH;现有值(含 IP、小写 uuid)逐字节保留,
无效值只警告并在内存回退到 BOTH。已识别的旧出厂注释更新,自写注释不覆盖。 -
/panelrequires the server to be signed in to UltiCloud. Create and poll both use the server owner's
credential; there is no anonymous fallback or grace period for older plugins. If the server is not signed in,
no link is created: the player is told to ask the owner to runulticloud loginin the console. A failed creation
restores the remaining login countdown silently; it does not grant a new timeout. A refused credential (HTTP
401/403) is reported in game and in the console, never retried without it. Opening a link never logs the player
in by itself: the page asks for the linked account's password, a device that account told it to remember (one
click), confirmation by a signed-in account (only for a player logged in in game), or a new account (only for a
name without an UltiLogin account). A name with an UltiLogin account that is neither logged in in game nor linked
is refused until the player runs/loginonce. Normal website account login, browser link verification,
completion and cancellation, and game/loginremain available. -
/panel要求服务器先登录 UltiCloud。 创建和轮询链接都使用服务器所有者的凭据;没有匿名回退,也不为旧插件保留宽限期。
服务器未登录时不生成链接,玩家会被提示请服主在控制台执行ulticloud login。创建失败会按剩余时间静默恢复登录倒计时,
不会重新给予完整超时。凭据被拒绝(HTTP 401/403)时会在游戏内及控制台提示,绝不改用无凭据请求重试。仅打开链接不会让玩家登录:
网页会要求输入关联账号的密码、使用该账号让其记住的设备(点击一次)、由已登录账号确认(仅限已在游戏内登录的玩家),或新建账号
(仅限没有 UltiLogin 账号的名字)。已有 UltiLogin 账号、但既未在游戏内登录也未关联的名字会被拒绝,直到玩家先执行一次/login。
正常网站账号登录、浏览器链接验证/完成/取消,以及游戏/login均保留。 -
UltiLogin 2.0.0 requires UltiTools-API 6.3.0 or later and raises
api-versioninplugin.ymlfrom620
(the last released version, 1.0.0) to630. Older frameworks cannot load this module; upgrade UltiTools before
installing it. A new module JAR needs a server restart;/ul reloadonly reloads configuration
(UltiKits/UltiTools-Reborn#544). -
UltiLogin 2.0.0 需要 UltiTools-API 6.3.0 或更高版本,
plugin.yml中的api-version从上一个发布版本 1.0.0 的620
提高到630。更早的框架无法加载本模块;请先升级 UltiTools,再安装本模块。新的模块 JAR 需要重启服务器,/ul reload只会
重载配置(UltiKits/UltiTools-Reborn#544)。 -
plugin.ymlnow declaresidentify-string: ultilogin, the key of this module's entry in the UltiCloud catalogue.
The framework's update check and/upm updateskip a module that does not declare it, so this module now takes part
in both: a later published version carrying the same key is reported at startup and can be installed with
/upm update(UltiKits/UltiTools-Reborn#474). -
plugin.yml现在声明identify-string: ultilogin,即本模块在 UltiCloud 模块目录中的条目键。框架的更新检查和/upm update
会跳过未声明该键的模块,因此本模块现在会参与两者:带有同一键的更高发布版本会在启动时提示,并可用/upm update安装
(UltiKits/UltiTools-Reborn#474)。 -
max-register-per-ipinconfig/login.ymlnow ships as0(no per-IP registration limit) instead of3. Many
players can share one public IP address (carrier-grade NAT, common in mainland China and on mobile and campus
networks), so a limit can stop legitimate players from registering; the comment above the key now says so. Only a
file without the key gets the new default: a value already in your file, including3, is kept, and only the comment
earlier versions wrote above it is replaced. When you set a limit, it also applies to an account created on the web
through/panel: the web page reports the registration, but the game refuses the account and the player sees the
IP-limit message. -
config/login.yml中的max-register-per-ip出厂值由3改为0(不限制同一 IP 的注册数)。许多玩家可能共用同一个公网
IP(运营商级 NAT,在中国大陆以及移动网络、校园网中很常见),限制可能导致正常玩家无法注册;该键上方的注释现已写明这一点。
只有缺少该键的文件才写入新默认值:文件中已有的值(包括3)保持不变,只替换旧版本写在其上方的注释。设置限制后,它同样
适用于通过/panel在网页上创建的账号:网页会显示注册成功,但游戏内拒绝创建账号,玩家会看到 IP 上限提示。 -
allowed-commands: [](or~) inconfig/login.ymlno longer refuses every command to a player who has not
logged in. The setting is declared@NotEmpty, and from UltiTools 6.3.0 the framework treats an empty value of such a
list as unusable: the module runs on the shipped list (login, l, register, reg, panel, regs, recover) and logs one
WARNING namingallowed-commands, the value as written and that default. The file is left exactly as you wrote it.
Before,[]was loaded as an empty list, so/loginand/registerwere refused too;~ran the default list but
the file was rewritten. To allow fewer commands, list them; to allow more, add them (#52). -
config/login.yml中的allowed-commands: [](或~)不再让未登录玩家的所有命令都被拒绝。该设置声明了@NotEmpty,
自 UltiTools 6.3.0 起框架把此类列表的空值视为不可用:模块改用出厂列表(login, l, register, reg, panel, regs, recover),并记录一条 WARNING,写明allowed-commands、你写下的值与该默认值;文件保持你写的原样。此前[]按空列表
加载,连/login与/register也会被拒绝;~会使用默认列表,但文件会被改写。想放行更少的命令,请逐条列出;
想放行更多,请追加(#52)。 -
Message and title settings in
config/login.yml— the three GUI titles (gui-mode.title-login,
gui-mode.title-register,gui-mode.title-confirm) and the twenty-one messages (messages.register-prompt,
register-prompt-gui,login-prompt,login-prompt-gui,register-success,login-success,already-logged,
not-registered,already-registered,password-mismatch,password-too-short,password-too-long,
timeout-kick,account-locked,attempts-remaining,gui-password-invalid, andmessages.admin.password-reset,
force-login,unregister,player-not-found,account-not-found) — are written in the server's language when
the module starts, and the file is what the module shows (for examplemessages.login-success: '&aLogin successful! Welcome back!'underlanguage: en); previously they were fixed Chinese text, so
language: enhad no effect on them. A setting that is still built-in text — in any language, or a default an
earlier version shipped — followslanguage: it is rewritten when the module starts or after/ul reload. A
setting you edited is kept. To keep a built-in text but stop it followinglanguage, change at least one
character (#20). The text written is this module's built-in text: edit these settings inconfig/login.yml; an edit of the extracted
language file does not change them (earlier versions never read them from the language file either). -
config/login.yml中的消息与标题设置——三个界面标题(gui-mode.title-login、gui-mode.title-register、
gui-mode.title-confirm)与二十一条消息(messages.register-prompt、register-prompt-gui、login-prompt、
login-prompt-gui、register-success、login-success、already-logged、not-registered、already-registered、
password-mismatch、password-too-short、password-too-long、timeout-kick、account-locked、attempts-remaining、
gui-password-invalid,以及messages.admin.password-reset、force-login、unregister、player-not-found、
account-not-found)——在模块启动时按服务器语言写入,文件内容即模块显示的内容;此前它们是写死的中文,language: en
对它们不起作用。仍为内置文本(任一语言的内置文本,或旧版本的出厂默认值)的设置会跟随language:模块启动或执行
/ul reload后改写为当前语言的文本。你改过的设置保持不变。若想保留内置文本又不让它跟随语言,请至少改动一个字符
(#20)。写入的是本模块的内置文本:请在config/login.yml中修改这些设置;修改已解压的语言文件不会改变它们(旧版本同样从不从语言文件读取它们)。 -
language: ennow applies to everything this module shows or logs: the help of/login,
/register,/changepassword,/logadminand/panel, the/changepasswordand/logadmin
replies, the/logadmin infoblock, the registration refusal when an IP has reached its limit,
the session auto-login line, the login and registration keypads (item names, lore, the
confirmation step and the registration failure), the seven command descriptions, and the console
lines. Most of this was fixed Chinese text in every language, although the language files already
held English text for much of it that no code read; the console lines were fixed English text and
now followlanguage: zhtoo (#20). -
The login and registration keypads' buttons now work under every language and under titles you
have customised; how the keypads are recognised is in the #35 entry under
### Fixed. They used to be
recognised by whether the inventory title contained the Chinese word for "password", "login" or
"register": a keypad whose title contained none of them cancelled every click, which with the
titles now followinglanguagewould have included the English ones, and another plugin's
inventory whose title happened to contain one of those words could be clicked by a player who had
not logged in (#20). -
language: en现在对本模块显示或记录的全部内容生效:/login、/register、/changepassword、/logadmin、/panel
的帮助,/changepassword与/logadmin的回复,/logadmin info信息块,IP 注册数达到上限时的拒绝提示,会话自动登录
提示,登录与注册数字键盘(物品名称、说明、确认步骤与注册失败提示),七个命令描述以及控制台日志。其中大部分原先在任何
语言下都是写死的中文,而语言文件中其实已有其中许多内容的无人读取的英文文本;控制台日志原先写死为英文,现在也跟随
language: zh(#20)。 -
登录与注册数字键盘的按钮现在在任何语言以及你自定义的标题下都能正常使用;键盘如何识别见
### Fixed中 #35
一条。此前的识别方式是
物品栏标题是否包含"密码"、"登录"或"注册":标题不含这些词的键盘会取消每一次点击——标题跟随language后英文标题也会如此;
而其他插件的物品栏只要标题恰好含有其中一个词,未登录的玩家就能在其中点击(#20)。 -
A wrong code in
/recover <code> <password> <confirm>now says how many attempts are left, for
exampleInvalid verification code! Remaining attempts: 2. It used to show the placeholder itself,
Remaining attempts: {COUNT}, because the recovery path never filled it in;/regs <code>
already did (#21). -
/recover <验证码> <密码> <确认密码>输错验证码时,现在会显示剩余尝试次数,例如验证码错误!剩余尝试次数: 2。
此前找回密码流程从未填入该值,直接显示占位符{COUNT};/regs <验证码>一直是正常的(#21)。 -
A player who has not logged in can no longer equip or remove an armor stand's items, interact with
an entity at a precise point on its body, or swap their main hand and off hand. All three were
still allowed: the login protection already refused ordinary entity interaction, but Bukkit
delivers each of these through a separate event, so the existing guards never saw them.
Armor-stand equipping is the one that was reported and reproduced — an unauthenticated player
placed a block onto an armor stand and their held stack went down by one. -
Writing a sign is now refused before login. Another plugin can open a sign editor for a player who
has not logged in yet, which follows no interaction of the player's own, so nothing else refused
it. Opening the editor is refused as well as the write. -
Writing a book is now refused before login. A player who has not logged in really can reach the
book editor — the client opens it without asking the server, so no guard can stop it opening — and
the write then reaches the server on its own, where nothing else refused it. The editor still
opens; the text and the signature no longer do anything, and the book stays blank. -
Also refused before login, though no way to reach it was demonstrated and none may exist: dragging
items inside an inventory, middle-click item pick, swapping the held item with an equipment slot,
and recipe-book clicks. These are refused explicitly rather than left resting on the expectation
that other guards make them unreachable (#24). -
未登录的玩家现在无法再为盔甲架穿脱物品、对实体身体的精确位置进行交互,也无法交换主手与副手的物品。此前这三种
操作均可执行:登录保护已经拦截了普通的实体交互,但 Bukkit 通过各自独立的事件分发上述操作,因此原有的拦截从未
收到它们。其中被报告并复现的是盔甲架穿戴——未登录玩家成功把一个方块装备到盔甲架上,其手持物品数量随之减少一个。 -
登录前书写告示牌现在会被拒绝。其他插件可以为尚未登录的玩家打开告示牌编辑界面,这一路径不经过该玩家自身的任何
交互,因此此前没有任何拦截。除写入之外,打开编辑界面本身也会被拒绝。 -
登录前书写成书现在会被拒绝。未登录玩家确实能打开成书编辑界面——该界面由客户端自行打开,不询问服务器,因此
任何拦截都无法阻止它打开——写入随后会独立到达服务器,而此前没有任何拦截。编辑界面仍会打开,但输入的正文与
签名不再产生任何效果,成书保持空白。 -
以下操作在登录前同样会被拒绝,但并未证实存在可触发的路径,也可能本就不存在:在物品栏内拖拽物品、中键取物、
将手持物品与装备栏互换,以及配方书点击。此处选择明确拒绝,而不是继续依赖"其他拦截使其无法触发"这一预期
(#24)。 -
After
/upm uninstall UltiLogin, this module's commands (/login,/register,
/changepassword,/logadmin,/recover,/regs,/panel) are now really removed and its
LoginProtectionListenerstops firing. Previously this module replaced the framework's unload
method with one that only logged a line, so both stayed active until the server restarted
(#29). -
执行
/upm uninstall UltiLogin后,本模块的命令(/login、/register、/changepassword、
/logadmin、/recover、/regs、/panel)现在会被真正移除,其LoginProtectionListener监听器也不再
触发。此前本模块用一个只打印日志的方法替换了框架的卸载方法,因此两者都会一直保持生效,直到服务器重启
(#29)。 -
With
security.max-login-attempts: 0(unlimited attempts), a wrong password now replies "Wrong password! Please
try again." instead of claiming the account was locked when nothing was locked. This reply useswrong_password
in the module's language catalogue and followslanguage. With a limit, a wrong password shows the remaining
attempts until a lock is actually reached, then showsmessages.account-locked(#23). -
设置
security.max-login-attempts: 0(不限制尝试次数)时,输错密码现在回复“密码错误!请重试。”,不再在实际未封禁时声称
账号已锁定。该回复取自本模块语言文件的wrong_password,跟随language。设置次数上限时,输错密码会显示剩余次数,
只有实际达到封禁条件时才显示messages.account-locked(#23)。
Removed
-
lang/en.ymlandlang/zh.yml. The framework reads onlylang/en.jsonandlang/zh.json, and
every entry in the two YAML files was a copy of an entry in the JSON file of the same language, so
editing them never changed anything. If you customisedlang/*.ymlon disk, carry those edits into a
custom language file, not into the officiallang/*.json: copy the official file in the samelang/folder to a name that starts with its language code and a hyphen,
keeping the extension (for examplelang/en-myserver.json), and setlanguage: en-myserverinplugins/UltiTools/config.yml.
An edit made in an official file is undone when the file is restored, at every start and module reload,
and survives only in its.bak(UltiKits/UltiTools-Reborn#616). -
The
email_bind_rewardandpanel_auth_successlanguage entries. No code ever read them, so
removing them changes nothing players see. -
移除
lang/en.yml与lang/zh.yml。框架只读取lang/en.json与lang/zh.json,两个 YAML 文件中的每一条都是同语言
JSON 文件中某一条的副本,因此修改它们从未产生任何效果。若你在磁盘上自定义过lang/*.yml,请把这些修改放进自定义语言文件,
而不是官方的lang/*.json:在同一lang/目录中把官方文件复制为以其语言代码加连字符开头、扩展名不变的文件
(例如lang/zh-myserver.json),并在plugins/UltiTools/config.yml中设置language: zh-myserver。在官方文件中
做的修改会在每次启动和模块重载恢复该文件时被撤销,只保留在其.bak中(UltiKits/UltiTools-Reborn#616)。 -
移除
email_bind_reward与panel_auth_success两个语言条目。从未有代码读取它们,因此移除它们不会改变玩家看到的任何内容。 -
The module's own
UltiLogin 已禁用!("UltiLogin disabled!") console line on unload and its own
UltiLogin 配置已重载!("UltiLogin configuration reloaded!") console line on/ul reload UltiLogin
(both printed in Chinese under eitherlanguagesetting), and the never-readlogin_disabledand
login_reloadedlanguage keys that described them. UltiTools 6.3.0 logs one reload line per module
(Module 'UltiLogin' reloaded.). Reloading still re-readslogin.ymlinto the running module,
exactly as before: that was already done by the framework's reload method, which this module's
override called first (#29). -
移除本模块卸载时输出的"UltiLogin 已禁用!"控制台行、
/ul reload UltiLogin时输出的
"UltiLogin 配置已重载!"控制台行,以及未被读取的login_disabled、login_reloaded语言键。
UltiTools 6.3.0 会为每个模块输出一行重载日志(Module 'UltiLogin' reloaded.)。重载仍会像以前一样把
login.yml重新读入运行中的模块:此前本模块的重载方法已先调用框架的重载方法完成这一步
(#29)。 -
The
messages.wrong-passwordsetting inconfig/login.yml. It never took effect in any version:
no code read it, so editing it never changed what a player saw. The wrong-password reply that
now exists (see### Fixed) takes its text from this module's language file instead — entry
wrong_passwordinlang/<language>.json, beside theconfigfolder — so it follows the
server'slanguagesetting. To customise it, copy the official language file to one whose name starts
with its language code and a hyphen (for examplelang/en-myserver.json), editwrong_passwordthere
and setlanguage: en-myserverinplugins/UltiTools/config.yml; an edit made in the official file
itself is restored at the next start or module reload, the edited file kept as.bak(UltiKits/UltiTools-Reborn#616).
A server upgraded from an earlier version keeps the key in itslogin.yml, because the framework
never deletes a key from an operator's file; while it is there, the module logs one warning at
startup and on every reload of this module (/ul reloador/ul reload UltiLogin), naming the
file and the key, and the key can simply
be deleted (#23). -
移除
config/login.yml中的messages.wrong-password设置项。它在任何版本中都从未生效:没有任何代码读取它,
修改它从未改变玩家看到的内容。现在新增的"密码错误"回复(见### Fixed)改为从本模块的语言文件读取文本——
config文件夹旁lang/<语言>.json中的wrong_password条目——因此会跟随服务器的language设置,
要自定义它,请把官方语言文件复制为以其语言代码加连字符开头的文件(例如lang/zh-myserver.json),在副本中修改
wrong_password,并在plugins/UltiTools/config.yml中设置language: zh-myserver;直接修改官方文件的改动会在
下次启动或模块重载时被恢复,修改过的文件保留为.bak(UltiKits/UltiTools-Reborn#616)。
从旧版本升级的服务器,其login.yml中仍会保留该键,因为框架从不删除运维文件中的键;只要该键还在,
本模块会在启动时以及每次重载本模块时(/ul reload或/ul reload UltiLogin)记录一条警告,指出文件与键名,直接删除该键即可
(#23)。
Fixed
-
Passwords no longer reach the server log in plain text. Paper writes every player command line to the console and
logs/latest.log, and UltiTools-API 6.3.0 mirrors the console to the UltiPanel log stream, so/login,/register,
/changepassword,/setpassword,/recoverand/logadmin reset, with every alias, used to be recorded with the
password. While the module is enabled a filter on the server's Log4j root logger now replaces their arguments with
******(Steve issued server command: /login ******), in any letter case and with any namespace prefix; other
commands are logged unchanged, and the filter is removed when the module is unloaded. Two paths are not covered and
are documented under Known limitations: a reset sent from the panel's remote console, and the reply to
logadmin resetrun from the console (#57). -
密码不再以明文进入服务器日志。Paper 会把玩家输入的每条命令写入控制台和
logs/latest.log,UltiTools-API 6.3.0 还会把控制台同步到
UltiPanel 面板日志流,因此/login、/register、/changepassword、/setpassword、/recover和/logadmin reset
(含所有别名)过去会连同密码一起被记录。现在模块启用期间,服务器 Log4j 根日志器上的过滤器会把这些命令的参数替换为******
(Steve issued server command: /login ******),不区分大小写、带任何命名空间前缀均可;其他命令照常记录,模块卸载时过滤器随之
移除。有两条路径未覆盖,已写入"已知限制":通过面板远程控制台发送的重置,以及在控制台执行logadmin reset时的回复
(#57)。 -
The failed-login count now follows what
security.lockout-typelocks. WithUUIDit is kept per account, so
one account's lock no longer leaves every other account at the same address one wrong password away from being
locked, and one account's wrong passwords no longer count against another's;messages.attempts-remaining
is per account too. WithIPit stays per address (accounts behind one address share it, by design). With
BOTH, failures are counted per (address, account UUID) pair and separately by different failing accounts at
each address, as described in the lockout redesign above; remaining attempts follow the pair's count
(#48, #45). -
失败登录次数现在按
security.lockout-type所封禁的对象计数。使用UUID时按账号计数:一个账号被封禁后,同一地址上
的其他账号不再只差一次输错就被封禁,一个账号输错密码也不再算到另一个账号头上;messages.attempts-remaining
同样按账号。使用IP时仍按地址计数(同一地址背后的账号共用,设计如此)。使用BOTH时按(地址、账号 UUID)组合计数,
另统计每个地址上失败的不同账号数,详见上面的登录封禁重构;显示的剩余次数按组合计数
(#48、#45)。 -
An account write whose stored row no longer exists is now reported as failed on every storage type. On a
database shared by several servers, another server's/logadmin unregisterbetween this module's read and
its write used to leave the write silently lost. Each of the six writes (login, panel login,/changepassword,
an admin password reset, a recovery password reset, an email bind) now logs its own error line followed by
"The stored account row no longer exists, so nothing was written" and takes the result it already has for a
failed write: an admin or recovery reset hands out no new password and/changepassworddoes not change
anything, while a login, a panel login and an email bind carry on as they do for a failed write (a player
whose bind was lost is still told it succeeded and still receives the reward) (#47). -
账号记录已不存在时的写入,现在在所有存储类型上都按失败处理。多台服务器共用数据库时,另一台服务器的
/logadmin unregister恰好发生在本模块读与写之间,过去这次写入会悄悄落空。六处写入(登录、面板登录、/changepassword、
管理员重置密码、找回密码重置、绑定邮箱)现在都会先输出该处原有的错误日志,再附上“已存储的账号记录已不存在,未写入任何内容”,
并沿用该处对失败写入原有的结果:管理员或找回重置不会给出新密码,/changepassword不会改动任何内容;登录、面板登录和
绑定邮箱则和写入失败时一样继续(绑定丢失的玩家仍会被告知绑定成功并领取奖励)(#47)。 -
The comments above the keys of
config/login.yml(42) andconfig/email.yml(8) now come from the
module's language files: a server set tolanguage: enwrites English comments on a fresh install
(earlier versions wrote Chinese-only comments in every language). The comments the framework wrote on
these keys, the Chinese ones earlier versions wrote included (the old comment abovesecurity.lockout-type
too, #51), switch to the server's language at the next start, and after you change
languageand run a bare/ul reload; values are untouched, and a comment you wrote yourself is kept as you
wrote it (UltiKits/UltiTools-Reborn#611). The comment abovesecurity.lockout-typenow also says
what each type counts and locks (see the failed-login count entry) (#46, #45). -
config/login.yml与config/email.yml中各配置项上方的注释(分别 42 条和 8 条)现在取自模块的语言文件:
language: en的服务器全新安装时写入英文注释(此前所有语言下都写入纯中文注释)。框架在这些项上写下的注释(包括旧版本写下的
中文注释,security.lockout-type上方的旧注释也在内,#51)会在下次启动时、以及你修改language并执行
不带参数的/ul reload后切换为服务器语言;配置值不变,你自己写的注释保持原样(UltiKits/UltiTools-Reborn#611)。security.lockout-type上方的注释同时写明各类型计数和封禁的对象(见失败登录次数一条)(#46、#45)。 -
The console warning about a setting this version no longer reads names the file exactly as it is: a
server installed under a directory whose name contains{KEY}or{REASON}used to get a path that does
not exist, because the path was inserted before those placeholders were filled. Every placeholder of the
line is now filled in one pass (the same fix as UltiKits/UltiMail#37). -
关于本版本已不再读取的配置项的控制台警告现在按原样给出文件路径:此前路径先于
{KEY}、{REASON}占位符插入,
安装目录名含这两个占位符的服务器会看到不存在的路径。现在同一行的所有占位符一次性替换(与 UltiKits/UltiMail#37 相同的修复)。 -
Plugin NPCs are no longer treated as unauthenticated players: a player-type NPC carrying the
NPC
metadata that NPC plugins such as Citizens set is left alone by the whole login protection — it can take
damage, ride and move, and it is not prompted or timed out. Before, such an NPC was invulnerable, could not
ride and was dropped from moving vehicles (#42). -
插件 NPC 不再被当作未登录玩家:带有 Citizens 等 NPC 插件所设
NPC元数据的玩家型 NPC 不受登录保护的任何限制——可以受伤、乘骑和移动,
也不会收到登录提示或因超时被踢出。此前这样的 NPC 无敌、无法乘骑,行驶中的载具还会让其下车(#42)。 -
With
security.lockout-type: UUID, a player whose lockout has expired gets the full
security.max-login-attemptsagain. Before, the failure count was kept, so the first wrong password
after the lockout locked the account again at once (#38). -
在
security.lockout-type: UUID下,封禁到期后玩家重新获得完整的security.max-login-attempts次机会。
此前失败计数被保留,封禁结束后第一次输错密码就会立即再次锁定(#38)。 -
An unusable
security.lockout-typeinconfig/login.yml(anything other thanIP,UUIDorBOTH, ignoring
letter case and surrounding spaces) now falls back toBOTHin memory only. The module names the original value
in a console warning at start-up and on/ul reload; the file is unchanged. Before, an unrecognised value switched
lockout off while the wrong-password reply still claimed the account was locked (#37). -
config/login.yml中无法使用的security.lockout-type(忽略大小写及两端空格后,仍不是IP、UUID或BOTH的值)现在仅在
内存中回退到BOTH。模块在启动和/ul reload时会在控制台警告中原样引用该值,文件不变。此前无法识别的值会关闭登录封禁,
而密码错误的回复仍称账号已被锁定(#37)。 -
The registration window (
gui-mode.enabled: true) now showsgui-mode.title-confirmonce the first
password is entered, andgui-mode.title-registeragain after a mismatch: the page re-opens its window
with the new title, keeping what was entered. Before, the title was stored but the open window kept its
first title, so both stages looked the same (#25). -
注册窗口(
gui-mode.enabled: true)在输入第一次密码后会显示gui-mode.title-confirm,密码不一致后重新显示
gui-mode.title-register:页面以新标题重新打开窗口,已输入的内容保留。此前标题只被记录,已打开的窗口仍显示最初的标题,
两个阶段看起来一样(#25)。 -
On the login screen an unauthenticated player can no longer rearrange their own inventory. While
the login or registration keypad was open, clicks in the player's own inventory rows were allowed,
because the keypad was recognised by the title of the whole window, and that window includes the
player's own rows. The keypad is now recognised by which window is open — this module's own login
or registration page, whatever its title says — and only clicks on the keypad itself are allowed;
another inventory whose title reads like the keypad's no longer opens for a player who has not
logged in (#35). -
修复:未登录玩家不能再在登录界面整理自己的背包。登录或注册数字键盘打开时,玩家自己背包那几行的点击此前是被允许的,因为键盘是按
整个窗口的标题识别的,而窗口包含玩家自己的背包行。现在按打开的是哪个窗口识别——本模块自己的登录或注册页面,无论标题如何——并且
只允许点击键盘本身;标题看起来像键盘的其他物品栏不再对未登录玩家打开(#35)。 -
A player who has not logged in can no longer be carried by a vehicle. A minecart rider, a boat's
second-seat passenger or anyone carried by rails or water was moved across blocks while not
logged in, because only a player steering a vehicle is held in place, and a player who quit while
riding a moving minecart was put back in it on rejoin and carried on. A player who has not logged
in now rides nothing: getting into a vehicle is refused, a player who quit while riding is taken
off the vehicle one tick after rejoining (the vehicle stays where it is), a player whose login is
revoked while riding is dismounted, and a moving minecart or boat drops such a passenger. After
logging in they can get back in (#41). -
修复:未登录玩家不能再被载具带着移动。此前矿车乘客、船的第二座乘客、被铁轨或水流带着走的玩家会在未登录状态下跨方块移动,
因为只有操控载具的玩家会被拦住;坐在行驶中的矿车里下线的玩家重进时会被放回矿车并继续移动。现在未登录玩家不乘坐任何载具:
上载具被拒绝,坐着下线的玩家重进后一刻会被请下载具(载具留在原处),登录被撤销时会下载具,行驶中的矿车或船会让这样的乘客下车。
登录后可以重新上载具(#41)。