Fabric-1.21.1-2.4.11
Curse Maven Snippet
What's new
v2.4.11
修复:群组菜单点击任意位置都会闪一下(2.4.10 回归)
- 现象:
[+]打开群组弹层后创建群组,之后点击任意区域或按任意键,菜单都会重播一次关闭动画(弹一下立刻消失) - 根因:弹层的关闭动画到期后没人把
visible置为 false(设置/表情/快捷/搜索四个弹层都在tick()里收尾,唯独群组弹层漏了),于是它一直处于"可见但完全透明"的状态;后续每次点击都判定"点击在面板外",再次触发closeGroupBrowser() - 修复:
tick()补上群组弹层的关闭收尾(新增hideGroupBrowser()),打开时清掉上一次的关闭时间戳;顺带让"创建"与"加入"行为一致——创建后自动切到新群页签并收起弹层(点击[创建]和输入框回车两条路径都改了) - 顺带:群组弹层标题右侧加了「点击群名即可加入」提示——群组没有邀请流程,加入就是点一下别人的群名
修复:其他玩家的名字出现下划线且整段可点击(2.4.5 选区功能回归,commit c5104c40)
- 现象:气泡上方发送者名字带下划线,点击会触发服务端挂在名字上的
/tell建议指令;此前版本从未如此 - 根因:c5104c40 为做文本选择,把名字行从直接
drawString改为走renderLineWithClicks;该方法会给"样式带 ClickEvent 的字符"加下划线并登记点击区——而服务端给玩家名字挂的正是suggest_command: /tell <名>点击事件(持久化历史的 senderJson 可证) - 修复:
renderLineWithClicks增加clickable开关,名字行传false——不再加下划线、不再注册点击目标;文本选择仍可用(名字走该方法的初衷)
Fixed: sender names showed an underline and were clickable (regression from the 2.4.5 selection feature, commit c5104c40)
- Symptom: the sender name above a bubble was underlined and clicking it triggered the
/tellsuggest-command event the server attaches to names; never like this before - Root cause: c5104c40 routed the name row through
renderLineWithClicks(for text selection); that method underlines characters whose style carries a ClickEvent and registers them as click targets — and the server attaches exactly such an event (suggest_command: /tell <name>) to player names (visible in the persisted history's senderJson) - Fix:
renderLineWithClicksgained aclickableflag; the name row passesfalse— no underline, no click target, while text selection keeps working (the reason names go through this method at all)
修复:群组消息出现在「全部」页签(改为群消息只在对应群页签显示)
- 现象:在「全部」页签能看到群组消息,与公共世界聊天混在一起,读感像"群消息泄露到世界频道"
- 说明:排查了当轮双端持久化历史,群消息的 group 标记全部正确,"世界"页签的过滤不可能放入带群标记的消息;"泄露"实际发生在「全部」页签——它此前不过滤任何消息
- 修复:「全部」语义改为 世界 + 系统,群组消息只出现在对应群页签;页签功能未启用时(未装服务端 mod)仍显示全部消息,行为不变
Fixed: group messages appeared in the "All" tab (they now show only in their own group tab)
- Symptom: the "All" tab mixed group messages into the public world feed, which read as "group messages leaking into the world channel"
- Note: both clients' persisted histories from the reported session carry correct group tags, so the literal "World tab shows group messages" is not reachable in code; the mixing happened in "All", which previously never filtered
- Fix: "All" now means world + system; group messages appear only in their group's tab. When the tab strip is unavailable (no server mod) nothing is filtered, as before
Fixed: the group menu flickered on every click (2.4.10 regression)
- Symptom: after opening the
[+]group popup and creating a group, any later click or keypress replayed the popup's close animation (it flashed and vanished) - Root cause: nothing set
visible = falsewhen the popup's close animation finished — the settings/emoji/quick-chat/search popups all finish intick(), but the group popup was missing from that list, so it stayed "visible at zero alpha"; every subsequent click was then treated as an outside click and calledcloseGroupBrowser()again - Fix:
tick()now finishes the group popup's close (newhideGroupBrowser()), and opening it clears the previous close timestamp. Create now behaves like join: after creating, the panel switches to the new group's tab and closes (both the[Create]button and the Enter-in-input path) - Also: the group popup title now carries a "Click a name to join" hint — there is no invite flow; joining is just clicking another player's group name
修复:群组消息发送报错"参数后应有空格分隔"(中文群名)
- 现象:群名叫「妈妈」时,在群组页签发消息会在聊天栏出现
参数后应有空格分隔,但发现了紧邻的数据,消息发不出去 - 根因:客户端把群组发言改写为
/e33chat group msg 妈妈 ??,但命令用的是 Brigadier 的StringArgumentType.string()(QUOTABLE_PHRASE),未加引号时只接受[0-9A-Za-z_.-]——中文名被解析成"空参数 + 剩余数据"而报错(英文名恰好能用,所以测试时没暴露) - 修复:
group子命令的名称/文本参数全部改用greedyString();msg改为单个 rest 参数,由服务端GroupManager.splitSay()在第一个空格处切分(群名本身不允许空格,切分无歧义)
Fixed: sending a group message failed with "Expected whitespace to end one argument" for CJK group names
- Symptom: with a group named 妈妈, sending from the group tab printed
参数后应有空格分隔,但发现了紧邻的数据in chat and the message never went out - Root cause: the client rewrites group sends to
/e33chat group msg 妈妈 ??, but the command used Brigadier'sStringArgumentType.string()(QUOTABLE_PHRASE), which unquoted only accepts[0-9A-Za-z_.-]— the CJK name parsed as an empty argument plus trailing data and was rejected (ASCII names happened to work, which is why testing missed it) - Fix: all
groupname/text arguments now usegreedyString();msgtakes a single rest argument that the server splits at the first space viaGroupManager.splitSay()(group names cannot contain whitespace, so the split is unambiguous)
修复:打开聊天面板时物品栏 HUD 与第一人称手消失(2.4.9 回归)
- 现象:打开聊天窗口后,底部物品栏、准星、血条等原版 HUD 消失,第一人称的手和手持物品也不见了
- 根因:2.4.9 用
options.hideGui隐藏半透明屏幕背后的 HUD,但这个字段就是 F1 的开关——原版GameRenderer渲染第一人称手/手持物品时也检查它,所以一并被关掉了 - 修复:改用只跳过 HUD 层的机制(Forge/Neo 取消
RenderGuiEvent.Pre,Fabric 注入InGameHud.render提前返回),并加引用计数(聊天面板 → 配置屏 → 服务端配置屏可嵌套,全部关闭后才恢复 HUD)。预期行为现在是:只有按 F1 才隐藏全部 HUD,打开 E33Chat 界面仅隐藏 HUD 层、保留手与世界
Fixed: the hotbar HUD and first-person hand disappeared while the chat panel was open (2.4.9 regression)
- Symptom: opening the chat window hid the vanilla HUD (hotbar, crosshair, health bar) and also removed the first-person hand and held item
- Root cause: 2.4.9 hid the HUD behind translucent screens by setting
options.hideGui— that is the F1 toggle, and vanillaGameRendereralso gates first-person hand/held-item rendering on it, so those disappeared too - Fix: skip only the HUD layer (Forge/Neo cancel
RenderGuiEvent.Pre; Fabric injectsInGameHud.renderand returns early) with a reference count, because screens nest (chat panel → config → server config) and the HUD must return only when the last one closes. Expected behaviour now: only F1 hides the whole HUD; opening an E33Chat screen hides the HUD layer while keeping the hand and the world
修复:服务器托管图片偶发"图片加载失败"(2.4.10 回归)
- 现象:连续发送多张服务器托管图片(
e33chat://media/...)后,第 4 张开始显示"图片加载失败",此前几张正常 - 根因:2.4.10 的动图探测(GIF/WebP 内容识别)和静态图片加载器会各自向服务器请求同一张图片,而服务端有"每玩家 10 秒 4 次"的传输限流——每张图占 2 次配额,第 4 张就被限流
- 修复:
MediaClient.fetch对同一 mediaId 的并发请求合并为一个在途请求(后来的调用者复用同一个 Future,不再单独发包),配额消耗回到每张图 1 次
Fixed: server-hosted images intermittently failed to load (2.4.10 regression)
- Symptom: after sending several server-hosted images (
e33chat://media/...) in a row, the 4th onwards showed "image load failed" while the earlier ones were fine - Root cause: the 2.4.10 animated-image probe (GIF/WebP content detection) and the static image loader each requested the same image from the server, and the server rate-limits transfers to 4 per player per 10 seconds — two requests per image burnt the quota, so the 4th image was throttled
- Fix:
MediaClient.fetchnow merges concurrent requests for the same mediaId into one in-flight request (later callers reuse the same Future instead of sending their own packet), so each image costs one slot again
All Relations
- All Relations
- Embedded Library
- Optional Dependency
- Required Dependency
- Tool
- Incompatible
- Include
