Skip to content

Commit ee0bd5a

Browse files
DR-lin-engzaodonganqiMisakaAldrichsdk2kaedelcb
authored
11 (#19)
* feat: 优化进出千星速度 (babalae#2682) * fix adventurers guild path (babalae#2690) * 七圣召唤不再等待吞星之鲸加血 (babalae#2679) * feat: 添加bgi版本获取 (babalae#2692) * 修复切换队伍拾取初始队伍为空的异常识别 (babalae#2688) * fix: 修复自动剧情有时无法完成对话的问题 (babalae#2684) * 地图遮罩功能(把米游社大地图搬到原神内) (babalae#2655) * Update version to 0.55.2-alpha.1 * 修复部分组件未随主题变更颜色 babalae#2644 (babalae#2699) * feat: 为多个窗口启用自动翻译拦截器 为 MapLabelSearchWindow、ArtifactOcrDialog、PromptDialog 等十三个 WPF 窗口添加了 AutoTranslateInterceptor 行为,以启用自动翻译功能。这确保了应用程序界面的文本内容在需要时可以被正确拦截并处理,提升国际化支持。 * Revert "feat: 为多个窗口启用自动翻译拦截器" This reverts commit fc942bd. * fix: 调整截图预览区域尺寸以适应不同分辨率 调整 MaskWindow 中截图预览区域的列宽比例,将固定宽高改为最大宽高并启用拉伸对齐,提升在不同屏幕分辨率下的显示适应性。 * fix: 调整日志级别及UI元素位置比例 将米游社地图接口调用失败日志级别从Warning降为Debug,避免频繁警告干扰 调整日志文本框和状态列表的顶部位置及宽度比例,优化界面布局 * fix: 修复地图标签搜索窗口DPI缩放和关闭逻辑 修复地图标签搜索窗口在高DPI缩放下的定位问题,调整计算方式以适配系统缩放比例。 同时确保地图点选择器关闭时同步隐藏搜索窗口,避免窗口残留。 * Update version to 0.55.2-alpha.2 * Revise asset instructions and GitHub Actions setup Updated README to reflect changes in asset handling and GitHub Actions. * 优化换队拾取和切换队伍 (babalae#2729) * 优化更新界面UI与交互 * Update version to 0.56.0 * 遮罩内 Popup 保持置顶 * fix: update BetterGI.Assets.Other package version to 1.0.12 * Update version to 0.56.1 * feat: 简化自动战斗日志输出 (babalae#2732) * Revert "遮罩内 Popup 保持置顶" This reverts commit ff3e89a. * fix: 调整事件触发顺序并修复地图点选择器状态 修复 PointsCanvas 中 ViewportChanged 事件与 Refresh 方法的调用顺序,确保界面正确更新。 在 MaskWindow 中增加关闭地图点选择器的逻辑,避免状态不一致。 * 重置选项移动 * Update version to 0.56.2 * feat: 调整时间使用更短的延时 (babalae#2738) * fix: 修复 JS 脚本 multi-checkbox 配置项删除后仍能读取到旧值的问题 (babalae#2725) * fix: 修复 RunMulti 中 Mat 所有权语义不明确导致的潜在 Dispose 问题 (babalae#2730) * feat: 支持仓库使用公共资源 (babalae#2716) * feat: 状态机 (babalae#2712) * UI变化了后的10s内则所有触发器执行一遍,修复遮罩控件部分场景下残留的问题 * 优化换队拾取 (babalae#2748) * 优化换队拾取 需要换队拾取拾取时才执行换队拾取操作 * Add files via upload * 地图遮罩开关实时生效 * fix: 每日委托领奖使用点击屏幕 (babalae#2761) * fix: 键鼠回调改为异步事件分发 (babalae#2741) * fix: 键鼠回调改为异步事件分发 * 添加队列限制与并行锁 * Update BetterGenshinImpact/Core/Script/Dependence/KeyMouseHook.cs Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> * 只允许外部dispose --------- Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> * fix: 阻止默认的委托和派遣橙色点击 (babalae#2762) * Fix rare welkin moon stuck issue (babalae#2765) * Update version to 0.56.3-alpha.1 * fix: 日志遮罩扩大行数显示限制 (babalae#2773) * 触发器多次触发改为30s * hide map mask on run task babalae/bettergi-scripts-list#2870 * feat: 修改仓库页面构建地址 (babalae#2778) * feat: 优化地图遮罩UI,添加快捷键 (babalae#2775) * 修改二次拾取,使万叶能再次拾取。 (babalae#2760) * feat: 显示后台角色技能cd (babalae#2754) Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> Co-authored-by: 辉鸭蛋 <huiyadanli@gmail.com> * Update version to 0.56.3-alpha.2 * feat:AutoDomain支持领奖时切换20/40原粹树脂,仅JS可用 (babalae#2783) * feat:AutoDomain支持领奖时切换20/40原粹树脂,仅JS可用 * fix bug * chore * fix:捕获重试耗尽异常,GameTaskManager资源重载 * Update README.md * 新增:自动地脉花独立任务 (babalae#2583) * 新增自动地脉花任务代码 * 新增自动地脉花任务资源 * 优化自动地脉花界面文案 * 删除地脉花旧脚本与无用资源 * 完善自动地脉花说明与任务日志 * 完善一条龙地脉花配置与教程入口 * feat: Enhance AutoLeyLineOutcrop functionality and add new pathing data - Refactored combat text detection logic to improve accuracy. - Added new regions and positions for "挪德卡莱" in LeyLineOutcropData.json. - Introduced new pathing files for "挪德卡莱4-望崖营垒" and "挪德卡莱5-厄布拉神柱". - Updated config.json with new strategies and coordinates for enhanced navigation. - Improved error handling during party switch operations. - Removed outdated README.md file from pathing assets. * 修复一些日志打印 * 移动所有assets文件 * feat: clear drawn content in VisionContext before activating mask window --------- Co-authored-by: 辉鸭蛋 <huiyadanli@gmail.com> * Update version to 0.56.3-alpha.3 * 默认蒙德 * feat: 补充挪德卡莱区域的地脉花独立任务路径数据 (babalae#2790) * I18n v2 (babalae#2709) * feat(i18n): 添加界面与日志的国际化支持 - 新增 ITranslationService 接口及 JsonTranslationService 实现,提供基于 JSON 的翻译服务 - 添加 TrConverter 转换器,支持通过绑定动态翻译界面文本 - 引入 AutoTranslateInterceptor 行为,自动扫描并翻译界面中的静态文本 - 集成 TranslatingSerilogLoggerProvider,实现日志输出的实时翻译 - 在 App.xaml 中注册全局样式,为 Window、UserControl 和 Page 启用自动翻译 * refactor(AutoTranslateInterceptor): 优化自动翻译拦截器的加载与应用机制 - 移除 HomePage 中冗余的 EnableAutoTranslate 属性设置,改为继承属性 - 通过类构造函数注册全局 Loaded 事件处理器,替代在每个元素上单独添加 - 引入请求队列机制,批量处理待应用翻译的元素,避免重复调度 - 扩展属性类型检查,支持 object 类型以处理更多动态内容场景 * fix: 移除全局自动翻译拦截器以避免冲突 移除在 App.xaml 中为 Window、UserControl 和 Page 全局设置的 AutoTranslateInterceptor, 改为仅在 PickerWindow 中显式启用。这解决了全局样式可能导致的意外行为或冲突。 * feat(ui): 为多个窗口启用自动翻译拦截器 为 MapLabelSearchWindow、ArtifactOcrDialog、PromptDialog 等 14 个窗口添加了 AutoTranslateInterceptor.EnableAutoTranslate 属性,以启用自动翻译拦截功能。 * feat(i18n): 添加国际化目录支持并优化异常处理 * feat(ui): 添加软件UI语言设置并改进翻译服务 - 在通用设置页面新增UI语言选择控件,支持动态切换界面语言 - 修改游戏语言标签为“原神游戏语言”以明确区分 - 改进JsonTranslationService,支持UI语言切换时的实时翻译更新 - 优化AutoTranslateInterceptor,缓存原始文本值并在语言切换时恢复 - 添加属性变更监听机制,确保UI元素在语言切换后正确刷新 * feat(自动翻译): 添加排除自动翻译的依赖属性 在 AutoTranslateInterceptor 中新增 ExcludeAutoTranslate 附加属性,允许对特定依赖对象禁用自动翻译功能。当遍历元素进行翻译时,会检查此属性并跳过已标记排除的元素。 * feat(translation): 为缺失文本翻译添加详细上下文信息 扩展翻译服务以收集缺失文本的详细上下文,包括视图路径、元素类型、属性名等。 重构 `ITranslationService` 接口,引入 `TranslationSourceInfo` 类封装上下文信息。 修改 `AutoTranslateInterceptor` 自动收集 UI 元素信息,`JsonTranslationService` 合并多来源上下文。 * Revert "feat(自动翻译): 添加排除自动翻译的依赖属性" This reverts commit a1c2334. * fix: 跳过 GridViewRowPresenter 中的文本翻译 添加 IsInGridViewRowPresenter 检查,避免在 GridViewRowPresenter 控件内进行自动翻译,防止潜在的界面显示问题。 * fix: 修复自动翻译拦截器在组合框上下文中的误触发 在自动翻译拦截器中添加了 IsInComboBoxContext 方法,用于检测依赖对象是否处于 ComboBox 或其相关弹出菜单的上下文中。当检测到对象位于组合框上下文时,跳过自动翻译逻辑,避免对下拉选项等界面元素进行不必要的翻译操作,从而解决潜在的界面干扰问题。 * feat(translation): 添加缺失翻译上报至 Supabase 的功能 - 新增 IMissingTranslationReporter 接口及 SupabaseMissingTranslationReporter 实现 - 在 JsonTranslationService 中集成缺失翻译上报逻辑 - 添加缺失翻译收集的配置设置(MissingTranslationCollectionSettings) - 优化缺失翻译文件的序列化格式,将 Source 字段改为紧凑的数字表示 - 移除 ScriptRepoUpdater 中未使用的 using 语句 - 在 App.xaml.cs 中注册 SupabaseMissingTranslationReporter 服务 * fix: 修复自动翻译功能中原始值恢复和重复报告问题 - 移除未使用的法语翻译支持以简化语言选项 - 修复 Supabase 报告序列化时移除冗余字段 - 添加已缺失翻译键的缓存以避免重复报告 - 重构自动翻译拦截器,将原始值存储移至依赖属性 - 修复原始值恢复逻辑,确保正确遍历所有子元素 * feat(ui): 添加更新UI语言文件功能 - 在 ITranslationService 接口中添加 Reload 方法 - 在 JsonTranslationService 中实现 Reload 方法,支持重新加载语言文件并发送变更通知 - 在通用设置页面添加“更新”按钮,点击后从远程仓库下载最新语言文件 - 实现 OnUpdateUiLanguageAsync 命令,支持从 GitHub 和镜像源下载语言文件 - 下载后自动替换本地文件并重新加载翻译服务 * Update version to 0.56.3-alpha.5 * 背包计数任务更快定位到武器经验材料 (babalae#2793) * 背包计数任务更快定位到武器经验材料 * 防止任务取消时鼠标按钮可能卡在按下状态 * 删除无用日志 * fix: 修复命令行参数检测和日志翻译的条件逻辑 - 命令行参数检测改为不区分大小写,确保参数匹配的可靠性 - 调试模式下禁用日志翻译,避免开发过程中的翻译干扰 - 仅非中文界面启用翻译日志提供程序,中文界面使用标准日志 * Update version to 0.56.3-alpha.6 * fix: 地脉花任务捕获任务取消异常并调整日志级别 将地脉花自动任务中的特定异常捕获扩展为包含 TaskCanceledException,防止任务意外终止。同时将退出奖励界面的失败日志从 Warning 降级为 Debug,避免在正常任务取消时产生干扰性日志。 * fix(自动地脉花): 更新图标并改进异常处理日志 - 将自动地脉花功能图标从原图标更改为新图标 - 将自动地脉花任务失败时的日志级别从 Error 调整为 Debug,并添加简化的 Error 日志 - 在自动战斗任务结束时忽略 NormalEndException 和 TaskCanceledException 异常 * 开启地脉花之前的OCR加入延迟 * feat(script): 向脚本引擎添加新的Bv视觉类 添加BvPage、BvLocator和BvImage类型到脚本引擎的宿主对象中,扩展脚本的视觉识别能力。 * 尝试修复可能存在的角色识别错误问题 * 修复后台点击时 “选择对话选项前的延迟” 不生效的问题 * chore: add AGENTS.md to .gitignore (babalae#2798) * 更正自动拾取掉落物为扫描掉落物光柱 (babalae#2795) * 更正自动拾取掉落物为扫描掉落物光柱 原表述易引起误会,以为捡东西就要开启,改为更明确的扫描掉落物光柱以说明其功能 同时,该方法仅作为无万叶和琴时的备选方案,效果原差于直接使用聚集材料动作,将原”与万叶配合更佳“更正为”仅在无万叶时备用“ * Update en.json 更正en.json * 补充地脉花教程url * Update version to 0.56.3-alpha.7 * Update version to 0.56.3-alpha.8 * Update version to 0.56.4-alpha.1 * Update version to 0.56.4-alpha.2 * Update version to 0.56.4-alpha.3 * Update version to 0.56.4-alpha.4 * Update version to 0.57.0 * 尝试修复一些ROI越界 (babalae#2808) * fix: 修复多处 OpenCV ROI 越界导致的断言失败 在低分辨率(如 1280x720)下,多处 Rect 坐标计算未做边界保护, 直接传入 SubMat / new Mat(mat, rect) 时触发 OpenCV ROI 断言崩溃。 修复位置: - Behaviours.cs: fishBoxRect 计算结果钳位到图像边界,修复钓鱼任务越界 - GridScreen.cs: PostProcess 中幻影格子(插值生成)越界时直接丢弃 - ImageRegion.cs: DeriveCrop 两个重载统一加入坐标钳位与有效性校验 - GetGridIconsTask.cs: CropResizeArtifactSetFilterGridIcon X/Y 坐标加非负保护 - GeniusInvokationControl.cs: 角色区域扩展和 HP 区域 Y 偏移各加边界保护 * chore: 为 AutoFishingTask 鱼饵图标裁剪补充说明注释 * refactor: 提取 Rect 钳位逻辑为共享扩展方法 ClampTo 将 6 处重复的 ROI 钳位代码统一为 CommonExtension.ClampTo 扩展方法, 采用交集语义(坐标钳位时宽高同步缩减,不会扩大矩形)。 删除 AutoLeyLineOutcropTask 中的私有 ClampRect 方法。 * 文本识别的模糊匹配功能 (babalae#2799) * chore: add AGENTS.md to .gitignore * feat(config): 新增 AllowDuplicateChar OCR配置项 * refactor(ocr): Rec 暴露protected成员、提取RunInference、支持AllowDuplicateChar * feat(ocr): 打通 AllowDuplicateChar 参数链 PaddleOcrService → Rec * feat(ocr): OcrUtils 新增 CreateLabelDict/CreateWeights 工具方法 * feat(helpers): 新增 LruCache 缓存工具类 * feat(ocr): 新增 RecMatch DP模糊匹配识别器 * test(helpers): 新增 LruCache 单元测试 * test(ocr): 新增 RecMatch.GetTarget / CreateLabelDict 单元测试 * fix(ocr): 修复 RecMatch 中权重矩阵乘法的使用方式 * refactor(ocr): 合并 RecMatch 到 Rec,提取可测试静态方法,补充单元测试 将 RecMatch 子类合并到 Rec 中,消除继承关系和重复的批处理逻辑(提取 RunBatch<T>)。 将 GetTarget 核心逻辑和 GetMaxScoreDP 提取为 OcrUtils 静态方法以便独立测试。 重命名测试文件并新增 16 个单元测试覆盖 MapStringToLabelIndices、GetMaxScoreDP、CreateWeights。 * feat(ocr): 将 Rec.RunMatch 暴露给 JS 引擎和内部 C# 代码 新增 IOcrMatchService 接口,提供基于 DP 模糊匹配的 OcrMatch/OcrMatchDirect 方法, 返回 0~1 置信度分数。PaddleOcrService 实现该接口,OcrFactory.PaddleMatch 保证 非 null 返回(引擎不支持时自动回退到普通 OCR + 编辑距离字符串比较)。 BvPage 新增 OcrMatch/WaitForOcrMatch 供 JS 脚本使用,阈值可通过配置调整。 * feat(ui): 为 OCR 配置添加允许重复字符和模糊匹配阈值的设置项 在通用设置页 OCR 配置区域新增两个控件: - 允许连续重复字符(AllowDuplicateChar)开关 - OCR模糊匹配阈值(OcrMatchDefaultThreshold)输入框 * fix: 修复 PR babalae#2799 代码审查中发现的多项问题 - 修复 Rec.cs 空文本时 score/sb.Length 除零产生 NaN - 修复 BvPage.cs rect==default 时同一对象被双重 Dispose - 移除 Rec.cs Finalizer 避免 GC 线程加锁死锁 - 移除 CacheHelper WeakKey 无效功能,简化为直接 Dictionary 查找 - 添加 weights 数组长度与模型输出维度校验 - 修复 CreateLabelDict 空格标签索引冲突 - 修复 GetMaxScoreDP availableCount=0 除零 - 修复 OcrMatchFallbackService Contains 大小写敏感 - 修复 BvPage.cs DefaultRetryInterval=0 除零 - 添加 OcrMatchDefaultThreshold [0,1] 范围约束 - 提取 PaddleOcrService BGRA→BGR 转换辅助方法 - 使用 Interlocked.CompareExchange 修复 OcrFactory Fallback 线程安全 - 增大 LruCacheTests BuilderTest TTL 裕量避免 CI 不稳定 - 更新 .gitignore 注释 * fix: 修复 OcrMatch 归一化分母导致多区域匹配分数过低的 bug,改进 UI - 修复 GetMaxScoreFlat 中 availableCount 使用非空图像数作为分母, 导致多文字区域场景下匹配分数被过度稀释的问题,改为使用 target.Length - AllowDuplicateChar 设置项添加"需重新加载OCR引擎"的提示 - OCR模糊匹配阈值控件从 TextBox 改为 Slider + 数值显示 - 移除 Det 类中有问题的 finalizer(含锁的析构函数可能导致死锁) - 补充多区域场景的单元测试 * feat(ocr): 添加队伍切换时使用OcrMatch模糊匹配的选项和相关配置 * fix(ui): 更新匹配成功阈值默认值为 0.8 * fix(ocr): 修复队伍切换逻辑中的空值处理和优化代码结构 * refactor: 简化 LruCache,移除弱引用支持和 Builder 模式 - 移除有 TOCTOU bug 的 WeakReference 支持(且无实际使用方) - CacheItem 类改为 ValueTuple 减少堆分配 - 无过期时不再赋值 DateTime.MaxValue,过期检查短路跳过 - 移除仅剩两参数的 LruCacheBuilder,直接使用构造函数 * fix(ocr): 修复 CreateWeights 中空格字符权重写入错误索引的 bug 复用 CreateLabelDict 构建索引映射,确保空格映射到 labels.Count+1, 与 CreateLabelDict 保持一致。添加对应测试用例。 * fix(ocr): 修复 GCHandle.Alloc 失败时 finally 中 Free 掩盖原始异常的问题 * fix(ocr): 添加队伍选择按钮存在性检查,避免 PartySetupFailedException * fix(ocr): 调整 OcrMatchDefaultThreshold 的 TickFrequency 为 0.01 * fix(ocr): 修复区域裁剪逻辑,确保裁剪尺寸不为负值 * fix(ocr): 优化字符置信度提取逻辑,直接按目标字符索引查找置信度 * fix(ocr): 修正变量命名以保持一致性,调整方法名大小写 * fix(ocr): 修改 CreateWeights 方法以使用标签字典和标签计数,优化权重创建逻辑 * fix(ocr): 更新 OCR 置信度阈值设置,确保阈值范围为 0.01 到 0.99,并优化相关逻辑 * feat: 根据文件夹名字和内容重合度区分仓库;启动时自动更新仓库和订阅 (babalae#2767) * feat: 实现启动时自动更新已订阅脚本及多仓库分离存储 - ScriptConfig: 新增 AutoUpdateSubscribedScripts 配置项 - ScriptRepoUpdater: 动态 CenterRepoPath, 按仓库URL分离存储 - 内容重合度检测(Jaccard系数)判断仓库异同 - URL→文件夹名持久化映射(repo_folder_mapping.json) - repo_updated.json 存放于各自仓库文件夹内 - AutoUpdateSubscribedScripts 启动时自动更新订阅脚本 - 静默同步仓库、渠道URL解析、检出更新脚本 - RepoWebBridge: 使用动态路径, 辅助方法改为 internal - MainWindowViewModel: 启动时调用自动更新 * feat: 基于内容重合度的导入zip仓库 * perf: 合并默认仓库url映射 * perf: 清理兼容字段 * perf: 添加线程锁以避免并发调用 * fix: 缓存FolderMapping、修复重合度异常返回值、目录扫描异常隔离、移除未使用变量 * perf: 优化更新流程 * perf: 内存缓存添加锁 * fix: 修复更新状态逻辑,确保克隆失败时不标记为已更新 * perf: 文件夹映射先写磁盘再写缓存 * refactor: 简化生成唯一文件夹名称的方法,移除不必要的参数 * fix: ResetRepo加写锁并清理URL映射条目 * perf: 优化重合度算法 * docs: 更新注释 * fix: 仅重置实际更新成功的脚本的 hasUpdate 标记 * feat: 手动一键更新按钮 * feat: 订阅路径迁移至独立文件存储并简化更新逻辑 - 订阅数据从 config.json 迁移到 User/subscriptions/{repo}.json 独立文件 - 添加 ReaderWriterLockSlim 保护订阅文件并发读写 - 使用 System.Text.Json + ConfigService.JsonOptions 序列化 - 新增 RepoWebBridge.GetSubscribedScriptPaths() 桥接方法 - 启动时自动从旧 config.json 迁移订阅数据到独立文件 - 合并手动/自动更新为 UpdateAllSubscribedScriptsCore 共用核心 - 移除 hasUpdate 检查,直接全量更新所有订阅脚本 - 移除冗余 logPrefix 参数 * refactor: 简化启动时自动更新调用 - 移除 Task.Run + try-catch 包装,异常处理已内置于方法中 - 直接使用 fire-and-forget 异步调用 * fix: 订阅目录命名改为 PascalCase (Subscriptions) * refactor: 移除死代码和冗余中间层方法 * fix: ReadSubscriptionFile 异常时记录日志避免订阅数据静默丢失 * fix: 进度条改为Indeterminate模式、异常日志补全、订阅去重、迁移批量写入、锁注释 * refactor: 提取 ReadFolderMappingFromDisk 消除映射方法嵌套 try * fix: 补全静态方法异常日志、WriteSubscriptionFile异常保护、ManualUpdate注释 * fix: ManualUpdateSubscribedScripts 加 try-catch 兜底并提示用户重置仓库 * fix: Dialog打开时检测后台自动更新状态,自动禁用按钮并显示进度提示 - ScriptRepoUpdater 新增 IsAutoUpdating 标志和 AutoUpdateStateChanged 事件 - ScriptRepoWindow 订阅事件,自动更新期间显示进度条、禁用所有操作按钮并 Toast 提示 - 更新仓库/重置仓库按钮也加上 IsEnabled 绑定 IsUpdating * fix: 将自动更新调用包裹在 Task.Run 中避免 UI 线程阻塞 AutoUpdateSubscribedScripts 的 await 后续会被 WPF SynchronizationContext 调度回 UI 线程,导致大量 Git checkout 和文件 IO 操作阻塞界面。 用 Task.Run 确保整个流程在线程池执行。 * fix: 进度条分离 IsProgressIndeterminate 属性,按操作类型正确切换确定/不确定模式 * refactor: 消除 pathing 展开重复逻辑、用布尔字段替换字符串比较追踪状态来源、补全锁注释、统一日志方式 * fix: ExpandTopLevelPaths 泛化展开所有 PathMapper 顶层 key 防止误删用户目录,迁移移入锁内 * fix: 命令行启动配置组/一条龙前先等待自动更新订阅脚本完成 * feat: 添加命令行启动时是否先自动更新选项 * fix: 修复按钮位置 * 去除所有 Cv2.ImRead ,解决中文路径问题 * 修复 babalae#2804,树脂不足时候未终止自动秘境 * Update version to 0.57.1-alpha.1 * fix: 修复迁移订阅触发时机 (babalae#2811) * 自动拾取排除:「月谕圣牌」收藏 * revert revert babalae#2809 with babalae#2763 , 减轻死锁问题的表现 * 彻底删除 实验功能 遮罩以原神子窗体方式启动 UseSubform * fix:自动拾取黑名单配置文本框复制剪切时UI短暂无响应 (babalae#2818) * Revert "feat: 自动拾取文本识别帧间连续性检查 (babalae#2676)" (babalae#2817) * 支持任意文件名的启动 (babalae#2819) * feat: 为快速尘歌壶任务增加离开功能,支持进出双向操作 (babalae#2822) * Update version to 0.57.1-alpha.2 * 开放自动地脉花 JS调用 (babalae#2789) Co-authored-by: 辉鸭蛋 <huiyadanli@gmail.com> * feat: JS级联选择 和 秘境选择 滚轮事件禁止穿透至其他窗口 (babalae#2828) * 新增小地图遮罩,在小地图上展示资源点位 (babalae#2830) * Update version to 0.57.1-alpha.3 * refactor: 简化进程去重逻辑,直接使用 GroupBy 和 Select 使用 GroupBy 和 Select 直接获取唯一的进程对象,避免创建中间字典和手动释放重复的 Process 对象,使代码更简洁。 * fix: 修复小地图遮罩在主界面外的显示逻辑 * 修复七圣召唤月之五伊涅芙会导致手牌不可调和的死循环 (babalae#2848) * feat: 自动地脉花独立战斗配置与OCR遮罩 (babalae#2829) * 七圣召唤配置文件中可以设置骰子数量增减 (babalae#2832) * auto tcg: update character card config to v6.4 (babalae#2849) * fix:适配秘境限时全开的UI改动 (babalae#2854) --------- Co-authored-by: 躁动的氨气 <131591012+zaodonganqi@users.noreply.github.com> Co-authored-by: 起个名字好难的喵 <25520958+MisakaAldrich@users.noreply.github.com> Co-authored-by: sdk2 <469656392@qq.com> Co-authored-by: kaedelcb <57870068+kaedelcb@users.noreply.github.com> Co-authored-by: Anyrainel <vanyrainel@gmail.com> Co-authored-by: 辉鸭蛋 <huiyadanli@gmail.com> Co-authored-by: huiyadanli <15783049+huiyadanli@users.noreply.github.com> Co-authored-by: ema <mccoy39082@163.com> Co-authored-by: bling-yshs <41812674+bling-yshs@users.noreply.github.com> Co-authored-by: Ayu0K <152470574+Ayu0K@users.noreply.github.com> Co-authored-by: ShadowLemoon <119576779+ShadowLemoon@users.noreply.github.com> Co-authored-by: this-Fish <york5252@gmail.com> Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> Co-authored-by: Jamis <JamisHoo@users.noreply.github.com> Co-authored-by: DarkFlameMaster <1004452714@qq.com> Co-authored-by: ddaodan <40017293+ddaodan@users.noreply.github.com> Co-authored-by: Takaranoao <takaranoao@gmail.com> Co-authored-by: mno <718135749@qq.com> Co-authored-by: xytoki <7547189+xytoki@users.noreply.github.com> Co-authored-by: 云端客 <107686912+Kirito520Asuna@users.noreply.github.com> Co-authored-by: Guest Liang <47164120+Guest-Liang@users.noreply.github.com> Co-authored-by: HSHMENG <141244101+hshmeng@users.noreply.github.com> Co-authored-by: 郝凯阳 <10895490+haokaiyang@users.noreply.github.com>
1 parent 5195e27 commit ee0bd5a

File tree

843 files changed

+53128
-1887
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

843 files changed

+53128
-1887
lines changed

.github/workflows/publish.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ jobs:
7474
steps:
7575
- uses: actions/checkout@v4
7676
with:
77-
repository: A-Little-AnQi/bettergi-script-web
77+
repository: zaodonganqi/bettergi-script-web
7878
- uses: actions/setup-node@v4
7979
with:
8080
node-version: 20

.gitignore

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,10 +28,11 @@ github_actions_cache/
2828

2929
*.zip
3030

31-
# Rider
31+
# IDE & AI tools
3232
.idea
3333
.trae
3434
.claude
3535
CLAUDE.md
36+
AGENTS.md
3637

3738
__pycache__/
Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
11
<wpf:ResourceDictionary xml:space="preserve" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:s="clr-namespace:System;assembly=mscorlib" xmlns:ss="urn:shemas-jetbrains-com:settings-storage-xaml" xmlns:wpf="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
22
<s:Boolean x:Key="/Default/UserDictionary/Words/=chyan/@EntryIndexedValue">True</s:Boolean>
33
<s:Boolean x:Key="/Default/UserDictionary/Words/=enkanomiya/@EntryIndexedValue">True</s:Boolean>
4+
<s:Boolean x:Key="/Default/UserDictionary/Words/=Kongying/@EntryIndexedValue">True</s:Boolean>
45
<s:Boolean x:Key="/Default/UserDictionary/Words/=mirrorchan/@EntryIndexedValue">True</s:Boolean>
56
<s:Boolean x:Key="/Default/UserDictionary/Words/=onslaugh/@EntryIndexedValue">True</s:Boolean>
7+
<s:Boolean x:Key="/Default/UserDictionary/Words/=retcode/@EntryIndexedValue">True</s:Boolean>
68
<s:Boolean x:Key="/Default/UserDictionary/Words/=serenitea/@EntryIndexedValue">True</s:Boolean>
7-
<s:Boolean x:Key="/Default/UserDictionary/Words/=steambird/@EntryIndexedValue">True</s:Boolean></wpf:ResourceDictionary>
9+
<s:Boolean x:Key="/Default/UserDictionary/Words/=steambird/@EntryIndexedValue">True</s:Boolean>
10+
<s:Boolean x:Key="/Default/UserDictionary/Words/=Teyvat/@EntryIndexedValue">True</s:Boolean></wpf:ResourceDictionary>

BetterGenshinImpact/App.xaml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,8 @@
2424
<bgivc:NotNullConverter x:Key="NotNullConverter" />
2525
<bgivc:EnumToKVPConverter x:Key="EnumToKVPConverter" />
2626
<bgivc:CultureInfoNameToKVPConverter x:Key="CultureInfoNameToKVPConverter" />
27+
<bgivc:StringToColorConverter x:Key="StringToColorConverter" />
28+
<bgivc:TrConverter x:Key="TrConverter" />
2729
<Style BasedOn="{StaticResource DefaultTextBoxStyle}" TargetType="{x:Type TextBox}">
2830
<Setter Property="behavior:ClipboardInterceptor.EnableSafeClipboard" Value="True" />
2931
</Style>

BetterGenshinImpact/App.xaml.cs

Lines changed: 28 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@
2121
using BetterGenshinImpact.ViewModel;
2222
using BetterGenshinImpact.ViewModel.Pages;
2323
using BetterGenshinImpact.ViewModel.Pages.View;
24+
using LazyCache;
25+
using Microsoft.Extensions.Caching.Memory;
2426
using Microsoft.Extensions.DependencyInjection;
2527
using Microsoft.Extensions.Hosting;
2628
using Microsoft.Extensions.Logging;
@@ -34,6 +36,7 @@
3436

3537
// Wine 平台适配
3638
using BetterGenshinImpact.Platform.Wine;
39+
using BetterGenshinImpact.Service.Tavern;
3740

3841
namespace BetterGenshinImpact;
3942

@@ -83,7 +86,24 @@ public partial class App : Application
8386
}
8487

8588
Log.Logger = loggerConfiguration.CreateLogger();
86-
services.AddLogging(c => c.AddSerilog());
89+
services.AddSingleton<IMissingTranslationReporter, SupabaseMissingTranslationReporter>();
90+
services.AddSingleton<ITranslationService, JsonTranslationService>();
91+
92+
if ("zh-Hans".Equals(all.OtherConfig.UiCultureInfoName, StringComparison.OrdinalIgnoreCase))
93+
{
94+
services.AddLogging(c => c.AddSerilog());
95+
}
96+
else
97+
{
98+
services.AddLogging(logging =>
99+
{
100+
logging.ClearProviders();
101+
logging.SetMinimumLevel(LogLevel.Debug);
102+
logging.AddFilter("Microsoft", LogLevel.Warning);
103+
logging.AddFilter("Microsoft.Hosting.Lifetime", LogLevel.Warning);
104+
logging.Services.AddSingleton<ILoggerProvider, TranslatingSerilogLoggerProvider>();
105+
});
106+
}
87107

88108
services.AddLocalization();
89109

@@ -139,6 +159,12 @@ public partial class App : Application
139159
services.AddSingleton<HutaoNamedPipe>();
140160
services.AddSingleton<BgiOnnxFactory>();
141161
services.AddSingleton<OcrFactory>();
162+
services.AddMemoryCache();
163+
services.AddSingleton<IAppCache, CachingService>();
164+
services.AddSingleton<MemoryFileCache>();
165+
services.AddSingleton<IMihoyoMapApiService, MihoyoMapApiService>();
166+
services.AddSingleton<IKongyingTavernApiService, KongyingTavernApiService>();
167+
services.AddSingleton<IMaskMapPointService, MaskMapPointService>();
142168

143169
services.AddSingleton(TimeProvider.System);
144170
services.AddSingleton<IServerTimeProvider, ServerTimeProvider>();
@@ -324,4 +350,4 @@ private static void HandleException(Exception e)
324350
// log
325351
GetLogger<App>().LogDebug(e, "UnHandle Exception");
326352
}
327-
}
353+
}

