



一键操作:打开启动控制台.bat,点启动游戏,完成!
说明原来那 3 个 .bat 仍然可用,本控制台不依赖它们
· 服务端以最小化窗口启动,日志写 data\server.log;启动前会自动把上一次的日志归档到 data\log_archive\。
· 关闭控制台窗口不会影响已经在跑的游戏;要停请点「全部停止」。
· 面板页面由本机 127.0.0.1 提供,不对外网开放。
=======================================
_项目维护.py —— 日常维护工具(根目录)。六动作:自检 / 状态 / 归档备份 / 归档存档 / 基线 / 对比基线,均支持 --dry-run/--keep N。自检:源文件语法 + 14 项关键开关快照 + 数据表可解析 + 运行状态 + 启动摘要核对。基线:把自检结果存成快照(_baseline/<时间戳>.json 33 项指标 + .txt 全文);对比基线逐指标 diff,并把「配置/内容变化」与「运行态变化(端口/日志)」分开呈现。归档存档:保留最近 N 份 data/save.db.bak_auto_*,其余移入 _backup_history/save_db/。项目分析_目录地图_20260924.md —— 项目全景地图(12 节:目录地图 / 服务端结构 / 技术事实 / 改造工作流 / 坑清单 / 后续建议等)。数值真源表.md —— 「改哪一项该动哪个文件」对照表。8 节:config.toml 路径映射 → 四类真源(二进制表 / 业务 JSON / data 运行时表 / 客户端表)→ 代码常量与逻辑 → 客户端二进制 → 已知缺口。CHANGELOG.md —— 本文件。_baseline/ —— 自检基线快照目录。_backup_history/save_db/ —— 存档备份归档目标目录(工具已就绪,尚未执行归档)。.trae/documents/面板属性_..._计划.md 曾被记为「仍是计划态」,实读 application.py 确认已完整落地(PANEL_DERIVED_ATTRS_ENABLED=True L2572、CLIENT_PANEL_LAYOUT="F变态" L2573、11 个 _panel_* 聚合函数 L35619–35709、_attribute_response 写槽 18–32、战斗接入 L15088/15111/15173、/stats L16959)。关掉 = 置 False 后重启服务端。README.md:日志位置更正为 data/server.log(原文写的 server/data/server_pkt.log、data/server_stdout.log 均已停更于 09-18);新增「九、日常维护与排查工具」章节。.workbuddy/ 下 7 个排查脚本(boot / ctx / hist / logcheck / mapcheck / sellchk / diffnav)去硬编码:改为基于 Path(__file__) 自动定位项目根,日志优先取 data/server.log,时间段/标记改走命令行参数。_项目维护.py 自检的两个展示缺陷:① 命中行被 [-70:] 切掉行首(残留 logger 名)→ 新增 _log_msg() 剥离日志前缀;② unhandled opcode 原本跨全部轮转文件累积,把 09-18 寻路调试期的 0x10A9 误报成当前问题 → 改为只统计当前活动 server.log。data/tables/ 实际是 30 个 json(旧文档/记忆写的「50 个」过时);另有 6 个 json 在 data/ 顶层。client_tables/.../tables/ 是 27 个。.workbuddy/memory/MEMORY.md:更新过期内容(服务端路径 E:\吊想单机 → D:\AIWork\QQHX;打包流程由 _sync_pack.py 时代改为 install.py + files/ + manifest.json)。server/src/diaoxiang_offline/ 下 63 个历史备份文件 / 53 MB(application.py 29 / resources.py 12 / state.py 9 / storage.py 6 / messages.py 5 / _temp_pyc 2)移入 _backup_history/diaoxiang_offline/,按源文件名分组。源码目录现在只剩 15 个真实 .py。GM工具/cache/items.json 是一处真实的数据依赖,不只是文档里的一条引用:application.py:18112-18115 会读它来给网页版 GM 的搜索补漏 21631 条 ov_desc 物品名。该文件在本副本不存在,代码用 try/except 静默跳过 → 不报错,但搜索覆盖变小。assets/items_dump/pkg_test/zipbin/ov_desc.bin(15.5 MB)在,可据此自行生成该 cache;或把那行改读项目内路径(如 data/ov_desc_items.json)。_归档日志.py —— 把 data/server.log(+.1/.2/.3) 整体移入 data/log_archive/<时间戳>/;只保留最近 10 份,更早的转入 _backup_history/log_archive/。只移动不删除,支持 --dry-run / --keep N。_补GM物品索引.py —— 从 zipbin/ov_desc.bin 生成 GM工具/cache/items.json(网页版 GM 搜索的物品名索引)。GM工具/cache/items.json —— 21624 条(0.42 MB),补齐了原先缺失的 GM 搜索物品名数据源。assets/tools/hd_reskey/README.md —— 登记该目录剩余 16 项产物及各自用途。_baseline/ 首个基线快照(33 项指标)。启动2.0高清本地.bat:在「杀旧服务端之后、起新服务端之前」插入日志归档调用(Windows 下移动被占用文件会失败,位置不能挪)。备份 启动2.0高清本地.bat.bak_before_logarchive_20260924。assets/tools/hd_reskey/ 4 个脚本改为路径自动定位(原写死 E:\吊想单机):watch_client_reskey.py(连 Unity Player.log 也改为按当前用户动态取)、_code_locator.py、_meta_diff.py、_write_bats_gbk.py。_write_bats_gbk.py 是三个启动 bat 的生成源头:已把「日志归档」步骤同步进它的 bat 模板,并实测模板输出与当前 bat 逐字节一致(否则下次重写 bat 会把归档步骤抹掉)。_write_bats_gbk.py 的 verify() 检查键补充归档步骤(中文检查键必须用 GBK 字节,因为 bat 是 GBK 而源码字面量是 UTF-8)。_backup_history/save_db/。_backup_history/hd_reskey_tools_20260914/;保留关键资产(dump_2.0_typeDef.cs、两份解密元数据、frida 抓钥匙工具链等)。GM工具/cache/items.json 缺失 → 已按上述方式补齐(原先是「静默跳过、搜索覆盖变小」,现为完整索引)。_归档日志.py + 启动脚本从机制上解决(server.log 现在严格等于当前启动段)。_code_locator.py 实测当前 GameAssembly.dll:.text 段序言密度 10.14/KB、il2cpp 段 4.99/KB(105,526 命中),.pdata 含 106,627 个函数,RVA 范围 [1060 .. 178D0DE]。RenderProfile::ReadCore 0xF07260、ResKeyRing::Clear 0xEDF700、ResVol2::Unlock 0xEE26F0、RenderProfile::get_Cur 0xEDF4B0)→ 说明后续的 DLL patch 是等长替换、未移动代码布局,这些 RVA 至今有效。需求:① 做配套后台控制面板;② 把 GM 工具网页版从服务端里「去除」并整合进去; ③ 面板带版本控制地启动单机游戏;④ 接入自动更新,对接 cx 线上后台的软件管理。
控制台/ —— 独立进程的本地控制面板(纯标准库,用包内 runtime\python.exe 跑)。panel.py:监听 127.0.0.1:19005(被占则自动 +1,最多到 19024)。四块能力:服务端/客户端启停、cx 更新检查与安装回滚、GM 接口同源代理、日志读取。static/index.html / app.js / gm.js / style.css:四个顶层页签(启动台 / 版本更新 / GM 工具 / 运行日志);GM 的 5 个功能页(货架 / 玩家 / GM 指令 / NPC / 协议实验台)原样迁入 gm.js。README.md:架构说明、接口清单、排查表、回退方法。启动控制台.bat(根目录,GBK + CRLF)—— 控制台的唯一入口。version.json(根目录)—— 本地版本标记(version / version_code / channel=diaoxiang-danji;⚠ channel 已在第四批删除)。_打包更新包.py —— 更新包打包器。产出 _update_pack/DiaoxiangDanji-<版本>.zip(内含 manifest.json + files/)以及 cx 建档 SQL(publish-<版本>.sql)。
内置两道防呆:① 发布清单白名单(防止把 34MB 的 DLL / 存档 / 日志打进包,单文件上限 2MB);② version.json 的版本必须等于 --version,否则会造出「装完仍显示旧版本 → 下次又提示更新」的无限循环包。_自检_控制台.py —— 50 项自检(创建时 48 项;第四批新增 2 条断言、替换 1 条):文件齐全、admin.py 是否真瘦身、bat 编码、版本码算法与 cx 一致、进程探测、回环请求绕过系统代理、临时端口起面板跑端到端、cx 可达性。_实测_自动更新.py —— 端到端实测工具。--drop-to <版本> 先把本地版本人为降级,然后真跑一遍「查更新 → 下载 → 校验 md5 → 解压 → 逐文件 sha256 → 备份 → 覆盖 → 复核」。_update_pack/(打包产物)、_update_cache/(面板的下载缓存)。server/src/diaoxiang_offline/admin.py:1071 行 → 288 行。 删除内嵌的 _GM_PANEL_HTML(约 700 行内联 HTML/CSS/JS)与早已弃用的 _RACK_PANEL_HTML(约 120 行);GET / 改为返回一个「网页已迁移」提示页。16 条 JSON 路由一字未改 —— 面板原样透传,所以 GM 前端代码不用动。
备份:_baseline/admin.py.bak_before_console_split_20260924。/api/<x> 原样透传到 127.0.0.1:19003,浏览器只跟 19005 说话(无跨域)。面板自有接口统一挂 /api/console/*。
GM 后端不能一起搬走 —— admin_online_players / admin_run_gm / admin_send_frame 依赖服务端进程内的在线角色内存态,脱离进程就只剩读存档,做不到「对在线角色即时生效」。cx.oddpp.com 新建软件记录:cx_software.id=43,identifier=diaoxiang-danji,goods_id=0(不绑商品、不上架售卖),status=1,current_version=2.0.1。cx_software_version.id=73,version=2.0.1,package_type=update,file_url=https://cx.oddpp.com/storage/versions/DiaoxiangDanji-2.0.1.zip(52144 B,md5 dff343c7327d02d71ecf8bb81aa0f52c)。app/api/controller/Software.php:/api/software/checkUpdate 取的是 update 包且不需要授权码;versionList / download 只给 full 包(download 另需授权码)。线上原有软件只有 ypay-monitor(id=1) 与 cx_ecommerce(id=12)。cx_software 里 identifier='diaoxiang-danji' 那条及其版本记录即可,对其它软件无影响。_自检_控制台.py:48 通过 / 0 警告 / 0 失败。_实测_自动更新.py --drop-to 2.0.0:全链路通过 —— 下载 50.9KB → 备份 10 个文件 → 覆盖 → 复核 10/10 sha256 一致 → version.json 变为 2.0.1。version.json 正确退回更新前的值。HTTP_PROXY),urllib.request.urlopen("http://127.0.0.1:19003/...") 会把这个回环请求也丢给代理,代理连不上就回 502 upstream connect failed —— 现象是「服务端明明在跑,GM 页面却一直提示不可达」。
修法:新增模块级 _NO_PROXY_OPENER = build_opener(ProxyHandler({})),只有回环转发用它;访问 cx 的公网请求仍尊重系统代理。wmic 在本机被安全策略拉黑(且 Win11 24H2 起默认不再安装):server_pids() 原本首选 wmic process where ...,改为只走 PowerShell CIM + 「19000 端口谁在监听」兜底。tasklist 结果加 2 秒 TTL 缓存;server_status() 走快速路径(端口在监听就不拉进程表),避免面板每 3 秒轮询都跑一次 PowerShell。D:\MCP_Server\mcp_cheatengine.py 新增 _decode_ce_payload() / _repair_ansi_strings() / _find_pid_by_name_via_list()。需重启 MCP 服务生效。需求:控制面板 → 版本更新 → 不展示更新标识与更新 API 地址(其他地方也不许出现)。
/api/console/update/check 与 /api/console/status 不再下发 base / identifier / request / raw;latest 改按白名单下发,剔掉 download_url(含域名,前端本来也不拿它下载)。panel._redact() —— 更新源字样在「接口报错消息 / 更新任务日志 / 启动横幅」里一律替换掉。否则一个 URLError 的异常文本就能把域名漏到页面上(离线场景最容易中招)。version.json 去掉 channel 字段:它会被 local_version() 随接口原样下发,而 channel 正是软件标识。标识真相源收敛到 panel.py 的 IDENTIFIER 一处。同步改 _自检_控制台.py(断言改为「version.json 不含标识」)与 _实测_自动更新.py(标识改取环境变量)。_打包更新包.py 白名单移除 _自检_控制台.py(玩家不需要,且含明文 CX_BASE / IDENTIFIER);控制台/README.md 的 3 处明文脱敏。_自检_控制台.py 50 通过 / 0 警告 / 0 失败。固有残留:
控制台/panel.py必须内置更新源常量(更新客户端本身随包分发,无法从源码里抹掉)。能保证的是界面一处都不出现。要换源改CX_BASE/IDENTIFIER,或用环境变量DIAOXIANG_CX_BASE/DIAOXIANG_CX_IDENTIFIER覆盖。
_update_pack/DiaoxiangDanji-2.0.2.zip —— 46739 B,md5 d0f312b4275ceb898f676bc2e2b6a442,9 个文件(比 2.0.1 少了不再分发的 _自检_控制台.py)。public/storage/versions/,执行 publish-2.0.2.sql:cx_software.id=43 升到 current_version=2.0.2,新增 cx_software_version.id=74(package_type=update,md5 与本地一致)。checkUpdate?identifier=diaoxiang-danji&version=2.0.1 → code=0 / msg=发现新版本 / version=2.0.2 / has_update=true。_实测_自动更新.py --drop-to 2.0.1 → check → download(45.6KB)→ install → done;version.json 变 2.0.2;9/9 文件 sha256 一致;备份 _patch_backup_20260924_104037(实测后已清理)。需求:把项目打成可出售给他人的完整包(此前只有给自己用的增量更新包)。
_打发布包.py —— 完整商品包生成器(白名单式收集 7366 个文件 / 18.1 GB):client / server / data / assets / client_tables / runtime / 控制台 / GM工具 八个目录 + 17 个根文件;内部文档、打包器自身、.workbuddy、历史备份一律不解释。data/save.db*、日志、_backup_history/、_baseline/、抓钥匙工具(client_bridge.py 与 assets/tools/hd_reskey/)、client/QQHXLauncher.exe(50 MB 无引用),以及数值 / 密度类开关与「经验倍率开关」等开发者档位(按决策「只留启动与自检」)。override_content():新电脑使用说明.txt → 面向买家重写;data/reskey.env → 剥掉注释(原注释含抓钥匙方法与外部 IP)。sanitize():原作者 CDN 域名 / 服务器 IP / 内部绝对路径 / 数据来路说明 —— 只作用于包内副本,本机文件不动。scan_sensitive():脱敏后再全量复验,命中即拦。.qv / .pkg 与 >64 MB 文件不压缩(压缩率本就只 5.5%,省 CPU)。_验证发布包.py —— 交付前复检(9 段):总体 / 32 项必需文件 / 7 个必需目录 / 禁入项 / 16 个敏感串 / bat 中文完整性 / 更新源指向 / 启动脚本引用路径闭环 / 服务端入口;加 --checksum 会多跑第 10 段算 MD5 + SHA256。[8] 是本工具的核心价值:把 bat 里 %ROOT%xxx / %~dp0xxx 解析成包内相对路径逐条核对(26 条),不用真跑游戏就能拦下缺文件。_发布包/吊想单机2.0高清版-完整包-20260924.zip —— 18,321,735,699 B(17.1 GB),7366 条目,压缩率 5.5%,耗时 22.7 分钟。3f77c12b22ebd7018ce1c6a0d8c1ad87,SHA256 40638b06416fa09b07cde23865ddc4865a4cfa6c0f613a2380b1b0bfbd120558。见同目录 验证报告_20260924.txt(由 _验证发布包.py --checksum 生成,可直接给商城 / 买家核对)。其中最有说服力的两条:
启动2.0高清本地.bat(4471) / 只启动服务端.bat(1984) / server/启动服务端.bat(1708) 的包内字节数与本地逐字节一致。pack_text() 必须三态:项目里 bat 编码混用 —— 多数是 GBK,但 新机自检.bat / 解除文件锁定.bat / server/启动服务端.bat 是 UTF-8。按 UTF-8 解编再编码会把 GBK 中文全毁 → 严格 decode 失败时返回 is_text=False,走原样流式拷贝。data/reskey.env 3 处 —— 扫描读的是本机原文,而打包时该文件走 override_content 覆盖,两边错位。抽出 pack_text() 让扫描与写盘共用同一份内容后消除。已知点(不阻塞交付):
启动2.0高清本地.bat杀旧服务端用wmic process where ...,而wmic在 Win11 已默认移除、本机被安全策略拉黑 —— 此时会落到netstat+taskkill兜底分支,启动不受影响,但建议下一版把这段统一换成不依赖 wmic 的写法。
源码属于可复制的虚拟商品,一经下载即视为交付完成,不支持退款。请在购买前通过演示站充分验证功能。
本商品后续大版本更新需另行购买,购买前请确认版本范围。