hanfuit
|
90877233fd
|
docs:AGENTS.md 补协作约定(走分支、推前先 rebase、推完要同步)
起因:别人直接推 main(cc54603),本地未同步就分叉;同时 tag 与发布包错位。
把这些变成明文规则,避免下一个人或下一个 AI 重犯。
- 8.1 推送前先 rebase(强制):git status -sb → git pull --rebase → push 固定顺序,
禁止 push 被拒后用 reset --hard,附冲突处理与真实案例
- 8.2 多人/多 AI 协作走分支:跨文件、双人同改 gmweb/ 必须走分支 + 合并请求;
单人确定改动与纯文档可直推,但仍受 8.1 约束
- 8.3 推完不等于生效:同步 Z:/90server 与桌面补丁包 → diff -rq → 重打包 → 通知重启
- 发版清单新增:打 tag 前用 git log -1 与 ls-remote 的 ^{} 双向确认指向实际发布的提交
- 当前状态记录 tag 基线:v2026.11.05 → 3b240ec(annotated),后续提交不在该 tag 内
- 不要做的事补三条:未 pull 就 push、reset --hard 覆盖、tag 错位发 Release
|
2026-11-05 19:34:32 +08:00 |
|
hanfuit
|
cc546031b0
|
gmweb:游戏内一键换装、方案配置与全局热键说明
|
2026-11-05 18:19:24 +08:00 |
|
hanfuit
|
3b240ec176
|
docs:新增 AGENTS.md 作为 AI / 新人接续开发的入口文件
一页纸解决「接手时不知道从哪读、哪些不能碰、改完怎么验」:
- 0 组件与端口速览;1 必读顺序(踩坑记录 P-001/P-002/P-011 列为首要)+ 按改动选文档
- 2 硬规则 R1–R9:DLL 与 exe 成对、改 DLL 要补 CRC 并重编服务端、Z 盘只是部署副本、
gmweb 只能 IE11、静态 no-store、sys.executable 陷阱、不提交产物、版本号三处一致、声明与 GPL
- 3 构建命令(服务端三个 exe / 启动器单文件 / 客户端补丁 / PVF 导出)
- 4 代码地图:server.py 按功能给出行号区间,其余给模块职责
- 5 验证方法:进程端口、启动器日志、CRC verify、diff -rq,
以及本项目一直在用的「静态服务 + 无头浏览器截图/量 rect」手法,附分场景清单
- 6 发版七项清单;7 当前状态;8 提交约定;9 不要做的事
- CLAUDE.md 作为指向 AGENTS.md 的兼容入口;根 README 顶部与文档索引、docs/README 同步挂上
|
2026-11-05 17:40:13 +08:00 |
|
hanfuit
|
adcc5b0f3a
|
docs:新增踩坑记录,13 条坑的成因复盘与判断规则
和「排查记录」不同,这份文档不写怎么修,只回答「为什么会踩、为什么没早发现」,
给的是可迁移的判断,而不是单次操作步骤。
- P-001 启动器套娃开窗:三层成因(打包改变 sys.executable 语义 / Popen 只保证
进程创建不保证脚本执行 / 端口顺延把必然失败伪装成正常启动)、四个掩盖因素、
四个不成立的隐含假设,以及「拉起子进程要校验副作用而非返回值」等五条教训
- P-002~P-013:DLL 指纹绑定、CRC32 种子、CRC 槽位扫错节、CSS 特异性、IE11、
旧进程占端口、WebView2 缓存、console=False、图片占位时序、仓库与部署副本、
replace 静默失败、补丁包缺文件
- 结尾提炼八条通用规则与发版检查清单
- 文档索引:根 README、docs/README 各补一行;排查文档顶部加成因复盘的交叉链接
|
2026-11-05 17:27:47 +08:00 |
|
hanfuit
|
c6587d88ee
|
启动器:修复打包后自我套娃开窗,补运行日志与排查文档
根因:start_gmweb() 用 sys.executable 拉起 gmweb/serve.py,源码运行时是
python.exe,PyInstaller 单文件打包后却是启动器自身 —— 于是 `exe serve.py`
又开了一个启动器,新启动器再去拉 serve.py,每代顺延一个端口并各开一个
空窗口,直到 19546 端口用尽。开发机因为 18112 早被占用走了 early return,
所以看不出来。
- 新增多调用模式 run_script_instead():exe <xxx.py> [args] 时用 runpy 直接
执行该脚本,不开窗口/不提权/不占互斥量,打包后拉起 serve.py 才合法
- 新增单实例互斥(Local\DNF90Launcher-5E9C1B7A):重复启动把已有窗口
ShowWindow+SetForegroundWindow 后退出,不再开第二个窗口
- start_gmweb() 增加就绪校验:spawn 后最多等 6 秒确认 18112 在监听,未监听
则改用 importlib 在本进程线程里跑 serve.py 的 main(),绝不再拉起新窗口
- self_elevate() 提权重启带上原始参数(原来 ShellExecuteW 传 None,参数全丢);
DNF90_GMWEB_CHILD=1 的子进程不再触发 UAC
- WebView2 数据目录固定到 %LOCALAPPDATA%\DNF90Launcher\WebView2 且
private_mode=False,避免 exe 在只读目录/网络盘时窗口空白且无报错;
启动前查注册表确认运行时是否存在
- 新增 启动器日志.txt(exe 同目录,512KB 转 .old.txt):console=False 下
print 与未捕获异常全部落盘,顶部记录 pid/argv/SERVER_ROOT
- 文档:新增 docs/启动器窗口风暴排查.md(现象、根因、复现手法、修复点、
日志判读表),README 常见坑与文档索引、docs/README、launcher/README 同步
|
2026-11-05 17:22:51 +08:00 |
|
hanfuit
|
da502b3524
|
docs:补上 90CN.dll 自校验 CRC 工具的文档说明
- 新增 docs/客户端补丁与CRC校验.md:SelfCrcSlot 结构、CRC32 算法与种子坑、
槽位为什么只在 .data/.rdata 里找、info/verify/patch 用法与退出码、
build_90cn.ps1 集成、与「服务端 DLL 指纹」的区别、六类故障排查
- 新增 client-patch/tools/README.md:脚本清单与常用命令速查
- docs/README.md:文档索引与上手路径补一条
- 根 README:关键设计说明补「客户端自校验(CRC32)」小节,文档索引补一行
- 90CN.cpp:清掉过期的重复注释(旧的 patch_selfcrc.py / .text 段说法),与实现对齐
|
2026-11-05 16:40:33 +08:00 |
|
hanfuit
|
9bdaf28683
|
docs:网盘地址改为真实百度网盘分享(提取码 s33r)
- docs/release/网盘下载.url:URL 换成 pan.baidu.com/s/1j31dVPF_nPKSN2QYHU-Ygg?pwd=s33r,双击直达目录
- 发布说明模板:下载表格填百度网盘真实链接与提取码,阿里云盘一行保留待填
- docs/release/README.md:占位说明改为「已指向真实分享,重新分享后需同步」
- 根 README:标题下与快速开始处补上成品下载入口
|
2026-11-05 16:19:37 +08:00 |
|
hanfuit
|
904f8a45d0
|
README:架构章节改用表格,避免中文宽度导致的 ASCII 图错位
|
2026-11-05 16:17:10 +08:00 |
|
hanfuit
|
607d705908
|
README:按 v2026.11.05 现状重写
- 补全整体架构图(启动器 19527 / 服务端 18111 / GM 页 18112 / 客户端 DLL)
- 目录结构补 gmweb、launcher/qr、docs/release
- 子项目表补 gmweb,标注 Go 1.26.5、Python 3.15 32 位
- 新增:启动器六页与更新日志双来源、GM 控制台 IE11 布局约束、二维码替换规则
- 新增:版本号与发布流程(CURRENT_VERSION、Release、网盘 .url 附件、DLL 指纹绑定)
- 新增:常见坑速查表、文档索引、提交约定
|
2026-11-05 16:16:45 +08:00 |
|
hanfuit
|
65169f5e81
|
docs:发布物料入库(Release 说明模板 + 网盘 .url 快捷方式)
- docs/release/发布说明模板.md:本次更新 / 下载渠道 / 安装 / 说明四段
- docs/release/网盘下载.url:InternetShortcut 模板,URL 为占位,发版前替换
- docs/release/README.md:发版七步与常见坑(占位地址别直传、DLL 与 EXE 需配套)
|
2026-11-05 16:16:41 +08:00 |
|
hanfuit
|
fb3ec9f777
|
GM 页:关于页补上官方QQ群二维码,面板改为三列
- 关于页组合面板 534→712,新增中间列「官方QQ群」(178px,含 QQ 群号 1128511524)
- 新增 gmweb/qr/qq.png,沿用 bindQr 的缺图占位逻辑(qr-qq)
- 介绍卡片同步加宽到 712,与面板左右对齐;资源版本号 ?v=20261105C
|
2026-11-05 16:13:53 +08:00 |
|
hanfuit
|
cc6beb0a71
|
启动器:关于页新增官方QQ群二维码,内容整体居中
- 关于页二维码面板改为三列:赞助我们(支付宝/微信)| 官方QQ群 | 团队公众号
- 新增 qr/qq.png 并加入 /qr/ 白名单与打包资源
- 各列二维码改为列内居中,QQ群列宽 184px,避免群号文字折行
- 关于页内容块 margin:0 auto 整体居中,并压缩上下间距使 1204x717 窗口内不出现滚动条
|
2026-11-05 16:11:26 +08:00 |
|
hanfuit
|
6a4b7e58d3
|
启动器:游戏更新拆分为当前/历史双子页,新增关于我们页
- 游戏更新页改为「当前更新 / 历史更新」两个标签页,历史页显示条数
- 更新日志合并仓库 Release 与本地 更新日志.txt,按日期去重、仓库优先;断网时仅用本地记录
- 主导航新增「关于我们」,内容与游戏内控制台关于页一致(四行文案 + 赞助/公众号二维码)
- 新增 /qr/<name> 白名单路由读取启动器目录 qr\ 下图片,防止目录穿越
- 二维码支持点击放大(灯箱),图片缺失时显示占位而不是破图
- 打包 spec 补入 qr 三张图,静态响应统一 Cache-Control: no-store
|
2026-11-05 16:05:00 +08:00 |
|
hanfuit
|
1dd3775510
|
配置:GM 控制台窗口宽 920→800,窄屏下四页布局实测无横向溢出
|
2026-11-05 15:17:10 +08:00 |
|
hanfuit
|
040f6fbd93
|
启动器:品牌改为 DNF90 灵宝小竹单机版,本地版本号 v2026.11.05,静态响应禁缓存
- index.html:title / 品牌条 / 首页主标题 / 赞助弹窗文案 统一改品牌名
- server.py:CURRENT_VERSION 与 statVersion 占位同步到 v2026.11.05
- server.py:Handler._send 增加 Cache-Control: no-store,避免 WebView2 缓存旧页面
|
2026-11-05 15:16:44 +08:00 |
|
hanfuit
|
ee3e8d0ced
|
GM 页:顶部合并为一行,赞助页改关于页(三张二维码),标签支持 hash 直达
- #hd 与 #tabs 合并成 #topbar,标签在左、连接状态在右,内容区多出 22px
- 赞助页改为关于页:介绍卡片 + 赞助我们/团队公众号组合面板,三张二维码同一行
- 二维码占位修复(img 在脚本前已 404,补 complete/naturalWidth 兜底)
- 标签支持 #home/#char/#item/#about 直达
- 内容区底部 62→71,修正被日志栏遮住 9px 的问题
|
2026-11-05 15:16:39 +08:00 |
|
hanfuit
|
06558415da
|
GM 页改版:加回满疲劳/赞助页,去掉背包与邮件页和重复标题
- 角色页新增「回满疲劳」,走 POST /dnf/gm/characters/{id}/fatigue/refill(需角色下线)
- 新增「赞助」页:支付宝 / 微信收款码占位,图放 gmweb/qr/ 下即显示
- 删除背包页与邮件页(发到邮箱按钮保留在发物品页)
- 去掉页头「GM 控制台」文字(窗口标题栏已画标题,重复),页头只留连接状态
- serve.py 补 jpg/jpeg/gif/webp/bmp/svg 的 MIME
- 控制台宽度 1040 -> 920
|
2026-11-05 14:15:41 +08:00 |
|
hanfuit
|
7f41f9797a
|
GM 控制台跟随游戏窗口:窗口模式下按游戏客户区收小并居中
- 新增 FindGameWindow/FitInsideGame:取本进程最大可见顶层窗口的客户区作为游戏画面
- 开窗口时按 min(配置尺寸, 客户区-2倍边距) 定尺寸并居中;游戏画面小于配置时自动缩
- 新增 GmWindowFollowGame:切全屏/改分辨率/挪游戏窗口时重新摆放,玩家手动拖过的窗口不动
- 服务端指纹回绑 186A2C95… (1260032)
|
2026-11-05 13:29:05 +08:00 |
|
hanfuit
|
0c7ef6d645
|
小井盖面板全程压制:不再放回、关控制台后关闭并抑制 2.5 秒
- 触发条件改为「面板真的可见」而不是「窗口存在」,避免隐藏缓存的旧面板被当成点击
- 控制台打开期间面板一露头就 SW_HIDE,关控制台时关面板并在 2.5 秒内持续压制、最多再请 4 次关闭
- 轮询从 250ms 提到 40/60ms,消除旧页面闪现
- 服务端指纹回绑 CE86D4DF… (1258496)
|
2026-11-05 13:26:06 +08:00 |
|
hanfuit
|
32469e4341
|
配置注释:本服全屏为无边框最大化,置顶控制台已验证可覆盖
|
2026-11-05 13:22:34 +08:00 |
|
hanfuit
|
0a6baf20e9
|
配置:关掉 GM 控制台时直接关闭游戏内嵌面板(close_action=1)
|
2026-11-05 13:18:17 +08:00 |
|
hanfuit
|
b22579658e
|
小井盖改为自绘 GM 窗口(WebView2)+ 背包可见 + 启动器互斥
- 90CN.dll:新增 90CN_gm_window.cpp,自绘标题栏/边框的置顶窗口,内嵌 WebView2 承载 gmweb 页面
- 点小井盖时隐藏游戏内嵌 IE 面板、弹出控制台;关掉后还原,独占全屏压不住时可选 minimize_game
- 窗口每轮确认置顶,避免游戏抢窗口栈后消失
- gmweb:新增背包页,发放后自动跳转并高亮新入包的行(GET /local/dnf-gm/inventory/list)
- 启动器:新增 /console-status,控制台运行时置灰 GM 工具入口并阻止进入
- 服务端指纹回绑新 DLL(1258496 / 7A179B1B…)
|
2026-11-05 13:16:52 +08:00 |
|
hanfuit
|
e9a3952a9d
|
GM 页:修复内嵌 IE 输入法 + 物品分类浏览
- 90CN.dll:给 IE 控件窗口链重新关联 IME 上下文,中文输入不再只能打字母
- gmweb:页面加 ime-mode:active,focus 时再主动要一次
- 物品页加分组/类型/等级筛选,不依赖中文输入也能定位物品
- 服务端指纹回绑新 DLL(1223680 / 26633404…)
|
2026-11-05 12:37:03 +08:00 |
|
hanfuit
|
c4ffa57bf2
|
GM 页:增幅属性按 PVF 实际映射标注(物防/魔防/物攻/魔攻)
|
2026-11-05 12:22:08 +08:00 |
|
hanfuit
|
18e98ca7c9
|
小助手内嵌 GM 页:网页重定向 + 物品分页 + 装备强化增幅发放
- 90CN.dll 新增 IE 控件接管,把腾讯小助手页面重定向到本地 GM 页
- gmweb:物品列表改分页(每页 10/20/50,列表固定 6 行高)
- 发放走 grant-options,支持强化 0-31、增幅属性+等级、锻造 0-8、品质
- 服务端补齐 amplify_level:等级统一写入 ext_data0/packed_flag_byte/reinforce/upgrade_level
- 增幅与强化互斥校验,避免写出客户端无法创建的装备
|
2026-11-05 12:20:46 +08:00 |
|
hanfuit
|
6e570fe820
|
修复 DLL 自校验 CRC 算法并加固槽位定位(频道无法连接问题)
根因:重写的 patch_dll_crc.py 用 binascii.crc32(data, 0xFFFFFFFF) 计算 CRC,
该参数是"末值异或之后的运行值",再喂回去等于重复施加了条件化,得到的是
CRC32 的另一个变体,与 90CN.cpp 里 Crc32Update 的实现不一致。结果是补丁写
入的 expected 永远校验不过,客户端在 VerifySelfIntegrity 失败后安装流程中断,
transport 钩子(codec/decode/route/dproto)全部没装上,表现为"无法连接频道"。
改动:
- tools/patch_dll_crc.py
* CRC 改为标准 zlib.crc32(init 默认 0),与 C 端 Crc32Update 完全一致;
已用旧版本 DLL 反向验证(10-20、11-03、10-28 三份的存储值均能复算一致)
* 槽位改为按 PE 段表定位,只接受 .data/.rdata 内的候选,拒绝把补丁写进
.text 机器码(此前曾命中 cmp ..., 0C0DEC0DEh 的立即数导致访问违例)
* 新增 info/verify 子命令,patch 后自动回读校验
- 90CN.cpp
* SelfCrcSlot 三个字段加 volatile,避免 /O2 把 offset/expected 折叠成常量
* VerifySelfIntegrity 增加分步诊断日志,便于定位安装线程中断点
- client_build_id.go
* 指纹重绑为本次构建产物:1215488 / C7BE377C…8247071A
验证:客户端日志 self crc check computed==expected==0x80AFC116 ok=1,
transport DLL installed codec=1 decode=1 route=1 dproto=1,
channel connect result=1,first-login watchdog server_seen=1 client_seen=1。
|
2026-11-05 11:37:10 +08:00 |
|
hanfuit
|
2ca06e113a
|
修正客户端完整性校验:补齐 CRC 后处理脚本并回绑 90CN.dll 指纹
问题:上一提交把 boundDll 指纹改成 1230336/F6DDA534…,但配套的
90CN.dll 未交付到客户端目录,服务端启动即被 verifyClientArtifacts 拦下
(client dll: size mismatch: 1230848 != 1230336),日志表现为空壳。
本次改动:
- 新增 client-patch/tools/patch_dll_crc.py,实现仓库中缺失的 DLL 自校验
槽位回填(magic 0xC0DEC0DE + offset + 全文件 CRC32,跳过自身 4 字节),
附带 verify 子命令可回读校验
- 新增 client-patch/tools/build_90cn.bat / .ps1,一键编译 + 打 CRC + 输出指纹
- client_build_id.go 指纹回绑到本次实际构建产物:
1215488 / 30E41FF583893E611E6975DF96246E1320B042F7B33A32503C987F211D1776F5
验证:重编 DNF90Server.exe 后裸跑,完整性校验通过,PVF 加载完成,
dnfbridge 正常监听 :7001,game_ports=31,admin http 127.0.0.1:18111。
|
2026-11-05 10:41:47 +08:00 |
|
hanfuit
|
c58168406b
|
启动器:游戏更新入口移到开始旁,移除设置页面
- 侧边栏顺序调整为 开始 → 游戏更新 → GM工具 → 一键换装 → 游戏设置
- 删除「设置」页面(侧边栏入口 + page-settings section)
- shell.js 移除 loadSettings 函数及 setRefresh 事件监听
- shell.css 清理 .settings-* 相关样式(明暗主题两套)
|
2026-11-04 20:38:22 +08:00 |
|
hanfuit
|
0ced464168
|
启动器新增游戏设置页(频道开关+活动开关),窗口标题改名
- 服务端新增活动开关运行时配置与 GM 接口(GET/POST /dnf/gm/activity-switches),
持久化到 Settings,接入月签到/周签到/PC房↔累计在线的实时下发
- 服务端新增频道开关 GM 接口(channel-switches),目录生成时过滤禁用频道
- channelcatalog/channelinfo 支持按禁用频道 ID 过滤目录与客户端脚本
- 启动器新增「游戏设置」页面:频道开关 Tab + 活动开关 Tab
- native.py/server.py 新增对应转发 API
- 窗口标题/页面 title/侧边栏「90轮回」统一改为「DNF90 灵狐小竹整合单机版」
|
2026-11-04 20:08:50 +08:00 |
|
hanfuit
|
977a4a1196
|
启动器:移除服务端工具/支援兵/插件页面,支援兵模板独立保存
- 删除服务端工具、支援兵、插件三个页面(侧边栏入口 + HTML section)
- server.py: 删除 servertool(9个)、companion/basic-attack 相关接口及常量
- native.py: 删除无人引用的 get_server_features/save_server_features/
companion_state/companion_save(保留 GM 工具依赖的 gameplay 方法)
- shell.js: 删除 loadServerTool/loadCompanion 全部逻辑及状态变量
- shell.css: 清理 st-/cp- 相关样式
- templates/支援兵页面模板.md: 支援兵页面完整导出为独立模板
- 侧边栏「更新日志」更名为「游戏更新」
|
2026-11-04 19:32:01 +08:00 |
|
hanfuit
|
56236496a0
|
启动器 UI 改用仓库新源码,不上传本机旧 UI
|
2026-11-04 19:24:41 +08:00 |
|
hanfuit
|
70b3c5a6dc
|
合并本地领先源码:旧UI、GM疲劳燃烧、白金徽章孔、宠物修复、支援兵普攻开关
|
2026-11-04 19:20:49 +08:00 |
|
hanfuit
|
f2debaf9bf
|
启动器:接入 Gitea Releases 自动检查更新 + 更新日志页
- server.py: 新增 /api/update/check、/api/update/changelog 接口,
用标准库 urllib 请求自托管仓库 Lingbao/90CNServer 的 Releases,
带 5 分钟缓存与 8 秒超时;本地版本号写死 v2026.11.04
- shell.js: 版本卡片改为动态读取远程最新 tag,发现新版本绿色可点击
跳转;新增 loadChangelog 渲染发布记录
- index.html/shell.css: 更新日志页改为动态容器,补充卡片样式
|
2026-11-04 19:16:05 +08:00 |
|
hanfuit
|
d31a34e9aa
|
GM 工具:点券实时刷新 + 界面排版与文案优化
服务端:
- gm_tool_wallet.go: GMAdjustAccountCera 落库后遍历在线会话,推送账号级
点券钱包投影(op53),在线角色点券余额即时刷新,无需离线/重登
启动器前端:
- app.js: 副本控制改名「魔改中心」;删除角色详情页疲劳值编辑块
(saveFatigue/maxFatigue 及相关输入框);黑钻提示改为「在线回城即时生效」
- index.html/shell.css/shell.js/style.css: 精简 GM 全屏标题栏(仅保留
窗口按钮)、移除 D 字图标及死样式、修正侧边栏底部间距
|
2026-11-04 15:09:15 +08:00 |
|
hanfuit
|
645b64fe21
|
DNF90 服务端与启动器完整源码(含 GM 工具功能增强)
服务端(Go):
- GM 塞背包/带属性装备发放:在线角色推送 op14 增量物品行,背包实时刷新,无需回角色选择界面
- GM 改金币/改等级:去掉在线拒绝,落库后推送 op14 钱包/op37 等级状态,在线实时刷新
- 等级端点统一切换到新版 GMSetCharacterLevel(自带在线刷新)
- 无限/锁死疲劳模式 + 燃烧疲劳:每房间消耗 2 点、打怪与通关经验双倍
- 燃烧疲劳开关时给所有在线角色推送系统提示(op12 mode 0)
- 深渊史诗掉率:GM 全局倍率 + 城镇增益药剂窗口倍率,真实接入掉落结算
启动器(Python/JS):
- 标题栏自绘、窗口 1204x717、禁止拖拽改大小、仅最小化/关闭
- GM 工具:疲劳与燃烧、深渊史诗掉率、拍卖行上架(单一定价对齐)
- 拍卖行上架前端对齐服务端单一价格语义,修复 400 报错
|
2026-11-04 14:31:55 +08:00 |
|