BetterGenshinImpact/BetterGenshinImpact.csproj

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
<PropertyGroup>
44
<AssemblyName>BetterGI</AssemblyName>
5-
<Version>0.55.1-alpha.4</Version>
5+
<Version>0.57.1-alpha.3</Version>
66
<IncludeSourceRevisionInInformationalVersion>false</IncludeSourceRevisionInInformationalVersion>
77
<OutputType>WinExe</OutputType>
88
<TargetFramework>net8.0-windows10.0.22621.0</TargetFramework>
@@ -45,17 +45,19 @@
4545
<PackageReference Include="BetterGI.VCRuntime" Version="14.44.35208" />
4646
<PackageReference Include="BetterGI.Assets.Map" Version="1.0.17" />
4747
<PackageReference Include="BetterGI.Assets.Model" Version="1.0.18" />
48-
<PackageReference Include="BetterGI.Assets.Other" Version="1.0.10" />
48+
<PackageReference Include="BetterGI.Assets.Other" Version="1.0.12" />
4949

5050
<PackageReference Include="CommunityToolkit.Mvvm" Version="8.2.2" />
5151
<PackageReference Include="DeviceId" Version="6.9.0" />
5252
<PackageReference Include="DeviceId.Windows" Version="6.9.0" />
5353
<PackageReference Include="DeviceId.Windows.Wmi" Version="6.9.0" />
5454
<PackageReference Include="Emoji.Wpf" Version="0.3.4" />
5555
<PackageReference Include="LibGit2Sharp" Version="0.31.0" />
56+
<PackageReference Include="LazyCache" Version="2.4.0" />
5657
<PackageReference Include="MailKit" Version="4.14.0" />
5758
<PackageReference Include="Meziantou.Framework.Win32.CredentialManager" Version="1.7.4" />
5859
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="9.0.4" />
60+
<PackageReference Include="Microsoft.Extensions.Caching.Memory" Version="9.0.4" />
5961
<PackageReference Include="Microsoft.Extensions.Hosting" Version="9.0.4" />
6062
<PackageReference Include="Microsoft.Extensions.Localization" Version="9.0.4" />
6163
<PackageReference Include="Microsoft.Extensions.Logging" Version="9.0.4" />
@@ -82,16 +84,18 @@
8284
<PackageReference Include="Serilog.Sinks.Console" Version="6.0.0" />
8385
<PackageReference Include="Serilog.Sinks.File" Version="6.0.0" />
8486
<PackageReference Include="Serilog.Sinks.RichTextBoxEx.Wpf" Version="1.1.0.1" />
87+
<!-- <PackageReference Include="supabase-csharp" Version="0.16.2" />-->
8588
<PackageReference Include="System.Drawing.Common" Version="10.0.0" />
8689
<PackageReference Include="System.IO.Hashing" Version="9.0.4" />
8790
<PackageReference Include="TorchSharp" Version="0.105.0" />
8891
<PackageReference Include="Vanara.PInvoke.NtDll" Version="4.1.3" />
8992
<PackageReference Include="Vanara.PInvoke.SHCore" Version="4.1.3" />
9093
<PackageReference Include="Vanara.PInvoke.User32" Version="4.1.3" />
94+
<PackageReference Include="XamlAnimatedGif" Version="2.3.1" />
9195
<PackageReference Include="WPF-UI" Version="4.2.0" />
9296
<PackageReference Include="WPF-UI.DependencyInjection" Version="4.2.0" />
9397
<PackageReference Include="WPF-UI.Tray" Version="4.2.0" />
94-
<PackageReference Include="WPF-UI.Violeta" Version="4.2.0" />
98+
<PackageReference Include="WPF-UI.Violeta" Version="4.2.0.1" />
9599
<PackageReference Include="gong-wpf-dragdrop" Version="3.2.1" />
96100
<PackageReference Include="YamlDotNet" Version="16.3.0" />
97101
<PackageReference Include="YoloSharp" Version="6.0.3" />
@@ -125,6 +129,9 @@
125129
<None Update="GameTask\AutoFishing\Assets\1920x1080\**">
126130
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
127131
</None>
132+
<None Update="GameTask\AutoLeyLineOutcrop\Assets\**">
133+
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
134+
</None>
128135
<None Update="GameTask\LogParse\Assets\**">
129136
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
130137
</None>
@@ -191,6 +198,12 @@
191198
<None Update="GameTask\Common\Element\Assets\1920x1080\in_domain.png">
192199
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
193200
</None>
201+
<None Update="GameTask\AutoDomain\Assets\1920x1080\**">
202+
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
203+
</None>
204+
<None Update="User\I18n\en.json">
205+
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
206+
</None>
194207
</ItemGroup>
195208

