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

@@ -0,0 +1,118 @@
package dnfbridge
import (
"encoding/hex"
"longheng.io/server/internal/modules/dnf/dnfenum"
)
func guildGameplayModule() gameplayModuleDefinition {
handlers := map[uint16]func(*Service, *gameSession, []byte) error{
uint16(dnfenum.CmdPacketGuildMemerList): (*Service).handleCurrentGuildMemberListLegacy,
uint16(dnfenum.CmdPacketCallGuildCreateRight): (*Service).handleCurrentGuildCreate,
uint16(dnfenum.CmdPacketGuildInfo): (*Service).handleCurrentGuildInfo,
uint16(dnfenum.CmdPacketSetSubGuildMaster): (*Service).handleCurrentGuildLegacyChangeGrade,
uint16(dnfenum.CmdPacketGuildMemerListNext): (*Service).handleCurrentGuildMemberListLegacyNext,
uint16(dnfenum.CmdPacketGuildAllMemberList): (*Service).handleCurrentGuildMemberList,
uint16(dnfenum.CmdPacketGuildAllMemberListNext): (*Service).handleCurrentGuildMemberListNext,
uint16(dnfenum.CmdPacketCallGuildInvite): (*Service).handleCurrentGuildInvite,
uint16(dnfenum.CmdPacketReplyGuildInvite): (*Service).handleCurrentGuildInviteReply,
uint16(dnfenum.CmdPacketReqGuildSecede): (*Service).handleCurrentGuildLeave,
uint16(dnfenum.CmdPacketNotifyMessageToGuild): (*Service).handleCurrentGuildNotify,
uint16(dnfenum.CmdPacketGuildMasterDelegate): (*Service).handleCurrentGuildDelegate,
uint16(dnfenum.CmdPacketCheckGuildNameDouble): (*Service).handleCurrentGuildNameCheck,
uint16(dnfenum.CmdPacketWriteGuildMemberMemo): (*Service).handleCurrentGuildMemberMemo,
uint16(dnfenum.CmdPacketBreakGuild): (*Service).handleCurrentGuildDisband,
uint16(dnfenum.CmdPacketRefreshGuildInfo): (*Service).handleCurrentGuildRefreshInfo,
uint16(dnfenum.CmdPacketOpenGuildBoard): (*Service).handleCurrentGuildBoardOpen,
uint16(dnfenum.CmdPacketRefreshGuildboard): (*Service).handleCurrentGuildBoardRefresh,
uint16(dnfenum.CmdPacketCheckJoinGuild): (*Service).handleCurrentGuildJoinCheck,
uint16(dnfenum.CmdPacketRequestJoinGuild): (*Service).handleCurrentGuildApply,
uint16(dnfenum.CmdPacketCancelJoinGuild): (*Service).handleCurrentGuildCancelApply,
uint16(dnfenum.CmdPacketApproveJoinGuild): (*Service).handleCurrentGuildApprove,
uint16(dnfenum.CmdPacketDenyJoinGuild): (*Service).handleCurrentGuildDeny,
uint16(dnfenum.CmdPacketGuildJoinList): (*Service).handleCurrentGuildApplicationList,
uint16(dnfenum.CmdPacketGuildAttendanceInfo): (*Service).handleCurrentGuildAttendance,
uint16(dnfenum.CmdPacketJoinGuildInfo): (*Service).handleCurrentGuildApplicationNotice,
uint16(dnfenum.CmdPacketCheckGuildCreatePromoteMsg): (*Service).handleCurrentGuildPromoterCheck,
uint16(dnfenum.CmdPacketModifyGuildPromoteMsg): (*Service).handleCurrentGuildPromotion,
uint16(dnfenum.CmdPacketRequestGuildCreatePermit): (*Service).handleCurrentGuildCreatePermit,
uint16(dnfenum.CmdPacketReplyGuildCreatePermit): (*Service).handleCurrentGuildCreatePermitReply,
uint16(dnfenum.CmdPacketCancelGuildCreate): (*Service).handleCurrentGuildCreateCancel,
uint16(dnfenum.CmdPacketReqGuildInfoOfMyChars): (*Service).handleCurrentGuildAccountList,
uint16(dnfenum.CmdPacketReqGuildSerchForJoin): (*Service).handleCurrentGuildDetail,
uint16(dnfenum.CmdPacketTodayGuildAttendanceDetailInfo): (*Service).handleCurrentGuildAttendanceDetail,
uint16(dnfenum.CmdPacketReqGuildMileageHistory): (*Service).handleCurrentGuildMileageHistory,
uint16(dnfenum.CmdPacketChangeGuildGrade): (*Service).handleCurrentGuildChangeGrade,
uint16(dnfenum.CmdPacketChangeGuildGradeName): (*Service).handleCurrentGuildChangeGradeName,
uint16(dnfenum.CmdPacketChangeGuildMark): (*Service).handleCurrentGuildMark,
uint16(dnfenum.CmdPacketSetGuildFlagAura): (*Service).handleCurrentGuildAura,
uint16(dnfenum.CmdPacketBuyGuildContents): (*Service).handleCurrentGuildContentsPurchase,
uint16(dnfenum.CmdPacketCheckCreateGuildAgit): (*Service).handleCurrentGuildAgitCheck,
uint16(dnfenum.CmdPacketCreateGuildAgit): (*Service).handleCurrentGuildAgitCreate,
uint16(dnfenum.CmdPacketDeleteGuildAgit): (*Service).handleCurrentGuildAgitDelete,
uint16(dnfenum.CmdPacketUpgradeGuildAgit): (*Service).handleCurrentGuildAgitUpgrade,
uint16(dnfenum.CmdPacketContractOfGuild): (*Service).handleCurrentGuildContractClaim,
uint16(dnfenum.CmdPacketChangeGuildName): (*Service).handleCurrentGuildRename,
uint16(dnfenum.CmdPacketSetGuildRecommandChannel): (*Service).handleCurrentGuildRecommendedChannel,
uint16(dnfenum.CmdPacketReqRecommendGuild): (*Service).handleCurrentGuildRecommend,
uint16(dnfenum.CmdPacketSearchGuildList): (*Service).handleCurrentGuildSearch,
uint16(dnfenum.CmdPacketRequestAccountGuildList): (*Service).handleCurrentGuildAccountListIndex,
uint16(dnfenum.CmdPacketGuildAllMemberGrade): (*Service).handleCurrentGuildAllGrades,
uint16(dnfenum.CmdPacketGuildAllMemberGradeNext): (*Service).handleCurrentGuildAllGradesNext,
// 公会金库 (guild cargo), ported from the upstream guild branch. These five
// were the only cargo opcodes the upstream module registered and this one
// did not; see guild_cargo.go for the wire formats.
uint16(dnfenum.CmdPacketGuildCargo): (*Service).handleCurrentGuildCargo,
uint16(dnfenum.CmdPacketGuildCargoHistory): (*Service).handleCurrentGuildCargoHistory,
uint16(dnfenum.CmdPacketGuildCargoPushItem): (*Service).handleCurrentGuildCargoPush,
uint16(dnfenum.CmdPacketGuildCargoPopItem): (*Service).handleCurrentGuildCargoPop,
uint16(dnfenum.CmdPacketGuildCargoMoveItem): (*Service).handleCurrentGuildCargoMove,
// 公会红包 (guild hongbao) list reads, same upstream branch. They read the
// shared 公会贡献度 ledger; see guild_hongbao.go and guild_contribution.go.
uint16(dnfenum.CmdPacketGetGuildHongbaoList): (*Service).handleCurrentGuildHongbaoList,
uint16(dnfenum.CmdPacketGetGuildHongbaoPointList): (*Service).handleCurrentGuildHongbaoPoints,
// 公会战 (agit war) + 守护神, from the same upstream branch. opcode 1345 is
// special: it is shared with the "town scene ready" ACK this tree used to
// handle inline in game_dispatch_legacy.go, and handleCurrentGuildWarInfo
// now owns that check -- see its head for why the order matters.
uint16(dnfenum.CmdPacketAgitWarGuardian): (*Service).handleCurrentGuildGuardian,
uint16(dnfenum.CmdPacketAgitWarExtend): (*Service).handleCurrentGuildAreaExtend,
uint16(dnfenum.CmdPacketAgitWarUpgradeBuilding): (*Service).handleCurrentGuildWarShopUpgrade,
uint16(dnfenum.CmdPacketAgitWarShop): (*Service).handleCurrentGuildWarShopBuy,
uint16(dnfenum.CmdPacketAgitWarInfo): (*Service).handleCurrentGuildWarInfo,
uint16(dnfenum.CmdPacketAgitWarMissionReward): (*Service).handleCurrentGuildWarMissionReward,
uint16(dnfenum.CmdPacketAgitWarMatching): (*Service).handleCurrentGuildWarMatching,
uint16(dnfenum.CmdPacketAgitWarMatchingCancel): (*Service).handleCurrentGuildWarCancel,
uint16(dnfenum.CmdPacketAgitWarSelectChallengeGuild): (*Service).handleCurrentGuildWarRivals,
uint16(dnfenum.CmdPacketReqRepresentCharacter): (*Service).handleCurrentGuildRepresentative,
}
legacy := make(map[uint16]gameplayHandler, len(handlers))
upper := make(map[uint16]gameplayHandler, len(handlers))
for opcode, route := range handlers {
// Guild requests are logged on arrival. Every rejection in this module
// funnels into the same generic failure byte, so without this an
// unhandled UI action and a rejected one look identical from the log,
// and "the client sent nothing at all" is indistinguishable from
// either -- which is exactly the ambiguity that made the grade and
// permission bugs take a round trip each to place.
opcode, route := opcode, route
route = func(inner func(*Service, *gameSession, []byte) error) func(*Service, *gameSession, []byte) error {
return func(service *Service, session *gameSession, body []byte) error {
service.logGameEvent(session, "game-guild-request",
"opcode", opcode, "runtime_cmd_name", dnfenum.CmdPacketName(opcode),
"body_len", len(body), "body", hex.EncodeToString(body))
return inner(service, session, body)
}
}(route)
legacy[opcode] = func(service *Service, session *gameSession, request gameplayRequest) error {
return route(service, session, request.Body)
}
upper[opcode] = defaultClassGameplayHandler(
"game-guild-classification-rejected",
"current_exe_guild_command_requires_default_classification",
route,
)
}
return gameplayModuleDefinition{Name: "guild", LegacyHandlers: legacy, UpperHandlers: upper}
}