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

File diff suppressed because it is too large. Load diff
+198
View File
@@ -0,0 +1,198 @@
{
"version": 1,
"name": "系统内置",
"groups": [
{
"id": "builtin-list",
"name": "列表",
"groups": [
{
"id": "bookmark-group-1",
"name": "技能",
"entries": [
{
"path": "skill/atfighterskill.lst",
"name": "格斗家·男"
},
{
"path": "skill/atgunnerskill.lst",
"name": "神枪手·女"
},
{
"path": "skill/atmageskill.lst",
"name": "魔法师·男"
},
{
"path": "skill/atpriestskill.lst",
"name": "圣职者·女"
},
{
"path": "skill/atswordmanskill.lst",
"name": "鬼剑士·女"
},
{
"path": "skill/creatormageskill.lst",
"name": "缔造者"
},
{
"path": "skill/demoniclancerskill.lst",
"name": "魔枪士"
},
{
"path": "skill/dsswordmanskill.lst",
"name": "黑暗武士"
},
{
"path": "skill/fighterskill.lst",
"name": "格斗家·女"
},
{
"path": "skill/gunnerskill.lst",
"name": "神枪手·男"
},
{
"path": "skill/mageskill.lst",
"name": "魔法师·女"
},
{
"path": "skill/priestskill.lst",
"name": "圣职者·男"
},
{
"path": "skill/swordmanskill.lst",
"name": "鬼剑士·男"
},
{
"path": "skill/thiefskill.lst",
"name": "暗夜使者"
},
{
"path": "skill/knight.lst",
"name": "守护者"
}
]
}
],
"entries": [
{
"path": "equipment/equipment.lst",
"name": "装备"
},
{
"path": "stackable/stackable.lst",
"name": "道具"
},
{
"path": "appendage/appendage.lst",
"name": "apd"
},
{
"path": "character/character.lst",
"name": "职业"
},
{
"path": "creature/creature.lst",
"name": "宠物"
},
{
"path": "dungeon/dungeon.lst",
"name": "地下城"
},
{
"path": "itemshop/itemshop.lst",
"name": "商店"
},
{
"path": "map/map.lst",
"name": "map"
},
{
"path": "monster/monster.lst",
"name": "怪物"
},
{
"path": "n_quest/quest.lst",
"name": "任务"
},
{
"path": "npc/npc.lst",
"name": "npc"
},
{
"path": "passiveobject/passiveobject.lst",
"name": "被动对象"
},
{
"path": "region/region.lst",
"name": "区域"
},
{
"path": "town/town.lst",
"name": "城镇"
},
{
"path": "worldmap/worldmap.lst",
"name": "副本接口"
},
{
"path": "etc/equipmentpartset.etc",
"name": "套装"
}
]
},
{
"id": "bookmark-group-2",
"name": "掉落",
"entries": [
{
"path": "etc/itemdropinfo_monster_hell.etc",
"name": "深渊掉落"
},
{
"path": "etc/itemdropinfo_clearreward.etc",
"name": "翻牌掉落"
},
{
"path": "etc/itemdropinfo_monseter.etc",
"name": "怪物掉落"
},
{
"path": "etc/itemdropinfo_monseter_extra.etc",
"name": "精英掉落"
},
{
"path": "etc/worlddrop.etc",
"name": "全局掉率"
},
{
"path": "etc/independent_drop.etc",
"name": "独立掉落"
}
]
},
{
"id": "bookmark-group-3",
"name": "常用道具",
"entries": [
{
"path": "stackable/consumption_1254.stk",
"name": "红气息"
}
]
}
],
"entries": [
{
"path": "etc/disjoint.etc",
"name": "分解装备"
},
{
"path": "etc/pcroom.vm",
"name": "黑钻抽奖机"
},
{
"path": "etc/pcroom4.vm",
"name": "高级黑钻抽奖机"
}
]
}
+21
View File
@@ -0,0 +1,21 @@
package config
import _ "embed"
//go:embed annotations.json
var AnnotationsJSON []byte
//go:embed paths.json
var PathsJSON []byte
//go:embed sections.json
var SectionsJSON []byte
//go:embed rendering.json
var RenderingJSON []byte
//go:embed lists.json
var ListsJSON []byte
//go:embed bookmarks.json
var BookmarksJSON []byte
+140
View File
@@ -0,0 +1,140 @@
{
"version": 1,
"description": "pvfine built-in list and relation indexes",
"relations": {
"装备": {
"listPath": "equipment/equipment.lst",
"idToken": 0,
"pathToken": 1,
"recordTokens": 2,
"nameSection": "name"
},
"道具": {
"listPath": "stackable/stackable.lst",
"idToken": 0,
"pathToken": 1,
"recordTokens": 2,
"nameSection": "name"
},
"apd": {
"listPath": "appendage/appendage.lst",
"idToken": 0,
"pathToken": 1,
"recordTokens": 2,
"nameSection": "name"
},
"职业": {
"listPath": "character/character.lst",
"idToken": 0,
"pathToken": 1,
"recordTokens": 2,
"nameSection": "name"
},
"宠物": {
"listPath": "creature/creature.lst",
"idToken": 0,
"pathToken": 1,
"recordTokens": 2,
"nameSection": "name"
},
"地下城": {
"listPath": "dungeon/dungeon.lst",
"idToken": 0,
"pathToken": 1,
"recordTokens": 2,
"nameSection": "name"
},
"商店": {
"listPath": "itemshop/itemshop.lst",
"idToken": 0,
"pathToken": 1,
"recordTokens": 2,
"nameSection": "name"
},
"map": {
"listPath": "map/map.lst",
"idToken": 0,
"pathToken": 1,
"recordTokens": 2,
"nameSection": "name"
},
"怪物": {
"listPath": "monster/monster.lst",
"idToken": 0,
"pathToken": 1,
"recordTokens": 2,
"nameSection": "name"
},
"任务": {
"listPath": "n_quest/quest.lst",
"idToken": 0,
"pathToken": 1,
"recordTokens": 2,
"nameSection": "name"
},
"npc": {
"listPath": "npc/npc.lst",
"idToken": 0,
"pathToken": 1,
"recordTokens": 2,
"nameSection": "name"
},
"被动对象": {
"listPath": "passiveobject/passiveobject.lst",
"idToken": 0,
"pathToken": 1,
"recordTokens": 2,
"nameSection": "name"
},
"区域": {
"listPath": "region/region.lst",
"idToken": 0,
"pathToken": 1,
"recordTokens": 2,
"nameSection": "name"
},
"城镇": {
"listPath": "town/town.lst",
"idToken": 0,
"pathToken": 1,
"recordTokens": 2,
"nameSection": "name"
},
"副本接口": {
"listPath": "worldmap/worldmap.lst",
"idToken": 0,
"pathToken": 1,
"recordTokens": 2,
"nameSection": "name"
},
"物品": {
"kind": "union",
"relations": ["装备", "道具"]
},
"技能": {
"kind": "contextual",
"contextToken": 0,
"idToken": 0,
"pathToken": 1,
"recordTokens": 2,
"nameSection": "name",
"contextPaths": {
"[swordman]": "skill/swordmanskill.lst",
"[at swordman]": "skill/atswordmanskill.lst",
"[fighter]": "skill/fighterskill.lst",
"[at fighter]": "skill/atfighterskill.lst",
"[gunner]": "skill/gunnerskill.lst",
"[at gunner]": "skill/atgunnerskill.lst",
"[mage]": "skill/mageskill.lst",
"[at mage]": "skill/atmageskill.lst",
"[priest]": "skill/priestskill.lst",
"[at priest]": "skill/atpriestskill.lst",
"[thief]": "skill/thiefskill.lst",
"[creator mage]": "skill/creatormageskill.lst",
"[knight]": "skill/knight.lst",
"[demonic swordman]": "skill/dsswordmanskill.lst",
"[demonic lancer]": "skill/demoniclancerskill.lst"
}
}
}
}
+249140
View File
File diff suppressed because it is too large. Load diff
+438
View File
@@ -0,0 +1,438 @@
{
"version": 1,
"description": "pvfine built-in script rendering rules",
"rules": [
{
"id": "file.lst",
"match": {
"extensions": [
".lst"
]
},
"target": {
"kind": "file"
},
"format": {
"tokensPerLine": 2
}
},
{
"id": "section.world-drop",
"match": {},
"target": {
"kind": "section",
"section": "world drop"
},
"format": {
"tokensPerLine": 2,
"standaloneValues": [
-1
]
}
},
{
"id": "section.independent-drop",
"match": {},
"target": {
"kind": "section",
"section": "independent drop"
},
"format": {
"tokensPerLine": 17,
"nestedSections": [
"list"
]
}
},
{
"id": "section.list",
"match": {},
"target": {
"kind": "section",
"section": "list"
},
"format": {
"tokensPerLine": 2
}
},
{
"id": "section.skill-data-up",
"match": {},
"target": {
"kind": "section",
"section": "skill data up"
},
"format": {
"tokensPerLine": 7
}
},
{
"id": "section.skill-levelup",
"match": {},
"target": {
"kind": "section",
"section": "skill levelup"
},
"format": {
"tokensPerLine": 3
}
},
{
"id": "section.skill",
"match": {},
"target": {
"kind": "section",
"section": "skill"
},
"format": {
"tokensPerLine": 7,
"offset": 1
}
},
{
"id": "section.level info",
"match": {},
"target": {
"kind": "section",
"section": "level info"
},
"format": {
"tokensPerLine": 1,
"offset": 1,
"tokensPerLineIndex": 0
}
},
{
"id": "section.input item",
"match": {},
"target": {
"kind": "section",
"section": "input item"
},
"format": {
"tokensPerLine": 2
}
},
{
"id": "section.output item",
"match": {},
"target": {
"kind": "section",
"section": "output item"
},
"format": {
"tokensPerLine": 2
}
},
{
"id": "section.basis of rarity dicision.hell",
"match": {
"glob": "etc/itemdropinfo_monster_hell.etc"
},
"target": {
"kind": "section",
"section": "basis of rarity dicision"
},
"format": {
"tokensPerLine": 7,
"tokensPerLineByVersion": {
"90US": 7,
"90CN": 7,
"TW": 6,
"100CN": 8,
"110US": 9,
"115CN": 9
},
"offset": 1
}
},
{
"id": "section.basis of rarity dicision",
"match": {},
"target": {
"kind": "section",
"section": "basis of rarity dicision"
},
"format": {
"tokensPerLine": 7,
"tokensPerLineByVersion": {
"90US": 7,
"90CN": 7,
"TW": 6,
"100CN": 8,
"110US": 9,
"115CN": 9
}
}
},
{
"id": "section.equipment part set",
"match": {},
"target": {
"kind": "section",
"section": "equipment part set"
},
"format": {
"tokensPerLine": 4,
"offset": 3
}
},
{
"id": "etc.upgrade.table",
"match": {
"glob": "etc/upgrade.etc"
},
"target": {
"kind": "section",
"section": "table"
},
"format": {
"tokensPerLine": 17
}
},
{
"id": "etc.upgrade.table-type",
"match": {
"glob": "etc/upgrade.etc"
},
"target": {
"kind": "section",
"section": "table type"
},
"format": {
"tokensPerLine": 24,
"offset": 1
}
},
{
"id": "etc.upgrade.safe-upgrade",
"match": {
"glob": "etc/upgrade.etc"
},
"target": {
"kind": "section",
"section": "safe upgrade"
},
"format": {
"tokensPerLine": 8
}
},
{
"id": "etc.amplify.table",
"match": {
"glob": "etc/amplifyupgrade.etc"
},
"target": {
"kind": "section",
"section": "table"
},
"format": {
"tokensPerLine": 17
}
},
{
"id": "etc.amplify.table-type",
"match": {
"glob": "etc/amplifyupgrade.etc"
},
"target": {
"kind": "section",
"section": "table type"
},
"format": {
"tokensPerLine": 24,
"offset": 1
}
},
{
"id": "etc.amplify.safe-upgrade",
"match": {
"glob": "etc/amplifyupgrade.etc"
},
"target": {
"kind": "section",
"section": "safe upgrade"
},
"format": {
"tokensPerLine": 8
}
},
{
"id": "etc.forge.table",
"match": {
"glob": "etc/upgrade_separate.etc"
},
"target": {
"kind": "section",
"section": "table"
},
"format": {
"tokensPerLine": 4,
"tokensPerLineByVersion": {
"115CN": 6
}
}
},
{
"id": "etc.forge.item-weights-by-grade",
"match": {
"glob": "etc/upgrade_separate.etc"
},
"target": {
"kind": "section",
"section": "item weights by grade"
},
"format": {
"tokensPerLine": 3
}
},
{
"id": "etc.forge.item-weights-by-grade-100lv",
"match": {
"glob": "etc/upgrade_separate.etc"
},
"target": {
"kind": "section",
"section": "item weights by grade 100lv"
},
"format": {
"tokensPerLine": 3
}
},
{
"id": "etc.forge.item-weights-by-rarity",
"match": {
"glob": "etc/upgrade_separate.etc"
},
"target": {
"kind": "section",
"section": "item weights by rarity"
},
"format": {
"tokensPerLine": 9
}
},
{
"id": "etc.forge.item-weights-by-rarity-100lv",
"match": {
"glob": "etc/upgrade_separate.etc"
},
"target": {
"kind": "section",
"section": "item weights by rarity 100lv"
},
"format": {
"tokensPerLine": 9
}
},
{
"id": "etc.forge.stat-weights-by-rarity",
"match": {
"glob": "etc/upgrade_separate.etc"
},
"target": {
"kind": "section",
"section": "stat weights by rarity"
},
"format": {
"tokensPerLine": 9
}
},
{
"id": "etc.forge.separate-upgrade-effect",
"match": {
"glob": "etc/upgrade_separate.etc"
},
"target": {
"kind": "section",
"section": "separate upgrade effect"
},
"format": {
"tokensPerLine": 6
}
},
{
"id": "etc.forge.activestatus-upgrade-dungeon",
"match": {
"glob": "etc/upgrade_separate.etc"
},
"target": {
"kind": "section",
"section": "activestatus upgrade dungeon"
},
"format": {
"tokensPerLine": 1
}
},
{
"id": "etc.forge.activestatus-upgrade-pvp",
"match": {
"glob": "etc/upgrade_separate.etc"
},
"target": {
"kind": "section",
"section": "activestatus upgrade pvp"
},
"format": {
"tokensPerLine": 1
}
},
{
"id": "etc.forge.anti-evil-upgrade",
"match": {
"glob": "etc/upgrade_separate.etc"
},
"target": {
"kind": "section",
"section": "anti evil upgrade"
},
"format": {
"tokensPerLine": 8
}
},
{
"id": "etc.forge.genuine-buffer-option-apply-weapon",
"match": {
"glob": "etc/upgrade_separate.etc"
},
"target": {
"kind": "section",
"section": "genuine buffer option apply weapon"
},
"format": {
"tokensPerLine": 9
}
},
{
"id": "user.rule.aaf15bba-9653-41ae-b16c-17f4fb640e66",
"match": {
"extensions": [
".stk"
]
},
"target": {
"kind": "section",
"section": "cera"
},
"format": {
"tokensPerLine": 3,
"offset": 1
}
},
{
"id": "user.rule.1d7969fe-999b-4129-87bd-161e033bbcb0",
"match": {
"extensions": [
".vm"
]
},
"target": {
"kind": "section",
"section": "output"
},
"format": {
"tokensPerLine": 4
}
}
]
}
File diff suppressed because it is too large. Load diff