196209
<ItemGroup>

BetterGenshinImpact/Core/BgiVision/BvPage.cs

Lines changed: 55 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,9 @@
22
using System.Threading;
33
using System.Threading.Tasks;
44
using BetterGenshinImpact.Core.Recognition;
5+
using BetterGenshinImpact.Core.Recognition.OCR;
56
using BetterGenshinImpact.Core.Simulator;
7+
using BetterGenshinImpact.GameTask;
68
using BetterGenshinImpact.GameTask.Common;
79
using BetterGenshinImpact.GameTask.Model.Area;
810
using Fischless.WindowsInput;
@@ -118,4 +120,56 @@ public void Click(double x, double y)
118120
{
119121
GameCaptureRegion.GameRegion1080PPosClick(x, y);
120122
}
121-
}
123+
124+
/// <summary>
125+
/// 使用模糊匹配判断截图中是否包含目标文字。
126+
/// 通过 <see cref="OcrFactory.PaddleMatch"/> 自动选择最佳实现(DP 模糊匹配或普通 OCR + 字符串比较)。
127+
/// </summary>
128+
/// <param name="target">目标字符串</param>
129+
/// <param name="rect">感兴趣区域,default 表示全屏</param>
130+
/// <param name="threshold">匹配阈值 (0~1),null 使用配置中的默认阈值</param>
131+
/// <returns>是否匹配成功</returns>
132+
public bool OcrMatch(string target, Rect rect = default, double? threshold = null)
133+
{
134+
var matchService = OcrFactory.PaddleMatch;
135+
var actualThreshold = threshold
136+
?? TaskContext.Instance().Config.OtherConfig.OcrConfig.OcrMatchDefaultThreshold;
137+
138+
var screen = TaskControl.CaptureToRectArea();
139+
try
140+
{
141+
var roi = rect == default ? null : screen.DeriveCrop(rect);
142+
try
143+
{
144+
var score = matchService.OcrMatch((roi ?? screen).SrcMat, target);
145+
return score >= actualThreshold;
146+
}
147+
finally
148+
{
149+
roi?.Dispose();
150+
}
151+
}
152+
finally
153+
{
154+
screen.Dispose();
155+
}
156+
}
157+
158+
/// <summary>
159+
/// 重复截图并使用模糊匹配,等待目标文字出现。
160+
/// 超时返回 false 而非抛异常。
161+
/// </summary>
162+
/// <param name="target">目标字符串</param>
163+
/// <param name="rect">感兴趣区域,default 表示全屏</param>
164+
/// <param name="threshold">匹配阈值 (0~1),null 使用配置中的默认阈值</param>
165+
/// <param name="timeout">超时时间(毫秒),null 使用 DefaultTimeout</param>
166+
/// <returns>是否在超时前匹配成功</returns>
167+
public async Task<bool> WaitForOcrMatch(string target, Rect rect = default, double? threshold = null, int? timeout = null)
168+
{
169+
var actualTimeout = timeout ?? DefaultTimeout;
170+
var retryCount = DefaultRetryInterval > 0 ? actualTimeout / DefaultRetryInterval : 1;
171+
172+
return await NewRetry.WaitForAction(() => OcrMatch(target, rect, threshold),
173+
_cancellationToken, retryCount, DefaultRetryInterval);
174+
}
175+
}

