Ai说的
一、传统 DNF 与 90CN 的机制差异(避坑关键)
1. 如果是传统旧端(台服 70/86 C++ 端):
- 必须用 PVF 提取工具打开 Script.pvf;
- 找到 etc/raritydecision.etc(怪物掉落品级判定)和 etc/randomitemrarity.etc(翻牌/随机装备品级);
- 把里面的概率阈值从白蓝紫改到粉/传说/史诗;
- 封包后,服务端和所有玩家客户端都得重新替换 100MB+ 的 PVF,一旦玩家版本不一致直接报 L4010 进不去。
2. 但是在 90CN 服务端(当前运行的 Go 架构):
- 通关翻牌:品级选择逻辑直接硬编码在服务端 Go 源码里!
- 源码文件:go-server/internal/services/dnfbridge/
网页链接 - 原版代码写死了:50% 白装、30% 蓝装、20% 紫装、0.01% 粉装,根本没把传说和史诗放进翻牌池!所以光改 PVF 翻牌根本翻不出 SS。
- 刷图掉落:
- 计算函数在 go-server/internal/services/dnfbridge/
网页链接 的 currentDungeonDropRarity。
- 巨大优势:
- 直接在服务端 Go 代码里把品级映射改成你的比例;
- 完全不需要动客户端,也不需要改 Script.pvf(不需要让玩家重新下载 110MB PVF);
- 服务端算好掉落什么道具直接发包给客户端,客户端只负责在地上出黄光柱和入包!
---
二、具体怎么改(代码级方案)
1. 通关翻牌改动(
网页链接 第 336 行)
原版代码:
rarityRoll := rng.Next(1_000_000) + 1
rarity := int64(0)
switch {
case rarityRoll <= 500_000:
rarity = 0 // 50% 白装
case rarityRoll <= 799_900:
rarity = 1 // 30% 蓝装
case rarityRoll <= 999_900:
rarity = 2 // 20% 紫装
default:
rarity = 3 // 0.01% 神器(粉)
}
改成你的目标比例(50% 粉、30% 传说、20% 史诗):
rarityRoll := rng.Next(100) + 1 // 1 ~ 100
rarity := int64(3)
switch {
case rarityRoll <= 50:
rarity = 3 // 50% 神器(粉)
case rarityRoll <= 80:
rarity = 5 // 30% 传说
default:
rarity = 6 // 20% 史诗
}
(DNF 品级定义:0=普通/白, 1=高级/蓝, 2=稀有/紫, 3=神器/粉, 5=传说, 6=史诗)
2. 怪物刷图掉落改动(
网页链接 第 165 行)
原版代码从 PVF 读白蓝紫阈值:
func currentDungeonDropRarity(rng *currentDungeonDropLCG, rules *dnfdrops.MonsterRules) int64
在此处直接覆盖品级 roll 点:
// 基础起步 50% 粉装、30% 传说、20% 史诗
roll := rng.Next(100) + 1
switch {
case roll <= 50:
return 3 // 神器
case roll <= 80:
return 5 // 传说
default:
return 6 // 史诗
}
同时可把普通小怪和领主的装备掉落率(probability.Rates[2])拉高,让击杀怪物时像深渊怪一样爆装备。
---
三、改它需要重新发登录器或重编译客户端吗?
- 客户端(玩家电脑):0 改动、0 下载、不需要重新发 exe 或 PVF。