promotional banner

E33Chat

Rebuilds the vanilla chat HUD in chat-app style
Back to Files

Fabric-1.21.1-2.4.11

File namee33chat-Fabric-1.21.1-2.4.11.jar
Uploader
E33EPUSE33EPUS
Uploaded
Sep 10, 2026
Downloads
5
Size
515.7 KB
Mod Loaders
Fabric
File ID
8847719
Type
R
Release
Supported game versions
  • 1.21.1

Curse Maven Snippet

Fabric

modImplementation "curse.maven:e33chat-1599940:8847719"

Learn more about Curse Maven

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 /tell suggest-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: renderLineWithClicks gained a clickable flag; the name row passes false — 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 = false when the popup's close animation finished — the settings/emoji/quick-chat/search popups all finish in tick(), 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 called closeGroupBrowser() again
  • Fix: tick() now finishes the group popup's close (new hideGroupBrowser()), 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's StringArgumentType.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 group name/text arguments now use greedyString(); msg takes a single rest argument that the server splits at the first space via GroupManager.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 vanilla GameRenderer also 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 injects InGameHud.render and 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.fetch now 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

This mod has no additional files