BetterGenshinImpact/Core/Config/AllConfig.cs

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,9 @@
2222
using BetterGenshinImpact.GameTask.AutoStygianOnslaught;
2323
using BetterGenshinImpact.GameTask.GetGridIcons;
2424
using BetterGenshinImpact.GameTask.AutoEat;
25+
using BetterGenshinImpact.GameTask.AutoLeyLineOutcrop;
26+
using BetterGenshinImpact.GameTask.MapMask;
27+
using BetterGenshinImpact.GameTask.SkillCd;
2528
using BetterGenshinImpact.GameTask.UseRedeemCode;
2629

2730
namespace BetterGenshinImpact.Core.Config;
@@ -171,7 +174,22 @@ public partial class AllConfig : ObservableObject
171174
/// 自动吃药配置
172175
/// </summary>
173176
public AutoEatConfig AutoEatConfig { get; set; } = new();
177+
178+
/// <summary>
179+
/// 自动地脉花配置
180+
/// </summary>
181+
public AutoLeyLineOutcropConfig AutoLeyLineOutcropConfig { get; set; } = new();
174182

183+
/// <summary>
184+
/// 地图遮罩
185+
/// </summary>
186+
public MapMaskConfig MapMaskConfig { get; set; } = new();
187+
188+
/// <summary>
189+
/// 技能 CD 提示
190+
/// </summary>
191+
public SkillCdConfig SkillCdConfig { get; set; } = new();
192+
175193
/// <summary>
176194
/// 自动使用
177195
/// </summary>
@@ -261,12 +279,15 @@ public void InitEvent()
261279
AutoArtifactSalvageConfig.PropertyChanged += OnAnyPropertyChanged;
262280
AutoRedeemCodeConfig.PropertyChanged += OnAnyPropertyChanged;
263281
AutoEatConfig.PropertyChanged += OnAnyPropertyChanged;
282+
AutoLeyLineOutcropConfig.PropertyChanged += OnAnyPropertyChanged;
283+
MapMaskConfig.PropertyChanged += OnAnyPropertyChanged;
264284
AutoMusicGameConfig.PropertyChanged += OnAnyPropertyChanged;
265285
TpConfig.PropertyChanged += OnAnyPropertyChanged;
266286
ScriptConfig.PropertyChanged += OnAnyPropertyChanged;
267287
PathingConditionConfig.PropertyChanged += OnAnyPropertyChanged;
268288
DevConfig.PropertyChanged += OnAnyPropertyChanged;
269289
HardwareAccelerationConfig.PropertyChanged += OnAnyPropertyChanged;
290+
SkillCdConfig.PropertyChanged += OnAnyPropertyChanged;
270291
}
271292

