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

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

78 lines
1.7 KiB
Go

package dnfbridge
import (
"context"
"fmt"
"math"
"strings"
"time"
)
const (
currentDungeonQuickSlotFirst = 3
currentDungeonQuickSlotLast = 8
)
func (s *Service) currentDungeonEquipmentExpAdvantagePercent(
ctx context.Context,
characterID string,
) (int64, error) {
characterID = strings.TrimSpace(characterID)
if s == nil || characterID == "" {
return 0, nil
}
repositories, ok := s.repositoryGroup()
if !ok {
return 0, nil
}
now := time.Now().UTC()
var total int64
addItem := func(itemID int64, expireAt time.Time, extra map[string]string) bool {
if itemID <= 0 || (!expireAt.IsZero() && !expireAt.After(now)) {
return false
}
percent, resolved := s.equipmentPVFExpAdvantage(ctx, itemID, extra)
if !resolved || percent <= 0 {
return false
}
if total > math.MaxInt64-percent {
total = math.MaxInt64
return true
}
total += percent
return total == math.MaxInt64
}
if repositories.Equipment != nil {
equipment, found, err := repositories.Equipment.Load(ctx, characterID)
if err != nil {
return 0, err
}
if found {
for _, entry := range equipment.Entries {
if addItem(entry.ItemID, entry.ExpireAt, entry.Extra) {
return total, nil
}
}
}
}
if repositories.Inventory != nil {
inventory, found, err := repositories.Inventory.Load(ctx, characterID)
if err != nil {
return 0, err
}
if found {
for slot := currentDungeonQuickSlotFirst; slot <= currentDungeonQuickSlotLast; slot++ {
stack := inventory.Slots[fmt.Sprintf("0:%d", slot)]
// Quick-slot equipment contributes once per occupied slot. Count is
// inventory quantity, not an experience multiplier.
if addItem(stack.ItemID, stack.ExpireAt, stack.Extra) {
return total, nil
}
}
}
}
return total, nil
}