Files
90CNServer/server/internal/services/dnfbridge/wedding_presence.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

51 lines
2.3 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
package dnfbridge
import (
dnfrepo "longheng.io/server/internal/modules/dnf/repository"
"longheng.io/server/internal/modules/dnf/wedding"
)
// 婚姻场景的实例作用域
// ---------------------------------------------------------------------------
// 上游把这两段判定内联写在 publishCurrentTownPresence 里,本工作区的形状不同:
// publishCurrentTownPresence 的 instanceKey 由调用方决定,函数内部只做
// "public / private-room" 二选一。为了让婚姻场景在两种形状下语义一致,这里把
// 判定收敛成一个解析器,由 publishCurrentTownPresence 在分类之前调用。
//
// 两个婚姻场景都是"按夫妻对分实例的公共场景",不是"不可见的私密场景":
// - 教堂默认房(城镇 39,区域 8..38):已预约(wedding_state 2/3)的夫妻都能进,
// 实例键是 pairID;weddingCeremonyPeers 正是用同一个键去查同屏宾客。
// - 婚房(城镇 101):仪式完成(wedding_state 4)后可用,实例键同为 pairID。
//
// 返回值语义:
// - scoped=false:这不是婚姻场景,调用方继续走原有分类逻辑;
// - scoped=true, ok=true:是婚姻场景且有权进入,instanceKey 已给出;
// - scoped=true, ok=false:是婚姻场景但该角色无权进入(未预约/未结婚/频道不符)。
// 调用方必须放弃发布,否则会把无权角色放进别人的夫妻实例。
// weddingChurchTownID 是教堂所在的城镇号,weddingChurchAreaMin/Max 是默认房区间。
const (
weddingChurchTownID = 39
weddingChurchAreaMin = 8
weddingChurchAreaMax = 38
)
// currentWeddingTownInstanceKey 解析婚姻场景实例键,见上方说明。
func (s *Service) currentWeddingTownInstanceKey(
character dnfrepo.CharacterRecord, townID, areaID byte, channelID uint16,
) (uint32, bool, bool) {
switch {
case townID == weddingChurchTownID && areaID >= weddingChurchAreaMin && areaID <= weddingChurchAreaMax:
key, admitted := weddingTownInstance(character, areaID, channelID)
return key, true, admitted
case townID == currentWeddingRoomTownID:
state, err := wedding.Read(character)
if err != nil || state.Status != 4 {
return 0, true, false
}
return state.PairID, true, true
default:
return 0, false, true
}
}