272293
public void OnAnyPropertyChanged(object? sender, EventArgs args)
@@ -279,4 +300,4 @@ public void OnNotificationPropertyChanged(object? sender, PropertyChangedEventAr
279300
{
280301
NotificationService.Instance().RefreshNotifiers();
281302
}
282-
}
303+
}

BetterGenshinImpact/Core/Config/HotKeyConfig.cs

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
using BetterGenshinImpact.Model;
1+
using BetterGenshinImpact.Model;
22
using CommunityToolkit.Mvvm.ComponentModel;
33
using System;
44

@@ -100,6 +100,13 @@ public partial class HotKeyConfig : ObservableObject
100100

101101
[ObservableProperty]
102102
private string _quickTeleportTickHotkeyType = HotKeyTypeEnum.KeyboardMonitor.ToString();
103+
104+
// 技能CD提示开关
105+
[ObservableProperty]
106+
private string _skillCdEnabledHotkey = "";
107+
108+
[ObservableProperty]
109+
private string _skillCdEnabledHotkeyType = HotKeyTypeEnum.KeyboardMonitor.ToString();
103110

104111
// 截图
105112
[ObservableProperty]
@@ -237,4 +244,11 @@ public partial class HotKeyConfig : ObservableObject
237244

238245
[ObservableProperty]
239246
private string _onedragonHotkeyType = HotKeyTypeEnum.KeyboardMonitor.ToString();
247+
248+
// 地图遮罩开关
249+
[ObservableProperty]
250+
private string _mapMaskEnabledHotkey = "";
251+
252+
[ObservableProperty]
253+
private string _mapMaskEnabledHotkeyType = HotKeyTypeEnum.KeyboardMonitor.ToString();
240254
}

