You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Quick phrases: a fourth composer button (lightning) opens a list above the input bar. Tapping a phrase inserts it into the composer and focuses it — it never sends on its own. Adding (the "Add a phrase" row) or editing (the pencil) borrows the composer field for input, so Chinese IME composition, the caret and history all work natively — Enter saves the phrase, Esc discards it, clicking elsewhere commits; the bar shows an accent ring and a dedicated hint while borrowed. Rows delete with the ×. Single phrases are capped at 256 characters and the list at 20. Stored as quickPhrases in atomchat-client.json. Mutually exclusive with the emoji panel.
关闭常用语面板时界面飞出屏幕:saveLayer 未与 save 成对 restore,每帧泄漏一层矩阵栈;已补齐成对恢复。
Fixed
Phrase panel drawn inverted/off-screen: the panel rect used the LTRB constructor instead of makeXYWH, scattering every element; rebuilt as XYWH.
"Use skin" ran instantly with no confirmation: it now arms first (row turns red "Use skin?" for 3s) and only clears on the second tap; without a custom avatar the row is greyed out.
Custom avatar survived "use skin" (even across restarts): the server companion kept serving the uploaded copy after the local clear; the local player's avatar is now decided by the local file alone.
Avatar affordance on the profile page: hover always glows, the avatar tap always opens the change/use-skin menu (greyed row excepted), and the edit badge stays the shortcut to the picker.
UI flew off-screen while the phrase panel closed: an unpaired saveLayer leaked one matrix level per frame; the layer now restores before the outer save.
Chat history persistence (off by default): a "Keep chat history" switch in Settings → Chat. When on, history is saved per world to config/atomchat/history/<key>_<hash>.jsonl: singleplayer and LAN hosts key by world name, multiplayer by the server-list entry name — no port in the key, so re-opening a LAN world on a new port keeps its history; renaming a server-list entry starts a new file (the old one stays). Both public and private conversations are stored (private lines carry their partner); rejoining a world restores the feed with bubble colours and clickable spans (/tell, Xaero coordinates, FTB buttons, links) intact. Writes go through a 30-second throttled single-thread queue and flush on disconnect/world change. historyRetentionDays (default 0 = forever) can be hand-edited and prunes old files on world join.
Clear chat history: a card under the persistence switch, using the generic two-step confirm (red "confirm?" verb, 3s timeout). With saving off it wipes the current view; with saving on it also deletes the world's file, and an in-flight auto-save cannot resurrect it (generation guard).