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

+63
View File
@@ -0,0 +1,63 @@
import { beforeEach, expect, test, vi } from "vitest";
import { createSSRApp } from "vue";
import { renderToString } from "@vue/server-renderer";
import UpdatePrompt from "../src/components/UpdatePrompt.vue";
const state = vi.hoisted(() => ({
listeners: new Map<string, (event: any) => void>(),
info: vi.fn(), emit: vi.fn().mockResolvedValue(undefined), error: vi.fn(),
}));
vi.mock("@wailsio/runtime", () => ({ Events: {
On: (name: string, callback: (event: any) => void) => {
state.listeners.set(name, callback);
return () => state.listeners.delete(name);
},
Emit: state.emit,
} }));
vi.mock("naive-ui", () => ({
useDialog: () => ({ info: state.info }),
useMessage: () => ({ info: vi.fn(), error: state.error }),
}));
beforeEach(async () => {
vi.clearAllMocks();
state.listeners.clear();
state.info.mockReturnValue({ destroy: vi.fn() });
await renderToString(createSSRApp(UpdatePrompt));
});
function requestUpdate() {
state.listeners.get("app:update-available")!({ data: {
currentVersion: "1.2.3", version: "1.2.4", responseEvent: "app:update-response:1",
} });
return state.info.mock.calls.at(-1)![0];
}
test("显示版本且等待明确点击下载,重复点击只提交一次", async () => {
const prompt = requestUpdate();
expect(prompt.content).toContain("1.2.3");
expect(prompt.content).toContain("1.2.4");
expect(prompt.positiveText).toBe("下载更新");
expect(prompt.autoFocus).toBe(false);
expect(state.emit).not.toHaveBeenCalled();
requestUpdate();
expect(state.info).toHaveBeenCalledTimes(1);
await prompt.onPositiveClick();
await prompt.onPositiveClick();
expect(state.emit).toHaveBeenCalledExactlyOnceWith("app:update-response:1", { accepted: true });
});
for (const action of ["onNegativeClick", "onClose", "onEsc"]) {
test(`${action} 取消下载并允许再次提示`, async () => {
const prompt = requestUpdate();
await prompt[action]();
expect(state.emit).toHaveBeenCalledExactlyOnceWith("app:update-response:1", { accepted: false });
requestUpdate();
expect(state.info).toHaveBeenCalledTimes(2);
});
}
test("确认发送失败时提示错误,允许重试", async () => {
const prompt = requestUpdate();
state.emit.mockRejectedValueOnce(new Error("断开连接"));
await expect(prompt.onPositiveClick()).resolves.toBe(false);
expect(state.error).toHaveBeenCalled();
await prompt.onNegativeClick();
expect(state.emit).toHaveBeenLastCalledWith("app:update-response:1", { accepted: false });
});