DNF90 服务端与启动器完整源码(含 GM 工具功能增强)

服务端(Go):
- GM 塞背包/带属性装备发放:在线角色推送 op14 增量物品行,背包实时刷新,无需回角色选择界面
- GM 改金币/改等级:去掉在线拒绝,落库后推送 op14 钱包/op37 等级状态,在线实时刷新
- 等级端点统一切换到新版 GMSetCharacterLevel(自带在线刷新)
- 无限/锁死疲劳模式 + 燃烧疲劳:每房间消耗 2 点、打怪与通关经验双倍
- 燃烧疲劳开关时给所有在线角色推送系统提示(op12 mode 0)
- 深渊史诗掉率:GM 全局倍率 + 城镇增益药剂窗口倍率,真实接入掉落结算

启动器(Python/JS):
- 标题栏自绘、窗口 1204x717、禁止拖拽改大小、仅最小化/关闭
- GM 工具:疲劳与燃烧、深渊史诗掉率、拍卖行上架(单一定价对齐)
- 拍卖行上架前端对齐服务端单一价格语义,修复 400 报错
This commit is contained in:
hanfuit committed 2026-11-04 14:31:55 +08:00
commit 645b64fe21
4388 files changed
+1405457

No files matched your search

+44
View File
@@ -0,0 +1,44 @@
// 90CN_digest_trace.h —— 章节过场(op1378 / op24)客户端侧只读日志。
//
// 只在补丁已有的 class0 派发代理里调用,不新增 hook。
#pragma once
namespace cn90
{
// 传入 class0 包首地址(bytes[0]=class,bytes[1..2]=opcode)。
// 命中 op1378 / op24 时写一行到 90CN_digest.log;其它包直接返回。
void LogClass0CutscenePacket(const unsigned char* bytes);
// 记录一次 *.avi 打开:路径 + 调用点 RVA(用于定位客户端影片播放函数)。
void LogAviOpen(const char* path, const char* callerRvas);
// 记录影片函数入口的寄存器/栈参数,用于判定调用约定。
void LogMovieEntry(unsigned retRva, unsigned ecx, unsigned edx,
unsigned arg1, const char* s1, unsigned arg2, const char* s2,
unsigned arg3, const char* s3);
// 记录一次「主动调用客户端影片播放器」的尝试(willCall=1 表示真的调用了)。
void LogMovieInvoke(unsigned fnRva, unsigned thisPtr, const char* path, int willCall);
void LogMovieChain(const char* chain);
// 记录一次「原始栈扫描」结果:把栈上出现的 bdvid32.dll / DNF.exe 返回地址
// 连同「前一条指令像不像 call」一起写出来(带 * 的更像真正的返回地址)。
void LogMovieStack(const char* frames);
// 记录影片对象 Open(path) 的一次调用:返回地址、this、宽字符路径、栈上候选返回地址。
void LogMovieOpen(unsigned retRva, unsigned thisPtr, unsigned argPtr,
const char* pathText, const char* stackText);
// 记录影片对象 Play() 的一次调用。
void LogMoviePlay(unsigned retRva, unsigned thisPtr, const char* stackText);
// 记录影片 Render 的调用(计数 + this + 返回地址 + 栈上候选)。
void LogMovieRender(long count, unsigned thisPtr, unsigned retRva, const char* stackText);
// 一次性记录播放对象 vtable 的 12 个槽位(模块!RVA)。
void LogMovieVtable(unsigned object, unsigned vtable, const char* slots);
// DLL 初始化完成时写一行 "ready",便于确认补丁版本已加载。
void LogStoryDigestTraceReady();
}