BetterGenshinImpact/Core/Config/MaskWindowConfig.cs

Lines changed: 4 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -63,13 +63,6 @@ public partial class MaskWindowConfig : ObservableObject
6363
[ObservableProperty]
6464
private bool _showFps = false;
6565

66-
/// <summary>
67-
/// 作为原神子窗体
68-
/// 有些bug没解决
69-
/// </summary>
70-
[ObservableProperty]
71-
private bool _useSubform = false;
72-
7366
/// <summary>
7467
/// 遮罩文本透明度 (0.0-1.0)
7568
/// </summary>
@@ -83,10 +76,10 @@ public partial class MaskWindowConfig : ObservableObject
8376
private double _logTextBoxLeftRatio = 20.0 / 1920;
8477

8578
[ObservableProperty]
86-
private double _logTextBoxTopRatio = 832.0 / 1080;
79+
private double _logTextBoxTopRatio = 822.0 / 1080;
8780

8881
[ObservableProperty]
89-
private double _logTextBoxWidthRatio = 477.0 / 1920;
82+
private double _logTextBoxWidthRatio = 480.0 / 1920;
9083

9184
[ObservableProperty]
9285
private double _logTextBoxHeightRatio = 188.0 / 1080;
@@ -95,10 +88,10 @@ public partial class MaskWindowConfig : ObservableObject
9588
private double _statusListLeftRatio = 20.0 / 1920;
9689

9790
[ObservableProperty]
98-
private double _statusListTopRatio = 807.0 / 1080;
91+
private double _statusListTopRatio = 790.0 / 1080;
9992

10093
[ObservableProperty]
101-
private double _statusListWidthRatio = 477.0 / 1920;
94+
private double _statusListWidthRatio = 480.0 / 1920;
10295

10396
[ObservableProperty]
10497
private double _statusListHeightRatio = 24.0 / 1080;

0 commit comments

Comments
 (0)